SpringAI如何先调用向量库,再把查到的结果一起传给大模型?
1.引入pom
<dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</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></dependencies></dependencyManagement>
2.配置yml
spring:ai:ollama:base-url: http://localhost:11434embedding:options:model: nomic-embed-textchat:options:model: qwen3:8btemperature: 0.7
logging:level:#查看Rag查到的内容以及给大模型传递的内容org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor: debug
3.Vector的使用测试类
package com.ai.fast.vectorStore;import org.junit.jupiter.api.Test;
import org.springframework.ai.document.Document;
import org.springframework.ai.ollama.OllamaEmbeddingModel;
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可以考虑使用。*/@TestConfigurationstatic class TestConfig {@Beanpublic VectorStore vectorStore(OllamaEmbeddingModel embeddingModel) {return SimpleVectorStore.builder(embeddingModel).build();}}@Testpublic void testEmbedding(@Autowired OllamaEmbeddingModel embeddingModel) {float[] embedding = embeddingModel.embed("hello world");System.out.println("默认维度为:"+embedding.length);}@Testpublic 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测试类
package com.ai.fast.vectorStore;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.ollama.OllamaChatModel;
import org.springframework.ai.ollama.OllamaEmbeddingModel;
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 {@BeforeEachpublic 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));}@TestConfigurationstatic class TestConfig {@Beanpublic VectorStore vectorStore(OllamaEmbeddingModel embeddingModel) {return SimpleVectorStore.builder(embeddingModel).build();}}/*** RAG:SpringAI先调用存储向量,再调用模型进行问答** @param vectorStore* @param chatModel*/@Testpublic void testRag(@Autowired VectorStore vectorStore,@Autowired OllamaChatModel 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);}
}