如何通过Socket.IO实现Rasa聊天机器人对接人工实时对话
Rasa 基于Socket.IO实现人工实时对话触发配置方案
你已经做好触发人工的payload按钮的前提下,按下面三个模块配置就能跑通流程:
1. Rasa服务端开启Socket.IO通道
找到项目根目录下的credentials.yml文件,添加SocketIO通道配置项:
socketio: user_message_evt: user_uttered bot_message_evt: bot_uttered session_persistence: true jwt_secret: your_custom_secret # 生产环境建议加,用来做连接合法性校验 cors_allowed_origins: ["*"] # 开发阶段可设为通配,生产环境替换成你的前端实际域名
配置修改完成后重启Rasa服务,启动日志里出现Sockets connected to /socket.io提示就说明通道开启成功,默认Socket.IO服务挂载在Rasa的5005端口下,访问路径为/socket.io。
2. 前端侧Socket.IO连接与事件监听
首先安装和Rasa内置版本匹配的socket.io-client依赖(Rasa 3.x系列对应Socket.IO v4版本,大版本不匹配会直接连不上),核心连接和消息监听代码如下:
import { io } from "socket.io-client"; // 建立和Rasa服务的Socket连接 const rasaSocket = io("http://你的Rasa服务IP:5005", { path: "/socket.io", transports: ["websocket", "polling"] }); // 连接建立后初始化会话 rasaSocket.on("connect", () => { rasaSocket.emit("session_request", { session_id: 当前登录用户的唯一标识ID, sender_id: 当前登录用户的唯一标识ID // 和session_id保持一致即可 }); }); // 监听Rasa返回的消息 rasaSocket.on("bot_uttered", (res) => { // 识别到你之前配置的人工触发payload,直接切换人工模式 if (res.custom?.trigger_human_service) { // 这里写你自己的切人工逻辑:比如弹出接入提示、把当前会话ID推送给人工坐席调度服务 switchToHumanMode(res.sender_id) } else { // 非人工触发场景,正常渲染机器人回复 renderBotReply(res) } }); // 机器人对话阶段的用户消息发送方法 const sendMsgToBot = (msgContent) => { rasaSocket.emit("user_uttered", { message: msgContent, sender_id: 当前登录用户的唯一标识ID }) }
这里注意你之前做的触发人工payload按钮,对应的Rasa响应里要加固定的自定义标识字段,比如上面代码里判断的custom: {trigger_human_service: true},前端靠这个字段识别切换时机,不需要额外解析复杂的对话状态。
3. 人工对话阶段的消息流转逻辑
切换到人工模式后,直接停掉用户消息到Rasa的转发,把用户新发的消息直接推送给你自己的人工坐席服务端即可;人工坐席的回复也不需要经过Rasa,直接推送到当前用户的前端会话页渲染就行。
等人工服务结束需要切回机器人时,给Rasa发一条重置会话的指令,清空之前的对话状态即可:
// 人工服务结束,切回机器人对话 const switchBackToBot = () => { rasaSocket.emit("user_uttered", { message: "/restart", sender_id: 当前登录用户的唯一标识ID }) }
常见踩坑点:
- 出现跨域报错优先检查
credentials.yml里的cors_allowed_origins配置,确认前端域名在允许列表里- 连接失败先排查Rasa服务5005端口的防火墙规则,确认端口对外开放
- 连接成功但收不到消息,先核对socket.io-client的版本和Rasa内置的Socket.IO版本是否一致
内容的提问来源于stack exchange,提问作者pr_learner
相关产品推荐
相关产品推荐

