Dify知识库检索API本身不提供自动补全功能,但您可以通过在调用API前,利用大语言模型(LLM)对查询进行预处理来实现。核心思路是:先让LLM将用户的模糊查询扩展成一个包含所有关键信息的完整问句,再用这个“补全后”的问句去调用检索API。
以下是两种具体的实现方案。
💡 方案一:在您的后端服务中实现
此方案通用性强,适用于任何调用Dify检索API的场景。
1. 调用LLM进行查询扩展
首先,使用一个LLM(可以是Dify平台上的另一个应用)作为“查询理解”服务。向其发送用户的原始输入,并指示它补全查询。
Prompt 示例:
你是一个查询理解助手。请将用户的自然语言问题改写成一个适合在知识库中检索的、完整且严谨的问句。
- 要求:补全问题中缺失的关键信息(如时间、地点、设备类型等),但不得改变用户原意。
- 输出:只返回改写后的问题,不要包含任何解释或多余文字。
用户输入:
“露天矿 粉尘浓度 标准”
LLM 输出示例:
“金属露天矿爆破作业粉尘浓度限值是多少?”
2. 使用扩展后的查询调用API
将LLM生成的、包含完整关键词的问句,作为 query参数传递给Dify知识库检索API。
请求体示例:
json
{
"knowledge_id": "your-knowledge-id",
"query": "金属露天矿爆破作业粉尘浓度限值是多少?",
"retrieval_setting": {
"top_k": 5,
"score_threshold": 0.5
}
}
3. 结合历史对话实现多轮补全
对于多轮对话,可以将历史对话作为上下文,让LLM更好地理解当前问题的意图,从而补全缺失的关键词。
Prompt 示例:
你是查询理解助手。结合以下对话历史和当前问题,将用户的提问改写成一个适合在知识库中检索的、完整且严谨的问句。
对话历史:
用户:我们矿是金属露天矿。
用户:最近在做爆破作业。
当前问题:
“粉尘浓度标准”
LLM 输出示例:
“金属露天矿爆破作业粉尘浓度限值是多少?”
⚙️ 方案二:在Dify工作流中实现(推荐)
如果您使用Dify Studio,可以直接在工作流中编排“查询扩展”和“知识检索”两个步骤,实现全自动处理。
1. 创建工作流
在工作流中依次添加以下节点:
- 开始节点:接收用户的原始问题
user_query。 - LLM节点 (查询扩展) :调用一个LLM,使用方案一中的Prompt,将
user_query扩展为expanded_query。 - 知识库检索节点:使用上一步生成的
expanded_query作为查询语句,并设置好知识库、Top-K、Score Threshold等参数。 - 结束节点:输出检索到的文档或答案。
2. 配置知识库检索节点
在知识库检索节点的配置中,关键设置如下:
-
知识库:选择您要查询的目标知识库。
-
查询变量:选择上一步LLM节点输出的
expanded_query变量。 -
检索设置:
- 检索方式:建议选择 “混合检索” ,以兼顾语义和相关关键词。
- Top-K:设置为3-5,可根据测试结果调整。
- Score Threshold:从0.5开始测试,根据召回情况调整。
3. 效果优化技巧
- 启用Rerank:在知识库的高级设置中开启Rerank模型,可以让检索结果更精准。
- 优化Prompt:在LLM的Prompt中,可以加入“如果问题中缺少XX信息,请统一用‘XX’填充”等指令,强制模型补全特定类型的缺失信息。
🎯 核心要点
- API层面:Dify知识库检索API只负责根据您提供的
query进行检索,不负责改写或补全查询。 - 实现层面:真正的“自动补全”需要在调用API前,通过LLM或规则引擎对查询进行处理。
- 推荐方案:在Dify工作流中,使用“LLM节点(查询扩展)+ 知识库检索节点”的组合,是实现此功能最清晰、高效的方式。