Nota
Este tutorial utiliza el Biblioteca de JavaScript. Para un tutorial que utiliza la librería de Python, consulte 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 demuestra cómo comenzar a usar MongoDB Vector Search con LangChain para realizar una 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 prefiltrado de metadatos.
Búsqueda de relevancia marginal máxima (MMR).
Implementa RAG usando la búsqueda vectorial de MongoDB 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 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.
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 { formatDocumentsAsString } from "langchain/util/document"; 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);
Sustituye los valores de marcador de posición.
Para finalizar la configuración del 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 la SRV cadena de conexión para tu clúster de MongoDB, respectivamente. 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({ model: "voyage-3-large" }); 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 de vectores en su tienda de vectores, cree un índice de búsqueda de vectores de MongoDB en la colección langchain_db.test.
Agregue el siguiente código a la función asíncrona definida en su get-started.js archivo. Este código crea un índice del tipo vectorSearch que indexa 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.loc.pageNumbercampo como el tipo filtro para prefiltrar datos por el número de página en el PDF.
Este código también utiliza una función de espera para garantizar que su índice de búsqueda se haya sincronizado con sus datos antes de su uso.
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 // Wait for index to build and become queryable 30 console.log("Waiting for initial sync..."); 31 await new Promise(resolve => setTimeout(() => { 32 resolve(); 33 }, 10000)); 34 }
Guarde el archivo y luego ejecute el siguiente comando para crear el índice de MongoDB Vector Search.
node get-started.js
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.
Agregue el siguiente código a su función asincrónica y guarde 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)
Ejecuta el siguiente comando para ejecutar la query.
node get-started.js
Semantic Search Results: [ { 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: '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: '• 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: 'are updated, associated indexes must be maintained, incurring additional CPU and disk I/O overhead. \n' + 'If you\'re running fully managed databases on MongoDB Atlas, the built-in Performance Advisor', pageNumber: 20 } ]
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 loc.pageNumber como filtro cuando creaste el índice para este tutorial.
Agregue el siguiente código a su función asincrónica y guarde 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 es
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 puede realizar una búsqueda semántica basada en la relevancia marginal máxima (MMR), una medida de relevancia semántica optimizada para la diversidad.
Agregue el siguiente código a su función asincrónica y guarde 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 obtener más información, consulte la referencia de API.
Responde preguntas sobre tus datos
Esta sección muestra dos implementaciones diferentes de RAG con MongoDB Vector Search y LangChain. Ahora que ha utilizado MongoDB Vector Search para recuperar documentos semánticamente similares, utilice los siguientes ejemplos de código para solicitar al LLM que responda preguntas sobre los documentos devueltos por MongoDB Vector Search.
Agregue el siguiente código a su función asincrónica y guarde el archivo.
Este código realiza lo siguiente:
Crea una instancia de MongoDB Vector Search como un recuperador para consultar 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({}); 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.getRelevantDocuments(question) const documents = retrievedResults.map((documents => ({ pageContent: documents.pageContent, pageNumber: documents.metadata.loc.pageNumber, }))) console.log("\nSource documents:\n" + JSON.stringify(documents, 1, 2))
Ejecuta el siguiente comando para ejecutar tu archivo.
Después de guardar el archivo, ejecute el siguiente comando. La respuesta generada puede variar.
node get-started.js
Question: How can I secure my MongoDB Atlas cluster? Answer: The given context does not explicitly provide detailed steps to secure a MongoDB Atlas cluster. However, based on general best practices, here are some common steps to secure your MongoDB Atlas cluster: 1. **Enable Network Access Controls**: Configure IP whitelists to only allow connections from trusted IP addresses. 2. **Use Strong Authentication and Authorization**: Enable SCRAM (Salted Challenge Response Authentication Mechanism) for authenticating users and define roles with specific permissions. 3. **Encrypt Data**: Ensure data is encrypted both at rest and in transit by default in MongoDB Atlas. 4. **Enable VPC Peering (if applicable)**: Use Virtual Private Cloud (VPC) peering for secure and private connections. 5. **Monitor Activity**: Use MongoDB Atlas's built-in monitoring to track cluster activity and detect unauthorized attempts or anomalies. 6. **Implement Automated Backups**: Secure backups and ensure they are protected from unauthorized access. 7. **Educate Yourself**: Continuously refer to the MongoDB documentation and follow security best practices. It is recommended to visit the MongoDB documentation and security guides for the most accurate and detailed steps tailored to your specific use case. Source documents: [ { "pageContent": "Atlas free tier, or download MongoDB for local \ndevelopment.\nReview the MongoDB manuals and tutorials in our \ndocumentation. \nMore Resources\nFor more on getting started in MongoDB:", "pageNumber": 30 }, { "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": "• Zoned Sharding — You can define specific rules governing data placement in a sharded cluster.\nGlobal Clusters in MongoDB Atlas allows you to quickly implement zoned sharding using a visual UI or", "pageNumber": 27 }, { "pageContent": "22\nWorkload Type: Search\nIf your application requires rich full-text search functionality and you are running MongoDB on Atlas,", "pageNumber": 22 } ]
Agregue el siguiente código a su función asincrónica y guarde 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 campolog.pageNumberspara 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.getRelevantDocuments(question) const documents = retrievedResults.map((documents => ({ pageContent: documents.pageContent, pageNumber: documents.metadata.loc.pageNumber, }))) console.log("\nSource documents:\n" + JSON.stringify(documents, 1, 2))
Ejecuta el siguiente comando para ejecutar tu archivo.
Después de guardar el archivo, ejecute el siguiente comando. La respuesta generada puede variar.
node get-started.js
Question: How can I secure my MongoDB Atlas cluster? Answer: To secure your MongoDB Atlas cluster, you can implement the following best practices: 1. **Enable Authentication and Authorization** Ensure that authentication is enabled, which is the default for MongoDB Atlas. Use role-based access control (RBAC) to grant users only the permissions they need. 2. **Use Strong Passwords or Authentication Mechanisms** Avoid simple passwords. Use strong, complex passwords for all database users. Alternatively, use certificate-based authentication or federated authentication with your identity provider. 3. **Whitelist IP Addresses** Configure your Access List (IP Whitelist) to restrict access to trusted IP addresses. This ensures that only specified IP addresses can connect to your cluster. 4. **Enable Network Encryption (TLS/SSL)** MongoDB Atlas supports TLS/SSL by default for securing data in transit. Ensure applications are configured to connect with SSL/TLS-enabled settings. 5. **Use End-to-End Encryption (Client-Side Field-Level Encryption)** Implement client-side field-level encryption to ensure sensitive fields are encrypted end-to-end. 6. **Regularly Rotate Authentication Credentials** Periodically rotate users' passwords or access keys to mitigate the risks of credential exposure. 7. **Use Private Networking** If supported, use Virtual Private Cloud (VPC) peering or private endpoints, such as AWS PrivateLink, to connect securely to your MongoDB Atlas cluster without using the public internet. 8. **Enable Database Auditing** Enable auditing to track database activity and detect potential anomalies or unauthorized access. 9. **Enable Backup and Data Recovery** Regularly back up your data using MongoDB Atlas' automated backup systems to ensure business continuity in case of accidental deletions or data loss. 10. **Keep the MongoDB Drivers Updated** Use the latest version of MongoDB drivers in your application to benefit from security updates and enhancements. 11. **Monitor and Set Alerts** Use MongoDB Atlas' monitoring tools to track metrics and set up alerts for suspicious activities or unusual resource consumption. 12. **Implement Application-Level Security** Ensure your application properly handles user authentication, session management, and input sanitization to prevent unauthorized access or injection attacks. 13. **Watch for Security Best Practices Updates** Regularly review MongoDB Atlas documentation and security advisories to stay aware of new features and recommendations. By following these practices, you can greatly enhance the security posture of your MongoDB Atlas cluster. 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: