先看出事的那一刻
2026 年 7 月 19 日,知识库 Agent 第一次接上第三方的兼容模型。同一段代码,在自己的终端里运行正常;从 Claude Code 的会话里启动,就一直返回 401。
第 18 课讲过它的来龙去脉和修法。这节课要说的是它背后更大的一件事:Agent 不是飘在云上的一段对话,而是你机器上的一个进程。它从哪个目录启动、继承了哪些变量、手里有哪些工具、开局读到了什么,决定了它能做什么,也决定了它会做错什么。这一次,宿主会话留下的几个变量,就让它拿着别人的身份去发请求。
这节课要回答的是:搭一个 Agent,除了选模型、写提示词,还要给它准备什么?
装备几个词
为什么要懂
AI 替你做了
用 SDK 搭一个 Agent,几十行代码就能跑起来:它自带循环,会自己读文件、搜内容、多轮行动。
留给你的
给它准备一个环境:在哪个目录里干活、能用哪些工具、开局知道什么、继承哪些变量。这些不写明,它就用你机器上现成的一切。
不懂的代价
同一个 Agent,换一台机器就跑不起来,或者在你的机器上拿到不该拿的东西。答得好不好,常常不取决于模型,而取决于它手边有什么。
流程图,还是 Agent
不用 Agent 的时候,"根据资料回答问题"要写成一张流程图:先按关键词查,查到了就总结,查不到就回复"没有"。每一步、每个分支都由你预先写好。
用户换一种说法提问,流程图就接不住了:资料里写的是英文缩写,用户问的是中文全称;第一次没搜到,要不要换个词再搜?这些分支,写流程图的人很难都想到。
知识库 Agent 的做法是:给它一个资料目录、三个工具、一份写清楚的提示词,剩下的让它自己来。它会先搜关键词,读命中的段落;一次没搜到,就换中文、英文、缩写再搜;还是没有,才回答查不到。
所以判断要不要用 Agent,看步骤是不是固定的:每次都一样的活(每晚同步一次数据、按模板生成周报),写成脚本更稳;步骤要看情况而定的活(回答五花八门的问题、根据报错决定下一步),才轮到 Agent。
环境的三样东西:在哪干活、用什么工具、开局知道什么
拿两个真实的 Agent 对照:
| 知识库 Agent | E2E 导师 | |
|---|---|---|
| 在哪干活 | 资料目录,它从这里启动 | 一个专门的工作目录,里面只放了 4 个 Skill |
| 手里的工具 | 读取、搜索、列文件,全部只读;执行命令、写文件、上网、派子 Agent 都禁用 | 读取、搜索、列文件、调用 Skill,加 5 个自定义工具:查词条、搜词条、查论文、了解学员、记下好问题 |
| 开局知道什么 | 一份通用的提示词、配置里的一句领域说明、启动时自动生成的"资料地图" | 提示词、学员的背景、当前页面的词条内容 |
工具:少而通用
知识库 Agent 只有三个工具,没有用向量库。回答资料里的问题,只需要"找"和"读";能写、能执行的工具用不上,多开一个就多一份风险。它搜了什么、读了哪些文件,界面上都看得到,每条回答下面的出处可以点开对照原文。
E2E 导师多了 5 个自定义工具,因为它要用的数据不在它的工作目录里:词条和论文在后端读进内存的内容里,学员的背景和进度在数据库里。要接外部的数据和系统时,才值得专门做工具,而且数量越少越好。
开局:提示词像一份上岗说明
知识库 Agent 的提示词是一份通用模板,主要交代干活的规矩:
- 你是谁:知识库的名字,加配置里的一句领域说明;
- 只能依据检索到的原文作答,不许用自己的知识补;
- 怎么找:先搜关键词、再读原文;同一个概念换中文、英文、缩写多搜几次;
- 怎么答:每条结论标出处;查不到,就原样回答一句固定的拒答语;
- 一张资料地图:每个文件的路径和第一行。地图只告诉它去哪找,内容一律以读到的原文为准。
开局放什么,看它是不是每次都要用:一定会用到的,直接给;可能用到的,给它找的办法。E2E 导师把当前页面的词条直接放进提示词,省掉了一次查询,首字从 13 秒降到了 7 秒左右(第 17 课);其余 30 个词条,让它用查词条、搜词条两个工具自己去取。
环境要能搬走
知识库 Agent 的引擎按"领域无关"来设计:换一个资料目录、改一份配置、配一套新的评测题,就是另一个知识库。(也有没清干净的地方:提示词里教它换词搜索时举的几个例子,用的还是上一套资料的术语。)仓库里带了一个只有咖啡资料的例子,问它自动驾驶的问题,它回答查不到,没有拿自己的知识去补。
能搬走,还意味着它只依赖说明里写明的那几样东西:
- 变量给白名单:E2E 导师只交给 Agent 四个变量。知识库 Agent 是先整体继承、再删掉可疑的,第一次就漏删了一个(第 18 课);开场的 401,就是继承来的。
- 启动先自检:必需的目录、配置、变量,启动时就检查;缺了就一次说清缺什么、怎么补。
- 配置跟着内容走:注入提示词的领域说明、首页的示例问题,换资料时要一起换。
深潜知识库为什么没用向量库?+
知识库 Agent 的开发计划里写得很明确:走"让 Agent 自己搜原文"的路线,不做向量检索;工具层留好接口,资料多到搜不过来时再加。
这样做的好处:
- 不用切分、建库,换资料就是换目录,加文档后点一下"刷新语料"就能用;
- 引用的是原文,出处能精确到文件,界面上能点开对照;
- 它搜了什么、读了什么,全在轨迹里,答错了能追查是没搜到还是读错了。
代价也很实在:
- 每次都要现搜现读,评测里一次回答要 20 到 30 秒;
- 同一个概念有好几种说法,得在提示词里教它换着搜;
- 资料多到一定规模,现搜就慢得不能用了,那时再上向量检索。
找茬
下面是知识库 Agent 的真实材料(节选,略有简化):开发计划里的 SDK 配置草稿、换成新知识库之后的配置,以及交接之前的启动代码。找出会让它换个环境就出错、或者拿着错误信息开工的地方。
这段 TS / YAML 里埋了 4 处问题。点击你觉得有问题的行,至少找出 3 处再揭晓。
·第 7 行高危
把整台机器的环境变量都交给了它
...process.env把当前进程的所有变量原样传给 Agent。在 Claude Code 的会话里开发时,这里面就有宿主会话留下的几个变量,Agent 因此拿宿主的登录凭证去请求第三方,一直 401(开场的事故)。变量要给白名单,只交它需要的几个。该问的话:Agent 进程实际拿到了哪些环境变量?能不能改成只传需要的那几个?
·第 9 行低危
只换了地址和密钥,没把模型档位也指过去
SDK 内部会按不同档位选模型,做一些辅助工作。参考实现把两个大档位指到目标模型上(小档位可以另设),草稿里一个都没有。开发时补上了,而且三个档位都指向同一个目标模型,免得有请求落到没打算用的模型上。
该问的话:SDK 内部还会请求哪些模型?它们都落到我们配置的模型上了吗?
·第 16 行中危
名字换了,领域说明还是上一套资料的
这句领域说明会被注入提示词,首页的示例问题也从配置里读。知识库换了,这里还写着上一套资料,Agent 就带着错误的领域背景开工。交接前把它清空了:留空是安全的默认值,提示词和首页都有对应的处理。
该问的话:换了资料之后,注入提示词的那几句说明,也跟着换了吗?
·第 19 行中危
资料目录不存在,照样报告"已启动"
这里只算出资料目录的路径,不检查它在不在。实测:没有资料目录时,服务照样打印"已启动"、配置接口返回 200,直到第一次提问才报找不到目录。接手的人只会以为程序坏了。后来改成启动时就检查,缺什么一次说清怎么补。
该问的话:缺了必需的目录或配置时,它会在启动时就报错吗?报错里说清怎么补了吗?
查看代码与答案(4 处问题)
1 // 知识库 Agent 的开发计划(PLAN.md,7 月 19 日)里的 SDK 配置草稿(节选)
2 options: {
3 systemPrompt: KB_SYSTEM_PROMPT, // 字符串形式,领域无关模板
4 allowedTools: ["Read", "Grep", "Glob"],
5 model: process.env.KB_MODEL,
6 env: { // 注意:env 会整体替换 process.env
7 ...process.env,
8 ANTHROPIC_BASE_URL: process.env.KB_BASE_URL,
9 ANTHROPIC_AUTH_TOKEN: process.env.KB_API_KEY,
10 },
11 maxTurns: 15, // 防失控
12 },
13
14 # kb.config.yaml(换成新知识库之后,节选;名字已隐去)
15 name: <新知识库的名字>
16 description: 端到端自动驾驶的学习资料……(上一套资料的说明,原文略)
17
18 // server/config.ts 与 server/index.ts(交接之前,节选)
19 corpusDir: resolve(configDir, raw.corpus_dir ?? "./corpus"),
20 console.log(`KB 后端已启动 → http://localhost:${info.port}`);- 第 7 行 · 高危 · 把整台机器的环境变量都交给了它:
...process.env把当前进程的所有变量原样传给 Agent。在 Claude Code 的会话里开发时,这里面就有宿主会话留下的几个变量,Agent 因此拿宿主的登录凭证去请求第三方,一直 401(开场的事故)。变量要给白名单,只交它需要的几个。 该问的话:Agent 进程实际拿到了哪些环境变量?能不能改成只传需要的那几个? - 第 9 行 · 低危 · 只换了地址和密钥,没把模型档位也指过去:SDK 内部会按不同档位选模型,做一些辅助工作。参考实现把两个大档位指到目标模型上(小档位可以另设),草稿里一个都没有。开发时补上了,而且三个档位都指向同一个目标模型,免得有请求落到没打算用的模型上。 该问的话:SDK 内部还会请求哪些模型?它们都落到我们配置的模型上了吗?
- 第 16 行 · 中危 · 名字换了,领域说明还是上一套资料的:这句领域说明会被注入提示词,首页的示例问题也从配置里读。知识库换了,这里还写着上一套资料,Agent 就带着错误的领域背景开工。交接前把它清空了:留空是安全的默认值,提示词和首页都有对应的处理。 该问的话:换了资料之后,注入提示词的那几句说明,也跟着换了吗?
- 第 19 行 · 中危 · 资料目录不存在,照样报告"已启动":这里只算出资料目录的路径,不检查它在不在。实测:没有资料目录时,服务照样打印"已启动"、配置接口返回 200,直到第一次提问才报找不到目录。接手的人只会以为程序坏了。后来改成启动时就检查,缺什么一次说清怎么补。 该问的话:缺了必需的目录或配置时,它会在启动时就报错吗?报错里说清怎么补了吗?
快测
1. 要做一个只根据公司文档回答问题的 Agent。下面哪种工具配置最合适?
对了。回答问题只需要找和读。知识库 Agent 就只有这三个工具,执行命令、写文件、上网全部禁用。
你可能是这么想的:用不上的工具不会让它答得更好,只会让它能做的错事更多。
你可能是这么想的:专用工具越多,提示词越难写清,新类型的问题还得再加工具;通用的搜索和读取就能覆盖它们。
工具少而通用;要接外部数据和系统时,才专门做工具。
查看选项与答案
- A. 只给读取、搜索、列文件三个只读工具,限定在文档目录(正确)——回答问题只需要找和读。知识库 Agent 就只有这三个工具,执行命令、写文件、上网全部禁用。
- B. 把读写文件、执行命令、联网搜索都打开,让它自己挑着用——用不上的工具不会让它答得更好,只会让它能做的错事更多。
- C. 为每类问题各写一个专用工具,比如查报销、查请假各一个——专用工具越多,提示词越难写清,新类型的问题还得再加工具;通用的搜索和读取就能覆盖它们。
工具少而通用;要接外部数据和系统时,才专门做工具。
2. 知识库 Agent 的提示词里放了一张资料地图:每个文件的路径和第一行。它的作用是?
对了。地图是检索的起点,答案要落在它实际读到的原文上,并标出出处。
你可能是这么想的:第一行只是线索。提示词里明确写着:不许只凭文件名或地图摘要猜测内容。
你可能是这么想的:地图只有每个文件的第一行,答案在正文里,照样要搜、要读。
开局给它方向,答案让它自己去原文里找。
查看选项与答案
- A. 告诉它去哪找;作答时内容一律以读到的原文为准(正确)——地图是检索的起点,答案要落在它实际读到的原文上,并标出出处。
- B. 让它不用打开文件,直接根据地图里的摘要作答——第一行只是线索。提示词里明确写着:不许只凭文件名或地图摘要猜测内容。
- C. 代替搜索工具,省掉每次搜索和读取的时间——地图只有每个文件的第一行,答案在正文里,照样要搜、要读。
开局给它方向,答案让它自己去原文里找。
3. 你写的 Agent 换到同事的电脑上就跑不起来,报错又看不懂。最该先补的是?
你可能是这么想的:作者不在的时候,接手的人照样卡住;而且下一个人还会再卡一次。
对了。知识库 Agent 交接前就是这么改的:缺资料时不再假装启动成功,缺的东西一次报全。
你可能是这么想的:让对方复制你的整台机器,等于承认它离不开你的环境;它本该只依赖说明里写明的那几样东西。
环境要能搬走:依赖写明,启动自检。
查看选项与答案
- A. 在说明文档里加一句:遇到问题,请直接联系作者——作者不在的时候,接手的人照样卡住;而且下一个人还会再卡一次。
- B. 启动时检查必需的目录、配置和变量,缺了就说清怎么补(正确)——知识库 Agent 交接前就是这么改的:缺资料时不再假装启动成功,缺的东西一次报全。
- C. 请同事装上和你一样的工具,再把你的配置整套拷过去——让对方复制你的整台机器,等于承认它离不开你的环境;它本该只依赖说明里写明的那几样东西。
环境要能搬走:依赖写明,启动自检。
判断时刻
你要给团队做一个回答内部文档问题的 Agent,文档是两百多份 Markdown。AI 给了三种做法。
你会选哪一个?
考察:简单、可追查
不用建库,换文档就是换目录;它读了哪几段原文,一清二楚。代价是每次都要现搜现读:知识库 Agent 的评测里,一次回答要 20 到 30 秒;同一个概念,还要在提示词里教它换几种说法去搜。
考察:快,但要维护
检索快,文档再多也撑得住。代价是要切分、建库,文档一更新就要重建索引;找回来的是意思相近的片段,精确的名称和数字,有时不如直接搜原文准;答错了,也更难追查它到底看了什么。
考察:可控,但僵硬
每一步都看得见、改得动。代价是每多一类问题就要改流程;用户换个问法、接着追问一句,流程就接不住了。
先用最简单的环境跑通:几个通用的工具、一个资料目录、一份写清楚的提示词。等资料多到搜不过来,再加检索的基础设施。
三个选项各自的代价
- A. 让 Agent 用搜索和读取工具,直接在原文里找——考察简单、可追查:不用建库,换文档就是换目录;它读了哪几段原文,一清二楚。代价是每次都要现搜现读:知识库 Agent 的评测里,一次回答要 20 到 30 秒;同一个概念,还要在提示词里教它换几种说法去搜。
- B. 先把文档切段、建向量库,提问时取最相近的几段交给模型——考察快,但要维护:检索快,文档再多也撑得住。代价是要切分、建库,文档一更新就要重建索引;找回来的是意思相近的片段,精确的名称和数字,有时不如直接搜原文准;答错了,也更难追查它到底看了什么。
- C. 写一个固定流程:先给问题分类,再按类别去查对应的文档——考察可控,但僵硬:每一步都看得见、改得动。代价是每多一类问题就要改流程;用户换个问法、接着追问一句,流程就接不住了。
先用最简单的环境跑通:几个通用的工具、一个资料目录、一份写清楚的提示词。等资料多到搜不过来,再加检索的基础设施。
带走
下次让 AI 做这件事时,问它
- 这个 Agent 在哪个目录里运行?它能读到、改到哪些文件?
- 它启动时继承了哪些环境变量?哪些是这台机器特有的?请改成只传入需要的那几个。
- 开局放进提示词的是什么?哪些信息该直接给它,哪些该让它用工具自己去找?
- 缺了必需的目录、配置或变量时,它会在启动时就报错,并说清楚怎么补吗?
自己验证
- 在一个干净的目录里重新克隆一份,只照着说明文档操作,看能不能跑起来。
- 故意拿掉一样必需的东西(资料目录、某个配置),确认启动时就报错,而不是等到第一次提问才出问题。
- 打印 Agent 进程实际拿到的环境变量名(只看名字,不看值),对照你打算交给它的清单。
模型负责想,环境决定它能做什么、知道什么。
