refactor: migrate workflow to v2 core and archive legacy modules

This commit is contained in:
2026-03-04 21:52:24 +08:00
parent e1ce17f2aa
commit fa61b11b02
156 changed files with 1781 additions and 2066 deletions

View File

@@ -0,0 +1,101 @@
# 压价引导注册功能
## 功能说明
当客户觉得价格太贵时AI 客服会分两步应对:
### 第一步:直接让价
- 只让价一次
- 不低于底线价格
- 话术自然多变
### 第二步:引导客户自己去注册
如果让价后客户还是嫌贵,引导客户**自己去注册 xinhui.cloud**获取新用户余额。
## ⚠️ 核心要求
1. **每个话术都必须带网站地址 xinhui.cloud**
2. **强调客户自己去弄**(自己去操作/自己下单/自己弄)
3. 语气直接,不要软
4. 不要说具体金额
## 触发条件
客户消息包含以下关键词:
- "贵"
- "有点贵"
- "太贵了"
- "便宜点"
- "少点"
- "打折"
## 话术示例(每个都带网站)
### 让价话术
- "那给你少点XX 吧"
- "最低 XX 了"
- "给你个优惠价 XX"
- "看你诚心要XX 给你"
### 注册引导话术(让价后仍嫌贵时使用)
**每个话术都必须包含 xinhui.cloud 网址!**
1. 「嫌贵就去 xinhui.cloud 注册个号,自己有余额可以弄」
2. 「xinhui.cloud 去注册下,新用户送体验金,自己弄便宜」
3. 「去 xinhui.cloud 注册个账号,里面有余额,自己下单划算」
4. 「自己上 xinhui.cloud 注册,新人有福利,比直接找我便宜」
5. 「xinhui.cloud 去注册个号,自己充值有优惠,自己弄吧」
6. 「嫌贵就自己去 xinhui.cloud 弄,注册送余额,比找我划算」
7. 「xinhui.cloud 注册个号,自己充值自己弄,便宜些」
8. 「去 xinhui.cloud 注册,里面有余额可以用,自己操作吧」
## 对话示例
```
客户:这个多少钱?
AI: 20 元
客户:太贵了,便宜点吧
AI: 那给你少点15 吧
客户:还是有点贵
AI: 嫌贵就去 xinhui.cloud 注册个号,自己有余额可以弄
```
或:
```
客户:有点贵啊
AI: 最低 15 了
客户:还是贵
AI: xinhui.cloud 去注册下,新用户送体验金,自己弄便宜
```
## 注意事项
1. ⚠️ **每个话术都必须带 xinhui.cloud 网址**
2. ⚠️ **强调"自己去弄""自己操作""自己下单"**
3. 不说具体余额金额
4. 每次选择不同话术变体
5. 只在让价后仍嫌贵时使用
6. 语气直接,不要软
## 代码位置
- 技能文档:`/skills/customer-service/customer-skill.md`
- Agent 代码:`/core/pydantic_ai_agent.py` 第 1745 行
## 测试方法
```bash
# 启动 AI 客服系统
systemctl start ai-cs
# 查看日志
journalctl -u ai-cs -f
```
模拟客户消息:"太贵了,便宜点吧"
预期 AI 回复:先让价,如仍嫌贵则引导客户自己去 xinhui.cloud 注册

View File

