Dify知识库检索API的详细参数说明和调用示例是什么?

3 阅读4分钟

Dify 知识库检索 API 指的是其外部知识库检索接口。当您在 Dify 中添加 RAGFlow、ThinkDoc 等外部知识库时,Dify 会通过此标准接口 /retrieval来获取内容。

以下是该接口的详细参数说明与调用示例。


🔌 API 基本信息

  • 请求方式: POST

  • 请求路径: 您在 Dify 中配置的外部知识库 API 地址,例如 http://your-kg-host/api/v1/dify/retrieval

  • 请求头 (Headers) :

    • Content-Type: application/json
    • Authorization: Bearer <your_api_key>(由您在外部知识库处创建的 API Key 填充)
  • 核心功能: 根据 query查询指定 knowledge_id的知识库,并返回按相关性排序的文本片段及其元数据。


📦 请求体 (Request Body) 参数

请求体为 JSON 格式,包含以下字段:

参数类型是否必需说明
knowledge_idstring要检索的知识库唯一 ID,由 Dify 在“召回测试”时传入。
querystring用户的检索问题或关键词。
retrieval_settingobject检索控制参数,包含 top_kscore_threshold
retrieval_setting.top_kinteger返回的最相关结果数量上限。
retrieval_setting.score_thresholdnumber (0-1)相关性分数阈值,低于此值的结果将被过滤。
metadata_filterobject元数据过滤条件,用于实现多关键词 AND 等复杂查询。
rerankobject重排序模型配置,部分外部知识库支持,用于优化结果顺序。
query_typestring检索类型,部分外部知识库支持,如 hybrid(混合检索)。

注意metadata_filterrerankquery_type等高级参数是特定外部知识库(如 ThinkDoc)的扩展功能,Dify 核心规范主要定义了前四个字段。


📄 响应体 (Response Body) 结构

接口返回 JSON 格式数据,核心结构如下:

json

{

"records": [

{

"content": "这里是知识库中的一段文本内容……",

"score": 0.87,

"title": "文档标题或来源文件名",

"metadata": {

"doc_id": "内部文档 ID",

"source": "文件路径或 URL",

"author": "作者",

"chunk_index": 3,

"upload_time": "2025-03-01T12:00:00Z"

}

}

// ... 更多记录

]

}

  • records: 检索结果列表,按相关性分数从高到低排序。
  • content: 知识库中的文本片段,是 RAG 的核心上下文。
  • score: 相关性分数,范围通常在 0-1 之间,越高越相关。
  • title: 文档的标题或来源文件名。
  • metadata: 文档的元数据,可用于实现基于来源、时间、标签的过滤和展示。

💻 调用示例

1. cURL 示例

bash

curl -X POST 'http://your-kg-host/api/v1/dify/retrieval' \

-H 'Content-Type: application/json' \

-H 'Authorization: Bearer ragflow-xxxxxx' \

-d '{

"knowledge_id": "0ed8508e8f7311ef801500155d1e64cf",

"query": "如何克服恐惧?",

"retrieval_setting": {

"top_k": 3,

"score_threshold": 0.5

}

}'

2. Python 示例

python

import requests

url = "http://your-kg-host/api/v1/dify/retrieval"

headers = {

"Content-Type": "application/json",

"Authorization": "Bearer ragflow-xxxxxx"

}

payload = {

"knowledge_id": "0ed8508e8f7311ef801500155d1e64cf",

"query": "如何克服恐惧?",

"retrieval_setting": {

"top_k": 3,

"score_threshold": 0.5

}

}

resp = requests.post(url, json=payload, headers=headers)

data = resp.json()

print("检索到 {} 条结果:".format(len(data.get("records", []))))

for rec in data.get("records", []):

print(f"--- 分数: {rec['score']:.2f} | 标题: {rec['title']}")

print(f"内容: {rec['content'][:100]}...")

print(f"元数据: {rec['metadata']}\n")

3. ThinkDoc 扩展参数示例

若您的外部知识库是 ThinkDoc,可使用其扩展参数实现混合检索和重排序:

json

{

"query": "流程有哪些特征?",

"kb_ids": ["6781xxxxxxxx"],

"retrieval_setting": {

"top_k": 10,

"score_threshold": 0.1

},

"query_type": "hybrid",

"rerank": true,

"top_n": 3

}


💡 结合“多关键词 AND 检索”的应用

您之前提到的“多关键词 AND 检索”问题,可以通过 metadata_filter参数在调用此 API 时实现。

思路:在将文档接入外部知识库时,预先将关键词(如 doc_type, mine_type, keyword)存入文档的 metadata。检索时,通过 metadata_filter传入多个 AND条件,即可实现硬性过滤。

示例:检索“安全规程”类型下,同时包含“露天矿”和“爆破”关键词的文档。

json

{

"knowledge_id": "your-knowledge-id",

"query": "露天矿爆破作业粉尘浓度标准",

"retrieval_setting": {

"top_k": 5,

"score_threshold": 0.5

},

"metadata_filter": {

"doc_type": "安全规程",

"mine_type": "露天矿",

"keyword": "爆破"

}

}

注意:此方案的前提是您的外部知识库支持 metadata_filter参数。Dify 核心 API 规范本身不强制要求实现此字段,具体需参考您所使用的外部知识库文档。