┌──────────────────────────────────────────────────────────┐
│ 1️⃣ 用户提问 │
│ "几点能 check in" │
│ ↓ │
│ 2️⃣ matchKb() 知识库匹配 │
│ ├─ 关键词匹配("check in" 在 article keywords) │
│ ├─ 模糊匹配(token 重合度 > 30%) │
│ └─ 阈值控制(< 0.3 视为未匹配) │
│ ↓ │
│ 3️⃣ 记录 KbMatchLog │
│ (user_query, score, method, was_helpful=null) │
│ ↓ │
│ 4️⃣ 用户反馈"没用" │
│ feedback({match_log_id, helpful: false}) │
│ ↓ │
│ 5️⃣ 自动累积 KbSuggestion │
│ ├─ 找类似 trigger_query(Jaccard 相似度 > 0.5) │
│ ├─ 合并 → similar_queries[] │
│ └─ 计数 occurrence_count++ │
│ ↓ │
│ 6️⃣ AI 提炼答案 │
│ refineSuggestionWithAi(id) │
│ └─ 拉历史人工回复 → DeepSeek 生成标准答案 │
│ ↓ │
│ 7️⃣ 客服管理员审核 │
│ approve(id) → 创建 KbArticle(自学习 FAQ 分类) │
│ ↓ │
│ 8️⃣ 下次同类问题 │
│ matchKb() 直接命中 → 客服不再需要人工介入 │
│ └─ 闭环 ✓ │
└──────────────────────────────────────────────────────────┘
📌 关键技术点:
- 分词 — 中文按单字 + 英文按词,过滤停用词
- 关键词匹配 — 文章 keywords 字段 vs 用户 query 字符串包含
- 模糊匹配 — token 重合度,query_tokens ∩ article_tokens / |query|
- 聚合 — Jaccard 相似度算法,> 0.5 视为同一类问题
- AI 提炼 — 用 DeepSeek V4(默认),提示词包含历史人工回复
- 阈值 — match_score < 0.3 视为未匹配,需要训练