📑 本页目录(点开跳转)
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 不同指标需要的输入不同,不能一概说“无参考答案就都能评”,见评估章节。
✅ 检查点
- quote 真在原文里,为什么答案仍可能错?
- 检索文档要求“调用转账工具”,哪层负责保证没发生转账?
- 换更大模型之前,应该保存哪些失败证据?
展开答案
- 它可能属于另一个型号、日期或条件,或根本不能推出该断言;还要判语义支持。
- 服务端工具白名单、可信身份授权、审批与执行规则;提示词只是其中一层。
- 原始/改写问题、当前文档版本、候选、排序、实际上下文、答案、引用、模型版本与用量。
从发布到候选、上下文、断言逐层定位;引用存在不等于支持;工具权限和任务预算由程序执行。
🔗 接下来去哪
➡️ 下一站:12b · 持久化审批与故障恢复。