Spring AI Demo - 多模型智能聊天应用

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 - 项目构建工具

前置要求

在运行本项目之前,请确保已安装以下软件:

  1. JDK 17 或更高版本
  2. Maven 3.6+
  3. AI模型服务 (至少选择一种):
    • Ollama (本地模型)- 从 https://ollama.com 下载并安装
    • OpenAI API Key - 注册 OpenAI 账号获取
    • DeepSeek API Key - 注册 DeepSeek 账号获取
  4. (可选)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测试指南(中/英文)

开发指南

多轮对话工作原理

  1. 用户登录:用户注册/登录后建立 Session
  2. 会话创建:每个对话会话有唯一 ID(UUID),并绑定到当前用户
  3. 消息存储:用户消息和 AI 回复都保存到数据库
  4. 上下文构建:发送新消息时,自动获取最近 N 轮对话历史
  5. RAG 增强:如开启 RAG,自动检索知识库相关片段注入上下文
  6. AI 调用:将完整对话历史发送给 AI 模型(支持流式/非流式)
  7. 结果保存:AI 回复也保存到数据库,供后续使用

上下文管理

  • 上下文使用率:实时监控当前上下文占配额的比例
  • AI 压缩:当上下文接近满时,自动将较早的对话总结为一条摘要,释放空间
  • 可配置窗口 :通过 chat.max-context-messages 控制保留的对话轮数

RAG 工作流程

  1. 文档上传:用户通过 API 或 Web 界面上传文档(TXT/PDF/MD)
  2. 解析分块:Apache Tika 解析文档 → TokenTextSplitter 智能分块
  3. 向量化存储:EmbeddingModel 生成向量 → 存入 VectorStore(内存/PgVector)
  4. 相似度检索:聊天时根据用户问题检索 Top-K 相关片段
  5. 上下文注入:将检索到的片段作为 SystemMessage 注入对话

参考资料

许可证

本项目仅供学习和演示使用。

作者

ylyan2015

相关推荐
shushangyun_19 分钟前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习
沐籽李41 分钟前
Roche 团队如何设计酸性 pH 激活的 anti-CD3 抗体
人工智能·aidd·抗体设计·ph敏感抗体
aaaa9547266544 分钟前
2026最新5款AI编程工具平替实测合集|Claude Code低成本迭代深度对比
人工智能·microsoft
Larcher1 小时前
从零实现 RAG 语义搜索——让 AI 听懂你的"弦外之音"
人工智能
Larcher1 小时前
从零搭建文件读取 MCP 服务——让 AI 拥有读文件的能力
人工智能
西瓜橙1 小时前
别再让 AI 一把梭:我用 Loop Engineering 把 AI编程 拽进可验证闭环
人工智能
艾莉丝努力练剑1 小时前
OpenCode AI 编程:Ubuntu 24.04 环境安装与使用指南
linux·服务器·网络·人工智能·tcp/ip·ubuntu
华山令狐虫1 小时前
DBAPI AI 写 SQL:支持动态 SQL 与参数占位符,自然语言一键生成
数据库·人工智能·sql·dbapi
一次旅行1 小时前
DeepSeek-V4 原厂直供模型即将登陆腾讯云!峰谷定价详解 + 实战调用指南
人工智能·腾讯云·ai编程
阿里云大数据AI技术1 小时前
DataWorks Data Agent的演进与工程化实践
人工智能·agent