Puede integrar MongoDB Vector Search con Haystack para crear aplicaciones personalizadas con LLMe implementar la generación aumentada por recuperación (RAG). Este tutorial muestra cómo empezar a usar MongoDB Vector Search con Haystack para realizar búsquedas semánticas en sus datos y crear una implementación de RAG. En concreto, se realizan las siguientes acciones:
Configura el entorno.
Crear un índice de búsqueda vectorial de MongoDB.
Almacenar datos personalizados en MongoDB.
Implementa RAG usando la búsqueda vectorial de MongoDB para responder preguntas sobre tus datos.
Trabaja con una versión ejecutable de este tutorial como un cuaderno interactivo de Python.
Segundo plano
Haystack es un framework para crear aplicaciones personalizadas con LLM,modelos de incrustación y búsqueda vectorial. Al integrar MongoDB Vector Search con Haystack, puede usar MongoDB como base de datos vectorial y usar MongoDB Vector Search para implementar RAG recuperando documentos semánticamente similares de sus datos. Para obtener más información sobre RAG, consulte Recuperación-Generación Aumentada (RAG) con MongoDB.
Procedimiento
Requisitos previos
Para completar este tutorial, debes tener lo siguiente:
Uno de los siguientes tipos de clúster de MongoDB:
Un clúster de Atlas que ejecuta la versión 6.0.11, 7.0.2 o posterior de MongoDB. Asegúrese de que su dirección IP esté incluida en la lista de acceso de su proyecto Atlas.
Una implementación local de Atlas creada usando Atlas CLI. Para obtener más información, consulta Crear una Implementación local de Atlas.
Un clúster de MongoDB Community o Enterprise con Search y Vector Search instalados.
Una llave de API de OpenAI. Debes tener una cuenta de OpenAI con créditos disponibles para las solicitudes de API. Para obtener más información sobre cómo registrar una cuenta de OpenAI, consulta el sitio web de la API de OpenAI.
Una clave API de Voyage AI. Para crear una clave API, consulta Claves API de modelos.
Un cuaderno para ejecutar su proyecto Python, como Colab.
Configurar el entorno
Configura el entorno para este tutorial. Crea un cuaderno interactivo de Python guardando un archivo con el .ipynb Extensión. Este cuaderno te permite ejecutar fragmentos de código Python individualmente y lo usarás para ejecutar el código en este tutorial.
Para configurar el entorno de su portátil:
Instala e importa las dependencias.
Ejecuta el siguiente comando:
pip install --quiet --upgrade mongodb-atlas-haystack voyage-embedders-haystack pymongo Ejecute el siguiente código para importar los paquetes necesarios:
import os from haystack import Pipeline, Document from haystack.document_stores.types import DuplicatePolicy from haystack.components.writers import DocumentWriter from haystack.components.generators import OpenAIGenerator from haystack.components.builders.prompt_builder import PromptBuilder from haystack_integrations.components.embedders.voyage_embedders import VoyageDocumentEmbedder, VoyageTextEmbedder from haystack_integrations.document_stores.mongodb_atlas import MongoDBAtlasDocumentStore from haystack_integrations.components.retrievers.mongodb_atlas import MongoDBAtlasEmbeddingRetriever from pymongo import MongoClient from pymongo.operations import SearchIndexModel
Definir variables de entorno.
Ejecute el siguiente código, reemplazando los marcadores de posición con los siguientes valores:
Su clave API de Voyage AI.
Su clave API de OpenAI.
La cadena de conexión de su clúster MongoDB.
os.environ["VOYAGE_API_KEY"] = "<voyage-api-key>" os.environ["OPENAI_API_KEY"] = "<openai-api-key>" os.environ["MONGO_CONNECTION_STRING"]= "<connection-string>"
Nota
Se debe sustituir <connection-string> por la cadena de conexión del clúster Atlas o de la implementación local de Atlas.
Su cadena de conexión debe usar el siguiente formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Para obtener más información,consulte Conectarse a un clúster a través de bibliotecas de cliente.
Su cadena de conexión debe usar el siguiente formato:
mongodb://localhost:<port-number>/?directConnection=true
Para obtener más información, consulta Cadenas de conexión.
Cree el índice de búsqueda vectorial de MongoDB
En esta sección, creará la base de datos haystack_db y la colección test para almacenar sus datos personalizados. A continuación, para habilitar las consultas de búsqueda vectorial en sus datos, creará un índice de búsqueda vectorial de MongoDB.
Crea la haystack_db.test colección.
Ejecute el siguiente código para crear su base de datos haystack_db y su colección test.
# Create your database and collection db_name = "haystack_db" collection_name = "test" database = client[db_name] database.create_collection(collection_name) # Define collection collection = client[db_name][collection_name]
Define el índice de búsqueda vectorial de AMongDB.
Ejecute el siguiente código para crear un índice de tipo vectorSearch. El embedding campo contiene las incrustaciones que creará utilizando el voyage-3-large modelo de incrustación de Voyage AI. La definición del índice especifica las 1024 dimensiones del vector y mide la similitud cosine mediante.
# Create your index model, then create the search index search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1024, "similarity": "cosine" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=search_index_model)
El índice debería tardar aproximadamente un minuto en crearse. Mientras se crea, el índice está en un estado de sincronización inicial. Cuando termine de crearse, se pueden empezar a realizar los query en los datos de la colección.
Almacenar datos personalizados en MongoDB
En esta sección, instanciará MongoDB como una base de datos vectorial, también llamada almacén de documentos. Luego, creará incrustaciones vectoriales a partir de datos personalizados y almacenará estos documentos en una colección en MongoDB. Pegue y ejecute los siguientes fragmentos de código en su notebook.
Instanciar Atlas como un almacén de documentos.
Ejecute el siguiente código para crear una instancia de Atlas como almacén de documentos. Este código establece una conexión con su clúster de Atlas y especifica lo siguiente:
haystack_dbytestcomo la base de datos Atlas y la colección utilizada para almacenar los documentos.vector_indexcomo el índice utilizado para ejecutar consultas de búsqueda semántica.
document_store = MongoDBAtlasDocumentStore( database_name="haystack_db", collection_name="test", vector_search_index="vector_index", full_text_search_index="search_index" # Declared but not used in this example )
Cargue datos de muestra en su clúster Atlas.
Este código define algunos documentos de muestra y ejecuta una canalización con los siguientes componentes:
Un incrustador de OpenAI para convertir su documento en incrustaciones vectoriales.
Un escritor de documentos para llenar el almacén de documentos con los documentos de muestra y sus embeddings.
# Create some example documents documents = [ Document(content="My name is Jean and I live in Paris."), Document(content="My name is Mark and I live in Berlin."), Document(content="My name is Giorgio and I live in Rome."), ] # Initializing a document embedder to convert text content into vectorized form. doc_embedder = VoyageDocumentEmbedder() # Setting up a document writer to handle the insertion of documents into the MongoDB collection. doc_writer = DocumentWriter(document_store=document_store, policy=DuplicatePolicy.SKIP) # Creating a pipeline for indexing documents. The pipeline includes embedding and writing documents. indexing_pipe = Pipeline() indexing_pipe.add_component(instance=doc_embedder, name="doc_embedder") indexing_pipe.add_component(instance=doc_writer, name="doc_writer") # Connecting the components of the pipeline for document flow. indexing_pipe.connect("doc_embedder.documents", "doc_writer.documents") # Running the pipeline with the list of documents to index them in MongoDB. indexing_pipe.run({"doc_embedder": {"documents": documents}})
Calculating embeddings: 100%|██████████| 1/1 [00:00<00:00, 4.42it/s] {'doc_embedder': {'meta': {'total_tokens': 32}}, 'doc_writer': {'documents_written': 3}}
Tip
Después de ejecutar el código de ejemplo, si usas Atlas, puedes verificar tus incrustaciones vectoriales navegando al namespace haystack_db.test en la Interfaz de Usuario de Atlas.
Responda preguntas sobre sus datos
Esta sección demuestra cómo implementar RAG en su aplicación con MongoDB Vector Search y Haystack.
El siguiente código define y ejecuta una canalización con los siguientes componentes:
El incrustador OpenAITextEmbedder para crear incrustaciones a partir de su consulta.
El recuperador MongoDBAtlasEmbeddingRetriever para recuperar incrustaciones de su almacén de documentos que sean similares a la incrustación de consultas.
Un PromptBuilder que pasa una plantilla de solicitud para indicarle al LLM que utilice el documento recuperado como contexto para su solicitud.
El generador OpenAIGnerator para generar una respuesta consciente del contexto utilizando un LLM de OpenAI.
En este ejemplo, se solicita al LLM la consulta de ejemplo Where does Mark live?. El LLM genera una respuesta precisa y contextual a partir de los datos personalizados almacenados en Atlas.
# Template for generating prompts for a movie recommendation engine. prompt_template = """ You are an assistant allowed to use the following context documents.\nDocuments: {% for doc in documents %} {{ doc.content }} {% endfor %} \nQuery: {{query}} \nAnswer: """ # Setting up a retrieval-augmented generation (RAG) pipeline for generating responses. rag_pipeline = Pipeline() rag_pipeline.add_component("text_embedder", VoyageTextEmbedder()) # Adding a component for retrieving related documents from MongoDB based on the query embedding. rag_pipeline.add_component(instance=MongoDBAtlasEmbeddingRetriever(document_store=document_store,top_k=15), name="retriever") # Building prompts based on retrieved documents to be used for generating responses. rag_pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template, required_variables=["query", "documents"])) # Adding a language model generator to produce the final text output. rag_pipeline.add_component("llm", OpenAIGenerator()) # Connecting the components of the RAG pipeline to ensure proper data flow. rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding") rag_pipeline.connect("retriever", "prompt_builder.documents") rag_pipeline.connect("prompt_builder", "llm") # Run the pipeline query = "Where does Mark live?" result = rag_pipeline.run( { "text_embedder": {"text": query}, "prompt_builder": {"query": query}, }); print(result['llm']['replies'][0])
Mark lives in Berlin.
Requisitos previos
Para completar este tutorial, debes tener lo siguiente:
Uno de los siguientes tipos de clúster de MongoDB:
Un clúster de Atlas que ejecuta la versión 6.0.11, 7.0.2 o posterior de MongoDB. Asegúrese de que su dirección IP esté incluida en la lista de acceso de su proyecto Atlas.
Una implementación local de Atlas creada usando Atlas CLI. Para obtener más información, consulta Crear una Implementación local de Atlas.
Un clúster de MongoDB Community o Enterprise con Search y Vector Search instalados.
Una llave de API de OpenAI. Debes tener una cuenta de OpenAI con créditos disponibles para las solicitudes de API. Para obtener más información sobre cómo registrar una cuenta de OpenAI, consulta el sitio web de la API de OpenAI.
Un cuaderno para ejecutar su proyecto Python, como Colab.
Configurar el entorno
Configura el entorno para este tutorial. Cree un cuaderno interactivo de Python guardando un archivo con la extensión .ipynb. Este cuaderno te permite ejecutar snippets de código Python de forma individual y lo utilizarás para ejecutar el código en este tutorial.
Para configurar el entorno de su portátil:
Instala e importa las dependencias.
Ejecuta el siguiente comando:
pip install --quiet --upgrade mongodb-atlas-haystack pymongo Ejecute el siguiente código para importar los paquetes necesarios:
import os from haystack import Pipeline, Document from haystack.document_stores.types import DuplicatePolicy from haystack.components.writers import DocumentWriter from haystack.components.generators import OpenAIGenerator from haystack.components.builders.prompt_builder import PromptBuilder from haystack.components.embedders import OpenAITextEmbedder, OpenAIDocumentEmbedder from haystack_integrations.document_stores.mongodb_atlas import MongoDBAtlasDocumentStore from haystack_integrations.components.retrievers.mongodb_atlas import MongoDBAtlasEmbeddingRetriever from pymongo import MongoClient from pymongo.operations import SearchIndexModel
Definir variables de entorno.
Ejecute el siguiente código, reemplazando los marcadores de posición con los siguientes valores:
Su clave API de OpenAI.
La cadena de conexión de su clúster MongoDB.
os.environ["OPENAI_API_KEY"] = "<api-key>" os.environ["MONGO_CONNECTION_STRING"]= "<connection-string>"
Nota
Se debe sustituir <connection-string> por la cadena de conexión del clúster Atlas o de la implementación local de Atlas.
Su cadena de conexión debe usar el siguiente formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Para obtener más información,consulte Conectarse a un clúster a través de bibliotecas de cliente.
Su cadena de conexión debe usar el siguiente formato:
mongodb://localhost:<port-number>/?directConnection=true
Para obtener más información, consulta Cadenas de conexión.
Cree el índice de búsqueda vectorial de MongoDB
En esta sección, creará la base de datos haystack_db y la colección test para almacenar sus datos personalizados. A continuación, para habilitar las consultas de búsqueda vectorial en sus datos, creará un índice de búsqueda vectorial de MongoDB.
Crea la haystack_db.test colección.
Ejecute el siguiente código para crear su base de datos haystack_db y su colección test.
# Create your database and collection db_name = "haystack_db" collection_name = "test" database = client[db_name] database.create_collection(collection_name) # Define collection collection = client[db_name][collection_name]
Defina el índice de búsqueda vectorial de MongoDB.
Ejecute el siguiente código para crear un índice de tipo vectorSearch. El embedding campo contiene las incrustaciones que creará utilizando el text-embedding-ada-002 modelo de incrustación de OpenAI. La definición del índice especifica las 1536 dimensiones del vector y mide la similitud cosine mediante.
# Create your index model, then create the search index search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1536, "similarity": "cosine" } ] }, name="vector_index", type="vectorSearch" ) collection.create_search_index(model=search_index_model)
El índice debería tardar aproximadamente un minuto en crearse. Mientras se crea, el índice está en un estado de sincronización inicial. Cuando termine de crearse, se pueden empezar a realizar los query en los datos de la colección.
Almacenar datos personalizados en MongoDB
En esta sección, instanciará MongoDB como una base de datos vectorial, también llamada almacén de documentos. Luego, creará incrustaciones vectoriales a partir de datos personalizados y almacenará estos documentos en una colección en MongoDB. Pegue y ejecute los siguientes fragmentos de código en su notebook.
Instanciar Atlas como un almacén de documentos.
Ejecute el siguiente código para crear una instancia de Atlas como almacén de documentos. Este código establece una conexión con su clúster de Atlas y especifica lo siguiente:
haystack_dbytestcomo la base de datos Atlas y la colección utilizada para almacenar los documentos.vector_indexcomo el índice utilizado para ejecutar consultas de búsqueda semántica.
document_store = MongoDBAtlasDocumentStore( database_name="haystack_db", collection_name="test", vector_search_index="vector_index", full_text_search_index="search_index" # Declared but not used in this example )
Cargue datos de muestra en su clúster Atlas.
Este código define algunos documentos de muestra y ejecuta una canalización con los siguientes componentes:
Un incrustador de OpenAI para convertir su documento en incrustaciones vectoriales.
Un escritor de documentos para llenar el almacén de documentos con los documentos de muestra y sus embeddings.
# Create some example documents documents = [ Document(content="My name is Jean and I live in Paris."), Document(content="My name is Mark and I live in Berlin."), Document(content="My name is Giorgio and I live in Rome."), ] # Initializing a document embedder to convert text content into vectorized form. doc_embedder = OpenAIDocumentEmbedder() # Setting up a document writer to handle the insertion of documents into the MongoDB collection. doc_writer = DocumentWriter(document_store=document_store, policy=DuplicatePolicy.SKIP) # Creating a pipeline for indexing documents. The pipeline includes embedding and writing documents. indexing_pipe = Pipeline() indexing_pipe.add_component(instance=doc_embedder, name="doc_embedder") indexing_pipe.add_component(instance=doc_writer, name="doc_writer") # Connecting the components of the pipeline for document flow. indexing_pipe.connect("doc_embedder.documents", "doc_writer.documents") # Running the pipeline with the list of documents to index them in MongoDB. indexing_pipe.run({"doc_embedder": {"documents": documents}})
Calculating embeddings: 100%|██████████| 1/1 [00:00<00:00, 4.16it/s] {'doc_embedder': {'meta': {'model': 'text-embedding-ada-002', 'usage': {'prompt_tokens': 32, 'total_tokens': 32}}}, 'doc_writer': {'documents_written': 3}}
Tip
Después de ejecutar el código de ejemplo, si usas Atlas, puedes verificar tus incrustaciones vectoriales navegando al namespace haystack_db.test en la Interfaz de Usuario de Atlas.
Responda preguntas sobre sus datos
Esta sección demuestra cómo implementar RAG en su aplicación con MongoDB Vector Search y Haystack.
El siguiente código define y ejecuta una canalización con los siguientes componentes:
El incrustador OpenAITextEmbedder para crear incrustaciones a partir de su consulta.
El recuperador MongoDBAtlasEmbeddingRetriever para recuperar incrustaciones de su almacén de documentos que sean similares a la incrustación de consultas.
Un PromptBuilder que pasa una plantilla de solicitud para indicarle al LLM que utilice el documento recuperado como contexto para su solicitud.
El generador OpenAIGnerator para generar una respuesta consciente del contexto utilizando un LLM de OpenAI.
En este ejemplo, se solicita al LLM la consulta de ejemplo Where does Mark live?. El LLM genera una respuesta precisa y contextual a partir de los datos personalizados almacenados en Atlas.
# Template for generating prompts for a movie recommendation engine. prompt_template = """ You are an assistant allowed to use the following context documents.\nDocuments: {% for doc in documents %} {{ doc.content }} {% endfor %} \nQuery: {{query}} \nAnswer: """ # Setting up a retrieval-augmented generation (RAG) pipeline for generating responses. rag_pipeline = Pipeline() rag_pipeline.add_component("text_embedder", OpenAITextEmbedder()) # Adding a component for retrieving related documents from MongoDB based on the query embedding. rag_pipeline.add_component(instance=MongoDBAtlasEmbeddingRetriever(document_store=document_store,top_k=15), name="retriever") # Building prompts based on retrieved documents to be used for generating responses. rag_pipeline.add_component("prompt_builder", PromptBuilder(template=prompt_template, required_variables=["query", "documents"])) # Adding a language model generator to produce the final text output. rag_pipeline.add_component("llm", OpenAIGenerator()) # Connecting the components of the RAG pipeline to ensure proper data flow. rag_pipeline.connect("text_embedder.embedding", "retriever.query_embedding") rag_pipeline.connect("retriever", "prompt_builder.documents") rag_pipeline.connect("prompt_builder", "llm") # Run the pipeline query = "Where does Mark live?" result = rag_pipeline.run( { "text_embedder": {"text": query}, "prompt_builder": {"query": query}, }); print(result['llm']['replies'][0])
Mark lives in Berlin.
Próximos pasos
MongoDB también proporciona los siguientes recursos para desarrolladores: