目 录CONTENT

文章目录

基于 Spring AI 实现 RAG(检索增强生成)的完整实战教程

冰点
2025-06-09 / 0 评论 / 0 点赞 / 45 阅读 / 38661 字

参考文档

https://docs.spring.io/spring-ai/reference/api/vectordbs/elasticsearch.html

基于 Spring AI 实现 RAG(检索增强生成)的完整实战教程

在本篇博客中,我将带你一步步了解并实践如何使用 Spring AI 构建一个完整的 RAG(Retrieval-Augmented Generation) 系统。我们将结合 Elasticsearch 作为向量数据库,并演示多种 RAG 模式:Basic、Compression、Memory、Translation 和 Rewrite。

这个项目非常适合想要入门大模型 + 向量数据库结合应用的同学,也可以作为企业级问答系统、知识库检索系统的原型参考。


🧠 什么是 RAG?

RAG(Retrieval-Augmented Generation)是一种结合了信息检索和语言生成的技术,其核心思想是:

  1. 检索:根据用户输入的问题,在知识库中查找最相关的文档;

  2. 增强:将检索到的内容作为上下文注入提示词(Prompt);

  3. 生成:由语言模型基于增强后的 Prompt 生成最终回答。

这样可以有效提升 LLM 的准确性与可控性,特别是在面对内部知识库或私有数据时。


🛠️ 技术栈概览

技术

描述

Spring Boot

快速构建后端服务

Spring AI

提供 RAG 支持的核心框架

Elasticsearch

向量数据库,用于高效存储和检索文档嵌入向量

DashScope API

阿里通义千问等大模型调用接口

Markdown 文档

作为知识源

前端 HTML + JS

实现简易 UI 测试界面


📁 项目结构一览

spring-ai-demo/
├── src/
│   ├── main/
│   │   ├── java/                      # Java 控制器代码
│   │   │   └── com.bingdian.ai.demo.rag.controller/
│   │   │       ├── BasicRAGController.java
│   │   │       ├── CompressionRAGController.java
│   │   │       ├── MemoryRAGController.java
│   │   │       ├── TranslationRAGController.java
│   │   │       └── RewriteRAGController.java
│   │   │
│   │   │   └── resources/
│   │   │       ├── application.yml      # 配置文件
│   │   │       ├── documents/           # 中文 PolarDB 文档
│   │   │       ├── documents-cn/        # 中文故事文档
│   │   │       ├── documents-story/     # 英文故事文档
│   │   │       └── static/index.html    # 前端测试页面
│   │   │
│   │   └── LoadDoc2VectorDBHandler.java # 初始化文档加载逻辑
│   │
│   └── RAGApplication.java            # 主启动类
└── pom.xml                            # Maven 依赖配置

🚀 核心模块解析

1. 文档加载模块:LoadDoc2VectorDBHandler

该模块负责:

  • 从指定路径读取 .md 文件;

  • 使用 MarkdownDocumentReader 解析内容;

  • 利用 TokenTextSplitter 对文档进行分块处理;

  • 将文本转换为向量后,存入 Elasticsearch。

@PostConstruct
void run() {
    var docs = new MarkdownDocumentReader(new FileSystemResource(file)).get();
    vectorStore.add(tokenTextSplitter.split(docs));
}

✅ 支持中文文档自动切片并上传至向量数据库


2. RAG 控制器详解

🔹 Basic RAG Controller

基础检索增强模式,直接对用户问题进行检索 + 生成:

@GetMapping("/chat")
public String chatWithDocument(@RequestParam("prompt") String prompt) {
    return chatClient.prompt()
        .advisors(retrievalAugmentationAdvisor)
        .user(prompt)
        .call()
        .content();
}

🔹 Compression RAG Controller

使用压缩查询优化检索过程,同时保留对话记忆功能:

@PostMapping("/chat/{chatId}")
public String rag(@RequestBody String prompt, @PathVariable String chatId) {
    return chatClient.prompt()
        .advisors(chatMemoryAdvisor, retrievalAugmentationAdvisor)
        .advisors(advisors -> advisors.param(CONVERSATION_ID, chatId))
        .user(prompt)
        .call()
        .content();
}

🔹 Memory RAG Controller

带记忆功能的 RAG,适用于多轮对话场景:

@PostMapping("/chat/{chatId}")
public String chatWithDocument(...) {
    return chatClient.prompt()
        .advisors(chatMemoryAdvisor, retrievalAugmentationAdvisor)
        ...
}

🔹 Translation RAG Controller

在检索前将用户输入翻译成目标语言(如英文),适用于跨语言知识库检索:

var queryTransformer = TranslationQueryTransformer.builder()
    .targetLanguage("english")
    .build();

🔹 Rewrite RAG Controller

使用 LLM 对用户原始提问进行改写,以提高检索相关性:

var queryTransformer = RewriteQueryTransformer.builder()
    .targetSearchSystem("vector store")
    .build();

🌐 前端交互页面说明

提供了一个简洁的 HTML 页面,允许用户选择任意一种 RAG 模式并发送请求:

index.html 截图

  • 下拉框选择 RAG 模式;

  • 输入问题后点击按钮;

  • 显示对应模型返回结果;

💡 使用 JavaScript 动态生成 Chat ID(用于 Compression / Memory 模式)


⚙️ 核心配置(application.yml)

server:
  port: 38080

spring:
  ai:
    dashscope:
      api-key: sk-b4e14a58718e4bc59b8de2a3ce43c266
    vectorstore:
      elasticsearch:
        index-name: spring-ai-polar-index
        similarity: cosine
        dimensions: 1536

  elasticsearch:
    uris: http://172.24.32.232:19200

📈 示例:PolarDB 计费策略问答系统

我们以阿里云 PolarDB 的计费策略文档为例,训练出一个专属的知识问答系统:

  • 用户输入:polardb 收费策略

  • 返回:

    PolarDB 支持三种计费方式:
    
    - 包年包月(预付费)
    - 按量付费(后付费)
    - Serverless(动态弹性资源按小时计费)
    
    不同模式适用不同业务场景...
    

你也可以替换为你自己的知识库,比如产品手册、技术文档、FAQ 等。


📦 运行步骤

  1. 准备知识库文档(放入 resources/documents 目录下);

  2. 修改 application.yml 配置;

  3. 启动 Spring Boot 应用;

  4. 打开 http://localhost:38080;

  5. 输入问题并选择 RAG 模式;

  6. 查看结果输出。


🧩 可扩展方向

  • ✅ 支持 PDF / Word / Excel 多种格式解析;

  • ✅ 支持 PostgreSQL、Milvus、FAISS 等其他向量数据库;

  • ✅ 结合 Redis 缓存会话状态;

  • ✅ 添加身份认证和权限控制;

  • ✅ 支持 RESTful API 接口供外部调用;

  • ✅ 集成 LangChain4j 或 LlamaIndex 提供更多高级特性。


🎯 总结

通过本文介绍的 Spring AI Demo,你可以快速搭建一个具备以下能力的 RAG 系统:

能力

是否支持

多种 RAG 模式

✅

中文文档解析

✅

向量数据库支持(Elasticsearch)

✅

多语言翻译检索

✅

查询重写优化

✅

对话记忆保存

✅

Web UI 界面交互

✅


GitHub 地址:[待补充]
项目名称:spring-ai-rag


📚 参考资料


如需获取完整源码、部署方案或定制开发,欢迎联系我 👇

0

评论区