Files
tw/项目功能汇总.md
jimi c39840fe15 feat: 添加 AI Agent 对话测试工具 + 代码优化
主要变更:

- 新增 tests/test_ai_chat.py: AI Agent 对话测试工具

- 优化 core/pydantic_ai_agent.py 和 db/chat_log_db.py

- 清理归档文件,更新文档

Made-with: Cursor
2026-02-28 16:19:35 +08:00

477 lines
13 KiB
Markdown
Raw 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.
# AI 客服系统 - 完整功能汇总
**版本**: v1.0 | **更新日期**: 2026-02-28 | **服务器**: 1.12.50.92
---
## 目录
1. [天网协作系统](#天网协作系统)
2. [三种工作流](#三种工作流)
3. [文字检测与加价](#文字检测与加价)
4. [风险评估与接单判断](#风险评估与接单判断)
5. [作图失败转接人工](#作图失败转接人工)
6. [图片任务数据库](#图片任务数据库)
7. [图绘派单系统](#图绘派单系统)
8. [价格策略总览](#价格策略总览)
9. [技术架构](#技术架构)
---
## 天网协作系统
**说明**: 接收天网下发的任务,支持指定客户回复触发。
**API 地址**: `http://127.0.0.1:6060`
**接口列表**:
| 接口 | 方法 | 说明 |
|------|------|------|
| `/api/task/receive` | POST | 接收任务 |
| `/api/task/status/:id` | GET | 查询任务状态 |
| `/api/task/cancel` | POST | 取消任务 |
| `/api/task/list` | GET | 任务列表 |
| `/api/health` | GET | 健康检查 |
**触发类型**:
| 类型 | 说明 |
|------|------|
| `specified_customer_reply` | 指定客户回复指定内容(推荐) |
| `customer_reply` | 任意客户回复指定内容 |
| `customer_keyword` | 任意客户说某关键词 |
| `customer_payment` | 客户付款 |
| `time_reach` | 到达指定时间 |
> 详细的 API 接口文档、请求示例、数据库结构等见 **部署文档.md**。
---
## 三种工作流
根据客户说的话,自动判断执行不同的工作流程。
### 工作流 1查找图片
**触发词**: "找一下"、"找图"、"找原图"、"帮我找"、"能找到吗"、"有吗"、"有没有"
```
客户:找一下这个图 [图片]
AI 检测到"找一下"关键词 → 执行查找图片工作流
1. 创建任务operation=find
2. 上传图片到图绘平台
3. 更新任务状态为 completed
AI: 找到了图片在这里http://tuhui.cloud/works/123
```
### 工作流 2处理图片
**触发词**: "做一下"、"处理一下"、"安排"、"开始做"、"弄一下"、"修一下"、"P一下"、"P图"
```
客户:做一下 [图片]
AI 检测到"做一下"关键词 → 执行处理图片工作流
1. 创建任务operation=enhance
2. 回复"稍等,我看看...好的,可以做,马上处理"
3. 启动图片处理流程
AI: 做好了,请查看 [结果图]
```
### 工作流 3转人工派单
**触发词**: "做不了"、"处理不了"、"弄不了"、"无法处理"、"做不到"、"搞不定"
```
AI 判断无法处理 / 客户说"做不了"
执行转人工派单工作流
1. 创建任务operation=manual
2. 查询在线设计师
3. 有人在线 → 派单;无人 → 通知稍后联系
AI: 好的,已帮您安排设计师处理,请稍候
```
### 技术实现
| 组件 | 文件 | 说明 |
|------|------|------|
| 工作流路由器 | `core/workflow_router.py` | 关键词检测与匹配 |
| 工作流执行器 | `core/workflow.py` | 三种工作流的具体实现 |
| 消息处理器 | `core/pydantic_ai_agent.py` | `_handle_image_workflow()` 方法 |
**注意事项**:
- 关键词匹配支持多种说法,自动识别
- 置信度 >0.9 才执行对应工作流
- 无人在线时通知客户稍后联系,企业微信预警
- 所有工作流都保存到数据库
---
## 文字检测与加价
AI 客服自动分析图片中的文字数量,根据文字数量和分层需求自动加价。
### 文字数量加价
| 文字数量 | 加价 |
|----------|------|
| none | +0 元 |
| 少量 (1-10 字) | +5 元 |
| 中量 (11-50 字) | +15 元 |
| 大量 (51-200 字) | +30 元 |
| 极多 (200 字以上) | +50 元 |
### 文字分层需求加价
| 分层需求 | 加价 |
|----------|------|
| no | +0 元 |
| yes有文字| +50 元起 |
| yes无文字| +30 元 |
### 特殊价格
**条件**: 文字数量=大量/极多 且 分层需求=yes → **60-80 元**
### 使用场景
**场景 1**: 少量文字,不分层
- 复杂度 simple + 少量文字 → 15 + 5 = **20 元**
- AI: "这张图比较简单不过有少量文字需要处理20 元。"
**场景 2**: 大量文字,需要分层
- 复杂度 complex + 大量文字 + 分层 → 调整到 **80 元**
- AI: "这张图文字比较多,有 100 多字需要分层文件80 元。"
### 价格计算流程
```
客户发送图片 → 判断基础复杂度 → 检测文字数量 → 询问分层需求
→ 计算总价(基础+文字+分层)→ 特殊价格处理60-80 元)→ 报价
```
### 配置位置
修改价格规则: `image/image_analyzer.py`(查找文字加价相关代码)
**注意事项**:
- 文字数量通过视觉 AI 自动识别
- 分层需求需从对话中识别
- 最终价格必须是 5 的倍数
---
## 风险评估与接单判断
AI 客服自动分析图片风险,判断是否可以接单。
### 敏感内容检测(一票否决)
**敏感内容 = yes → 直接拒绝,不接单**
检测内容: 色情/黄色/擦边/裸露、性暗示、涉政/政治敏感、暴力/血腥、违禁品
**话术**: "这类不做哦" / "不好意思,这个接不了"
**禁止说**: "发图来看看"、过多解释
### 风险等级
| 风险 | 是否接单 | 说明 |
|------|----------|------|
| **none** | ✅ 接单 | 印花/图案/logo/风景/产品,效果稳定 |
| **low** | ✅ 接单 | 有人脸但清晰,需说明风险(相似度 70-90%|
| **high** | ⚠️ 谨慎 | 严重模糊/老照片人像/需打印,需说明限制 |
### 可做判断
| 可做 | 是否接单 | 说明 |
|------|----------|------|
| **yes** | ✅ 接单 | 效果有把握 |
| **partial** | ⚠️ 可接 | 能处理但有限制,需说明风险 |
| **no** | ❌ 不接 | 无法处理(纯黑/纯白/完全损坏/敏感内容)|
### 分析流程
```
客户发送图片 → 敏感内容检测yes→拒绝→ 风险评估none/low/high
→ 可做判断yes/partial/no→ 决策(接单/谨慎/拒绝)→ 回复客户
```
### 话术模板
**高风险提示**:
- "这张比较模糊,修复后清晰了但人脸可能跟原来有差异"
- "老照片修复后人脸可能有轻微变化"
- "建议先看效果确认再打印"
**正常接单**:
- "这个没问题XX 元"
- "可以处理XX 元,满意再付"
### 配置位置
- 风险判断规则: `image/image_analyzer.py`(查找"风险评估""敏感内容检测"
- 拒绝话术: `core/pydantic_ai_agent.py`(查找"拒绝"
---
## 作图失败转接人工
当 AI 作图失败或效果不佳时,系统自动转接人工客服。
### 触发场景
| 场景 | 触发条件 | 话术 |
|------|----------|------|
| AI 作图失败 | API 报错/超时/质量不达标 | "处理遇到点问题,我帮您转接人工" |
| 客户不满意 | 说"效果不好"/"不满意"/要求重做 | "好的,我帮您转接人工客服处理" |
| 特殊要求 | AI 无法处理的复杂需求 | "这个需求比较特殊,帮您转接人工" |
### 转接流程
```
作图失败/客户不满意 → 通知客户 → 转接人工客服 → 企业微信预警
```
### 技术实现
- 失败检测: `core/pydantic_ai_agent.py` 中的 `process_image_gemini` 函数
- 转接工具: `transfer_to_human` tool标记 `need_transfer=True`
**注意事项**:
- 作图失败必须转人工,不自动重试超过 2 次
- 转接前告知客户原因
- 记录转接原因便于后续优化
---
## 图片任务数据库
图片任务保存到 SQLite 数据库,支持持久化和需求变更。
### 数据库表
**image_tasks图片任务表**:
| 字段 | 类型 | 说明 |
|------|------|------|
| task_id | TEXT | 任务 ID主键|
| customer_id | TEXT | 客户 ID |
| original_image | TEXT | 原图 URL |
| operation | TEXT | 操作类型enhance/remove_bg/vectorize|
| requirements | TEXT | 需求 JSON |
| customer_notes | TEXT | 客户备注/需求细节 |
| status | TEXT | 状态 |
| result_image | TEXT | 结果图 URL |
| error_message | TEXT | 错误信息 |
| retry_count | INTEGER | 重试次数 |
| acc_id / acc_type | TEXT | 店铺 ID / 平台类型 |
| created_at / paid_at / completed_at | TEXT | 时间戳 |
**task_requirement_changes需求变更表**:
| 字段 | 类型 | 说明 |
|------|------|------|
| task_id | TEXT | 任务 ID外键|
| change_type | TEXT | 变更类型add_note/modify_operation/add_requirement|
| old_value / new_value | TEXT | 变更前后值 |
| changed_at | TEXT | 变更时间 |
| changed_by | TEXT | 变更者customer/staff|
### 任务状态流转
```
pending待付款→ paid已付款→ processing处理中→ awaiting_confirm待确认→ completed已完成
↘ failed失败
```
### API 接口
```python
# 创建任务
workflow.create_image_task(customer_id, original_image, operation)
# 添加需求
await workflow.add_customer_requirement(task_id, customer_id, requirement)
# 修改操作类型
await workflow.modify_operation(task_id, customer_id, new_operation)
# 查询任务
task = workflow.get_task(task_id)
tasks = workflow.get_customer_tasks(customer_id)
# 查询需求变更历史
history = workflow.get_task_requirement_history(task_id)
```
### 数据库操作
```bash
sqlite3 /root/ai_customer_service/ai_cs/db/image_tasks.db
# 查询所有任务
SELECT task_id, customer_id, status, created_at FROM image_tasks ORDER BY created_at DESC LIMIT 10;
# 查询待处理任务
SELECT * FROM image_tasks WHERE status='pending';
# 查询需求变更
SELECT task_id, change_type, old_value, new_value, changed_at FROM task_requirement_changes WHERE task_id='TASK_001';
```
**注意事项**:
- 所有任务自动保存,重启不丢失
- 付款前可修改操作类型,付款后不允许
- 所有变更都有历史记录
---
## 图绘派单系统
AI 客服系统接入图绘派单系统 API实现自动派单给在线设计师。
### API 信息
| 项目 | 值 |
|------|------|
| API 地址 | `http://1.12.50.92:8005` |
| API Key | `tuhui_dispatch_key_2026` |
| 认证方式 | Header: `X-API-Key` |
### 核心接口
| 接口 | 方法 | 说明 |
|------|------|------|
| `/dispatch/queue` | GET | 获取派单队列 |
| `/online/designers` | GET | 获取在线设计师 |
| `/tasks` | POST | 创建任务 |
| `/tasks/{id}/assign` | POST | 分配任务 |
| `/tasks/{id}` | GET | 查询任务状态 |
| `/tasks/{id}/complete` | POST | 完成任务 |
### 转人工派单流程
```
AI 判断做不了
1. 查询在线设计师 → GET /online/designers → ["橘子", "婷婷"]
2. 创建派单任务 → POST /tasks → {"task_id": "ea853bd9"}
3. 分配给设计师 → POST /tasks/ea853bd9/assign → {"designer_name": "橘子"}
4. 企业微信通知设计师
5. 回复客户:"好的,已帮您安排设计师处理,请稍候"
```
### 代码调用示例
```python
from services.service_tuhui_dispatch import get_tuhui_dispatch_client
client = get_tuhui_dispatch_client()
# 查询在线设计师
designers = await client.get_online_designers() # ["橘子", "婷婷"]
# 创建任务
task_id = await client.create_task(
task_name="图片处理-1234",
description="客户需要做高清修复",
task_type="image_process",
priority=2
)
# 分配任务
await client.assign_task(task_id, designer_name="橘子", notes="AI 客服自动派单")
# 完成任务
await client.complete_task(task_id, notes="客户已确认")
```
### 设计师在线状态 API
```
GET http://huichang.online:8001/online # 查询在线设计师
POST http://huichang.online:8001/update-status # 更新设计师状态
```
### 相关代码位置
| 组件 | 文件 |
|------|------|
| 派单客户端 | `services/service_tuhui_dispatch.py``TuhuiDispatchClient` 类)|
| 工作流集成 | `core/workflow.py``transfer_to_designer_workflow()` 方法)|
---
## 价格策略总览
### 基础价格
| 复杂度 | 价格区间 | 说明 |
|--------|----------|------|
| simple | 10-15 元 | 画面简单干净 |
| normal | 15-20 元 | 一般复杂度 |
| complex | 20-25 元 | 细节偏多 |
| hard | 25-30 元 | 非常复杂 |
### 加价规则
| 项目 | 条件 | 加价 |
|------|------|------|
| 文字少量 | 1-10 字 | +5 元 |
| 文字中量 | 11-50 字 | +15 元 |
| 文字大量 | 51-200 字 | +30 元 |
| 文字极多 | 200+ 字 | +50 元 |
| 分层(有文字)| 需要 PSD 分层 | +50 元起 |
| 分层(无文字)| 仅需分层 | +30 元 |
### 高价值订单
**文字分层 + 大量文字** → 特殊价格 **60-80 元**(封顶)
---
## 技术架构
### 核心组件
| 组件 | 文件 | 说明 |
|------|------|------|
| 天网协作 | `api/http_server.py` | HTTP API 服务器 |
| 工作流程 | `core/workflow.py` | 工作流执行器 |
| AI Agent | `core/pydantic_ai_agent.py` | AI 对话引擎 |
| 图片分析 | `image/image_analyzer.py` | 图片复杂度识别 |
| 派单客户端 | `services/service_tuhui_dispatch.py` | 图绘派单 API |
| 任务数据库 | `db/image_tasks_db.py` | 任务持久化 |
### 数据库
| 数据库 | 位置 | 说明 |
|--------|------|------|
| 任务数据库 | `db/image_tasks.db` | 图片任务 |
| 客户档案 | `db/customer.db` | 客户画像 |
| 聊天记录 | `chat_log_db/chat_log.db` | 聊天历史 |
| 天网任务 | `db/task_db/tasks.db` | 天网任务调度 |
### API 端口
| 服务 | 端口 | 说明 |
|------|------|------|
| AI 客服 API | 6060 | 天网任务接收 |
| 派单系统 | 8005 | 设计师派单 |
| 图绘平台 | 8002 | 图片上传 |