# AI模块 (ruoyi-ai) ## 模块简介 `ruoyi-ai` 是 PoJie 项目的 AI 服务中心模块,提供统一的 AI 能力接入,标准化接入主流模型与平台,支持聊天、流式对话、AI创作、智能PPT、多模态理解、代码助手、RAG增强与统一监控等功能。 ## 功能特性 ### 1. Provider 管理与编排 ✅ - ✅ 统一接口:`AiProviderManager` 管理所有模型提供商,支持热切换 - ✅ 智能路由:`AiOrchestrationEngine` 支持最快响应、最佳质量、成本最优、负载均衡等策略 - ✅ 自动降级:错误率>30%或响应超时自动熔断与故障转移 - ✅ 多模型接入:统一调度 OpenAI、Azure、ChatGLM、通义千问、智谱等主流模型 ### 2. 聊天与流式交互 ✅ - ✅ 同步/异步聊天 - ✅ SSE 流式推送 - ✅ WebSocket 实时通道 (`/ws/ai/chat`) - ✅ 聊天历史管理:自动保存聊天记录到Redis,支持历史查询、清除和会话统计 ### 3. AI 辅助编码 ✅ - ✅ 代码分析:提供代码审查与重构建议 - ✅ 脚手架生成:自动生成项目结构与配置 ### 4. Simple AI & RAG ✅ - ✅ 知识库问答:基于知识库的精准问答 - ✅ 向量检索:支持多模型向量相似度搜索 ### 5. AI 创作与多模态 ✅ - ✅ 绘画调度:统一管理 DALL·E-3、MidJourney、Stable Diffusion 任务 - ✅ 智能 PPT:文本生成 PPTX,支持导出图片序列 - ✅ 多模态:文件解析(PDF/Word)、OCR识别、图像理解 ### 6. 平台集成 ✅ - ✅ FastGPT:深度对接 FastGPT 平台 - ✅ Coze:深度对接 Coze 平台(SSE流式) - ✅ DIFY:深度对接 DIFY 平台 ### 7. MCP 生态 ✅ - ✅ 工具注册:`McpToolRegistry` 支持动态工具加载与调用 - ✅ 工具模板:提供多个内置工具(ProjectScaffold、DataTransform、ApiCall、AlgorithmCompute、FileParse、HttpFetch) ### 8. 安全与监控 ✅ - ✅ 安全卫士:`AiSecurityManager` 提供内容过滤、IP黑白名单、速率限制 - ✅ 全链路监控:实时监控队列深度、模型健康度、响应时间与 Token 消耗 - ✅ 使用统计:记录和统计AI使用情况 ## 数据库表 - `ai_provider_config` - AI Provider配置表 - `ai_provider_config_history` - AI Provider配置历史表 - `ai_chat_record` - AI聊天记录表 - `ai_usage_stats` - AI使用统计表 - `ai_rating_record` - AI评价记录表 详细表结构请参考:`script/sql/ry_ai.sql` ## 模块结构 ``` org.dromara.ai ├── config/ # 模块配置类 │ ├── AiAutoConfiguration.java │ ├── AiGatewayProperties.java │ ├── AiProviderRegistrar.java │ └── *ProviderConfig.java (各Provider配置) ├── controller/ # REST API控制器 │ ├── admin/ # 管理端接口 │ │ ├── AdminAiChatRecordController.java # 聊天记录管理接口 │ │ ├── AdminAiUsageStatsController.java # 使用统计管理接口 │ │ ├── AdminAiProviderController.java # Provider管理接口 │ │ └── AdminSysModelController.java # 系统模型管理接口 │ └── app/ # 用户端接口 │ ├── AiChatController.java # 聊天接口 │ ├── AiAssistantController.java # 代码助手接口 │ ├── AiPaintingController.java # 绘画接口 │ ├── AiImageController.java # DALL·E-3接口 │ ├── PptController.java # PPT生成接口 │ ├── MultimodalController.java # 多模态接口 │ ├── SimpleAiController.java # Simple AI接口 │ ├── FastGptController.java # FastGPT接口 │ ├── CozeController.java # Coze接口 │ ├── DifyController.java # DIFY接口 │ ├── McpController.java # MCP工具接口 │ └── QueueMetricsController.java # 队列指标接口 ├── domain/ # 数据传输对象 (DTO) 与枚举 │ ├── dto/ │ └── enums/ │ └── AiProviderType.java ├── provider/ # 模型 Provider 实现 │ ├── AiProvider.java │ ├── AiProviderManager.java │ ├── OpenAiProvider.java │ ├── AzureOpenAiProvider.java │ ├── QwenProvider.java │ ├── ZhipuAiProvider.java │ └── *Provider.java ├── service/ # 核心业务服务 │ ├── AiChatService.java │ ├── AiChatHistoryService.java │ ├── AiCodingAssistantService.java │ ├── AiModelService.java │ ├── AiPaintingService.java │ └── SimpleAiService.java ├── orchestration/ # AI 编排引擎 │ └── AiOrchestrationEngine.java ├── painting/ # 绘画服务与 Provider │ ├── PaintingEngineType.java │ ├── PaintingTask.java │ ├── PaintingStatus.java │ └── provider/ ├── platform/ # 外部平台集成 │ ├── FastGptService.java │ ├── CozeService.java │ └── DifyClientService.java ├── mcp/ # MCP 工具链与集成 │ ├── McpToolRegistry.java │ ├── McpTool.java │ └── tools/ ├── queue/ # 任务队列服务 │ └── TaskQueueService.java ├── security/ # 安全管理器 │ ├── AiSecurityManager.java │ ├── AiContentFilterService.java │ └── AiAccessControlService.java ├── monitor/ # 监控指标与度量 │ ├── AiMonitorService.java │ └── *Metrics.java ├── websocket/ # WebSocket 处理器 │ ├── ChatWebSocketConfig.java │ └── ChatWebSocketHandler.java └── error/ # 全局异常处理 └── AiErrorHandler.java ``` ## 配置说明 在 `application.yml` 中添加以下配置: ```yaml ai: gateway: enabled: true auth-required: true base-path: /api/ai provider: timeout-ms: 60000 retry: 1 ruoyi: ai: enabled: true external-ai: openai: base-url: https://api.openai.com api-key: sk-xxxx azure-openai: endpoint: https://your-endpoint.openai.azure.com api-key: your-api-key api-version: 2023-12-01-preview qwen: base-url: https://dashscope.aliyuncs.com/api/v1 api-key: sk-xxxx zhipu: base-url: https://open.bigmodel.cn/api/paas/v4 api-key: sk-xxxx sd: base-url: http://localhost:7860 midjourney: base-url: https://mj.example.com token: mj-xxxx ocr: base-url: https://ocr.example.com platform: fastgpt: base-url: https://fastgpt.example.com token: fgpt-xxxx coze: base-url: https://coze.example.com token: coze-xxxx dify: base-url: https://dify.example.com token: dify-xxxx ``` ## API接口 ### 聊天接口 (`/ai/chat`) #### 同步聊天 - `POST /ai/chat/sync` - 同步聊天(返回完整响应) #### 异步聊天 - `POST /ai/chat/async` - 异步聊天(返回任务ID) #### 流式聊天 - `POST /ai/chat/stream` - SSE流式聊天 - `POST /ai/chat/stream-chunks` - 流式聊天(分块返回) #### 批量聊天 - `POST /ai/chat/batch` - 批量聊天请求 #### 聊天历史 - `GET /ai/chat/history/{sessionId}` - 获取聊天历史 - `DELETE /ai/chat/history/{sessionId}` - 清除聊天历史 #### 会话统计 - `GET /ai/chat/stats/{sessionId}` - 获取会话统计 ### AI代码助手接口 (`/ai/assistant`) - `POST /ai/assistant/analyze` - 代码分析 - `POST /ai/assistant/scaffold` - 生成项目脚手架 ### Provider管理接口 (`/ai/provider`) - `GET /ai/provider/list` - 列出所有Provider - `GET /ai/provider/models` - 列出所有模型 - `GET /ai/provider/default` - 获取默认Provider - `POST /ai/provider/setDefault` - 设置默认Provider - `GET /ai/provider/stats/system` - 系统统计 - `GET /ai/provider/stats/providers` - Provider统计 - `POST /ai/provider/stats/reset` - 重置统计 ### Simple AI接口 (`/ai`) - `POST /ai/ask` - 知识库问答 - `POST /ai/search` - 向量搜索 - `GET /ai/stats/{knowledgeId}` - 知识库统计 - `GET /ai/model/check/{modelName}` - 检查模型可用性 - `GET /ai/models` - 获取可用模型列表 - `GET /ai/health` - 健康检查 ### 绘画接口 (`/ai/painting`) - `POST /ai/painting/task` - 创建绘画任务 - `GET /ai/painting/status/{taskId}` - 查询任务状态 - `GET /ai/painting/stream/{taskId}` - SSE流式获取任务进度 ### DALL·E-3接口 - `POST /dall3` - 文生图 - `POST /dall3/edit` - 图片编辑(image+mask) - `POST /dall3/variations` - 图片变体 ### 智能PPT接口 (`/ppt`) - `POST /ppt/generate` - 生成PPTX文件 - `POST /ppt/export/pngs` - 导出PNG序列 ### 多模态接口 (`/multimodal`) - `POST /multimodal/extract` - 文件解析(PDF/Word等) - `POST /multimodal/ocr` - OCR识别 - `POST /multimodal/analyze/text` - 文本分析 - `POST /multimodal/analyze/image` - 图像识别(占位) - `POST /multimodal/caption` - 图生文(占位) ### 平台集成接口 #### FastGPT (`/ai/fastgpt`) - `POST /ai/fastgpt/knowledge/search` - 知识搜索 - `POST /ai/fastgpt/workflow/run` - 运行工作流 - `GET /ai/fastgpt/context/{sessionId}` - 获取上下文 #### Coze (`/ai/coze`) - `POST /ai/coze/stream` - SSE流式对话 #### DIFY (`/ai/dify`) - `GET /ai/dify/apps` - 获取应用列表 - `POST /ai/dify/apps` - 创建/更新应用 ### MCP工具接口 (`/ai/mcp`) - `GET /ai/mcp/tools` - 获取工具列表 - `POST /ai/mcp/invoke/{name}` - 调用工具 ### 队列指标接口 (`/ai/queue`) - `GET /ai/queue/metrics` - 获取队列指标 ## WebSocket实时通道 ### 聊天WebSocket - **端点**: `ws://localhost:8080/ws/ai/chat` - **协议**: JSON格式 `AiChatRequest`,支持实时双向对话 ## 依赖模块 - `ruoyi-common-core` - 通用核心工具 - `ruoyi-common-web` - Web通用组件 - `ruoyi-common-redis` - Redis缓存 - `ruoyi-common-security` - 安全组件 - `ruoyi-common-log` - 日志组件 - `ruoyi-common-mybatis` - MyBatis组件 - `ruoyi-knowledge` - 知识库模块(RAG增强,可选) ## 使用示例 ### 1. 聊天与流式对话 ```bash # 同步聊天 curl -X POST http://localhost:8080/api/ai/chat/sync \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"model":"gpt-4o","messages":[{"role":"user","content":"你好"}],"sessionId":"session_123"}' # 流式聊天 curl -X POST http://localhost:8080/api/ai/chat/stream \ -H "Authorization: Bearer " \ -d '{"model":"gpt-4o","messages":[{"role":"user","content":"你好"}],"stream":true,"sessionId":"session_123"}' # 获取聊天历史 curl -X GET "http://localhost:8080/api/ai/chat/history/session_123?limit=50" \ -H "Authorization: Bearer " ``` ### 2. AI代码助手 ```bash # 代码分析 curl -X POST http://localhost:8080/api/ai/assistant/analyze \ -d 'code=public void test(){...}&model=gpt-4' # 生成脚手架 curl -X POST http://localhost:8080/api/ai/assistant/scaffold \ -d 'appType=SpringBoot&options={"db":"mysql"}' ``` ### 3. Simple AI (RAG) ```bash # 知识库问答 curl -X POST "http://localhost:8080/api/ai/ask?knowledgeId=kb_123&question=合同流程是怎样的" # 向量搜索 curl -X POST "http://localhost:8080/api/ai/search?knowledgeId=kb_123&queryText=条款&topK=3" ``` ### 4. AI绘画任务 ```bash # 创建绘画任务 curl -X POST http://localhost:8080/api/ai/painting/task \ -H "Content-Type: application/json" \ -d '{"engine":"DALL_E_3","prompt":"未来城市","params":{"size":"1024x1024"}}' # 查询任务状态 curl http://localhost:8080/api/ai/painting/status/{taskId} ``` ### 5. 智能PPT生成 ```bash curl -X POST "http://localhost:8080/api/ai/ppt/generate?content=第一页标题\n内容1\n第二页标题\n内容2" ``` ### 6. MCP工具调用 ```bash curl -X POST http://localhost:8080/api/ai/mcp/invoke/api_call \ -H "Content-Type: application/json" \ -d '{"url":"https://httpbin.org/get"}' ``` ## 安全与合规 `AiSecurityManager` 默认开启,提供以下保护: - **API密钥验证**:校验请求中的 `apiKey` - **IP访问控制**:基于策略拦截非法IP - **内容过滤**:输入/输出双向敏感词过滤(Moderate策略) - **资源限额**:基于Token数与模型复杂度的动态配额扣除 - **速率限制**:防止API滥用 ## 监控与统计 ### 监控指标 - 队列深度监控 - 模型健康度监控 - 响应时间监控 - Token消耗监控 - 错误率监控 ### 使用统计 - 用户使用统计(按用户、Provider、模型) - 请求次数统计 - 成功率统计 - 成本统计 ## 注意事项 1. **密钥安全**:生产环境务必通过环境变量注入 API Key,不要将密钥写入配置文件 2. **流式代理**:Nginx/Gateway 需配置 `proxy_buffering off` 以支持 SSE 3. **依赖服务**:Redis 必须可用,用于存储任务状态与缓存 4. **性能优化**:建议对热点数据使用Redis缓存 5. **错误处理**:模块提供自动降级和熔断机制,但建议监控错误率 6. **并发控制**:Provider支持最大并发数配置,合理设置以避免资源耗尽 ## 扩展开发 ### 添加新的Provider 1. 实现 `AiProvider` 接口 2. 创建对应的配置类(如 `XxxProviderConfig.java`) 3. 在 `AiProviderRegistrar` 中注册Provider 4. 在 `AiProviderType` 枚举中添加新的Provider类型 ### 添加新的MCP工具 1. 实现 `McpTool` 接口 2. 在 `AiProviderRegistrar` 中注册工具 3. 工具会自动出现在工具列表中 ## 相关文档 - [API详细文档](docs/API.md) - [配置说明](docs/CONFIG.md) - [集成指南](docs/INTEGRATION.md) - [AI创作系统开发指南](#ruoyi-ai-创作系统开发指南) --- # RuoYi-AI 创作系统开发指南 本指南介绍 `ruoyi-ai` 模块中的 AI 创作能力,包括绘画引擎接入、智能 PPT 生成、多模态内容理解,以及统一的任务流与接口规范。 > 该文档同时覆盖平台深度集成(FastGPT/Coze/DIFY)、MCP生态扩展、RAG增强、队列与长任务监控、质量与性能保障等内容,便于端到端落地与运维。 ## 模块概览 ### 绘画引擎集成(DALL·E-3 / MidJourney / Stable Diffusion) - 统一引擎枚举:`painting/PaintingEngineType.java` - 任务模型:`painting/PaintingTask.java` - 任务状态:`painting/PaintingStatus.java` - 引擎适配: - DALL·E-3:`painting/provider/DallE3Provider.java` - MidJourney:`painting/provider/MidJourneyProvider.java` - Stable Diffusion:`painting/provider/StableDiffusionProvider.java` - 统一服务:`service/AiPaintingService.java` - 控制器:`controller/AiPaintingController.java` ### 智能 PPT 生成 - 控制器:`controller/PptController.java` - 能力:按文本生成 PPTX、导出每页 PNG 序列、主题占位与扩展点 ### 多模态内容理解 - 控制器:`controller/MultimodalController.java` - 能力:文件解析(Tika)、文本分析、OCR占位、图像识别占位、图生文占位 ### DALL·E-3 扩展 - 控制器:`controller/AiImageController.java` - 能力:文生图、编辑(image+mask)、变体(variations) ### 平台接入与统一API - FastGPT:服务 `platform/FastGptService.java`,接口 `controller/FastGptController.java` - Coze:服务 `platform/CozeService.java`,接口 `controller/CozeController.java`(SSE流式) - DIFY:服务 `platform/DifyClientService.java`,接口 `controller/DifyController.java` ### MCP生态扩展 - 工具注册:`mcp/McpToolRegistry.java`(动态加载/版本管理/热重载) - 工具模板:`mcp/tools/*.java`(≥5个:ProjectScaffold/DataTransform/ApiCall/AlgorithmCompute/FileParse/HttpFetch) - 控制器:`controller/McpController.java`(工具列表与调用) ### 统一模型调度与降级 - 管理器:`provider/AiProviderManager.java`(模型优先→性能优选→近似轮询、自动降级) - 管理接口:`controller/admin/AdminAiProviderController.java`(列表/模型/默认/统计) ### 队列与长任务 - 服务:`queue/TaskQueueService.java`(优先级队列、任务状态与指标) - 指标接口:`controller/QueueMetricsController.java` ## 配置项 ### OpenAI - `ruoyi.ai.external-ai.openai.base-url`(默认 `https://api.openai.com`) - `ruoyi.ai.external-ai.openai.api-key` ### Azure OpenAI - `ruoyi.ai.external-ai.azure-openai.endpoint` - `ruoyi.ai.external-ai.azure-openai.api-key` - `ruoyi.ai.external-ai.azure-openai.api-version` ### MidJourney - `ruoyi.ai.external-ai.midjourney.base-url` - `ruoyi.ai.external-ai.midjourney.token` ### Stable Diffusion - `ruoyi.ai.external-ai.sd.base-url`(例如 `http://localhost:7860`) ### OCR - `ruoyi.ai.ocr.base-url` ### 平台 - `ruoyi.ai.platform.fastgpt.base-url`、`ruoyi.ai.platform.fastgpt.token` - `ruoyi.ai.platform.coze.base-url`、`ruoyi.ai.platform.coze.token` - `ruoyi.ai.platform.dify.base-url`、`ruoyi.ai.platform.dify.token` ## API 速览 ### 绘画任务统一接口(REST + SSE) - 创建任务:`POST /ai/painting/task` - body:`{"engine":"DALL_E_3","prompt":"海边日落","params":{"size":"1024x1024"}}` - 返回:`{"taskId":"..."}`(任务 ID) - 查询状态:`GET /ai/painting/status/{taskId}` - 进度流:`GET /ai/painting/stream/{taskId}`(SSE,[DONE] 结束) ### DALL·E-3 - 文生图:`POST /dall3`(`prompt`,`size`) - 编辑:`POST /dall3/edit`(`prompt`,`size`,`image`,`mask?`) - 变体:`POST /dall3/variations`(`size`,`image`) ### 智能 PPT - 生成 PPTX:`POST /ppt/generate`(按行拆分内容为多页) - 导出 PNG 序列:`POST /ppt/export/pngs`(返回 `data:image/png;base64,...` 列表) ### 多模态 - 文件解析:`POST /multimodal/extract`(`multipart/form-data:file`) - OCR识别:`POST /multimodal/ocr`(需配置 OCR 服务) - 文本分析:`POST /multimodal/analyze/text`(返回 `title/summary/keywords`) - 图像识别占位:`POST /multimodal/analyze/image` - 图生文占位:`POST /multimodal/caption` ## 流式与实时 - **SSE**:`/ai/painting/stream/{taskId}` 推送任务状态与进度;统一以 `[DONE]` 结束 - **WebSocket**:模块已提供聊天通道 `ws/ai/chat`;如需绘画通道,可参考该模式新增 `/ws/ai/painting` ## 任务与历史 - 任务创建后进入线程池异步执行,状态与结果存储于 Redis:键 `ai:painting:task:{taskId}` - 可基于该结构扩展作品历史管理、检索与归档 ## 扩展建议 - **引擎负载均衡**:为 Provider 增加实例列表与健康检查,依据权重分配 - **任务队列**:接入消息队列(如 Kafka/RabbitMQ)实现更大的并发与可靠性 - **权限与用量**:接入 `sa-token` 与用量计费,限制频率与配额 - **监控与审计**:统一接入日志、指标与告警,便于运维与合规 - **RAG增强**:在 `ruoyi-knowledge` 实现 `VectorDbClient` 接入层(Milvus/Weaviate/Qdrant),集成 BGE-large-zh-v1.5 批量嵌入与缓存,混合检索(关键词+向量)召回≥90% - **队列看板**:在管理端提供队列深度/处理速率可视化与失败重试控制 ## 测试与质量 - **单元测试**:建议使用 MockWebServer 模拟外部 API,覆盖率目标 ≥ 80% - **性能**:核心 API 响应时间 < 500ms(外部调用除外),并发可通过线程池与队列扩展至 1000+ - **压测与限流**:模拟 1000+ 并发,结合令牌桶限流,P99 延迟控制在 2s 以内 - **可用性**:关键服务可用性目标 ≥ 99.9%,结合自动降级与熔断策略