377 lines
16 KiB
Markdown
377 lines
16 KiB
Markdown
# 会话存档驱动话术库与知识库 enrichment 方案
|
||
|
||
## 一、背景与目标
|
||
|
||
### 1.1 现状
|
||
- **会话存档**:已接入企微会话存档,积累了大量真实员工与学员的对话数据(~48k+ 消息)
|
||
- **话术库**:目前 26 条话术,覆盖 8 个销售阶段,全靠手动录入
|
||
- **知识库**:目前文档较少,主要靠管理员手动上传/录入
|
||
|
||
### 1.2 目标
|
||
利用已有的**真实会话存档**,通过 LLM 智能提取 + 人工审核,**自动化/半自动化**地丰富话术库和知识库,降低运营维护成本。
|
||
|
||
---
|
||
|
||
## 二、核心思路:"规则筛选 → LLM 提炼 → 人工审核 → 入库"
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Step 1: 数据筛选( archive_messages ) │
|
||
│ - 过滤文本消息 (msgtype='text') │
|
||
│ - 筛选员工发送内容 (fromRole='INTERNAL') │
|
||
│ - 按会话聚合,过滤短句/无意义内容 │
|
||
│ - 优先选择「成单会话」或「资深坐席」的对话 │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Step 2: LLM 智能提炼( generation-service ) │
|
||
│ - 逐会话分析,提取「高价值话术」和「FAQ知识点」 │
|
||
│ - 自动打标签(销售阶段、意图、情感、课程类型等) │
|
||
│ - 生成标题、去重、质量评分 │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Step 3: 人工审核( Admin 后台) │
|
||
│ - 以 DRAFT 状态存入候选池 │
|
||
│ - 管理员逐条审核:编辑、打标签、确认入库/丢弃 │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
↓
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Step 4: 正式入库 │
|
||
│ - 话术库 → utterances 表 (status='ACTIVE') │
|
||
│ - 知识库 → knowledge_documents 表 (status='ACTIVE') │
|
||
│ - 自动触发 Embedding 向量生成(recommendation-service) │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 三、数据筛选策略
|
||
|
||
### 3.1 消息过滤条件
|
||
|
||
| 条件 | 说明 | SQL 示例 |
|
||
|------|------|---------|
|
||
| `msgtype = 'text'` | 仅文本消息可提炼 | `WHERE msgtype = 'text'` |
|
||
| `from_role = 'INTERNAL'` | 只取员工(坐席)发送的内容 | `WHERE from_role = 'INTERNAL'` |
|
||
| `LENGTH(content) >= 20` | 过滤过短的问候语 | `WHERE LENGTH(content) >= 20` |
|
||
| `content NOT LIKE '%[%]%'` | 过滤系统占位符(如 `[图片]`) | 正则排除 |
|
||
| `session_id IS NOT NULL` | 必须有有效会话关联 | `WHERE session_id IS NOT NULL` |
|
||
|
||
### 3.2 会话质量分级(优先级)
|
||
|
||
为了提升提取质量,优先选择**高质量会话**:
|
||
|
||
| 优先级 | 条件 | 说明 |
|
||
|--------|------|------|
|
||
| P0 | 已报名学员的历史会话 | 通过 `customers` 表或订单数据关联 |
|
||
| P1 | 会话轮次 >= 10 轮 | 深度咨询的会话 |
|
||
| P2 | 资深坐席(success_rate 高)的会话 | 通过 `staffs` 表关联 |
|
||
| P3 | 包含异议处理/报价/促成等关键词 | 高价值环节 |
|
||
|
||
---
|
||
|
||
## 四、LLM 提炼 Prompt 设计
|
||
|
||
### 4.1 话术提取 Prompt
|
||
|
||
```
|
||
你是一位资深的教育培训行业销售话术分析师。
|
||
|
||
请分析以下员工与学员的真实对话,提取员工使用的高价值话术。
|
||
|
||
【要求】
|
||
1. 只提取员工(坐席)发送的内容,不要提取学员的消息
|
||
2. 话术需要有完整语义,不能是碎片化的词语
|
||
3. 同一含义的话术只保留质量最高的一条
|
||
4. 为每条话术标注以下标签:
|
||
- 销售阶段:开场白/需求探询/课程推荐/价值塑造/报价沟通/异议处理/促成报名/跟进维护
|
||
- 意图标签:如 "课程咨询"、"价格询问"、 "学习保障" 等
|
||
- 情感语调:友好/热情/中立/专业/共情/紧迫
|
||
- 适用学员画像:通用/零基础/在校生/转行人员/在职人员/有基础
|
||
- 课程类型:GAME_ART/3D_MODEL/CONCEPT_ART/VFX/UE5/VIDEO_EDIT
|
||
|
||
【对话内容】
|
||
{conversation_text}
|
||
|
||
【输出格式】JSON 数组,每条话术包含:
|
||
{
|
||
"title": "话术标题(10字以内)",
|
||
"content": "话术完整内容",
|
||
"stage": "销售阶段",
|
||
"intent_tags": ["意图1", "意图2"],
|
||
"emotion": "情感语调",
|
||
"profile_tags": ["学员画像1"],
|
||
"course_type_tags": ["课程类型1"],
|
||
"quality_score": 1-10,
|
||
"reason": "提取理由"
|
||
}
|
||
```
|
||
|
||
### 4.2 知识库 FAQ 提取 Prompt
|
||
|
||
```
|
||
你是一位教育培训机构的知识库整理专家。
|
||
|
||
请分析以下员工与学员的对话,提取学员提出的**高频问题**及员工的**标准解答**。
|
||
|
||
【要求】
|
||
1. 问题必须是学员真实提出的(从学员消息中总结)
|
||
2. 答案必须是员工给出的回复,优先选择详细、专业的回答
|
||
3. 同一类问题只保留一个最佳问答对
|
||
4. 为每条知识标注分类:课程介绍/学习保障/就业服务/费用政策/报名流程/其他
|
||
|
||
【对话内容】
|
||
{conversation_text}
|
||
|
||
【输出格式】JSON 数组,每条知识包含:
|
||
{
|
||
"title": "问题标题(学员问题的精炼版)",
|
||
"content": "标准答案(完整、可直接复用)",
|
||
"category": "知识分类",
|
||
"tags": ["标签1", "标签2"],
|
||
"quality_score": 1-10,
|
||
"reason": "提取理由"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 五、系统架构与数据流
|
||
|
||
### 5.1 新增模块/接口设计
|
||
|
||
**方案:在 `kb-admin-service` 中新增 "会话挖掘" 模块**
|
||
|
||
```
|
||
archive-service (MySQL: archive_messages)
|
||
│
|
||
│ 1. 按条件筛选会话
|
||
▼
|
||
generation-service (LLM 提炼接口)
|
||
│
|
||
│ 2. 调用 /generate 进行话术/知识提取
|
||
▼
|
||
kb-admin-service (候选池审核)
|
||
│
|
||
│ 3. 以 DRAFT 状态存储候选内容
|
||
▼
|
||
Admin 前端 (审核页面)
|
||
│
|
||
│ 4. 管理员审核后发布
|
||
▼
|
||
utterances / knowledge_documents (ACTIVE)
|
||
│
|
||
│ 5. 触发向量生成
|
||
▼
|
||
recommendation-service (Redis 向量缓存)
|
||
```
|
||
|
||
### 5.2 新增数据表:挖掘候选池
|
||
|
||
```sql
|
||
CREATE TABLE IF NOT EXISTS `chat_mine_candidates` (
|
||
`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
|
||
`candidate_id` VARCHAR(64) NOT NULL COMMENT '候选唯一ID',
|
||
`corp_id` VARCHAR(64) NOT NULL COMMENT '企业ID',
|
||
`target_type` VARCHAR(32) NOT NULL COMMENT '目标类型: UTTERANCE-话术 KNOWLEDGE-知识',
|
||
`source_session_id` VARCHAR(128) COMMENT '来源会话ID',
|
||
`source_msg_ids` TEXT COMMENT '来源消息ID列表(JSON数组)',
|
||
`title` VARCHAR(256) NOT NULL COMMENT '标题',
|
||
`content` LONGTEXT COMMENT '内容',
|
||
`content_text` LONGTEXT COMMENT '纯文本内容',
|
||
`stage_tags` TEXT COMMENT '销售阶段标签JSON',
|
||
`intent_tags` TEXT COMMENT '意图标签JSON',
|
||
`emotion_tags` TEXT COMMENT '情感标签JSON',
|
||
`profile_tags` TEXT COMMENT '学员画像标签JSON',
|
||
`course_type_tags` TEXT COMMENT '课程类型标签JSON',
|
||
`topic_tags` TEXT COMMENT '主题标签JSON',
|
||
`category` VARCHAR(64) COMMENT '知识分类(知识库用)',
|
||
`tags` TEXT COMMENT '通用标签JSON',
|
||
`quality_score` INT DEFAULT 0 COMMENT 'LLM质量评分 1-10',
|
||
`llm_reason` TEXT COMMENT 'LLM提取理由',
|
||
`status` VARCHAR(32) DEFAULT 'PENDING' COMMENT '状态: PENDING-待审核 APPROVED-已通过 REJECTED-已拒绝',
|
||
`reviewed_by` VARCHAR(64) COMMENT '审核人',
|
||
`review_remark` VARCHAR(512) COMMENT '审核备注',
|
||
`reviewed_at` TIMESTAMP NULL COMMENT '审核时间',
|
||
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
UNIQUE KEY `uk_candidate_id` (`candidate_id`),
|
||
INDEX `idx_corp_status` (`corp_id`, `status`),
|
||
INDEX `idx_target_type` (`target_type`, `quality_score`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会话挖掘候选池';
|
||
```
|
||
|
||
### 5.3 新增后端接口(kb-admin-service)
|
||
|
||
| 接口 | 方法 | 功能 |
|
||
|------|------|------|
|
||
| `/api/v1/admin/chat-mine/start` | POST | **启动挖掘任务**:选择时间范围、目标类型(话术/知识/全部)、会话数量上限 |
|
||
| `/api/v1/admin/chat-mine/candidates` | GET | **候选列表**:分页查询候选内容,支持按 status、target_type、quality_score 筛选 |
|
||
| `/api/v1/admin/chat-mine/candidates/{id}` | GET | **候选详情**:查看候选内容及来源对话上下文 |
|
||
| `/api/v1/admin/chat-mine/candidates/{id}/approve` | POST | **审核通过**:将候选内容发布到话术库/知识库 |
|
||
| `/api/v1/admin/chat-mine/candidates/{id}/reject` | POST | **审核拒绝**:标记为 REJECTED |
|
||
| `/api/v1/admin/chat-mine/candidates/batch-approve` | POST | **批量通过**:勾选多条批量审核 |
|
||
| `/api/v1/admin/chat-mine/stats` | GET | **挖掘统计**:待审核数、已通过数、今日新增数等 |
|
||
|
||
### 5.4 挖掘任务执行流程
|
||
|
||
```java
|
||
// 伪代码:ChatMiningService
|
||
@Service
|
||
public class ChatMiningService {
|
||
|
||
@Autowired
|
||
private ArchiveMessageMapper archiveMessageMapper;
|
||
|
||
@Autowired
|
||
private ChatMineCandidateMapper candidateMapper;
|
||
|
||
@Autowired
|
||
private RestTemplate restTemplate;
|
||
|
||
/**
|
||
* 启动挖掘任务
|
||
*/
|
||
public void startMining(ChatMineRequest request) {
|
||
// 1. 筛选会话
|
||
List<String> sessionIds = archiveMessageMapper.selectQualitySessions(
|
||
request.getCorpId(),
|
||
request.getStartTime(),
|
||
request.getEndTime(),
|
||
request.getLimit()
|
||
);
|
||
|
||
for (String sessionId : sessionIds) {
|
||
// 2. 获取会话完整对话
|
||
List<ArchiveMessage> messages = archiveMessageMapper.selectBySessionId(sessionId);
|
||
String conversationText = formatConversation(messages);
|
||
|
||
// 3. 调用 LLM 提取
|
||
String prompt = buildMiningPrompt(conversationText, request.getTargetType());
|
||
String llmResponse = callLLM(prompt);
|
||
|
||
// 4. 解析 LLM 结果并入库(DRAFT)
|
||
List<MineResult> results = parseLLMResponse(llmResponse);
|
||
for (MineResult result : results) {
|
||
if (result.getQualityScore() >= 6) { // 只保留质量分 >= 6 的
|
||
saveCandidate(result, sessionId, messages);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 六、前端页面设计
|
||
|
||
### 6.1 新增菜单:"会话挖掘"(kb-admin-service 下)
|
||
|
||
**页面 1:挖掘任务配置**
|
||
- 时间范围选择器
|
||
- 目标类型复选框:☑ 话术 ☑ 知识
|
||
- 会话数量上限(默认 50,最大 200)
|
||
- 质量分阈值(默认 6)
|
||
- **"开始挖掘"** 按钮(异步执行,显示进度)
|
||
|
||
**页面 2:候选内容审核**
|
||
- 标签页切换:待审核 / 已通过 / 已拒绝
|
||
- 列表展示:标题、类型、质量分、来源会话、提取时间
|
||
- 操作列:**查看上下文** / **编辑** / **通过** / **拒绝**
|
||
- 批量操作:勾选后批量通过/拒绝
|
||
- **"查看上下文"** 弹窗:展示原始对话,高亮来源消息
|
||
|
||
**页面 3:挖掘统计看板**
|
||
- 今日新增候选数
|
||
- 待审核数
|
||
- 本月已通过数
|
||
- 各销售阶段话术增长趋势
|
||
|
||
---
|
||
|
||
## 七、实施步骤(MVP → 完整版)
|
||
|
||
### Phase 1:MVP(2-3 天)
|
||
|
||
**目标**:跑通从会话存档 → LLM 提取 → 人工审核 → 入库的最小闭环
|
||
|
||
1. **数据库**:创建 `chat_mine_candidates` 表
|
||
2. **后端**:
|
||
- `kb-admin-service` 新增 `ChatMiningController` + `ChatMiningService`
|
||
- 实现会话筛选逻辑(SQL 查询 archive_messages)
|
||
- 实现 LLM Prompt 调用(调用 generation-service `/generate`)
|
||
- 实现候选池 CRUD + 审核接口
|
||
3. **前端**:
|
||
- 新增 "会话挖掘" 菜单
|
||
- 挖掘任务配置页面
|
||
- 候选内容审核列表页面
|
||
4. **测试**:用 10-20 个会话测试提取效果,调优 Prompt
|
||
|
||
### Phase 2:优化(3-5 天)
|
||
|
||
1. **质量提升**:
|
||
- 接入「成单学员」筛选(优先挖掘已报名学员的会话)
|
||
- 接入「资深坐席」筛选(按员工成功率排序)
|
||
- 增加去重逻辑(避免同一话术重复提取)
|
||
2. **效率提升**:
|
||
- 挖掘任务改为异步队列(RabbitMQ),避免阻塞
|
||
- 批量审核功能
|
||
- 支持在审核页面直接编辑内容后入库
|
||
3. **Prompt 调优**:
|
||
- 根据实际提取效果持续优化 Prompt
|
||
- 增加 Few-shot 示例提升输出稳定性
|
||
|
||
### Phase 3:智能化(未来迭代)
|
||
|
||
1. **主动推荐**:系统定期自动扫描新存档的会话,自动提取候选内容
|
||
2. **效果追踪**:入库的话术/知识在实际推荐中的使用率、转化率追踪
|
||
3. **A/B 对比**:人工录入 vs LLM 提取的话术,在推荐效果上的对比分析
|
||
|
||
---
|
||
|
||
## 八、成本与风险
|
||
|
||
### 8.1 LLM 调用成本估算
|
||
|
||
| 项目 | 估算 |
|
||
|------|------|
|
||
| 单次挖掘 50 个会话 | 约 50 次 LLM API 调用 |
|
||
| 单个会话平均 Token 数 | ~2000-4000 tokens(中文) |
|
||
| 单次挖掘总费用 | 约 0.5-2 元(按百炼 qwen-turbo 价格) |
|
||
| 每周挖掘一次 | 月成本约 20-80 元 |
|
||
|
||
### 8.2 风险与应对
|
||
|
||
| 风险 | 应对策略 |
|
||
|------|---------|
|
||
| LLM 提取质量不稳定 | 设置质量分阈值(>=6),+ 强制人工审核 |
|
||
| 提取内容涉及学员隐私 | 只提取员工发送的内容,学员消息仅用于上下文理解 |
|
||
| 重复提取同一话术 | 入库前进行内容相似度去重(Embedding 余弦相似度 > 0.9) |
|
||
| Prompt 输出格式不稳定 | 使用 JSON Schema 约束 + 异常捕获 + 重试机制 |
|
||
|
||
---
|
||
|
||
## 九、预期效果
|
||
|
||
| 指标 | 当前 | 预期(1 个月后) |
|
||
|------|------|-----------------|
|
||
| 话术库数量 | 26 条 | 80-120 条 |
|
||
| 知识库文档 | 较少 | 30-50 篇 FAQ |
|
||
| 话术覆盖阶段 | 8 个 | 8 个,但每个阶段话术更丰富 |
|
||
| 运营人力 | 手动录入 | 审核为主,录入效率提升 5-10 倍 |
|
||
|
||
---
|
||
|
||
## 十、总结
|
||
|
||
本方案的核心价值在于:
|
||
|
||
1. **变废为宝**:将沉睡的会话存档转化为可复用的话术和知识资产
|
||
2. **LLM 赋能**:利用大模型自动完成提炼、分类、打标签等繁琐工作
|
||
3. **人工兜底**:保留审核环节,确保入库内容质量可控
|
||
4. **成本可控**:单次挖掘成本低,按需执行,无持续运营负担
|
||
|
||
建议 **先以 Phase 1 MVP 验证效果**,跑通最小闭环后再逐步优化扩展。
|