对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

开始使用 LangChain JS/TS 集成

您可以将MongoDB Vector Search 与 LangChain 集成,以构建LLM 应用程序并实现检索增强生成 (RAG)。本教程演示如何开始使用MongoDB Vector Search 和 LangChain 对数据执行语义搜索并构建RAG实施。具体来说,您执行以下操作:

  1. 设置环境。

  2. 在MongoDB中存储自定义数据。

  3. 对数据创建MongoDB Vector Search索引。

  4. 运行以下向量搜索查询:

    • 语义搜索。

    • 带元数据预过滤的语义搜索。

    • 最大边际相关性 (MMR) Atlas Search 。

  5. 使用MongoDB Vector Search 来回答有关数据的问题,从而实施 RAG。

LangChain 是一个开源框架,可通过使用“链”来简化 LLM 应用程序的创建。链是 LangChain 特有的组件,可以组合用于各种AI使用案例,包括 RAG。

通过将MongoDB Vector Search 与 LangChain 集成,您可以将MongoDB用作向量数据库,并使用MongoDB Vector Search 从数据中检索语义相似的文档来实现RAG。要学习;了解有关 RAG 的更多信息,请参阅使用MongoDB进行检索增强生成 (RAG)。

如要完成本教程,您必须具备以下条件:

  • 以下MongoDB 集群类型之一:

    • 运行MongoDB 6.0.11、7.0.2 或更高版本的 Atlas 集群。确保您的IP解决包含在Atlas项目的访问权限列表中。

    • 使用Python和Docker创建的本地Atlas部署。安装 atlas-local-lib-py (pip install atlas-local-lib-py) 以以编程方式创建和管理本地部署。要学习;了解更多信息,请参阅 atlas-local-lib-py存储库。

    • 安装了 Search 和 Vector Search 的MongoDB Community集群。

  • Voyage AI API密钥。要创建API密钥,请参阅管理 Voyage AI模型API密钥。

    注意

    如果您没有在Atlas (针对在Atlas 用户界面中创建的API密钥)或 Voyage AI (针对直接从 Voyage AI创建的API密钥)上配置付款方式,您的API请求可能会失败。

  • OpenAI API密钥。您必须拥有一个具有可用于API请求的积分的 OpenAI 帐户。要学习;了解有关注册 OpenAI 帐户的更多信息,请参阅 OpenAI API网站。

  • 用于运行 Node.js 项目的终端和代码编辑器。

为此教程设置环境。 要设立环境,请完成以下步骤。

1

在终端中运行以下命令,创建名为 langchain-mongodb 的新目录并初始化项目:

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

运行以下命令:

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

通过将 "type": "module" 添加到 package.json文件,然后保存,将项目配置为使用 ES 模块。

{
"type": "module",
// other fields...
}
4

在项目中,创建一个名为get-started.js的文件,然后将以下代码复制并粘贴到该文件中。 在整个教程中,您将向此文件添加代码。

此初始代码片段导入本教程所需的包,定义环境变量,并建立与MongoDB 集群的连接。

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

要完成环境设置,请将 get-started.js 中的 <api-key> 和 <connection-string> 占位符值分别替换为您的 Voyage AI API密钥、OpenAI API密钥和MongoDB 集群的 SRV连接字符串。连接字符串应使用以下格式:

mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net

在本部分中,您将定义一个异步函数以将自定义数据加载到MongoDB中,并将MongoDB 集群实例化为向量数据库(也称为向量存储)。将以下代码添加到get-started.js文件中。

注意

在本教程中,您将使用标题为MongoDB Atlas最佳实践的可公开访问的 PDF文档作为向量存储的数据源。本文档介绍了管理MongoDB部署的各种建议和核心概念。

此代码执行以下操作:

  • 通过指定以下参数来配置MongoDB集合:

    • langchain_db.test 作为MongoDB集合来存储文档。

    • vector_index 作为用于查询向量存储的索引。

    • text 作为包含原始文本内容的字段的名称。

    • embedding 作为包含向量嵌入的字段的名称。

  • 通过执行以下操作来准备自定义数据:

    • 从指定 URL 检索原始数据并将其另存为 PDF。

    • 使用文本拆分器将数据分割为较小的文档。

    • 指定数据块参数,它确定每个文档中的字符数以及两个连续文档之间应重叠的字符数。

  • 通过调用MongoDBAtlasVectorSearch.fromDocuments方法从样本文档创建向量存储。 此方法指定以下参数:

    • 要存储在向量数据库中的示例文档。

    • Voyage AI 的嵌入模型用于将文本转换为 embedding字段的向量嵌入。

    • 您的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);

保存文件,然后运行以下命令将数据加载到MongoDB中。

node get-started.js

提示

运行get-started.js 后,如果您使用的是Atlas ,则可以导航到Atlas用户用户界面中的langchain_db.test 命名空间来验证向量嵌入。

要在向量存储上启用向量搜索查询,请在 langchain_db.test集合上创建MongoDB Vector Search索引。

1
  1. 在 get-started.js文件中定义的异步函数的 try声明末尾添加以下代码。此代码创建一个 vectorSearch 类型的索引来索引以下字段:

    • embedding 字段作为向量类型。 embedding字段包含使用 Voyage AI 的 voyage-4 嵌入模型创建的嵌入。索引定义指定了 1024 向量维度,并使用 cosine 来衡量相似性。

    • loc.pageNumber 字段作为过滤类型,用于按 PDF 中的页码对数据进行预筛选。

    此代码还使用await 函数来确保搜索索引在使用前已同步到数据。

    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. 保存文件。

2
node get-started.js

本部分演示了可以对矢量化数据运行的各种查询。 创建索引后,将以下代码添加到异步函数中,以对数据运行向量Atlas Search查询。

注意

如果您在查询数据时遇到不准确的结果,则索引的同步时间可能比预期长。 增加setTimeout函数中的数字,以便为初始同步留出更多时间。

提示

有关更多信息,请参阅API参考文档。

本部分演示使用MongoDB Vector Search 和 LangChain 的两种不同 RAG 实施。现在您已经使用MongoDB Vector Search检索语义相似的文档,使用以下代码示例提示法学硕士回答针对MongoDB Vector Search 返回的文档的问题。

1

此代码执行以下操作:

  • 将MongoDB Vector Search 实例化为检索器,以查询语义相似的文档。
  • 定义 LangChain 提示模板,指示 LLM 使用这些文档作为查询的上下文。 LangChain 将这些文档传递给 {context} 输入变量,并将您的查询传递给 {question} 变量。

  • 构建一条链,该链使用 OpenAI 的聊天模型根据您的提示生成上下文感知响应。

  • 用有关 Atlas 安全建议的示例查询提示链。

  • 返回 LLM 的响应以及用作上下文的文档。

// 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

保存文件后,运行以下命令。 生成的响应可能会有所不同。

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

要学习;了解如何将MongoDB Vector Search 与 LangGraph 集成,请参阅将MongoDB与 LangGraph.js 集成。

MongoDB 还提供以下开发者资源: