GOCLAWLLM ENGINEERING
GoClaw 首页

13. RAG、工具调用与 Agent

应用工程4~6 小时
学习目标
  1. 拆分检索、重排、生成与引用评估
  2. 实现可测量的 BM25 基线
  3. 为工具和 Agent 设置权限、超时与审计
前置知识
  • 文本检索基础
  • 模型推理与评估

本章产物检索指标、失败 query、生成契约和工具安全清单。

13.1 为什么模型参数不是数据库

参数中的知识:

RAG 在推理时检索外部资料,将相关片段放入上下文。工具调用让模型把需要精确执行的工作交给搜索、数据库、计算器或业务 API。

13.2 基础 RAG 流程

文档
  → 分块
  → embedding
  → 向量/关键词索引

用户问题
  → 查询改写(可选)
  → 检索候选
  → rerank
  → 拼接上下文
  → LLM 生成答案与引用

13.3 RAG 的真正难点

评估应拆成:

检索是否找到证据?
rerank 是否把证据排前?
生成是否忠于证据?
引用是否真的支持结论?
没有证据时是否承认不知道?

13.4 Tool Calling

模型通常输出结构化调用意图:

{
  "name": "get_weather",
  "arguments": {"city": "上海"}
}

系统负责:

  1. 校验工具名和 JSON schema。
  2. 验证权限和参数范围。
  3. 真正执行工具。
  4. 把结果作为 tool message 返回模型。
  5. 模型生成最终回答。

永远不要把模型输出直接当可信 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 的管线和指标实现可工作,不能代表真实产品质量。接下来按顺序提高难度:

  1. 新增含义相近的干扰文档,观察 Hit@1 是否下降。
  2. 把长文档切成不同 chunk size,对比召回与上下文冗余。
  3. 为真实场景人工标注至少 30 条 query—relevant document 对。
  4. 关键词检索建立基线后,再引入 embedding;若候选多,再验证 reranker。
  5. 只有检索层达标后,才把文档交给生成模型并评估引用支持度。

也可以使用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。


本章依据

原理性结论以原始论文、官方文档或公开教材为依据。论文中的实验结果只适用于其声明的模型、数据、硬件和评估设置。

  1. 参数记忆与非参数检索记忆结合的 RAG 框架。

  2. 双编码器密集检索与向量索引。

  3. BM25 的概率相关性框架、词频饱和与文档长度归一化。

  4. 推理轨迹与外部动作交替执行的 Agent 范式。