第一篇:客服Agent 四层架构 —— 一个多Agent客服系统的设计全貌

好的架构不是设计出来的,是被问题逼出来的。本文以 5 个关键的架构决策为主线,串起整个系统的设计。

先想清楚问题:为什么通用RAG问答系统方案不适用?

电商客服 Agent 和通用RAG问答系统看起来很像------都是一个对话框。大多数团队的自然起步是搭一个标准 RAG 问答系统:文档切片 → 向量嵌入 → 语义检索 → LLM 生成。但在客服场景下,这个通用RAG问答系统方案有四个致命缺陷:

  • 意图混合:用户可能在同一句话里混了"查物流+问退款"。RAG 只会从文档里搜,无法区分"这个问题要调 API 查订单"还是"这个问题要翻商品说明书"------它只能把所有相关内容都塞给 LLM,让模型自己去猜
  • 信息源异构:知识库(商品说明书,非结构化)和业务 API(查订单/退款,结构化)是完全不同的信息源,却要在同一个回答里整合。标准 RAG 只吃文档,对实时 API 数据毫无编排能力
  • 延迟硬约束:用户等 2 秒就烦躁了,但一次完整的 Agent 对话(问题改写→安全审查→混合检索→答案生成,4 步流水线)动辄 10 秒级(qwen3.6-plus,最新实测 ~9.1s,详见第二篇)。通用方案没有任何"绕过 LLM"的快速通道
  • 安全边界:退款这种操作不能 AI 说了算。通用 RAG 方案没有内置的人机协同机制------它要么回答,要么不回答,不存在"让我请示一下"的中间状态

这四个缺陷不是细节问题,是架构层面的约束。它们直接决定了后面的五个决策------下面逐一展开。


决策 1:为什么不做一个"全能 Agent",而是拆成三个执行器?

最初只有一个 ReAct Agent,拿着全部 10 个工具。问题很快暴露:用户说"我的洗衣机到哪了?退款的话要多久?",Agent 在 query-order、check-shipping、request-return 之间反复横跳,循环了 12 轮才停下来,答案还是错的。

根因不是模型不够好,而是工具的底层逻辑不同:查订单调 API(结构化、确定性),搜文档做 RAG(非结构化、语义化)。塞给一个 Agent 等于让它"同时做翻译和数学题"。

解法:用编排器在请求入口做一次路由分发,根据意图选择专职执行器:

  • ReAct Agent:复杂多步任务(如"先查订单再退款")
  • GeneralAgent Executor:咨询类(如"这个洗衣机有什么功能"),走 RAG
  • Direct Tool Dispatch:简单明确意图(如"查物流 GD123456"),绕开 LLM,<10ms

核心原则:"一次路由,不再回头"------执行器之间绝不互相调用。

一句话:通用方案(简单 RAG)和单体 ReAct Agent 都被我们否定了。 最终架构里的 ReAct Agent 已经不是一个"全能管家"了------它只负责复杂多步推理这一件事,工具集被大幅缩减。其余的交给 Direct Dispatch(规则路由)和 GeneralAgent(RAG 问答)。


决策 2:为什么不用 LangGraph Supervisor?

社区的标准方案是 Supervisor Agent 动态调度子 Agent。我们算了一笔账:每次调度多一次 LLM 调用。同一个 qwen-turbo API,我们实测 function calling(带 5 个工具 schema)的延迟是 p50=477ms、p95=672ms、p99=1200ms(50 条标注 query × 10 repeats = 500 次请求)。客服场景里,多 477ms 意味着用户发完消息后多等一个明显的卡顿。

更关键的是可靠性问题。实测 qwen-turbo Top-1 准确率 92% (460/500),这听起来不错------直到你看到按意图拆开的数字:query-order 只有 80%。"我的订单到哪了"这个问题被 10 次全部误判为 check-shipping ------因为 LLM 看到了"到哪了",语义上天然偏向物流。用户问订单状态,却被路由到快递查询,接下来就是一串错误的工具调用。按每天 1 万次请求算,约 800 次会被路由错误------这 800 次不只是延迟,是用户收到错误答案

替代方案是规则+语义匹配(P0+P1,总延迟 <30ms),效果等价但零额外 LLM 调用。这不是"技术更好",而是"场景定义的选择"。


决策 3:同义词归一化的三级设计

"不想要了""退了吧""申请退款"------对于系统来说都是一回事。但怎么做到?

  • L1 静态映射表 <1ms:覆盖绝大多数常见表达
  • L2 文本标准化:处理边缘的汉字变体和标点
  • L3 LLM 兜底:只在极端情况启用

核心取舍:95% 的 case 不应该为极少数的边缘场景买单。


决策 4:技术栈选型原则

为什么不用 Coze/Dify?因为无法实现我们后面的 P0+P1+P2 自定义流水线。

为什么不用 AutoGen/CrewAI?因为对话链路不可控,商业场景合规风险高。

选型原则只有一个:每个组件的引入必须解决一个明确的、可验证的痛点。


决策 5:依赖拓扑与降级思维(从架构阶段就植入)

最坏情况推演:Qwen API 超时 + Milvus OOM + Redis 断连 + Embedding 挂了 → 退化到"Qwen2.5-1.5B-Instruct 本地 GPU 推理,无 RAG 增强直接回答"。不是完美的回答,但不再是 500。

这引出了贯穿整个系列的哲学:"能用工程手段替代 LLM 调用的,就不要用 LLM------5ms 的规则能解决的问题,凭什么花 500ms 调用大模型?"


四层架构图
#mermaid-svg-y71psMSewna9lUdZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-y71psMSewna9lUdZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-y71psMSewna9lUdZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-y71psMSewna9lUdZ .error-icon{fill:#552222;}#mermaid-svg-y71psMSewna9lUdZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-y71psMSewna9lUdZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-y71psMSewna9lUdZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-y71psMSewna9lUdZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-y71psMSewna9lUdZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-y71psMSewna9lUdZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-y71psMSewna9lUdZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-y71psMSewna9lUdZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-y71psMSewna9lUdZ .marker.cross{stroke:#333333;}#mermaid-svg-y71psMSewna9lUdZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-y71psMSewna9lUdZ p{margin:0;}#mermaid-svg-y71psMSewna9lUdZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-y71psMSewna9lUdZ .cluster-label text{fill:#333;}#mermaid-svg-y71psMSewna9lUdZ .cluster-label span{color:#333;}#mermaid-svg-y71psMSewna9lUdZ .cluster-label span p{background-color:transparent;}#mermaid-svg-y71psMSewna9lUdZ .label text,#mermaid-svg-y71psMSewna9lUdZ span{fill:#333;color:#333;}#mermaid-svg-y71psMSewna9lUdZ .node rect,#mermaid-svg-y71psMSewna9lUdZ .node circle,#mermaid-svg-y71psMSewna9lUdZ .node ellipse,#mermaid-svg-y71psMSewna9lUdZ .node polygon,#mermaid-svg-y71psMSewna9lUdZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-y71psMSewna9lUdZ .rough-node .label text,#mermaid-svg-y71psMSewna9lUdZ .node .label text,#mermaid-svg-y71psMSewna9lUdZ .image-shape .label,#mermaid-svg-y71psMSewna9lUdZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-y71psMSewna9lUdZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-y71psMSewna9lUdZ .rough-node .label,#mermaid-svg-y71psMSewna9lUdZ .node .label,#mermaid-svg-y71psMSewna9lUdZ .image-shape .label,#mermaid-svg-y71psMSewna9lUdZ .icon-shape .label{text-align:center;}#mermaid-svg-y71psMSewna9lUdZ .node.clickable{cursor:pointer;}#mermaid-svg-y71psMSewna9lUdZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-y71psMSewna9lUdZ .arrowheadPath{fill:#333333;}#mermaid-svg-y71psMSewna9lUdZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-y71psMSewna9lUdZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-y71psMSewna9lUdZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-y71psMSewna9lUdZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-y71psMSewna9lUdZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-y71psMSewna9lUdZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-y71psMSewna9lUdZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-y71psMSewna9lUdZ .cluster text{fill:#333;}#mermaid-svg-y71psMSewna9lUdZ .cluster span{color:#333;}#mermaid-svg-y71psMSewna9lUdZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-y71psMSewna9lUdZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-y71psMSewna9lUdZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-y71psMSewna9lUdZ .icon-shape,#mermaid-svg-y71psMSewna9lUdZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-y71psMSewna9lUdZ .icon-shape p,#mermaid-svg-y71psMSewna9lUdZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-y71psMSewna9lUdZ .icon-shape .label rect,#mermaid-svg-y71psMSewna9lUdZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-y71psMSewna9lUdZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-y71psMSewna9lUdZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-y71psMSewna9lUdZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} query + token
intent + normalized
🟠 基础设施层 Infrastructure Layer
LLM Service

云端:通义千问 Qwen-Max

本地 GPU:Qwen2.5-1.5B-Instruct
Vector Stores

Milvus HNSW

Redis

缓存 / 会话

HITL中断存储
MySQL

持久化存储

用户/订单/日志
NebulaGraph

商品关系图谱
vLLM

本地模型推理
🟡 执行层 Execution Layer
ReActAgent

多步工具调用循环

退款/物流等复杂任务
GeneralAgentExecutor

4步流水线

咨询类 RAG 问答
DirectToolDispatch

规则路由 <5ms

简单明确意图
🟢 编排层 Orchestration Layer
AgentOrchestrator

一次路由,不再回头
IntentRecognizer

FAISS 意图匹配 <5ms
SynonymNormalizer

L1静态表/L2文本/L3 LLM兜底
🔵 接入层 Access Layer
Nginx 负载均衡

速率限制 / HTTPS
FastAPI REST API

Bearer Token 认证

相关推荐
heimeiyingwang1 小时前
【架构实战】Docker容器化:从镜像到部署的完整实践
docker·容器·架构
数据知道1 小时前
指纹浏览器代理中台设计:为每个指纹环境绑定独立出口IP的架构实现
网络协议·tcp/ip·架构
大蚂蚁2号1 小时前
Python 项目架构深度解析:从混乱到清晰
开发语言·python·架构
暗黑小白1 小时前
第四篇:HNSW 参数调优 —— efSearch 从默认 50 降到 32 的完整消融实验
架构·ai agent
wb043072012 小时前
阿明出海记——从阿明的“东京分店“,看国际化与多区域部署的工程实践
架构
暗黑小白2 小时前
第九篇:降级矩阵与 Token 限流 —— 生产系统的八道防线
架构·ai agent
一水鉴天12 小时前
不确定性问题确定解的 DevOps 九宫格内核 20260612(腾讯元宝)
人工智能·架构
小短腿的代码世界12 小时前
Qt行情协议解析与二进制编解码优化:从FIX到自定义协议的全链路架构
开发语言·qt·架构
是温不嗜温14 小时前
QR 准谐振反激架构:当下中小功率快充的主流选择
架构·电源管理·电源芯片·ac-dc