客服 AGENT 系统 · 架构方案 v1 · 讨论稿

Nexora Loop 客服 Agent 全链路架构

在现有 nexora-loop 客服平台上,自研一个 ReAct 单循环 Agent,把「客服入口 › 知识库应答 › 建工单 › 飞书派单」串成闭环。弃用 Mattermost 与 OpenClaw 网关;飞书只承担员工侧。核心是快慢分离:热路径极简保延迟,智能全部堆在客户看不到的慢路径。

owner: mike · base: nexora-loop (Next.js 16 + Prisma + Postgres) · 客户段零 OpenClaw · 开发段本期人工
01 / 数据流

一张图看懂整条链路

客户匿名访客走 widget,热路径只经过一个快 Agent;转工单后 Postgres 是唯一真相源,Deep Worker 异步把一句「催一下」嚼成带根因、查重、指派的结构化工单,再投影到飞书交给人工。

nexora-loop 后端 · claw-bot ① 提问 流式 SSE create_ticket 落库 ② 捞 pending ③ 回填 analyzed ④ 结构化工单 客户 · 商城 / ERP 匿名访客 widget.js · 原生 SSE 流式(现状复用) ① Fast Agent 热路径 · 客户实时 · ReAct 原生循环 ≤4 步 快模型(235 本地 / 云)· 只有两种出路: ① 知识库/记忆有答案 › 直接答 ② 解决不了 › 建工单 调用 2 个工具 search_kb 飞书文档搜索 + 记忆 · user token 命中 › 直接流式回答(热路径闭环) create_ticket 解决不了 › 落 Postgres 真相源 走工单流程 › 飞书派开发 tenant 后端锁死 · 不信 LLM 传的 tenant_id · search_kb 只搜本租户 Postgres 工单表 · 单一真相源 先落库 › 再逐步 enrich status: pending › analyzed › dispatched 飞书全挂也不吞单 · 幂等可重试 ② Deep Worker · 第二遍深度分析 强模型 + high thinking · 异步(客户已离开,不占延迟) 读全程 · 重查 KB · 查重复工单 · 定根因 · 判紧急 · 按模块选开发 上下文:transcript + 部署事实(域名/表前缀)+ 未关工单 + 开发 open_id 输出结构化工单:根因 / 紧急度 / 指派建议 / duplicate_of 李浩南(订单)· 梁霄(商城)… ③ 飞书 Task API · 建单 + @指派开发 飞书 = 投影(Postgres 才是真相源) 图例 热路径(客户实时) 工单流程(慢路径) 员工侧(飞书 / 人工) ④ 开发 · 飞书人工接单改代码(本期不自动改)

热路径(绿):客户提问 › Fast Agent › 流式 SSE 秒回。慢路径(黏土色):create_ticket 落库 › Deep Worker 异步 enrich › 飞书派单。

02 / 快慢分离

「更聪明」聪明在慢路径

不上 AutoGen / 多智能体编排——你的角色交接是被人工和时间隔开的异步流程,用不上实时 agent 协作。智能放在判断力和工具质量,不放编排框架。客户体验不受一点拖累,工单质量却上一个台阶。

客户实时路径 后台异步路径 客户提问 「支持退货吗?」 Fast Agent · 查 KB 答 流式 SSE · 1–2s 回答 / 「已记录」秒回 催单场景也 1s 内 客户离开 热路径结束 转工单入队 Deep Worker 深度分析 读全程 + 查重 + 定根因 + 选开发 · ~30s 飞书 [工单#88] · 库存同步延迟 @李浩南 · 紧急 · 附根因与查重

客户等一个 FAQ 答案时,背后不跑 4 个 agent 握手;一句「催一下」被强模型异步嚼成一张带根因、查重、指派的工单。

03 / 落地边界

复用什么 · 新建什么 · 删掉什么

复用 · nexora-loop 现状

  • public/widget.js — 客户挂件 + 原生 SSE,商城/ERP 已接
  • lib/widget/stream-bus.ts — SSE pub/sub,流式回答复用
  • lib/ticket/state-machine.ts — 工单状态机已存在
  • Prisma + Postgres — 工单真相源直接落这

新建 · Agent 层(~200 行)

  • lib/agent/loop.ts — ReAct 单循环,≤4 步兜底
  • lib/agent/tools/ — 只 2 个:search_kb(飞书文档+记忆搜索)/ create_ticket(解决不了就落库走开发流程)
  • lib/agent/prompt.ts — per 租户 system prompt(SOUL 代码化)
  • lib/agent/deep-worker.ts — 异步第二遍分析

删掉 · 不采用

  • lib/mm/client.ts — 605 行 Mattermost client,删
  • Mattermost channel — 入口收敛,员工只盯飞书
  • OpenClaw 网关 — 客户段不碰(冷启动/idle-kill/cooldown 脆性)
  • AutoGen / 多智能体编排 — 你这个形状用不到

关键设计约束

  • 单一真相源 — Postgres 先落库;飞书 Task 只是投影
  • 租户锁死 — 边界在 runTool 代码层,不信 LLM 传的 id
  • KB 走 user token — bot 不能进 wiki(飞书硬限制)
  • 失败不吞单 — 分析挂了也用原文建单 + 标记
  • 快慢模型分工 — 快模型秒回;强模型 + thinking 做工单