656 lines
33 KiB
Markdown
656 lines
33 KiB
Markdown
|
|
# 企微IT智能服务台 — 系统架构、消息收发、知识库迭代说明
|
|||
|
|
|
|||
|
|
> **版本**: v1.1 | **日期**: 2026-06-02 | **负责人**: 宋献(IT支持组组长)
|
|||
|
|
> **目标读者**: 运维团队 / 架构团队 / 开发团队
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 一、项目概述
|
|||
|
|
|
|||
|
|
### 1.1 背景
|
|||
|
|
|
|||
|
|
公司约 **6000 人**,全国设分子机构,使用企业微信作为内部 IM。当前 IT 服务存在三大痛点:
|
|||
|
|
|
|||
|
|
| 痛点 | 现状 | 影响 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| 员工绕过 AI 直接找人工 | 可通过关键词直通人工坐席,首次后永久记忆 | AI 筛选率极低,人工成本高 |
|
|||
|
|
| AI 转人工需另开窗口 | 跳转到企微"员工服务"模块,与 AI 对话割裂 | 体验差,员工困惑 |
|
|||
|
|
| 无法跨主体共享 | 企微"员工服务"不支持互联企业应用共享 | 跨企业服务不可达 |
|
|||
|
|
|
|||
|
|
### 1.2 核心方案
|
|||
|
|
|
|||
|
|
**自研 IT 服务坐席系统**,替代企微内置的"员工服务"模块:
|
|||
|
|
- 基于企微自建应用消息 API,所有消息由自己的服务器接管
|
|||
|
|
- 分三步渐进式构建:M1 消息接管 → M2 AI 接入 → M3 知识库闭环
|
|||
|
|
- 当前处于 **M1(消息接管 + 极简坐席)开发阶段**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 二、系统架构
|
|||
|
|
|
|||
|
|
### 2.1 部署架构总览
|
|||
|
|
|
|||
|
|
> 详见附件:**系统部署架构图**(图1)
|
|||
|
|
|
|||
|
|
系统采用 **Docker Compose 单体容器化部署**,部署于公司内部独立服务器(预生产环境,与数据平台不同主机。正式环境将迁移到 K8s 集群):
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌────────────────────────────────────────────────────┐
|
|||
|
|
│ Docker Engine │
|
|||
|
|
│ │
|
|||
|
|
│ Nginx (:80/:443) — 反向代理 + HTTPS + 静态文件 │
|
|||
|
|
│ │ │
|
|||
|
|
│ ├──→ 前端静态资源 (Vue3) │
|
|||
|
|
│ │ ├─ 坐席工作台 (ElementPlus) │
|
|||
|
|
│ │ └─ 员工 H5 端 (Vant4) │
|
|||
|
|
│ │ │
|
|||
|
|
│ └──→ FastAPI 后端 (:8000) │
|
|||
|
|
│ ├─ 消息路由层 │
|
|||
|
|
│ ├─ 紧急度评分引擎 │
|
|||
|
|
│ └─ 会话/消息/坐席 管理 │
|
|||
|
|
│ │ │ │
|
|||
|
|
│ ▼ ▼ │
|
|||
|
|
│ PostgreSQL 16 Redis 7 │
|
|||
|
|
│ (:5432) (:6379) │
|
|||
|
|
│ 持久化存储 Token 缓存 │
|
|||
|
|
└────────────────────────────────────────────────────┘
|
|||
|
|
↕ HTTPS
|
|||
|
|
┌─────────────────┐
|
|||
|
|
│ 企微服务器 │
|
|||
|
|
│ (回调推送 + API) │
|
|||
|
|
└─────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.2 技术栈
|
|||
|
|
|
|||
|
|
| 层级 | 技术选型 | 说明 |
|
|||
|
|
|------|---------|------|
|
|||
|
|
| 反向代理 | Nginx | HTTPS 终止、静态文件、路由分发 |
|
|||
|
|
| 后端框架 | FastAPI (Python 3.12) | 异步、自动 OpenAPI 文档、类型安全 |
|
|||
|
|
| 数据库 | PostgreSQL 16 | 会话/消息/坐席/配置 持久化(9 张表) |
|
|||
|
|
| 缓存 | Redis 7 | access_token 缓存(TTL 7200s)、JWT 会话 |
|
|||
|
|
| ORM | SQLAlchemy 2.0 (async) | 异步 session、声明式模型 |
|
|||
|
|
| 数据库迁移 | Alembic | 所有表结构变更通过迁移脚本管理 |
|
|||
|
|
| 坐席前端 | Vue3 + ElementPlus + Pinia | 企业级组件库,三栏工作台布局 |
|
|||
|
|
| 员工 H5 | Vue3 + Vant4 + Pinia | 移动端组件库,企微 WebView 兼容 |
|
|||
|
|
| 加解密 | cryptography (Python) | AES-CBC-256 企微消息加解密 |
|
|||
|
|
| 容器化 | Docker + Docker Compose | 一键启停,5 个容器 |
|
|||
|
|
|
|||
|
|
### 2.3 数据库设计(9 张核心表)
|
|||
|
|
|
|||
|
|
| 表名 | 用途 | 关键字段 |
|
|||
|
|
|------|------|---------|
|
|||
|
|
| `conversations` | 会话主表 | employee_id, status(queued/serving/resolved), urgency_score(1-5), tags(JSON), is_vip |
|
|||
|
|
| `messages` | 消息记录 | sender_type(employee/agent/ai/system), content, msg_type(text/image/file) |
|
|||
|
|
| `agents` | 坐席信息 | user_id, status(online/offline/busy), current_load, max_load |
|
|||
|
|
| `quick_reply_templates` | 快速回复模板 | category, title, content(支持 {变量}), variables(JSON) |
|
|||
|
|
| `system_configs` | 系统配置 | config_key, config_value(关键词/阈值/话术等业务规则) |
|
|||
|
|
| `funny_phrases` | 趣味话术 | scene(6 种场景), content, tone, is_active |
|
|||
|
|
| `approval_links` | 审批流程链接 | category(IT/HR/行政/财务), title, url |
|
|||
|
|
| `software_downloads` | 软件下载入口 | category, name, version, platform, download_url |
|
|||
|
|
| `agent_notes` | 坐席备注 | conversation_id, agent_id, content |
|
|||
|
|
|
|||
|
|
### 2.4 API 接口分组(7 组,约 25 个端点)
|
|||
|
|
|
|||
|
|
| 分组 | 路径前缀 | 核心接口 |
|
|||
|
|
|------|---------|---------|
|
|||
|
|
| 企微回调 | `/api/wecom/callback` | GET 验证 URL、POST 接收消息 |
|
|||
|
|
| 会话管理 | `/api/conversations` | 列表/详情/状态/置顶/代办/接单 |
|
|||
|
|
| 消息管理 | `/api/conversations/{id}/messages` | 消息列表/发送 |
|
|||
|
|
| 坐席管理 | `/api/agents` | 列表/登录/状态切换 |
|
|||
|
|
| 快速回复 | `/api/quick-replies` | CRUD |
|
|||
|
|
| H5 用户端 | `/api/h5/*` | 会话/摇人/审批链接/软件下载/OAuth |
|
|||
|
|
| 系统健康 | `/api/health` | Docker 健康检查 |
|
|||
|
|
|
|||
|
|
统一响应格式:
|
|||
|
|
```json
|
|||
|
|
{ "code": 0, "data": {}, "message": "success" }
|
|||
|
|
```
|
|||
|
|
错误码:0=成功,1000+=通用错误,2000+=企微 API 错误,3000+=业务逻辑错误。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 三、消息收发全链路
|
|||
|
|
|
|||
|
|
### 3.1 流程总览
|
|||
|
|
|
|||
|
|
> 详见附件:**消息收发全链路流程图**(图2)
|
|||
|
|
|
|||
|
|
完整链路(6 步闭环):
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
员工发消息 → 企微回调解密 → 消息路由 → 评分标记 → 入库 → 坐席轮询 → 坐席回复 → 企微主动推送 → 员工同一窗口收到
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.2 详细步骤
|
|||
|
|
|
|||
|
|
| 步骤 | 触发方 | 操作 | 技术要点 |
|
|||
|
|
|------|--------|------|---------|
|
|||
|
|
| ① 接收 | 员工 | 在企微应用中发消息 | 企微应用内消息,非微信客服 |
|
|||
|
|
| ② 回调 | 企微服务器 | POST 加密 XML 到 `/api/wecom/callback` | AES-CBC-256 加密,SHA1 签名验证 |
|
|||
|
|
| ③ 解密 | FastAPI | `wecom_crypto.decrypt_message()` | 使用 `cryptography` 库,兼容企微官方加解密 |
|
|||
|
|
| ④ 路由 | MessageRouter | `route_message()` 核心编排 | 按序调用:创建会话→VIP检测→标记检测→评分→入库 |
|
|||
|
|
| ⑤ 评分 | ScoringService | 5 步评分 + 标记:VIP→情绪→举手→需介入→紧急度 | 纯规则引擎(M1 不用 AI) |
|
|||
|
|
| ⑥ 入库 | PostgreSQL | INSERT conversations + messages | 会话和消息原子写入 |
|
|||
|
|
| ⑦ 轮询 | 坐席浏览器 | 每 3 秒 GET `/api/conversations` | 按紧急度 DESC 排序,列表 + 未读标记 |
|
|||
|
|
| ⑧ 回复 | 坐席 | POST 消息内容 → 后端调用企微 API | 同时写 DB 和调用企微 `message/send` 接口 |
|
|||
|
|
| ⑨ 推送 | 企微服务器 | 推送坐席回复到员工 | 同一对话窗口显示,无跳转 |
|
|||
|
|
|
|||
|
|
### 3.3 紧急度评分公式
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
紧急度 = 基础分(关键词) + 情绪加成 + VIP加成 + 重复追问加成
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- 分值范围:1-5,限幅 `clamp(1, 5)`
|
|||
|
|
- 映射:1=低, 2=中, 3=高, 4=紧急, 5=最高
|
|||
|
|
- 所有关键词和阈值存 `system_configs` 表,支持动态修改无需重启
|
|||
|
|
|
|||
|
|
### 3.4 会话排序规则
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
紧急 → 举手 → 需介入 → 活跃 → AI处理中 → 已结单
|
|||
|
|
(同级按 last_message_at 倒序)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.5 坐席端通信
|
|||
|
|
|
|||
|
|
M1 已升级为 **WebSocket 实时推送**(2026-06-03 完成),坐席浏览器通过 `ws://host/ws/{agent_id}` 保持长连接:
|
|||
|
|
- 新消息/会话状态变更通过 WS 实时推送,无需轮询
|
|||
|
|
- 心跳保活:前端每 30 秒发 ping,后端回 pong
|
|||
|
|
- 断线重连:指数退避(1s→2s→4s→...→30s 上限)
|
|||
|
|
- 降级策略:WS 断连时自动降级为 3 秒轮询,WS 重连后自动停止轮询
|
|||
|
|
|
|||
|
|
> 旧方案(已废弃):M1 原计划使用短轮询(3-5秒),已替换为 WebSocket。
|
|||
|
|
|
|||
|
|
### 3.6 员工端架构双方案(2026-06-03 评估)
|
|||
|
|
|
|||
|
|
> **评估结论**: 企微原生1对1方案技术完全可行,已纳入项目选型文档和运维应急预案
|
|||
|
|
|
|||
|
|
当前 H5 WebView 方案(方案A)与企微原生1对1方案(方案B)为双轨可选架构:
|
|||
|
|
|
|||
|
|
| 维度 | 方案A: H5 WebView | 方案B: 原生1对1 + 外援群聊 |
|
|||
|
|
|------|-------------------|---------------------------|
|
|||
|
|
| 员工入口 | 点击应用 → H5 页面 | 直接在企微与应用1对1聊天 |
|
|||
|
|
| 交互体验 | H5 内输入框 | **原生聊天窗口,体验最优** |
|
|||
|
|
| 前端开发 | 大(Vue3+Vant4) | **零** |
|
|||
|
|
| 跨平台 | **✅ 可挂载钉钉/飞书/浏览器** | ❌ 绑定企微 |
|
|||
|
|
| 跨主体 | **✅ 可(其他认证方式)** | ❌ 仅同一企微主体 |
|
|||
|
|
| OAuth2 | 必须 | **不需要** |
|
|||
|
|
| AI/人工区分 | H5 可做丰富标识 | 需内容前缀区分 |
|
|||
|
|
| 外援协作 | 需额外设计 | **原生群聊(appchat)** |
|
|||
|
|
| 消息存档 | 全量经后端 | **全量经后端(无需会话存档权限)** |
|
|||
|
|
| 切换成本 | — | **核心链路已实现,零代码改动可切换** |
|
|||
|
|
|
|||
|
|
**方案B 交互路径**(关键纠正:不是每次都创建群聊):
|
|||
|
|
1. **AI 自助**:员工发消息 → 企微回调 → Dify → `/message/send` → 同一窗口
|
|||
|
|
2. **坐席介入**:坐席工作台 → `/message/send` → 同一窗口(员工无感知切换)
|
|||
|
|
3. **外援场景**:坐席发起 → `/appchat/create` → **新群聊窗口**(非常态,低频)
|
|||
|
|
|
|||
|
|
**选型决策**(详见 PRD §3.3):
|
|||
|
|
- 企微主体内服务 → 方案B 体验更优
|
|||
|
|
- 需跨平台/跨主体 → 方案A 不可替代
|
|||
|
|
- **推荐混合策略**:原生1对1做日常入口,H5 保留为扩展层
|
|||
|
|
|
|||
|
|
**运维应急**(详见 `01-项目总览与部署手册.md` §7.5):
|
|||
|
|
- H5 不可用时,零代码切换至方案B
|
|||
|
|
- 需外援协作时,按需启用 appchat 群聊
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 四、三步演进路径与知识库迭代
|
|||
|
|
|
|||
|
|
### 4.1 三步总览
|
|||
|
|
|
|||
|
|
> 详见附件:**三步演进路径与知识库迭代闭环图**(图3)
|
|||
|
|
|
|||
|
|
| 里程碑 | 周期 | 核心交付 |
|
|||
|
|
|--------|------|---------|
|
|||
|
|
| **M1: 消息接管 + 极简坐席** | 6 周(进行中) | 企微 API 链路验证 · 坐席三栏工作台 · 员工 H5 双栏 |
|
|||
|
|
| **M2: AI 机器人接入** | M1 后 4-6 周 | 千问/Dify/RAGFlow 接入 · AI 前置筛选 · 排队系统 |
|
|||
|
|
| **M3: 知识库闭环迭代** | M2 后 4-6 周 | 坐席标注系统 · 千问自动分析 · 知识库自优化 |
|
|||
|
|
|
|||
|
|
### 4.2 M1 — 当前阶段详情
|
|||
|
|
|
|||
|
|
| 模块 | 内容 | 状态 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| 企微消息对接 | 自建应用回调 + AES 加解密 + token 管理 | ✅ 代码完成 |
|
|||
|
|
| 消息路由 | 所有消息进路由层,新会话→坐席队列 | ✅ 代码完成 |
|
|||
|
|
| 紧急度评分 | 5 步评分引擎(VIP/情绪/举手/需介入/紧急度) | ✅ 代码完成 |
|
|||
|
|
| 坐席工作台 | Vue3 三栏布局(会话列表/对话区/AI助手面板) | ✅ 代码完成 |
|
|||
|
|
| 员工 H5 | Vue3+Vant4 双栏布局(对话区/助手面板+摇人按钮) | ✅ 代码完成 |
|
|||
|
|
| 测试用例 | 116 条 pytest 全部通过 | ✅ 完成 |
|
|||
|
|
| 环境搭建 | Docker Compose + PostgreSQL + Redis | 🔧 配置中 |
|
|||
|
|
|
|||
|
|
M1 **不接入 AI**——先验证企微基础链路(消息收发、会话管理、坐席工作台)完整可用。
|
|||
|
|
|
|||
|
|
### 4.3 M2 — AI 接入计划
|
|||
|
|
|
|||
|
|
核心改动:**只改路由层逻辑**,其余不动。
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
M1: 新会话 → 坐席队列
|
|||
|
|
M2: 新会话 → AI 先回答 → AI判断/用户触发 → 坐席队列
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
新增能力:
|
|||
|
|
- 千问(通义千问)作为对话模型
|
|||
|
|
- RAGFlow 作为知识库语义检索引擎
|
|||
|
|
- Dify 作为 AI 应用编排平台
|
|||
|
|
- 转人工触发:关键词 / AI 连续 2 轮追问 / AI 调用超时 3 秒
|
|||
|
|
- AI 回复末尾自动追加 "以上为 AI 自动回复,如需人工帮助请回复'转人工'"
|
|||
|
|
- 排队系统:等待人数、预计时间
|
|||
|
|
|
|||
|
|
目标:AI 首答率 ≥ 80%
|
|||
|
|
|
|||
|
|
### 4.4 M3 — 知识库迭代闭环(核心创新)
|
|||
|
|
|
|||
|
|
这是整个系统从"工具"进化为"智能平台"的关键一步。
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌────────────────────────────────────────────────────────┐
|
|||
|
|
│ 知识库迭代正向循环 │
|
|||
|
|
│ │
|
|||
|
|
│ 坐席日常标注 ──→ 千问分析 ──→ 自动处理 ──→ 知识库增强 │
|
|||
|
|
│ (正确/错误) (缺文档/过时) │ │
|
|||
|
|
│ ↑ │ │
|
|||
|
|
│ └──────── 持续循环 ─────────┘ │
|
|||
|
|
└────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**标注融入日常工作流**,不另开标注页面:
|
|||
|
|
- 对话区每条 AI 回复旁有 👍 / 👎 按钮
|
|||
|
|
- 坐席在正常服务过程中顺手标注
|
|||
|
|
|
|||
|
|
**千问自动分析**两类问题:
|
|||
|
|
| 分析结果 | 自动处理 |
|
|||
|
|
|---------|---------|
|
|||
|
|
| **缺文档**:知识库没有覆盖此问题 | 千问生成标准 FAQ → 推送 RAGFlow |
|
|||
|
|
| **信息过时**:知识库有文档但内容不对 | 标记原文档需更新 → 通知管理员审核 |
|
|||
|
|
|
|||
|
|
### 4.5 并行协作模式(设计理念)
|
|||
|
|
|
|||
|
|
传统"串行排队"改为**"并行协作"**:
|
|||
|
|
|
|||
|
|
| 角色 | 工作方式 |
|
|||
|
|
|------|---------|
|
|||
|
|
| AI | 全程在线,所有对话可见 |
|
|||
|
|
| 坐席 | 随时介入,AI 始终在旁辅助 |
|
|||
|
|
| 员工 | 同一窗口,AI 和人工无缝切换 |
|
|||
|
|
|
|||
|
|
### 4.6 AI Wingman — 坐席端智能辅助(2026-06-04 新增)
|
|||
|
|
|
|||
|
|
> **设计理念**:AI不仅服务员工,更要解放坐席——从"坐席=打字员"升级为"坐席=审核员+专家"
|
|||
|
|
|
|||
|
|
**三层渐进式架构**:
|
|||
|
|
|
|||
|
|
| 层 | 目标 | 核心功能 | 行业验证 | 实施时间 |
|
|||
|
|
|----|------|---------|---------|---------|
|
|||
|
|
| 效率层 | 消灭重复劳动 | AI草稿回复 + 自动摘要 + 自动标签 | 打字量 -80%,填单 1分钟→10秒 | Phase 1(已确认) |
|
|||
|
|
| 认知层 | 降低认知负荷 | 知识推荐 + SOP导航 + 相似工单 + 客户画像 | 新人上手 -50% | Phase 2 |
|
|||
|
|
| 情感层 | 减少情绪消耗 | 情绪识别 + 安抚话术 + 语气润色 + 疲劳检测 | 情绪耗竭 -45% | Phase 3 |
|
|||
|
|
|
|||
|
|
**Phase 1 双区布局**(已确认实现方案):
|
|||
|
|
|
|||
|
|
| 区域 | 位置 | 功能 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| 内嵌区 | 对话流中(每条员工消息下方) | AI草稿回复 — [采纳]/[编辑]/[忽略] 三选一 |
|
|||
|
|
| 侧栏区 | 右侧 AI 助手面板 | 会话自动摘要、自动标签、知识推荐、快捷回复库 |
|
|||
|
|
|
|||
|
|
**底层实现**:扩展现有 Dify,新增坐席端 Wingman Agent:
|
|||
|
|
- Agent 1(已有):员工端 AI,直接回答员工问题
|
|||
|
|
- Agent 2(新增):坐席端 Wingman,辅助坐席生成草稿/摘要/知识推荐
|
|||
|
|
- 两个 Agent 共用知识库,但 system prompt 和上下文不同
|
|||
|
|
|
|||
|
|
**为什么这样做**:
|
|||
|
|
1. 坐席每天大量重复回复(密码重置、VPN指引等),AI草稿让坐席从"打字员"变"审核员"
|
|||
|
|
2. 结单文书消耗 70% 非服务时间,自动摘要压缩到 10%
|
|||
|
|
3. 员工情绪会传染坐席,情绪预警+安抚话术帮助保持专业冷静
|
|||
|
|
4. 参考:NiCE Copilot、Helpshift AI Copilot、天润融通、循环智能等产品验证
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 五、运维相关信息
|
|||
|
|
|
|||
|
|
### 5.1 资源配置需求
|
|||
|
|
|
|||
|
|
| 资源 | 最低配置 | 建议配置 |
|
|||
|
|
|------|---------|---------|
|
|||
|
|
| 服务器 | 4 核 / 8 GB / 100 GB SSD | Docker Engine 环境 |
|
|||
|
|
| 公网 HTTPS 域名 | 1 个 | 用于企微回调 URL |
|
|||
|
|
| 企微自建应用 | 1 个(已创建) | CorpID/AgentID/Secret/Token/EncodingAESKey |
|
|||
|
|
|
|||
|
|
> **待办**:企微回调 URL 需要公司服务器+公网 HTTPS 域名,目前暂缓,先在本机测试环境完成其他部分。
|
|||
|
|
|
|||
|
|
### 5.2 Docker Compose 服务清单
|
|||
|
|
|
|||
|
|
| 服务 | 镜像 | 端口 | 健康检查 |
|
|||
|
|
|------|------|------|---------|
|
|||
|
|
| postgres | postgres:16 | 5432 | pg_isready |
|
|||
|
|
| redis | redis:7 | 6379 | redis-cli ping |
|
|||
|
|
| backend | 自构建 Dockerfile | 8000 | /api/health |
|
|||
|
|
| frontend-agent | 自构建 + Nginx 静态 | 80/443 | — |
|
|||
|
|
| frontend-h5 | 同 Nginx 容器 | — | — |
|
|||
|
|
|
|||
|
|
### 5.3 关键配置项(.env)
|
|||
|
|
|
|||
|
|
```env
|
|||
|
|
# 企微
|
|||
|
|
WECOM_CORP_ID=ww...
|
|||
|
|
WECOM_AGENT_ID=1000002
|
|||
|
|
WECOM_SECRET=...
|
|||
|
|
WECOM_TOKEN=... # 回调验证 Token
|
|||
|
|
WECOM_ENCODING_AES_KEY=... # 43 位随机字符串
|
|||
|
|
|
|||
|
|
# 数据库
|
|||
|
|
DATABASE_URL=postgresql://user:pass@postgres:5432/wecom_it_desk
|
|||
|
|
|
|||
|
|
# Redis
|
|||
|
|
REDIS_URL=redis://redis:6379/0
|
|||
|
|
|
|||
|
|
# 服务
|
|||
|
|
BACKEND_PORT=8000
|
|||
|
|
CORS_ORIGINS=http://localhost:5173
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.4 启动命令
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# 一键启动所有服务
|
|||
|
|
docker compose up -d
|
|||
|
|
|
|||
|
|
# 数据库迁移
|
|||
|
|
docker compose exec backend alembic upgrade head
|
|||
|
|
|
|||
|
|
# 查看日志
|
|||
|
|
docker compose logs -f backend
|
|||
|
|
|
|||
|
|
# 停止
|
|||
|
|
docker compose down
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 六、当前进展与待办
|
|||
|
|
|
|||
|
|
### 6.1 当前进度
|
|||
|
|
|
|||
|
|
| 模块 | 状态 | 备注 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| PRD | ✅ 完成 | 31 项需求,7 个用户故事 |
|
|||
|
|
| 架构设计 | ✅ 完成 | 9 张表 DDL,7 组 API,4 个时序图 |
|
|||
|
|
| 后端代码 | ✅ 完成 | 45 个文件,7 个服务层 + 7 个 API 路由 |
|
|||
|
|
| 坐席前端 | ✅ 完成 | 25 个文件,Vue3+ElementPlus 三栏布局 |
|
|||
|
|
| 员工 H5 | ✅ 完成 | 12 个文件,Vue3+Vant4 双栏+摇人 |
|
|||
|
|
| 测试用例 | ✅ 完成 | 116 条 pytest 全部通过 |
|
|||
|
|
| 环境搭建 | 🔧 进行中 | PostgreSQL + Redis 安装配置中 |
|
|||
|
|
| 企微回调 | ⏳ 待办 | 需要公司服务器 + 公网 HTTPS 域名 |
|
|||
|
|
|
|||
|
|
### 6.2 需要团队协助的事项
|
|||
|
|
|
|||
|
|
| # | 事项 | 需要谁 | 紧急度 |
|
|||
|
|
|---|------|--------|--------|
|
|||
|
|
| 1 | **服务器资源**:分配一台 Linux 服务器用于 Docker 部署 | 运维 | 中 |
|
|||
|
|
| 2 | **公网域名**:一个 HTTPS 域名用于企微回调 URL | 运维/架构 | 中(M1 联调前) |
|
|||
|
|
| 3 | **SSL 证书**:通配符证书或 Let's Encrypt | 运维 | 中(同上) |
|
|||
|
|
| 4 | **企微通讯录权限**:确认 API 权限(VIP 功能依赖) | 运维/企微管理员 | 低(M1 可暂用 mock) |
|
|||
|
|
| 5 | **千问/Dify/RAGFlow 环境**(M2 阶段) | 架构/开发 | 低(M2 前准备) |
|
|||
|
|
|
|||
|
|
### 6.3 下一步计划
|
|||
|
|
|
|||
|
|
1. **本周**:完成本机 PostgreSQL + Redis 安装,后端本地启动验证
|
|||
|
|
2. **下周**:坐席前端启动联调,Swagger 接口测试
|
|||
|
|
3. **服务器就绪后**:Docker Compose 部署 + 企微回调配置 + 完整链路联调
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 七、现有系统复用评估
|
|||
|
|
|
|||
|
|
> 基于交接文档 + db_query_project_v8 源码分析,评估现有企微AI客服系统可复用的服务能力和资源
|
|||
|
|
|
|||
|
|
### 7.1 现有系统全景
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌──────────────────────────────────────────────────────────────┐
|
|||
|
|
│ 员工(企微App) │
|
|||
|
|
│ │ 发消息/收回复 │
|
|||
|
|
│ ▼ │
|
|||
|
|
│ ┌─────────────────┐ │
|
|||
|
|
│ │ 企业微信自建应用 │ │
|
|||
|
|
│ └────────┬────────┘ │
|
|||
|
|
│ │ 回调/主动消息 │
|
|||
|
|
│ ▼ │
|
|||
|
|
│ ┌─────────────────┐ ┌──────────────────┐ │
|
|||
|
|
│ │ B端生产智能体 │───▶│ dify2openai 桥接 │ │
|
|||
|
|
│ │ agent.dc.servyou │ │ yw-dify.dc │ │
|
|||
|
|
│ └────────┬────────┘ └────────┬─────────┘ │
|
|||
|
|
│ │ │ │
|
|||
|
|
│ ▼ ▼ │
|
|||
|
|
│ ┌─────────────────┐ ┌──────────────────┐ │
|
|||
|
|
│ │ Dify Workflow │ │ RAGFlow 知识库 │ │
|
|||
|
|
│ │ yw-dify.dc │ │ 10.80.0.85:8080 │ │
|
|||
|
|
│ └─────────────────┘ └──────────────────┘ │
|
|||
|
|
│ │ │ │
|
|||
|
|
│ ▼ ▼ │
|
|||
|
|
│ ┌─────────────────┐ ┌──────────────────┐ │
|
|||
|
|
│ │ Qwen3-30B │ │ bge-m3 向量模型 │ │
|
|||
|
|
│ │ 10.80.0.49 │ │ │ │
|
|||
|
|
│ └─────────────────┘ └──────────────────┘ │
|
|||
|
|
│ │
|
|||
|
|
│ ┌──────────────────────────────────────────┐ │
|
|||
|
|
│ │ 智能IT数据平台 (Django 3.2) │ │
|
|||
|
|
│ │ it-dataquery.dc.servyou-it.com │ │
|
|||
|
|
│ │ 10.80.0.86 │ │
|
|||
|
|
│ │ ┌────────────┬────────────┬───────────┐ │ │
|
|||
|
|
│ │ │ 数据查询统计 │ 人工介入标注 │ 人工录入 │ │ │
|
|||
|
|
│ │ └────────────┴────────────┴───────────┘ │ │
|
|||
|
|
│ │ DB: dify(只读) + intervention_db(读写) │ │
|
|||
|
|
│ └──────────────────────────────────────────┘ │
|
|||
|
|
└──────────────────────────────────────────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 7.2 可复用资源清单
|
|||
|
|
|
|||
|
|
#### 🔴 核心复用(直接影响新系统架构)
|
|||
|
|
|
|||
|
|
| # | 资源 | 现有位置/信息 | 复用方式 | 新系统对应 |
|
|||
|
|
|---|------|-------------|---------|-----------|
|
|||
|
|
| 1 | **Dify Workflow** | `yw-dify.dc.servyou-it.com/apps` | 直接复用,M2阶段接入AI回复 | 坐席助手AI面板 + 自动回复 |
|
|||
|
|
| 2 | **dify2openai 桥接** | `yw-dify.dc/dify2openai/v1/chat/completions` | 直接复用API | 后端调用AI的入口 |
|
|||
|
|
| 3 | **RAGFlow 知识库** | `10.80.0.85:8080` | 直接复用,M3阶段混合标注迭代 | 知识库管理 + 标注闭环 |
|
|||
|
|
| 4 | **Qwen3-30B 大模型** | `10.80.0.49:5000/api/llm/servyou/v1` | 直接复用 | AI对话底层模型 |
|
|||
|
|
| 5 | **bge-m3 向量模型** | RAGFlow 内置 | 直接复用 | 知识库检索向量化 |
|
|||
|
|
| 6 | **Dify 数据库(只读)** | `10.80.128.40:5432` DB=dify User=difyro | 读取messages表获取AI对话记录 | 历史会话数据迁移 + 统计 |
|
|||
|
|
| 7 | **企微自建应用** | 已创建,有CorpID/AgentID/Secret | 直接复用应用凭证 | 消息收发的企微入口 |
|
|||
|
|
|
|||
|
|
#### 🟡 业务逻辑复用(需适配改造)
|
|||
|
|
|
|||
|
|
| # | 现有能力 | 现有实现 | 适配到新系统 | 改造量 |
|
|||
|
|
|---|---------|---------|-------------|-------|
|
|||
|
|
| 8 | **会话定义** | 15分钟无交互=一个会话结束 | 改为新系统会话状态机(queued→serving→resolved) | 中 |
|
|||
|
|
| 9 | **自助解决判定** | 15分钟内未转人工 | 复用判定逻辑,改为新系统统计口径 | 小 |
|
|||
|
|
| 10 | **知识库命中判定** | 回答含"您的问题可能不在服务业务范围内"=未命中 | 复用关键词,增加AI置信度评分 | 小 |
|
|||
|
|
| 11 | **系统转人工判定** | 用户输入"IT"即转人工 | 改为摇人按钮 + 智能评分触发 | 中 |
|
|||
|
|
| 12 | **人工介入标注** | ManualIntervention模型(命中/待处理/已处理) | 适配为新系统会话标记体系(VIP/举手/需介入/情绪) | 中 |
|
|||
|
|
| 13 | **人工录入** | ManualEntry模型(补录线下咨询) | 复用,接入新系统数据库 | 小 |
|
|||
|
|
| 14 | **月度报表查询** | MonthlyReportQueryView | 改造为新系统运营报表 | 中 |
|
|||
|
|
| 15 | **坐席登录认证** | Session + Redis + 12小时超时 | 改为JWT + Redis,复用登录逻辑 | 小 |
|
|||
|
|
| 16 | **密码修改** | ChangePasswordView | 复用,加哈希加密(现在明文存储) | 小 |
|
|||
|
|
|
|||
|
|
#### 🟢 基础设施复用(直接复用或微调)
|
|||
|
|
|
|||
|
|
| # | 资源 | 现有配置 | 复用方式 |
|
|||
|
|
|---|------|---------|---------|
|
|||
|
|
| 17 | **服务器 10.80.0.86** | 现有Django+PostgreSQL+Redis | 新系统后端部署目标 |
|
|||
|
|
| 18 | **域名** | `it-dataquery.dc.servyou-it.com` | 新系统用子域名如 `itdesk.dc.servyou-it.com` |
|
|||
|
|
| 19 | **SSL证书** | ssl/目录 | 复用或申请新证书 |
|
|||
|
|
| 20 | **Nginx** | `nginx/nginx.conf` | 改反代配置指向新系统 |
|
|||
|
|
| 21 | **Docker Compose 部署模式** | 现有5套 compose 编排 | 复用部署模式,新系统加自己的 compose |
|
|||
|
|
| 22 | **Redis** | `10.90.5.8` Redis 7 + 密码(见运维密码管理) | 直接连接使用 |
|
|||
|
|
| 23 | **Docker网络** | dbquery_net 桥接模式 | 新建 itdesk_net |
|
|||
|
|
| 24 | **SearXNG 搜索** | `10.90.5.8:8080` | M2阶段AI联网搜索能力 |
|
|||
|
|
| 25 | **LangBot** | `10.90.5.8:30030` | 可选,多模型接入 |
|
|||
|
|
|
|||
|
|
### 7.3 数据模型映射(旧→新)
|
|||
|
|
|
|||
|
|
#### 用户模型
|
|||
|
|
|
|||
|
|
| 现有 system_users | 新系统 Agent(坐席) | 复用方式 |
|
|||
|
|
|-------------------|---------------------|---------|
|
|||
|
|
| username | username | ✅ 直接复用 |
|
|||
|
|
| password(明文⚠️) | password_hash | 🔄 改为bcrypt哈希 |
|
|||
|
|
| is_active | is_online | 🔄 语义变更 |
|
|||
|
|
| created_at | created_at | ✅ 直接复用 |
|
|||
|
|
| — | display_name | 🆕 新增 |
|
|||
|
|
| — | role | 🆕 新增(admin/agent) |
|
|||
|
|
|
|||
|
|
#### 会话/消息模型
|
|||
|
|
|
|||
|
|
| 现有 messages(Dify只读) | 新系统 Conversation + Message | 说明 |
|
|||
|
|
|--------------------------|-------------------------------|------|
|
|||
|
|
| id | — | Dify消息ID,迁移时关联 |
|
|||
|
|
| session_id → user_name | Conversation.user_id | 会话归属用户 |
|
|||
|
|
| query | Message.content(type=text) | 用户问题 |
|
|||
|
|
| answer | Message.content(type=ai_reply) | AI回复 |
|
|||
|
|
| created_at | Message.created_at | 时间戳 |
|
|||
|
|
| — | Conversation.status | 🆕 状态机 |
|
|||
|
|
| — | Conversation.urgency_score | 🆕 紧急度 |
|
|||
|
|
| — | Conversation.tags | 🆕 标记体系 |
|
|||
|
|
|
|||
|
|
#### 人工介入模型
|
|||
|
|
|
|||
|
|
| 现有 ManualIntervention | 新系统 Conversation.tags | 说明 |
|
|||
|
|
|------------------------|--------------------------|------|
|
|||
|
|
| message_id | conversation_id | 关联对象变更 |
|
|||
|
|
| manual_intervention(是/否) | tags中的"需介入" | 逻辑迁移 |
|
|||
|
|
| operation_user | agent_id | 操作人关联 |
|
|||
|
|
| knowledge_status(命中/待处理/已处理) | tags中的知识库状态 | 逻辑迁移 |
|
|||
|
|
| query | — | 已在Message中 |
|
|||
|
|
|
|||
|
|
#### 人工录入模型
|
|||
|
|
|
|||
|
|
| 现有 ManualEntry | 新系统 | 说明 |
|
|||
|
|
|-----------------|--------|------|
|
|||
|
|
| 整个模型 | ✅ 可直接复用 | 补录线下咨询记录 |
|
|||
|
|
|
|||
|
|
### 7.4 技术栈对比与迁移路径
|
|||
|
|
|
|||
|
|
| 维度 | 现有系统 | 新系统 | 迁移策略 |
|
|||
|
|
|------|---------|--------|---------|
|
|||
|
|
| 后端框架 | Django 3.2(同步) | FastAPI(异步) | **完全重写后端**,Django不适配实时消息 |
|
|||
|
|
| 数据库ORM | Django ORM | SQLAlchemy 2.0(异步) | 模型定义迁移,逻辑重写 |
|
|||
|
|
| 前端坐席台 | Bootstrap + jQuery | Vue3 + ElementPlus | **完全重写前端** |
|
|||
|
|
| 前端用户端 | 无(企微原生聊天) | Vue3 + Vant4 (H5) | 新建 |
|
|||
|
|
| 数据库 | PG 11.8(Dify只读)+ PG 13(本地) | PG 16(统一) | 升级,合并为单库 |
|
|||
|
|
| 缓存 | Redis 7(django-redis) | Redis 7(aioredis) | 复用Redis实例 |
|
|||
|
|
| 部署 | Docker Compose | Docker Compose | 复用模式 |
|
|||
|
|
| 认证 | Django Session | JWT + Redis | 重写认证层 |
|
|||
|
|
|
|||
|
|
> **关键结论**:代码层面复用率约 15%(主要是业务逻辑和SQL查询),基础设施和AI能力复用率约 70%。
|
|||
|
|
|
|||
|
|
### 7.5 对接点梳理(新系统与现有系统交互)
|
|||
|
|
|
|||
|
|
#### M1阶段(当前)— 纯坐席台
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
新系统独立运行,不与现有系统交互
|
|||
|
|
├── 企微消息 → 新后端(FastAPI) → 坐席台(Vue3) → 回复
|
|||
|
|
├── 数据库:本地 PostgreSQL 16
|
|||
|
|
└── 缓存:本地 Redis
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### M2阶段 — 接入AI
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
新系统 + 现有AI能力
|
|||
|
|
├── 企微消息 → 新后端 → Dify(dify2openai) → AI回复
|
|||
|
|
│ └─ 同时 → 坐席台(AI助手面板展示AI回复)
|
|||
|
|
├── AI无法解决 → 转坐席(摇人)
|
|||
|
|
├── 读取Dify数据库 → 同步历史对话到新系统
|
|||
|
|
└── RAGFlow → 知识库检索
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### M3阶段 — 知识库迭代
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
新系统 + AI + 知识库闭环
|
|||
|
|
├── 坐席标注 → RAGFlow 知识库更新
|
|||
|
|
├── AI回复 + 坐席校正 → 知识库质量提升
|
|||
|
|
├── 统计面板 → 月度运营报告(复用现有报表逻辑)
|
|||
|
|
└── 数据平台 → 合并到新系统或并行运行
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 7.6 关键对接参数汇总
|
|||
|
|
|
|||
|
|
| 参数 | 值 | 用途 |
|
|||
|
|
|------|-----|------|
|
|||
|
|
| dify2openai API | `http://yw-dify.dc.servyou-it.com/dify2openai/v1/chat/completions` | AI对话 |
|
|||
|
|
| dify2openai Key | `http://yw-dify.dc.servyou-it.com/v1\|app-***\|Chat` | 认证 |
|
|||
|
|
| RAGFlow | `http://10.80.0.85:8080` | 知识库管理 |
|
|||
|
|
| Qwen3-30B | `http://10.80.0.49:5000/api/llm/servyou/v1/chat/completions` | 大模型 |
|
|||
|
|
| Dify DB(生产只读) | `10.80.128.40:5432` DB=dify User=difyro Pwd=*** | 历史数据 |
|
|||
|
|
| Dify DB(测试) | `10.199.16.9:5432` DB=dify User=dify_ro | 测试环境 |
|
|||
|
|
| Redis | `10.90.5.8:6379` Pwd=*** | 缓存共享 |
|
|||
|
|
| 数据平台 | `http://it-dataquery.dc.servyou-it.com` (10.80.0.86) | 部署服务器 |
|
|||
|
|
| B端智能体 | `https://agent.dc.servyou-it.com` | 智能体管理 |
|
|||
|
|
| SearXNG | `http://10.90.5.8:8080` | 联网搜索 |
|
|||
|
|
| Dify App ID | `a57543f3-de66-47cc-ad89-d0540c08159f` | 消息查询过滤 |
|
|||
|
|
|
|||
|
|
### 7.7 对运维/架构/开发的具体建议
|
|||
|
|
|
|||
|
|
**给运维:**
|
|||
|
|
1. **10.80.0.86 服务器**已跑Django+PG+Redis,新系统FastAPI可同机部署(不同端口),后续迁容器
|
|||
|
|
2. **域名**申请 `itdesk.dc.servyou-it.com`,Nginx反代到新系统8001端口
|
|||
|
|
3. **Redis**可复用现有实例(db=0给旧系统,db=1给新系统)
|
|||
|
|
4. **SSL**复用现有通配符或新申请
|
|||
|
|
|
|||
|
|
**给架构:**
|
|||
|
|
1. **M1独立运行**,不依赖现有系统,降低风险
|
|||
|
|
2. **M2通过dify2openai API对接**,不需要改Dify Workflow代码
|
|||
|
|
3. **Dify数据库只读**,新系统通过SQL同步历史数据,不影响现有AI服务
|
|||
|
|
4. **RAGFlow API**直接调用,M3阶段做双向同步
|
|||
|
|
|
|||
|
|
**给开发:**
|
|||
|
|
1. 新系统用 **FastAPI + SQLAlchemy 2.0**,不要沿用Django代码
|
|||
|
|
2. 现有系统的 **业务逻辑(会话判定、命中判定、报表SQL)** 可参考移植
|
|||
|
|
3. **数据模型映射**见7.3节,需要做数据迁移脚本
|
|||
|
|
4. **API对接参数**见7.6节,M2阶段需要配置
|
|||
|
|
|
|||
|
|
### 7.8 风险与注意事项
|
|||
|
|
|
|||
|
|
| 风险 | 级别 | 应对 |
|
|||
|
|
|------|------|------|
|
|||
|
|
| Dify数据库是只读的,不能写入 | ⚠️ 中 | 新系统自建库,只从Dify同步数据 |
|
|||
|
|
| 现有系统密码明文存储 | 🔴 高 | 新系统必须用bcrypt,迁移时做哈希转换 |
|
|||
|
|
| dify2openai桥接由CF维护 | ⚠️ 中 | 提前沟通M2对接需求,预留联调时间 |
|
|||
|
|
| RAGFlow知识库由宋献IT组维护 | ℹ️ 低 | M3阶段需协调知识库写入权限 |
|
|||
|
|
| 现有Django 3.2 + PG 11.8版本老旧 | ⚠️ 中 | 新系统独立部署,不升级旧系统 |
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 附录:代码仓库
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
C:\Users\simon\wecom_it_smart_desk\
|
|||
|
|
├── PRD.md # 产品需求文档
|
|||
|
|
├── ARCHITECTURE.md # 系统架构设计(含类图/时序图/API/DDL)
|
|||
|
|
├── docker-compose.yml # Docker 编排
|
|||
|
|
├── .env # 环境变量
|
|||
|
|
├── backend/ # FastAPI 后端 (45 个文件)
|
|||
|
|
│ ├── app/
|
|||
|
|
│ │ ├── api/ # 7 个路由模块
|
|||
|
|
│ │ ├── services/ # 6 个服务层
|
|||
|
|
│ │ ├── models/ # 9 个数据模型
|
|||
|
|
│ │ ├── schemas/ # 6 个 Pydantic Schema
|
|||
|
|
│ │ └── utils/ # 加解密/token/响应工具
|
|||
|
|
│ └── alembic/ # 数据库迁移
|
|||
|
|
├── frontend-agent/ # 坐席工作台前端 (25 个文件)
|
|||
|
|
├── frontend-h5/ # 员工 H5 前端 (12 个文件)
|
|||
|
|
├── tests/ # 测试用例 (116 条)
|
|||
|
|
└── docs/ # 文档
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
> 本文档面向运维/架构/开发三团队沟通使用。详细技术规格见 `ARCHITECTURE.md`,产品需求见 `PRD.md`。
|