SpringAI如何先调用向量库,再把查到的结果一起传给大模型?
1.引入pom
xml
复制代码
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-vector-store</artifactId>
</dependency>
<!--向量模型接入chatClient时引入-->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-advisors-vector-store</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0</version>
<type>pom</type>
<scope>import</scope><!-- import 是一个特殊的作用域,它只能与 <type>pom</type> 结合使用,并且只能在 <dependencyManagement> 部分中使用。当使用 <scope>import</scope> 时,它会导入指定 POM 的 <dependencyManagement> 部分的所有依赖声明到当前项目中,实现依赖版本的集中管理。 -->
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-bom</artifactId>
<version>1.0.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.配置yml
yml
复制代码
spring:
ai:
dashscope:
# base-url:不注释报404
# base-url: https://dashscope.aliyuncs.com/compatible-mode/v1
api-key: sk-xxxx
embedding:
options:
model: text-embedding-v4
# 向量维度:text-embedding-v4默认1024
# dimensions: 2048
chat:
options:
model: qwen3-coder-flash
temperature: 0.7
logging:
level:
#查看Rag查到的内容以及给大模型传递的内容
org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor: debug
3.Vector的使用测试类
java
复制代码
package com.ai.fast.vectorStore;
import com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel;
import org.junit.jupiter.api.Test;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.SimpleVectorStore;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import java.util.List;
@SpringBootTest
public class VectorStoreTest {
/**
* 向量数据库
* 1.SimpleVectorStore:适用于简单的向量数据库场景,例如:本地向量数据库、学习使用。
* 2.MilvusVectorStore:比较流行的向量数据库,支持分布式、高可用、海量数据存储。
* 3.ElasticsearchVectorStore: 如果项目中有es可以考虑使用。
*/
@TestConfiguration
static class TestConfig {
@Bean
public VectorStore vectorStore(DashScopeEmbeddingModel embeddingModel) {
return SimpleVectorStore.builder(embeddingModel).build();
}
}
@Test
public void testEmbedding(@Autowired DashScopeEmbeddingModel embeddingModel) {
float[] embedding = embeddingModel.embed("我是李四");
System.out.println("默认维度为:"+embedding.length);
}
@Test
public void testVectorStore(@Autowired VectorStore vectorStore) {
Document document1 = Document.builder()
.text("""
预订航班:
- 通过我们的网站或移动应用程序预订。
- 预订时需要全额付款。
- 确保个人信息(姓名、ID等)的准确性,因为更正可能会产生25的费用。
""")
.build();
Document document2 = Document.builder()
.text("""
取消预订:
- 最晚在航班起飞前48小时取消。
- 取消费用:经济舱75美元,豪华经济舱50美元,商务舱25美元。
- 退款将在7个工作日内处理。
""")
.build();
//存储向量(内部会自动向量化)
vectorStore.add(List.of(document1, document2));
//简单查询
// List<Document> similaritySearch = vectorStore.similaritySearch("退票");
// for (Document search : similaritySearch) {
// System.out.println(search.getText());
// System.out.println(search.getScore());
// }
//高级查询
SearchRequest searchRequest = SearchRequest.builder()
.query("退票")
.topK(5)
.similarityThreshold(0.5)
.build();
List<Document> documents = vectorStore.similaritySearch(searchRequest);
for (Document document : documents) {
System.out.println(document.getText());
System.out.println(document.getScore());
}
}
}
4.Vector接入ChatClient测试类
java
复制代码
package com.ai.fast.vectorStore;
import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor;
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.SimpleVectorStore;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.TestConfiguration;
import org.springframework.context.annotation.Bean;
import java.util.List;
@SpringBootTest
public class PlusChatClient {
@BeforeEach
public void init(@Autowired VectorStore vectorStore) {
Document document1 = Document.builder()
.text("""
预订航班:
- 通过我们的网站或移动应用程序预订。
- 预订时需要全额付款。
- 确保个人信息(姓名、ID等)的准确性,因为更正可能会产生25的费用。
""")
.build();
Document document2 = Document.builder()
.text("""
取消预订:
- 最晚在航班起飞前48小时取消。
- 取消费用:经济舱75美元,豪华经济舱50美元,商务舱25美元。
- 退款将在7个工作日内处理。
""")
.build();
//存储向量(内部会自动向量化)
vectorStore.add(List.of(document1, document2));
}
@TestConfiguration
static class TestConfig {
@Bean
public VectorStore vectorStore(DashScopeEmbeddingModel embeddingModel) {
return SimpleVectorStore.builder(embeddingModel).build();
}
}
/**
* RAG:SpringAI先调用存储向量,再调用模型进行问答
*
* @param vectorStore
* @param chatModel
*/
@Test
public void testRag(@Autowired VectorStore vectorStore,
@Autowired DashScopeChatModel chatModel) {
ChatClient chatClient = ChatClient.builder(chatModel).build();
String content = chatClient.prompt()
.system("你是一个智能助手")
.user("退票多少钱")
.advisors(SimpleLoggerAdvisor.builder().build(),
QuestionAnswerAdvisor.builder(vectorStore)
.searchRequest(SearchRequest.builder()
.query("退票多少钱")
.topK(5)
.similarityThreshold(0.5)
.build()
).build()
).call()
.content();
System.out.println(content);
}
}