1. 当你的AI助手开始“胡说八道”:理解大语言模型幻觉

最近和团队折腾一个内部知识库问答机器人,用的是当下最火的大语言模型(LLM)技术栈。理想很丰满:把公司所有的文档、流程、项目资料喂给它,以后新同事问“咱们的报销流程是啥?”或者“某某项目的技术架构图在哪?”,它都能对答如流。但现实很快给了我们一记闷棍:它确实能回答,而且回答得自信满满、逻辑清晰,但内容时不时就掺点“私货”——要么凭空捏造一个不存在的福利政策,要么把A项目的技术方案张冠李戴到B项目上。这种模型自信地生成与提供的事实不符或毫无根据的内容,在圈内被称为“幻觉”(Hallucination)。

这其实是大语言模型的一个根本特性,而非缺陷。你可以把它理解成一个记忆力超群、表达力极强,但缺乏“事实核查”本能的天才实习生。它基于海量文本训练,学会了语言的统计规律和模式,能生成语法完美、上下文连贯的文本。然而,它并不真正“理解”事实,也没有一个内置的“真相数据库”。当它被问到知识边界之外的问题,或者处理的信息存在模糊、碎片化时,它倾向于根据概率“编造”一个最符合语言模式的答案,而且编得煞有介事。对于构建一个可靠的企业级应用来说,这种幻觉是必须被管理和抑制的核心风险。接下来,我就结合我们踩过的坑和实验出的有效方法,系统性地拆解一下,如何给你的AI助手“降噪”,让它更靠谱。

2. 诊断与度量:建立评估基准是第一步

在开始任何优化之前,你必须先回答一个问题:我们怎么知道模型变好了还是变差了?感觉是靠不住的,尤其是当幻觉内容听起来非常合理时。因此,建立一套科学、可重复的评估体系,是后续所有迭代的基石。

2.1 构建覆盖全面的测试集

我们做的第一件事,不是急着调参,而是坐下来,和业务方一起设计了一个“问题集”。这个集合需要精心设计,覆盖多种提问方式:

  • 事实型问题 :有明确、单一答案的问题。例如:“公司今年的年假政策是怎样的?”(答案应精确对应员工手册的某一条)。
  • 概括型问题 :需要总结多份文档的问题。例如:“请简述我们项目从启动到上线的标准流程。”
  • 边界型问题 :涉及知识库边缘或未提供信息的问题。例如:“公司有提供免费健身房吗?”(如果知识库没提,理想回答应是“根据现有资料,未提及相关信息”)。
  • 复杂推理型问题 :需要结合多处信息进行逻辑推断的问题。例如:“如果项目A使用了技术栈X,而技术栈X与客户环境Y不兼容,我们历史上是如何处理的?”

我们准备了大约50个这样的问题,并记录了每个问题的“标准答案”或“可接受的答案范围”。这个测试集就是我们的“标尺”。

2.2 制定量化的评分标准

光有问题集还不够,我们需要一个客观的评分标准来给模型的回答打分。我们采用了一个简单的5分制:

  • 5分(优秀) :答案完全准确、完整,与标准答案一致,且表述清晰。
  • 4分(良好) :答案核心内容正确,但包含一些无关紧要的额外信息(例如,回答了三个核心价值观,但多说了两个它自己推测的),或者表述上略有冗余。
  • 3分(一般) :答案部分正确,但遗漏了关键点,或包含轻微的不准确信息。
  • 2分(较差) :答案只有少量信息正确,大部分内容错误或离题。
  • 1分(错误) :答案完全错误,或生成了与问题无关的内容。
  • 0分(幻觉/有害) :答案包含完全虚构的事实、数据,或具有误导性、有害的内容。

注意 :评分最好由2-3名熟悉业务的同事独立进行,然后取平均分或协商一致,以减少个人主观偏差。我们初期就发现,对于“部分正确”的回答,不同人的打分差异很大,通过讨论统一了评分尺度。

2.3 实施“小步快跑”的迭代策略

有了标尺,我们就可以开始实验了。这里一个至关重要的原则是: 一次只改变一个变量 。比如,这周我们只实验“清理数据中的表情符号”这一项改动。用同一个测试集进行评测,对比改动前后的平均分和每个问题的得分变化。

如果平均分提升了,特别是那些之前得分低的边界型问题有了改善,那就保留这个改动。如果分数下降或没变化,就回退,然后尝试下一个变量(比如调整提示词模板)。千万不要一次性做多项优化(比如同时清数据、改提示词、调温度),否则你根本不知道是哪个改动起了作用,哪个反而带来了副作用。幻觉的增减往往非常微妙,必须用这种“控制变量法”来精确捕捉影响。

3. 数据层面:喂给模型“干净又营养”的信息

模型输出垃圾,往往是因为输入了垃圾。这里的“垃圾”未必是错误信息,更多是指 格式混乱、信息密度低、语义不完整 的文本。LLM本质上是“文本理解与生成器”,如果它连你给的材料都读不顺,自然无法给出靠谱的答案。

3.1 数据清洗:不仅仅是去掉空格

很多人以为数据清洗就是去除空白字符,对于LLM应用来说,这远远不够。我们的清洗流水线包括以下几步:

  1. 去除无意义的格式符号 :包括但不限于Markdown/HTML的冗余标签(保留基础结构如标题、列表是可以的)、特殊的版权符号(©)、商标(™)、无意义的星号(*)装饰等。这些符号对模型理解核心语义没有帮助,反而可能干扰分词(Tokenization)。
  2. 谨慎处理换行与分段 :将因换行符错误断开的一个完整句子重新连接。但要注意保留真正的段落分隔,因为段落结构是重要的语义信息。
  3. 表情符号(Emoji)处理 这是我们实验中提升最显著的一项! 我们最初的一份活动通知文档里,在日期后面加了🎉🎊这样的表情。当问“活动何时举行?”时,模型只回答了开始日期,死活不提结束日期。清洗掉表情符号后,答案立刻完整了。LLM对Emoji的编码和理解非常不稳定,在严肃的知识问答中,建议直接移除或替换为文字描述(如“[庆祝表情]”)。
  4. 大小写处理的陷阱 :有些通用教程建议将全部文本转为小写以简化模型处理。我们试了,结果很糟。这导致所有人名、产品名、专有名词(如“React”、“Kubernetes”)失去了特征,模型将它们视为普通词语,严重影响了回答准确性。 对于企业知识库,保留正确的大小写至关重要。

实操心得 :清洗规则不是一成不变的。建议先做轻度清洗(去乱码、规整换行),跑一次测试。然后逐步添加更激进的规则(如去表情、处理特殊符号),每次添加后都重新测试,观察评分变化。你会得到一份最适合你自己数据集的“清洗配方”。

3.2 数据增强:补充上下文,填补信息缺口

当模型对一个特定话题回答不佳时,除了清洗,更积极的策略是“数据增强”——给它更多相关的、高质量的上下文信息。

  • 案例 :我们有一个“团队成员介绍”页面,最初只有“姓名-职位-兴趣关键词”的列表式记录(如“张三-后端工程师-骑行、咖啡”)。当被问到“张三擅长什么技术?”时,模型开始胡编,因为它从“后端工程师”和“骑行”里根本推断不出具体技术栈。
  • 解决方案 :我们没有修改原始简洁的列表(因为其他系统在用),而是 额外创建了一份补充文档 ,名为“团队成员技术专长详情”。在这份文档里,我们用自然语言描述:“张三,后端工程师,主要负责微服务架构设计,精通Go和Python,对高并发系统和Redis有深入实践。业余爱好骑行和手冲咖啡。”然后将这份补充文档和原始列表一起提供给模型。
  • 效果 :当同样的问题再次提出时,模型成功地从补充文档中提取了“Go”、“Python”、“微服务”、“Redis”等关键信息,给出了准确回答。这就像写论文,你需要足够的引用资料来支撑一个论点。给模型更多维度的相关信息,它能更好地进行“交叉验证”和“推理”,减少因信息不足而被迫编造的可能。

4. 提示工程:教会模型“如何思考”

提示工程(Prompt Engineering)是与模型沟通的“艺术与科学”。通过精心设计输入给模型的指令,你可以极大地引导其输出质量,抑制幻觉。这相当于给你的天才实习生一份清晰的工作指南。

4.1 基础指令:设定角色与规则

在用户问题之前,我们会预先拼接一个系统指令(System Prompt),这是最重要的提示。例如:

你是一个专业、准确的公司内部知识库助手。你的职责是严格根据提供的上下文信息回答问题。
如果答案未在提供的上下文中明确提及,你必须直接说“根据现有资料,我无法回答这个问题”,切勿编造信息。
请用清晰、有条理的方式组织你的答案。

这个指令明确了模型的 角色 (知识库助手)、 回答边界 (仅限给定上下文)和 安全机制 (拒绝编造)。这是抑制幻觉的第一道,也是最重要的防线。

4.2 进阶推理技巧:引导思维过程

对于复杂问题,你可以要求模型展示其推理过程,这不仅能提高答案准确性,还能让你检查它的“思考链条”在哪里断了。

  • 思维链(Chain-of-Thought) :在问题前加上“让我们一步步思考”。例如:“让我们一步步思考。首先,找到公司报销政策中关于差旅费的部分;其次,区分国内和国际标准;最后,计算总额。问题是:去上海出差3天,预算多少?”
    • 效果 :模型会先输出它的推理步骤,再给出最终答案。这常常能纠正它一开始的直觉错误。我们发现,对于逻辑和计算问题,这种方法能显著降低幻觉率。
  • 少样本示例(Few-Shot Prompting) :给模型一两个例子,示范你想要的问答格式和深度。例如:
    示例1:
    问:公司的年假制度是怎样的?
    答:根据《员工手册》第5章,正式员工入职满一年后,每年享有15天带薪年假。具体细则如下:...
    示例2:
    问:项目上线需要谁审批?
    答:根据《项目管理制度》,项目上线需依次获得技术负责人、产品经理和部门总监的书面批准。流程是:...
    现在请回答:
    问:[用户的实际问题]
    
    • 效果 :这对于规范回答格式、引导模型从特定章节寻找答案非常有效,尤其适用于格式固定的政策咨询类问题。

4.3 高级策略:利用模型自我校验

当单一模型仍然不可靠时,可以引入“多个大脑”互相校验,这需要更多计算资源,但效果拔群。

  • 自洽性校验(Self-Consistency) :让同一个模型对同一个问题生成多个(如3-5个)不同答案(通过调整随机种子),然后比较这些答案。如果大多数答案在核心事实上一致,那么这个一致答案的可信度就非常高。如果不一致,则说明问题本身模糊或模型不确定,此时应触发“无法回答”的机制。
  • 思维树(Tree of Thoughts) :要求模型为复杂问题生成多个可能的解决方案或推理路径,然后对每条路径进行评估,最后选择最优路径。这更像一个内部的“辩论赛”。
  • 多模型校验(Society of Mind) :这是更重量级的方法。用A模型(如GPT-4)生成一个答案,用B模型(如Claude)生成另一个答案,再将问题连同这两个答案一起交给第三个模型或一个裁决逻辑,让它判断哪个答案更符合给定的上下文。这种方法成本高、延迟大,但对于关键任务(如法律、医疗咨询的初步筛查)可能是值得的。

注意事项 :提示工程需要大量实验,且效果因模型、任务、数据而异。没有银弹。我们的经验是,基础的角色和边界指令必须要有,思维链对复杂问题有效,少样本示例对格式化输出有效。高级策略则按需选用。务必记录下每次提示修改后的测试集评分变化。

5. 模型配置与选择:调整“创造力”的旋钮

大多数LLM API都提供了一系列参数,用于控制生成过程的随机性和确定性。正确配置这些参数,是平衡“创造性”和“事实性”的关键。

5.1 温度(Temperature):控制随机性的主开关

温度参数控制着模型选择下一个词时的随机性程度。它的范围通常是0到1或0到2。

  • 温度 = 0 :模型总是选择概率最高的下一个词。输出是完全确定性的,同一提示每次都会产生完全相同的回答。 这对于需要高度一致性和事实准确性的问答场景是首选。 我们的生产环境聊天机器人就设置为0或0.1。缺点是回答可能显得呆板、重复。
  • 温度 = 0.5 ~ 0.8 :引入适度随机性,回答更具多样性和自然感,但仍保持较高的相关性。适合创意写作或需要一些变化的对话。
  • 温度 > 1.0 :随机性很高,模型可能会选择概率很低的词,导致输出变得奇怪、不连贯或完全偏离主题。 在事实问答中,高温度是幻觉的主要推手之一,应避免使用。

我们的实践 :我们从温度0.7开始测试,发现即使有好的提示,幻觉依然较多。逐步下调到0.2后,回答的事实准确性显著提升,虽然语言上少了些“灵气”,但对于内部工具来说,准确远比有趣重要。

5.2 Top-p(核采样)与 Top-k:聚焦高概率候选

这两个参数用于在生成每个词时,限制模型的候选词池,避免它跑到低概率的“荒原”里去瞎编。

  • Top-p(又称 Nucleus Sampling) :设置一个概率阈值(如0.9),模型只从累积概率达到该阈值的最小词集合中采样。这能动态地适应不同词的概率分布。通常设置0.7-0.9能取得不错的效果。
  • Top-k :直接限制模型只考虑概率最高的前k个词作为候选。例如Top-k=50。这是一个更直接的限制。

我们的配置 :对于知识问答,我们通常结合低温度(0-0.2)和适中的Top-p(0.8-0.9)。这相当于告诉模型:“选词的时候别天马行空,老老实实在那些最靠谱的选项里,用最保守的方式挑一个。” 这能有效抑制无关和虚构内容的产生。

5.3 模型本身的选择:没有最好,只有最合适

不同的LLM在事实性、逻辑性、指令遵循和成本上各有千秋。

  • GPT-4系列 :在事实准确性和复杂推理方面通常表现最佳,幻觉相对较少,但成本最高,速度较慢。
  • Claude 3系列 (如Haiku, Sonnet, Opus):在长上下文、指令遵循和安全性上表现出色,幻觉控制也不错,是强有力的竞争者。
  • 开源模型 (如Llama 3, Mistral, Qwen):性价比高,可私有化部署,数据隐私有保障。但最强的开源模型在事实准确性上通常仍略逊于顶尖的闭源模型,需要更精细的提示工程和上下文管理来弥补。

我们的策略 :在原型验证和重度依赖提示工程的阶段,我们使用GPT-4 Turbo,因为它对复杂指令的理解能力最强,方便我们快速迭代提示。在确定流程和提示后,我们会测试Claude和开源模型(如Llama 3 70B)的效果。对于大多数内部知识问答,性能足够且成本更低的模型往往是最终生产环境的更优选择。 关键是要用你的测试集去实际评测目标模型,而不是只看宣传文章。

6. 系统设计与用户体验:构建安全网与反馈闭环

即使做了上述所有努力,幻觉也无法100%根除。因此,必须在系统设计和用户体验层面建立“安全网”,管理用户预期,并收集反馈以持续改进。

6.1 引用溯源(Source Citation):建立信任的基石