@@ -0,0 +1,129 @@
# 找茬客户识别功能
## 功能说明
识别高风险找茬客户,建议 AI 客服不做这单,直接拒绝或转人工。
---
## 🚨 高风险信号(识别 3 个以上→拒绝接单)
| 信号 | 示例 | 风险等级 |
|------|------|----------|
| **下单后立即申请退款** | 刚拍下就退款 0.88 元 | 🔴 高 |
| **从高价砍到低价** | 30 元砍到 10 元 | 🔴 高 |
| **反复问退款2 次+** | "不满意可以退吗"×2 | 🔴 高 |
| **质疑服务内容** | "源文件还是什么" | 🟡 中 |
| **质疑价值** | "就一张图片" | 🟡 中 |
| **想占便宜** | "小一点就快一点的嘛" | 🟡 中 |
| **重复问同一问题** | 同样的问题问 2 次+ | 🔴 高 |
---
## 应对策略
### 识别到 3 个以上高风险信号
**直接拒绝接单**
**话术示例**
- 「不好意思,这单做不了」
- 「去别家做吧」
- 「这单接不了,你找别人吧」
**不要**
- ❌ 不要解释原因
- ❌ 不要讨价还价
- ❌ 不要妥协
---
## 真实案例分析
### 案例:高风险找茬客户
**对话记录**
```
客户:这个原图有吗
AI: 没问题,拍下安排。
客户:拍啦
[客户立即申请退款 0.88 元]
客户太贵了10 元
AI: 30
[退款成功]
客户:要多久?
客户300×50cm
AI: 1 个小时
客户:小一点就快一点的嘛
客户20 可以吗
AI: [不回应]
客户25
客户:源文件还是什么?
客户:就一张图片
客户:不满意可以退吗
客户:不满意可以退吗(第 2 次问)
AI: 去别家做吧
```
**风险信号识别**
1. ✅ 下单后立即申请退款
2. ✅ 从 30 砍到 10 元
3. ✅ 质疑价值("就一张图片"
4. ✅ 想占便宜("小一点就快一点"
5. ✅ 重复问退款2 次)
**结论**5 个高风险信号 → **拒绝接单**
---
## 代码位置
- Agent 代码:`/core/pydantic_ai_agent.py` - 找茬客户识别规则
- 技能文档:`/skills/customer-service/customer-skill.md` - 客服话术指南
---
## 测试方法
### 模拟高风险客户
```bash
# 启动 AI 客服
systemctl start ai-cs
# 查看日志
journalctl -u ai-cs -f
```
**模拟对话**
```
客户20 可以吗
AI: 最低 30
客户25
客户:不满意可以退吗
客户:不满意可以退吗(第 2 次)
```
**预期 AI 回复**
- 「不好意思,这单做不了」
- 「去别家做吧」
---
## 注意事项
1. **识别 3 个以上信号才拒绝**:不要误伤正常客户
2. **话术简洁**:不要解释原因
3. **态度坚定**:不要妥协
4. **不调用报价工具**:直接拒绝
---
## 与转人工的区别
| 情况 | 处理方式 |
|------|----------|
| 退款/投诉/情绪激动 | 转人工 |
| 找茬客户3 个+信号) | 直接拒绝 |
| 敏感内容 | 直接拒绝 |

View File

@@ -0,0 +1,45 @@
# 自我进化 MVP可控版
目标:让客服 agent 持续变聪明,同时避免“自动改坏线上”。
## 1. 已落地能力
- 失败样本采集:从 `db/chat_log_db/chats.db` 抽取近 N 小时客服问答对。
- 离线评测:自动识别高风险未转人工、低置信度兜底、慢回复等问题。
- 改进建议生成:输出可执行的模块级 proposalprompt/router/workflow
- 发布门禁:结合运行指标(`config/.runtime_metrics.jsonl`)判断是否允许发布候选版本。
- 候选产物:通过门禁后写入 `config/evolution_candidate.json`,用于 5% 灰度。
## 2. 运行方式
```bash
python scripts/evolution_cycle.py --hours 24 --publish
```
默认即读取线上 MySQL`--source mysql`)。连接信息来自 `.env``MYSQL_*`
常用参数:
- `--max-customers 200`
- `--max-messages-per-customer 80`
- `--runtime-hours 24`
- `--policy-path config/evolution_policy.json`
## 3. 产物说明
运行后会在 `evolution/artifacts/` 生成:
- `samples_*.jsonl`:评测样本
- `eval_report_*.json`:评测摘要与门禁结果
- `proposals_*.json`:改进建议列表
`--publish` 且门禁通过时:
- 写入 `config/evolution_candidate.json`
- 状态标记为 `ready_for_gray_5_percent`
## 4. 下一步建议
-`scripts/evolution_cycle.py` 加入每日定时任务(例如凌晨 2 点)。
- 在灰度层接入 `evolution_candidate.json` 的版本号,按店铺或客户哈希做 5% 放量。
- 将 proposal 落地为具体 patch 后,先跑 `tests/` 回归,再扩大流量。

