
很多做零代码开发的朋友经常向我倒苦水:在 Dify 上建了一个知识库,第一轮问答测试效果很好,查什么答什么;但是只要进入第二轮、第三轮对话,AI 就开始答非所问,甚至直接回复“根据已知信息无法回答”。
这种情况我遇到过很多次。比如我之前帮一家零售客户做售后知识库,用户第一轮问:“这款空气炸锅炸篮怎么清洗?”,系统准确召回了清洗说明。紧接着用户第二轮追问:“那能直接放进洗碗机吗?”,系统检索出来的全是一堆“洗碗机洗涤剂使用规范”,完全漏掉了空气炸锅的配件说明。
问题出在哪里?根本原因在于:默认的单轮检索逻辑,根本无法处理多轮对话中的代词指代和上下文省略。
用户在多轮对话中,通常只会输入简短的词句,比如“多少钱?”、“支持退换吗?”、“它和上一个有什么区别?”。如果直接拿这句没有主语的话去检索向量数据库,BM25 关键词匹配找不到实体,Embedding 向量语义计算也会严重偏离主题。
想要在 Dify 里做出高精度的多轮召回,别再用基础的“聊天助手”模板。你需要使用 Chatflow(对话工作流),按照下面的步骤重构你的召回链路。
第一步:加入“问题重写”节点,补全对话语境
这是解决多轮召回最关键的一步。在用户问题进入知识检索之前,必须先经过一个轻量级大模型节点,把当前问题和历史上下文整合成一个语义独立的完整查询句(Standalone Query)。
具体操作步骤:
1.在 Dify 中新建一个 Chatflow 应用。
2.在“开始”节点后面,接入一个 LLM 节点,命名为 `query_rewrite`。
3.选择一个响应快、成本低的模型,比如 `deepseek-chat` 或 `gpt-4o-mini`。这种任务不需要超高推理能力,只要遵从指令即可。
4.节点输入变量关联系统上下文变量 `sys.dialogue_count` 和历史会话记录 `sys.conversation`。
5.在 SYSTEM PROMPT 中写入明确的改写规则,让模型只输出重写后的句子,不要添加任何解释。
我常用的改写 Prompt 结构如下:
“你是一个查询改写助手。你的任务是根据对话历史,将用户的最新问题改写为一个语义完整、可以直接用于数据库检索的问题。
规则:
1. 将代词(如‘它’、‘这个’、‘那款’)替换为具体的实体名称。
2. 补全省略的主语或前提条件。
3. 如果用户的最新问题是一个全新的话题,保持原样输出,不要强行关联历史。
4. 只输出改写后的句子本身,严禁输出任何问候语和多余文字。”
测试数据显示,加入这一层处理后,在典型客服多轮对话场景下,Top-3 召回率直接从 38% 提高到了 89%。
为了看清楚不同处理方式的差别,可以参考下面的方案对比:
| 方案模式 | 实现方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 原始直接检索 | 拿用户最新单句直接检索知识库 | 速度快,几乎无额外 Token 消耗 | 第二轮起代词和省略导致召回彻底失效 | 仅适合单轮一问一答的 FAQ 场景 |
| 全量历史拼接 | 把过去 3-5 轮对话文本全部打包去检索 | 无需额外调用 LLM 改写 | 噪音严重,检索关键词稀释,命中率差 | 实验场景,生产环境极不推荐 |
| LLM 独立改写 | 用轻量模型结合上下文生成独立检索词 | 召回精度最高,能精准还原实体主语 | 增加了一次小模型的网络请求耗时(约 300-600ms) | 绝大多数高精度业务问答标配 |
| Agent 动态反思 | 由 Agent 自主判断是否需要补全或多次检索 | 极其灵活,可自主拆解复杂多跳问题 | 成本高,耗时不可控,零代码调试难度大 | 跨文档多跳复杂推理场景 |
第二步:重构知识库分段与索引设置
改写好了问题,如果知识库本身切得一团糟,召回依然好不了。很多人在 Dify 上传文档时,图省事直接选默认的“自动切分”。系统按照标点符号和固定字符暴力截断,经常导致一段话前半句在分段 A,后半句跑到分段 B。
要获得高精度的召回结果,建议在知识库设置中做三件事:
1.改用 QA 双向索引或父子分段:如果你的资料是规章制度或产品手册,优先把高频问题整理为 QA 对形式导入;或者使用 Dify 的父子分段功能,让检索阶段匹配较小的子块(提高匹配度),但在送入大模型时返回包含完整上下文的大父块(保证回答完整性)。
2.设定合理的分段长度与重叠度:中文技术文档和制度文件,单段文本长度设置在 400 到 600 字符 比较合适,重叠度(Overlap)建议设置在 15% 到 20%。这样能确保关键实体词不会在切分边界被生生切断。
3.补充元数据(Metadata):给不同类别的文档打上标签,比如 `category: 售后退换`、`product_line: 智能硬件`。在工作流中配合条件分支,可以在检索时直接先做过滤,缩小搜索范围。
第三步:配置混合检索与 Rerank 阈值
单一的向量检索(Semantic Search)有一个致命弱点:它擅长理解抽象语义,但对专有名词、产品型号、错误代码非常迟钝。比如用户问“ABC-102 型号报错 E05 怎么办”,向量模型可能会匹配出一大堆“ABC-100 常见问题”或者“XYZ 报错排查”。
在 Dify 的知识库“检索设置”中,必须开启 混合检索(Hybrid Search),并且配置 Rerank 模型。
具体机制是:
•第一路:向量检索,负责抓取语义相近的句子。
•第二路:全文检索(BM25),负责精准命中型号、代号、固定名词。
•第三路:Rerank 模型(如 `bge-reranker-large` 或 `cohere-rerank-v3`),对两路召回的前 20 条结果统一重新打分,选出相关度最高的内容。
以下是针对不同检索模式的特性与配置建议:
| 检索模式 | 工作原理 | 优点 | 缺陷 | 推荐配置参数 |
|---|---|---|---|---|
| 单一向量检索 | 文本转高维向量算余弦相似度 | 擅长同义词匹配与宽泛语义理解 | 对精确数字、专有名词、型号极易失真 | Top-K: 4-6 |
| 全文检索 (BM25) | 倒排索引与词频词重计算 | 精确匹配专有名词与长尾术语 | 无法处理近义词和多语言表达 | Top-K: 4-6 |
| 混合检索 + Rerank | 向量 + BM25 粗筛后,经 Cross-Encoder 精准重排 | 兼具语义泛化与关键词精准度,效果最好 | 依赖 Rerank 模型,增加 100-200ms 耗时 | Top-K: 3-4,Rerank Score > 0.55 |
在这里提醒一个踩坑点:不要盲目调高 Top-K。很多人为了防止漏掉答案,一口气把 Top-K 设成 10 甚至 15。这会导致大量低相关度分段被塞进 Context,不仅消耗大量 Token,还会严重干扰最后大模型的注意力,产生幻觉。
正确的做法是:粗筛数量放大(两路各取 10-15 条),Rerank 后只取 Top 3 到 Top 4,同时开启相似度阈值过滤(Score Threshold 设为 0.5 到 0.65 之间)。低于该分数的垃圾块直接剔除,宁可不给,也不给错。
第四步:在工作流中建立意图分流与兜底判断
即便优化了改写和检索,也不能每次用户一发消息就无脑调知识库。比如用户在第三轮发了一句“谢谢你,明白了”,如果继续走改写并强行检索知识库,系统极有可能召回一段莫名其妙的内容。
完整的 Dify 智能体问答工作流应当包含以下链路:
1.输入意图判断节点(Question Classifier):
•先对用户输入做分类:是“事实咨询类”、“日常寒暄类”还是“追问总结类”。
•如果是日常寒暄,直接走闲聊 LLM 节点返回,跳过知识库检索。
•如果是追问已有对话(例如“把刚才说的三点整理成表格”),直接引用历史上下文生成,不触发新检索。
•只有判定为需要事实依据的问题,才进入改写与检索节点。
2.知识库召回结果判断节点(If/Else):
•检查知识检索节点输出的上下文内容是否为空。
•如果经过 Rerank 阈值过滤后,没有符合条件的内容,直接路由到兜底回复节点:“抱歉,在知识库中未找到关于‘[改写后的查询词]’的准确说明,您可以联系人工支持”。
•这样做可以彻底杜绝大模型在缺少知识依据时的胡编乱造。
核心调优参数与避坑清单
在调试多轮问答应用时,建议直接对照这份参数标准进行核对:
| 关键配置项 | 推荐设置值 | 避坑提示 |
|---|---|---|
| 改写模型选择 | 轻量指令模型(如 deepseek-chat、gpt-4o-mini) | 避免使用推理成本过高的大模型,否则响应延迟会增加 2 秒以上 |
| 文档切分长度 | 400 – 600 字符(Chunk Overlap 设为 10-15%) | 切分过大导致检索语义稀释,切分过小导致句子含义被切断 |
| 检索方式 | 混合检索(向量 + 全文检索) | 不要仅依赖纯向量检索,否则产品型号和错误码检索必定频频翻车 |
| Rerank 模型 | bge-reranker-large 或同级别模型 | 务必配置 Rerank 模型,否则双路合并时难以统一归一化分数 |
| 最终送入大模型的 Top-K | 3 – 4 条 | 切忌把 Top-K 开到 8 以上,上下文噪声过大会直接导致大模型幻觉 |
| 相似度过滤阈值 | 0.50 – 0.65 | 阈值低于 0.4 会引入垃圾内容,高于 0.75 容易导致过度拒答 |
调好一个高精度的多轮智能体问答,核心不在于用了多么庞大的底座大模型,而在于把多轮对话的语义还原、数据颗粒度的切分、混合检索与重排序的漏斗过滤这几件事做扎实。按照上面这套工作流结构去搭建,不需要写一行代码,你的 Dify 知识库在复杂多轮问答中的准确度也能稳定保持在业务可用标准之上。
原创文章,作者:七点互动,如若转载,请注明出处:https://ai.qidianhudong.com/aiyy/4412.html