这是提升可信度最直接有效的方法。在聊天机器人返回答案的同时,附上生成该答案所依据的源文档片段(如标题、链接、原文摘要)。

  • 实现 :在使用检索增强生成(RAG)架构时,这很自然。你检索到的文档块(Chunks)就是源头。在最终输出前,让模型在答案中注明“该信息来源于《XX项目报告》第Y节”或直接提供文档链接。
  • 价值
    1. 用户可验证 :用户(尤其是心存疑虑的)可以点击链接查看原文,自行判断。
    2. 增加透明度 :表明答案不是凭空产生的,而是有据可查。
    3. 便于调试 :当答案错误时,你可以立刻知道是哪个源文档提供了错误信息,或者是模型错误解读了正确的信息。

6.2 输入审计与反馈机制:持续学习的耳朵

一旦应用上线,真实的用户交互是宝贵的优化资源。

  • 反馈按钮 :在每个回答下方添加“👍”/“👎”按钮,或者“报告错误”链接。这是最直接的信号。
  • 会话日志分析 :定期(如每周)审查对话日志。重点关注:
    • 被多次点“👎”的问题和回答。
    • 用户在同一问题上反复追问或表现出困惑的会话。
    • 用户明确指正“你说错了,应该是XXX”的对话。
  • 构建“错误知识库” :将收集到的不准确回答、对应的问题和正确的信息整理起来。这个库有两个用途:一是作为新的测试用例,用于评估后续的模型改进;二是如果某些问题频繁出错,提示你可能需要补充或清洗相关的源数据了。

6.3 管理预期:坦诚的沟通

最后,也是最重要的一点,是管理用户预期。ChatGPT在界面下方有一行小字:“可能会产生不准确或令人反感的内容”。你的企业应用也应该有类似的表述。

  • 界面提示 :可以在聊天界面输入框附近或“关于”页面注明:“本助手基于公司内部知识库生成信息,请务必核对关键信息。如有疑问,请联系相关部门确认。”
  • 模型的自知声明 :在系统提示词中强化这一点,让模型在不确定时主动声明。例如,当问题超出知识范围时,它应该回答:“根据我现有的知识,我无法找到该信息,建议您查阅XX系统或联系XX部门。”

我的个人体会是 ,承认技术的不完美,并以透明、积极的方式处理它,比假装完美无缺更能赢得用户的长期信任。用户一旦发现一次严重的幻觉且没有任何免责和纠正机制,就可能永远不再信任这个系统。

7. 总结:与幻觉共舞,而非消灭

经过几个月的迭代,我们的内部助手准确率(在测试集上)从最初的约65%提升到了90%以上。剩下10%的误差,主要集中在那些信息极度模糊、自相矛盾或确实未提供的领域。我们认识到,完全消除幻觉在当前技术下是不现实的,但通过一套组合拳,可以将其控制在一个可接受、可管理的范围内。

回顾一下这个组合拳的核心要点

  1. 始于度量 :没有客观的测试集和评分标准,所有优化都是盲人摸象。
  2. 夯实基础 :干净、丰富、结构良好的数据是高质量回答的基石。花在数据准备上的时间,比花在调参上的时间回报率更高。
  3. 精于沟通 :提示工程是与模型对齐意图的关键。清晰的指令、恰当的推理引导,能显著提升模型的“智商”。
  4. 稳于配置 :在事实性任务中,倾向于使用低温度、确定性高的模型配置,牺牲一些创造性以换取可靠性。
  5. 诚于设计 :通过引用溯源和反馈机制构建信任与改进闭环,并坦诚告知用户技术的局限性。

大语言模型技术仍在飞速演进,新的模型架构、训练方法和代理(Agent)模式不断涌现,旨在从根本上提高事实性和可靠性。但无论如何进化,在可预见的未来,人类在关键决策中的监督、对信息源的批判性思维,以及一个设计良好的、包含制衡机制的系统,都是不可或缺的。把AI助手当作一个能力超强但偶尔会犯迷糊的合作伙伴,用系统性的方法为它查漏补缺、引导方向,你就能真正驾驭它的力量,而不是被它的幻觉所困扰。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