- 新增 ChatService 实现 RAG 核心逻辑(向量检索 + 上下文构建 + LLM 生成) - 新增 ChatRequest/ChatResponse DTO 支持结构化请求响应 - 新增 ApiResponse 统一响应封装 - ChatController 新增 POST /api/chat RAG 问答接口(支持引用溯源) - 流式接口 GET /api/chat/ai/stream 保持不变 |
||
|---|---|---|
| data | ||
| src/main | ||
| .gitignore | ||
| pom.xml | ||
| README.md | ||
Spring AI Demo
🤖 一个简洁优雅的 Spring AI 对话演示项目,基于 Spring Boot 3.2.0 与 Spring AI 1.0.0-M3 构建,支持流式响应、Markdown 渲染与 RAG 智能问答。
✨ 特性
- 🌐 AI 智能对话 - 基于 Ollama 的自然语言交互
- 📡 流式响应 - 实时逐字输出,体验流畅
- 📝 Markdown 支持 - 完整渲染代码块、表格、列表等格式
- 👨💻 代码高亮 - Highlight.js 自动语言检测与语法着色
- 📚 RAG 智能问答 - 基于向量检索的上下文感知回答
- 🔍 语义检索 - Milvus 向量数据库相似度搜索
- 🔗 引用溯源 - 回答附带文档来源引用
- 🗃️ 向量数据库 - Milvus 分布式向量数据库
- 🔍 Embedding 服务 - SiliconFlow BAAI/bge-large-zh-v1.5
- 🎨 精美界面 - 深色主题响应式设计
🚀 快速开始
环境要求
- 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. 访问应用
- Web 界面: http://localhost:8080
- 健康检查: http://localhost:8080/api/chat/test
🔧 技术栈
后端
| 组件 | 技术 | 版本 |
|---|---|---|
| 基础框架 | Spring Boot | 3.2.0 |
| AI 框架 | Spring AI | 1.0.0-M3 |
| AI 模型 | OpenAI/Ollama | - |
| Embedding | SiliconFlow BAAI/bge-large-zh-v1.5 | - |
| 向量数据库 | Milvus | 2.3.4 |
| 响应式编程 | Spring WebFlux | 3.2.0 |
前端
| 技术 | 用途 |
|---|---|
| HTML5 + CSS3 | 页面结构与样式 |
| Marked.js | Markdown 解析渲染 |
| Highlight.js | 代码语法高亮 |
📁 项目结构
springAiDemo/
├── src/main/java/com/demo/
│ ├── MyApplication.java # Spring Boot 启动入口
│ ├── config/
│ │ └── RagConfig.java # RAG 配置类
│ ├── controller/
│ │ ├── ChatController.java # AI 聊天 API
│ │ └── DocumentController.java # 文档导入 API
│ ├── dto/
│ │ ├── ApiResponse.java # 通用响应封装
│ │ ├── ChatRequest.java # 聊天请求 DTO
│ │ └── ChatResponse.java # 聊天响应 DTO
│ └── service/
│ ├── ChatService.java # RAG 聊天服务
│ └── DocumentService.java # 文档处理服务
├── data/
│ └── doris_intro.md # RAG 示例文档
└── src/main/resources/
├── application.yaml # 应用配置
└── static/ # 前端资源
💬 API 文档
聊天接口
| 方法 | 端点 | 描述 | 参数 |
|---|---|---|---|
| GET | /api/chat/test |
健康检查 | - |
| GET | /api/chat/ai |
流式 AI 对话 | msg |
| POST | /api/chat |
RAG 智能问答 | { "question": "..." } |
文档接口
| 方法 | 端点 | 描述 |
|---|---|---|
| GET | /api/documents/import |
导入文档到向量库 |
请求示例
RAG 智能问答:
curl -X POST http://localhost:8080/api/chat \
-H "Content-Type: application/json" \
-d '{"question": "Apache Doris 是什么?"}'
流式对话:
curl "http://localhost:8080/api/chat/ai/stream?msg=讲一个故事"
导入 RAG 文档:
curl http://localhost:8080/api/documents/import
响应格式
POST /api/chat 响应:
{
"code": 200,
"message": "success",
"data": {
"answer": "Apache Doris 是一个...",
"references": ["data/doris_intro.md"],
"timestamp": 1713000000000
}
}
📚 RAG 文档问答
工作原理
用户问题 → Embedding → 向量检索 → 构建上下文 → LLM 生成回答 → 返回答案+引用
- 文档导入 - 将
.md/.txt文档读取并切割成 chunks - 向量化 - 使用 BAAI/bge-large-zh-v1.5 生成 1024 维向量
- 存储检索 -存入 Milvus,向量相似度搜索 top-K 结果
- 生成回答 - 将检索结果作为上下文,LLM 生成答案
使用步骤
- 将文档放入
data/目录 - 调用导入接口:
curl http://localhost:8080/api/documents/import - 通过 POST
/api/chat提问
文档处理配置
document:
data-path: data # 文档目录
chunk-size: 400 # 分割块大小 (tokens)
min-chunk-size: 200 # 最小块大小
max-num-chunk: 10000 # 最大块数量
🛠️ 配置说明
AI 对话配置
spring:
ai:
openai:
base-url: http://localhost:11434
chat:
options:
model: gpt-oss:120b-cloud
temperature: 0.7
Embedding 配置
spring:
ai:
openai:
embedding:
api-key: your-siliconflow-api-key
base-url: https://api.siliconflow.cn
model: BAAI/bge-large-zh-v1.5
dimensions: 1024
向量数据库配置
spring:
ai:
vectorstore:
milvus:
client:
host: 192.168.50.103
port: 19530
databaseName: doris_docs
collectionName: vector_store
🎬 架构图
┌─────────────────────────────────────────────────────────────┐
│ Client │
│ ┌─────────────────┐ ┌─────────────────────────────────┐│
│ │ Web UI │ │ POST /api/chat ││
│ │ (流式/非流式) │────▶│ { question: "..." } ││
│ └─────────────────┘ └─────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ ChatController │
│ POST /api/chat → ChatService │
└─────────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ VectorStore │ │ ChatClient │
│ (Milvus 语义检索) │ │ (Ollama LLM) │
└─────────────────────────┘ └─────────────────────────┘
│ │
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ DocumentService │ │ SiliconFlow API │
│ (文档切割/向量化) │ │ (Embedding) │
└─────────────────────────┘ └─────────────────────────┘
📖 更新日志
v1.0.0 (2026-04-19)
- 🎉 初始版本发布
- 支持流式 AI 对话
- Markdown 渲染与代码高亮
- 深色主题 Web 界面
v1.1.0 (2026-04-19)
- ✨ 新增 RAG 文档问答功能
- ✨ 新增 DocumentController 文档导入 API
- ✨ 配置 SiliconFlow Embedding 服务
- ✨ 集成 Milvus 向量数据库
v1.2.0 (2026-04-19)
- ✨ 新增 POST /api/chat RAG 智能问答接口
- ✨ 新增 ChatService RAG 核心服务
- ✨ 新增 ChatRequest/ChatResponse/ApiResponse DTO
- ✨ 新增引用溯源功能,返回文档来源
📗 License
MIT © 2026 Spring AI Demo
🚀 Made with Spring AI