View File

@@ -0,0 +1,158 @@
# 文字加价功能
## 功能说明
当识别到图片含有很多文字时AI 客服系统会自动提高报价,不能低价。
**核心原则**:有文字跟没文字是两个价格!
---
## 价格规则
### 含文字很多时
| 原复杂度 | 原价区间 | 加价后 | 加价后区间 |
|---------|---------|--------|----------|
| simple | 10-15 元 | → normal | 15-20 元 |
| normal | 15-20 元 | → complex | 20-25 元 |
| complex | 20-25 元 | 保持不变 | 20-25 元 |
| hard | 25-30 元 | 保持不变 | 25-30 元 |
### 判断标准
**含文字很多**(需要加价):
- ✅ 图片里有大量小字
- ✅ 需要精细保留文字清晰度
- ✅ 文字需要清晰化处理
**不含文字或文字很少**(不加价):
- ❌ 图片干净,没文字
- ❌ 只有零星几个大字
---
## 代码修改
### 1. image_analyzer.py
文件:`/root/ai_customer_service/ai_cs/image/image_analyzer.py`
**修改位置**:第 528-542 行
```python
# 【重要】含文字很多时,不能低价,必须 complex 起步20 元以上)
# 有文字跟没文字是两个价格
if has_text == "yes":
if complexity == "simple":
# 简单但含文字 → 提升到 normal 价格
price_min, price_max = self.PRICE_MAP["normal"]
reason = "含文字,需精细处理"
elif complexity == "normal":
# normal 含文字 → 提升到 complex 价格
price_min, price_max = self.PRICE_MAP["complex"]
reason = "含文字,需精细处理"
# complex/hard 保持原价,已经够高
```
### 2. pydantic_ai_agent.py
文件:`/root/ai_customer_service/ai_cs/core/pydantic_ai_agent.py`
**修改位置**:第 863-869 行
```python
文字加价规则 重要
- 含文字很多时不能低价有文字跟没文字是两个价格
- 含文字的图必须 complex 起步20 元以上
- 客户嫌贵时明确告知有文字跟没文字是两个价格
- 简单图但含文字 normal 价格15-20
- normal 图含文字 complex 价格20-25
```
### 3. customer-skill.md
文件:`/root/ai_customer_service/ai_cs/skills/customer-service/customer-skill.md`
**新增章节**:⑫ 文字加价规则
---
## 对话示例
### 示例 1简单图但含文字
```
客户:[发送一张含文字的图片]
AI: 图里有不少字要精细处理20 元
客户:这么贵
AI: 有文字的图跟没文字的价格不一样,已经是最低价了
```
### 示例 2normal 图含文字
```
客户:这个多少钱?
AI: 25 元
客户:太贵了
AI: 含文字的图要精细处理,成本更高,跟没文字的价格不一样
```
### 示例 3客户问为什么贵
```
客户:这个为什么比那个贵?
AI: 这个图含文字,需要精细处理,有文字跟没文字是两个价格
```
---
## 话术要点
### 必须包含的信息
1. ✅ 明确告知「有文字跟没文字是两个价格」
2. ✅ 说明「文字需要精细处理」
3. ✅ 强调「已经是最低价」
### 常用话术
- 「有文字跟没文字是两个价格」
- 「文字处理要精细,成本高」
- 「含文字的图都这个价」
- 「文字越多越贵」
- 「已经是最低价了,含文字的都这样」
---
## 测试方法
### 测试步骤
1. **准备测试图片**
- 一张含有很多小字的图片
- 一张干净的图片(对比)
2. **发送给 AI 客服**
```bash
systemctl start ai-cs
journalctl -u ai-cs -f
```
3. **验证报价**
- 含文字图片:应该报价 20 元以上
- 干净图片:正常报价 10-15 元
### 预期结果
- ✅ 含文字图片自动加价
- ✅ 客户嫌贵时明确告知「有文字跟没文字是两个价格」
- ✅ 价格必须为 5 的整数倍
---
## 注意事项
1. **只针对小字**:大字不加价
2. **价格必须为 5 的倍数**15/20/25/30
3. **明确告知客户**:不要偷偷加价
4. **坚持原则**:客户嫌贵也要说明原因

