13. RAG、工具调用与 Agent
- 拆分检索、重排、生成与引用评估
- 实现可测量的 BM25 基线
- 为工具和 Agent 设置权限、超时与审计
- 文本检索基础
- 模型推理与评估
本章产物检索指标、失败 query、生成契约和工具安全清单。
13.1 为什么模型参数不是数据库
参数中的知识:
- 不能精确知道来源。
- 更新成本高。
- 可能过时。
- 不能保证逐字记忆或可靠计算。
RAG 在推理时检索外部资料,将相关片段放入上下文。工具调用让模型把需要精确执行的工作交给搜索、数据库、计算器或业务 API。
13.2 基础 RAG 流程
文档
→ 分块
→ embedding
→ 向量/关键词索引
用户问题
→ 查询改写(可选)
→ 检索候选
→ rerank
→ 拼接上下文
→ LLM 生成答案与引用13.3 RAG 的真正难点
- Chunk 太小,语义不完整;太大,噪声多。
- Embedding 相似不等于答案相关。
- 文档权限必须在检索阶段执行,不能只靠 prompt。
- 检索到错误内容会让模型更自信地回答错误。
- 引用位置存在不等于引用支持结论。
- 长上下文不是无限内存,更多文档可能稀释关键信息。
评估应拆成:
检索是否找到证据?
rerank 是否把证据排前?
生成是否忠于证据?
引用是否真的支持结论?
没有证据时是否承认不知道?13.4 Tool Calling
模型通常输出结构化调用意图:
{
"name": "get_weather",
"arguments": {"city": "上海"}
}系统负责:
- 校验工具名和 JSON schema。
- 验证权限和参数范围。
- 真正执行工具。
- 把结果作为 tool message 返回模型。
- 模型生成最终回答。
永远不要把模型输出直接当可信 shell、SQL 或支付操作执行。需要 allowlist、参数校验、审批、幂等和审计。
13.5 Agent 是系统,不只是模型
一个 Agent 往往包含:
- 模型。
- 工具协议。
- 状态/记忆。
- 计划或循环控制。
- 权限和审批。
- 超时、重试、预算。
- 观测、日志与评估。
Agent 的可靠性通常受最弱环节限制。一个更强模型无法弥补无权限边界、不可重试 API 或错误状态机。
13.6 动手:先把 RAG 的检索层做对
实验 07B|RAG Retrieval 资源:CPU,无模型下载;时间:约 2 分钟;产物:Top-k 结果、Hit@k、MRR 和失败 query。
运行一条检索:
python code/08_rag_retrieval.py \
--documents data/rag_documents.jsonl \
--query "KV Cache 为什么占用内存?" \
--top-k 3预期第一条文档 ID 是 kv-cache。再运行标注集:
python code/08_rag_retrieval.py \
--documents data/rag_documents.jsonl \
--queries data/rag_queries.jsonl \
--evaluate \
--top-k 3教学夹具应输出:
hit@3: 1.000 (6/6)
mrr@3: 1.000这个 1.000 只证明六条固定 query 的管线和指标实现可工作,不能代表真实产品质量。接下来按顺序提高难度:
- 新增含义相近的干扰文档,观察 Hit@1 是否下降。
- 把长文档切成不同 chunk size,对比召回与上下文冗余。
- 为真实场景人工标注至少 30 条 query—relevant document 对。
- 关键词检索建立基线后,再引入 embedding;若候选多,再验证 reranker。
- 只有检索层达标后,才把文档交给生成模型并评估引用支持度。
也可以使用RAG 检索 Notebook逐步执行。生产版本还必须在检索阶段过滤租户、Workspace 和文档权限;先检索再让模型“不要泄露”不构成权限控制。
故障定位:
| 现象 | 所在层 | 下一步 |
|---|---|---|
| 正确文档不在 Top-k | 分块/索引/查询 | 检查 token、chunk、query 表达与语料覆盖 |
| 正确文档在 Top-k 但答案错 | 生成/提示 | 检查上下文拼接、引用和模型忠实度 |
| 答案正确但引用不支持 | 评估/生成 | 单独判定 claim—evidence 关系 |
| 无证据仍自信回答 | 拒答策略 | 加入不可回答集和置信边界 |
下一步生成一个可审计的 RAG prompt:
python code/11_rag_pipeline.py \
--documents data/rag_documents.jsonl \
--query "KV Cache 为什么占用内存?" \
--top-k 3默认只输出证据、排名和 prompt,不假装已经完成生成。连接一个本地 Transformers causal LM 时再增加 --model;输出中的 evidence、prompt 和 answer 必须一起保存,便于区分检索错误与生成错误。
对逐题结果运行基础评估器:
python code/12_evaluate_cases.py \
--input data/eval_cases.jsonl \
--output artifacts/evaluations/case-results.jsonl这个评估器只提供 exact、contains 和 JSON equality 三种确定性规则,不替代事实性、引用支持和人工 rubric。
本章依据
原理性结论以原始论文、官方文档或公开教材为依据。论文中的实验结果只适用于其声明的模型、数据、硬件和评估设置。
参数记忆与非参数检索记忆结合的 RAG 框架。
双编码器密集检索与向量索引。
BM25 的概率相关性框架、词频饱和与文档长度归一化。
推理轨迹与外部动作交替执行的 Agent 范式。