RAGFlow 知识库问答
用 RAGFlow 混合检索(关键词 + 向量)拿回命中片段,由你综合成答案并标注引用来源。全程只用 curl,请求体一律先落 JSON 文件再 --data @file 提交(规避各 shell 引号转义差异)。
前置检查
RAGFLOW_BASE_URL(末尾不带 /)和 RAGFLOW_API_KEY 从环境变量读取。任一缺失时直接告诉用户如何设置,不要尝试调用。curl 在 Windows / Linux / macOS 均可用,仅设置环境变量的语法因 shell 而异:
# bash / zsh(Linux、macOS)
export RAGFLOW_BASE_URL="http://<host>:<port>"
export RAGFLOW_API_KEY="ragflow-xxxx"
# PowerShell(Windows)
$env:RAGFLOW_BASE_URL="http://<host>:<port>"
$env:RAGFLOW_API_KEY="ragflow-xxxx"
工作流程
1. 选定数据集
除非用户已点名库名,先列出可见数据集让用户挑(本轮对话后续追问沿用已选 ID,不必重选):
curl -s "$RAGFLOW_BASE_URL/api/v1/datasets?page_size=100" \
-H "Authorization: Bearer $RAGFLOW_API_KEY"
把 data[] 的 name(附 document_count)列给用户选择。用户点名库名时用 ?name=<库名> 精确匹配定位;查不到再去掉 name 全量列出请用户确认。取中 data[0].id 作为 dataset_id。
2. 检索
请求体写入临时文件(如 rag-qa-req.json,用完删除),question 用用户原问题;问题冗长时可追加核心关键词提升召回:
{
"question": "用户问题原文",
"dataset_ids": ["<dataset_id>"],
"page": 1,
"page_size": 10,
"similarity_threshold": 0.2,
"vector_similarity_weight": 0.3,
"keyword": true,
"highlight": true
}
curl -s -X POST "$RAGFLOW_BASE_URL/api/v1/retrieval" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $RAGFLOW_API_KEY" \
--data @rag-qa-req.json -o rag-qa-resp.json
响应判读:
code != 0:把message原样报给用户(常见:dataset_ids 失效、数据集无 embedding 模型)。- 相似度分档处理(0.2 为接口召回下限):≥ 0.5 高置信,直接作答;0.3–0.5 主题相关但不完全匹配(如命中正确的制度文件但片段未覆盖全部细节),可作答但标注「低置信,仅供参考」;< 0.3 视为噪声,不作为答题依据。
data.total == 0或全部similarity低于 0.3:明确告诉用户「知识库未找到相关内容」,可建议换关键词或换库重试,不要用自己的知识补缺。- 命中 chunk 的关键字段:
content(片段全文)、similarity(综合分)、document_keyword(来源文档名,含扩展名)、document_id(用于拼接原文链接)、positions([页码, left, top, right, bottom],取全部页码去重排序,如 P4-5)。
3. 综合回答
- 只依据检索到的 chunk 作答, chunks 之间相互矛盾时如实呈现分歧并各自标注来源。
- 每个关键论断后标注引用,写成 RAGFlow 原文链接,用户点击即可在浏览器打开该文档:
[《文档名》P4-5]($RAGFLOW_BASE_URL/document/<document_id>?ext=<扩展名>)
扩展名取 document_keyword 的后缀(如 pdf)。页码缺失时只标文档名。
注意不要加 resource=files:那会让前端改走文件管理模块(/files/<file_id>),检索返回的 document_id 在那边查不到,会报 document not found。
- 回答末尾列「参考来源」清单:同样用上述链接格式,附最高 similarity 让用户能判断可信度;低置信回答在开头明示。
- 检索内容与问题只是部分相关时,说清「库里只查到 X,未覆盖 Y」。
多轮追问
同一对话内沿用已选 dataset_id。用户换话题且明显跨库时,回到第 1 步重新选库。前一轮检索结果可作为上下文,但新一轮问题应重新检索(知识库可能已更新,且新问题的召回片段不同)。