Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

Comenzar con la integración LangChain JS/TS

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:

  1. Configura el entorno.

  2. Almacene datos personalizados en MongoDB.

  3. Cree un índice de Búsqueda Vectorial de MongoDB en sus datos.

  4. 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).

  5. Implementa RAG utilizando MongoDB búsqueda vectorial para responder preguntas sobre tus datos.

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.

Para completar este tutorial, debes tener lo siguiente:

  • Uno de los siguientes tipos de clúster de MongoDB:

  • 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.

Configura el entorno para este tutorial. Para configurar tu entorno, completa los siguientes pasos.

1

Ejecute los siguientes comandos en su terminal para crear un nuevo directorio llamado langchain-mongodb e inicializar su proyecto:

mkdir langchain-mongodb
cd langchain-mongodb
npm init -y
2

Ejecuta el siguiente comando:

npm install langchain@latest @langchain/community@latest @langchain/core@latest @langchain/mongodb@latest @langchain/openai@latest @langchain/textsplitters@latest pdf-parse@1 --legacy-peer-deps
3

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...
}
4

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");
5

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

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.test como la colección de MongoDB para almacenar los documentos.

    • vector_index como el índice a usar para consultar la tienda de vectores.

    • text como el nombre del campo que contiene el contenido de texto sin formato.

    • embedding como 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.

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.

1
  1. Agrega el siguiente código al final de la instrucción try de la función asíncrona que hayas definido en tu archivo get-started.js. Este código crea un índice del tipo vectorSearch para indexar los siguientes campos:

    • embedding campo como el tipo vector. El campo embedding contiene las incrustaciones generadas utilizando el modelo de incrustación voyage-4 de Voyage AI. La definición de índice especifica 1024 dimensiones vectoriales y mide la similitud usando cosine.

    • loc.pageNumber campo 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
    2const indexes = await collection.listSearchIndexes("vector_index").toArray();
    3if(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
    31console.log("Waiting for initial sync...");
    32await new Promise(resolve => setTimeout(() => {
    33 resolve();
    34}, 3000));
  2. Guarda el archivo.

2
node get-started.js

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.

1

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.");
}
2
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.

1

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.pageNumber que utiliza el operador $eq para 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)
2
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.

1

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:

  • k para limitar el número de documentos devueltos a 3.

  • fetchK para obtener solo 10 documentos 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)
2
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.

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.

1

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))
2

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
}
]
1

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:

    • searchType como mmr, lo que especifica que MongoDB búsqueda vectorial recupera documentos en función de la Relevancia Marginal Máxima (MMR).

    • filter para añadir un pre-filtro en el campo loc.pageNumber para incluir únicamente los documentos que aparecen en la página 17.

    • Los siguientes parámetros específicos de MMR:

      • fetchK para obtener solo 20 documentos antes de pasar los documentos al algoritmo MMR.

      • lambda, un valor entre 0 y 1 para determinar el grado de diversidad entre los resultados, donde 0 representa la máxima diversidad y 1 la 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))
2

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
}
]

Para aprender a integrar MongoDB Vector Search con LangGraph, consulta Integrar MongoDB con LangGraph.js.

MongoDB también proporciona los siguientes recursos para desarrolladores: