diff --git a/examples/rag/assets/New Project.png b/examples/rag/assets/New Project.png new file mode 100644 index 0000000..98f8fba Binary files /dev/null and b/examples/rag/assets/New Project.png differ diff --git a/examples/rag/assets/create_secret.png b/examples/rag/assets/create_secret.png new file mode 100644 index 0000000..a8c0c3f Binary files /dev/null and b/examples/rag/assets/create_secret.png differ diff --git a/examples/rag/assets/create_trigger.png b/examples/rag/assets/create_trigger.png new file mode 100644 index 0000000..f0be315 Binary files /dev/null and b/examples/rag/assets/create_trigger.png differ diff --git a/examples/rag/assets/create_value.png b/examples/rag/assets/create_value.png new file mode 100644 index 0000000..6e41638 Binary files /dev/null and b/examples/rag/assets/create_value.png differ diff --git a/examples/rag/mongodb_triggers.ipynb b/examples/rag/mongodb_triggers.ipynb new file mode 100644 index 0000000..9569c79 --- /dev/null +++ b/examples/rag/mongodb_triggers.ipynb @@ -0,0 +1,356 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# RAG with Fireworks and MongoDB Triggers\n", + "\n", + "When you are working with a realtime application, you want to be able to embed your dataset in real time as they are inserted. Fireworks can help with that when used together with MongoDB triggers." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Trigger Setup\n", + "### Adding Fireworks Key to Values\n", + "API keys are an important part of the overall setup, and we want to store the secrets properly. We want to obtain a Fireworks API key and then store them as Values in MongoDB Atlas\n", + "\n", + "First, login to [Fireworks](https://fireworks.ai/) , register and then get a free API key to start with\n", + "\n", + "![New Project.png](./assets/New%20Project.png)\n", + "\n", + "You want to store this API key into Atlas as a secret. Note that you cannot directly access the secret in triggers. So we will create a secret with the name fireworksApiKey\n", + "![image-2.png](./assets/create_secret.png)\n", + "\n", + "And then create a value that is linked to the secret, and we will call this value FIREWORKS_API_KEY\n", + "![image.png](./assets/create_value.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Creating the trigger to fetch embeddings\n", + "Now we will create the trigger for fetching the embeddings. In order to do that, we will make use of the sample restaurant dataset from Atlas. More details on how to load the dataset please check out [this guide](https://www.mongodb.com/docs/atlas/sample-data/#std-label-available-sample-datasets). For now we will assume the Sample Restaurants Dataset is loaded, and each of the restaurant object looks like this\n", + "```json\n", + "{\n", + " \"_id\": {\n", + " \"$oid\": \"5eb3d668b31de5d588f4292a\"\n", + " },\n", + " \"address\": {}, \n", + " \"borough\": \"Brooklyn\",\n", + " \"cuisine\": \"American\",\n", + " \"grades\": [],\n", + " \"name\": \"Riviera Caterer\",\n", + " \"restaurant_id\": \"40356018\"\n", + "}\n", + "```\n", + "\n", + "We will create a new trigger named `Restaurant-Trigger`. We will point that trigger to the MongoDB database `sample_restaurants` and collection `restaurants`. Make sure `Full Document` is supported, since we need the whole document to be able to generate a good embedding for it.\n", + "\n", + "![image.png](./assets/create_trigger.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The trigger code\n", + "\n", + "In order to build the trigger code, we need the basic function to \n", + "- query the embedding on fireworks\n", + "- store the embedding on the object" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "```typescript\n", + "exports = async function(changeEvent) {\n", + " const url = 'https://api.fireworks.ai/inference/v1/embeddings';\n", + "\n", + " // Fetch the FIREWORKS key stored in the context values.\n", + " const fireworks_api_key = context.values.get(\"FIREWORKS_API_KEY\");\n", + "\n", + " // Access the _id of the changed document:\n", + " const docId = changeEvent.documentKey._id;\n", + " const doc = changeEvent.fullDocument;\n", + " \n", + " // Skip processing if the document already has an embedding\n", + " if ('embedding' in doc) {\n", + " console.log(\"Document already has an embedding, skipping processing.\");\n", + " return;\n", + " }\n", + "\n", + "\n", + "\n", + " // Prepare the request string for the Fireworks' nomic-ai model.\n", + " // For generating document embedding, make sure we prefix with search_document.\n", + " // for more information on how to query nomic-ai model, please check\n", + " // https://huggingface.co/nomic-ai/nomic-embed-text-v1.5\n", + " // TODO: if key embedding is in doc, ignore the doc\n", + " const reqString = `search_document: ` + JSON.stringify(doc)\n", + " console.log(`reqString: ${reqString}`);\n", + "\n", + " // Call Fireworks API to get the response.\n", + "\n", + " let resp = await context.http.post({\n", + " url: url,\n", + " headers: {\n", + " 'Authorization': [`Bearer ${fireworks_api_key}`],\n", + " 'Content-Type': ['application/json']\n", + " },\n", + " body: JSON.stringify({\n", + " model: \"nomic-ai/nomic-embed-text-v1.5\",\n", + " input: reqString,\n", + " })\n", + " });\n", + "\n", + " // Parse the JSON response\n", + " let responseData = JSON.parse(resp.body.text());\n", + "\n", + " // Check the response status.\n", + " if(resp.statusCode === 200) {\n", + " console.log(\"Successfully received code.\");\n", + " console.log(JSON.stringify(responseData));\n", + " console.log(docId);\n", + " const collection = context.services.get(\"test-rag-cluster\").db(\"sample_restaurants\").collection(\"restaurants\");\n", + " await collection.updateOne({ _id: docId }, { $set: { embedding: responseData.data[0].embedding } });\n", + " return true;\n", + "\n", + " } else {\n", + " console.log(\"Show status code.\");\n", + " console.log(resp.statusCode);\n", + " return false;\n", + " }\n", + "}" + ] + }, + { + "attachments": { + "image.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Create a new function with the definition above, hit save.\n", + "Now I can trigger some random update on the doc, and wait for the trigger to execute. We can see that the emebdding field is now filled **automatically**!\n", + "\n", + "![image.png](attachment:image.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### reload the dataset and setup the index\n", + "\n", + "Now let's try to refresh the dataset and then query the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.0\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install -q pymongo fireworks-ai tqdm openai" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pymongo\n", + "\n", + "mongo_url = input()\n", + "client = pymongo.MongoClient(mongo_url)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are going to trigger some updates to get the embeddings generated" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Completed updates.\n" + ] + } + ], + "source": [ + "# Specify the database and collection\n", + "db = client.sample_restaurants\n", + "collection = db.restaurants\n", + "\n", + "# Iterate over the first 100 documents\n", + "for doc in collection.find().limit(100):\n", + " # Perform a minor update (e.g., adding a temporary field and then removing it)\n", + " collection.update_one({'_id': doc['_id']}, {'$set': {'temp_field': 1}})\n", + " collection.update_one({'_id': doc['_id']}, {'$unset': {'temp_field': \"\"}})\n", + "\n", + "print(\"Completed updates.\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should be able to see that in our logs there are many, many triggers being called, and all the objects that has been touched, now has an embedding associated with it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Querying the embedded documents\n", + "Now let's make use of the examples we had in the previous cookbooks to find the best burger joint in Brooklyn. Make sure the vector index is setup as follows. We will name it `restaurant_index`\n", + "\n", + "```json\n", + "{\n", + " \"fields\": [\n", + " {\n", + " \"type\": \"vector\",\n", + " \"path\": \"embedding\",\n", + " \"numDimensions\": 768,\n", + " \"similarity\": \"dotProduct\"\n", + " }\n", + " ]\n", + "}\n", + "```" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "From your query \"What is the best burger joint in Brooklyn?\", the following restaurants were found:\n", + "\n", + "1. White Castle\n", + "2. Sonny'S Heros\n", + "3. Wendy'S\n", + "4. Shashemene Int'L Restaura\n", + "5. Taste The Tropics Ice Cream\n", + "6. Mejlander & Mulgannon\n", + "7. Shell Lanes\n", + "8. Wilken'S Fine Food\n", + "9. Carvel Ice Cream\n", + "10. Seuda Foods\n" + ] + } + ], + "source": [ + "from typing import List\n", + "embedding_model_string = \"nomic-ai/nomic-embed-text-v1.5\"\n", + "vector_database_field_name = \"embedding\"\n", + "\n", + "def generate_embeddings(input_texts: str, model_api_string: str, prefix=\"\") -> List[float]:\n", + " \"\"\"Generate embeddings from Fireworks python library\n", + "\n", + " Args:\n", + " input_texts: a list of string input texts.\n", + " model_api_string: str. An API string for a specific embedding model of your choice.\n", + " prefix: what prefix to attach to the generate the embeddings, which is required for nomic 1.5. Please check out https://huggingface.co/nomic-ai/nomic-embed-text-v1.5#usage for more information\n", + "\n", + " Returns:\n", + " reduced_embeddings_list: a list of reduced-size embeddings. Each element corresponds to each input text.\n", + " \"\"\"\n", + " if prefix:\n", + " input_texts = [prefix + text for text in input_texts] \n", + " return fw_client.embeddings.create(\n", + " input=input_texts,\n", + " model=model_api_string,\n", + " ).data[0].embedding\n", + "\n", + "import openai\n", + "fw_client = openai.OpenAI(\n", + " api_key=input(),\n", + " base_url=\"https://api.fireworks.ai/inference/v1\"\n", + ")\n", + "\n", + "# Example query.\n", + "query = \"What is the best burger joint in Brooklyn?\"\n", + "prefix=\"search_query: \"\n", + "query_emb = generate_embeddings([query], embedding_model_string, prefix=prefix)\n", + "\n", + "results = collection.aggregate([\n", + " {\n", + " \"$vectorSearch\": {\n", + " \"queryVector\": query_emb,\n", + " \"path\": vector_database_field_name,\n", + " \"numCandidates\": 100, # this should be 10-20x the limit\n", + " \"limit\": 10, # the number of documents to return in the results\n", + " \"index\": 'restaurant_index', # the index name you used in the earlier step\n", + " }\n", + " }\n", + "])\n", + "results_as_dict = {doc['name']: doc for doc in results}\n", + "\n", + "print(f\"From your query \\\"{query}\\\", the following restaurants were found:\\n\")\n", + "print(\"\\n\".join([str(i+1) + \". \" + name for (i, name) in enumerate(results_as_dict.keys())]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looks like the model decided that White Castle is the best burger joint in Brooklyn, which I cannot argue with.\n", + "\n", + "## What's Next\n", + "- Triggers can actually be very sophisticated and can be used for further processing. If you are interested, please check out the MongoDB blog [here](https://www.mongodb.com/developer/products/mongodb/atlas-open-ai-review-summary/)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}