From 3b26ccadb27b98e2e16c9a50100476b023cb2c89 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 20 Nov 2024 14:28:53 -0800 Subject: [PATCH 01/23] Initial commit --- notebooks/rag/parent_document_retrieval.ipynb | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 notebooks/rag/parent_document_retrieval.ipynb diff --git a/notebooks/rag/parent_document_retrieval.ipynb b/notebooks/rag/parent_document_retrieval.ipynb new file mode 100644 index 0000000..402be81 --- /dev/null +++ b/notebooks/rag/parent_document_retrieval.ipynb @@ -0,0 +1,169 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mongodb-developer/GenAI-Showcase/blob/main/notebooks/rag/parent_document_retrieval.ipynb)\n", + "\n", + "[![View Article](https://img.shields.io/badge/View%20Article-blue)](https://www.mongodb.com/developer/products/atlas/advanced-rag-parent-doc-retrieval/?utm_campaign=devrel&utm_source=cross-post&utm_medium=organic_social&utm_content=https%3A%2F%2Fgithub.com%2Fmongodb-developer%2FGenAI-Showcase&utm_term=apoorva.joshi)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Parent Document Retrieval Using MongoDB and LangChain\n", + "\n", + "This notebook shows you how to implement parent document retrieval in your RAG application using MongoDB's LangChain integration." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Install required libraries\n", + "\n", + "- **datasets**: Python package to download datasets from Hugging Face\n", + "\n", + "- **pymongo**: Python driver for MongoDB\n", + "\n", + "- **langchain**: Python package for LangChain's core modules\n", + "\n", + "- **langchain-openai**: Python package to use OpenAI models via LangChain" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "! pip install -qU datasets langchain langchain-openai 'git+https://github.com/langchain-ai/langchain-mongodb.git@main#subdirectory=libs/mongodb' " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2: Setup prerequisites\n", + "\n", + "- **Set the MongoDB connection string**: Follow the steps [here](https://www.mongodb.com/docs/manual/reference/connection-string/) to get the connection string from the Atlas UI.\n", + "\n", + "- **Set the OpenAI API key**: Steps to obtain an API key as [here](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import getpass\n", + "from openai import OpenAI\n", + "from pymongo import MongoClient" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "os.environ[\"OPENAI_API_KEY\"] = getpass.getpass(\"Enter your OpenAI API Key:\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'ok': 1.0,\n", + " '$clusterTime': {'clusterTime': Timestamp(1732140866, 1),\n", + " 'signature': {'hash': b'A}\\xc9\\xb7-\\x85\\x0c\\xbf\\xa9H\\xb1V\\x8e7\\xa6k\\xd0\\xb5BA',\n", + " 'keyId': 7390069253761662978}},\n", + " 'operationTime': Timestamp(1732140866, 1)}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "MONGODB_URI = getpass.getpass(\"Enter your MongoDB connection string:\")\n", + "mongodb_client = MongoClient(MONGODB_URI, appname=\"devrel.showcase.parent_doc_retrieval\")\n", + "mongodb_client.admin.command(\"ping\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "os.environ[\"HF_TOKEN\"] = getpass.getpass(\"Enter your HF Access Token:\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Load the dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from datasets import load_dataset\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Generating train split: 100%|██████████| 6891/6891 [00:00<00:00, 13161.18 examples/s]\n" + ] + } + ], + "source": [ + "data = load_dataset(\"mongodb-eai/docs\")\n", + "df = pd.DataFrame(data)" + ] + } + ], + "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.12.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 2b26bb65d6a1975f8a7762fc8976aef24ed0a141 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 20 Nov 2024 14:31:48 -0800 Subject: [PATCH 02/23] HF token instructions --- notebooks/rag/parent_document_retrieval.ipynb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/notebooks/rag/parent_document_retrieval.ipynb b/notebooks/rag/parent_document_retrieval.ipynb index 402be81..69efa69 100644 --- a/notebooks/rag/parent_document_retrieval.ipynb +++ b/notebooks/rag/parent_document_retrieval.ipynb @@ -50,7 +50,9 @@ "\n", "- **Set the MongoDB connection string**: Follow the steps [here](https://www.mongodb.com/docs/manual/reference/connection-string/) to get the connection string from the Atlas UI.\n", "\n", - "- **Set the OpenAI API key**: Steps to obtain an API key as [here](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key)" + "- **Set the OpenAI API key**: Steps to obtain an API key are [here](https://help.openai.com/en/articles/4936850-where-do-i-find-my-openai-api-key)\n", + "\n", + "- **Set the Hugging Face token**: Steps to create a token are [here](https://huggingface.co/docs/hub/en/security-tokens#how-to-manage-user-access-tokens). You only need **read** token for this tutorial." ] }, { From fba616e45416e3b95f7511eac348e9562f0473af Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Thu, 21 Nov 2024 16:25:30 -0800 Subject: [PATCH 03/23] Making progress... --- notebooks/rag/parent_document_retrieval.ipynb | 629 +++++++++++++++++- 1 file changed, 613 insertions(+), 16 deletions(-) diff --git a/notebooks/rag/parent_document_retrieval.ipynb b/notebooks/rag/parent_document_retrieval.ipynb index 69efa69..930ce09 100644 --- a/notebooks/rag/parent_document_retrieval.ipynb +++ b/notebooks/rag/parent_document_retrieval.ipynb @@ -35,11 +35,11 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 150, "metadata": {}, "outputs": [], "source": [ - "! pip install -qU datasets langchain langchain-openai 'git+https://github.com/langchain-ai/langchain-mongodb.git@main#subdirectory=libs/mongodb' " + "! pip install -qU datasets pymongo langchain ragas rapidfuzz langchain-openai 'git+https://github.com/langchain-ai/langchain-mongodb.git@main#subdirectory=libs/mongodb' " ] }, { @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -85,10 +85,10 @@ "data": { "text/plain": [ "{'ok': 1.0,\n", - " '$clusterTime': {'clusterTime': Timestamp(1732140866, 1),\n", - " 'signature': {'hash': b'A}\\xc9\\xb7-\\x85\\x0c\\xbf\\xa9H\\xb1V\\x8e7\\xa6k\\xd0\\xb5BA',\n", + " '$clusterTime': {'clusterTime': Timestamp(1732218048, 1),\n", + " 'signature': {'hash': b\"8\\xbf>\\xa0\\xbc\\xf1\\x1c\\x01\\xcd!tr~\\xd2\\x15\\xa5o'\\xde\\xfa\",\n", " 'keyId': 7390069253761662978}},\n", - " 'operationTime': Timestamp(1732140866, 1)}" + " 'operationTime': Timestamp(1732218048, 1)}" ] }, "execution_count": 6, @@ -98,13 +98,15 @@ ], "source": [ "MONGODB_URI = getpass.getpass(\"Enter your MongoDB connection string:\")\n", - "mongodb_client = MongoClient(MONGODB_URI, appname=\"devrel.showcase.parent_doc_retrieval\")\n", + "mongodb_client = MongoClient(\n", + " MONGODB_URI, appname=\"devrel.showcase.parent_doc_retrieval\"\n", + ")\n", "mongodb_client.admin.command(\"ping\")" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -120,9 +122,18 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/apoorva.joshi/Documents/GenAI-Showcase/notebooks/.venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], "source": [ "from datasets import load_dataset\n", "import pandas as pd" @@ -130,20 +141,606 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "data = load_dataset(\"mongodb-eai/docs\", split=\"train\")\n", + "data_head = data.take(1000)\n", + "df = pd.DataFrame(data_head)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, "metadata": {}, "outputs": [ { - "name": "stderr", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
updated_idmetadataactionsourceNamebodyurlformattitle
0{'$date': '2024-05-20T17:30:49.148Z'}{'$oid': '664b88c96e4f895074208162'}{'contentType': None, 'pageDescription': None,...createdsnooty-cloud-docs# View Database Access History\\n\\n- This featu...https://mongodb.com/docs/atlas/access-tracking/mdView Database Access History
1{'$date': '2024-05-20T17:30:49.148Z'}{'$oid': '664b88c96e4f895074208178'}{'contentType': None, 'pageDescription': None,...createdsnooty-cloud-docs# Manage Organization Teams\\n\\nYou can create ...https://mongodb.com/docs/atlas/access/manage-t...mdManage Organization Teams
2{'$date': '2024-05-20T17:30:49.148Z'}{'$oid': '664b88c96e4f895074208183'}{'contentType': None, 'pageDescription': None,...createdsnooty-cloud-docs# Manage Organizations\\n\\nIn the organizations...https://mongodb.com/docs/atlas/access/orgs-cre...mdManage Organizations
3{'$date': '2024-05-20T17:30:49.148Z'}{'$oid': '664b88c96e4f89507420818f'}{'contentType': None, 'pageDescription': None,...createdsnooty-cloud-docs# Alert Basics\\n\\nAtlas provides built-in tool...https://mongodb.com/docs/atlas/alert-basics/mdAlert Basics
4{'$date': '2024-05-20T17:30:49.148Z'}{'$oid': '664b88c96e4f89507420819d'}{'contentType': None, 'pageDescription': None,...createdsnooty-cloud-docs# Resolve Alerts\\n\\nAtlas issues alerts for th...https://mongodb.com/docs/atlas/alert-resolutions/mdResolve Alerts
\n", + "
" + ], + "text/plain": [ + " updated \\\n", + "0 {'$date': '2024-05-20T17:30:49.148Z'} \n", + "1 {'$date': '2024-05-20T17:30:49.148Z'} \n", + "2 {'$date': '2024-05-20T17:30:49.148Z'} \n", + "3 {'$date': '2024-05-20T17:30:49.148Z'} \n", + "4 {'$date': '2024-05-20T17:30:49.148Z'} \n", + "\n", + " _id \\\n", + "0 {'$oid': '664b88c96e4f895074208162'} \n", + "1 {'$oid': '664b88c96e4f895074208178'} \n", + "2 {'$oid': '664b88c96e4f895074208183'} \n", + "3 {'$oid': '664b88c96e4f89507420818f'} \n", + "4 {'$oid': '664b88c96e4f89507420819d'} \n", + "\n", + " metadata action \\\n", + "0 {'contentType': None, 'pageDescription': None,... created \n", + "1 {'contentType': None, 'pageDescription': None,... created \n", + "2 {'contentType': None, 'pageDescription': None,... created \n", + "3 {'contentType': None, 'pageDescription': None,... created \n", + "4 {'contentType': None, 'pageDescription': None,... created \n", + "\n", + " sourceName body \\\n", + "0 snooty-cloud-docs # View Database Access History\\n\\n- This featu... \n", + "1 snooty-cloud-docs # Manage Organization Teams\\n\\nYou can create ... \n", + "2 snooty-cloud-docs # Manage Organizations\\n\\nIn the organizations... \n", + "3 snooty-cloud-docs # Alert Basics\\n\\nAtlas provides built-in tool... \n", + "4 snooty-cloud-docs # Resolve Alerts\\n\\nAtlas issues alerts for th... \n", + "\n", + " url format \\\n", + "0 https://mongodb.com/docs/atlas/access-tracking/ md \n", + "1 https://mongodb.com/docs/atlas/access/manage-t... md \n", + "2 https://mongodb.com/docs/atlas/access/orgs-cre... md \n", + "3 https://mongodb.com/docs/atlas/alert-basics/ md \n", + "4 https://mongodb.com/docs/atlas/alert-resolutions/ md \n", + "\n", + " title \n", + "0 View Database Access History \n", + "1 Manage Organization Teams \n", + "2 Manage Organizations \n", + "3 Alert Basics \n", + "4 Resolve Alerts " + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 4: Convert dataset to LangChain Documents" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.documents import Document" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "docs = []\n", + "metadata_fields = [\"updated\", \"url\", \"title\"]\n", + "for _, row in df.iterrows():\n", + " content = row[\"body\"]\n", + " metadata = row[\"metadata\"]\n", + " for field in metadata_fields:\n", + " metadata[field] = row[field]\n", + " docs.append(Document(page_content=content, metadata=metadata))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Document(metadata={'contentType': None, 'pageDescription': None, 'productName': 'MongoDB Atlas', 'tags': ['atlas', 'docs'], 'version': None, 'updated': {'$date': '2024-05-20T17:30:49.148Z'}, 'url': 'https://mongodb.com/docs/atlas/access-tracking/', 'title': 'View Database Access History'}, page_content='# View Database Access History\\n\\n- This feature is not available for `M0` free clusters, `M2`, and `M5` clusters. To learn more, see Atlas M0 (Free Cluster), M2, and M5 Limits.\\n\\n- This feature is not supported on Serverless instances at this time. To learn more, see Serverless Instance Limitations.\\n\\n## Overview\\n\\nAtlas parses the MongoDB database logs to collect a list of authentication requests made against your clusters through the following methods:\\n\\n- `mongosh`\\n\\n- Compass\\n\\n- Drivers\\n\\nAuthentication requests made with API Keys through the Atlas Administration API are not logged.\\n\\nAtlas logs the following information for each authentication request within the last 7 days:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nField\\n\\n\\nDescription\\n\\n
\\nTimestamp\\n\\n\\nThe date and time of the authentication request.\\n\\n
\\nUsername\\n\\n\\nThe username associated with the database user who made the authentication request.\\n\\nFor LDAP usernames, the UI displays the resolved LDAP name. Hover over the name to see the full LDAP username.\\n\\n
\\nIP Address\\n\\n\\nThe IP address of the machine that sent the authentication request.\\n\\n
\\nHost\\n\\n\\nThe target server that processed the authentication request.\\n\\n
\\nAuthentication Source\\n\\n\\nThe database that the authentication request was made against. `admin` is the authentication source for SCRAM-SHA users and `$external` for LDAP users.\\n\\n
\\nAuthentication Result\\n\\n\\nThe success or failure of the authentication request. A reason code is displayed for the failed authentication requests.\\n\\n
Authentication requests are pre-sorted by descending timestamp with 25 entries per page.\\n\\n### Logging Limitations\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\nIf authentication requests occur during a period when logs are not collected, they will not appear in the database access history.\\n\\n## Required Access\\n\\nTo view database access history, you must have `Project Owner` or `Organization Owner` access to Atlas.\\n\\n## Procedure\\n\\n\\n\\n\\n\\nTo return the access logs for a cluster using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas accessLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas accessLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo view the database access history using the API, see Access Tracking.\\n\\n\\n\\n\\n\\nUse the following procedure to view your database access history using the Atlas UI:\\n\\n### Navigate to the Clusters page for your project.\\n\\n- If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.\\n\\n- If it is not already displayed, select your desired project from the Projects menu in the navigation bar.\\n\\n- If the Clusters page is not already displayed, click Database in the sidebar.\\n\\n### View the cluster\\'s database access history.\\n\\n- On the cluster card, click .\\n\\n- Select View Database Access History.\\n\\nor\\n\\n- Click the cluster name.\\n\\n- Click .\\n\\n- Select View Database Access History.\\n\\n\\n\\n\\n\\n')" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "docs[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1000" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(docs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 5: Instantiate the retrievers" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_mongodb.retrievers.parent_document import (\n", + " MongoDBAtlasParentDocumentRetriever,\n", + ")\n", + "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", + "from langchain_openai import OpenAIEmbeddings" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [], + "source": [ + "embedding_model = OpenAIEmbeddings(model=\"text-embedding-3-small\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "DB_NAME = \"langchain\"\n", + "PARENT_DOC_COLLECTION = \"parent_doc\"\n", + "PARENT_CHUNK_COLLECTION = \"parent_chunk\"" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [], + "source": [ + "def get_splitter(chunk_size):\n", + " return RecursiveCharacterTextSplitter.from_tiktoken_encoder(\n", + " encoding_name=\"cl100k_base\",\n", + " chunk_size=chunk_size,\n", + " chunk_overlap=0.15 * chunk_size,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": {}, + "outputs": [], + "source": [ + "def get_retriever(collection, child_chunk_size, **kwargs):\n", + " return MongoDBAtlasParentDocumentRetriever.from_connection_string(\n", + " connection_string=MONGODB_URI,\n", + " embedding_model=embedding_model,\n", + " child_splitter=get_splitter(child_chunk_size),\n", + " database_name=DB_NAME,\n", + " collection_name=collection,\n", + " text_key=\"page_content\",\n", + " search_type=\"similarity\",\n", + " search_kwargs={\"k\": 10},\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [], + "source": [ + "parent_doc_retriever = get_retriever(\n", + " collection=PARENT_DOC_COLLECTION, child_chunk_size=200\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [], + "source": [ + "parent_chunk_retriever = get_retriever(\n", + " collection=PARENT_CHUNK_COLLECTION,\n", + " child_chunk_size=200,\n", + " parent_splitter=get_splitter(800),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 6: Ingest documents into MongoDB" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [], + "source": [ + "import asyncio" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [], + "source": [ + "CHUNK_SIZE = 100\n", + "MAX_CONCURRENCY = 4" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [], + "source": [ + "async def process_chunk(chunk, semaphore, retriever):\n", + " async with semaphore:\n", + " await retriever.aadd_documents(chunk)\n", + " print(f\"Processed {len(chunk)} documents\")" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [], + "source": [ + "def get_chunks(docs, chunk_size):\n", + " for i in range(0, len(docs), chunk_size):\n", + " yield docs[i : i + chunk_size]" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [], + "source": [ + "async def process_docs(docs, retriever):\n", + " semaphore = asyncio.Semaphore(MAX_CONCURRENCY)\n", + " chunks = get_chunks(docs, CHUNK_SIZE)\n", + "\n", + " tasks = []\n", + " for chunk in chunks:\n", + " tasks.append(process_chunk(chunk, semaphore, retriever))\n", + "\n", + " # Gather all tasks and get results\n", + " results = await asyncio.gather(*tasks)\n", + " return results" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [], + "source": [ + "def get_collection(coll_name):\n", + " return mongodb_client[DB_NAME][coll_name]" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n" + ] + } + ], + "source": [ + "get_collection(PARENT_DOC_COLLECTION).delete_many({})\n", + "results = await process_docs(docs, parent_doc_retriever)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n", + "Processed 100 documents\n" + ] + } + ], + "source": [ + "get_collection(PARENT_CHUNK_COLLECTION).delete_many({})\n", + "results = await process_docs(docs, parent_chunk_retriever)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 7: Create vector search indexes" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "from pymongo.operations import SearchIndexModel\n", + "from pymongo.errors import OperationFailure" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [], + "source": [ + "model = SearchIndexModel(\n", + " definition={\n", + " \"fields\": [\n", + " {\n", + " \"type\": \"vector\",\n", + " \"path\": \"embedding\",\n", + " \"numDimensions\": 1536,\n", + " \"similarity\": \"cosine\",\n", + " }\n", + " ]\n", + " },\n", + " name=\"vector_index\",\n", + " type=\"vectorSearch\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [], + "source": [ + "def create_vs_index(coll_name):\n", + " try:\n", + " get_collection(coll_name).create_search_index(model=model)\n", + " print(f\"Successfully created index for collection {coll_name}.\")\n", + " except OperationFailure:\n", + " print(\n", + " f\"Duplicate index found for collection {coll_name}. Skipping index creation.\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", "output_type": "stream", "text": [ - "Generating train split: 100%|██████████| 6891/6891 [00:00<00:00, 13161.18 examples/s]\n" + "Successfully created index for collection parent_doc.\n" ] } ], "source": [ - "data = load_dataset(\"mongodb-eai/docs\")\n", - "df = pd.DataFrame(data)" + "create_vs_index(PARENT_DOC_COLLECTION)" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Successfully created index for collection parent_chunk.\n" + ] + } + ], + "source": [ + "create_vs_index(PARENT_CHUNK_COLLECTION)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 8: Create RAG Chain" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_openai import ChatOpenAI\n", + "from langchain_core.prompts import ChatPromptTemplate\n", + "from langchain_core.runnables import RunnablePassthrough\n", + "from langchain_core.output_parsers import StrOutputParser" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [], + "source": [ + "def get_rag_chain(retriever):\n", + " retrieve = {\n", + " \"context\": retriever\n", + " | (lambda docs: \"\\n\\n\".join([d.page_content for d in docs])),\n", + " \"question\": RunnablePassthrough(),\n", + " }\n", + " template = \"\"\"Answer the question based only on the following context. If no context is provided, respond with I DON't KNOW: \\\n", + " {context}\n", + "\n", + " Question: {question}\n", + " \"\"\"\n", + " # Defining the chat prompt\n", + " prompt = ChatPromptTemplate.from_template(template)\n", + " # Defining the model to be used for chat completion\n", + " llm = ChatOpenAI(temperature=0, model=\"gpt-4o-2024-11-20\")\n", + " # Parse output as a string\n", + " parse_output = StrOutputParser()\n", + "\n", + " # Naive RAG chain\n", + " rag_chain = retrieve | prompt | llm | parse_output\n", + " return rag_chain" ] } ], From 772da8ecbc27ca6a096711d756cb19bda9abfc4d Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Thu, 21 Nov 2024 16:27:23 -0800 Subject: [PATCH 04/23] renaming the notebook --- ...etrieval.ipynb => langchain_parent_document_retrieval.ipynb} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename notebooks/rag/{parent_document_retrieval.ipynb => langchain_parent_document_retrieval.ipynb} (99%) diff --git a/notebooks/rag/parent_document_retrieval.ipynb b/notebooks/rag/langchain_parent_document_retrieval.ipynb similarity index 99% rename from notebooks/rag/parent_document_retrieval.ipynb rename to notebooks/rag/langchain_parent_document_retrieval.ipynb index 930ce09..956d9a8 100644 --- a/notebooks/rag/parent_document_retrieval.ipynb +++ b/notebooks/rag/langchain_parent_document_retrieval.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mongodb-developer/GenAI-Showcase/blob/main/notebooks/rag/parent_document_retrieval.ipynb)\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mongodb-developer/GenAI-Showcase/blob/main/notebooks/rag/langchain_parent_document_retrieval.ipynb)\n", "\n", "[![View Article](https://img.shields.io/badge/View%20Article-blue)](https://www.mongodb.com/developer/products/atlas/advanced-rag-parent-doc-retrieval/?utm_campaign=devrel&utm_source=cross-post&utm_medium=organic_social&utm_content=https%3A%2F%2Fgithub.com%2Fmongodb-developer%2FGenAI-Showcase&utm_term=apoorva.joshi)" ] From 14857f3c7598df1adcd8354ab026cf932f3eaf3f Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Mon, 2 Dec 2024 10:30:15 -0800 Subject: [PATCH 05/23] Works end-to-end --- .../langchain_parent_document_retrieval.ipynb | 342 +++++++++--------- 1 file changed, 178 insertions(+), 164 deletions(-) diff --git a/notebooks/rag/langchain_parent_document_retrieval.ipynb b/notebooks/rag/langchain_parent_document_retrieval.ipynb index 956d9a8..ecd4b0c 100644 --- a/notebooks/rag/langchain_parent_document_retrieval.ipynb +++ b/notebooks/rag/langchain_parent_document_retrieval.ipynb @@ -35,11 +35,11 @@ }, { "cell_type": "code", - "execution_count": 150, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "! pip install -qU datasets pymongo langchain ragas rapidfuzz langchain-openai 'git+https://github.com/langchain-ai/langchain-mongodb.git@main#subdirectory=libs/mongodb' " + "! pip install -qU datasets pymongo langchain langgraph langchain-openai 'git+https://github.com/langchain-ai/langchain-mongodb.git@main#subdirectory=libs/mongodb' " ] }, { @@ -57,7 +57,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -78,20 +78,20 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'ok': 1.0,\n", - " '$clusterTime': {'clusterTime': Timestamp(1732218048, 1),\n", - " 'signature': {'hash': b\"8\\xbf>\\xa0\\xbc\\xf1\\x1c\\x01\\xcd!tr~\\xd2\\x15\\xa5o'\\xde\\xfa\",\n", + " '$clusterTime': {'clusterTime': Timestamp(1733161666, 1),\n", + " 'signature': {'hash': b'\\x83\\xff\\xe1*\\xc9\\xea\\xfa\\xd3\\xbd\\xd0\\x03\\xdbrI\\x98\\xcf\\xae\\xac\\xc2\\x10',\n", " 'keyId': 7390069253761662978}},\n", - " 'operationTime': Timestamp(1732218048, 1)}" + " 'operationTime': Timestamp(1733161666, 1)}" ] }, - "execution_count": 6, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -106,7 +106,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -122,18 +122,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 30, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/apoorva.joshi/Documents/GenAI-Showcase/notebooks/.venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], + "outputs": [], "source": [ "from datasets import load_dataset\n", "import pandas as pd" @@ -141,18 +132,18 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ - "data = load_dataset(\"mongodb-eai/docs\", split=\"train\")\n", + "data = load_dataset(\"mongodb-eai/docs\", streaming=True, split=\"train\")\n", "data_head = data.take(1000)\n", "df = pd.DataFrame(data_head)" ] }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -296,7 +287,7 @@ "4 Resolve Alerts " ] }, - "execution_count": 28, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -314,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 39, "metadata": {}, "outputs": [], "source": [ @@ -323,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -339,7 +330,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -348,7 +339,7 @@ "Document(metadata={'contentType': None, 'pageDescription': None, 'productName': 'MongoDB Atlas', 'tags': ['atlas', 'docs'], 'version': None, 'updated': {'$date': '2024-05-20T17:30:49.148Z'}, 'url': 'https://mongodb.com/docs/atlas/access-tracking/', 'title': 'View Database Access History'}, page_content='# View Database Access History\\n\\n- This feature is not available for `M0` free clusters, `M2`, and `M5` clusters. To learn more, see Atlas M0 (Free Cluster), M2, and M5 Limits.\\n\\n- This feature is not supported on Serverless instances at this time. To learn more, see Serverless Instance Limitations.\\n\\n## Overview\\n\\nAtlas parses the MongoDB database logs to collect a list of authentication requests made against your clusters through the following methods:\\n\\n- `mongosh`\\n\\n- Compass\\n\\n- Drivers\\n\\nAuthentication requests made with API Keys through the Atlas Administration API are not logged.\\n\\nAtlas logs the following information for each authentication request within the last 7 days:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nField\\n\\n\\nDescription\\n\\n
\\nTimestamp\\n\\n\\nThe date and time of the authentication request.\\n\\n
\\nUsername\\n\\n\\nThe username associated with the database user who made the authentication request.\\n\\nFor LDAP usernames, the UI displays the resolved LDAP name. Hover over the name to see the full LDAP username.\\n\\n
\\nIP Address\\n\\n\\nThe IP address of the machine that sent the authentication request.\\n\\n
\\nHost\\n\\n\\nThe target server that processed the authentication request.\\n\\n
\\nAuthentication Source\\n\\n\\nThe database that the authentication request was made against. `admin` is the authentication source for SCRAM-SHA users and `$external` for LDAP users.\\n\\n
\\nAuthentication Result\\n\\n\\nThe success or failure of the authentication request. A reason code is displayed for the failed authentication requests.\\n\\n
Authentication requests are pre-sorted by descending timestamp with 25 entries per page.\\n\\n### Logging Limitations\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\nIf authentication requests occur during a period when logs are not collected, they will not appear in the database access history.\\n\\n## Required Access\\n\\nTo view database access history, you must have `Project Owner` or `Organization Owner` access to Atlas.\\n\\n## Procedure\\n\\n\\n\\n\\n\\nTo return the access logs for a cluster using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas accessLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas accessLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo view the database access history using the API, see Access Tracking.\\n\\n\\n\\n\\n\\nUse the following procedure to view your database access history using the Atlas UI:\\n\\n### Navigate to the Clusters page for your project.\\n\\n- If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.\\n\\n- If it is not already displayed, select your desired project from the Projects menu in the navigation bar.\\n\\n- If the Clusters page is not already displayed, click Database in the sidebar.\\n\\n### View the cluster\\'s database access history.\\n\\n- On the cluster card, click .\\n\\n- Select View Database Access History.\\n\\nor\\n\\n- Click the cluster name.\\n\\n- Click .\\n\\n- Select View Database Access History.\\n\\n\\n\\n\\n\\n')" ] }, - "execution_count": 31, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -359,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -368,7 +359,7 @@ "1000" ] }, - "execution_count": 32, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -381,12 +372,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Step 5: Instantiate the retrievers" + "## Step 5: Instantiate the retriever" ] }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 43, "metadata": {}, "outputs": [], "source": [ @@ -399,7 +390,7 @@ }, { "cell_type": "code", - "execution_count": 105, + "execution_count": 44, "metadata": {}, "outputs": [], "source": [ @@ -408,18 +399,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "DB_NAME = \"langchain\"\n", - "PARENT_DOC_COLLECTION = \"parent_doc\"\n", - "PARENT_CHUNK_COLLECTION = \"parent_chunk\"" + "COLLECTION_NAME = \"parent_doc\"" ] }, { "cell_type": "code", - "execution_count": 106, + "execution_count": 67, "metadata": {}, "outputs": [], "source": [ @@ -433,47 +423,79 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 68, "metadata": {}, "outputs": [], "source": [ - "def get_retriever(collection, child_chunk_size, **kwargs):\n", + "def get_retriever(child_chunk_size, **kwargs):\n", " return MongoDBAtlasParentDocumentRetriever.from_connection_string(\n", " connection_string=MONGODB_URI,\n", " embedding_model=embedding_model,\n", " child_splitter=get_splitter(child_chunk_size),\n", " database_name=DB_NAME,\n", - " collection_name=collection,\n", + " collection_name=COLLECTION_NAME,\n", " text_key=\"page_content\",\n", " search_type=\"similarity\",\n", " search_kwargs={\"k\": 10},\n", " )" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Parent document retriever" + ] + }, { "cell_type": "code", - "execution_count": 133, + "execution_count": 69, "metadata": {}, "outputs": [], "source": [ - "parent_doc_retriever = get_retriever(\n", - " collection=PARENT_DOC_COLLECTION, child_chunk_size=200\n", - ")" + "parent_doc_retriever = get_retriever(child_chunk_size=200)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Parent chunk retriever" ] }, { "cell_type": "code", - "execution_count": 134, + "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "parent_chunk_retriever = get_retriever(\n", - " collection=PARENT_CHUNK_COLLECTION,\n", - " child_chunk_size=200,\n", - " parent_splitter=get_splitter(800),\n", + " child_chunk_size=200, parent_splitter=get_splitter(800)\n", ")" ] }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Document(metadata={'_id': '79cd1dd0-0503-4a01-916d-016871304f54', 'contentType': None, 'pageDescription': None, 'productName': 'MongoDB Atlas', 'tags': ['atlas', 'docs'], 'version': None, 'updated': {'$date': '2024-05-20T17:30:49.148Z'}, 'url': 'https://mongodb.com/docs/atlas/analyze-slow-queries/', 'title': 'Analyze Slow Queries'}, page_content='# Analyze Slow Queries\\n\\nAtlas provides several tools to help analyze slow queries executed on your clusters. See the following sections for descriptions of each tool. To optimize your query performance, review the best practices for query performance.\\n\\n## Performance Advisor\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance.\\n\\nYou can use the Performance Advisor to review the following information:\\n\\n- Index Ranking\\n\\n- Drop Index Recommendations\\n\\n## Namespace Insights\\n\\nMonitor collection-level query latency with Namespace Insights. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\n## Query Profiler\\n\\nThe Query Profiler displays slow-running operations and their key performance statistics. You can explore a sample of historical queries for up to the last 24 hours without additional cost or performance overhead. Before you enable the Query Profiler, see Considerations.\\n\\n## Real-Time Performance Panel (RTPP)\\n\\nThe Real-Time Performance Panel identifies relevant database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned during query execution. RTPP (Real-Time Performance Panel) is enabled by default.\\n\\nTo enable or disable Real-Time Performance Panel for a project, you must have the `Project Owner` role for the project.\\n\\n## Best Practices for Query Performance\\n\\nTo optimize query performance, review the following best practices:\\n\\n- Create queries that your current indexes support to reduce the time needed to search for your results.\\n\\n- Avoid creating documents with large array fields that require a lot of processing to search and index.\\n\\n- Optimize your indexes and remove unused or inefficent indexes. Too many indexes can negatively impact write performance.\\n\\n- Consider the suggested indexes from the Performance Advisor with the highest Impact scores and lowest Average Query Targeting scores.\\n\\n- Create the indexes that the Performance Advisor suggests when they align with your Indexing Strategies.\\n\\n- The Performance Advisor cannot suggest indexes for MongoDB databases configured to use the ctime timestamp format. As a workaround, set the timestamp format for such databases to either iso8601-utc or iso8601-local.\\n\\n- Perform rolling index builds to reduce the performance impact of building indexes on replica sets and sharded clusters.\\n\\n- Drop unused, redundant, and hidden indexes to improve write performance and free storage space.\\n\\n'),\n", + " Document(metadata={'_id': '5c88653c-ec5d-40bc-a15b-7ef84a62bc38', 'contentType': None, 'pageDescription': None, 'productName': 'MongoDB Atlas', 'tags': ['atlas', 'docs'], 'version': None, 'updated': {'$date': '2024-05-20T17:30:49.151Z'}, 'url': 'https://mongodb.com/docs/atlas/performance-advisor/', 'title': 'Monitor and Improve Slow Queries'}, page_content='# Monitor and Improve Slow Queries\\n\\n*Only available on M10+ clusters and serverless instances*\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance. The threshold for slow queries varies based on the average time of operations on your cluster to provide recommendations pertinent to your workload.\\n\\nRecommended indexes are accompanied by sample queries, grouped by query shape, that were run against a collection that would benefit from the suggested index. The Performance Advisor doesn\\'t negatively affect the performance of your Atlas clusters.\\n\\nYou can also monitor collection-level query latency with Namespace Insights and query performance with the Query Profiler.\\n\\nIf the slow query log contains consecutive `$match` stages in the aggregation pipeline, the two stages can coalesce into the first `$match` stage and result in a single `$match` stage. As a result, the query shape in the Performance Advisor might differ from the actual query you ran.\\n\\n## Common Reasons for Slow Queries\\n\\nIf a query is slow, common reasons include:\\n\\n- The query is unsupported by your current indexes.\\n\\n- Some documents in your collection have large array fields that are costly to search and index.\\n\\n- One query retrieves information from multiple collections with $lookup.\\n\\n## Required Access\\n\\nTo view collections with slow queries and see suggested indexes, you must have `Project Read Only` access or higher to the project.\\n\\nTo view field values in a sample query in the Performance Advisor, you must have `Project Data Access Read/Write` access or higher to the project.\\n\\nTo enable or disable the Atlas-managed slow operation threshold, you must have `Project Owner` access to the project. Users with `Organization Owner` access must add themselves to the project as a `Project Owner`.\\n\\n## Configure the Slow Query Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. However, you can opt out of this feature and instead use a fixed slow query threshold of 100 milliseconds. You can disable the Atlas-managed slow operation threshold with the Atlas CLI, Atlas Administration API, or Atlas UI.\\n\\nAtlas clusters with Atlas Search enabled don\\'t support the Atlas-managed slow query operation threshold.\\n\\nFor `M0`, `M2`, `M5` clusters and serverless instances, Atlas disables the Atlas-managed slow query operation threshold by default and you can\\'t enable it.\\n\\n### Disable the Atlas-Managed Slow Operation Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. If you disable the Atlas-managed slow query threshold, it no longer dynamically adjusts. MongoDB defaults the fixed slow query threshold to 100 milliseconds. We don\\'t recommend that you set the fixed slow query threshold lower than 100 milliseconds.\\n\\nTo disable the Atlas-managed slow operation threshold and use a fixed threshold of 100 milliseconds:\\n\\n\\n\\n\\n\\nTo disable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold disable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold disable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Disable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to Off.\\n\\n\\n\\n\\n\\n### Enable the Atlas-Managed Slow Operation Threshold\\n\\nAtlas enables the Atlas-managed slow operation threshold by default. To re-enable the Atlas-managed slow operation threshold that you previously disabled:\\n\\n\\n\\n\\n\\nTo enable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold enable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold enable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Enable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to On.\\n\\n\\n\\n\\n\\n## Index Considerations\\n\\nIndexes improve read performance, but a large number of indexes can negatively impact write performance since indexes must be updated during writes. If your collection already has several indexes, consider this tradeoff of read and write performance when deciding whether to create new indexes. Examine whether a query for such a collection can be modified to take advantage of existing indexes, as well as whether a query occurs often enough to justify the cost of a new index.\\n\\n## Access Performance Advisor\\n\\n\\n\\n\\n\\n### View Collections with Slow Queries\\n\\nTo return up to 20 namespaces in `.` format for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor namespaces list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor namespaces list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Slow Query Logs\\n\\nTo return query log line items for slow queries that the Performance Advisor and Query Profiler identify using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowQueryLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowQueryLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Suggested Indexes\\n\\nTo return suggested indexes for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor suggestedIndexes list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor suggestedIndexes list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo access the Performance Advisor using the Atlas UI:\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the replica set where the collection resides.\\n\\nIf the replica set resides in a sharded cluster, first click the sharded cluster containing the replica set.\\n\\n### Click Performance Advisor.\\n\\n### Select a collection from the Collections dropdown.\\n\\n### Select a time period from the Time Range dropdown.\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the serverless instance.\\n\\n### Click Performance Advisor.\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nThe Performance Advisor displays up to 20 query shapes across all collections in the cluster and suggested indexes for those shapes. The Performance Advisor ranks the indexes according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about index ranking, see Review Index Ranking.\\n\\n## Index Suggestions\\n\\nThe Performance Advisor ranks the indexes that it suggests according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about how the Performance Advisor ranks indexes, see Review Index Ranking.\\n\\nTo learn how to create indexes that the Performance Advisor suggests, see Create Suggested Indexes.\\n\\n### Index Metrics\\n\\nEach index that the Performance Advisor suggests contains the following metrics. These metrics apply specifically to queries which would be improved by the index:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which would be improved.\\n\\n
\\nAverage Execution Time\\n\\n\\nCurrent average execution time in milliseconds for affected queries.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read per document returned by affected queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nIn Memory Sort\\n\\n\\nCurrent number of affected queries per hour that needed to be sorted in memory.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
\\nAverage Object Size\\n\\n\\nAverage object size.\\n\\n
\\n\\n### Sample Queries\\n\\nFor each suggested index, the Performance Advisor shows the most commonly executed query shapes that the index would improve. For each query shape, the Performance Advisor displays the following metrics:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which match the query shape.\\n\\n
\\nAverage Execution Time\\n\\n\\nAverage execution time in milliseconds for queries which match the query shape.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read for every document returned by matching queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
The Performance Advisor also shows each executed sample query that matches the query shape, with specific metrics for that query.\\n\\n### Query Targeting\\n\\nEach index suggestion includes an Average Query Targeting score indicating how many documents were read for every document returned for the index\\'s corresponding query shapes. A score of 1 represents very efficient query shapes because every document read matched the query and was returned with the query results. All suggested indexes represent an opportunity to improve query performance.\\n\\n### Filter Index Suggestions\\n\\nBy default, the Performance Advisor suggests indexes for all clusters in the deployment. To only show suggested indexes from a specific collection, use the Collection dropdown at the top of the Performance Advisor.\\n\\nYou can also adjust the time range the Performance Advisor takes into account when suggesting indexes by using the Time Range dropdown at the top of the Performance Advisor.\\n\\n### Limitations of Index Suggestions\\n\\n#### Timestamp Format\\n\\nThe Performance Advisor can\\'t suggest indexes for MongoDB databases configured to use the `ctime` timestamp format. As a workaround, set the timestamp format for such databases to either `iso8601-utc` or `iso8601-local`. To learn more about timestamp formats, see mongod --timeStampFormat.\\n\\n#### Log Size\\n\\nThe Performance Advisor analyzes up to 200,000 of your cluster\\'s most recent log lines.\\n\\n#### Log Quantity\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\n#### Time-Series Collections\\n\\nThe Performance Advisor doesn\\'t provide performance suggestions for time-series collections.\\n\\n#### User Feedback\\n\\nThe Performance Advisor includes a user feedback button for Index Suggestions. Atlas hides this button for serverless instances.\\n\\n## Create Suggested Indexes\\n\\nYou can create indexes suggested by the Performance Advisor directly within the Performance Advisor itself. When you create indexes, keep the ratio of reads to writes on the target collection in mind. Indexes come with a performance cost, but are more than worth the cost for frequent queries on large data sets. To learn more about indexing strategies, see Indexing Strategies.\\n\\n### Behavior and Limitations\\n\\n- You can\\'t create indexes through the Performance Advisor if Data Explorer is disabled for your project. You can still view the Performance Advisor recommendations, but you must create those indexes from `mongosh`.\\n\\n- You can only create one index at a time through the Performance Advisor. If you want to create more simultaneously, you can do so using the Atlas UI, a driver, or the shell\\n\\n- Atlas always creates indexes for entire clusters. If you create an index while viewing the Performance Advisor for a single shard in a sharded cluster, Atlas creates that index for the entire sharded cluster.\\n\\n### Procedure\\n\\nTo create a suggested index:\\n\\n#### For the index you want to create, click Create Index.\\n\\nThe Performance Advisor opens the Create Index dialog and prepopulates the Fields based on the index you selected.\\n\\n#### *(Optional)* Specify the index options.\\n\\n```javascript\\n{ : , ... }\\n```\\n\\nThe following options document specifies the `unique` option and the `name` for the index:\\n\\n```javascript\\n{ unique: true, name: \"myUniqueIndex\" }\\n```\\n\\n#### *(Optional)* Set the Collation options.\\n\\nUse collation to specify language-specific rules for string comparison, such as rules for lettercase and accent marks. The collation document contains a `locale` field which indicates the ICU Locale code, and may contain other fields to define collation behavior.\\n\\nThe following collation option document specifies a locale value of `fr` for a French language collation:\\n\\n```json\\n{ \"locale\": \"fr\" }\\n```\\n\\nTo review the list of locales that MongoDB collation supports, see the list of languages and locales. To learn more about collation options, including which are enabled by default for each locale, see Collation in the MongoDB manual.\\n\\n#### *(Optional)* Enable building indexes in a rolling fashion.\\n\\nRolling index builds succeed only when they meet certain conditions. To ensure your index build succeeds, avoid the following design patterns that commonly trigger a restart loop:\\n\\n- Index key exceeds the index key limit\\n\\n- Index name already exists\\n\\n- Index on more than one array field\\n\\n- Index on collection that has the maximum number of text indexes\\n\\n- Text index on collection that has the maximum number of text indexes\\n\\nthe Atlas UI doesn\\'t support building indexes with a rolling build for `M0` free clusters and `M2/M5` shared clusters. You can\\'t build indexes with a rolling build for serverless instances.\\n\\nFor workloads which cannot tolerate performance decrease due to index builds, consider building indexes in a rolling fashion.\\n\\nTo maintain cluster availability:\\n\\n- Atlas removes one node from the cluster at a time starting with a secondary.\\n\\n- More than one node can go down at a time, but Atlas always keeps a majority of the nodes online.\\n\\nAtlas automatically cancels rolling index builds that don\\'t succeed on all nodes. When a rolling index build completes on some nodes, but fails on others, Atlas cancels the build and removes the index from any nodes that it was successfully built on.\\n\\nIn the event of a rolling index build cancellation, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Name of the cluster on which the rolling index build failed\\n\\n- Namespace on which the rolling index build failed\\n\\n- Project that contains the cluster and namespace\\n\\n- Organization that contains the project\\n\\n- Link to the activity feed event\\n\\nTo learn more about rebuilding indexes, see Build Indexes on Replica Sets.\\n\\nUnique\\nindex options are incompatible with building indexes in a rolling fashion. If you specify `unique` in the Options pane, Atlas rejects your configuration with an error message.\\n\\n#### Click Review.\\n\\n#### In the Confirm Operation dialog, confirm your index.\\n\\nWhen an index build completes, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Completion date of the index build\\n\\n- Name of the cluster on which the index build completed\\n\\n- Namespace on which the index build completed\\n\\n- Project containing the cluster and namespace\\n\\n- Organization containing the project\\n\\n- Link to the activity feed event\\n\\n'),\n", + " Document(metadata={'_id': 'd7d7b858-ad21-4d13-87fb-81aad04ae579', 'contentType': None, 'pageDescription': None, 'productName': 'MongoDB Atlas', 'tags': ['atlas', 'docs'], 'version': None, 'updated': {'$date': '2024-05-20T17:30:49.151Z'}, 'url': 'https://mongodb.com/docs/atlas/reference/alert-resolutions/query-targeting/', 'title': 'Fix Query Issues'}, page_content='# Fix Query Issues\\n\\n`Query Targeting` alerts often indicate inefficient queries.\\n\\n## Alert Conditions\\n\\nYou can configure the following alert conditions in the project-level alert settings page to trigger alerts.\\n\\n`Query Targeting: Scanned Objects / Returned` alerts are triggered when the average number of documents scanned relative to the average number of documents returned server-wide across all operations during a sampling period exceeds a defined threshold. The default alert uses a 1000:1 threshold.\\n\\nIdeally, the ratio of scanned documents to returned documents should be close to 1. A high ratio negatively impacts query performance.\\n\\n`Query Targeting: Scanned / Returned` occurs if the number of index keys examined to fulfill a query relative to the actual number of returned documents meets or exceeds a user-defined threshold. This alert is not enabled by default.\\n\\nThe following mongod log entry shows statistics generated from an inefficient query:\\n\\n```json\\n COMMAND \\nplanSummary: COLLSCAN keysExamined:0\\ndocsExamined: 10000 cursorExhausted:1 numYields:234\\nnreturned:4 protocol:op_query 358ms\\n```\\n\\nThis query scanned 10,000 documents and returned only 4 for a ratio of 2500, which is highly inefficient. No index keys were examined, so MongoDB scanned all documents in the collection, known as a collection scan.\\n\\n## Common Triggers\\n\\nThe query targeting alert typically occurs when there is no index to support a query or queries or when an existing index only partially supports a query or queries.\\n\\nThe change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\n## Fix the Immediate Problem\\n\\nAdd one or more indexes to better serve the inefficient queries.\\n\\nThe Performance Advisor provides the easiest and quickest way to create an index. The Performance Advisor monitors queries that MongoDB considers slow and recommends indexes to improve performance. Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster.\\n\\nClick Create Index on a slow query for instructions on how to create the recommended index.\\n\\nIt is possible to receive a Query Targeting alert for an inefficient query without receiving index suggestions from the Performance Advisor if the query exceeds the slow query threshold and the ratio of scanned to returned documents is greater than the threshold specified in the alert.\\n\\nIn addition, you can use the following resources to determine which query generated the alert:\\n\\n- The Real-Time Performance Panel monitors and displays current network traffic and database operations on machines hosting MongoDB in your Atlas clusters.\\n\\n- The MongoDB logs maintain an account of activity, including queries, for each `mongod` instance in your Atlas clusters.\\n\\n- The cursor.explain() command for `mongosh` provides performance details for all queries.\\n\\n- Namespace Insights monitors collection-level query latency.\\n\\n- The Atlas Query Profiler records operations that Atlas considers slow when compared to average execution time for all operations on your cluster.\\n\\n## Implement a Long-Term Solution\\n\\nRefer to the following for more information on query performance:\\n\\n- MongoDB Indexing Strategies\\n\\n- Query Optimization\\n\\n- Analyze Query Plan\\n\\n## Monitor Your Progress\\n\\nAtlas provides the following methods to visualize query targeting:\\n\\n- Query Targeting metrics, which highlight high ratios of objects scanned to objects returned.\\n\\n- Namespace Insights, which monitors collection-level query latency.\\n\\n- The Query Profiler, which describes specific inefficient queries executed on the cluster.\\n\\n### Query Targeting Metrics\\n\\nYou can view historical metrics to help you visualize the query performance of your cluster. To view Query Targeting metrics in the Atlas UI:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. On the Metrics page, click the Add Chart dropdown menu and select Query Targeting.\\n\\nThe Query Targeting chart displays the following metrics for queries executed on the server:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nScanned Objects / Returned\\n\\n\\nIndicates the average number of documents examined relative to the average number of returned documents.\\n\\n
\\nScanned / Returned\\n\\n\\nIndicates the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\n
The change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\nIf either of these metrics exceed the user-defined threshold, Atlas generates the corresponding `Query Targeting: Scanned Objects / Returned` or `Query Targeting: Scanned / Returned` alert.\\n\\nYou can also view Query Targeting ratios of operations in real-time using the Real-Time Performance Panel.\\n\\n### Namespace Insights\\n\\nNamespace Insights monitors collection-level query latency. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\nTo access Namespace Insights:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Namespace Insights tab.\\n\\n### Query Profiler\\n\\nThe Query Profiler contains several metrics you can use to pinpoint specific inefficient queries. You can visualize up to the past 24 hours of query operations. The Query Profiler can show the Examined : Returned Ratio (index keys examined to documents returned) of logged queries, which might help you identify the queries that triggered a `Query Targeting: Scanned / Returned` alert. The chart shows the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\nThe default\\n`Query Targeting: Scanned Objects / Returned` alert ratio differs slightly. The ratio of the average number of documents scanned to the average number of documents returned during a sampling period triggers this alert.\\n\\nAtlas might not log the individual operations that contribute to the Query Targeting ratios due to automatically set thresholds. However, you can still use the Query Profiler and Query Targeting metrics to analyze and optimize query performance.\\n\\nTo access the Query Profiler:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Query Profiler tab.\\n\\n')]" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parent_doc_retriever.invoke(\"How do I improve slow queries in MongoDB?\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -483,7 +505,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 71, "metadata": {}, "outputs": [], "source": [ @@ -492,17 +514,17 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 72, "metadata": {}, "outputs": [], "source": [ - "CHUNK_SIZE = 100\n", + "CHUNK_SIZE = 256\n", "MAX_CONCURRENCY = 4" ] }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 73, "metadata": {}, "outputs": [], "source": [ @@ -514,7 +536,7 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 74, "metadata": {}, "outputs": [], "source": [ @@ -525,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 75, "metadata": {}, "outputs": [], "source": [ @@ -544,88 +566,57 @@ }, { "cell_type": "code", - "execution_count": 74, - "metadata": {}, - "outputs": [], - "source": [ - "def get_collection(coll_name):\n", - " return mongodb_client[DB_NAME][coll_name]" - ] - }, - { - "cell_type": "code", - "execution_count": 71, + "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n" + "Deletion complete.\n", + "Processed 256 documents\n", + "Processed 256 documents\n", + "Processed 256 documents\n", + "Processed 232 documents\n" ] } ], "source": [ - "get_collection(PARENT_DOC_COLLECTION).delete_many({})\n", + "collection = mongodb_client[DB_NAME][COLLECTION_NAME]\n", + "collection.delete_many({})\n", + "print(f\"Deletion complete.\")\n", "results = await process_docs(docs, parent_doc_retriever)" ] }, { - "cell_type": "code", - "execution_count": 61, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n", - "Processed 100 documents\n" - ] - } - ], "source": [ - "get_collection(PARENT_CHUNK_COLLECTION).delete_many({})\n", - "results = await process_docs(docs, parent_chunk_retriever)" + "## Step 7: Create vector search indexes" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 77, "metadata": {}, + "outputs": [], "source": [ - "## Step 7: Create vector search indexes" + "from pymongo.operations import SearchIndexModel\n", + "from pymongo.errors import OperationFailure" ] }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 78, "metadata": {}, "outputs": [], "source": [ - "from pymongo.operations import SearchIndexModel\n", - "from pymongo.errors import OperationFailure" + "VS_INDEX_NAME = \"vector_index\"" ] }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 79, "metadata": {}, "outputs": [], "source": [ @@ -640,71 +631,46 @@ " }\n", " ]\n", " },\n", - " name=\"vector_index\",\n", + " name=VS_INDEX_NAME,\n", " type=\"vectorSearch\",\n", ")" ] }, { "cell_type": "code", - "execution_count": 76, - "metadata": {}, - "outputs": [], - "source": [ - "def create_vs_index(coll_name):\n", - " try:\n", - " get_collection(coll_name).create_search_index(model=model)\n", - " print(f\"Successfully created index for collection {coll_name}.\")\n", - " except OperationFailure:\n", - " print(\n", - " f\"Duplicate index found for collection {coll_name}. Skipping index creation.\"\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Successfully created index for collection parent_doc.\n" - ] - } - ], - "source": [ - "create_vs_index(PARENT_DOC_COLLECTION)" - ] - }, - { - "cell_type": "code", - "execution_count": 78, + "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Successfully created index for collection parent_chunk.\n" + "Successfully created index vector_index for collection parent_doc\n" ] } ], "source": [ - "create_vs_index(PARENT_CHUNK_COLLECTION)" + "try:\n", + " collection.create_search_index(model=model)\n", + " print(\n", + " f\"Successfully created index {VS_INDEX_NAME} for collection {COLLECTION_NAME}\"\n", + " )\n", + "except OperationFailure:\n", + " print(\n", + " f\"Duplicate index {VS_INDEX_NAME} found for collection {COLLECTION_NAME}. Skipping index creation.\"\n", + " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Step 8: Create RAG Chain" + "## Step 8: Usage" ] }, { "cell_type": "code", - "execution_count": 139, + "execution_count": 81, "metadata": {}, "outputs": [], "source": [ @@ -716,31 +682,79 @@ }, { "cell_type": "code", - "execution_count": 142, + "execution_count": 82, "metadata": {}, "outputs": [], "source": [ - "def get_rag_chain(retriever):\n", - " retrieve = {\n", - " \"context\": retriever\n", - " | (lambda docs: \"\\n\\n\".join([d.page_content for d in docs])),\n", - " \"question\": RunnablePassthrough(),\n", - " }\n", - " template = \"\"\"Answer the question based only on the following context. If no context is provided, respond with I DON't KNOW: \\\n", - " {context}\n", + "retrieve = {\n", + " \"context\": parent_doc_retriever\n", + " | (lambda docs: \"\\n\\n\".join([d.page_content for d in docs])),\n", + " \"question\": RunnablePassthrough(),\n", + "}\n", + "template = \"\"\"Answer the question based only on the following context. If no context is provided, respond with I DON't KNOW: \\\n", + "{context}\n", "\n", - " Question: {question}\n", - " \"\"\"\n", - " # Defining the chat prompt\n", - " prompt = ChatPromptTemplate.from_template(template)\n", - " # Defining the model to be used for chat completion\n", - " llm = ChatOpenAI(temperature=0, model=\"gpt-4o-2024-11-20\")\n", - " # Parse output as a string\n", - " parse_output = StrOutputParser()\n", + "Question: {question}\n", + "\"\"\"\n", + "# Defining the chat prompt\n", + "prompt = ChatPromptTemplate.from_template(template)\n", + "# Defining the model to be used for chat completion\n", + "llm = ChatOpenAI(temperature=0, model=\"gpt-4o-2024-11-20\")\n", + "# Parse output as a string\n", + "parse_output = StrOutputParser()\n", "\n", - " # Naive RAG chain\n", - " rag_chain = retrieve | prompt | llm | parse_output\n", - " return rag_chain" + "# Naive RAG chain\n", + "rag_chain = retrieve | prompt | llm | parse_output" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "To improve slow queries in MongoDB, you can follow these steps:\n", + "\n", + "1. **Use the Performance Advisor**:\n", + " - The Performance Advisor monitors slow queries and suggests new indexes to improve query performance.\n", + " - Review the suggested indexes, especially those with high Impact scores and low Average Query Targeting scores, and create them if they align with your indexing strategies.\n", + "\n", + "2. **Analyze Query Performance**:\n", + " - Use the **Query Profiler** to explore slow-running operations and their key performance statistics for up to the last 24 hours.\n", + " - Use the **Real-Time Performance Panel (RTPP)** to evaluate query execution times and the ratio of documents scanned to documents returned.\n", + "\n", + "3. **Monitor Query Latency**:\n", + " - Use **Namespace Insights** to monitor collection-level query latency and view query latency metrics and statistics.\n", + "\n", + "4. **Fix Inefficient Queries**:\n", + " - Address `Query Targeting` alerts by adding indexes to support inefficient queries.\n", + " - Use the `cursor.explain()` command to analyze query plans and identify inefficiencies.\n", + "\n", + "5. **Follow Best Practices**:\n", + " - Create queries that are supported by existing indexes.\n", + " - Avoid large array fields in documents that are costly to search and index.\n", + " - Optimize and remove unused or inefficient indexes to balance read and write performance.\n", + " - Perform rolling index builds to minimize performance impact on replica sets and sharded clusters.\n", + "\n", + "6. **Configure Slow Query Threshold**:\n", + " - Adjust the slow query threshold to identify slow queries more effectively. By default, Atlas dynamically adjusts this threshold, but you can set a fixed threshold of 100 milliseconds if needed.\n", + "\n", + "7. **Monitor Progress**:\n", + " - Use Query Targeting metrics, Namespace Insights, and the Query Profiler to visualize and track improvements in query performance.\n", + "\n", + "8. **Address Common Issues**:\n", + " - Ensure queries are supported by indexes.\n", + " - Optimize queries involving `$lookup` or large array fields.\n", + "\n", + "By implementing these steps, you can identify and resolve slow queries, improving overall query performance in MongoDB.\n" + ] + } + ], + "source": [ + "print(rag_chain.invoke(\"How do I improve slow queries in MongoDB?\"))" ] } ], From 15e27bd2cb130fc78fc88b730c6f1d0c52efa9a8 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Mon, 2 Dec 2024 11:13:00 -0800 Subject: [PATCH 06/23] Agent works now too --- .../langchain_parent_document_retrieval.ipynb | 259 ++++++++++++++++++ 1 file changed, 259 insertions(+) diff --git a/notebooks/rag/langchain_parent_document_retrieval.ipynb b/notebooks/rag/langchain_parent_document_retrieval.ipynb index ecd4b0c..280a8e4 100644 --- a/notebooks/rag/langchain_parent_document_retrieval.ipynb +++ b/notebooks/rag/langchain_parent_document_retrieval.ipynb @@ -668,6 +668,13 @@ "## Step 8: Usage" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### In a RAG application" + ] + }, { "cell_type": "code", "execution_count": 81, @@ -756,6 +763,258 @@ "source": [ "print(rag_chain.invoke(\"How do I improve slow queries in MongoDB?\"))" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### In an agent" + ] + }, + { + "cell_type": "code", + "execution_count": 146, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain.agents import tool\n", + "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n", + "from typing import Annotated\n", + "from langgraph.graph.message import add_messages\n", + "from typing_extensions import TypedDict\n", + "from langgraph.prebuilt import ToolNode, tools_condition\n", + "from langgraph.graph import StateGraph, START, END\n", + "from IPython.display import Image, display" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [], + "source": [ + "@tool\n", + "def get_info_about_mongodb(user_query: str) -> str:\n", + " \"\"\"\n", + " Retrieve information about MongoDB.\n", + "\n", + " Args:\n", + " user_query (str): The user's query string.\n", + "\n", + " Returns:\n", + " str: The retrieved information formatted as a string.\n", + " \"\"\"\n", + " docs = parent_doc_retriever.invoke(user_query)\n", + " context = \"\\n\\n\".join([d.page_content for d in docs])\n", + " return context" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": {}, + "outputs": [], + "source": [ + "tools = [get_info_about_mongodb]" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [], + "source": [ + "class GraphState(TypedDict):\n", + " messages: Annotated[list, add_messages]" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [], + "source": [ + "llm = ChatOpenAI(temperature=0, model=\"gpt-4o-2024-11-20\")\n", + "prompt = ChatPromptTemplate.from_messages(\n", + " [\n", + " (\n", + " \"You are a helpful AI assistant.\"\n", + " \" You are provided with tools to answer questions about MongoDB.\"\n", + " \" Think step-by-step and use these tools to get the information required to answer the user query.\"\n", + " \" Do not re-run tools unless absolutely necessary.\"\n", + " \" If you are not able to get enough information using the tools, reply with I DON'T KNOW.\"\n", + " \" You have access to the following tools: {tool_names}.\"\n", + " ),\n", + " MessagesPlaceholder(variable_name=\"messages\"),\n", + " ]\n", + ")\n", + "prompt = prompt.partial(tool_names=\", \".join([tool.name for tool in tools]))\n", + "llm_with_tools = prompt | llm.bind_tools(tools)" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [], + "source": [ + "def agent(state):\n", + " messages = state[\"messages\"]\n", + " print(messages)\n", + " response = llm_with_tools.invoke(messages)\n", + " # We return a list, because this will get added to the existing list\n", + " return {\"messages\": [response]}" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": {}, + "outputs": [], + "source": [ + "tool_node = ToolNode(tools)" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": {}, + "outputs": [], + "source": [ + "graph = StateGraph(GraphState)\n", + "graph.add_node(\"agent\", agent)\n", + "graph.add_node(\"tools\", tool_node)\n", + "graph.add_edge(START, \"agent\")\n", + "graph.add_edge(\"tools\", \"agent\")\n", + "graph.add_conditional_edges(\n", + " \"agent\",\n", + " tools_condition,\n", + " {\"tools\": \"tools\", END: END},\n", + ")\n", + "app = graph.compile()" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Visualize the graph\n", + "try:\n", + " display(Image(app.get_graph().draw_mermaid_png()))\n", + "except Exception:\n", + " # This requires some extra dependencies and is optional\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[HumanMessage(content='How do I improve slow queries in MongoDB?', additional_kwargs={}, response_metadata={}, id='d24196f2-dd7e-4342-9660-7f2a9933b807')]\n", + "Node agent:\n", + "{'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_8uC6x6EalTyPlaDn1xHG5bcr', 'function': {'arguments': '{\"user_query\":\"How do I improve slow queries in MongoDB?\"}', 'name': 'get_info_about_mongodb'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 27, 'prompt_tokens': 165, 'total_tokens': 192, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-11-20', 'system_fingerprint': 'fp_a523ccd45c', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-81181db3-2a33-479b-9ee6-f773c47c1275-0', tool_calls=[{'name': 'get_info_about_mongodb', 'args': {'user_query': 'How do I improve slow queries in MongoDB?'}, 'id': 'call_8uC6x6EalTyPlaDn1xHG5bcr', 'type': 'tool_call'}], usage_metadata={'input_tokens': 165, 'output_tokens': 27, 'total_tokens': 192, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}\n", + "Node tools:\n", + "{'messages': [ToolMessage(content='# Analyze Slow Queries\\n\\nAtlas provides several tools to help analyze slow queries executed on your clusters. See the following sections for descriptions of each tool. To optimize your query performance, review the best practices for query performance.\\n\\n## Performance Advisor\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance.\\n\\nYou can use the Performance Advisor to review the following information:\\n\\n- Index Ranking\\n\\n- Drop Index Recommendations\\n\\n## Namespace Insights\\n\\nMonitor collection-level query latency with Namespace Insights. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\n## Query Profiler\\n\\nThe Query Profiler displays slow-running operations and their key performance statistics. You can explore a sample of historical queries for up to the last 24 hours without additional cost or performance overhead. Before you enable the Query Profiler, see Considerations.\\n\\n## Real-Time Performance Panel (RTPP)\\n\\nThe Real-Time Performance Panel identifies relevant database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned during query execution. RTPP (Real-Time Performance Panel) is enabled by default.\\n\\nTo enable or disable Real-Time Performance Panel for a project, you must have the `Project Owner` role for the project.\\n\\n## Best Practices for Query Performance\\n\\nTo optimize query performance, review the following best practices:\\n\\n- Create queries that your current indexes support to reduce the time needed to search for your results.\\n\\n- Avoid creating documents with large array fields that require a lot of processing to search and index.\\n\\n- Optimize your indexes and remove unused or inefficent indexes. Too many indexes can negatively impact write performance.\\n\\n- Consider the suggested indexes from the Performance Advisor with the highest Impact scores and lowest Average Query Targeting scores.\\n\\n- Create the indexes that the Performance Advisor suggests when they align with your Indexing Strategies.\\n\\n- The Performance Advisor cannot suggest indexes for MongoDB databases configured to use the ctime timestamp format. As a workaround, set the timestamp format for such databases to either iso8601-utc or iso8601-local.\\n\\n- Perform rolling index builds to reduce the performance impact of building indexes on replica sets and sharded clusters.\\n\\n- Drop unused, redundant, and hidden indexes to improve write performance and free storage space.\\n\\n\\n\\n# Fix Query Issues\\n\\n`Query Targeting` alerts often indicate inefficient queries.\\n\\n## Alert Conditions\\n\\nYou can configure the following alert conditions in the project-level alert settings page to trigger alerts.\\n\\n`Query Targeting: Scanned Objects / Returned` alerts are triggered when the average number of documents scanned relative to the average number of documents returned server-wide across all operations during a sampling period exceeds a defined threshold. The default alert uses a 1000:1 threshold.\\n\\nIdeally, the ratio of scanned documents to returned documents should be close to 1. A high ratio negatively impacts query performance.\\n\\n`Query Targeting: Scanned / Returned` occurs if the number of index keys examined to fulfill a query relative to the actual number of returned documents meets or exceeds a user-defined threshold. This alert is not enabled by default.\\n\\nThe following mongod log entry shows statistics generated from an inefficient query:\\n\\n```json\\n COMMAND \\nplanSummary: COLLSCAN keysExamined:0\\ndocsExamined: 10000 cursorExhausted:1 numYields:234\\nnreturned:4 protocol:op_query 358ms\\n```\\n\\nThis query scanned 10,000 documents and returned only 4 for a ratio of 2500, which is highly inefficient. No index keys were examined, so MongoDB scanned all documents in the collection, known as a collection scan.\\n\\n## Common Triggers\\n\\nThe query targeting alert typically occurs when there is no index to support a query or queries or when an existing index only partially supports a query or queries.\\n\\nThe change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\n## Fix the Immediate Problem\\n\\nAdd one or more indexes to better serve the inefficient queries.\\n\\nThe Performance Advisor provides the easiest and quickest way to create an index. The Performance Advisor monitors queries that MongoDB considers slow and recommends indexes to improve performance. Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster.\\n\\nClick Create Index on a slow query for instructions on how to create the recommended index.\\n\\nIt is possible to receive a Query Targeting alert for an inefficient query without receiving index suggestions from the Performance Advisor if the query exceeds the slow query threshold and the ratio of scanned to returned documents is greater than the threshold specified in the alert.\\n\\nIn addition, you can use the following resources to determine which query generated the alert:\\n\\n- The Real-Time Performance Panel monitors and displays current network traffic and database operations on machines hosting MongoDB in your Atlas clusters.\\n\\n- The MongoDB logs maintain an account of activity, including queries, for each `mongod` instance in your Atlas clusters.\\n\\n- The cursor.explain() command for `mongosh` provides performance details for all queries.\\n\\n- Namespace Insights monitors collection-level query latency.\\n\\n- The Atlas Query Profiler records operations that Atlas considers slow when compared to average execution time for all operations on your cluster.\\n\\n## Implement a Long-Term Solution\\n\\nRefer to the following for more information on query performance:\\n\\n- MongoDB Indexing Strategies\\n\\n- Query Optimization\\n\\n- Analyze Query Plan\\n\\n## Monitor Your Progress\\n\\nAtlas provides the following methods to visualize query targeting:\\n\\n- Query Targeting metrics, which highlight high ratios of objects scanned to objects returned.\\n\\n- Namespace Insights, which monitors collection-level query latency.\\n\\n- The Query Profiler, which describes specific inefficient queries executed on the cluster.\\n\\n### Query Targeting Metrics\\n\\nYou can view historical metrics to help you visualize the query performance of your cluster. To view Query Targeting metrics in the Atlas UI:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. On the Metrics page, click the Add Chart dropdown menu and select Query Targeting.\\n\\nThe Query Targeting chart displays the following metrics for queries executed on the server:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nScanned Objects / Returned\\n\\n\\nIndicates the average number of documents examined relative to the average number of returned documents.\\n\\n
\\nScanned / Returned\\n\\n\\nIndicates the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\n
The change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\nIf either of these metrics exceed the user-defined threshold, Atlas generates the corresponding `Query Targeting: Scanned Objects / Returned` or `Query Targeting: Scanned / Returned` alert.\\n\\nYou can also view Query Targeting ratios of operations in real-time using the Real-Time Performance Panel.\\n\\n### Namespace Insights\\n\\nNamespace Insights monitors collection-level query latency. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\nTo access Namespace Insights:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Namespace Insights tab.\\n\\n### Query Profiler\\n\\nThe Query Profiler contains several metrics you can use to pinpoint specific inefficient queries. You can visualize up to the past 24 hours of query operations. The Query Profiler can show the Examined : Returned Ratio (index keys examined to documents returned) of logged queries, which might help you identify the queries that triggered a `Query Targeting: Scanned / Returned` alert. The chart shows the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\nThe default\\n`Query Targeting: Scanned Objects / Returned` alert ratio differs slightly. The ratio of the average number of documents scanned to the average number of documents returned during a sampling period triggers this alert.\\n\\nAtlas might not log the individual operations that contribute to the Query Targeting ratios due to automatically set thresholds. However, you can still use the Query Profiler and Query Targeting metrics to analyze and optimize query performance.\\n\\nTo access the Query Profiler:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Query Profiler tab.\\n\\n\\n\\n# Monitor and Improve Slow Queries\\n\\n*Only available on M10+ clusters and serverless instances*\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance. The threshold for slow queries varies based on the average time of operations on your cluster to provide recommendations pertinent to your workload.\\n\\nRecommended indexes are accompanied by sample queries, grouped by query shape, that were run against a collection that would benefit from the suggested index. The Performance Advisor doesn\\'t negatively affect the performance of your Atlas clusters.\\n\\nYou can also monitor collection-level query latency with Namespace Insights and query performance with the Query Profiler.\\n\\nIf the slow query log contains consecutive `$match` stages in the aggregation pipeline, the two stages can coalesce into the first `$match` stage and result in a single `$match` stage. As a result, the query shape in the Performance Advisor might differ from the actual query you ran.\\n\\n## Common Reasons for Slow Queries\\n\\nIf a query is slow, common reasons include:\\n\\n- The query is unsupported by your current indexes.\\n\\n- Some documents in your collection have large array fields that are costly to search and index.\\n\\n- One query retrieves information from multiple collections with $lookup.\\n\\n## Required Access\\n\\nTo view collections with slow queries and see suggested indexes, you must have `Project Read Only` access or higher to the project.\\n\\nTo view field values in a sample query in the Performance Advisor, you must have `Project Data Access Read/Write` access or higher to the project.\\n\\nTo enable or disable the Atlas-managed slow operation threshold, you must have `Project Owner` access to the project. Users with `Organization Owner` access must add themselves to the project as a `Project Owner`.\\n\\n## Configure the Slow Query Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. However, you can opt out of this feature and instead use a fixed slow query threshold of 100 milliseconds. You can disable the Atlas-managed slow operation threshold with the Atlas CLI, Atlas Administration API, or Atlas UI.\\n\\nAtlas clusters with Atlas Search enabled don\\'t support the Atlas-managed slow query operation threshold.\\n\\nFor `M0`, `M2`, `M5` clusters and serverless instances, Atlas disables the Atlas-managed slow query operation threshold by default and you can\\'t enable it.\\n\\n### Disable the Atlas-Managed Slow Operation Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. If you disable the Atlas-managed slow query threshold, it no longer dynamically adjusts. MongoDB defaults the fixed slow query threshold to 100 milliseconds. We don\\'t recommend that you set the fixed slow query threshold lower than 100 milliseconds.\\n\\nTo disable the Atlas-managed slow operation threshold and use a fixed threshold of 100 milliseconds:\\n\\n\\n\\n\\n\\nTo disable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold disable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold disable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Disable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to Off.\\n\\n\\n\\n\\n\\n### Enable the Atlas-Managed Slow Operation Threshold\\n\\nAtlas enables the Atlas-managed slow operation threshold by default. To re-enable the Atlas-managed slow operation threshold that you previously disabled:\\n\\n\\n\\n\\n\\nTo enable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold enable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold enable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Enable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to On.\\n\\n\\n\\n\\n\\n## Index Considerations\\n\\nIndexes improve read performance, but a large number of indexes can negatively impact write performance since indexes must be updated during writes. If your collection already has several indexes, consider this tradeoff of read and write performance when deciding whether to create new indexes. Examine whether a query for such a collection can be modified to take advantage of existing indexes, as well as whether a query occurs often enough to justify the cost of a new index.\\n\\n## Access Performance Advisor\\n\\n\\n\\n\\n\\n### View Collections with Slow Queries\\n\\nTo return up to 20 namespaces in `.` format for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor namespaces list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor namespaces list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Slow Query Logs\\n\\nTo return query log line items for slow queries that the Performance Advisor and Query Profiler identify using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowQueryLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowQueryLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Suggested Indexes\\n\\nTo return suggested indexes for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor suggestedIndexes list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor suggestedIndexes list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo access the Performance Advisor using the Atlas UI:\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the replica set where the collection resides.\\n\\nIf the replica set resides in a sharded cluster, first click the sharded cluster containing the replica set.\\n\\n### Click Performance Advisor.\\n\\n### Select a collection from the Collections dropdown.\\n\\n### Select a time period from the Time Range dropdown.\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the serverless instance.\\n\\n### Click Performance Advisor.\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nThe Performance Advisor displays up to 20 query shapes across all collections in the cluster and suggested indexes for those shapes. The Performance Advisor ranks the indexes according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about index ranking, see Review Index Ranking.\\n\\n## Index Suggestions\\n\\nThe Performance Advisor ranks the indexes that it suggests according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about how the Performance Advisor ranks indexes, see Review Index Ranking.\\n\\nTo learn how to create indexes that the Performance Advisor suggests, see Create Suggested Indexes.\\n\\n### Index Metrics\\n\\nEach index that the Performance Advisor suggests contains the following metrics. These metrics apply specifically to queries which would be improved by the index:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which would be improved.\\n\\n
\\nAverage Execution Time\\n\\n\\nCurrent average execution time in milliseconds for affected queries.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read per document returned by affected queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nIn Memory Sort\\n\\n\\nCurrent number of affected queries per hour that needed to be sorted in memory.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
\\nAverage Object Size\\n\\n\\nAverage object size.\\n\\n
\\n\\n### Sample Queries\\n\\nFor each suggested index, the Performance Advisor shows the most commonly executed query shapes that the index would improve. For each query shape, the Performance Advisor displays the following metrics:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which match the query shape.\\n\\n
\\nAverage Execution Time\\n\\n\\nAverage execution time in milliseconds for queries which match the query shape.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read for every document returned by matching queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
The Performance Advisor also shows each executed sample query that matches the query shape, with specific metrics for that query.\\n\\n### Query Targeting\\n\\nEach index suggestion includes an Average Query Targeting score indicating how many documents were read for every document returned for the index\\'s corresponding query shapes. A score of 1 represents very efficient query shapes because every document read matched the query and was returned with the query results. All suggested indexes represent an opportunity to improve query performance.\\n\\n### Filter Index Suggestions\\n\\nBy default, the Performance Advisor suggests indexes for all clusters in the deployment. To only show suggested indexes from a specific collection, use the Collection dropdown at the top of the Performance Advisor.\\n\\nYou can also adjust the time range the Performance Advisor takes into account when suggesting indexes by using the Time Range dropdown at the top of the Performance Advisor.\\n\\n### Limitations of Index Suggestions\\n\\n#### Timestamp Format\\n\\nThe Performance Advisor can\\'t suggest indexes for MongoDB databases configured to use the `ctime` timestamp format. As a workaround, set the timestamp format for such databases to either `iso8601-utc` or `iso8601-local`. To learn more about timestamp formats, see mongod --timeStampFormat.\\n\\n#### Log Size\\n\\nThe Performance Advisor analyzes up to 200,000 of your cluster\\'s most recent log lines.\\n\\n#### Log Quantity\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\n#### Time-Series Collections\\n\\nThe Performance Advisor doesn\\'t provide performance suggestions for time-series collections.\\n\\n#### User Feedback\\n\\nThe Performance Advisor includes a user feedback button for Index Suggestions. Atlas hides this button for serverless instances.\\n\\n## Create Suggested Indexes\\n\\nYou can create indexes suggested by the Performance Advisor directly within the Performance Advisor itself. When you create indexes, keep the ratio of reads to writes on the target collection in mind. Indexes come with a performance cost, but are more than worth the cost for frequent queries on large data sets. To learn more about indexing strategies, see Indexing Strategies.\\n\\n### Behavior and Limitations\\n\\n- You can\\'t create indexes through the Performance Advisor if Data Explorer is disabled for your project. You can still view the Performance Advisor recommendations, but you must create those indexes from `mongosh`.\\n\\n- You can only create one index at a time through the Performance Advisor. If you want to create more simultaneously, you can do so using the Atlas UI, a driver, or the shell\\n\\n- Atlas always creates indexes for entire clusters. If you create an index while viewing the Performance Advisor for a single shard in a sharded cluster, Atlas creates that index for the entire sharded cluster.\\n\\n### Procedure\\n\\nTo create a suggested index:\\n\\n#### For the index you want to create, click Create Index.\\n\\nThe Performance Advisor opens the Create Index dialog and prepopulates the Fields based on the index you selected.\\n\\n#### *(Optional)* Specify the index options.\\n\\n```javascript\\n{ : , ... }\\n```\\n\\nThe following options document specifies the `unique` option and the `name` for the index:\\n\\n```javascript\\n{ unique: true, name: \"myUniqueIndex\" }\\n```\\n\\n#### *(Optional)* Set the Collation options.\\n\\nUse collation to specify language-specific rules for string comparison, such as rules for lettercase and accent marks. The collation document contains a `locale` field which indicates the ICU Locale code, and may contain other fields to define collation behavior.\\n\\nThe following collation option document specifies a locale value of `fr` for a French language collation:\\n\\n```json\\n{ \"locale\": \"fr\" }\\n```\\n\\nTo review the list of locales that MongoDB collation supports, see the list of languages and locales. To learn more about collation options, including which are enabled by default for each locale, see Collation in the MongoDB manual.\\n\\n#### *(Optional)* Enable building indexes in a rolling fashion.\\n\\nRolling index builds succeed only when they meet certain conditions. To ensure your index build succeeds, avoid the following design patterns that commonly trigger a restart loop:\\n\\n- Index key exceeds the index key limit\\n\\n- Index name already exists\\n\\n- Index on more than one array field\\n\\n- Index on collection that has the maximum number of text indexes\\n\\n- Text index on collection that has the maximum number of text indexes\\n\\nthe Atlas UI doesn\\'t support building indexes with a rolling build for `M0` free clusters and `M2/M5` shared clusters. You can\\'t build indexes with a rolling build for serverless instances.\\n\\nFor workloads which cannot tolerate performance decrease due to index builds, consider building indexes in a rolling fashion.\\n\\nTo maintain cluster availability:\\n\\n- Atlas removes one node from the cluster at a time starting with a secondary.\\n\\n- More than one node can go down at a time, but Atlas always keeps a majority of the nodes online.\\n\\nAtlas automatically cancels rolling index builds that don\\'t succeed on all nodes. When a rolling index build completes on some nodes, but fails on others, Atlas cancels the build and removes the index from any nodes that it was successfully built on.\\n\\nIn the event of a rolling index build cancellation, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Name of the cluster on which the rolling index build failed\\n\\n- Namespace on which the rolling index build failed\\n\\n- Project that contains the cluster and namespace\\n\\n- Organization that contains the project\\n\\n- Link to the activity feed event\\n\\nTo learn more about rebuilding indexes, see Build Indexes on Replica Sets.\\n\\nUnique\\nindex options are incompatible with building indexes in a rolling fashion. If you specify `unique` in the Options pane, Atlas rejects your configuration with an error message.\\n\\n#### Click Review.\\n\\n#### In the Confirm Operation dialog, confirm your index.\\n\\nWhen an index build completes, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Completion date of the index build\\n\\n- Name of the cluster on which the index build completed\\n\\n- Namespace on which the index build completed\\n\\n- Project containing the cluster and namespace\\n\\n- Organization containing the project\\n\\n- Link to the activity feed event\\n\\n', name='get_info_about_mongodb', id='e5bb7c63-71df-428b-b811-8784fec6e2cd', tool_call_id='call_8uC6x6EalTyPlaDn1xHG5bcr')]}\n", + "[HumanMessage(content='How do I improve slow queries in MongoDB?', additional_kwargs={}, response_metadata={}, id='d24196f2-dd7e-4342-9660-7f2a9933b807'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_8uC6x6EalTyPlaDn1xHG5bcr', 'function': {'arguments': '{\"user_query\":\"How do I improve slow queries in MongoDB?\"}', 'name': 'get_info_about_mongodb'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 27, 'prompt_tokens': 165, 'total_tokens': 192, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-11-20', 'system_fingerprint': 'fp_a523ccd45c', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-81181db3-2a33-479b-9ee6-f773c47c1275-0', tool_calls=[{'name': 'get_info_about_mongodb', 'args': {'user_query': 'How do I improve slow queries in MongoDB?'}, 'id': 'call_8uC6x6EalTyPlaDn1xHG5bcr', 'type': 'tool_call'}], usage_metadata={'input_tokens': 165, 'output_tokens': 27, 'total_tokens': 192, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}), ToolMessage(content='# Analyze Slow Queries\\n\\nAtlas provides several tools to help analyze slow queries executed on your clusters. See the following sections for descriptions of each tool. To optimize your query performance, review the best practices for query performance.\\n\\n## Performance Advisor\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance.\\n\\nYou can use the Performance Advisor to review the following information:\\n\\n- Index Ranking\\n\\n- Drop Index Recommendations\\n\\n## Namespace Insights\\n\\nMonitor collection-level query latency with Namespace Insights. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\n## Query Profiler\\n\\nThe Query Profiler displays slow-running operations and their key performance statistics. You can explore a sample of historical queries for up to the last 24 hours without additional cost or performance overhead. Before you enable the Query Profiler, see Considerations.\\n\\n## Real-Time Performance Panel (RTPP)\\n\\nThe Real-Time Performance Panel identifies relevant database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned during query execution. RTPP (Real-Time Performance Panel) is enabled by default.\\n\\nTo enable or disable Real-Time Performance Panel for a project, you must have the `Project Owner` role for the project.\\n\\n## Best Practices for Query Performance\\n\\nTo optimize query performance, review the following best practices:\\n\\n- Create queries that your current indexes support to reduce the time needed to search for your results.\\n\\n- Avoid creating documents with large array fields that require a lot of processing to search and index.\\n\\n- Optimize your indexes and remove unused or inefficent indexes. Too many indexes can negatively impact write performance.\\n\\n- Consider the suggested indexes from the Performance Advisor with the highest Impact scores and lowest Average Query Targeting scores.\\n\\n- Create the indexes that the Performance Advisor suggests when they align with your Indexing Strategies.\\n\\n- The Performance Advisor cannot suggest indexes for MongoDB databases configured to use the ctime timestamp format. As a workaround, set the timestamp format for such databases to either iso8601-utc or iso8601-local.\\n\\n- Perform rolling index builds to reduce the performance impact of building indexes on replica sets and sharded clusters.\\n\\n- Drop unused, redundant, and hidden indexes to improve write performance and free storage space.\\n\\n\\n\\n# Fix Query Issues\\n\\n`Query Targeting` alerts often indicate inefficient queries.\\n\\n## Alert Conditions\\n\\nYou can configure the following alert conditions in the project-level alert settings page to trigger alerts.\\n\\n`Query Targeting: Scanned Objects / Returned` alerts are triggered when the average number of documents scanned relative to the average number of documents returned server-wide across all operations during a sampling period exceeds a defined threshold. The default alert uses a 1000:1 threshold.\\n\\nIdeally, the ratio of scanned documents to returned documents should be close to 1. A high ratio negatively impacts query performance.\\n\\n`Query Targeting: Scanned / Returned` occurs if the number of index keys examined to fulfill a query relative to the actual number of returned documents meets or exceeds a user-defined threshold. This alert is not enabled by default.\\n\\nThe following mongod log entry shows statistics generated from an inefficient query:\\n\\n```json\\n COMMAND \\nplanSummary: COLLSCAN keysExamined:0\\ndocsExamined: 10000 cursorExhausted:1 numYields:234\\nnreturned:4 protocol:op_query 358ms\\n```\\n\\nThis query scanned 10,000 documents and returned only 4 for a ratio of 2500, which is highly inefficient. No index keys were examined, so MongoDB scanned all documents in the collection, known as a collection scan.\\n\\n## Common Triggers\\n\\nThe query targeting alert typically occurs when there is no index to support a query or queries or when an existing index only partially supports a query or queries.\\n\\nThe change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\n## Fix the Immediate Problem\\n\\nAdd one or more indexes to better serve the inefficient queries.\\n\\nThe Performance Advisor provides the easiest and quickest way to create an index. The Performance Advisor monitors queries that MongoDB considers slow and recommends indexes to improve performance. Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster.\\n\\nClick Create Index on a slow query for instructions on how to create the recommended index.\\n\\nIt is possible to receive a Query Targeting alert for an inefficient query without receiving index suggestions from the Performance Advisor if the query exceeds the slow query threshold and the ratio of scanned to returned documents is greater than the threshold specified in the alert.\\n\\nIn addition, you can use the following resources to determine which query generated the alert:\\n\\n- The Real-Time Performance Panel monitors and displays current network traffic and database operations on machines hosting MongoDB in your Atlas clusters.\\n\\n- The MongoDB logs maintain an account of activity, including queries, for each `mongod` instance in your Atlas clusters.\\n\\n- The cursor.explain() command for `mongosh` provides performance details for all queries.\\n\\n- Namespace Insights monitors collection-level query latency.\\n\\n- The Atlas Query Profiler records operations that Atlas considers slow when compared to average execution time for all operations on your cluster.\\n\\n## Implement a Long-Term Solution\\n\\nRefer to the following for more information on query performance:\\n\\n- MongoDB Indexing Strategies\\n\\n- Query Optimization\\n\\n- Analyze Query Plan\\n\\n## Monitor Your Progress\\n\\nAtlas provides the following methods to visualize query targeting:\\n\\n- Query Targeting metrics, which highlight high ratios of objects scanned to objects returned.\\n\\n- Namespace Insights, which monitors collection-level query latency.\\n\\n- The Query Profiler, which describes specific inefficient queries executed on the cluster.\\n\\n### Query Targeting Metrics\\n\\nYou can view historical metrics to help you visualize the query performance of your cluster. To view Query Targeting metrics in the Atlas UI:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. On the Metrics page, click the Add Chart dropdown menu and select Query Targeting.\\n\\nThe Query Targeting chart displays the following metrics for queries executed on the server:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nScanned Objects / Returned\\n\\n\\nIndicates the average number of documents examined relative to the average number of returned documents.\\n\\n
\\nScanned / Returned\\n\\n\\nIndicates the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\n
The change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\nIf either of these metrics exceed the user-defined threshold, Atlas generates the corresponding `Query Targeting: Scanned Objects / Returned` or `Query Targeting: Scanned / Returned` alert.\\n\\nYou can also view Query Targeting ratios of operations in real-time using the Real-Time Performance Panel.\\n\\n### Namespace Insights\\n\\nNamespace Insights monitors collection-level query latency. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\nTo access Namespace Insights:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Namespace Insights tab.\\n\\n### Query Profiler\\n\\nThe Query Profiler contains several metrics you can use to pinpoint specific inefficient queries. You can visualize up to the past 24 hours of query operations. The Query Profiler can show the Examined : Returned Ratio (index keys examined to documents returned) of logged queries, which might help you identify the queries that triggered a `Query Targeting: Scanned / Returned` alert. The chart shows the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\nThe default\\n`Query Targeting: Scanned Objects / Returned` alert ratio differs slightly. The ratio of the average number of documents scanned to the average number of documents returned during a sampling period triggers this alert.\\n\\nAtlas might not log the individual operations that contribute to the Query Targeting ratios due to automatically set thresholds. However, you can still use the Query Profiler and Query Targeting metrics to analyze and optimize query performance.\\n\\nTo access the Query Profiler:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Query Profiler tab.\\n\\n\\n\\n# Monitor and Improve Slow Queries\\n\\n*Only available on M10+ clusters and serverless instances*\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance. The threshold for slow queries varies based on the average time of operations on your cluster to provide recommendations pertinent to your workload.\\n\\nRecommended indexes are accompanied by sample queries, grouped by query shape, that were run against a collection that would benefit from the suggested index. The Performance Advisor doesn\\'t negatively affect the performance of your Atlas clusters.\\n\\nYou can also monitor collection-level query latency with Namespace Insights and query performance with the Query Profiler.\\n\\nIf the slow query log contains consecutive `$match` stages in the aggregation pipeline, the two stages can coalesce into the first `$match` stage and result in a single `$match` stage. As a result, the query shape in the Performance Advisor might differ from the actual query you ran.\\n\\n## Common Reasons for Slow Queries\\n\\nIf a query is slow, common reasons include:\\n\\n- The query is unsupported by your current indexes.\\n\\n- Some documents in your collection have large array fields that are costly to search and index.\\n\\n- One query retrieves information from multiple collections with $lookup.\\n\\n## Required Access\\n\\nTo view collections with slow queries and see suggested indexes, you must have `Project Read Only` access or higher to the project.\\n\\nTo view field values in a sample query in the Performance Advisor, you must have `Project Data Access Read/Write` access or higher to the project.\\n\\nTo enable or disable the Atlas-managed slow operation threshold, you must have `Project Owner` access to the project. Users with `Organization Owner` access must add themselves to the project as a `Project Owner`.\\n\\n## Configure the Slow Query Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. However, you can opt out of this feature and instead use a fixed slow query threshold of 100 milliseconds. You can disable the Atlas-managed slow operation threshold with the Atlas CLI, Atlas Administration API, or Atlas UI.\\n\\nAtlas clusters with Atlas Search enabled don\\'t support the Atlas-managed slow query operation threshold.\\n\\nFor `M0`, `M2`, `M5` clusters and serverless instances, Atlas disables the Atlas-managed slow query operation threshold by default and you can\\'t enable it.\\n\\n### Disable the Atlas-Managed Slow Operation Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. If you disable the Atlas-managed slow query threshold, it no longer dynamically adjusts. MongoDB defaults the fixed slow query threshold to 100 milliseconds. We don\\'t recommend that you set the fixed slow query threshold lower than 100 milliseconds.\\n\\nTo disable the Atlas-managed slow operation threshold and use a fixed threshold of 100 milliseconds:\\n\\n\\n\\n\\n\\nTo disable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold disable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold disable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Disable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to Off.\\n\\n\\n\\n\\n\\n### Enable the Atlas-Managed Slow Operation Threshold\\n\\nAtlas enables the Atlas-managed slow operation threshold by default. To re-enable the Atlas-managed slow operation threshold that you previously disabled:\\n\\n\\n\\n\\n\\nTo enable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold enable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold enable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Enable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to On.\\n\\n\\n\\n\\n\\n## Index Considerations\\n\\nIndexes improve read performance, but a large number of indexes can negatively impact write performance since indexes must be updated during writes. If your collection already has several indexes, consider this tradeoff of read and write performance when deciding whether to create new indexes. Examine whether a query for such a collection can be modified to take advantage of existing indexes, as well as whether a query occurs often enough to justify the cost of a new index.\\n\\n## Access Performance Advisor\\n\\n\\n\\n\\n\\n### View Collections with Slow Queries\\n\\nTo return up to 20 namespaces in `.` format for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor namespaces list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor namespaces list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Slow Query Logs\\n\\nTo return query log line items for slow queries that the Performance Advisor and Query Profiler identify using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowQueryLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowQueryLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Suggested Indexes\\n\\nTo return suggested indexes for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor suggestedIndexes list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor suggestedIndexes list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo access the Performance Advisor using the Atlas UI:\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the replica set where the collection resides.\\n\\nIf the replica set resides in a sharded cluster, first click the sharded cluster containing the replica set.\\n\\n### Click Performance Advisor.\\n\\n### Select a collection from the Collections dropdown.\\n\\n### Select a time period from the Time Range dropdown.\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the serverless instance.\\n\\n### Click Performance Advisor.\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nThe Performance Advisor displays up to 20 query shapes across all collections in the cluster and suggested indexes for those shapes. The Performance Advisor ranks the indexes according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about index ranking, see Review Index Ranking.\\n\\n## Index Suggestions\\n\\nThe Performance Advisor ranks the indexes that it suggests according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about how the Performance Advisor ranks indexes, see Review Index Ranking.\\n\\nTo learn how to create indexes that the Performance Advisor suggests, see Create Suggested Indexes.\\n\\n### Index Metrics\\n\\nEach index that the Performance Advisor suggests contains the following metrics. These metrics apply specifically to queries which would be improved by the index:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which would be improved.\\n\\n
\\nAverage Execution Time\\n\\n\\nCurrent average execution time in milliseconds for affected queries.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read per document returned by affected queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nIn Memory Sort\\n\\n\\nCurrent number of affected queries per hour that needed to be sorted in memory.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
\\nAverage Object Size\\n\\n\\nAverage object size.\\n\\n
\\n\\n### Sample Queries\\n\\nFor each suggested index, the Performance Advisor shows the most commonly executed query shapes that the index would improve. For each query shape, the Performance Advisor displays the following metrics:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which match the query shape.\\n\\n
\\nAverage Execution Time\\n\\n\\nAverage execution time in milliseconds for queries which match the query shape.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read for every document returned by matching queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
The Performance Advisor also shows each executed sample query that matches the query shape, with specific metrics for that query.\\n\\n### Query Targeting\\n\\nEach index suggestion includes an Average Query Targeting score indicating how many documents were read for every document returned for the index\\'s corresponding query shapes. A score of 1 represents very efficient query shapes because every document read matched the query and was returned with the query results. All suggested indexes represent an opportunity to improve query performance.\\n\\n### Filter Index Suggestions\\n\\nBy default, the Performance Advisor suggests indexes for all clusters in the deployment. To only show suggested indexes from a specific collection, use the Collection dropdown at the top of the Performance Advisor.\\n\\nYou can also adjust the time range the Performance Advisor takes into account when suggesting indexes by using the Time Range dropdown at the top of the Performance Advisor.\\n\\n### Limitations of Index Suggestions\\n\\n#### Timestamp Format\\n\\nThe Performance Advisor can\\'t suggest indexes for MongoDB databases configured to use the `ctime` timestamp format. As a workaround, set the timestamp format for such databases to either `iso8601-utc` or `iso8601-local`. To learn more about timestamp formats, see mongod --timeStampFormat.\\n\\n#### Log Size\\n\\nThe Performance Advisor analyzes up to 200,000 of your cluster\\'s most recent log lines.\\n\\n#### Log Quantity\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\n#### Time-Series Collections\\n\\nThe Performance Advisor doesn\\'t provide performance suggestions for time-series collections.\\n\\n#### User Feedback\\n\\nThe Performance Advisor includes a user feedback button for Index Suggestions. Atlas hides this button for serverless instances.\\n\\n## Create Suggested Indexes\\n\\nYou can create indexes suggested by the Performance Advisor directly within the Performance Advisor itself. When you create indexes, keep the ratio of reads to writes on the target collection in mind. Indexes come with a performance cost, but are more than worth the cost for frequent queries on large data sets. To learn more about indexing strategies, see Indexing Strategies.\\n\\n### Behavior and Limitations\\n\\n- You can\\'t create indexes through the Performance Advisor if Data Explorer is disabled for your project. You can still view the Performance Advisor recommendations, but you must create those indexes from `mongosh`.\\n\\n- You can only create one index at a time through the Performance Advisor. If you want to create more simultaneously, you can do so using the Atlas UI, a driver, or the shell\\n\\n- Atlas always creates indexes for entire clusters. If you create an index while viewing the Performance Advisor for a single shard in a sharded cluster, Atlas creates that index for the entire sharded cluster.\\n\\n### Procedure\\n\\nTo create a suggested index:\\n\\n#### For the index you want to create, click Create Index.\\n\\nThe Performance Advisor opens the Create Index dialog and prepopulates the Fields based on the index you selected.\\n\\n#### *(Optional)* Specify the index options.\\n\\n```javascript\\n{ : , ... }\\n```\\n\\nThe following options document specifies the `unique` option and the `name` for the index:\\n\\n```javascript\\n{ unique: true, name: \"myUniqueIndex\" }\\n```\\n\\n#### *(Optional)* Set the Collation options.\\n\\nUse collation to specify language-specific rules for string comparison, such as rules for lettercase and accent marks. The collation document contains a `locale` field which indicates the ICU Locale code, and may contain other fields to define collation behavior.\\n\\nThe following collation option document specifies a locale value of `fr` for a French language collation:\\n\\n```json\\n{ \"locale\": \"fr\" }\\n```\\n\\nTo review the list of locales that MongoDB collation supports, see the list of languages and locales. To learn more about collation options, including which are enabled by default for each locale, see Collation in the MongoDB manual.\\n\\n#### *(Optional)* Enable building indexes in a rolling fashion.\\n\\nRolling index builds succeed only when they meet certain conditions. To ensure your index build succeeds, avoid the following design patterns that commonly trigger a restart loop:\\n\\n- Index key exceeds the index key limit\\n\\n- Index name already exists\\n\\n- Index on more than one array field\\n\\n- Index on collection that has the maximum number of text indexes\\n\\n- Text index on collection that has the maximum number of text indexes\\n\\nthe Atlas UI doesn\\'t support building indexes with a rolling build for `M0` free clusters and `M2/M5` shared clusters. You can\\'t build indexes with a rolling build for serverless instances.\\n\\nFor workloads which cannot tolerate performance decrease due to index builds, consider building indexes in a rolling fashion.\\n\\nTo maintain cluster availability:\\n\\n- Atlas removes one node from the cluster at a time starting with a secondary.\\n\\n- More than one node can go down at a time, but Atlas always keeps a majority of the nodes online.\\n\\nAtlas automatically cancels rolling index builds that don\\'t succeed on all nodes. When a rolling index build completes on some nodes, but fails on others, Atlas cancels the build and removes the index from any nodes that it was successfully built on.\\n\\nIn the event of a rolling index build cancellation, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Name of the cluster on which the rolling index build failed\\n\\n- Namespace on which the rolling index build failed\\n\\n- Project that contains the cluster and namespace\\n\\n- Organization that contains the project\\n\\n- Link to the activity feed event\\n\\nTo learn more about rebuilding indexes, see Build Indexes on Replica Sets.\\n\\nUnique\\nindex options are incompatible with building indexes in a rolling fashion. If you specify `unique` in the Options pane, Atlas rejects your configuration with an error message.\\n\\n#### Click Review.\\n\\n#### In the Confirm Operation dialog, confirm your index.\\n\\nWhen an index build completes, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Completion date of the index build\\n\\n- Name of the cluster on which the index build completed\\n\\n- Namespace on which the index build completed\\n\\n- Project containing the cluster and namespace\\n\\n- Organization containing the project\\n\\n- Link to the activity feed event\\n\\n', name='get_info_about_mongodb', id='e5bb7c63-71df-428b-b811-8784fec6e2cd', tool_call_id='call_8uC6x6EalTyPlaDn1xHG5bcr')]\n", + "Node agent:\n", + "{'messages': [AIMessage(content=\"To improve slow queries in MongoDB, you can follow these steps and best practices:\\n\\n### Tools and Features to Analyze and Optimize Queries:\\n1. **Performance Advisor**:\\n - Monitors slow queries and suggests indexes to improve performance.\\n - Provides recommendations based on query shapes and their impact.\\n\\n2. **Query Profiler**:\\n - Displays slow-running operations and their performance statistics.\\n - Allows you to explore historical queries for up to 24 hours.\\n\\n3. **Real-Time Performance Panel (RTPP)**:\\n - Identifies database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned.\\n\\n4. **Namespace Insights**:\\n - Monitors collection-level query latency and provides metrics for specific hosts and operation types.\\n\\n5. **Query Targeting Metrics**:\\n - Highlights inefficiencies in queries by showing the ratio of scanned objects to returned objects.\\n\\n### Best Practices for Query Performance:\\n1. **Indexing**:\\n - Create indexes that support your queries to reduce search time.\\n - Use the Performance Advisor to identify and create suggested indexes.\\n - Remove unused or inefficient indexes to improve write performance.\\n\\n2. **Query Design**:\\n - Avoid queries that require scanning large arrays or documents.\\n - Optimize queries to take advantage of existing indexes.\\n\\n3. **Rolling Index Builds**:\\n - For replica sets and sharded clusters, perform rolling index builds to minimize performance impact.\\n\\n4. **Monitor Query Targeting**:\\n - Ensure the ratio of scanned documents to returned documents is close to 1 for efficiency.\\n - Address alerts for high ratios by adding appropriate indexes.\\n\\n5. **Analyze Query Plans**:\\n - Use the `explain()` method to understand query execution and identify bottlenecks.\\n\\n6. **Avoid Over-Indexing**:\\n - Too many indexes can negatively impact write performance. Balance the trade-off between read and write performance.\\n\\n### Common Reasons for Slow Queries:\\n- Queries are unsupported by current indexes.\\n- Documents have large array fields that are costly to search.\\n- Queries involve multiple collections with `$lookup`.\\n\\n### Steps to Fix Slow Queries:\\n1. **Immediate Fix**:\\n - Add indexes to support inefficient queries.\\n - Use the Performance Advisor to create recommended indexes.\\n\\n2. **Long-Term Solution**:\\n - Optimize query design and indexing strategies.\\n - Regularly monitor query performance using tools like the Query Profiler and Namespace Insights.\\n\\n3. **Monitor Progress**:\\n - Use Query Targeting metrics and Namespace Insights to track improvements.\\n\\nBy following these steps and leveraging MongoDB's tools, you can significantly improve the performance of slow queries.\", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 536, 'prompt_tokens': 5355, 'total_tokens': 5891, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-11-20', 'system_fingerprint': 'fp_a523ccd45c', 'finish_reason': 'stop', 'logprobs': None}, id='run-73908bfe-67dc-4ce7-971e-1ca3265720cb-0', usage_metadata={'input_tokens': 5355, 'output_tokens': 536, 'total_tokens': 5891, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}\n", + "---FINAL ANSWER---\n", + "To improve slow queries in MongoDB, you can follow these steps and best practices:\n", + "\n", + "### Tools and Features to Analyze and Optimize Queries:\n", + "1. **Performance Advisor**:\n", + " - Monitors slow queries and suggests indexes to improve performance.\n", + " - Provides recommendations based on query shapes and their impact.\n", + "\n", + "2. **Query Profiler**:\n", + " - Displays slow-running operations and their performance statistics.\n", + " - Allows you to explore historical queries for up to 24 hours.\n", + "\n", + "3. **Real-Time Performance Panel (RTPP)**:\n", + " - Identifies database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned.\n", + "\n", + "4. **Namespace Insights**:\n", + " - Monitors collection-level query latency and provides metrics for specific hosts and operation types.\n", + "\n", + "5. **Query Targeting Metrics**:\n", + " - Highlights inefficiencies in queries by showing the ratio of scanned objects to returned objects.\n", + "\n", + "### Best Practices for Query Performance:\n", + "1. **Indexing**:\n", + " - Create indexes that support your queries to reduce search time.\n", + " - Use the Performance Advisor to identify and create suggested indexes.\n", + " - Remove unused or inefficient indexes to improve write performance.\n", + "\n", + "2. **Query Design**:\n", + " - Avoid queries that require scanning large arrays or documents.\n", + " - Optimize queries to take advantage of existing indexes.\n", + "\n", + "3. **Rolling Index Builds**:\n", + " - For replica sets and sharded clusters, perform rolling index builds to minimize performance impact.\n", + "\n", + "4. **Monitor Query Targeting**:\n", + " - Ensure the ratio of scanned documents to returned documents is close to 1 for efficiency.\n", + " - Address alerts for high ratios by adding appropriate indexes.\n", + "\n", + "5. **Analyze Query Plans**:\n", + " - Use the `explain()` method to understand query execution and identify bottlenecks.\n", + "\n", + "6. **Avoid Over-Indexing**:\n", + " - Too many indexes can negatively impact write performance. Balance the trade-off between read and write performance.\n", + "\n", + "### Common Reasons for Slow Queries:\n", + "- Queries are unsupported by current indexes.\n", + "- Documents have large array fields that are costly to search.\n", + "- Queries involve multiple collections with `$lookup`.\n", + "\n", + "### Steps to Fix Slow Queries:\n", + "1. **Immediate Fix**:\n", + " - Add indexes to support inefficient queries.\n", + " - Use the Performance Advisor to create recommended indexes.\n", + "\n", + "2. **Long-Term Solution**:\n", + " - Optimize query design and indexing strategies.\n", + " - Regularly monitor query performance using tools like the Query Profiler and Namespace Insights.\n", + "\n", + "3. **Monitor Progress**:\n", + " - Use Query Targeting metrics and Namespace Insights to track improvements.\n", + "\n", + "By following these steps and leveraging MongoDB's tools, you can significantly improve the performance of slow queries.\n" + ] + } + ], + "source": [ + "inputs = {\n", + " \"messages\": [\n", + " (\"user\", \"How do I improve slow queries in MongoDB?\"),\n", + " ]\n", + "}\n", + "\n", + "for output in app.stream(inputs):\n", + " for key, value in output.items():\n", + " print(f\"Node {key}:\")\n", + " print(value)\n", + "print(\"---FINAL ANSWER---\")\n", + "print(value[\"messages\"][-1].content)" + ] } ], "metadata": { From 365eec3b8ca2458f70bd185d843d6d5093fbd042 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Mon, 2 Dec 2024 14:54:30 -0800 Subject: [PATCH 07/23] Adding comments etc. --- .../langchain_parent_document_retrieval.ipynb | 174 +++++++++++------- 1 file changed, 110 insertions(+), 64 deletions(-) diff --git a/notebooks/rag/langchain_parent_document_retrieval.ipynb b/notebooks/rag/langchain_parent_document_retrieval.ipynb index 280a8e4..0c05811 100644 --- a/notebooks/rag/langchain_parent_document_retrieval.ipynb +++ b/notebooks/rag/langchain_parent_document_retrieval.ipynb @@ -132,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -314,7 +314,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -409,11 +409,20 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "def get_splitter(chunk_size):\n", + "def get_splitter(chunk_size: int) -> RecursiveCharacterTextSplitter:\n", + " \"\"\"\n", + " Returns a token-based text splitter with overlap\n", + "\n", + " Args:\n", + " chunk_size (_type_): Chunk size in number of tokens\n", + "\n", + " Returns:\n", + " RecursiveCharacterTextSplitter: Recursive text splitter object\n", + " \"\"\"\n", " return RecursiveCharacterTextSplitter.from_tiktoken_encoder(\n", " encoding_name=\"cl100k_base\",\n", " chunk_size=chunk_size,\n", @@ -423,11 +432,22 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "def get_retriever(child_chunk_size, **kwargs):\n", + "def get_retriever(\n", + " child_chunk_size: int, **kwargs\n", + ") -> MongoDBAtlasParentDocumentRetriever:\n", + " \"\"\"\n", + " Create a MongoDB parent document/chunk retriever\n", + "\n", + " Args:\n", + " child_chunk_size (int): Chunk size for child chunks\n", + "\n", + " Returns:\n", + " MongoDBAtlasParentDocumentRetriever: MongoDB parent document retriever object\n", + " \"\"\"\n", " return MongoDBAtlasParentDocumentRetriever.from_connection_string(\n", " connection_string=MONGODB_URI,\n", " embedding_model=embedding_model,\n", @@ -505,11 +525,12 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "import asyncio" + "import asyncio\n", + "from typing import Generator, List, Tuple" ] }, { @@ -524,49 +545,74 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "async def process_chunk(chunk, semaphore, retriever):\n", + "async def process_chunk(chunk: Generator, semaphore: asyncio.Semaphore) -> None:\n", + " \"\"\"\n", + " Ingest batches of documents into MongoDB\n", + "\n", + " Args:\n", + " chunk (Generator): Chunk of documents to ingest\n", + " semaphore (as): Asyncio semaphore\n", + " \"\"\"\n", " async with semaphore:\n", - " await retriever.aadd_documents(chunk)\n", + " await parent_doc_retriever.aadd_documents(chunk)\n", " print(f\"Processed {len(chunk)} documents\")" ] }, { "cell_type": "code", - "execution_count": 74, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "def get_chunks(docs, chunk_size):\n", + "def get_chunks(docs: List[Document], chunk_size: int) -> Generator:\n", + " \"\"\"\n", + " Return chunks of documents to ingest into MongoDB\n", + "\n", + " Args:\n", + " docs (List[Document]): List of LangChain documents\n", + " chunk_size (int): Chunk/batch size\n", + "\n", + " Yields:\n", + " Generator: Batch of documents\n", + " \"\"\"\n", " for i in range(0, len(docs), chunk_size):\n", " yield docs[i : i + chunk_size]" ] }, { "cell_type": "code", - "execution_count": 75, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "async def process_docs(docs, retriever):\n", + "async def process_docs(docs: List[Document]) -> List[None]:\n", + " \"\"\"\n", + " Asynchronously ingest langChain documents into MongoDB\n", + "\n", + " Args:\n", + " docs (List[Document]): List of LangChain documents\n", + "\n", + " Returns:\n", + " List[None]: Results of the task executions\n", + " \"\"\"\n", " semaphore = asyncio.Semaphore(MAX_CONCURRENCY)\n", " chunks = get_chunks(docs, CHUNK_SIZE)\n", "\n", " tasks = []\n", " for chunk in chunks:\n", - " tasks.append(process_chunk(chunk, semaphore, retriever))\n", - "\n", - " # Gather all tasks and get results\n", + " tasks.append(process_chunk(chunk, semaphore))\n", + " # Gather results from all tasks\n", " results = await asyncio.gather(*tasks)\n", " return results" ] }, { "cell_type": "code", - "execution_count": 76, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -583,8 +629,10 @@ ], "source": [ "collection = mongodb_client[DB_NAME][COLLECTION_NAME]\n", + "# Delete any existing documents from the collection\n", "collection.delete_many({})\n", "print(f\"Deletion complete.\")\n", + "# Ingest LangChain documents into MongoDB\n", "results = await process_docs(docs, parent_doc_retriever)" ] }, @@ -616,10 +664,11 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# Vector search index definition\n", "model = SearchIndexModel(\n", " definition={\n", " \"fields\": [\n", @@ -638,7 +687,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -650,6 +699,7 @@ } ], "source": [ + "# Check if the index already exists, if not create it\n", "try:\n", " collection.create_search_index(model=model)\n", " print(\n", @@ -689,10 +739,11 @@ }, { "cell_type": "code", - "execution_count": 82, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# Retrieve and parse documents\n", "retrieve = {\n", " \"context\": parent_doc_retriever\n", " | (lambda docs: \"\\n\\n\".join([d.page_content for d in docs])),\n", @@ -703,20 +754,19 @@ "\n", "Question: {question}\n", "\"\"\"\n", - "# Defining the chat prompt\n", + "# Define the chat prompt\n", "prompt = ChatPromptTemplate.from_template(template)\n", - "# Defining the model to be used for chat completion\n", + "# Define the model to be used for chat completion\n", "llm = ChatOpenAI(temperature=0, model=\"gpt-4o-2024-11-20\")\n", "# Parse output as a string\n", "parse_output = StrOutputParser()\n", - "\n", "# Naive RAG chain\n", "rag_chain = retrieve | prompt | llm | parse_output" ] }, { "cell_type": "code", - "execution_count": 90, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -761,6 +811,7 @@ } ], "source": [ + "# Test the RAG chain\n", "print(rag_chain.invoke(\"How do I improve slow queries in MongoDB?\"))" ] }, @@ -773,26 +824,26 @@ }, { "cell_type": "code", - "execution_count": 146, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from langchain.agents import tool\n", "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n", - "from typing import Annotated\n", + "from typing import Annotated, Dict\n", "from langgraph.graph.message import add_messages\n", "from typing_extensions import TypedDict\n", "from langgraph.prebuilt import ToolNode, tools_condition\n", - "from langgraph.graph import StateGraph, START, END\n", - "from IPython.display import Image, display" + "from langgraph.graph import StateGraph, START, END" ] }, { "cell_type": "code", - "execution_count": 147, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# Converting the retriever into an agent tool\n", "@tool\n", "def get_info_about_mongodb(user_query: str) -> str:\n", " \"\"\"\n", @@ -811,7 +862,7 @@ }, { "cell_type": "code", - "execution_count": 148, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -820,21 +871,24 @@ }, { "cell_type": "code", - "execution_count": 149, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# Define graph state\n", "class GraphState(TypedDict):\n", " messages: Annotated[list, add_messages]" ] }, { "cell_type": "code", - "execution_count": 150, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# Define the LLM to use as the brain of the agent\n", "llm = ChatOpenAI(temperature=0, model=\"gpt-4o-2024-11-20\")\n", + "# Agent prompt\n", "prompt = ChatPromptTemplate.from_messages(\n", " [\n", " (\n", @@ -848,17 +902,28 @@ " MessagesPlaceholder(variable_name=\"messages\"),\n", " ]\n", ")\n", + "# Partial the prompt with tool names\n", "prompt = prompt.partial(tool_names=\", \".join([tool.name for tool in tools]))\n", + "# Bind tools to LLM\n", "llm_with_tools = prompt | llm.bind_tools(tools)" ] }, { "cell_type": "code", - "execution_count": 151, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "def agent(state):\n", + "def agent(state: GraphState) -> Dict[str, List]:\n", + " \"\"\"\n", + " Agent node\n", + "\n", + " Args:\n", + " state (GraphState): Graph state\n", + "\n", + " Returns:\n", + " Dict[str, List]: Updates to the graph state\n", + " \"\"\"\n", " messages = state[\"messages\"]\n", " print(messages)\n", " response = llm_with_tools.invoke(messages)\n", @@ -868,22 +933,26 @@ }, { "cell_type": "code", - "execution_count": 152, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# Convert tools into a graph node\n", "tool_node = ToolNode(tools)" ] }, { "cell_type": "code", - "execution_count": 153, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ + "# Parameterize the graph with the state\n", "graph = StateGraph(GraphState)\n", + "# Add graph nodes\n", "graph.add_node(\"agent\", agent)\n", "graph.add_node(\"tools\", tool_node)\n", + "# Add graph edges\n", "graph.add_edge(START, \"agent\")\n", "graph.add_edge(\"tools\", \"agent\")\n", "graph.add_conditional_edges(\n", @@ -891,37 +960,13 @@ " tools_condition,\n", " {\"tools\": \"tools\", END: END},\n", ")\n", + "# Compile the graph\n", "app = graph.compile()" ] }, { "cell_type": "code", - "execution_count": 154, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Visualize the graph\n", - "try:\n", - " display(Image(app.get_graph().draw_mermaid_png()))\n", - "except Exception:\n", - " # This requires some extra dependencies and is optional\n", - " pass" - ] - }, - { - "cell_type": "code", - "execution_count": 155, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -1002,6 +1047,7 @@ } ], "source": [ + "# Execute the agent and view outputs\n", "inputs = {\n", " \"messages\": [\n", " (\"user\", \"How do I improve slow queries in MongoDB?\"),\n", From c6c4d8b230e21981c9f2b1347d5e6004c4ebf444 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Mon, 2 Dec 2024 14:56:17 -0800 Subject: [PATCH 08/23] Nit --- notebooks/rag/langchain_parent_document_retrieval.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/rag/langchain_parent_document_retrieval.ipynb b/notebooks/rag/langchain_parent_document_retrieval.ipynb index 0c05811..21e7873 100644 --- a/notebooks/rag/langchain_parent_document_retrieval.ipynb +++ b/notebooks/rag/langchain_parent_document_retrieval.ipynb @@ -819,7 +819,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### In an agent" + "### In an AI agent" ] }, { From 1e16c76b7b71d511acd6768a3e0ac6a610b608b5 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Mon, 2 Dec 2024 15:25:31 -0800 Subject: [PATCH 09/23] Moving notebook under techniques --- .../langchain_parent_document_retrieval.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename notebooks/{rag => techniques}/langchain_parent_document_retrieval.ipynb (99%) diff --git a/notebooks/rag/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb similarity index 99% rename from notebooks/rag/langchain_parent_document_retrieval.ipynb rename to notebooks/techniques/langchain_parent_document_retrieval.ipynb index 21e7873..6fdf1b2 100644 --- a/notebooks/rag/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mongodb-developer/GenAI-Showcase/blob/main/notebooks/rag/langchain_parent_document_retrieval.ipynb)\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mongodb-developer/GenAI-Showcase/blob/main/notebooks/techniques/langchain_parent_document_retrieval.ipynb)\n", "\n", "[![View Article](https://img.shields.io/badge/View%20Article-blue)](https://www.mongodb.com/developer/products/atlas/advanced-rag-parent-doc-retrieval/?utm_campaign=devrel&utm_source=cross-post&utm_medium=organic_social&utm_content=https%3A%2F%2Fgithub.com%2Fmongodb-developer%2FGenAI-Showcase&utm_term=apoorva.joshi)" ] From c255e13e1269b3407ef5676c5f683f7a8e0ca0f7 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Tue, 3 Dec 2024 14:49:04 -0800 Subject: [PATCH 10/23] More updates --- .../langchain_parent_document_retrieval.ipynb | 34 +++++-------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index 6fdf1b2..692d74a 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -30,16 +30,22 @@ "\n", "- **langchain**: Python package for LangChain's core modules\n", "\n", + "- **langchain-openai**: Python package to use OpenAI models via LangChain\n", + "\n", + "- **langgraph**: Python package to orchestrate LLM workflows as graphs\n", + "\n", + "- **langchain-mongodb**: Python package to use MongoDB features in LangChain\n", + "\n", "- **langchain-openai**: Python package to use OpenAI models via LangChain" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "! pip install -qU datasets pymongo langchain langgraph langchain-openai 'git+https://github.com/langchain-ai/langchain-mongodb.git@main#subdirectory=libs/mongodb' " + "! pip install -qU datasets pymongo langchain langgraph langchain-mongodb langchain-openai" ] }, { @@ -494,28 +500,6 @@ ")" ] }, - { - "cell_type": "code", - "execution_count": 89, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Document(metadata={'_id': '79cd1dd0-0503-4a01-916d-016871304f54', 'contentType': None, 'pageDescription': None, 'productName': 'MongoDB Atlas', 'tags': ['atlas', 'docs'], 'version': None, 'updated': {'$date': '2024-05-20T17:30:49.148Z'}, 'url': 'https://mongodb.com/docs/atlas/analyze-slow-queries/', 'title': 'Analyze Slow Queries'}, page_content='# Analyze Slow Queries\\n\\nAtlas provides several tools to help analyze slow queries executed on your clusters. See the following sections for descriptions of each tool. To optimize your query performance, review the best practices for query performance.\\n\\n## Performance Advisor\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance.\\n\\nYou can use the Performance Advisor to review the following information:\\n\\n- Index Ranking\\n\\n- Drop Index Recommendations\\n\\n## Namespace Insights\\n\\nMonitor collection-level query latency with Namespace Insights. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\n## Query Profiler\\n\\nThe Query Profiler displays slow-running operations and their key performance statistics. You can explore a sample of historical queries for up to the last 24 hours without additional cost or performance overhead. Before you enable the Query Profiler, see Considerations.\\n\\n## Real-Time Performance Panel (RTPP)\\n\\nThe Real-Time Performance Panel identifies relevant database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned during query execution. RTPP (Real-Time Performance Panel) is enabled by default.\\n\\nTo enable or disable Real-Time Performance Panel for a project, you must have the `Project Owner` role for the project.\\n\\n## Best Practices for Query Performance\\n\\nTo optimize query performance, review the following best practices:\\n\\n- Create queries that your current indexes support to reduce the time needed to search for your results.\\n\\n- Avoid creating documents with large array fields that require a lot of processing to search and index.\\n\\n- Optimize your indexes and remove unused or inefficent indexes. Too many indexes can negatively impact write performance.\\n\\n- Consider the suggested indexes from the Performance Advisor with the highest Impact scores and lowest Average Query Targeting scores.\\n\\n- Create the indexes that the Performance Advisor suggests when they align with your Indexing Strategies.\\n\\n- The Performance Advisor cannot suggest indexes for MongoDB databases configured to use the ctime timestamp format. As a workaround, set the timestamp format for such databases to either iso8601-utc or iso8601-local.\\n\\n- Perform rolling index builds to reduce the performance impact of building indexes on replica sets and sharded clusters.\\n\\n- Drop unused, redundant, and hidden indexes to improve write performance and free storage space.\\n\\n'),\n", - " Document(metadata={'_id': '5c88653c-ec5d-40bc-a15b-7ef84a62bc38', 'contentType': None, 'pageDescription': None, 'productName': 'MongoDB Atlas', 'tags': ['atlas', 'docs'], 'version': None, 'updated': {'$date': '2024-05-20T17:30:49.151Z'}, 'url': 'https://mongodb.com/docs/atlas/performance-advisor/', 'title': 'Monitor and Improve Slow Queries'}, page_content='# Monitor and Improve Slow Queries\\n\\n*Only available on M10+ clusters and serverless instances*\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance. The threshold for slow queries varies based on the average time of operations on your cluster to provide recommendations pertinent to your workload.\\n\\nRecommended indexes are accompanied by sample queries, grouped by query shape, that were run against a collection that would benefit from the suggested index. The Performance Advisor doesn\\'t negatively affect the performance of your Atlas clusters.\\n\\nYou can also monitor collection-level query latency with Namespace Insights and query performance with the Query Profiler.\\n\\nIf the slow query log contains consecutive `$match` stages in the aggregation pipeline, the two stages can coalesce into the first `$match` stage and result in a single `$match` stage. As a result, the query shape in the Performance Advisor might differ from the actual query you ran.\\n\\n## Common Reasons for Slow Queries\\n\\nIf a query is slow, common reasons include:\\n\\n- The query is unsupported by your current indexes.\\n\\n- Some documents in your collection have large array fields that are costly to search and index.\\n\\n- One query retrieves information from multiple collections with $lookup.\\n\\n## Required Access\\n\\nTo view collections with slow queries and see suggested indexes, you must have `Project Read Only` access or higher to the project.\\n\\nTo view field values in a sample query in the Performance Advisor, you must have `Project Data Access Read/Write` access or higher to the project.\\n\\nTo enable or disable the Atlas-managed slow operation threshold, you must have `Project Owner` access to the project. Users with `Organization Owner` access must add themselves to the project as a `Project Owner`.\\n\\n## Configure the Slow Query Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. However, you can opt out of this feature and instead use a fixed slow query threshold of 100 milliseconds. You can disable the Atlas-managed slow operation threshold with the Atlas CLI, Atlas Administration API, or Atlas UI.\\n\\nAtlas clusters with Atlas Search enabled don\\'t support the Atlas-managed slow query operation threshold.\\n\\nFor `M0`, `M2`, `M5` clusters and serverless instances, Atlas disables the Atlas-managed slow query operation threshold by default and you can\\'t enable it.\\n\\n### Disable the Atlas-Managed Slow Operation Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. If you disable the Atlas-managed slow query threshold, it no longer dynamically adjusts. MongoDB defaults the fixed slow query threshold to 100 milliseconds. We don\\'t recommend that you set the fixed slow query threshold lower than 100 milliseconds.\\n\\nTo disable the Atlas-managed slow operation threshold and use a fixed threshold of 100 milliseconds:\\n\\n\\n\\n\\n\\nTo disable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold disable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold disable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Disable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to Off.\\n\\n\\n\\n\\n\\n### Enable the Atlas-Managed Slow Operation Threshold\\n\\nAtlas enables the Atlas-managed slow operation threshold by default. To re-enable the Atlas-managed slow operation threshold that you previously disabled:\\n\\n\\n\\n\\n\\nTo enable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold enable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold enable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Enable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to On.\\n\\n\\n\\n\\n\\n## Index Considerations\\n\\nIndexes improve read performance, but a large number of indexes can negatively impact write performance since indexes must be updated during writes. If your collection already has several indexes, consider this tradeoff of read and write performance when deciding whether to create new indexes. Examine whether a query for such a collection can be modified to take advantage of existing indexes, as well as whether a query occurs often enough to justify the cost of a new index.\\n\\n## Access Performance Advisor\\n\\n\\n\\n\\n\\n### View Collections with Slow Queries\\n\\nTo return up to 20 namespaces in `.` format for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor namespaces list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor namespaces list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Slow Query Logs\\n\\nTo return query log line items for slow queries that the Performance Advisor and Query Profiler identify using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowQueryLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowQueryLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Suggested Indexes\\n\\nTo return suggested indexes for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor suggestedIndexes list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor suggestedIndexes list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo access the Performance Advisor using the Atlas UI:\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the replica set where the collection resides.\\n\\nIf the replica set resides in a sharded cluster, first click the sharded cluster containing the replica set.\\n\\n### Click Performance Advisor.\\n\\n### Select a collection from the Collections dropdown.\\n\\n### Select a time period from the Time Range dropdown.\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the serverless instance.\\n\\n### Click Performance Advisor.\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nThe Performance Advisor displays up to 20 query shapes across all collections in the cluster and suggested indexes for those shapes. The Performance Advisor ranks the indexes according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about index ranking, see Review Index Ranking.\\n\\n## Index Suggestions\\n\\nThe Performance Advisor ranks the indexes that it suggests according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about how the Performance Advisor ranks indexes, see Review Index Ranking.\\n\\nTo learn how to create indexes that the Performance Advisor suggests, see Create Suggested Indexes.\\n\\n### Index Metrics\\n\\nEach index that the Performance Advisor suggests contains the following metrics. These metrics apply specifically to queries which would be improved by the index:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which would be improved.\\n\\n
\\nAverage Execution Time\\n\\n\\nCurrent average execution time in milliseconds for affected queries.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read per document returned by affected queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nIn Memory Sort\\n\\n\\nCurrent number of affected queries per hour that needed to be sorted in memory.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
\\nAverage Object Size\\n\\n\\nAverage object size.\\n\\n
\\n\\n### Sample Queries\\n\\nFor each suggested index, the Performance Advisor shows the most commonly executed query shapes that the index would improve. For each query shape, the Performance Advisor displays the following metrics:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which match the query shape.\\n\\n
\\nAverage Execution Time\\n\\n\\nAverage execution time in milliseconds for queries which match the query shape.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read for every document returned by matching queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
The Performance Advisor also shows each executed sample query that matches the query shape, with specific metrics for that query.\\n\\n### Query Targeting\\n\\nEach index suggestion includes an Average Query Targeting score indicating how many documents were read for every document returned for the index\\'s corresponding query shapes. A score of 1 represents very efficient query shapes because every document read matched the query and was returned with the query results. All suggested indexes represent an opportunity to improve query performance.\\n\\n### Filter Index Suggestions\\n\\nBy default, the Performance Advisor suggests indexes for all clusters in the deployment. To only show suggested indexes from a specific collection, use the Collection dropdown at the top of the Performance Advisor.\\n\\nYou can also adjust the time range the Performance Advisor takes into account when suggesting indexes by using the Time Range dropdown at the top of the Performance Advisor.\\n\\n### Limitations of Index Suggestions\\n\\n#### Timestamp Format\\n\\nThe Performance Advisor can\\'t suggest indexes for MongoDB databases configured to use the `ctime` timestamp format. As a workaround, set the timestamp format for such databases to either `iso8601-utc` or `iso8601-local`. To learn more about timestamp formats, see mongod --timeStampFormat.\\n\\n#### Log Size\\n\\nThe Performance Advisor analyzes up to 200,000 of your cluster\\'s most recent log lines.\\n\\n#### Log Quantity\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\n#### Time-Series Collections\\n\\nThe Performance Advisor doesn\\'t provide performance suggestions for time-series collections.\\n\\n#### User Feedback\\n\\nThe Performance Advisor includes a user feedback button for Index Suggestions. Atlas hides this button for serverless instances.\\n\\n## Create Suggested Indexes\\n\\nYou can create indexes suggested by the Performance Advisor directly within the Performance Advisor itself. When you create indexes, keep the ratio of reads to writes on the target collection in mind. Indexes come with a performance cost, but are more than worth the cost for frequent queries on large data sets. To learn more about indexing strategies, see Indexing Strategies.\\n\\n### Behavior and Limitations\\n\\n- You can\\'t create indexes through the Performance Advisor if Data Explorer is disabled for your project. You can still view the Performance Advisor recommendations, but you must create those indexes from `mongosh`.\\n\\n- You can only create one index at a time through the Performance Advisor. If you want to create more simultaneously, you can do so using the Atlas UI, a driver, or the shell\\n\\n- Atlas always creates indexes for entire clusters. If you create an index while viewing the Performance Advisor for a single shard in a sharded cluster, Atlas creates that index for the entire sharded cluster.\\n\\n### Procedure\\n\\nTo create a suggested index:\\n\\n#### For the index you want to create, click Create Index.\\n\\nThe Performance Advisor opens the Create Index dialog and prepopulates the Fields based on the index you selected.\\n\\n#### *(Optional)* Specify the index options.\\n\\n```javascript\\n{ : , ... }\\n```\\n\\nThe following options document specifies the `unique` option and the `name` for the index:\\n\\n```javascript\\n{ unique: true, name: \"myUniqueIndex\" }\\n```\\n\\n#### *(Optional)* Set the Collation options.\\n\\nUse collation to specify language-specific rules for string comparison, such as rules for lettercase and accent marks. The collation document contains a `locale` field which indicates the ICU Locale code, and may contain other fields to define collation behavior.\\n\\nThe following collation option document specifies a locale value of `fr` for a French language collation:\\n\\n```json\\n{ \"locale\": \"fr\" }\\n```\\n\\nTo review the list of locales that MongoDB collation supports, see the list of languages and locales. To learn more about collation options, including which are enabled by default for each locale, see Collation in the MongoDB manual.\\n\\n#### *(Optional)* Enable building indexes in a rolling fashion.\\n\\nRolling index builds succeed only when they meet certain conditions. To ensure your index build succeeds, avoid the following design patterns that commonly trigger a restart loop:\\n\\n- Index key exceeds the index key limit\\n\\n- Index name already exists\\n\\n- Index on more than one array field\\n\\n- Index on collection that has the maximum number of text indexes\\n\\n- Text index on collection that has the maximum number of text indexes\\n\\nthe Atlas UI doesn\\'t support building indexes with a rolling build for `M0` free clusters and `M2/M5` shared clusters. You can\\'t build indexes with a rolling build for serverless instances.\\n\\nFor workloads which cannot tolerate performance decrease due to index builds, consider building indexes in a rolling fashion.\\n\\nTo maintain cluster availability:\\n\\n- Atlas removes one node from the cluster at a time starting with a secondary.\\n\\n- More than one node can go down at a time, but Atlas always keeps a majority of the nodes online.\\n\\nAtlas automatically cancels rolling index builds that don\\'t succeed on all nodes. When a rolling index build completes on some nodes, but fails on others, Atlas cancels the build and removes the index from any nodes that it was successfully built on.\\n\\nIn the event of a rolling index build cancellation, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Name of the cluster on which the rolling index build failed\\n\\n- Namespace on which the rolling index build failed\\n\\n- Project that contains the cluster and namespace\\n\\n- Organization that contains the project\\n\\n- Link to the activity feed event\\n\\nTo learn more about rebuilding indexes, see Build Indexes on Replica Sets.\\n\\nUnique\\nindex options are incompatible with building indexes in a rolling fashion. If you specify `unique` in the Options pane, Atlas rejects your configuration with an error message.\\n\\n#### Click Review.\\n\\n#### In the Confirm Operation dialog, confirm your index.\\n\\nWhen an index build completes, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Completion date of the index build\\n\\n- Name of the cluster on which the index build completed\\n\\n- Namespace on which the index build completed\\n\\n- Project containing the cluster and namespace\\n\\n- Organization containing the project\\n\\n- Link to the activity feed event\\n\\n'),\n", - " Document(metadata={'_id': 'd7d7b858-ad21-4d13-87fb-81aad04ae579', 'contentType': None, 'pageDescription': None, 'productName': 'MongoDB Atlas', 'tags': ['atlas', 'docs'], 'version': None, 'updated': {'$date': '2024-05-20T17:30:49.151Z'}, 'url': 'https://mongodb.com/docs/atlas/reference/alert-resolutions/query-targeting/', 'title': 'Fix Query Issues'}, page_content='# Fix Query Issues\\n\\n`Query Targeting` alerts often indicate inefficient queries.\\n\\n## Alert Conditions\\n\\nYou can configure the following alert conditions in the project-level alert settings page to trigger alerts.\\n\\n`Query Targeting: Scanned Objects / Returned` alerts are triggered when the average number of documents scanned relative to the average number of documents returned server-wide across all operations during a sampling period exceeds a defined threshold. The default alert uses a 1000:1 threshold.\\n\\nIdeally, the ratio of scanned documents to returned documents should be close to 1. A high ratio negatively impacts query performance.\\n\\n`Query Targeting: Scanned / Returned` occurs if the number of index keys examined to fulfill a query relative to the actual number of returned documents meets or exceeds a user-defined threshold. This alert is not enabled by default.\\n\\nThe following mongod log entry shows statistics generated from an inefficient query:\\n\\n```json\\n COMMAND \\nplanSummary: COLLSCAN keysExamined:0\\ndocsExamined: 10000 cursorExhausted:1 numYields:234\\nnreturned:4 protocol:op_query 358ms\\n```\\n\\nThis query scanned 10,000 documents and returned only 4 for a ratio of 2500, which is highly inefficient. No index keys were examined, so MongoDB scanned all documents in the collection, known as a collection scan.\\n\\n## Common Triggers\\n\\nThe query targeting alert typically occurs when there is no index to support a query or queries or when an existing index only partially supports a query or queries.\\n\\nThe change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\n## Fix the Immediate Problem\\n\\nAdd one or more indexes to better serve the inefficient queries.\\n\\nThe Performance Advisor provides the easiest and quickest way to create an index. The Performance Advisor monitors queries that MongoDB considers slow and recommends indexes to improve performance. Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster.\\n\\nClick Create Index on a slow query for instructions on how to create the recommended index.\\n\\nIt is possible to receive a Query Targeting alert for an inefficient query without receiving index suggestions from the Performance Advisor if the query exceeds the slow query threshold and the ratio of scanned to returned documents is greater than the threshold specified in the alert.\\n\\nIn addition, you can use the following resources to determine which query generated the alert:\\n\\n- The Real-Time Performance Panel monitors and displays current network traffic and database operations on machines hosting MongoDB in your Atlas clusters.\\n\\n- The MongoDB logs maintain an account of activity, including queries, for each `mongod` instance in your Atlas clusters.\\n\\n- The cursor.explain() command for `mongosh` provides performance details for all queries.\\n\\n- Namespace Insights monitors collection-level query latency.\\n\\n- The Atlas Query Profiler records operations that Atlas considers slow when compared to average execution time for all operations on your cluster.\\n\\n## Implement a Long-Term Solution\\n\\nRefer to the following for more information on query performance:\\n\\n- MongoDB Indexing Strategies\\n\\n- Query Optimization\\n\\n- Analyze Query Plan\\n\\n## Monitor Your Progress\\n\\nAtlas provides the following methods to visualize query targeting:\\n\\n- Query Targeting metrics, which highlight high ratios of objects scanned to objects returned.\\n\\n- Namespace Insights, which monitors collection-level query latency.\\n\\n- The Query Profiler, which describes specific inefficient queries executed on the cluster.\\n\\n### Query Targeting Metrics\\n\\nYou can view historical metrics to help you visualize the query performance of your cluster. To view Query Targeting metrics in the Atlas UI:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. On the Metrics page, click the Add Chart dropdown menu and select Query Targeting.\\n\\nThe Query Targeting chart displays the following metrics for queries executed on the server:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nScanned Objects / Returned\\n\\n\\nIndicates the average number of documents examined relative to the average number of returned documents.\\n\\n
\\nScanned / Returned\\n\\n\\nIndicates the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\n
The change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\nIf either of these metrics exceed the user-defined threshold, Atlas generates the corresponding `Query Targeting: Scanned Objects / Returned` or `Query Targeting: Scanned / Returned` alert.\\n\\nYou can also view Query Targeting ratios of operations in real-time using the Real-Time Performance Panel.\\n\\n### Namespace Insights\\n\\nNamespace Insights monitors collection-level query latency. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\nTo access Namespace Insights:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Namespace Insights tab.\\n\\n### Query Profiler\\n\\nThe Query Profiler contains several metrics you can use to pinpoint specific inefficient queries. You can visualize up to the past 24 hours of query operations. The Query Profiler can show the Examined : Returned Ratio (index keys examined to documents returned) of logged queries, which might help you identify the queries that triggered a `Query Targeting: Scanned / Returned` alert. The chart shows the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\nThe default\\n`Query Targeting: Scanned Objects / Returned` alert ratio differs slightly. The ratio of the average number of documents scanned to the average number of documents returned during a sampling period triggers this alert.\\n\\nAtlas might not log the individual operations that contribute to the Query Targeting ratios due to automatically set thresholds. However, you can still use the Query Profiler and Query Targeting metrics to analyze and optimize query performance.\\n\\nTo access the Query Profiler:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Query Profiler tab.\\n\\n')]" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "parent_doc_retriever.invoke(\"How do I improve slow queries in MongoDB?\")" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -633,7 +617,7 @@ "collection.delete_many({})\n", "print(f\"Deletion complete.\")\n", "# Ingest LangChain documents into MongoDB\n", - "results = await process_docs(docs, parent_doc_retriever)" + "results = await process_docs(docs)" ] }, { From 4920b5625625bf07b465ffa4de6b453dd07900d0 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Tue, 3 Dec 2024 14:55:56 -0800 Subject: [PATCH 11/23] Adding kwargs to get_retriever --- notebooks/techniques/langchain_parent_document_retrieval.ipynb | 1 + 1 file changed, 1 insertion(+) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index 692d74a..2d9376b 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -463,6 +463,7 @@ " text_key=\"page_content\",\n", " search_type=\"similarity\",\n", " search_kwargs={\"k\": 10},\n", + " **kwargs\n", " )" ] }, From caaca796a8fc5070cdbe2e549eb986c6b910d350 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 4 Dec 2024 09:27:39 -0800 Subject: [PATCH 12/23] renaming CHUNK_SIZE to BATCH_SIZE --- .../techniques/langchain_parent_document_retrieval.ipynb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index 2d9376b..ddd2de7 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -515,16 +515,16 @@ "outputs": [], "source": [ "import asyncio\n", - "from typing import Generator, List, Tuple" + "from typing import Generator, List" ] }, { "cell_type": "code", - "execution_count": 72, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "CHUNK_SIZE = 256\n", + "BATCH_SIZE = 256\n", "MAX_CONCURRENCY = 4" ] }, @@ -585,7 +585,7 @@ " List[None]: Results of the task executions\n", " \"\"\"\n", " semaphore = asyncio.Semaphore(MAX_CONCURRENCY)\n", - " chunks = get_chunks(docs, CHUNK_SIZE)\n", + " chunks = get_chunks(docs, BATCH_SIZE)\n", "\n", " tasks = []\n", " for chunk in chunks:\n", From 62c198f586a124b8838bfbc22879d7f0a10ad680 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 4 Dec 2024 09:40:42 -0800 Subject: [PATCH 13/23] Replace chunk with batch in data ingest function --- .../langchain_parent_document_retrieval.ipynb | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index ddd2de7..8b61a42 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -534,17 +534,17 @@ "metadata": {}, "outputs": [], "source": [ - "async def process_chunk(chunk: Generator, semaphore: asyncio.Semaphore) -> None:\n", + "async def process_batch(batch: Generator, semaphore: asyncio.Semaphore) -> None:\n", " \"\"\"\n", " Ingest batches of documents into MongoDB\n", "\n", " Args:\n", - " chunk (Generator): Chunk of documents to ingest\n", + " batch (Generator): Chunk of documents to ingest\n", " semaphore (as): Asyncio semaphore\n", " \"\"\"\n", " async with semaphore:\n", - " await parent_doc_retriever.aadd_documents(chunk)\n", - " print(f\"Processed {len(chunk)} documents\")" + " await parent_doc_retriever.aadd_documents(batch)\n", + " print(f\"Processed {len(batch)} documents\")" ] }, { @@ -553,19 +553,19 @@ "metadata": {}, "outputs": [], "source": [ - "def get_chunks(docs: List[Document], chunk_size: int) -> Generator:\n", + "def get_batches(docs: List[Document], batch_size: int) -> Generator:\n", " \"\"\"\n", - " Return chunks of documents to ingest into MongoDB\n", + " Return batches of documents to ingest into MongoDB\n", "\n", " Args:\n", " docs (List[Document]): List of LangChain documents\n", - " chunk_size (int): Chunk/batch size\n", + " batch_size (int): Batch size\n", "\n", " Yields:\n", " Generator: Batch of documents\n", " \"\"\"\n", - " for i in range(0, len(docs), chunk_size):\n", - " yield docs[i : i + chunk_size]" + " for i in range(0, len(docs), batch_size):\n", + " yield docs[i : i + batch_size]" ] }, { @@ -576,7 +576,7 @@ "source": [ "async def process_docs(docs: List[Document]) -> List[None]:\n", " \"\"\"\n", - " Asynchronously ingest langChain documents into MongoDB\n", + " Asynchronously ingest LangChain documents into MongoDB\n", "\n", " Args:\n", " docs (List[Document]): List of LangChain documents\n", @@ -585,11 +585,11 @@ " List[None]: Results of the task executions\n", " \"\"\"\n", " semaphore = asyncio.Semaphore(MAX_CONCURRENCY)\n", - " chunks = get_chunks(docs, BATCH_SIZE)\n", + " batches = get_batches(docs, BATCH_SIZE)\n", "\n", " tasks = []\n", - " for chunk in chunks:\n", - " tasks.append(process_chunk(chunk, semaphore))\n", + " for batch in batches:\n", + " tasks.append(process_batch(batch, semaphore))\n", " # Gather results from all tasks\n", " results = await asyncio.gather(*tasks)\n", " return results" From 1b49ff3d94357333a43c6833cad85a25cda9856e Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 4 Dec 2024 10:08:20 -0800 Subject: [PATCH 14/23] Small nit --- notebooks/techniques/langchain_parent_document_retrieval.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index 8b61a42..ef15ce7 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -625,7 +625,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Step 7: Create vector search indexes" + "## Step 7: Create a vector search index" ] }, { From 06129e343946733cd707585f20611f8d2004cc11 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 4 Dec 2024 11:17:12 -0800 Subject: [PATCH 15/23] Moving graph state cell --- .../langchain_parent_document_retrieval.ipynb | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index ef15ce7..91ea0aa 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -854,17 +854,6 @@ "tools = [get_info_about_mongodb]" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Define graph state\n", - "class GraphState(TypedDict):\n", - " messages: Annotated[list, add_messages]" - ] - }, { "cell_type": "code", "execution_count": null, @@ -893,6 +882,17 @@ "llm_with_tools = prompt | llm.bind_tools(tools)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define graph state\n", + "class GraphState(TypedDict):\n", + " messages: Annotated[list, add_messages]" + ] + }, { "cell_type": "code", "execution_count": null, From 3bacbbfa22ab4d2080b7c7d5cfe3e6a3acb27661 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 4 Dec 2024 13:54:03 -0800 Subject: [PATCH 16/23] Remove print --- notebooks/techniques/langchain_parent_document_retrieval.ipynb | 1 - 1 file changed, 1 deletion(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index 91ea0aa..7674263 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -910,7 +910,6 @@ " Dict[str, List]: Updates to the graph state\n", " \"\"\"\n", " messages = state[\"messages\"]\n", - " print(messages)\n", " response = llm_with_tools.invoke(messages)\n", " # We return a list, because this will get added to the existing list\n", " return {\"messages\": [response]}" From 8f282e1123f91990f16751474dba4e765abf478b Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 4 Dec 2024 15:08:59 -0800 Subject: [PATCH 17/23] Removing a kwarg --- notebooks/techniques/langchain_parent_document_retrieval.ipynb | 1 - 1 file changed, 1 deletion(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index 7674263..0c91ae8 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -461,7 +461,6 @@ " database_name=DB_NAME,\n", " collection_name=COLLECTION_NAME,\n", " text_key=\"page_content\",\n", - " search_type=\"similarity\",\n", " search_kwargs={\"k\": 10},\n", " **kwargs\n", " )" From 3df43f5e76f79709ddf7478c2f2aa7d3732f78c7 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 4 Dec 2024 20:20:42 -0800 Subject: [PATCH 18/23] Remove get_retriever function --- .../langchain_parent_document_retrieval.ipynb | 65 +++++++------------ 1 file changed, 22 insertions(+), 43 deletions(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index 0c91ae8..b00503c 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -436,36 +436,6 @@ " )" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_retriever(\n", - " child_chunk_size: int, **kwargs\n", - ") -> MongoDBAtlasParentDocumentRetriever:\n", - " \"\"\"\n", - " Create a MongoDB parent document/chunk retriever\n", - "\n", - " Args:\n", - " child_chunk_size (int): Chunk size for child chunks\n", - "\n", - " Returns:\n", - " MongoDBAtlasParentDocumentRetriever: MongoDB parent document retriever object\n", - " \"\"\"\n", - " return MongoDBAtlasParentDocumentRetriever.from_connection_string(\n", - " connection_string=MONGODB_URI,\n", - " embedding_model=embedding_model,\n", - " child_splitter=get_splitter(child_chunk_size),\n", - " database_name=DB_NAME,\n", - " collection_name=COLLECTION_NAME,\n", - " text_key=\"page_content\",\n", - " search_kwargs={\"k\": 10},\n", - " **kwargs\n", - " )" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -475,29 +445,38 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "parent_doc_retriever = get_retriever(child_chunk_size=200)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Parent chunk retriever" + "parent_doc_retriever = MongoDBAtlasParentDocumentRetriever.from_connection_string(\n", + " connection_string=MONGODB_URI,\n", + " embedding_model=embedding_model,\n", + " child_splitter=get_splitter(200),\n", + " database_name=DB_NAME,\n", + " collection_name=COLLECTION_NAME,\n", + " text_key=\"page_content\",\n", + " search_kwargs={\"k\": 10},\n", + ")" ] }, { "cell_type": "code", - "execution_count": 70, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "parent_chunk_retriever = get_retriever(\n", - " child_chunk_size=200, parent_splitter=get_splitter(800)\n", - ")" + "# Parent chunk retriever\n", + "# parent_chunk_retriever = MongoDBAtlasParentDocumentRetriever.from_connection_string(\n", + "# connection_string=MONGODB_URI,\n", + "# embedding_model=embedding_model,\n", + "# child_splitter=get_splitter(200),\n", + "# parent_splitter=get_splitter(800),\n", + "# database_name=DB_NAME,\n", + "# collection_name=COLLECTION_NAME,\n", + "# text_key=\"page_content\",\n", + "# search_kwargs={\"k\": 10},\n", + "# )" ] }, { From 70ae9dea28804ce062d1a4a02e114093714ecefc Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Wed, 11 Dec 2024 08:09:35 -0800 Subject: [PATCH 19/23] Removing unused import --- .../techniques/langchain_parent_document_retrieval.ipynb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index b00503c..c9a10c3 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -63,13 +63,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import os\n", "import getpass\n", - "from openai import OpenAI\n", "from pymongo import MongoClient" ] }, From 4c68963b91203be7b6b5a68cbe5b0217ad665d00 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Thu, 12 Dec 2024 13:15:59 -0800 Subject: [PATCH 20/23] Testing that everything works with the official package --- .../langchain_parent_document_retrieval.ipynb | 223 ++++++++---------- 1 file changed, 100 insertions(+), 123 deletions(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index c9a10c3..701f085 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -90,10 +90,10 @@ "data": { "text/plain": [ "{'ok': 1.0,\n", - " '$clusterTime': {'clusterTime': Timestamp(1733161666, 1),\n", - " 'signature': {'hash': b'\\x83\\xff\\xe1*\\xc9\\xea\\xfa\\xd3\\xbd\\xd0\\x03\\xdbrI\\x98\\xcf\\xae\\xac\\xc2\\x10',\n", + " '$clusterTime': {'clusterTime': Timestamp(1734037711, 1),\n", + " 'signature': {'hash': b'v\\xa2\\xc7\\xf6\\xc4\\xc5z\\x97%Q_\\xc1\\xa5\\xaf}\\x05(\\x92\\x80\\xc2',\n", " 'keyId': 7390069253761662978}},\n", - " 'operationTime': Timestamp(1733161666, 1)}" + " 'operationTime': Timestamp(1734037711, 1)}" ] }, "execution_count": 4, @@ -127,9 +127,18 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/apoorva.joshi/Documents/GenAI-Showcase/.venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], "source": [ "from datasets import load_dataset\n", "import pandas as pd" @@ -137,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -148,7 +157,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -292,7 +301,7 @@ "4 Resolve Alerts " ] }, - "execution_count": 38, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -310,7 +319,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -319,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -335,7 +344,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -344,7 +353,7 @@ "Document(metadata={'contentType': None, 'pageDescription': None, 'productName': 'MongoDB Atlas', 'tags': ['atlas', 'docs'], 'version': None, 'updated': {'$date': '2024-05-20T17:30:49.148Z'}, 'url': 'https://mongodb.com/docs/atlas/access-tracking/', 'title': 'View Database Access History'}, page_content='# View Database Access History\\n\\n- This feature is not available for `M0` free clusters, `M2`, and `M5` clusters. To learn more, see Atlas M0 (Free Cluster), M2, and M5 Limits.\\n\\n- This feature is not supported on Serverless instances at this time. To learn more, see Serverless Instance Limitations.\\n\\n## Overview\\n\\nAtlas parses the MongoDB database logs to collect a list of authentication requests made against your clusters through the following methods:\\n\\n- `mongosh`\\n\\n- Compass\\n\\n- Drivers\\n\\nAuthentication requests made with API Keys through the Atlas Administration API are not logged.\\n\\nAtlas logs the following information for each authentication request within the last 7 days:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nField\\n\\n\\nDescription\\n\\n
\\nTimestamp\\n\\n\\nThe date and time of the authentication request.\\n\\n
\\nUsername\\n\\n\\nThe username associated with the database user who made the authentication request.\\n\\nFor LDAP usernames, the UI displays the resolved LDAP name. Hover over the name to see the full LDAP username.\\n\\n
\\nIP Address\\n\\n\\nThe IP address of the machine that sent the authentication request.\\n\\n
\\nHost\\n\\n\\nThe target server that processed the authentication request.\\n\\n
\\nAuthentication Source\\n\\n\\nThe database that the authentication request was made against. `admin` is the authentication source for SCRAM-SHA users and `$external` for LDAP users.\\n\\n
\\nAuthentication Result\\n\\n\\nThe success or failure of the authentication request. A reason code is displayed for the failed authentication requests.\\n\\n
Authentication requests are pre-sorted by descending timestamp with 25 entries per page.\\n\\n### Logging Limitations\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\nIf authentication requests occur during a period when logs are not collected, they will not appear in the database access history.\\n\\n## Required Access\\n\\nTo view database access history, you must have `Project Owner` or `Organization Owner` access to Atlas.\\n\\n## Procedure\\n\\n\\n\\n\\n\\nTo return the access logs for a cluster using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas accessLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas accessLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo view the database access history using the API, see Access Tracking.\\n\\n\\n\\n\\n\\nUse the following procedure to view your database access history using the Atlas UI:\\n\\n### Navigate to the Clusters page for your project.\\n\\n- If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.\\n\\n- If it is not already displayed, select your desired project from the Projects menu in the navigation bar.\\n\\n- If the Clusters page is not already displayed, click Database in the sidebar.\\n\\n### View the cluster\\'s database access history.\\n\\n- On the cluster card, click .\\n\\n- Select View Database Access History.\\n\\nor\\n\\n- Click the cluster name.\\n\\n- Click .\\n\\n- Select View Database Access History.\\n\\n\\n\\n\\n\\n')" ] }, - "execution_count": 41, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -355,7 +364,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -364,7 +373,7 @@ "1000" ] }, - "execution_count": 42, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -382,11 +391,11 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ - "from langchain_mongodb.retrievers.parent_document import (\n", + "from langchain_mongodb.retrievers import (\n", " MongoDBAtlasParentDocumentRetriever,\n", ")\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", @@ -395,7 +404,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -404,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -414,7 +423,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -444,7 +453,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -465,7 +474,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Parent chunk retriever\n", + "# # Parent chunk retriever\n", "# parent_chunk_retriever = MongoDBAtlasParentDocumentRetriever.from_connection_string(\n", "# connection_string=MONGODB_URI,\n", "# embedding_model=embedding_model,\n", @@ -487,7 +496,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ @@ -497,7 +506,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -507,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ @@ -526,7 +535,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -547,7 +556,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -574,7 +583,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -607,7 +616,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -617,7 +626,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -626,7 +635,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -689,7 +698,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -701,7 +710,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ @@ -728,7 +737,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -738,37 +747,33 @@ "To improve slow queries in MongoDB, you can follow these steps:\n", "\n", "1. **Use the Performance Advisor**:\n", - " - The Performance Advisor monitors slow queries and suggests new indexes to improve query performance.\n", - " - Review the suggested indexes, especially those with high Impact scores and low Average Query Targeting scores, and create them if they align with your indexing strategies.\n", + " - The Performance Advisor monitors slow queries and suggests indexes to improve performance.\n", + " - Create the suggested indexes, especially those with high Impact scores and low Average Query Targeting scores.\n", "\n", "2. **Analyze Query Performance**:\n", - " - Use the **Query Profiler** to explore slow-running operations and their key performance statistics for up to the last 24 hours.\n", + " - Use the **Query Profiler** to identify slow-running operations and their key performance statistics.\n", " - Use the **Real-Time Performance Panel (RTPP)** to evaluate query execution times and the ratio of documents scanned to documents returned.\n", + " - Use **Namespace Insights** to monitor collection-level query latency.\n", "\n", - "3. **Monitor Query Latency**:\n", - " - Use **Namespace Insights** to monitor collection-level query latency and view query latency metrics and statistics.\n", + "3. **Optimize Indexes**:\n", + " - Create indexes that support your queries to reduce the time needed to search for results.\n", + " - Remove unused or inefficient indexes to improve write performance and free storage space.\n", + " - Perform rolling index builds to minimize performance impact on replica sets and sharded clusters.\n", "\n", - "4. **Fix Inefficient Queries**:\n", - " - Address `Query Targeting` alerts by adding indexes to support inefficient queries.\n", + "4. **Fix Query Targeting Issues**:\n", + " - Address `Query Targeting: Scanned Objects / Returned` or `Query Targeting: Scanned / Returned` alerts by adding indexes to support inefficient queries.\n", " - Use the `cursor.explain()` command to analyze query plans and identify inefficiencies.\n", "\n", "5. **Follow Best Practices**:\n", - " - Create queries that are supported by existing indexes.\n", - " - Avoid large array fields in documents that are costly to search and index.\n", - " - Optimize and remove unused or inefficient indexes to balance read and write performance.\n", - " - Perform rolling index builds to minimize performance impact on replica sets and sharded clusters.\n", - "\n", - "6. **Configure Slow Query Threshold**:\n", - " - Adjust the slow query threshold to identify slow queries more effectively. By default, Atlas dynamically adjusts this threshold, but you can set a fixed threshold of 100 milliseconds if needed.\n", - "\n", - "7. **Monitor Progress**:\n", - " - Use Query Targeting metrics, Namespace Insights, and the Query Profiler to visualize and track improvements in query performance.\n", + " - Avoid creating documents with large array fields that are costly to search and index.\n", + " - Optimize queries to take advantage of existing indexes.\n", + " - Use the suggested indexes from the Performance Advisor when they align with your indexing strategies.\n", "\n", - "8. **Address Common Issues**:\n", - " - Ensure queries are supported by indexes.\n", - " - Optimize queries involving `$lookup` or large array fields.\n", + "6. **Monitor and Adjust**:\n", + " - Use Query Targeting metrics and Query Profiler to monitor progress and ensure query performance improves.\n", + " - Adjust the slow query threshold if needed to better suit your workload.\n", "\n", - "By implementing these steps, you can identify and resolve slow queries, improving overall query performance in MongoDB.\n" + "By implementing these steps, you can significantly improve the performance of slow queries in MongoDB.\n" ] } ], @@ -786,7 +791,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, "outputs": [], "source": [ @@ -801,7 +806,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -824,7 +829,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -833,7 +838,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, "outputs": [], "source": [ @@ -861,7 +866,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -872,7 +877,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, "outputs": [], "source": [ @@ -894,7 +899,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ @@ -904,7 +909,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ @@ -927,83 +932,55 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[HumanMessage(content='How do I improve slow queries in MongoDB?', additional_kwargs={}, response_metadata={}, id='d24196f2-dd7e-4342-9660-7f2a9933b807')]\n", "Node agent:\n", - "{'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_8uC6x6EalTyPlaDn1xHG5bcr', 'function': {'arguments': '{\"user_query\":\"How do I improve slow queries in MongoDB?\"}', 'name': 'get_info_about_mongodb'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 27, 'prompt_tokens': 165, 'total_tokens': 192, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-11-20', 'system_fingerprint': 'fp_a523ccd45c', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-81181db3-2a33-479b-9ee6-f773c47c1275-0', tool_calls=[{'name': 'get_info_about_mongodb', 'args': {'user_query': 'How do I improve slow queries in MongoDB?'}, 'id': 'call_8uC6x6EalTyPlaDn1xHG5bcr', 'type': 'tool_call'}], usage_metadata={'input_tokens': 165, 'output_tokens': 27, 'total_tokens': 192, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}\n", + "{'messages': [AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_sifH0mrhbpesQie4BTnQytNk', 'function': {'arguments': '{\"user_query\":\"How do I improve slow queries in MongoDB?\"}', 'name': 'get_info_about_mongodb'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 27, 'prompt_tokens': 165, 'total_tokens': 192, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-11-20', 'system_fingerprint': 'fp_d924043139', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-bc1db263-f4f5-40ba-a6ba-b18a3585e095-0', tool_calls=[{'name': 'get_info_about_mongodb', 'args': {'user_query': 'How do I improve slow queries in MongoDB?'}, 'id': 'call_sifH0mrhbpesQie4BTnQytNk', 'type': 'tool_call'}], usage_metadata={'input_tokens': 165, 'output_tokens': 27, 'total_tokens': 192, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}\n", "Node tools:\n", - "{'messages': [ToolMessage(content='# Analyze Slow Queries\\n\\nAtlas provides several tools to help analyze slow queries executed on your clusters. See the following sections for descriptions of each tool. To optimize your query performance, review the best practices for query performance.\\n\\n## Performance Advisor\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance.\\n\\nYou can use the Performance Advisor to review the following information:\\n\\n- Index Ranking\\n\\n- Drop Index Recommendations\\n\\n## Namespace Insights\\n\\nMonitor collection-level query latency with Namespace Insights. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\n## Query Profiler\\n\\nThe Query Profiler displays slow-running operations and their key performance statistics. You can explore a sample of historical queries for up to the last 24 hours without additional cost or performance overhead. Before you enable the Query Profiler, see Considerations.\\n\\n## Real-Time Performance Panel (RTPP)\\n\\nThe Real-Time Performance Panel identifies relevant database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned during query execution. RTPP (Real-Time Performance Panel) is enabled by default.\\n\\nTo enable or disable Real-Time Performance Panel for a project, you must have the `Project Owner` role for the project.\\n\\n## Best Practices for Query Performance\\n\\nTo optimize query performance, review the following best practices:\\n\\n- Create queries that your current indexes support to reduce the time needed to search for your results.\\n\\n- Avoid creating documents with large array fields that require a lot of processing to search and index.\\n\\n- Optimize your indexes and remove unused or inefficent indexes. Too many indexes can negatively impact write performance.\\n\\n- Consider the suggested indexes from the Performance Advisor with the highest Impact scores and lowest Average Query Targeting scores.\\n\\n- Create the indexes that the Performance Advisor suggests when they align with your Indexing Strategies.\\n\\n- The Performance Advisor cannot suggest indexes for MongoDB databases configured to use the ctime timestamp format. As a workaround, set the timestamp format for such databases to either iso8601-utc or iso8601-local.\\n\\n- Perform rolling index builds to reduce the performance impact of building indexes on replica sets and sharded clusters.\\n\\n- Drop unused, redundant, and hidden indexes to improve write performance and free storage space.\\n\\n\\n\\n# Fix Query Issues\\n\\n`Query Targeting` alerts often indicate inefficient queries.\\n\\n## Alert Conditions\\n\\nYou can configure the following alert conditions in the project-level alert settings page to trigger alerts.\\n\\n`Query Targeting: Scanned Objects / Returned` alerts are triggered when the average number of documents scanned relative to the average number of documents returned server-wide across all operations during a sampling period exceeds a defined threshold. The default alert uses a 1000:1 threshold.\\n\\nIdeally, the ratio of scanned documents to returned documents should be close to 1. A high ratio negatively impacts query performance.\\n\\n`Query Targeting: Scanned / Returned` occurs if the number of index keys examined to fulfill a query relative to the actual number of returned documents meets or exceeds a user-defined threshold. This alert is not enabled by default.\\n\\nThe following mongod log entry shows statistics generated from an inefficient query:\\n\\n```json\\n COMMAND \\nplanSummary: COLLSCAN keysExamined:0\\ndocsExamined: 10000 cursorExhausted:1 numYields:234\\nnreturned:4 protocol:op_query 358ms\\n```\\n\\nThis query scanned 10,000 documents and returned only 4 for a ratio of 2500, which is highly inefficient. No index keys were examined, so MongoDB scanned all documents in the collection, known as a collection scan.\\n\\n## Common Triggers\\n\\nThe query targeting alert typically occurs when there is no index to support a query or queries or when an existing index only partially supports a query or queries.\\n\\nThe change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\n## Fix the Immediate Problem\\n\\nAdd one or more indexes to better serve the inefficient queries.\\n\\nThe Performance Advisor provides the easiest and quickest way to create an index. The Performance Advisor monitors queries that MongoDB considers slow and recommends indexes to improve performance. Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster.\\n\\nClick Create Index on a slow query for instructions on how to create the recommended index.\\n\\nIt is possible to receive a Query Targeting alert for an inefficient query without receiving index suggestions from the Performance Advisor if the query exceeds the slow query threshold and the ratio of scanned to returned documents is greater than the threshold specified in the alert.\\n\\nIn addition, you can use the following resources to determine which query generated the alert:\\n\\n- The Real-Time Performance Panel monitors and displays current network traffic and database operations on machines hosting MongoDB in your Atlas clusters.\\n\\n- The MongoDB logs maintain an account of activity, including queries, for each `mongod` instance in your Atlas clusters.\\n\\n- The cursor.explain() command for `mongosh` provides performance details for all queries.\\n\\n- Namespace Insights monitors collection-level query latency.\\n\\n- The Atlas Query Profiler records operations that Atlas considers slow when compared to average execution time for all operations on your cluster.\\n\\n## Implement a Long-Term Solution\\n\\nRefer to the following for more information on query performance:\\n\\n- MongoDB Indexing Strategies\\n\\n- Query Optimization\\n\\n- Analyze Query Plan\\n\\n## Monitor Your Progress\\n\\nAtlas provides the following methods to visualize query targeting:\\n\\n- Query Targeting metrics, which highlight high ratios of objects scanned to objects returned.\\n\\n- Namespace Insights, which monitors collection-level query latency.\\n\\n- The Query Profiler, which describes specific inefficient queries executed on the cluster.\\n\\n### Query Targeting Metrics\\n\\nYou can view historical metrics to help you visualize the query performance of your cluster. To view Query Targeting metrics in the Atlas UI:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. On the Metrics page, click the Add Chart dropdown menu and select Query Targeting.\\n\\nThe Query Targeting chart displays the following metrics for queries executed on the server:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nScanned Objects / Returned\\n\\n\\nIndicates the average number of documents examined relative to the average number of returned documents.\\n\\n
\\nScanned / Returned\\n\\n\\nIndicates the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\n
The change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\nIf either of these metrics exceed the user-defined threshold, Atlas generates the corresponding `Query Targeting: Scanned Objects / Returned` or `Query Targeting: Scanned / Returned` alert.\\n\\nYou can also view Query Targeting ratios of operations in real-time using the Real-Time Performance Panel.\\n\\n### Namespace Insights\\n\\nNamespace Insights monitors collection-level query latency. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\nTo access Namespace Insights:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Namespace Insights tab.\\n\\n### Query Profiler\\n\\nThe Query Profiler contains several metrics you can use to pinpoint specific inefficient queries. You can visualize up to the past 24 hours of query operations. The Query Profiler can show the Examined : Returned Ratio (index keys examined to documents returned) of logged queries, which might help you identify the queries that triggered a `Query Targeting: Scanned / Returned` alert. The chart shows the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\nThe default\\n`Query Targeting: Scanned Objects / Returned` alert ratio differs slightly. The ratio of the average number of documents scanned to the average number of documents returned during a sampling period triggers this alert.\\n\\nAtlas might not log the individual operations that contribute to the Query Targeting ratios due to automatically set thresholds. However, you can still use the Query Profiler and Query Targeting metrics to analyze and optimize query performance.\\n\\nTo access the Query Profiler:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Query Profiler tab.\\n\\n\\n\\n# Monitor and Improve Slow Queries\\n\\n*Only available on M10+ clusters and serverless instances*\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance. The threshold for slow queries varies based on the average time of operations on your cluster to provide recommendations pertinent to your workload.\\n\\nRecommended indexes are accompanied by sample queries, grouped by query shape, that were run against a collection that would benefit from the suggested index. The Performance Advisor doesn\\'t negatively affect the performance of your Atlas clusters.\\n\\nYou can also monitor collection-level query latency with Namespace Insights and query performance with the Query Profiler.\\n\\nIf the slow query log contains consecutive `$match` stages in the aggregation pipeline, the two stages can coalesce into the first `$match` stage and result in a single `$match` stage. As a result, the query shape in the Performance Advisor might differ from the actual query you ran.\\n\\n## Common Reasons for Slow Queries\\n\\nIf a query is slow, common reasons include:\\n\\n- The query is unsupported by your current indexes.\\n\\n- Some documents in your collection have large array fields that are costly to search and index.\\n\\n- One query retrieves information from multiple collections with $lookup.\\n\\n## Required Access\\n\\nTo view collections with slow queries and see suggested indexes, you must have `Project Read Only` access or higher to the project.\\n\\nTo view field values in a sample query in the Performance Advisor, you must have `Project Data Access Read/Write` access or higher to the project.\\n\\nTo enable or disable the Atlas-managed slow operation threshold, you must have `Project Owner` access to the project. Users with `Organization Owner` access must add themselves to the project as a `Project Owner`.\\n\\n## Configure the Slow Query Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. However, you can opt out of this feature and instead use a fixed slow query threshold of 100 milliseconds. You can disable the Atlas-managed slow operation threshold with the Atlas CLI, Atlas Administration API, or Atlas UI.\\n\\nAtlas clusters with Atlas Search enabled don\\'t support the Atlas-managed slow query operation threshold.\\n\\nFor `M0`, `M2`, `M5` clusters and serverless instances, Atlas disables the Atlas-managed slow query operation threshold by default and you can\\'t enable it.\\n\\n### Disable the Atlas-Managed Slow Operation Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. If you disable the Atlas-managed slow query threshold, it no longer dynamically adjusts. MongoDB defaults the fixed slow query threshold to 100 milliseconds. We don\\'t recommend that you set the fixed slow query threshold lower than 100 milliseconds.\\n\\nTo disable the Atlas-managed slow operation threshold and use a fixed threshold of 100 milliseconds:\\n\\n\\n\\n\\n\\nTo disable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold disable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold disable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Disable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to Off.\\n\\n\\n\\n\\n\\n### Enable the Atlas-Managed Slow Operation Threshold\\n\\nAtlas enables the Atlas-managed slow operation threshold by default. To re-enable the Atlas-managed slow operation threshold that you previously disabled:\\n\\n\\n\\n\\n\\nTo enable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold enable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold enable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Enable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to On.\\n\\n\\n\\n\\n\\n## Index Considerations\\n\\nIndexes improve read performance, but a large number of indexes can negatively impact write performance since indexes must be updated during writes. If your collection already has several indexes, consider this tradeoff of read and write performance when deciding whether to create new indexes. Examine whether a query for such a collection can be modified to take advantage of existing indexes, as well as whether a query occurs often enough to justify the cost of a new index.\\n\\n## Access Performance Advisor\\n\\n\\n\\n\\n\\n### View Collections with Slow Queries\\n\\nTo return up to 20 namespaces in `.` format for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor namespaces list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor namespaces list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Slow Query Logs\\n\\nTo return query log line items for slow queries that the Performance Advisor and Query Profiler identify using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowQueryLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowQueryLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Suggested Indexes\\n\\nTo return suggested indexes for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor suggestedIndexes list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor suggestedIndexes list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo access the Performance Advisor using the Atlas UI:\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the replica set where the collection resides.\\n\\nIf the replica set resides in a sharded cluster, first click the sharded cluster containing the replica set.\\n\\n### Click Performance Advisor.\\n\\n### Select a collection from the Collections dropdown.\\n\\n### Select a time period from the Time Range dropdown.\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the serverless instance.\\n\\n### Click Performance Advisor.\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nThe Performance Advisor displays up to 20 query shapes across all collections in the cluster and suggested indexes for those shapes. The Performance Advisor ranks the indexes according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about index ranking, see Review Index Ranking.\\n\\n## Index Suggestions\\n\\nThe Performance Advisor ranks the indexes that it suggests according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about how the Performance Advisor ranks indexes, see Review Index Ranking.\\n\\nTo learn how to create indexes that the Performance Advisor suggests, see Create Suggested Indexes.\\n\\n### Index Metrics\\n\\nEach index that the Performance Advisor suggests contains the following metrics. These metrics apply specifically to queries which would be improved by the index:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which would be improved.\\n\\n
\\nAverage Execution Time\\n\\n\\nCurrent average execution time in milliseconds for affected queries.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read per document returned by affected queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nIn Memory Sort\\n\\n\\nCurrent number of affected queries per hour that needed to be sorted in memory.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
\\nAverage Object Size\\n\\n\\nAverage object size.\\n\\n
\\n\\n### Sample Queries\\n\\nFor each suggested index, the Performance Advisor shows the most commonly executed query shapes that the index would improve. For each query shape, the Performance Advisor displays the following metrics:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which match the query shape.\\n\\n
\\nAverage Execution Time\\n\\n\\nAverage execution time in milliseconds for queries which match the query shape.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read for every document returned by matching queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
The Performance Advisor also shows each executed sample query that matches the query shape, with specific metrics for that query.\\n\\n### Query Targeting\\n\\nEach index suggestion includes an Average Query Targeting score indicating how many documents were read for every document returned for the index\\'s corresponding query shapes. A score of 1 represents very efficient query shapes because every document read matched the query and was returned with the query results. All suggested indexes represent an opportunity to improve query performance.\\n\\n### Filter Index Suggestions\\n\\nBy default, the Performance Advisor suggests indexes for all clusters in the deployment. To only show suggested indexes from a specific collection, use the Collection dropdown at the top of the Performance Advisor.\\n\\nYou can also adjust the time range the Performance Advisor takes into account when suggesting indexes by using the Time Range dropdown at the top of the Performance Advisor.\\n\\n### Limitations of Index Suggestions\\n\\n#### Timestamp Format\\n\\nThe Performance Advisor can\\'t suggest indexes for MongoDB databases configured to use the `ctime` timestamp format. As a workaround, set the timestamp format for such databases to either `iso8601-utc` or `iso8601-local`. To learn more about timestamp formats, see mongod --timeStampFormat.\\n\\n#### Log Size\\n\\nThe Performance Advisor analyzes up to 200,000 of your cluster\\'s most recent log lines.\\n\\n#### Log Quantity\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\n#### Time-Series Collections\\n\\nThe Performance Advisor doesn\\'t provide performance suggestions for time-series collections.\\n\\n#### User Feedback\\n\\nThe Performance Advisor includes a user feedback button for Index Suggestions. Atlas hides this button for serverless instances.\\n\\n## Create Suggested Indexes\\n\\nYou can create indexes suggested by the Performance Advisor directly within the Performance Advisor itself. When you create indexes, keep the ratio of reads to writes on the target collection in mind. Indexes come with a performance cost, but are more than worth the cost for frequent queries on large data sets. To learn more about indexing strategies, see Indexing Strategies.\\n\\n### Behavior and Limitations\\n\\n- You can\\'t create indexes through the Performance Advisor if Data Explorer is disabled for your project. You can still view the Performance Advisor recommendations, but you must create those indexes from `mongosh`.\\n\\n- You can only create one index at a time through the Performance Advisor. If you want to create more simultaneously, you can do so using the Atlas UI, a driver, or the shell\\n\\n- Atlas always creates indexes for entire clusters. If you create an index while viewing the Performance Advisor for a single shard in a sharded cluster, Atlas creates that index for the entire sharded cluster.\\n\\n### Procedure\\n\\nTo create a suggested index:\\n\\n#### For the index you want to create, click Create Index.\\n\\nThe Performance Advisor opens the Create Index dialog and prepopulates the Fields based on the index you selected.\\n\\n#### *(Optional)* Specify the index options.\\n\\n```javascript\\n{ : , ... }\\n```\\n\\nThe following options document specifies the `unique` option and the `name` for the index:\\n\\n```javascript\\n{ unique: true, name: \"myUniqueIndex\" }\\n```\\n\\n#### *(Optional)* Set the Collation options.\\n\\nUse collation to specify language-specific rules for string comparison, such as rules for lettercase and accent marks. The collation document contains a `locale` field which indicates the ICU Locale code, and may contain other fields to define collation behavior.\\n\\nThe following collation option document specifies a locale value of `fr` for a French language collation:\\n\\n```json\\n{ \"locale\": \"fr\" }\\n```\\n\\nTo review the list of locales that MongoDB collation supports, see the list of languages and locales. To learn more about collation options, including which are enabled by default for each locale, see Collation in the MongoDB manual.\\n\\n#### *(Optional)* Enable building indexes in a rolling fashion.\\n\\nRolling index builds succeed only when they meet certain conditions. To ensure your index build succeeds, avoid the following design patterns that commonly trigger a restart loop:\\n\\n- Index key exceeds the index key limit\\n\\n- Index name already exists\\n\\n- Index on more than one array field\\n\\n- Index on collection that has the maximum number of text indexes\\n\\n- Text index on collection that has the maximum number of text indexes\\n\\nthe Atlas UI doesn\\'t support building indexes with a rolling build for `M0` free clusters and `M2/M5` shared clusters. You can\\'t build indexes with a rolling build for serverless instances.\\n\\nFor workloads which cannot tolerate performance decrease due to index builds, consider building indexes in a rolling fashion.\\n\\nTo maintain cluster availability:\\n\\n- Atlas removes one node from the cluster at a time starting with a secondary.\\n\\n- More than one node can go down at a time, but Atlas always keeps a majority of the nodes online.\\n\\nAtlas automatically cancels rolling index builds that don\\'t succeed on all nodes. When a rolling index build completes on some nodes, but fails on others, Atlas cancels the build and removes the index from any nodes that it was successfully built on.\\n\\nIn the event of a rolling index build cancellation, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Name of the cluster on which the rolling index build failed\\n\\n- Namespace on which the rolling index build failed\\n\\n- Project that contains the cluster and namespace\\n\\n- Organization that contains the project\\n\\n- Link to the activity feed event\\n\\nTo learn more about rebuilding indexes, see Build Indexes on Replica Sets.\\n\\nUnique\\nindex options are incompatible with building indexes in a rolling fashion. If you specify `unique` in the Options pane, Atlas rejects your configuration with an error message.\\n\\n#### Click Review.\\n\\n#### In the Confirm Operation dialog, confirm your index.\\n\\nWhen an index build completes, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Completion date of the index build\\n\\n- Name of the cluster on which the index build completed\\n\\n- Namespace on which the index build completed\\n\\n- Project containing the cluster and namespace\\n\\n- Organization containing the project\\n\\n- Link to the activity feed event\\n\\n', name='get_info_about_mongodb', id='e5bb7c63-71df-428b-b811-8784fec6e2cd', tool_call_id='call_8uC6x6EalTyPlaDn1xHG5bcr')]}\n", - "[HumanMessage(content='How do I improve slow queries in MongoDB?', additional_kwargs={}, response_metadata={}, id='d24196f2-dd7e-4342-9660-7f2a9933b807'), AIMessage(content='', additional_kwargs={'tool_calls': [{'id': 'call_8uC6x6EalTyPlaDn1xHG5bcr', 'function': {'arguments': '{\"user_query\":\"How do I improve slow queries in MongoDB?\"}', 'name': 'get_info_about_mongodb'}, 'type': 'function'}], 'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 27, 'prompt_tokens': 165, 'total_tokens': 192, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-11-20', 'system_fingerprint': 'fp_a523ccd45c', 'finish_reason': 'tool_calls', 'logprobs': None}, id='run-81181db3-2a33-479b-9ee6-f773c47c1275-0', tool_calls=[{'name': 'get_info_about_mongodb', 'args': {'user_query': 'How do I improve slow queries in MongoDB?'}, 'id': 'call_8uC6x6EalTyPlaDn1xHG5bcr', 'type': 'tool_call'}], usage_metadata={'input_tokens': 165, 'output_tokens': 27, 'total_tokens': 192, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}}), ToolMessage(content='# Analyze Slow Queries\\n\\nAtlas provides several tools to help analyze slow queries executed on your clusters. See the following sections for descriptions of each tool. To optimize your query performance, review the best practices for query performance.\\n\\n## Performance Advisor\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance.\\n\\nYou can use the Performance Advisor to review the following information:\\n\\n- Index Ranking\\n\\n- Drop Index Recommendations\\n\\n## Namespace Insights\\n\\nMonitor collection-level query latency with Namespace Insights. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\n## Query Profiler\\n\\nThe Query Profiler displays slow-running operations and their key performance statistics. You can explore a sample of historical queries for up to the last 24 hours without additional cost or performance overhead. Before you enable the Query Profiler, see Considerations.\\n\\n## Real-Time Performance Panel (RTPP)\\n\\nThe Real-Time Performance Panel identifies relevant database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned during query execution. RTPP (Real-Time Performance Panel) is enabled by default.\\n\\nTo enable or disable Real-Time Performance Panel for a project, you must have the `Project Owner` role for the project.\\n\\n## Best Practices for Query Performance\\n\\nTo optimize query performance, review the following best practices:\\n\\n- Create queries that your current indexes support to reduce the time needed to search for your results.\\n\\n- Avoid creating documents with large array fields that require a lot of processing to search and index.\\n\\n- Optimize your indexes and remove unused or inefficent indexes. Too many indexes can negatively impact write performance.\\n\\n- Consider the suggested indexes from the Performance Advisor with the highest Impact scores and lowest Average Query Targeting scores.\\n\\n- Create the indexes that the Performance Advisor suggests when they align with your Indexing Strategies.\\n\\n- The Performance Advisor cannot suggest indexes for MongoDB databases configured to use the ctime timestamp format. As a workaround, set the timestamp format for such databases to either iso8601-utc or iso8601-local.\\n\\n- Perform rolling index builds to reduce the performance impact of building indexes on replica sets and sharded clusters.\\n\\n- Drop unused, redundant, and hidden indexes to improve write performance and free storage space.\\n\\n\\n\\n# Fix Query Issues\\n\\n`Query Targeting` alerts often indicate inefficient queries.\\n\\n## Alert Conditions\\n\\nYou can configure the following alert conditions in the project-level alert settings page to trigger alerts.\\n\\n`Query Targeting: Scanned Objects / Returned` alerts are triggered when the average number of documents scanned relative to the average number of documents returned server-wide across all operations during a sampling period exceeds a defined threshold. The default alert uses a 1000:1 threshold.\\n\\nIdeally, the ratio of scanned documents to returned documents should be close to 1. A high ratio negatively impacts query performance.\\n\\n`Query Targeting: Scanned / Returned` occurs if the number of index keys examined to fulfill a query relative to the actual number of returned documents meets or exceeds a user-defined threshold. This alert is not enabled by default.\\n\\nThe following mongod log entry shows statistics generated from an inefficient query:\\n\\n```json\\n COMMAND \\nplanSummary: COLLSCAN keysExamined:0\\ndocsExamined: 10000 cursorExhausted:1 numYields:234\\nnreturned:4 protocol:op_query 358ms\\n```\\n\\nThis query scanned 10,000 documents and returned only 4 for a ratio of 2500, which is highly inefficient. No index keys were examined, so MongoDB scanned all documents in the collection, known as a collection scan.\\n\\n## Common Triggers\\n\\nThe query targeting alert typically occurs when there is no index to support a query or queries or when an existing index only partially supports a query or queries.\\n\\nThe change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\n## Fix the Immediate Problem\\n\\nAdd one or more indexes to better serve the inefficient queries.\\n\\nThe Performance Advisor provides the easiest and quickest way to create an index. The Performance Advisor monitors queries that MongoDB considers slow and recommends indexes to improve performance. Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster.\\n\\nClick Create Index on a slow query for instructions on how to create the recommended index.\\n\\nIt is possible to receive a Query Targeting alert for an inefficient query without receiving index suggestions from the Performance Advisor if the query exceeds the slow query threshold and the ratio of scanned to returned documents is greater than the threshold specified in the alert.\\n\\nIn addition, you can use the following resources to determine which query generated the alert:\\n\\n- The Real-Time Performance Panel monitors and displays current network traffic and database operations on machines hosting MongoDB in your Atlas clusters.\\n\\n- The MongoDB logs maintain an account of activity, including queries, for each `mongod` instance in your Atlas clusters.\\n\\n- The cursor.explain() command for `mongosh` provides performance details for all queries.\\n\\n- Namespace Insights monitors collection-level query latency.\\n\\n- The Atlas Query Profiler records operations that Atlas considers slow when compared to average execution time for all operations on your cluster.\\n\\n## Implement a Long-Term Solution\\n\\nRefer to the following for more information on query performance:\\n\\n- MongoDB Indexing Strategies\\n\\n- Query Optimization\\n\\n- Analyze Query Plan\\n\\n## Monitor Your Progress\\n\\nAtlas provides the following methods to visualize query targeting:\\n\\n- Query Targeting metrics, which highlight high ratios of objects scanned to objects returned.\\n\\n- Namespace Insights, which monitors collection-level query latency.\\n\\n- The Query Profiler, which describes specific inefficient queries executed on the cluster.\\n\\n### Query Targeting Metrics\\n\\nYou can view historical metrics to help you visualize the query performance of your cluster. To view Query Targeting metrics in the Atlas UI:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. On the Metrics page, click the Add Chart dropdown menu and select Query Targeting.\\n\\nThe Query Targeting chart displays the following metrics for queries executed on the server:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nScanned Objects / Returned\\n\\n\\nIndicates the average number of documents examined relative to the average number of returned documents.\\n\\n
\\nScanned / Returned\\n\\n\\nIndicates the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\n
The change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\nIf either of these metrics exceed the user-defined threshold, Atlas generates the corresponding `Query Targeting: Scanned Objects / Returned` or `Query Targeting: Scanned / Returned` alert.\\n\\nYou can also view Query Targeting ratios of operations in real-time using the Real-Time Performance Panel.\\n\\n### Namespace Insights\\n\\nNamespace Insights monitors collection-level query latency. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\nTo access Namespace Insights:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Namespace Insights tab.\\n\\n### Query Profiler\\n\\nThe Query Profiler contains several metrics you can use to pinpoint specific inefficient queries. You can visualize up to the past 24 hours of query operations. The Query Profiler can show the Examined : Returned Ratio (index keys examined to documents returned) of logged queries, which might help you identify the queries that triggered a `Query Targeting: Scanned / Returned` alert. The chart shows the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\nThe default\\n`Query Targeting: Scanned Objects / Returned` alert ratio differs slightly. The ratio of the average number of documents scanned to the average number of documents returned during a sampling period triggers this alert.\\n\\nAtlas might not log the individual operations that contribute to the Query Targeting ratios due to automatically set thresholds. However, you can still use the Query Profiler and Query Targeting metrics to analyze and optimize query performance.\\n\\nTo access the Query Profiler:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Query Profiler tab.\\n\\n\\n\\n# Monitor and Improve Slow Queries\\n\\n*Only available on M10+ clusters and serverless instances*\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance. The threshold for slow queries varies based on the average time of operations on your cluster to provide recommendations pertinent to your workload.\\n\\nRecommended indexes are accompanied by sample queries, grouped by query shape, that were run against a collection that would benefit from the suggested index. The Performance Advisor doesn\\'t negatively affect the performance of your Atlas clusters.\\n\\nYou can also monitor collection-level query latency with Namespace Insights and query performance with the Query Profiler.\\n\\nIf the slow query log contains consecutive `$match` stages in the aggregation pipeline, the two stages can coalesce into the first `$match` stage and result in a single `$match` stage. As a result, the query shape in the Performance Advisor might differ from the actual query you ran.\\n\\n## Common Reasons for Slow Queries\\n\\nIf a query is slow, common reasons include:\\n\\n- The query is unsupported by your current indexes.\\n\\n- Some documents in your collection have large array fields that are costly to search and index.\\n\\n- One query retrieves information from multiple collections with $lookup.\\n\\n## Required Access\\n\\nTo view collections with slow queries and see suggested indexes, you must have `Project Read Only` access or higher to the project.\\n\\nTo view field values in a sample query in the Performance Advisor, you must have `Project Data Access Read/Write` access or higher to the project.\\n\\nTo enable or disable the Atlas-managed slow operation threshold, you must have `Project Owner` access to the project. Users with `Organization Owner` access must add themselves to the project as a `Project Owner`.\\n\\n## Configure the Slow Query Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. However, you can opt out of this feature and instead use a fixed slow query threshold of 100 milliseconds. You can disable the Atlas-managed slow operation threshold with the Atlas CLI, Atlas Administration API, or Atlas UI.\\n\\nAtlas clusters with Atlas Search enabled don\\'t support the Atlas-managed slow query operation threshold.\\n\\nFor `M0`, `M2`, `M5` clusters and serverless instances, Atlas disables the Atlas-managed slow query operation threshold by default and you can\\'t enable it.\\n\\n### Disable the Atlas-Managed Slow Operation Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. If you disable the Atlas-managed slow query threshold, it no longer dynamically adjusts. MongoDB defaults the fixed slow query threshold to 100 milliseconds. We don\\'t recommend that you set the fixed slow query threshold lower than 100 milliseconds.\\n\\nTo disable the Atlas-managed slow operation threshold and use a fixed threshold of 100 milliseconds:\\n\\n\\n\\n\\n\\nTo disable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold disable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold disable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Disable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to Off.\\n\\n\\n\\n\\n\\n### Enable the Atlas-Managed Slow Operation Threshold\\n\\nAtlas enables the Atlas-managed slow operation threshold by default. To re-enable the Atlas-managed slow operation threshold that you previously disabled:\\n\\n\\n\\n\\n\\nTo enable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold enable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold enable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Enable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to On.\\n\\n\\n\\n\\n\\n## Index Considerations\\n\\nIndexes improve read performance, but a large number of indexes can negatively impact write performance since indexes must be updated during writes. If your collection already has several indexes, consider this tradeoff of read and write performance when deciding whether to create new indexes. Examine whether a query for such a collection can be modified to take advantage of existing indexes, as well as whether a query occurs often enough to justify the cost of a new index.\\n\\n## Access Performance Advisor\\n\\n\\n\\n\\n\\n### View Collections with Slow Queries\\n\\nTo return up to 20 namespaces in `.` format for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor namespaces list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor namespaces list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Slow Query Logs\\n\\nTo return query log line items for slow queries that the Performance Advisor and Query Profiler identify using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowQueryLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowQueryLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Suggested Indexes\\n\\nTo return suggested indexes for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor suggestedIndexes list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor suggestedIndexes list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo access the Performance Advisor using the Atlas UI:\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the replica set where the collection resides.\\n\\nIf the replica set resides in a sharded cluster, first click the sharded cluster containing the replica set.\\n\\n### Click Performance Advisor.\\n\\n### Select a collection from the Collections dropdown.\\n\\n### Select a time period from the Time Range dropdown.\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the serverless instance.\\n\\n### Click Performance Advisor.\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nThe Performance Advisor displays up to 20 query shapes across all collections in the cluster and suggested indexes for those shapes. The Performance Advisor ranks the indexes according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about index ranking, see Review Index Ranking.\\n\\n## Index Suggestions\\n\\nThe Performance Advisor ranks the indexes that it suggests according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about how the Performance Advisor ranks indexes, see Review Index Ranking.\\n\\nTo learn how to create indexes that the Performance Advisor suggests, see Create Suggested Indexes.\\n\\n### Index Metrics\\n\\nEach index that the Performance Advisor suggests contains the following metrics. These metrics apply specifically to queries which would be improved by the index:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which would be improved.\\n\\n
\\nAverage Execution Time\\n\\n\\nCurrent average execution time in milliseconds for affected queries.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read per document returned by affected queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nIn Memory Sort\\n\\n\\nCurrent number of affected queries per hour that needed to be sorted in memory.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
\\nAverage Object Size\\n\\n\\nAverage object size.\\n\\n
\\n\\n### Sample Queries\\n\\nFor each suggested index, the Performance Advisor shows the most commonly executed query shapes that the index would improve. For each query shape, the Performance Advisor displays the following metrics:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which match the query shape.\\n\\n
\\nAverage Execution Time\\n\\n\\nAverage execution time in milliseconds for queries which match the query shape.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read for every document returned by matching queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
The Performance Advisor also shows each executed sample query that matches the query shape, with specific metrics for that query.\\n\\n### Query Targeting\\n\\nEach index suggestion includes an Average Query Targeting score indicating how many documents were read for every document returned for the index\\'s corresponding query shapes. A score of 1 represents very efficient query shapes because every document read matched the query and was returned with the query results. All suggested indexes represent an opportunity to improve query performance.\\n\\n### Filter Index Suggestions\\n\\nBy default, the Performance Advisor suggests indexes for all clusters in the deployment. To only show suggested indexes from a specific collection, use the Collection dropdown at the top of the Performance Advisor.\\n\\nYou can also adjust the time range the Performance Advisor takes into account when suggesting indexes by using the Time Range dropdown at the top of the Performance Advisor.\\n\\n### Limitations of Index Suggestions\\n\\n#### Timestamp Format\\n\\nThe Performance Advisor can\\'t suggest indexes for MongoDB databases configured to use the `ctime` timestamp format. As a workaround, set the timestamp format for such databases to either `iso8601-utc` or `iso8601-local`. To learn more about timestamp formats, see mongod --timeStampFormat.\\n\\n#### Log Size\\n\\nThe Performance Advisor analyzes up to 200,000 of your cluster\\'s most recent log lines.\\n\\n#### Log Quantity\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\n#### Time-Series Collections\\n\\nThe Performance Advisor doesn\\'t provide performance suggestions for time-series collections.\\n\\n#### User Feedback\\n\\nThe Performance Advisor includes a user feedback button for Index Suggestions. Atlas hides this button for serverless instances.\\n\\n## Create Suggested Indexes\\n\\nYou can create indexes suggested by the Performance Advisor directly within the Performance Advisor itself. When you create indexes, keep the ratio of reads to writes on the target collection in mind. Indexes come with a performance cost, but are more than worth the cost for frequent queries on large data sets. To learn more about indexing strategies, see Indexing Strategies.\\n\\n### Behavior and Limitations\\n\\n- You can\\'t create indexes through the Performance Advisor if Data Explorer is disabled for your project. You can still view the Performance Advisor recommendations, but you must create those indexes from `mongosh`.\\n\\n- You can only create one index at a time through the Performance Advisor. If you want to create more simultaneously, you can do so using the Atlas UI, a driver, or the shell\\n\\n- Atlas always creates indexes for entire clusters. If you create an index while viewing the Performance Advisor for a single shard in a sharded cluster, Atlas creates that index for the entire sharded cluster.\\n\\n### Procedure\\n\\nTo create a suggested index:\\n\\n#### For the index you want to create, click Create Index.\\n\\nThe Performance Advisor opens the Create Index dialog and prepopulates the Fields based on the index you selected.\\n\\n#### *(Optional)* Specify the index options.\\n\\n```javascript\\n{ : , ... }\\n```\\n\\nThe following options document specifies the `unique` option and the `name` for the index:\\n\\n```javascript\\n{ unique: true, name: \"myUniqueIndex\" }\\n```\\n\\n#### *(Optional)* Set the Collation options.\\n\\nUse collation to specify language-specific rules for string comparison, such as rules for lettercase and accent marks. The collation document contains a `locale` field which indicates the ICU Locale code, and may contain other fields to define collation behavior.\\n\\nThe following collation option document specifies a locale value of `fr` for a French language collation:\\n\\n```json\\n{ \"locale\": \"fr\" }\\n```\\n\\nTo review the list of locales that MongoDB collation supports, see the list of languages and locales. To learn more about collation options, including which are enabled by default for each locale, see Collation in the MongoDB manual.\\n\\n#### *(Optional)* Enable building indexes in a rolling fashion.\\n\\nRolling index builds succeed only when they meet certain conditions. To ensure your index build succeeds, avoid the following design patterns that commonly trigger a restart loop:\\n\\n- Index key exceeds the index key limit\\n\\n- Index name already exists\\n\\n- Index on more than one array field\\n\\n- Index on collection that has the maximum number of text indexes\\n\\n- Text index on collection that has the maximum number of text indexes\\n\\nthe Atlas UI doesn\\'t support building indexes with a rolling build for `M0` free clusters and `M2/M5` shared clusters. You can\\'t build indexes with a rolling build for serverless instances.\\n\\nFor workloads which cannot tolerate performance decrease due to index builds, consider building indexes in a rolling fashion.\\n\\nTo maintain cluster availability:\\n\\n- Atlas removes one node from the cluster at a time starting with a secondary.\\n\\n- More than one node can go down at a time, but Atlas always keeps a majority of the nodes online.\\n\\nAtlas automatically cancels rolling index builds that don\\'t succeed on all nodes. When a rolling index build completes on some nodes, but fails on others, Atlas cancels the build and removes the index from any nodes that it was successfully built on.\\n\\nIn the event of a rolling index build cancellation, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Name of the cluster on which the rolling index build failed\\n\\n- Namespace on which the rolling index build failed\\n\\n- Project that contains the cluster and namespace\\n\\n- Organization that contains the project\\n\\n- Link to the activity feed event\\n\\nTo learn more about rebuilding indexes, see Build Indexes on Replica Sets.\\n\\nUnique\\nindex options are incompatible with building indexes in a rolling fashion. If you specify `unique` in the Options pane, Atlas rejects your configuration with an error message.\\n\\n#### Click Review.\\n\\n#### In the Confirm Operation dialog, confirm your index.\\n\\nWhen an index build completes, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Completion date of the index build\\n\\n- Name of the cluster on which the index build completed\\n\\n- Namespace on which the index build completed\\n\\n- Project containing the cluster and namespace\\n\\n- Organization containing the project\\n\\n- Link to the activity feed event\\n\\n', name='get_info_about_mongodb', id='e5bb7c63-71df-428b-b811-8784fec6e2cd', tool_call_id='call_8uC6x6EalTyPlaDn1xHG5bcr')]\n", + "{'messages': [ToolMessage(content='# Monitor and Improve Slow Queries\\n\\n*Only available on M10+ clusters and serverless instances*\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance. The threshold for slow queries varies based on the average time of operations on your cluster to provide recommendations pertinent to your workload.\\n\\nRecommended indexes are accompanied by sample queries, grouped by query shape, that were run against a collection that would benefit from the suggested index. The Performance Advisor doesn\\'t negatively affect the performance of your Atlas clusters.\\n\\nYou can also monitor collection-level query latency with Namespace Insights and query performance with the Query Profiler.\\n\\nIf the slow query log contains consecutive `$match` stages in the aggregation pipeline, the two stages can coalesce into the first `$match` stage and result in a single `$match` stage. As a result, the query shape in the Performance Advisor might differ from the actual query you ran.\\n\\n## Common Reasons for Slow Queries\\n\\nIf a query is slow, common reasons include:\\n\\n- The query is unsupported by your current indexes.\\n\\n- Some documents in your collection have large array fields that are costly to search and index.\\n\\n- One query retrieves information from multiple collections with $lookup.\\n\\n## Required Access\\n\\nTo view collections with slow queries and see suggested indexes, you must have `Project Read Only` access or higher to the project.\\n\\nTo view field values in a sample query in the Performance Advisor, you must have `Project Data Access Read/Write` access or higher to the project.\\n\\nTo enable or disable the Atlas-managed slow operation threshold, you must have `Project Owner` access to the project. Users with `Organization Owner` access must add themselves to the project as a `Project Owner`.\\n\\n## Configure the Slow Query Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. However, you can opt out of this feature and instead use a fixed slow query threshold of 100 milliseconds. You can disable the Atlas-managed slow operation threshold with the Atlas CLI, Atlas Administration API, or Atlas UI.\\n\\nAtlas clusters with Atlas Search enabled don\\'t support the Atlas-managed slow query operation threshold.\\n\\nFor `M0`, `M2`, `M5` clusters and serverless instances, Atlas disables the Atlas-managed slow query operation threshold by default and you can\\'t enable it.\\n\\n### Disable the Atlas-Managed Slow Operation Threshold\\n\\nBy default, Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster. If you disable the Atlas-managed slow query threshold, it no longer dynamically adjusts. MongoDB defaults the fixed slow query threshold to 100 milliseconds. We don\\'t recommend that you set the fixed slow query threshold lower than 100 milliseconds.\\n\\nTo disable the Atlas-managed slow operation threshold and use a fixed threshold of 100 milliseconds:\\n\\n\\n\\n\\n\\nTo disable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold disable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold disable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Disable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to Off.\\n\\n\\n\\n\\n\\n### Enable the Atlas-Managed Slow Operation Threshold\\n\\nAtlas enables the Atlas-managed slow operation threshold by default. To re-enable the Atlas-managed slow operation threshold that you previously disabled:\\n\\n\\n\\n\\n\\nTo enable the Atlas-managed slow operation threshold for your project using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowOperationThreshold enable [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowOperationThreshold enable.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nSee Enable Managed Slow Operation Threshold.\\n\\n\\n\\n\\n\\nIn the Project Settings for the current project, toggle Managed Slow Operations to On.\\n\\n\\n\\n\\n\\n## Index Considerations\\n\\nIndexes improve read performance, but a large number of indexes can negatively impact write performance since indexes must be updated during writes. If your collection already has several indexes, consider this tradeoff of read and write performance when deciding whether to create new indexes. Examine whether a query for such a collection can be modified to take advantage of existing indexes, as well as whether a query occurs often enough to justify the cost of a new index.\\n\\n## Access Performance Advisor\\n\\n\\n\\n\\n\\n### View Collections with Slow Queries\\n\\nTo return up to 20 namespaces in `.` format for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor namespaces list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor namespaces list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Slow Query Logs\\n\\nTo return query log line items for slow queries that the Performance Advisor and Query Profiler identify using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor slowQueryLogs list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor slowQueryLogs list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n### View Suggested Indexes\\n\\nTo return suggested indexes for collections experiencing slow queries using the Atlas CLI, run the following command:\\n\\n```sh\\n\\natlas performanceAdvisor suggestedIndexes list [options]\\n\\n```\\n\\nTo learn more about the command syntax and parameters, see the Atlas CLI documentation for atlas performanceAdvisor suggestedIndexes list.\\n\\n- Install the Atlas CLI\\n\\n- Connect to the Atlas CLI\\n\\n\\n\\n\\n\\nTo access the Performance Advisor using the Atlas UI:\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the replica set where the collection resides.\\n\\nIf the replica set resides in a sharded cluster, first click the sharded cluster containing the replica set.\\n\\n### Click Performance Advisor.\\n\\n### Select a collection from the Collections dropdown.\\n\\n### Select a time period from the Time Range dropdown.\\n\\n\\n\\n\\n\\n### Click Database.\\n\\n### Click the serverless instance.\\n\\n### Click Performance Advisor.\\n\\n\\n\\n\\n\\n\\n\\n\\n\\nThe Performance Advisor displays up to 20 query shapes across all collections in the cluster and suggested indexes for those shapes. The Performance Advisor ranks the indexes according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about index ranking, see Review Index Ranking.\\n\\n## Index Suggestions\\n\\nThe Performance Advisor ranks the indexes that it suggests according to their Impact, which indicates High or Medium based on the total wasted bytes read. To learn more about how the Performance Advisor ranks indexes, see Review Index Ranking.\\n\\nTo learn how to create indexes that the Performance Advisor suggests, see Create Suggested Indexes.\\n\\n### Index Metrics\\n\\nEach index that the Performance Advisor suggests contains the following metrics. These metrics apply specifically to queries which would be improved by the index:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which would be improved.\\n\\n
\\nAverage Execution Time\\n\\n\\nCurrent average execution time in milliseconds for affected queries.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read per document returned by affected queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nIn Memory Sort\\n\\n\\nCurrent number of affected queries per hour that needed to be sorted in memory.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
\\nAverage Object Size\\n\\n\\nAverage object size.\\n\\n
\\n\\n### Sample Queries\\n\\nFor each suggested index, the Performance Advisor shows the most commonly executed query shapes that the index would improve. For each query shape, the Performance Advisor displays the following metrics:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nExecution Count\\n\\n\\nNumber of queries executed per hour which match the query shape.\\n\\n
\\nAverage Execution Time\\n\\n\\nAverage execution time in milliseconds for queries which match the query shape.\\n\\n
\\nAverage Query Targeting\\n\\n\\nAverage number of documents read for every document returned by matching queries. A higher query targeting score indicates a greater degree of inefficiency. For more information on query targeting, see Query Targeting.\\n\\n
\\nAverage Docs Scanned\\n\\n\\nAverage number of documents scanned.\\n\\n
\\nAverage Docs Returned\\n\\n\\nAverage number of documents returned.\\n\\n
The Performance Advisor also shows each executed sample query that matches the query shape, with specific metrics for that query.\\n\\n### Query Targeting\\n\\nEach index suggestion includes an Average Query Targeting score indicating how many documents were read for every document returned for the index\\'s corresponding query shapes. A score of 1 represents very efficient query shapes because every document read matched the query and was returned with the query results. All suggested indexes represent an opportunity to improve query performance.\\n\\n### Filter Index Suggestions\\n\\nBy default, the Performance Advisor suggests indexes for all clusters in the deployment. To only show suggested indexes from a specific collection, use the Collection dropdown at the top of the Performance Advisor.\\n\\nYou can also adjust the time range the Performance Advisor takes into account when suggesting indexes by using the Time Range dropdown at the top of the Performance Advisor.\\n\\n### Limitations of Index Suggestions\\n\\n#### Timestamp Format\\n\\nThe Performance Advisor can\\'t suggest indexes for MongoDB databases configured to use the `ctime` timestamp format. As a workaround, set the timestamp format for such databases to either `iso8601-utc` or `iso8601-local`. To learn more about timestamp formats, see mongod --timeStampFormat.\\n\\n#### Log Size\\n\\nThe Performance Advisor analyzes up to 200,000 of your cluster\\'s most recent log lines.\\n\\n#### Log Quantity\\n\\nIf a cluster experiences an activity spike and generates an extremely large quantity of log messages, Atlas may stop collecting and storing new logs for a period of time.\\n\\nLog analysis rate limits apply only to the Performance Advisor UI, the Query Insights UI, the Access Tracking UI, and the Atlas Search Query Analytics UI. Downloadable log files are always complete.\\n\\n#### Time-Series Collections\\n\\nThe Performance Advisor doesn\\'t provide performance suggestions for time-series collections.\\n\\n#### User Feedback\\n\\nThe Performance Advisor includes a user feedback button for Index Suggestions. Atlas hides this button for serverless instances.\\n\\n## Create Suggested Indexes\\n\\nYou can create indexes suggested by the Performance Advisor directly within the Performance Advisor itself. When you create indexes, keep the ratio of reads to writes on the target collection in mind. Indexes come with a performance cost, but are more than worth the cost for frequent queries on large data sets. To learn more about indexing strategies, see Indexing Strategies.\\n\\n### Behavior and Limitations\\n\\n- You can\\'t create indexes through the Performance Advisor if Data Explorer is disabled for your project. You can still view the Performance Advisor recommendations, but you must create those indexes from `mongosh`.\\n\\n- You can only create one index at a time through the Performance Advisor. If you want to create more simultaneously, you can do so using the Atlas UI, a driver, or the shell\\n\\n- Atlas always creates indexes for entire clusters. If you create an index while viewing the Performance Advisor for a single shard in a sharded cluster, Atlas creates that index for the entire sharded cluster.\\n\\n### Procedure\\n\\nTo create a suggested index:\\n\\n#### For the index you want to create, click Create Index.\\n\\nThe Performance Advisor opens the Create Index dialog and prepopulates the Fields based on the index you selected.\\n\\n#### *(Optional)* Specify the index options.\\n\\n```javascript\\n{ : , ... }\\n```\\n\\nThe following options document specifies the `unique` option and the `name` for the index:\\n\\n```javascript\\n{ unique: true, name: \"myUniqueIndex\" }\\n```\\n\\n#### *(Optional)* Set the Collation options.\\n\\nUse collation to specify language-specific rules for string comparison, such as rules for lettercase and accent marks. The collation document contains a `locale` field which indicates the ICU Locale code, and may contain other fields to define collation behavior.\\n\\nThe following collation option document specifies a locale value of `fr` for a French language collation:\\n\\n```json\\n{ \"locale\": \"fr\" }\\n```\\n\\nTo review the list of locales that MongoDB collation supports, see the list of languages and locales. To learn more about collation options, including which are enabled by default for each locale, see Collation in the MongoDB manual.\\n\\n#### *(Optional)* Enable building indexes in a rolling fashion.\\n\\nRolling index builds succeed only when they meet certain conditions. To ensure your index build succeeds, avoid the following design patterns that commonly trigger a restart loop:\\n\\n- Index key exceeds the index key limit\\n\\n- Index name already exists\\n\\n- Index on more than one array field\\n\\n- Index on collection that has the maximum number of text indexes\\n\\n- Text index on collection that has the maximum number of text indexes\\n\\nthe Atlas UI doesn\\'t support building indexes with a rolling build for `M0` free clusters and `M2/M5` shared clusters. You can\\'t build indexes with a rolling build for serverless instances.\\n\\nFor workloads which cannot tolerate performance decrease due to index builds, consider building indexes in a rolling fashion.\\n\\nTo maintain cluster availability:\\n\\n- Atlas removes one node from the cluster at a time starting with a secondary.\\n\\n- More than one node can go down at a time, but Atlas always keeps a majority of the nodes online.\\n\\nAtlas automatically cancels rolling index builds that don\\'t succeed on all nodes. When a rolling index build completes on some nodes, but fails on others, Atlas cancels the build and removes the index from any nodes that it was successfully built on.\\n\\nIn the event of a rolling index build cancellation, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Name of the cluster on which the rolling index build failed\\n\\n- Namespace on which the rolling index build failed\\n\\n- Project that contains the cluster and namespace\\n\\n- Organization that contains the project\\n\\n- Link to the activity feed event\\n\\nTo learn more about rebuilding indexes, see Build Indexes on Replica Sets.\\n\\nUnique\\nindex options are incompatible with building indexes in a rolling fashion. If you specify `unique` in the Options pane, Atlas rejects your configuration with an error message.\\n\\n#### Click Review.\\n\\n#### In the Confirm Operation dialog, confirm your index.\\n\\nWhen an index build completes, Atlas generates an activity feed event and sends a notification email to the project owner with the following information:\\n\\n- Completion date of the index build\\n\\n- Name of the cluster on which the index build completed\\n\\n- Namespace on which the index build completed\\n\\n- Project containing the cluster and namespace\\n\\n- Organization containing the project\\n\\n- Link to the activity feed event\\n\\n\\n\\n# Fix Query Issues\\n\\n`Query Targeting` alerts often indicate inefficient queries.\\n\\n## Alert Conditions\\n\\nYou can configure the following alert conditions in the project-level alert settings page to trigger alerts.\\n\\n`Query Targeting: Scanned Objects / Returned` alerts are triggered when the average number of documents scanned relative to the average number of documents returned server-wide across all operations during a sampling period exceeds a defined threshold. The default alert uses a 1000:1 threshold.\\n\\nIdeally, the ratio of scanned documents to returned documents should be close to 1. A high ratio negatively impacts query performance.\\n\\n`Query Targeting: Scanned / Returned` occurs if the number of index keys examined to fulfill a query relative to the actual number of returned documents meets or exceeds a user-defined threshold. This alert is not enabled by default.\\n\\nThe following mongod log entry shows statistics generated from an inefficient query:\\n\\n```json\\n COMMAND \\nplanSummary: COLLSCAN keysExamined:0\\ndocsExamined: 10000 cursorExhausted:1 numYields:234\\nnreturned:4 protocol:op_query 358ms\\n```\\n\\nThis query scanned 10,000 documents and returned only 4 for a ratio of 2500, which is highly inefficient. No index keys were examined, so MongoDB scanned all documents in the collection, known as a collection scan.\\n\\n## Common Triggers\\n\\nThe query targeting alert typically occurs when there is no index to support a query or queries or when an existing index only partially supports a query or queries.\\n\\nThe change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\n## Fix the Immediate Problem\\n\\nAdd one or more indexes to better serve the inefficient queries.\\n\\nThe Performance Advisor provides the easiest and quickest way to create an index. The Performance Advisor monitors queries that MongoDB considers slow and recommends indexes to improve performance. Atlas dynamically adjusts your slow query threshold based on the execution time of operations across your cluster.\\n\\nClick Create Index on a slow query for instructions on how to create the recommended index.\\n\\nIt is possible to receive a Query Targeting alert for an inefficient query without receiving index suggestions from the Performance Advisor if the query exceeds the slow query threshold and the ratio of scanned to returned documents is greater than the threshold specified in the alert.\\n\\nIn addition, you can use the following resources to determine which query generated the alert:\\n\\n- The Real-Time Performance Panel monitors and displays current network traffic and database operations on machines hosting MongoDB in your Atlas clusters.\\n\\n- The MongoDB logs maintain an account of activity, including queries, for each `mongod` instance in your Atlas clusters.\\n\\n- The cursor.explain() command for `mongosh` provides performance details for all queries.\\n\\n- Namespace Insights monitors collection-level query latency.\\n\\n- The Atlas Query Profiler records operations that Atlas considers slow when compared to average execution time for all operations on your cluster.\\n\\n## Implement a Long-Term Solution\\n\\nRefer to the following for more information on query performance:\\n\\n- MongoDB Indexing Strategies\\n\\n- Query Optimization\\n\\n- Analyze Query Plan\\n\\n## Monitor Your Progress\\n\\nAtlas provides the following methods to visualize query targeting:\\n\\n- Query Targeting metrics, which highlight high ratios of objects scanned to objects returned.\\n\\n- Namespace Insights, which monitors collection-level query latency.\\n\\n- The Query Profiler, which describes specific inefficient queries executed on the cluster.\\n\\n### Query Targeting Metrics\\n\\nYou can view historical metrics to help you visualize the query performance of your cluster. To view Query Targeting metrics in the Atlas UI:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. On the Metrics page, click the Add Chart dropdown menu and select Query Targeting.\\n\\nThe Query Targeting chart displays the following metrics for queries executed on the server:\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n
\\nMetric\\n\\n\\nDescription\\n\\n
\\nScanned Objects / Returned\\n\\n\\nIndicates the average number of documents examined relative to the average number of returned documents.\\n\\n
\\nScanned / Returned\\n\\n\\nIndicates the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\n
The change streams cursors that the Atlas Search process (`mongot`) uses to keep Atlas Search indexes updated can contribute to the query targeting ratio and trigger query targeting alerts if the ratio is high.\\n\\nIf either of these metrics exceed the user-defined threshold, Atlas generates the corresponding `Query Targeting: Scanned Objects / Returned` or `Query Targeting: Scanned / Returned` alert.\\n\\nYou can also view Query Targeting ratios of operations in real-time using the Real-Time Performance Panel.\\n\\n### Namespace Insights\\n\\nNamespace Insights monitors collection-level query latency. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\nTo access Namespace Insights:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Namespace Insights tab.\\n\\n### Query Profiler\\n\\nThe Query Profiler contains several metrics you can use to pinpoint specific inefficient queries. You can visualize up to the past 24 hours of query operations. The Query Profiler can show the Examined : Returned Ratio (index keys examined to documents returned) of logged queries, which might help you identify the queries that triggered a `Query Targeting: Scanned / Returned` alert. The chart shows the number of index keys examined to fulfill a query relative to the actual number of returned documents.\\n\\nThe default\\n`Query Targeting: Scanned Objects / Returned` alert ratio differs slightly. The ratio of the average number of documents scanned to the average number of documents returned during a sampling period triggers this alert.\\n\\nAtlas might not log the individual operations that contribute to the Query Targeting ratios due to automatically set thresholds. However, you can still use the Query Profiler and Query Targeting metrics to analyze and optimize query performance.\\n\\nTo access the Query Profiler:\\n\\n1. Click Database in the top-left corner of Atlas.\\n\\n2. Click View Monitoring on the dashboard for the cluster.\\n\\n3. Click the Query Insights tab.\\n\\n4. Click the Query Profiler tab.\\n\\n\\n\\n# Analyze Slow Queries\\n\\nAtlas provides several tools to help analyze slow queries executed on your clusters. See the following sections for descriptions of each tool. To optimize your query performance, review the best practices for query performance.\\n\\n## Performance Advisor\\n\\nThe Performance Advisor monitors queries that MongoDB considers slow and suggests new indexes to improve query performance.\\n\\nYou can use the Performance Advisor to review the following information:\\n\\n- Index Ranking\\n\\n- Drop Index Recommendations\\n\\n## Namespace Insights\\n\\nMonitor collection-level query latency with Namespace Insights. You can view query latency metrics and statistics for certain hosts and operation types. Manage pinned namespaces and choose up to five namespaces to show in the corresponding query latency charts.\\n\\n## Query Profiler\\n\\nThe Query Profiler displays slow-running operations and their key performance statistics. You can explore a sample of historical queries for up to the last 24 hours without additional cost or performance overhead. Before you enable the Query Profiler, see Considerations.\\n\\n## Real-Time Performance Panel (RTPP)\\n\\nThe Real-Time Performance Panel identifies relevant database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned during query execution. RTPP (Real-Time Performance Panel) is enabled by default.\\n\\nTo enable or disable Real-Time Performance Panel for a project, you must have the `Project Owner` role for the project.\\n\\n## Best Practices for Query Performance\\n\\nTo optimize query performance, review the following best practices:\\n\\n- Create queries that your current indexes support to reduce the time needed to search for your results.\\n\\n- Avoid creating documents with large array fields that require a lot of processing to search and index.\\n\\n- Optimize your indexes and remove unused or inefficent indexes. Too many indexes can negatively impact write performance.\\n\\n- Consider the suggested indexes from the Performance Advisor with the highest Impact scores and lowest Average Query Targeting scores.\\n\\n- Create the indexes that the Performance Advisor suggests when they align with your Indexing Strategies.\\n\\n- The Performance Advisor cannot suggest indexes for MongoDB databases configured to use the ctime timestamp format. As a workaround, set the timestamp format for such databases to either iso8601-utc or iso8601-local.\\n\\n- Perform rolling index builds to reduce the performance impact of building indexes on replica sets and sharded clusters.\\n\\n- Drop unused, redundant, and hidden indexes to improve write performance and free storage space.\\n\\n', name='get_info_about_mongodb', id='58b5fb08-1776-49d8-a6f6-956431f77388', tool_call_id='call_sifH0mrhbpesQie4BTnQytNk')]}\n", "Node agent:\n", - "{'messages': [AIMessage(content=\"To improve slow queries in MongoDB, you can follow these steps and best practices:\\n\\n### Tools and Features to Analyze and Optimize Queries:\\n1. **Performance Advisor**:\\n - Monitors slow queries and suggests indexes to improve performance.\\n - Provides recommendations based on query shapes and their impact.\\n\\n2. **Query Profiler**:\\n - Displays slow-running operations and their performance statistics.\\n - Allows you to explore historical queries for up to 24 hours.\\n\\n3. **Real-Time Performance Panel (RTPP)**:\\n - Identifies database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned.\\n\\n4. **Namespace Insights**:\\n - Monitors collection-level query latency and provides metrics for specific hosts and operation types.\\n\\n5. **Query Targeting Metrics**:\\n - Highlights inefficiencies in queries by showing the ratio of scanned objects to returned objects.\\n\\n### Best Practices for Query Performance:\\n1. **Indexing**:\\n - Create indexes that support your queries to reduce search time.\\n - Use the Performance Advisor to identify and create suggested indexes.\\n - Remove unused or inefficient indexes to improve write performance.\\n\\n2. **Query Design**:\\n - Avoid queries that require scanning large arrays or documents.\\n - Optimize queries to take advantage of existing indexes.\\n\\n3. **Rolling Index Builds**:\\n - For replica sets and sharded clusters, perform rolling index builds to minimize performance impact.\\n\\n4. **Monitor Query Targeting**:\\n - Ensure the ratio of scanned documents to returned documents is close to 1 for efficiency.\\n - Address alerts for high ratios by adding appropriate indexes.\\n\\n5. **Analyze Query Plans**:\\n - Use the `explain()` method to understand query execution and identify bottlenecks.\\n\\n6. **Avoid Over-Indexing**:\\n - Too many indexes can negatively impact write performance. Balance the trade-off between read and write performance.\\n\\n### Common Reasons for Slow Queries:\\n- Queries are unsupported by current indexes.\\n- Documents have large array fields that are costly to search.\\n- Queries involve multiple collections with `$lookup`.\\n\\n### Steps to Fix Slow Queries:\\n1. **Immediate Fix**:\\n - Add indexes to support inefficient queries.\\n - Use the Performance Advisor to create recommended indexes.\\n\\n2. **Long-Term Solution**:\\n - Optimize query design and indexing strategies.\\n - Regularly monitor query performance using tools like the Query Profiler and Namespace Insights.\\n\\n3. **Monitor Progress**:\\n - Use Query Targeting metrics and Namespace Insights to track improvements.\\n\\nBy following these steps and leveraging MongoDB's tools, you can significantly improve the performance of slow queries.\", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 536, 'prompt_tokens': 5355, 'total_tokens': 5891, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-11-20', 'system_fingerprint': 'fp_a523ccd45c', 'finish_reason': 'stop', 'logprobs': None}, id='run-73908bfe-67dc-4ce7-971e-1ca3265720cb-0', usage_metadata={'input_tokens': 5355, 'output_tokens': 536, 'total_tokens': 5891, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}\n", + "{'messages': [AIMessage(content=\"To improve slow queries in MongoDB, you can follow these steps:\\n\\n### 1. **Analyze the Problem**\\n - Use the **Performance Advisor** to monitor slow queries and get index recommendations.\\n - Check the **Query Profiler** to identify slow-running operations and their key performance statistics.\\n - Use **Namespace Insights** to monitor collection-level query latency.\\n - Analyze the **Real-Time Performance Panel (RTPP)** for real-time query execution metrics.\\n\\n### 2. **Common Causes of Slow Queries**\\n - Queries are not supported by existing indexes.\\n - Large array fields in documents that are costly to search and index.\\n - Queries involving multiple collections using `$lookup`.\\n\\n### 3. **Fix Immediate Issues**\\n - **Add Indexes**: Create indexes to support inefficient queries. The Performance Advisor provides suggestions for indexes with high impact.\\n - **Optimize Queries**: Ensure queries are designed to utilize existing indexes effectively.\\n - **Avoid Collection Scans**: If a query scans all documents in a collection (COLLSCAN), it indicates the need for an index.\\n\\n### 4. **Long-Term Solutions**\\n - **Optimize Indexes**: Remove unused or redundant indexes to improve write performance.\\n - **Monitor Query Targeting**: Keep the ratio of documents scanned to documents returned close to 1.\\n - **Avoid Large Arrays**: Minimize the use of large array fields in documents.\\n\\n### 5. **Best Practices**\\n - Use the **Query Targeting Metrics** to identify inefficiencies.\\n - Perform **rolling index builds** to minimize performance impact on replica sets and sharded clusters.\\n - Drop unused or hidden indexes to free up storage and improve write performance.\\n\\n### 6. **Tools for Monitoring and Optimization**\\n - **Performance Advisor**: Suggests indexes and provides query insights.\\n - **Query Profiler**: Displays slow-running queries and their statistics.\\n - **Namespace Insights**: Monitors query latency at the collection level.\\n - **Real-Time Performance Panel**: Provides real-time metrics for query execution.\\n\\nBy following these steps and utilizing MongoDB's built-in tools, you can significantly improve the performance of slow queries.\", additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 451, 'prompt_tokens': 5355, 'total_tokens': 5806, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-2024-11-20', 'system_fingerprint': 'fp_d924043139', 'finish_reason': 'stop', 'logprobs': None}, id='run-ad3b553a-e5e6-4c9e-9246-d6e0f7286abb-0', usage_metadata={'input_tokens': 5355, 'output_tokens': 451, 'total_tokens': 5806, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})]}\n", "---FINAL ANSWER---\n", - "To improve slow queries in MongoDB, you can follow these steps and best practices:\n", - "\n", - "### Tools and Features to Analyze and Optimize Queries:\n", - "1. **Performance Advisor**:\n", - " - Monitors slow queries and suggests indexes to improve performance.\n", - " - Provides recommendations based on query shapes and their impact.\n", - "\n", - "2. **Query Profiler**:\n", - " - Displays slow-running operations and their performance statistics.\n", - " - Allows you to explore historical queries for up to 24 hours.\n", - "\n", - "3. **Real-Time Performance Panel (RTPP)**:\n", - " - Identifies database operations, evaluates query execution times, and shows the ratio of documents scanned to documents returned.\n", - "\n", - "4. **Namespace Insights**:\n", - " - Monitors collection-level query latency and provides metrics for specific hosts and operation types.\n", - "\n", - "5. **Query Targeting Metrics**:\n", - " - Highlights inefficiencies in queries by showing the ratio of scanned objects to returned objects.\n", - "\n", - "### Best Practices for Query Performance:\n", - "1. **Indexing**:\n", - " - Create indexes that support your queries to reduce search time.\n", - " - Use the Performance Advisor to identify and create suggested indexes.\n", - " - Remove unused or inefficient indexes to improve write performance.\n", - "\n", - "2. **Query Design**:\n", - " - Avoid queries that require scanning large arrays or documents.\n", - " - Optimize queries to take advantage of existing indexes.\n", - "\n", - "3. **Rolling Index Builds**:\n", - " - For replica sets and sharded clusters, perform rolling index builds to minimize performance impact.\n", - "\n", - "4. **Monitor Query Targeting**:\n", - " - Ensure the ratio of scanned documents to returned documents is close to 1 for efficiency.\n", - " - Address alerts for high ratios by adding appropriate indexes.\n", + "To improve slow queries in MongoDB, you can follow these steps:\n", "\n", - "5. **Analyze Query Plans**:\n", - " - Use the `explain()` method to understand query execution and identify bottlenecks.\n", + "### 1. **Analyze the Problem**\n", + " - Use the **Performance Advisor** to monitor slow queries and get index recommendations.\n", + " - Check the **Query Profiler** to identify slow-running operations and their key performance statistics.\n", + " - Use **Namespace Insights** to monitor collection-level query latency.\n", + " - Analyze the **Real-Time Performance Panel (RTPP)** for real-time query execution metrics.\n", "\n", - "6. **Avoid Over-Indexing**:\n", - " - Too many indexes can negatively impact write performance. Balance the trade-off between read and write performance.\n", + "### 2. **Common Causes of Slow Queries**\n", + " - Queries are not supported by existing indexes.\n", + " - Large array fields in documents that are costly to search and index.\n", + " - Queries involving multiple collections using `$lookup`.\n", "\n", - "### Common Reasons for Slow Queries:\n", - "- Queries are unsupported by current indexes.\n", - "- Documents have large array fields that are costly to search.\n", - "- Queries involve multiple collections with `$lookup`.\n", + "### 3. **Fix Immediate Issues**\n", + " - **Add Indexes**: Create indexes to support inefficient queries. The Performance Advisor provides suggestions for indexes with high impact.\n", + " - **Optimize Queries**: Ensure queries are designed to utilize existing indexes effectively.\n", + " - **Avoid Collection Scans**: If a query scans all documents in a collection (COLLSCAN), it indicates the need for an index.\n", "\n", - "### Steps to Fix Slow Queries:\n", - "1. **Immediate Fix**:\n", - " - Add indexes to support inefficient queries.\n", - " - Use the Performance Advisor to create recommended indexes.\n", + "### 4. **Long-Term Solutions**\n", + " - **Optimize Indexes**: Remove unused or redundant indexes to improve write performance.\n", + " - **Monitor Query Targeting**: Keep the ratio of documents scanned to documents returned close to 1.\n", + " - **Avoid Large Arrays**: Minimize the use of large array fields in documents.\n", "\n", - "2. **Long-Term Solution**:\n", - " - Optimize query design and indexing strategies.\n", - " - Regularly monitor query performance using tools like the Query Profiler and Namespace Insights.\n", + "### 5. **Best Practices**\n", + " - Use the **Query Targeting Metrics** to identify inefficiencies.\n", + " - Perform **rolling index builds** to minimize performance impact on replica sets and sharded clusters.\n", + " - Drop unused or hidden indexes to free up storage and improve write performance.\n", "\n", - "3. **Monitor Progress**:\n", - " - Use Query Targeting metrics and Namespace Insights to track improvements.\n", + "### 6. **Tools for Monitoring and Optimization**\n", + " - **Performance Advisor**: Suggests indexes and provides query insights.\n", + " - **Query Profiler**: Displays slow-running queries and their statistics.\n", + " - **Namespace Insights**: Monitors query latency at the collection level.\n", + " - **Real-Time Performance Panel**: Provides real-time metrics for query execution.\n", "\n", - "By following these steps and leveraging MongoDB's tools, you can significantly improve the performance of slow queries.\n" + "By following these steps and utilizing MongoDB's built-in tools, you can significantly improve the performance of slow queries.\n" ] } ], From a31c01ffba5e00e4de5c558b1279cefd9e4765a6 Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Thu, 12 Dec 2024 13:23:50 -0800 Subject: [PATCH 21/23] Running pre-commit hooks --- .../langchain_parent_document_retrieval.ipynb | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/notebooks/techniques/langchain_parent_document_retrieval.ipynb b/notebooks/techniques/langchain_parent_document_retrieval.ipynb index 701f085..b9f0a2a 100644 --- a/notebooks/techniques/langchain_parent_document_retrieval.ipynb +++ b/notebooks/techniques/langchain_parent_document_retrieval.ipynb @@ -67,8 +67,9 @@ "metadata": {}, "outputs": [], "source": [ - "import os\n", "import getpass\n", + "import os\n", + "\n", "from pymongo import MongoClient" ] }, @@ -140,8 +141,8 @@ } ], "source": [ - "from datasets import load_dataset\n", - "import pandas as pd" + "import pandas as pd\n", + "from datasets import load_dataset" ] }, { @@ -398,8 +399,8 @@ "from langchain_mongodb.retrievers import (\n", " MongoDBAtlasParentDocumentRetriever,\n", ")\n", - "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", - "from langchain_openai import OpenAIEmbeddings" + "from langchain_openai import OpenAIEmbeddings\n", + "from langchain_text_splitters import RecursiveCharacterTextSplitter" ] }, { @@ -602,7 +603,7 @@ "collection = mongodb_client[DB_NAME][COLLECTION_NAME]\n", "# Delete any existing documents from the collection\n", "collection.delete_many({})\n", - "print(f\"Deletion complete.\")\n", + "print(\"Deletion complete.\")\n", "# Ingest LangChain documents into MongoDB\n", "results = await process_docs(docs)" ] @@ -620,8 +621,8 @@ "metadata": {}, "outputs": [], "source": [ - "from pymongo.operations import SearchIndexModel\n", - "from pymongo.errors import OperationFailure" + "from pymongo.errors import OperationFailure\n", + "from pymongo.operations import SearchIndexModel" ] }, { @@ -702,10 +703,10 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain_openai import ChatOpenAI\n", + "from langchain_core.output_parsers import StrOutputParser\n", "from langchain_core.prompts import ChatPromptTemplate\n", "from langchain_core.runnables import RunnablePassthrough\n", - "from langchain_core.output_parsers import StrOutputParser" + "from langchain_openai import ChatOpenAI" ] }, { @@ -795,13 +796,14 @@ "metadata": {}, "outputs": [], "source": [ + "from typing import Annotated, Dict\n", + "\n", "from langchain.agents import tool\n", "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n", - "from typing import Annotated, Dict\n", + "from langgraph.graph import END, START, StateGraph\n", "from langgraph.graph.message import add_messages\n", - "from typing_extensions import TypedDict\n", "from langgraph.prebuilt import ToolNode, tools_condition\n", - "from langgraph.graph import StateGraph, START, END" + "from typing_extensions import TypedDict" ] }, { From 965f556becdb40465421748dce2212e450e25dad Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Thu, 12 Dec 2024 13:37:55 -0800 Subject: [PATCH 22/23] Ruff updates --- ...tabase_comparison_mongodb_postgreSQL.ipynb | 14099 ++++++++-------- ruff.toml | 3 + 2 files changed, 7139 insertions(+), 6963 deletions(-) diff --git a/notebooks/benchmarks/vector_database_comparison_mongodb_postgreSQL.ipynb b/notebooks/benchmarks/vector_database_comparison_mongodb_postgreSQL.ipynb index 728bc81..38f745d 100644 --- a/notebooks/benchmarks/vector_database_comparison_mongodb_postgreSQL.ipynb +++ b/notebooks/benchmarks/vector_database_comparison_mongodb_postgreSQL.ipynb @@ -1,7076 +1,7249 @@ { - "cells": [ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Vector Database Comparison For AI Workloads\n", + "-----\n", + "\n", + "This notebook implements and benchmarks a standard AI workload that involves vector embeddings and the retreival of semantically similar documents from a database. The system uses two different vector databases:\n", + "- PostgreSQL with pgvector: A vector database extension for PostgreSQL that enables vector search on the database.\n", + "- MongoDB Atlas Vector Search: A vector search feature for MongoDB Database that enables vector search on the database.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Key Information\n", + "\n", + "1. **System Configuration**\n", + "\n", + "| Component | Specification |\n", + "|-----------|---------------|\n", + "| **Hardware** ||\n", + "| System | MacBook Pro 16-inch, 2023 |\n", + "| CPU | Apple M2 Pro |\n", + "| Memory | 16GB |\n", + "| **Database Tools** ||\n", + "| PostgreSQL Management | pgAdmin 4 (v8.12) |\n", + "| MongoDB Management | MongoDB Compass (v1.41.0) |\n", + "| **Database Versions** ||\n", + "| PostgreSQL | 15.4 with pgvector extension (Single Node) |\n", + "| - Index Configuration | HNSW index with m=16, ef_construction=64 and cosine similarity |\n", + "| MongoDB | 8.0.1 with Atlas CLI (Single Node) |\n", + "| - Index Configuration | Vector Search Index (HNSW) with 768 dimensions and cosine similarity |\n", + "| **Container Environment** ||\n", + "| Docker Desktop | 4.34.3 |\n", + "| Docker Engine | 27.2.0 |\n", + "| Docker Compose | v2.29.2-desktop.2 |\n", + "| Kubernetes | v1.30.2 |\n", + "| **Docker Resource Pool** ||\n", + "| Total CPU | 12 cores |\n", + "| Total Memory | 7.9 GB |\n", + "| Total Swap | 1 GB |\n", + "| Virtual Disk | 64 GB |\n", + "| Container Memory Limit | 7.65GB |\n", + "| **Development Environment** ||\n", + "| Python | 3.11.5 |\n", + "| Pip | 24.2 |\n", + "| IDE | Jupyter Notebook |\n", + "| Operating System | macOS Sonoma 14.2.1 |\n", + "2. **Data Processing**\n", + " - Uses Wikipedia dataset (100,000 entries) with embeddings(Precision: float32, Dimensions: 768) generated by Cohere\n", + " - JSON data is generated from the dataset and stored in the databases\n", + " - Stores data in both PostgreSQL and MongoDB\n", + "\n", + "3. **Performance Testing**\n", + " - Tests different sizes of concurrent queries (1-400 queries)\n", + " - Tests different insertion batch sizes and speed of insertion\n", + "\n", + "| Operation | Metric | Description |\n", + "|------------|--------|-------------|\n", + "| Insertion | Latency | Time taken to insert the data (average response time) |\n", + "| | Throughput | Number of queries processed per second |\n", + "| Retrieval | Latency | Time taken to retrieve the top n results (average response time) |\n", + "| | Throughput | Number of queries processed per second |\n", + "| | P95 Latency | Time taken to retrieve the top n results for 95% of the queries |\n", + "| | Standard Deviation | How much the latency varies from the average latency |\n", + "\n", + "4. **Results Visualization**\n", + " - Interactive animations showing request-response cycles\n", + " - Comparative charts for latency and throughput\n", + " - Performance analysis across different batch sizes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Part 1: Data Setup" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Setting up the benchmark results dictionary `benchmark_results` and the batch sizes to test `CONCURRENT_QUERIES` and `TOTAL_QUERIES`\n", + "\n", + "- `benchmark_results` is a dictionary that will store the results of the benchmark tests\n", + "- `CONCURRENT_QUERIES` is a list of the number of queries that are run concurrently\n", + "- `TOTAL_QUERIES` is the total number of queries that are run\n", + "\n", + "Benchmark Configuration Example:\n", + "When testing with a concurrency level of 10:\n", + "- We run 100 iterations\n", + "- Each iteration runs 10 concurrent queries\n", + "- Total queries = 1,000 queries (TOTAL_ITERATIONS * CONCURRENT_QUERIES)\n", + "\n", + "NOTE: For each concurrency level in CONCURRENT_QUERIES:\n", + "1. Run TOTAL_QUERIES iterations\n", + "2. In each iteration, execute that many concurrent queries\n", + "3. Measure and collect latencies for all queries\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Initialize the benchmark results dictionary\n", + "benchmark_results = {\"PostgreSQL\": {}, \"MongoDB\": {}}\n", + "\n", + "# The concurrency levels for benchmark testing\n", + "# Each level represents the number of simultaneous queries to execute\n", + "CONCURRENT_QUERIES = [\n", + " 1,\n", + " 2,\n", + " 4,\n", + " 5,\n", + " 8,\n", + " 10,\n", + " 12,\n", + " 16,\n", + " 20,\n", + " 24,\n", + " 32,\n", + " 40,\n", + " 48,\n", + " 50,\n", + " 56,\n", + " 64,\n", + " 72,\n", + " 80,\n", + " 88,\n", + " 96,\n", + " 100,\n", + " 200,\n", + " 400,\n", + "]\n", + "\n", + "# The total number of iterations to run for each concurrency level\n", + "TOTAL_QUERIES = 100" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import getpass\n", + "import os\n", + "\n", + "\n", + "# Function to securely get and set environment variables\n", + "def set_env_securely(var_name, prompt):\n", + " value = getpass.getpass(prompt)\n", + " os.environ[var_name] = value" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 1: Install Libraries\n", + "\n", + "All the libraries are installed using pip and facilitate the sourcing of data, embedding generation, and data visualization.\n", + "\n", + "- `datasets`: Hugging Face library for managing and preprocessing datasets across text, image, and audio (https://huggingface.co/datasets)\n", + "- `sentence_transformers`: For creating sentence embeddings for tasks like semantic search and clustering. (https://www.sbert.net/)\n", + "- `pandas`: A library for data manipulation and analysis with DataFrames and Series (https://pandas.pydata.org/)\n", + "- `matplotlib`: A library for creating static, interactive, and animated data visualizations (https://matplotlib.org/)\n", + "- `seaborn`: A library for creating statistical data visualizations (https://seaborn.pydata.org/)\n", + "- `cohere`: A library for generating embeddings and accessing the Cohere API or models (https://cohere.ai/)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Vector Database Comparison For AI Workloads\n", - "-----\n", - "\n", - "This notebook implements and benchmarks a standard AI workload that involves vector embeddings and the retreival of semantically similar documents from a database. The system uses two different vector databases:\n", - "- PostgreSQL with pgvector: A vector database extension for PostgreSQL that enables vector search on the database.\n", - "- MongoDB Atlas Vector Search: A vector search feature for MongoDB Database that enables vector search on the database.\n" - ] + "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;49m24.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\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 --upgrade --quiet datasets sentence_transformers pandas matplotlib seaborn cohere" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LyWZVRIqxVnV" + }, + "source": [ + "### Step 2: Data Loading\n", + "\n", + "The dataset for the benchmark is sourced from the Hugging Face Cohere Wikipedia dataset.\n", + "\n", + "The [Cohere/wikipedia-22-12-en-embeddings](https://huggingface.co/datasets/Cohere/wikipedia-22-12-en-embeddings) dataset on Hugging Face comprises English Wikipedia articles embedded using Cohere's multilingual-22-12 model. Each entry includes the article's title, text, URL, Wikipedia ID, view count, paragraph ID, language codes, and a 768-dimensional embedding vector. This dataset is valuable for tasks like semantic search, information retrieval, and NLP model training.\n", + "\n", + "For this benchmark, we are using 100,000 rows of the dataset and have removed the id, wiki_id, paragraph_id, langs and views columns." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 206 }, + "id": "rCXZhJ9-vymv", + "outputId": "7f4210d7-5b8b-4c1d-89ab-7288623a8ca7" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from datasets import load_dataset\n", + "\n", + "# Using 100,000 rows for testing, feel free to change this to any number of rows you want to test\n", + "# The wikipedia-22-12-en-embeddings dataset has approximately 35,000,000 rows and requires 120GB of memory to load\n", + "MAX_ROWS = 100000\n", + "\n", + "dataset = load_dataset(\n", + " \"Cohere/wikipedia-22-12-en-embeddings\", split=\"train\", streaming=True\n", + ")\n", + "dataset_segment = dataset.take(MAX_ROWS)\n", + "\n", + "# Convert the dataset to a pandas dataframe\n", + "dataset_df = pd.DataFrame(dataset_segment)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Add a JSON attribute to the dataset consisting of the title, text and url\n", + "dataset_df[\"json_data\"] = dataset_df.apply(\n", + " lambda row: {\"title\": row[\"title\"], \"text\": row[\"text\"], \"url\": row[\"url\"]}, axis=1\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# Remove the id field, wiki_id, paragraph_id, langs and views from the dataset\n", + "# This is to replicate the structure of dataset usually encountered in AI workloads, particularly in RAG systems where metadata is extracted from documents and stored.\n", + "dataset_df = dataset_df.drop(\n", + " columns=[\"id\", \"wiki_id\", \"paragraph_id\", \"langs\", \"views\"]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# Change the emb colomn name to embedding\n", + "dataset_df = dataset_df.rename(columns={\"emb\": \"embedding\"})" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Key Information\n", - "\n", - "1. **System Configuration**\n", - "\n", - "| Component | Specification |\n", - "|-----------|---------------|\n", - "| **Hardware** ||\n", - "| System | MacBook Pro 16-inch, 2023 |\n", - "| CPU | Apple M2 Pro |\n", - "| Memory | 16GB |\n", - "| **Database Tools** ||\n", - "| PostgreSQL Management | pgAdmin 4 (v8.12) |\n", - "| MongoDB Management | MongoDB Compass (v1.41.0) |\n", - "| **Database Versions** ||\n", - "| PostgreSQL | 15.4 with pgvector extension (Single Node) |\n", - "| - Index Configuration | HNSW index with m=16, ef_construction=64 and cosine similarity |\n", - "| MongoDB | 8.0.1 with Atlas CLI (Single Node) |\n", - "| - Index Configuration | Vector Search Index (HNSW) with 768 dimensions and cosine similarity |\n", - "| **Container Environment** ||\n", - "| Docker Desktop | 4.34.3 |\n", - "| Docker Engine | 27.2.0 |\n", - "| Docker Compose | v2.29.2-desktop.2 |\n", - "| Kubernetes | v1.30.2 |\n", - "| **Docker Resource Pool** ||\n", - "| Total CPU | 12 cores |\n", - "| Total Memory | 7.9 GB |\n", - "| Total Swap | 1 GB |\n", - "| Virtual Disk | 64 GB |\n", - "| Container Memory Limit | 7.65GB |\n", - "| **Development Environment** ||\n", - "| Python | 3.11.5 |\n", - "| Pip | 24.2 |\n", - "| IDE | Jupyter Notebook |\n", - "| Operating System | macOS Sonoma 14.2.1 |\n", - "2. **Data Processing**\n", - " - Uses Wikipedia dataset (100,000 entries) with embeddings(Precision: float32, Dimensions: 768) generated by Cohere\n", - " - JSON data is generated from the dataset and stored in the databases\n", - " - Stores data in both PostgreSQL and MongoDB\n", - "\n", - "3. **Performance Testing**\n", - " - Tests different sizes of concurrent queries (1-400 queries)\n", - " - Tests different insertion batch sizes and speed of insertion\n", - "\n", - "| Operation | Metric | Description |\n", - "|------------|--------|-------------|\n", - "| Insertion | Latency | Time taken to insert the data (average response time) |\n", - "| | Throughput | Number of queries processed per second |\n", - "| Retrieval | Latency | Time taken to retrieve the top n results (average response time) |\n", - "| | Throughput | Number of queries processed per second |\n", - "| | P95 Latency | Time taken to retrieve the top n results for 95% of the queries |\n", - "| | Standard Deviation | How much the latency varies from the average latency |\n", - "\n", - "4. **Results Visualization**\n", - " - Interactive animations showing request-response cycles\n", - " - Comparative charts for latency and throughput\n", - " - Performance analysis across different batch sizes" + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titletexturlembeddingjson_data
0Deaths in 2022The following notable deaths occurred in 2022....https://en.wikipedia.org/wiki?curid=69407798[0.2865696847438812, -0.03181683272123337, 0.0...{'title': 'Deaths in 2022', 'text': 'The follo...
1YouTubeYouTube is a global online video sharing and s...https://en.wikipedia.org/wiki?curid=3524766[-0.09689381718635559, 0.1619211882352829, -0....{'title': 'YouTube', 'text': 'YouTube is a glo...
2YouTubeIn October 2006, YouTube was bought by Google ...https://en.wikipedia.org/wiki?curid=3524766[0.1302049309015274, 0.265736848115921, 0.4018...{'title': 'YouTube', 'text': 'In October 2006,...
3YouTubeSince its purchase by Google, YouTube has expa...https://en.wikipedia.org/wiki?curid=3524766[-0.09791257232427597, 0.13586106896400452, -0...{'title': 'YouTube', 'text': 'Since its purcha...
4YouTubeYouTube has had an unprecedented social impact...https://en.wikipedia.org/wiki?curid=3524766[-0.2641527056694031, 0.06968216598033905, -0....{'title': 'YouTube', 'text': 'YouTube has had ...
\n", + "
" + ], + "text/plain": [ + " title text \\\n", + "0 Deaths in 2022 The following notable deaths occurred in 2022.... \n", + "1 YouTube YouTube is a global online video sharing and s... \n", + "2 YouTube In October 2006, YouTube was bought by Google ... \n", + "3 YouTube Since its purchase by Google, YouTube has expa... \n", + "4 YouTube YouTube has had an unprecedented social impact... \n", + "\n", + " url \\\n", + "0 https://en.wikipedia.org/wiki?curid=69407798 \n", + "1 https://en.wikipedia.org/wiki?curid=3524766 \n", + "2 https://en.wikipedia.org/wiki?curid=3524766 \n", + "3 https://en.wikipedia.org/wiki?curid=3524766 \n", + "4 https://en.wikipedia.org/wiki?curid=3524766 \n", + "\n", + " embedding \\\n", + "0 [0.2865696847438812, -0.03181683272123337, 0.0... \n", + "1 [-0.09689381718635559, 0.1619211882352829, -0.... \n", + "2 [0.1302049309015274, 0.265736848115921, 0.4018... \n", + "3 [-0.09791257232427597, 0.13586106896400452, -0... \n", + "4 [-0.2641527056694031, 0.06968216598033905, -0.... \n", + "\n", + " json_data \n", + "0 {'title': 'Deaths in 2022', 'text': 'The follo... \n", + "1 {'title': 'YouTube', 'text': 'YouTube is a glo... \n", + "2 {'title': 'YouTube', 'text': 'In October 2006,... \n", + "3 {'title': 'YouTube', 'text': 'Since its purcha... \n", + "4 {'title': 'YouTube', 'text': 'YouTube has had ... " ] - }, + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dataset_df.head(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "wOwXzXnjxHfb" + }, + "source": [ + "### Step 3: Embedding Generation" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# Set Cohere API key\n", + "set_env_securely(\"COHERE_API_KEY\", \"Enter your Cohere API key: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the Cohere API to generate embeddings for the test queries.\n", + "\n", + "Using the `embed-multilingual-v2.0` model. This is the same model used in the Cohere Wikipedia dataset.\n", + "\n", + "Embedding size is 768 dimensions and the precision is float32." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "from typing import List, Tuple\n", + "\n", + "import cohere\n", + "\n", + "# Initialize Cohere Client\n", + "co = cohere.Client()\n", + "\n", + "\n", + "def get_cohere_embeddings(\n", + " sentences: List[str],\n", + " model: str = \"embed-multilingual-v2.0\",\n", + " input_type: str = \"search_document\",\n", + ") -> Tuple[List[float], List[int]]:\n", + " \"\"\"\n", + " Generates embeddings for the provided sentences using Cohere's embedding model.\n", + "\n", + " Args:\n", + " sentences (list of str): List of sentences to generate embeddings for.\n", + "\n", + " Returns:\n", + " Tuple[List[float], List[int]]: A tuple containing two lists of embeddings (float and int8).\n", + " \"\"\"\n", + " generated_embedding = co.embed(\n", + " texts=sentences,\n", + " model=\"embed-multilingual-v2.0\",\n", + " input_type=\"search_document\",\n", + " embedding_types=[\"float\"],\n", + " ).embeddings\n", + "\n", + " return generated_embedding.float[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Generate embeddings for the query templates used in benchmarking process\n", + "\n", + "Note: Doing this to avoid the overhead of generating embeddings for each query during the benchmark process\n", + "\n", + "Note: Feel free to add more queries to the query_templates list to test the performance of the vector database with a larger number of queries" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "query_templates = [\n", + " \"When was YouTube officially launched, and by whom?\",\n", + " \"What is YouTube's slogan introduced after Google's acquisition?\",\n", + " \"How many hours of videos are collectively watched on YouTube daily?\",\n", + " \"Which was the first video uploaded to YouTube, and when was it uploaded?\",\n", + " \"What was the acquisition cost of YouTube by Google, and when was the deal finalized?\",\n", + " \"What was the first YouTube video to reach one million views, and when did it happen?\",\n", + " \"What are the three separate branches of the United States government?\",\n", + " \"Which country has the highest documented incarceration rate and prison population?\",\n", + " \"How many executions have occurred in the United States since 1977, and which countries have more?\",\n", + " \"What percentage of the global military spending did the United States account for in 2019?\",\n", + " \"How is the U.S. president elected?\",\n", + " \"What cooling system innovation was included in the proposed venues for the World Cup in Qatar?\",\n", + " \"What lawsuit was filed against Google in June 2020, and what was it about?\",\n", + " \"How much was Google fined by CNIL in January 2022, and for what reason?\",\n", + " \"When did YouTube join the NSA's PRISM program, according to reports?\",\n", + "]\n", + "\n", + "# For each query template question, generate an embedding\n", + "# NOTE: Doing this to avoid the overhead of generating embeddings for each query during the benchmark process\n", + "query_embeddings = [\n", + " get_cohere_embeddings(sentences=[query], input_type=\"search_query\")\n", + " for query in query_templates\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Create a dictionary with the query templates and their corresponding embeddings\n", + "query_embeddings_dict = {\n", + " query: embedding for query, embedding in zip(query_templates, query_embeddings)\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 1: Data Setup" + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
When was YouTube officially launched, and by whom?What is YouTube's slogan introduced after Google's acquisition?How many hours of videos are collectively watched on YouTube daily?Which was the first video uploaded to YouTube, and when was it uploaded?What was the acquisition cost of YouTube by Google, and when was the deal finalized?What was the first YouTube video to reach one million views, and when did it happen?What are the three separate branches of the United States government?Which country has the highest documented incarceration rate and prison population?How many executions have occurred in the United States since 1977, and which countries have more?What percentage of the global military spending did the United States account for in 2019?How is the U.S. president elected?What cooling system innovation was included in the proposed venues for the World Cup in Qatar?What lawsuit was filed against Google in June 2020, and what was it about?How much was Google fined by CNIL in January 2022, and for what reason?When did YouTube join the NSA's PRISM program, according to reports?
00.1846920.1815190.1249390.2260740.4157710.1270750.2379150.5249020.3964840.3425290.3754880.4902340.1187740.1384280.477783
10.2624510.0196380.0224460.1304930.0495300.1959230.418945-0.256348-0.112061-0.0330200.1580810.3310550.199219-0.0651250.128540
2-0.3146970.1343990.049500-0.2280270.077454-0.0626830.057587-0.5766600.051880-0.189575-0.151855-0.245117-0.053436-0.451172-0.274658
30.0981450.1790770.4997560.0896000.0002460.0633540.0112150.0080950.014961-0.099731-0.2131350.2578120.3989260.2741700.223389
4-0.0581050.3110350.3073730.0763550.4162600.398682-0.2430420.160278-0.0983890.036224-0.036987-0.3513180.3342290.2568360.176514
................................................
7630.4550780.4997560.4287110.4646000.5131840.4646000.2915040.3066410.3286130.3671880.2382810.4970700.3845210.5073240.436523
7640.2673340.1561280.2446290.3400880.1745610.4875490.0382690.0585630.6093750.080261-0.0049590.0073700.4035640.544922-0.016052
7650.2602540.039520-0.1064450.1148070.4396970.1033330.1868900.0130840.1768800.3376460.200439-0.3554690.3266600.3168950.338135
7660.0010400.3154300.0453490.1134030.190552-0.0381160.2990720.2563480.3166500.4204100.3425290.0626830.0355220.0942380.180420
7670.1172490.2502440.1450200.0968020.245605-0.057373-0.201904-0.123169-0.248047-0.0343630.039124-0.1102290.1256100.179321-0.066345
\n", + "

768 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " When was YouTube officially launched, and by whom? \\\n", + "0 0.184692 \n", + "1 0.262451 \n", + "2 -0.314697 \n", + "3 0.098145 \n", + "4 -0.058105 \n", + ".. ... \n", + "763 0.455078 \n", + "764 0.267334 \n", + "765 0.260254 \n", + "766 0.001040 \n", + "767 0.117249 \n", + "\n", + " What is YouTube's slogan introduced after Google's acquisition? \\\n", + "0 0.181519 \n", + "1 0.019638 \n", + "2 0.134399 \n", + "3 0.179077 \n", + "4 0.311035 \n", + ".. ... \n", + "763 0.499756 \n", + "764 0.156128 \n", + "765 0.039520 \n", + "766 0.315430 \n", + "767 0.250244 \n", + "\n", + " How many hours of videos are collectively watched on YouTube daily? \\\n", + "0 0.124939 \n", + "1 0.022446 \n", + "2 0.049500 \n", + "3 0.499756 \n", + "4 0.307373 \n", + ".. ... \n", + "763 0.428711 \n", + "764 0.244629 \n", + "765 -0.106445 \n", + "766 0.045349 \n", + "767 0.145020 \n", + "\n", + " Which was the first video uploaded to YouTube, and when was it uploaded? \\\n", + "0 0.226074 \n", + "1 0.130493 \n", + "2 -0.228027 \n", + "3 0.089600 \n", + "4 0.076355 \n", + ".. ... \n", + "763 0.464600 \n", + "764 0.340088 \n", + "765 0.114807 \n", + "766 0.113403 \n", + "767 0.096802 \n", + "\n", + " What was the acquisition cost of YouTube by Google, and when was the deal finalized? \\\n", + "0 0.415771 \n", + "1 0.049530 \n", + "2 0.077454 \n", + "3 0.000246 \n", + "4 0.416260 \n", + ".. ... \n", + "763 0.513184 \n", + "764 0.174561 \n", + "765 0.439697 \n", + "766 0.190552 \n", + "767 0.245605 \n", + "\n", + " What was the first YouTube video to reach one million views, and when did it happen? \\\n", + "0 0.127075 \n", + "1 0.195923 \n", + "2 -0.062683 \n", + "3 0.063354 \n", + "4 0.398682 \n", + ".. ... \n", + "763 0.464600 \n", + "764 0.487549 \n", + "765 0.103333 \n", + "766 -0.038116 \n", + "767 -0.057373 \n", + "\n", + " What are the three separate branches of the United States government? \\\n", + "0 0.237915 \n", + "1 0.418945 \n", + "2 0.057587 \n", + "3 0.011215 \n", + "4 -0.243042 \n", + ".. ... \n", + "763 0.291504 \n", + "764 0.038269 \n", + "765 0.186890 \n", + "766 0.299072 \n", + "767 -0.201904 \n", + "\n", + " Which country has the highest documented incarceration rate and prison population? \\\n", + "0 0.524902 \n", + "1 -0.256348 \n", + "2 -0.576660 \n", + "3 0.008095 \n", + "4 0.160278 \n", + ".. ... \n", + "763 0.306641 \n", + "764 0.058563 \n", + "765 0.013084 \n", + "766 0.256348 \n", + "767 -0.123169 \n", + "\n", + " How many executions have occurred in the United States since 1977, and which countries have more? \\\n", + "0 0.396484 \n", + "1 -0.112061 \n", + "2 0.051880 \n", + "3 0.014961 \n", + "4 -0.098389 \n", + ".. ... \n", + "763 0.328613 \n", + "764 0.609375 \n", + "765 0.176880 \n", + "766 0.316650 \n", + "767 -0.248047 \n", + "\n", + " What percentage of the global military spending did the United States account for in 2019? \\\n", + "0 0.342529 \n", + "1 -0.033020 \n", + "2 -0.189575 \n", + "3 -0.099731 \n", + "4 0.036224 \n", + ".. ... \n", + "763 0.367188 \n", + "764 0.080261 \n", + "765 0.337646 \n", + "766 0.420410 \n", + "767 -0.034363 \n", + "\n", + " How is the U.S. president elected? \\\n", + "0 0.375488 \n", + "1 0.158081 \n", + "2 -0.151855 \n", + "3 -0.213135 \n", + "4 -0.036987 \n", + ".. ... \n", + "763 0.238281 \n", + "764 -0.004959 \n", + "765 0.200439 \n", + "766 0.342529 \n", + "767 0.039124 \n", + "\n", + " What cooling system innovation was included in the proposed venues for the World Cup in Qatar? \\\n", + "0 0.490234 \n", + "1 0.331055 \n", + "2 -0.245117 \n", + "3 0.257812 \n", + "4 -0.351318 \n", + ".. ... \n", + "763 0.497070 \n", + "764 0.007370 \n", + "765 -0.355469 \n", + "766 0.062683 \n", + "767 -0.110229 \n", + "\n", + " What lawsuit was filed against Google in June 2020, and what was it about? \\\n", + "0 0.118774 \n", + "1 0.199219 \n", + "2 -0.053436 \n", + "3 0.398926 \n", + "4 0.334229 \n", + ".. ... \n", + "763 0.384521 \n", + "764 0.403564 \n", + "765 0.326660 \n", + "766 0.035522 \n", + "767 0.125610 \n", + "\n", + " How much was Google fined by CNIL in January 2022, and for what reason? \\\n", + "0 0.138428 \n", + "1 -0.065125 \n", + "2 -0.451172 \n", + "3 0.274170 \n", + "4 0.256836 \n", + ".. ... \n", + "763 0.507324 \n", + "764 0.544922 \n", + "765 0.316895 \n", + "766 0.094238 \n", + "767 0.179321 \n", + "\n", + " When did YouTube join the NSA's PRISM program, according to reports? \n", + "0 0.477783 \n", + "1 0.128540 \n", + "2 -0.274658 \n", + "3 0.223389 \n", + "4 0.176514 \n", + ".. ... \n", + "763 0.436523 \n", + "764 -0.016052 \n", + "765 0.338135 \n", + "766 0.180420 \n", + "767 -0.066345 \n", + "\n", + "[768 rows x 15 columns]" ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# View the first 5 query embeddings as a dataframe\n", + "pd.DataFrame(query_embeddings_dict)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Part 2: Semantic Search with PostgreSQL and PgVector\n", + "\n", + "In this section, we create a PostgreSQL database with the PgVector extension and insert the dataset into the database.\n", + "\n", + "The table `wikipedia_data` is created with the following columns:\n", + "- `id`: The unique identifier for each row\n", + "- `title`: The title of the Wikipedia article\n", + "- `text`: The text of the Wikipedia article\n", + "- `url`: The URL of the Wikipedia article\n", + "- `json_data`: The JSON data of the Wikipedia article\n", + "- `embedding`: The embedding vector for the Wikipedia article\n", + "\n", + "The table is created with a HNSW index with m=16, ef_construction=64 and cosine similarity (these are the default parameters for the HNSW index in pgvector).\n", + "- `HNSW`: Hierarchical Navigable Small World graphs are a type of graph-based index that are used for efficient similarity search.\n", + "- `m=16`: The number of edges per node in the graph\n", + "- `ef_construction=64`: Short for exploration factor construction, is the number of edges to build during the index construction phase\n", + "- `ef_search=100`: Short for exploration factor search, is the number of edges to search during the index search phase\n", + "- `cosine similarity`: The similarity metric used for the index (formula: dot product(A, B) / (|A||B|))\n", + "- `cosine distance`: The distance metric calculated using cosine similarity (1 - cosine similarity)\n", + "\n", + "We perform a semantic search on the database using a single data point of the query templates and their corresponding embeddings.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0PM-dnDtxQBW" + }, + "source": [ + "### Step 1: Install Libraries\n", + "\n", + "- `pgvector` (0.3.6): A PostgreSQL extension for vector similarity search (https://github.com/pgvector/pgvector)\n", + "- `psycopg` (3.2.3): A PostgreSQL database adapter for Python (https://www.psycopg.org/)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "A5GwoxiSfWgv", + "outputId": "157e4760-e25c-45cd-d1d5-3eb3fdfea593" + }, + "outputs": [], + "source": [ + "%pip install --upgrade --quiet pgvector \"psycopg[binary]\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 2: Installing PostgreSQL and PgVector\n", + "\n", + "PostgreSQL and PgVector are installed using docker.\n", + "\n", + "The PostgreSQL docker image is pulled from the [postgres](https://hub.docker.com/_/postgres) repository.\n", + "\n", + "The PgVector docker image is pulled from the [pgvector/pgvector](https://hub.docker.com/r/pgvector/pgvector) repository.\n", + "\n", + "Find more instructions on installing PostgreSQL and PgVector [here](https://github.com/pgvector/pgvector?tab=readme-ov-file#docker): " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 3: Create Postgres Table\n", + "\n", + "- `id`: The unique identifier for each row\n", + "- `title`: The title of the Wikipedia article\n", + "- `text`: The text of the Wikipedia article\n", + "- `url`: The URL of the Wikipedia article\n", + "- `json_data`: The JSON data of the Wikipedia article\n", + "- `embedding`: The embedding vector for the Wikipedia article\n", + "\n", + "NOTE: JSON data `json_data` in the dataset is stored as a JSONB column in Postgres to mirror the use of binary formatted data in MongoDB via BSON." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def create_table(connection):\n", + " with connection.cursor() as cur:\n", + " # Drop table if it already exists\n", + " cur.execute(\"DROP TABLE IF EXISTS wikipedia_data\")\n", + "\n", + " # Create the table with the appropriate structure\n", + " cur.execute(\n", + " \"\"\"\n", + " CREATE TABLE wikipedia_data (\n", + " id bigserial PRIMARY KEY,\n", + " title text,\n", + " text text,\n", + " url text,\n", + " json_data jsonb,\n", + " embedding vector(768)\n", + " )\n", + " \"\"\"\n", + " )\n", + "\n", + " # Create HNSW index for vector similarity search with cosine similarity\n", + " cur.execute(\n", + " \"\"\"\n", + " CREATE INDEX ON wikipedia_data \n", + " USING hnsw (embedding vector_cosine_ops) \n", + " WITH (m = 16, ef_construction = 64);\n", + " \"\"\"\n", + " )\n", + "\n", + " print(\"Table and index created successfully\")\n", + " connection.commit()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 4: Define insert function\n", + "\n", + "For inserting JSON data, we convert the Python Dictionary in the `json_data` attribute to a JSON string using the `json.dumps()` function.\n", + "\n", + "This is a serilization process that converts the Python Dictionary in the `json_data` attribute to a JSON string that is stored as binary data in the database." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import time\n", + "\n", + "import numpy as np\n", + "\n", + "\n", + "def insert_data_to_postgres(dataframe, connection, database_type=\"PostgreSQL\"):\n", + " \"\"\"\n", + " Insert data into the PostgreSQL database.\n", + "\n", + " Args:\n", + " dataframe (pandas.DataFrame): The dataframe containing the data to insert.\n", + " connection (psycopg.extensions.connection): The connection to the PostgreSQL database.\n", + " database_type (str): The type of database (default: \"PostgreSQL\").\n", + " \"\"\"\n", + " start_time = time.time()\n", + " total_rows = len(dataframe)\n", + "\n", + " try:\n", + " with connection.cursor() as cur:\n", + " # Create a list of tuples for insertion, filtering out rows with invalid embeddings\n", + " data_tuples = []\n", + " for _, row in dataframe.iterrows():\n", + " data_tuple = (\n", + " row[\"title\"],\n", + " row[\"text\"],\n", + " row[\"url\"],\n", + " json.dumps(row[\"json_data\"]), # Convert dict to JSON string\n", + " row[\"embedding\"],\n", + " )\n", + " data_tuples.append(data_tuple)\n", + "\n", + " if not data_tuples:\n", + " raise ValueError(\"No valid data tuples to insert\")\n", + "\n", + " cur.executemany(\n", + " \"\"\"\n", + " INSERT INTO wikipedia_data \n", + " (title, text, url, json_data, embedding)\n", + " VALUES (%s, %s, %s, %s, %s)\n", + " \"\"\",\n", + " data_tuples,\n", + " )\n", + "\n", + " connection.commit()\n", + "\n", + " except Exception as e:\n", + " print(f\"Error during bulk insert: {e}\")\n", + " connection.rollback()\n", + " raise e\n", + "\n", + " end_time = time.time()\n", + " total_time = end_time - start_time\n", + " rows_per_second = len(data_tuples) / total_time\n", + "\n", + " # print(f\"\\nInsertion Statistics:\")\n", + " # print(f\"Total time: {total_time:.2f} seconds\")\n", + " # print(f\"Average insertion rate: {rows_per_second:.2f} rows/second\")\n", + " # print(f\"Total rows inserted: {len(data_tuples)}\")\n", + " # print(f\"Rows skipped: {total_rows - len(data_tuples)}\")\n", + "\n", + " # Store results in benchmark dictionary\n", + " if database_type not in benchmark_results:\n", + " benchmark_results[database_type] = {}\n", + "\n", + " benchmark_results[database_type][\"insert_time\"] = {\n", + " \"total_time\": total_time,\n", + " \"rows_per_second\": rows_per_second,\n", + " \"total_rows\": total_rows,\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 5: Insert Data into Postgres" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Setting up the benchmark results dictionary `benchmark_results` and the batch sizes to test `CONCURRENT_QUERIES` and `TOTAL_QUERIES`\n", - "\n", - "- `benchmark_results` is a dictionary that will store the results of the benchmark tests\n", - "- `CONCURRENT_QUERIES` is a list of the number of queries that are run concurrently\n", - "- `TOTAL_QUERIES` is the total number of queries that are run\n", - "\n", - "Benchmark Configuration Example:\n", - "When testing with a concurrency level of 10:\n", - "- We run 100 iterations\n", - "- Each iteration runs 10 concurrent queries\n", - "- Total queries = 1,000 queries (TOTAL_ITERATIONS * CONCURRENT_QUERIES)\n", - "\n", - "NOTE: For each concurrency level in CONCURRENT_QUERIES:\n", - "1. Run TOTAL_QUERIES iterations\n", - "2. In each iteration, execute that many concurrent queries\n", - "3. Measure and collect latencies for all queries\n", - "\n" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "Table and index created successfully\n", + "\n", + "Insertion Statistics:\n", + "Total time: 462.10 seconds\n", + "Average insertion rate: 216.40 rows/second\n", + "Total rows inserted: 100000\n", + "Rows skipped: 0\n", + "Connection closed\n" + ] + } + ], + "source": [ + "import psycopg\n", + "from pgvector.psycopg import register_vector\n", + "\n", + "try:\n", + " # Connect to PostgreSQL\n", + " conn = psycopg.connect(\n", + " \"dbname=vector_db user=postgres password=test host=127.0.0.1\"\n", + " )\n", + "\n", + " # Enable the pgvector extension\n", + " conn.execute(\"CREATE EXTENSION IF NOT EXISTS vector\")\n", + "\n", + " # Register vector type to handle embedding data as vector data types\n", + " register_vector(conn)\n", + "\n", + " # Step 1: Create the table\n", + " create_table(conn)\n", + "\n", + " # Step 2: Insert the expanded dataset into the table\n", + " insert_data_to_postgres(dataset_df, conn)\n", + "\n", + "except Exception as e:\n", + " print(\"Failed to execute:\", e)\n", + "finally:\n", + " # Close the connection\n", + " conn.close()\n", + " print(\"Connection closed\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 6: Define semantic search function\n", + "\n", + "To avoid exhasuting API key usage, we will fetch the query embedding from the `query_embeddings_dict` dictionary.\n", + "\n", + "In the `semantic_search_with_postgres` function, we set the HNSW ef parameter to 100 using the `execute_command` function.\n", + "\n", + "This is to set the exploration factor for the HNSW index to 100. And corresponds to the number of nodes/candidates to search during the index search phase.\n", + "A node corresponds to a vector in the index.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "def semantic_search_with_postgres(query, connection, top_n=5):\n", + " # Take a query embedding from the query_embeddings_dict\n", + " query_embedding = query_embeddings_dict[query]\n", + "\n", + " with connection.cursor() as cur:\n", + " # Set the HNSW ef parameter using execute_command\n", + " cur.execute(\"SET hnsw.ef_search = 100\")\n", + " connection.commit()\n", + "\n", + " # Then perform the semantic search query\n", + " cur.execute(\n", + " \"\"\"\n", + " SELECT title, text, url, json_data,\n", + " embedding <=> %s::vector AS similarity\n", + " FROM wikipedia_data\n", + " ORDER BY similarity ASC\n", + " LIMIT %s\n", + " \"\"\",\n", + " (query_embedding, top_n),\n", + " )\n", + "\n", + " # Fetch and return the top results\n", + " results = cur.fetchall()\n", + "\n", + " # Format results as list of dictionaries for easier handling\n", + " formatted_results = []\n", + " for r in results:\n", + " formatted_results.append(\n", + " {\n", + " \"title\": r[0],\n", + " \"text\": r[1],\n", + " \"url\": r[2],\n", + " \"json_data\": r[3],\n", + " \"similarity\": r[4],\n", + " }\n", + " )\n", + "\n", + " return formatted_results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 7: Running a quick example of semantic search with postgres and pgvector" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# Initialize the benchmark results dictionary\n", - "benchmark_results = {\n", - " \"PostgreSQL\": {},\n", - " \"MongoDB\": {}\n", - "}\n", - "\n", - "# The concurrency levels for benchmark testing\n", - "# Each level represents the number of simultaneous queries to execute\n", - "CONCURRENT_QUERIES = [1, 2, 4, 5, 8, 10, 12, 16, 20, 24, 32, 40, 48, 50, 56, 64, 72, 80, 88, 96, 100, 200, 400]\n", - "\n", - "# The total number of iterations to run for each concurrency level\n", - "TOTAL_QUERIES=100" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Title: YouTube\n", + "Text: YouTube announced the project in September 2016 at an event in India. It was launched in India in February 2017, and expanded in November 2017 to 14 other countries, including Nigeria, Indonesia, Thailand, Malaysia, Vietnam, the Philippines, Kenya, and South Africa. It was rolled out in 130 countries worldwide, including Brazil, Mexico, Turkey, and Iraq on February 1, 2018. Before it shut down, the app was available to around 60% of the world's population.\n", + "URL: https://en.wikipedia.org/wiki?curid=3524766\n", + "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=3524766', 'text': \"YouTube announced the project in September 2016 at an event in India. It was launched in India in February 2017, and expanded in November 2017 to 14 other countries, including Nigeria, Indonesia, Thailand, Malaysia, Vietnam, the Philippines, Kenya, and South Africa. It was rolled out in 130 countries worldwide, including Brazil, Mexico, Turkey, and Iraq on February 1, 2018. Before it shut down, the app was available to around 60% of the world's population.\", 'title': 'YouTube'}\n", + "Similarity Score: 0.9034\n", + "--------------------------------------------------------------------------------\n", + "\n", + "Title: YouTube\n", + "Text: The mobile version of the site was relaunched based on HTML5 in July 2010, avoiding the need to use Adobe Flash Player and optimized for use with touch screen controls. The mobile version is also available as an app for the Android platform.\n", + "URL: https://en.wikipedia.org/wiki?curid=3524766\n", + "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=3524766', 'text': 'The mobile version of the site was relaunched based on HTML5 in July 2010, avoiding the need to use Adobe Flash Player and optimized for use with touch screen controls. The mobile version is also available as an app for the Android platform.', 'title': 'YouTube'}\n", + "Similarity Score: 0.8969\n", + "--------------------------------------------------------------------------------\n", + "\n", + "Title: YouTube\n", + "Text: In January 2009, YouTube launched \"YouTube for TV\", a version of the website tailored for set-top boxes and other TV-based media devices with web browsers, initially allowing its videos to be viewed on the PlayStation 3 and Wii video game consoles.\n", + "URL: https://en.wikipedia.org/wiki?curid=3524766\n", + "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=3524766', 'text': 'In January 2009, YouTube launched \"YouTube for TV\", a version of the website tailored for set-top boxes and other TV-based media devices with web browsers, initially allowing its videos to be viewed on the PlayStation 3 and Wii video game consoles.', 'title': 'YouTube'}\n", + "Similarity Score: 0.8967\n", + "--------------------------------------------------------------------------------\n", + "\n", + "Title: YouTube\n", + "Text: Later the same year, \"YouTube Feather\" was introduced as a lightweight alternative website for countries with limited internet speeds.\n", + "URL: https://en.wikipedia.org/wiki?curid=3524766\n", + "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=3524766', 'text': 'Later the same year, \"YouTube Feather\" was introduced as a lightweight alternative website for countries with limited internet speeds.', 'title': 'YouTube'}\n", + "Similarity Score: 0.8951\n", + "--------------------------------------------------------------------------------\n", + "\n", + "Title: Twitch (service)\n", + "Text: On May 18, 2014, \"Variety\" first reported that Google had reached a preliminary deal to acquire Twitch through its YouTube subsidiary for approximately .\n", + "URL: https://en.wikipedia.org/wiki?curid=33548254\n", + "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=33548254', 'text': 'On May 18, 2014, \"Variety\" first reported that Google had reached a preliminary deal to acquire Twitch through its YouTube subsidiary for approximately .', 'title': 'Twitch (service)'}\n", + "Similarity Score: 0.8928\n", + "--------------------------------------------------------------------------------\n", + "Connection closed\n" + ] + } + ], + "source": [ + "# Connect to PostgreSQL\n", + "try:\n", + " conn = psycopg.connect(\n", + " \"dbname=vector_db user=postgres password=test host=127.0.0.1\"\n", + " )\n", + "\n", + " # Run semantic search with a sample query\n", + " query_text = \"When was YouTube officially launched, and by whom?\"\n", + " results = semantic_search_with_postgres(query_text, conn, top_n=5)\n", + "\n", + " # Print results in a formatted way\n", + " for result in results:\n", + " print(f\"\\nTitle: {result['title']}\")\n", + " print(f\"Text: {result['text']}\")\n", + " print(f\"URL: {result['url']}\")\n", + " print(f\"JSON Data: {result['json_data']}\")\n", + " print(f\"Similarity Score: {1- result['similarity']:.4f}\")\n", + " print(\"-\" * 80)\n", + "\n", + "except Exception as e:\n", + " print(\"Failed to connect or execute query:\", e)\n", + "finally:\n", + " conn.close()\n", + " print(\"Connection closed\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Part 3: Semantic Search with MongoDB Atlas Vector Search" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 1: Install Libraries\n", + "\n", + "- `pymongo` (4.10.1): A Python driver for MongoDB (https://pymongo.readthedocs.io/en/stable/)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%pip install --quiet --upgrade pymongo" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 2: Installing MongoDB via Atlas CLI\n", + "\n", + "The Atlas CLI is a command line interface built specifically for MongoDB Atlas. \n", + "Interact with your Atlas database deployments and Atlas Search from the terminal with short, intuitive commands, so you can accomplish complex database management tasks in seconds.\n", + "\n", + "You can follow the instructions [here](https://www.mongodb.com/docs/atlas/cli/current/install-atlas-cli/#complete-the-prerequisites-3) to install the Atlas CLI using docker(other options are available) and get a local MongoDB database instance running.\n", + "\n", + "Follow the steps [here](https://www.mongodb.com/docs/atlas/cli/current/atlas-cli-docker/#follow-these-steps) to run Altas CLI commands with Docker.\n", + "\n", + "Find more information on the Atlas CLI [here](https://www.mongodb.com/docs/atlas/cli/): " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 3: Connect to MongoDB and Create Database and Collection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After installing the Atlas CLI, you can run the following command to connect to your MongoDB database:\n", + "1. atlas deployments connect\n", + "2. You will be prompted to specificy \"How would you like to connect to local9410\"\n", + "3. Select connectionString\n", + "4. Copy the connection string and paste it into the MONGO_URI environment variable\n", + "\n", + "More information [here](https://www.mongodb.com/docs/atlas/cli/current/atlas-cli-deploy-fts/#connect-to-the-deployment)." + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "# Set MongoDB URI\n", + "# Example: mongodb://localhost:54516/?directConnection=true\n", + "set_env_securely(\"MONGO_URI\", \"Enter your MONGO URI: \")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the following code blocks below we do the following:\n", + "1. Establish a connection to the MongoDB database\n", + "2. Create a database and collection if they do not already exist\n", + "3. Delete all data in the collection if it already exists\n" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [], + "source": [ + "import pymongo\n", + "\n", + "\n", + "def get_mongo_client(mongo_uri):\n", + " \"\"\"Establish and validate connection to the MongoDB.\"\"\"\n", + "\n", + " client = pymongo.MongoClient(\n", + " mongo_uri, appname=\"devrel.showcase.postgres_vs_mongodb.python\"\n", + " )\n", + "\n", + " # Validate the connection\n", + " ping_result = client.admin.command(\"ping\")\n", + " if ping_result.get(\"ok\") == 1.0:\n", + " # Connection successful\n", + " print(\"Connection to MongoDB successful\")\n", + " return client\n", + " else:\n", + " print(\"Connection to MongoDB failed\")\n", + " return None\n", + "\n", + "\n", + "MONGO_URI = os.environ[\"MONGO_URI\"]\n", + "if not MONGO_URI:\n", + " print(\"MONGO_URI not set in environment variables\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import getpass\n", - "\n", - "# Function to securely get and set environment variables\n", - "def set_env_securely(var_name, prompt):\n", - " value = getpass.getpass(prompt)\n", - " os.environ[var_name] = value" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "Connection to MongoDB successful\n", + "Collection 'wikipedia_data' already exists.\n" + ] + } + ], + "source": [ + "from pymongo.errors import CollectionInvalid\n", + "\n", + "mongo_client = get_mongo_client(MONGO_URI)\n", + "\n", + "DB_NAME = \"vector_db\"\n", + "COLLECTION_NAME = \"wikipedia_data\"\n", + "\n", + "# Create or get the database\n", + "db = mongo_client[DB_NAME]\n", + "\n", + "# Check if the collection exists\n", + "if COLLECTION_NAME not in db.list_collection_names():\n", + " try:\n", + " # Create the collection\n", + " db.create_collection(COLLECTION_NAME)\n", + " print(f\"Collection '{COLLECTION_NAME}' created successfully.\")\n", + " except CollectionInvalid as e:\n", + " print(f\"Error creating collection: {e}\")\n", + "else:\n", + " print(f\"Collection '{COLLECTION_NAME}' already exists.\")\n", + "\n", + "# Assign the collection\n", + "collection = db[COLLECTION_NAME]" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 1: Install Libraries\n", - "\n", - "All the libraries are installed using pip and facilitate the sourcing of data, embedding generation, and data visualization.\n", - "\n", - "- `datasets`: Hugging Face library for managing and preprocessing datasets across text, image, and audio (https://huggingface.co/datasets)\n", - "- `sentence_transformers`: For creating sentence embeddings for tasks like semantic search and clustering. (https://www.sbert.net/)\n", - "- `pandas`: A library for data manipulation and analysis with DataFrames and Series (https://pandas.pydata.org/)\n", - "- `matplotlib`: A library for creating static, interactive, and animated data visualizations (https://matplotlib.org/)\n", - "- `seaborn`: A library for creating statistical data visualizations (https://seaborn.pydata.org/)\n", - "- `cohere`: A library for generating embeddings and accessing the Cohere API or models (https://cohere.ai/)" + "data": { + "text/plain": [ + "DeleteResult({'n': 0, 'electionId': ObjectId('7fffffff0000000000000005'), 'opTime': {'ts': Timestamp(1733982920, 1), 't': 5}, 'ok': 1.0, '$clusterTime': {'clusterTime': Timestamp(1733982920, 1), 'signature': {'hash': b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00', 'keyId': 0}}, 'operationTime': Timestamp(1733982920, 1)}, acknowledged=True)" ] - }, + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "collection.delete_many({})" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 4: Vector Index Creation\n", + "\n", + "The `setup_vector_search_index` function creates a vector search index for the MongoDB collection.\n", + "\n", + "The `index_name` parameter is the name of the index to create.\n", + "\n", + "The `embedding_field_name` parameter is the name of the field containing the text embeddings on each document within the wikipedia_data collection.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "embedding_field_name = \"embedding\"\n", + "vector_search_index_name = \"vector_index\"" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "from pymongo.operations import SearchIndexModel\n", + "\n", + "\n", + "def setup_vector_search_index(collection, index_name=\"vector_index\"):\n", + " \"\"\"\n", + " Setup a vector search index for a MongoDB collection and wait for 30 seconds.\n", + "\n", + " Args:\n", + " collection: MongoDB collection object\n", + " index_definition: Dictionary containing the index definition\n", + " index_name: Name of the index (default: \"vector_index\")\n", + " \"\"\"\n", + " new_vector_search_index_model = SearchIndexModel(\n", + " definition={\n", + " \"fields\": [\n", + " {\n", + " \"type\": \"vector\",\n", + " \"path\": \"embedding\",\n", + " \"numDimensions\": 768,\n", + " \"similarity\": \"cosine\",\n", + " }\n", + " ]\n", + " },\n", + " name=index_name,\n", + " type=\"vectorSearch\",\n", + " )\n", + "\n", + " # Create the new index\n", + " try:\n", + " result = collection.create_search_index(model=new_vector_search_index_model)\n", + " print(f\"Creating index '{index_name}'...\")\n", + "\n", + " # Wait for 30 seconds\n", + " print(f\"Waiting for 30 seconds to allow index '{index_name}' to be created...\")\n", + " time.sleep(30)\n", + "\n", + " print(f\"30-second wait completed for index '{index_name}'.\")\n", + " return result\n", + "\n", + " except Exception as e:\n", + " print(f\"Error creating new vector search index '{index_name}': {e!s}\")\n", + " return None" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 11, - "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;49m24.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.3.1\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 --upgrade --quiet datasets sentence_transformers pandas matplotlib seaborn cohere" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "Creating index 'vector_index'...\n", + "Waiting for 30 seconds to allow index 'vector_index' to be created...\n", + "30-second wait completed for index 'vector_index'.\n" + ] }, { - "cell_type": "markdown", - "metadata": { - "id": "LyWZVRIqxVnV" - }, - "source": [ - "### Step 2: Data Loading\n", - "\n", - "The dataset for the benchmark is sourced from the Hugging Face Cohere Wikipedia dataset.\n", - "\n", - "The [Cohere/wikipedia-22-12-en-embeddings](https://huggingface.co/datasets/Cohere/wikipedia-22-12-en-embeddings) dataset on Hugging Face comprises English Wikipedia articles embedded using Cohere's multilingual-22-12 model. Each entry includes the article's title, text, URL, Wikipedia ID, view count, paragraph ID, language codes, and a 768-dimensional embedding vector. This dataset is valuable for tasks like semantic search, information retrieval, and NLP model training.\n", - "\n", - "For this benchmark, we are using 100,000 rows of the dataset and have removed the id, wiki_id, paragraph_id, langs and views columns." + "data": { + "text/plain": [ + "'vector_index'" ] - }, + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "setup_vector_search_index(collection, \"vector_index\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 5: Define Insert Data Function\n", + "\n", + "Because of the affinity of MongoDB for JSON data, we don't have to convert the Python Dictionary in the `json_data` attribute to a JSON string using the `json.dumps()` function. Instead, we can directly insert the Python Dictionary into the MongoDB collection.\n", + "\n", + "This reduced the operational overhead of the insertion processes in AI workloads.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "def insert_data_to_mongodb(dataframe, collection, database_type=\"MongoDB\"):\n", + " start_time = time.time()\n", + " total_rows = len(dataframe)\n", + "\n", + " try:\n", + " # Convert DataFrame to list of dictionaries for MongoDB insertion\n", + " documents = dataframe.to_dict(\"records\")\n", + "\n", + " # Use insert_many for better performance\n", + " result = collection.insert_many(documents)\n", + "\n", + " end_time = time.time()\n", + " total_time = end_time - start_time\n", + " rows_per_second = total_rows / total_time\n", + "\n", + " # print(f\"\\nMongoDB Insertion Statistics:\")\n", + " # print(f\"Total time: {total_time:.2f} seconds\")\n", + " # print(f\"Average insertion rate: {rows_per_second:.2f} rows/second\")\n", + " # print(f\"Total rows inserted: {len(result.inserted_ids)}\")\n", + "\n", + " # Store results in benchmark dictionary\n", + " if database_type not in benchmark_results:\n", + " benchmark_results[database_type] = {}\n", + "\n", + " benchmark_results[database_type][\"insert_time\"] = {\n", + " \"total_time\": total_time,\n", + " \"rows_per_second\": rows_per_second,\n", + " \"total_rows\": total_rows,\n", + " }\n", + "\n", + " return True\n", + "\n", + " except Exception as e:\n", + " print(f\"Error during MongoDB insertion: {e}\")\n", + " return False" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 6: Insert Data into MongoDB\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "documents = dataset_df.to_dict(\"records\")\n", + "success = insert_data_to_mongodb(dataset_df, collection)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 206 - }, - "id": "rCXZhJ9-vymv", - "outputId": "7f4210d7-5b8b-4c1d-89ab-7288623a8ca7" - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "from datasets import load_dataset\n", - "\n", - "# Using 100,000 rows for testing, feel free to change this to any number of rows you want to test\n", - "# The wikipedia-22-12-en-embeddings dataset has approximately 35,000,000 rows and requires 120GB of memory to load\n", - "MAX_ROWS = 100000\n", - "\n", - "dataset = load_dataset(\"Cohere/wikipedia-22-12-en-embeddings\", split=\"train\", streaming=True)\n", - "dataset_segment = dataset.take(MAX_ROWS)\n", - "\n", - "# Convert the dataset to a pandas dataframe\n", - "dataset_df = pd.DataFrame(dataset_segment)" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "{'insert_time': {'total_time': 90.82945108413696, 'rows_per_second': 1100.96448680911, 'total_rows': 100000}}\n" + ] + } + ], + "source": [ + "print(benchmark_results[\"MongoDB\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Step 7: Define Semantic Search Function\n", + "\n", + "The `semantic_search_with_mongodb` function performs a vector search in the MongoDB collection based on the user query.\n", + "\n", + "- `user_query` parameter is the user's query string.\n", + "- `collection` parameter is the MongoDB collection to search.\n", + "- `top_n` parameter is the number of top results to return.\n", + "- `vector_search_index_name` parameter is the name of the vector search index to use for the search.\n", + "\n", + "The `numCandidates` parameter is the number of candidate matches to consider. This is set to 100 to match the number of candidate matches to consider in the PostgreSQL vector search.\n", + "\n", + "Another point to note is the queries in MongoDB are performed using the `aggregate` function enabled by the MongoDB Query Language(MQL).\n", + "\n", + "This allows for more flexibility in the queries and the ability to perform more complex searches. And data processing opreations can be defined as stages in the pipeline. If you are a data engineer, data scientist or ML Engineer, the concept of pipeline processing is a key concept.\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def semantic_search_with_mongodb(\n", + " user_query, collection, top_n=5, vector_search_index_name=\"vector_index\"\n", + "):\n", + " \"\"\"\n", + " Perform a vector search in the MongoDB collection based on the user query.\n", + "\n", + " Args:\n", + " user_query (str): The user's query string.\n", + " collection (MongoCollection): The MongoDB collection to search.\n", + " additional_stages (list): Additional aggregation stages to include in the pipeline.\n", + " vector_search_index_name (str): The name of the vector search index.\n", + "\n", + " Returns:\n", + " list: A list of matching documents.\n", + " \"\"\"\n", + "\n", + " # Take a query embedding from the query_embeddings_dict\n", + " query_embedding = query_embeddings_dict[user_query]\n", + "\n", + " if query_embedding is None:\n", + " return \"Invalid query or embedding generation failed.\"\n", + "\n", + " # Define the vector search stage\n", + " vector_search_stage = {\n", + " \"$vectorSearch\": {\n", + " \"index\": vector_search_index_name, # specifies the index to use for the search\n", + " \"queryVector\": query_embedding, # the vector representing the query\n", + " \"path\": \"embedding\", # field in the documents containing the vectors to search against\n", + " \"numCandidates\": 100, # number of candidate matches to consider\n", + " \"limit\": top_n, # return top n matches\n", + " }\n", + " }\n", + "\n", + " project_stage = {\n", + " \"$project\": {\n", + " \"_id\": 0, # Exclude the _id field\n", + " \"title\": 1,\n", + " \"text\": 1,\n", + " \"url\": 1,\n", + " \"score\": {\"$meta\": \"vectorSearchScore\"}, # Include the search score\n", + " }\n", + " }\n", + "\n", + " # Define the aggregate pipeline with the vector search stage\n", + " pipeline = [vector_search_stage, project_stage]\n", + "\n", + " # Execute the search\n", + " results = collection.aggregate(pipeline)\n", + " return list(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "query_text = \"When was YouTube officially launched, and by whom?\"\n", + "\n", + "get_knowledge = semantic_search_with_mongodb(query_text, collection)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# Add a JSON attribute to the dataset consisting of the title, text and url\n", - "dataset_df['json_data'] = dataset_df.apply(\n", - " lambda row: {\n", - " 'title': row['title'],\n", - " 'text': row['text'],\n", - " 'url': row['url']\n", - " },\n", - " axis=1\n", - ")" + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titletexturlscore
0YouTubeYouTube announced the project in September 201...https://en.wikipedia.org/wiki?curid=35247660.951712
1YouTubeThe mobile version of the site was relaunched ...https://en.wikipedia.org/wiki?curid=35247660.948441
2YouTubeIn January 2009, YouTube launched \"YouTube for...https://en.wikipedia.org/wiki?curid=35247660.948370
3YouTubeLater the same year, \"YouTube Feather\" was int...https://en.wikipedia.org/wiki?curid=35247660.947532
4Twitch (service)On May 18, 2014, \"Variety\" first reported that...https://en.wikipedia.org/wiki?curid=335482540.946378
\n", + "
" + ], + "text/plain": [ + " title text \\\n", + "0 YouTube YouTube announced the project in September 201... \n", + "1 YouTube The mobile version of the site was relaunched ... \n", + "2 YouTube In January 2009, YouTube launched \"YouTube for... \n", + "3 YouTube Later the same year, \"YouTube Feather\" was int... \n", + "4 Twitch (service) On May 18, 2014, \"Variety\" first reported that... \n", + "\n", + " url score \n", + "0 https://en.wikipedia.org/wiki?curid=3524766 0.951712 \n", + "1 https://en.wikipedia.org/wiki?curid=3524766 0.948441 \n", + "2 https://en.wikipedia.org/wiki?curid=3524766 0.948370 \n", + "3 https://en.wikipedia.org/wiki?curid=3524766 0.947532 \n", + "4 https://en.wikipedia.org/wiki?curid=33548254 0.946378 " ] - }, + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.DataFrame(get_knowledge).head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Part 4: Vector Database Benchmarking" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Insertion Benchmark Process\n", + "\n", + "We are inserting data incrementally with doubling batch sizes and record performance metrics.\n", + "Notably, we will be measuring the time it takes to insert data incrementally and the number of rows inserted per second.\n", + "\n", + "We are using the `insert_data_incrementally` function to insert data incrementally.\n", + "\n", + "It starts with a batch size of 1 and doubles the batch size until it has inserted all the data, recording the time it takes to insert the data and the number of rows inserted per second.\n", + "\n", + "The key component we are interested in is the time it takes to insert the data and the number of rows inserted per second. In AI Workloads, there are data ingestion processes that are performned in batches from various data sources. So in practice, we are interested in the time it takes to insert the data and the number of rows inserted per second." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "\n", + "\n", + "def insert_data_incrementally(dataframe, connection, database_type=\"PostgreSQL\"):\n", + " \"\"\"\n", + " Insert data incrementally with doubling batch sizes and record performance metrics.\n", + " \"\"\"\n", + " incremental_metrics = {}\n", + " total_rows = len(dataframe)\n", + " remaining_rows = total_rows\n", + " start_idx = 0\n", + "\n", + " # Define batch sizes (1, 10, then doubling)\n", + " batch_sizes = [1, 10]\n", + " current_size = 20\n", + " while current_size < total_rows:\n", + " batch_sizes.append(current_size)\n", + " current_size *= 2\n", + "\n", + " for batch_size in batch_sizes:\n", + " # Skip if we've already inserted all data\n", + " if remaining_rows <= 0:\n", + " break\n", + "\n", + " # Calculate actual batch size based on remaining rows\n", + " actual_batch_size = min(batch_size, remaining_rows)\n", + " end_idx = start_idx + actual_batch_size\n", + "\n", + " # Get the batch of data\n", + " batch_df = dataframe.iloc[start_idx:end_idx]\n", + "\n", + " # Record start time\n", + " start_time = time.time()\n", + "\n", + " try:\n", + " # Insert data using existing function\n", + " if database_type == \"PostgreSQL\":\n", + " insert_data_to_postgres(batch_df, connection, database_type)\n", + " else: # MongoDB\n", + " insert_data_to_mongodb(batch_df, connection, database_type)\n", + "\n", + " # Record end time and calculate metrics\n", + " end_time = time.time()\n", + " total_time = end_time - start_time\n", + " rows_per_second = actual_batch_size / total_time\n", + "\n", + " # Store metrics\n", + " incremental_metrics[actual_batch_size] = {\n", + " \"total_time\": total_time,\n", + " \"rows_per_second\": rows_per_second,\n", + " \"batch_size\": actual_batch_size,\n", + " }\n", + "\n", + " # print(f\"\\nBatch Size {batch_size} Statistics:\")\n", + " # print(f\"Total time: {total_time:.2f} seconds\")\n", + " # print(f\"Average insertion rate: {rows_per_second:.2f} rows/second\")\n", + " # print(f\"Actual rows inserted: {actual_batch_size}\")\n", + "\n", + " except Exception as e:\n", + " print(f\"Error during batch insertion (size {batch_size}): {e}\")\n", + " raise e\n", + "\n", + " # Update counters\n", + " start_idx = end_idx\n", + " remaining_rows -= actual_batch_size\n", + "\n", + " # Store results in benchmark dictionary\n", + " if database_type not in benchmark_results:\n", + " benchmark_results[database_type] = {}\n", + "\n", + " benchmark_results[database_type][\"incremental_insert\"] = incremental_metrics\n", + "\n", + " return incremental_metrics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.1 PostgreSQL Insertion Benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# Remove the id field, wiki_id, paragraph_id, langs and views from the dataset\n", - "# This is to replicate the structure of dataset usually encountered in AI workloads, particularly in RAG systems where metadata is extracted from documents and stored.\n", - "dataset_df = dataset_df.drop(columns=['id', 'wiki_id', 'paragraph_id', 'langs', 'views'])" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "Table and index created successfully\n", + "\n", + "Connection closed\n" + ] + } + ], + "source": [ + "import psycopg\n", + "from pgvector.psycopg import register_vector\n", + "\n", + "try:\n", + " conn = psycopg.connect(\n", + " \"dbname=vector_db user=postgres password=test host=127.0.0.1\"\n", + " )\n", + " register_vector(conn)\n", + "\n", + " # Create fresh table\n", + " create_table(conn)\n", + "\n", + " postgres_metrics = insert_data_incrementally(dataset_df, conn, \"PostgreSQL\")\n", + "\n", + "except Exception as e:\n", + " print(\"Failed to execute:\", e)\n", + "finally:\n", + " conn.close()\n", + " print(\"\\nConnection closed\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.2 MongoDB Insertion Benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "# Change the emb colomn name to embedding\n", - "dataset_df = dataset_df.rename(columns={'emb': 'embedding'})" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "Connection to MongoDB successful\n", + "\n", + "MongoDB connection closed\n" + ] + } + ], + "source": [ + "try:\n", + " mongo_client = get_mongo_client(MONGO_URI)\n", + " db = mongo_client[DB_NAME]\n", + " collection = db[COLLECTION_NAME]\n", + "\n", + " # Clear collection\n", + " collection.delete_many({})\n", + "\n", + " mongo_metrics = insert_data_incrementally(dataset_df, collection, \"MongoDB\")\n", + "\n", + "except Exception as e:\n", + " print(\"MongoDB operation failed:\", e)\n", + "finally:\n", + " mongo_client.close()\n", + " print(\"\\nMongoDB connection closed\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.3 Visualize Insertion Benchmark\n" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "def plot_combined_insertion_metrics(postgres_metrics, mongo_metrics):\n", + " \"\"\"\n", + " Creates a combined line plot comparing PostgreSQL and MongoDB insertion metrics.\n", + " \"\"\"\n", + " # Create figure\n", + " plt.figure(figsize=(12, 6))\n", + "\n", + " # Extract data for both databases\n", + " batch_sizes = [\n", + " 1,\n", + " 10,\n", + " 20,\n", + " 40,\n", + " 80,\n", + " 160,\n", + " 320,\n", + " 640,\n", + " 1280,\n", + " 2560,\n", + " 5120,\n", + " 10240,\n", + " 20480,\n", + " 40960,\n", + " ]\n", + " postgres_times = [\n", + " postgres_metrics[size][\"total_time\"]\n", + " for size in batch_sizes\n", + " if size in postgres_metrics\n", + " ]\n", + " mongo_times = [\n", + " mongo_metrics[size][\"total_time\"]\n", + " for size in batch_sizes\n", + " if size in mongo_metrics\n", + " ]\n", + "\n", + " # Create the line plots\n", + " plt.plot(\n", + " batch_sizes[: len(postgres_times)],\n", + " postgres_times,\n", + " marker=\"o\",\n", + " label=\"PostgreSQL\",\n", + " color=\"blue\",\n", + " linewidth=2,\n", + " )\n", + " plt.plot(\n", + " batch_sizes[: len(mongo_times)],\n", + " mongo_times,\n", + " marker=\"s\",\n", + " label=\"MongoDB\",\n", + " color=\"green\",\n", + " linewidth=2,\n", + " )\n", + "\n", + " # Customize the plot\n", + " plt.title(\"Database Insertion Time Comparison\", fontsize=14)\n", + " plt.xlabel(\"Batch Size\", fontsize=12)\n", + " plt.ylabel(\"Time (seconds)\", fontsize=12)\n", + " plt.grid(True, linestyle=\"--\", alpha=0.7)\n", + " plt.legend(fontsize=10)\n", + "\n", + " # Use log scale for x-axis\n", + " plt.xscale(\"log\", base=2)\n", + "\n", + " # Define custom tick positions\n", + " custom_ticks = batch_sizes\n", + " plt.xticks(custom_ticks, custom_ticks, rotation=45, ha=\"right\")\n", + "\n", + " # Add value annotations\n", + " for i, (size, time) in enumerate(\n", + " zip(batch_sizes[: len(postgres_times)], postgres_times)\n", + " ):\n", + " plt.annotate(\n", + " f\"{time:.1f}s\",\n", + " (size, time),\n", + " textcoords=\"offset points\",\n", + " xytext=(0, 10),\n", + " ha=\"center\",\n", + " fontsize=8,\n", + " )\n", + "\n", + " for i, (size, time) in enumerate(zip(batch_sizes[: len(mongo_times)], mongo_times)):\n", + " plt.annotate(\n", + " f\"{time:.1f}s\",\n", + " (size, time),\n", + " textcoords=\"offset points\",\n", + " xytext=(0, -15),\n", + " ha=\"center\",\n", + " fontsize=8,\n", + " )\n", + "\n", + " # Add throughput information in a text box\n", + " postgres_throughput = [\n", + " metrics[\"rows_per_second\"] for metrics in postgres_metrics.values()\n", + " ]\n", + " mongo_throughput = [\n", + " metrics[\"rows_per_second\"] for metrics in mongo_metrics.values()\n", + " ]\n", + "\n", + " text_info = (\n", + " f\"Max Throughput:\\n\"\n", + " f\"PostgreSQL: {max(postgres_throughput):.0f} rows/s\\n\"\n", + " f\"MongoDB: {max(mongo_throughput):.0f} rows/s\"\n", + " )\n", + "\n", + " plt.text(\n", + " 0.02,\n", + " 0.98,\n", + " text_info,\n", + " transform=plt.gca().transAxes,\n", + " bbox=dict(facecolor=\"white\", alpha=0.8),\n", + " verticalalignment=\"top\",\n", + " fontsize=10,\n", + " )\n", + "\n", + " plt.tight_layout()\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titletexturlembeddingjson_data
0Deaths in 2022The following notable deaths occurred in 2022....https://en.wikipedia.org/wiki?curid=69407798[0.2865696847438812, -0.03181683272123337, 0.0...{'title': 'Deaths in 2022', 'text': 'The follo...
1YouTubeYouTube is a global online video sharing and s...https://en.wikipedia.org/wiki?curid=3524766[-0.09689381718635559, 0.1619211882352829, -0....{'title': 'YouTube', 'text': 'YouTube is a glo...
2YouTubeIn October 2006, YouTube was bought by Google ...https://en.wikipedia.org/wiki?curid=3524766[0.1302049309015274, 0.265736848115921, 0.4018...{'title': 'YouTube', 'text': 'In October 2006,...
3YouTubeSince its purchase by Google, YouTube has expa...https://en.wikipedia.org/wiki?curid=3524766[-0.09791257232427597, 0.13586106896400452, -0...{'title': 'YouTube', 'text': 'Since its purcha...
4YouTubeYouTube has had an unprecedented social impact...https://en.wikipedia.org/wiki?curid=3524766[-0.2641527056694031, 0.06968216598033905, -0....{'title': 'YouTube', 'text': 'YouTube has had ...
\n", - "
" - ], - "text/plain": [ - " title text \\\n", - "0 Deaths in 2022 The following notable deaths occurred in 2022.... \n", - "1 YouTube YouTube is a global online video sharing and s... \n", - "2 YouTube In October 2006, YouTube was bought by Google ... \n", - "3 YouTube Since its purchase by Google, YouTube has expa... \n", - "4 YouTube YouTube has had an unprecedented social impact... \n", - "\n", - " url \\\n", - "0 https://en.wikipedia.org/wiki?curid=69407798 \n", - "1 https://en.wikipedia.org/wiki?curid=3524766 \n", - "2 https://en.wikipedia.org/wiki?curid=3524766 \n", - "3 https://en.wikipedia.org/wiki?curid=3524766 \n", - "4 https://en.wikipedia.org/wiki?curid=3524766 \n", - "\n", - " embedding \\\n", - "0 [0.2865696847438812, -0.03181683272123337, 0.0... \n", - "1 [-0.09689381718635559, 0.1619211882352829, -0.... \n", - "2 [0.1302049309015274, 0.265736848115921, 0.4018... \n", - "3 [-0.09791257232427597, 0.13586106896400452, -0... \n", - "4 [-0.2641527056694031, 0.06968216598033905, -0.... \n", - "\n", - " json_data \n", - "0 {'title': 'Deaths in 2022', 'text': 'The follo... \n", - "1 {'title': 'YouTube', 'text': 'YouTube is a glo... \n", - "2 {'title': 'YouTube', 'text': 'In October 2006,... \n", - "3 {'title': 'YouTube', 'text': 'Since its purcha... \n", - "4 {'title': 'YouTube', 'text': 'YouTube has had ... " - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dataset_df.head(5)" + "data": { + "image/png": "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/fDyyy9j9+7d6NixI9RqNX7//XcMHToUNjY2eO2115T1+vXrh99//x3h4eEYMGAA7OzscOHCBWzatAl79uxBgwYNlHXfe+89fPbZZ6hatSqef/55uLm5YevWrRgzZgx27dqFpUuX5hnH0qVLsX79enTp0gVvvvkm7ty5g5iYGOUUuNatWxtcgD73Ps7Pl19+idGjR6NSpUp45ZVX4OTkhFWrVmH06NHYunUrVqxYkee00XPnzqFZs2aoW7cuBg4ciOTkZKxcuRJt2rTBiRMnUKVKFeMiG+mll17CkSNH8OyzzyIjIwOLFi1Cly5dkJCQgNdffx3Z2dl44YUXDD6fZ8+eNTgdMDk5GTExMbh48SKefvppdOvWDdeuXcPy5cuxbt06bNiwAU2bNn3kWObNmwcAmDBhwiPXtbW1VR4vXboUL7/8Muzs7PDSSy/B29sb69evx0cffYR169YhPj4e9vb2Bj9/+/ZttGjRAj4+PujXrx9OnjyJ1atXIzExEStXrkTLli3RuHFjDBw4EPv27cPy5ctx69YtbNy4Mc9Yzpw5g+joaDRq1AhDhgxBSkoKli5dilatWmHjxo0G2z5nzhz89ddfaNWqFTp16oT09HTEx8fjvffew549e/KdNMrKysKTTz6Je/fu4dlnn4W1tXWhn5PZs2fjzTffhK+vL5577jl4enriypUr2L17N/744w90795dWdccPsNERFSOCCIiIgtx9uxZAUC0b9++0PXmzp0rAIg+ffooy1JTU8XNmzfzrLtx40ZhZWUlXn31VYPlEydOFADEpk2b8n2PM2fO5FmWk5MjnnrqKaFWq0VKSorBcwAEAPHKK68InU6nLD906JCwtbUVlStXFunp6cryixcviqysrDzvMXnyZAFALFy4UFm2atUqAUCMGjUqz/p3794VmZmZyt/ff/99AUCMHz/eYBx37twRkZGRwtbWVvz333/5bnNumzZtEgDEG2+8YbC8devWAoBo2rSpSEtLU5YnJiYKa2trERoaqixLTU0VKpVKNG7cWGg0GoPX0Wg04vbt28rf169fr+z7e/fuKct1Op0YPHiwACCWLVumLJ8/f74AIKysrERcXFyB4584cWK+25ff/j99+rSwtrYW3t7e4vz588ryzMxM0aJFCwFA/Pzzz8py/ecVgPjss88MXv/DDz8UAMSnn36a7/sXRj/2fv365fu8/n0ffl6/b1q0aGHQ8LfffhMAhLu7u3jhhRdETk6O8ty0adMEADFjxgyD13riiSeEWq0Wa9euNVielJQkXFxcRP369R+5HefOnRMAhL+//yPXzS0tLU24ubkJOzs7cejQIWW5VqsVL730kgAgPvroI4Of0e+Ht956y2D5kCFDlG3/6quvlOU6nU506tRJABD79u1Tlufep+PGjTN4rbVr1woAebY9JSUlz+dbp9OJgQMHCgBi27ZtBs8FBQUpn/XcvxP0+vXrJwCIs2fPKssaNWokbG1txdWrV/Osf+PGDeVxefkMExGR+eDpe0RERA/x8/MDANy4cUNZ5ubmhkqVKuVZt02bNqhbt26+p9AVplq1anmWWVtbY/DgwdBqtdi0aVOe59VqNT755BODoxDCw8PRp08fXL9+HWvWrFGWV61a1eDIED39UUz5jdfBwSHPMmdnZ+WUKJ1Oh9mzZ6N69erKaWt6Li4umDBhArKzs7FixYrCNr1IPv30U7i6uip/Dw0NRXR0NJKSknD37l0A8pQqIQTs7e1hZWX4f9Ko1WqDo5a+/fZbAMBPP/0EJycnZblKpcJnn30GlUqFJUuW5BlH165d0a5du8feHgBYvHgxNBoNRo8ejYCAAGW5nZ0dpk2bBgDKKVa5VatWDWPGjDFYNmjQIADAnj17SmRsxTF16lSDhj169ICNjQ1SU1Mxffp0WFs/OBD/5ZdfBgCD07QOHDiA7du3o1+/fmjfvr3Ba9eqVQuvvfYajhw58sjT+K5cuQIA8Pf3L9b4V65cibS0NAwcOBDh4eHKcisrK3z++ecGp7rl5uzsjClTphgs02+fp6cnRowYoSxXqVTo2bMnAOR7ipq7uzs++OADg2Xt27dH27ZtceTIEYPT+AIDA6FWqw3WValUGDp0KID8v8sA8Pnnn+f7nS6IjY2NcvRkbp6enspjc/kMExFR+cHT94iIiIooPj4eX331FXbt2oUbN24YXD8lvwmgwty9exfTp0/Hn3/+ieTkZNy/f9/g+UuXLuX5mcDAQOUUwdxatmyJuXPn4sCBA8ppNkIIzJ8/H7GxsTh69CjS0tKg0+nyff1WrVrB19cXn332GQ4dOoQuXbqgdevWCAsLM5h4SkpKwu3bt+Hn56dcMyu369evAwASExOL1SI/jRs3zrNMP/mQmpoKFxcXuLq6olOnTlizZg0aNWqEF154ATExMWjSpEmef1zv3LkTTk5OyuleD3NwcMh33FFRUY+9LXoHDhwAAIPT/fSaN28Oe3t7HDx4MM9zDRs2zDPplrtFWXv4wulWVlbw9vZGenp6nrsN6i+onfvztnPnTgDA1atX873Qun4/JCYmol69eiU4cqmw/RAYGIiQkBCcPHkSd+/ehYuLi/JczZo14ejoaLC+fvvCw8PznLKW37brRUREwNnZOc/yli1bYsOGDThw4IDyHcjOzsa3336LX3/9FYmJibh37x6EEMrP5Pf69vb2qF+/fr7bn5+ePXti7NixqFevHl555RW0adMGLVq0MJgYBsznM0xEROUHJ6WIiIgeov9HXuXKlZVlS5cuxUsvvQRnZ2e0b98ewcHBcHR0VC6GnZKSUuTXz87ORkxMDPbv34+IiAj06dMHnp6esLa2Vq5VlJWVlefnCrruin557guSjxgxAt9++y0CAgLw7LPPwtfXVzniafLkyQav7+bmhp07d2LChAn466+/lCOuAgICMG7cOLz55psAgFu3bgEAjh07hmPHjhW4fQ9PsBnj4X8MA1COwMl9UfKlS5fik08+weLFi5UjT1xdXTFgwAB88sknyiTCrVu3oNFo8p1MK2zcJXmtmzt37hT4miqVClWqVMF///2X57mitigrBY2nsHHmviC3/nP0999/4++//y7wfR71OfLx8QGAfJsVprD9AMjJpJMnT+LOnTsGk1KFbV9Rt12vON/lHj164K+//kKtWrWU61/pj0ybNWtWvr8rvL2980ySFeadd96Bp6cnZs+ejRkzZihHvHXu3BkzZ85Ujuw0l88wERGVH5yUIiIieoj+jmlNmjRRlk2aNAn29vbYt28fatasabD+r7/+WqzXX7lyJfbv349Bgwbhf//7X57XWrBgQb4/9/CdvB5err+Q9LVr1/Ddd98hPDwcO3bsMDi648qVK/lOzAQGBiI2NhY6nQ6HDx/G+vXr8fXXX2Po0KHw8PDAyy+/rPzDsnv37li2bFmxtrm0ODo6YsqUKZgyZQrOnj2LTZs24YcffsCsWbOQkZGBH3/8EYD8R7FKpTI4JbMoivMP+0fR97t69WqeI96EELh69Wq+/3g3N/ptfNyL4gcFBaFq1aq4cOECTp06led7+aj3L+j7pD8tsDT3RVG/y3v27MFff/2F9u3b4++/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", + "text/plain": [ + "
" ] - }, + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_combined_insertion_metrics(postgres_metrics, mongo_metrics)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Benchmarking Semantic Search with PostgreSQL and PgVector" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2.1 PostgreSQL Semantic Search Benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import concurrent.futures\n", + "import random\n", + "from concurrent.futures import ThreadPoolExecutor\n", + "from statistics import mean, stdev\n", + "\n", + "import psycopg\n", + "from pgvector.psycopg import register_vector\n", + "\n", + "\n", + "def benchmark_search_postgres(\n", + " connection,\n", + " database_type=\"PostgreSQL\",\n", + " num_queries=100,\n", + " concurrent_queries=[1, 10, 50, 100],\n", + "):\n", + " \"\"\"\n", + " Benchmark the vector database performance with true concurrent queries.\n", + "\n", + " Args:\n", + " connection: Database connection\n", + " database_type: Type of database (e.g., 'PostgreSQL', 'MongoDB')\n", + " num_queries: Number of benchmark iterations for statistical significance\n", + " concurrent_queries: Different concurrency levels to test\n", + " \"\"\"\n", + " query_templates = [\n", + " \"When was YouTube officially launched, and by whom?\",\n", + " \"What is YouTube's slogan introduced after Google's acquisition?\",\n", + " \"How many hours of videos are collectively watched on YouTube daily?\",\n", + " \"Which was the first video uploaded to YouTube, and when was it uploaded?\",\n", + " \"What was the acquisition cost of YouTube by Google, and when was the deal finalized?\",\n", + " \"What was the first YouTube video to reach one million views, and when did it happen?\",\n", + " \"What are the three separate branches of the United States government?\",\n", + " \"Which country has the highest documented incarceration rate and prison population?\",\n", + " \"How many executions have occurred in the United States since 1977, and which countries have more?\",\n", + " \"What percentage of the global military spending did the United States account for in 2019?\",\n", + " \"How is the U.S. president elected?\",\n", + " \"What cooling system innovation was included in the proposed venues for the World Cup in Qatar?\",\n", + " \"What lawsuit was filed against Google in June 2020, and what was it about?\",\n", + " \"How much was Google fined by CNIL in January 2022, and for what reason?\",\n", + " \"When did YouTube join the NSA's PRISM program, according to reports?\",\n", + " ]\n", + "\n", + " if database_type not in benchmark_results:\n", + " benchmark_results[database_type] = {}\n", + "\n", + " benchmark_results[database_type][\"specific\"] = {}\n", + "\n", + " def execute_single_query():\n", + " \"\"\"Execute a single query and measure its latency\"\"\"\n", + " query = random.choice(query_templates)\n", + " start_time = time.time()\n", + " result = semantic_search_with_postgres(query, connection, top_n=5)\n", + " end_time = time.time()\n", + " return end_time - start_time\n", + "\n", + " for number_of_queries in concurrent_queries:\n", + " latencies = []\n", + "\n", + " for _ in range(num_queries):\n", + " with ThreadPoolExecutor(max_workers=number_of_queries) as executor:\n", + " # Submit queries and get individual latencies\n", + " futures = [\n", + " executor.submit(execute_single_query)\n", + " for _ in range(number_of_queries)\n", + " ]\n", + " # Collect individual query latencies as they complete\n", + " batch_latencies = [\n", + " future.result()\n", + " for future in concurrent.futures.as_completed(futures)\n", + " ]\n", + " latencies.extend(batch_latencies)\n", + "\n", + " # Calculate metrics using individual query latencies\n", + " avg_latency = mean(latencies)\n", + " throughput = 1 / avg_latency # Base queries per second per query\n", + " p95_latency = sorted(latencies)[int(len(latencies) * 0.95)]\n", + " std_dev_latency = stdev(latencies)\n", + "\n", + " benchmark_results[database_type][\"specific\"][number_of_queries] = {\n", + " \"avg_latency\": avg_latency,\n", + " \"throughput\": throughput * number_of_queries, # Scale by concurrent queries\n", + " \"p95_latency\": p95_latency,\n", + " \"std_dev\": std_dev_latency,\n", + " }\n", + "\n", + " return benchmark_results" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "wOwXzXnjxHfb" - }, - "source": [ - "### Step 3: Embedding Generation" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "Running benchmark...\n", + "\n", + "Connection closed\n" + ] + } + ], + "source": [ + "# Run the benchmark\n", + "try:\n", + " conn = psycopg.connect(\n", + " \"dbname=vector_db user=postgres password=test host=127.0.0.1\"\n", + " )\n", + " register_vector(conn)\n", + "\n", + " print(\"Running benchmark...\")\n", + " results = benchmark_search_postgres(\n", + " conn,\n", + " database_type=\"PostgreSQL\",\n", + " num_queries=TOTAL_QUERIES,\n", + " concurrent_queries=CONCURRENT_QUERIES,\n", + " )\n", + "\n", + "except Exception as e:\n", + " print(\"Benchmark failed:\", e)\n", + "finally:\n", + " conn.close()\n", + " print(\"\\nConnection closed\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pprint\n", + "\n", + "pprint.pprint(benchmark_results[\"PostgreSQL\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2.2 MongoDB Semantic Search Benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "def benchmark_search_mongo(\n", + " collection,\n", + " database_type=\"MongoDB\",\n", + " num_queries=100,\n", + " concurrent_queries=[1, 10, 50, 100],\n", + "):\n", + " \"\"\"\n", + " Benchmark MongoDB vector search with true concurrency.\n", + "\n", + " Args:\n", + " collection: MongoDB collection object\n", + " database_type: Type of database (default: \"MongoDB\")\n", + " num_queries: Number of benchmark iterations for statistical significance\n", + " batch_sizes: Different concurrency levels to test\n", + " \"\"\"\n", + " query_templates = [\n", + " \"When was YouTube officially launched, and by whom?\",\n", + " \"What is YouTube's slogan introduced after Google's acquisition?\",\n", + " \"How many hours of videos are collectively watched on YouTube daily?\",\n", + " \"Which was the first video uploaded to YouTube, and when was it uploaded?\",\n", + " \"What was the acquisition cost of YouTube by Google, and when was the deal finalized?\",\n", + " \"What was the first YouTube video to reach one million views, and when did it happen?\",\n", + " \"What are the three separate branches of the United States government?\",\n", + " \"Which country has the highest documented incarceration rate and prison population?\",\n", + " \"How many executions have occurred in the United States since 1977, and which countries have more?\",\n", + " \"What percentage of the global military spending did the United States account for in 2019?\",\n", + " \"How is the U.S. president elected?\",\n", + " \"What cooling system innovation was included in the proposed venues for the World Cup in Qatar?\",\n", + " \"What lawsuit was filed against Google in June 2020, and what was it about?\",\n", + " \"How much was Google fined by CNIL in January 2022, and for what reason?\",\n", + " \"When did YouTube join the NSA's PRISM program, according to reports?\",\n", + " ]\n", + "\n", + " if database_type not in benchmark_results:\n", + " benchmark_results[database_type] = {}\n", + "\n", + " benchmark_results[database_type][\"specific\"] = {}\n", + "\n", + " def execute_single_query():\n", + " \"\"\"Execute a single query with MongoDB connection\"\"\"\n", + " query = random.choice(query_templates)\n", + " start_time = time.time()\n", + " result = semantic_search_with_mongodb(query, collection, top_n=5)\n", + " end_time = time.time()\n", + " return end_time - start_time\n", + "\n", + " for number_of_queries in concurrent_queries:\n", + " latencies = []\n", + "\n", + " for _ in range(num_queries):\n", + " with ThreadPoolExecutor(max_workers=number_of_queries) as executor:\n", + " # Submit queries and get individual latencies\n", + " futures = [\n", + " executor.submit(execute_single_query)\n", + " for _ in range(number_of_queries)\n", + " ]\n", + " # Collect individual query latencies\n", + " batch_latencies = [\n", + " future.result()\n", + " for future in concurrent.futures.as_completed(futures)\n", + " ]\n", + " latencies.extend(batch_latencies)\n", + "\n", + " # Calculate metrics using individual query latencies\n", + " avg_latency = mean(latencies)\n", + " throughput = 1 / avg_latency # Queries per second per query\n", + " p95_latency = sorted(latencies)[int(len(latencies) * 0.95)]\n", + " std_dev_latency = stdev(latencies)\n", + "\n", + " # Store results\n", + " benchmark_results[database_type][\"specific\"][number_of_queries] = {\n", + " \"avg_latency\": avg_latency,\n", + " \"throughput\": throughput * number_of_queries, # Scale by concurrent queries\n", + " \"p95_latency\": p95_latency,\n", + " \"std_dev\": std_dev_latency,\n", + " }\n", + "\n", + " return benchmark_results[database_type]" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "# Set Cohere API key\n", - "set_env_securely(\"COHERE_API_KEY\", \"Enter your Cohere API key: \")" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "Connection to MongoDB successful\n", + "Running MongoDB benchmark...\n", + "\n", + "MongoDB connection closed\n" + ] + } + ], + "source": [ + "# Run the benchmark for MongoDB\n", + "try:\n", + " mongo_client = get_mongo_client(MONGO_URI)\n", + " db = mongo_client[DB_NAME]\n", + " collection = db[COLLECTION_NAME]\n", + "\n", + " print(\"Running MongoDB benchmark...\")\n", + " results = benchmark_search_mongo(\n", + " collection, num_queries=TOTAL_QUERIES, concurrent_queries=CONCURRENT_QUERIES\n", + " )\n", + "\n", + "except Exception as e:\n", + " print(\"MongoDB benchmark failed:\", e)\n", + "finally:\n", + " mongo_client.close()\n", + " print(\"\\nMongoDB connection closed\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(benchmark_results)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2.3 Visualize Semantic Search Benchmark" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [], + "source": [ + "def bar_chart_benchmark_comparison(\n", + " benchmark_results, metric=\"avg_latency\", metric_label=\"Average Latency (ms)\"\n", + "):\n", + " \"\"\"\n", + " Generates bar charts to compare benchmark results for each metric across databases.\n", + "\n", + " Args:\n", + " benchmark_results (dict): Benchmark results structured as a nested dictionary.\n", + " metric (str): The performance metric to visualize (e.g., \"avg_latency\", \"throughput\").\n", + " metric_label (str): The label to display for the metric.\n", + " \"\"\"\n", + " # Extract data for the bar chart\n", + " query_types = [\"specific\"]\n", + " batch_sizes = CONCURRENT_QUERIES\n", + " data = []\n", + "\n", + " for query_type in query_types:\n", + " for batch_size in batch_sizes:\n", + " row = {\"Batch Size\": batch_size, \"Query Type\": query_type}\n", + " for db_type in benchmark_results:\n", + " # Safely extract metric values or default to None\n", + " value = (\n", + " benchmark_results[db_type]\n", + " .get(query_type, {})\n", + " .get(batch_size, {})\n", + " .get(metric, None)\n", + " )\n", + " # Scale values if necessary\n", + " if value is not None and metric in [\"avg_latency\", \"p95_latency\"]:\n", + " value *= 1000 # Convert to ms\n", + " row[db_type] = value\n", + " data.append(row)\n", + "\n", + " # Convert the data into a plot-friendly structure\n", + " for query_type in query_types:\n", + " labels = [str(batch_size) for batch_size in batch_sizes]\n", + " mongodb_values = [\n", + " row[\"MongoDB\"] for row in data if row[\"Query Type\"] == query_type\n", + " ]\n", + " postgres_values = [\n", + " row[\"PostgreSQL\"] for row in data if row[\"Query Type\"] == query_type\n", + " ]\n", + "\n", + " # Create the bar chart\n", + " fig, ax = plt.subplots(figsize=(15, 6))\n", + "\n", + " # Set the width of each bar and positions of the bars\n", + " width = 0.35\n", + " x = np.arange(len(batch_sizes))\n", + "\n", + " # Create bars\n", + " postgres_bars = ax.bar(\n", + " x - width / 2,\n", + " postgres_values,\n", + " width,\n", + " label=\"PostgreSQL\",\n", + " color=\"lightblue\",\n", + " edgecolor=\"blue\",\n", + " )\n", + " mongodb_bars = ax.bar(\n", + " x + width / 2,\n", + " mongodb_values,\n", + " width,\n", + " label=\"MongoDB\",\n", + " color=\"lightgreen\",\n", + " edgecolor=\"green\",\n", + " )\n", + "\n", + " # Add grid\n", + " ax.grid(True, linestyle=\"--\", alpha=0.7, axis=\"y\")\n", + "\n", + " # Add titles and labels\n", + " ax.set_title(\n", + " f\"{metric_label} Comparison for {query_type.capitalize()} Queries\", pad=20\n", + " )\n", + " ax.set_xlabel(\"Concurrent Queries\", labelpad=10)\n", + " ax.set_ylabel(metric_label, labelpad=10)\n", + "\n", + " # Set x-axis ticks\n", + " ax.set_xticks(x)\n", + " ax.set_xticklabels(labels, rotation=45, ha=\"right\")\n", + "\n", + " # Add legend\n", + " ax.legend(fontsize=10)\n", + "\n", + " # Add value labels on top of bars\n", + " def autolabel(rects):\n", + " for rect in rects:\n", + " height = rect.get_height()\n", + " ax.annotate(\n", + " f\"{height:.2f}\",\n", + " xy=(rect.get_x() + rect.get_width() / 2, height),\n", + " xytext=(0, 3), # 3 points vertical offset\n", + " textcoords=\"offset points\",\n", + " ha=\"center\",\n", + " va=\"bottom\",\n", + " rotation=90,\n", + " fontsize=8,\n", + " )\n", + "\n", + " autolabel(postgres_bars)\n", + " autolabel(mongodb_bars)\n", + "\n", + " plt.tight_layout()\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using the Cohere API to generate embeddings for the test queries.\n", - "\n", - "Using the `embed-multilingual-v2.0` model. This is the same model used in the Cohere Wikipedia dataset.\n", - "\n", - "Embedding size is 768 dimensions and the precision is float32." + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJNCAYAAADeVjy8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3RU5dbH8d9MOoEklIQQEiBButIldESQICBFEFFUmjRBihT1orSLKCBIUSlXBVQQRBGRKyUIKk2kh14DkU4ghBJISOa8f3AzL0MykIEkE+D7WStrMfs855y955zM0j1PnmMyDMMQAAAAAAAAAABIw+zsBAAAAAAAAAAAyKloogMAAAAAAAAAYAdNdAAAAAAAAAAA7KCJDgAAAAAAAACAHTTRAQAAAAAAAACwgyY6AAAAAAAAAAB20EQHAAAAAAAAAMAOmugAAAAAAAAAANhBEx0AAAAAAAAAADtoogMAAOCh988//8jT01Pr1q3L1vO2a9dObdu2zdZzPuiGDx8uk8nk7DTsOnjwoBo1aiRfX1+ZTCYtWrTI2Sk51VNPPaWnnnrKJnbmzBm1adNG+fPnl8lk0sSJE/X777/LZDLp999/d0qe2a1jx44qVqyYs9MAAACZhCY6AAB4YHz++ecymUwKDw93dio5TrFixdSsWbNMOdavv/6q4cOHZ8qxcoqRI0cqPDxctWrVytbzvv322/rxxx+1Y8eODO+TkpKimTNn6qmnnlK+fPnk4eGhYsWKqVOnTtq8eXMWZouM6NChg3bu3KkPPvhA33zzjapWrZql5zt37pz69u2r0qVLy8vLSwEBAapWrZrefvttXblyJUvPfa/69++v5cuX691339U333yjxo0bZ8l5YmJi1KNHDxUrVkweHh4KCAhQq1attH79+iw5HwAAeHSZDMMwnJ0EAABARtSqVUsnT57U0aNHdfDgQT322GPOTinHKFasmB5//HEtWbLkvo/Vu3dvffbZZ3pY/jPx3LlzKly4sGbPnq2XXnop288fHh6uUqVK6euvv77r2GvXrun555/XsmXLVLduXT333HPKly+fjh49qu+//14HDhxQTEyMgoODsyFz50hOTlZycrI8PT2dnUoa165dU65cuTRkyBCNGjUqy8934cIFVapUSZcuXVLnzp1VunRpnT9/XlFRUVqyZImioqKcPts5KSlJkuTu7m6NBQYGqmHDhvr222+tMYvFoqSkJLm7u8tsvv+5XOvWrVOTJk0kSa+//rrKli2r06dPa9asWTp8+LA+++wz9ezZ877Pc69u3Lghi8UiDw8Pp+UAAAAyj6uzEwAAAMiI6OhorV+/XgsXLlT37t01Z84cDRs2LFtzSG0C5cTmHuz79ttv5erqqueee84p52/btq2GDRumzz//XLlz577j2EGDBmnZsmX65JNP1K9fP5ttw4YN0yeffJKFmTrX1atX5e3tLVdXV7m65sz/TTl37pwkyc/PL9OOmVp3er788kvFxMRo3bp1qlmzps22S5cu2TSunSW9HM6ePZvmPTKbzZn22RkXF6c2bdrIy8tL69atU/Hixa3b3nrrLUVEROjNN99UpUqVVL169Uw5Z0alXk83N7dsPS8AAMhaLOcCAAAeCHPmzFHevHnVtGlTtWnTRnPmzLFuu3HjhvLly6dOnTql2e/SpUvy9PTUwIEDrbHExEQNGzZMjz32mDw8PBQSEqLBgwcrMTHRZl+TyaTevXtrzpw5KleunDw8PLRs2TJJ0scff6yaNWsqf/788vLyUpUqVfTDDz+kOf+1a9fUp08fFShQQHny5FHz5s114sQJmUymNEumnDhxQp07d1bBggXl4eGhcuXK6auvvrqft83GmjVr9MILL6hIkSLWuvv3769r165Zx3Ts2FGfffaZtf7Un1QWi0UTJ05UuXLl5OnpqYIFC6p79+6Ki4uzOVfq8jJr165VtWrV5OnpqbCwsHRnY1+8eFH9+/e3LskQHBys1157TbGxsbpy5Yq8vb3Vt2/fNPsdP35cLi4u+vDDD+9Y96JFixQeHp6mgf3UU0/p8ccfV1RUlOrVq6dcuXLpscces17HP/74Q+Hh4fLy8lKpUqW0cuVKm/0vX76sfv362Swl8cwzz2jr1q0245555hldvXpVkZGRd8zz+PHjmj59up555pk0DXRJcnFx0cCBA21moW/btk3PPvusfHx8lDt3bjVo0EB//fWXzX6zZs2SyWTS2rVr1adPH/n7+8vPz0/du3dXUlKSLl68qNdee0158+ZV3rx5NXjwYJu/Qjh69KhMJpM+/vhjffLJJypatKi8vLxUr1497dq1y+ZcUVFR6tixo8LCwuTp6anAwEB17txZ58+ftxmXuu75nj179PLLLytv3ryqXbu2zbZbRUZGqnbt2vLz81Pu3LlVqlQp/etf/7IZc/bsWXXp0kUFCxaUp6enKlSooNmzZ9uMubWWGTNmqHjx4vLw8NCTTz6pTZs23fH6DB8+XEWLFpV088sOk8lkMwvckWvxxx9/6I033lBAQMAd/6rg8OHDcnFxSbcR7OPjY9OUTr2ft2zZopo1a8rLy0uhoaGaNm1amn0z+hko3fwSqlq1asqVK5fy5s2runXrasWKFTbnTV0TPbU+wzD02Wef2Xx+2FsTfePGjWrSpIny5s0rb29vlS9fXpMmTbL7nkjS9OnTdfr0aY0bN86mgS5JXl5e1us+cuRIa9zeWvupOR89etQmvnTpUtWpU0fe3t7KkyePmjZtqt27d9uM6dixo3Lnzq3Dhw+rSZMmypMnj9q3b2/ddvtfCWT083Pz5s2KiIhQgQIFrNexc+fOd3xPAABA1sqZUzwAAABuM2fOHD3//PNyd3fXSy+9pKlTp2rTpk168skn5ebmplatWmnhwoWaPn26zczIRYsWKTExUe3atZN0s4nRvHlzrV27Vt26dVOZMmW0c+dOffLJJzpw4ECahwSuWrVK33//vXr37q0CBQpYmyKTJk1S8+bN1b59eyUlJWnevHl64YUXtGTJEjVt2tS6f8eOHfX999/r1VdfVfXq1fXHH3/YbE915swZVa9e3dq49/f319KlS9WlSxddunQp3aaqoxYsWKCEhAT17NlT+fPn199//60pU6bo+PHjWrBggSSpe/fuOnnypCIjI/XNN9+kOUb37t01a9YsderUSX369FF0dLQ+/fRTbdu2TevWrbOZfXno0CG1adNGXbp0UYcOHfTVV1+pY8eOqlKlisqVKydJunLliurUqaO9e/eqc+fOqly5smJjY7V48WIdP35cFStWVKtWrTR//nxNmDBBLi4u1uN/9913MgzD2rRKz40bN7Rp0ya7yzrExcWpWbNmateunV544QVNnTpV7dq105w5c9SvXz/16NFDL7/8ssaNG6c2bdron3/+UZ48eSRJPXr00A8//KDevXurbNmyOn/+vNauXau9e/eqcuXK1nOULVvWOmO2VatWdnNdunSpkpOT9eqrr9odc6vdu3erTp068vHx0eDBg+Xm5qbp06frqaeesn4BcKs333xTgYGBGjFihP766y/NmDFDfn5+Wr9+vYoUKaLRo0fr119/1bhx4/T4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AADsoIkOAAAAAAAAAIAdNNEBAAAAAAAAALCDJjoAAAAAAAAAAHa4OjuBR1lMfIxiE2Kz7XwFchVQEd8i2XY+AAAAAAAAAHjQ0UR3kpj4GJX+rLSu3biWbef0cvPSvl77HGqkd+zYUbNnz1b37t01bdo0m229evXS559/rg4dOmjWrFmZnO39MZlM1n/nypVLQUFBqlWrlt58801VqVLFuu33339X/fr1ra89PT0VFhamvn37qlu3btmaMwAAAAAAAICchya6k8QmxOrajWt6pdErKpivYJaf78yFM/p2xbeKTYh1eDZ6SEiI5s2bp08++UReXl6SpOvXr2vu3LkqUiTnzmyfOXOmGjdurOvXr+vAgQOaMWOGwsPD9dVXX+m1116zGbt//375+Pjo2rVr+uWXX9SzZ08VL15cDRo0cFL2AAAAAAAAAHIC1kR3soL5CiokICTLf+6nUV+5cmWFhIRo4cKF1tjChQtVpEgRVapUyRpLTExUnz59FBAQIE9PT9WuXVubNm2ybv/9999lMpn022+/qWrVqsqVK5dq1qyp/fv325xv1KhRCggIUJ48efT666/rnXfeUcWKFa3bLRaLRo4cqeDgYHl4eKhixYpatmxZmrz9/PwUGBioYsWKqVGjRvrhhx/Uvn179e7dW3FxcTZjAwICFBgYqNDQUPXp00ehoaHaunXrPb9nAAAAAAAAAB4ONNGRIZ07d9bMmTOtr7/66it16tTJZszgwYP1448/avbs2dq6dasee+wxRURE6MKFCzbjhgwZovHjx2vz5s1ydXVV586drdvmzJmjDz74QGPGjNGWLVtUpEgRTZ061Wb/SZMmafz48fr4448VFRWliIgINW/eXAcPHrxrHf3799fly5cVGRmZ7nbDMLRs2TLFxMQoPDz8rscDAAAAAAAA8HCjiY4MeeWVV7R27VodO3ZMx44d07p16/TKK69Yt1+9elVTp07VuHHj9Oyzz6ps2bL6z3/+Iy8vL3355Zc2x/rggw9Ur149lS1bVu+8847Wr1+v69evS5KmTJmiLl26qFOnTipZsqSGDh2qJ554wmb/jz/+WG+//bbatWunUqVKacyYMapYsaImTpx41zpKly4tSTp69KhNPDg4WLlz55a7u7uaNm2qYcOGqW7duvfwTgEAAAAAAAB4mLAmOjLE399fTZs21axZs2QYhpo2baoCBQpYtx8+fFg3btxQrVq1rDE3NzdVq1ZNe/futTlW+fLlrf8uVKiQJOns2bMqUqSI9u/frzfeeMNmfLVq1bRq1SpJ0qVLl3Ty5Emb80hSrVq1tGPHjrvWYRiGJNsHj0rSmjVrlCdPHiUmJurvv/9W7969lS9fPvXs2fOuxwQAAAAAAADw8KKJjgzr3LmzevfuLUn67LPP7vk4bm5u1n+nNrMtFsv9JZdBqQ390NBQm3hoaKj8/PwkSeXKldPGjRv1wQcf0EQHAAAAAAAAHnEs54IMa9y4sZKSknTjxg1FRETYbCtevLjc3d21bt06a+zGjRvatGmTypYtm+FzlCpVyuZhpJJsXvv4+CgoKMjmPJK0bt26DJ1n4sSJ8vHxUcOGDe84zsXFRdeuXctw3gAAAAAAAAAeTjl6Jvqff/6pcePGacuWLTp16pR++ukntWzZUtLNBu17772nX3/9VUeOHJGvr68aNmyojz76SEFBQdZjXLhwQW+++aZ++eUXmc1mtW7dWpMmTVLu3LmtY6KiotSrVy9t2rRJ/v7+evPNNzV48OBsqfHMhTMPzHlcXFysM7ldXFxstnl7e6tnz54aNGiQ8uXLpyJFimjs2LFKSEhQly5dMnyON998U127dlXVqlVVs2ZNzZ8/X1FRUQoLC7OOGTRokIYNG6bixYurYsWKmjlzprZv3645c+bYHOvixYs6ffq0EhMTdeDAAU2fPl2LFi3S119/bZ11nurs2bO6fv26dTmXb775Rm3atHHwHQIAAAAAAADwsMnRTfSrV6+qQoUK6ty5s55//nmbbQkJCdq6davef/99VahQQXFxcerbt6+aN2+uzZs3W8e1b99ep06dUmRkpG7cuKFOnTqpW7dumjt3rqSba2w3atRIDRs21LRp07Rz50517txZfn5+6tatW5bVViBXAXm5eenbFd9m2Tlu5+XmpQK5Ctx94B34+PjY3fbRRx/JYrHo1Vdf1eXLl1W1alUtX75cefPmzfDx27dvryNHjmjgwIG6fv262rZtq44dO+rvv/+2junTp4/i4+M1YMAAnT17VmXLltXixYtVokQJm2N16tRJkuTp6anChQurdu3a+vvvv1W5cuU05y1VqpQkydXVVSEhIerevbuGDx+e4bwBAAAAAAAAPJxMRuqTFnM4k8lkMxM9PZs2bVK1atV07NgxFSlSRHv37lXZsmW1adMmVa1aVZK0bNkyNWnSRMePH1dQUJCmTp2qIUOG6PTp03J3d5ckvfPOO1q0aJH27duX4fwuXbokX19fxcfHp2k0X79+XdHR0QoNDZWnp6c1HhMfo9iEWAfehftTIFcBFfEtkm3nyyzPPPOMAgMD9c033zg7lXtm7x4AAAAAAADAw23rVqlKFWncj+cUVi75vo93ZLerBrX215YtUjpzReGAO/V0b5WjZ6I7Kj4+XiaTybpUx4YNG+Tn52dtoEtSw4YNZTabtXHjRrVq1UobNmxQ3bp1rQ10SYqIiNCYMWMUFxdndxZ1YmKiEhMTra8vXbokSUpOTlZy8s1fBrPZLLPZLIvFIsMwrD/SzS8FQnxCFOITYnNck8mk9L7XsBd3hKPHdkY8ISFB06ZNU0REhFxcXPTdd99p5cqVWrFiRY7J8V7iqdf+1vsjdUmclJQUm7Gurq4yDMMmbjKZ5OLiIovFYvMQVnvxW++99OIpKSk2edqLu7i4yGQyWXO+NZ5e7tRETdRETdRETdRETdRETdRETdRETdRETdRkG7dYJLP5f0sjW2xzlOl/j6w0LBmLm10kGXJ3T5bFIiUnc53ut6aMeGia6NevX9fbb7+tl156yfqtwenTpxUQEGAzztXVVfny5dPp06etY0JDQ23GFCxY0LrNXhP9ww8/1IgRI9LEt23bJm9vb0mSv7+/ihcvruPHjyspKUkJCQlKSUmRu7u73N3ddf36dZsL5eHhITc3N127ds3mYnt6esrV1VUJCQk2F9vLy0tms1lXr161ycHb21sWi8XmwZgmk0ne3t5KSUnR9evXrXGz2axcuXIpOTnZ5ksBFxcXeXl56caNG0pKSrJ5/zw9PZWYmGjzC5JZNUnS0qVL9cEHHygxMVElSpTQt99+q4YNGz6wNXl5eUmSkpKStGvXLmu8atWqSkpKUlRUlE2OTz75pOLj423+EsLLy0sVKlRQbGysjhw5Yo37+vqqTJkyOnnypI4fP26Np9570dHROnfunDUeHBys4OBgHThwQPHx8dZ4WFiYAgICtGvXLpv3uHTp0vLz89O2bdts3oPy5cvL3d3dZukkaqImaqImaqImaqImaqImaqImaqImaqImakpbU3y8VKxYaUmS6VS0TLf0kyyBRSUXV5lPHLapyVK4uJSSLPPpY9aYYTbLKPyYPHRVgwYd0fnz0ubNXKf7qWnPnj3KiIdiOZcbN26odevWOn78uH7//XdrE3306NGaPXu29u/fbzM+ICBAI0aMUM+ePdWoUSOFhoZq+vTp1u179uxRuXLltGfPHpUpUybdfNKbiR4SEqLz589bz5/6jUZCQoKOHj1qs5RHZs1wdkROm539KNWUupxLkSJFrPdATv327WH8RpGaqImaqImaqImaqImaqImaqImaqImaqMlZNW3fLoWHu2jMgliFlfn/fuLNEzs+E/3IbhcNeSmf1q2TKlbkOt1PTXFxccqXL9/Dv5zLjRs31LZtWx07dkyrVq2yKTYwMFBnz561GZ+cnKwLFy4oMDDQOubMmTM2Y1Jfp45Jj4eHhzw8PNLEXV1d5epq+7aazWaZTCbrT6pb/30rR+OOyKxzZnXcETkt9/Tiqdc+vfvj9tep49OLp/6C32889UMro/H0cnE0Tk3UJFGTvRwdjVMTNUnUZC9HR+PURE0SNdnL0dE4NVGTRE32cnQ0Tk3UJFGTvRwdjeeEmszmm0u63HyR/niZHImblJTkKrNZurU0rlPm1ZTmuBkalUOlNtAPHjyolStXKn/+/Dbba9SooYsXL2rLli3W2KpVq2SxWBQeHm4d8+eff+rGjRvWMZGRkSpVqpTdpVzu1QMy6R9ZgGsPAAAAAAAAPJhydBP9ypUr2r59u7Zv3y5Jio6O1vbt2xUTE6MbN26oTZs22rx5s+bMmaOUlBSdPn1ap0+ftq53XaZMGTVu3Fhdu3bV33//rXXr1ql3795q166dgoKCJEkvv/yy3N3d1aVLF+3evVvz58/XpEmT9NZbb2VaHanfaNy6DjceLQkJCZIkNzc3J2cCAAAAAAAAwBE5ejmXzZs3q379+tbXqY3tDh06aPjw4Vq8eLEkqWLFijb7rV69Wk899ZQkac6cOerdu7caNGggs9ms1q1ba/Lkydaxvr6+WrFihXr16qUqVaqoQIECGjp0qLp165Zpdbi6uipXrlw6d+6c3Nzc0v2TAjycDMNQQkKCzp49Kz8/vwz/iQgAAAAAAACAnCFHN9GfeuqpOy6DkZElMvLly6e5c+fecUz58uW1Zs0ah/PLKJPJpEKFCik6OlrHjh27+w546Pj5+d1xjX0AAAAAAAAAOVOObqI/TNzd3VWiRAmWdHkEubm5MQMdAAAAAAAAeEDRRM9GZrNZnp6ezk4DAAAAAAAAAJBBLM4NAAAAAAAAAIAdNNEBAAAAAAAAALCDJjoAAAAAAAAAAHbQRAcAAAAAAAAAwA6a6AAAAAAAAAAA2EETHQAAAAAAAAAAO2iiAwAAAAAAAABgB010AAAAAAAAAADsoIkOAAAAAAAAAIAdNNEBAAAAAAAAALCDJjoAAAAAAAAAAHbQRAcAAAAAAAAAwA6a6AAAAAAAAAAA2EETHQAAAAAAAAAAO2iiAwAAAAAAAABgB010AAAAAAAAAADsoIkOAAAAAAAAAIAdNNEBAAAAAAAAALCDJjoAAAAAAAAAAHbQRAcAAAAAAAAAwA6a6AAAAAAAAAAA2EETHQAAAAAAAAAAO2iiAwAAAAAAAABgB010AAAAAAAAAADsoIkOAAAAAAAAAIAdNNEBAAAAAAAAALCDJjoAAAAAAAAAAHbQRAcAAAAAAAAAwA6a6AAAAAAAAAAA2EETHQAAAAAAAAAAO2iiAwAAAAAAAABgB010AAAAAAAAAADsoIkOAAAAAAAAAIAdNNEBAAAAAAAAALCDJjoAAAAAAAAAAHbQRAcAAAAAAAAAwA6a6AAAAAAAAAAA2EETHQAAAAAAAAAAO2iiAwAAAAAAAABgB010AAAAAAAAAADsoIkOAAAAAAAAAIAdNNEBAAAAAAAAALCDJjoAAAAAAAAAAHbQRAcAAAAAAAAAwA6a6AAAAAAAAAAA2EETHQAAAAAAAAAAO2iiAwAAAAAAAABgB010AAAAAAAAAADsoIkOAAAAAAAAAIAdNNEBAAAAAAAAALCDJjoAAAAAAAAAAHbQRAcAAAAAAAAAwA6a6AAAAAAAAAAA2EETHQAAAAAAAAAAO2iiAwAAAAAAAABgB010AAAAAAAAAADsyNFN9D///FPPPfecgoKCZDKZtGjRIpvthmFo6NChKlSokLy8vNSwYUMdPHjQZsyFCxfUvn17+fj4yM/PT126dNGVK1dsxkRFRalOnTry9PRUSEiIxo4dm9WlAQAAAAAAAAAeADm6iX716lVVqFBBn332Wbrbx44dq8mTJ2vatGnauHGjvL29FRERoevXr1vHtG/fXrt371ZkZKSWLFmiP//8U926dbNuv3Tpkho1aqSiRYtqy5YtGjdunIYPH64ZM2ZkeX0AAAAAAAAAgJzN1dkJ3Mmzzz6rZ599Nt1thmFo4sSJeu+999SiRQtJ0tdff62CBQtq0aJFateunfbu3atly5Zp06ZNqlq1qiRpypQpatKkiT7++GMFBQVpzpw5SkpK0ldffSV3d3eVK1dO27dv14QJE2ya7QAAAAAAAACAR0+ObqLfSXR0tE6fPq2GDRtaY76+vgoPD9eGDRvUrl07bdiwQX5+ftYGuiQ1bNhQZrNZGzduVKtWrbRhwwbVrVtX7u7u1jEREREaM2aM4uLilDdv3nTPn5iYqMTEROvrS5cuSZKSk5OVnJwsSTKbzTKbzbJYLLJYLNaxqfGUlBQZhnHXuIuLi0wmk/W4t8YlKSUlJUNxV1dXGYZhEzeZTHJxcUmTo704NVETNVETNVETNVETNVETNVETNVETNVETNVETNWW8JotFMptv5iiLbY4y/W+hEMOSsbjZRZIhd/dkWSxScjLX6X5ryogHtol++vRpSVLBggVt4gULFrRuO336tAICAmy2u7q6Kl++fDZjQkND0xwjdZu9JvqHH36oESNGpIlv27ZN3t7ekiR/f38VL15c0dHROnfunHVMcHCwgoODdeDAAcXHx1vjYWFhCggI0K5du3Tt2jVrvHTp0vLz89O2bdtsLmz58uXl7u6uzZs32+RQtWpVJSUlKSoqyhpzcXHRk08+qfj4eO3bt88a9/LyUoUKFRQbG6sjR45Y476+vipTpoxOnjyp48ePW+PURE3URE3URE3URE3URE3URE3URE3URE3URE3UlPGa4uOlYsVKS5JMp6JluqXJawksKrm4ynzisE1NlsLFpZRkmU8fs8YMs1lG4cfkoasaNOiIzp+XNm/mOt1PTXv27FFGmIxbW/A5mMlk0k8//aSWLVtKktavX69atWrp5MmTKlSokHVc27ZtZTKZNH/+fI0ePVqzZ8/W/v37bY4VEBCgESNGqGfPnmrUqJFCQ0M1ffp06/Y9e/aoXLly2rNnj8qUKZNuPunNRA8JCdH58+fl4+MjiW91qImaqImaqImaqImaqImaqImaqImaqImaqImaHvWatm+XwsNdNGZBrMLK/H8/8eaJHZ+JfmS3i4a8lE/r1kkVK3Kd7qemuLg45cuXT/Hx8daebnoe2JnogYGBkqQzZ87YNNHPnDmjihUrWsecPXvWZr/k5GRduHDBun9gYKDOnDljMyb1deqY9Hh4eMjDwyNN3NXVVa6utm9r6kW5XeqNk9H47ce9l7jJZEo3bi9HR+PURE324tRETRI12cvR0Tg1UZNETfZydDROTdQkUZO9HB2NUxM1SdRkL0dH49RETRI12cvR0XhOqMlsvrmky80X6Y+XyZG4SUlJrjKbpVtL4zplXk1pjpuhUTlQaGioAgMD9dtvv1ljly5d0saNG1WjRg1JUo0aNXTx4kVt2bLFOmbVqlWyWCwKDw+3jvnzzz9148YN65jIyEiVKlXK7lIuAAAAAAAAAIBHQ45uol+5ckXbt2/X9u3bJd18mOj27dsVExMjk8mkfv36adSoUVq8eLF27typ1157TUFBQdYlX8qUKaPGjRura9eu+vvvv7Vu3Tr17t1b7dq1U1BQkCTp5Zdflru7u7p06aLdu3dr/vz5mjRpkt566y0nVQ0AAAAAAAAAyCly9HIumzdvVv369a2vUxvbHTp00KxZszR48GBdvXpV3bp108WLF1W7dm0tW7ZMnp6e1n3mzJmj3r17q0GDBjKbzWrdurUmT55s3e7r66sVK1aoV69eqlKligoUKKChQ4eqW7du2VcoAAAAAAAAACBHemAeLJrTXbp0Sb6+vnddhB4AAAAAAADAo2PrVqlKFWncj+cUVi757jvcxZHdrhrU2l9btkiVK2dCgo+wjPZ0c/RyLgAAAAAAAAAAOBNNdAAAAAAAAAAA7KCJDgAAAAAAAACAHTTRAQAAAAAAAACwgyY6AAAAAAAAAAB20EQHAAAAAAAAAMAOmugAAAAAAAAAANhBEx0AAAAAAAAAADtoogMAAAAAAAAAYAdNdAAAAAAAAAAA7KCJDgAAAAAAAACAHTTRAQAAAAAAAACwgyY6AAAAAAAAAAB20EQHAAAAAAAAAMAOmugAAAAAAAAAANhBEx0AAAAAAAAAADtoogMAAAAAAAAAYAdNdAAAAAAAAAAA7KCJDgAAAAAAAACAHTTRAQAAAAAAAACwgyY6AAAAAAAAAAB20EQHAAAAAAAAAMAOmugAAAAAAAAAANhBEx0AAAAAAAAAADtoogMAAAAAAAAAYAdNdAAAAAAAAAAA7KCJDgAAAAAAAACAHTTRAQAAAAAAAACwgyY6AAAAAAAAAAB20EQHAAAAAAAAAMAOmugAAAAAAAAAANhBEx0AAAAAAAAAADtoogMAAAAAAAAAYAdNdAAAAAAAAAAA7HC9l51iYmJ07NgxJSQkyN/fX+XKlZOHh0dm5wYAAAAAAAAAgFNluIl+9OhRTZ06VfPmzdPx48dlGIZ1m7u7u+rUqaNu3bqpdevWMpuZ4A4AAAAAAAAAePBlqNvdp08fVahQQdHR0Ro1apT27Nmj+Ph4JSUl6fTp0/r1119Vu3ZtDR06VOXLl9emTZuyOm8AAAAAAAAAALJchmaie3t768iRI8qfP3+abQEBAXr66af19NNPa9iwYVq2bJn++ecfPfnkk5meLAAAAAAAAAAA2SlDTfQPP/wwwwds3LjxPScDAAAAAAAAAEBO4vDi5deuXVNCQoL19bFjxzRx4kQtX748UxMDAAAAAAAAAMDZHG6it2jRQl9//bUk6eLFiwoPD9f48ePVsmVLTZ06NdMTBAAAAAAAAADAWRxuom/dulV16tSRJP3www8qWLCgjh07pq+//lqTJ0/O9AQBAAAAAAAAAHAWh5voCQkJypMnjyRpxYoVev7552U2m1W9enUdO3Ys0xMEAAAAAAAAAMBZHG6iP/bYY1q0aJH++ecfLV++XI0aNZIknT17Vj4+PpmeIAAAAAAAAAAAzuJwE33o0KEaOHCgihUrpvDwcNWoUUPSzVnplSpVyvQEAQAAAAAAAABwFldHd2jTpo1q166tU6dOqUKFCtZ4gwYN1KpVq0xNDgAAAAAAAAAAZ3K4iS5JgYGBCgwMtIlVq1YtUxICAAAAAAAAACCncLiJfv36dU2ZMkWrV6/W2bNnZbFYbLZv3bo105IDAAAAAAAAAMCZHG6id+nSRStWrFCbNm1UrVo1mUymrMgLAAAAAAAAAACnc7iJvmTJEv3666+qVatWVuQDAAAAAAAAAECOYXZ0h8KFCytPnjxZkQsAAAAAAAAAADmKw0308ePH6+2339axY8eyIh8AAAAAAAAAAHIMh5dzqVq1qq5fv66wsDDlypVLbm5uNtsvXLiQackBAAAAAAAAAOBMDjfRX3rpJZ04cUKjR49WwYIFebAoAAAAAAAAAOCh5XATff369dqwYYMqVKiQFfkAAAAAAAAAAJBjOLwmeunSpXXt2rWsyAUAAAAAAAAAgBzF4Sb6Rx99pAEDBuj333/X+fPndenSJZsfAAAAAAAAAAAeFg4v59K4cWNJUoMGDWzihmHIZDIpJSUlczIDAAAAAAAAAMDJHJ6Jvnr1aq1evVqrVq2y+UmNZbeUlBS9//77Cg0NlZeXl4oXL65///vfMgzDOsYwDA0dOlSFChWSl5eXGjZsqIMHD9oc58KFC2rfvr18fHzk5+enLl266MqVK9ldDgAAAAAAAAAgB3F4Jnq9evWyIo97NmbMGE2dOlWzZ89WuXLltHnzZnXq1Em+vr7q06ePJGns2LGaPHmyZs+erdDQUL3//vuKiIjQnj175OnpKUlq3769Tp06pcjISN24cUOdOnVSt27dNHfuXGeWBwAAAAAAAABwogzNRI+JiXHooCdOnLinZO7F+vXr1aJFCzVt2lTFihVTmzZt1KhRI/3999+Sbs5Cnzhxot577z21aNFC5cuX19dff62TJ09q0aJFkqS9e/dq2bJl+uKLLxQeHq7atWtrypQpmjdvnk6ePJlttQAAAAAAAAAAcpYMzUR/8skn1bJlS73++ut68skn0x0THx+v77//XpMmTVK3bt2ss8CzWs2aNTVjxgwdOHBAJUuW1I4dO7R27VpNmDBBkhQdHa3Tp0+rYcOG1n18fX0VHh6uDRs2qF27dtqwYYP8/PxUtWpV65iGDRvKbDZr48aNatWqVZrzJiYmKjEx0fo69aGqycnJSk5OliSZzWaZzWZZLBZZLBbr2NR4SkqKzbIz9uIuLi4ymUzW494al5RmHXp7cVdXVxmGYRM3mUxycXFJk6O9ODVREzVREzVREzVREzVREzVREzVREzVREzVREzVlvCaLRTKbb+Yoy23PkzT9b46zYclY3OwiyZC7e7IsFik5met0vzVlRIaa6Hv27NEHH3ygZ555Rp6enqpSpYqCgoLk6empuLg47dmzR7t371blypU1duxYNWnSJEMnzwzvvPOOLl26pNKlS8vFxUUpKSn64IMP1L59e0nS6dOnJUkFCxa02a9gwYLWbadPn1ZAQIDNdldXV+XLl8865nYffvihRowYkSa+bds2eXt7S5L8/f1VvHhxRUdH69y5c9YxwcHBCg4O1oEDBxQfH2+Nh4WFKSAgQLt27dK1a9es8dKlS8vPz0/btm2zubDly5eXu7u7Nm/ebJND1apVlZSUpKioKGvMxcVFTz75pOLj47Vv3z5r3MvLSxUqVFBsbKyOHDlijfv6+qpMmTI6efKkjh8/bo1TEzVREzVREzVREzVREzVREzVREzVREzVREzVRU8Zrio+XihUrLUkynYqW6ZYmryWwqOTiKvOJwzY1WQoX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", + "text/plain": [ + "
" ] + }, + "metadata": {}, + "output_type": "display_data" }, { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "import cohere\n", - "from typing import List, Tuple\n", - "\n", - "# Initialize Cohere Client\n", - "co = cohere.Client()\n", - "\n", - "def get_cohere_embeddings(sentences: List[str], model: str = \"embed-multilingual-v2.0\", input_type: str = \"search_document\") -> Tuple[List[float], List[int]]:\n", - " \"\"\"\n", - " Generates embeddings for the provided sentences using Cohere's embedding model.\n", - "\n", - " Args:\n", - " sentences (list of str): List of sentences to generate embeddings for.\n", - "\n", - " Returns:\n", - " Tuple[List[float], List[int]]: A tuple containing two lists of embeddings (float and int8).\n", - " \"\"\"\n", - " generated_embedding = co.embed(\n", - " texts=sentences,\n", - " model=\"embed-multilingual-v2.0\",\n", - " input_type=\"search_document\",\n", - " embedding_types=['float']\n", - " ).embeddings\n", - "\n", - " return generated_embedding.float[0]" + "data": { + "image/png": "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FXFGRERERMUXZ6ITERERERG9Z2bNmpXrNjbQiYiIiLRxJjoRERERERERERERUS44E52IiIiIiIgkK1askDsFIiIiomKFTXQiIiIiIiKS3L9/X+4UiIiIiIoVLudCRERERERERERERJQLzkQnIiIiIiJ6z2VmZiI8PBwJCQlyp0JERERU7LCJTkRERERE9J45ePAgrK2tYWNjgyNHjqBBgwb4+OOP4enpiSNHjsidHhEREVGxwuVciIiIiIiI3jN169bF8uXLER8fj65du+K3335D8+bNcebMGYwaNQrHjh2TO0UiIiKiYkNP7gSIiIiIiIioaKWnp8PHxwcAYGFhgebNmwMA6tSpg+fPn8uYGREREVHxw+VciIiIiIiI3jMajUb6uVu3blrb1Gp1UadDREREVKxxJnoB0Wg0ePDgAcqUKQNBEOROh4iIiIiIKFfVq1fHvXv3YGZmhvHjxyMxMREAcPPmTZiYmEi3iYiIiEozURSRlJQEBwcHKBS5zzfnmugF5N69e3B2dpY7DSIiIiIiIiIiIiLKh7t378LJySnX7ZyJXkDKlCkD4OUDbmZmJnM2REREREREb+fZs2ewsrKSOw0iIiKiQpeYmAhnZ2ept5sbNtELSNYSLmZmZmyiExERERFRiVW1alVER0fLnQYRERFRkXnT8txsohMREREREb1nduzYkeu21NTUIsyEiIiIqPhjE52IiIiIiOg907lzZ/j5+SGnS2QlJSXJkBERERFR8cUmOhERERER0XumQoUKWLlyJdzc3HS2OTs7F31CRERERMUYm+hERERERETvmaCgIMTExOTYRB8wYEDRJ0RERFQE1Go1MjIy5E6DipC+vj6USuU7H0cQc/r+HuVbYmIizM3NkZCQwAuLEhERERERERERFROiKOLRo0eIj4+XOxWSgYWFBcqWLZvjxUPz2tPlTHQiIiIiIqL3THx8PCwsLOROg4iIqEhkNdDt7OxgbGycYzOVSh9RFJGcnIwnT54AAMqVK/fWx2ITnYiIiIiI6D1jZ2eHgIAAfPrpp2jXrh0UCoXcKRERERUKtVotNdCtra3lToeKmJGREQDgyZMnsLOze+ulXfibEhERERER0XvG3d0dTZo0wbhx4+Dk5ITPP/8c165dkzstIiKiApe1BrqxsbHMmZBcssb+XdbDZxOdiIiIiIjoPWNiYoJRo0bh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4eDgoLPN2dlZhowK1vXr17Fp0yYAQOfOnTFw4EB06tQJW7dulTkzIiIiIqKCVayb6E2bNn3jwvR9+/ZF3759c91uaGiIJUuWYMmSJbnu4+rqij///POt8yQiIiIielWHDh1w8+bNHJvo7dq1kyGjgpWWlib9rFAosHz5cgwdOhSdOnVCenq6jJkRERERERUs3RX+iYiIiIjonS1cuFDrG5LZLVu2rIizKXiurq44efKkVmzRokXw9PTE1atXZcqKiIiIiKjgFeuZ6EREREREJUF0QjRikmMK7Hg2xjZwMXcpsOMVhlWrVuW4puiiRYvQo0cPGTIiIiIiIiocbKITEREREb2D6IRoVF5SGSkZKQV2TCN9I1wNvVqsG+nlypXLdVuDBg2KMBMiIiIiosLFJjoRERER0TuISY5BSkYKPmn9Ceyt7N/5eI+fPca6fesQkxxTrJvorzN58mRMnjxZ7jSIiIiIiAoEm+hERERERAXA3soeznbOcqdRLLxuljoRERERUUnDC4sSEREREVGB6t+/v9wpEBEREREVGDbRiYiIiIioQF28eFHuFIiIiIiICgyb6EREREREVKA+/PBDuVMgIiIiIiowXBOdiIiIiIjybdGiRTnGRVHE8+fPizgbIiIiIqLCwyY6ERERERHl26hRo9CzZ08IgqCzLSMjQ4aMiIiIiIgKB5voRERERESUb15eXhg/fjwqVaqks23//v0yZEREREREVDi4JjoREREREeXbiBEjkJ6enuO26dOnF3E2RERERESFhzPRiYiIiIgo3/r06ZPrtqCgoCLMhIiIiIiocHEmOhERERERFYivvvpK7hSIiIiIiAocZ6ITEREREVG+LVq0SCe2dOlS2NraAgCGDh1a1CkRERERERUKNtGJiIiIiCjfRo4ciXbt2sHKykqKpaWlITw8HIIgyJgZEREREVHBYhOdiIiIiIjybd++fRg/fjw+++wztG/fHgBw+PBhrFq1SubMiIiIiIgKFtdEJyIiIiKifGvevDnCwsLw22+/oU+fPkhMTOQMdCIiIiIqldhEJyIiIiKit2JmZoa1a9eiffv28PPzQ0pKitwpEREREREVOC7nQkRERERE7yQwMBCNGjXC+fPn5U6FiIiIiKjAcSY6ERERERG9M3t7e9y9e1fuNIiIiIiIChxnohMRERERUb7t2LFDJzZp0iSUK1cOANChQ4eiTomIiIiIqFCwiU5ERERERPnWqVMn1K9fHyqVSoolJCRg/vz5EASBTXQiIiIiKjXYRCciIiIionz76aef8OOPP+Lbb79FzZo1AQDu7u44dOiQzJkRERERERUsrolORERERET51qdPH2zYsAFjx47F1KlToVarIQiC3GkRERERERU4NtGJiIiIiOituLq6Yt++fTAxMUHjxo2RlpYmd0pERERERAWOy7kQEREREdFbEwQBo0aNQps2bXDs2DG50yEiIiIiKnBsohMRERER0Tvz9vaGt7c3AKBixYq4du2azBkRERERERUMNtGJiIiIiCjfIiMjc92WlJRUhJkQERERERUuNtGJiIiIiCjffHx84ObmBlEUdbbFxsbKkBERERERUeFgE52IiIiIiPLN1dUVx48fh4ODg842Z2dnGTIiIiIiIiocCrkTICIiIiKikqdDhw64efNmjtvatWtXxNkQERERERUezkQnIiIiIqJ8W7hwYa7bli1bVoSZEBEREREVLjbRiYiIiIjotaITohGTHFNgx7MxtoGLuUuBHY+IiIiIqDCxiU5ERERERLmKTohG5SWVkZKRUmDHNNI3wtXQq2ykExEREVGJwCY6ERERERHlKiY5BikZKfik9Sewt7J/5+M9fvYY6/atQ0xyDJvoRERERFQisIlORERERERvZG9lD2c7Z7nTICIiIiIqcgq5EyAiIiIiIiIiIiIiKq7YRCciIiIiIiIiIiIiygWb6EREREREREREREREuWATnYiIiIiIiIiIiIgoF8W+iX706FF8+OGHcHBwgCAI2L59e677DhgwAIIgYMGCBVrxZ8+eoWfPnjAzM4OFhQVCQkLw/PlzrX0iIyPRuHFjGBoawtnZGbNnzy6EaoiIiIiIiIiIiIioJCn2TfQXL16gRo0aWLJkyWv327ZtG/766y84ODjobOvZsyf++ecfhIWFYdeuXTh69Cj69esnbU9MTETr1q3h6uqK8+fPY86cOZg8eTJWrFhR4PUQERERERERERERUcmhJ3cCbxIQEICAgIDX7nP//n0MGTIEe/fuRbt27bS2XblyBXv27MHZs2dRq1YtAMDixYvRtm1bzJ07Fw4ODli/fj3S09OxcuVKqFQqeHt7IyIiAt9++61Wsz27tLQ0pKWlSbcTExMBAJmZmcjMzAQAKBQKKBQKaDQa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6RJ79+5l7969XLp0SelwhADSBqncuXMHjUaj+y81NRWNRqObhk8IYbwcj0TXaDR5GYcQQuSrrO7WAzg5OaFSqfSmLDDG66+/rpvXOj95enrqRouuXLlS137r1i2KFCmS7/GY0vz587Ns12q1PHjwIJ+jMb3CPJLSEua037hxo9Ih5LmkpCS2bt3KlStXsLa2pmrVqplu1omCqWPHjly6dCnLC+r27dsrEJFp2dvbM3nyZCZPnqx0KCIXEhMT6d27N5C2iHH6lFE9evTgk08+UTI0k7D074eM59SbN29m586dODs706VLF4s4fzl37hz9+/fn2rVruulpIiMj8fHx4euvv7a4hWKFeWnQoAEnT56kRYsWmV4z96d0hShIDJoTXQghLEW/fv2wtbVl7ty5ODg4AGkjfS9fvmzwtgpip+5vv/2WZXvRokVZv359PkdjWiEhIfTu3TvLRxNzurBhQbZ8+XJmz57NwIEDdTdgfH196datG2PHjlU4urxlCXPaA0RERODq6oqHhwcRERHs37+fV155hbp16yodmtH27NnDgAEDcHZ25p9//qFx48Z8+eWXFCtWjE2bNuHl5aV0iOI55s2bl+1rixcvzsdI8s6zN3leeeUVmjVrpnRYIgeSk5NJTEzk/v37REdHc+fOHTw9PXn48CGPHz9WOjyTsOTvh4znZVZWVjg7OwNgZ2eHtbX5dzsMGDCAcePGZZpWb8OGDbz11lscOnRIociE4LnXdz///HM+RiKEZcvxdC5CiMItJSWFixcvkpycrHQoJvHNN9/w2muv0bx5c37//Xcg92s/hISEcOzYMY4fP673X3h4eIHr1HVycjL7xZ2qVKnC+PHj+frrrzP9l37BZs7SR1KePn1aN9XQqVOn+PDDDylatKjS4ZlEREQEd+/e1f28fPlyDh48qHBUpvHZZ5/RtGlTAgICWL16Na1bt+a3337jjTfeeG4HprkICQlh586dnDhxgn379lGqVCnOnj3L22+/nWmhUVHwZLzIjoqKon379jg5OdGsWTNFnpoytT179lCxYkU+/PBDPvjgAzZv3sy7775LnTp1uHHjhtLhiRfo168fVapU4dVXX2XatGl06dKFoUOHUq9ePbp27ap0eEaz9O+HkydP4urqiouLC+Hh4URFRQFp1xCWMB1dXFxcluvSdOvWjfj4eAUiEuL5LGG/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ypXNHQYRERERWRlOJ2g5OJ0LkYkKe0eXlJSEWbNmYf369bhz5w4AoGLFiujVqxemTp2KUqVKFSxgIiIiMhARkTn3dEGdu1fwbRARERFR8cPpBC0Hm+hEJirsHd2AAQNQsWJF/P777/D19QUAXL16FUuXLkX//v2xefPmwgqdiIio2IuIAPz9BQ8eKAXfWEUAbxZ8M0RERERUvPz222+5jnM6waKHTXQiExX2ju706dP48ccfDcYCAgLw+eefo3r16ibFSERERLmLjQUePFAwct5deFUp2IMbj19KxPrUQgqMiIiIiIo9FxcXuLi4mDsMyoZNdKJCZuqOTqVS4dKlS6hWrZrB+MWLF2FjY1NY4REREVE2XlXUqFKzYE30myka4HIhBUREREREVqmwphIEOJ2gObCJTpQPhbmjAwBXV+Dh55PNmzcPL7zwAurXrw8fHx8AwLVr1xAaGooVK1YU3i8nIiIiIiIiIqKnplCnEgQ4naAZsIlO9BiFvqMD4OQkOHdOMWikd+rUCVeuXMHOnTsREREBAGjVqhXat2+PkiVLFtrvJiIiIiIiIiKip6cwpxIEOJ2gObCJTvQYhb2juxlui0XjyiI2Nufd6M7OzujRo4f+Z41Gw6lciIiIiIiIiIisQGFMJQhwOkFzYBOdKJ8Ka0eXlyVLluDVV1+Fm5sbrl69ildffRWhoaHw9/fHhg0bULNmzSf2u4mIiIiIiIiIiCh3KnMHQESZli5dCjc3NwDA2LFjMWTIECQmJmLatGkYPny4maMjIiIiIiIiIiIqnthEJyoi1Oqsu9yvXr2KN998E05OTujZsycSEhLMGBkREREREREREVHxxSY6URFRvXp1bN68GQDw7LPP4vz58wCA27dvmzMsIiIiIiIiIiKiYo1zohMVEUuWLEHXrl3x2WefwdXVFY0aNUK9evVw8+ZNLFu2zNzhERERERERERERFUtsohMVEd7e3jh69Cj27t2LsLAwNG/eHJUrV8ZLL70EJycnc4dHRERERERERERULLGJTlTEtGrVCq1atTJ3GERERERERERERATOiU5kEb766itzh0BERERERERERFQssYlOZAFu3bpl7hCIiIiIiIiIiIiKJTbRiSzAzJkzzR0CERERERERERFRscQmOpEFiIuLM3cIRERERERERERExRKb6EQWoF69euYOgYiIiIiIiIiIqFiyNXcARJRp69ateS5LTU19ipEQERERERERERGRDpvoREVE165d0bx5c4hIjmX37983Q0RERERERERERETEJjpREVGtWjV8++238PX1zbHM29v76QdEREREREREREREnBOdqKjo378/YmNjc1321ltvPeVoiIiIiIiIiIiICOCd6ERFxqRJk/Jc9v777z/FSIiIiIiIiIiIiEiHd6ITFSHJyclQq9UAgPj4eOzduxc3b940c1RERERERERERETFF5voREXE6tWr4erqCj8/P/zxxx947rnnMGnSJNStWxcbN240d3hERERERERERETFEqdzISoi5s+fj/PnzyMhIQHNmjXDnj17EBgYiMuXL6N79+4ICQkxd4hERERERERERETFDpvoREWEjY0NfHx8AABlypRBYGAgAKBq1apQqfilESIiIiIiIiIiInNgZ46oiFCpVDh79iwOHjyI5ORk/O9//wMAnD9/HhqNxszRERERERERERERFU+8E52oiPjggw/QrFkzqFQqbNiwAVOmTEFkZCQiIyOxfPlyc4dHRERERERERERULFn8nehz5sxBUFAQSpUqBXd3d3Tp0gUXLlwwWCc1NRXDhw9H+fLlUbJkSXTv3h1RUVEG60RERKBjx45wcnKCu7s7xo0bB7Va/TRToWKuQ4cOiIuLQ0xMDFq1aoU9e/Zg7dq1uHTpEnr16mXu8IiIiIiIiIiIiIoli2+i79u3D8OHD8fff/+N3bt3IyMjA23btkVycrJ+nVGjRmHbtm3YtGkT9u3bh9u3b6Nbt2765RqNBh07dkR6ejoOHTqE7777DqtWrcK0adPMkRIRgMw50hs0aAB3d3dUr17d3OEQEREREREREREVSxY/ncuuXbsMfl61ahXc3d1x7NgxNGvWDAkJCfjmm2+wbt06vPjiiwCAlStXwt/fH3///TcaN26M33//HWFhYdizZw88PDxQt25dfPDBB5gwYQJmzJgBe3v7HL83LS0NaWlp+p8TExMBAGq1Wn8Hu0qlgkqlglarhVar1a+rG9doNBCRx47b2NhAUZQcd8bb2NgAQI75svMat7W1hYgYjCuKAhsbmxwx5jVeHHMS0cDeXqBAA2g1gKICFAXQagFk5ZQ1/tD85cp/n1VJ5rYVKLC3V0PEBiJZOZ06dSrPnO7fvw8AT6ROWi2yHlxqYk6G4wJ7xR4qrQqKRslczUYAARStkm1dQFSPGNcCKq0K9oo9tJrMPEx57eVdP2NyyhpX/Zdf5pjxOSmSNa77s2jF4L1gzPsps36Z7w9Tc8r6BTbIUT8jcxJFMj+ezaN+xu4jtFo17O1hWD9jcxIxqJ+dYvffusbnVJD65bbf02oBRcn8d893/R7KSR+8SgUlr/rlMyfduKJV8lW/x+3LtVpN/ur3iJzyrJ8JOWXfven+/HD9jDk+Ze6K8qhfPnPKPv5w/YzNSVQCKDnrJyImHXNz1M+EnCDazGXIrJ+t8t+ppwk55VY/rUabo36Pyiln/WyRs375zylzODMPW8XW8NhnZE76cU3O+uU3JyDrPMKwflrjc1KyxnXHPl3NTMnJgJH1y+3cSERB7u+//OVkMA7ATrEzrJ+ROYlK9P82+alffs5hc9bPiJwUlf68Tn/u8t8qpuRkuCDzfPbh+hlzXp5VP61h/fKZU9Z45nElz/rlM6e86pcZq2nXGvr6idb4nLJda+Sonwk5PUwFlUH9jL1+ElFBf4DKrX6PyclgHMh57WBkTtmvNXT1E63uXNm066cc9TMmp2zXGgb1e/jcM585ZW37v1jzWb+8rgl19VNy1M+U69xcrv2MzCn7tcbj6ve0r90fWz8jr3MBwAY2BvWzlmt3RfJfP0u8dhclM15bxTbX+vHa3TL6e4/KKT8svon+sISEBABAuXLlAADHjh1DRkYGWrdurV+nRo0aqFy5Mg4fPozGjRvj8OHDqFWrFjw8PPTrtGvXDm+//TbOnj2LevXq5fg9c+bMwcyZM3OMh4aGwtnZGQDg5uaGZ555BlevXkVMTIx+HS8vL3h5eeHixYv6eAGgSpUqcHd3x5kzZ5CSkmIQb5kyZRAaGmpQ2Nq1a8Pe3h5Hjx41iCEwMBDp6en6piyQ+SINCgpCQkICzp8/rx93dHREnTp1EBsbi/DwcP24i4sL/P39cfv2bdy8eVM/XhxzSky8iHHjElBBlQ7VLYG2nAfg7AIlOgJKRrp+fa1bJaCEM5TIq1CyvVm1FXwAG1uobl0BAFRQKRg37hpEApGSkpVTkyZNULFiRdjb20Or1SIjI0O/jdjYWP3/C7tOCQlA7dpVACgm56Qfr/QMHBTBON9xqHKrChxjHSEqQUxADOyT7FHmehn9umoHNeKrxaPE3RIofbu0fjy9ZDru+d6Dc6wzatyqgXG+4xB3JQ5X066a9Nq7e/cMxo1LyaqfCTlBo4bqznUAQM0SqRhZeSS00JqUk3O0c9b6tpkHmaToJBy9kfWaN+b9lJAA+PrWAACTcwIAUakglaqipEprUD9jc0opm4L7le6jVGQp1LiTVb/buG3SPiI+PhTjxmmy6mdCTkh7AFXMLX39BlUaBAAm5eR41zFr3CEz3sTbiQb1M2a/l5AAlC9fGwq0JucEAGJnD6ngizI2GoP6GZtTsnsykt2T4RLhgpJxJfX1i7WPNWlfHhd3FOPGIat+JuSEB4lQxUfp69fDowcAmJSTfVLWh+KJzpkfft+NuGtQP2OOTwkJgL19IGyRblA/Y3ICACnhBHHzgput2qB+RufkmYjUcqkoe6UsSiZm1S+hZIJJx9y4uFP6+imRikk5KYnxUBLj9fVrV74dAJiUk21a1mlrXOk4AED81XgcvZkVvzHnEYmJNgCC4IBkqG5FmJQTAIhz5n6kXfl2qHGrBhxjHU3K6Z7PPaSXSofrBVeUTMmqX0q5FJPOjeLizmfVL9rO6JykXAUod6OhJCeiZolUjPMdh1KJpQAPmJRT9ou5qLJRsFfsEXclzqB+xpzvJSU5AqgDJyRAdeu20Tnpx0tnXjP08OhhUD9jc4qrGgetnRZu59xQMi2rfpoKGpPOYePiwrPqF+dodE7i4gol7jaU1Af6+pV4UAIATMopu5uuN1HerrxB/Yw9L09JcQHgj1JKHFS3ss7r8puTjrZc5vXboEqDDOpnbE4x/jFQZahQ/nJ5ff3ir8YDXjDpWiMu7mZW/e6WMj6nbNcauvrZpGU2HUzJSf87VYII1wj4Ovoa1M/Y66e0NDcAz8BFiYLq1l2jc9KPu1UCAIysPNKgfsbmlP1aQ1e/uxF3gUqmXT/FxcVk1S+xrPE5ZbvW0NVP1AJFq5iUk47aQY0IlwjULlXboH7GXhNmZHgB8EJZ5SZUt5KMzkk/XsEHKsDg3MWUnLJfa+jql3g7EagEs1+76+qXLumwSbMxKSed9JLpgBPQtExTg/pZy7W7c7Szvn5J0UlAJVjVtXtK2RTALvN8L3v9eO1uWf29vHIKCwtDfiiSvQVv4bRaLTp37ox79+7h4MGDAIB169Zh4MCBBneNA0DDhg3RsmVLfPLJJxg6dCiuX7+O3377Tb/8wYMHcHZ2xo4dO/DSSy/l+F253Ynu7e2NuLg4lC6d+WItjndtW2NOx45p0KSJ4KP1sfDzVxf40+yr52wx+TVXHDpkg/r1s3KqVq0a9u3bh8qVK+fIyc/PDzdu3HgidTpxAmjUSIVPNsWhin+6STllH99/LAxLr3TEyJ4j4eXmlbmaiZ9m34q+hUWbFuF/g/6H+p71TXrt5V0/0z75PXj8PJZc6Yh3Q96Ft5t3gT7NvhF7A/M3zsfRIUdRx6NOvnPKWT8bfLIpFlX8Dfdzpnyavf/oWcP6FeDT7NzqZ+w+4uhRNZo2hWH9jMwp+52XB4+fxxdXOmBEyIi865fPO5yNrV9u+70TJ4CGDW0w98eY/95/xuekD16lwoGjZ/FlbvXLZ07Z75y9GX3zsfV73L782DFN/uqXzzucDern6l2gO9EjYiPw6cZPc9TPmOPTiRNAUJAN5v2US/1MuGv74foV5E707PVrUKmBScfcHPUr4J3oB4+fx+dXXsLIkJF51i+/dzjr6vfv4H9Rt0LdfOeUs362mPdT9EP1y39OmcMK9h87jyVX2mNUz1FZx74C3Il+M8awfvnNCcg6NzKsn6ZAd6Lrjn0jXh0BLw+vAt+Jbmz9cjvfO3lSQWCgzSPql/+7tvcfO48vr7yE93q+l1W/AtyJnp/6Pe4c9vhxbS71y39O2e+c1Z+7vPouvD28C3wnekRsBD7b+BmODD5iUD9jzsuz6heFKv5ZN46Ycif6/mPn8q6fCXdtZ69foFegSdcaBvUL0BidU/ZrjRz1K+Cd6BFxEViwYQH+GfyPvn7GXj+dPKlCYKAq7/oZcdf2/mPnsPRKB8NrhwLcia6r36HBh9CgUgOTrp9yrZ+Jd6Ib1M/d26Scsrad+f7Lb/3yuibU1W/+T1HwM6if8de5uV77FeBO9MfV72lfuz+2fkZe50bERmDhhoX4e/Df+vpZy7W7IvmvnyVeu4siuBF7A4s2LsLhQYdz1I/X7pbR38srp7t376JcuXJISEjQ93RzY1V3og8fPhxnzpzRN9CfJAcHBzg4OOQYt7W1ha2t4T+rrigP071w8jv+8HZNGVcUJdfxvGI0dtwac1IUG6SnAwIbQCXZ/0KuMUKVe65QMscFNkhPt808x1SycurcuTMiIiJQuXLlHDl17NixUHPKXg+V7pywADk9NIh0SYdWpc08AGcNG/78uHEVoFVpkS7pUNlk5WHsay/v+hmTU9a49r/8TM1Jsp3o6L4Spqhyfw3n5/1kWD/Tcnpo0Lj6PZRT9vHc6mfsPkKlss29fsbkpCgG9cuQDJNzKoz6ZV9X19PKbPqYllN2klf98pmTfjsqMap+ee2zjapfHjnlWT8TcjLc7n//y6N++TkOZe2K8qhfPnIyiNHI+uXIKdt49vopuulGjDzm5lo/I3PKvPjJ/KMWCtSiNjknw+3+txkblRnql5VTdmpR56xdbrE/btym4PVTFMXI+uWek25cd+zT7fdMyclwu5n/M6Z+D58bKfp486rfo3N6WIZkGFe/3I4fMK5+jzuHzVk/43LSvcj15y6K6TkZ/r7M929u9cvveXlW/VTG1S+Pc9U865ffnLKNZ69fZqymXWvo66c8pn55nn/nUT8TcnqYFtpc65ffa4rH1u8xOT0s12NfHrHnOa4Y1k9RKbnGnhWKkfUzMifdv4tB/fI693xMTg8rrPqJ0fUz4toBRl4nFVL9CvvaPV/1M3JcA41R9bOUa3dB/utnidfuOmpR51o/XrtbRn/P2JweZjVN9HfeeQfbt2/H/v374eXlpR+vUKEC0tPTce/ePZQpU0Y/HhUVhQoVKujXOXLkiMH2oqKi9MuInoZFixbluWzZsmVPMRIiIiIiIiIiIiLSsfgmuojg3Xffxc8//4y//voLfn5+BssbNGgAOzs77N27F927dwcAXLhwAREREQgODgYABAcH48MPP0R0dDTc3d0BALt370bp0qUREBDwdBOi4sElAufuxQKRBd+Uq5MrKrtULviGiIiIiIiIiIiIKAeLb6IPHz4c69atw5YtW1CqVCncuXMHQOYk846OjnBxccHgwYMxevRolCtXDqVLl8a7776L4OBgNG7cGADQtm1bBAQEoG/fvpg7dy7u3LmDKVOmYPjw4blO2UJUEHfTb0IZ0RR9DqQABwq+PUc7R5wffp6NdCIiIiIiIiIioifA4pvoS5cuBQC0aNHCYHzlypUYMGAAAGDBggVQqVTo3r070tLS0K5dO3z55Zf6dW1sbLB9+3a8/fbbCA4OhrOzM/r3749Zs2Y9rTSoGEnWxENsUtCnbR94lPMo0Lai4qOw5vc1iH0QyyY6ERERERERERHRE2DxTfTsT1XNS4kSJbBkyRIsWbIkz3V8fHywY8eOwgyN6JE8ynnA293b3GEQERERERERERHRI+TxOF8iIiIiIiIiIiIiImITnYiIiIiIiIiIiIgoD2yiExERERERERERERHlgU10IiIiIiIiIiIiIqI8sIlORERERERERERERJQHNtGJiIiIiIiIiIiIiPLAJjo9Ma6urhg5ciROnTpl7lCIiIiIiIiIiIiITMImOj0xpUqVglarRYsWLRAUFIRly5YhMTGxUH9HXFxcoW6PiIiIiIiIiIiIKDs20emJKVu2LD7//HNERkZi1KhR+PHHH1GpUiX069cP+/fvL5TfERQUVCjbISIiIiIiIiIiIsoNm+j0xDk4OOD111/Hnj17cPr0afj4+KBv375Gb6dcuXI5/rt+/br+z0RERERERERERESFjU10emJEJMeYr68vPvjgA1y7ds3o7dWtWxc9e/bEsWPHEBoaiuPHj8PT0xOhoaEIDQ0thIiJiIiIiIiIiIiIDLGJTk/M999/n+cyRVGM3t4ff/yBGjVqYODAgUhLS4Ovry/s7Ozg4+MDHx+fgoRKRERERERERERElCtbcwdA1uu5554r9G2OGjUKbdu2xcCBA9G9e/dc73YnIiIiIiIiIiIiKiy8E52emMDAQCxcuBCxsbGFut2aNWti3759iI+Ph7e3d6Fum4iIiIiIiIiIiCg7NtHpiYmMjMTevXtRuXJl9OzZE7/99luh3Tlua2uL2bNnY//+/YWyPSIiIiIiIiIiIqLcsIlOT4y7uzu2bduGy5cvo379+njnnXfg4+ODadOmmfRg0V9++QVxcXEAgNjYWPTs2ROVK1fGyy+/jFu3bhVy9ERERERERERERERsotMTpHt4qKenJyZNmoRLly5h9erVuHbtGmrVqmX09t5//32UK1cOADB27FhUq1YNu3btQrNmzTB06NBCjZ2IiIiIiIiIiIgI4INF6QnKbeqWFi1aoEWLFkhMTDRpe7rG/MmTJ7Fq1SoAQEBAANauXVugWImIiIiIiIiIiIhywzvR6Yn55JNP8lxWunRpo7fn4eGBw4cPAwC8vLxw584dAMD9+/eh0WhMC5KIiIiIiIiIiIjoEXgnOj0xbdu2LdTtLV68GF26dEFwcDDc3NzQqFEjtGzZEv/++y8mT55cqL+LiIiIiIiIiIiICOCd6GQmX331ldF/p1atWjhz5gxatmyJsmXLokuXLqhVqxZ27dqF3r17P4EoiYiIiIiIiIiIqLjjnehkFrdu3TLp7zk6OmLw4MGFHA0RERERERERERFR7ngnOpnFzJkzC3V727dvL9TtEREREREREREREQFsopOZxMXFFer2tmzZUqjbIyIiIiIiIiIiIgLYRCczqVevXqFu7+uvvy7U7REREREREREREREBnBOdnqCtW7fmuSw1NbXA24+JicHp06fh7++PihUrFnh7RERERERERERERA9jE52emK5du6J58+YQkRzL7t+/b/T2+vXrh/nz58Pd3R1//PEHQkJC4Ofnh2vXruGrr75Cly5dCiFqIiIiIiIiIiIioixsotMTU61aNXz77bfw9fXNsczb29vo7Z08eRLu7u4AMh9Munv3btStWxdXr15Ft27d2EQnIiIiIiIiIiKiQsc50emJ6d+/P2JjY3Nd9tZbbxm9vZSUFP2fHzx4gLp16wIA/Pz8oNFoTIqRiIiIiIiIiIiI6FHYRKcnZtKkSQgMDMx12fvvv2/09tq1a4eRI0ciKSkJrVu3xtq1ayEi2LlzJ1xdXQsaLhEREREREREREVEObKLTExMeHo6WLVuiSpUqGD16tMHDRIODg43e3qeffgqVSoVKlSphw4YN6Nu3L+zt7bFo0SJ88803hRk6EREREREREREREQA20ekJevvtt9GjRw9s2rQJsbGxaNWqlf6Botkb6vllb2+PBQsWIDIyElu3bsWxY8dw584d7Nq1C35+foUdPhERERERERERERGb6PTkREdHY/jw4WjQoAFWr16Njh07olWrVkhISICiKCZv18nJCbVq1UK9evVQvnx5AED16tULK2wiIiIiIiIiIiIiPVtzB0DWK/uDQAFg8uTJsLe3N7gj3RinTp3Kc5kp2yMiIiIiIiIiIiJ6HDbR6Ynx9/fHrl270L59e/3Y2LFjoVKpMHbsWKO3V7duXfj6+kJEciyLi4srUKxEREREREREREREuWETnZ6YDRs25Do+evRohISEGL09Hx8fHDx4EJ6enjmWeXt7G709IiIiIiIiIiIiosfhnOj0xDg4OMDBwSHXZZUqVTJ6e507d0Z4eHiuyzp27Gj09oiIiIiIiIiIiIgeh3eiU6GIiABiYwtve66uQOXKhmOLFi3Kc/1ly5YV3i8nIiIiIiIiIiIi+g+b6FRgERGAv7/gwQOl0Lbp5CQ4d07J0UgnIiIiIiIiIiIieprYRKcCi40FHjxQMHLeXXhV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EPH395fp06dLdHS0uUMsFJMnT5aBAweKo6OjvPbaa3L16lVzh1QoTp06JT4+PtK0aVMJCAgQOzs7+e6778wdVqGx5tfn7du3xd/fX2bMmCFqtVpERAICAuTLL780WM9S9y0iImfOnJEyZcpI8+bNpVmzZmJrayvdu3eXXbt26dex5PzCw8OlQoUKMm7cuDzzsOT8dD744APp2LGj1KhRQzp16iT79+83d0iFwtr3n/Hx8VK/fn0ZP368REVFiUajkTFjxkijRo2kX79+cu3aNXOHaLLo6GipW7euTJkyRT/WokULmT17thmjKlxjx46V1157TUQyr2O3bNki8+bNk71798rt27fNHF3BXbx4UUqXLi1Dhw6VcePGSY8ePURRFJk+fbpcv37d3OEVyP379yU4OFjeffddERGJjIyUnTt3Srly5aR9+/Zy+fJlM0dYMNaenzVhE52emKSkJBk0aJAMGDBAlixZIoqiyLhx46ymkR4XFydt27aVESNGGIy3aNFCv/Oz9JN8tVot0dHRUr16dbl586Zs3rxZgoKC5I033pAmTZpI9+7dzR2iySIjI6VChQrSrl07EcnM9b333tNf0CxYsEDOnTtn5ihNt3z5cmnRooXBa7BDhw6yfPly+e677+SPP/4wY3QFl5aWJn369JE33nhDP3bp0iUJCQmRxo0by6JFi8wYXcFdu3ZNqlatKuPHj9d/WPXNN9+Ih4eHXLx40czRFY5t27ZJhw4dREQkPT1d3n//fenSpYsMGTLE4ILbEvejZ8+eFV9fXzl69KjB+IQJE6RWrVoyd+5cSU5ONlN0Bad7TY4cOVKWLFkiZ8+eFQcHB+nXr58kJyfLvHnzLLaREB4eLj4+PjJhwgRJTU2VmJgYmTlzptSrV08iIyMt8vX4MGt+fR48eFCee+45g/1kSEiIjB07Vvr06SPffvutREREmDHCgnnw4IF06tRJhg8frh87duyYBAYGSuvWrWXz5s1mjK5wrF69Wrp16yYimceGjz/+WAYNGiRTpkwxOHex1PeiLu7PPvtMZs2aJVevXpVnn31WunbtKmFhYTJhwgS5cOGCmaM0TXHYf16/fl18fHxkz549BuOff/65BAcHy7Bhwyz2WvfUqVPy7LPPGhwbBg4cKP3795dOnTrJ9OnT5fz582aMsODat28vn332mYiING3aVJo0aSJeXl7y3HPPSdu2bS0+vylTpkjbtm0NxhYvXizly5eXCRMmyJ07d8wUWcGlpKRI/fr1ZcOGDQbjFy5cEFdXV+nSpYv+w3NLZO35WRPOiU5PjEqlQoMGDdC+fXsMGzYMGzZswPz58zF37lyreJBHRkYG7t27hx49egDIegCLn58f4uPjAVj+w1hUKhXc3NwQFBSEM2fOoGvXrpgxYwZ+/vlnnD59Gp06dTJ3iAUSHByMuLg4bNmyBZ06dcLp06dRo0YNtGrVCosXL8b8+fMRERFh7jBNIiKIiIjAiRMnAAAffvghdu7ciU2bNuGLL75Ar169sGrVKrPGWBD29vaIiorSv8dEBFWrVsXcuXNRo0YN/Pjjj9i2bZuZozSNVqvFhg0bULVqVUyePBkqVeahOigoCHZ2dvp9jaU7fvy4fl/ZoUMH/O9//4OPjw+uX7+OBQsWYPLkyQAscz+akZEBtVqNBw8eAIB+PuaPP/4YLVu2xNKlS/XziIsFzhOre022b98ex48fR0BAAA4cOICNGzeiZs2aWLhwoUW+TtVqNVauXIm6deti+vTpcHBwgKurK4KDgxEZGWkV0ywAmXOlWuvr8+7du4iOjsaVK1eQlpaGefPmYfPmzUhLS0NcXByWLl2KefPm6XO3NI6OjoiPj4erqyuAzONF/fr18f3330OtVuOrr77CyZMnzRxlwYSGhupfk23btsXWrVuRkpKCTZs2YerUqVi6dCkAyzw2AFlxN2/eHEePHoWvry9+/PFHXLhwAe3bt8eXX36pf99Z0vtPq9Vi5cqVqF27tlXvP1UqFZycnHD79m0AWQ/Xfuedd9CtWzf8+eef+N///gfAsuoHZB4L1Go1/vnnH8TGxmLOnDlYs2YNfHx84OrqikOHDmHs2LEWfR1fqVIlXL9+HXPmzIGzszN++OEHXL9+HbNmzYKiKPj444+Rmppq7jBNlv35H7rX5rvvvosPP/wQX3zxBX7++WcAsMhzNI1Gg6ioKFy4cEE/lpGRgerVq2Pv3r3YvXs35syZY8YIC8ba87MqZmvfU7GQlJRk8POGDRtEURQZO3asxMbGikjmHW3h4eHmCK/Ast/plJ6eLiKZnwD37dvXYL379+8/1bgKW79+/WTixIkiIjJ48GApW7asBAQEyKBBgyx6epDbt29Lv379xNHRUdq0aaN/TYqIrF27VsqUKSM7duwwY4SmCw8PlyZNmkjVqlWle/fuoiiK/PLLL6LVaiUqKkpGjBghLVq0kNjYWIu7M0itVkt6eroMHDhQevToIampqaLVavV3x165ckWCg4MlJCTEzJGabt++ffr3nI5GoxFfX1/5888/zRNUIdu9e7e8+OKLsmLFCmnTpo3cvHlTRETu3bsnM2fOlMaNG8vZs2fNHKXpgoKCpGXLlvqfU1NT9X8ODAyUXr16mSOsAsu+v9i7d688++yz8uDBAxEReemll0SlUslLL70kkZGR5gqxQH744Qf58MMPDcbu3bsn3t7ecurUKTNFVXC3b982eD8FBgZazevz4dxatGghFStWlFatWomDg4Ps3LlTv+zjjz+WypUrW9zX2nXHt8TERGnZsqW8/fbbIpJ5PMzIyBCRzG8YeHl5yciRI80Vpsmy3123cuVK6datm2zYsEFat26tv3MyMjJS+vfvL61btzY4X7MEycnJOaYKPHHihFStWlUSEhJEROTll18WOzs7adGihfz777/mCNNkN27ckBMnTsj27dutcv/5sE6dOkm9evXk3r17IiL696BI5nEw+77V0vTr10+qVq0qrVq1EicnJ9m6dat+2dq1a6VSpUpy/PhxM0ZoHI1GYzD96IIFC6RmzZrSvXt3+fjjjw3WXbRokfj6+lrc/iW7RYsWSalSpeTWrVsiYjhF6cyZM6VkyZIW/W2sTz/9VLy8vGTbtm36MV0PZvbs2dKoUSOJi4uzuGtbHWvPz1qwiU5PhVqt1r/Z169fr5/a5datWzJq1Cjp1q2bxX51WMRwbvD3339fP0WIiMhHH30kn376qcEJlqXQ1WzVqlUyffp0efvtt6VixYoSHh4umzdvlmeeeUbeeustSUlJMXOkprt165ZMmjRJ9u7dKyKGDaKqVas+cr7moi48PFw2btwo06dPlx49ehgs+/jjj6VOnToWVbuHv8L2119/iY2NjcHULbp1/vrrL1GpVPr5+y1BXl/R070mNRqN+Pn5ye+//65ftmfPHouZv/jh/M6dOyeenp4SEBAgrVu3NlgWEREhTk5Osm7duqcZosmSkpIkMTFR3wwRETl+/Li4u7vr594UybrQHj16tLz88stPPU5T5ZafSGbzslOnTiKS+ZVvLy8vWbVqlZQsWVI6d+6s/2CkqIuLi5OwsDC5dOmSQY66915SUpJ4e3vL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OXPg4OCAESNGwNbW1mJy09E1xV988UVcvXoVw4YNw44dO3Ds2DGcOHEC48aNg729PerVqwcHBweLy6+4YhOdiIiIiIiIiIioiLGxsYGIQKvVolevXlAUBX379sXWrVtx5coV/PvvvxZ7g4NKpTK4A1s3ncm0adMwe/ZshIaGWuxDNnU5+fn5YeDAgfDw8MD27dvh5+cHPz8/KIqCOnXqwMHBwcyRkjE4nQsREREREREREVERpWvdKYqCVq1a4cSJE/jrr78s/kGwurnAZ8yYgcjISFSrVg1TpkzBoUOHrOIB9hkZGfj+++8RGBiI2rVrc9oWC2eZH+kQEREREREREREVA4qiQKPRYNy4cfjzzz9x4sQJi2+gA1l3n9vZ2eHrr79G6dKlcfDgQatooAOZeQ0YMECfJxvolo2PfiUiIiIiIiIiIiriatasiePHj6N27drmDqVQtWvXDgBw6NAhBAYGmjmawqVroJPl43QuRERERERERERERZw1TweSnJxssfO7U/HAJjoRERERERERERERUR74nQIiIiIiIiIiIiIiojywiU5ERERERERERERElAc20YmIiIiIiIiIiIiI8sAmOhERERERERERERFRHthEJyIiIiIiIiIiIiLKA5voRERERERERERERER5YBOdiIiIiIiIiIiIiCgPbKITEREREREREREREeWBTXQiIiIiIiIiIiIiojywiU5ERERERERERERElAc20YmIiIiIiIiIiIiI8sAmOhERERERERERERFRHthEJyIiIiIiIiIiIiLKA5voRERERERERERERER5YBOdiIiIiIis3qpVq1CmTBlzh0FEREREFohNdCIiIiKiR7hz5w7effddVKlSBQ4ODvD29sbLL7+MvXv3mjs0s7p27RoURcGJEyfytf53332HoKAgODk5oVSpUmjevDm2b9/+ZIPMJiQkBBcvXnxqv4+IiIiIrAeb6EREREREebh27RoaNGiAP/74A/PmzcPp06exa9cutGzZEsOHDzd3eI+k0Wig1WpzjKenpz/1WMaOHYs333wTISEhOHXqFI4cOYLnn38er7zyCr744osn/vszMjLg6OgId3f3J/67iIiIiMj6sIlORERERJSHYcOGQVEUHDlyBN27d0f16tVRs2ZNjB49Gn///bd+vYiICLzyyisoWbIkSpcujVdffRVRUVH65TNmzEDdunXx/fffw9fXFy4uLujVqxfu37+vX0er1WLu3LmoWrUqHBwcULlyZXz44YcAgL/++guKouDevXv69U+cOAFFUXDt2jUAWdOVbN26FQEBAXBwcEBERAR8fX3xwQcfoF+/fihdujSGDh0KADh48CBeeOEFODo6wtvbGyNGjEBycrJ++76+vvjoo48waNAglCpVCpUrV8ZXX32lX+7n5wcAqFevHhRFQYsWLXL9N/z777/x6aefYt68eRg7diyqVq0Kf39/fPjhh3jvvfcwevRo3Lhxw+DfKbuFCxfC19fXYGzFihXw9/dHiRIlUKNGDXz55Zf6Zbo75Ddu3IjmzZujRIkSWLt2ba7TuWzZsgX169dHiRIlUKVKFcycORNqtRoAICKYMWMGKleuDAcHB3h6emLEiBG55khERERE1o1NdCIiIiKiXMTHx2PXrl0YPnw4nJ2dcyzXNWS1Wi1eeeUVxMfHY9++fdi9ezfCw8MREhJisP6VK1fwyy+/YPv27di+fTv27duHjz/+WL980qRJ+PjjjzF16lSEhYVh3bp18PDwMCrmBw8e4JNPPsGKFStw9uxZ/Z3X8+fPR506dRAaGoqpU6fiypUraN++Pbp3745Tp05h48aNOHjwIN555x2D7X366acIDAxEaGgohg0bhrfffhsXLlwAABw5cgQAsGfPHkRGRmLz5s25xrR+/XqULFkSb775Zo5lY8aMQUZGBn766ad857h27VpMmzYNH374Ic6dO4ePPvoIU6dOxXfffWew3sSJEzFy5EicO3cO7dq1y7GdAwcOoF+/fhg5ciTCwsKwfPlyrFq1Sv/BxU8//YQFCxZg+fLluHTpEn755RfUqlUr33ESERERkfWwNXcARERERERF0eXLlyEiqFGjxiPX27t3L06fPo2rV6/C29sbALB69WrUrFkT//77L4KCggBkNttXrVqFUqVKAQD69u2LvXv34sMPP8T9+/exaNEifPHFF+jfvz8A4JlnnsHzzz9vVMwZGRn48ssvUadOHYPxF198EWPGjNH/PGTIEPTu3RvvvfceAKBatWpYvHgxmjdvjqVLl6JEiRIAgA4dOmDYsGEAgAkTJmDBggX4888/8eyzz8LNzQ0AUL58eVSoUCHPmC5evIhnnnkG9vb2OZZ5enqidOnSRs1VPn36dHz66afo1q0bgMw74nVN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", + "text/plain": [ + "
" ] + }, + "metadata": {}, + "output_type": "display_data" }, { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Generate embeddings for the query templates used in benchmarking process\n", - "\n", - "Note: Doing this to avoid the overhead of generating embeddings for each query during the benchmark process\n", - "\n", - "Note: Feel free to add more queries to the query_templates list to test the performance of the vector database with a larger number of queries" + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJNCAYAAADeVjy8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeXhMZ//H8c/MZJWIiJ0kJLFvtROUWlo0VJ9S3exUadTWonSxtCilqh7d1dJSLVWtfSutra0lqa2WElJrBAmVTTLn94df5jGSIanIBO/XdeWSuc8953w/M5P88c3tPibDMAwBAAAAAAAAAIAMzM4uAAAAAAAAAACAvIomOgAAAAAAAAAADtBEBwAAAAAAAADAAZroAAAAAAAAAAA4QBMdAAAAAAAAAAAHaKIDAAAAAAAAAOAATXQAAAAAAAAAABygiQ4AAAAAAAAAgAM00QEAAAAAAAAAcIAmOgAAAPKs33//XW5ubjp+/HiuXrdBgwYaNmxYrl7zbte9e3eVKVPG2WU4tH37djVs2FBeXl4ymUyKjIx0dklOVaZMGXXv3t1u7PDhw3rkkUdUoEABmUwmLVmyRLNnz5bJZNKxY8ecUmdue+ihh/TQQw85uwwAAJDH0EQHAAD3jfRmUPqXh4eHypcvr/79++vs2bN2c//66y917NhRBQsWVL58+dS4cWNt2LAhwzm7d+9ud870r4oVK2apJpPJpP79++dIvvnz5+v999/PkXPlFa+99pqeeeYZlS5dOlevO3z4cM2YMUNnzpzJ8nOSkpI0depU1a9fXwUKFLD7fB06dOgOVotbuXr1qp588klduHBBU6dO1ZdffnnHP1PHjh1Tjx49FBISIg8PDxUvXlxNmjTRqFGj7uh1b0e3bt20Z88ejRs3Tl9++aXq1KlzR66zb98+de7cWaVKlZK7u7tKliypzp07a//+/XfkegAAALfLZBiG4ewiAAAAcsPs2bPVo0cPjR07VkFBQUpKStLmzZttDbW9e/cqX758+vvvv1WrVi1ZLBYNGDBAXl5emjVrlvbt26f169erSZMmtnN2795dCxYs0Oeff253rQIFCqhdu3a3rMlkMik8PFz//e9/bztf27ZttXfv3ntmxWhkZKRq1qyprVu3KjQ0NFevbbVaVapUKT3//PMaO3bsLefHxsaqdevW2rlzp9q2bauWLVvK29tbBw8e1IIFC3TmzBmlpKTkQuXOc/XqVVmtVrm7uzu7lAwOHDigSpUq6bPPPlPv3r3v+PX++usv1a1bV56enurZs6fKlCmj06dPa9euXVq5cqWSkpLueA23kpycLLPZLFdXV0lSYmKi8uXLp9dee01vv/22bV5aWpquXr0qd3d3mUym277u4sWL9cwzz8jPz0+9evVSUFCQjh07ppkzZ+rChQv65ptv1L59+9u+zr+V/nPq5ubmtBoAAEDe4+LsAgAAAHJbmzZtbCsse/furUKFCum9997TDz/8oGeeeUbvvPOO4uLitHfvXlWoUEGS9Pzzz6tixYoaPHiwdu7caXc+FxcXde7cOddz3OtmzZqlwMBANWjQINevbTab1bFjR82dO1djxoy5ZfOwe/fuioiI0KJFi9ShQwe7Y2+99ZZee+21O1muU125ckVeXl62ZmxeFBMTI0ny9fXNsXOm587M1KlT9c8//ygyMjLDivf0Wpztxj92nDt3TlLG18hischiseTINY8cOaIuXbooODhYv/zyi4oUKWI7NnDgQD344IPq3Lmzdu/eraCgoBy5ZlYlJCQoX758NM8BAECm2M4FAADc95o3by5JioqKkiRt2rRJNWvWtDXQJSlfvnx67LHHtGvXLh0+fDjDOdLS0nTp0qU7Ut8PP/ygsLAwlSxZUu7u7goJCdFbb72ltLQ025yHHnpIy5cv1/Hjx21byly/P3VycrJGjRqlsmXLyt3dXQEBARo2bJiSk5PtrpW+vcySJUtUtWpVubu7q0qVKlq1alWGuk6ePKlevXrZ6goKClK/fv2UkpKio0ePymQyaerUqRmet3XrVplMJn399dc3zb1kyRI1b948QwO7TJkyatu2rTZu3Kg6derI09NT1apV08aNGyVdW+larVo1eXh4qHbt2oqIiLB7/pkzZ9SjRw/5+/vL3d1dJUqUUPv27TOs4H/44Yd1/PjxW+6d/dtvv2n58uXq1atXhga6dK1ZOXnyZLuxn376SQ8++KC8vLzk6+ur9u3b688//7SbM3r0aJlMJh06dEidO3dWgQIFVKRIEb3xxhsyDEN///232rdvLx8fHxUvXlxTpkyxe/7GjRtlMpn0zTffaOTIkSpevLi8vLz02GOP6e+//7abu2nTJj355JMKDAy0fT4GDx6sxMREu3ndu3eXt7e3jhw5okcffVT58+fXc889Zzt2457oCxYsUO3atZU/f375+PioWrVqmjZtmt2co0eP6sknn5Sfn5/y5cunBg0aaPny5Zlm+fbbbzVu3Dj5+/vLw8NDLVq00F9//eXgnflfzU2bNpUkPfnkkzKZTHZ7Xmfnvdi/f7+effZZFSxYUI0bN3Z4zSNHjsjf3z/TLWOKFi1q9zj987xmzRrVqFFDHh4eqly5shYvXpzhuXFxcRo0aJACAgLk7u6usmXLauLEibJarXbzrFarpk2bZvs5KFKkiFq3bq0dO3bYXTd9T/TRo0fbah06dKjd7w9He6KvXLlSTZs2tb23devW1fz58x2+JpL07rvvKiEhQZ9++qldA12SChcurE8++UT//POP3n33Xdu4o73209+TG3311VeqXbu2PD095efnp6effjrD5/2hhx5S1apVtXPnTjVp0kT58uXTyJEjbcdu3BM9q78/165dq8aNG8vX11fe3t6qUKGC7bwAAODuxkp0AABw3zty5IgkqVChQpKuNUwKFiyYYV6+fPkkSTt37lS5cuVs4wkJCfLx8VFCQoIKFiyoZ555RhMnTpS3t3eO1Dd79mx5e3tryJAh8vb21k8//aQ333xTly5dsjWbXnvtNcXHx+vEiRO2xnX69a1Wqx577DFt3rxZffr0UaVKlbRnzx5NnTpVhw4d0pIlS+yut3nzZi1evFgvvvii8ufPrw8++EAdOnRQdHS07TU6deqU6tWrp7i4OPXp00cVK1bUyZMntWjRIiUkJCg4OFiNGjXSvHnzNHjwYLvzz5s3T/nz57/plg0nT55UdHS0atWqlenxv/76S88++6xeeOEFde7cWZMnT1a7du308ccfa+TIkXrxxRclSRMmTFCnTp108OBBmc3X1o906NBB+/bt00svvaQyZcooJiZGa9euVXR0tF2zrnbt2pKkLVu2qGbNmg5r/fHHHyVJXbp0cTjneuvWrVObNm0UHBys0aNHKzExUdOnT1ejRo20a9euDA3Dp556SpUqVdI777yj5cuX6+2335afn58++eQTNW/eXBMnTtS8efP0yiuvqG7dunbbDUnSuHHjZDKZNHz4cMXExOj9999Xy5YtFRkZKU9PT0nSwoULlZCQoH79+qlQoUL6/fffNX36dJ04cUILFy60O19qaqpatWqlxo0ba/LkybafixutXbtWzzzzjFq0aKGJEydKkv78809t2bJFAwcOlCSdPXtWDRs2VEJCggYMGKBChQppzpw5euyxx7Ro0SL95z//sTvnO++8I7PZrFdeeUXx8fGaNGmSnnvuOf32228OX+8XXnhBpUqV0vjx4zVgwADVrVtXxYoV+1fvxZNPPqly5cpp/PjxutmumKVLl9a6dev0008/2f5IdzOHDx/WU089pb59+6pbt26aNWuWnnzySa1atUoPP/ywpGu/Z5o2baqTJ0/qhRdeUGBgoLZu3aoRI0bo9OnTdvdD6NWrl2bPnq02bdqod+/eSk1N1aZNm/Trr79mus/5E088IV9fXw0ePFjPPPOMHn300Zv+/po9e7Z69uypKlWqaMSIEfL19VVERIRWrVqlZ5991uHzli5dqjJlyujBBx/M9HiTJk1UpkwZLV26VB9++OEtX7cbjRs3Tm+88YY6deqk3r1769y5c5o+fbqaNGmiiIgIu1X258+fV5s2bfT000+rc+fOts/EjbL6+3Pfvn1q27atqlevrrFjx8rd3V1//fWXtmzZku0cAAAgDzIAAADuE7NmzTIkGevWrTPOnTtn/P3338aCBQuMQoUKGZ6ensaJEycMwzCMdu3aGb6+vsalS5fsnh8aGmpIMiZPnmwbe/XVV43hw4cb33zzjfH1118b3bp1MyQZjRo1Mq5evXrLmiQZ4eHhN52TkJCQYeyFF14w8uXLZyQlJdnGwsLCjNKlS2eY++WXXxpms9nYtGmT3fjHH39sSDK2bNliV4+bm5vx119/2cb++OMPQ5Ixffp021jXrl0Ns9lsbN++PcP1rFarYRiG8cknnxiSjD///NN2LCUlxShcuLDRrVu3m2Zet26dIclYunRphmOlS5c2JBlbt261ja1evdqQZHh6ehrHjx+3jafXsGHDBsMwDOPixYuGJOPdd9+96fXTubm5Gf369bvpnP/85z+GJOPixYtZOmeNGjWMokWLGufPn7eN/fHHH4bZbDa6du1qGxs1apQhyejTp49tLDU11fD39zdMJpPxzjvv2MYvXrxoeHp62r2uGzZsMCQZpUqVsvssf/vtt4YkY9q0abaxzD5jEyZMMEwmk93rmf75fvXVVzPM79atm93nb+DAgYaPj4+Rmprq8LUYNGiQIcnus3n58mUjKCjIKFOmjJGWlmaXpVKlSkZycrJt7rRp0wxJxp49exxe4/rn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DY4fP65OnTrpscceU/HixbVv3z59/PHHql69usaPH2+bd+bMGdWsWVPPPPOMbeX06tWrtWLFCrVu3Vrt27fP0vV27Niht99+O8P4Qw89pIYNG6pgwYLq1q2bBgwYIJPJpC+//DLTZlXt2rX1zTffaMiQIapbt668vb3Vrl07denSRd9++6369u2rDRs2qFGjRkpLS9OBAwf07bffavXq1bfc3uZG48eP15o1a9S0aVP16dNHlSpV0unTp7Vw4UJt3rzZdpM96dqWLh988IE2bNigiRMnZvka7du31/fff5+lfcmz6tChQ2rRooU6deqkypUry8XFRd9//73Onj2rp59+2m7u2rVrFRgYmGGLl8zMnTtXjzzyiJ544gm1a9dOLVq0kJeXlw4fPqwFCxbo9OnTmjx5siTp3XffVZs2bRQaGqpevXopMTFR06dPV4ECBTR69OgcyXk9Pz8/NW7cWD169NDZs2f1/vvvq2zZsnr++eclXVv1HxISoldeeUUnT56Uj4+Pvvvuu3+1z/j1evfurQsXLqh58+by9/fX8ePHNX36dNWoUcO2uv/VV1/V119/rTZt2mjAgAHy8/PTnDlzFBUVpe+++y5L28bcjjv1XkycOFE7d+7UE088YfvDwa5duzR37lz5+flp0KBBdvPLly+vXr16afv27SpWrJi++OILnT17VrNmzbLNGTp0qH788Ue1bdtW3bt3V+3atXXlyhXt2bNHixYt0rFjx1S4cGE1a9ZMXbp00QcffKDDhw+rdevWslqt2rRpk5o1a2bXoP43fHx8NHXqVPXu3Vt169bVs88+q4IFC+qPP/5QQkLCTbfqKVu2rObOnatnnnlG1apVU69evRQUFKRjx45p5syZunjxohYsWGC39/zTTz+t4cOH6z//+Y8GDBighIQEffTRRypfvrx27dplmxcSEqK3335bI0aM0LFjx/T4448rf/78ioqK0vfff68+ffrY/piVHVn9/Tl27Fj98ssvCgsLU+nSpRUTE6MPP/xQ/v7+ma66BwAAdxkDAADgPjFr1ixDkrF9+/abzrtw4YLRvn17o3jx4oabm5sRFBRkDB8+3Lh06ZLdvIsXLxqdO3c2ypYta+TLl89wd3c3qlSpYowfP95ISUnJUk2SHH699dZbhmEYxpYtW4wGDRoYnp6eRsmSJY1hw4YZq1evNiQZGzZs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uD766CO5ubnphx9+UN++fbV3715Nnjz5DqcBAAAAAADA/WDChAm2JvqIESNUrVo1zZw5U/Pnz9fAgQP1/fffO7lCpKOJ7mT+wakKrnLnm+i3w93dXcWLF5ck9evXT99//71+/PFH9e3bVwMHDtTSpUuVnJyspk2b6oMPPlC5cuUkScePH1f//v21efNmpaSkqEyZMnr33XdVuXJlNWvWTJJUsGBBSVK3bt00e/ZsXb58WX379tWSJUvk4+OjYcOG6YcfflCNGjX0/vvvS5LKlCmjXr166fDhw1qyZImeeOIJzZ49W5s3b9aIESO0Y8cOFS5cWP/5z380YcIEeXl5ad++fTpy5IjWr1+v0qVLS5JKly6tRo0a2XL+/fffevnllzVo0CCNHz/eNv7yyy/Lzc1NAwYM0JNPPqn69evf8dccAAAAAAAA9zbDMGzf//7779q1a5csFouGDBli2xkCeQM3FkW2eXp6KiUlRd27d9eOHTv0448/atu2bTIMQ48++qiuXr0qSQoPD1dycrJ++eUX7dmzRxMnTpS3t7cCAgL03XffSZIOHjyo06dPa9q0aZKu7fm0ZcsW/fjjj1q7dq02bdqkXbt2Zahh8uTJeuCBBxQREaE33nhDR44cUevWrdWhQwft3r1b33zzjTZv3qz+/ftLkooUKSKz2axFixYpLS0t01yLFi3S1atX9corr2Q49sILL8jb21tff/11jryGAAAAAAAAuL8lJSVpz5492r17t0wmkywWi+2YyZR7W0Dj1liJjiwzDEPr16/X6tWr1aZNGy1ZskRbtmxRw4YNJUnz5s1TQECAlixZoieffFLR0dHq0KGDqlWrJkkKDg62ncvPz0+SVLRoUdue6JcvX9acOXM0f/58tWjRQpI0a9YslSxZMkMtzZs318svv2x73Lt3bz333HMaNGiQJKlcuXL64IMP1LRpU3300UcqVaqUPvjgAw0bNkxjxoxRnTp11KxZMz333HO2ug4dOqQCBQqoRIkSGa7n5uam4OBgHTp06DZfRQAAAAAAAEBKTExU+/btbSvST5w4IX9/f8XHx8tsZu1zXsK7gVtatmyZvL295eHhoTZt2uipp55S9+7d5eLiYre1SaFChVShQgX9+eefkqQBAwbo7bffVqNGjTRq1Cjt3r37ptc5evSorl69qnr16tnGChQooAoVKmSYW6dO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ac6cOdq1a5fKli2rVq1a6cKFC3bzXnvtNU2ZMkU7duyQi4uLevbsaTs2b948jRs3ThMnTtTOnTsVGBiojz76yO7506ZN05QpUzR58mTt3r1brVq10mOPPabDhw/fMsfgwYN1+fJlrV27NtPjhmFo1apVio6OVv369W95PgAAAAAAAAD3NproyJLOnTtr8+bNOn78uI4fP64tW7aoc+fOtuNXrlzRRx99pHfffVdt2rRR5cqV9dlnn8nT01MzZ860O9e4cePUtGlTVa5cWa+++qq2bt2qpKQkSdL06dPVq1cv9ejRQ+XLl9ebb76patWq2T1/8uTJGj58uJ5++mlVqFBBEydOVI0aNfT+++/fMkfFihUlSceOHbMb9/f3l7e3t9zc3BQWFqZRo0apSZMm/+KVAgAAAAAAAJzr3Llz+umnn3T69Glnl3JPoImOLClSpIjCwsI0e/ZszZo1S2FhYSpcuLDt+JEjR3T16lU1atTINubq6qp69erpzz//tDtX9erVbd+XKFFCkhQTEyPp2t7k9erVs5t//eNLly7p1KlTdteRpEaNGmW4TmYMw5Bkf+NRSdq0aZMiIyMVGRmpzz//XOPHj8+wAh4AAAAAAADIi7p27Wrrr/3000+2xasPPPCAlixZ4tzi7gF5uok+evRomUwmu6/0lcTStZtbhoeHq1ChQvL29laHDh109uxZu3NER0crLCxM+fLlU9GiRTV06FClpqbazdm4caNq1aold3d3lS1bVrNnz86NeHednj17avbs2ZozZ47dFizZ5erqavs+vZlttVpvu76sSG+0BwUF2Y0HBQWpbNmyqlKlinr06KEuXbpo3LhxuVITAAAAAAAAcDv++OMPFS1aVJI0ZswYrV27Vr///rt+++03jRkzxsnV3f3ydBNdkqpUqaLTp0/bvjZv3mw7NnjwYC1dulQLFy7Uzz//rFOnTumJJ56wHU9LS1NYWJhSUlK0detWzZkzR7Nnz9abb75pmxMVFaWwsDA1a9ZMkZGRGjRokHr37q3Vq1fnas67QevWrZWSkqKrV6+qVatWdsdCQkLk5uamLVu22MauXr2q7du3q3Llylm+RoUKFexuRirJ7rGPj49Klixpdx1J2rJlS5au8/7778vHx0ctW7a86TyLxaLExMQs1w0AAAAAAAA4y/V9rISEBNWoUUPStYWjaWlpTqrq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", + "text/plain": [ + "
" ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Generate bar charts for each metric\n", + "bar_chart_benchmark_comparison(\n", + " benchmark_results, metric=\"avg_latency\", metric_label=\"Average Latency (ms)\"\n", + ")\n", + "bar_chart_benchmark_comparison(\n", + " benchmark_results, metric=\"throughput\", metric_label=\"Throughput (queries/sec)\"\n", + ")\n", + "bar_chart_benchmark_comparison(\n", + " benchmark_results, metric=\"p95_latency\", metric_label=\"P95 Latency (ms)\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Part 5: Extra Notes" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "### 5.1 PostgreSQL JSONB vs MongoDB BSON\n", + "\n", + "| Feature | **PostgreSQL JSONB** | **MongoDB BSON** |\n", + "|----------------------------|--------------------------------------------------|----------------------------------------------|\n", + "| **Integration** | An extension to a relational database system. | Native to MongoDB, a document database. |\n", + "| **Query Language** | Uses SQL with JSONB-specific operators/functions. | Uses MongoDB Query Language (MQL), a JSON-like query syntax. |\n", + "| **Storage Optimization** | Optimized for relational data alongside JSONB. | Fully optimized for JSON-like document storage. |\n", + "| **Data Type Support** | Stores standard JSON data types (e.g., strings, numbers). | Includes additional types not in standard JSON (e.g., `Date`, `ObjectId`, `Binary`). |\n", + "| **Use Case** | Best for hybrid relational/JSON use cases. | Designed for flexible schemas, document-based databases. |\n", + "| **Updates** | JSONB supports in-place updates for specific keys or paths. | BSON supports in-place updates with more native support for field-level atomic operations. |\n", + "| **Size Overhead** | Slightly more compact than BSON in some cases. | Includes metadata like type information, leading to slightly larger size. |\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "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.11.5" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "00f63a14f50f4dbe94adef7739f518d7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3926c9e8cfde48daa712478cadbce690", + "placeholder": "​", + "style": "IPY_MODEL_fc7bb823ac024190bdab34d7f70eb7f6", + "value": "configuration.py: 100%" + } }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "query_templates = [\n", - " \"When was YouTube officially launched, and by whom?\",\n", - " \"What is YouTube's slogan introduced after Google's acquisition?\",\n", - " \"How many hours of videos are collectively watched on YouTube daily?\",\n", - " \"Which was the first video uploaded to YouTube, and when was it uploaded?\",\n", - " \"What was the acquisition cost of YouTube by Google, and when was the deal finalized?\",\n", - " \"What was the first YouTube video to reach one million views, and when did it happen?\",\n", - " \"What are the three separate branches of the United States government?\",\n", - " \"Which country has the highest documented incarceration rate and prison population?\",\n", - " \"How many executions have occurred in the United States since 1977, and which countries have more?\",\n", - " \"What percentage of the global military spending did the United States account for in 2019?\",\n", - " \"How is the U.S. president elected?\",\n", - " \"What cooling system innovation was included in the proposed venues for the World Cup in Qatar?\",\n", - " \"What lawsuit was filed against Google in June 2020, and what was it about?\",\n", - " \"How much was Google fined by CNIL in January 2022, and for what reason?\",\n", - " \"When did YouTube join the NSA's PRISM program, according to reports?\"\n", - "]\n", - "\n", - "# For each query template question, generate an embedding\n", - "# NOTE: Doing this to avoid the overhead of generating embeddings for each query during the benchmark process\n", - "query_embeddings = [get_cohere_embeddings(sentences=[query], input_type=\"search_query\") for query in query_templates]\n" - ] + "0110b660a0d54148b2e3310bb2512c0b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Create a dictionary with the query templates and their corresponding embeddings\n", - "query_embeddings_dict = {query: embedding for query, embedding in zip(query_templates, query_embeddings)}\n" - ] + "01c99f8562544b158098b10dbbb6a4ce": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6f1bbca9316e4ecf9453d408cb96e3f4", + "placeholder": "​", + "style": "IPY_MODEL_4088bb56dc324f2ca37ffec9b69dc4f7", + "value": " 71.8k/71.8k [00:00<00:00, 3.50MB/s]" + } }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
When was YouTube officially launched, and by whom?What is YouTube's slogan introduced after Google's acquisition?How many hours of videos are collectively watched on YouTube daily?Which was the first video uploaded to YouTube, and when was it uploaded?What was the acquisition cost of YouTube by Google, and when was the deal finalized?What was the first YouTube video to reach one million views, and when did it happen?What are the three separate branches of the United States government?Which country has the highest documented incarceration rate and prison population?How many executions have occurred in the United States since 1977, and which countries have more?What percentage of the global military spending did the United States account for in 2019?How is the U.S. president elected?What cooling system innovation was included in the proposed venues for the World Cup in Qatar?What lawsuit was filed against Google in June 2020, and what was it about?How much was Google fined by CNIL in January 2022, and for what reason?When did YouTube join the NSA's PRISM program, according to reports?
00.1846920.1815190.1249390.2260740.4157710.1270750.2379150.5249020.3964840.3425290.3754880.4902340.1187740.1384280.477783
10.2624510.0196380.0224460.1304930.0495300.1959230.418945-0.256348-0.112061-0.0330200.1580810.3310550.199219-0.0651250.128540
2-0.3146970.1343990.049500-0.2280270.077454-0.0626830.057587-0.5766600.051880-0.189575-0.151855-0.245117-0.053436-0.451172-0.274658
30.0981450.1790770.4997560.0896000.0002460.0633540.0112150.0080950.014961-0.099731-0.2131350.2578120.3989260.2741700.223389
4-0.0581050.3110350.3073730.0763550.4162600.398682-0.2430420.160278-0.0983890.036224-0.036987-0.3513180.3342290.2568360.176514
................................................
7630.4550780.4997560.4287110.4646000.5131840.4646000.2915040.3066410.3286130.3671880.2382810.4970700.3845210.5073240.436523
7640.2673340.1561280.2446290.3400880.1745610.4875490.0382690.0585630.6093750.080261-0.0049590.0073700.4035640.544922-0.016052
7650.2602540.039520-0.1064450.1148070.4396970.1033330.1868900.0130840.1768800.3376460.200439-0.3554690.3266600.3168950.338135
7660.0010400.3154300.0453490.1134030.190552-0.0381160.2990720.2563480.3166500.4204100.3425290.0626830.0355220.0942380.180420
7670.1172490.2502440.1450200.0968020.245605-0.057373-0.201904-0.123169-0.248047-0.0343630.039124-0.1102290.1256100.179321-0.066345
\n", - "

768 rows × 15 columns

\n", - "
" - ], - "text/plain": [ - " When was YouTube officially launched, and by whom? \\\n", - "0 0.184692 \n", - "1 0.262451 \n", - "2 -0.314697 \n", - "3 0.098145 \n", - "4 -0.058105 \n", - ".. ... \n", - "763 0.455078 \n", - "764 0.267334 \n", - "765 0.260254 \n", - "766 0.001040 \n", - "767 0.117249 \n", - "\n", - " What is YouTube's slogan introduced after Google's acquisition? \\\n", - "0 0.181519 \n", - "1 0.019638 \n", - "2 0.134399 \n", - "3 0.179077 \n", - "4 0.311035 \n", - ".. ... \n", - "763 0.499756 \n", - "764 0.156128 \n", - "765 0.039520 \n", - "766 0.315430 \n", - "767 0.250244 \n", - "\n", - " How many hours of videos are collectively watched on YouTube daily? \\\n", - "0 0.124939 \n", - "1 0.022446 \n", - "2 0.049500 \n", - "3 0.499756 \n", - "4 0.307373 \n", - ".. ... \n", - "763 0.428711 \n", - "764 0.244629 \n", - "765 -0.106445 \n", - "766 0.045349 \n", - "767 0.145020 \n", - "\n", - " Which was the first video uploaded to YouTube, and when was it uploaded? \\\n", - "0 0.226074 \n", - "1 0.130493 \n", - "2 -0.228027 \n", - "3 0.089600 \n", - "4 0.076355 \n", - ".. ... \n", - "763 0.464600 \n", - "764 0.340088 \n", - "765 0.114807 \n", - "766 0.113403 \n", - "767 0.096802 \n", - "\n", - " What was the acquisition cost of YouTube by Google, and when was the deal finalized? \\\n", - "0 0.415771 \n", - "1 0.049530 \n", - "2 0.077454 \n", - "3 0.000246 \n", - "4 0.416260 \n", - ".. ... \n", - "763 0.513184 \n", - "764 0.174561 \n", - "765 0.439697 \n", - "766 0.190552 \n", - "767 0.245605 \n", - "\n", - " What was the first YouTube video to reach one million views, and when did it happen? \\\n", - "0 0.127075 \n", - "1 0.195923 \n", - "2 -0.062683 \n", - "3 0.063354 \n", - "4 0.398682 \n", - ".. ... \n", - "763 0.464600 \n", - "764 0.487549 \n", - "765 0.103333 \n", - "766 -0.038116 \n", - "767 -0.057373 \n", - "\n", - " What are the three separate branches of the United States government? \\\n", - "0 0.237915 \n", - "1 0.418945 \n", - "2 0.057587 \n", - "3 0.011215 \n", - "4 -0.243042 \n", - ".. ... \n", - "763 0.291504 \n", - "764 0.038269 \n", - "765 0.186890 \n", - "766 0.299072 \n", - "767 -0.201904 \n", - "\n", - " Which country has the highest documented incarceration rate and prison population? \\\n", - "0 0.524902 \n", - "1 -0.256348 \n", - "2 -0.576660 \n", - "3 0.008095 \n", - "4 0.160278 \n", - ".. ... \n", - "763 0.306641 \n", - "764 0.058563 \n", - "765 0.013084 \n", - "766 0.256348 \n", - "767 -0.123169 \n", - "\n", - " How many executions have occurred in the United States since 1977, and which countries have more? \\\n", - "0 0.396484 \n", - "1 -0.112061 \n", - "2 0.051880 \n", - "3 0.014961 \n", - "4 -0.098389 \n", - ".. ... \n", - "763 0.328613 \n", - "764 0.609375 \n", - "765 0.176880 \n", - "766 0.316650 \n", - "767 -0.248047 \n", - "\n", - " What percentage of the global military spending did the United States account for in 2019? \\\n", - "0 0.342529 \n", - "1 -0.033020 \n", - "2 -0.189575 \n", - "3 -0.099731 \n", - "4 0.036224 \n", - ".. ... \n", - "763 0.367188 \n", - "764 0.080261 \n", - "765 0.337646 \n", - "766 0.420410 \n", - "767 -0.034363 \n", - "\n", - " How is the U.S. president elected? \\\n", - "0 0.375488 \n", - "1 0.158081 \n", - "2 -0.151855 \n", - "3 -0.213135 \n", - "4 -0.036987 \n", - ".. ... \n", - "763 0.238281 \n", - "764 -0.004959 \n", - "765 0.200439 \n", - "766 0.342529 \n", - "767 0.039124 \n", - "\n", - " What cooling system innovation was included in the proposed venues for the World Cup in Qatar? \\\n", - "0 0.490234 \n", - "1 0.331055 \n", - "2 -0.245117 \n", - "3 0.257812 \n", - "4 -0.351318 \n", - ".. ... \n", - "763 0.497070 \n", - "764 0.007370 \n", - "765 -0.355469 \n", - "766 0.062683 \n", - "767 -0.110229 \n", - "\n", - " What lawsuit was filed against Google in June 2020, and what was it about? \\\n", - "0 0.118774 \n", - "1 0.199219 \n", - "2 -0.053436 \n", - "3 0.398926 \n", - "4 0.334229 \n", - ".. ... \n", - "763 0.384521 \n", - "764 0.403564 \n", - "765 0.326660 \n", - "766 0.035522 \n", - "767 0.125610 \n", - "\n", - " How much was Google fined by CNIL in January 2022, and for what reason? \\\n", - "0 0.138428 \n", - "1 -0.065125 \n", - "2 -0.451172 \n", - "3 0.274170 \n", - "4 0.256836 \n", - ".. ... \n", - "763 0.507324 \n", - "764 0.544922 \n", - "765 0.316895 \n", - "766 0.094238 \n", - "767 0.179321 \n", - "\n", - " When did YouTube join the NSA's PRISM program, according to reports? \n", - "0 0.477783 \n", - "1 0.128540 \n", - "2 -0.274658 \n", - "3 0.223389 \n", - "4 0.176514 \n", - ".. ... \n", - "763 0.436523 \n", - "764 -0.016052 \n", - "765 0.338135 \n", - "766 0.180420 \n", - "767 -0.066345 \n", - "\n", - "[768 rows x 15 columns]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } + "02c34754d7e64bc49b709c0932644c13": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "05505d63901645cb8bf6237d1b4bb2d4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0571fa79cac84734ae970f985e39e0eb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_bd35bbf844764a86bc30a7a9b448d2bb", + "IPY_MODEL_8cba175638b24b118516885001bd3b10", + "IPY_MODEL_6b6ae431c1ee4dad844c2ea3955a9455" ], - "source": [ - "# View the first 5 query embeddings as a dataframe\n", - "pd.DataFrame(query_embeddings_dict)" - ] + "layout": "IPY_MODEL_1400e532ba0f4272856a2e0f572130fa" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 2: Semantic Search with PostgreSQL and PgVector\n", - "\n", - "In this section, we create a PostgreSQL database with the PgVector extension and insert the dataset into the database.\n", - "\n", - "The table `wikipedia_data` is created with the following columns:\n", - "- `id`: The unique identifier for each row\n", - "- `title`: The title of the Wikipedia article\n", - "- `text`: The text of the Wikipedia article\n", - "- `url`: The URL of the Wikipedia article\n", - "- `json_data`: The JSON data of the Wikipedia article\n", - "- `embedding`: The embedding vector for the Wikipedia article\n", - "\n", - "The table is created with a HNSW index with m=16, ef_construction=64 and cosine similarity (these are the default parameters for the HNSW index in pgvector).\n", - "- `HNSW`: Hierarchical Navigable Small World graphs are a type of graph-based index that are used for efficient similarity search.\n", - "- `m=16`: The number of edges per node in the graph\n", - "- `ef_construction=64`: Short for exploration factor construction, is the number of edges to build during the index construction phase\n", - "- `ef_search=100`: Short for exploration factor search, is the number of edges to search during the index search phase\n", - "- `cosine similarity`: The similarity metric used for the index (formula: dot product(A, B) / (|A||B|))\n", - "- `cosine distance`: The distance metric calculated using cosine similarity (1 - cosine similarity)\n", - "\n", - "We perform a semantic search on the database using a single data point of the query templates and their corresponding embeddings.\n" - ] + "068a6b5348fa4d778af925798e15f3c9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": { - "id": "0PM-dnDtxQBW" - }, - "source": [ - "### Step 1: Install Libraries\n", - "\n", - "- `pgvector` (0.3.6): A PostgreSQL extension for vector similarity search (https://github.com/pgvector/pgvector)\n", - "- `psycopg` (3.2.3): A PostgreSQL database adapter for Python (https://www.psycopg.org/)\n" - ] + "076ec604be1d4f58875a60c8c70fb399": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d06fea19aa0644edbf24a0c6ca06e83b", + "placeholder": "​", + "style": "IPY_MODEL_7995585ce22a4e1eb12cdf3f2968087d", + "value": "modeling.py: 100%" + } }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "A5GwoxiSfWgv", - "outputId": "157e4760-e25c-45cd-d1d5-3eb3fdfea593" - }, - "outputs": [], - "source": [ - "%pip install --upgrade --quiet pgvector \"psycopg[binary]\"" - ] + "079a149d46d84815b514e5675ad5d214": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 2: Installing PostgreSQL and PgVector\n", - "\n", - "PostgreSQL and PgVector are installed using docker.\n", - "\n", - "The PostgreSQL docker image is pulled from the [postgres](https://hub.docker.com/_/postgres) repository.\n", - "\n", - "The PgVector docker image is pulled from the [pgvector/pgvector](https://hub.docker.com/r/pgvector/pgvector) repository.\n", - "\n", - "Find more instructions on installing PostgreSQL and PgVector [here](https://github.com/pgvector/pgvector?tab=readme-ov-file#docker): " - ] + "09663b7776534a919ba1e0ccffa4488a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 3: Create Postgres Table\n", - "\n", - "- `id`: The unique identifier for each row\n", - "- `title`: The title of the Wikipedia article\n", - "- `text`: The text of the Wikipedia article\n", - "- `url`: The URL of the Wikipedia article\n", - "- `json_data`: The JSON data of the Wikipedia article\n", - "- `embedding`: The embedding vector for the Wikipedia article\n", - "\n", - "NOTE: JSON data `json_data` in the dataset is stored as a JSONB column in Postgres to mirror the use of binary formatted data in MongoDB via BSON." - ] + "0a3a298d7eb34e72aaa78ceb2d3a8a9c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "def create_table(connection):\n", - " with connection.cursor() as cur:\n", - " # Drop table if it already exists\n", - " cur.execute('DROP TABLE IF EXISTS wikipedia_data')\n", - "\n", - " # Create the table with the appropriate structure\n", - " cur.execute('''\n", - " CREATE TABLE wikipedia_data (\n", - " id bigserial PRIMARY KEY,\n", - " title text,\n", - " text text,\n", - " url text,\n", - " json_data jsonb,\n", - " embedding vector(768)\n", - " )\n", - " ''')\n", - " \n", - " # Create HNSW index for vector similarity search with cosine similarity\n", - " cur.execute('''\n", - " CREATE INDEX ON wikipedia_data \n", - " USING hnsw (embedding vector_cosine_ops) \n", - " WITH (m = 16, ef_construction = 64);\n", - " ''')\n", - " \n", - " print(\"Table and index created successfully\")\n", - " connection.commit()" - ] + "0cf02ddf7172445994797558e8eb7725": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 4: Define insert function\n", - "\n", - "For inserting JSON data, we convert the Python Dictionary in the `json_data` attribute to a JSON string using the `json.dumps()` function.\n", - "\n", - "This is a serilization process that converts the Python Dictionary in the `json_data` attribute to a JSON string that is stored as binary data in the database." - ] + "10e1a2826dd54920a5660852b3a3081b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "import json\n", - "import numpy as np\n", - "\n", - "def insert_data_to_postgres(dataframe, connection, database_type=\"PostgreSQL\"):\n", - " \"\"\"\n", - " Insert data into the PostgreSQL database.\n", - "\n", - " Args:\n", - " dataframe (pandas.DataFrame): The dataframe containing the data to insert.\n", - " connection (psycopg.extensions.connection): The connection to the PostgreSQL database.\n", - " database_type (str): The type of database (default: \"PostgreSQL\").\n", - " \"\"\"\n", - " start_time = time.time()\n", - " total_rows = len(dataframe)\n", - "\n", - " try:\n", - " with connection.cursor() as cur:\n", - " # Create a list of tuples for insertion, filtering out rows with invalid embeddings\n", - " data_tuples = []\n", - " for _, row in dataframe.iterrows():\n", - " data_tuple = (\n", - " row['title'],\n", - " row['text'],\n", - " row['url'],\n", - " json.dumps(row['json_data']), # Convert dict to JSON string\n", - " row['embedding']\n", - " )\n", - " data_tuples.append(data_tuple)\n", - " \n", - " if not data_tuples:\n", - " raise ValueError(\"No valid data tuples to insert\")\n", - " \n", - " cur.executemany(\n", - " \"\"\"\n", - " INSERT INTO wikipedia_data \n", - " (title, text, url, json_data, embedding)\n", - " VALUES (%s, %s, %s, %s, %s)\n", - " \"\"\",\n", - " data_tuples\n", - " )\n", - " \n", - " connection.commit()\n", - " \n", - " except Exception as e:\n", - " print(f\"Error during bulk insert: {e}\")\n", - " connection.rollback()\n", - " raise e\n", - " \n", - " end_time = time.time()\n", - " total_time = end_time - start_time\n", - " rows_per_second = len(data_tuples) / total_time\n", - " \n", - " # print(f\"\\nInsertion Statistics:\")\n", - " # print(f\"Total time: {total_time:.2f} seconds\")\n", - " # print(f\"Average insertion rate: {rows_per_second:.2f} rows/second\")\n", - " # print(f\"Total rows inserted: {len(data_tuples)}\")\n", - " # print(f\"Rows skipped: {total_rows - len(data_tuples)}\")\n", - "\n", - " # Store results in benchmark dictionary\n", - " if database_type not in benchmark_results:\n", - " benchmark_results[database_type] = {}\n", - " \n", - " benchmark_results[database_type]['insert_time'] = {\n", - " 'total_time': total_time,\n", - " 'rows_per_second': rows_per_second,\n", - " 'total_rows': total_rows\n", - " }" - ] + "1400e532ba0f4272856a2e0f572130fa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 5: Insert Data into Postgres" - ] + "172257c2e1a147ea822e91ae891ef680": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table and index created successfully\n", - "\n", - "Insertion Statistics:\n", - "Total time: 462.10 seconds\n", - "Average insertion rate: 216.40 rows/second\n", - "Total rows inserted: 100000\n", - "Rows skipped: 0\n", - "Connection closed\n" - ] - } + "18dfa17915704a9683c01bc6217bc3f7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "196dc72cb04648f1adaa39aeb138b5b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ca397ff9c91f4f5d92304e6ac8dfacd4", + "IPY_MODEL_4eafb763d79d4c538123dc7f3ad46d5a", + "IPY_MODEL_b34a39294d724e22af562dc21b0b44ab" ], - "source": [ - "import psycopg\n", - "from pgvector.psycopg import register_vector\n", - "\n", - "try:\n", - " # Connect to PostgreSQL\n", - " conn = psycopg.connect(\"dbname=vector_db user=postgres password=test host=127.0.0.1\")\n", - "\n", - " # Enable the pgvector extension\n", - " conn.execute('CREATE EXTENSION IF NOT EXISTS vector')\n", - "\n", - " # Register vector type to handle embedding data as vector data types\n", - " register_vector(conn)\n", - "\n", - " # Step 1: Create the table\n", - " create_table(conn)\n", - "\n", - " # Step 2: Insert the expanded dataset into the table\n", - " insert_data_to_postgres(dataset_df, conn)\n", - "\n", - "except Exception as e:\n", - " print(\"Failed to execute:\", e)\n", - "finally:\n", - " # Close the connection\n", - " conn.close()\n", - " print(\"Connection closed\")" - ] + "layout": "IPY_MODEL_488b6619d7f049cebbe61e00588045bb" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 6: Define semantic search function\n", - "\n", - "To avoid exhasuting API key usage, we will fetch the query embedding from the `query_embeddings_dict` dictionary.\n", - "\n", - "In the `semantic_search_with_postgres` function, we set the HNSW ef parameter to 100 using the `execute_command` function.\n", - "\n", - "This is to set the exploration factor for the HNSW index to 100. And corresponds to the number of nodes/candidates to search during the index search phase.\n", - "A node corresponds to a vector in the index.\n" - ] + "19bd15fc5f694a548b3f831db259e89e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bb7211de903d427ba9b5916c9bec6168", + "placeholder": "​", + "style": "IPY_MODEL_70697741acef4b1280dea8c8ef605172", + "value": " 1.38k/1.38k [00:00<00:00, 74.7kB/s]" + } }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [], - "source": [ - "def semantic_search_with_postgres(query, connection, top_n=5):\n", - " # Take a query embedding from the query_embeddings_dict\n", - " query_embedding = query_embeddings_dict[query]\n", - "\n", - " with connection.cursor() as cur:\n", - " # Set the HNSW ef parameter using execute_command\n", - " cur.execute(\"SET hnsw.ef_search = 100\")\n", - " connection.commit()\n", - " \n", - " # Then perform the semantic search query\n", - " cur.execute(\n", - " \"\"\"\n", - " SELECT title, text, url, json_data,\n", - " embedding <=> %s::vector AS similarity\n", - " FROM wikipedia_data\n", - " ORDER BY similarity ASC\n", - " LIMIT %s\n", - " \"\"\", \n", - " (query_embedding, top_n)\n", - " )\n", - "\n", - " # Fetch and return the top results\n", - " results = cur.fetchall()\n", - " \n", - " # Format results as list of dictionaries for easier handling\n", - " formatted_results = []\n", - " for r in results:\n", - " formatted_results.append({\n", - " 'title': r[0],\n", - " 'text': r[1],\n", - " 'url': r[2],\n", - " 'json_data': r[3],\n", - " 'similarity': r[4]\n", - " })\n", - " \n", - " return formatted_results" - ] + "1a767bc8f6e5402896602b5755e7949e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a56b94240d274812b2373e7d341ac3c7", + "max": 1349, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_18dfa17915704a9683c01bc6217bc3f7", + "value": 1349 + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 7: Running a quick example of semantic search with postgres and pgvector" - ] + "1c924ea24cc943e79da03f7707df61ee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Title: YouTube\n", - "Text: YouTube announced the project in September 2016 at an event in India. It was launched in India in February 2017, and expanded in November 2017 to 14 other countries, including Nigeria, Indonesia, Thailand, Malaysia, Vietnam, the Philippines, Kenya, and South Africa. It was rolled out in 130 countries worldwide, including Brazil, Mexico, Turkey, and Iraq on February 1, 2018. Before it shut down, the app was available to around 60% of the world's population.\n", - "URL: https://en.wikipedia.org/wiki?curid=3524766\n", - "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=3524766', 'text': \"YouTube announced the project in September 2016 at an event in India. It was launched in India in February 2017, and expanded in November 2017 to 14 other countries, including Nigeria, Indonesia, Thailand, Malaysia, Vietnam, the Philippines, Kenya, and South Africa. It was rolled out in 130 countries worldwide, including Brazil, Mexico, Turkey, and Iraq on February 1, 2018. Before it shut down, the app was available to around 60% of the world's population.\", 'title': 'YouTube'}\n", - "Similarity Score: 0.9034\n", - "--------------------------------------------------------------------------------\n", - "\n", - "Title: YouTube\n", - "Text: The mobile version of the site was relaunched based on HTML5 in July 2010, avoiding the need to use Adobe Flash Player and optimized for use with touch screen controls. The mobile version is also available as an app for the Android platform.\n", - "URL: https://en.wikipedia.org/wiki?curid=3524766\n", - "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=3524766', 'text': 'The mobile version of the site was relaunched based on HTML5 in July 2010, avoiding the need to use Adobe Flash Player and optimized for use with touch screen controls. The mobile version is also available as an app for the Android platform.', 'title': 'YouTube'}\n", - "Similarity Score: 0.8969\n", - "--------------------------------------------------------------------------------\n", - "\n", - "Title: YouTube\n", - "Text: In January 2009, YouTube launched \"YouTube for TV\", a version of the website tailored for set-top boxes and other TV-based media devices with web browsers, initially allowing its videos to be viewed on the PlayStation 3 and Wii video game consoles.\n", - "URL: https://en.wikipedia.org/wiki?curid=3524766\n", - "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=3524766', 'text': 'In January 2009, YouTube launched \"YouTube for TV\", a version of the website tailored for set-top boxes and other TV-based media devices with web browsers, initially allowing its videos to be viewed on the PlayStation 3 and Wii video game consoles.', 'title': 'YouTube'}\n", - "Similarity Score: 0.8967\n", - "--------------------------------------------------------------------------------\n", - "\n", - "Title: YouTube\n", - "Text: Later the same year, \"YouTube Feather\" was introduced as a lightweight alternative website for countries with limited internet speeds.\n", - "URL: https://en.wikipedia.org/wiki?curid=3524766\n", - "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=3524766', 'text': 'Later the same year, \"YouTube Feather\" was introduced as a lightweight alternative website for countries with limited internet speeds.', 'title': 'YouTube'}\n", - "Similarity Score: 0.8951\n", - "--------------------------------------------------------------------------------\n", - "\n", - "Title: Twitch (service)\n", - "Text: On May 18, 2014, \"Variety\" first reported that Google had reached a preliminary deal to acquire Twitch through its YouTube subsidiary for approximately .\n", - "URL: https://en.wikipedia.org/wiki?curid=33548254\n", - "JSON Data: {'url': 'https://en.wikipedia.org/wiki?curid=33548254', 'text': 'On May 18, 2014, \"Variety\" first reported that Google had reached a preliminary deal to acquire Twitch through its YouTube subsidiary for approximately .', 'title': 'Twitch (service)'}\n", - "Similarity Score: 0.8928\n", - "--------------------------------------------------------------------------------\n", - "Connection closed\n" - ] - } + "1f1fbec87933487e92fc3886b5a96280": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1fe65877defc440faf10c7f35a15a965": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_36b880bd98934e4394cc17214b2e58cd", + "placeholder": "​", + "style": "IPY_MODEL_35df53c36efe400d9e5db2e6aa316ef8", + "value": "tokenizer.json: 100%" + } + }, + "21dbfc6be7ea47a9992ff4608d41d781": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_00f63a14f50f4dbe94adef7739f518d7", + "IPY_MODEL_9ec0f908bf124b5a8eac23c39622c8d3", + "IPY_MODEL_e3d9b0903e5c49f882460b08d08cd114" ], - "source": [ - "# Connect to PostgreSQL\n", - "try:\n", - " conn = psycopg.connect(\"dbname=vector_db user=postgres password=test host=127.0.0.1\")\n", - " \n", - " # Run semantic search with a sample query\n", - " query_text = \"When was YouTube officially launched, and by whom?\"\n", - " results = semantic_search_with_postgres(query_text, conn, top_n=5)\n", - "\n", - " # Print results in a formatted way\n", - " for result in results:\n", - " print(f\"\\nTitle: {result['title']}\")\n", - " print(f\"Text: {result['text']}\")\n", - " print(f\"URL: {result['url']}\")\n", - " print(f\"JSON Data: {result['json_data']}\")\n", - " print(f\"Similarity Score: {1- result['similarity']:.4f}\")\n", - " print(\"-\" * 80)\n", - "\n", - "except Exception as e:\n", - " print(\"Failed to connect or execute query:\", e)\n", - "finally:\n", - " conn.close()\n", - " print(\"Connection closed\")" - ] + "layout": "IPY_MODEL_a8ea9d952a1e4d22b6041b4d6687f931" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 3: Semantic Search with MongoDB Atlas Vector Search" - ] + "271158b807424b41a0599865e4b489bb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 1: Install Libraries\n", - "\n", - "- `pymongo` (4.10.1): A Python driver for MongoDB (https://pymongo.readthedocs.io/en/stable/)" - ] + "28f9b774850548e08cf9046f9547a0a8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_91050f6f01b446c19544496659f5aa4c", + "max": 297, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_cbde3fc866c549b89006aa53a715daab", + "value": 297 + } }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install --quiet --upgrade pymongo" - ] + "2afdbdcecaa8419bb090a9cc30cea33d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 2: Installing MongoDB via Atlas CLI\n", - "\n", - "The Atlas CLI is a command line interface built specifically for MongoDB Atlas. \n", - "Interact with your Atlas database deployments and Atlas Search from the terminal with short, intuitive commands, so you can accomplish complex database management tasks in seconds.\n", - "\n", - "You can follow the instructions [here](https://www.mongodb.com/docs/atlas/cli/current/install-atlas-cli/#complete-the-prerequisites-3) to install the Atlas CLI using docker(other options are available) and get a local MongoDB database instance running.\n", - "\n", - "Follow the steps [here](https://www.mongodb.com/docs/atlas/cli/current/atlas-cli-docker/#follow-these-steps) to run Altas CLI commands with Docker.\n", - "\n", - "Find more information on the Atlas CLI [here](https://www.mongodb.com/docs/atlas/cli/): " - ] + "2b5cafc1a4d340088101860db2ffdb13": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5adb1154d2224663960bb79cede4472f", + "placeholder": "​", + "style": "IPY_MODEL_5a071cf6d0a746dcac2bd067010af0d0", + "value": " 232k/232k [00:00<00:00, 9.18MB/s]" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 3: Connect to MongoDB and Create Database and Collection" - ] + "2da038d71cde4c9e8bef804e22c6e652": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After installing the Atlas CLI, you can run the following command to connect to your MongoDB database:\n", - "1. atlas deployments connect\n", - "2. You will be prompted to specificy \"How would you like to connect to local9410\"\n", - "3. Select connectionString\n", - "4. Copy the connection string and paste it into the MONGO_URI environment variable\n", - "\n", - "More information [here](https://www.mongodb.com/docs/atlas/cli/current/atlas-cli-deploy-fts/#connect-to-the-deployment)." - ] + "2eeb2ab901ab459b997179c5038eb1c0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_92520823c88e4e09a5e5f2ff77872383", + "max": 231508, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_02c34754d7e64bc49b709c0932644c13", + "value": 231508 + } }, - { - "cell_type": "code", - "execution_count": 52, - "metadata": {}, - "outputs": [], - "source": [ - "# Set MongoDB URI\n", - "# Example: mongodb://localhost:54516/?directConnection=true\n", - "set_env_securely(\"MONGO_URI\", \"Enter your MONGO URI: \")\n" - ] + "339478ba34e048f2b1fd08f36ebe5550": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In the following code blocks below we do the following:\n", - "1. Establish a connection to the MongoDB database\n", - "2. Create a database and collection if they do not already exist\n", - "3. Delete all data in the collection if it already exists\n" - ] + "35df53c36efe400d9e5db2e6aa316ef8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 53, - "metadata": {}, - "outputs": [], - "source": [ - "import pymongo\n", - "\n", - "def get_mongo_client(mongo_uri):\n", - " \"\"\"Establish and validate connection to the MongoDB.\"\"\"\n", - "\n", - " client = pymongo.MongoClient(mongo_uri, \n", - " appname=\"devrel.showcase.postgres_vs_mongodb.python\")\n", - "\n", - " # Validate the connection\n", - " ping_result = client.admin.command('ping')\n", - " if ping_result.get('ok') == 1.0:\n", - " # Connection successful\n", - " print(\"Connection to MongoDB successful\")\n", - " return client\n", - " else:\n", - " print(\"Connection to MongoDB failed\")\n", - " return None\n", - "\n", - "MONGO_URI = os.environ['MONGO_URI']\n", - "if not MONGO_URI:\n", - " print(\"MONGO_URI not set in environment variables\")" - ] + "36b880bd98934e4394cc17214b2e58cd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Connection to MongoDB successful\n", - "Collection 'wikipedia_data' already exists.\n" - ] - } - ], - "source": [ - "from pymongo.errors import CollectionInvalid\n", - "\n", - "mongo_client = get_mongo_client(MONGO_URI)\n", - "\n", - "DB_NAME = \"vector_db\"\n", - "COLLECTION_NAME = \"wikipedia_data\"\n", - "\n", - "# Create or get the database\n", - "db = mongo_client[DB_NAME]\n", - "\n", - "# Check if the collection exists\n", - "if COLLECTION_NAME not in db.list_collection_names():\n", - " try:\n", - " # Create the collection\n", - " db.create_collection(COLLECTION_NAME)\n", - " print(f\"Collection '{COLLECTION_NAME}' created successfully.\")\n", - " except CollectionInvalid as e:\n", - " print(f\"Error creating collection: {e}\")\n", - "else:\n", - " print(f\"Collection '{COLLECTION_NAME}' already exists.\")\n", - "\n", - "# Assign the collection\n", - "collection = db[COLLECTION_NAME]\n" - ] + "379708bc3c814fa1b56add2aa56888f7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "DeleteResult({'n': 0, 'electionId': ObjectId('7fffffff0000000000000005'), 'opTime': {'ts': Timestamp(1733982920, 1), 't': 5}, 'ok': 1.0, '$clusterTime': {'clusterTime': Timestamp(1733982920, 1), 'signature': {'hash': b'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00', 'keyId': 0}}, 'operationTime': Timestamp(1733982920, 1)}, acknowledged=True)" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } + "3926c9e8cfde48daa712478cadbce690": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3aba620032124114b9cadd25c84bc28a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "404b118d1197475abb9a7efc1dda9124": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_68db9ec0b1834cc287fe0d62725fd7a2", + "IPY_MODEL_1a767bc8f6e5402896602b5755e7949e", + "IPY_MODEL_90812f460bbc404ab3461dbbeec1afa4" ], - "source": [ - "collection.delete_many({})" - ] + "layout": "IPY_MODEL_271158b807424b41a0599865e4b489bb" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 4: Vector Index Creation\n", - "\n", - "The `setup_vector_search_index` function creates a vector search index for the MongoDB collection.\n", - "\n", - "The `index_name` parameter is the name of the index to create.\n", - "\n", - "The `embedding_field_name` parameter is the name of the field containing the text embeddings on each document within the wikipedia_data collection.\n" - ] + "4088bb56dc324f2ca37ffec9b69dc4f7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "embedding_field_name = \"embedding\"\n", - "vector_search_index_name = \"vector_index\"" - ] + "4115caa433be49b480da8984fdd79cee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_62feba19ff5f4d1f9ee46ed7f1197131", + "max": 71774, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_61727889b118431ebb461d9fb3a13a15", + "value": 71774 + } }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "from pymongo.operations import SearchIndexModel\n", - "\n", - "def setup_vector_search_index(collection, index_name=\"vector_index\"):\n", - " \"\"\"\n", - " Setup a vector search index for a MongoDB collection and wait for 30 seconds.\n", - "\n", - " Args:\n", - " collection: MongoDB collection object\n", - " index_definition: Dictionary containing the index definition\n", - " index_name: Name of the index (default: \"vector_index\")\n", - " \"\"\"\n", - " new_vector_search_index_model = SearchIndexModel(\n", - " definition= {\"fields\": \n", - " [\n", - " {\n", - " \"type\": \"vector\",\n", - " \"path\": \"embedding\",\n", - " \"numDimensions\": 768,\n", - " \"similarity\": \"cosine\"\n", - " }\n", - " ]\n", - " },\n", - " name=index_name,\n", - " type=\"vectorSearch\"\n", - " )\n", - "\n", - " # Create the new index\n", - " try:\n", - " result = collection.create_search_index(model=new_vector_search_index_model)\n", - " print(f\"Creating index '{index_name}'...\")\n", - "\n", - " # Wait for 30 seconds\n", - " print(f\"Waiting for 30 seconds to allow index '{index_name}' to be created...\")\n", - " time.sleep(30)\n", - "\n", - " print(f\"30-second wait completed for index '{index_name}'.\")\n", - " return result\n", - "\n", - " except Exception as e:\n", - " print(f\"Error creating new vector search index '{index_name}': {str(e)}\")\n", - " return None" - ] + "437114a7c1894554ac58f1116fcb8e4b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Creating index 'vector_index'...\n", - "Waiting for 30 seconds to allow index 'vector_index' to be created...\n", - "30-second wait completed for index 'vector_index'.\n" - ] - }, - { - "data": { - "text/plain": [ - "'vector_index'" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "setup_vector_search_index(collection, \"vector_index\")" - ] + "43debe97a56c444b99a6e2dcf2acc507": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c14e122e644e462bb6e4b078cfdb5acc", + "max": 1384, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e7472356346c419c80a83b12a85cbda4", + "value": 1384 + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 5: Define Insert Data Function\n", - "\n", - "Because of the affinity of MongoDB for JSON data, we don't have to convert the Python Dictionary in the `json_data` attribute to a JSON string using the `json.dumps()` function. Instead, we can directly insert the Python Dictionary into the MongoDB collection.\n", - "\n", - "This reduced the operational overhead of the insertion processes in AI workloads.\n" - ] + "488b6619d7f049cebbe61e00588045bb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "def insert_data_to_mongodb(dataframe, collection, database_type=\"MongoDB\"):\n", - " start_time = time.time()\n", - " total_rows = len(dataframe)\n", - " \n", - " try:\n", - " # Convert DataFrame to list of dictionaries for MongoDB insertion\n", - " documents = dataframe.to_dict('records')\n", - " \n", - " # Use insert_many for better performance\n", - " result = collection.insert_many(documents)\n", - " \n", - " end_time = time.time()\n", - " total_time = end_time - start_time\n", - " rows_per_second = total_rows / total_time\n", - " \n", - " # print(f\"\\nMongoDB Insertion Statistics:\")\n", - " # print(f\"Total time: {total_time:.2f} seconds\")\n", - " # print(f\"Average insertion rate: {rows_per_second:.2f} rows/second\")\n", - " # print(f\"Total rows inserted: {len(result.inserted_ids)}\")\n", - " \n", - " # Store results in benchmark dictionary\n", - " if database_type not in benchmark_results:\n", - " benchmark_results[database_type] = {}\n", - " \n", - " benchmark_results[database_type]['insert_time'] = {\n", - " 'total_time': total_time,\n", - " 'rows_per_second': rows_per_second,\n", - " 'total_rows': total_rows\n", - " }\n", - " \n", - " return True\n", - " \n", - " except Exception as e:\n", - " print(f\"Error during MongoDB insertion: {e}\")\n", - " return False" - ] + "4a50b1377ad4421390691e40ffd5f186": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bf55e069ecff4f5893a017cbf76437a0", + "placeholder": "​", + "style": "IPY_MODEL_c8d963c0d661444b8dd86f1a047d7a6a", + "value": "vocab.txt: 100%" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 6: Insert Data into MongoDB\n" - ] + "4c440ab8ea9049c983e96057c87f5f4a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a3829c2fc8e441698709df1a197efe39", + "max": 695, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0a3a298d7eb34e72aaa78ceb2d3a8a9c", + "value": 695 + } }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "documents = dataset_df.to_dict('records')\n", - "success = insert_data_to_mongodb(dataset_df, collection)\n" - ] + "4eafb763d79d4c538123dc7f3ad46d5a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_079a149d46d84815b514e5675ad5d214", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_aeaf94705c334cdaba2085ae7958184f", + "value": 0 + } }, - { - "cell_type": "code", - "execution_count": 36, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'insert_time': {'total_time': 90.82945108413696, 'rows_per_second': 1100.96448680911, 'total_rows': 100000}}\n" - ] - } + "4f5334ae79dc462c92c2413c0457917a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f11e8d3dd32f449895d7dda76122b8a8", + "placeholder": "​", + "style": "IPY_MODEL_a21c48a1b35f49a49b07395772d239f3", + "value": " 695/695 [00:00<00:00, 29.9kB/s]" + } + }, + "4ffefc357cbb4d8bb6cf504c772e66c3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "534524aaa9d449a38e4b94f73d28e794": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5477b673579b4610a61e1abb77031286": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e373cacb72674fdf9e82cc0f53d3d0a2", + "IPY_MODEL_4115caa433be49b480da8984fdd79cee", + "IPY_MODEL_01c99f8562544b158098b10dbbb6a4ce" ], - "source": [ - "print(benchmark_results[\"MongoDB\"])" - ] + "layout": "IPY_MODEL_09663b7776534a919ba1e0ccffa4488a" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Step 7: Define Semantic Search Function\n", - "\n", - "The `semantic_search_with_mongodb` function performs a vector search in the MongoDB collection based on the user query.\n", - "\n", - "- `user_query` parameter is the user's query string.\n", - "- `collection` parameter is the MongoDB collection to search.\n", - "- `top_n` parameter is the number of top results to return.\n", - "- `vector_search_index_name` parameter is the name of the vector search index to use for the search.\n", - "\n", - "The `numCandidates` parameter is the number of candidate matches to consider. This is set to 100 to match the number of candidate matches to consider in the PostgreSQL vector search.\n", - "\n", - "Another point to note is the queries in MongoDB are performed using the `aggregate` function enabled by the MongoDB Query Language(MQL).\n", - "\n", - "This allows for more flexibility in the queries and the ability to perform more complex searches. And data processing opreations can be defined as stages in the pipeline. If you are a data engineer, data scientist or ML Engineer, the concept of pipeline processing is a key concept.\n", - "\n", - "\n" - ] + "55011e76eb9d4e979871aca311c83f30": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 63, - "metadata": {}, - "outputs": [], - "source": [ - "def semantic_search_with_mongodb(user_query, collection, top_n=5, vector_search_index_name=\"vector_index\"):\n", - " \"\"\"\n", - " Perform a vector search in the MongoDB collection based on the user query.\n", - "\n", - " Args:\n", - " user_query (str): The user's query string.\n", - " collection (MongoCollection): The MongoDB collection to search.\n", - " additional_stages (list): Additional aggregation stages to include in the pipeline.\n", - " vector_search_index_name (str): The name of the vector search index.\n", - "\n", - " Returns:\n", - " list: A list of matching documents.\n", - " \"\"\"\n", - "\n", - " # Take a query embedding from the query_embeddings_dict\n", - " query_embedding = query_embeddings_dict[user_query]\n", - "\n", - " if query_embedding is None:\n", - " return \"Invalid query or embedding generation failed.\"\n", - "\n", - " # Define the vector search stage\n", - " vector_search_stage = {\n", - " \"$vectorSearch\": {\n", - " \"index\": vector_search_index_name, # specifies the index to use for the search\n", - " \"queryVector\": query_embedding, # the vector representing the query\n", - " \"path\": \"embedding\", # field in the documents containing the vectors to search against\n", - " \"numCandidates\": 100, # number of candidate matches to consider\n", - " \"limit\": top_n # return top n matches\n", - " }\n", - " }\n", - "\n", - " project_stage = {\n", - " \"$project\": {\n", - " \"_id\": 0, # Exclude the _id field\n", - " \"title\": 1,\n", - " \"text\": 1,\n", - " \"url\": 1,\n", - " \"score\": {\n", - " \"$meta\": \"vectorSearchScore\" # Include the search score\n", - " }\n", - " }\n", - " }\n", - "\n", - " # Define the aggregate pipeline with the vector search stage\n", - " pipeline = [vector_search_stage, project_stage]\n", - "\n", - " # Execute the search\n", - " results = collection.aggregate(pipeline)\n", - " return list(results)" - ] + "58fec38b927d44bc91aa25fc6297146d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "query_text = \"When was YouTube officially launched, and by whom?\"\n", - "\n", - "get_knowledge = semantic_search_with_mongodb(query_text, collection)" - ] + "5a071cf6d0a746dcac2bd067010af0d0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
titletexturlscore
0YouTubeYouTube announced the project in September 201...https://en.wikipedia.org/wiki?curid=35247660.951712
1YouTubeThe mobile version of the site was relaunched ...https://en.wikipedia.org/wiki?curid=35247660.948441
2YouTubeIn January 2009, YouTube launched \"YouTube for...https://en.wikipedia.org/wiki?curid=35247660.948370
3YouTubeLater the same year, \"YouTube Feather\" was int...https://en.wikipedia.org/wiki?curid=35247660.947532
4Twitch (service)On May 18, 2014, \"Variety\" first reported that...https://en.wikipedia.org/wiki?curid=335482540.946378
\n", - "
" - ], - "text/plain": [ - " title text \\\n", - "0 YouTube YouTube announced the project in September 201... \n", - "1 YouTube The mobile version of the site was relaunched ... \n", - "2 YouTube In January 2009, YouTube launched \"YouTube for... \n", - "3 YouTube Later the same year, \"YouTube Feather\" was int... \n", - "4 Twitch (service) On May 18, 2014, \"Variety\" first reported that... \n", - "\n", - " url score \n", - "0 https://en.wikipedia.org/wiki?curid=3524766 0.951712 \n", - "1 https://en.wikipedia.org/wiki?curid=3524766 0.948441 \n", - "2 https://en.wikipedia.org/wiki?curid=3524766 0.948370 \n", - "3 https://en.wikipedia.org/wiki?curid=3524766 0.947532 \n", - "4 https://en.wikipedia.org/wiki?curid=33548254 0.946378 " - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pd.DataFrame(get_knowledge).head()" - ] + "5adb1154d2224663960bb79cede4472f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 4: Vector Database Benchmarking" - ] + "5b11e4ace7b44175ba9df299b4330a32": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f0443240fa914a70a99977a5dd25896a", + "placeholder": "​", + "style": "IPY_MODEL_fe5a5107da5444428b0075580d83f9af", + "value": "1_Pooling/config.json: 100%" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 1. Insertion Benchmark Process\n", - "\n", - "We are inserting data incrementally with doubling batch sizes and record performance metrics.\n", - "Notably, we will be measuring the time it takes to insert data incrementally and the number of rows inserted per second.\n", - "\n", - "We are using the `insert_data_incrementally` function to insert data incrementally.\n", - "\n", - "It starts with a batch size of 1 and doubles the batch size until it has inserted all the data, recording the time it takes to insert the data and the number of rows inserted per second.\n", - "\n", - "The key component we are interested in is the time it takes to insert the data and the number of rows inserted per second. In AI Workloads, there are data ingestion processes that are performned in batches from various data sources. So in practice, we are interested in the time it takes to insert the data and the number of rows inserted per second." - ] + "5ec2ab12ce534bd6b5b0a6fd77d8edbf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8b5126dd80ea4e33a0bf7184464c69ef", + "placeholder": "​", + "style": "IPY_MODEL_eb44239cf2ec4b1590ed0f0a507723b3", + "value": " 59.0k/59.0k [00:00<00:00, 1.91MB/s]" + } }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "\n", - "def insert_data_incrementally(dataframe, connection, database_type=\"PostgreSQL\"):\n", - " \"\"\"\n", - " Insert data incrementally with doubling batch sizes and record performance metrics.\n", - " \"\"\"\n", - " incremental_metrics = {}\n", - " total_rows = len(dataframe)\n", - " remaining_rows = total_rows\n", - " start_idx = 0\n", - " \n", - " # Define batch sizes (1, 10, then doubling)\n", - " batch_sizes = [1, 10]\n", - " current_size = 20\n", - " while current_size < total_rows:\n", - " batch_sizes.append(current_size)\n", - " current_size *= 2\n", - " \n", - " for batch_size in batch_sizes:\n", - " # Skip if we've already inserted all data\n", - " if remaining_rows <= 0:\n", - " break\n", - " \n", - " # Calculate actual batch size based on remaining rows\n", - " actual_batch_size = min(batch_size, remaining_rows)\n", - " end_idx = start_idx + actual_batch_size\n", - " \n", - " # Get the batch of data\n", - " batch_df = dataframe.iloc[start_idx:end_idx]\n", - " \n", - " # Record start time\n", - " start_time = time.time()\n", - " \n", - " try:\n", - " # Insert data using existing function\n", - " if database_type == \"PostgreSQL\":\n", - " insert_data_to_postgres(batch_df, connection, database_type)\n", - " else: # MongoDB\n", - " insert_data_to_mongodb(batch_df, connection, database_type)\n", - " \n", - " # Record end time and calculate metrics\n", - " end_time = time.time()\n", - " total_time = end_time - start_time\n", - " rows_per_second = actual_batch_size / total_time\n", - " \n", - " # Store metrics\n", - " incremental_metrics[actual_batch_size] = {\n", - " 'total_time': total_time,\n", - " 'rows_per_second': rows_per_second,\n", - " 'batch_size': actual_batch_size\n", - " }\n", - " \n", - " # print(f\"\\nBatch Size {batch_size} Statistics:\")\n", - " # print(f\"Total time: {total_time:.2f} seconds\")\n", - " # print(f\"Average insertion rate: {rows_per_second:.2f} rows/second\")\n", - " # print(f\"Actual rows inserted: {actual_batch_size}\")\n", - " \n", - " except Exception as e:\n", - " print(f\"Error during batch insertion (size {batch_size}): {e}\")\n", - " raise e\n", - " \n", - " # Update counters\n", - " start_idx = end_idx\n", - " remaining_rows -= actual_batch_size\n", - " \n", - " # Store results in benchmark dictionary\n", - " if database_type not in benchmark_results:\n", - " benchmark_results[database_type] = {}\n", - " \n", - " benchmark_results[database_type]['incremental_insert'] = incremental_metrics\n", - " \n", - " return incremental_metrics" - ] + "61727889b118431ebb461d9fb3a13a15": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1.1 PostgreSQL Insertion Benchmark" - ] + "62feba19ff5f4d1f9ee46ed7f1197131": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Table and index created successfully\n", - "\n", - "Connection closed\n" - ] - } + "66b100ce6341446aabd7bf2a659f4868": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "675f3e8c089945ceb9a016708cb25ea3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "68db9ec0b1834cc287fe0d62725fd7a2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d6f79382307948f9b2f3c5c3f225814e", + "placeholder": "​", + "style": "IPY_MODEL_05505d63901645cb8bf6237d1b4bb2d4", + "value": "config.json: 100%" + } + }, + "6b6ae431c1ee4dad844c2ea3955a9455": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a860c22b85be4d129ebb293be21725a0", + "placeholder": "​", + "style": "IPY_MODEL_437114a7c1894554ac58f1116fcb8e4b", + "value": " 54.0/54.0 [00:00<00:00, 2.60kB/s]" + } + }, + "6e5ea62717334d55b0f30556cc1dd5bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_675f3e8c089945ceb9a016708cb25ea3", + "placeholder": "​", + "style": "IPY_MODEL_66b100ce6341446aabd7bf2a659f4868", + "value": "tokenizer_config.json: 100%" + } + }, + "6f1bbca9316e4ecf9453d408cb96e3f4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6f63b560cb4c4533a6556f9e56d10ee4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "70697741acef4b1280dea8c8ef605172": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7170d54671cd4791a32a8e99af77d87b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2da038d71cde4c9e8bef804e22c6e652", + "placeholder": "​", + "style": "IPY_MODEL_8b024bd66d594938baaf0626e9c890c4", + "value": "modules.json: 100%" + } + }, + "74bbaae5ec684386af9b7dce597770ff": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7995585ce22a4e1eb12cdf3f2968087d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7d8e21f2f7224718b120aeb072bb0eda": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9b7e331356d94a299991c7cdba456dfa", + "placeholder": "​", + "style": "IPY_MODEL_e6524b941a444ec287fe0e38b2ddff24", + "value": "model.safetensors: 100%" + } + }, + "7e8e9e4690c044f08db6430ef1c0a02f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7f378bd498ea4b408f1d0ffb839a6eb6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8562bd162996441ba0d3d548e24412e4", + "max": 1736585680, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1c924ea24cc943e79da03f7707df61ee", + "value": 1736585680 + } + }, + "8550d0395fac4c8f9b398264e5a9d875": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "8562bd162996441ba0d3d548e24412e4": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "86b9babf0741465396cb97d58e9878f6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "87e6cdea52394a7c92ec3885369cd306": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7170d54671cd4791a32a8e99af77d87b", + "IPY_MODEL_c946bd8234714171ba7e74f14059c770", + "IPY_MODEL_f11d00fbcc514447a427665609b20ed2" ], - "source": [ - "import psycopg\n", - "from pgvector.psycopg import register_vector\n", - "\n", - "try:\n", - " conn = psycopg.connect(\"dbname=vector_db user=postgres password=test host=127.0.0.1\")\n", - " register_vector(conn)\n", - " \n", - " # Create fresh table\n", - " create_table(conn)\n", - " \n", - " postgres_metrics = insert_data_incrementally(dataset_df, conn, \"PostgreSQL\")\n", - " \n", - "except Exception as e:\n", - " print(\"Failed to execute:\", e)\n", - "finally:\n", - " conn.close()\n", - " print(\"\\nConnection closed\")" - ] + "layout": "IPY_MODEL_1f1fbec87933487e92fc3886b5a96280" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1.2 MongoDB Insertion Benchmark" - ] + "8b024bd66d594938baaf0626e9c890c4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 91, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Connection to MongoDB successful\n", - "\n", - "MongoDB connection closed\n" - ] - } + "8b5126dd80ea4e33a0bf7184464c69ef": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8cba175638b24b118516885001bd3b10": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c8b595b86d7549cdbb04699a36bf1b8f", + "max": 54, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_534524aaa9d449a38e4b94f73d28e794", + "value": 54 + } + }, + "8d79a9d41c0a4db1859dbec45acd1bb7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9537ffd121ac44fe9f251b21fe21bb35", + "placeholder": "​", + "style": "IPY_MODEL_fae798582c924b4188f6bea4b106a3ce", + "value": " 1.74G/1.74G [00:42<00:00, 41.0MB/s]" + } + }, + "90812f460bbc404ab3461dbbeec1afa4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0cf02ddf7172445994797558e8eb7725", + "placeholder": "​", + "style": "IPY_MODEL_2afdbdcecaa8419bb090a9cc30cea33d", + "value": " 1.35k/1.35k [00:00<00:00, 81.0kB/s]" + } + }, + "91050f6f01b446c19544496659f5aa4c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "920b82aee6744bc98a0285058a4b6896": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7e8e9e4690c044f08db6430ef1c0a02f", + "placeholder": "​", + "style": "IPY_MODEL_4ffefc357cbb4d8bb6cf504c772e66c3", + "value": "special_tokens_map.json: 100%" + } + }, + "92520823c88e4e09a5e5f2ff77872383": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9452e4c829e246dfbae59451ebd8430b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9481a2531fe54ac4854d1a2dcf6883a5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9452e4c829e246dfbae59451ebd8430b", + "max": 711661, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c6f676834f5b493d93d67b218b9292fc", + "value": 711661 + } + }, + "9537ffd121ac44fe9f251b21fe21bb35": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "96f7adbf0d9a4e5db8fa7e473cd55c24": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "97538ebe22234bebbbeadbda3c4004eb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a343edd2067a4c20b283a88cb751081f", + "placeholder": "​", + "style": "IPY_MODEL_3aba620032124114b9cadd25c84bc28a", + "value": " 297/297 [00:00<00:00, 12.8kB/s]" + } + }, + "9b7e331356d94a299991c7cdba456dfa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9cde1ca6ec564af286530229261b1939": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "9ec0f908bf124b5a8eac23c39622c8d3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cbd8f64b8b444df49071605ab941dfab", + "max": 7127, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_172257c2e1a147ea822e91ae891ef680", + "value": 7127 + } + }, + "a15c83512c4440d28a585cca94ea067e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_920b82aee6744bc98a0285058a4b6896", + "IPY_MODEL_4c440ab8ea9049c983e96057c87f5f4a", + "IPY_MODEL_4f5334ae79dc462c92c2413c0457917a" ], - "source": [ - "try:\n", - " mongo_client = get_mongo_client(MONGO_URI)\n", - " db = mongo_client[DB_NAME]\n", - " collection = db[COLLECTION_NAME]\n", - " \n", - " # Clear collection\n", - " collection.delete_many({})\n", - " \n", - " mongo_metrics = insert_data_incrementally(dataset_df, collection, \"MongoDB\")\n", - " \n", - "except Exception as e:\n", - " print(\"MongoDB operation failed:\", e)\n", - "finally:\n", - " mongo_client.close()\n", - " print(\"\\nMongoDB connection closed\")" - ] + "layout": "IPY_MODEL_ec97ec6f0c194ecd831c623493006084" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 1.3 Visualize Insertion Benchmark\n" - ] + "a21c48a1b35f49a49b07395772d239f3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "execution_count": 95, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "def plot_combined_insertion_metrics(postgres_metrics, mongo_metrics):\n", - " \"\"\"\n", - " Creates a combined line plot comparing PostgreSQL and MongoDB insertion metrics.\n", - " \"\"\" \n", - " # Create figure\n", - " plt.figure(figsize=(12, 6))\n", - " \n", - " # Extract data for both databases\n", - " batch_sizes = [1, 10, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120, 10240, 20480, 40960]\n", - " postgres_times = [postgres_metrics[size]['total_time'] for size in batch_sizes if size in postgres_metrics]\n", - " mongo_times = [mongo_metrics[size]['total_time'] for size in batch_sizes if size in mongo_metrics]\n", - " \n", - " # Create the line plots\n", - " plt.plot(batch_sizes[:len(postgres_times)], postgres_times, \n", - " marker='o', label='PostgreSQL', color='blue', linewidth=2)\n", - " plt.plot(batch_sizes[:len(mongo_times)], mongo_times, \n", - " marker='s', label='MongoDB', color='green', linewidth=2)\n", - " \n", - " # Customize the plot\n", - " plt.title('Database Insertion Time Comparison', fontsize=14)\n", - " plt.xlabel('Batch Size', fontsize=12)\n", - " plt.ylabel('Time (seconds)', fontsize=12)\n", - " plt.grid(True, linestyle='--', alpha=0.7)\n", - " plt.legend(fontsize=10)\n", - " \n", - " # Use log scale for x-axis\n", - " plt.xscale('log', base=2)\n", - " \n", - " # Define custom tick positions\n", - " custom_ticks = batch_sizes\n", - " plt.xticks(custom_ticks, custom_ticks, rotation=45, ha='right')\n", - " \n", - " # Add value annotations\n", - " for i, (size, time) in enumerate(zip(batch_sizes[:len(postgres_times)], postgres_times)):\n", - " plt.annotate(f'{time:.1f}s', \n", - " (size, time),\n", - " textcoords=\"offset points\",\n", - " xytext=(0,10),\n", - " ha='center',\n", - " fontsize=8)\n", - " \n", - " for i, (size, time) in enumerate(zip(batch_sizes[:len(mongo_times)], mongo_times)):\n", - " plt.annotate(f'{time:.1f}s', \n", - " (size, time),\n", - " textcoords=\"offset points\",\n", - " xytext=(0,-15),\n", - " ha='center',\n", - " fontsize=8)\n", - " \n", - " # Add throughput information in a text box\n", - " postgres_throughput = [metrics['rows_per_second'] for metrics in postgres_metrics.values()]\n", - " mongo_throughput = [metrics['rows_per_second'] for metrics in mongo_metrics.values()]\n", - " \n", - " text_info = (f'Max Throughput:\\n'\n", - " f'PostgreSQL: {max(postgres_throughput):.0f} rows/s\\n'\n", - " f'MongoDB: {max(mongo_throughput):.0f} rows/s')\n", - " \n", - " plt.text(0.02, 0.98, text_info,\n", - " transform=plt.gca().transAxes,\n", - " bbox=dict(facecolor='white', alpha=0.8),\n", - " verticalalignment='top',\n", - " fontsize=10)\n", - " \n", - " plt.tight_layout()\n", - " plt.show()" - ] + "a343edd2067a4c20b283a88cb751081f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 96, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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/fDyyy9j9+7d6NixI9RqNX7//XcMHToUNjY2eO2115T1+vXrh99//x3h4eEYMGAA7OzscOHCBWzatAl79uxBgwYNlHXfe+89fPbZZ6hatSqef/55uLm5YevWrRgzZgx27dqFpUuX5hnH0qVLsX79enTp0gVvvvkm7ty5g5iYGOUUuNatWxtcgD73Ps7Pl19+idGjR6NSpUp45ZVX4OTkhFWrVmH06NHYunUrVqxYkee00XPnzqFZs2aoW7cuBg4ciOTkZKxcuRJt2rTBiRMnUKVKFeMiG+mll17CkSNH8OyzzyIjIwOLFi1Cly5dkJCQgNdffx3Z2dl44YUXDD6fZ8+eNTgdMDk5GTExMbh48SKefvppdOvWDdeuXcPy5cuxbt06bNiwAU2bNn3kWObNmwcAmDBhwiPXtbW1VR4vXboUL7/8Muzs7PDSSy/B29sb69evx0cffYR169YhPj4e9vb2Bj9/+/ZttGjRAj4+PujXrx9OnjyJ1atXIzExEStXrkTLli3RuHFjDBw4EPv27cPy5ctx69YtbNy4Mc9Yzpw5g+joaDRq1AhDhgxBSkoKli5dilatWmHjxo0G2z5nzhz89ddfaNWqFTp16oT09HTEx8fjvffew549e/KdNMrKysKTTz6Je/fu4dlnn4W1tXWhn5PZs2fjzTffhK+vL5577jl4enriypUr2L17N/744w90795dWdccPsNERFSOCCIiIgtx9uxZAUC0b9++0PXmzp0rAIg+ffooy1JTU8XNmzfzrLtx40ZhZWUlXn31VYPlEydOFADEpk2b8n2PM2fO5FmWk5MjnnrqKaFWq0VKSorBcwAEAPHKK68InU6nLD906JCwtbUVlStXFunp6cryixcviqysrDzvMXnyZAFALFy4UFm2atUqAUCMGjUqz/p3794VmZmZyt/ff/99AUCMHz/eYBx37twRkZGRwtbWVvz333/5bnNumzZtEgDEG2+8YbC8devWAoBo2rSpSEtLU5YnJiYKa2trERoaqixLTU0VKpVKNG7cWGg0GoPX0Wg04vbt28rf169fr+z7e/fuKct1Op0YPHiwACCWLVumLJ8/f74AIKysrERcXFyB4584cWK+25ff/j99+rSwtrYW3t7e4vz588ryzMxM0aJFCwFA/Pzzz8py/ecVgPjss88MXv/DDz8UAMSnn36a7/sXRj/2fv365fu8/n0ffl6/b1q0aGHQ8LfffhMAhLu7u3jhhRdETk6O8ty0adMEADFjxgyD13riiSeEWq0Wa9euNVielJQkXFxcRP369R+5HefOnRMAhL+//yPXzS0tLU24ubkJOzs7cejQIWW5VqsVL730kgAgPvroI4Of0e+Ht956y2D5kCFDlG3/6quvlOU6nU506tRJABD79u1Tlufep+PGjTN4rbVr1woAebY9JSUlz+dbp9OJgQMHCgBi27ZtBs8FBQUpn/XcvxP0+vXrJwCIs2fPKssaNWokbG1txdWrV/Osf+PGDeVxefkMExGR+eDpe0RERA/x8/MDANy4cUNZ5ubmhkqVKuVZt02bNqhbt26+p9AVplq1anmWWVtbY/DgwdBqtdi0aVOe59VqNT755BODoxDCw8PRp08fXL9+HWvWrFGWV61a1eDIED39UUz5jdfBwSHPMmdnZ+WUKJ1Oh9mzZ6N69erKaWt6Li4umDBhArKzs7FixYrCNr1IPv30U7i6uip/Dw0NRXR0NJKSknD37l0A8pQqIQTs7e1hZWX4f9Ko1WqDo5a+/fZbAMBPP/0EJycnZblKpcJnn30GlUqFJUuW5BlH165d0a5du8feHgBYvHgxNBoNRo8ejYCAAGW5nZ0dpk2bBgDKKVa5VatWDWPGjDFYNmjQIADAnj17SmRsxTF16lSDhj169ICNjQ1SU1Mxffp0WFs/OBD/5ZdfBgCD07QOHDiA7du3o1+/fmjfvr3Ba9eqVQuvvfYajhw58sjT+K5cuQIA8Pf3L9b4V65cibS0NAwcOBDh4eHKcisrK3z++ecGp7rl5uzsjClTphgs02+fp6cnRowYoSxXqVTo2bMnAOR7ipq7uzs++OADg2Xt27dH27ZtceTIEYPT+AIDA6FWqw3WValUGDp0KID8v8sA8Pnnn+f7nS6IjY2NcvRkbp6enspjc/kMExFR+cHT94iIiIooPj4eX331FXbt2oUbN24YXD8lvwmgwty9exfTp0/Hn3/+ieTkZNy/f9/g+UuXLuX5mcDAQOUUwdxatmyJuXPn4sCBA8ppNkIIzJ8/H7GxsTh69CjS0tKg0+nyff1WrVrB19cXn332GQ4dOoQuXbqgdevWCAsLM5h4SkpKwu3bt+Hn56dcMyu369evAwASExOL1SI/jRs3zrNMP/mQmpoKFxcXuLq6olOnTlizZg0aNWqEF154ATExMWjSpEmef1zv3LkTTk5OyuleD3NwcMh33FFRUY+9LXoHDhwAAIPT/fSaN28Oe3t7HDx4MM9zDRs2zDPplrtFWXv4wulWVlbw9vZGenp6nrsN6i+onfvztnPnTgDA1atX873Qun4/JCYmol69eiU4cqmw/RAYGIiQkBCcPHkSd+/ehYuLi/JczZo14ejoaLC+fvvCw8PznLKW37brRUREwNnZOc/yli1bYsOGDThw4IDyHcjOzsa3336LX3/9FYmJibh37x6EEMrP5Pf69vb2qF+/fr7bn5+ePXti7NixqFevHl555RW0adMGLVq0MJgYBsznM0xEROUHJ6WIiIgeov9HXuXKlZVlS5cuxUsvvQRnZ2e0b98ewcHBcHR0VC6GnZKSUuTXz87ORkxMDPbv34+IiAj06dMHnp6esLa2Vq5VlJWVlefnCrruin557guSjxgxAt9++y0CAgLw7LPPwtfXVzniafLkyQav7+bmhp07d2LChAn466+/lCOuAgICMG7cOLz55psAgFu3bgEAjh07hmPHjhW4fQ9PsBnj4X8MA1COwMl9UfKlS5fik08+weLFi5UjT1xdXTFgwAB88sknyiTCrVu3oNFo8p1MK2zcJXmtmzt37hT4miqVClWqVMF///2X57mitigrBY2nsHHmviC3/nP0999/4++//y7wfR71OfLx8QGAfJsVprD9AMjJpJMnT+LOnTsGk1KFbV9Rt12vON/lHj164K+//kKtWrWU61/pj0ybNWtWvr8rvL2980ySFeadd96Bp6cnZs+ejRkzZihHvHXu3BkzZ85Ujuw0l88wERGVH5yUIiIieoj+jmlNmjRRlk2aNAn29vbYt28fatasabD+r7/+WqzXX7lyJfbv349Bgwbhf//7X57XWrBgQb4/9/CdvB5err+Q9LVr1/Ddd98hPDwcO3bsMDi648qVK/lOzAQGBiI2NhY6nQ6HDx/G+vXr8fXXX2Po0KHw8PDAyy+/rPzDsnv37li2bFmxtrm0ODo6YsqUKZgyZQrOnj2LTZs24YcffsCsWbOQkZGBH3/8EYD8R7FKpTI4JbMoivMP+0fR97t69WqeI96EELh69Wq+/3g3N/ptfNyL4gcFBaFq1aq4cOECTp06led7+aj3L+j7pD8tsDT3RVG/y3v27MFff/2F9u3b4++/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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } + "a3829c2fc8e441698709df1a197efe39": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a53ba37ac3aa470a8fd52fb4b4f9d3ab": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4a50b1377ad4421390691e40ffd5f186", + "IPY_MODEL_2eeb2ab901ab459b997179c5038eb1c0", + "IPY_MODEL_2b5cafc1a4d340088101860db2ffdb13" ], - "source": [ - "plot_combined_insertion_metrics(postgres_metrics, mongo_metrics)" - ] + "layout": "IPY_MODEL_339478ba34e048f2b1fd08f36ebe5550" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 2. Benchmarking Semantic Search with PostgreSQL and PgVector" - ] + "a56b94240d274812b2373e7d341ac3c7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2.1 PostgreSQL Semantic Search Benchmark" - ] + "a637f405082a44f39b5695d5e78238f1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 79, - "metadata": {}, - "outputs": [], - "source": [ - "import asyncio\n", - "import random\n", - "import psycopg\n", - "from statistics import mean, stdev\n", - "from pgvector.psycopg import register_vector\n", - "import concurrent.futures\n", - "from concurrent.futures import ThreadPoolExecutor\n", - "\n", - "def benchmark_search_postgres(connection, database_type=\"PostgreSQL\", num_queries=100, concurrent_queries=[1, 10, 50, 100]):\n", - " \"\"\"\n", - " Benchmark the vector database performance with true concurrent queries.\n", - "\n", - " Args:\n", - " connection: Database connection\n", - " database_type: Type of database (e.g., 'PostgreSQL', 'MongoDB')\n", - " num_queries: Number of benchmark iterations for statistical significance\n", - " concurrent_queries: Different concurrency levels to test\n", - " \"\"\"\n", - " query_templates = [\n", - " \"When was YouTube officially launched, and by whom?\",\n", - " \"What is YouTube's slogan introduced after Google's acquisition?\",\n", - " \"How many hours of videos are collectively watched on YouTube daily?\",\n", - " \"Which was the first video uploaded to YouTube, and when was it uploaded?\",\n", - " \"What was the acquisition cost of YouTube by Google, and when was the deal finalized?\",\n", - " \"What was the first YouTube video to reach one million views, and when did it happen?\",\n", - " \"What are the three separate branches of the United States government?\",\n", - " \"Which country has the highest documented incarceration rate and prison population?\",\n", - " \"How many executions have occurred in the United States since 1977, and which countries have more?\",\n", - " \"What percentage of the global military spending did the United States account for in 2019?\",\n", - " \"How is the U.S. president elected?\",\n", - " \"What cooling system innovation was included in the proposed venues for the World Cup in Qatar?\",\n", - " \"What lawsuit was filed against Google in June 2020, and what was it about?\",\n", - " \"How much was Google fined by CNIL in January 2022, and for what reason?\",\n", - " \"When did YouTube join the NSA's PRISM program, according to reports?\"\n", - " ]\n", - "\n", - " if database_type not in benchmark_results:\n", - " benchmark_results[database_type] = {}\n", - " \n", - " benchmark_results[database_type]['specific'] = {}\n", - "\n", - " def execute_single_query():\n", - " \"\"\"Execute a single query and measure its latency\"\"\"\n", - " query = random.choice(query_templates)\n", - " start_time = time.time()\n", - " result = semantic_search_with_postgres(query, connection, top_n=5)\n", - " end_time = time.time()\n", - " return end_time - start_time\n", - "\n", - " for number_of_queries in concurrent_queries:\n", - " latencies = []\n", - "\n", - " for _ in range(num_queries):\n", - " with ThreadPoolExecutor(max_workers=number_of_queries) as executor:\n", - " # Submit queries and get individual latencies\n", - " futures = [executor.submit(execute_single_query) for _ in range(number_of_queries)]\n", - " # Collect individual query latencies as they complete\n", - " batch_latencies = [future.result() for future in concurrent.futures.as_completed(futures)]\n", - " latencies.extend(batch_latencies)\n", - "\n", - " # Calculate metrics using individual query latencies\n", - " avg_latency = mean(latencies)\n", - " throughput = 1 / avg_latency # Base queries per second per query\n", - " p95_latency = sorted(latencies)[int(len(latencies) * 0.95)]\n", - " std_dev_latency = stdev(latencies)\n", - "\n", - " benchmark_results[database_type]['specific'][number_of_queries] = {\n", - " 'avg_latency': avg_latency,\n", - " 'throughput': throughput * number_of_queries, # Scale by concurrent queries\n", - " 'p95_latency': p95_latency,\n", - " 'std_dev': std_dev_latency\n", - " }\n", - "\n", - " return benchmark_results" - ] + "a860c22b85be4d129ebb293be21725a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 80, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Running benchmark...\n", - "\n", - "Connection closed\n" - ] - } + "a8e20290f34d45c78cefbdf69ee00695": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_076ec604be1d4f58875a60c8c70fb399", + "IPY_MODEL_a9c48f8406894f18a738ee8b66a8328e", + "IPY_MODEL_5ec2ab12ce534bd6b5b0a6fd77d8edbf" ], - "source": [ - "# Run the benchmark\n", - "try:\n", - " conn = psycopg.connect(\"dbname=vector_db user=postgres password=test host=127.0.0.1\")\n", - " register_vector(conn)\n", - " \n", - " print(\"Running benchmark...\")\n", - " results = benchmark_search_postgres(conn, database_type=\"PostgreSQL\", num_queries=TOTAL_QUERIES, concurrent_queries=CONCURRENT_QUERIES)\n", - "\n", - "except Exception as e:\n", - " print(\"Benchmark failed:\", e)\n", - "finally:\n", - " conn.close()\n", - " print(\"\\nConnection closed\")" - ] + "layout": "IPY_MODEL_c3041ede1ce042e9b740b6707f493396" + } }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pprint\n", - "pprint.pprint(benchmark_results['PostgreSQL'])" - ] + "a8ea9d952a1e4d22b6041b4d6687f931": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2.2 MongoDB Semantic Search Benchmark" - ] + "a9c48f8406894f18a738ee8b66a8328e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_86b9babf0741465396cb97d58e9878f6", + "max": 59023, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8550d0395fac4c8f9b398264e5a9d875", + "value": 59023 + } }, - { - "cell_type": "code", - "execution_count": 64, - "metadata": {}, - "outputs": [], - "source": [ - "def benchmark_search_mongo(collection, database_type=\"MongoDB\", num_queries=100, concurrent_queries=[1, 10, 50, 100]):\n", - " \"\"\"\n", - " Benchmark MongoDB vector search with true concurrency.\n", - "\n", - " Args:\n", - " collection: MongoDB collection object\n", - " database_type: Type of database (default: \"MongoDB\")\n", - " num_queries: Number of benchmark iterations for statistical significance\n", - " batch_sizes: Different concurrency levels to test\n", - " \"\"\"\n", - " query_templates = [\n", - " \"When was YouTube officially launched, and by whom?\",\n", - " \"What is YouTube's slogan introduced after Google's acquisition?\",\n", - " \"How many hours of videos are collectively watched on YouTube daily?\",\n", - " \"Which was the first video uploaded to YouTube, and when was it uploaded?\",\n", - " \"What was the acquisition cost of YouTube by Google, and when was the deal finalized?\",\n", - " \"What was the first YouTube video to reach one million views, and when did it happen?\",\n", - " \"What are the three separate branches of the United States government?\",\n", - " \"Which country has the highest documented incarceration rate and prison population?\",\n", - " \"How many executions have occurred in the United States since 1977, and which countries have more?\",\n", - " \"What percentage of the global military spending did the United States account for in 2019?\",\n", - " \"How is the U.S. president elected?\",\n", - " \"What cooling system innovation was included in the proposed venues for the World Cup in Qatar?\",\n", - " \"What lawsuit was filed against Google in June 2020, and what was it about?\",\n", - " \"How much was Google fined by CNIL in January 2022, and for what reason?\",\n", - " \"When did YouTube join the NSA's PRISM program, according to reports?\"\n", - " ]\n", - "\n", - " if database_type not in benchmark_results:\n", - " benchmark_results[database_type] = {}\n", - " \n", - " benchmark_results[database_type]['specific'] = {}\n", - "\n", - " def execute_single_query():\n", - " \"\"\"Execute a single query with MongoDB connection\"\"\"\n", - " query = random.choice(query_templates)\n", - " start_time = time.time()\n", - " result = semantic_search_with_mongodb(query, collection, top_n=5)\n", - " end_time = time.time()\n", - " return end_time - start_time\n", - "\n", - " for number_of_queries in concurrent_queries:\n", - " latencies = []\n", - "\n", - " for _ in range(num_queries):\n", - " with ThreadPoolExecutor(max_workers=number_of_queries) as executor:\n", - " # Submit queries and get individual latencies\n", - " futures = [executor.submit(execute_single_query) for _ in range(number_of_queries)]\n", - " # Collect individual query latencies\n", - " batch_latencies = [future.result() for future in concurrent.futures.as_completed(futures)]\n", - " latencies.extend(batch_latencies)\n", - "\n", - " # Calculate metrics using individual query latencies\n", - " avg_latency = mean(latencies)\n", - " throughput = 1 / avg_latency # Queries per second per query\n", - " p95_latency = sorted(latencies)[int(len(latencies) * 0.95)]\n", - " std_dev_latency = stdev(latencies)\n", - "\n", - " # Store results\n", - " benchmark_results[database_type]['specific'][number_of_queries] = {\n", - " 'avg_latency': avg_latency,\n", - " 'throughput': throughput * number_of_queries, # Scale by concurrent queries\n", - " 'p95_latency': p95_latency,\n", - " 'std_dev': std_dev_latency\n", - " }\n", - "\n", - " return benchmark_results[database_type]" - ] + "abcd3707b1404a2a9a43120ada2a7636": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6e5ea62717334d55b0f30556cc1dd5bc", + "IPY_MODEL_43debe97a56c444b99a6e2dcf2acc507", + "IPY_MODEL_19bd15fc5f694a548b3f831db259e89e" + ], + "layout": "IPY_MODEL_10e1a2826dd54920a5660852b3a3081b" + } }, - { - "cell_type": "code", - "execution_count": 65, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Connection to MongoDB successful\n", - "Running MongoDB benchmark...\n", - "\n", - "MongoDB connection closed\n" - ] - } + "ac81622f1e8e4c4aa3db54a6466c91ea": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "aeaf94705c334cdaba2085ae7958184f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b34a39294d724e22af562dc21b0b44ab": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0110b660a0d54148b2e3310bb2512c0b", + "placeholder": "​", + "style": "IPY_MODEL_daf49b8e6e4045b7975dd924a3edcddf", + "value": " 0/0 [00:00<?, ?it/s]" + } + }, + "bb7211de903d427ba9b5916c9bec6168": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bd35bbf844764a86bc30a7a9b448d2bb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_068a6b5348fa4d778af925798e15f3c9", + "placeholder": "​", + "style": "IPY_MODEL_ac81622f1e8e4c4aa3db54a6466c91ea", + "value": "sentence_bert_config.json: 100%" + } + }, + "bf55e069ecff4f5893a017cbf76437a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bfa9adee6ed54184bf567715526886dd": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c07b169cf37f4384b222ce07226bbf67": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c14e122e644e462bb6e4b078cfdb5acc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c2d6cee33ca948238ebd9082c3855885": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c3041ede1ce042e9b740b6707f493396": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c6f676834f5b493d93d67b218b9292fc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c8b595b86d7549cdbb04699a36bf1b8f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c8d963c0d661444b8dd86f1a047d7a6a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c946bd8234714171ba7e74f14059c770": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_74bbaae5ec684386af9b7dce597770ff", + "max": 229, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9cde1ca6ec564af286530229261b1939", + "value": 229 + } + }, + "ca397ff9c91f4f5d92304e6ac8dfacd4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_58fec38b927d44bc91aa25fc6297146d", + "placeholder": "​", + "style": "IPY_MODEL_e428af93e31b4aeba3418b3d6765f2f1", + "value": "" + } + }, + "cbd8f64b8b444df49071605ab941dfab": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cbde3fc866c549b89006aa53a715daab": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "cc4623a8fbb64d749aa0193105437704": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_1fe65877defc440faf10c7f35a15a965", + "IPY_MODEL_9481a2531fe54ac4854d1a2dcf6883a5", + "IPY_MODEL_f1ecc84900f74b2791d0f3fbdecba084" ], - "source": [ - "# Run the benchmark for MongoDB\n", - "try:\n", - " mongo_client = get_mongo_client(MONGO_URI)\n", - " db = mongo_client[DB_NAME]\n", - " collection = db[COLLECTION_NAME]\n", - "\n", - " print(\"Running MongoDB benchmark...\")\n", - " results = benchmark_search_mongo(collection, num_queries=TOTAL_QUERIES, concurrent_queries=CONCURRENT_QUERIES)\n", - " \n", - "except Exception as e:\n", - " print(\"MongoDB benchmark failed:\", e)\n", - "finally:\n", - " mongo_client.close()\n", - " print(\"\\nMongoDB connection closed\")" - ] + "layout": "IPY_MODEL_6f63b560cb4c4533a6556f9e56d10ee4" + } }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(benchmark_results)" - ] + "d06fea19aa0644edbf24a0c6ca06e83b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2.3 Visualize Semantic Search Benchmark" - ] + "d1942df9dfc14f0d9e6c5fef89edbb4b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 93, - "metadata": {}, - "outputs": [], - "source": [ - "def bar_chart_benchmark_comparison(benchmark_results, metric=\"avg_latency\", metric_label=\"Average Latency (ms)\"):\n", - " \"\"\"\n", - " Generates bar charts to compare benchmark results for each metric across databases.\n", - "\n", - " Args:\n", - " benchmark_results (dict): Benchmark results structured as a nested dictionary.\n", - " metric (str): The performance metric to visualize (e.g., \"avg_latency\", \"throughput\").\n", - " metric_label (str): The label to display for the metric.\n", - " \"\"\"\n", - " # Extract data for the bar chart\n", - " query_types = [\"specific\"]\n", - " batch_sizes = CONCURRENT_QUERIES\n", - " data = []\n", - "\n", - " for query_type in query_types:\n", - " for batch_size in batch_sizes:\n", - " row = {\"Batch Size\": batch_size, \"Query Type\": query_type}\n", - " for db_type in benchmark_results:\n", - " # Safely extract metric values or default to None\n", - " value = benchmark_results[db_type].get(query_type, {}).get(batch_size, {}).get(metric, None)\n", - " # Scale values if necessary\n", - " if value is not None and metric in [\"avg_latency\", \"p95_latency\"]:\n", - " value *= 1000 # Convert to ms\n", - " row[db_type] = value\n", - " data.append(row)\n", - "\n", - " # Convert the data into a plot-friendly structure\n", - " for query_type in query_types:\n", - " labels = [str(batch_size) for batch_size in batch_sizes]\n", - " mongodb_values = [row[\"MongoDB\"] for row in data if row[\"Query Type\"] == query_type]\n", - " postgres_values = [row[\"PostgreSQL\"] for row in data if row[\"Query Type\"] == query_type]\n", - "\n", - " # Create the bar chart\n", - " fig, ax = plt.subplots(figsize=(15, 6))\n", - " \n", - " # Set the width of each bar and positions of the bars\n", - " width = 0.35\n", - " x = np.arange(len(batch_sizes))\n", - " \n", - " # Create bars\n", - " postgres_bars = ax.bar(x - width/2, postgres_values, width, label='PostgreSQL', color='lightblue', edgecolor='blue')\n", - " mongodb_bars = ax.bar(x + width/2, mongodb_values, width, label='MongoDB', color='lightgreen', edgecolor='green')\n", - "\n", - " # Add grid\n", - " ax.grid(True, linestyle='--', alpha=0.7, axis='y')\n", - "\n", - " # Add titles and labels\n", - " ax.set_title(f\"{metric_label} Comparison for {query_type.capitalize()} Queries\", pad=20)\n", - " ax.set_xlabel(\"Concurrent Queries\", labelpad=10)\n", - " ax.set_ylabel(metric_label, labelpad=10)\n", - "\n", - " # Set x-axis ticks\n", - " ax.set_xticks(x)\n", - " ax.set_xticklabels(labels, rotation=45, ha='right')\n", - "\n", - " # Add legend\n", - " ax.legend(fontsize=10)\n", - "\n", - " # Add value labels on top of bars\n", - " def autolabel(rects):\n", - " for rect in rects:\n", - " height = rect.get_height()\n", - " ax.annotate(f'{height:.2f}',\n", - " xy=(rect.get_x() + rect.get_width() / 2, height),\n", - " xytext=(0, 3), # 3 points vertical offset\n", - " textcoords=\"offset points\",\n", - " ha='center', va='bottom',\n", - " rotation=90,\n", - " fontsize=8)\n", - "\n", - " autolabel(postgres_bars)\n", - " autolabel(mongodb_bars)\n", - "\n", - " plt.tight_layout()\n", - " plt.show()" - ] + "d6f79382307948f9b2f3c5c3f225814e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJNCAYAAADeVjy8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3RU5dbH8d9MOoEklIQQEiBButIldESQICBFEFFUmjRBihT1orSLKCBIUSlXBVQQRBGRKyUIKk2kh14DkU4ghBJISOa8f3AzL0MykIEkE+D7WStrMfs855y955zM0j1PnmMyDMMQAAAAAAAAAABIw+zsBAAAAAAAAAAAyKloogMAAAAAAAAAYAdNdAAAAAAAAAAA7KCJDgAAAAAAAACAHTTRAQAAAAAAAACwgyY6AAAAAAAAAAB20EQHAAAAAAAAAMAOmugAAAAAAAAAANhBEx0AAAAAAAAAADtoogMAAOCh988//8jT01Pr1q3L1vO2a9dObdu2zdZzPuiGDx8uk8nk7DTsOnjwoBo1aiRfX1+ZTCYtWrTI2Sk51VNPPaWnnnrKJnbmzBm1adNG+fPnl8lk0sSJE/X777/LZDLp999/d0qe2a1jx44qVqyYs9MAAACZhCY6AAB4YHz++ecymUwKDw93dio5TrFixdSsWbNMOdavv/6q4cOHZ8qxcoqRI0cqPDxctWrVytbzvv322/rxxx+1Y8eODO+TkpKimTNn6qmnnlK+fPnk4eGhYsWKqVOnTtq8eXMWZouM6NChg3bu3KkPPvhA33zzjapWrZql5zt37pz69u2r0qVLy8vLSwEBAapWrZrefvttXblyJUvPfa/69++v5cuX691339U333yjxo0bZ8l5YmJi1KNHDxUrVkweHh4KCAhQq1attH79+iw5HwAAeHSZDMMwnJ0EAABARtSqVUsnT57U0aNHdfDgQT322GPOTinHKFasmB5//HEtWbLkvo/Vu3dvffbZZ3pY/jPx3LlzKly4sGbPnq2XXnop288fHh6uUqVK6euvv77r2GvXrun555/XsmXLVLduXT333HPKly+fjh49qu+//14HDhxQTEyMgoODsyFz50hOTlZycrI8PT2dnUoa165dU65cuTRkyBCNGjUqy8934cIFVapUSZcuXVLnzp1VunRpnT9/XlFRUVqyZImioqKcPts5KSlJkuTu7m6NBQYGqmHDhvr222+tMYvFoqSkJLm7u8tsvv+5XOvWrVOTJk0kSa+//rrKli2r06dPa9asWTp8+LA+++wz9ezZ877Pc69u3Lghi8UiDw8Pp+UAAAAyj6uzEwAAAMiI6OhorV+/XgsXLlT37t01Z84cDRs2LFtzSG0C5cTmHuz79ttv5erqqueee84p52/btq2GDRumzz//XLlz577j2EGDBmnZsmX65JNP1K9fP5ttw4YN0yeffJKFmTrX1atX5e3tLVdXV7m65sz/TTl37pwkyc/PL9OOmVp3er788kvFxMRo3bp1qlmzps22S5cu2TSunSW9HM6ePZvmPTKbzZn22RkXF6c2bdrIy8tL69atU/Hixa3b3nrrLUVEROjNN99UpUqVVL169Uw5Z0alXk83N7dsPS8AAMhaLOcCAAAeCHPmzFHevHnVtGlTtWnTRnPmzLFuu3HjhvLly6dOnTql2e/SpUvy9PTUwIEDrbHExEQNGzZMjz32mDw8PBQSEqLBgwcrMTHRZl+TyaTevXtrzpw5KleunDw8PLRs2TJJ0scff6yaNWsqf/788vLyUpUqVfTDDz+kOf+1a9fUp08fFShQQHny5FHz5s114sQJmUymNEumnDhxQp07d1bBggXl4eGhcuXK6auvvrqft83GmjVr9MILL6hIkSLWuvv3769r165Zx3Ts2FGfffaZtf7Un1QWi0UTJ05UuXLl5OnpqYIFC6p79+6Ki4uzOVfq8jJr165VtWrV5OnpqbCwsHRnY1+8eFH9+/e3LskQHBys1157TbGxsbpy5Yq8vb3Vt2/fNPsdP35cLi4u+vDDD+9Y96JFixQeHp6mgf3UU0/p8ccfV1RUlOrVq6dcuXLpscces17HP/74Q+Hh4fLy8lKpUqW0cuVKm/0vX76sfv362Swl8cwzz2jr1q0245555hldvXpVkZGRd8zz+PHjmj59up555pk0DXRJcnFx0cCBA21moW/btk3PPvusfHx8lDt3bjVo0EB//fWXzX6zZs2SyWTS2rVr1adPH/n7+8vPz0/du3dXUlKSLl68qNdee0158+ZV3rx5NXjwYJu/Qjh69KhMJpM+/vhjffLJJypatKi8vLxUr1497dq1y+ZcUVFR6tixo8LCwuTp6anAwEB17txZ58+ftxmXuu75nj179PLLLytv3ryqXbu2zbZbRUZGqnbt2vLz81Pu3LlVqlQp/etf/7IZc/bsWXXp0kUFCxaUp6enKlSooNmzZ9uMubWWGTNmqHjx4vLw8NCTTz6pTZs23fH6DB8+XEWLFpV088sOk8lkMwvckWvxxx9/6I033lBAQMAd/6rg8OHDcnFxSbcR7OPjY9OUTr2ft2zZopo1a8rLy0uhoaGaNm1amn0z+hko3fwSqlq1asqVK5fy5s2runXrasWKFTbnTV0TPbU+wzD02Wef2Xx+2FsTfePGjWrSpIny5s0rb29vlS9fXpMmTbL7nkjS9OnTdfr0aY0bN86mgS5JXl5e1us+cuRIa9zeWvupOR89etQmvnTpUtWpU0fe3t7KkyePmjZtqt27d9uM6dixo3Lnzq3Dhw+rSZMmypMnj9q3b2/ddvtfCWT083Pz5s2KiIhQgQIFrNexc+fOd3xPAABA1sqZUzwAAABuM2fOHD3//PNyd3fXSy+9pKlTp2rTpk168skn5ebmplatWmnhwoWaPn26zczIRYsWKTExUe3atZN0s4nRvHlzrV27Vt26dVOZMmW0c+dOffLJJzpw4ECahwSuWrVK33//vXr37q0CBQpYmyKTJk1S8+bN1b59eyUlJWnevHl64YUXtGTJEjVt2tS6f8eOHfX999/r1VdfVfXq1fXHH3/YbE915swZVa9e3dq49/f319KlS9WlSxddunQp3aaqoxYsWKCEhAT17NlT+fPn199//60pU6bo+PHjWrBggSSpe/fuOnnypCIjI/XNN9+kOUb37t01a9YsderUSX369FF0dLQ+/fRTbdu2TevWrbOZfXno0CG1adNGXbp0UYcOHfTVV1+pY8eOqlKlisqVKydJunLliurUqaO9e/eqc+fOqly5smJjY7V48WIdP35cFStWVKtWrTR//nxNmDBBLi4u1uN/9913MgzD2rRKz40bN7Rp0ya7yzrExcWpWbNmateunV544QVNnTpV7dq105w5c9SvXz/16NFDL7/8ssaNG6c2bdron3/+UZ48eSRJPXr00A8//KDevXurbNmyOn/+vNauXau9e/eqcuXK1nOULVvWOmO2VatWdnNdunSpkpOT9eqrr9odc6vdu3erTp068vHx0eDBg+Xm5qbp06frqaeesn4BcKs333xTgYGBGjFihP766y/NmDFDfn5+Wr9+vYoUKaLRo0fr119/1bhx4/T4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AADsoIkOAAAAAAAAAIAdNNEBAAAAAAAAALCDJjoAAAAAAAAAAHa4OjuBR1lMfIxiE2Kz7XwFchVQEd8i2XY+AAAAAAAAAHjQ0UR3kpj4GJX+rLSu3biWbef0cvPSvl77HGqkd+zYUbNnz1b37t01bdo0m229evXS559/rg4dOmjWrFmZnO39MZlM1n/nypVLQUFBqlWrlt58801VqVLFuu33339X/fr1ra89PT0VFhamvn37qlu3btmaMwAAAAAAAICchya6k8QmxOrajWt6pdErKpivYJaf78yFM/p2xbeKTYh1eDZ6SEiI5s2bp08++UReXl6SpOvXr2vu3LkqUiTnzmyfOXOmGjdurOvXr+vAgQOaMWOGwsPD9dVXX+m1116zGbt//375+Pjo2rVr+uWXX9SzZ08VL15cDRo0cFL2AAAAAAAAAHIC1kR3soL5CiokICTLf+6nUV+5cmWFhIRo4cKF1tjChQtVpEgRVapUyRpLTExUnz59FBAQIE9PT9WuXVubNm2ybv/9999lMpn022+/qWrVqsqVK5dq1qyp/fv325xv1KhRCggIUJ48efT666/rnXfeUcWKFa3bLRaLRo4cqeDgYHl4eKhixYpatmxZmrz9/PwUGBioYsWKqVGjRvrhhx/Uvn179e7dW3FxcTZjAwICFBgYqNDQUPXp00ehoaHaunXrPb9nAAAAAAAAAB4ONNGRIZ07d9bMmTOtr7/66it16tTJZszgwYP1448/avbs2dq6dasee+wxRURE6MKFCzbjhgwZovHjx2vz5s1ydXVV586drdvmzJmjDz74QGPGjNGWLVtUpEgRTZ061Wb/SZMmafz48fr4448VFRWliIgINW/eXAcPHrxrHf3799fly5cVGRmZ7nbDMLRs2TLFxMQoPDz8rscDAAAAAAAA8HCjiY4MeeWVV7R27VodO3ZMx44d07p16/TKK69Yt1+9elVTp07VuHHj9Oyzz6ps2bL6z3/+Iy8vL3355Zc2x/rggw9Ur149lS1bVu+8847Wr1+v69evS5KmTJmiLl26qFOnTipZsqSGDh2qJ554wmb/jz/+WG+//bbatWunUqVKacyYMapYsaImTpx41zpKly4tSTp69KhNPDg4WLlz55a7u7uaNm2qYcOGqW7duvfwTgEAAAAAAAB4mLAmOjLE399fTZs21axZs2QYhpo2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l4oXL65///vfMgzDOsYwDA0dOlSFChWSl5eXGjZsqIMHD9oc58KFC2rfvr18fHzk5+enLl266MqVK9ldDgAAAAAAAAAgB3F4Jnq9evWyIo97NmbMGE2dOlWzZ89WuXLltHnzZnXq1Em+vr7q06ePJGns2LGaPHmyZs+erdDQUL3//vuKiIjQnj175OnpKUlq3769Tp06pcjISN24cUOdOnVSt27dNHfuXGeWBwAAAAAAAABwogzNRI+JiXHooCdOnLinZO7F+vXr1aJFCzVt2lTFihVTmzZt1KhRI/3999+Sbs5Cnzhxot577z21aNFC5cuX19dff62TJ09q0aJFkqS9e/dq2bJl+uKLLxQeHq7atWtrypQpmjdvnk6ePJlttQAAAAAAAAAAcpYMzUR/8skn1bJlS73++ut68skn0x0THx+v77//XpMmTVK3bt2ss8CzWs2aNTVjxgwdOHBAJUuW1I4dO7R27VpNmDBBkhQdHa3Tp0+rYcOG1n18fX0VHh6uDRs2qF27dtqwYYP8/PxUtWpV65iGDRvKbDZr48aNatWqVZrzJiYmKjEx0fo69aGqycnJSk5OliSZzWaZzWZZLBZZLBbr2NR4SkqKzbIz9uIuLi4ymUzW494al5RmHXp7cVdXVxmGYRM3mUxycXFJk6O9ODVREzVREzVREzVREzVREzVREzVREzVREzVREzVlvCaLRTKbb+Yoy23PkzT9b46zYclY3OwiyZC7e7IsFik5met0vzVlRIaa6Hv27NEHH3ygZ555Rp6enqpSpYqCgoLk6empuLg47dmzR7t371blypU1duxYNWnSJEMnzwzvvPOOLl26pNKlS8vFxUUpKSn64IMP1L59e0nS6dOnJUkFCxa02a9gwYLWbadPn1ZAQIDNdldXV+XLl8865nYffvihRowYkSa+bds2eXt7S5L8/f1VvHhxRUdH69y5c9YxwcHBCg4O1oEDBxQfH2+Nh4WFKSAgQLt27dK1a9es8dKlS8vPz0/btm2zubDly5eXu7u7Nm/ebJND1apVlZSUpKioKGvMxcVFTz75pOLj47Vv3z5r3MvLSxUqVFBsbKyOHDlijfv6+qpMmTI6efKkjh8/bo1TEzVREzVREzVREzVREzVREzVREzVREzVREzVRU8Zrio+XihUrLUkynYqW6ZYmryWwqOTiKvOJwzY1WQoX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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJNCAYAAADeVjy8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd1gUZ9cG8Ht2YanSi9KLDbFgsDfsiBobanxjFJTEhr3GmNiNscUWY0lii5oYa9TEgr3GCmKiorFhV5Cm9N35/vBjwrqgoMAA3r/r8gp7ZnbmnH12N3D22WcEURRFEBERERERERERERGRDoXcCRARERERERERERERFVdsohMRERERERERERER5YJNdCIiIiIiIiIiIiKiXLCJTkRERERERERERESUCzbRiYiIiIiIiIiIiIhywSY6EREREREREREREVEu2EQnIiIiIiIiIiIiIsoFm+hERERERERERERERLlgE52IiIiIiIiIiIiIKBdsohMREVGxcvjwYQiCgM2bN8udylu5ffs2BEHA3Llz5U4lzzQaDapWrYoZM2bIncobZT0/Dh8+LHcqhSYjIwPOzs74/vvv5U6lRGnatCmaNm0qdxq52rNnD3x8fGBoaAhBEBAfHy93SrISBAGTJ0/Wip09exYNGjSAiYkJBEFAREQEJk+eDEEQ5ElSBm5ubggODpY7DSIiInoFm+hERERU6ARByNO/0twYLSp//vmnTmPqTX755RfcvXsXgwcPLpykSqBLly5BEAScOXOmyM+tr6+PkSNHYsaMGUhNTc3z/RITEzFlyhTUqFEDpqamMDIyQtWqVTFu3Dg8ePCgEDOmN4mNjUX37t1hZGSEJUuW4Oeff4aJiUmhnvPSpUvo2rUrXF1dYWhoCEdHR7Rq1QqLFy8u1PO+rYyMDHTr1g3Pnj3D/Pnz8fPPP8PV1bVQznXixAl07twZ9vb2MDAwgJubGwYMGIC7d+8WyvmIiIio5BNEURTlToKIiIhKt3Xr1mndXrt2LcLCwvDzzz9rxVu1aoUrV66gWbNm2LRpE7p27VqUaRaI27dvw93dHXPmzMHo0aOL/PyDBw/GkiVLkJ9f8Xx8fFC3bl0sX768EDMrGBqNBunp6VCpVFAoCm8+yDfffIP58+fj0aNHssyCjY+Ph729PZYuXYq+ffu+cf+bN2+iZcuWiI6ORrdu3dCoUSOoVCpERkbil19+gZWVFa5du1YEmcsnPT0dAKBSqWTORNeePXsQEBCAsLAwtGzZstDPd/LkSTRr1gwuLi4ICgpC2bJlcffuXfz111+4ceMG/v3330LP4U1SU1Ohp6cHPT09AMDVq1fh5eWFH374AZ9++qm0X2ZmJjIzM2FoaFgg5128eDGGDRsGDw8PBAcHo1y5crhy5Qp+/PFHCIKA3bt3o169egVyrreRlpYGhUIBfX192XIgIiIiXXpyJ0BERESl3yeffKJ1+6+//kJYWJhOHACuXLnyTudKTk6GsbHxOx3jfRIeHo6LFy9i3rx5cqfyWqmpqVLjvKCaaa/z559/IiAgQLZlJCwsLNC6dWusXr36jU30zMxMdOnSBY8fP8bhw4fRqFEjre0zZszArFmzCjNdWWW95otj8zzLkydPALwc14Ly4sWLXGezz5gxA+bm5jh79qzOObNykdurr+PcHqPsjfZ3deLECQwfPhyNGjXCnj17tP5fMXDgQDRs2BCBgYH4559/CnSs3kQURaSmpsLIyAgGBgZFdl4iIiLKOy7nQkRERMWSRqPBjBkz4OTkBENDQ7Ro0UJn9mTTpk1RtWpVnD9/Hk2aNIGxsTG++OILAC8bMiEhIbC3t4ehoSFq1KiBNWvWaN0/t/W1s9Y1X716tVZ806ZNqFKlCgwNDVG1alVs27YNwcHBcHNzy7GGFStWwNPTEwYGBqhduzbOnj2rtT04OBimpqa4efMm/P39YWJiAgcHB0ydOlVrJnle8wwODsaSJUsAaC+h8zrbt2+HSqVCkyZNdLYdP34ctWvXhqGhITw9PbF8+XKd9Ylze6yycnh1aZn79++jb9++0jIK3t7eWLlypdY+WfX++uuv+PLLL+Ho6AhjY2MkJibm+licPn0abdq0gbm5OYyNjeHn54cTJ05o7ZOUlIThw4fDzc0NBgYGsLOzQ6tWrXDhwgWt/eLj43Hy5Em0a9dOiv3666/w9fVFmTJlYGZmhmrVqmHhwoU69xs+fDicnZ1hYGCA8uXLY9asWdBoNFr7aTQaLFy4ENWqVYOhoSFsbW3Rpk0bnDt3Tmu/Vq1a4fjx43j27JnOY5vdli1bcPHiRUyYMEGngQ4AZmZmOuvdb9q0Cb6+vjAyMoKNjQ0++eQT3L9/X2ufrOdndHQ02rdvD1NTUzg6OkrPsUuXLqF58+YwMTGBq6srNmzYoHX/1atXQxAEHD16FP3794e1tTXMzMzQu3dvxMXFae37+++/o127dnBwcICBgQE8PT0xbdo0qNVqrf1e95rPaU30xYsXw9vbG8bGxrC0tEStWrV08gwPD0dAQADMzMxgamqKFi1a4K+//sqxlhMnTmDkyJGwtbWFiYkJOnfujKdPn+Y0LFo5BwUFAQBq164NQRC01rzOz1jcuHEDbdu2RZkyZdCzZ89cz3njxg14e3vn2Ai2s7PTui0IAgYPHoz169ejUqVKMDQ0hK+vL44ePapz37y8foGXH3pNnjwZFStWhKGhIcqVK4cuXbrgxo0bWufNen8IDg6Gn58fAKBbt24QBEEay9zWRF+3bh3q1KkjjW2TJk2wb9++XB8TAJg2bRoEQcCaNWt0Pmz19PTE7Nmz8eDBA6xYsUKK57bWfk7v/RqNBgsWLIC3tzcMDQ1hb2+P/v376zzf3dzc0L59e+zduxe1atWCkZGR9E2gnNZEz+t7S17ep4iIiOjtcCY6ERERFUvffPMNFAoFRo8ejYSEBMyePRs9e/bE6dOntfaLjY1FQEAAevTogU8++QT29vZISUlB06ZN8e+//2Lw4MFwd3fHpk2bEBwcjPj4eAwbNizf+fzxxx/46KOPUK1aNcycORNxcXEICQmBo6Njjvtv2LABSUlJ6N+/PwRBwOzZs9GlSxfcvHlT62v6arUabdq0Qb169TB79mzs2bMHkyZNQmZmJqZOnZqvHPv3748HDx7kuFRObk6ePImqVavqLB1w6dIltG7dGra2tpg8eTIyMzMxadIk2Nvb5yun7B4/fox69epJTTtbW1vs3r0bISEhSExMxPDhw7X2nzZtGlQqFUaPHo20tLRcZxofPHgQAQEB8PX1xaRJk6BQKLBq1So0b94cx44dQ506dQAAAwYMwObNmzF48GBUqVIFsbGxOH78OK5cuYIPPvhAOt7evXshCAJat24NAAgLC8P//vc/tGjRQprRfeXKFZw4cUJ6LiUnJ8PPzw/3799H//794eLigpMnT2L8+PF4+PAhFixYIB0/JCQEq1evRkBAAD799FNkZmbi2LFj+Ouvv1CrVi1pP19fX4iiiJMnT6J9+/a5Pq47duwAAPTq1StP47B69Wr06dMHtWvXxsyZM/H48WMsXLgQJ06cQHh4uFbjVa1WIyAgAE2aNMHs2bOxfv16DB48GCYmJpgwYQJ69uyJLl26YNmyZejduzfq168Pd3d3rfMNHjwYFhYWmDx5MqKiorB06VLcuXNH+kAkKydTU1OMHDkSpqamOHjwICZOnIjExETMmTNH63g5veZz8sMPP2Do0KHo2rUrhg0bhtTUVERGRuL06dP4+OOPAQD//PMPGjduDDMzM4wdOxb6+vpYvnw5mjZtiiNHjqBu3bpaxxwyZAgsLS0xadIk3L59GwsWLMDgwYOxcePGXB/vCRMmoFKlSlixYgWmTp0Kd3d3eHp65nssMjMz4e/vj0aNGmHu3Lmv/caNq6srTp06hb///htVq1bNdb8sR44cwcaNGzF06FAYGBjg+++/R5s2bXDmzBnp/nl9/arVarRv3x4HDhxAjx49MGzYMCQlJSEsLAx///23VHt2/fv3h6OjI77++msMHToUtWvXfu17zZQpUzB58mQ0aNAAU6dOhUqlwunTp3Hw4EHpdfuq5ORkHDhwAI0bN9Z5jmb56KOP0K9fP+zcuRNjx4594+OWUx1ZYzp06FDcunUL3333HcLDw3HixAmt99moqCj873//Q//+/fHZZ5+hUqVKueadl/eWvLxPERER0TsQiYiIiIpYaGiomNuvIYcOHRIBiF5eXmJaWpoUX7hwoQhAvHTpkhTz8/MTAYjLli3TOsaCBQtEAOK6deukWHp6uli/fn3R1NRUTExM1DrXoUOHtO5/69YtEYC4atUqKVatWjXRyclJTEpKkmKHDx8WAYiurq4697W2thafPXsmxX///XcRgLhz504pFhQUJAIQhwwZIsU0Go3Yrl07UaVSiU+fPs13nq97bHPi5OQkBgYG6sQ7deokGhoainfu3JFily9fFpVKpdbxc8ohCwBx0qRJ0u2QkBCxXLlyYkxMjNZ+PXr0EM3NzcXk5GStej08PKRYllcfC41GI1aoUEH09/cXNRqNtF9ycrLo7u4utmrVSoqZm5uLoaGhb3xMevXqJfr5+Um3hw0bJpqZmYmZmZm53mfatGmiiYmJeO3aNa34559/LiqVSjE6OloURVE8ePCgCEAcOnSozjGy5y+KovjgwQMRgDhr1qzX5luzZk3R3Nz8DVW9lJ6eLtrZ2YlVq1YVU1JSpPiuXbtEAOLEiROlWNbz8+uvv5ZicXFxopGRkSgIgvjrr79K8atXr+qM96pVq0QAoq+vr5ieni7FZ8+eLQIQf//9dyn26jiLoij2799fNDY2FlNTU6VYbq/5rG3Zx61jx46it7f3ax+PTp06iSqVSrxx44YUe/DggVimTBmxSZMmOrW0bNlSa5xGjBghKpVKMT4+/rXnybr/2bNnpdjbjMXnn3/+2vNk2bdvn6hUKkWlUinWr19fHDt2rLh3716tccgCQAQgnjt3TorduXNHNDQ0FDt37izF8vr6XblypQhA/Pbbb3XOlf2xe/X5kvXa3rRpk9Z9Jk2apPWec/36dVGhUIidO3cW1Wp1rsd/VUREhAhAHDZsWK77iKIoVq9eXbSyspJuv/q8yhIUFKT13n/s2DERgLh+/Xqt/fbs2aMTd3V1FQGIe/bs0Tmuq6urGBQUJN3O63tLXt6niIiI6O1xORciIiIqlvr06aM187hx48YAXl5AMTsDAwP06dNHK/bnn3+ibNmy+N///ifF9PX1MXToUDx//hxHjhzJVy4PHjzApUuX0Lt3b5iamkpxPz8/VKtWLcf7fPTRR7C0tHxj/sDLmbpZsmZ5pqenY//+/fnK823ExsZq5Qm8nEm6d+9edOrUCS4uLlLcy8sL/v7+b3UeURSxZcsWfPjhhxBFETExMdI/f39/JCQk6CyrEhQUBCMjo9ceNyIiAtevX8fHH3+M2NhY6ZgvXrxAixYtcPToUWnJAwsLC5w+fRoPHjzI9XgajQZ79uzRWsrFwsICL168QFhYWK7327RpExo3bgxLS0ut2lq2bAm1Wi0tjbFlyxYIgoBJkybpHOPVJSuyxiUmJua1j0FiYiLKlCnz2n2ynDt3Dk+ePMGgQYO01qRu164dKleujD/++EPnPtkv8mhhYYFKlSrBxMQE3bt3l+KVKlWChYVFjs/vfv36ac3AHThwIPT09PDnn39KsezjnJSUhJiYGDRu3BjJycm4evWq1vFyes3nxMLCAvfu3dNZRimLWq3Gvn370KlTJ3h4eEjxcuXK4eOPP8bx48eRmJioU0v2cWrcuDHUajXu3Lnzxnxe9TZjMXDgwDwdu1WrVjh16hQ6dOiAixcvYvbs2fD394ejo6P0zYXs6tevD19fX+m2i4sLOnbsiL1790KtVufr9btlyxbY2NhgyJAhOucpiGsMbN++HRqNBhMnTtS5uPDrjp+UlAQAb3ytlClTRto3PzZt2gRzc3O0atVK6/Hx9fWFqakpDh06pLW/u7t7nt5P8/rekpf3KSIiInp7XM6FiIiIiqXszVvgv4biq2vLOjo66izzcefOHVSoUEGnweLl5SVtz4+s/cuXL6+zrXz58jrN3/zkr1AotBp4AFCxYkUAL9cbLwpitvXXAeDp06dISUlBhQoVdPatVKmSVvMzr54+fYr4+HisWLFCa73h7F694GFuSy5kd/36dQCQ1pzOSUJCAiwtLTF79mwEBQXB2dkZvr6+aNu2LXr37q31+J89exZPnz7VaqIPGjQIv/32GwICAuDo6IjWrVuje/fuaNOmjVYekZGRsLW1fW1tN27cgIODA6ysrN5YW9a4vKnxaGZmlmPzOidZz+Wclo6oXLkyjh8/rhXLWrM9O3Nzczg5OenkZW5urvP8BqDzPDI1NUW5cuW0nt///PMPvvzySxw8eFCncZ2QkKB1O6fXfE7GjRuH/fv3o06dOihfvjxat26Njz/+GA0bNgTw8jmZnJyc42Ph5eUFjUaDu3fvwtvbW4rn9XWdF/kdCz09PTg5OeX5+LVr18bWrVuRnp6OixcvYtu2bZg/fz66du2KiIgIVKlSRdo3p9d6xYoVkZycjKdPn0KhUOT59Xvjxg1UqlSpwC4G+qobN25AoVBo5Z8XWc3zNzXIk5KSdNaNz4vr168jISEh1/u+zftb1nHz8t6Sl/cpIiIientsohMREVGxpFQqc4y/2vB900zl18mtOfnqxQzfRl7zz4vCzNPa2vqtGoBZ8ppb1mzwTz75JNeGd/Xq1bVu52Vss447Z84c+Pj45LhP1rcHunfvjsaNG2Pbtm3Yt28f5syZg1mzZmHr1q0ICAgA8PJbDG5ubloNOjs7O0RERGDv3r3YvXs3du/ejVWrVqF3797SxWo1Gg1atWqV6zrKWR+M5EfWuNjY2Lx2v8qVKyM8PBx3796Fs7Nzvs/zOrk9jwvy+R0fHw8/Pz+YmZlh6tSp8PT0hKGhIS5cuIBx48bpXDwxr695Ly8vREVFYdeuXdizZw+2bNmC77//HhMnTsSUKVPynSdQsHXnl4GBgc4Hg3mhUqlQu3Zt1K5dGxUrVkSfPn2wadOmHL8NkZu3ef0WNxUqVICenh4iIyNz3SctLQ1RUVHSdRSAl+9xOY1vTu9xdnZ2WL9+fY7HfrUJntfncV7fW/LyPkVERERvj010IiIiKnVcXV0RGRkJjUaj1XTKWhbC1dUVwH+zSOPj47Xu/+pM9az9//33X51z5RTLD41Gg5s3b2o1Wa9duwYAcHNzy1eeQP6XS6hcuTJu3bqlFbO1tYWRkZE0yzu7qKgordt5zc3W1hZlypSBWq1Gy5Yt85Xj62RdpNDMzCxPxy1XrhwGDRqEQYMG4cmTJ/jggw8wY8YMqYn+xx9/oG3btjr3U6lU+PDDD/Hhhx9Co9Fg0KBBWL58Ob766iuUL18enp6eeP78+Rtz8PT0xN69e/Hs2bM3zkbPGpesb1Dk5sMPP8Qvv/yCdevWYfz48a/dN+u5HBUVhebNm2tti4qKkrYXpOvXr6NZs2bS7efPn+Phw4fS43z48GHExsZi69ataNKkibTfq8/Lt2FiYoKPPvoIH330EdLT09GlSxfMmDED48ePh62tLYyNjXWe08DL9wqFQlHgH0pkJ8dYZF249uHDh1rxnF7r165dg7GxsdT8zevr19PTE6dPn0ZGRobOBYsLgqenJzQaDS5fvpzrB2c5MTY2RosWLbB//37cuXMnx8f3t99+Q1paGrp16ybFLC0tc/ymx6vvcZ6enti/fz8aNmz4Th/uviqv7y3Am9+niIiI6O1xTXQiIiIqddq2bYtHjx5h48aNUiwzMxOLFy+Gqakp/Pz8ALxsYimVSmlN2Szff/+91m0HBwdUrVoVa9euxfPnz6X4kSNHcOnSpXfO97vvvpN+FkUR3333HfT19dGiRYt85Qm8bBoCuk3t3NSvXx9///030tLSpJhSqYS/vz+2b9+O6OhoKX7lyhXs3btX6/5mZmawsbF5Y25KpRKBgYHYsmUL/v77b508nj59mqd8X+Xr6wtPT0/MnTtXa2xePa5ardZZFsTOzg4ODg5S7Y8fP8aFCxe0lnIBXq4bn51CoZBm3Wbdt3v37jh16pTO4wO8HIvMzEwAQGBgIERRzHEm9KuzXc+fPw9BEFC/fv3cHwAAXbt2RbVq1TBjxgycOnVKZ3tSUhImTJgA4GUT1c7ODsuWLdMa8927d+PKlSs6tReEFStWICMjQ7q9dOlSZGZmSh9cZM3uzl5/enp6js/v/Hh13FQqFapUqQJRFJGRkQGlUonWrVvj999/11pa5vHjx9iwYQMaNWoEMzOzd8rhdQpzLA4dOpTj7OmspZheXULm1KlTWstS3b17F7///jtat24NpVKZr9dvYGAgYmJitN7XshTEjP1OnTpBoVBg6tSpOt9SeNPxv/zyS4iiiODgYKSkpGhtu3XrFsaOHQtnZ2f06tVLint6euLq1ataNV68eBEnTpzQun/37t2hVqsxbdo0nfNmZmbm+T35VXl9b8nL+xQRERG9Pc5EJyIiolKnX79+WL58OYKDg3H+/Hm4ublh8+bNOHHiBBYsWCCtjWtubo5u3bph8eLFEAQBnp6e2LVrl87atQDw9ddfo2PHjmjYsCH69OmDuLg4fPfdd6hatWqOzdu8MjQ0xJ49exAUFIS6deti9+7d+OOPP/DFF19IM0Dzk2fWxQGHDh0Kf39/KJVK9OjRI9fzd+zYEdOmTcORI0fQunVrKT5lyhTs2bMHjRs3xqBBg6QPIby9vXWWQ/j000/xzTff4NNPP0WtWrVw9OhRaTZ9dt988w0OHTqEunXr4rPPPkOVKlXw7NkzXLhwAfv378ezZ8/y/fgpFAr8+OOPCAgIgLe3N/r06QNHR0fcv38fhw4dgpmZGXbu3ImkpCQ4OTmha9euqFGjBkxNTbF//36cPXsW8+bNA/CywWhoaKg1azqrvmfPnqF58+ZwcnLCnTt3sHjxYvj4+EizxMeMGYMdO3agffv2CA4Ohq+vL168eIFLly5h8+bNuH37NmxsbNCsWTP06tULixYtwvXr19GmTRtoNBocO3YMzZo107rIbFhYGBo2bAhra+vXPgb6+vrYunUrWrZsiSZNmqB79+5o2LAh9PX18c8//2DDhg2wtLTEjBkzoK+vj1mzZqFPnz7w8/PD//73Pzx+/BgLFy6Em5sbRowYke8xeJP09HS0aNEC3bt3R1RUFL7//ns0atQIHTp0AAA0aNAAlpaWCAoKwtChQyEIAn7++ed3bri2bt0aZcuWRcOGDWFvb48rV67gu+++Q7t27aT3gOnTpyMsLAyNGjXCoEGDoKenh+XLlyMtLQ2zZ89+59pfpzDHYsiQIUhOTkbnzp1RuXJlpKen4+TJk9i4cSPc3Nx0LsxatWpV+Pv7Y+jQoTAwMJA+wMj+YU9eX7+9e/fG2rVrMXLkSJw5cwaNGzfGixcvsH//fgwaNAgdO3Z867qAl9ehmDBhAqZNm4bGjRujS5cuMDAwwNmzZ+Hg4ICZM2fmet9GjRph/vz5GD58OKpXr47g4GCUK1cOV69exQ8//ACFQoHt27fDwsJCuk/fvn3x7bffwt/fHyEhIXjy5AmWLVsGb29vrfX7/fz80L9/f8ycORMRERFo3bo19PX1cf36dWzatAkLFy5E165d811vXt9b8vI+RURERO9AJCIiIipioaGhYm6/hhw6dEgEIG7atEkrfuvWLRGAuGrVKinm5+cnent753icx48fi3369BFtbGxElUolVqtWTeu+WZ4+fSoGBgaKxsbGoqWlpdi/f3/x77//1jmXKIrir7/+KlauXFk0MDAQq1atKu7YsUMMDAwUK1eurJPnnDlzdM4FQJw0aZJ0OygoSDQxMRFv3Lghtm7dWjQ2Nhbt7e3FSZMmiWq1+q3yzMzMFIcMGSLa2tqKgiDk+jhnV716dTEkJEQnfuTIEdHX11dUqVSih4eHuGzZMnHSpEk6x0xOThZDQkJEc3NzsUyZMmL37t3FJ0+e6NQrii/HJTQ0VHR2dhb19fXFsmXLii1atBBXrFgh7ZPbcyD7tkOHDmnFw8PDxS5duojW1taigYGB6OrqKnbv3l08cOCAKIqimJaWJo4ZM0asUaOGWKZMGdHExESsUaOG+P3330vH6Nq1q9i2bVudc27evFls3bq1aGdnJ6pUKtHFxUXs37+/+PDhQ639kpKSxPHjx4vly5cXVSqVaGNjIzZo0ECcO3eumJ6eLu2XmZkpzpkzR6xcubKoUqlEW1tbMSAgQDx//ry0T3x8vKhSqcQff/xRJ5/cxMXFiRMnThSrVasmGhsbi4aGhmLVqlXF8ePH6+S6ceNGsWbNmqKBgYFoZWUl9uzZU7x3757WPlnPz1fl9rpzdXUV27VrJ91etWqVCEA8cuSI2K9fP9HS0lI0NTUVe/bsKcbGxmrd98SJE2K9evVEIyMj0cHBQRw7dqy4d+9enbF+3Wvez89P9PPzk24vX75cbNKkifSc8PT0FMeMGSMmJCRo3e/ChQuiv7+/aGpqKhobG4vNmjUTT548qbVPVi1nz57Viuf2fHxVbvcXxXcbi9zs3r1b7Nu3r1i5cmXR1NRUVKlUYvny5cUhQ4aIjx8/1toXgBgaGiquW7dOrFChgmhgYCDWrFkzx5ry8voVxZfvCRMmTBDd3d2l/bp27SreuHFD67zZ3x9ye93n9J4jiqK4cuVK6XGztLQU/fz8xLCwsDw9PseOHRM7duwo2tjYSO+TdnZ2Oq+TLOvWrRM9PDxElUol+vj4iHv37hWDgoJEV1dXnX1XrFgh+vr6ikZGRmKZMmXEatWqiWPHjhUfPHgg7fPqayU7V1dXMSgoSCuWl/eWvL5PERER0dsRRLEIroJDREREVEr5+PjA1tYWYWFh+b5vcHAwNm/e/E4z2QvCzz//jNDQUERHR2vNwMzJ5MmTMWXKlCK5kGJRyszMhLW1NWbOnIlBgwbJnQ4WLFiA2bNn48aNGwW6vnJRWr16Nfr06YOzZ89Ka3FT8SMIAkJDQ3NcfuV9MW3aNEycOBETJkzA9OnT5U6HiIiIiiGuiU5ERESUBxkZGdLas1kOHz6MixcvomnTpvIkVUB69uwJFxcXLFmyRO5UZPPs2TOMGDECnTt3ljsVZGRk4Ntvv8WXX35ZYhvoRCXJV199hQEDBmDGjBlYsWKF3OkQERFRMcQ10YmIiIjy4P79+2jZsiU++eQTODg44OrVq1i2bBnKli2LAQMGyJ3eO1EoFDleLPB9Ymdnh8mTJ8udBoCXa2Vnv6ArERW+pUuXYunSpXKnQURERMUUm+hEREREeWBpaQlfX1/8+OOPePr0KUxMTNCuXTt88803b7zwIxEREREREZVcXBOdiIiIiIjoPRMbG4vRo0fjzp076NSpE4YOHSptCwwMxJYtW2TMjoiIiKh44ZroRERERERE75kBAwbA1tYWoaGh2LZtGwIDA6FWqwEAN2/elDk7IiIiouKFTXQiIiIiIqL3zPXr1zF79mwEBgbiwIEDsLGxQadOnZCRkSF3akRERETFDpvoRERERERE75m0tDTpZ4VCgeXLl8Pd3R2dOnVCenq6jJkRERERFT9sohMREREREb1nXF1dcfLkSa3YokWL4OnpiatXr8qUFREREVHxxAuLEhERERERvWcePnwIpVIJOzs7nW0nT55EgwYNZMiKiIiIqHhiE52IiIiIiIiIiIiIKBdczoWIiIiIiOg9U6tWLSxYsAAxMTFyp0JERERU7LGJTkRERERE9J55+PAhDhw4ABcXF3Tr1g179+4Fv6RMRERElDM20YmIiIiIiN4zdnZ22LlzJ/7991988MEHGDx4MFxdXTFx4kTcvn1b7vSIiIiIihU20YmIiIiIiN4zgiAAABwcHDB+/Hhcv34da9euxe3bt1GtWjWZsyMiIiIqXnhhUSIiIiIiovdMzZo1ER4enuO2xMREmJmZFXFGRERERMUXZ6ITERERERG9Z2bNmpXrNjbQiYiIiLRxJjoRERERERERERERUS44E52IiIiIiIgkK1askDsFIiIiomKFTXQiIiIiIiKS3L9/X+4UiIiIiIoVLudCRERERERERERERJQLzkQnIiIiIiJ6z2VmZiI8PBwJCQlyp0JERERU7LCJTkRERERE9J45ePAgrK2tYWNjgyNHjqBBgwb4+OOP4enpiSNHjsidHhEREVGxwuVciIiIiIiI3jN169bF8uXLER8fj65du+K3335D8+bNcebMGYwaNQrHjh2TO0UiIiKiYkNP7gSIiIiIiIioaKWnp8PHxwcAYGFhgebNmwMA6tSpg+fPn8uYGREREVHxw+VciIiIiIiI3jMajUb6uVu3blrb1Gp1UadDREREVKxxJnoB0Wg0ePDgAcqUKQNBEOROh4iIiIiIKFfVq1fHvXv3YGZmhvHjxyMxMREAcPPmTZiYmEi3iYiIiEozURSRlJQEBwcHKBS5zzfnmugF5N69e3B2dpY7DSIiIiIiIiIiIiLKh7t378LJySnX7ZyJXkDKlCkD4OUDbmZmJnM2REREREREb+fZs2ewsrKSOw0iIiKiQpeYmAhnZ2ept5sbNtELSNYSLmZmZmyiExERERFRiVW1alVER0fLnQYRERFRkXnT8txsohMREREREb1nduzYkeu21NTUIsyEiIiIqPhjE52IiIiIiOg907lzZ/j5+SGnS2QlJSXJkBERERFR8cUmOhERERER0XumQoUKWLlyJdzc3HS2OTs7F31CRERERMUYm+hERERERETvmaCgIMTExOTYRB8wYEDRJ0RERFQE1Go1MjIy5E6DipC+vj6USuU7H0cQc/r+HuVbYmIizM3NkZCQwAuLEhERERERERERFROiKOLRo0eIj4+XOxWSgYWFBcqWLZvjxUPz2tPlTHQiIiIiIqL3THx8PCwsLOROg4iIqEhkNdDt7OxgbGycYzOVSh9RFJGcnIwnT54AAMqVK/fWx2ITnYiIiIiI6D1jZ2eHgIAAfPrpp2jXrh0UCoXcKRERERUKtVotNdCtra3lToeKmJGREQDgyZMnsLOze+ulXfibEhERERER0XvG3d0dTZo0wbhx4+Dk5ITPP/8c165dkzstIiKiApe1BrqxsbHMmZBcssb+XdbDZxOdiIiIiIjoPWNiYoJRo0bh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4eDgoLPN2dlZhowK1vXr17Fp0yYAQOfOnTFw4EB06tQJW7dulTkzIiIiIqKCVayb6E2bNn3jwvR9+/ZF3759c91uaGiIJUuWYMmSJbnu4+rqij///POt8yQiIiIielWHDh1w8+bNHJvo7dq1kyGjgpWWlib9rFAosHz5cgwdOhSdOnVCenq6jJkRERERERUs3RX+iYiIiIjonS1cuFDrG5LZLVu2rIizKXiurq44efKkVmzRokXw9PTE1atXZcqKiIiIiKjgFeuZ6EREREREJUF0QjRikmMK7Hg2xjZwMXcpsOMVhlWrVuW4puiiRYvQo0cPGTIiIiIiIiocbKITEREREb2D6IRoVF5SGSkZKQV2TCN9I1wNvVqsG+nlypXLdVuDBg2KMBMiIiIiosLFJjoRERER0TuISY5BSkYKPmn9Ceyt7N/5eI+fPca6fesQkxxTrJvorzN58mRMnjxZ7jSIiIiIiAoEm+hERERERAXA3soeznbOcqdRLLxuljoRERERUUnDC4sSEREREVGB6t+/v9wpEBEREREVGDbRiYiIiIioQF28eFHuFIiIiIiICgyb6EREREREVKA+/PBDuVMgIiIiIiowXBOdiIiIiIjybdGiRTnGRVHE8+fPizgbIiIiIqLCwyY6ERERERHl26hRo9CzZ08IgqCzLSMjQ4aMiIiIiIgKB5voRERERESUb15eXhg/fjwqVaqks23//v0yZEREREREVDi4JjoREREREeXbiBEjkJ6enuO26dOnF3E2RERERESFhzPRiYiIiIgo3/r06ZPrtqCgoCLMhIiIiIiocHEmOhERERERFYivvvpK7hSIiIiIiAocZ6ITEREREVG+LVq0SCe2dOlS2NraAgCGDh1a1CkRERERERUKNtGJiIiIiCjfRo4ciXbt2sHKykqKpaWlITw8HIIgyJgZEREREVHBYhOdiIiIiIjybd++fRg/fjw+++wztG/fHgBw+PBhrFq1SubMiIiIiIgKFtdEJyIiIiKifGvevDnCwsLw22+/oU+fPkhMTOQMdCIiIiIqldhEJyIiIiKit2JmZoa1a9eiffv28PPzQ0pKitwpEREREREVOC7nQkRERERE7yQwMBCNGjXC+fPn5U6FiIiIiKjAcSY6ERERERG9M3t7e9y9e1fuNIiIiIiIChxnohMRERERUb7t2LFDJzZp0iSUK1cOANChQ4eiTomIiIiIqFCwiU5ERERERPnWqVMn1K9fHyqVSoolJCRg/vz5EASBTXQiIiIiKjXYRCciIiIionz76aef8OOPP+Lbb79FzZo1AQDu7u44dOiQzJkRERERERUsrolORERERET51qdPH2zYsAFjx47F1KlToVarIQiC3GkRERERERU4NtGJiIiIiOituLq6Yt++fTAxMUHjxo2RlpYmd0pERERERAWOy7kQEREREdFbEwQBo0aNQps2bXDs2DG50yEiIiIiKnBsohMRERER0Tvz9vaGt7c3AKBixYq4du2azBkRERERERUMNtGJiIiIiCjfIiMjc92WlJRUhJkQERERERUuNtGJiIiIiCjffHx84ObmBlEUdbbFxsbKkBERERERUeFgE52IiIiIiPLN1dUVx48fh4ODg842Z2dnGTIiIiIiIiocCrkTICIiIiKikqdDhw64efNmjtvatWtXxNkQERERERUezkQnIiIiIqJ8W7hwYa7bli1bVoSZEBEREREVLjbRiYiIiIjotaITohGTHFNgx7MxtoGLuUuBHY+IiIiIqDCxiU5ERERERLmKTohG5SWVkZKRUmDHNNI3wtXQq2ykExEREVGJwCY6ERERERHlKiY5BikZKfik9Sewt7J/5+M9fvYY6/atQ0xyDJvoRERERFQisIlORERERERvZG9lD2c7Z7nTICIiIiIqcgq5EyAiIiIiIiIiIiIiKq7YRCciIiIiIiIiIiIiygWb6EREREREREREREREuWATnYiIiIiIiIiIiIgoF8W+iX706FF8+OGHcHBwgCAI2L59e677DhgwAIIgYMGCBVrxZ8+eoWfPnjAzM4OFhQVCQkLw/PlzrX0iIyPRuHFjGBoawtnZGbNnzy6EaoiIiIiIiIiIiIioJCn2TfQXL16gRo0aWLJkyWv327ZtG/766y84ODjobOvZsyf++ecfhIWFYdeuXTh69Cj69esnbU9MTETr1q3h6uqK8+fPY86cOZg8eTJWrFhR4PUQERERERERERERUcmhJ3cCbxIQEICAgIDX7nP//n0MGTIEe/fuRbt27bS2XblyBXv27MHZs2dRq1YtAMDixYvRtm1bzJ07Fw4ODli/fj3S09OxcuVKqFQqeHt7IyIiAt9++61Wsz27tLQ0pKWlSbcTExMBAJmZmcjMzAQAKBQKKBQKaDQa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6RJ79+5l7969XLp0SelwhADSBqncuXMHjUaj+y81NRWNRqObhk8IYbwcj0TXaDR5GYcQQuSrrO7WAzg5OaFSqfSmLDDG66+/rpvXOj95enrqRouuXLlS137r1i2KFCmS7/GY0vz587Ns12q1PHjwIJ+jMb3CPJLSEua037hxo9Ih5LmkpCS2bt3KlStXsLa2pmrVqplu1omCqWPHjly6dCnLC+r27dsrEJFp2dvbM3nyZCZPnqx0KCIXEhMT6d27N5C2iHH6lFE9evTgk08+UTI0k7D074eM59SbN29m586dODs706VLF4s4fzl37hz9+/fn2rVruulpIiMj8fHx4euvv7a4hWKFeWnQoAEnT56kRYsWmV4z96d0hShIDJoTXQghLEW/fv2wtbVl7ty5ODg4AGkjfS9fvmzwtgpip+5vv/2WZXvRokVZv359PkdjWiEhIfTu3TvLRxNzurBhQbZ8+XJmz57NwIEDdTdgfH196datG2PHjlU4urxlCXPaA0RERODq6oqHhwcRERHs37+fV155hbp16yodmtH27NnDgAEDcHZ25p9//qFx48Z8+eWXFCtWjE2bNuHl5aV0iOI55s2bl+1rixcvzsdI8s6zN3leeeUVmjVrpnRYIgeSk5NJTEzk/v37REdHc+fOHTw9PXn48CGPHz9WOjyTsOTvh4znZVZWVjg7OwNgZ2eHtbX5dzsMGDCAcePGZZpWb8OGDbz11lscOnRIociE4LnXdz///HM+RiKEZcvxdC5CiMItJSWFixcvkpycrHQoJvHNN9/w2muv0bx5c37//Xcg92s/hISEcOzYMY4fP673X3h4eIHr1HVycjL7xZ2qVKnC+PHj+frrrzP9l37BZs7SR1KePn1aN9XQqVOn+PDDDylatKjS4ZlEREQEd+/e1f28fPlyDh48qHBUpvHZZ5/RtGlTAgICWL16Na1bt+a3337jjTfeeG4HprkICQlh586dnDhxgn379lGqVCnOnj3L22+/nWmhUVHwZLzIjoqKon379jg5OdGsWTNFnpoytT179lCxYkU+/PBDPvjgAzZv3sy7775LnTp1uHHjhtLhiRfo168fVapU4dVXX2XatGl06dKFoUOHUq9ePbp27ap0eEaz9O+HkydP4urqiouLC+Hh4URFRQFp1xCWMB1dXFxcluvSdOvWjfj4eAUiEuL5LGG/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ypXNHQYRERERWRlOJ2g5OJ0LkYkKe0eXlJSEWbNmYf369bhz5w4AoGLFiujVqxemTp2KUqVKFSxgIiIiMhARkTn3dEGdu1fwbRARERFR8cPpBC0Hm+hEJirsHd2AAQNQsWJF/P777/D19QUAXL16FUuXLkX//v2xefPmwgqdiIio2IuIAPz9BQ8eKAXfWEUAbxZ8M0RERERUvPz222+5jnM6waKHTXQiExX2ju706dP48ccfDcYCAgLw+eefo3r16ibFSERERLmLjQUePFAwct5deFUp2IMbj19KxPrUQgqMiIiIiIo9FxcXuLi4mDsMyoZNdKJCZuqOTqVS4dKlS6hWrZrB+MWLF2FjY1NY4REREVE2XlXUqFKzYE30myka4HIhBUREREREVqmwphIEOJ2gObCJTpQPhbmjAwBXV+Dh55PNmzcPL7zwAurXrw8fHx8AwLVr1xAaGooVK1YU3i8nIiIiIiIiIqKnplCnEgQ4naAZsIlO9BiFvqMD4OQkOHdOMWikd+rUCVeuXMHOnTsREREBAGjVqhXat2+PkiVLFtrvJiIiIiIiIiKip6cwpxIEOJ2gObCJTvQYhb2juxlui0XjyiI2Nufd6M7OzujRo4f+Z41Gw6lciIiIiIiIiIisQGFMJQhwOkFzYBOdKJ8Ka0eXlyVLluDVV1+Fm5sbrl69ildffRWhoaHw9/fHhg0bULNmzSf2u4mIiIiIiIiIiCh3KnMHQESZli5dCjc3NwDA2LFjMWTIECQmJmLatGkYPny4maMjIiIiIiIiIiIqnthEJyoi1Oqsu9yvXr2KN998E05OTujZsycSEhLMGBkREREREREREVHxxSY6URFRvXp1bN68GQDw7LPP4vz58wCA27dvmzMsIiIiIiIiIiKiYo1zohMVEUuWLEHXrl3x2WefwdXVFY0aNUK9evVw8+ZNLFu2zNzhERERERERERERFUtsohMVEd7e3jh69Cj27t2LsLAwNG/eHJUrV8ZLL70EJycnc4dHRERERERERERULLGJTlTEtGrVCq1atTJ3GERERERERERERATOiU5kEb766itzh0BERERERERERFQssYlOZAFu3bpl7hCIiIiIiIiIiIiKJTbRiSzAzJkzzR0CERERERERERFRscQmOpEFiIuLM3cIRERERERERERExRKb6EQWoF69euYOgYiIiIiIiIiIqFiyNXcARJRp69ateS5LTU19ipEQERERERERERGRDpvoREVE165d0bx5c4hIjmX37983Q0RERERERERERETEJjpREVGtWjV8++238PX1zbHM29v76QdEREREREREREREnBOdqKjo378/YmNjc1321ltvPeVoiIiIiIiIiIiICOCd6ERFxqRJk/Jc9v777z/FSIiIiIiIiIiIiEiHd6ITFSHJyclQq9UAgPj4eOzduxc3b940c1RERERERERERETFF5voREXE6tWr4erqCj8/P/zxxx947rnnMGnSJNStWxcbN240d3hERERERERERETFEqdzISoi5s+fj/PnzyMhIQHNmjXDnj17EBgYiMuXL6N79+4ICQkxd4hERERERERERETFDpvoREWEjY0NfHx8AABlypRBYGAgAKBq1apQqfilESIiIiIiIiIiInNgZ46oiFCpVDh79iwOHjyI5ORk/O9//wMAnD9/HhqNxszRERERERERERERFU+8E52oiPjggw/QrFkzqFQqbNiwAVOmTEFkZCQiIyOxfPlyc4dHRERERERERERULFn8nehz5sxBUFAQSpUqBXd3d3Tp0gUXLlwwWCc1NRXDhw9H+fLlUbJkSXTv3h1RUVEG60RERKBjx45wcnKCu7s7xo0bB7Va/TRToWKuQ4cOiIuLQ0xMDFq1aoU9e/Zg7dq1uHTpEnr16mXu8IiIiIiIiIiIiIoli2+i79u3D8OHD8fff/+N3bt3IyMjA23btkVycrJ+nVGjRmHbtm3YtGkT9u3bh9u3b6Nbt2765RqNBh07dkR6ejoOHTqE7777DqtWrcK0adPMkRIRgMw50hs0aAB3d3dUr17d3OEQEREREREREREVSxY/ncuuXbsMfl61ahXc3d1x7NgxNGvWDAkJCfjmm2+wbt06vPjiiwCAlStXwt/fH3///TcaN26M33//HWFhYdizZw88PDxQt25dfPDBB5gwYQJmzJgBe3v7HL83LS0NaWlp+p8TExMBAGq1Wn8Hu0qlgkqlglarhVar1a+rG9doNBCRx47b2NhAUZQcd8bb2NgAQI75svMat7W1hYgYjCuKAhsbmxwx5jVeHHMS0cDeXqBAA2g1gKICFAXQagFk5ZQ1/tD85cp/n1VJ5rYVKLC3V0PEBiJZOZ06dSrPnO7fvw8AT6ROWi2yHlxqYk6G4wJ7xR4qrQqKRslczUYAARStkm1dQFSPGNcCKq0K9oo9tJrMPEx57eVdP2NyyhpX/Zdf5pjxOSmSNa77s2jF4L1gzPsps36Z7w9Tc8r6BTbIUT8jcxJFMj+ezaN+xu4jtFo17O1hWD9jcxIxqJ+dYvffusbnVJD65bbf02oBRcn8d893/R7KSR+8SgUlr/rlMyfduKJV8lW/x+3LtVpN/ur3iJzyrJ8JOWXfven+/HD9jDk+Ze6K8qhfPnPKPv5w/YzNSVQCKDnrJyImHXNz1M+EnCDazGXIrJ+t8t+ppwk55VY/rUabo36Pyiln/WyRs375zylzODMPW8XW8NhnZE76cU3O+uU3JyDrPMKwflrjc1KyxnXHPl3NTMnJgJH1y+3cSERB7u+//OVkMA7ATrEzrJ+ROYlK9P82+alffs5hc9bPiJwUlf68Tn/u8t8qpuRkuCDzfPbh+hlzXp5VP61h/fKZU9Z45nElz/rlM6e86pcZq2nXGvr6idb4nLJda+Sonwk5PUwFlUH9jL1+ElFBf4DKrX6PyclgHMh57WBkTtmvNXT1E63uXNm066cc9TMmp2zXGgb1e/jcM585ZW37v1jzWb+8rgl19VNy1M+U69xcrv2MzCn7tcbj6ve0r90fWz8jr3MBwAY2BvWzlmt3RfJfP0u8dhclM15bxTbX+vHa3TL6e4/KKT8svon+sISEBABAuXLlAADHjh1DRkYGWrdurV+nRo0aqFy5Mg4fPozGjRvj8OHDqFWrFjw8PPTrtGvXDm+//TbOnj2LevXq5fg9c+bMwcyZM3OMh4aGwtnZGQDg5uaGZ555BlevXkVMTIx+HS8vL3h5eeHixYv6eAGgSpUqcHd3x5kzZ5CSkmIQb5kyZRAaGmpQ2Nq1a8Pe3h5Hjx41iCEwMBDp6en6piyQ+SINCgpCQkICzp8/rx93dHREnTp1EBsbi/DwcP24i4sL/P39cfv2bdy8eVM/XhxzSky8iHHjElBBlQ7VLYG2nAfg7AIlOgJKRrp+fa1bJaCEM5TIq1CyvVm1FXwAG1uobl0BAFRQKRg37hpEApGSkpVTkyZNULFiRdjb20Or1SIjI0O/jdjYWP3/C7tOCQlA7dpVACgm56Qfr/QMHBTBON9xqHKrChxjHSEqQUxADOyT7FHmehn9umoHNeKrxaPE3RIofbu0fjy9ZDru+d6Dc6wzatyqgXG+4xB3JQ5X066a9Nq7e/cMxo1LyaqfCTlBo4bqznUAQM0SqRhZeSS00JqUk3O0c9b6tpkHmaToJBy9kfWaN+b9lJAA+PrWAACTcwIAUakglaqipEprUD9jc0opm4L7le6jVGQp1LiTVb/buG3SPiI+PhTjxmmy6mdCTkh7AFXMLX39BlUaBAAm5eR41zFr3CEz3sTbiQb1M2a/l5AAlC9fGwq0JucEAGJnD6ngizI2GoP6GZtTsnsykt2T4RLhgpJxJfX1i7WPNWlfHhd3FOPGIat+JuSEB4lQxUfp69fDowcAmJSTfVLWh+KJzpkfft+NuGtQP2OOTwkJgL19IGyRblA/Y3ICACnhBHHzgput2qB+RufkmYjUcqkoe6UsSiZm1S+hZIJJx9y4uFP6+imRikk5KYnxUBLj9fVrV74dAJiUk21a1mlrXOk4AED81XgcvZkVvzHnEYmJNgCC4IBkqG5FmJQTAIhz5n6kXfl2qHGrBhxjHU3K6Z7PPaSXSofrBVeUTMmqX0q5FJPOjeLizmfVL9rO6JykXAUod6OhJCeiZolUjPMdh1KJpQAPmJRT9ou5qLJRsFfsEXclzqB+xpzvJSU5AqgDJyRAdeu20Tnpx0tnXjP08OhhUD9jc4qrGgetnRZu59xQMi2rfpoKGpPOYePiwrPqF+dodE7i4gol7jaU1Af6+pV4UAIATMopu5uuN1HerrxB/Yw9L09JcQHgj1JKHFS3ss7r8puTjrZc5vXboEqDDOpnbE4x/jFQZahQ/nJ5ff3ir8YDXjDpWiMu7mZW/e6WMj6nbNcauvrZpGU2HUzJSf87VYII1wj4Ovoa1M/Y66e0NDcAz8BFiYLq1l2jc9KPu1UCAIysPNKgfsbmlP1aQ1e/uxF3gUqmXT/FxcVk1S+xrPE5ZbvW0NVP1AJFq5iUk47aQY0IlwjULlXboH7GXhNmZHgB8EJZ5SZUt5KMzkk/XsEHKsDg3MWUnLJfa+jql3g7EagEs1+76+qXLumwSbMxKSed9JLpgBPQtExTg/pZy7W7c7Szvn5J0UlAJVjVtXtK2RTALvN8L3v9eO1uWf29vHIKCwtDfiiSvQVv4bRaLTp37ox79+7h4MGDAIB169Zh4MCBBneNA0DDhg3RsmVLfPLJJxg6dCiuX7+O3377Tb/8wYMHcHZ2xo4dO/DSSy/l+F253Ynu7e2NuLg4lC6d+WItjndtW2NOx45p0KSJ4KP1sfDzVxf40+yr52wx+TVXHDpkg/r1s3KqVq0a9u3bh8qVK+fIyc/PDzdu3HgidTpxAmjUSIVPNsWhin+6STllH99/LAxLr3TEyJ4j4eXmlbmaiZ9m34q+hUWbFuF/g/6H+p71TXrt5V0/0z75PXj8PJZc6Yh3Q96Ft5t3gT7NvhF7A/M3zsfRIUdRx6NOvnPKWT8bfLIpFlX8Dfdzpnyavf/oWcP6FeDT7NzqZ+w+4uhRNZo2hWH9jMwp+52XB4+fxxdXOmBEyIi865fPO5yNrV9u+70TJ4CGDW0w98eY/95/xuekD16lwoGjZ/FlbvXLZ07Z75y9GX3zsfV73L782DFN/uqXzzucDern6l2gO9EjYiPw6cZPc9TPmOPTiRNAUJAN5v2US/1MuGv74foV5E707PVrUKmBScfcHPUr4J3oB4+fx+dXXsLIkJF51i+/dzjr6vfv4H9Rt0LdfOeUs362mPdT9EP1y39OmcMK9h87jyVX2mNUz1FZx74C3Il+M8awfvnNCcg6NzKsn6ZAd6Lrjn0jXh0BLw+vAt+Jbmz9cjvfO3lSQWCgzSPql/+7tvcfO48vr7yE93q+l1W/AtyJnp/6Pe4c9vhxbS71y39O2e+c1Z+7vPouvD28C3wnekRsBD7b+BmODD5iUD9jzsuz6heFKv5ZN46Ycif6/mPn8q6fCXdtZ69foFegSdcaBvUL0BidU/ZrjRz1K+Cd6BFxEViwYQH+GfyPvn7GXj+dPKlCYKAq7/oZcdf2/mPnsPRKB8NrhwLcia6r36HBh9CgUgOTrp9yrZ+Jd6Ib1M/d26Scsrad+f7Lb/3yuibU1W/+T1HwM6if8de5uV77FeBO9MfV72lfuz+2fkZe50bERmDhhoX4e/Df+vpZy7W7IvmvnyVeu4siuBF7A4s2LsLhQYdz1I/X7pbR38srp7t376JcuXJISEjQ93RzY1V3og8fPhxnzpzRN9CfJAcHBzg4OOQYt7W1ha2t4T+rrigP071w8jv+8HZNGVcUJdfxvGI0dtwac1IUG6SnAwIbQCXZ/0KuMUKVe65QMscFNkhPt808x1SycurcuTMiIiJQuXLlHDl17NixUHPKXg+V7pywADk9NIh0SYdWpc08AGcNG/78uHEVoFVpkS7pUNlk5WHsay/v+hmTU9a49r/8TM1Jsp3o6L4Spqhyfw3n5/1kWD/Tcnpo0Lj6PZRT9vHc6mfsPkKlss29fsbkpCgG9cuQDJNzKoz6ZV9X19PKbPqYllN2klf98pmTfjsqMap+ee2zjapfHjnlWT8TcjLc7n//y6N++TkOZe2K8qhfPnIyiNHI+uXIKdt49vopuulGjDzm5lo/I3PKvPjJ/KMWCtSiNjknw+3+txkblRnql5VTdmpR56xdbrE/btym4PVTFMXI+uWek25cd+zT7fdMyclwu5n/M6Z+D58bKfp486rfo3N6WIZkGFe/3I4fMK5+jzuHzVk/43LSvcj15y6K6TkZ/r7M929u9cvveXlW/VTG1S+Pc9U865ffnLKNZ69fZqymXWvo66c8pn55nn/nUT8TcnqYFtpc65ffa4rH1u8xOT0s12NfHrHnOa4Y1k9RKbnGnhWKkfUzMifdv4tB/fI693xMTg8rrPqJ0fUz4toBRl4nFVL9CvvaPV/1M3JcA41R9bOUa3dB/utnidfuOmpR51o/XrtbRn/P2JweZjVN9HfeeQfbt2/H/v374eXlpR+vUKEC0tPTce/ePZQpU0Y/HhUVhQoVKujXOXLkiMH2oqKi9MuInoZFixbluWzZsmVPMRIiIiIiIiIiIiLSsfgmuojg3Xffxc8//4y//voLfn5+BssbNGgAOzs77N27F927dwcAXLhwAREREQgODgYABAcH48MPP0R0dDTc3d0BALt370bp0qUREBDwdBOi4sElAufuxQKRBd+Uq5MrKrtULviGiIiIiIiIiIiIKAeLb6IPHz4c69atw5YtW1CqVCncuXMHQOYk846OjnBxccHgwYMxevRolCtXDqVLl8a7776L4OBgNG7cGADQtm1bBAQEoG/fvpg7dy7u3LmDKVOmYPjw4blO2UJUEHfTb0IZ0RR9DqQABwq+PUc7R5wffp6NdCIiIiIiIiIioifA4pvoS5cuBQC0aNHCYHzlypUYMGAAAGDBggVQqVTo3r070tLS0K5dO3z55Zf6dW1sbLB9+3a8/fbbCA4OhrOzM/r3749Zs2Y9rTSoGEnWxENsUtCnbR94lPMo0Lai4qOw5vc1iH0QyyY6ERERERERERHRE2DxTfTsT1XNS4kSJbBkyRIsWbIkz3V8fHywY8eOwgyN6JE8ynnA293b3GEQERERERERERHRI+TxOF8iIiIiIiIiIiIiImITnYiIiIiIiIiIiIgoD2yiExERERERERERERHlgU10IiIiIiIiIiIiIqI8sIlORERERERERERERJQHNtGJiIiIiIiIiIiIiPLAJjo9Ma6urhg5ciROnTpl7lCIiIiIiIiIiIiITMImOj0xpUqVglarRYsWLRAUFIRly5YhMTGxUH9HXFxcoW6PiIiIiIiIiIiIKDs20emJKVu2LD7//HNERkZi1KhR+PHHH1GpUiX069cP+/fvL5TfERQUVCjbISIiIiIiIiIiIsoNm+j0xDk4OOD111/Hnj17cPr0afj4+KBv375Gb6dcuXI5/rt+/br+z0RERERERERERESFjU10emJEJMeYr68vPvjgA1y7ds3o7dWtWxc9e/bEsWPHEBoaiuPHj8PT0xOhoaEIDQ0thIiJiIiIiIiIiIiIDLGJTk/M999/n+cyRVGM3t4ff/yBGjVqYODAgUhLS4Ovry/s7Ozg4+MDHx+fgoRKRERERERERERElCtbcwdA1uu5554r9G2OGjUKbdu2xcCBA9G9e/dc73YnIiIiIiIiIiIiKiy8E52emMDAQCxcuBCxsbGFut2aNWti3759iI+Ph7e3d6Fum4iIiIiIiIiIiCg7NtHpiYmMjMTevXtRuXJl9OzZE7/99luh3Tlua2uL2bNnY//+/YWyPSIiIiIiIiIiIqLcsIlOT4y7uzu2bduGy5cvo379+njnnXfg4+ODadOmmfRg0V9++QVxcXEAgNjYWPTs2ROVK1fGyy+/jFu3bhVy9ERERERERERERERsotMTpHt4qKenJyZNmoRLly5h9erVuHbtGmrVqmX09t5//32UK1cOADB27FhUq1YNu3btQrNmzTB06NBCjZ2IiIiIiIiIiIgI4INF6QnKbeqWFi1aoEWLFkhMTDRpe7rG/MmTJ7Fq1SoAQEBAANauXVugWImIiIiIiIiIiIhywzvR6Yn55JNP8lxWunRpo7fn4eGBw4cPAwC8vLxw584dAMD9+/eh0WhMC5KIiIiIiIiIiIjoEXgnOj0xbdu2LdTtLV68GF26dEFwcDDc3NzQqFEjtGzZEv/++y8mT55cqL+LiIiIiIiIiIiICOCd6GQmX331ldF/p1atWjhz5gxatmyJsmXLokuXLqhVqxZ27dqF3r17P4EoiYiIiIiIiIiIqLjjnehkFrdu3TLp7zk6OmLw4MGFHA0RERERERERERFR7ngnOpnFzJkzC3V727dvL9TtEREREREREREREQFsopOZxMXFFer2tmzZUqjbIyIiIiIiIiIiIgLYRCczqVevXqFu7+uvvy7U7REREREREREREREBnBOdnqCtW7fmuSw1NbXA24+JicHp06fh7++PihUrFnh7RERERERERERERA9jE52emK5du6J58+YQkRzL7t+/b/T2+vXrh/nz58Pd3R1//PEHQkJC4Ofnh2vXruGrr75Cly5dCiFqIiIiIiIiIiIioixsotMTU61aNXz77bfw9fXNsczb29vo7Z08eRLu7u4AMh9Munv3btStWxdXr15Ft27d2EQnIiIiIiIiIiKiQsc50emJ6d+/P2JjY3Nd9tZbbxm9vZSUFP2fHzx4gLp16wIA/Pz8oNFoTIqRiIiIiIiIiIiI6FHYRKcnZtKkSQgMDMx12fvvv2/09tq1a4eRI0ciKSkJrVu3xtq1ayEi2LlzJ1xdXQsaLhEREREREREREVEObKLTExMeHo6WLVuiSpUqGD16tMHDRIODg43e3qeffgqVSoVKlSphw4YN6Nu3L+zt7bFo0SJ88803hRk6EREREREREREREQA20ekJevvtt9GjRw9s2rQJsbGxaNWqlf6Botkb6vllb2+PBQsWIDIyElu3bsWxY8dw584d7Nq1C35+foUdPhERERERERERERGb6PTkREdHY/jw4WjQoAFWr16Njh07olWrVkhISICiKCZv18nJCbVq1UK9evVQvnx5AED16tULK2wiIiIiIiIiIiIiPVtzB0DWK/uDQAFg8uTJsLe3N7gj3RinTp3Kc5kp2yMiIiIiIiIiIiJ6HDbR6Ynx9/fHrl270L59e/3Y2LFjoVKpMHbsWKO3V7duXfj6+kJEciyLi4srUKxEREREREREREREuWETnZ6YDRs25Do+evRohISEGL09Hx8fHDx4EJ6enjmWeXt7G709IiIiIiIiIiIiosfhnOj0xDg4OMDBwSHXZZUqVTJ6e507d0Z4eHiuyzp27Gj09oiIiIiIiIiIiIgeh3eiU6GIiABiYwtve66uQOXKhmOLFi3Kc/1ly5YV3i8nIiIiIiIiIiIi+g+b6FRgERGAv7/gwQOl0Lbp5CQ4d07J0UgnIiIiIiIiIiIieprYRKcCi40FHjxQMHLeXXhV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EPH395fp06dLdHS0uUMsFJMnT5aBAweKo6OjvPbaa3L16lVzh1QoTp06JT4+PtK0aVMJCAgQOzs7+e6778wdVqGx5tfn7du3xd/fX2bMmCFqtVpERAICAuTLL780WM9S9y0iImfOnJEyZcpI8+bNpVmzZmJrayvdu3eXXbt26dex5PzCw8OlQoUKMm7cuDzzsOT8dD744APp2LGj1KhRQzp16iT79+83d0iFwtr3n/Hx8VK/fn0ZP368REVFiUajkTFjxkijRo2kX79+cu3aNXOHaLLo6GipW7euTJkyRT/WokULmT17thmjKlxjx46V1157TUQyr2O3bNki8+bNk71798rt27fNHF3BXbx4UUqXLi1Dhw6VcePGSY8ePURRFJk+fbpcv37d3OEVyP379yU4OFjeffddERGJjIyUnTt3Srly5aR9+/Zy+fJlM0dYMNaenzVhE52emKSkJBk0aJAMGDBAlixZIoqiyLhx46ymkR4XFydt27aVESNGGIy3aNFCv/Oz9JN8tVot0dHRUr16dbl586Zs3rxZgoKC5I033pAmTZpI9+7dzR2iySIjI6VChQrSrl07EcnM9b333tNf0CxYsEDOnTtn5ihNt3z5cmnRooXBa7BDhw6yfPly+e677+SPP/4wY3QFl5aWJn369JE33nhDP3bp0iUJCQmRxo0by6JFi8wYXcFdu3ZNqlatKuPHj9d/WPXNN9+Ih4eHXLx40czRFY5t27ZJhw4dREQkPT1d3n//fenSpYsMGTLE4ILbEvejZ8+eFV9fXzl69KjB+IQJE6RWrVoyd+5cSU5ONlN0Bad7TY4cOVKWLFkiZ8+eFQcHB+nXr58kJyfLvHnzLLaREB4eLj4+PjJhwgRJTU2VmJgYmTlzptSrV08iIyMt8vX4MGt+fR48eFCee+45g/1kSEiIjB07Vvr06SPffvutREREmDHCgnnw4IF06tRJhg8frh87duyYBAYGSuvWrWXz5s1mjK5wrF69Wrp16yYimceGjz/+WAYNGiRTpkwxOHex1PeiLu7PPvtMZs2aJVevXpVnn31WunbtKmFhYTJhwgS5cOGCmaM0TXHYf16/fl18fHxkz549BuOff/65BAcHy7Bhwyz2WvfUqVPy7LPPGhwbBg4cKP3795dOnTrJ9OnT5fz582aMsODat28vn332mYiING3aVJo0aSJeXl7y3HPPSdu2bS0+vylTpkjbtm0NxhYvXizly5eXCRMmyJ07d8wUWcGlpKRI/fr1ZcOGDQbjFy5cEFdXV+nSpYv+w3NLZO35WRPOiU5PjEqlQoMGDdC+fXsMGzYMGzZswPz58zF37lyreJBHRkYG7t27hx49egDIegCLn58f4uPjAVj+w1hUKhXc3NwQFBSEM2fOoGvXrpgxYwZ+/vlnnD59Gp06dTJ3iAUSHByMuLg4bNmyBZ06dcLp06dRo0YNtGrVCosXL8b8+fMRERFh7jBNIiKIiIjAiRMnAAAffvghdu7ciU2bNuGLL75Ar169sGrVKrPGWBD29vaIiorSv8dEBFWrVsXcuXNRo0YN/Pjjj9i2bZuZozSNVqvFhg0bULVqVUyePBkqVeahOigoCHZ2dvp9jaU7fvy4fl/ZoUMH/O9//4OPjw+uX7+OBQsWYPLkyQAscz+akZEBtVqNBw8eAIB+PuaPP/4YLVu2xNKlS/XziIsFzhOre022b98ex48fR0BAAA4cOICNGzeiZs2aWLhwoUW+TtVqNVauXIm6deti+vTpcHBwgKurK4KDgxEZGWkV0ywAmXOlWuvr8+7du4iOjsaVK1eQlpaGefPmYfPmzUhLS0NcXByWLl2KefPm6XO3NI6OjoiPj4erqyuAzONF/fr18f3330OtVuOrr77CyZMnzRxlwYSGhupfk23btsXWrVuRkpKCTZs2YerUqVi6dCkAyzw2AFlxN2/eHEePHoWvry9+/PFHXLhwAe3bt8eXX36pf99Z0vtPq9Vi5cqVqF27tlXvP1UqFZycnHD79m0AWQ/Xfuedd9CtWzf8+eef+N///gfAsuoHZB4L1Go1/vnnH8TGxmLOnDlYs2YNfHx84OrqikOHDmHs2LEWfR1fqVIlXL9+HXPmzIGzszN++OEHXL9+HbNmzYKiKPj444+Rmppq7jBNlv35H7rX5rvvvosPP/wQX3zxBX7++WcAsMhzNI1Gg6ioKFy4cEE/lpGRgerVq2Pv3r3YvXs35syZY8YIC8ba87MqZmvfU7GQlJRk8POGDRtEURQZO3asxMbGikjmHW3h4eHmCK/Ast/plJ6eLiKZnwD37dvXYL379+8/1bgKW79+/WTixIkiIjJ48GApW7asBAQEyKBBgyx6epDbt29Lv379xNHRUdq0aaN/TYqIrF27VsqUKSM7duwwY4SmCw8PlyZNmkjVqlWle/fuoiiK/PLLL6LVaiUqKkpGjBghLVq0kNjYWIu7M0itVkt6eroMHDhQevToIampqaLVavV3x165ckWCg4MlJCTEzJGabt++ffr3nI5GoxFfX1/5888/zRNUIdu9e7e8+OKLsmLFCmnTpo3cvHlTRETu3bsnM2fOlMaNG8vZs2fNHKXpgoKCpGXLlvqfU1NT9X8ODAyUXr16mSOsAsu+v9i7d688++yz8uDBAxEReemll0SlUslLL70kkZGR5gqxQH744Qf58MMPDcbu3bsn3t7ecurUKTNFVXC3b982eD8FBgZazevz4dxatGghFStWlFatWomDg4Ps3LlTv+zjjz+WypUrW9zX2nXHt8TERGnZsqW8/fbbIpJ5PMzIyBCRzG8YeHl5yciRI80Vpsmy3123cuVK6datm2zYsEFat26tv3MyMjJS+vfvL61btzY4X7MEycnJOaYKPHHihFStWlUSEhJEROTll18WOzs7adGihfz777/mCNNkN27ckBMnTsj27dutcv/5sE6dOkm9evXk3r17IiL696BI5nEw+77V0vTr10+qVq0qrVq1EicnJ9m6dat+2dq1a6VSpUpy/PhxM0ZoHI1GYzD96IIFC6RmzZrSvXt3+fjjjw3WXbRokfj6+lrc/iW7RYsWSalSpeTWrVsiYjhF6cyZM6VkyZIW/W2sTz/9VLy8vGTbtm36MV0PZvbs2dKoUSOJi4uzuGtbHWvPz1qwiU5PhVqt1r/Z169fr5/a5datWzJq1Cjp1q2bxX51WMRwbvD3339fP0WIiMhHH30kn376qcEJlqXQ1WzVqlUyffp0efvtt6VixYoSHh4umzdvlmeeeUbeeustSUlJMXOkprt165ZMmjRJ9u7dKyKGDaKqVas+cr7moi48PFw2btwo06dPlx49ehgs+/jjj6VOnToWVbuHv8L2119/iY2NjcHULbp1/vrrL1GpVPr5+y1BXl/R070mNRqN+Pn5ye+//65ftmfPHouZv/jh/M6dOyeenp4SEBAgrVu3NlgWEREhTk5Osm7duqcZosmSkpIkMTFR3wwRETl+/Li4u7vr594UybrQHj16tLz88stPPU5T5ZafSGbzslOnTiKS+ZVvLy8vWbVqlZQsWVI6d+6s/2CkqIuLi5OwsDC5dOmSQY66915SUpJ4e3vL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OXPg4OCAESNGwNbW1mJy09E1xV988UVcvXoVw4YNw44dO3Ds2DGcOHEC48aNg729PerVqwcHBweLy6+4YhOdiIiIiIiIiIioiLGxsYGIQKvVolevXlAUBX379sXWrVtx5coV/PvvvxZ7g4NKpTK4A1s3ncm0adMwe/ZshIaGWuxDNnU5+fn5YeDAgfDw8MD27dvh5+cHPz8/KIqCOnXqwMHBwcyRkjE4nQsREREREREREVERpWvdKYqCVq1a4cSJE/jrr78s/kGwurnAZ8yYgcjISFSrVg1TpkzBoUOHrOIB9hkZGfj+++8RGBiI2rVrc9oWC2eZH+kQEREREREREREVA4qiQKPRYNy4cfjzzz9x4sQJi2+gA1l3n9vZ2eHrr79G6dKlcfDgQatooAOZeQ0YMECfJxvolo2PfiUiIiIiIiIiIiriatasiePHj6N27drmDqVQtWvXDgBw6NAhBAYGmjmawqVroJPl43QuRERERERERERERZw1TweSnJxssfO7U/HAJjoRERERERERERERUR74nQIiIiIiIiIiIiIiojywiU5ERERERERERERElAc20YmIiIiIiIiIiIiI8sAmOhERERERERERERFRHthEJyIiIiIiIiIiIiLKA5voRERERERERERERER5YBOdiIiIiIiIiIiIiCgPbKITEREREREREREREeWBTXQiIiIiIiIiIiIiojywiU5ERERERERERERElAc20YmIiIiIiIiIiIiI8sAmOhERERERERERERFRHthEJyIiIiIiIiIiIiLKA5voRERERERERERERER5YBOdiIiIiIis3qpVq1CmTBlzh0FEREREFohNdCIiIiKiR7hz5w7effddVKlSBQ4ODvD29sbLL7+MvXv3mjs0s7p27RoURcGJEyfytf53332HoKAgODk5oVSpUmjevDm2b9/+ZIPMJiQkBBcvXnxqv4+IiIiIrAeb6EREREREebh27RoaNGiAP/74A/PmzcPp06exa9cutGzZEsOHDzd3eI+k0Wig1WpzjKenpz/1WMaOHYs333wTISEhOHXqFI4cOYLnn38er7zyCr744osn/vszMjLg6OgId3f3J/67iIiIiMj6sIlORERERJSHYcOGQVEUHDlyBN27d0f16tVRs2ZNjB49Gn///bd+vYiICLzyyisoWbIkSpcujVdffRVRUVH65TNmzEDdunXx/fffw9fXFy4uLujVqxfu37+vX0er1WLu3LmoWrUqHBwcULlyZXz44YcAgL/++guKouDevXv69U+cOAFFUXDt2jUAWdOVbN26FQEBAXBwcEBERAR8fX3xwQcfoF+/fihdujSGDh0KADh48CBeeOEFODo6wtvbGyNGjEBycrJ++76+vvjoo48waNAglCpVCpUrV8ZXX32lX+7n5wcAqFevHhRFQYsWLXL9N/z777/x6aefYt68eRg7diyqVq0Kf39/fPjhh3jvvfcwevRo3Lhxw+DfKbuFCxfC19fXYGzFihXw9/dHiRIlUKNGDXz55Zf6Zbo75Ddu3IjmzZujRIkSWLt2ba7TuWzZsgX169dHiRIlUKVKFcycORNqtRoAICKYMWMGKleuDAcHB3h6emLEiBG55khERERE1o1NdCIiIiKiXMTHx2PXrl0YPnw4nJ2dcyzXNWS1Wi1eeeUVxMfHY9++fdi9ezfCw8MREhJisP6VK1fwyy+/YPv27di+fTv27duHjz/+WL980qRJ+PjjjzF16lSEhYVh3bp18PDwMCrmBw8e4JNPPsGKFStw9uxZ/Z3X8+fPR506dRAaGoqpU6fiypUraN++Pbp3745Tp05h48aNOHjwIN555x2D7X366acIDAxEaGgohg0bhrfffhsXLlwAABw5cgQAsGfPHkRGRmLz5s25xrR+/XqULFkSb775Zo5lY8aMQUZGBn766ad857h27VpMmzYNH374Ic6dO4ePPvoIU6dOxXfffWew3sSJEzFy5EicO3cO7dq1y7GdAwcOoF+/fhg5ciTCwsKwfPlyrFq1Sv/BxU8//YQFCxZg+fLluHTpEn755RfUqlUr33ESERERkfWwNXcARERERERF0eXLlyEiqFGjxiPX27t3L06fPo2rV6/C29sbALB69WrUrFkT//77L4KCggBkNttXrVqFUqVKAQD69u2LvXv34sMPP8T9+/exaNEifPHFF+jfvz8A4JlnnsHzzz9vVMwZGRn48ssvUadOHYPxF198EWPGjNH/PGTIEPTu3RvvvfceAKBatWpYvHgxmjdvjqVLl6JEiRIAgA4dOmDYsGEAgAkTJmDBggX4888/8eyzz8LNzQ0AUL58eVSoUCHPmC5evIhnnnkG9vb2OZZ5enqidOnSRs1VPn36dHz66afo1q0bgMw74nVN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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABdEAAAJNCAYAAADeVjy8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/GU6VOAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeXhMZ//H8c/MZJWIiJ0kJLFvtROUWlo0VJ9S3exUadTWonSxtCilqh7d1dJSLVWtfSutra0lqa2WElJrBAmVTTLn94df5jGSIanIBO/XdeWSuc8953w/M5P88c3tPibDMAwBAAAAAAAAAIAMzM4uAAAAAAAAAACAvIomOgAAAAAAAAAADtBEBwAAAAAAAADAAZroAAAAAAAAAAA4QBMdAAAAAAAAAAAHaKIDAAAAAAAAAOAATXQAAAAAAAAAABygiQ4AAAAAAAAAgAM00QEAAAAAAAAAcIAmOgAAAPKs33//XW5ubjp+/HiuXrdBgwYaNmxYrl7zbte9e3eVKVPG2WU4tH37djVs2FBeXl4ymUyKjIx0dklOVaZMGXXv3t1u7PDhw3rkkUdUoEABmUwmLVmyRLNnz5bJZNKxY8ecUmdue+ihh/TQQw85uwwAAJDH0EQHAAD3jfRmUPqXh4eHypcvr/79++vs2bN2c//66y917NhRBQsWVL58+dS4cWNt2LAhwzm7d+9ud870r4oVK2apJpPJpP79++dIvvnz5+v999/PkXPlFa+99pqeeeYZlS5dOlevO3z4cM2YMUNnzpzJ8nOSkpI0depU1a9fXwUKFLD7fB06dOgOVotbuXr1qp588klduHBBU6dO1ZdffnnHP1PHjh1Tjx49FBISIg8PDxUvXlxNmjTRqFGj7uh1b0e3bt20Z88ejRs3Tl9++aXq1KlzR66zb98+de7cWaVKlZK7u7tKliypzp07a//+/XfkegAAALfLZBiG4ewiAAAAcsPs2bPVo0cPjR07VkFBQUpKStLmzZttDbW9e/cqX758+vvvv1WrVi1ZLBYNGDBAXl5emjVrlvbt26f169erSZMmtnN2795dCxYs0Oeff253rQIFCqhdu3a3rMlkMik8PFz//e9/bztf27ZttXfv3ntmxWhkZKRq1qyprVu3KjQ0NFevbbVaVapUKT3//PMaO3bsLefHxsaqdevW2rlzp9q2bauWLVvK29tbBw8e1IIFC3TmzBmlpKTkQuXOc/XqVVmtVrm7uzu7lAwOHDigSpUq6bPPPlPv3r3v+PX++usv1a1bV56enurZs6fKlCmj06dPa9euXVq5cqWSkpLueA23kpycLLPZLFdXV0lSYmKi8uXLp9dee01vv/22bV5aWpquXr0qd3d3mUym277u4sWL9cwzz8jPz0+9evVSUFCQjh07ppkzZ+rChQv65ptv1L59+9u+zr+V/nPq5ubmtBoAAEDe4+LsAgAAAHJbmzZtbCsse/furUKFCum9997TDz/8oGeeeUbvvPOO4uLitHfvXlWoUEGS9Pzzz6tixYoaPHiwdu7caXc+FxcXde7cOddz3OtmzZqlwMBANWjQINevbTab1bFjR82dO1djxoy5ZfOwe/fuioiI0KJFi9ShQwe7Y2+99ZZee+21O1muU125ckVeXl62ZmxeFBMTI0ny9fXNsXOm587M1KlT9c8//ygyMjLDivf0Wpztxj92nDt3TlLG18hischiseTINY8cOaIuXbooODhYv/zyi4oUKWI7NnDgQD344IPq3Lmzdu/eraCgoBy5ZlYlJCQoX758NM8BAECm2M4FAADc95o3by5JioqKkiRt2rRJNWvWtDXQJSlfvnx67LHHtGvXLh0+fDjDOdLS0nTp0qU7Ut8PP/ygsLAwlSxZUu7u7goJCdFbb72ltLQ025yHHnpIy5cv1/Hjx21byly/P3VycrJGjRqlsmXLyt3dXQEBARo2bJiSk5PtrpW+vcySJUtUtWpVubu7q0qVKlq1alWGuk6ePKlevXrZ6goKClK/fv2UkpKio0ePymQyaerUqRmet3XrVplMJn399dc3zb1kyRI1b948QwO7TJkyatu2rTZu3Kg6derI09NT1apV08aNGyVdW+larVo1eXh4qHbt2oqIiLB7/pkzZ9SjRw/5+/vL3d1dJUqUUPv27TOs4H/44Yd1/PjxW+6d/dtvv2n58uXq1atXhga6dK1ZOXnyZLuxn376SQ8++KC8vLzk6+ur9u3b688//7SbM3r0aJlMJh06dEidO3dWgQIFVKRIEb3xxhsyDEN///232rdvLx8fHxUvXlxTpkyxe/7GjRtlMpn0zTffaOTIkSpevLi8vLz02GOP6e+//7abu2nTJj355JMKDAy0fT4GDx6sxMREu3ndu3eXt7e3jhw5okcffVT58+fXc889Zzt2457oCxYsUO3atZU/f375+PioWrVqmjZtmt2co0eP6sknn5Sfn5/y5cunBg0aaPny5Zlm+fbbbzVu3Dj5+/vLw8NDLVq00F9//eXgnflfzU2bNpUkPfnkkzKZTHZ7Xmfnvdi/f7+effZZFSxYUI0bN3Z4zSNHjsjf3z/TLWOKFi1q9zj987xmzRrVqFFDHh4eqly5shYvXpzhuXFxcRo0aJACAgLk7u6usmXLauLEibJarXbzrFarpk2bZvs5KFKkiFq3bq0dO3bYXTd9T/TRo0fbah06dKjd7w9He6KvXLlSTZs2tb23devW1fz58x2+JpL07rvvKiEhQZ9++qldA12SChcurE8++UT//POP3n33Xdu4o73209+TG3311VeqXbu2PD095efnp6effjrD5/2hhx5S1apVtXPnTjVp0kT58uXTyJEjbcdu3BM9q78/165dq8aNG8vX11fe3t6qUKGC7bwAAODuxkp0AABw3zty5IgkqVChQpKuNUwKFiyYYV6+fPkkSTt37lS5cuVs4wkJCfLx8VFCQoIKFiyoZ555RhMnTpS3t3eO1Dd79mx5e3tryJAh8vb21k8//aQ333xTly5dsjWbXnvtNcXHx+vEiRO2xnX69a1Wqx577DFt3rxZffr0UaVKlbRnzx5NnTpVhw4d0pIlS+yut3nzZi1evFgvvvii8ufPrw8++EAdOnRQdHS07TU6deqU6tWrp7i4OPXp00cVK1bUyZMntWjRIiUkJCg4OFiNGjXSvHnzNHjwYLvzz5s3T/nz57/plg0nT55UdHS0atWqlenxv/76S88++6xeeOEFde7cWZMnT1a7du308ccfa+TIkXrxxRclSRMmTFCnTp108OBBmc3X1o906NBB+/bt00svvaQyZcooJiZGa9euVXR0tF2zrnbt2pKkLVu2qGbNmg5r/fHHHyVJXbp0cTjneuvWrVObNm0UHBys0aNHKzExUdOnT1ejRo20a9euDA3Dp556SpUqVdI777yj5cuX6+2335afn58++eQTNW/eXBMnTtS8efP0yiuvqG7dunbbDUnSuHHjZDKZNHz4cMXExOj9999Xy5YtFRkZKU9PT0nSwoULlZCQoH79+qlQoUL6/fffNX36dJ04cUILFy60O19qaqpatWqlxo0ba/LkybafixutXbtWzzzzjFq0aKGJEydKkv78809t2bJFAwcOlCSdPXtWDRs2VEJCggYMGKBChQppzpw5euyxx7Ro0SL95z//sTvnO++8I7PZrFdeeUXx8fGaNGmSnnvuOf32228OX+8XXnhBpUqV0vjx4zVgwADVrVtXxYoV+1fvxZNPPqly5cpp/PjxutmumKVLl9a6dev0008/2f5IdzOHDx/WU089pb59+6pbt26aNWuWnnzySa1atUoPP/ywpGu/Z5o2baqTJ0/qhRdeUGBgoLZu3aoRI0bo9OnTdvdD6NWrl2bPnq02bdqod+/eSk1N1aZNm/Trr79mus/5E088IV9fXw0ePFjPPPOMHn300Zv+/po9e7Z69uypKlWqaMSIEfL19VVERIRWrVqlZ5991uHzli5dqjJlyujBBx/M9HiTJk1UpkwZLV26VB9++OEtX7cbjRs3Tm+88YY6deqk3r1769y5c5o+fbqaNGmiiIgIu1X258+fV5s2bfT000+rc+fOts/EjbL6+3Pfvn1q27atqlevrrFjx8rd3V1//fWXtmzZku0cAAAgDzIAAADuE7NmzTIkGevWrTPOnTtn/P3338aCBQuMQoUKGZ6ensaJEycMwzCMdu3aGb6+vsalS5fsnh8aGmpIMiZPnmwbe/XVV43hw4cb33zzjfH1118b3bp1MyQZjRo1Mq5evXrLmiQZ4eHhN52TkJCQYeyFF14w8uXLZyQlJdnGwsLCjNKlS2eY++WXXxpms9nYtGmT3fjHH39sSDK2bNliV4+bm5vx119/2cb++OMPQ5Ixffp021jXrl0Ns9lsbN++PcP1rFarYRiG8cknnxiSjD///NN2LCUlxShcuLDRrVu3m2Zet26dIclYunRphmOlS5c2JBlbt261ja1evdqQZHh6ehrHjx+3jafXsGHDBsMwDOPixYuGJOPdd9+96fXTubm5Gf369bvpnP/85z+GJOPixYtZOmeNGjWMokWLGufPn7eN/fHHH4bZbDa6du1qGxs1apQhyejTp49tLDU11fD39zdMJpPxzjvv2MYvXrxoeHp62r2uGzZsMCQZpUqVsvssf/vtt4YkY9q0abaxzD5jEyZMMEwmk93rmf75fvXVVzPM79atm93nb+DAgYaPj4+Rmprq8LUYNGiQIcnus3n58mUjKCjIKFOmjJGWlmaXpVKlSkZycrJt7rRp0wxJxp49exxe4/rn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DY4fP65OnTrpscceU/HixbVv3z59/PHHql69usaPH2+bd+bMGdWsWVPPPPOMbeX06tWrtWLFCrVu3Vrt27fP0vV27Niht99+O8P4Qw89pIYNG6pgwYLq1q2bBgwYIJPJpC+//DLTZlXt2rX1zTffaMiQIapbt668vb3Vrl07denSRd9++6369u2rDRs2qFGjRkpLS9OBAwf07bffavXq1bfc3uZG48eP15o1a9S0aVP16dNHlSpV0unTp7Vw4UJt3rzZdpM96dqWLh988IE2bNigiRMnZvka7du31/fff5+lfcmz6tChQ2rRooU6deqkypUry8XFRd9//73Onj2rp59+2m7u2rVrFRgYmGGLl8zMnTtXjzzyiJ544gm1a9dOLVq0kJeXlw4fPqwFCxbo9OnTmjx5siTp3XffVZs2bRQaGqpevXopMTFR06dPV4ECBTR69OgcyXk9Pz8/NW7cWD169NDZs2f1/vvvq2zZsnr++eclXVv1HxISoldeeUUnT56Uj4+Pvvvuu3+1z/j1evfurQsXLqh58+by9/fX8ePHNX36dNWoUcO2uv/VV1/V119/rTZt2mjAgAHy8/PTnDlzFBUVpe+++y5L28bcjjv1XkycOFE7d+7UE088YfvDwa5duzR37lz5+flp0KBBdvPLly+vXr16afv27SpWrJi++OILnT17VrNmzbLNGTp0qH788Ue1bdtW3bt3V+3atXXlyhXt2bNHixYt0rFjx1S4cGE1a9ZMXbp00QcffKDDhw+rdevWslqt2rRpk5o1a2bXoP43fHx8NHXqVPXu3Vt169bVs88+q4IFC+qPP/5QQkLCTbfqKVu2rObOnatnnnlG1apVU69evRQUFKRjx45p5syZunjxohYsWGC39/zTTz+t4cOH6z//+Y8GDBighIQEffTRRypfvrx27dplmxcSEqK3335bI0aM0LFjx/T4448rf/78ioqK0vfff68+ffrY/piVHVn9/Tl27Fj98ssvCgsLU+nSpRUTE6MPP/xQ/v7+ma66BwAAdxkDAADgPjFr1ixDkrF9+/abzrtw4YLRvn17o3jx4oabm5sRFBRkDB8+3Lh06ZLdvIsXLxqdO3c2ypYta+TLl89wd3c3qlSpYowfP95ISUnJUk2SHH699dZbhmEYxpYtW4wGDRoYnp6eRsmSJY1hw4YZq1evNiQZGzZs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uD766CO5ubnphx9+UN++fbV3715Nnjz5DqcBAAAAAADA/WDChAm2JvqIESNUrVo1zZw5U/Pnz9fAgQP1/fffO7lCpKOJ7mT+wakKrnLnm+i3w93dXcWLF5ck9evXT99//71+/PFH9e3bVwMHDtTSpUuVnJyspk2b6oMPPlC5cuUkScePH1f//v21efNmpaSkqEyZMnr33XdVuXJlNWvWTJJUsGBBSVK3bt00e/ZsXb58WX379tWSJUvk4+OjYcOG6YcfflCNGjX0/vvvS5LKlCmjXr166fDhw1qyZImeeOIJzZ49W5s3b9aIESO0Y8cOFS5cWP/5z380YcIEeXl5ad++fTpy5IjWr1+v0qVLS5JKly6tRo0a2XL+/fffevnllzVo0CCNHz/eNv7yyy/Lzc1NAwYM0JNPPqn69evf8dccAAAAAAAA9zbDMGzf//7779q1a5csFouGDBli2xkCeQM3FkW2eXp6KiUlRd27d9eOHTv0448/atu2bTIMQ48++qiuXr0qSQoPD1dycrJ++eUX7dmzRxMnTpS3t7cCAgL03XffSZIOHjyo06dPa9q0aZKu7fm0ZcsW/fjjj1q7dq02bdqkXbt2Zahh8uTJeuCBBxQREaE33nhDR44cUevWrdWhQwft3r1b33zzjTZv3qz+/ftLkooUKSKz2axFixYpLS0t01yLFi3S1atX9corr2Q49sILL8jb21tff/11jryGAAAAAAAAuL8lJSVpz5492r17t0wmkywWi+2YyZR7W0Dj1liJjiwzDEPr16/X6tWr1aZNGy1ZskRbtmxRw4YNJUnz5s1TQECAlixZoieffFLR0dHq0KGDqlWrJkkKDg62ncvPz0+SVLRoUdue6JcvX9acOXM0f/58tWjRQpI0a9YslSxZMkMtzZs318svv2x73Lt3bz333HMaNGiQJKlcuXL64IMP1LRpU3300UcqVaqUPvjgAw0bNkxjxoxRnTp11KxZMz333HO2ug4dOqQCBQqoRIkSGa7n5uam4OBgHTp06DZfRQAAAAAAAEBKTExU+/btbSvST5w4IX9/f8XHx8tsZu1zXsK7gVtatmyZvL295eHhoTZt2uipp55S9+7d5eLiYre1SaFChVShQgX9+eefkqQBAwbo7bffVqNGjTRq1Cjt3r37ptc5evSorl69qnr16tnGChQooAoVKmSYW6dO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ac6cOdq1a5fKli2rVq1a6cKFC3bzXnvtNU2ZMkU7duyQi4uLevbsaTs2b948jRs3ThMnTtTOnTsVGBiojz76yO7506ZN05QpUzR58mTt3r1brVq10mOPPabDhw/fMsfgwYN1+fJlrV27NtPjhmFo1apVio6OVv369W95PgAAAAAAAAD3NproyJLOnTtr8+bNOn78uI4fP64tW7aoc+fOtuNXrlzRRx99pHfffVdt2rRR5cqV9dlnn8nT01MzZ860O9e4cePUtGlTVa5cWa+++qq2bt2qpKQkSdL06dPVq1cv9ejRQ+XLl9ebb76patWq2T1/8uTJGj58uJ5++mlVqFBBEydOVI0aNfT+++/fMkfFihUlSceOHbMb9/f3l7e3t9zc3BQWFqZRo0apSZMm/+KVAgAAAAAAAJzr3Llz+umnn3T69Glnl3JPoImOLClSpIjCwsI0e/ZszZo1S2FhYSpcuLDt+JEjR3T16lU1atTINubq6qp69erpzz//tDtX9erVbd+XKFFCkhQTEyPp2t7k9erVs5t//eNLly7p1KlTdteRpEaNGmW4TmYMw5Bkf+NRSdq0aZMiIyMVGRmpzz//XOPHj8+wAh4AAAAAAADIi7p27Wrrr/3000+2xasPPPCAlixZ4tzi7gF5uok+evRomUwmu6/0lcTStZtbhoeHq1ChQvL29laHDh109uxZu3NER0crLCxM+fLlU9GiRTV06FClpqbazdm4caNq1aold3d3lS1bVrNnz86NeHednj17avbs2ZozZ47dFizZ5erqavs+vZlttVpvu76sSG+0BwUF2Y0HBQWpbNmyqlKlinr06KEuXbpo3LhxuVITAAAAAAAAcDv++OMPFS1aVJI0ZswYrV27Vr///rt+++03jRkzxsnV3f3ydBNdkqpUqaLTp0/bvjZv3mw7NnjwYC1dulQLFy7Uzz//rFOnTumJJ56wHU9LS1NYWJhSUlK0detWzZkzR7Nnz9abb75pmxMVFaWwsDA1a9ZMkZGRGjRokHr37q3Vq1fnas67QevWrZWSkqKrV6+qVatWdsdCQkLk5uamLVu22MauXr2q7du3q3Llylm+RoUKFexuRirJ7rGPj49Klixpdx1J2rJlS5au8/7778vHx0ctW7a86TyLxaLExMQs1w0AAAAAAAA4y/V9rISEBNWoUUPStYWjaWlpTqrq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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } + "daf49b8e6e4045b7975dd924a3edcddf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e373cacb72674fdf9e82cc0f53d3d0a2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a637f405082a44f39b5695d5e78238f1", + "placeholder": "​", + "style": "IPY_MODEL_96f7adbf0d9a4e5db8fa7e473cd55c24", + "value": "README.md: 100%" + } + }, + "e3d9b0903e5c49f882460b08d08cd114": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c07b169cf37f4384b222ce07226bbf67", + "placeholder": "​", + "style": "IPY_MODEL_c2d6cee33ca948238ebd9082c3855885", + "value": " 7.13k/7.13k [00:00<00:00, 411kB/s]" + } + }, + "e428af93e31b4aeba3418b3d6765f2f1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e6524b941a444ec287fe0e38b2ddff24": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e7472356346c419c80a83b12a85cbda4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "eb44239cf2ec4b1590ed0f0a507723b3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ec97ec6f0c194ecd831c623493006084": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f0443240fa914a70a99977a5dd25896a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f11d00fbcc514447a427665609b20ed2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d1942df9dfc14f0d9e6c5fef89edbb4b", + "placeholder": "​", + "style": "IPY_MODEL_fbc08aadede24da2baf3076b5c6ba830", + "value": " 229/229 [00:00<00:00, 9.30kB/s]" + } + }, + "f11e8d3dd32f449895d7dda76122b8a8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f1ecc84900f74b2791d0f3fbdecba084": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bfa9adee6ed54184bf567715526886dd", + "placeholder": "​", + "style": "IPY_MODEL_55011e76eb9d4e979871aca311c83f30", + "value": " 712k/712k [00:00<00:00, 10.8MB/s]" + } + }, + "f5311ea00d214fb4ad49306666ec2064": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fae798582c924b4188f6bea4b106a3ce": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fbc08aadede24da2baf3076b5c6ba830": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fc4881cad75d4ca385d1f27d9d48afe6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7d8e21f2f7224718b120aeb072bb0eda", + "IPY_MODEL_7f378bd498ea4b408f1d0ffb839a6eb6", + "IPY_MODEL_8d79a9d41c0a4db1859dbec45acd1bb7" ], - "source": [ - "# Generate bar charts for each metric\n", - "bar_chart_benchmark_comparison(benchmark_results, metric=\"avg_latency\", metric_label=\"Average Latency (ms)\")\n", - "bar_chart_benchmark_comparison(benchmark_results, metric=\"throughput\", metric_label=\"Throughput (queries/sec)\")\n", - "bar_chart_benchmark_comparison(benchmark_results, metric=\"p95_latency\", metric_label=\"P95 Latency (ms)\")" - ] + "layout": "IPY_MODEL_379708bc3c814fa1b56add2aa56888f7" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Part 5: Extra Notes" - ] + "fc7bb823ac024190bdab34d7f70eb7f6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n", - "### 5.1 PostgreSQL JSONB vs MongoDB BSON\n", - "\n", - "| Feature | **PostgreSQL JSONB** | **MongoDB BSON** |\n", - "|----------------------------|--------------------------------------------------|----------------------------------------------|\n", - "| **Integration** | An extension to a relational database system. | Native to MongoDB, a document database. |\n", - "| **Query Language** | Uses SQL with JSONB-specific operators/functions. | Uses MongoDB Query Language (MQL), a JSON-like query syntax. |\n", - "| **Storage Optimization** | Optimized for relational data alongside JSONB. | Fully optimized for JSON-like document storage. |\n", - "| **Data Type Support** | Stores standard JSON data types (e.g., strings, numbers). | Includes additional types not in standard JSON (e.g., `Date`, `ObjectId`, `Binary`). |\n", - "| **Use Case** | Best for hybrid relational/JSON use cases. | Designed for flexible schemas, document-based databases. |\n", - "| **Updates** | JSONB supports in-place updates for specific keys or paths. | BSON supports in-place updates with more native support for field-level atomic operations. |\n", - "| **Size Overhead** | Slightly more compact than BSON in some cases. | Includes metadata like type information, leading to slightly larger size. |\n" - ] + "fcff33d29a9840179da3f76cd31a63a5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5b11e4ace7b44175ba9df299b4330a32", + "IPY_MODEL_28f9b774850548e08cf9046f9547a0a8", + "IPY_MODEL_97538ebe22234bebbbeadbda3c4004eb" + ], + "layout": "IPY_MODEL_f5311ea00d214fb4ad49306666ec2064" + } }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "fe5a5107da5444428b0075580d83f9af": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } } - ], - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "display_name": "Python 3", - "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.11.5" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "00f63a14f50f4dbe94adef7739f518d7": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_3926c9e8cfde48daa712478cadbce690", - "placeholder": "​", - "style": "IPY_MODEL_fc7bb823ac024190bdab34d7f70eb7f6", - "value": "configuration.py: 100%" - } - }, - "0110b660a0d54148b2e3310bb2512c0b": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "01c99f8562544b158098b10dbbb6a4ce": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_6f1bbca9316e4ecf9453d408cb96e3f4", - "placeholder": "​", - "style": "IPY_MODEL_4088bb56dc324f2ca37ffec9b69dc4f7", - "value": " 71.8k/71.8k [00:00<00:00, 3.50MB/s]" - } - }, - "02c34754d7e64bc49b709c0932644c13": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "05505d63901645cb8bf6237d1b4bb2d4": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "0571fa79cac84734ae970f985e39e0eb": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_bd35bbf844764a86bc30a7a9b448d2bb", - "IPY_MODEL_8cba175638b24b118516885001bd3b10", - "IPY_MODEL_6b6ae431c1ee4dad844c2ea3955a9455" - ], - "layout": "IPY_MODEL_1400e532ba0f4272856a2e0f572130fa" - } - }, - "068a6b5348fa4d778af925798e15f3c9": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "076ec604be1d4f58875a60c8c70fb399": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_d06fea19aa0644edbf24a0c6ca06e83b", - "placeholder": "​", - "style": "IPY_MODEL_7995585ce22a4e1eb12cdf3f2968087d", - "value": "modeling.py: 100%" - } - }, - "079a149d46d84815b514e5675ad5d214": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": "20px" - } - }, - "09663b7776534a919ba1e0ccffa4488a": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "0a3a298d7eb34e72aaa78ceb2d3a8a9c": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "0cf02ddf7172445994797558e8eb7725": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "10e1a2826dd54920a5660852b3a3081b": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "1400e532ba0f4272856a2e0f572130fa": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "172257c2e1a147ea822e91ae891ef680": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "18dfa17915704a9683c01bc6217bc3f7": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "196dc72cb04648f1adaa39aeb138b5b4": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_ca397ff9c91f4f5d92304e6ac8dfacd4", - "IPY_MODEL_4eafb763d79d4c538123dc7f3ad46d5a", - "IPY_MODEL_b34a39294d724e22af562dc21b0b44ab" - ], - "layout": "IPY_MODEL_488b6619d7f049cebbe61e00588045bb" - } - }, - "19bd15fc5f694a548b3f831db259e89e": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_bb7211de903d427ba9b5916c9bec6168", - "placeholder": "​", - "style": "IPY_MODEL_70697741acef4b1280dea8c8ef605172", - "value": " 1.38k/1.38k [00:00<00:00, 74.7kB/s]" - } - }, - "1a767bc8f6e5402896602b5755e7949e": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a56b94240d274812b2373e7d341ac3c7", - "max": 1349, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_18dfa17915704a9683c01bc6217bc3f7", - "value": 1349 - } - }, - "1c924ea24cc943e79da03f7707df61ee": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "1f1fbec87933487e92fc3886b5a96280": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "1fe65877defc440faf10c7f35a15a965": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_36b880bd98934e4394cc17214b2e58cd", - "placeholder": "​", - "style": "IPY_MODEL_35df53c36efe400d9e5db2e6aa316ef8", - "value": "tokenizer.json: 100%" - } - }, - "21dbfc6be7ea47a9992ff4608d41d781": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_00f63a14f50f4dbe94adef7739f518d7", - "IPY_MODEL_9ec0f908bf124b5a8eac23c39622c8d3", - "IPY_MODEL_e3d9b0903e5c49f882460b08d08cd114" - ], - "layout": "IPY_MODEL_a8ea9d952a1e4d22b6041b4d6687f931" - } - }, - "271158b807424b41a0599865e4b489bb": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "28f9b774850548e08cf9046f9547a0a8": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_91050f6f01b446c19544496659f5aa4c", - "max": 297, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_cbde3fc866c549b89006aa53a715daab", - "value": 297 - } - }, - "2afdbdcecaa8419bb090a9cc30cea33d": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "2b5cafc1a4d340088101860db2ffdb13": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_5adb1154d2224663960bb79cede4472f", - "placeholder": "​", - "style": "IPY_MODEL_5a071cf6d0a746dcac2bd067010af0d0", - "value": " 232k/232k [00:00<00:00, 9.18MB/s]" - } - }, - "2da038d71cde4c9e8bef804e22c6e652": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "2eeb2ab901ab459b997179c5038eb1c0": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_92520823c88e4e09a5e5f2ff77872383", - "max": 231508, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_02c34754d7e64bc49b709c0932644c13", - "value": 231508 - } - }, - "339478ba34e048f2b1fd08f36ebe5550": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "35df53c36efe400d9e5db2e6aa316ef8": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "36b880bd98934e4394cc17214b2e58cd": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "379708bc3c814fa1b56add2aa56888f7": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "3926c9e8cfde48daa712478cadbce690": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "3aba620032124114b9cadd25c84bc28a": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "404b118d1197475abb9a7efc1dda9124": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_68db9ec0b1834cc287fe0d62725fd7a2", - "IPY_MODEL_1a767bc8f6e5402896602b5755e7949e", - "IPY_MODEL_90812f460bbc404ab3461dbbeec1afa4" - ], - "layout": "IPY_MODEL_271158b807424b41a0599865e4b489bb" - } - }, - "4088bb56dc324f2ca37ffec9b69dc4f7": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "4115caa433be49b480da8984fdd79cee": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_62feba19ff5f4d1f9ee46ed7f1197131", - "max": 71774, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_61727889b118431ebb461d9fb3a13a15", - "value": 71774 - } - }, - "437114a7c1894554ac58f1116fcb8e4b": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "43debe97a56c444b99a6e2dcf2acc507": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_c14e122e644e462bb6e4b078cfdb5acc", - "max": 1384, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_e7472356346c419c80a83b12a85cbda4", - "value": 1384 - } - }, - "488b6619d7f049cebbe61e00588045bb": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "4a50b1377ad4421390691e40ffd5f186": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_bf55e069ecff4f5893a017cbf76437a0", - "placeholder": "​", - "style": "IPY_MODEL_c8d963c0d661444b8dd86f1a047d7a6a", - "value": "vocab.txt: 100%" - } - }, - "4c440ab8ea9049c983e96057c87f5f4a": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a3829c2fc8e441698709df1a197efe39", - "max": 695, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_0a3a298d7eb34e72aaa78ceb2d3a8a9c", - "value": 695 - } - }, - "4eafb763d79d4c538123dc7f3ad46d5a": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_079a149d46d84815b514e5675ad5d214", - "max": 1, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_aeaf94705c334cdaba2085ae7958184f", - "value": 0 - } - }, - "4f5334ae79dc462c92c2413c0457917a": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_f11e8d3dd32f449895d7dda76122b8a8", - "placeholder": "​", - "style": "IPY_MODEL_a21c48a1b35f49a49b07395772d239f3", - "value": " 695/695 [00:00<00:00, 29.9kB/s]" - } - }, - "4ffefc357cbb4d8bb6cf504c772e66c3": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "534524aaa9d449a38e4b94f73d28e794": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "5477b673579b4610a61e1abb77031286": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_e373cacb72674fdf9e82cc0f53d3d0a2", - "IPY_MODEL_4115caa433be49b480da8984fdd79cee", - "IPY_MODEL_01c99f8562544b158098b10dbbb6a4ce" - ], - "layout": "IPY_MODEL_09663b7776534a919ba1e0ccffa4488a" - } - }, - "55011e76eb9d4e979871aca311c83f30": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "58fec38b927d44bc91aa25fc6297146d": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "5a071cf6d0a746dcac2bd067010af0d0": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "5adb1154d2224663960bb79cede4472f": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "5b11e4ace7b44175ba9df299b4330a32": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_f0443240fa914a70a99977a5dd25896a", - "placeholder": "​", - "style": "IPY_MODEL_fe5a5107da5444428b0075580d83f9af", - "value": "1_Pooling/config.json: 100%" - } - }, - "5ec2ab12ce534bd6b5b0a6fd77d8edbf": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_8b5126dd80ea4e33a0bf7184464c69ef", - "placeholder": "​", - "style": "IPY_MODEL_eb44239cf2ec4b1590ed0f0a507723b3", - "value": " 59.0k/59.0k [00:00<00:00, 1.91MB/s]" - } - }, - "61727889b118431ebb461d9fb3a13a15": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "62feba19ff5f4d1f9ee46ed7f1197131": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "66b100ce6341446aabd7bf2a659f4868": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "675f3e8c089945ceb9a016708cb25ea3": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "68db9ec0b1834cc287fe0d62725fd7a2": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_d6f79382307948f9b2f3c5c3f225814e", - "placeholder": "​", - "style": "IPY_MODEL_05505d63901645cb8bf6237d1b4bb2d4", - "value": "config.json: 100%" - } - }, - "6b6ae431c1ee4dad844c2ea3955a9455": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a860c22b85be4d129ebb293be21725a0", - "placeholder": "​", - "style": "IPY_MODEL_437114a7c1894554ac58f1116fcb8e4b", - "value": " 54.0/54.0 [00:00<00:00, 2.60kB/s]" - } - }, - "6e5ea62717334d55b0f30556cc1dd5bc": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_675f3e8c089945ceb9a016708cb25ea3", - "placeholder": "​", - "style": "IPY_MODEL_66b100ce6341446aabd7bf2a659f4868", - "value": "tokenizer_config.json: 100%" - } - }, - "6f1bbca9316e4ecf9453d408cb96e3f4": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "6f63b560cb4c4533a6556f9e56d10ee4": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "70697741acef4b1280dea8c8ef605172": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "7170d54671cd4791a32a8e99af77d87b": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_2da038d71cde4c9e8bef804e22c6e652", - "placeholder": "​", - "style": "IPY_MODEL_8b024bd66d594938baaf0626e9c890c4", - "value": "modules.json: 100%" - } - }, - "74bbaae5ec684386af9b7dce597770ff": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "7995585ce22a4e1eb12cdf3f2968087d": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "7d8e21f2f7224718b120aeb072bb0eda": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_9b7e331356d94a299991c7cdba456dfa", - "placeholder": "​", - "style": "IPY_MODEL_e6524b941a444ec287fe0e38b2ddff24", - "value": "model.safetensors: 100%" - } - }, - "7e8e9e4690c044f08db6430ef1c0a02f": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "7f378bd498ea4b408f1d0ffb839a6eb6": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_8562bd162996441ba0d3d548e24412e4", - "max": 1736585680, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_1c924ea24cc943e79da03f7707df61ee", - "value": 1736585680 - } - }, - "8550d0395fac4c8f9b398264e5a9d875": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "8562bd162996441ba0d3d548e24412e4": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "86b9babf0741465396cb97d58e9878f6": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "87e6cdea52394a7c92ec3885369cd306": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_7170d54671cd4791a32a8e99af77d87b", - "IPY_MODEL_c946bd8234714171ba7e74f14059c770", - "IPY_MODEL_f11d00fbcc514447a427665609b20ed2" - ], - "layout": "IPY_MODEL_1f1fbec87933487e92fc3886b5a96280" - } - }, - "8b024bd66d594938baaf0626e9c890c4": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "8b5126dd80ea4e33a0bf7184464c69ef": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "8cba175638b24b118516885001bd3b10": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_c8b595b86d7549cdbb04699a36bf1b8f", - "max": 54, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_534524aaa9d449a38e4b94f73d28e794", - "value": 54 - } - }, - "8d79a9d41c0a4db1859dbec45acd1bb7": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_9537ffd121ac44fe9f251b21fe21bb35", - "placeholder": "​", - "style": "IPY_MODEL_fae798582c924b4188f6bea4b106a3ce", - "value": " 1.74G/1.74G [00:42<00:00, 41.0MB/s]" - } - }, - "90812f460bbc404ab3461dbbeec1afa4": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_0cf02ddf7172445994797558e8eb7725", - "placeholder": "​", - "style": "IPY_MODEL_2afdbdcecaa8419bb090a9cc30cea33d", - "value": " 1.35k/1.35k [00:00<00:00, 81.0kB/s]" - } - }, - "91050f6f01b446c19544496659f5aa4c": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "920b82aee6744bc98a0285058a4b6896": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_7e8e9e4690c044f08db6430ef1c0a02f", - "placeholder": "​", - "style": "IPY_MODEL_4ffefc357cbb4d8bb6cf504c772e66c3", - "value": "special_tokens_map.json: 100%" - } - }, - "92520823c88e4e09a5e5f2ff77872383": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9452e4c829e246dfbae59451ebd8430b": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9481a2531fe54ac4854d1a2dcf6883a5": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_9452e4c829e246dfbae59451ebd8430b", - "max": 711661, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_c6f676834f5b493d93d67b218b9292fc", - "value": 711661 - } - }, - "9537ffd121ac44fe9f251b21fe21bb35": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "96f7adbf0d9a4e5db8fa7e473cd55c24": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "97538ebe22234bebbbeadbda3c4004eb": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a343edd2067a4c20b283a88cb751081f", - "placeholder": "​", - "style": "IPY_MODEL_3aba620032124114b9cadd25c84bc28a", - "value": " 297/297 [00:00<00:00, 12.8kB/s]" - } - }, - "9b7e331356d94a299991c7cdba456dfa": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9cde1ca6ec564af286530229261b1939": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "9ec0f908bf124b5a8eac23c39622c8d3": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_cbd8f64b8b444df49071605ab941dfab", - "max": 7127, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_172257c2e1a147ea822e91ae891ef680", - "value": 7127 - } - }, - "a15c83512c4440d28a585cca94ea067e": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_920b82aee6744bc98a0285058a4b6896", - "IPY_MODEL_4c440ab8ea9049c983e96057c87f5f4a", - "IPY_MODEL_4f5334ae79dc462c92c2413c0457917a" - ], - "layout": "IPY_MODEL_ec97ec6f0c194ecd831c623493006084" - } - }, - "a21c48a1b35f49a49b07395772d239f3": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "a343edd2067a4c20b283a88cb751081f": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a3829c2fc8e441698709df1a197efe39": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a53ba37ac3aa470a8fd52fb4b4f9d3ab": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_4a50b1377ad4421390691e40ffd5f186", - "IPY_MODEL_2eeb2ab901ab459b997179c5038eb1c0", - "IPY_MODEL_2b5cafc1a4d340088101860db2ffdb13" - ], - "layout": "IPY_MODEL_339478ba34e048f2b1fd08f36ebe5550" - } - }, - "a56b94240d274812b2373e7d341ac3c7": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a637f405082a44f39b5695d5e78238f1": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a860c22b85be4d129ebb293be21725a0": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a8e20290f34d45c78cefbdf69ee00695": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_076ec604be1d4f58875a60c8c70fb399", - "IPY_MODEL_a9c48f8406894f18a738ee8b66a8328e", - "IPY_MODEL_5ec2ab12ce534bd6b5b0a6fd77d8edbf" - ], - "layout": "IPY_MODEL_c3041ede1ce042e9b740b6707f493396" - } - }, - "a8ea9d952a1e4d22b6041b4d6687f931": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a9c48f8406894f18a738ee8b66a8328e": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_86b9babf0741465396cb97d58e9878f6", - "max": 59023, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_8550d0395fac4c8f9b398264e5a9d875", - "value": 59023 - } - }, - "abcd3707b1404a2a9a43120ada2a7636": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_6e5ea62717334d55b0f30556cc1dd5bc", - "IPY_MODEL_43debe97a56c444b99a6e2dcf2acc507", - "IPY_MODEL_19bd15fc5f694a548b3f831db259e89e" - ], - "layout": "IPY_MODEL_10e1a2826dd54920a5660852b3a3081b" - } - }, - "ac81622f1e8e4c4aa3db54a6466c91ea": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "aeaf94705c334cdaba2085ae7958184f": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "b34a39294d724e22af562dc21b0b44ab": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_0110b660a0d54148b2e3310bb2512c0b", - "placeholder": "​", - "style": "IPY_MODEL_daf49b8e6e4045b7975dd924a3edcddf", - "value": " 0/0 [00:00<?, ?it/s]" - } - }, - "bb7211de903d427ba9b5916c9bec6168": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "bd35bbf844764a86bc30a7a9b448d2bb": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_068a6b5348fa4d778af925798e15f3c9", - "placeholder": "​", - "style": "IPY_MODEL_ac81622f1e8e4c4aa3db54a6466c91ea", - "value": "sentence_bert_config.json: 100%" - } - }, - "bf55e069ecff4f5893a017cbf76437a0": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "bfa9adee6ed54184bf567715526886dd": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "c07b169cf37f4384b222ce07226bbf67": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "c14e122e644e462bb6e4b078cfdb5acc": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "c2d6cee33ca948238ebd9082c3855885": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "c3041ede1ce042e9b740b6707f493396": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "c6f676834f5b493d93d67b218b9292fc": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "c8b595b86d7549cdbb04699a36bf1b8f": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "c8d963c0d661444b8dd86f1a047d7a6a": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "c946bd8234714171ba7e74f14059c770": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "FloatProgressModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_74bbaae5ec684386af9b7dce597770ff", - "max": 229, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_9cde1ca6ec564af286530229261b1939", - "value": 229 - } - }, - "ca397ff9c91f4f5d92304e6ac8dfacd4": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_58fec38b927d44bc91aa25fc6297146d", - "placeholder": "​", - "style": "IPY_MODEL_e428af93e31b4aeba3418b3d6765f2f1", - "value": "" - } - }, - "cbd8f64b8b444df49071605ab941dfab": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "cbde3fc866c549b89006aa53a715daab": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "cc4623a8fbb64d749aa0193105437704": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_1fe65877defc440faf10c7f35a15a965", - "IPY_MODEL_9481a2531fe54ac4854d1a2dcf6883a5", - "IPY_MODEL_f1ecc84900f74b2791d0f3fbdecba084" - ], - "layout": "IPY_MODEL_6f63b560cb4c4533a6556f9e56d10ee4" - } - }, - "d06fea19aa0644edbf24a0c6ca06e83b": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "d1942df9dfc14f0d9e6c5fef89edbb4b": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "d6f79382307948f9b2f3c5c3f225814e": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "daf49b8e6e4045b7975dd924a3edcddf": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "e373cacb72674fdf9e82cc0f53d3d0a2": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a637f405082a44f39b5695d5e78238f1", - "placeholder": "​", - "style": "IPY_MODEL_96f7adbf0d9a4e5db8fa7e473cd55c24", - "value": "README.md: 100%" - } - }, - "e3d9b0903e5c49f882460b08d08cd114": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_c07b169cf37f4384b222ce07226bbf67", - "placeholder": "​", - "style": "IPY_MODEL_c2d6cee33ca948238ebd9082c3855885", - "value": " 7.13k/7.13k [00:00<00:00, 411kB/s]" - } - }, - "e428af93e31b4aeba3418b3d6765f2f1": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "e6524b941a444ec287fe0e38b2ddff24": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "e7472356346c419c80a83b12a85cbda4": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "ProgressStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "eb44239cf2ec4b1590ed0f0a507723b3": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "ec97ec6f0c194ecd831c623493006084": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "f0443240fa914a70a99977a5dd25896a": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "f11d00fbcc514447a427665609b20ed2": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_d1942df9dfc14f0d9e6c5fef89edbb4b", - "placeholder": "​", - "style": "IPY_MODEL_fbc08aadede24da2baf3076b5c6ba830", - "value": " 229/229 [00:00<00:00, 9.30kB/s]" - } - }, - "f11e8d3dd32f449895d7dda76122b8a8": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "f1ecc84900f74b2791d0f3fbdecba084": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HTMLModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_bfa9adee6ed54184bf567715526886dd", - "placeholder": "​", - "style": "IPY_MODEL_55011e76eb9d4e979871aca311c83f30", - "value": " 712k/712k [00:00<00:00, 10.8MB/s]" - } - }, - "f5311ea00d214fb4ad49306666ec2064": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "fae798582c924b4188f6bea4b106a3ce": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "fbc08aadede24da2baf3076b5c6ba830": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "fc4881cad75d4ca385d1f27d9d48afe6": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_7d8e21f2f7224718b120aeb072bb0eda", - "IPY_MODEL_7f378bd498ea4b408f1d0ffb839a6eb6", - "IPY_MODEL_8d79a9d41c0a4db1859dbec45acd1bb7" - ], - "layout": "IPY_MODEL_379708bc3c814fa1b56add2aa56888f7" - } - }, - "fc7bb823ac024190bdab34d7f70eb7f6": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "fcff33d29a9840179da3f76cd31a63a5": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "HBoxModel", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_5b11e4ace7b44175ba9df299b4330a32", - "IPY_MODEL_28f9b774850548e08cf9046f9547a0a8", - "IPY_MODEL_97538ebe22234bebbbeadbda3c4004eb" - ], - "layout": "IPY_MODEL_f5311ea00d214fb4ad49306666ec2064" - } - }, - "fe5a5107da5444428b0075580d83f9af": { - "model_module": "@jupyter-widgets/controls", - "model_module_version": "1.5.0", - "model_name": "DescriptionStyleModel", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - } - } - } - }, - "nbformat": 4, - "nbformat_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/ruff.toml b/ruff.toml index fcf4752..27b58bb 100644 --- a/ruff.toml +++ b/ruff.toml @@ -18,6 +18,9 @@ extend-select = [ ] ignore = [ "F811", # Redefinition of unused, + "F402", # Import shadowing, + "B006", # Do not use mutable data structures for argument defaults, + "B023", # Function definition does not bind loop variable `ax` "B007", # Loop control variable `index` not used within loop body "B904", # Within an `except` clause, raise exceptions with `raise ... from err`" "RUF005", # Consider iterable unpacking instead of concatenation" From a5305ac73e2f8aa66f01225fa5dd533f3a2ddb0f Mon Sep 17 00:00:00 2001 From: ajosh0504 Date: Thu, 12 Dec 2024 13:39:14 -0800 Subject: [PATCH 23/23] Making ruff happy --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0641604..cb3f902 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ This section contains examples of use cases that are commonly seen in industry-f | **Trip Advisor - Laravel, OpenAI and Atlas** | PHP (Laravel), OpenAI, MongoDB | [![GitHub](https://img.shields.io/badge/GitHub-View_on_GitHub-blue?logo=GitHub)](https://github.com/mongodb-developer/laravel-openai-vector-search)|Leverage PHP, Laravel and OpenAI to build suphisticated recommendation engines| | **MongoDB AI Framework** | Key AI Stack components|[![GitHub](https://img.shields.io/badge/GitHub-View_on_GitHub-blue?logo=GitHub)](https://github.com/mongodb-partners/maap-framework) | The MAAP framework is a set of libraries that you can use to build your RAG Application using MongoDB and Atlas Vector Search and associated MAAP partners | | **MongoDB and BuildShip Agents** | MongoDB Atlas, BuildShip low-code, Anthropic | [![GitHub](https://img.shields.io/badge/GitHub-View_on_GitHub-blue?logo=GitHub)](https://github.com/mongodb-developer/GenAI-Showcase/blob/main/snippets/low-code/BuildShip.md) | This guide demonstrates how to create an AI agent for handling rental booking workflows using BuildShip's no-code platform with MongoDB Aggregation and Insert integrations. | -| **Realtime Voice OpenAI API and Atlas Vector Search Rental Agent** | OpenAI, Atlas , Python , React | [![GitHub](https://img.shields.io/badge/GitHub-View_on_GitHub-blue?logo=GitHub)](https://github.com/mongodb-developer/voice-openai-mongo-rentals-agent?tab=readme-ov-file)|Sample application that use OpenAI Realtime API and MongoDB Atlas vector/CRUD as tools for a full voice based rental assistant. | +| **Realtime Voice OpenAI API and Atlas Vector Search Rental Agent** | OpenAI, Atlas , Python , React | [![GitHub](https://img.shields.io/badge/GitHub-View_on_GitHub-blue?logo=GitHub)](https://github.com/mongodb-developer/voice-openai-mongo-rentals-agent?tab=readme-ov-file)|Sample application that use OpenAI Realtime API and MongoDB Atlas vector/CRUD as tools for a full voice based rental assistant. | ## Evaluations