幻觉:为什么您的本地 LLM 会编造内容,以及如何 limiter
AI 幻觉是指以正确答案般的自信语气说出的错误答案:虚构的日期、不存在的引文、凭空编造的 Python 函数。本地大语言模型也会出现与大型云端模型相同的现象,有时在低精度量化下更加明显。本指南将用通俗语言解释这些编造内容的来源,然后列出减少它们的具体设置、提示词和防护措施——尤其说明哪些情况下绝不能相信机器。
#什么是幻觉?
“幻觉”指模型生成的任何错误、虚构或无法验证,却被当作事实呈现的陈述。这不是计算机意义上的程序错误:程序完全正常运行,只是在生成看似可信的文本。问题在于,“看似可信”和“真实”并不是一回事。
具体而言,幻觉有多种表现形式:精确但错误的数字(“这座城市的人口为 47,312 人”)、不存在的来源(“根据 Dupont 等人 2019 年的研究”)、虚构的 API 或命令(`ollama sync --cloud`),或将真实信息错误地重新组合在一起。共同点是:语气始终十分自信。
#模型为什么会胡编?
只需 1 小时,即可在您的电脑上拥有专属的免费 ChatGPT — LM Studio、Ollama、Open WebUI、您的文档,无需云端。
- 在线空间,终身可用
- PDF + 文件
- 终身更新
大语言模型(LLM)的训练只有一个任务:以统计上合理的方式续写文本。它吸收了数十亿个句子,并从中总结出规律。当您提出问题时,它不会“查询”知识库,而是根据您的请求和它所接受的训练,逐词生成最可能的后续文本。
- 不具备可靠的事实记忆能力
- 知识被分散在网络权重中,而非像数据库那样被存储。模型‘记住’的是某种趋势,而非确切事实。具体细节(如日期、数字、罕见专有名词)往往是最先出现偏差的部分。
- 训练停留在某个时间点
- 模型对训练数据截止日期之后的信息一无所知。当被问及近期事件时,它不会说“我不知道”,而是根据已知信息进行推测,从而编造出信息。
- 倾向于给出答案的偏差
- LLM 的优化目标是给出回答,而不是保持沉默。面对不知道答案的问题时,最可能生成的后续内容往往是一个语气笃定的回答,而不是承认自己不知道。
- 量化的效果
- 将模型压缩为 Q4_K_M 可节省 VRAM,但会略微降低精度。在专业性强、对事实准确性要求高的任务中,相比 Q8_0 或 FP16,激进量化可能会提高模型编造内容的比例。
- 采样中的随机性
- 每生成一个词,模型都会从较有可能的候选词中随机抽取。抽样越“有创意”(温度越高),就越可能偏向概率较低的后续内容——从而产生错误。
换句话说,幻觉并非意外:对于一个无法获知真相、只生成看似合理文本的系统来说,这是正常的运作方式。我们无法消除幻觉,只能减少并加以控制。
#识别编造的内容
在修复之前,必须先能够识别。某些信号应立即引起您的警觉。
- 精确得令人怀疑
- 精确到个位的数值、确切的日期、小众主题上精细到具体数位的百分比:没有来源支持时,越精确就越值得怀疑。
- 引用和链接
- 文章标题、作者姓名、URL、页码、法律引用。LLM 会编造看起来完全可信的来源。模型生成的任何引用,都不能在未经核实的情况下被视为真实。
- “应该”存在的代码
- 一些看似合理但实际不存在的函数名或命令行选项。模型会通过类比相近的API进行补全。
- 答案会变化
- 在新对话中再次提出完全相同的问题。如果事实性回答每次都不同,说明模型是在猜测,而不是真正知道答案。
#减少编造内容的设置
生成参数控制着创造性与可靠性之间的权衡。凡是涉及事实、代码或信息提取的任务,都应追求确定、审慎的输出。
- temperature
- 主要调节参数。在0时,模型始终选择最可能的词,输出稳定且保守。设置为0.7至1.0可实现创造性写作,但若用于事实性任务,则应调整为0.1至0.3。
- top_p
- 将采样范围限制为累计概率达到给定值的一组候选词。较低的值(0.1–0.5)会截去低概率词的长尾部分,而这些词往往会导致生成内容偏离预期。
- top_k
- 限制每一步考虑的候选数量。较低的 top_k 值(10–20)能缩小模型可能偏离正常输出的选择空间。
- seed
- 设置种子可使生成过程可复现:在相同设置下,输出结果一致。这对于测试回答是否稳定或随机至关重要。
- num_ctx
- 上下文长度。过短会导致模型‘忘记’开头部分,可能错误地拼接碎片内容。请确保您的参考文档能完整容纳在上下文窗口内。
使用 Ollama 时,可以在 API 调用中动态传入这些设置,也可以在 Modelfile 中将其固定下来。下面是一个向本地守护进程发起调用的示例,采用了适合事实性回答的保守设置:
要让这些设置对某个模型永久生效,可以将它们写入 Modelfile,并创建一个专用于事实性任务的变体:
#促使模型谨慎回答的提示词
您如何表述请求,会显著影响模型编造内容的频率。思路是:明确允许模型承认不知道,并禁止它编造。
- 允许回答「不知道」
- “如果你不确定,就回答:我不知道。”如果不给模型这样的许可,它就会编造内容来填补空白。
- 要求回答有据可依
- « 仅根据下方文本回答。不得使用任何外部知识。 » 强制模型仅基于提供的上下文进行响应。
- 要求在文本中提供来源
- “对于每一项断言,请引用文档中支持它的原句。”如果模型找不到依据,缺乏依据这一点就会显现出来。
- 区分事实与假设
- ‘区分哪些是已确定的事实,哪些是你的假设。’ 这会促使模型标注自身的不确定性。
- 分解复杂任务
- 把问题拆成几个明确的步骤,比提出一个宽泛的开放式问题更能减少自由发挥的空间。
#让回答以您自己的文档为依据
减少 AI 幻觉最有效的技术仍是 RAG(检索增强生成):与其让模型从其模糊的记忆中提取信息,不如向它提供您文档中的相关片段,并要求它仅依据这些片段作答。模型的角色由此从“信息源”转变为“阅读者”。
- 01为您的文档建立索引您的文件(PDF、笔记、内部文档)会被分割成片段,通过嵌入模型转换为向量,并存储到向量数据库中。
- 02查找相关段落每次提问,系统都会检索语义上最接近请求的片段并将其召回。
- 03注入至上下文检索到的段落将粘贴到提示中,并附带严格指令:仅根据这些片段作答。
- 04生成带有引用的回答模型基于提供的片段生成回复,理想情况下应引用具体片段。若片段中不包含答案,必须明确指出。
Open WebUI 连接到 Ollama 守护进程(http://localhost:11434)后,可提供内置的 RAG 功能:您可以上传文档,并在对话中用 `#` 引用它们。对于定制需求,向量数据库配合自行构建的处理流程可以提供更多控制。
#每次都进行核查
没有任何技术能让LLM达到100%的可靠性。因此,验证不是可选项,而是工作流程中的必要步骤,且应根据风险程度进行调整。
- 与真实来源交叉验证
- 所有用于实际应用的事实性数据(数字、日期、引述)均需核实来自原始来源。模型仅作为起点,绝非权威依据。
- 先测试代码,再信任它
- 执行模型生成的内容。若调用不存在的函数,将立即报错。切勿在未运行前复制任何关键代码。
- 比较两次生成结果
- 使用不同的随机种子,或在新会话中重新提出问题。保持一致的内容更可靠;发生变化的内容则值得怀疑。
- 使用第二个模型
- 让另一个模型(或规模更大的版本)复核某个模型的回答,可以发现明显的不一致之处。
- 保持人类参与
- 对于任何具有实际后果的决策(如健康、法律、财务、安全),最终的确认仍需人工完成。无例外。
#永远不应信任的情况
某些领域集中了最危险的幻觉。在这些领域中,将模型的任何输出均视为未经验证的草稿,默认为错误,除非有相反证据。
- 健康与药品
- 用药剂量、药物相互作用、诊断。编造的信息可能带来危险。模型并非医疗专业人员。
- 法律与税务
- 法律条文、判例、申报义务。LLM 会编造看似真实、足以误导人的法律引用。
- 精确的数值与统计数据
- 人口、比率、金额、精确日期。数字细节是模型的结构性短板。
- 近期动态
- 训练数据截止日期之后的所有内容。模型会通过推测补全,却不会说明这一点。
- 引用与参考
- 标题、作者、URL、页码。每次再次使用前,都必须逐一核实,无一例外。
- 小众人物与冷门事实
- 鲜为人知的人物传记、冷门细节:模型会重新拼凑零散信息,再编造其余内容。
#深入了解
减少幻觉,主要靠结合合适的设置与可靠的信息依据。以下指南可补充这一方法:
- 温度、top-p、top-k:参数详解
- 深入掌握本文提及的采样控制参数,并精细调节创造力与可靠性之间的平衡。
- 选择量化方案(Q4、Q5、Q8、FP16)
- 帮助您理解压缩对事实准确性的影响,并在可靠性优先时作出取舍。
- 掌握系统提示词
- 进一步了解让模型谨慎作答的提示词,并将避免编造设为默认行为。
有反馈、发现了错误,或想补充说明?请告诉我们,让这份指南对每个人都更有帮助。