Spring AI Demo - 多模型智能聊天应用
这个是我做的一个基于 Spring Boot 3.4.1 和 Spring AI 1.0.0 的智能聊天应用示例,支持多种AI模型(Ollama、OpenAI、DeepSeek等),内置用户注册登录系统、RAG 知识库、SSE 流式输出等功能。欢迎交流,地址:spring-ai-demo
项目概述
本项目演示了如何在 Spring Boot 应用中集成 Spring AI 框架,并支持灵活切换不同的AI模型提供商,包括本地部署的 Ollama 模型和在线 API 服务(OpenAI、DeepSeek等)。同时提供完整的用户认证体系,聊天记录与用户绑定,RAG 知识库支持文档上传和上下文增强,保障数据隐私安全。
✨ 核心特性
- ✅ 用户认证系统 - 注册/登录功能,含随机验证码校验
- ✅ 密码安全传输 - RSA 非对称加密传输密码,BCrypt 加密存储
- ✅ 多轮对话支持 - 自动维护对话上下文,AI 能记住之前的聊天内容
- ✅ 会话管理 - 支持创建、查询、删除多个独立会话
- ✅ 聊天绑定用户 - 每个用户的聊天记录独立隔离,仅本人可查看和删除
- ✅ 历史持久化 - 使用 PostgreSQL/H2 数据库存储对话历史,可随时查阅
- ✅ 上下文记忆 - 可配置的上下文窗口,保留最近 N 轮对话
- ✅ 上下文管理 - 上下文使用率监控、AI 智能压缩,延长对话寿命
- ✅ SSE 流式输出 - Server-Sent Events 实时流式返回 AI 回复,逐字显示
- ✅ RAG 知识库 - 上传文档(TXT/PDF/MD等),自动解析分块向量化,聊天时注入相关上下文
- ✅ RAG 持久化 - 支持内存模式(测试用)和 PgVector 持久化模式(生产用),无缝切换
- ✅ 模型参数预设 - 每个用户可自定义 temperature、topP、topK、maxTokens 等参数
- ✅ IP 时区定位 - 根据客户端 IP 自动获取时区和经纬度,支持本地化天气显示
- ✅ RESTful API - 提供完整的 REST API 接口
- ✅ Web 界面 - 美观的聊天界面,支持会话列表、实时对话、Markdown 渲染
- ✅ 模型切换 - Web界面直接切换离线模式和在线专家模式
- ✅ Spring Boot Actuator - 内置健康检查、指标监控等运维端点
技术栈
- Java 17 - 编程语言
- Spring Boot 3.4.1 - 应用框架
- Spring AI 1.0.0 - AI 集成框架
- Spring Security - 安全认证框架
- Spring Data JPA - 数据持久化
- Thymeleaf - 模板引擎
- PostgreSQL + PgVector - 数据库 + 向量持久化存储
- H2 Database - 轻量级嵌入式数据库(开发模式)
- AI Models: Ollama / OpenAI / DeepSeek(支持切换)
- Apache Tika - 文档解析(RAG: 支持 TXT/PDF/MD 等格式)
- RSA + BCrypt - 密码加密方案
- Lombok - 代码简化
- Spring Boot Actuator - 运维监控
- Maven - 项目构建工具
前置要求
在运行本项目之前,请确保已安装以下软件:
- JDK 17 或更高版本
- Maven 3.6+
- AI模型服务 (至少选择一种):
- Ollama (本地模型)- 从 https://ollama.com 下载并安装
- OpenAI API Key - 注册 OpenAI 账号获取
- DeepSeek API Key - 注册 DeepSeek 账号获取
- (可选)PostgreSQL + pgvector 扩展 - 如需 RAG 持久化存储
项目结构
spring-ai-demo/
├── src/main/java/com/github/ylyan2015/springaidemo/
│ ├── SpringAiDemoApplication.java # 应用主类
│ ├── config/
│ │ ├── AiModelConfig.java # AI模型配置(向量存储双模式切换)
│ │ ├── RsaKeyPairGenerator.java # RSA密钥对生成器
│ │ └── SecurityConfig.java # Spring Security配置
│ ├── controller/
│ │ ├── AuthController.java # 认证控制器(注册/登录/验证码)
│ │ ├── ChatController.java # 聊天控制器(REST API + SSE)
│ │ ├── DocumentController.java # 知识库文档管理控制器
│ │ ├── ModelController.java # 模型管理控制器(切换/参数预设)
│ │ ├── ModelService.java # 模型管理服务(动态切换/参数预设)
│ │ ├── PageController.java # 页面控制器(Web 路由)
│ │ └── TimeZoneController.java # 时区控制器(IP定位)
│ ├── service/
│ │ ├── AuthService.java # 认证服务(注册/登录逻辑)
│ │ ├── CaptchaService.java # 验证码服务
│ │ ├── ChatService.java # 聊天服务(业务逻辑/上下文压缩)
│ │ └── RagService.java # RAG 服务(文档解析/向量化/检索)
│ ├── entity/
│ │ ├── Conversation.java # 会话实体(绑定userId)
│ │ ├── Message.java # 消息实体
│ │ ├── ModelParamPreset.java # 模型参数预设实体
│ │ ├── RagDocument.java # RAG 文档元信息实体(持久化)
│ │ └── User.java # 用户实体
│ └── repository/
│ ├── ConversationRepository.java # 会话数据访问
│ ├── MessageRepository.java # 消息数据访问
│ ├── ModelParamPresetRepository.java # 参数预设数据访问
│ ├── RagDocumentRepository.java # RAG 文档元信息数据访问
│ └── UserRepository.java # 用户数据访问
├── src/main/resources/
│ ├── static/
│ │ ├── css/
│ │ │ └── chat.css # 聊天界面样式
│ │ └── js/
│ │ └── chat.js # 前端交互逻辑(SSE/RAG/Markdown)
│ ├── templates/
│ │ ├── index.html # 主聊天页面模板
│ │ └── login.html # 登录/注册页面模板
│ ├── application.yml # 主配置文件
│ ├── application-h2.yml # H2 数据库配置
│ ├── application-postgresql.yml # PostgreSQL + PgVector 配置
│ ├── application-ollama.yml # Ollama 模型配置
│ ├── application-openai.yml # OpenAI 模型配置
│ └── application-deepseek.yml # DeepSeek 模型配置
├── pom.xml # Maven 配置文件
├── README.md / README-en.md # 项目说明文档(中/英文)
└── API_TEST.md / API_TEST-en.md # API测试指南(中/英文)
开发指南
多轮对话工作原理
- 用户登录:用户注册/登录后建立 Session
- 会话创建:每个对话会话有唯一 ID(UUID),并绑定到当前用户
- 消息存储:用户消息和 AI 回复都保存到数据库
- 上下文构建:发送新消息时,自动获取最近 N 轮对话历史
- RAG 增强:如开启 RAG,自动检索知识库相关片段注入上下文
- AI 调用:将完整对话历史发送给 AI 模型(支持流式/非流式)
- 结果保存:AI 回复也保存到数据库,供后续使用
上下文管理
- 上下文使用率:实时监控当前上下文占配额的比例
- AI 压缩:当上下文接近满时,自动将较早的对话总结为一条摘要,释放空间
- 可配置窗口 :通过
chat.max-context-messages控制保留的对话轮数
RAG 工作流程
- 文档上传:用户通过 API 或 Web 界面上传文档(TXT/PDF/MD)
- 解析分块:Apache Tika 解析文档 → TokenTextSplitter 智能分块
- 向量化存储:EmbeddingModel 生成向量 → 存入 VectorStore(内存/PgVector)
- 相似度检索:聊天时根据用户问题检索 Top-K 相关片段
- 上下文注入:将检索到的片段作为 SystemMessage 注入对话
参考资料
许可证
本项目仅供学习和演示使用。
作者
ylyan2015