答案质量与幻觉控制

本节聚焦 RAG 系统中最常见且最难彻底根除的问题:幻觉(Hallucination)与答案质量不稳定。我们从“数据 -> 检索 -> 生成 -> 约束 -> 观测”五个层面构建一个可迭代、可量化、可回溯的质量提升闭环,并列出最小可实施集(MVP Hardening)与进阶增强策略。

质量问题分层模型

层级典型症状根因类别优先级
语料层过时 / 不覆盖内容缺失、未标准化
切块层回答引用不聚焦语义边界错误、块过长
检索层召回偏题 / 噪音多topK 不当 / 无重排
生成层编造事实 / 结构混乱指令不明确 / 上下文冗余
约束层回答可信度不可判缺乏引用验证 / 置信评估
观测层问题反复出现缺乏指标、无反馈分类

语料与预处理

  1. 内容标准化:统一术语、别名映射(K8s→Kubernetes),移除噪声(版权声明、导航、空段)。
  2. 时效控制:新增 lastReviewed 字段,定期巡检排序优先级。
  3. 元数据增强:为每段添加 source, section, lang, version, hash
  4. 变更检测:文件内容 Hash 变化 → 触发增量嵌入与旧向量 upsert。

切块策略(Chunking)

维度建议说明
长度300500 中文字符 / 200400 tokens平衡语义完整与召回精度
边界标题、列表、段落、代码块对齐避免句子截断导致语义丢失
重叠0 或 50~80 tokens(跨段依赖时)防止跨界引用缺失
内容压缩可选生成“摘要向量”面向概念型问答二次召回

检索与重排

  1. 向量检索:主召回(余弦相似度 topK=8 或 5~10 动态)。
  2. 语义重排:交叉编码器或 API rerank 过滤并排序前 15→5。
  3. 混合检索:向量 + BM25(关键词)合并去重 → rerank。
  4. 语义分类路由:对“定义类/步骤类/比较类”设不同 topK。
  5. 过滤策略:最小相似度阈值 + 结果跨度(同文档合并)。

相似度阈值示例

const MIN_SIMILARITY = 0.70; // 低于则拒答
def filter(results) {
  return results.filter(r => r.score >= MIN_SIMILARITY);
}

提示工程(Prompt Engineering)

结构化模板:

System: 你是...(角色 + 边界 + 拒答条件)
Context: \n[doc1] 内容...\n[doc2] 内容...
Instruction: 基于上方上下文回答用户问题。不得编造。若无充分依据输出 REFUSE 模板。
Format: 1) 直接回答 2) 若引用多来源,按 [1][3] 标注 3) 末尾追加“引用”部分。
Language: 复用用户语言。

引用编号要求模型输出可验证结构,后续可做自动校验。

生成约束与后处理

机制目标实现要点
引用完整性校验避免无依据陈述检测 [\d+] 是否至少出现一次
引用存在性核验防止伪造引用解析引用编号 → 对应上下文块 ID 是否存在
事实回查(可选)高风险场景再验证对生成句子提取三元组再向量对比
置信度打分分级展示组合 avgSim, maxSim, coverage
降级策略防止误导低置信度 → 输出安全模板 + 建议追问
去重与合并减少重复句基于 Jaccard / 余弦阈值 0.85 去重

监控与指标

指标描述采集方式
similarity_dist前 K 相似度分布检索阶段收集
citation_count回答引用块数量生成后解析
citation_match_rate引用命中率引用编号 ↔ 检索块集合
refusal_rate拒答占比答案模板分类
followup_rate用户追问率会话日志序列分析
hallucination_flags人工标注幻觉数反馈面板

反馈闭环

  1. 采样失败会话:topK 全部低相似度 / 引用缺失 / 人工标注幻觉。
  2. 分类标签:NO_RECALL BAD_RERANK PROMPT_FAIL OVERGEN NEED_CONTENT
  3. 修复动作:
    • NO_RECALL → 语料扩充或召回 topK ↑
    • BAD_RERANK → 调整 rerank 模型 / 特征
    • PROMPT_FAIL → 修改指令模板
    • OVERGEN → 限制输出长度 + 强制格式
    • NEED_CONTENT → 添加文档并增量嵌入

最小可实施集(MVP Hardening)

类别措施成本影响
检索动态 topK + 相似度阈值↓噪音 ↑精准
生成结构化 Prompt + 引用编号↑可追溯
约束引用存在性与最少 1 条校验↓幻觉
观测记录相似度分布 & 引用统计↑可诊断
反馈手工标注 20 个失败会话建立迭代基础

进阶增强

  1. Rerank 模型自蒸馏:用高成本模型离线重排 → 训练轻量 cross-encoder。
  2. 检索多样性:MMR 或基于覆盖率的去冗余,避免高度相似块挤占上下文窗口。
  3. 语义图谱:对实体/关系做结构化抽取 → 支撑精确对齐与回答验证。
  4. 答案自我反思链:第一轮输出 → 反思检查(引用/逻辑/漏洞)→ 第二轮修订。
  5. 统一评分服务:集中计算质量指标并回写日志,用于 Dashboard 与报警。

实现起步代码片段

function buildPrompt(blocks: RetrievedBlock[], question: string, lang: string) {
  const context = blocks.map((b, i) => `[doc${i+1}] ${b.text}`).join('\n');
  return `System: 你是严谨的技术问答助手...\nContext:\n${context}\nInstruction: 基于上述内容回答:${question}`;
}

function validateAnswer(answer: string, blockCount: number) {
  const cited = new Set([...answer.matchAll(/\[(\d+)\]/g)].map(m => Number(m[1])));
  const valid = [...cited].every(n => n >=1 && n <= blockCount) && cited.size > 0;
  return { cited: [...cited], valid };
}

小结

通过分层拆解、结构化提示、引用约束、可观测指标与反馈闭环,RAG 幻觉控制成为一条“工程化运营”路径,而非一次性调参。建议先实施最小集,再按优先级迭代增强,以持续压缩幻觉发生概率并提升答案可信度。

文章导航

章节内容

这是章节的内容页面。

章节概览

评论区