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

16 KiB
Raw Blame History

会话存档驱动话术库与知识库 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 提取 → 人工审核 → 入库的最小闭环

  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 验证效果,跑通最小闭环后再逐步优化扩展。