Dify知识库检索API如何实现多关键词AND检索的自动补全?

3 阅读4分钟

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. 创建工作流

在工作流中依次添加以下节点:

  1. 开始节点:接收用户的原始问题 user_query
  2. LLM节点 (查询扩展) :调用一个LLM,使用方案一中的Prompt,将 user_query扩展为 expanded_query
  3. 知识库检索节点:使用上一步生成的 expanded_query作为查询语句,并设置好知识库、Top-K、Score Threshold等参数。
  4. 结束节点:输出检索到的文档或答案。

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节点(查询扩展)+ 知识库检索节点”的组合,是实现此功能最清晰、高效的方式。