Observação
Este tutorial usa a biblioteca JavaScript da LangChain. Para um tutorial que utiliza a biblioteca Python, consulte LangChain Python.
Você pode integrar o Atlas Vector Search ao LangChain para criar aplicativos LLM e implementar a geração aumentada de recuperação (RAG). Este tutorial demonstra como começar a usar o Atlas Vector Search com o LangChain para realizar a pesquisa semântica em seus dados e criar uma implementação RAG. Especificamente, você executa as seguintes ações:
Configure o ambiente.
Armazene dados personalizados no MongoDB.
Crie um índice de pesquisa do Atlas Vector Search em seus dados.
Execute as seguintes query de pesquisa vetorial:
Pesquisa semântica.
Pesquisa semântica com pré-filtragem de metadados.
Atlas Search de máxima relevância secundária (MMR).
Implemente o RAG usando o Atlas Vector Search para responder a perguntas sobre seus dados.
Plano de fundo
LangChain é uma estrutura de código aberto que simplifica a criação de aplicativos LLM por meio do uso de "cadeias". As cadeias são componentes específicos do LangChain que podem ser combinados para uma variedade de casos de uso de IA, incluindo RAG.
Ao integrar o Atlas Vector Search com o LangChain, você pode usar o MongoDB como um banco de dados vetorial e usar o Atlas Vector Search para implementar o RAG, recuperando documentos semanticamente semelhantes de seus dados. Para saber mais sobre RAG, consulte Geração Aumentada de Recuperação (RAG) com MongoDB.
Pré-requisitos
Para concluir este tutorial, você deve ter o seguinte:
Uma das seguintes opções:
Um Atlas cluster executando o MongoDB 6.0.11 versão, 7.0.2 ou posterior. Garanta que seu endereço IP esteja incluído na lista de acessodo seu projeto Atlas .
Um sistema local do Atlas criado utilizando o Atlas CLI. Para saber mais, consulte Implementar um Atlas Cluster Local.
Uma chave de API da Voyage AI. Para criar uma conta e uma chave de API, consulte o site da Voyage AI.
Uma chave de API da OpenAI. Você deve ter uma conta da OpenAI com créditos disponíveis para solicitações de API. Para aprender mais sobre como registrar uma conta OpenAI, consulte o website de API OpenAI.
Um editor de terminal e código para executar seu projeto Node.js.
npm e Node.js instalados.
Configurar o ambiente
Configure o ambiente para este tutorial. Para configurar seu ambiente, conclua as etapas a seguir.
Atualize seu arquivo package.json
.
Configure seu projeto para usar módulos ES adicionando "type": "module"
ao seu arquivo package.json
e salvando-o.
{ "type": "module", // other fields... }
Crie um arquivo chamado get-started.js
e cole o código a seguir.
Em seu projeto, crie um arquivo chamado get-started.js
e, em seguida, copie e cole o seguinte código no arquivo. Você adicionará código a esse arquivo durante o tutorial.
Este trecho de código inicial importa os pacotes necessários para este tutorial, define variáveis de ambiente e estabelece uma conexão com seu cluster MongoDB .
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/text_splitter"; 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);
Substitua os valores do espaço reservado.
Para concluir a configuração do ambiente, substitua <api-key>
os <connection-string>
valores de espaço reservado e em get-started.js
por sua chave de API do Voyage AI, sua chave de API do OpenAI e a string de conexão SRVpara seu cluster do MongoDB , respectivamente. Sua string de conexão deve usar o seguinte formato:
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Use o MongoDB como um armazenamento de vetores
Nesta seção, você define uma função assíncrona para carregar dados personalizados no MongoDB e instanciar seu cluster MongoDB como um banco de dados vetorial, também chamado de armazenamento vetorial. Adicione o seguinte código ao seu get-started.js
arquivo.
Observação
Para este tutorial, utilize um documento PDF acessível ao público intitulado Melhores práticas do MongoDB Atlas como fonte de dados para o seu armazenamento de vetores. Este documento descreve várias recomendações e conceitos principais para gerenciar seus sistemas do MongoDB .
Este código executa as seguintes ações:
Configura sua collection MongoDB especificando os seguintes parâmetros:
langchain_db.test
como a coleção MongoDB para armazenar os documentos.vector_index
como o índice a ser usado para consultar o armazenamento de vetores.text
como o nome do campo que contém o conteúdo de texto bruto.embedding
como o nome do campo que contém as incorporações do vetor.
Prepara seus dados personalizados fazendo o seguinte:
Recupera dados brutos da URL especificada e os salva como PDF.
Usa um divisor de texto para divisão os dados em documentos menores.
Especifica os parâmetros de parte, que determinam o número de caracteres em cada documento e o número de caracteres que devem se sobrepor entre dois documentos consecutivos.
Cria um armazenamento de vetor a partir dos documentos de amostra chamando o método
MongoDBAtlasVectorSearch.fromDocuments
. Este método especifica os seguintes parâmetros:O documento de amostra a serem armazenados no reconhecimento de data center vetorial.
Modelo de incorporação da Voyage AI como modelo usado para converter texto em incorporações vetoriais para o campo
embedding
.Sua configuração do cluster 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 Atlas 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);
Salve o arquivo e execute o seguinte comando para carregar seus dados no MongoDB.
node get-started.js
Dica
Depois de get-started.js
executar, se estiver usando o Atlas, poderá verificar suas incorporações vetoriais navegando até o langchain_db.test
namespace na interface do usuário do Atlas .
Criar o índice Atlas Vector Search Index
Para habilitar consultas de pesquisa de vetor no seu armazenamento de vetor, crie um índice do Atlas Vector Search na coleção langchain_db.test
.
Adicione o seguinte código à função assíncrona que você definiu no seu arquivo get-started.js
. Este código cria um índice do tipo vectorSearch que indexa os seguintes campos:
embedding
campo como o tipo de vetor. O campoembedding
contém as incorporações criadas usando o modelo de incorporaçãovoyage-3-large
do Voyage AI. A definição de índice especifica1024
dimensões vetoriais e mede a similaridade usandocosine
.loc.pageNumber
campo como o tipo de filtro para pré-filtrar dados pelo número da página no PDF.
Este código também usa uma função await para garantir que seu índice de pesquisa tenha sido sincronizado com seus dados antes de ser usado.
1 // Ensure index does not already exist, then create your Atlas Vector Search index 2 const indexes = await collection.listSearchIndexes("vector_index").toArray(); 3 if(indexes.length === 0){ 4 5 // Define your Atlas 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 }
Salve o arquivo e execute o seguinte comando para criar seu índice do Atlas Vector Search.
node get-started.js
Executar queries no Vector Search
Esta seção demonstra várias queries que você pode executar em seus dados vetorizados. Agora que você criou o índice, adicione o seguinte código à sua função assíncrona para executar queries do Atlas Search vetorial em seus dados.
Observação
Se você tiver resultados imprecisos ao consultar seus dados, seu índice pode estar demorando mais do que o esperado para sincronizar. Aumente o número na função setTimeout
para permitir mais tempo para a sincronização inicial.
Adicione o seguinte código à sua função assíncrona e salve o arquivo.
O código a seguir usa o método similaritySearch
para executar uma pesquisa semântica básica para a string MongoDB Atlas security
. Ele retorna uma lista de documentos classificados por relevância com apenas os campos pageContent
e 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)
Execute o seguinte comando para executar a 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 } ]
Você pode pré-filtrar seus dados usando uma expressão de correspondência MQL que compara o campo indexado com outro valor em sua coleção. Você deve indexar todos os campos de metadados pelos quais deseja filtrar como o tipo filter
. Para saber mais, consulte Como indexar campos para pesquisa vetorial.
Observação
Você especificou o campo loc.pageNumber
como um filtro quando criou o índice para este tutorial.
Adicione o seguinte código à sua função assíncrona e salve o arquivo.
O código a seguir usa o método similaritySearch
para executar uma pesquisa semântica para a string MongoDB Atlas security
. Ele especifica os seguintes parâmetros:
O número de documentos a retornar como
3
.Um pré-filtro no campo
loc.pageNumber
que usa o operador$eq
para corresponder aos documentos que aparecem somente na página 17 .
Ele retorna uma lista de documentos classificados por relevância com apenas os campos pageContent
e 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)
Execute o seguinte comando para executar a 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 } ]
Você também pode realizar pesquisas semânticas com base na Relevância Marginal Máxima (MMR), uma medida de relevância semântica otimizada para a diversidade.
Adicione o seguinte código à sua função assíncrona e salve o arquivo.
O código a seguir usa o método maxMarginalRelevanceSearch
para pesquisar a string MongoDB Atlas security
. Ele também especifica um objeto que define os seguintes parâmetros opcionais:
k
para limitar o número de documentos retornados a3
.fetchK
para buscar apenas10
documentos antes de passá-los para o algoritmo MMR .
Ele retorna uma lista de documentos classificados por relevância com apenas os campos pageContent
e 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)
Execute o seguinte comando para executar a 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 } ]
Dica
Para obter mais informações, consulte a referência da API.
Responda a perguntas sobre seus dados
Esta seção demonstra duas implementações diferentes de RAG usando Atlas Vector Search e LangChain. Agora que você usou o Atlas Vector Search para recuperar documentos semanticamente semelhantes, use os seguintes exemplos de código para solicitar que o LLM responda às perguntas dos documentos retornados pelo Atlas Vector Search.
Adicione o seguinte código à sua função assíncrona e salve o arquivo.
Este código faz o seguinte:
Instancia o Atlas Vector Search como um recuperador para fazer query de documentos semanticamente semelhantes.
Define um modelo de prompt do LangChain para instruir o LLM a usar esses documentos como contexto para sua query. O LangChain passa esses documentos para a
{context}
variável de entrada e sua query para a{question}
variável.Constrói uma cadeia que usa o modelo de chat da OpenAI para gerar respostas sensíveis ao contexto com base em sua solicitação.
Solicita a cadeia com uma query de amostra sobre as recomendações de segurança do Atlas .
Retorna a resposta do LLM e os documentos usados 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))
Execute o seguinte comando para executar seu arquivo.
Depois de salvar o arquivo, execute o seguinte comando. A resposta gerada pode 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 } ]
Adicione o seguinte código à sua função assíncrona e salve o arquivo.
Este código faz o seguinte:
Instancia o Atlas Vector Search como um recuperador para fazer query de documentos semanticamente semelhantes. Ela também especifica os seguintes parâmetros opcionais:
searchType
comommr
, que especifica que o Atlas Vector Search recupere documentos com base na Relevância Marginal Maxima (MMR).filter
para adicionar um pré-filtro no campolog.pageNumbers
para incluir documentos que aparecem apenas na página 17.Os seguintes parâmetros específicos do MMR:
fetchK
para buscar apenas20
documentos antes de passá-los para o algoritmo MMR .lambda
, um valor entre0
e1
para determinar o grau de diversidade entre os resultados, com0
representando a diversidade máxima e1
representando a diversidade mínima.
Define um modelo de prompt do LangChain para instruir o LLM a usar esses documentos como contexto para sua query. O LangChain passa esses documentos para a
{context}
variável de entrada e sua query para a{question}
variável.Constrói uma cadeia que usa o modelo de chat da OpenAI para gerar respostas sensíveis ao contexto com base em sua solicitação.
Solicita a cadeia com uma query de amostra sobre as recomendações de segurança do Atlas .
Retorna a resposta do LLM e os documentos usados 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))
Execute o seguinte comando para executar seu arquivo.
Depois de salvar o arquivo, execute o seguinte comando. A resposta gerada pode 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 passos
Para aprender a integrar o Atlas Vector Search com o LangGraph, veja Integrar o MongoDB ao LangGraph.js.
O MongoDB também fornece os seguintes recursos para desenvolvedores: