https://ai-sdk.dev/cookbook/node/knowledge-base-agent
在本教程中,你将学习如何使用 Upstash Search 构建一个可以与知识库交互的 AI Agent。
这个 Agent 能够:
- 从知识库中检索信息;
- 向知识库中添加新的资源;
- 根据需要删除已有资源;
- 借助 AI SDK tools 完成这些操作。
Upstash Search 提供了输入增强、重排序、语义搜索和全文搜索能力,可以返回高准确度的搜索结果。它还内置了 embedding 服务,因此不需要额外接入单独的 embedding provider。
这使得它非常适合用来构建和管理简单的知识库。
本示例使用一篇 essay 作为输入数据,文件名为 essay.txt。
如果你想查看更深入的指南,可以参考 RAG Agent Guide,该指南展示了如何使用 Next.js、Drizzle ORM 和 Postgres 构建一个 RAG Agent。
开始使用
首先,在 Upstash Console 上创建一个 Upstash Search 数据库。
创建完成后,你会得到:
- REST URL;
- token。
将它们配置到环境变量中:
1 | UPSTASH_SEARCH_REST_URL="***" |
项目设置
创建一个新的空目录,并初始化 pnpm:
1 | mkdir knowledge-base-agent |
安装 AI SDK、OpenAI provider、Upstash Search 包,以及作为开发依赖的 tsx:
1 | pnpm i ai zod @ai-sdk/openai @upstash/search |
最后,下载并保存输入 essay:
1 | curl -o essay.txt https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt |
设置知识库
接下来,我们来设置初始知识库:读取一个文件,并将它的内容上传到 Upstash Search。
创建一个名为 setup.ts 的脚本:
1 | import fs from 'fs'; |
运行 setup 脚本,将数据填充到知识库中:
1 | pnpm tsx setup.ts |
然后进入 Upstash Console,查看 Search 数据库的数据浏览器。
你应该能看到 essay 已经被索引。
构建知识库 Agent
现在,我们来创建一个可以与知识库交互的 Agent。
创建一个新文件 agent.ts:
1 | import { tool, stepCountIs, generateText, generateId } from 'ai'; |
运行 Agent
现在运行 Agent:
1 | pnpm tsx agent.ts |
Agent 会利用知识库来回答问题,并根据需要:
- 查询知识库;
- 添加新的资源;
- 删除已有资源。
你可以修改 question 变量,测试不同的问题,以及与知识库的不同交互方式。
代码逻辑说明
这篇教程的核心是创建三个工具,并把它们交给 AI SDK 的 generateText 使用。
1. searchKnowledge
用于搜索知识库。
它接收:
query:搜索查询;limit:返回结果数量,默认为 3。
核心逻辑是:
1 | const results = await index.search({ |
这里开启了 reranking: true,表示对搜索结果进行重排序,以提升结果相关性。
返回结果中包含:
- 资源 ID;
- 排名;
- 标题;
- 内容;
- 所属 section;
- 分数。
2. addResource
用于向知识库中添加新资源。
它接收:
resource:要添加的内容;title:可选标题。
核心逻辑是:
1 | await index.upsert({ |
这里使用 generateId() 生成唯一 ID,然后通过 index.upsert() 写入 Upstash Search。
3. deleteResource
用于从知识库中删除资源。
它接收:
resourceId:要删除的资源 ID。
核心逻辑是:
1 | await index.delete({ ids: [resourceId] }); |
如果删除成功,会返回成功提示;如果失败,会返回错误信息。
为什么使用 stopWhen: stepCountIs(5)
代码中设置了:
1 | stopWhen: stepCountIs(5) |
这表示模型最多可以进行 5 个步骤。
这样做的作用是让 Agent 可以进行多轮工具调用,例如:
- 先搜索知识库;
- 根据搜索结果判断是否足够;
- 如果不够,再搜索一次;
- 生成最终回答;
- 必要时添加或删除资源。
如果不设置多步骤能力,模型可能只能完成一次简单生成,无法形成更完整的 Agent 工作流。