Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Comience a utilizar la integración de Haystack

Puedes integrar MongoDB Vector Search con Haystack para compilar aplicaciones personalizadas con LLMs e implementan la generación de recuperación aumentada (RAG). Este tutorial demuestra cómo comenzar a utilizar MongoDB Vector Search con Haystack para realizar búsquedas semánticas en tus datos y compilar una implementación de RAG. Específicamente, realizas las siguientes acciones:

  1. Configura el entorno.

  2. Crea un índice de MongoDB Vector Search.

  3. Almacene datos personalizados en MongoDB.

  4. 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.

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.

Para completar este tutorial, debes tener lo siguiente:

  • Uno de los siguientes tipos de clúster de MongoDB:

  • 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 de la API de Voyage IA. Para crear una clave de API, consulta Claves de API del modelo.

  • Un cuaderno para ejecutar tu proyecto de Python, como Colab.

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:

1
  1. Ejecuta el siguiente comando:

    pip install --quiet --upgrade mongodb-atlas-haystack voyage-embedders-haystack pymongo
  2. Ejecuta 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
2

Ejecute el siguiente código, reemplazando los marcadores de posición con los siguientes valores:

  • Tu clave de la API de Voyage IA.

  • 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, consulta Conectar a un clúster a través de bibliotecas de clientes.

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.

En esta sección, creas la base de datos haystack_db y la colección test para almacenar tus datos personalizados. Luego, para habilitar las consultas de búsqueda vectorial en tus datos, creas un índice de MongoDB Vector Search.

1
client = MongoClient(os.environ.get("MONGO_CONNECTION_STRING"))
2

Ejecute el siguiente código para crear la base de datos haystack_db y la 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]
3

Ejecute el siguiente código para crear un índice del tipo vectorSearch. El campo embedding contiene los embeddings que crearás utilizando el modelo de embedding voyage-3-large de Voyage AI. La definición del índice especifica 1024 dimensiones de vectores y mide la similitud usando cosine.

# 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.

En esta sección, instancias MongoDB como una base de datos vectorial, también llamada almacén de documentos. Luego, creas modelos vectoriales a partir de datos personalizados y almacenas estos documentos en una colección en MongoDB. Pegue y ejecute los siguientes snippets de código en su cuaderno.

1

Ejecuta el siguiente código para instanciar Atlas como un almacén de documentos. Este código establece una conexión con tu clúster de Atlas y especifica lo siguiente:

  • haystack_db y test como la base de datos y la colección de Atlas utilizadas para almacenar los documentos.

  • vector_index como 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
)
2

Este código define algunos documentos de muestra y ejecuta una canalización con los siguientes componentes:

  • Un integrador de OpenAI para convertir tu documento en integraciones de vectores.

  • 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.

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:

En este ejemplo, se pide al LLM la query de muestra Where does Mark live?. El LLM genera una respuesta precisa y consciente del contexto a partir de los datos personalizados que almacenaste 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.

Para completar este tutorial, debes tener lo siguiente:

  • Uno de los siguientes tipos de clúster de MongoDB:

  • 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 tu proyecto de Python, como Colab.

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:

1
  1. Ejecuta el siguiente comando:

    pip install --quiet --upgrade mongodb-atlas-haystack pymongo
  2. Ejecuta 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
2

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, consulta Conectar a un clúster a través de bibliotecas de clientes.

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.

En esta sección, creas la base de datos haystack_db y la colección test para almacenar tus datos personalizados. Luego, para habilitar las consultas de búsqueda vectorial en tus datos, creas un índice de MongoDB Vector Search.

1
client = MongoClient(os.environ.get("MONGO_CONNECTION_STRING"))
2

Ejecute el siguiente código para crear la base de datos haystack_db y la 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]
3

Ejecute el siguiente código para crear un índice del tipo vectorSearch. El campo embedding contiene los embebidos que crearás usando el modelo de embeddings text-embedding-ada-002 de OpenAI. La definición del índice especifica 1536 dimensiones de vectores y mide la similitud usando cosine.

# 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.

En esta sección, instancias MongoDB como una base de datos vectorial, también llamada almacén de documentos. Luego, creas modelos vectoriales a partir de datos personalizados y almacenas estos documentos en una colección en MongoDB. Pegue y ejecute los siguientes snippets de código en su cuaderno.

1

Ejecuta el siguiente código para instanciar Atlas como un almacén de documentos. Este código establece una conexión con tu clúster de Atlas y especifica lo siguiente:

  • haystack_db y test como la base de datos y la colección de Atlas utilizadas para almacenar los documentos.

  • vector_index como 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
)
2

Este código define algunos documentos de muestra y ejecuta una canalización con los siguientes componentes:

  • Un integrador de OpenAI para convertir tu documento en integraciones de vectores.

  • 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.

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:

En este ejemplo, se pide al LLM la query de muestra Where does Mark live?. El LLM genera una respuesta precisa y consciente del contexto a partir de los datos personalizados que almacenaste 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.

MongoDB también proporciona los siguientes recursos para desarrolladores:

Volver

Integración de C#

En esta página