# AITest **Repository Path**: Luoyi_good/aitest ## Basic Information - **Project Name**: AITest - **Description**: 使用SpringAI框架进行实现聊天记忆、会话隔离、多模型切换、MCP和RAG等常见功能,功能会不定时更新 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-06-24 - **Last Updated**: 2026-02-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring AI 多模型聊天系统 ## 项目简介 这是一个基于 Spring Boot 和 Spring AI 框架开发的多模型AI对话系统,支持多种AI模型(DeepSeek、Ollama)集成、会话记忆管理、向量数据库检索增强(RAG)、MCP(Model Context Protocol)工具调用以及Spring Security权限控制。 ## 技术栈 - **Spring Boot 3.4.5** - **Spring AI 1.0.0** - **Java 21** - **MySQL 8.0.28** - 会话记忆持久化 - **Redis** - 会话记忆缓存 - **Spring Security** - 安全认证和权限控制 - **Maven** - 项目构建工具 ## 主要功能 ### 1. 多模型支持 - ✅ **DeepSeek Chat Model** - 在线AI模型 - ✅ **Ollama (Qwen3:1.7b)** - 本地部署AI模型 - ✅ 支持模型动态切换 ### 2. 会话记忆管理 提供三种会话记忆存储方式,可通过 Spring Profile 灵活切换: - **InMemory(内存模式)** - `profile: inmemory` - 适合开发测试 - 数据不持久化 - 最大会话次数:16轮 - **JDBC(数据库模式)** - `profile: jdbc` - 使用MySQL持久化存储 - 支持会话历史查询 - 自动初始化数据库schema - **Redis(缓存模式)** - `profile: redis` - 高性能缓存存储 - 支持分布式部署 - 自定义实现RedisChatMemory ### 3. RAG(检索增强生成) - 📄 支持文档读取(PDF、Word、Excel等) - 🔍 使用 Tika Document Reader 解析文档 - 🧮 Ollama Embedding Model 进行文本向量化 - 💾 SimpleVectorStore 向量存储 - 🎯 QuestionAnswerAdvisor 智能问答增强 ### 4. MCP(模型上下文协议)工具调用 - 🔧 支持 SSE 和 Stdio 两种连接方式 - 🗺️ 集成高德地图 MCP 服务 - ⚙️ 自动工具回调注册 - ⏱️ 异步处理,请求超时:80秒 ### 5. 自定义工具集成 **UserTool** - 用户信息管理工具: - 获取所有用户信息(仅管理员) - 根据姓名查询用户 - 新增用户(仅管理员) - 基于角色的权限控制 ### 6. Spring Security 权限控制 内置用户: - **普通用户**:`user / user123` (角色: USER) - **管理员**:`admin / admin123` (角色: ADMIN, USER) 受保护的路径: - `/` - 主页 - `/index.html` - 聊天界面 - `/chat` - 对话接口 - `/chatlist` - 会话列表 - `/chatmes/**` - 聊天记录 ### 7. Web界面 - 💬 现代化的聊天UI界面 - 📱 响应式设计,支持移动端 - 🔄 流式响应显示 - 📋 会话列表管理 ## 项目结构 ``` AITest/ ├── src/main/ │ ├── java/com/Luoyi/ │ │ ├── AIApplication.java # 主启动类 │ │ ├── config/ # 配置类 │ │ │ ├── AIConfig.java # AI模型配置 │ │ │ ├── InMemoryChatMemoryConfig.java # 内存会话记忆配置 │ │ │ ├── JdbcChatMemoryConfig.java # JDBC会话记忆配置 │ │ │ ├── RedisChatMemoryConfig.java # Redis会话记忆配置 │ │ │ └── SecurityConfig.java # Spring Security配置 │ │ ├── AITest/ │ │ │ ├── controller/ │ │ │ │ └── MultiModelsController.java # 对话控制器 │ │ │ ├── server/ │ │ │ │ ├── IChatService.java # 聊天服务接口 │ │ │ │ └── impl/ │ │ │ │ └── ChatServiceImpl.java # 聊天服务实现 │ │ │ ├── tools/ │ │ │ │ └── UserTool.java # 用户工具 │ │ │ ├── entiy/ │ │ │ │ ├── User.java # 用户实体 │ │ │ │ └── Msg.java # 消息实体 │ │ │ ├── embadding/ │ │ │ │ └── EmbaddingTest.java # 向量化测试 │ │ │ └── ChatMemoryTest.java # 会话记忆测试 │ │ ├── Models/ # 模型测试示例 │ │ │ ├── ChatClientUse/ │ │ │ │ └── ChatClientTest.java │ │ │ ├── DeepSeekDemo/ │ │ │ │ └── DeepseekTest.java │ │ │ └── OllamaDemo/ │ │ │ └── OllamaTest.java │ │ └── repository/ │ │ └── RedisChatMemory.java # Redis会话记忆实现 │ └── resources/ │ ├── application.yml # 应用配置文件 │ ├── mcp-servers-config.json # MCP服务配置 │ ├── schema-mysql.sql # MySQL数据库脚本 │ └── static/ │ └── index.html # 前端聊天界面 └── pom.xml # Maven配置文件 ``` ## 快速开始 ### 环境要求 - JDK 21+ - Maven 3.6+ - MySQL 8.0+(可选,使用JDBC模式时需要) - Redis(可选,使用Redis模式时需要) - Ollama(可选,使用本地模型时需要) ### 安装步骤 #### 1. 克隆项目 ```bash git clone cd AITest ``` #### 2. 配置数据库(使用JDBC模式) ```sql -- 创建数据库 CREATE DATABASE ai_chat CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 执行 schema-mysql.sql 初始化表结构(自动执行) ``` #### 3. 配置 application.yml ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/ai_chat username: root password: your_password ai: deepseek: api-key: your_deepseek_api_key ollama: base-url: http://localhost:11434 chat: model: qwen3:1.7b embedding: model: qwen3-embedding:4b data: redis: host: localhost port: 6379 ``` #### 4. 启动 Ollama(使用本地模型) ```bash # 安装并启动 Ollama ollama serve # 拉取模型 ollama pull qwen3:1.7b ollama pull qwen3-embedding:4b ``` #### 5. 构建并运行 ```bash mvn clean install mvn spring-boot:run ``` 或者直接运行主类: ```bash java -jar target/AITest-1.0-SNAPSHOT.jar ``` #### 6. 访问应用 打开浏览器访问: ``` http://localhost:8080 ``` 默认登录账号: - 管理员:`admin / admin123` - 普通用户:`user / user123` ## API接口 ### 1. 对话接口 ``` GET /chat?message={message}&model={model}&conversationId={conversationId} ``` **参数**: - `message` - 用户消息内容 - `model` - 模型选择 (deepseek/ollama) - `conversationId` - 会话ID **响应**:流式文本响应(Server-Sent Events) ### 2. 获取会话列表 ``` GET /chatlist ``` **响应**:JSON数组,返回所有会话ID ### 3. 获取会话消息 ``` GET /chatmes/{conversationId} ``` **参数**: - `conversationId` - 会话ID **响应**:JSON数组,返回该会话的所有消息记录 ## 核心配置说明 ### 1. ChatClient 配置 ```java @Bean public ChatClient deepseek(ToolCallbackProvider toolCallbackProvider) { return ChatClient.builder(deepSeekChatModel) .defaultToolCallbacks(toolCallbackProvider.getToolCallbacks()) // MCP工具 .defaultAdvisors(new SimpleLoggerAdvisor()) // 日志记录 .defaultAdvisors(PromptChatMemoryAdvisor.builder(chatMemory).build()) // 会话记忆 .defaultTools(userTool) // 自定义工具 .build(); } ``` ### 2. 会话记忆配置 ```java @Bean public ChatMemory chatMemory(ChatMemoryRepository chatMemoryRepository) { return MessageWindowChatMemory.builder() .chatMemoryRepository(chatMemoryRepository) .maxMessages(16) // 最大保留16轮对话 .build(); } ``` ### 3. 向量存储配置 ```java @Bean public VectorStore vectorStore(EmbeddingModel embeddingModel) { return SimpleVectorStore.builder(embeddingModel).build(); } ``` ## 测试用例 ### 1. 会话记忆测试 ```bash mvn test -Dtest=ChatMemoryTest#testChatOptions ``` ### 2. 会话隔离测试 ```bash mvn test -Dtest=ChatMemoryTest#testChatOptions1 ``` ### 3. 向量化测试 ```bash mvn test -Dtest=EmbaddingTest#testEmbadding ``` ### 4. RAG问答测试 ```bash mvn test -Dtest=EmbaddingTest#chatRagTest ``` ## 权限说明 ### 用户工具权限要求 | 功能 | 方法 | 权限要求 | |------|------|----------| | 获取所有用户 | `getUserMessages()` | ADMIN | | 查询指定用户 | `getUserMessagesByName()` | USER 或 ADMIN | | 新增用户 | `addUser()` | ADMIN | ## 常见问题 ### Q1: 如何切换会话记忆模式? A: 在 `application.yml` 中设置: ```yaml spring: profiles: active: inmemory # 可选: inmemory, jdbc, redis ``` ### Q2: DeepSeek API 如何获取? A: 访问 [DeepSeek官网](https://platform.deepseek.com/) 注册并获取API密钥 ### Q3: Ollama 本地模型如何安装? A: ```bash # 安装 Ollama curl -fsSL https://ollama.ai/install.sh | sh # 拉取模型 ollama pull qwen3:1.7b ``` ### Q4: 如何自定义工具? A: 参考 `UserTool.java`,使用 `@Tool` 和 `@ToolParam` 注解: ```java @Tool(description = "工具描述") public String myTool(@ToolParam(description = "参数描述") String param) { // 工具实现 } ``` ## 开发路线 - [x] 多模型集成(DeepSeek、Ollama) - [x] 多种会话记忆模式 - [x] RAG检索增强 - [x] MCP工具调用 - [x] Spring Security权限控制 - [x] Web聊天界面 - [ ] 对话导出功能 - [ ] 更多向量数据库支持(Pinecone、Weaviate等) - [ ] 语音对话支持 - [ ] 图片生成集成 ## 贡献 欢迎提交 Issue 和 Pull Request! ## 许可证 本项目采用 MIT 许可证 ## 作者 **Luoyi** ## 联系方式 如有问题,欢迎通过以下方式联系: - 提交 GitHub Issue - 发送邮件至:[19847534107@163.com] --- ⭐ 如果这个项目对你有帮助,请给一个 Star 支持一下!