2026-03-11 13:06:10 +08:00
|
|
|
|
## api/ai-agent 目录代码结构分析
|
|
|
|
|
|
|
|
|
|
|
|
### 一、模块概述
|
|
|
|
|
|
|
|
|
|
|
|
ai-agent 是一个基于 **LangChain4J** 的 AI 智能助手模块,用于实现对话式电商管理功能。
|
|
|
|
|
|
|
|
|
|
|
|
**核心技术栈:**
|
|
|
|
|
|
- LangChain4J (AI 框架)
|
2026-03-23 19:22:35 +08:00
|
|
|
|
- Ollama (本地大模型)
|
2026-03-11 13:06:10 +08:00
|
|
|
|
- SSE (Server-Sent Events) 实时通信
|
|
|
|
|
|
- Spring Cloud 微服务
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 二、目录结构
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
api/ai-agent/
|
|
|
|
|
|
├── src/main/java/cn/qihangerp/erp/
|
|
|
|
|
|
│ ├── AiAgent.java # 启动类
|
|
|
|
|
|
│ ├── controller/
|
|
|
|
|
|
│ │ ├── SseController.java # SSE实时通信控制器 ⭐核心
|
|
|
|
|
|
│ │ ├── HomeController.java # 主页控制器
|
|
|
|
|
|
│ │ ├── OllamaController.java # Ollama模型控制器
|
|
|
|
|
|
│ │ └── AiUserRoleController.java # AI用户角色控制器
|
|
|
|
|
|
│ ├── service/
|
|
|
|
|
|
│ │ ├── OrderService.java # 订单服务 (模拟数据)
|
|
|
|
|
|
│ │ └── OrderToolService.java # AI订单工具 ⭐核心
|
|
|
|
|
|
│ ├── serviceImpl/
|
|
|
|
|
|
│ │ ├── AiService.java # AI服务核心逻辑 ⭐⭐核心
|
|
|
|
|
|
│ │ ├── ConversationHistoryManager.java # 对话历史管理
|
|
|
|
|
|
│ │ ├── SessionManager.java # 会话管理
|
2026-03-23 19:22:35 +08:00
|
|
|
|
│ │ └── InventorySalesAnalyzer.java # 库存销售分析(本地规则报告)
|
2026-03-11 13:06:10 +08:00
|
|
|
|
│ ├── feign/
|
|
|
|
|
|
│ │ ├── OpenApiService.java # 内部API调用
|
|
|
|
|
|
│ │ └── EchoService.java
|
|
|
|
|
|
│ └── config/
|
|
|
|
|
|
│ └── MybatisPlusConfig.java
|
|
|
|
|
|
└── src/main/resources/
|
|
|
|
|
|
├── application.yml # 配置文件
|
|
|
|
|
|
└── page-rules.md # 页面跳转规则
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 三、核心业务逻辑
|
|
|
|
|
|
|
|
|
|
|
|
#### 1. SseController (SseController.java:30-240)
|
|
|
|
|
|
|
|
|
|
|
|
**职责:** 处理前端 SSE 实时通信
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
客户端连接 → 鉴权 → 创建会话 → 心跳保活 → AI处理 → 返回响应
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**关键接口:**
|
|
|
|
|
|
- `GET /sse/connect` - 建立 SSE 连接
|
|
|
|
|
|
- `GET /sse/send` - 发送消息并获取 AI 回复
|
|
|
|
|
|
- `GET /sse/disconnect` - 断开连接
|
|
|
|
|
|
- `GET /sse/history` - 获取对话历史
|
|
|
|
|
|
- `GET /sse/status` - 获取服务状态
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
#### 2. AiService (AiService.java:24-302)
|
|
|
|
|
|
|
|
|
|
|
|
**职责:** AI 消息处理核心服务
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
用户消息 → 页面规则匹配 → 上下文增强 → 模型调用 → 返回响应
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**核心流程:**
|
|
|
|
|
|
|
|
|
|
|
|
1. **页面规则匹配** (`checkPageRules`)
|
|
|
|
|
|
- 从 `page-rules.md` 加载规则
|
|
|
|
|
|
- 匹配关键词 → 返回导航指令 JSON
|
|
|
|
|
|
|
|
|
|
|
|
2. **上下文增强**
|
|
|
|
|
|
- 将"今天"替换为实际日期
|
|
|
|
|
|
- 限制历史上下文最长 2000 字符
|
|
|
|
|
|
|
|
|
|
|
|
3. **模型选择**
|
2026-03-23 19:22:35 +08:00
|
|
|
|
- 仅支持 **Ollama 本地模型**(`deepseek` 前缀会提示已移除云端能力)
|
2026-03-11 13:06:10 +08:00
|
|
|
|
|
|
|
|
|
|
4. **Tool 集成**
|
|
|
|
|
|
- 绑定 `OrderToolService` 提供订单查询能力
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
#### 3. OrderToolService (OrderToolService.java:11-115)
|
|
|
|
|
|
|
|
|
|
|
|
**职责:** AI 可调用的订单查询工具
|
|
|
|
|
|
|
|
|
|
|
|
| 方法 | 功能 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| `getOrderById` | 按订单号查询 |
|
|
|
|
|
|
| `getAllOrders` | 获取所有订单 |
|
|
|
|
|
|
| `getOrdersByStatus` | 按状态查询 |
|
|
|
|
|
|
| `getPendingOrders` | 待发货订单 |
|
|
|
|
|
|
| `getOrdersByDate` | 按日期查询 |
|
|
|
|
|
|
|
|
|
|
|
|
使用 `@Tool` 注解声明为 LangChain4J 工具
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
#### 4. ConversationHistoryManager (ConversationHistoryManager.java:17-145)
|
|
|
|
|
|
|
|
|
|
|
|
**职责:** 对话历史持久化管理
|
|
|
|
|
|
|
|
|
|
|
|
- 依赖 `IAiConversationHistoryService` 存储到数据库
|
|
|
|
|
|
- 支持获取历史、获取最近N条、清空历史
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
#### 5. SessionManager (SessionManager.java:16-101)
|
|
|
|
|
|
|
|
|
|
|
|
**职责:** 用户会话管理
|
|
|
|
|
|
|
|
|
|
|
|
- 内存缓存 + 数据库持久化
|
|
|
|
|
|
- `userId ↔ sessionId` 双向映射
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-03-23 19:22:35 +08:00
|
|
|
|
#### 6. InventorySalesAnalyzer
|
2026-03-11 13:06:10 +08:00
|
|
|
|
|
2026-03-23 19:22:35 +08:00
|
|
|
|
**职责:** 库存销售分析(独立工具类 / 示例 `main`)
|
2026-03-11 13:06:10 +08:00
|
|
|
|
|
|
|
|
|
|
- 解析库存和销售 JSON 数据
|
|
|
|
|
|
- 计算关键指标:日均销量、可售天数、库存状态
|
2026-03-23 19:22:35 +08:00
|
|
|
|
- **本地规则**生成 Markdown 式报告(不调用外部大模型)
|
2026-03-11 13:06:10 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 四、数据流图
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
┌─────────────┐ SSE ┌──────────────────┐
|
|
|
|
|
|
│ 前端 Vue │ ──────────→ │ SseController │
|
|
|
|
|
|
└─────────────┘ └────────┬─────────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌────────────────┼────────────────┐
|
|
|
|
|
|
▼ ▼ ▼
|
|
|
|
|
|
┌──────────────┐ ┌─────────────┐ ┌──────────────┐
|
|
|
|
|
|
│ SessionManager│ │Conversation │ │ AiService │
|
|
|
|
|
|
│ │ │ HistoryMgr │ │ │
|
|
|
|
|
|
└──────────────┘ └─────────────┘ └──────┬───────┘
|
|
|
|
|
|
│
|
|
|
|
|
|
┌──────────────────┼──────────────────┐
|
|
|
|
|
|
▼ ▼ ▼
|
|
|
|
|
|
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
|
|
|
|
|
|
│ PageRules │ │OrderToolSvc │ │ LLM Model │
|
2026-03-23 19:22:35 +08:00
|
|
|
|
│ (页面导航) │ │ (订单查询) │ │ (Ollama) │
|
2026-03-11 13:06:10 +08:00
|
|
|
|
└─────────────┘ └──────────────┘ └─────────────┘
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 五、配置说明 (application.yml)
|
|
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
server.port: 8084 # AI服务端口
|
|
|
|
|
|
spring.datasource: MySQL连接配置
|
|
|
|
|
|
spring.data.redis: Redis连接配置
|
2026-03-23 19:22:35 +08:00
|
|
|
|
# 大模型:本机 Ollama(默认 http://localhost:11434),无云端 API 配置项
|
2026-03-11 13:06:10 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### 六、待优化点
|
|
|
|
|
|
|
|
|
|
|
|
1. **OrderService.java** - 目前使用模拟数据,需对接真实 ERP 订单数据
|
2026-03-23 19:22:35 +08:00
|
|
|
|
2. **SessionManager** - 内存缓存无持久化,重启丢失
|
|
|
|
|
|
3. **错误处理** - AI 服务调用失败时需更完善的降级策略
|