Nota
Este tutorial utiliza LangChain Biblioteca de PythonPara ver un tutorial que utiliza la biblioteca JavaScript, consulte Comience a utilizar la integración de LangChain JS/TS.
Puede integrar MongoDB Vector Search con LangChain para crear aplicaciones LLM e implementar la generación aumentada por recuperación (RAG). Este tutorial muestra cómo empezar a usar MongoDB Vector Search con LangChain para realizar búsquedas semánticas en sus datos y crear una Implementación deRAG. En concreto, se realizan las siguientes acciones:
Configura el entorno.
Almacenar datos personalizados en MongoDB.
Cree un índice de búsqueda vectorial 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 simplifica la creación de aplicaciones LLM mediante el uso de cadenas. Estas cadenas son componentes específicos de LangChain que pueden combinarse para diversos casos de uso de IA, incluyendo 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 API de Voyage AI. Para crear una clave API, consulta Claves API de modelos.
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
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 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,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.
Utilice MongoDB como almacén de vectores
Luego, cargue datos personalizados en MongoDB e instancie su clúster de MongoDB como una base de datos vectorial, también llamada almacén vectorial. Copie y pegue los siguientes fragmentos de código en su notebook.
Cargue los datos de muestra.
Para este tutorial, utilizará un documento PDF de acceso público sobre un informe de ganancias reciente de MongoDB como fuente de datos para su tienda de vectores.
Para cargar los datos de muestra, ejecute el siguiente fragmento de código. Hace 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 del fragmento, que determinan la cantidad de caracteres en cada documento y la cantidad 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 el almacén de vectores.
Ejecute el siguiente código para crear una instancia de almacén de vectores llamada vector_store a partir de los documentos de ejemplo. Este fragmento especifica lo siguiente:
La cadena de conexión a su clúster 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 utilizar para consultar el almacén 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.
Ejecute el siguiente código en su notebook para el método que prefiera. La definición del índice especifica la indexación de los siguientes campos:
embeddingcampo como tipo de vector. Elembeddingcampo contiene las incrustaciones creadas con elvoyage-3-largemodelo de incrustación de Voyage AI. La definición del índice especifica las1024dimensiones del vector y mide la similitudcosinemediante.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 consulta utiliza el método similarity_search para realizar una búsqueda semántica básica de la cadena 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 consulta utiliza el método similarity_search_with_score para realizar una búsqueda semántica de la cadena MongoDB acquisition y especifica el parámetro k para limitar la cantidad 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 1y.
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
Usted especificó el page_label campo como filtro cuando creó 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 prefiltro en el
page_labelcampo que utiliza el$eqoperador para hacer coincidir los documentos que aparecen 2 solo en la página.
Devuelve los tres documentos más relevantes de la página 2 y una puntuación de relevancia entre 0 1y.
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 los métodos de búsqueda semántica, consulte la referencia de API.
Responda preguntas sobre sus datos
Esta sección muestra cómo implementar RAG en su aplicación con MongoDB Vector Search y LangChain. Ahora que ha utilizado MongoDB Vector Search para recuperar documentos semánticamente similares, ejecute los siguientes ejemplos de código para solicitar al LLM que responda preguntas basadas en esos documentos.
Este ejemplo hace lo siguiente:
Crea una instancia de MongoDB Vector Search como recuperador para consultar documentos similares, incluido el
kparámetro opcional para buscar solo los10documentos más relevantes.
Define una plantilla de solicitud de LangChain para indicar al LLM que utilice estos documentos como contexto para su consulta. LangChain pasa estos documentos a la
{context}variable de entrada y su consulta a la{question}variable.Construye una cadena que especifica lo siguiente:
MongoDB Vector Search como recuperador para buscar documentos para usar como contexto.
La plantilla de aviso que usted definió.
El modelo de chat
gpt-4ode OpenAI para generar una respuesta consciente del contexto.
Invoca la cadena con una consulta de muestra.
Devuelve la respuesta del LLM y los documentos utilizados como contexto. La respuesta generada puede 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 hace lo siguiente:
Crea una instancia de MongoDB Vector Search como un recuperador para consultar documentos similares, incluidos los siguientes parámetros opcionales:
kpara buscar sólo los10documentos más relevantes.score_thresholdutilizar únicamente documentos con un puntaje 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 solicitud de LangChain para indicar al LLM que utilice estos documentos como contexto para su consulta. LangChain pasa estos documentos a la
{context}variable de entrada y su consulta a la{question}variable.Construye una cadena que especifica lo siguiente:
MongoDB Vector Search como recuperador para buscar documentos para usar como contexto.
La plantilla de aviso que usted definió.
El modelo de chat
gpt-4ode OpenAI para generar una respuesta consciente del contexto.
Invoca la cadena con una consulta de muestra.
Devuelve la respuesta del LLM y los documentos utilizados como contexto. La respuesta generada puede 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