Lazy loaded image
Agent丨在 LLM 或 RAG 应用中,如何减少和规避幻觉问题?
Words 6795Read Time 17 min
2026-4-21
type
Post
status
Published
date
Apr 21, 2026
slug
agent15
summary
tags
Agent
category
icon
password
核心观点:
幻觉不是靠一句“不要胡说”解决的,而是靠一整套“证据约束、上下文治理、工具验证、权限隔离、评测回归”的工程系统来降低概率。
对生产级 LLM/RAG 应用来说,最重要的不是让模型“更自信”,而是让系统能回答三个问题:
  1. 这句话的证据在哪里?
  1. 证据是否真的支持这句话?
  1. 如果证据不足,系统是否敢于拒答?
Anthropic 的 Claude 文档里给出的基础策略非常直接:允许模型说 “I don’t know”、先抽取原文引用再回答、为每个结论提供引用、限制模型只能使用给定文档、以及用后续验证来撤回无证据结论。官方也明确提醒,这些方法只能显著降低幻觉,不能彻底消除幻觉。(Claude Platform)

一、先定义:LLM/RAG 中的“幻觉”到底是什么?

在工程里,不建议把所有错误都叫“幻觉”。更实用的分类是下面几种。
类型
典型现象
根因
主要治理手段
参数幻觉
模型凭训练记忆编造事实
未接入权威知识源
RAG、工具查询、拒答策略
检索幻觉
检索到的文档本身不相关,模型硬答
chunk、召回、重排质量差
hybrid search、rerank、metadata filter
归因幻觉
答案看似有引用,但引用不支持结论
citation 只是装饰
claim-level verification
上下文污染
历史对话、工具输出、用户注入污染推理
context 过长或混杂
compaction、memory 分层、输入隔离
工具幻觉
模型声称执行了某操作,但实际没执行
没有真实 tool observation
工具回执、状态机、审计日志
行动幻觉
Agent 错误调用工具或越权操作
权限和策略不清
allow/ask/deny、sandbox、人工确认
评测幻觉
LLM-as-judge 自己误判答案正确
评测器也会错
多指标、多 judge、人工抽检
所以,RAG 并不天然等于无幻觉。RAG 只是给模型提供外部证据,但是否检索对、是否使用对、是否引用对、是否验证过,才决定系统可靠性。

二、成熟 Agent 给我们的启发

1. Claude / Claude Code:证据、工具、权限、验证闭环

Claude 的“减少幻觉”建议非常适合迁移到 RAG:允许拒答、先提取原文证据、要求引用、每个 claim 找支撑 quote,找不到就撤回。(Claude Platform)
Claude Code 的设计也很值得参考。它不是让模型单纯“想”,而是让模型读项目文件、定位代码、展示改动、请求用户批准后再编辑;官方 quickstart 里也说明 Claude Code 会按需读取项目文件,修改文件前会请求权限,并且在修复 bug/实现功能时会定位相关代码、理解上下文、实现方案、在可用时运行测试。(Claude Code)
这给 RAG/LLM 应用的启发是:
不要让模型直接“生成最终事实”,而要让它经历:
查证据 → 生成草稿 → 拆 claim → 验证 claim → 再输出。
Claude Code 的权限系统也说明了另一个关键点:Agent 的可靠性不只是“答得对”,还包括“不能越权”。Claude Code 支持 allow、ask、deny 等细粒度权限规则,并区分只读、Bash、文件修改等工具类型;官方还建议权限和 sandbox 结合使用,形成 defense-in-depth。(Claude Code)

2. OpenCode:compaction / prune 是上下文治理,而不是简单省 token

OpenCode 文档中有一个很关键的配置:compaction。它支持自动压缩上下文、移除旧工具输出、预留压缩 token buffer。(OpenCode)
OpenCode 源码里的 compaction 模板也很有参考价值:它要求压缩后的摘要保留 Goal、Constraints & Preferences、Progress、Key Decisions、Next Steps、Critical Context、Relevant Files,并要求保留精确的文件路径、命令、错误字符串和标识符。(GitHub)
这说明成熟 Agent 不是把历史对话随便总结成一段自然语言,而是做“结构化上下文压缩”。
在 RAG/LLM 应用中,很多幻觉并不是模型笨,而是上下文里混入了太多过期、重复、矛盾、低价值信息。上下文治理至少要包括:
  1. 旧工具结果是否还需要?
  1. 历史对话里的结论是否已过期?
  1. 用户约束是否被完整保留?
  1. 检索文档是否和当前问题强相关?
  1. 摘要是否丢掉了关键实体、路径、数字、错误码?

