LLM 幻觉怎么来的?AI 查了三遍代码,戳穿了我的记忆幻觉
文章目录前言一、幻觉到底是怎么产生的二、怎么对抗幻觉三、人也会记忆幻觉四、专业 Agent 怎么做动态调节写在最后前言这篇文章讲清楚两件事LLM 的幻觉到底怎么来的、怎么对抗它以及一个真实案例——我凭印象坚信自己写的 Agent 项目有某个功能结果 AI 查了三遍代码把我的记忆幻觉按在地上摩擦。故事是这样的。我在做一个 Java 轻量级 Agent对标 Claude Code技术栈是 LangChain4j DeepSeek。聊到怎么对抗幻觉时我顺口问了一句我的 Agent 是不是会根据问题动态调 temperature我记得自己设计过这功能。AI 没顺着我说而是去翻了我的代码。然后告诉我没有temperature 写死 0.7。我不信让它再查。它又查了一遍更确定了。我不死心搬出我不是有设置模型力度 effort 吗。它继续查发现我说的 effort 根本不存在那其实是 maxRounds。三回合全程查代码、贴行号、列证据。最后我承认是我记错了。这件事有意思的地方在于——幻觉不是 AI 的专利人也会。区别是 AI 学会了查证据再回答而我还在凭印象张嘴。一、幻觉到底是怎么产生的先把锅找对。幻觉不是 bug是 LLM 的工作原理决定的。本质它是概率续写不是查事实。模型干的事是预测下一个最可能的 token。它追求的是读起来通顺合理不是事实正确。当它不知道答案时不会默认说我不知道而是编一个最像答案的东西出来。因为在训练里流畅地编得到的奖励往往比诚实地认怂更高。具体到几个层面训练数据层面 ├─ 语料本身有错误、过时、矛盾 ├─ 长尾知识冷门事实样本太少 → 记不准就瞎编 └─ 知识截止时间之后的事它根本不知道但照样硬答 生成层面 ├─ temperature 越高越发散 → 越容易跑偏 ├─ 对错误答案也用肯定语气没有不确定标定 └─ 长上下文中间信息被遗忘lost in the middle→ 前后矛盾 Prompt 层面 ├─ 错误前提介绍李白发明的电灯→ 顺着错误编 └─ 指令模糊 → 自由发挥空间过大Agent 场景还有专属的坑幻觉调用工具编一个不存在的工具名或者瞎传参数。错误累积多步循环里早期一个小错会被后面的步骤当成事实越滚越大。二、怎么对抗幻觉一句话总纲让它有据可依 给它说不知道的权利 对输出做校验。拆开讲。1. RAG —— 工业界第一选择把外部知识库检索到的真实内容塞进上下文让模型基于给定材料回答而不是凭记忆。关键不在检索在 prompt 的强约束只根据提供的资料回答资料里没有就说不知道。2. 让它有据可依、可溯源要求模型给出引用、原文片段无来源不作答。再对答案做 grounding 校验——检查回答能不能在材料里找到依据。3. 降低随机性事实类任务temperature 调到接近 0。要稳别让它发挥。4. Prompt 工程给它退路明确告诉模型不知道就说不知道。给它一个退出的选项它就不一定硬编。复杂问题拆步骤减少一步到位的瞎猜。5. 校验与反思Agent 重点工具参数 schema 校验非法参数直接拦。工具白名单调不存在的工具直接报错。self-consistency同一问题多次采样取多数一致的。reflection让模型或另一个模型复查这答案有没有依据。6. 用确定性系统兜底数学、计算交给代码执行事实交给搜索工具实时查。别让模型口算也别让它猜今天的新闻。回到开头那个故事——AI 没有掉进幻觉靠的就是第 6 条它没有凭我记得他写过来回答而是调工具去查代码、贴行号。这就是查证据不靠记忆。三、人也会记忆幻觉那次对话最让我警醒的是我自己的表现。我记得设计过动态温度。这个记忆很真实、很有画面感。但它是假的——我可能只是想过或者在另一个项目里写过记忆张冠李戴了。这跟 LLM 的幻觉一模一样LLM 幻觉 人的记忆幻觉 ───────── ───────── 不知道也编一个 记不清也想起一个 语气很肯定 我也很肯定 不主动查证 懒得去翻代码AI 比当时的我强的地方只有一点它会去查我没有。它查了三次每次都把证据摆出来temperature 只在 3 个地方出现、全是写死的 0.7我说的 effort 全项目零命中那是 maxRounds。证据面前记忆不堪一击。对抗幻觉的终极武器不是更聪明是更愿意查证据。对 AI 如此对人也一样。四、专业 Agent 怎么做动态调节故事的结尾是个反转既然没有那就把它做出来。我用路由法补上了动态温度——每个用户回合先用一次极小的LLM 调用给问题分类再按类型选温度code → 0.0 代码/命令要确定性 factual → 0.2 事实/数学低温减幻觉 chat → 0.5 闲聊折中 creative → 0.9 起名/文案放开发散省 token 的三个设计每回合只分类一次温度作用于整个回合不在主循环每轮都分类。专用小模型分类调用 maxTokens 压到 16只让它吐一个词。最小 prompt只发用户那句话 一行指令不带历史、不带系统提示。单次分类约 50~100 token相对一轮主对话的上千 token可以忽略。但做完我也想清楚了一件事这套按问题调温度其实不是顶级 Agent 的主流做法。像 Claude Code、Cursor 这类代码 Agent基本全程低温甚至接近确定性。因为它们要的是可复现、不跑偏发散是负担。真正的动态调节是这几个维度入门 规则法调温度关键词判断 进阶 LLM 路由调温度我做的这个 主流 模型路由 —— 按难度换模型小模型分类强模型推理 前沿 动态 reasoning effort —— 按难度给思考预算 高级 闭环反馈 —— verifier 判定低质就升温/换模型重采样模型路由简单任务用便宜的小模型难题才上贵的强模型。OpenRouter 这类网关的核心卖点。reasoning effort推理模型时代的主旋律。按难度给思考预算比调温度更直接——它控制的是想多深。闭环反馈不是事前选参数而是事中根据输出质量反调。这就是 evaluator-optimizer 模式。我那个温度池的架构稍微一改就能升级成模型池。这是它天然的延伸方向。写在最后这件事给我两个收获。技术上对抗幻觉的核心是把凭记忆生成换成凭证据生成——RAG、工具兜底、校验反思都是这一句话的不同实现。认知上AI 查代码戳穿我的那一刻我意识到自己才是那个在产生幻觉的人。它只是比我多做了一步——去查。下次你很确定某件事的时候不妨也去翻一眼证据。