Skip to content

AI 智能客服系统设计

整体架构

基于多维特征信号的多阶段意图分类引擎,结合规则状态机将问题路由至三种执行模式(统一 Agent、通用生成、混合生成),覆盖售前咨询、售后处理、投诉转人工、工单申请、订单查询等 9 个业务领域和 13 种服务意图的精准识别。

系统核心由四个模块组成:意图识别与路由、RAG 多级检索、实体抽取与业务执行、流式交互与异步处理。


一、智能意图识别与多模式路由

多维特征信号融合

输入不止是用户当前消息,还融合了:

  • 历史对话上下文(最近 3 轮)
  • 用户画像标签(会员等级、历史工单类型)
  • 当前页面来源(如从订单详情页发起)
  • 客服场景下的业务阶段(售前/售后)

这些信号被编码为文本前缀或拼接进分类模型输入。

多阶段意图分类

第一阶段:领域粗分类

使用轻量文本分类模型(如蒸馏版 BERT 或 fastText),将问题归入 9 个业务领域:

java
public enum Domain {
    PRE_SALES("售前咨询"),
    AFTER_SALES("售后处理"),
    COMPLAINT("投诉转人工"),
    WORK_ORDER("工单申请"),
    ORDER_QUERY("订单查询"),
    GENERAL("通用闲聊");
}

public enum Intent {
    // 售前
    PRODUCT_INFO("商品咨询"),
    PRICE_QUERY("价格查询"),
    // 售后
    REFUND("退款申请"),
    EXCHANGE("换货申请"),
    REPAIR("维修申请"),
    // 投诉
    COMPLAINT_HUMAN("投诉转人工"),
    // 工单
    WORK_ORDER_APPLY("工单提交"),
    // 订单
    ORDER_STATUS("订单状态"),
    ORDER_CANCEL("取消订单"),
    // 兜底
    UNKNOWN("未知意图");
}

第二阶段:意图细分类

每个领域下挂载专属小模型,进一步识别服务意图。置信度判断逻辑:

  • 置信度 > 0.85 → 直接调用对应模型,跳过细分类
  • 置信度过低 → 调用细分类模型进一步判断
  • 特别低 → 回退至强规则(关键词 + 正则)兜底

规则状态机与模式路由

对话状态由有限状态机维护:{领域, 意图, 槽位, 对话阶段}。根据识别结果路由至三种模式:

模式适用场景特点
统一 Agent多步工具调用(如订单查询需调 API)LLM 完成「思考 → 调工具 → 整合结果」
通用生成纯闲聊或简单 FAQ直接由 LLM 生成回复,不涉及外部调用
混合生成需要知识库辅助 + 总结先检索片段,再交由 LLM 融合生成

二、RAG 多级检索引擎

设计"向量召回 → 关键词补召 → 上下文融合"三层容错体系。

第一层:pgvector 向量语义检索

将用户问题通过 Embedding 模型转换为向量,在 PostgreSQL 的 pgvector 扩展中执行余弦相似度搜索,快速返回 Top-K 相关文档块。

第二层:无阈值回退逻辑

当向量检索最高相似度低于阈值(如 0.7)时,自动触发关键词模糊匹配:

sql
-- PostgreSQL 全文检索:直接用用户提问做模糊查询
to_tsvector(text) @@ plainto_tsquery('用户输入内容')
  • to_tsvector(text):将文档文本转换为词位向量(分词索引)
  • plainto_tsquery():将用户输入自动分词,生成 AND 逻辑查询
  • @@:全文匹配操作符

第三层:合并与重排序

将两层结果合并,按文档 ID 去重,基于相似度分数或关键词相关度排序,取 Top 片段注入上下文。

上下文承接与跨文档继承

文档继承机制:维护活跃文档上下文栈。用户从文档 A 切换到文档 B 时,从 A 的问答历史中提取摘要或实体,与针对 B 的新查询拼接,防止意图漂移。

跨会话传递:利用 Redis 存储最近对话中涉及的文档 ID 及槽位信息。新会话开始时预注入系统提示词,让模型"记得"上次聊到的文档内容。


三、业务动作识别与实体抽取

实体自动抽取

正则表达式作为高精度抽取器:

  • 订单编号:ORD-\d{8,}\b[A-Z]{2}\d{12}\b
  • 数量:\d+\s*(个|件|台|kg)
  • 手机号、工单号等

复杂实体(商品描述、地址)辅助使用 NER 模型或 LLM 做实体识别。

跨轮次槽位解析

使用 Redis 维护每个会话的动态槽位表:

{意图: "退款", 订单号: None, 数量: None, 原因: None}

流程:用户说"我要退款" → 检查槽位 → 订单号为空 → 追问"请提供订单号" → 正则提取补全 → 所有必填槽位填满 → 触发 API 调用。

提示词注入

槽位信息最终拼入系统提示词:

java
String systemPrompt = String.format(
    "你是客服Agent,用户意图为:【%s】。已提取的订单信息:%s。...",
    intent.getChineseName(),
    slots.toString()
);

LLM 在 Function Calling 时利用这些槽位去调用对应工具。


四、流式交互与异步处理

SSE 流式问答

后端采用 Server-Sent Events 协议,调用大模型流式生成接口,每收到一个 token 封装为 data: {token} 写入响应流,前端用 EventSource 实时渲染打字机效果。

关键点:API 网关需关闭对该接口的缓冲,支持长连接。

基于 RabbitMQ 的异步文档处理

上传文件 → 存对象存储 → 返回"正在处理" → 发消息到队列 → Worker 异步处理

后台 Worker 按序执行:解析(Unstructured/LangChain 提取文本)→ 分块(RecursiveCharacterTextSplitter) → 嵌入(批量向量化) → 入库(pgvector,更新状态为 ready)。

失败则进入死信队列重试或告警。非阻塞设计让上传接口响应时间从数秒降至几十毫秒。


总结

模块核心技术解决的问题
意图识别级联分类 + 状态机高精度路由,避免答非所问
RAG 检索三层容错 + 上下文继承多轮跨文档场景的检索稳定性
实体抽取槽位填充 + 正则 + 跨轮记忆从"能说"到"能做"的业务闭环
流式 & 异步SSE + RabbitMQ交互实时性与系统伸缩性

基于 VitePress 构建