Nota
Este tutorial utiliza la librería JavaScript de LangChain. Para un tutorial que utiliza la librería de Python, consulta LangChain Python.
Puedes integrar MongoDB Vector Search con LangChain para compilar aplicaciones LLM e implementar la generación de recuperación aumentada (RAG). Este tutorial muestra cómo comenzar a usar MongoDB Vector Search con LangChain para realizar una búsqueda semántica en tus datos y construir una implementación RAG. En concreto, llevas a cabo 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 prefiltrado de metadatos.
Búsqueda de relevancia marginal máxima (MMR).
Implementa RAG utilizando MongoDB búsqueda vectorial para responder preguntas sobre tus datos.
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 puede combinar para varios casos de uso de IA, incluido RAG.
Al integrar MongoDB Vector Search con LangChain, puedes utilizar MongoDB como una base de datos vectorial y utilizar MongoDB Vector Search para implementar RAG recuperando documentos semánticamente similares de tus datos. Para obtener más información sobre RAG, consulte Generación de recuperación aumentada (RAG) con MongoDB.
Requisitos previos
Para completar este tutorial, debes tener lo siguiente:
Uno de los siguientes tipos de clúster de MongoDB:
Se requiere un clúster de Atlas que ejecute MongoDB 6.0.11 versión, 7.0.2 o posterior. Asegúrese de que su dirección IP esté incluida en la lista de acceso de su proyecto de 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 API de Voyage IA. Para crear una clave API, consulta Claves API del modelo.
Nota
Tus solicitudes de API pueden fallar si no tienes un método de pago configurado en Atlas (para API key creado en la Interfaz de Usuario de Atlas) o Voyage AI (para API key creado directamente desde Voyage IA).
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 terminal y editor de código para ejecutar el proyecto de Node.js.
npm y Node.js instalados.
Configurar el entorno
Configura el entorno para este tutorial. Para configurar tu entorno, completa los siguientes pasos.
Actualiza tu archivo package.json.
El proyecto se debe configurar para usar módulos ES agregando "type": "module" al archivo package.json y luego guardándolo.
{ "type": "module", // other fields... }
Cree un archivo llamado get-started.js y pegue el siguiente código.
En su proyecto, cree un archivo llamado get-started.js, luego copie y pegue el siguiente código en el archivo. Deberá agregar código a este archivo a lo largo de todo el tutorial.
Este initial code snippet importa los paquetes necesarios para este tutorial, define variables de entorno y establece una conexión con tu MongoDB clúster.
import { MongoClient } from "mongodb"; import { MongoDBAtlasVectorSearch } from "@langchain/mongodb"; import { ChatOpenAI } from "@langchain/openai"; import { VoyageEmbeddings } from "@langchain/community/embeddings/voyage"; import { PDFLoader } from "@langchain/community/document_loaders/fs/pdf"; import { PromptTemplate } from "@langchain/core/prompts"; import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; import { RunnableSequence, RunnablePassthrough } from "@langchain/core/runnables"; import { StringOutputParser } from "@langchain/core/output_parsers"; import * as fs from 'fs'; process.env.VOYAGEAI_API_KEY = "<api-key>" process.env.OPENAI_API_KEY = "<api-key>"; process.env.MONGODB_URI = "<connection-string>"; const client = new MongoClient(process.env.MONGODB_URI); const formatDocumentsAsString = (docs) => docs.map(d => d.pageContent).join("\n\n");
Sustituye los valores de marcador de posición.
Para terminar de configurar el entorno, sustituye los valores de los marcadores de posición <api-key> y <connection-string> en get-started.js por tu clave API de Voyage IA, tu clave API de OpenAI y respectivamente la SRV cadena de conexión para tu clúster MongoDB. Tu cadena de conexión debe utilizar el siguiente formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Usa MongoDB como Vector Store
En esta sección, defines una función asíncrona para cargar datos personalizados en MongoDB e instanciar tu clúster de MongoDB como una base de datos vectorial, que también se llama almacén vectorial. Agrega el siguiente código a tu archivo get-started.js.
Nota
En este tutorial, se utiliza un documento PDF de acceso público titulado MongoDB Atlas mejores prácticas como fuente de datos para la tienda vectorial. Este documento describe varias recomendaciones y conceptos principales para gestionar tus implementaciones de MongoDB.
Este código realiza las siguientes acciones:
Configura tu colección de MongoDB especificando los siguientes parámetros:
langchain_db.testcomo la colección de MongoDB para almacenar los documentos.vector_indexcomo el índice a usar para consultar la tienda de vectores.textcomo el nombre del campo que contiene el contenido de texto sin formato.embeddingcomo el nombre del campo que contiene los vectores de incrustación.
Prepara tus datos personalizados de la siguiente manera:
Recupera datos sin procesar de la URL especificada y los guarda como PDF.
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.
Crea un almacén vectorial a partir de los documentos de muestra llamando al método
MongoDBAtlasVectorSearch.fromDocuments. Este método especifica los siguientes parámetros:Los documentos de muestra para almacenar en la base de datos vectorial.
El modelo de embedding de Voyage AI como el modelo utilizado para convertir texto en embeddings vectoriales para el campo
embedding.La configuración de tu clúster de MongoDB.
async function run() { try { // Configure your MongoDB collection const database = client.db("langchain_db"); const collection = database.collection("test"); const dbConfig = { collection: collection, indexName: "vector_index", // The name of the MongoDB Search index to use. textKey: "text", // Field name for the raw text content. Defaults to "text". embeddingKey: "embedding", // Field name for the vector embeddings. Defaults to "embedding". }; // Ensure that the collection is empty const count = await collection.countDocuments(); if (count > 0) { await collection.deleteMany({}); } // Save online PDF as a file const rawData = await fetch("https://webassets.mongodb.com/MongoDB_Best_Practices_Guide.pdf"); const pdfBuffer = await rawData.arrayBuffer(); const pdfData = Buffer.from(pdfBuffer); fs.writeFileSync("atlas_best_practices.pdf", pdfData); // Load and split the sample data const loader = new PDFLoader(`atlas_best_practices.pdf`); const data = await loader.load(); const textSplitter = new RecursiveCharacterTextSplitter({ chunkSize: 200, chunkOverlap: 20, }); const docs = await textSplitter.splitDocuments(data); // Instantiate MongoDB as a vector store const embeddingModel = new VoyageEmbeddings({ modelName: "voyage-4" }); embeddingModel.apiUrl = 'https://ai.mongodb.com/v1/embeddings'; const vectorStore = await MongoDBAtlasVectorSearch.fromDocuments(docs, embeddingModel, dbConfig); } finally { // Ensure that the client will close when you finish/error await client.close(); } } run().catch(console.dir);
Guarda el archivo y luego ejecuta el siguiente comando para cargar tus datos en MongoDB.
node get-started.js
Tip
Después de ejecutar get-started.js, si utiliza Atlas, puede verificar sus incrustaciones vectoriales navegando hasta el namespace de 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 vectorial en tu almacén vectorial, crea un índice MongoDB Vector Search en la colección langchain_db.test.
Defina el índice de búsqueda vectorial de MongoDB.
Agrega el siguiente código al final de la instrucción
tryde la función asíncrona que hayas definido en tu archivoget-started.js. Este código crea un índice del tipo vectorSearch para indexar los siguientes campos:embeddingcampo como el tipo vector. El campoembeddingcontiene las incrustaciones generadas utilizando el modelo de incrustaciónvoyage-4de Voyage AI. La definición de índice especifica1024dimensiones vectoriales y mide la similitud usandocosine.loc.pageNumbercampo como el tipo filtro para el pre-filtrado de datos por el número de página en el PDF.
Este código también utiliza una función 'await' para garantizar que tu índice de búsqueda se haya sincronizado con tus datos antes de que se utilicen.
1 // Ensure index does not already exist, then create your MongoDB Vector Search index 2 const indexes = await collection.listSearchIndexes("vector_index").toArray(); 3 if(indexes.length === 0){ 4 5 // Define your MongoDB Vector Search Index 6 const index = { 7 name: "vector_index", 8 type: "vectorSearch", 9 definition: { 10 "fields": [ 11 { 12 "type": "vector", 13 "numDimensions": 1024, 14 "path": "embedding", 15 "similarity": "cosine" 16 }, 17 { 18 "type": "filter", 19 "path": "loc.pageNumber" 20 } 21 ] 22 } 23 } 24 25 // Run the helper method 26 const result = await collection.createSearchIndex(index); 27 console.log(result); 28 } 29 30 // Wait for index to build and become queryable 31 console.log("Waiting for initial sync..."); 32 await new Promise(resolve => setTimeout(() => { 33 resolve(); 34 }, 3000)); Guarda el archivo.
Ejecución de consultas de búsqueda vectorial
Esta sección demuestra varias consultas que puedes ejecutar en tus datos vectorizados. Ahora que ha creado el índice, añada el siguiente código a su función asíncrona para ejecutar consultas de búsqueda vectorial en sus datos.
Nota
Si experimentas resultados inexactos al consultar tus datos, es posible que tu índice esté tardando más de lo esperado en sincronizarse. Aumente el número en la función setTimeout para permitir más tiempo para la sincronización inicial.
Agrega el siguiente código a tu función asíncrona y guarda el archivo.
El siguiente código utiliza el método similaritySearch para realizar una búsqueda semántica básica del string MongoDB Atlas security. Devuelve una lista de documentos clasificados por relevancia con solo los campos pageContent y pageNumber.
// Basic semantic search const basicOutput = await vectorStore.similaritySearch( "MongoDB Atlas security" ); const basicResults = basicOutput.map((results => ({ pageContent: results.pageContent, pageNumber: results.metadata.loc.pageNumber, }))) console.log("Semantic Search Results:") console.log(basicResults) if (basicResults.length === 0) { console.log("No results found after waiting for index sync. Check Atlas Search index status and embedding configuration."); }
Ejecuta el siguiente comando para ejecutar la query.
node get-started.js
Semantic Search Results: [ { pageContent: 'read isolation. \n' + 'With MongoDB Atlas, you can achieve workload isolation with dedicated analytics nodes. Visualization \n' + 'tools like Atlas Charts can be configured to read from analytics nodes only.', pageNumber: 21 }, { pageContent: 'well-tuned queries.\n' + 'Built-in slow query profiling is also available if you’re deploying MongoDB with Atlas.', pageNumber: 16 }, { pageContent: 'Atlas free tier, or download MongoDB for local \n' + 'development.\n' + 'Review the MongoDB manuals and tutorials in our \n' + 'documentation. \n' + 'More Resources\n' + 'For more on getting started in MongoDB:', pageNumber: 30 }, { pageContent: 'If you are running MongoDB on your own infrastructure, you can configure replica set tags to achieve \n' + 'read isolation.', pageNumber: 21 } ]
Puedes prefiltrar tus datos utilizando una expresión de coincidencia MQL que compara el campo indexado con otro valor de tu colección. Debe indexar los campos de metadatos por los que desea filtrar como tipo filter. Para obtener más información, consulte Cómo Indexar Campos para Búsqueda Vectorial.
Nota
Usted especificó el loc.pageNumber campo como filtro cuando creó el índice para este tutorial.
Agrega el siguiente código a tu función asíncrona y guarda el archivo.
El siguiente código utiliza el método similaritySearch para realizar una búsqueda semántica de la string MongoDB Atlas security. Especifica los siguientes parámetros:
El número de documentos a devolver como
3.Un filtro previo en el campo
loc.pageNumberque utiliza el operador$eqpara hacer coincidir los documentos que aparecen solo en la página 17.
Retorna una lista de documentos clasificados por relevancia con sólo los campos pageContent y pageNumber.
// Semantic search with metadata filter const filteredOutput = await vectorStore.similaritySearch("MongoDB Atlas Search", 3, { preFilter: { "loc.pageNumber": {"$eq": 22 }, } }); const filteredResults = filteredOutput.map((results => ({ pageContent: results.pageContent, pageNumber: results.metadata.loc.pageNumber, }))) console.log("Semantic Search with Filtering Results:") console.log(filteredResults)
Ejecuta el siguiente comando para ejecutar la query.
node get-started.js
Semantic Search with Filtering Results: [ { pageContent: 'Atlas Search is built for the MongoDB document data model and provides higher performance and', pageNumber: 22 }, { pageContent: 'Figure 9: Atlas Search queries are expressed through the MongoDB Query API and backed by the leading search engine library, \n' + 'Apache Lucene.', pageNumber: 22 }, { pageContent: 'consider using Atlas Search. The service is built on fully managed Apache Lucene but exposed to users \n' + 'through the MongoDB Aggregation Framework.', pageNumber: 22 } ]
También puedes realizar una búsqueda semántica basada en la Relevancia Marginal Máxima (MMR), una medida de relevancia semántica optimizada para la diversidad.
Agrega el siguiente código a tu función asíncrona y guarda el archivo.
El siguiente código utiliza el método maxMarginalRelevanceSearch para buscar la string MongoDB Atlas security. También especifica un objeto que define los siguientes parámetros opcionales:
kpara limitar el número de documentos devueltos a3.fetchKpara obtener solo10documentos antes de pasar los documentos al algoritmo MMR.
Retorna una lista de documentos clasificados por relevancia con sólo los campos pageContent y pageNumber.
// Max Marginal Relevance search const mmrOutput = await vectorStore.maxMarginalRelevanceSearch("MongoDB Atlas security", { k: 3, fetchK: 10, }); const mmrResults = mmrOutput.map((results => ({ pageContent: results.pageContent, pageNumber: results.metadata.loc.pageNumber, }))) console.log("Max Marginal Relevance Search Results:") console.log(mmrResults)
Ejecuta el siguiente comando para ejecutar la query.
node get-started.js
Max Marginal Relevance Search Results: [ { pageContent: 'Atlas Search is built for the MongoDB document data model and provides higher performance and', pageNumber: 22 }, { pageContent: '• Zoned Sharding — You can define specific rules governing data placement in a sharded cluster.\n' + 'Global Clusters in MongoDB Atlas allows you to quickly implement zoned sharding using a visual UI or', pageNumber: 27 }, { pageContent: 'read isolation. \n' + 'With MongoDB Atlas, you can achieve workload isolation with dedicated analytics nodes. Visualization \n' + 'tools like Atlas Charts can be configured to read from analytics nodes only.', pageNumber: 21 } ]
Tip
Para más información, consulta la referencia de la API.
Responde preguntas sobre tus datos
Esta sección demuestra dos implementaciones diferentes de RAG utilizando la Búsqueda Vectorial de MongoDB y LangChain. Ahora que utilizaste la búsqueda vectorial de MongoDB para recuperar documentos semánticamente similares, utiliza los siguientes ejemplos de código para solicitar al LLM que responda preguntas sobre los documentos devueltos por la búsqueda vectorial de MongoDB.
Agrega el siguiente código a tu función asíncrona y guarda el archivo.
Este código realiza lo siguiente:
- Ejecuta la MongoDB Vector Search como un recuperador para query documentos semánticamente similares.
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 chain que utiliza el modelo de chat de OpenAI para generar respuestas contextualizadas basadas en tu indicación.
Solicita a la cadena una muestra query sobre las recomendaciones de seguridad de Atlas.
Devuelve la respuesta del LLM y los documentos utilizados como contexto.
// Implement RAG to answer questions on your data const retriever = vectorStore.asRetriever(); const prompt = PromptTemplate.fromTemplate(`Answer the question based on the following context: {context} Question: {question}`); const model = new ChatOpenAI({ modelName: "gpt-5-mini" }) // Pick your preferred model. Ensure to enable it in your OpenAI settings dashboard. const chain = RunnableSequence.from([ { context: retriever.pipe(formatDocumentsAsString), question: new RunnablePassthrough(), }, prompt, model, new StringOutputParser(), ]); // Prompt the LLM const question = "How can I secure my MongoDB Atlas cluster?"; const answer = await chain.invoke(question); console.log("Question: " + question); console.log("Answer: " + answer); // Return source documents const retrievedResults = await retriever.invoke(question) const documents = retrievedResults.map((documents => ({ pageContent: documents.pageContent, pageNumber: documents.metadata.loc.pageNumber, }))) console.log("\nSource documents:\n" + JSON.stringify(documents, null, 2))
Ejecuta el siguiente comando para ejecutar tu archivo.
Después de guardar el archivo, ejecuta el siguiente comando. La respuesta generada puede variar.
node get-started.js
Question: How can I secure my MongoDB Atlas cluster? Answer: You can secure your MongoDB Atlas cluster by achieving workload isolation with dedicated analytics nodes, configuring visualization tools like Atlas Charts to read from analytics nodes only, and using built-in slow query profiling if deploying with Atlas. Additionally, you can distribute replica set members across multiple data centers for added security during election and failover. Source documents: [ { "pageContent": "read isolation. \nWith MongoDB Atlas, you can achieve workload isolation with dedicated analytics nodes. Visualization \ntools like Atlas Charts can be configured to read from analytics nodes only.", "pageNumber": 21 }, { "pageContent": "If you are running MongoDB on your own infrastructure, you can configure replica set tags to achieve \nread isolation.", "pageNumber": 21 }, { "pageContent": "well-tuned queries.\nBuilt-in slow query profiling is also available if you’re deploying MongoDB with Atlas.", "pageNumber": 16 }, { "pageContent": "achieved during election and failover. \nIf possible, distribute replica set members across multiple data centers. If you’re using MongoDB Atlas,", "pageNumber": 24 } ]
Agrega el siguiente código a tu función asíncrona y guarda el archivo.
Este código realiza lo siguiente:
Inicia MongoDB Vector Search como un recuperador para hacer consultas de documentos semánticamente similares. También se especifican los siguientes parámetros opcionales:
searchTypecomommr, lo que especifica que MongoDB búsqueda vectorial recupera documentos en función de la Relevancia Marginal Máxima (MMR).filterpara añadir un pre-filtro en el campoloc.pageNumberpara incluir únicamente los documentos que aparecen en la página 17.Los siguientes parámetros específicos de MMR:
fetchKpara obtener solo20documentos antes de pasar los documentos al algoritmo MMR.lambda, un valor entre0y1para determinar el grado de diversidad entre los resultados, donde0representa la máxima diversidad y1la mínima diversidad.
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 chain que utiliza el modelo de chat de OpenAI para generar respuestas contextualizadas basadas en tu indicación.
Solicita a la cadena una muestra query sobre las recomendaciones de seguridad de Atlas.
Devuelve la respuesta del LLM y los documentos utilizados como contexto.
// Implement RAG to answer questions on your data const retriever = await vectorStore.asRetriever({ searchType: "mmr", // Defaults to "similarity" filter: { preFilter: { "loc.pageNumber": { "$eq": 17 } } }, searchKwargs: { fetchK: 20, lambda: 0.1, }, }); const prompt = PromptTemplate.fromTemplate(`Answer the question based on the following context: {context} Question: {question}`); const model = new ChatOpenAI({}); const chain = RunnableSequence.from([ { context: retriever.pipe(formatDocumentsAsString), question: new RunnablePassthrough(), }, prompt, model, new StringOutputParser(), ]); // Prompt the LLM const question = "How can I secure my MongoDB Atlas cluster?"; const answer = await chain.invoke(question); console.log("Question: " + question); console.log("Answer: " + answer); // Return source documents const retrievedResults = await retriever.invoke(question) const documents = retrievedResults.map((documents => ({ pageContent: documents.pageContent, pageNumber: documents.metadata.loc.pageNumber, }))) console.log("\nSource documents:\n" + JSON.stringify(documents, null, 2))
Ejecuta el siguiente comando para ejecutar tu archivo.
Después de guardar el archivo, ejecuta el siguiente comando. La respuesta generada puede variar.
node get-started.js
Question: How can I secure my MongoDB Atlas cluster? Answer: One way to secure your MongoDB Atlas cluster is by implementing proper access controls and ensuring that only authorized users have access to your data. You can also enable encryption at rest and in transit, use network security features such as VPC peering, and regularly update and patch your MongoDB database to protect against security vulnerabilities. Additionally, implementing auditing and monitoring tools can help you detect and respond to any security incidents in a timely manner. Source documents: [ { "pageContent": "Optimizing Data \nAccess Patterns\nNative tools in MongoDB for improving query \nperformance and reducing overhead.", "pageNumber": 17 } ]
Próximos pasos
Para aprender a integrar MongoDB Vector Search con LangGraph, consulta Integrar MongoDB con LangGraph.js.
MongoDB también proporciona los siguientes recursos para desarrolladores: