如何通过构建 RAG 检索增强生成链路来降低 LLM 的事实性幻觉

运营喵小美 中级 2026/5/5 414 浏览 14 点赞 约 2 分钟

直接给 LLM 喂长文档作为 Context 很容易导致“中间丢失”现象,而且 Token 成本太高,最稳妥的办法还是搭建一套 RAG 链路。我之前在做个内部知识库项目时,发现直接用简单的向量检索(Vector Search)召回精度极差,导致 AI 经常一本正经地胡说八道,后来通过「混合检索 + 重排序」才把幻觉率压了下来。

如何通过构建 RAG 检索增强生成链路来降低 LLM 的事实性幻觉

最核心的坑在于:单纯依赖 Embedding 向量检索在处理专有名词或短关键词时非常弱。比如搜“项目 A 的 2.1 版本更新”,向量检索可能会给你召回一堆包含“更新”两个字的无关文档。

我的优化方案是引入 BM25 关键词检索和 Rerank 机制。具体链路如下:

1. 混合检索策略
不要只用 cosine_similarity,要把传统的词频检索和向量检索结果合并。

# 伪代码逻辑:混合召回
vector_results = vector_db.search(query_embedding, top_k=50)
keyword_results = bm25.search(query_text, top_k=50)

# 使用 RRF (Reciprocal Rank Fusion) 算法合并排名
combined_results = rrf_merge(vector_results, keyword_results)

2. 引入 Rerank(重排序)模型
召回 50 条结果后,不能直接喂给 LLM,因为噪声太多。必须用像 BGE-Reranker 这样的交叉编码器对这 50 条结果重新打分,只取前 3-5 条最相关的。这步是消除幻觉的关键,因为 LLM 面对无关干扰信息时最容易产生幻觉。

3. 严格限制 Prompt 的生成边界
如果 Prompt 写得太宽松,AI 习惯性地会用自己的预训练知识补全。我目前最有效的 Prompt 约束是:

你是一个严格的知识库助手。请仅根据提供的【上下文】回答问题。
如果【上下文】中没有提到相关信息,请直接回答“知识库中未记录此信息”,严禁尝试通过自身知识库编造答案。

【上下文】:
{context}

【问题】:
{query}

效率提升点:
为了加快速度,我把文档切片(Chunking)改成了「递归字符切分」,并给每个 Chunk 增加了 200 字的上下文重叠(Overlap),防止语义在切分点被截断。

踩过的坑:
早期尝试用简单的 split('\n') 切分,导致很多表格数据被切碎,AI 检索到碎片后无法还原逻辑,结果回答完全错误。现在统一用 RecursiveCharacterTextSplitter 并配合 Markdown 结构化切分,事实准确率提升了大概 30%。

全部回复 (0)

还没有回复,来发第一条吧!

发表回复

支持 Markdown 格式