先记住一句话
RAG 在回答前取回外部证据;tool calling 让模型请求确定性操作;agent loop 则反复执行“观察 → 决策 → 行动 → 新观察”,直到终止。
1. 为什么知识不应全部塞进参数?
参数知识压缩在模型权重中,覆盖广、调用快,却难精确更新、难注明来源,也无法知道刚刚发生的私有事件。外部知识库可以实时修改、控制权限、返回原文和引用。
RAG 的目的不是简单“把搜索结果粘到 prompt”,而是让生成显式条件于可追溯证据:
$z$ 是取回文档。Retriever 决定看什么,generator 决定如何使用。
例 1:RAG 的边缘化直觉
Retriever 给两篇文档概率 $p(z_1|x)=0.7,p(z_2|x)=0.3$;generator 在两篇条件下生成正确答案概率分别 0.9、0.2:
高质量生成器也救不了完全错误的检索;反过来,正确证据若未被 generator 使用也不会自动变成正确答案。
2. 一个实际 RAG pipeline
documents
→ parse / clean / chunk
→ embed + metadata
→ vector / lexical index
user query
→ query rewrite
→ retrieve candidates
→ filter + rerank
→ pack context with citations
→ generate grounded answer
每一步都可能失败:PDF 解析错、chunk 截断关键信息、query 太模糊、embedding 找到主题相近但答案错误的段落、context 过长挤掉真正证据,或模型忽略证据继续凭参数回答。
例 2:context packing 预算
模型窗口 8,192 tokens;system+history 1,500,预留回答 1,200,剩余证据预算 $8192-1500-1200=5492$。若每 chunk 连 metadata 平均 600 tokens,最多完整放 9 个(5,400 tokens),再多一个就溢出。
3. Embedding 相似度代表什么?
Embedding model 把 query 和文档映射到向量,常用 cosine 或 dot product 排序。训练目标使语义相关 pair 靠近,但几何距离不是事实真伪概率,也不天然理解访问权限、时间有效性和精确数字。
实践中常结合:
- Dense retrieval:擅长语义改写和概念相关。
- Sparse/BM25:擅长精确关键词、ID、罕见名称。
- Metadata filter:先按时间、项目、权限缩小范围。
- Cross-encoder reranker:让 query 与候选深度交互,精排少量文档。
Hybrid retrieval 的意义是不同失败模式互补,不是“向量数据库自动解决知识”。
例 3:cosine similarity 手算
Query $q=[1,1]$,文档 $d_1=[2,0]$、$d_2=[1,1]$:
$\cos(q,d_1)=2/(\sqrt2\times2)=0.707$。
$\cos(q,d_2)=2/(\sqrt2\times\sqrt2)=1$。
$d_2$ 排名更高,但 1.0 只表示向量同方向,不是“事实 100% 正确”。
4. Tool calling 与普通文本有什么差别?
模型产生结构化调用意图,宿主程序验证并执行,再把真实结果作为 observation 返回:
model: {"tool":"weather", "arguments":{"city":"Vancouver"}}
host: validate schema + permissions → execute API
tool: {"temperature":18, "unit":"C"}
model: 根据 observation 生成最终回答
模型本身并没有执行 API。真正副作用发生在 host/tool 层,因此 schema validation、权限、超时、幂等、重试和审计日志都属于 agent correctness。
例 4:重试为什么需要幂等
支付工具请求 100 元,第一次调用其实成功但响应超时;若直接重试,可能共扣 200 元。两次都携带相同 idempotency key pay-42,host 可返回第一次结果而不重复副作用。
5. ReAct:推理与行动交错
ReAct 把任务展开成多轮:
reason / decide next step
→ action(tool, args)
→ observation
→ update state
→ next action or final answer
关键改进是模型不必在第一次回答前假装知道工具结果;它可根据 observation 修正计划。实现不一定要向用户显示完整 chain-of-thought,内部状态可以是简短 action rationale、结构化 plan 或隐藏 reasoning。
例 5:多步可靠性相乘
一个 agent 任务需要 5 次关键 tool call;假设每一步独立成功率 0.95,则全程无错概率 $0.95^5\approx0.774$。单步看似 95%,端到端只剩约 77.4%。验证、可恢复重试和减少不必要步骤很重要。
6. Agent 由哪些层组成?
| 层 | 职责 | 典型失败 |
|---|---|---|
| Model / policy | 理解目标、选择下一动作 | 误解、幻觉参数 |
| Tools | 读取或改变外部世界 | API 错误、权限不足、副作用 |
| State / memory | 保留当前进度与长期事实 | 过期、污染、召回错误 |
| Orchestrator | 循环、预算、重试、终止、审批 | 死循环、重复执行、无界成本 |
| Evaluator / guardrail | 验证输出和动作 | 漏检、错误阻断、被绕过 |
7. Memory 不是一个无限聊天记录
- Working memory:当前任务上下文、临时变量、工具结果。
- Episodic memory:过去发生了什么,带时间和来源。
- Semantic memory:提炼后的稳定事实、用户偏好、规则。
写入比读取更危险:模型推测出来的错误一旦保存,后续会被当事实反复强化。应保存原始证据、provenance、时间和置信度,并允许修订或过期。
8. Agent 的主要安全边界
检索文档和网页可能包含 prompt injection,诱导模型泄露秘密或调用高权限工具。系统必须把“数据内容”和“可信指令”分层;工具权限按最小化原则,危险动作要求审批,外部文本不能自行扩大权限。
可靠性还需要:
- 工具调用 schema 验证与明确错误返回;
- 副作用操作的 idempotency key 和重复检测;
- 最大步数、token/时间/费用预算;
- 完成条件与失败状态,而不是无限“再试一次”;
- 完整 trace,便于回放哪一步开始偏离。
9. 与机器人闭环的对应
软件 agent 的 observation/action loop 与机器人 sense–plan–act 同构,但现实动作不可轻易撤销,状态连续且存在延迟。机器人需要更严格的安全 controller、频率分层和状态估计;LLM 可以做高层任务分解,却不能取代实时控制与碰撞约束。
“用了 LLM + tools”不自动成为可靠 agent。真正决定系统能力的是 observation 是否真实、tool 是否可控、状态是否正确、循环是否有终止与验证。
自测:先算后展开
1. Retriever 找到相似文档为何还可能答错?
相似度只表示表示空间相关;文档可能过期、缺答案、权限不符,generator 也可能错误解释或忽略它。
2. Tool call 真正由谁执行?
宿主/orchestrator 验证模型输出后调用实际 API;模型只提出结构化动作请求。
3. Agent loop 比单次 prompt 多了什么?
外部动作后的新 observation 会进入状态,模型可据此修正下一步,直到明确完成或失败。
4. 4,096 token 窗口,已有 1,000,预留输出 800,证据可用多少?
$4096-1000-800=2296$ tokens。
5. 三个独立步骤成功率都为 0.9,端到端成功率?
$0.9^3=0.729$,即 72.9%。