
本案例展示了如何使用 Spring AI Alibaba 集成 Milvus 向量数据库,实现检索增强生成(RAG)功能。通过将文档嵌入向量存储,并利用相似性搜索检索相关内容,结合大语言模型生成更准确的回答。
1. 案例目标
我们将创建一个包含以下核心功能的 Web 应用:
- 向量数据初始化:项目启动时自动将示例文档嵌入并存储到 Milvus 向量数据库中。
- 向量相似性搜索 (
/ai/select):根据查询文本在向量数据库中检索相似内容。 - 基于检索的问答 (
/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
- 启动 Milvus 服务
- 打开浏览器访问
localhost:8000,访问 Milvus Dashboard - 在 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. 运行与测试
- 启动 Milvus:确保 Milvus 服务已启动并运行。
- 加载集合:在 Milvus Dashboard 中手动加载集合,避免查询错误。
- 启动应用:运行 Spring Boot 主程序,项目启动时会自动将数据导入 Milvus。
- 验证数据导入:在 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 等多种格式的文档解析。
- 分块策略优化:根据文档类型和内容特点,采用更智能的分块策略,提高检索精度。
- 多轮对话:增强对话上下文管理,支持更自然的多轮对话体验。
- 混合检索:结合关键词检索和向量检索,提高检索的全面性和准确性。
- 知识图谱集成:将向量检索与知识图谱相结合,提供更结构化的知识表示和推理能力。
- 性能优化:针对大规模文档库,采用缓存、索引优化等手段提高检索性能。