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

相关推荐
yyuuuzz1 小时前
云服务器软件部署的常见问题与经验
linux·运维·服务器·网络·数据库·人工智能·github
斯内普吖1 小时前
(开源)高校素拓分管理系统小程序实战指南 基于 Java + SpringBoot + uni-app + Vue + MySQL
java·spring boot·mysql·小程序·uni-app·开源
得一录1 小时前
LangGraph节点间数据传递的模式
人工智能
在路上走着走着1 小时前
OpenAI Function Calling
人工智能
小小高不懂写代码1 小时前
Transformer与注意力机制
前端·人工智能
码流怪侠1 小时前
【GitHub】 Headroom 深度解析:AI Agent 上下文压缩层的完整技术拆解
人工智能·github·agent
qq_411262421 小时前
ESP32-S3 AI相机硬件组成与通信配置说明
人工智能·数码相机
闲人小吴1 小时前
Loop Engineering:当杠杆点从「写 Prompt」移到「设计循环」
人工智能
Yobeeo1 小时前
记忆与存档——Checkpointer 与状态持久化 — LangGraph 实战——构建跨平台爆款图文 Agent 第3篇
人工智能