一个基于 500 部科幻电影的 RAG 代理,使用约 60 行 TypeScript 实现

Reddit r/AI_Agents 新闻

摘要

本文描述了一个使用 Mastra 和 Elasticsearch 向量存储的参考性 RAG 代理实现,在 500 部科幻电影的语料库上进行了演示,该代理使用大约 60 行 TypeScript 构建。

Elastic 最近向 Mastra 添加了原生 Elasticsearch 向量存储支持,并基于 500 部科幻电影的语料库构建了一个参考性 RAG 代理。因此,我们进行了一项实验,看看效果如何。代理本身相当小巧。它包含:1 个代理、1 个向量检索工具、1 个记忆存储、约 60 行 TypeScript、Elasticsearch 作为向量后端、openai/text-embedding-3-small 用于嵌入、openai/gpt-5-nano 用于答案生成。流程如下:用户问题 → 代理决定是否搜索 → vectorQueryTool → Elasticsearch → 检索到的块 → 答案。我们将检索作为工具暴露出来,而不是硬编码到每个回合中。这样,代理可以决定何时需要检索,使用记忆处理后续问题,并将其他交互保持为正常的代理循环。核心设置如下: const esVector = new ElasticSearchVector({ id: "elasticsearch-vector", url: process.env.ELASTICSEARCH_URL!, auth: { apiKey: process.env.ELASTICSEARCH_API_KEY!, }, }); const vectorQueryTool = createVectorQueryTool({ vectorStore: esVector, indexName: process.env.ELASTICSEARCH_INDEX_NAME!, model: new ModelRouterEmbeddingModel( "openai/text-embedding-3-small" ), }); export const elasticsearchAgent = new Agent({ id: "elasticsearch-agent", model: "openai/gpt-5-nano", tools: { vectorQueryTool }, memory: new Memory(), }); 一些实现细节很有趣:记忆是一行代码。new Memory() 为代理提供跨回合的对话上下文。检索层是可替换的。createVectorQueryTool 可跨 Elasticsearch、PgVector、Pinecone、Qdrant 以及 Mastra 支持的其他存储使用。合成模型很小。在这个例子中,检索承担了大部分信息查找工作,因此 gpt-5-nano 只需要将检索到的块转换为有用的答案。您可以在不重写代理的情况下改进检索。演示从向量搜索开始,但 Elasticsearch 可以在稍后添加混合搜索和重排序,同时保持代理接口不变。更重要的是,代理只知道它有一个检索工具。它不需要关心后端是在进行纯向量搜索、混合词法 + 向量检索,还是在幕后进行重排序。对于基本的 RAG 应用,您可以硬编码:嵌入 → 搜索 → 提示 → 答案。一旦您需要对话记忆和模型控制的检索,为检索提供自己的工具可以使代理代码更加清晰。
查看原文

相似文章