springAiDemo/README.md
kennethcheng 80eb5eb590 feat: 新增流式 RAG 问答与 PDF 上传功能
新增接口:
- POST /api/chat/stream - 流式 RAG 问答 (SSE)
- POST /api/documents/upload - PDF 文件上传
- POST /api/documents/upload/stream - 带进度 PDF 上传

新增功能:
- CorsConfig 跨域配置(支持 localhost:8081, 5173)
- FileUploadResponse/FileUploadProgress DTO
- PDF 文本提取与向量化存储
- MD5 文件去重机制

配置更新:
- embedding 模型更新为 BAAI/bge-m3
- multipart max-file-size: 100MB
- ChatRequest topK 默认值 3 → 10
2026-04-20 02:57:36 +08:00

9.5 KiB
Raw Blame History

Spring AI Demo

🤖 一个简洁优雅的 Spring AI 对话演示项目,基于 Spring Boot 3.2.0 与 Spring AI 1.0.0-M3 构建支持流式响应、Markdown 渲染与 RAG 智能问答。

Spring Boot Spring AI JDK License

特性

  • 🌐 AI 智能对话 - 基于 Ollama 的自然语言交互
  • 📡 流式响应 - 实时逐字输出,体验流畅
  • 📝 Markdown 支持 - 完整渲染代码块、表格、列表等格式
  • 👨‍💻 代码高亮 - Highlight.js 自动语言检测与语法着色
  • 📚 RAG 智能问答 - 基于向量检索的上下文感知回答
  • 📤 PDF 文件上传 - PDF 文本提取与向量化存储
  • 📊 上传进度流 - 实时上传进度反馈
  • 🔍 语义检索 - Milvus 向量数据库相似度搜索
  • 🔗 引用溯源 - 回答附带文档来源引用
  • 🗃️ 向量数据库 - Milvus 分布式向量数据库
  • 🔍 Embedding 服务 - SiliconFlow BAAI/bge-m3
  • 🌐 CORS 跨域 - 支持多端访问
  • 🎨 精美界面 - 深色主题响应式设计

🚀 快速开始

环境要求

  • JDK 17+
  • Maven 3.8+
  • Ollama 本地服务
  • Milvus 向量数据库

1. 安装 Ollama

# macOS/Linux
curl -fsSL https://ollama.ai/install.sh | sh

# 拉取模型
ollama pull gpt-oss:120b-cloud

# 启动服务 (默认端口 11434)
ollama serve

2. 启动项目

mvn spring-boot:run

3. 访问应用

🔧 技术栈

后端

组件 技术 版本
基础框架 Spring Boot 3.2.0
AI 框架 Spring AI 1.0.0-M3
AI 模型 OpenAI/Ollama -
Embedding SiliconFlow BAAI/bge-m3 -
向量数据库 Milvus 2.3.4
PDF 处理 Apache PDFBox 2.0.29
文件上传 Commons FileUpload 1.5
响应式编程 Spring WebFlux 3.2.0

前端

技术 用途
HTML5 + CSS3 页面结构与样式
Marked.js Markdown 解析渲染
Highlight.js 代码语法高亮

📁 项目结构

springAiDemo/
├── src/main/java/com/demo/
│   ├── MyApplication.java              # Spring Boot 启动入口
│   ├── config/
│   │   ├── CorsConfig.java             # CORS 跨域配置
│   │   └── RagConfig.java              # RAG 配置类
│   ├── controller/
│   │   ├── ChatController.java         # AI 聊天 API
│   │   └── DocumentController.java      # 文档处理 API
│   ├── dto/
│   │   ├── ApiResponse.java            # 统一响应封装
│   │   ├── ChatRequest.java            # 聊天请求 DTO
│   │   ├── ChatResponse.java           # 聊天响应 DTO
│   │   ├── FileUploadProgress.java     # 上传进度 DTO
│   │   └── FileUploadResponse.java     # 上传响应 DTO
│   └── service/
│       ├── ChatService.java            # RAG 聊天服务
│       └── DocumentService.java         # 文档处理服务
├── data/
│   └── doris_intro.md                  # RAG 示例文档
└── src/main/resources/
    ├── application.yaml                # 应用配置
    └── static/                         # 前端资源

💬 API 文档

聊天接口

方法 端点 描述 参数/Body
GET /api/chat/test 健康检查 -
GET /api/chat/ai 流式 AI 对话 msg
POST /api/chat RAG 智能问答 { "question": "...", "topK": 10 }
POST /api/chat/stream 流式 RAG 问答 { "question": "..." } (SSE)

