Nota
Este tutorial utiliza el Biblioteca de Python. Para un tutorial que utiliza la librería de JavaScript, consulta Comience a utilizar la integración de LangChain JS/TS.
Puedes integrar MongoDB Vector Search con LangChain para compilar aplicaciones de LLM e implementar la generación de recuperación aumentada (RAG). Este tutorial demuestra cómo empezar a usar MongoDB Vector Search con LangChain para realizar búsqueda semántica en tus datos y compilar un RAG implementation. Específicamente, realizas las siguientes acciones:
Configura el entorno.
Almacene datos personalizados en MongoDB.
Cree un índice de Búsqueda Vectorial de MongoDB en sus datos.
Ejecuta las siguientes consultas de búsqueda vectorial:
búsqueda semántica.
Búsqueda semántica con puntuación.
Búsqueda semántica con prefiltrado de metadatos.
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
LangChain es un framework de código abierto que permite desarrollar aplicaciones LLM de manera sencilla usando las "cadenas". Las cadenas son componentes específicos de LangChain que pueden combinarse para diversos casos de uso de IA, incluido RAG.
Al integrar MongoDB Vector Search con LangChain, 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 Generación Aumentada por Recuperación (RAG) con MongoDB.
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 clave de la API de Voyage IA. Para crear una clave de API, consulta Claves de API del modelo.
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 entorno para ejecutar cuadernos interactivos de 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 langchain langchain-community langchain-core langchain-mongodb langchain-voyageai langchain-openai langchain-text-splitters pymongo pypdf
Luego, ejecute el siguiente código para importar los paquetes requeridos:
import os, pymongo, pprint from langchain_community.document_loaders import PyPDFLoader from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain_mongodb import MongoDBAtlasVectorSearch from langchain_voyageai import VoyageAIEmbeddings from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from langchain_text_splitters import RecursiveCharacterTextSplitter from pymongo import MongoClient from pymongo.operations import SearchIndexModel
Defina variables de entorno.
Ejecute el siguiente código, reemplazando los marcadores de posición con los siguientes valores:
Tu clave de API de Voyage IA y 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>" MONGODB_URI = "<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.
Usa MongoDB como Vector Store
Luego, carga datos personalizados en MongoDB e instancie su clúster MongoDB como una base de datos vectorial, también llamada vector store. Copia y pega los siguientes fragmentos de código en tu cuaderno.
Cargue los datos de muestra.
Para este tutorial, se utiliza un documento PDF accesible al público sobre un reciente informe de resultados de MongoDB como fuente de datos para tu vector store.
Para cargar los datos de muestra, ejecutar el siguiente snippet. Se encarga de lo siguiente:
Recupera el PDF de la URL especificada y carga los datos de texto sin procesar.
Utiliza un divisor de texto para dividir los datos en documentos más pequeños.
Especifica los parámetros de fragmentos, lo que determina el número de caracteres en cada documento y el número de caracteres que deben superponerse entre dos documentos consecutivos.
# Load the PDF loader = PyPDFLoader("https://investors.mongodb.com/node/13176/pdf") data = loader.load() # Split PDF into documents text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=20) docs = text_splitter.split_documents(data) # Print the first document docs[0]
Document(metadata={'producer': 'West Corporation using ABCpdf', 'creator': 'PyPDF', 'creationdate': '2025-03-05T21:06:26+00:00', 'title': 'MongoDB, Inc. Announces Fourth Quarter and Full Year Fiscal 2025 Financial Results', 'source': 'https://investors.mongodb.com/node/13176/pdf', 'total_pages': 9, 'page': 0, 'page_label': '1'}, page_content='MongoDB, Inc. Announces Fourth Quarter and Full Year Fiscal 2025 Financial Results\nMarch 5, 2025\nFourth Quarter Fiscal 2025 Total Revenue of $548.4 million, up 20% Year-over-Year')
Instanciar la tienda de vectores.
Ejecuta el siguiente código para crear una instancia de tienda de vectores llamada vector_store desde los documentos de muestra. Este snippet especifica lo siguiente:
La cadena de conexión a tu clúster de MongoDB.
langchain_db.testcomo el espacio de nombres MongoDB para almacenar los documentos.El modelo de incrustación
voyage-3-largede Voyage AI. para convertir el texto en incrustaciones vectoriales para el campoembedding.vector_indexcomo el índice a usar para consultar la tienda de vectores.
# Instantiate the vector store using your MongoDB connection string vector_store = MongoDBAtlasVectorSearch.from_connection_string( connection_string = MONGODB_URI, namespace = "langchain_db.test", embedding = VoyageAIEmbeddings(model="voyage-3-large"), index_name = "vector_index" ) # Add documents to the vector store vector_store.add_documents(documents=docs)
Después de ejecutar el código de ejemplo, si usas Atlas, puedes verificar tus incrustaciones vectoriales navegando al namespace langchain_db.test en la Interfaz de Usuario de Atlas.
Cree el índice de búsqueda vectorial de MongoDB
Para habilitar consultas de búsqueda de vectores en su almacén de vectores, cree un índice de búsqueda de vectores de MongoDB en la colección langchain_db.test utilizando el método auxiliar LangChain o el método controlador de PyMongo.
Ejecuta el siguiente código en tu cuaderno para tu método preferido. La definición del índice especifica la indexación de los siguientes campos:
embeddingcampo como el tipo de vector. El campoembeddingcontiene los embeddings creados mediante el modelo de embeddingsvoyage-3-largede Voyage AI. La definición del índice especifica1024dimensiones de vectores y mide la similitud usandocosine.page_labelcampo como el tipo filtro para prefiltrar datos por el número de página en el PDF.
# Use helper method to create the vector search index vector_store.create_vector_search_index( dimensions = 1024, # The number of vector dimensions to index filters = [ "page_label" ] )
# Connect to your cluster client = MongoClient(MONGODB_URI) collection = client["langchain_db"]["test"] # Create your vector search index model, then create the index search_index_model = SearchIndexModel( definition={ "fields": [ { "type": "vector", "path": "embedding", "numDimensions": 1024, "similarity": "cosine" }, { "type": "filter", "path": "page_label" } ] }, 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.
Ejecución de consultas de búsqueda vectorial
Una vez que MongoDB construya su índice, ejecute consultas de búsqueda vectorial en sus datos. Los siguientes ejemplos demuestran diversas queries que puedes ejecutar en tus datos vectorizados.
La siguiente query utiliza el método similarity_search para realizar una búsqueda semántica básica de la string MongoDB acquisition. Devuelve una lista de documentos ordenados por relevancia.
query = "MongoDB acquisition" results = vector_store.similarity_search(query) pprint.pprint(results)
[Document(id='67f0259b8bb2babc06924409', metadata={ ... }, page_content='SOURCE MongoDB, Inc.'), Document(id='67f0259b8bb2babc0692432f', metadata={ ... }, page_content='MongoDB platform. In fiscal year 2026 we expect to see stable consumption growth in Atlas, our main growth driver," said Dev Ittycheria, President\nand Chief Executive Officer of MongoDB .'), Document(id='67f0259b8bb2babc06924355', metadata={ ... }, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), Document(id='67f0259b8bb2babc069243a6', metadata={ ... }, page_content="MongoDB's unified, intelligent data platform was built to power the next generation of applications, and MongoDB is the most widely available, globally")]
La siguiente query usa el método similarity_search_with_score para realizar una búsqueda semántica de la string MongoDB acquisition y especifica el parámetro k para limitar el número de documentos a devolver a 3.
Nota
El parámetro k en este ejemplo se refiere a la opción de método similarity_search_with_score, no a la opción del operador knnBeta del mismo nombre.
Devuelve los tres documentos más relevantes y una puntuación de relevancia entre 0 y 1.
query = "MongoDB acquisition" results = vector_store.similarity_search_with_score( query = query, k = 3 ) pprint.pprint(results)
[(Document(id='67f0259b8bb2babc06924409', metadata={ ... }, page_content='SOURCE MongoDB, Inc.'), 0.8193451166152954), (Document(id='67f0259b8bb2babc0692432f', metadata={ ... }, page_content='MongoDB platform. In fiscal year 2026 we expect to see stable consumption growth in Atlas, our main growth driver," said Dev Ittycheria, President\nand Chief Executive Officer of MongoDB .'), 0.7815237045288086), (Document(id='67f0259b8bb2babc06924355', metadata={ ... }, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), 0.7788857221603394)]
Puedes prefiltrar tus datos utilizando una expresión de coincidencia MQL que compare el campo indexado con otro valor de tu colección. Debes indexar cualquier campo de metadatos que desees filtrar como tipo filter. Para obtener más información, consulta Cómo indexar campos para la búsqueda vectorial.
Nota
Especificaste el campo page_label como filtro cuando creaste el índice para este tutorial.
La siguiente consulta utiliza el método similarity_search_with_score para realizar una búsqueda semántica de la cadena MongoDB acquisition. También especifica lo siguiente:
El parámetro
kpara limitar el número de documentos a devolver a3.Un filtro previo en el campo
page_labelque utiliza el operador$eqpara hacer coincidir los documentos que aparecen solo en la página 2.
Devuelve los tres documentos más relevantes de la página 2 y una puntuación de relevancia entre 0 y 1.
query = "MongoDB acquisition" results = vector_store.similarity_search_with_score( query = query, k = 3, pre_filter = { "page_label": { "$eq": 2 } } ) pprint.pprint(results)
[(Document(id='67f0259b8bb2babc06924355', metadata={ ... 'page_label': '2'}, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), 0.7788857221603394), (Document(id='67f0259b8bb2babc06924351', metadata={ ... 'page_label': '2'}, page_content='Measures."\nFourth Quarter Fiscal 2025 and Recent Business Highlights\nMongoDB acquired Voyage AI, a pioneer in state-of-the-art embedding and reranking models that power next-generation'), 0.7606035470962524), (Document(id='67f0259b8bb2babc06924354', metadata={ ... 'page_label': '2'}, page_content='data.\nMongoDB completed the redemption of 2026 Convertible Notes, eliminating all debt from the balance sheet. Additionally, in'), 0.7583936452865601)]
Tip
Para obtener una lista completa de métodos de búsqueda semántica, consulta la referencia de API.
Responde preguntas sobre tus datos
Esta sección demuestra cómo implementar RAG en tu aplicación con MongoDB Vector Search y LangChain. Ahora que has utilizado la Búsqueda Vectorial de MongoDB para recuperar documentos semánticamente similares, ejecuta los siguientes ejemplos de código para solicitarle al LLM que responda preguntas basadas en esos documentos.
Este ejemplo realiza lo siguiente:
Instancia la MongoDB Vector Search como un recuperador para hacer query de documentos similares, incluido el parámetro opcional
kpara la búsqueda de solo los10documentos más relevantes.
Define una plantilla de prompt de LangChain para instruir al LLM para que utilice estos documentos como contexto para tu query. LangChain pasa estos documentos al
{context}variable de entrada y tu query al{question}variable.Construye una cadena que especifica lo siguiente:
MongoDB Vector Search como el recuperador para buscar documentos que se utilizarán como contexto.
La plantilla de prompt que definiste.
El modelo de chat
gpt-4ode OpenAI para generar una respuesta contextualizada.
Invoca la cadena con una consulta de muestra.
Devuelve la respuesta del LLM y los documentos utilizados como contexto. La respuesta generada podría variar.
# Instantiate MongoDB Vector Search as a retriever retriever = vector_store.as_retriever( search_type = "similarity", search_kwargs = { "k": 10 } ) # Define a prompt template template = """ Use the following pieces of context to answer the question at the end. {context} Question: {question} """ prompt = PromptTemplate.from_template(template) model = ChatOpenAI(model="gpt-4o") # Construct a chain to answer questions on your data chain = ( { "context": retriever, "question": RunnablePassthrough()} | prompt | model | StrOutputParser() ) # Prompt the chain question = "What was MongoDB's latest acquisition?" answer = chain.invoke(question) print("Question: " + question) print("Answer: " + answer) # Return source documents documents = retriever.invoke(question) print("\nSource documents:") pprint.pprint(documents)
Question: What was MongoDB's latest acquisition? Answer: MongoDB's latest acquisition was Voyage AI, a pioneer in state-of-the-art embedding and reranking models. Source documents: [Document(id='67f0259b8bb2babc06924409', metadata={'_id': '67f0259b8bb2babc06924409', ... 'page_label': '9'}, page_content='SOURCE MongoDB, Inc.'), Document(id='67f0259b8bb2babc06924351', metadata={'_id': '67f0259b8bb2babc06924351', ... 'page_label': '2'}, page_content='Measures."\nFourth Quarter Fiscal 2025 and Recent Business Highlights\nMongoDB acquired Voyage AI, a pioneer in state-of-the-art embedding and reranking models that power next-generation'), Document(id='67f0259b8bb2babc0692432f', metadata={'_id': '67f0259b8bb2babc0692432f', ... 'page_label': '1'}, page_content='MongoDB platform. In fiscal year 2026 we expect to see stable consumption growth in Atlas, our main growth driver," said Dev Ittycheria, President\nand Chief Executive Officer of MongoDB .'), Document(id='67f0259b8bb2babc06924355', metadata={'_id': '67f0259b8bb2babc06924355', ... 'page_label': '2'}, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), Document(id='67f0259b8bb2babc069243a6', metadata={'_id': '67f0259b8bb2babc069243a6', ... 'page_label': '4'}, page_content="MongoDB's unified, intelligent data platform was built to power the next generation of applications, and MongoDB is the most widely available, globally"), Document(id='67f0259b8bb2babc06924329', metadata={'_id': '67f0259b8bb2babc06924329', ... 'page_label': '1'}, page_content='MongoDB, Inc. Announces Fourth Quarter and Full Year Fiscal 2025 Financial Results\nMarch 5, 2025\nFourth Quarter Fiscal 2025 Total Revenue of $548.4 million, up 20% Year-over-Year'), Document(id='67f0259b8bb2babc069243a7', metadata={'_id': '67f0259b8bb2babc069243a7', ... 'page_label': '4'}, page_content='distributed database on the market. With integrated capabilities for operational data, search, real-time analytics, and AI-powered retrieval, MongoDB'), Document(id='67f0259b8bb2babc069243a5', metadata={'_id': '67f0259b8bb2babc069243a5', ... 'page_label': '4'}, page_content="Headquartered in New York, MongoDB's mission is to empower innovators to create, transform, and disrupt industries with software and data."), Document(id='67f0259b8bb2babc06924354', metadata={'_id': '67f0259b8bb2babc06924354', ... 'page_label': '2'}, page_content='data.\nMongoDB completed the redemption of 2026 Convertible Notes, eliminating all debt from the balance sheet. Additionally, in'), Document(id='67f0259b8bb2babc069243a9', metadata={'_id': '67f0259b8bb2babc069243a9', ... 'page_label': '4'}, page_content='50,000 customers across almost every industry—including 70% of the Fortune 100—rely on MongoDB for their most important applications. To learn\nmore, visit mongodb.com .\nInvestor Relations')]
Este ejemplo realiza lo siguiente:
Instancia MongoDB Vector Search como un recuperador para consultar documentos similares, incluyendo los siguientes parámetros opcionales:
kpara buscar únicamente los10documentos más relevantes.score_thresholdusar sólo los documentos con una puntuación de relevancia superior a0.75.Nota
Este parámetro se refiere a la puntuación de relevancia que Langchain utiliza para normalizar los resultados, y no a la puntuación de relevancia utilizada en las consultas de MongoDB Search. Para usar las puntuaciones de MongoDB Search en su implementación de RAG, defina un recuperador personalizado que utilice el
similarity_search_with_scoremétodo y filtre por la puntuación de MongoDB Search.pre_filterpara filtrar en el campopage_labellos documentos que aparecen sólo en la página 2.
Define una plantilla de prompt de LangChain para instruir al LLM para que utilice estos documentos como contexto para tu query. LangChain pasa estos documentos al
{context}variable de entrada y tu query al{question}variable.Construye una cadena que especifica lo siguiente:
MongoDB Vector Search como el recuperador para buscar documentos que se utilizarán como contexto.
La plantilla de prompt que definiste.
El modelo de chat
gpt-4ode OpenAI para generar una respuesta contextualizada.
Invoca la cadena con una consulta de muestra.
Devuelve la respuesta del LLM y los documentos utilizados como contexto. La respuesta generada podría variar.
# Instantiate MongoDB Vector Search as a retriever retriever = vector_store.as_retriever( search_type = "similarity", search_kwargs = { "k": 10, "score_threshold": 0.75, "pre_filter": { "page_label": { "$eq": 2 } } } ) # Define a prompt template template = """ Use the following pieces of context to answer the question at the end. {context} Question: {question} """ prompt = PromptTemplate.from_template(template) model = ChatOpenAI(model="gpt-4o") # Construct a chain to answer questions on your data chain = ( { "context": retriever, "question": RunnablePassthrough()} | prompt | model | StrOutputParser() ) # Prompt the chain question = "What was MongoDB's latest acquisition?" answer = rag_chain.invoke(question) print("Question: " + question) print("Answer: " + answer) # Return source documents documents = retriever.invoke(question) print("\nSource documents:") pprint.pprint(documents)
Question: What was MongoDB's latest acquisition? Answer: MongoDB's latest acquisition was Voyage AI, a pioneer in state-of-the-art embedding and reranking models. Source documents: [Document(id='67f0259b8bb2babc06924351', metadata={'_id': '67f0259b8bb2babc06924351', ... 'page_label': '2'}, page_content='Measures."\nFourth Quarter Fiscal 2025 and Recent Business Highlights\nMongoDB acquired Voyage AI, a pioneer in state-of-the-art embedding and reranking models that power next-generation'), Document(id='67f0259b8bb2babc06924355', metadata={'_id': '67f0259b8bb2babc06924355', ... 'page_label': '2'}, page_content='conjunction with the acquisition of Voyage, MongoDB is announcing a stock buyback program of $200 million, to offset the\ndilutive impact of the acquisition consideration.'), Document(id='67f0259b8bb2babc06924354', metadata={'_id': '67f0259b8bb2babc06924354', ... 'page_label': '2'}, page_content='data.\nMongoDB completed the redemption of 2026 Convertible Notes, eliminating all debt from the balance sheet. Additionally, in'), Document(id='67f0259b8bb2babc06924358', metadata={'_id': '67f0259b8bb2babc06924358', ... 'page_label': '2'}, page_content='Lombard Odier, a Swiss private bank, partnered with MongoDB to migrate and modernize its legacy banking technology'), Document(id='67f0259b8bb2babc06924352', metadata={'_id': '67f0259b8bb2babc06924352', ... 'page_label': '2'}, page_content="AI applications. Integrating Voyage AI's technology with MongoDB will enable organizations to easily build trustworthy,"), Document(id='67f0259b8bb2babc0692435a', metadata={'_id': '67f0259b8bb2babc0692435a', ... 'page_label': '2'}, page_content='applications from a legacy relational database to MongoDB 20 times faster than previous migrations.\nFirst Quarter and Full Year Fiscal 2026 Guidance'), Document(id='67f0259b8bb2babc06924356', metadata={'_id': '67f0259b8bb2babc06924356', ... 'page_label': '2'}, page_content='For the third consecutive year, MongoDB was named a Leader in the 2024 Gartner® Magic Quadrant™ for Cloud'), Document(id='67f0259b8bb2babc0692434d', metadata={'_id': '67f0259b8bb2babc0692434d', ... 'page_label': '2'}, page_content='compared to $121.5 million of cash from operations in the year-ago period. MongoDB used $29.6 million of cash in capital'), Document(id='67f0259b8bb2babc0692434c', metadata={'_id': '67f0259b8bb2babc0692434c', ... 'page_label': '2'}, page_content='Cash Flow: During the year ended January 31, 2025, MongoDB generated $150.2 million of cash from operations,'), Document(id='67f0259b8bb2babc06924364', metadata={'_id': '67f0259b8bb2babc06924364', ... 'page_label': '2'}, page_content='MongoDB will host a conference call today, March 5, 2025, at 5:00 p.m. (Eastern Time) to discuss its financial results and business outlook. A live')]
Aprende observando
Siga este video tutorial para obtener más información sobre la búsqueda semántica y RAG con LangChain y MongoDB.
Duración: 8 minutos