logo
0
0
WeChat Login
ruok<ruoook@qq.com>
init

Spring AI RAG 示例项目

基于 Spring AI 框架实现的检索增强生成(RAG)系统,支持文档上传、向量化存储和智能问答功能。

项目简介

本项目展示了如何使用 Spring AI 构建一个完整的 RAG 系统,主要功能包括:

  • 📄 文档上传与解析:支持多种格式文档的上传和内容提取
  • 🔍 向量化存储:将文档内容转换为向量并存储到 Redis 向量数据库
  • 🤖 智能问答:基于上传的文档内容回答用户问题
  • 实时搜索:快速检索相关文档片段并生成准确回答

技术栈

  • Spring Boot 3.4.5 - 应用框架
  • Spring AI 1.0.0 - AI 集成框架
  • Java 21 - 编程语言
  • Redis Stack - 向量数据库
  • Ollama - 本地大语言模型服务
  • Apache Tika - 文档解析
  • Lombok - 代码简化

系统架构

┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 前端/客户端 │───▶│ Spring Boot │───▶│ Redis Stack │ │ │ │ 应用服务 │ │ 向量数据库 │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ▼ ┌─────────────────┐ │ Ollama │ │ 大语言模型 │ └─────────────────┘

快速开始

环境要求

  • Java 21+
  • Maven 3.6+
  • Docker & Docker Compose
  • Ollama(用于本地大语言模型)

1. 启动 Redis Stack

cd doc/redis-stack docker-compose up -d

Redis Stack 将在以下端口启动:

  • Redis 服务:localhost:6380
  • RedisInsight 管理界面:http://localhost:8001

2. 安装和配置 Ollama

# 安装 Ollama(macOS) brew install ollama # 启动 Ollama 服务 ollama serve # 下载并运行 qwen3:8b 模型 ollama pull qwen3:8b

3. 配置环境变量

# 设置Redis密码(可选,默认为123456) export REDIS_PASSWORD=your_secure_password

4. 启动应用

# 克隆项目 git clone <repository-url> cd spring-ai-rag-example # 编译并运行 mvn spring-boot:run

应用将在 http://localhost:8080 启动。

API 接口

上传文档

POST /rag/uploadDoc Content-Type: multipart/form-data file: <文档文件>

响应示例:

[ { "id": "doc-1", "content": "文档内容片段1...", "metadata": { "fileName": "example.txt" } } ]

智能问答

GET /rag/search?question=你的问题

响应示例:

{ "answer": "基于上传文档的回答内容..." }

配置说明

application.yml 配置

spring: ai: ollama: base-url: http://localhost:11434 # Ollama 服务地址 chat: options: model: qwen3:8b # 使用的模型 vectorstore: redis: initialize-schema: true # 自动初始化向量存储结构 index-name: spring-ai-vectorstore-index prefix: 'embedding:' data: redis: host: localhost port: 6380 password: ${REDIS_PASSWORD:your_redis_password} username: default

核心组件

1. 文档服务 (DocumentService)

负责文档的上传、解析、分割和向量化存储:

  • 文档解析:使用 Apache Tika 解析多种格式文档
  • 文本分割:自定义文本分割器,按段落分割文档
  • 向量存储:将文档片段转换为向量并存储到 Redis

2. RAG 控制器 (RagController)

提供 RESTful API 接口:

  • POST /rag/uploadDoc - 上传文档
  • GET /rag/search - 智能问答

3. 自定义文本分割器 (CustomTextSplitter)

基于正则表达式的文本分割器,按照空行分割文档内容,保持语义完整性。

使用示例

1. 上传文档

curl -X POST \ http://localhost:8080/rag/uploadDoc \ -H 'Content-Type: multipart/form-data' \ -F 'file=@/path/to/your/document.txt'

2. 提问

curl -X GET \ "http://localhost:8080/rag/search?question=如何使用Spring AI?"

项目结构

src/main/java/org/example/springai/ ├── SpringAiRagExampleApplication.java # 主启动类 └── rag/ ├── config/ │ └── AiConfig.java # AI 配置类 ├── controller/ │ └── RagController.java # REST 控制器 ├── service/ │ ├── DocumentService.java # 文档服务接口 │ └── impl/ │ └── DocumentServiceImpl.java # 文档服务实现 └── utils/ └── CustomTextSplitter.java # 自定义文本分割器