springAiDemo/README.md
kennethcheng 710fe14d7f feat: 新增 RAG 智能问答 POST 接口与 ChatService
- 新增 ChatService 实现 RAG 核心逻辑(向量检索 + 上下文构建 + LLM 生成)
- 新增 ChatRequest/ChatResponse DTO 支持结构化请求响应
- 新增 ApiResponse 统一响应封装
- ChatController 新增 POST /api/chat RAG 问答接口(支持引用溯源)
- 流式接口 GET /api/chat/ai/stream 保持不变
2026-04-19 22:27:44 +08:00

281 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Spring AI Demo
> 🤖 一个简洁优雅的 Spring AI 对话演示项目,基于 Spring Boot 3.2.0 与 Spring AI 1.0.0-M3 构建支持流式响应、Markdown 渲染与 RAG 智能问答。
[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.2.0-brightgreen)](https://spring.io/projects/spring-boot)
[![Spring AI](https://img.shields.io/badge/Spring%20AI-1.0.0--M3-blue)](https://spring.io/projects/spring-ai)
[![JDK](https://img.shields.io/badge/JDK-17%2B-orange)](https://openjdk.org/)
[![License](https://img.shields.io/badge/License-MIT-yellow)](LICENSE)
## ✨ 特性
- 🌐 **AI 智能对话** - 基于 Ollama 的自然语言交互
- 📡 **流式响应** - 实时逐字输出,体验流畅
- 📝 **Markdown 支持** - 完整渲染代码块、表格、列表等格式
- 👨‍💻 **代码高亮** - Highlight.js 自动语言检测与语法着色
- 📚 **RAG 智能问答** - 基于向量检索的上下文感知回答
- 🔍 **语义检索** - Milvus 向量数据库相似度搜索
- 🔗 **引用溯源** - 回答附带文档来源引用
- 🗃️ **向量数据库** - Milvus 分布式向量数据库
- 🔍 **Embedding 服务** - SiliconFlow BAAI/bge-large-zh-v1.5
- 🎨 **精美界面** - 深色主题响应式设计
## 🚀 快速开始
### 环境要求
- JDK 17+
- Maven 3.8+
- [Ollama](https://ollama.ai/) 本地服务
- Milvus 向量数据库
### 1. 安装 Ollama
```bash
# macOS/Linux
curl -fsSL https://ollama.ai/install.sh | sh
# 拉取模型
ollama pull gpt-oss:120b-cloud
# 启动服务 (默认端口 11434)
ollama serve
```
### 2. 启动项目
```bash
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 智能问答:**
```bash
curl -X POST http://localhost:8080/api/chat \
-H "Content-Type: application/json" \
-d '{"question": "Apache Doris 是什么?"}'
```
**流式对话:**
```bash
curl "http://localhost:8080/api/chat/ai/stream?msg=讲一个故事"
```
**导入 RAG 文档:**
```bash
curl http://localhost:8080/api/documents/import
```
### 响应格式
**POST /api/chat 响应:**
```json
{
"code": 200,
"message": "success",
"data": {
"answer": "Apache Doris 是一个...",
"references": ["data/doris_intro.md"],
"timestamp": 1713000000000
}
}
```
## 📚 RAG 文档问答
### 工作原理
```
用户问题 → Embedding → 向量检索 → 构建上下文 → LLM 生成回答 → 返回答案+引用
```
1. **文档导入** - 将 `.md` / `.txt` 文档读取并切割成 chunks
2. **向量化** - 使用 BAAI/bge-large-zh-v1.5 生成 1024 维向量
3. **存储检索** -存入 Milvus向量相似度搜索 top-K 结果
4. **生成回答** - 将检索结果作为上下文LLM 生成答案
### 使用步骤
1. 将文档放入 `data/` 目录
2. 调用导入接口:`curl http://localhost:8080/api/documents/import`
3. 通过 POST `/api/chat` 提问
### 文档处理配置
```yaml
document:
data-path: data # 文档目录
chunk-size: 400 # 分割块大小 (tokens)
min-chunk-size: 200 # 最小块大小
max-num-chunk: 10000 # 最大块数量
```
## 🛠️ 配置说明
### AI 对话配置
```yaml
spring:
ai:
openai:
base-url: http://localhost:11434
chat:
options:
model: gpt-oss:120b-cloud
temperature: 0.7
```
### Embedding 配置
```yaml
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
```
### 向量数据库配置
```yaml
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**