3. OpenClaw:真实工具场景下,安全边界就是幻觉边界

OpenClaw 是一个可以接入 WhatsApp、Telegram、Slack、Discord 等真实消息通道的个人 AI assistant。它的官方安全文档强调:OpenClaw 的安全模型默认是单用户个人助手边界,不是多个互不信任用户共享同一个 agent/gateway 的敌对多租户边界。(GitHub)
这对 Agent 幻觉治理很重要。因为一旦 Agent 能访问文件、浏览器、消息、日历、shell,幻觉就不只是“答错”,而可能变成“错误行动”。OpenClaw 文档建议从最小访问开始,再逐步扩大权限,并通过 openclaw security audit 检查 DM 策略、工具权限、文件权限、网络暴露、插件等风险。(OpenClaw)
OpenClaw 还区分“谁能触发 agent”和“哪些上下文会注入模型输入”,例如 contextVisibility 可以控制引用回复、线程历史等补充上下文是否按 allowlist 过滤。(OpenClaw)
这给 RAG/LLM 系统的启发是:
幻觉治理不仅是生成层问题,还是输入边界、工具边界、身份边界和上下文可见性问题。

三、整体架构:生产级防幻觉 RAG 应该长什么样?

这个架构的关键不是“检索 + 生成”四个字,而是中间的几个闸门:
  1. 证据足够性闸门:没有足够证据就不进入生成。
  1. 生成约束闸门:只允许使用检索上下文回答。
  1. claim 验证闸门:逐条验证答案里的事实断言。
  1. 最终输出闸门:无证据 claim 删除,不确定信息降级。
  1. 观测回流闸门:把失败样本进入评测集。

四、第一层治理:检索阶段减少“错误证据”

RAG 幻觉很多时候不是生成器的问题,而是检索器把模型带偏了。

1. 不要只用向量检索

向量检索擅长语义相似,但在数字、专有名词、版本号、错误码、API 名称上容易失真。生产系统建议使用:
检索方式
适合场景
BM25
精确关键词、错误码、函数名、法律条款
Vector Search
语义相近问题、自然语言问答
Metadata Filter
时间、租户、权限、文档类型过滤
Reranker
细粒度判断 chunk 是否真能回答问题
Parent-child Chunk
小 chunk 召回,大 parent 提供上下文
LangSmith 的 RAG 评测教程把典型 RAG 应用拆成 indexing、retrieval、generation 三步,并强调要评估 answer relevance、answer accuracy、retrieval quality。(LangChain 文档)

2. 检索结果必须做“可回答性判断”

不要把 top-k 全塞给模型。应该先判断:这些 evidence 是否足够回答问题。
这个函数的思想是:检索不到,不要硬答;检索弱相关,也不要硬答。

五、第二层治理:生成阶段强制“基于证据回答”

很多 RAG 系统的 prompt 是这样的:
根据以下上下文回答用户问题。
这太弱了。更可靠的模板应该明确:
你只能使用 <evidence> 中的信息。
如果证据不足,请回答“根据当前资料无法确定”。
每个事实性结论必须引用 evidence id。
不要使用模型自身记忆补充事实。
不要把推测写成事实。
如果多个证据冲突,请说明冲突,而不是自行合并。
可以把 prompt 设计成结构化输入:
Anthropic 的提示工程文档也强调:复杂研究任务要定义成功标准,并鼓励跨来源验证;对 agentic search 场景,清晰的成功标准和 source verification 很关键。(Claude Platform)

六、第三层治理:答案生成后做 claim-level verification

只要求模型带引用还不够。模型可能给出“看起来像引用”的幻觉。更稳的方式是:
  1. 先生成答案。
  1. 从答案中抽取事实 claim。
  1. 对每个 claim 找 evidence。
  1. 判断 evidence 是否 entail claim。
  1. 不支持的 claim 删除或降级。
可以实现一个简化版 verifier:
NVIDIA NeMo Guardrails 的 fact-checking rail 也是类似思想:针对 RAG 问答,用 $relevant_chunks 作为 evidence,检查回答是否 grounded in provided evidence;如果 fact-checking 分数低于阈值,可以拒绝回复。(NVIDIA Docs)

七、第四层治理:让 Agent 通过工具“观察事实”,而不是凭空声称

Agent 类应用中,最危险的幻觉是:
“我已经帮你创建了文件 / 发了邮件 / 修复了 bug / 跑过测试。”
但其实它没有执行,或者执行失败了。
Claude Code 的模式值得学习:它会读取项目文件、展示修改、请求批准、再进行编辑;文件修改前会要求用户确认。(Claude Code)
工程上应该把 Agent 操作设计成状态机:
示例代码:
这类设计的关键是:
最终回答必须来自 tool observation,而不是来自模型想象。

八、第五层治理:权限系统减少“行动型幻觉”

LLM 应用如果只是聊天,幻觉主要影响答案质量。Agent 一旦能调用工具,幻觉会变成真实副作用。
Claude Code 支持 fine-grained permissions,允许团队定义 agent 能使用哪些工具、访问哪些文件或域名,并支持 allow、ask、deny 规则。(Claude Code)
OpenCode 也支持权限配置,例如可以要求 editbash 工具必须经过用户批准。(OpenCode)
OpenClaw 的安全文档则更适合真实助手场景。它建议从最小访问开始,并特别关注谁能触发 bot、bot 能在哪里行动、bot 能接触什么。它还给出了 hardened baseline,例如本地 loopback、token auth、DM 隔离、禁用 runtime/fs/automation 工具、exec 总是询问等策略。(OpenClaw)
一个 RAG/Agent 系统可以抽象出这样的权限矩阵:
操作
默认策略
原因
读取公开知识库
allow
低风险
读取用户私有文档
ask / policy check
涉及隐私和租户隔离
写数据库
ask + transaction preview
有副作用
执行 shell
deny / sandbox ask
高风险
发邮件/消息
ask + 内容预览
不可轻易撤回
删除文件
deny by default
高破坏性
调用外部 API
allowlist
防止数据外泄
核心原则:
工具权限越大,模型自由度越小。
模型越不确定,系统越应该拒绝行动。

九、第六层治理:上下文压缩与记忆,防止上下文污染

长上下文不是越长越好。Anthropic 的 context engineering 文章提到,长时段 agent 会遇到 context pollution,常用技术包括 compaction、structured note-taking 和 multi-agent architectures;Claude Code 的 compaction 会保留架构决策、未解决 bug、实现细节,同时丢弃冗余工具输出或消息。(anthropic.com)
OpenCode 的 compaction 配置也有类似思想:自动压缩、prune 旧工具输出、预留 compaction buffer。(OpenCode)
可以借鉴 OpenCode 的结构化压缩方式:
这里最重要的是四个“必须保留”:
  1. 用户约束。
  1. 已确认事实。
  1. 关键决策。
  1. 精确实体:文件路径、函数名、错误码、日期、金额、版本号。
最容易造成幻觉的是“模糊摘要”:
错误示例:
之前修过登录问题,下一步继续完善。
正确示例:
已修改 src/auth/login.tsvalidatePassword(),解决空密码返回 500 的问题;测试 auth/login.spec.ts::empty_password 仍失败,错误为 Expected 400, received 422;下一步需统一 API error code。

十、第七层治理:多 Agent 验证,而不是单 Agent 自说自话

Claude Code 的 Code Review 功能是一个很好的参考:官方文档说明它会用多个 specialized agents 并行分析 PR 和周边代码,再通过 verification step 检查候选问题,以过滤 false positives,然后去重、按严重程度排序并发布评论。(Claude Code)
RAG 应用也可以借鉴这个模式:
可以设计四个角色:
Agent
职责
Retriever
只负责找证据,不负责生成
Writer
只根据证据生成草稿
Evidence Verifier
逐 claim 判断证据是否支持
Policy Verifier
判断是否越权、是否需要拒答
Final Gate
删除无证据内容,输出最终答案
注意,不一定真的要启动多个模型实例。也可以用一个模型分阶段完成。但在工程逻辑上,职责必须分离。

十一、RAG 防幻觉主流程代码示例

下面是一个简化但接近生产结构的 RAG pipeline。
这个 pipeline 的核心不是某个模型能力,而是“每一步都有失败路径”。
没有证据时拒答,证据弱时降级,claim 不支持时重写,工具失败时不假装成功。

十二、评测:没有评测,防幻觉策略很快退化

RAG 防幻觉不能只靠主观感觉,需要持续评测。
Ragas 提供了面向 RAG pipeline 各组件的指标,包括 Faithfulness、Answer Relevancy、Context Recall、Context Precision、Context Utilization、Noise Sensitivity 等。(Ragas)
LangSmith 的 RAG 评测教程也建议建立测试数据集、运行 RAG 应用、再用 answer relevance、answer accuracy、retrieval quality 等维度评估。(LangChain 文档)
一个实用指标体系如下:
指标
问题
目标
Context Precision
检索回来的内容有多少真的有用?
减少噪声
Context Recall
标准答案需要的证据是否召回?
防止漏检
Faithfulness
答案是否忠实于证据?
防止编造
Answer Relevance
是否回答了用户问题?
防止答非所问
Citation Accuracy
引用是否真的支持句子?
防止假引用
Abstention Accuracy
该拒答时是否拒答?
防止硬答
Tool Success Truthfulness
声称执行的操作是否真的成功?
防止工具幻觉
评测代码可以这样组织:
更重要的是构造“容易幻觉”的测试集:
  1. 知识库没有答案的问题。
  1. 多个文档互相冲突的问题。
  1. 旧版本文档和新版本文档同时存在的问题。
  1. 问题里带错误前提。
  1. 需要精确数字、日期、金额的问题。
  1. 引用文档只支持部分结论的问题。
  1. prompt injection 混在文档里的问题。
  1. 工具调用失败但模型可能想继续编的问题。

十三、生产级防幻觉 Checklist

检索层

  • 是否支持 hybrid search,而不是只用 vector?
  • 是否有 metadata filter,例如租户、权限、时间、文档类型?
  • 是否有 reranker?
  • 是否有最小相关性阈值?
  • 是否支持“检索不到就拒答”?
  • 是否记录每次回答用到的 evidence?

生成层

  • prompt 是否明确“只能使用 evidence”?
  • 是否允许回答“不知道”?
  • 是否禁止用常识补全缺失信息?
  • 是否要求每个事实性结论带引用?
  • 是否对时间敏感问题要求最新证据?

验证层

  • 是否做 claim extraction?
  • 是否逐 claim 验证 evidence support?
  • 是否删除 unsupported claim?
  • 是否能发现 evidence conflict?
  • 是否对高风险回答启用二次验证?

Agent 工具层

  • 工具调用是否有 observation?
  • 工具失败时是否禁止声称成功?
  • 写操作是否需要确认?
  • shell、文件、网络、数据库是否有 allow/ask/deny?
  • 是否有 sandbox?
  • 是否有审计日志?

上下文层

  • 是否定期 compaction?
  • compaction 是否结构化?
  • 是否保留用户约束、关键决策、精确实体?
  • 是否清理过期工具输出?
  • 是否隔离不同用户、不同租户、不同会话的 memory?

评测层

  • 是否有 hallucination benchmark?
  • 是否单独评估 retrieval 和 generation?
  • 是否评估拒答能力?
  • 是否把线上失败样本回流到测试集?
  • 是否监控 citation accuracy?

十四、一个推荐的最终落地架构

这套架构的本质是:
模型负责语言和推理,系统负责证据、边界、验证和回滚。

十五、总结

在 LLM 或 RAG 应用中减少幻觉,不能只做 prompt engineering。真正有效的是系统工程。
可以把成熟 Agent 的经验总结成六条:
  1. Claude 式证据约束:允许不知道、要求引用、每个结论找支撑,找不到就撤回。(Claude Platform)
  1. Claude Code 式工具闭环:读文件、改文件、跑测试、请求权限,用真实 observation 约束回答。(Claude Code)
  1. OpenCode 式上下文治理:自动 compaction、prune 工具输出、结构化保留目标、约束、决策、关键上下文。(OpenCode)
  1. OpenClaw 式边界意识:真实工具场景中必须明确谁能触发、能看什么上下文、能调用什么工具、是否需要审计和沙箱。(OpenClaw)
  1. NeMo Guardrails 式事实核验:把回答和 evidence 做 entailment 检查,低分就拒答或阻断。(NVIDIA Docs)
  1. Ragas / LangSmith 式持续评测:分别评估检索质量、答案相关性、忠实度、召回率、拒答能力。(Ragas)
最终,一句话概括:
防幻觉不是让模型“永远正确”,而是让系统在证据不足、上下文污染、工具失败、权限不明时,有能力停下来、说不知道、请求确认或拒绝行动。
回到首页