## api/ai-agent 目录代码结构分析 ### 一、模块概述 ai-agent 是一个基于 **LangChain4J** 的 AI 智能助手模块,用于实现对话式电商管理功能。 **核心技术栈:** - LangChain4J (AI 框架) - Ollama (本地大模型) - 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 # 会话管理 │ │ └── InventorySalesAnalyzer.java # 库存销售分析(本地规则报告) │ ├── 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. **模型选择** - 仅支持 **Ollama 本地模型**(`deepseek` 前缀会提示已移除云端能力) 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` 双向映射 --- #### 6. InventorySalesAnalyzer **职责:** 库存销售分析(独立工具类 / 示例 `main`) - 解析库存和销售 JSON 数据 - 计算关键指标:日均销量、可售天数、库存状态 - **本地规则**生成 Markdown 式报告(不调用外部大模型) --- ### 四、数据流图 ``` ┌─────────────┐ SSE ┌──────────────────┐ │ 前端 Vue │ ──────────→ │ SseController │ └─────────────┘ └────────┬─────────┘ │ ┌────────────────┼────────────────┐ ▼ ▼ ▼ ┌──────────────┐ ┌─────────────┐ ┌──────────────┐ │ SessionManager│ │Conversation │ │ AiService │ │ │ │ HistoryMgr │ │ │ └──────────────┘ └─────────────┘ └──────┬───────┘ │ ┌──────────────────┼──────────────────┐ ▼ ▼ ▼ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │ PageRules │ │OrderToolSvc │ │ LLM Model │ │ (页面导航) │ │ (订单查询) │ │ (Ollama) │ └─────────────┘ └──────────────┘ └─────────────┘ ``` --- ### 五、配置说明 (application.yml) ```yaml server.port: 8084 # AI服务端口 spring.datasource: MySQL连接配置 spring.data.redis: Redis连接配置 # 大模型:本机 Ollama(默认 http://localhost:11434),无云端 API 配置项 ``` --- ### 六、待优化点 1. **OrderService.java** - 目前使用模拟数据,需对接真实 ERP 订单数据 2. **SessionManager** - 内存缓存无持久化,重启丢失 3. **错误处理** - AI 服务调用失败时需更完善的降级策略