agent_9art/product1.0/会话存档驱动话术库与知识库 enrichment 方案.md
jiao 46b6e0a358 feat(kb-admin): add chat mining module
1. 新增会话挖掘相关后端接口与实体类,包括候选池管理、批量审核等功能
2. 在前端管理页面添加会话挖掘菜单路由与入口
3. 启用kb-admin服务的异步注解支持
2026-06-05 11:50:20 +08:00

377 lines
16 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.

# 会话存档驱动话术库与知识库 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 验证效果**,跑通最小闭环后再逐步优化扩展。