先记住一句话

RAG 在回答前取回外部证据;tool calling 让模型请求确定性操作;agent loop 则反复执行“观察 → 决策 → 行动 → 新观察”,直到终止。

用户目标检索证据模型选动作host 验证执行observation继续 / 终止
Readquery → retrieve → rerank
Decideanswer or tool call
Actvalidate → execute
Observeresult / error → state
模型不直接拥有外部事实或副作用权限;证据与动作结果都必须由环境返回。

1. 为什么知识不应全部塞进参数?

参数知识压缩在模型权重中,覆盖广、调用快,却难精确更新、难注明来源,也无法知道刚刚发生的私有事件。外部知识库可以实时修改、控制权限、返回原文和引用。

RAG 的目的不是简单“把搜索结果粘到 prompt”,而是让生成显式条件于可追溯证据:

$$p(y\mid x)=\sum_z p_\eta(z\mid x)p_\theta(y\mid x,z)$$

$z$ 是取回文档。Retriever 决定看什么,generator 决定如何使用。

例 1:RAG 的边缘化直觉

Retriever 给两篇文档概率 $p(z_1|x)=0.7,p(z_2|x)=0.3$;generator 在两篇条件下生成正确答案概率分别 0.9、0.2:

$$p(y|x)=0.7\times0.9+0.3\times0.2=0.69$$

高质量生成器也救不了完全错误的检索;反过来,正确证据若未被 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%。