一、概述
本篇介绍如何基于本地 Embedding 模型与知识库文档,开发一个标准化的知识库搜索服务,提供可被 Dify 插件系统调用的 RESTful 接口,为后续封装为插件与发布 API 打好基础。该接口将支持关键词参数查询,并返回结构化的检索结果,包含标题、摘要与链接字段。
二、目标说明
- 使用 Python 构建知识库搜索服务接口
- 实现
/kb_search?q=...
路由,返回结构化 JSON - 支持 title、content、url 字段输出,兼容 Dify 插件调用要求
三、开发环境准备
- Python >= 3.8
- Flask(轻量级 Web 框架)
- FAISS 或 SentenceTransformers 用于 Embedding 检索
- 已完成向量化处理的知识库数据(例如
kb_index.faiss
与kb_docs.json
)
四、服务端实现示例
1. 目录结构
knowledge_plugin/
├── app.py
├── kb_docs.json
├── kb_index.faiss # 构建后生成
├── build_index.py
└── requirements.txt
2. 安装依赖(requirements.txt)
在 requirements.txt
中添加以下依赖内容:
flask
sentence-transformers
faiss-cpu
然后执行以下命令安装依赖:
pip install -r requirements.txt
3. 准备知识库内容(kb_docs.json)(kb_docs.json)
保存以下内容为 kb_docs.json
:
[
{
"title": "HarmonyOS 系统概览",
"content": "HarmonyOS 是一个面向全场景的分布式操作系统,适用于智能手机、智能家居、车载终端等多设备融合。",
"url": "https://example.com/harmonyos-overview"
},
{
"title": "HarmonyOS 的微内核架构",
"content": "HarmonyOS 使用微内核架构,提高系统安全性和模块独立性,支持硬件隔离和实时调度。",
"url": "https://example.com/harmonyos-kernel"
},
{
"title": "鸿蒙系统与 Android 的区别",
"content": "HarmonyOS 与 Android 最大的区别在于系统底层架构和跨设备能力,前者强调分布式协同。",
"url": "https://example.com/harmonyos-vs-android"
},
{
"title": "分布式任务调度机制",
"content": "HarmonyOS 支持多设备之间的任务迁移与协同执行,实现一次开发、多端部署。",
"url": "https://example.com/harmonyos-scheduler"
},
{
"title": "HarmonyOS 对开发者的影响",
"content": "该系统为开发者提供统一 IDE、统一语言和一次编写多端运行的开发体验。",
"url": "https://example.com/harmonyos-developers"
}
]
4. 构建向量索引(kb_index.faiss)
创建 build_index.py
,并运行以下脚本以生成索引:
from sentence_transformers import SentenceTransformer
import faiss
import json
import numpy as np
# 加载文档
with open("kb_docs.json", "r", encoding="utf-8") as f:
docs = json.load(f)
# 生成 embeddings
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
corpus = [doc["content"] for doc in docs]
embeddings = model.encode(corpus, convert_to_numpy=True)
# 构建并保存索引
index = faiss.IndexFlatL2(embeddings.shape[1])
index.add(np.array(embeddings))
faiss.write_index(index, "kb_index.faiss")
运行命令:
python build_index.py
5. 示例 app.py 核心代码
from flask import Flask, request, jsonify
from sentence_transformers import SentenceTransformer
import faiss
import json
import numpy as np
app = Flask(__name__)
# 加载模型与索引
try:
model = SentenceTransformer('paraphrase-MiniLM-L6-v2')
index = faiss.read_index("kb_index.faiss")
with open("kb_docs.json", "r", encoding="utf-8") as f:
doc_list = json.load(f)
except Exception as e:
print("初始化失败:", e)
raise
@app.route("/kb_search", methods=["GET"])
def kb_search():
query = request.args.get("q", "").strip()
if not query:
return jsonify({"results": [], "error": "Missing query parameter"})
try:
print("收到查询:", query)
query_vec = model.encode([query])
D, I = index.search(np.array(query_vec), k=3)
print("匹配索引:", I)
results = []
for idx in I[0]:
if idx < 0 or idx >= len(doc_list):
continue
doc = doc_list[idx]
results.append({
"title": doc.get("title", "Untitled"),
"content": doc.get("content", ""),
"url": doc.get("url", "")
})
return jsonify({"results": results})
except Exception as e:
print("处理失败:", e)
return jsonify({"results": [], "error": str(e)})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5002)
启动命令
python app.py
浏览器或 curl 测试(局域网可调用)
假设宿主机地址为 192.168.1.103
,可在同一局域网下使用如下命令测试接口:
curl "http://192.168.1.103:5002/kb_search?q=HarmonyOS"
应返回:
{
"results": [
{
"title": "HarmonyOS 系统概览",
"content": "HarmonyOS 是一个面向多终端的分布式操作系统...",
"url": "https://example.com/harmony"
}
]
}
六、总结
本篇完成了一个可独立运行的知识库搜索接口服务的搭建,并提供标准 REST 接口输出,支持 Dify 插件对接与后续 API 发布。下一篇将基于本接口封装插件描述文件,接入 Dify 并实现跨平台复用。