View File

@@ -0,0 +1,137 @@
# 图绘上传功能
## 功能说明
AI 客服处理完图片后,上传到图绘平台并定价,告诉客户「这个图片是找到的」,然后问客户要下载还是购买。
---
## ⚠️ 重要话术
**必须说**
- ✅ 「找到了!图片已经上传到图绘平台了」
- ✅ 「你是要下载还是直接购买?」
- ✅ 「价格 XX 元」
**不要说**
- ❌ 「处理好了」
- ❌ 「修复好了」
- ❌ 「AI 修复的」
---
## 使用流程
1. **客户发图** → AI 客服收到图片
2. **图片处理** → 调用图片处理工具
3. **上传图绘** → 调用 `upload_to_tuhui_platform()` 工具
4. **返回话术** → 「找到了!...你是要下载还是购买?」
---
## 对话示例
### 示例 1标准流程
```
客户:[发送图片]
AI: 收到了,稍等...
[AI 调用图片处理工具]
[AI 调用 upload_to_tuhui_platform 工具]
AI: 找到了!图片已经上传到图绘平台了,作品 ID: 123
AI: 你是要下载还是直接购买?价格 20 元。
```
### 示例 2客户选择下载
```
AI: 找到了!图片已经上传到图绘平台了
AI: 你是要下载还是直接购买?价格 20 元。
客户:下载
AI: 好的,拍下后就可以下载了
```
### 示例 3客户选择购买
```
AI: 你是要下载还是直接购买?价格 20 元。
客户:购买
AI: 好的,拍下就行,付款后发你高清原图
```
### 示例 4客户问在哪里
```
客户:弄好了吗
AI: 找到了,已经上传到图绘平台了
AI: 作品 ID: 123你是要下载还是购买
```
---
## 配置说明
### .env 配置
```bash
# 图绘平台配置
TUHUI_BASE_URL=http://127.0.0.1:8002
TUHUI_PHONE=17520145271 # 图绘账号手机号
TUHUI_PASSWORD=zuowei1216 # 图绘账号密码
TUHUI_DEFAULT_PRICE=20 # 默认定价(元)
```
### AI Agent 工具
```python
@self.agent.tool
async def upload_to_tuhui_platform(
ctx: RunContext[AgentDeps],
image_path: str,
title: str,
price: int = 20
) -> str:
"""将处理好的图片上传到图绘平台并定价"""
# 返回:「找到了!图片已经上传到图绘平台了,作品 ID: 123。你是要下载还是直接购买价格 20 元。」
```
---
## 代码位置
- 上传服务:`/services/service_tuhui_upload.py`
- Agent 工具:`/core/pydantic_ai_agent.py` 第 220 行
- 客服话术:`/skills/customer-service/customer-skill.md` 第⑭节
---
## 注意事项
1. ⚠️ **必须说「找到了」**,不要说「处理好了」
2. ⚠️ **必须问「要下载还是购买」**
3. ⚠️ **必须说价格**
4. ✅ 图片是"找到的",不是"处理的"
5. ✅ 客户可以选择下载或购买
---
## 测试方法
```bash
# 1. 配置图绘账号
vi /root/ai_customer_service/ai_cs/.env
# 2. 重启 AI 客服
systemctl restart ai-cs
# 3. 查看日志
journalctl -u ai-cs -f
# 4. 发送图片测试
# 观察日志中的上传结果和话术
```