# 会话存档驱动话术库与知识库 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 sessionIds = archiveMessageMapper.selectQualitySessions( request.getCorpId(), request.getStartTime(), request.getEndTime(), request.getLimit() ); for (String sessionId : sessionIds) { // 2. 获取会话完整对话 List messages = archiveMessageMapper.selectBySessionId(sessionId); String conversationText = formatConversation(messages); // 3. 调用 LLM 提取 String prompt = buildMiningPrompt(conversationText, request.getTargetType()); String llmResponse = callLLM(prompt); // 4. 解析 LLM 结果并入库(DRAFT) List 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 验证效果**,跑通最小闭环后再逐步优化扩展。