Dify工作流中的知识库检索节点高级用法
想让Dify工作流中的知识库检索真正精准可控,避免无关内容污染大模型的生成质量,默认配置往往不够用——必须主动干预召回逻辑与数据流向。核心在于四步调优:元数据过滤、Top-K与Score阈值平衡、多库并行检索、以及LLM后处理清洗。下面逐个拆解。

举个实际场景:你上传了市场部、技术部、法务部三类文档,用户只问“合同签署流程”,这时候向量相似度或关键词匹配很难稳定排除技术手册和产品说明书。必须靠元数据做文档级的精准筛选。
设置元数据过滤实现文档级精准筛选
第一步:进入知识库,点击【元数据】,新建一个字符串类型元数据,名称填
【department】
第二步:对合同类文档批量编辑,在【department】字段填入“法务部”。其他文档可以留空或填对应部门。
第三步:在工作流中选中知识检索节点,展开【元数据筛选】→ 添加过滤条件 → 字段选 department → 操作符选 = → 值填 法务部。这里有个容易踩的坑:引号漏掉或者大小写不一致,整个过滤会直接失效。
注意:元数据值区分大小写,而且不能包含空格前缀或后缀;如果用的是中文,务必确保知识库文档上传时已经正确解析该字段。
调整Top-K与Score阈值平衡召回精度与覆盖度
Top-K不是越大越好,Score阈值也不是越高越准——它们是相互制衡的杠杆。调错了其中一个,下游LLM要么被信息淹没,要么空手而归。
方法一:保守策略(适合FAQ类知识库)
Top-K 设为 3,Score 阈值设为 0.65。这样只返回高置信度的片段,但如果问题表述稍微模糊,可能直接返回空列表。
方法二:宽松策略(适合长文档、技术手册)
Top-K 设为 8,Score 阈值设为 0.42。向量召回擅长捕获语义相近但字面差异大的段落,比如“报销上限”匹配到“费用封顶标准”。
【Score阈值低于0.4时,大量低相关片段会混入,LLM容易被噪声误导生成错误结论】
多知识库并行检索+结果合并
当问题涉及多个业务域,比如“对比2024版与2025版员工手册中休假政策差异”,单库检索无法跨版本比对。必须同时查两个知识库,再交由LLM分析。
① 在工作流画布中拖入两个【知识检索】节点,分别绑定“员工手册_2024”和“员工手册_2025”知识库。
② 两个节点的查询变量都设为 sys.query,不加任何元数据过滤——让各自独立召回最相关段落。
③ 添加一个【模板】节点,输入变量为:
2024版结果:{{knowledge_retrieval_1.output}}
2025版结果:{{knowledge_retrieval_2.output}}
然后在提示词里明确指令:“请逐条对比两组内容,仅输出差异点,不复述相同条款。”
这一步不能用【代码】节点做简单拼接——原始result结构里包含title、url、metadata等字段,直接json.dumps会将整个对象转成字符串,LLM无法理解语义。
用LLM节点做检索后处理
向量检索返回的片段常有重复、冗余或偏离核心的句子,人工写正则很难覆盖所有情况。交给小模型做清洗更可靠。
方法一:去重过滤
添加【LLM】节点,输入为 knowledge_retrieval.output,提示词写:“你是一个文本精炼助手。请将以下检索片段按语义去重,合并同类项,删除解释性语句,只保留不可删减的事实陈述。输出纯文本,不要编号、不要加粗、不要换行。”
方法二:可信度重排序
在提示词末尾加一句:“每段输出前标注[置信度:0.92]格式分数,分数依据与问题关键词匹配密度、原文权威性(看metadata.source_type)、段落完整性三者综合判断。”
这一步输出会带结构化分数,后续可以用【代码】节点提取高于0.75的片段继续传递。