🎯 派洞察——科研文献智能 RAG 知识库系统
💬 聊天助手设计模块
模块定位:聊天助手设计模块是系统的智能交互核心,负责处理用户与AI的实时对话和消息处理功能。
🎯 核心目标
- ✅ 实时通信:提供基于WebSocket的实时双向通信能力
- ✅ 智能对话:集成AI模型实现智能问答和知识检索
- ✅ 消息处理:高效处理用户消息并生成AI响应
- ✅ 状态管理:维护对话状态和会话管理
- ✅ 安全控制:确保通信安全和用户身份验证
📊 一、功能需求
💭 实时聊天
📝 功能描述:基于WebSocket协议实现用户与AI助手的实时双向通信,支持文本消息的发送和接收。
⚡ 实时性:消息传输延迟低,支持高并发用户同时在线聊天。
🔗 WebSocket连接管理
🔌 连接建立:支持客户端与服务器建立WebSocket连接,进行全双工通信。
🔄 连接维护:自动处理连接状态,支持心跳检测和连接重连。
❌ 连接关闭:优雅处理连接关闭,释放相关资源。
🤖 AI消息处理
🎯 消息接收:接收用户发送的文本消息,进行预处理和验证。
🧠 智能处理:调用AI服务处理用户消息,生成智能回复内容。
📤 响应发送:将AI生成的回复内容通过WebSocket发送给用户。
🎛️ 聊天控制
🛑 停止指令:提供WebSocket停止指令Token,支持用户主动停止AI响应生成。
🔒 权限控制:确保只有授权用户才能使用聊天功能。
📊 性能监控:实时监控聊天处理性能,记录关键指标。
🛠️ 二、技术方案
🌐 通信协议
🔗 WebSocket:使用WebSocket协议实现全双工通信,支持实时消息传输。
📡 Spring WebSocket:基于Spring框架的WebSocket支持,提供稳定的连接管理。
💓 心跳机制:实现心跳检测,确保连接活跃状态。
🤖 AI集成
🧠 ChatHandler:自定义聊天处理器,负责调用AI服务处理用户消息。
🔄 异步处理:采用异步处理方式,避免阻塞WebSocket连接。
🎯 上下文管理:维护对话上下文,提供连贯的对话体验。
🛡️ 安全与监控
🔐 身份验证:通过会话ID识别用户身份,确保通信安全。
📝 日志记录:详细记录聊天日志,包括用户消息、AI响应和系统事件。
⚠️ 错误处理:完善的异常处理机制,确保系统稳定性。
📈 性能监控:集成性能监控工具,实时跟踪处理耗时和资源使用情况。
🗄️ 数据存储
💾 消息持久化:支持聊天记录的持久化存储,便于后续分析。
🔄 缓存机制:使用缓存技术提高响应速度和系统性能。
📊 数据分析:收集聊天数据用于AI模型优化和用户体验改进。
📝 三、关键流程
💬 1. WebSocket聊天消息处理
🔄 流程步骤
- 🔗 建立连接:客户端与服务器建立WebSocket连接
- 📨 接收消息:服务器接收用户发送的文本消息
- 🆔 身份识别:使用会话ID作为用户标识
- ⏱️ 性能监控:启动性能监控器记录处理耗时
- 📝 日志记录:记录用户消息信息和业务日志
- 🤖 AI处理:调用ChatHandler处理用户消息
- ✅ 成功监控:记录操作成功日志和性能指标
- 📤 响应返回:将AI响应发送给客户端
异常处理:
- 记录业务错误日志
- 更新性能监控状态
- 抛出异常供上层处理
🔑 2. 获取WebSocket停止指令Token
🔄 流程步骤
- 📤 接收请求:客户端发送获取Token请求
- 🎯 Token生成:调用ChatWebSocketHandler生成内部命令Token
- ✅ 有效性检查:验证生成的Token是否有效
- 📤 返回结果:返回Token或错误信息
错误处理:
- Token生成失败返回500错误
- 记录业务错误日志
- 返回详细的错误信息
接口设计
请求URL
1
| GET /api/v1/chat/websocket-token
|
成功响应
1 2 3 4 5 6 7
| { "code": 200, "message": "获取WebSocket停止指令Token成功", "data": { "cmdToken": "STOP_TOKEN_STRING" } }
|
失败响应
1 2 3 4 5
| { "code": 500, "message": "Token生成失败", "data": null }
|
🗃️ 四、库表设计
💬 1. 聊天记录表
字段设计
1 2 3 4 5 6 7 8 9 10 11
| | 🔑 字段 | 📋 类型 | 📝 描述 | | --- | --- | --- | | `id` | `BIGINT` | 🆔 主键,聊天记录ID | | `user_id` | `VARCHAR(64)` | 👤 用户会话ID | | `message` | `TEXT` | 💬 用户消息内容 | | `response` | `TEXT` | 🤖 AI响应内容 | | `message_type` | `ENUM('USER','AI')` | 📨 消息类型 | | `status` | `ENUM('PENDING','SUCCESS','FAILED')` | 📊 处理状态 | | `processing_time` | `INT` | ⏱️ 处理耗时(毫秒) | | `created_at` | `TIMESTAMP` | 📅 创建时间 | | `updated_at` | `TIMESTAMP` | 🔄 更新时间 |
|
建表语句
1 2 3 4 5 6 7 8 9 10 11 12 13
| CREATE TABLE chat_records ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '聊天记录唯一标识', user_id VARCHAR(64) NOT NULL COMMENT '用户会话ID', message TEXT COMMENT '用户消息内容', response TEXT COMMENT 'AI响应内容', message_type ENUM('USER','AI') NOT NULL COMMENT '消息类型', status ENUM('PENDING','SUCCESS','FAILED') DEFAULT 'PENDING' COMMENT '处理状态', processing_time INT DEFAULT 0 COMMENT '处理耗时(毫秒)', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', INDEX idx_user_id (user_id) COMMENT '用户ID索引', INDEX idx_created_at (created_at) COMMENT '创建时间索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='聊天记录表';
|
🔗 2. WebSocket会话表
字段设计
1 2 3 4 5 6 7 8 9 10 11
| | 🔑 字段 | 📋 类型 | 📝 描述 | | --- | --- | --- | | `session_id` | `VARCHAR(64)` | 🆔 主键,会话ID | | `user_id` | `VARCHAR(64)` | 👤 用户ID | | `connection_status` | `ENUM('CONNECTED','DISCONNECTED')` | 🔗 连接状态 | | `last_heartbeat` | `TIMESTAMP` | 💓 最后心跳时间 | | `connection_time` | `TIMESTAMP` | ⏱️ 连接建立时间 | | `disconnection_time` | `TIMESTAMP` | 🚪 连接断开时间 | | `ip_address` | `VARCHAR(45)` | 🌐 客户端IP地址 | | `created_at` | `TIMESTAMP` | 📅 创建时间 | | `updated_at` | `TIMESTAMP` | 🔄 更新时间 |
|
建表语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| CREATE TABLE websocket_sessions ( session_id VARCHAR(64) PRIMARY KEY COMMENT '会话唯一标识', user_id VARCHAR(64) NOT NULL COMMENT '用户ID', connection_status ENUM('CONNECTED','DISCONNECTED') DEFAULT 'CONNECTED' COMMENT '连接状态', last_heartbeat TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '最后心跳时间', connection_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '连接建立时间', disconnection_time TIMESTAMP NULL COMMENT '连接断开时间', ip_address VARCHAR(45) COMMENT '客户端IP地址', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', INDEX idx_user_id (user_id) COMMENT '用户ID索引', INDEX idx_connection_status (connection_status) COMMENT '连接状态索引', INDEX idx_last_heartbeat (last_heartbeat) COMMENT '心跳时间索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='WebSocket会话表';
|