16 KiB
16 KiB
会话存档驱动话术库与知识库 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 新增数据表:挖掘候选池
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 挖掘任务执行流程
// 伪代码: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 提取 → 人工审核 → 入库的最小闭环
- 数据库:创建
chat_mine_candidates表 - 后端:
kb-admin-service新增ChatMiningController+ChatMiningService- 实现会话筛选逻辑(SQL 查询 archive_messages)
- 实现 LLM Prompt 调用(调用 generation-service
/generate) - 实现候选池 CRUD + 审核接口
- 前端:
- 新增 "会话挖掘" 菜单
- 挖掘任务配置页面
- 候选内容审核列表页面
- 测试:用 10-20 个会话测试提取效果,调优 Prompt
Phase 2:优化(3-5 天)
- 质量提升:
- 接入「成单学员」筛选(优先挖掘已报名学员的会话)
- 接入「资深坐席」筛选(按员工成功率排序)
- 增加去重逻辑(避免同一话术重复提取)
- 效率提升:
- 挖掘任务改为异步队列(RabbitMQ),避免阻塞
- 批量审核功能
- 支持在审核页面直接编辑内容后入库
- Prompt 调优:
- 根据实际提取效果持续优化 Prompt
- 增加 Few-shot 示例提升输出稳定性
Phase 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 倍 |
十、总结
本方案的核心价值在于:
- 变废为宝:将沉睡的会话存档转化为可复用的话术和知识资产
- LLM 赋能:利用大模型自动完成提炼、分类、打标签等繁琐工作
- 人工兜底:保留审核环节,确保入库内容质量可控
- 成本可控:单次挖掘成本低,按需执行,无持续运营负担
建议 先以 Phase 1 MVP 验证效果,跑通最小闭环后再逐步优化扩展。