103-Spring AI Alibaba Milvus RAG 示例

本案例展示了如何使用 Spring AI Alibaba 集成 Milvus 向量数据库,实现检索增强生成(RAG)功能。通过将文档嵌入向量存储,并利用相似性搜索检索相关内容,结合大语言模型生成更准确的回答。

1. 案例目标

我们将创建一个包含以下核心功能的 Web 应用:

  1. 向量数据初始化:项目启动时自动将示例文档嵌入并存储到 Milvus 向量数据库中。
  2. 向量相似性搜索 (/ai/select):根据查询文本在向量数据库中检索相似内容。
  3. 基于检索的问答 (/ai/chat):结合向量检索和大语言模型,实现基于知识库的智能问答。

2. 技术栈与核心依赖

  • Spring Boot 3.x
  • Spring AI Alibaba (用于对接阿里云 DashScope 通义大模型)
  • Spring AI Milvus Store (用于向量存储和检索)
  • Milvus (开源向量数据库)
  • Maven (项目构建工具)

pom.xml 中,你需要引入以下核心依赖:

复制代码
<dependencies>
    <!-- Spring AI Alibaba 核心启动器,集成 DashScope -->
    <dependency>
        <groupId>com.alibaba.cloud.ai</groupId>
        <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
        <version>${spring-ai-alibaba.version}</version>
    </dependency>
    
    <!-- Spring Web 用于构建 RESTful API -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Spring AI Milvus 向量存储 -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-milvus-store</artifactId>
    </dependency>
    
    <!-- Spring AI Milvus 自动配置 -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-autoconfigure-vector-store-milvus</artifactId>
    </dependency>
    
    <!-- Spring AI 向量存储顾问 -->
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-advisors-vector-store</artifactId>
    </dependency>
</dependencies>

3. 项目配置

src/main/resources/application.yml 文件中,配置 DashScope API Key 和 Milvus 连接信息。

复制代码
spring:
  application:
    name: spring-ai-alibaba-rag-milvus-example

  ai:
    dashscope:
      api-key: ${AI_DASHSCOPE_API_KEY}

    vectorstore:
      milvus:
        client:
          host: ${MILVUS_HOST:localhost} # default: localhost
          port: ${MILVUS_PORT:19530} # default: 19530
          username: ${MILVUS_USERNAME:root} # default: root
          password: ${MILVUS_PASSWORD:milvus} # default: milvus
        databaseName: ${MILVUS_DATABASE_NAME:default} # default: default
        collectionName: ${MILVUS_COLLECTION_NAME:vector_store} # default: vector_store
        embeddingDimension: 1536 # default: 1536
        indexType: IVF_FLAT # default: IVF_FLAT
        metricType: COSINE # default: COSINE

重要提示 :请将 AI_DASHSCOPE_API_KEY 环境变量设置为你从阿里云获取的有效 API Key。同时,确保 Milvus 服务已正确启动并配置。

4. 环境准备

在运行项目之前,需要先准备好 Milvus 环境:

4.1 安装 Milvus

通过 Docker Compose 安装 Milvus:

复制代码
# docker-compose 的 yml 文件见目录 /spring-ai-alibaba-examples/docker-compose/milvus/docker-compose.yml
# 详细安装文档见地址:https://milvus.io/docs/install_standalone-docker-compose.md

# 启动 Milvus
docker-compose -f docker-compose.yml up -d

4.2 验证 Milvus

  1. 启动 Milvus 服务
  2. 打开浏览器访问 localhost:8000,访问 Milvus Dashboard
  3. 在 default 数据库创建 collection

5. 编写 Java 代码

5.1 RagApplication.java

Spring Boot 主程序类。

复制代码
package com.alibaba.cloud.ai.example.rag;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RagApplication {

    public static void main(String[] args) {
        SpringApplication.run(RagApplication.class, args);
    }
}

5.2 PromptConfiguration.java

配置 ChatClient,设置系统提示词。

复制代码
package com.alibaba.cloud.ai.example.rag.config;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class PromptConfiguration {

    @Bean
    ChatClient chatClient(ChatClient.Builder builder) {
        return builder.defaultSystem("你将作为一名 Spring-AI-Alibaba 的专家,对于用户的使用需求作出解答")
                .build();
    }
}

5.3 VectorDataInit.java

向量数据初始化类,在应用启动时将示例文档嵌入并存储到 Milvus。

复制代码
package com.alibaba.cloud.ai.example.rag.config;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.milvus.MilvusVectorStore;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Configuration;

@Configuration
public class VectorDataInit implements ApplicationRunner {

