Day 011|RAG 是 Agent 的外接大脑:先理解检索增强生成
系列:100 天系统学习 AI Agent 开发
当前阶段:RAG、知识库与工具边界
今日目标:RAG 让 Agent 能基于外部知识回答,而不是完全依赖模型参数记忆。
AI Agent 大模型 Agent开发 LlamaIndex
模型说得很像,不代表它见过这份资料
问一个通用概念,模型可能回答得不错;问公司昨天更新的退款规则、项目里某个配置字段,它就未必知道。更麻烦的是,它可能仍然给出一个语气确定的答案。RAG 的价值就在这里:回答前先找资料,把相关片段连同问题交给模型,再要求结论能回到证据。
“外接大脑”是好记的比喻,却也容易误导。RAG 不会自动让知识正确,更不是把一堆文件丢进向量库就结束。资料是否可信、切分是否完整、查询是否命中、引用是否真的支撑结论,任何一处出错都会把问题带到最终答案里。
RAG 有两条流水线
离线链解决“哪些内容能被找到”,在线链解决“这次问题该找什么、能否回答”。把两条链混成一个“search”按钮,出现错误时就很难判断是知识库没收录、切分损坏,还是查询跑偏。
先做一个手工基线
在接 Embedding 前,我准备先用三份官方资料做一张“问题—证据—回答”表。手工基线速度慢,但能逼自己检查证据是否真的支持结论。
| 问题 | 计划查阅的资料 | 需要摘出的证据 | 回答边界 |
|---|---|---|---|
| Agent 与普通问答有什么不同? | LangChain Agents 文档 | 工具循环、任务完成条件 | 不延伸到所有框架实现 |
| LlamaIndex 如何连接数据和 Agent? | LlamaIndex Agents | Agent、Tools、Workflows 的关系 | 以文档当前描述为准 |
| 什么时候需要持久化状态? | LangGraph Persistence | thread、checkpoint、store 的职责 | 不把短期状态等同长期偏好 |
每一条证据卡至少保存:
{
"question": "什么时候需要持久化状态?",
"source_url": "官方页面地址",
"source_title": "页面标题",
"retrieved_at": "待填写",
"excerpt_summary": "用自己的话概括,不复制长段原文",
"supports": ["可恢复执行", "线程状态"],
"does_not_support": ["所有信息都应永久保存"]
}
这里的 retrieved_at 和摘要要在真实查阅后填写。先留空比编造访问时间更可靠。
三种失败,答案看上去可能都很顺
- 没检到。 正确资料存在,但查询词、切分或过滤让它没有进入候选。
- 检错了。 召回语义相似却版本不匹配的资料,例如旧版部署说明。
- 用错了。 检到了正确片段,模型却给出片段没有支持的额外结论。
因此评测不能只看最终答案。至少要保留原始问题、改写查询、召回片段 ID、来源版本、最终引用和拒答原因。否则答案偶然正确时,我们会高估系统;答案错误时,又不知道该改检索还是改生成。
什么时候不必 RAG
简单寒暄、纯文本改写、用户已经给齐的资料摘要,通常不需要再检索。每个问题都强制查库会增加延迟和费用,还可能让无关片段污染答案。另一方面,涉及私有规则、近期变化或需要引用的事实时,直接依赖模型记忆就不合适。
我现在对 RAG 的理解更克制了:它不是“让模型什么都知道”,而是让系统有机会说清“我依据什么知道,以及资料不足时为什么不知道”。Day 012 会继续拆 Embedding 和向量检索;在那之前,这张手工证据表是很重要的对照组。
面试官会追问:RAG 上线后答错,先改 Prompt 吗?
不先改。我要沿着证据链定位:
- 语料层:正确文档是否入库、版本是否最新、权限是否正确。
- 召回层:正确 chunk 是否进入 top-k;没有进入就查解析、切分、Embedding、过滤和 query rewrite。
- 排序层:进入候选池却排得低,再查混合检索、RRF 和 reranker。
- 生成层:证据已经进入上下文仍答错,才检查引用提示、上下文位置、模型忠实度和拒答规则。
作品集里最好保存一张失败卡:问题、标准答案、召回 chunk、排序分数、最终引用和错误归因。面试官看到这张卡,能立刻判断我是否真的调过 RAG,而不是只会说“向量库 + 大模型”。
今日检查清单
- 知识库只纳入来源明确、权限允许的资料
- 每个测试问题都写出期望证据范围
- 保存召回片段,而不只保存最终回答
- 引用必须支撑对应结论,不能只放一个相关链接
- 资料不足时追问或拒答,不让模型补齐事实
更多推荐

所有评论(0)