修复网页对话并接入 SearXNG 搜索

This commit is contained in:
ylhan
2026-09-16 11:17:41 +08:00
parent c3d2c7f3a8
commit 719fc13e48
13 changed files with 840 additions and 52 deletions
+31 -4
View File
@@ -1,6 +1,6 @@
# 部署说明 · 服务器侧助手
更新:2026-09-15。状态:**已部署并跑通**,端到端测试 16/16 通过。
更新:2026-09-16。状态:**已部署并跑通**,语音、网页文字与联网搜索均完成闭环。
## 架构定位
@@ -88,6 +88,10 @@ DoA 读取和网络桥接,不跑任何推理。
| `AI_TTS_INSTRUCTIONS` | `用轻快活泼的语气说` | 风格指令 |
| `AI_STT_THREADS` | `4` | **N5095 上必须改成 2**(见下) |
| `AI_MODEL_DIR` | `/home/yonglin/ai-companion/models` | 两边模型位置不同 |
| `SEARCH_ENABLED` | `true` | 向 LLM 注册只读 `web_search` 工具 |
| `SEARXNG_BASE_URL` | `http://127.0.0.1:18080` | 私有 SearXNG,仅服务器回环可达 |
| `SEARCH_TIMEOUT_S` | `6`(默认) | 搜索总超时,失败后让模型明确降级 |
| `SEARCH_MAX_RESULTS` | `5`(默认) | 单次最多回灌的搜索结果 |
**两台机器的线程配置不能照抄**:N5095(4核无AVX2)STT 超过 2 线程急剧退化
(4 线程慢 3.9 倍);服务器(i9-14900K 有AVX2)给 4 线程没问题。
@@ -100,15 +104,22 @@ TTS 的线程扩展方向又和 STT 相反(越多越快)。
cd ~/tts-qwen && setsid nohup .venv/bin/python tts_server.py --port 18040 \
> logs/tts_service.log 2>&1 < /dev/null &
# 2. Pipecat 实时服务端(含 /client/ 网页测试入口)
# 2. 私有 SearXNG(首次部署先从 example 生成 settings.yml 并替换随机密钥)
cd ~/ai-companion/deploy/searxng && docker compose up -d
# 3. Pipecat 实时服务端(含 /client/ 网页测试入口)
cd ~/ai-companion && setsid nohup .venv/bin/python services/bot_server.py \
--host 0.0.0.0 --port 7860 > logs/bot_server.log 2>&1 < /dev/null &
# 3. 确认就绪
# 4. 确认就绪
curl -s http://127.0.0.1:18040/health
curl -GsS http://127.0.0.1:18080/search \
--data-urlencode 'q=DeepSeek' --data-urlencode 'format=json'
# 3. 跑测试
# 5. 跑测试
cd ~/ai-companion && .venv/bin/python app/tests/test_engine_e2e.py
.venv/bin/python app/tests/test_search.py
.venv/bin/python app/tests/test_search_live.py
```
助手本体还没有常驻服务(没有 systemd),目前靠直接跑脚本。
@@ -180,6 +191,22 @@ Playground 使用的 `/start` 后,浏览器麦克风、RTVI、语音回复均
指标约 3.0 秒。当前是 P1 调试模式:连接后持续上传并响应每段有效语音,尚未实现
P2 的本地唤醒和 20 秒连续对话窗口。
网页文字输入由 RTVI `send-text` 转为 `LLMMessagesAppendFrame`,适配层会调用
`ConversationEngine.respond_to_text()`;回复用标准 LLM 帧返回,因此 Conversation
区域可显示用户文字和助手回复,默认也会合成语音。当前 Playground 1.7 还需要
完整的 `bot-transcription` / `bot-output` 事件,不能只发送 token 级
`bot-llm-text`。
**联网搜索已实现并部署。** DeepSeek 通过 Function Calling 请求 `web_search`,引擎
聚合完整的流式工具参数,调用回环地址上的 SearXNG,并把标题、摘要、URL 作为
`tool` 消息回灌后生成最终回答。最多连续搜索两轮,搜索失败不会拖垮对话;网页保留
一到三个来源 URL,TTS 从“来源:”开始停止朗读。2026-09-16 真实验收中,模型主动
搜索、取得 5 条结果并生成带两个来源的回答。
服务器到 DuckDuckGo、Brave、Wikipedia 会超时,因此 SearXNG 当前只保留并显式
启用 Bing、360 搜索、搜狗;其中 360 与搜狗实测有结果,Bing 当前返回空结果。
容器只监听 `127.0.0.1:18080`,不向局域网或公网暴露。
## 未做的事
- **没有常驻服务**:TTS 服务和助手都没有 systemd 开机自启(方案 §10 要求 P2 后做)