为什么我的 RAG 应用一直在产生幻觉,以及我是如何修复它的
几个月前,我演示了我的 RAG 客服机器人。 它告诉一位同事我们的退款政策是 30 天。 而我们实际的政策是 14 天。 机器人毫不犹豫,没有说它不确定,而是极其自信地编造了一个答案。
RAG 本应减少幻觉,但我的设置只是让幻觉转移了位置。 在调试这个系统的过程中,我学到了五点教训。
停止使用固定的字符数进行分块 我之前使用带有轻微重叠的 1000 字符分块。 这导致了问题。一个分块经常会将运送规则与退货规则混在一起。 模型将这些不同的部分融合在一起,给出了一个错误的答案。 修复方法:我切换到了语义分块(semantic chunking)。我按标题和段落拆分数据。这样可以将相关信息保留在一起。
相似度并不意味着相关性 我的检索器根据余弦相似度提取了前 3 个分块。 一个分块可能看起来与问题很相似,但并不包含答案。 模型会假设上下文中的所有内容都是真实的。 修复方法:我使用交叉编码器(cross-encoder)增加了一个重排序(reranking)步骤。我还开始记录检索分数。这可以显示系统何时缺乏真实的答案。
告诉模型“失败”也没关系 我最初的提示词很简单:利用上下文回答问题。 当上下文缺失时,它没有给模型任何指令。 模型用猜测填补了空白。 修复方法:我添加了一条明确的指令。如果答案不在上下文中,请回答“不知道”。幻觉现象立即减少了。
强制执行检索阈值 当检索失败时,模型仍然会使用通用知识。 我曾希望提示词能起作用,但“希望”并不是一种策略。 修复方法:我设置了一个硬性的分数阈值。如果最高检索分数过低,系统就会停止,并返回一条兜底消息,而不是让模型去猜测。
测试失败情况,而不仅仅是成功情况 我之前只测试那些我知道文档中涵盖的简单问题。 我忽略了模糊的查询和缺失的信息。 幻觉就存在于这些空白之中。 修复方法:我构建了一个包含“陷阱问题”的评估集。这些案例的正确答案并不在系统中。每当我进行更改时,我都会运行这些测试。
RAG 并不能完全消除幻觉,但它能让幻觉变得可控。 我的机器人仍然不是无所不知。 但现在,当它不确定时,它会如实告知。 这才让这个工具变得可用。
来源:https://dev.to/pallavi_sharma_10c1a6f1da/why-my-rag-app-kept-hallucinating-and-how-i-fixed-it-3i10