用 Dify 搭建自动化知识库 RAG 工作流,解决 LLM 幻觉的具体配置方案
最核心的改动是放弃了默认的 QA 模式,手动搭建了这样一个链路:用户输入 → 问题优化(Query Rewrite) → 知识库检索 → 重排序(Rerank) → 条件判断 → LLM 生成。
关键配置细节:
1. 问题优化节点(Query Rewrite)
用户提问往往很模糊,比如“那个配置怎么弄?”,直接检索知识库根本搜不到。我在 LLM 节点加了一段 Prompt,强制它将问题补全为独立且包含关键词的搜索词。
你是一个搜索优化专家。请将用户的输入转换为最适合在知识库中检索的关键词短语。
要求:去除口语化词汇,补全上下文指代,仅输出优化后的查询词。
输入:{{sys.query}}
输出:2. 必须配置 Rerank 模型
这是解决幻觉的分水岭。在知识库检索设置里,千万不要只用“向量检索”,一定要开启 混合检索(Hybrid Search) 并配置 Rerank 模型(推荐使用 Cohere 或 BGE-Reranker)。向量检索负责“语义相关”,Rerank 负责“精准打分”,把真正相关的片段排在最前面,剔除掉那些虽然语义接近但无实际答案的噪音。
3. 增加“无答案”拦截分支
很多幻觉产生是因为 LLM 试图在检索不到答案时强行回答。我在 Rerank 节点后接了一个 条件分支(Condition):
判断逻辑:如果检索结果的最高分数 $\text{Score} < 0.5$(具体阈值根据模型微调),直接走分支 A → 输出“知识库中未找到相关信息,请提供更多细节”;只有分数达标才走分支 B → 传递给 LLM。
4. 最终生成节点的 Prompt 约束
在最后的 LLM 节点,严禁它使用自身知识,必须强制绑定上下文。
你是一个严谨的知识库助手。请基于以下【上下文】回答问题。
约束:
1. 如果【上下文】中没有相关信息,请直接回答“知识库中暂无记录”,不要尝试编造。
2. 答案必须引用【上下文】中的原话,不得随意扩充。
【上下文】:{{context}}
【用户问题】:{{query}}踩坑点分享:
最容易被忽略的是分段设置。如果你的文档段落太短(比如 100 字),检索出来的上下文缺乏语境,LLM 容易产生误解;如果太长,又会引入无关干扰。实测在 Dify 中,将分段长度设为 500-800 字,并开启 200 字的重叠(Overlap),检索效果最稳定。
全部回复 (0)
还没有回复,来发第一条吧!
