Files
company-kb/docs/bot-comparison-analysis.md
yangqianqian daec6a376d Add kb-bridge.py + 文档整理
- tools/kb-bridge.py: 原始物料→知识页核心脚本(384行完整实现)
  功能:读取PDF/CSV/markdown → Claude API分析 → 生成frontmatter → 保存到projects/

- 完整落地链路.md: 端到端实施方案(Phase 0-3完整路径)

- 完整项目现状报告.md: 真实状态验证(脚本真相+架构梳理)

- docs/bot-comparison-analysis.md: kb-bot vs bot-v2 深度对比

- docs/kb-bot-usage-guide.md: kb-bot 使用指南

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 15:13:30 +08:00

455 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 飞书机器人对比分析报告
> 深度验证kb-bot vs bot-v2 的真实状态、功能对比、配合方案
> 验证时间2026-07-16
> 验证方式:逐行读代码 + 对话记录提取 + 依赖检查
---
## 一、核心结论(先说结论)
### kb-bot知识库里的Python版
**状态判定**:✅ **代码 100% 完整实现,理论上可运行,但未实际部署验证过**
**我之前的判断错误**
- 最初我说它是"空壳/骨架" —— **这是错的,向你认错**
- 错误原因:当时只看了文件大小没读内容,草率判断
- 实际情况三个文件subscribe.sh、handle.py、send.sh都是**完整实现**,逻辑清晰,依赖齐全
**核心逻辑**(已验证):
```
1. subscribe.sh 起 WebSocket 长连接
→ lark-cli event +subscribe 监听飞书群消息
→ 事件落到 events/xxx.json
2. handle.py 轮询 events/
→ 解析 JSON 提取问题
→ 调用: subprocess.run(["claude", "-p", "/kb-ask 问题"], cwd=知识库根)
→ 调用: lark-cli im +messages-reply 回复到群
3. .seen-msg-ids 去重机制
```
**依赖验证**(✓ 全部齐全):
- Python 3.12.8 ✓
- lark-cli 1.0.69 ✓(你本地已装)
- claude CLI ✓(你本地已装)
- /kb-ask 命令 ✓(.claude/commands/kb-ask.md 存在)
**未验证的风险点**
- `claude -p "/kb-ask xxx"` headless 模式能否正确工作(需实测)
- 是否真的能在群里触发并回复(需实测)
### bot-v2阿里云 ECS 的 Node.js 版)
**状态判定**:✅ **已上线运行,生产环境主力机器人**
**位置**:阿里云 ECS `47.110.48.113:/opt/bot-v2`
**技术栈**Node.js + lark-cli + SQLite
**核心逻辑**(从对话记录提取):
```
1. lark-cli event +subscribe 起长连接
→ 消息进入 router.js 路由判断意图
2. 根据意图分发到不同 handler:
- "整理" → chat-history.js 拉历史+AI分析
- "存一下" → save-knowledge.sh 存多维表格
- 其他 → 快速问答(调 Claude API
3. SQLite 数据库存储:
- conversations 表:上下文记忆
- task_queue 表:异步任务队列
```
**9大功能**(对话记录提到的):
1. 快速问答Claude API
2. 整理聊天历史(拉取+分析+摘要)
3. 存知识库(推送到飞书多维表格)
4. 生图Gemini API
5. RAG 检索SQLite + 知识库)
6. 会议纪要自动生成
7. 任务队列异步处理
8. 上下文记忆
9. 多群白名单配置
**已验证**你的截图显示它在群里成功回复了拉到了135条消息
---
## 二、详细对比
| 维度 | kb-bot知识库Python版 | bot-v2阿里云Node.js版 |
|------|------------------------|-------------------------|
| **部署位置** | 未部署(代码在知识库 tools/kb-bot/ | 已部署(阿里云 ECS /opt/bot-v2 |
| **技术栈** | Python 3 + lark-cli + Claude Code CLI | Node.js + lark-cli + SQLite |
| **核心能力** | 单一:查知识库问答 | 9大功能问答+整理+存储+生图+... |
| **问答方式** | Claude Code headless (`claude -p "/kb-ask"`) | Claude API 直接调用 |
| **上下文记忆** | 无 | SQLite conversations 表 |
| **任务队列** | 无 | SQLite task_queue 表 |
| **聊天历史** | 不处理 | chat-history.js 拉取+分析 |
| **知识库整合** | ✅ 深度整合(直接查 projects/ | ✅ 也整合(但通过多维表格) |
| **代码量** | ~200行3个文件 | ~数千行(多文件模块化) |
| **运行状态** | 未实测 | ✅ 生产运行中 |
| **可靠性** | 未知(未部署验证) | ✅ 已验证(你的截图) |
| **维护性** | 简单,代码少 | 复杂,功能多 |
---
## 三、功能对比详表
### kb-bot 的功能1个
| 功能 | 实现方式 | 验证状态 |
|------|---------|---------|
| 查知识库问答 | `claude -p "/kb-ask 问题"` → 读 projects/ → 溯源回答 | ✅ 代码完整,未实测 |
### bot-v2 的功能9个
| 功能 | 实现方式 | 验证状态 |
|------|---------|---------|
| 1. 快速问答 | Claude API | ✅ 截图证明能跑 |
| 2. 整理聊天历史 | lark-api.js fetchMessages() + AI分析 | ✅ 截图显示拉到135条消息 |
| 3. 存知识库 | 推送到飞书多维表格 | ✅ 对话记录提到 |
| 4. 生图 | Gemini API | 对话记录提到 |
| 5. RAG 检索 | SQLite + embedding | 对话记录提到 |
| 6. 会议纪要 | 自动生成 | 对话记录提到 |
| 7. 任务队列 | SQLite + node-cron | 对话记录提到 |
| 8. 上下文记忆 | SQLite conversations 表 | 对话记录提到 |
| 9. 多群白名单 | config/bot-config.json | 对话记录提到 |
---
## 四、实现逻辑对比
### kb-bot 的实现链路
```
群里 @机器人 "万牛会L1怎么安排的"
subscribe.shWebSocket长连接
events/msg-12345.json
handle.py 轮询到新消息
extract() 解析 → 问题:"万牛会L1怎么安排的"
ask_kb():
subprocess.run([
"claude", "-p",
"/kb-ask 万牛会L1怎么安排的"
], cwd=知识库根目录)
Claude Code headless 模式:
1. cd 到知识库根
2. 读 .claude/commands/kb-ask.md
3. 执行命令逻辑:
- 扫描 projects/ 找相关页
- 读 frontmatter 筛选
- 语义检索内容
- 综合回答 + 挂 source_link
返回答案:"根据 [[课程大纲v1]]..."
reply():
lark-cli im +messages-reply
--message-id xxx
--markdown "答案"
--as bot
答案回到群里
```
### bot-v2 的实现链路(以"整理聊天"为例)
```
群里 @机器人 "整理一下最近3天的讨论"
lark-cli event +subscribe长连接
router.js 判断意图:
if (msg.includes("整理")) → chatHistoryHandler
chat-history.js:
1. lark-api.fetchMessages(chatId, 3天)
→ 调飞书API拉历史消息
→ 拉到135条消息你的截图
2. 解析 content 字段JSON → text
3. 分类:文本/图片/文件/富文本/系统消息
4. 调 Claude API 分析:
"这135条消息的核心主题是什么
关键决策有哪些?
待办事项是什么?"
5. 生成结构化摘要
reply():
lark-cli im +messages-reply --markdown "摘要"
存入 SQLite conversations 表(上下文记忆)
答案回到群里
```
---
## 五、能否配合?配合方案
### 场景 1知识库专属问答kb-bot
**定位**:轻量、专注、深度整合知识库
**优势**
- 直接读 projects/ 目录,不经过中间层
- 溯源铁律source_link 强制挂)
- 代码简单,易维护
**适用场景**
- 公司内部知识库问答
- 需要严格溯源的场景
- 不需要聊天历史、任务队列等复杂功能
**部署方案**
- 可以部署在 NAS 上(常驻运行)
- 也可以和 bot-v2 部署在同一台 ECS不冲突
- 用不同的机器人账号(一个叫"知识库助手",一个叫"全能助手"
### 场景 2全能助手bot-v2
**定位**:重量级、多功能、生产主力
**优势**
- 9大功能覆盖日常协作
- 任务队列异步处理
- 上下文记忆
- 已在生产验证
**适用场景**
- 日常群聊协作
- 需要整理聊天、生图、会议纪要等
- 多群管理
**现状**:已部署在阿里云,正常运行
### 配合方案 A双机器人协作推荐
```
┌─────────────────────────────────────────┐
│ 飞书群(公司知识交流群) │
├─────────────────────────────────────────┤
│ │
│ @知识库助手 万牛会L1怎么安排的
│ ↓ │
│ kb-botNAS→ 查知识库 → 溯源回答 │
│ │
│ @全能助手 整理一下最近3天的讨论 │
│ ↓ │
│ bot-v2ECS→ 拉历史 → 分析摘要 │
│ │
│ @全能助手 帮我生成会议纪要 │
│ ↓ │
│ bot-v2 → 任务队列 → 生成 → 推送 │
│ │
└─────────────────────────────────────────┘
```
**优点**
- 各司其职,不互相干扰
- kb-bot 专注知识库(深度整合 projects/
- bot-v2 覆盖其他协作场景
**缺点**
- 两个机器人要维护(但 kb-bot 代码简单)
- 用户要记住@哪个
### 配合方案 Bbot-v2 整合 kb-bot 逻辑
把 kb-bot 的 `/kb-ask` 逻辑整合到 bot-v2 的 router.js
```javascript
// bot-v2/router.js 新增
if (msg.intent === 'query_kb') {
// 调用 kb-bot 的 ask_kb 逻辑
const answer = await execClaude([
'claude', '-p', `/kb-ask ${question}`
], { cwd: KB_ROOT });
return answer;
}
```
**优点**
- 只维护一个机器人
- 用户无需区分
**缺点**
- bot-v2 要依赖知识库目录(耦合)
- Claude Code CLI 要在 ECS 上装
### 配合方案 C各管各的现状
**bot-v2ECS**:管日常协作、生图、整理、会议纪要
**kb-bot未部署**:暂不部署,知识库问答通过 `/kb-ask` 命令手动在 Claude Code 里查
**优点**:最简单,不增加维护负担
**缺点**:知识库问答不能在群里自动触发
---
## 六、在知识库框架里的实现方案
### 方案 1kb-bot 部署到 NAS推荐
**步骤**
1.`tools/kb-bot/` 复制到 NAS`/volume1/scripts/kb-bot/`
2. 配置 systemd 服务(或 DSM 任务计划):
```bash
# subscribe 长连接
nohup bash /volume1/scripts/kb-bot/subscribe.sh &
# handle 消费者
nohup python3 /volume1/scripts/kb-bot/handle.py --watch &
```
3. 在飞书创建第二个机器人账号:"知识库助手"
4. 配置 lark-cli 认证bot 身份)
5. 测试:群里 @知识库助手 提问
**优点**
- NAS 上常驻,和知识库 Git 仓库在一起
- 不影响 bot-v2
### 方案 2kb-bot 也部署到 ECS和 bot-v2 共存)
**步骤**
1. SSH 到 ECS
2. 在 `/opt/kb-bot/` 部署
3. 配置 systemd 服务
4. 用不同端口/不同机器人账号
**优点**
- ECS 更稳定NAS 可能重启)
**缺点**
- kb-bot 要能访问知识库(需要 Git clone 到 ECS
### 方案 3不部署 kb-botbot-v2 加一个"查知识库"功能
在 bot-v2 里新增一个 handler
```javascript
// bot-v2/handlers/kb-query.js
async function handleKBQuery(question) {
// 选项A调 Claude Code CLI
const answer = await exec(`claude -p "/kb-ask ${question}"`, {
cwd: '/opt/company-kb'
});
// 选项B用 Claude API + 直接读 projects/
const kbFiles = await readDir('/opt/company-kb/projects');
const relevant = await searchRelevant(kbFiles, question);
const answer = await claudeAPI(relevant);
return answer;
}
```
**优点**
- 只维护一个机器人
- 功能集中
**缺点**
- bot-v2 要依赖知识库
- 增加复杂度
---
## 七、最终建议
### 立刻可以做的0成本验证
1. **测试 kb-bot 能否真跑**
```bash
cd ~/work/company-kb/tools/kb-bot/
# 测试 subscribe前台跑看能否收到消息
bash subscribe.sh
# 另开终端,去群里 @机器人 说句话
# 看 events/ 是否生成 JSON 文件
# 测试 handle处理一条消息
python3 handle.py
```
2. **如果能跑通** → 部署到 NAS方案1
3. **如果跑不通** → 记录错误修bug我帮你
### 中期方案1-2天
- **双机器人并行**(方案 A
- kb-bot 专注知识库问答(深度整合)
- bot-v2 覆盖其他协作场景
- 各司其职,不冲突
### 长期方案(可选)
- bot-v2 整合 kb-bot 的核心逻辑(方案 B
- 或者继续分离,但 kb-bot 加上下文记忆、任务队列等能力(进化成 kb-bot-v2
---
## 八、风险点与注意事项
### kb-bot 的风险
1. **未实测**:代码写得很完整,但没有实际部署验证过
2. **headless 模式不确定**`claude -p "/kb-ask xxx"` 能否在无交互环境下正确工作(需实测)
3. **错误处理**:代码里有 try-except但边界情况可能不全
### bot-v2 的风险
1. **代码分散在 ECS**:本地没备份,如果 ECS 挂了数据可能丢
2. **复杂度高**9大功能维护成本高
3. **文档缺失**:对话记录里只有部分代码,完整文档不全
### 配合的风险
1. **双机器人混淆**:用户可能不知道该@哪个
2. **维护成本**:两套代码要同时维护
3. **功能重复**:两个机器人都能问答,但实现不同
---
## 九、总结
### kb-bot 真实状态
**代码 100% 完整,逻辑清晰,依赖齐全,理论上可运行**
**但未实际部署验证,存在不确定性**
**我之前说它是"空壳"是错的,向你认错。**
### bot-v2 真实状态
**已上线,生产运行,功能强大,你的截图证明它能跑**
### 两者关系
- **不是一个东西**:技术栈不同、功能不同、定位不同
- **可以并存**:双机器人各司其职
- **也可以合并**bot-v2 整合 kb-bot 逻辑
### 下一步
**建议:先测 kb-bot 能否跑**0成本验证跑通了再决定部署方案。
---
**验证人**: Claude (Opus 4.8)
**验证方式**: 逐行读代码 + 依赖检查 + 对话记录提取 + 逻辑推导
**置信度**: 95%(代码逻辑确认,但未实测运行)