Skip to content

幻觉治理

🎯 学习目标

  • 区分虚构事实、虚构引用、工具参数错误等幻觉类型
  • 实现「仅依据上下文」+ 引用片段的 RAG 回答 Prompt
  • 设计证据不足时的拒答策略与日志指标
  • 搭建最小幻觉 Eval 与人工复核流程

引言

Hallucination(幻觉) 指模型 流畅但错误 的输出:编造法条、假论文链接、错误的 API 参数、张冠李戴的人物关系。根因是 LLM 优化的是 plausibility(似然性) 而非 truth(真理)——它擅长补全像真的句子,不保证对应现实世界。

Prompt alone 无法消除幻觉。治理需要 RAG 锚定事实、强制引用、证据不足拒答、输出校验、Eval 量化、护栏过滤 的组合拳。本节用可运行代码演示 cite-or-abstain(引用或拒答) 模式与简单 faithfulness Eval,帮你建立可落地的 基础治理 框架——而非空洞「让 AI 更准确」口号。

章节正文

第 1 步:幻觉类型与产品风险

常见类型:

类型示例风险
虚构事实编造不存在的政策条款合规、法律
虚构引用假 DOI、假 URL信任、学术
数值幻觉财报数字错误财务决策
工具/API 幻觉调用不存在参数Agent 故障
张冠李戴混淆 CEO 姓名公关危机

认知:幻觉率 随 temperature 升高而上升长上下文中间段 信息更易被忽略(lost in the middle)。关键业务 never 只信模型一句话。

第 2 步:RAG + 强制引用:cite-or-abstain Prompt

javascript
function buildGroundedPrompt(chunks, question) {
  const context = chunks
    .map((c, i) => `[${i + 1}] (${c.source})\n${c.text}`)
    .join('\n\n')

  return `## 规则
- 仅使用下方「资料」回答问题
- 每个事实后标注引用编号,如 [1]
- 若资料不足以回答,输出 exactly:INSUFFICIENT_EVIDENCE

## 资料
${context}

## 问题
${question}

## 回答格式
Markdown,含引用编号。
`
}

async function answerGrounded(client, chunks, question) {
  const res = await client.chat.completions.create({
    model: 'gpt-4o-mini',
    messages: [{ role: 'user', content: buildGroundedPrompt(chunks, question) }],
    temperature: 0.2,
  })
  return res.choices[0].message.content
}

示例 chunks:

javascript
const chunks = [
  { source: 'policy.md#refund', text: '未开封商品 7 天内可退款。' },
]
// Q: 退款期限? → 应答含 [1]
// Q: 国际运费? → INSUFFICIENT_EVIDENCE

UI 展示引用卡片,用户可点开原文——提高 trust 与 auditability。

第 3 步:拒答、Moderation 与输出校验

拒答(Abstention) 应 explicit、礼貌、可操作:

javascript
const ABSTAIN = 'INSUFFICIENT_EVIDENCE'

function handleAnswer(text) {
  if (text.includes(ABSTAIN)) {
    return {
      type: 'abstain',
      userMessage: '当前资料里没有找到可靠依据,建议联系人工客服或补充关键词。',
    }
  }
  return { type: 'answer', text }
}

Moderation API 或自建关键词 Guardrails 过滤输入输出违规内容——与幻觉正交但同属安全层。

输出校验(确定性代码):

javascript
function verifyCitations(answer, chunkCount) {
  const refs = [...answer.matchAll(/\[(\d+)\]/g)].map((m) => Number(m[1]))
  const invalid = refs.filter((n) => n < 1 || n > chunkCount)
  return { ok: invalid.length === 0 && refs.length > 0, invalid }
}

无引用或引用越界 → 拒绝展示 或触发 retry。数值类答案用 regex + 与 source 对照 是否 substring 一致。

第 4 步:最小 Faithfulness Eval 脚本

javascript
// eval/grounded_cases.jsonl
// {"question":"...","chunks":[...],"must_cite":[1],"must_abstain":false}

import fs from 'fs'

const cases = fs.readFileSync('eval/grounded_cases.jsonl', 'utf8').trim().split('\n').map(JSON.parse)

let metrics = { total: 0, abstain_ok: 0, cite_ok: 0 }

for (const c of cases) {
  metrics.total++
  const out = await answerGrounded(client, c.chunks, c.question)

  if (c.must_abstain) {
    if (out.includes('INSUFFICIENT_EVIDENCE')) metrics.abstain_ok++
  } else {
    const { ok } = verifyCitations(out, c.chunks.length)
    const cites = c.must_cite.every((n) => out.includes(`[${n}]`))
    if (ok && cites) metrics.cite_ok++
  }
}

console.log(metrics)

扩展:LLM-as-judge(另一模型评 groundedness)成本更高,适合 offline;online 用规则 + 抽样人工。

指标看板:幻觉投诉率、abstain 率、citation 校验失败率、retry 率。

第 5 步:组织流程:从 Demo 到可审计系统

技术栈组合(基础治理):

  1. RAG 提供 chunks(第 4 章)
  2. cite-or-abstain Prompt + 低温
  3. Citation 校验 + 数值对照
  4. Eval 集 每周跑 + 模型/Prompt 变更必跑
  5. 人工复核队列 存 bad case → 反哺 Eval 与 chunk 质量
  6. Disclaimer UI:「AI 辅助,重要决策请核实原文」

Agent 场景:工具调用前 JSON Schema 校验;工具返回再作为唯一事实源,禁止模型编造工具未返回的字段。

不能做的承诺:「零幻觉」——目标是 可测量、可降级、可审计。当证据弱时,拒答优于胡答

javascript
// 统一治理 wrapper 示意
async function governedChat(client, { chunks, question }) {
  if (!chunks?.length) {
    return handleAnswer(ABSTAIN)
  }
  const raw = await answerGrounded(client, chunks, question)
  const handled = handleAnswer(raw)
  if (handled.type === 'abstain') return handled
  const v = verifyCitations(handled.text, chunks.length)
  if (!v.ok) return handleAnswer(ABSTAIN)
  return handled
}

动手练习

  1. 实现 buildGroundedPrompt + answerGrounded,测「资料有/无」两问,确认拒答触发。
  2. 写 verifyCitations,构造含 [99] 越界引用答案断言 ok:false。
  3. 添加 3 条 grounded_cases.jsonl 跑 Eval,记录 cite_ok 比例。
  4. 写一段产品免责声明与人工升级路径(何时转 ticket)。

常见问题

Q:RAG 就能消除幻觉吗?

不能。模型可能误读 chunk、混淆编号、或忽略 INSUFFICIENT 指令。引用校验与 Eval 仍必要。

Q:拒答太多用户不满怎么办?

优化检索 recall、扩充知识库、澄清式追问;监控 abstain 率平衡 trust 与 coverage。

Q:LLM-as-judge 可靠吗?

有 bias,适合 offline 趋势;关键合规仍以规则与人工为准。

本节小结

幻觉是 LLM 似然性目标的固有副产品,表现为虚构事实、引用与工具参数等。基础治理靠 RAG 锚定、cite-or-abstain、引用校验、拒答策略与 Faithfulness Eval 组合;Agent 需 Schema 校验工具链。目标不是零幻觉,而是可测、可审计、证据不足时宁可拒答。