𝗪𝗵𝘆 𝗠𝘆 𝗥𝗔𝗚 𝗔𝗽𝗽 𝗛𝗮𝗹𝗹𝘂𝗰𝗶𝗻𝗮𝘁𝗲𝗱 𝗔𝗻𝗱 𝗛𝗼𝘄 𝗜 𝗙𝗶𝘅𝗲𝗱 𝗜𝘁

我曾向一位同事演示我的 RAG 支持机器人。

机器人告诉她我们的退款政策是 30 天。

而我们实际的政策是 14 天。

机器人并没有说它不确定,而是极其自信地编造了一个答案。

RAG 本应消除幻觉,但我的设置只是转移了幻觉。

我通过以下五个步骤解决了这个问题。

  1. 优化你的分块策略 (chunking strategy)

我以前按字符数来拆分文档。这是一个错误。

一个分块往往会混杂不同的主题,比如物流和退货。模型会将这些信息混合,从而得出错误的答案。

解决方法:我改用了语义分块 (semantic chunking)。现在我根据标题和段落来拆分文本。

  1. 不要仅依赖相似度评分

我的检索器根据余弦相似度 (cosine similarity) 提取了前三个分块。

“相似”并不等同于“相关”。一个分块可能看起来与问题很相似,但其中并不包含答案。

解决方法:我增加了一个使用 cross-encoder 的重排序 (reranking) 步骤。这能帮我识别出系统何时缺乏真实数据。

  1. 允许模型“失败”

我以前的提示词 (prompt) 只说:“利用上下文回答问题。”

如果上下文中缺少答案,模型就会用猜测来填补空白。

解决方法:我添加了一条直接指令:“如果上下文中没有答案,请说你不知道。”仅此一项就阻止了大部分幻觉。

  1. 设置检索阈值

有时检索失败时,模型会调用通用知识。我曾寄希望于提示词能起作用,但“希望”并不是一种策略。

解决方法:我添加了一个分数阈值 (score cutoff)。如果检索分数过低,系统会返回一个兜底响应 (fallback response)。没有上下文,就意味着没有答案。

  1. 测试失败场景,而非成功场景

我以前只测试简单的问题,忽略了模糊的查询和缺失的信息。

解决方法:我构建了一个包含“陷阱问题”的评估集。这些问题在上下文中是没有答案的。定期运行这些测试可以让你准确发现系统在何处崩溃。

RAG 并不能消除幻觉,它只是让幻觉变得可控。

我的机器人仍然无法掌握所有细节,但现在,它会在不确定时承认。这让它变得真正可用。

Source: https://dev.to/pallavi_sharma_10c1a6f1da/why-my-rag-app-kept-hallucinating-and-how-i-fixed-it-3i10

Optional learning community: https://t.me/GyaanSetuAi