文档接口

方法 端点 描述 参数
POST /api/documents/import 导入 RAG 文档 -
POST /api/documents/upload 上传 PDF 文件 file (multipart)
POST /api/documents/upload/stream 上传 PDF (带进度) file (multipart)

请求示例

RAG 智能问答:

curl -X POST http://localhost:8080/api/chat \
  -H "Content-Type: application/json" \
  -d '{"question": "Apache Doris 是什么?"}'

流式 RAG 问答 (SSE)

curl -X POST http://localhost:8080/api/chat/stream \
  -H "Content-Type: application/json" \
  -d '{"question": "Apache Doris 性能如何?"}'

PDF 文件上传:

curl -X POST http://localhost:8080/api/documents/upload \
  -F "file=@/path/to/document.pdf"

导入 RAG 文档:

curl -X POST http://localhost:8080/api/documents/import

响应格式

POST /api/chat 响应:

{
  "code": 200,
  "message": "success",
  "data": {
    "answer": "Apache Doris 是一个...",
    "references": ["data/doris_intro.md"],
    "timestamp": 1713000000000
  }
}

POST /api/documents/upload/stream 响应 (SSE)

{"percent":0,"status":"STARTING","message":"开始上传..."}
{"percent":30,"status":"EXTRACTING","message":"正在提取文本..."}
{"percent":60,"status":"PROCESSING","message":"正在向量化..."}
{"percent":100,"status":"COMPLETED","message":"上传完成"}

📚 RAG 文档问答

工作原理

用户问题 → Embedding → 向量检索 → 构建上下文 → LLM 生成回答 → 返回答案+引用

使用步骤

  1. 方式一:将 .md / .txt 文档放入 data/ 目录,调用导入接口
  2. 方式二:直接上传 PDF 文件,系统自动提取文本并向量化
  3. 通过 POST /api/chat 或流式 /api/chat/stream 提问

🛠️ 配置说明

CORS 跨域配置

cors:
  allowed-origins: http://localhost:8081,http://localhost:5173
  allowed-methods: GET,POST,PUT,DELETE,OPTIONS

文件上传配置

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB

Embedding 配置

spring:
  ai:
    openai:
      embedding:
        api-key: your-siliconflow-api-key
        base-url: https://api.siliconflow.cn
        model: BAAI/bge-m3
        dimensions: 1024

🎬 架构图

┌─────────────────────────────────────────────────────────────┐
│                         Client                              │
│  ┌─────────────────┐     ┌─────────────────────────────────┐│
│  │   Web UI        │     │   POST /api/chat                ││
│  │   (流式/非流式)  │────▶│   POST /api/chat/stream (SSE)  ││
│  └─────────────────┘     └─────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
                                    │
                                    ▼
┌─────────────────────────────────────────────────────────────┐
│                    ChatController                            │
│              POST /api/chat  →  ChatService                  │
└─────────────────────────────────────────────────────────────┘
                                    │
                    ┌───────────────┴───────────────┐
                    ▼                               ▼
┌─────────────────────────┐         ┌─────────────────────────┐
│    VectorStore          │         │     ChatClient          │
│  (Milvus 语义检索)       │         │     (Ollama LLM)        │
└─────────────────────────┘         └─────────────────────────┘

📖 更新日志

v1.0.0 (2026-04-19)

  • 🎉 初始版本发布
  • 支持流式 AI 对话
  • Markdown 渲染与代码高亮
  • 深色主题 Web 界面

v1.1.0 (2026-04-19)

  • 新增 RAG 文档问答功能
  • 配置 SiliconFlow Embedding 服务
  • 集成 Milvus 向量数据库

v1.2.0 (2026-04-19)

  • 新增 POST /api/chat RAG 智能问答接口
  • 新增 ChatService RAG 核心服务
  • 新增引用溯源功能

v1.3.0 (2026-04-20)

  • 新增 POST /api/chat/stream 流式 RAG 问答接口 (SSE)
  • 新增 PDF 文件上传接口 (POST /api/documents/upload)
  • 新增带进度流式 PDF 上传 (POST /api/documents/upload/stream)
  • 新增 CorsConfig 跨域配置
  • embedding 模型更新为 BAAI/bge-m3
  • ChatRequest topK 默认值调整为 10
  • 🐛 修复文件重复上传问题 (MD5 去重)

📗 License

MIT © 2026 Spring AI Demo


🚀 Made with Spring AI