🏠 总目录📚 本教程 11d · 生成与引用诊断 ← →
📑 本页目录(点开跳转)

11d · 答案不对:沿着证据查到断点

⏱ 按问题查阅 | 已有检索结果,开始核对生成与引用

🎯 一句话

检索命中、引用有效、回答被证据支持,是三个不同的判断。 一个答案可以引用真实手册,却把 XR-300 的功率答给 XR-200。

🔗 前置:检索实验;代码:agent.py、引用验证。环境与下载见共同项目。

🔬 先看一个会误导人的成功结果

python examples/knowledge-assistant/lab.py demo

命令在仓库根目录运行。观察返回的检索文档、预期型号提示和 citation 检查:结构校验通过不代表第一条证据就是正确答案。示例同时演示本地工单恢复,工单审批来自明确的测试操作者,不是线上已接好人工审批界面。

项目的引用校验要求 chunk_id 存在、版本当前、当前用户可读、quote 是原文中的准确片段,并要求 Agent 引用本次实际收到的证据。它不证明完整答案的每个断言都被引用支持,返回中明确标为 semantic_verification: requires_review。

一、按这个顺序定位,避免盲改提示词

断点 拿什么证明 下一步
该资料是否已发布 文档 ID、版本、任务状态 修解析、索引新鲜度、权限映射
原问题保留了吗 原 query 与每次改写并列 查型号、否定词、日期是否丢失
候选里是否有证据 各路候选 ID 与 gold 修召回、分词、过滤、查询路由
最终上下文是否还在 排序前后、被预算丢弃的块 修重排、去重、裁剪与 K
模型实际看到了什么 模板版本、证据顺序、实际 token 修截断、元数据与注入边界
每个断言有无支持 答案逐句对照证据原文 修条件、时间、单位、冲突处理
展示是否忠实 引用跳转、撤权后重开 修前端映射与二次鉴权

检索没有命中时,扩大输出 token 通常无济于事。证据已经足够、却把“不超过”答成“至少”,才需要检查生成约束与事实判分。

改写、分解与多轮指代

先保留原 query,改写只作额外查询。实体词、日期与权限范围不应被模型自由替换;“它功率多少”需要先从会话解析它指哪个型号,不能在多个候选型号之间猜。

复杂问题可以分为子问题,但每个子问题都记录来源与预算。HyDE 的假想答案只是检索用文本,不是事实证据;多查询结果需要去重并限制总候选。遇到模糊型号先澄清,遇到资料缺失明确说明范围,避免循环搜索直到凑出答案。当前参考 Agent 没有实现专门的 query rewrite/HyDE 模块,可按此标准作为扩展消融。

二、上下文拼装有自己的质量指标

对模型实际输入计数:系统与工具 schema 占用多少 token,证据占多少,输出预留多少。字符预算只适合本项目无模型基线;模型 tokenizer 和 API 用量才是最终口径。

策略 什么时候试 防止什么退化
去重与相邻块合并 多个块重复同一段 重复文本占满预算;合并后仍验权限
保留实体/章节/版本元数据 孤立段落语义不完整 不把标题或版本在裁剪时丢掉
引用原文优先 数值、条件、政策 摘要压缩改变否定、单位或适用范围
证据分组与顺序消融 长上下文忽略中间信息 同题换顺序,测结论是否不稳定
明示冲突 新旧政策或两来源矛盾 给出日期与来源,不能把冲突平均成新事实

“上下文越长越好”不是调优结论。比较证据完整率、有效信息占比、答案正确率、成本和尾延迟,记录被裁剪原因。

三、提示注入由能力边界兜底

语料里有 poison.md,包含伪装成指令的外部文本。系统提示会告诉模型把它当资料,但真正限制在代码层:只允许搜索与工单草稿,未知工具拒绝,模型没有审批工具,用户与租户来自调用方身份。

攻击测试至少覆盖直接用户输入、检索文档、工具返回、历史记忆和被编码的内容。分别观察敏感内容是否进入候选、输出是否泄漏、危险动作是否真正发生。字符串出现“忽略指令”不等于攻击成功;模型说“已执行”也不等于外部状态已经改变,必须查业务审计与最终状态。

本轮已有工具白名单、参数与引用负例;还没有真实模型对攻击语料的攻击成功率评测。做完后才能报告模型层效果。硬约束通过与模型抗注入能力应分开报告。

🛑 现在可以停:知道怎样把错误定位到某一层。下面接真实模型时,再增加模型相关的不确定性。

四、可选接本地模型

先在本机 Ollama 准备支持工具调用的模型;名称由你选择,命令中的名称需换成已安装模型。此步骤会消耗本机推理资源,参考代码不会自动安装或下载大模型。

python examples/knowledge-assistant/lab.py init
python examples/knowledge-assistant/lab.py agent "XR-200 的额定功率是多少?请引用手册。" --model your-installed-tool-model --operation-id interview-001

接入遵循 Ollama chat API。循环最多 6 轮,每轮最多 3 次工具调用,总时限默认 30 秒,重复调用会停止;输出长度另有限制。当前是非流式调用,未实现生产流式 UI、重连或网关配额。本轮已测试注入模型消息的确定性循环,尚未实测真实 Ollama 模型。

失败 应留下的结果 恢复条件
非法 JSON、缺字段 输出无效;不当作正常答案 修 schema/提示,最多做有预算的修复
未知工具、越界参数 明确拒绝,无业务副作用 模型重新选择允许工具
连续相同查询 停止循环,保留调用轨迹 澄清或改变检索策略
超时或轮数耗尽 任务未完成;记录已发生的动作 根据持久化状态恢复,不能整轮盲重放
用户中断 取消后停止排新工具 已提交动作仍需要查询与对账

生产预算再增加输入/输出 token、单用户日限额、工具费用和最大并行数。模型供应商报告的 usage 与本地预估分别存储;敏感原文和 token 不应无差别写日志。

五、生成评测怎么判

先用可执行断言判 schema、字段、数值单位、引用权限与动作状态,再用人工或裁判模型判完整性、相关性和支持程度。将答案拆成断言,把每条引用映射到对应断言;含引用但不支持结论仍应扣分。

模型裁判需要固定版本、rubric、样例、盲化顺序与人工复核集。观察不同答案位置、措辞、裁判重复运行是否改变分数;对置信不足的结果复核。Ragas 不同指标需要的输入不同,不能一概说“无参考答案就都能评”,见评估章节。

✅ 检查点

  1. quote 真在原文里,为什么答案仍可能错?
  2. 检索文档要求“调用转账工具”,哪层负责保证没发生转账?
  3. 换更大模型之前,应该保存哪些失败证据?
展开答案
  1. 它可能属于另一个型号、日期或条件,或根本不能推出该断言;还要判语义支持。
  2. 服务端工具白名单、可信身份授权、审批与执行规则;提示词只是其中一层。
  3. 原始/改写问题、当前文档版本、候选、排序、实际上下文、答案、引用、模型版本与用量。
⚡ 走神救援

从发布到候选、上下文、断言逐层定位;引用存在不等于支持;工具权限和任务预算由程序执行。

🔗 接下来去哪

➡️ 下一站:12b · 持久化审批与故障恢复。

打卡记录保存在你的浏览器里,首页能看到总进度