ae14e54b8c
- 新增宠物医疗上下文实体类BizPetMedicalContext - 创建宠物医疗上下文业务对象BizPetMedicalContextBo - 实现宠物医疗上下文控制器BizPetMedicalContextController - 添加宠物医疗上下文数据访问层BizPetMedicalContextMapper - 实现宠物医疗上下文服务层BizPetMedicalContextServiceImpl - 创建宠物医疗上下文视图对象BizPetMedicalContextVo - 生成前端API接口文件api.d.ts.vm和api.ts.vm - 创建Vue组件模板index.vue.vm和操作抽屉operate-drawer.vue.vm - 更新代码生成配置generator.yml支持宠物模块 - 添加树形表格支持index-tree.vue.vm模板
748 lines
24 KiB
Markdown
748 lines
24 KiB
Markdown
# RuoYi Chat 模块
|
||
|
||
## 模块简介
|
||
|
||
`ruoyi-chat` 是 PoJie 项目的智能聊天系统模块,提供完整的聊天会话管理、消息处理、知识库集成和实时通信功能。该模块通过集成 `ruoyi-ai` 和 `ruoyi-knowledge` 模块,实现了基于知识库的智能问答系统(RAG),支持多种通信方式(REST API、SSE 流式、WebSocket)。
|
||
|
||
## 功能特性
|
||
|
||
### 1. 聊天会话管理 ✅
|
||
|
||
- ✅ 创建和管理聊天会话
|
||
- ✅ 支持多用户并发聊天
|
||
- ✅ 会话历史记录和导出
|
||
- ✅ 会话状态管理
|
||
- ✅ 会话标题自动生成和手动编辑
|
||
|
||
### 2. 消息处理 ✅
|
||
|
||
- ✅ 实时消息发送和接收
|
||
- ✅ 消息类型支持(文本、图片等)
|
||
- ✅ 消息历史查询(支持分页和条件筛选)
|
||
- ✅ 消息状态跟踪
|
||
- ✅ Token 使用量和成本统计
|
||
|
||
### 3. 知识库集成(RAG)✅
|
||
|
||
- ✅ 基于知识库的智能问答
|
||
- ✅ 上下文理解和构建
|
||
- ✅ 向量相似度搜索
|
||
- ✅ 智能回复生成
|
||
- ✅ 知识库会话管理
|
||
- ✅ 知识库内容搜索
|
||
- **内部对接模块**:
|
||
- AI 模块:`AiChatService`(统一聊天接口)
|
||
- 知识库模块:`KnowledgeVectorService`(向量检索)
|
||
|
||
### 4. 实时通信 ✅
|
||
|
||
- ✅ **REST API**:标准 HTTP 接口
|
||
- ✅ **SSE 流式**:服务器推送事件,支持流式对话(`ChatOpenApiController`)
|
||
- ✅ **WebSocket**:STOMP 协议,实时双向通信(`ChatStompController`)
|
||
|
||
### 5. 使用统计 ✅
|
||
|
||
- ✅ Token 使用量统计
|
||
- ✅ 聊天成本计算
|
||
- ✅ 用户活跃度分析
|
||
- ✅ 模型使用情况
|
||
- ✅ 使用记录导出
|
||
|
||
### 6. 配置管理 ✅
|
||
|
||
- ✅ 聊天配置管理(键值对配置)
|
||
- ✅ 模型配置管理(模型信息、价格、API 配置)
|
||
- ✅ 配置分类管理
|
||
- ✅ 配置导入导出
|
||
|
||
## 目录结构
|
||
|
||
```
|
||
ruoyi-chat/
|
||
├─ src/main/java/org/dromara/chat/
|
||
│ ├─ controller/ # REST 控制器层
|
||
│ │ ├─ AIKnowledgeChatController.java # 知识库聊天控制器
|
||
│ │ ├─ ChatSessionController.java # 会话管理控制器
|
||
│ │ ├─ ChatMessageController.java # 消息管理控制器
|
||
│ │ ├─ ChatOpenApiController.java # 开放 API 控制器(SSE 流式)
|
||
│ │ ├─ ChatStompController.java # WebSocket 控制器(STOMP)
|
||
│ │ ├─ ChatConfigController.java # 配置管理控制器
|
||
│ │ ├─ ChatModelController.java # 模型管理控制器
|
||
│ │ └─ ChatUsageTokenController.java # Token 使用记录控制器
|
||
│ ├─ service/ # 核心业务服务层
|
||
│ │ ├─ AiKnowledgeChatService.java # 知识库聊天服务
|
||
│ │ ├─ ChatSessionService.java # 会话管理服务
|
||
│ │ ├─ ChatMessageService.java # 消息管理服务
|
||
│ │ ├─ ChatConfigService.java # 配置管理服务
|
||
│ │ ├─ ChatModelService.java # 模型管理服务
|
||
│ │ ├─ ChatUsageTokenService.java # Token 使用记录服务
|
||
│ │ └─ impl/ # 服务实现类
|
||
│ ├─ domain/ # 领域模型
|
||
│ │ ├─ bo/ # 业务对象(Business Object)
|
||
│ │ ├─ vo/ # 视图对象(View Object)
|
||
│ │ ├─ request/ # 请求对象
|
||
│ │ └─ *.java # 实体类(Entity)
|
||
│ ├─ mapper/ # MyBatis Mapper 接口
|
||
│ ├─ config/ # 配置类(WebSocket 配置等)
|
||
│ └─ client/ # Java SDK(统一网关封装)
|
||
│ └─ ChatSdk.java
|
||
└─ docs/ # API 使用说明文档
|
||
```
|
||
|
||
## 模块结构
|
||
|
||
```
|
||
org.dromara.chat
|
||
├── controller/ # 控制器层
|
||
│ ├── AIKnowledgeChatController.java # 知识库聊天
|
||
│ ├── ChatSessionController.java # 会话管理
|
||
│ ├── ChatMessageController.java # 消息管理
|
||
│ ├── ChatOpenApiController.java # 开放 API(SSE)
|
||
│ ├── ChatStompController.java # WebSocket(STOMP)
|
||
│ ├── ChatConfigController.java # 配置管理
|
||
│ ├── ChatModelController.java # 模型管理
|
||
│ └── ChatUsageTokenController.java # Token 统计
|
||
├── service/ # 服务层
|
||
│ ├── AiKnowledgeChatService.java
|
||
│ ├── ChatSessionService.java
|
||
│ ├── ChatMessageService.java
|
||
│ ├── ChatConfigService.java
|
||
│ ├── ChatModelService.java
|
||
│ ├── ChatUsageTokenService.java
|
||
│ └── impl/ # 服务实现
|
||
├── domain/ # 领域模型
|
||
│ ├── bo/ # 业务对象
|
||
│ ├── vo/ # 视图对象
|
||
│ ├── request/ # 请求对象
|
||
│ ├── ChatSession.java # 会话实体
|
||
│ ├── ChatMessage.java # 消息实体
|
||
│ ├── ChatConfig.java # 配置实体
|
||
│ ├── ChatModel.java # 模型实体
|
||
│ └── ChatUsageToken.java # Token 使用实体
|
||
├── mapper/ # MyBatis Mapper
|
||
├── config/ # 配置类
|
||
│ └── StompWebSocketConfig.java
|
||
└── client/ # Java SDK
|
||
└── ChatSdk.java
|
||
```
|
||
|
||
## 架构设计
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────┐
|
||
│ Chat Controller Layer │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ AIKnowledgeChatController │ ChatSessionController │
|
||
│ ChatMessageController │ ChatConfigController │
|
||
│ ChatModelController │ ChatUsageTokenController │
|
||
│ ChatOpenApiController │ ChatStompController │
|
||
│ (SSE 流式) │ (WebSocket) │
|
||
└─────────────────────┬───────────────────────────────────────┘
|
||
│
|
||
┌─────────────────────▼───────────────────────────────────────┐
|
||
│ Service Layer │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ AiKnowledgeChatService │ ChatSessionService │
|
||
│ ChatMessageService │ ChatConfigService │
|
||
│ ChatModelService │ ChatUsageTokenService │
|
||
└─────────────────────┬───────────────────────────────────────┘
|
||
│
|
||
┌─────────────────────▼───────────────────────────────────────┐
|
||
│ Integration Layer │
|
||
├─────────────────────────────────────────────────────────────┤
|
||
│ RuoYi AI Module │
|
||
│ └─ AiChatService │
|
||
│ └─ AiChatHistoryService │
|
||
│ └─ AiProviderManager │
|
||
│ │
|
||
│ RuoYi Knowledge Module │
|
||
│ └─ KnowledgeVectorService │
|
||
│ └─ KnowledgeInfoService │
|
||
└─────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 数据库表结构
|
||
|
||
### 1. 聊天会话表 (chat_session)
|
||
|
||
存储用户聊天会话信息。
|
||
|
||
| 字段名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| id | BIGINT | 主键ID |
|
||
| user_id | BIGINT | 用户ID |
|
||
| session_title | VARCHAR(255) | 会话标题 |
|
||
| session_content | TEXT | 会话内容 |
|
||
| create_by | BIGINT | 创建者 |
|
||
| create_time | DATETIME | 创建时间 |
|
||
| update_by | BIGINT | 更新者 |
|
||
| update_time | DATETIME | 更新时间 |
|
||
| remark | VARCHAR(500) | 备注 |
|
||
|
||
**索引**:`PRIMARY KEY (id)`
|
||
|
||
### 2. 聊天消息表 (chat_message)
|
||
|
||
存储聊天消息记录。
|
||
|
||
| 字段名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| id | BIGINT | 主键ID |
|
||
| session_id | BIGINT | 会话ID |
|
||
| user_id | BIGINT | 用户ID |
|
||
| content | LONGTEXT | 消息内容 |
|
||
| role | VARCHAR(255) | 对话角色(user/assistant/system) |
|
||
| deduct_cost | DOUBLE(20,2) | 扣除金额(默认 0.00) |
|
||
| total_tokens | INT(20) | 累计 Tokens(默认 0) |
|
||
| model_name | VARCHAR(255) | 模型名称 |
|
||
| create_by | BIGINT | 创建者 |
|
||
| create_time | DATETIME | 创建时间 |
|
||
| update_by | BIGINT | 更新者 |
|
||
| update_time | DATETIME | 更新时间 |
|
||
| remark | VARCHAR(500) | 备注 |
|
||
|
||
**索引**:`PRIMARY KEY (id)`
|
||
|
||
### 3. 聊天配置表 (chat_config)
|
||
|
||
存储聊天系统配置(键值对形式)。
|
||
|
||
| 字段名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| id | BIGINT | 主键ID |
|
||
| category | VARCHAR(255) | 配置类型 |
|
||
| config_name | VARCHAR(255) | 配置名称 |
|
||
| config_value | TEXT | 配置值 |
|
||
| config_dict | VARCHAR(255) | 说明 |
|
||
| create_by | BIGINT | 创建者 |
|
||
| create_time | DATETIME | 创建时间 |
|
||
| update_by | BIGINT | 更新者 |
|
||
| update_time | DATETIME | 更新时间 |
|
||
| remark | VARCHAR(500) | 备注 |
|
||
| version | INT | 版本 |
|
||
| del_flag | CHAR(1) | 删除标志(0存在 1删除) |
|
||
| update_ip | VARCHAR(128) | 更新IP |
|
||
|
||
**索引**:
|
||
- `PRIMARY KEY (id)`
|
||
- `UNIQUE KEY unique_category_key (category, config_name)`
|
||
|
||
### 4. 聊天模型表 (chat_model)
|
||
|
||
存储聊天模型配置信息。
|
||
|
||
| 字段名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| id | BIGINT | 主键ID |
|
||
| category | VARCHAR(20) | 模型分类 |
|
||
| model_name | VARCHAR(50) | 模型名称 |
|
||
| model_describe | VARCHAR(255) | 模型描述 |
|
||
| model_price | DOUBLE | 模型价格 |
|
||
| model_type | CHAR(1) | 计费类型 |
|
||
| model_show | CHAR(1) | 是否显示 |
|
||
| system_prompt | VARCHAR(255) | 系统提示词 |
|
||
| api_host | VARCHAR(255) | 请求地址 |
|
||
| api_key | VARCHAR(255) | 密钥 |
|
||
| api_url | VARCHAR(50) | 请求后缀 |
|
||
| create_by | BIGINT | 创建者 |
|
||
| create_time | DATETIME | 创建时间 |
|
||
| update_by | BIGINT | 更新者 |
|
||
| update_time | DATETIME | 更新时间 |
|
||
| remark | VARCHAR(500) | 备注 |
|
||
|
||
**索引**:`PRIMARY KEY (id)`
|
||
|
||
### 5. Token 使用记录表 (chat_usage_token)
|
||
|
||
存储用户 Token 使用统计。
|
||
|
||
| 字段名 | 类型 | 说明 |
|
||
|--------|------|------|
|
||
| id | BIGINT | 主键ID |
|
||
| user_id | BIGINT | 用户ID |
|
||
| token | INT(10) | 待结算 token |
|
||
| model_name | VARCHAR(64) | 模型名称 |
|
||
| total_token | VARCHAR(255) | 累计使用 token |
|
||
|
||
**索引**:`PRIMARY KEY (id)`
|
||
|
||
**数据库脚本位置**:`script/sql/ry_chat.sql`
|
||
|
||
## API 接口
|
||
|
||
### 知识库聊天接口 (`/chat/knowledge`)
|
||
|
||
#### 知识库问答
|
||
- **接口**:`POST /chat/knowledge/chat`
|
||
- **说明**:基于知识库进行智能问答
|
||
- **权限**:`chat:knowledge:chat`
|
||
- **参数**:
|
||
- `sessionId` (Long, 必填) - 会话ID
|
||
- `userId` (Long, 必填) - 用户ID
|
||
- `question` (String, 必填) - 问题
|
||
- `knowledgeId` (Long, 必填) - 知识库ID
|
||
- `modelName` (String, 必填) - 模型名称
|
||
|
||
#### 创建知识库会话
|
||
- **接口**:`POST /chat/knowledge/session`
|
||
- **说明**:创建知识库聊天会话
|
||
- **权限**:`chat:knowledge:session`
|
||
- **参数**:
|
||
- `userId` (Long, 必填) - 用户ID
|
||
- `knowledgeId` (Long, 必填) - 知识库ID
|
||
- `sessionTitle` (String, 可选) - 会话标题
|
||
|
||
#### 搜索知识内容
|
||
- **接口**:`GET /chat/knowledge/search`
|
||
- **说明**:搜索知识库内容
|
||
- **权限**:`chat:knowledge:search`
|
||
- **参数**:
|
||
- `knowledgeId` (Long, 必填) - 知识库ID
|
||
- `query` (String, 必填) - 查询内容
|
||
- `limit` (Integer, 可选, 默认5) - 返回数量
|
||
|
||
#### 构建知识上下文
|
||
- **接口**:`GET /chat/knowledge/context`
|
||
- **说明**:构建知识库上下文
|
||
- **权限**:`chat:knowledge:context`
|
||
- **参数**:
|
||
- `knowledgeId` (Long, 必填) - 知识库ID
|
||
- `question` (String, 必填) - 问题
|
||
|
||
#### 获取聊天历史
|
||
- **接口**:`GET /chat/knowledge/history/{sessionId}`
|
||
- **说明**:获取知识库聊天历史
|
||
- **权限**:`chat:knowledge:history`
|
||
- **参数**:
|
||
- `sessionId` (Long, 路径参数) - 会话ID
|
||
- `limit` (Integer, 可选, 默认20) - 返回数量
|
||
|
||
### 会话管理接口 (`/chat/session`)
|
||
|
||
- `GET /chat/session/list` - 查询会话列表(分页)
|
||
- `GET /chat/session/{id}` - 获取会话详情
|
||
- `POST /chat/session` - 创建新会话
|
||
- `PUT /chat/session` - 更新会话
|
||
- `DELETE /chat/session/{ids}` - 删除会话(批量)
|
||
- `POST /chat/session/export` - 导出会话数据
|
||
|
||
**权限前缀**:`chat:session:*`
|
||
|
||
### 消息管理接口 (`/chat/message`)
|
||
|
||
- `GET /chat/message/list` - 查询消息列表(分页)
|
||
- `GET /chat/message/{id}` - 获取消息详情
|
||
- `POST /chat/message` - 新增消息
|
||
- `PUT /chat/message` - 更新消息
|
||
- `DELETE /chat/message/{ids}` - 删除消息(批量)
|
||
- `POST /chat/message/export` - 导出消息数据
|
||
|
||
**权限前缀**:`chat:message:*`
|
||
|
||
### 开放 API 接口 (`/chat`)
|
||
|
||
#### SSE 流式聊天
|
||
- **接口**:`POST /chat/send`
|
||
- **说明**:SSE 流式聊天接口,支持 OpenAI 兼容格式
|
||
- **认证**:需要登录(`@SaCheckLogin`)
|
||
- **响应类型**:`text/event-stream`
|
||
- **请求体**:JSON 格式
|
||
```json
|
||
{
|
||
"model": "gpt-3.5-turbo",
|
||
"messages": [
|
||
{"role": "user", "content": "你好"}
|
||
],
|
||
"sessionId": "1",
|
||
"temperature": 0.7,
|
||
"max_tokens": 2000
|
||
}
|
||
```
|
||
|
||
### WebSocket 接口
|
||
|
||
#### STOMP 消息映射
|
||
- **映射路径**:`/chat/send`
|
||
- **说明**:STOMP 协议消息发送
|
||
- **订阅主题**:`/topic/session/{sessionId}`
|
||
- **配置类**:`StompWebSocketConfig`
|
||
|
||
### 配置管理接口 (`/chat/config`)
|
||
|
||
- `GET /chat/config/list` - 查询配置列表(分页)
|
||
- `GET /chat/config/{id}` - 获取配置详情
|
||
- `POST /chat/config` - 新增配置
|
||
- `PUT /chat/config` - 更新配置
|
||
- `DELETE /chat/config/{ids}` - 删除配置(批量)
|
||
- `POST /chat/config/export` - 导出配置数据
|
||
|
||
**权限前缀**:`chat:config:*`
|
||
|
||
### 模型管理接口 (`/chat/model`)
|
||
|
||
- `GET /chat/model/list` - 查询模型列表(分页)
|
||
- `GET /chat/model/{id}` - 获取模型详情
|
||
- `POST /chat/model` - 新增模型
|
||
- `PUT /chat/model` - 更新模型
|
||
- `DELETE /chat/model/{ids}` - 删除模型(批量)
|
||
- `POST /chat/model/export` - 导出模型数据
|
||
|
||
**权限前缀**:`chat:model:*`
|
||
|
||
### Token 使用记录接口 (`/chat/token`)
|
||
|
||
- `GET /chat/token/list` - 查询 Token 使用记录列表(分页)
|
||
- `GET /chat/token/{id}` - 获取 Token 使用记录详情
|
||
- `POST /chat/token` - 新增 Token 使用记录
|
||
- `PUT /chat/token` - 更新 Token 使用记录
|
||
- `DELETE /chat/token/{ids}` - 删除 Token 使用记录(批量)
|
||
- `POST /chat/token/export` - 导出 Token 使用记录数据
|
||
|
||
**权限前缀**:`chat:token:*`
|
||
|
||
## 统一网关与协同
|
||
|
||
### 后端统一网关
|
||
|
||
Chat 模块可通过 `ruoyi-ai` 模块的统一网关进行对话:
|
||
|
||
- `POST /api/ai/chat` - 同步聊天
|
||
- `POST /api/ai/chat/async` - 异步聊天
|
||
- `POST /api/ai/chat/stream` - 流式聊天(SSE)
|
||
- `WS /ws/ai/chat` - WebSocket 实时通道
|
||
|
||
### Chat 模块与 AI/Knowledge 的协同
|
||
|
||
1. **知识库增强聊天**:
|
||
- 在 `AiKnowledgeChatServiceImpl` 中构建 `AiChatRequest`
|
||
- 调用 `AiChatService.chat`,开启知识库增强(`enableKnowledge=true`)
|
||
- 通过 `KnowledgeVectorService.vectorSimilaritySearch` 进行相关性检索
|
||
- 构建上下文并注入到消息中
|
||
|
||
2. **聊天历史管理**:
|
||
- 使用 `AiChatHistoryService` 保存和管理聊天记录
|
||
- 支持 Redis 缓存和历史查询
|
||
|
||
3. **模型管理**:
|
||
- 通过 `AiProviderManager` 获取可用模型列表
|
||
- 支持模型切换和负载均衡
|
||
|
||
## 使用示例
|
||
|
||
### 1. 创建知识库会话
|
||
|
||
```bash
|
||
curl -X POST "http://localhost:8080/chat/knowledge/session" \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer <token>" \
|
||
-d '{
|
||
"userId": 1,
|
||
"knowledgeId": 1,
|
||
"sessionTitle": "技术咨询会话"
|
||
}'
|
||
```
|
||
|
||
### 2. 知识库问答
|
||
|
||
```bash
|
||
curl -X POST "http://localhost:8080/chat/knowledge/chat" \
|
||
-H "Content-Type: application/x-www-form-urlencoded" \
|
||
-H "Authorization: Bearer <token>" \
|
||
-d "sessionId=1&userId=1&question=什么是Spring Boot?&knowledgeId=1&modelName=gpt-3.5-turbo"
|
||
```
|
||
|
||
### 3. SSE 流式聊天
|
||
|
||
```bash
|
||
curl -X POST "http://localhost:8080/chat/send" \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer <token>" \
|
||
-H "Accept: text/event-stream" \
|
||
-d '{
|
||
"model": "gpt-3.5-turbo",
|
||
"messages": [
|
||
{"role": "user", "content": "你好,请介绍一下你自己"}
|
||
],
|
||
"sessionId": "1",
|
||
"temperature": 0.7
|
||
}'
|
||
```
|
||
|
||
### 4. 通过统一网关进行对话
|
||
|
||
```bash
|
||
curl -X POST "http://localhost:8080/api/ai/chat" \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer <token>" \
|
||
-d '{
|
||
"userId": "1",
|
||
"sessionId": "1",
|
||
"model": "gpt-4o-mini",
|
||
"enableKnowledge": true,
|
||
"knowledgeId": "1",
|
||
"knowledgeLimit": 5,
|
||
"knowledgeThreshold": 0.7,
|
||
"messages": [
|
||
{"role": "user", "content": "什么是Spring Boot?"}
|
||
]
|
||
}'
|
||
```
|
||
|
||
### 5. 获取聊天历史
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/chat/knowledge/history/1?limit=10" \
|
||
-H "Authorization: Bearer <token>"
|
||
```
|
||
|
||
### 6. 查询会话列表
|
||
|
||
```bash
|
||
curl -X GET "http://localhost:8080/chat/session/list?pageNum=1&pageSize=10" \
|
||
-H "Authorization: Bearer <token>"
|
||
```
|
||
|
||
## Java SDK
|
||
|
||
### ChatSdk(统一网关封装)
|
||
|
||
封装类:`org.dromara.chat.client.ChatSdk`
|
||
|
||
```java
|
||
// 初始化 SDK
|
||
ChatSdk sdk = new ChatSdk("http://localhost:8080")
|
||
.withToken("Bearer xxx");
|
||
|
||
// 同步聊天
|
||
String result = sdk.chat("{\"model\":\"gpt-4o\",\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}]}");
|
||
|
||
// 流式聊天(SSE)
|
||
sdk.chatStream("{\"model\":\"gpt-4o\",\"messages\":[{\"role\":\"user\",\"content\":\"hello\"}]}",
|
||
chunk -> System.out.println(chunk),
|
||
response -> System.out.println("Complete: " + response),
|
||
error -> System.err.println("Error: " + error));
|
||
```
|
||
|
||
## 配置说明
|
||
|
||
### 应用配置
|
||
|
||
Chat 模块依赖 `ruoyi-ai` 模块的配置,主要配置在 `application.yml` 中:
|
||
|
||
```yaml
|
||
ruoyi:
|
||
ai:
|
||
# 是否启用 AI 模块
|
||
enabled: true
|
||
|
||
# 知识库配置
|
||
knowledge:
|
||
enabled: true
|
||
default-search-count: 5
|
||
similarity-threshold: 0.7
|
||
max-context-length: 4000
|
||
|
||
# 流式响应配置
|
||
stream:
|
||
enabled: true
|
||
buffer-size: 1024
|
||
timeout: 60
|
||
```
|
||
|
||
### WebSocket 配置
|
||
|
||
WebSocket 配置在 `StompWebSocketConfig` 中:
|
||
|
||
- **端点路径**:`/ws`
|
||
- **消息映射**:`/chat/send`
|
||
- **订阅主题**:`/topic/session/{sessionId}`
|
||
|
||
### 数据库配置
|
||
|
||
确保已执行 `script/sql/ry_chat.sql` 初始化脚本。
|
||
|
||
## 依赖模块
|
||
|
||
### 核心依赖
|
||
|
||
- **ruoyi-ai**: AI 服务集成
|
||
- `AiChatService` - 统一聊天服务
|
||
- `AiChatHistoryService` - 聊天历史服务
|
||
- `AiProviderManager` - Provider 管理器
|
||
- **ruoyi-knowledge**: 知识库服务
|
||
- `KnowledgeVectorService` - 向量检索服务
|
||
- `KnowledgeInfoService` - 知识库信息服务
|
||
- **ruoyi-common-core**: 核心工具类
|
||
- **ruoyi-common-mybatis**: 数据库操作
|
||
- **ruoyi-common-web**: Web 框架支持
|
||
- **ruoyi-common-security**: 安全认证(Sa-Token)
|
||
- **ruoyi-common-log**: 日志记录
|
||
- **ruoyi-common-excel**: Excel 导出
|
||
|
||
## 开发指南
|
||
|
||
### 添加新的聊天类型
|
||
|
||
1. 创建新的 Controller 类,继承 `BaseController`
|
||
2. 实现对应的 Service 接口
|
||
3. 添加相关的 BO 和 VO 类
|
||
4. 配置路由映射和权限注解
|
||
|
||
### 扩展消息类型
|
||
|
||
1. 在 `ChatMessage` 实体中添加新字段
|
||
2. 更新数据库表结构(修改 `ry_chat.sql`)
|
||
3. 修改消息处理逻辑
|
||
4. 添加相应的验证规则
|
||
|
||
### 集成新的 AI 模型
|
||
|
||
1. 在 `ruoyi-ai` 模块中添加新的 Provider
|
||
2. 在 `chat_model` 表中添加模型配置
|
||
3. 测试模型兼容性
|
||
4. 更新文档
|
||
|
||
### WebSocket 扩展
|
||
|
||
1. 在 `StompWebSocketConfig` 中添加新的消息映射
|
||
2. 创建对应的 Controller 处理消息
|
||
3. 配置订阅主题
|
||
4. 更新客户端连接代码
|
||
|
||
## 认证与权限
|
||
|
||
### 认证方式
|
||
|
||
- **登录认证**:基于 Sa-Token,所有写操作需要登录态(`@SaCheckLogin`)
|
||
- **权限控制**:管理接口需要相应权限(`@SaCheckPermission`)
|
||
- **令牌格式**:`Authorization: Bearer <token>`
|
||
|
||
### 权限列表
|
||
|
||
- `chat:knowledge:*` - 知识库聊天权限
|
||
- `chat:session:*` - 会话管理权限
|
||
- `chat:message:*` - 消息管理权限
|
||
- `chat:config:*` - 配置管理权限
|
||
- `chat:model:*` - 模型管理权限
|
||
- `chat:token:*` - Token 统计权限
|
||
|
||
### 统一网关权限
|
||
|
||
统一网关(`/api/ai/*`)需要相应的 AI 模块权限,如 `ai:chat:sync`、`ai:chat:stream` 等。
|
||
|
||
## 监控和日志
|
||
|
||
### 关键指标
|
||
|
||
- 会话创建数量
|
||
- 消息发送成功率
|
||
- 平均响应时间
|
||
- Token 使用量
|
||
- 错误率统计
|
||
- 知识库检索命中率
|
||
|
||
### 日志配置
|
||
|
||
```yaml
|
||
logging:
|
||
level:
|
||
org.dromara.chat: DEBUG
|
||
org.dromara.ai: INFO
|
||
org.dromara.knowledge: INFO
|
||
```
|
||
|
||
### 日志记录
|
||
|
||
- 所有接口调用记录(通过 `@Log` 注解)
|
||
- 异常错误日志
|
||
- 性能监控日志
|
||
- Token 使用日志
|
||
|
||
## 故障排除
|
||
|
||
### 常见问题
|
||
|
||
1. **AI 服务不可用**
|
||
- 检查 `ruoyi-ai` 模块状态
|
||
- 验证 API 密钥配置
|
||
- 查看网络连接
|
||
- 检查 Provider 配置
|
||
|
||
2. **知识库搜索失败**
|
||
- 确认知识库 ID 有效
|
||
- 检查知识库内容是否已索引
|
||
- 验证搜索权限
|
||
- 查看向量服务状态
|
||
|
||
3. **会话创建失败**
|
||
- 检查用户权限
|
||
- 验证数据库连接
|
||
- 查看参数格式
|
||
- 检查会话表结构
|
||
|
||
4. **SSE 流式响应中断**
|
||
- 检查网络连接稳定性
|
||
- 查看超时配置
|
||
- 验证模型响应时间
|
||
- 检查服务器资源
|
||
|
||
5. **WebSocket 连接失败**
|
||
- 检查 WebSocket 配置
|
||
- 验证 STOMP 端点路径
|
||
- 查看防火墙设置
|
||
- 检查客户端连接代码
|
||
|
||
### 性能优化
|
||
|
||
1. **数据库优化**
|
||
- 添加适当索引(session_id, user_id, create_time 等)
|
||
- 定期清理历史数据
|
||
- 使用连接池
|
||
- 考虑分表策略(按时间或用户)
|
||
|
||
2. **缓存策略**
|
||
- 缓存热门会话
|
||
- 缓存知识库搜索结果
|
||
- 使用 Redis 缓存会话信息
|
||
- 缓存模型配置信息
|
||
|
||
3. **异步处理**
|
||
- 异步保存消息
|
||
- 后台统计计算
|
||
- 队列处理长任务
|
||
- 异步日志记录
|
||
|
||
4. **流式响应优化**
|
||
- 调整缓冲区大小
|
||
- 优化模型响应时间
|
||
- 使用连接池管理 SSE 连接
|
||
- 实现背压控制
|
||
|
||
## 版本历史
|
||
|
||
- **v1.0.0**: 初始版本,基础聊天功能
|
||
- **v1.1.0**: 添加知识库集成(RAG)
|
||
- **v1.2.0**: 支持多模型切换
|
||
- **v1.3.0**: 增加使用统计功能
|
||
- **v1.4.0**: 对接统一 AI 网关与 RAG 能力,完善文档与 SDK
|
||
- **v1.5.0**: 添加 SSE 流式支持和 WebSocket 实时通信
|
||
|
||
## 贡献指南
|
||
|
||
1. Fork 项目
|
||
2. 创建功能分支(`git checkout -b feature/AmazingFeature`)
|
||
3. 提交代码变更(`git commit -m 'Add some AmazingFeature'`)
|
||
4. 推送到分支(`git push origin feature/AmazingFeature`)
|
||
5. 创建 Pull Request
|
||
6. 等待代码审查
|
||
|
||
## 许可证
|
||
|
||
本项目采用 MIT 许可证,详见 LICENSE 文件。
|
||
|
||
## 相关文档
|
||
|
||
- [RuoYi AI 模块文档](../ruoyi-ai/README.md)
|
||
- [RuoYi Knowledge 模块文档](../ruoyi-knowledge/README.md)
|
||
- [API 使用文档](./docs/API.md)
|