飞享IM × LangGraph Agent:智能客服落地架构方案

comsince
FshareIM Team基于飞享IM开源即时通讯系统,结合 LangGraph + Claude 构建的智能客服方案。用户在 IM 客户端与 AI 机器人对话,回答由 RAG 知识库驱动,流式逐字输出,体验接近原生对话。
整体架构
系统由三个独立模块组成,通过 HTTP + 私有 IM 信令协议衔接:
核心流程
完整时序
关键判断逻辑(SendMessageHandler)
原始消息存储和推送不受影响,Agent 转发在独立线程池中执行,与消息链路完全解耦。
关键组件
1. Agent 转发层(Java)
AgentForwarder.java 提供两个核心方法:
| 方法 | 说明 |
|---|---|
ask(question) | 同步 HTTP POST /ask,返回完整答案字符串 |
stream(question, userId, tokenConsumer) | 流式 HTTP POST /stream,逐 chunk 回调 Consumer |
stream() 使用原始字符流(reader.read(buf))而非 readLine(),保留换行符,避免客户端内容挤成一行。
SendMessageHandler.tryForwardToAgent() 核心逻辑:
2. RAG 工作流(Python)
graph.py 中的 LangGraph 状态机节点流转:
grade_docs 节点启用 thinking={"type": "adaptive"},提升文档相关性判断准确率。
3. 流式信令处理(Vue 客户端)
streamingAiHandler.js 处理 SAI 信令:
store.js 中 appendStreamingContent mutation 的状态流转:
| 事件 | 动作 |
|---|---|
首次收到 streamId(f=false, d="") | 创建虚拟消息,插入当前会话 |
收到 delta(f=false, d="token") | 追加到虚拟消息,响应式更新 UI |
收到结束信号(f=true) | 标记 streaming=false,加入待替换列表 |
| MN 通知到达 | 拉取永久消息,替换并删除虚拟消息 |
流式推送协议(SAI 信令)
在 SubSignal.java 枚举末尾新增 SAI(Streaming AI),不影响现有信令序号。
Payload 格式(UTF-8 JSON):
| 字段 | 类型 | 说明 |
|---|---|---|
i | string | 本次流会话唯一 ID,客户端用于关联占位气泡 |
d | string | 本次 chunk 内容,"" 表示控制帧 |
f | boolean | true = 最后一帧,流结束 |
t | string | AI 机器人的 IM 用户 ID,客户端定位会话 |
会话记忆隔离
Agent 服务按 userid 隔离对话历史,保留最近 3 轮(6 条消息):
IM 消息路径天然携带发送方 fromUser,无需客户端额外传参。多用户并发时,每个 IM 用户拥有独立的对话上下文。
部署拓扑
启动方式:
超时配置(AgentForwarder.java):
扩展方向
知识库更新:重新抓取文档后执行 python ingest.py,重启 Agent 服务即可加载新知识库。
多机器人:在 tryForwardToAgent() 中按 conversationTarget 路由到不同 Agent 实例,每个实例可维护独立知识库(如售后、技术、商务)。
群聊客服:去掉私聊类型判断,检测 @机器人 触发词,回复时指定 conversationType = Group。
限流降级:线程池满时通过 RejectedExecutionHandler 回落到同步 ask() 或直接返回"当前咨询量较大,请稍后再试"。