    private final Logger logger = LoggerFactory.getLogger(VectorDataInit.class);

    private final MilvusVectorStore vectorStore;

    public VectorDataInit(MilvusVectorStore vectorStore) {
        this.vectorStore = vectorStore;
    }

    @Override
    public void run(ApplicationArguments args) {

        List<Document> documents = List.of(
                new Document("1. 使用SpringAIAlibaba创建一个Spring Boot项目,并添加spring-ai-alibaba-starter-dashscope依赖。"),
                new Document("2. 在SpringAIAlibaba项目的pom.xml中添加Spring Milestone和Snapshot存储库。"),
                new Document("3. 通过SpringAIAlibaba申请阿里云通义API Key,在application.yml中进行配置。"),
                new Document("4. 使用SpringAIAlibaba的ChatClient和Prompt功能实现对话模型。"),
                new Document("5. 通过SpringAIAlibaba的Spring Boot与Spring Cloud Alibaba AI对接,实现基本聊天功能。"),
                new Document("6. SpringAIAlibaba支持文本生成、翻译、摘要等生成式AI功能。"),
                new Document("7. SpringAIAlibaba支持文本数据的语义搜索和AI绘画功能。"),
                new Document("8. 使用SpringAIAlibaba的TongYiChatModel和TongYiImagesModel实现聊天和图片服务。"),
                new Document("9. 在SpringAIAlibaba的REST控制器中提供对外的API接口。"),
                new Document("10. 通过SpringAIAlibaba的简单API调用实现AI模型的集成。"),
                new Document("11. 使用SpringAIAlibaba的Prompt模板管理控制AI模型的输出。"),
                new Document("12. 结合SpringAIAlibaba的检索和生成技术(RAG)提高生成内容的质量。"),
                new Document("13. 使用SpringAIAlibaba实现文本生成图像和图像识别功能。"),
                new Document("14. 准备SpringAIAlibaba需要的Java 17及以上的开发环境。"),
                new Document("15. 使用IDEA进行SpringAIAlibaba的Java开发和HBuilder X进行前端开发。"),
                new Document("16. 在SpringAIAlibaba的Spring Boot项目中集成多种AI模型和向量数据库。"),
                new Document("17. SpringAIAlibaba支持自然语言处理、计算机视觉、语音处理和数据分析与预测功能。"),
                new Document("18. 通过SpringAIAlibaba的配置中心和注册中心实现动态扩展。")
        );

        vectorStore.add(documents);
        logger.info("Vector data initialized");
    }
}

5.4 RagController.java

控制器类,提供向量搜索和基于检索的问答接口。

复制代码
package com.alibaba.cloud.ai.example.rag.controller;

import java.util.ArrayList;
import java.util.List;

import jakarta.servlet.http.HttpServletResponse;
import reactor.core.publisher.Flux;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.chat.messages.UserMessage;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/ai")
public class RagController {

    private final VectorStore vectorStore;

    private final ChatClient chatClient;

    public RagController(VectorStore vectorStore, ChatClient chatClient) {
        this.vectorStore = vectorStore;
        this.chatClient = chatClient;
    }

    // 历史消息列表
    private static List<Message> historyMessage = new ArrayList<>();

    // 历史消息列表的最大长度
    private final static int maxLen = 10;

    @GetMapping(value = "/chat")
    public Flux<String> generation(@RequestParam("prompt") String userInput, HttpServletResponse response) {

        response.setCharacterEncoding("UTF-8");

        // 发起聊天请求并处理响应
        Flux<String> resp = chatClient.prompt()
            .messages(historyMessage)
            .user(userInput)
            .advisors(QuestionAnswerAdvisor
                    .builder(vectorStore)
                    .searchRequest(SearchRequest.builder().build())
                    .build()
            )
            .stream()
            .content();

        // 用户输入的文本是 UserMessage
        historyMessage.add(new UserMessage(userInput));

        // 发给 AI 前对历史消息对列的长度进行检查
        if (historyMessage.size() > maxLen) {
            historyMessage = historyMessage.subList(historyMessage.size() - maxLen - 1, historyMessage.size());
        }

        return resp;
    }

    /**
     * 向量数据查询测试
     */
    @GetMapping("/select")
    public List<Document> search() {

        return vectorStore.similaritySearch(
                SearchRequest.builder().query("SpringAIAlibaba").topK("SpringAIAlibaba".length()).build());
    }
}

