项目/AI
AI · 运行中

AI 对话接入联网搜索(博查)

让自建 AI 对话拥有实时联网能力:博查搜索 + forced-RAG,两条账号都能用。

BoChaSearXNGforced-RAGOpen WebUI

它是什么

给自建的两套 AI 对话都接上「实时联网」:DSH agent 侧多了一个 mcp__bocha__search 工具,可以按需调用博查搜索 API;Open WebUI 网页侧把搜索接成博查并开 forced-RAG,提问时先检索再回答。管理员和家人的两条账号都能用。

为什么做

DSH 原本的 web_search 走免费 SearXNG,日常够用,但中文长查询召回一般、摘要也短。博查给的是中文长摘要,单次 0.3–0.5s,更准一些,代价是按次收费(约 ¥0.036/次)。所以两边是互补关系,不是替换:免费的打底,收费的按需上。

顺带解决了两个坑:一是 DSH 的原生 provider 插件在运行中装不上(模块解析表启动时就固定),改成 MCP 配置型 bundle 后无需重启即可热生效;二是「收费服务不看余额心里没底」,于是把余额和消耗一起接进了 .164 监控台。

现在怎么样

运行中。DSH 日常搜索仍走 SearXNG,不产生费用;博查只在需要时手动调用。余额卡片每 15 分钟采样,低于 ¥5 变黄、低于 ¥2 变红并推手机提醒。2026-10-17 16:00 余额 18.48 元,Open WebUI 一次联网提问约 2 次调用、约 ¥0.07。

功能

  • DSH agent 通过 MCP 获得 mcp__bocha__search 联网搜索工具,安装即热生效、不用重启进程
  • Open WebUI 网页侧搜索接博查并开 forced-RAG,管理员与家人两条账号共用
  • 默认策略省钱优先:DSH 日常 web_search 仍走免费 SearXNG,博查按需手动调用
  • 在 .164 监控台加了「博查搜索余额」卡片:余额、今日消耗、7 天日均、14 天柱状图
  • 余额低于 ¥5 / ¥2 走 ntfy 手机推送,6 小时去重,恢复后补一条「已恢复」

技术栈

BoCha APIMCP (stdio JSON-RPC)Node.jsPythonsystemdOpen WebUISearXNG

使用 / 部署教程

1. 准备 Key

博查控制台申请 API Key,落到只有 root 能读的位置:

install -m 600 /dev/null /root/.dsh/secrets/bocha.key
# 写入 Key 后核对权限
ls -l /root/.dsh/secrets/bocha.key   # 应为 -rw-------

配置文件里只写路径,不写 Key 本身。

2. 写 MCP server

/root/plugins-src/bocha-mcp/server.mjs:零依赖 Node 脚本,走 stdio JSON-RPC,对外暴露一个工具,参数三个——query、count(1–10,默认 8)、freshness(noLimit / oneDay / oneWeek / oneMonth / oneYear)。同目录放 bundle 定义(package.json、cordis.patch.yml、locale、icon)。

3. 安装 bundle

往 DSH 配置里 insert 一条 @deepseek-ai/dsh-mcp-client(DSH 自带包,可原生解析),再挂上本地 bundle @local/bocha-mcp。用 plugin_manager 安装,正常结果是 application: applied、无 warning。

为什么不用原生 provider 插件:DSH 的模块解析表在启动时固定,运行中新装的 host 插件 import 不到 @deepseek-ai/*,必须重启整进程才生效(会中断对话、旧 GUI token 失效)。MCP 这条路不用重启。

4. 验证

  • 协议单测(initialize + tools/list + tools/call)一次跑完约 505ms;
  • Tool.listTools 能看到 mcp__bocha__search,系统提示里出现 “MCP server: bocha”;
  • 直接问「上海今天天气」,看是否返回当日天气加未来一周逐日预报。

5. 接到网页对话

Open WebUI 侧把搜索源切到博查、开启 forced-RAG(强制先检索再回答)。注意 v0.12.0 起接口路径有变,写配置用 POST /openai/config/update。

6. 余额监控

采集脚本 /opt/dashboard/bocha_balance.py,由 systemd 定时器每 15 分钟跑一次,调 GET https://api.bochaai.com/v1/fund/remaining(头 Authorization: Bearer <key>)。消耗按余额差值算:当天第一个点减最后一个点,除以 ¥0.036/次可反推调用次数。阈值 ¥5 / ¥2 触发 ntfy 推送。

维护提醒

改了 server.mjs 之后,要在 plugin_manager 里禁用再启用 @local/bocha-mcp(或重启 DSH),否则跑的还是老进程。

注意

  • 博查 Key 只存本机 secrets(600 权限),不进 homelab-git 备份;文档与配置里都只写路径不写 Key。
  • 博查按次计费,Open WebUI 一次联网提问约 2 次调用(约 ¥0.07);如果哪天用超了,先把 forced-RAG 关掉。
  • 改完 server.mjs 必须让 MCP server 重启(禁/启 bundle 或重启 DSH),否则修改不生效。