面试官:"你的 AI 客服上线三个月,有没有出现过'胡说八道'的情况?"
候选人想了想:"偶尔会有。用户问一个我们知识库里没有的问题,AI 会自己编一个答案。"
"编的答案用户信了吗?"
"信了……后来用户照着操作,出问题了,投诉到我们这。"
"那你怎么解决的?"
"我让 AI 回答的时候加上'以上信息仅供参考'。"
面试官沉默了。加免责声明不是治幻觉,是甩锅。
幻觉(Hallucination)是 AIGC 项目上线后最致命的问题之一。用户被 AI 骗了,轻则觉得产品不靠谱,重则照着错误指引操作出事。面试官问这个,就是在看你对生产问题有没有敬畏心。
先定义:什么是幻觉
幻觉就是:模型生成的内容看起来合理,但实际是编造的。它可能语法通顺、逻辑自洽、甚至引用了不存在的论文和数字,但本质是错的。
举例:
- 问:"XX 产品的退货政策是什么?" → AI 编了一个看似专业的政策,实际不存在
- 问:"帮我查一下 2024 年 Q3 的财报数据" → AI 报了一个"合理"但错误的数字
- 问:"这个 bug 怎么修?" → AI 给了看起来像模像样的方案,实际会引入新 bug
幻觉最可怕的地方是"合理"。如果它胡说得前言不搭后语,用户一眼就能识破。问题是它说得头头是道,让人信以为真。
幻觉从哪来?三大根源
根源一:训练数据过时。模型的知识截止到训练完成那天。之后发生的事——新政策、新版本、最新股价——它根本不知道,但你又问了,它就只能"猜一个合理的"。
根源二:上下文不足。你问的问题,模型掌握的信息不够回答。检索没召回相关内容、问题本身模糊、专业名词理解偏差——信息不足时,模型不会说"我不知道",而是用常识"脑补"。
根源三:解码随机性。大模型生成是概率采样,不是查字典。temperature 调得越高,越容易选中低概率但"看起来新鲜"的词。同一个问题,两次回答可能不一样,其中一次就可能飘了。
记住一句话:幻觉的本质是"模型在信息不足时,用概率补全了它认为最合理的内容"。它没有撒谎的动机,它只是在"完成句子"。
治理幻觉的四层防线
很多人以为治幻觉就是"换个更大的模型"。错。大模型一样会幻觉,只是"编得更像真的"。治理幻觉是系统工程,四层防线:
第一层:提示约束(源头)。
在系统提示词里明确规则:
String SYSTEM_PROMPT = """ 你是一个严谨的客服助手。 回答规则: 1. 只能依据用户提供的资料或检索到的文档回答; 2. 资料中没有的信息,必须回答"抱歉,这个我暂时无法确认"; 3. 严禁编造产品信息、价格、政策、数据; 4. 涉及数字、日期、条款时,必须引用资料原文。 """;这一层成本最低,但不能完全依赖——模型对规则的遵守是概率性的,不是硬约束。
第二层:RAG 提供事实依据(关键)。
幻觉的一大根源是"信息不足",那就在回答前把相关信息喂给它:
public String answer(String question) { // 1. 检索相关文档 List<Document> docs = vectorStore.similaritySearch(question); // 2. 检索结果拼进 Prompt String context = docs.stream() .map(Document::getContent) .collect(Collectors.joining("\n\n")); // 3. 要求模型"看着资料说话" return chatClient.prompt() .system("只依据以下资料回答,资料没有的就说不知道:\n" + context) .user(question) .call() .content(); }RAG 是治幻觉的主力。它把"凭记忆回答"变成"看着资料回答",相当于考试从闭卷变成开卷。闭卷会编,开卷照着念,错误率大幅下降。
第三层:解码参数(抑制)。
事实类任务,把 temperature 调低:
OpenAiChatOptions options = OpenAiChatOptions.builder() .withModel("gpt-4o") .withTemperature(0.2) // 低温度:减少随机性 .withTopP(0.8) // 限制采样范围 .build();temperature=0.2 意味着模型基本只选概率最高的 token,"编造"的空间被压缩。代价是回答变得保守、缺乏创造性——但客服场景要的就是保守。
第四层:事后校验(兜底)。
回答生成后,做一道"质检":
public String safeAnswer(String question) { String answer = chatClient.prompt().user(question).call().content(); // 校验:回答中的关键断言,能否在检索文档中找到依据? boolean grounded = verifyAgainstSources(answer, retrievedDocs); if (!grounded) { // 低置信度:拒绝回答或转人工 return "抱歉,这个问题我需要核实后再回答,已为您转接人工客服。"; } return answer; }简单的做法:把"回答 + 检索文档"再发给模型,问"以下回答中的每个事实,是否都能在上面的文档中找到依据?逐一指出没有依据的部分"。复杂的做法:实体抽取 + 比对。生产环境常用前者。
给一段可落地的校验 Prompt:
String VERIFY_PROMPT = """ 你是一个事实核查员。 下面是一段 AI 客服的回答,以及它参考的资料。 【回答】 {answer} 【参考资料】 {sources} 请逐句检查回答中的事实性断言(数字、日期、政策、条款、结论), 是否都能在参考资料中找到明确依据。 输出 JSON: {"grounded": true/false, "unsupported_claims": ["无依据的断言1", ...]} """;grounded: false就触发兜底:拒答、转人工、或者重新生成。这个校验调用一次小模型(比如 GPT-4o-mini)就够,相比主回答的开销很小,但能把幻觉拦在用户看到之前。
怎么量化幻觉?三个指标
面试官问"你怎么知道幻觉治理有效果",你得拿数据说话。三个常用指标:
Faithfulness(忠实度):回答中的每个事实,有多少能在参考文档中找到依据。这个数值高低跟任务强相关,关键是给自己建一条基线——每次改动都拿同一套题对比。计算方式:拿测试集的回答 + 文档,让校验模型逐句打分。
Answer Relevance(答案相关性):回答是否切题。答非所问也是幻觉的一种。可以人评,也可以让模型评(LLM-as-a-Judge)。
Context Relevance(上下文相关性):检索回来的文档,有多少真正用上了。这个指标反映的是检索质量——如果检索回来的 Top-5 只有 2 条被回答引用,说明召回有噪声,该优化检索而不是优化生成。
这三个指标搭一个评估流水线,每次改 Prompt、换模型、调检索参数,都跑一遍测试集对比。用数据驱动优化,而不是凭感觉调参。这也是第 12 篇讲的评估体系在幻觉场景的具体落地。
一个完整的面试回答框架
把四层串起来,就是完整的治理方案。值得一提的是,四层不需要一次全上:先上提示约束 + RAG,把最常见的问题解决掉,再根据线上暴露出来的问题补低温和事后校验。治理效果要用评估集来验证,不能靠感觉。
另外面试官还可能追问几个细节,提前准备好:
"RAG 能 100% 消除幻觉吗?"不能。检索质量差(没召回对的内容)、资料本身错误、模型没遵循指令,都会导致幻觉。RAG 是大幅降低,不是消灭。所以第四层校验必须有。
"检索不到相关内容怎么办?"这是高频场景。方案:设置最低相关性阈值,低于阈值直接回答"无法确认"而不是硬答;或者触发"转人工"流程。
"幻觉和编造有区别吗?"本质相同。行业里"幻觉"偏向指无意的错误生成,"编造"偏向指明知不存在还生成。用户视角没区别——都是错的。
🎯 面试官视角的标准回答
如果面试官问:"AIGC 项目的幻觉问题怎么解决?"
先讲根因:幻觉是模型在信息不足时,用概率补全了它认为最合理的内容。三大来源:训练数据过时、上下文不足、解码随机性。<br><br>我的治理方案是四层防线:<br><br>第一层,提示约束。系统提示词明确"只依据资料回答,资料没有就说不知道,严禁编造"。成本最低,但只是概率性约束,不能完全依赖。<br><br>第二层,RAG 兜底。回答前检索相关资料注入上下文,让模型"看着资料说话"。这是主力方案,把闭卷考试变开卷。<br><br>第三层,解码参数。事实类任务 temperature 调到 0.2 左右,减少采样随机性。<br><br>第四层,事后校验。回答生成后做一遍"事实溯源",关键断言没有文档依据的就转人工或拒绝回答。<br><br>补充一点:RAG 不能 100% 消除幻觉,检索质量、资料准确性都会影响。所以生产上必须保留事后校验这道兜底。至于效果好不好,用评估集跑分对比,别凭感觉。
下一篇把视角从"回答"拉回"数据"——RAG 的数据管道。文档五花八门,PDF 扫描件、Word、Excel 全都有,入库前怎么解析、怎么切分、怎么清洗?这一步做不好,后面检索再花哨也白搭。