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);}
}