# chatDemo **Repository Path**: fengpingy/chat_demo ## Basic Information - **Project Name**: chatDemo - **Description**: 通过Spring AI调用DeepSeek API构建智能问答助手,并通过MyBatis保存到数据库 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-12-17 - **Last Updated**: 2025-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ChatDemo - Spring AI 聊天应用 一个基于 Spring Boot 3 和 Spring AI 框架构建的智能聊天应用,支持多种聊天模式和会话管理功能。 ## 📋 项目简介 ChatDemo 是一个完整的聊天应用解决方案,集成了: - **Spring AI** - 提供 AI 聊天能力 - **DeepSeek API** - 作为 AI 模型提供商 - **MySQL** - 持久化存储聊天记录和会话信息 - **MyBatis Plus** - 数据库操作框架 - **流式响应** - 支持实时流式聊天体验 ## 🛠️ 技术栈 - **Java 17** - **Spring Boot 3.4.2** - **Spring AI 1.0.0-M5** - **MyBatis Plus 3.5.5** - **MySQL 9.1.0** - **Lombok 1.18.30** - **Maven** ## 🚀 快速开始 ### 环境要求 - JDK 17+ - MySQL 8.0+ - Maven 3.6+ ### 1. 克隆项目 ```bash git clone cd chatDemo ``` ### 2. 数据库配置 执行 `chat_demo.sql` 文件创建数据库和表结构: ```sql -- 创建数据库 CREATE DATABASE IF NOT EXISTS `chat_demo` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建聊天消息表 CREATE TABLE `chat_message` ( `message_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '消息ID', `chat_id` varchar(64) NOT NULL COMMENT '会话ID', `role` varchar(16) NOT NULL COMMENT '角色(user/assistant/system)', `content` text COMMENT '消息内容', `created_at` datetime DEFAULT NULL COMMENT '创建时间', PRIMARY KEY (`message_id`) ); -- 创建聊天会话表 CREATE TABLE `chat_session` ( `chat_id` varchar(64) NOT NULL COMMENT '会话ID', `user_id` varchar(64) NOT NULL COMMENT '用户ID', `created_at` datetime DEFAULT NULL COMMENT '创建时间', `last_active` datetime DEFAULT NULL COMMENT '最后活跃时间', `expire_seconds` int(11) DEFAULT NULL COMMENT '过期时间(秒)', PRIMARY KEY (`chat_id`) ); ``` ### 3. 配置环境变量 设置 DeepSeek API 密钥: ```bash export OPENAI_API_KEY=your_deepseek_api_key ``` ### 4. 修改数据库配置 编辑 `src/main/resources/application.yml`: ```yaml spring: datasource: url: jdbc:mysql://localhost:3306/chat_demo?useSSL=false&serverTimezone=Asia/Shanghai username: your_username password: your_password ``` ### 5. 运行应用 ```bash mvn spring-boot:run ``` 应用将在 `http://localhost:8080` 启动。 ## 📚 API 文档 ### 基础聊天接口 #### 1. 简单聊天(无会话记忆) ```http GET /chat/simple0?message=你好 ``` **参数:** - `message` (必需): 用户消息内容 **响应:** 返回 AI 的完整回复 #### 2. 带会话记忆的聊天 ```http GET /chat/simple1?message=你好&chatId=session123 ``` **参数:** - `message` (必需): 用户消息内容 - `chatId` (必需): 会话ID,用于维护上下文记忆 **响应:** 返回 AI 的完整回复(包含历史上下文) ### 流式聊天接口 #### 3. 基础流式聊天 ```http GET /chat/stream?message=请介绍一下Spring Boot ``` **参数:** - `message` (必需): 用户消息内容 **响应:** 返回流式文本响应 #### 4. Server-Sent Events 流式响应 ```http GET /chat/stream/response?message=请介绍一下Spring Boot ``` **参数:** - `message` (必需): 用户消息内容 **响应:** 返回 SSE 格式的流式响应 #### 5. 流式聊天并保存到数据库 ```http GET /chat/stream/sql?message=你好&userId=user123 ``` **参数:** - `message` (必需): 用户消息内容 - `userId` (必需): 用户ID **响应:** 返回 SSE 格式的流式响应,同时将聊天记录保存到数据库 ## 🏗️ 项目结构 ``` src/main/java/src/softproject/chatdemo/ ├── ChatDemoApplication.java # 应用启动类 ├── controller/ │ └── chatController.java # 聊天控制器 ├── entity/ │ ├── ChatMessage.java # 聊天消息实体 │ └── ChatSession.java # 聊天会话实体 ├── mapper/ │ ├── ChatMessageMapper.java # 消息数据访问层 │ └── ChatSessionMapper.java # 会话数据访问层 ├── provider/ │ ├── ChatMessageSqlProvider.java # 消息SQL提供者 │ └── ChatSessionSqlProvider.java # 会话SQL提供者 └── service/ ├── ChatService.java # 聊天服务接口 └── impl/ └── ChatServiceImpl.java # 聊天服务实现 ``` ## ⚙️ 配置说明 ### application.yml 配置 ```yaml spring: ai: openai: api-key: ${OPENAI_API_KEY} # DeepSeek API 密钥 base-url: https://api.deepseek.com # DeepSeek API 地址 chat: options: temperature: 1.3 # 控制输出随机性 model: deepseek-chat # 指定模型 ``` ### 主要特性 - **会话管理**: 自动创建和管理聊天会话 - **消息持久化**: 所有聊天记录保存到数据库 - **上下文记忆**: 支持多轮对话的上下文记忆 - **流式响应**: 提供实时流式聊天体验 - **用户隔离**: 支持多用户聊天记录隔离 ## 🔧 开发说明 ### 添加新的聊天接口 1. 在 `chatController.java` 中添加新的映射方法 2. 根据需要调用 `ChatService` 进行数据操作 3. 配置相应的请求参数和响应格式 ### 自定义 AI 模型参数 在 `chatController` 构造函数中修改 `OpenAiChatOptions` 配置: ```java .defaultOptions( OpenAiChatOptions.builder() .temperature(0.7) // 控制随机性 .topP(0.9) // 控制多样性 .maxTokens(1000) // 最大token数 .build() ) ``` ## 📖 相关资源 - [我的CSDN 博客文章](https://blog.csdn.net/dfraetaem/article/details/148046606) - [Spring AI 官方文档](https://docs.spring.io/spring-ai/reference/) - [DeepSeek API 文档](https://platform.deepseek.com/api-docs/)