您可以将MongoDB与 Mastra 集成以构建AI代理。Mastra 是一个开源 TypeScript 代理框架,为构建 AI 应用程序提供 primitives,包括工作流、RAG 和评估。
重要
此集成由 社区维护。要学习;了解更多信息,请参阅Mastra 文档或Mastra GitHub存储库。
Overview
您可以将MongoDB与 Mastra 结合使用来构建AI代理。通过将MongoDB 向量搜索与 Mastra 的代理框架相结合,您可以为代理实现以下功能:
使用MongoDB作为矢量数据库来存储和检索向量嵌入
使用MongoDB查询语法过滤器向量搜索结果
在代理中实现 RAG 作为工具
将代理的内存存储在MongoDB中
安装和设置
要将MongoDB与 Mastra 结合使用,请安装 @mastra/mongodb包:
npm install @mastra/mongodb
要开始使用 Mastra 并学习;了解如何创建项目,请参阅安装 Mastra。
向量存储
MongoDB 是 Mastra 中的支持的数据库。MongoDBVector 类允许您在MongoDB中存储和检索向量检索。您可以使用此组件存储数据中的嵌入并使用MongoDB 向量搜索 检索嵌入,从而实现RAG。
此组件要求您创建 MongoDB 向量搜索索引。
使用
要将MongoDB矢量存储与 Mastra 结合使用,请导入 MongoDBVector 类,使用该类创建一个对象,然后指定MongoDB连接详细信息。示例:
import { MongoDBVector } from '@mastra/mongodb' // Instantiate MongoDB as a vector store const mongoVector = new MongoDBVector({ uri: process.env.MONGODB_URI, // MongoDB connection string dbName: process.env.MONGODB_DATABASE // Database name })
方法
本节重点介绍将MongoDB作为向量存储使用的最相关方法。有关方法的完整列表,请参阅Mastra 文档。
在搜索嵌入之前,您必须在集合上创建向量搜索索引。dimension 参数必须与嵌入模型所需的维数相匹配。
// Create a vector search index await mongoVector.createIndex({ indexName: "vector_index", // Name of the index dimension: 1536, // Must match your embedding model's dimensions });
创建索引后,您可以存储向量嵌入与关联的元数据。有关完整示例,请参阅 Mastra更新或插入(upsert)嵌入示例。
import { openai } from "@ai-sdk/openai"; import { MongoDBVector } from "@mastra/mongodb"; import { MDocument } from "@mastra/rag"; import { embedMany } from "ai"; // Create a document from text const doc = MDocument.fromText("Your text content..."); // Split document into chunks const chunks = await doc.chunk(); // Generate embeddings for each chunk const { embeddings } = await embedMany({ values: chunks.map(chunk => chunk.text), // Text content to embed model: openai.embedding("text-embedding-3-small"), // Embedding model }); // Instantiate MongoDB as a vector store const mongoVector = new MongoDBVector({ uri: process.env.MONGODB_URI, // MongoDB connection string dbName: process.env.MONGODB_DB_NAME, // Database name }); // Store vector embeddings with metadata await mongoVector.upsert({ indexName: "vector_index", // Name of the vector search index vectors: embeddings, // Array of vector embeddings metadata: chunks?.map(chunk => ({ text: chunk.text })), // Associated metadata for each embedding });
要检索语义相似的文档,请先将查询转换为嵌入,然后查询向量存储。要学习;了解更多信息,请参阅 Mastra 中的检索。
import { openai } from "@ai-sdk/openai"; import { embed } from "ai"; import { MongoDBVector } from "@mastra/mongodb"; // Convert query to embedding const { embedding } = await embed({ value: "What are the main points in the article?", // Query text model: openai.embedding("text-embedding-3-small"), // Embedding model }); // Instantiate MongoDB as a vector store const mongoVector = new MongoDBVector({ uri: process.env.MONGODB_URI, // MongoDB connection string dbName: process.env.MONGODB_DATABASE // Database name }); // Query the vector store for similar documents const results = await mongoVector.query({ indexName: "vector_index", // Name of the vector search index queryVector: embedding, // Query embedding vector topK: 10, // Number of results to return }); // Display results console.log(results);
元数据过滤器
MongoDB矢量存储支持对向量搜索查询结果进行元数据过滤器:
不受限制地使用 Mastra 查询语法。
使用标准比较操作符、数组、逻辑操作符和元素操作符
在元数据中使用 mested 字段和数组
根据元数据和原始文档内容进行过滤器
以下用法示例演示了过滤器语法:
// Query with metadata filters const results = await mongoVector.query({ indexName: "vector_index", // Name of the vector search index queryVector: queryVector, // Query embedding vector topK: 10, // Number of results to return filter: { category: "electronics", // Simple equality filter price: { $gt: 100 }, // Numeric comparison tags: { $in: ["sale", "new"] }, // Array membership }, });
提示
为获得最佳性能,请为经常使用的过滤器元数据字段创建索引。要了解更多信息,请参阅MongoDB Vector Search 搜索索引。
要学习;了解更多信息,请参阅元数据筛选器。
带有AI代理的 RAG
您可以将MongoDB用作 Mastra AI代理中的向量存储来实现代理 RAG。这允许您的代理使用MongoDB向量搜索作为工具来帮助完成任务。
Mastra 还提供了一个 MONGODB_PROMPT 常量,您可以将其包含在代理指令中,以优化代理使用MongoDB进行检索的方式。要学习;了解更多信息,请参阅向量存储提示。
使用
以下示例展示了如何使用MongoDB作为向量存储来创建具有 RAG 功能的AI代理:
import { Agent } from '@mastra/core/agent'; import { openai } from '@ai-sdk/openai'; import { MONGODB_PROMPT } from "@mastra/mongodb"; import { createVectorQueryTool } from "@mastra/rag"; // Create a vector query tool for the agent const vectorQueryTool = createVectorQueryTool({ vectorStoreName: "mongoVector", // Name of MongoDB vector store indexName: "vector_index", // Name of Vector Search index model: openai.embedding("text-embedding-3-small"), // Embedding model }); // Define an AI agent with RAG capabilities export const ragAgent = new Agent({ name: 'RAG Agent', // Agent name model: openai('gpt-4o-mini'), // LLM model instructions: ` Process queries using the provided context. Structure responses to be concise and relevant. ${MONGODB_PROMPT} `, tools: { vectorQueryTool }, // Tools available to the agent });
AI代理的内存
您可以使用 Mastra 的内存系统, 并以 MongoDB 作为存储后端。这使您的代理能够记住过去的交互,并使用该信息为未来的决策提供信息。
有关完整教程,请参阅 MongoDB 内存。
使用
以下示例演示了如何在AI代理中使用内存。此示例使用 memoryOptions 来确定请求的召回范围。设置 lastMessages: 5 以限制基于新近度的召回。使用 semanticRecall 获取 topK: 3 个最相关的消息,包括每个匹配项上下文的 messageRange: 2 个邻近消息。
import "dotenv/config"; import { mastra } from "./mastra"; const threadId = "123"; const resourceId = "user-456"; const agent = mastra.getAgent("mongodbAgent"); const message = await agent.stream("My name is Mastra", { memory: { thread: threadId, resource: resourceId } }); await message.textStream.pipeTo(new WritableStream()); const stream = await agent.stream("What's my name?", { memory: { thread: threadId, resource: resourceId }, memoryOptions: { lastMessages: 5, semanticRecall: { topK: 3, messageRange: 2 } } }); for await (const chunk of stream.textStream) { process.stdout.write(chunk); }
其他资源
要学习有关将 Mastra 与 MongoDB 结合使用的更多信息,请参阅: