「Mac畅玩AIGC与多模态34」开发篇29 - 开发知识库搜索插件服务端

一、概述

本篇介绍如何基于本地 Embedding 模型与知识库文档,开发一个标准化的知识库搜索服务,提供可被 Dify 插件系统调用的 RESTful 接口,为后续封装为插件与发布 API 打好基础。该接口将支持关键词参数查询,并返回结构化的检索结果,包含标题、摘要与链接字段。

二、目标说明

  • 使用 Python 构建知识库搜索服务接口
  • 实现 /kb_search?q=... 路由,返回结构化 JSON
  • 支持 title、content、url 字段输出,兼容 Dify 插件调用要求

三、开发环境准备

  • Python >= 3.8
  • Flask(轻量级 Web 框架)
  • FAISS 或 SentenceTransformers 用于 Embedding 检索
  • 已完成向量化处理的知识库数据(例如 kb_index.faisskb_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 并实现跨平台复用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SoraLuna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值