6. 运行与测试

  1. 启动 Milvus:确保 Milvus 服务已启动并运行。
  2. 加载集合:在 Milvus Dashboard 中手动加载集合,避免查询错误。
  3. 启动应用:运行 Spring Boot 主程序,项目启动时会自动将数据导入 Milvus。
  4. 验证数据导入:在 Milvus Dashboard 中确认集合加载完成:

测试 1:向量相似性搜索

使用 curl 或浏览器访问以下 URL,进行向量相似性搜索:

复制代码
curl http://localhost:8080/ai/select

预期响应

复制代码
[
  {
    "id": "fae19802-f6c0-42a6-8408-6c68dba55722",
    "text": "17. SpringAIAlibaba支持自然语言处理、计算机视觉、语音处理和数据分析与预测功能。",
    "media": null,
    "metadata": {
      "distance": 0.25151956
    },
    "score": 0.7484804391860962
  },
  {
    ....
  }
]

测试 2:基于检索的问答

使用浏览器访问以下 URL,进行基于检索的问答:

复制代码
http://localhost:8080/ai/chat?prompt="如何使用 spring ai alibaba 开发 ai 应用"

预期响应

要使用 Spring AI Alibaba 开发 AI 应用,您可以按照以下步骤进行: 1. 创建一个 Spring Boot 项目,并添加 spring-ai-alibaba-starter-dashscope 依赖。 2. 在项目的 pom.xml 中添加 Spring Milestone 和 Snapshot 存储库。 3. 申请阿里云通义 API Key,在 application.yml 中进行配置。 4. 使用 ChatClient 和 Prompt 功能实现对话模型。 5. 通过 Spring Boot 与 Spring Cloud Alibaba AI 对接,实现基本聊天功能。...

7. 实现思路与扩展建议

实现思路

本案例的核心思想是**"检索增强生成(RAG)"**。通过将文档嵌入向量存储,在用户提问时先检索相关内容,然后将检索结果作为上下文提供给大语言模型,从而生成更准确、更有针对性的回答。这种方法的优势在于:

  • 知识更新:可以随时更新向量数据库中的知识,而无需重新训练模型。
  • 减少幻觉:基于检索到的真实内容生成回答,减少了模型产生幻觉的可能性。
  • 领域适应:可以轻松适应特定领域的知识,只需在向量数据库中添加相关文档即可。
  • 引用追溯:可以追溯到回答所依据的原始文档,提高可信度。

扩展建议

  • 文档处理增强:集成更复杂的文档处理流程,支持 PDF、Word、HTML 等多种格式的文档解析。
  • 分块策略优化:根据文档类型和内容特点,采用更智能的分块策略,提高检索精度。
  • 多轮对话:增强对话上下文管理,支持更自然的多轮对话体验。
  • 混合检索:结合关键词检索和向量检索,提高检索的全面性和准确性。
  • 知识图谱集成:将向量检索与知识图谱相结合,提供更结构化的知识表示和推理能力。
  • 性能优化:针对大规模文档库,采用缓存、索引优化等手段提高检索性能。
相关推荐
蓝眸少年CY19 小时前
(第十二篇)spring cloud之Stream消息驱动
后端·spring·spring cloud
卡尔AI工坊19 小时前
Andrej Karpathy:过去一年大模型的六个关键转折
人工智能·经验分享·深度学习·机器学习·ai编程
:mnong19 小时前
通过手写识别数字可视化学习卷积神经网络原理
人工智能·学习·cnn
码界奇点19 小时前
基于SpringBoot+Vue的前后端分离外卖点单系统设计与实现
vue.js·spring boot·后端·spring·毕业设计·源代码管理
俊哥V19 小时前
[本周看点]AI算力扩张的“隐形瓶颈”——电网接入为何成为最大制约?
人工智能·ai
X54先生(人文科技)19 小时前
碳硅协同对位法:从对抗博弈到共生协奏的元协议
人工智能·架构·零知识证明
阿里云大数据AI技术19 小时前
寻找 AI 全能王——阿里云 Data+AI 工程师全球大奖赛正式开启
人工智能·阿里云·云计算·天池大赛
Oflycomm20 小时前
CES 2026:高通扩展 IE-IoT 产品组合,边缘 AI 进入“平台化竞争”阶段
人工智能·物联网·高通·wifi7·ces2026·qogrisys
jay神20 小时前
指纹识别考勤打卡系统 - 完整源码项目
人工智能·深度学习·机器学习·计算机视觉·毕业设计
智慧医院运行管理解决方案专家20 小时前
当医院安全进入“自动驾驶”时代:AI机器人医院安全值守日记
人工智能·安全·自动驾驶