Spring AI框架快速入門
- 一、前言
- 二、前期準備
- 2.1 運行環境
- 2.2 maven配置
- 2.3 api-key申請
- 三、Chat Client API
- 3.1 導入pom依賴
- 3.2 配置application.properties文件
- 3.3 創建 ChatClient
- 3.3.1 使用自動配置的 ChatClient.Builder
- 3.3.2 使用多個聊天模型
- 3.4 ChatClient請求
- 3.5 ChatClient 響應
- 3.5.1 返回 ChatResponse
- 3.5.2 返回實體
- 3.5.3 流式響應
- 3.6 提示模板
- 3.6 call() 返回值
- 3.7 stream() 返回值
- 3.8 使用默認值
- 3.8.1 默認系統文本
- 3.8.2 帶參數的默認系統文本
- 3.8.3 其他默認值
- 3.9 Advisors
- 3.9.1 ChatClient 中的 Advisor 配置
- 3.9.2 日志記錄
一、前言
前言:Spring AI經歷了八個版本的迭代(M1~M8)之后,Spring AI 1.0.0 正式版本,終于在 2025 年 5 月 20 日正式發布,這是另一個新高度的里程碑式的版本,標志著 Spring 生態系統正式全面擁抱人工智能技術,并且意味著 Spring AI 將會給企業帶來穩定 API 支持。
Spring AI 項目旨在簡化包含人工智能功能的應用程序的開發,避免不必要的復雜性。
該項目的靈感來源于著名的 Python 項目,如 LangChain
和 LlamaIndex
,但 Spring AI 并非這些項目的直接移植。 該項目堅信,下一波生成式人工智能應用程序將不僅僅面向 Python 開發人員,而是將普及到多種編程語言中。
注意:Spring AI 解決了人工智能集成的基本挑戰:將企業數據和 API 與人工智能模型連接起來。
Spring AI 提供了作為開發人工智能應用程序基礎的抽象。 這些抽象有多種實現,從而能夠以最少的代碼更改輕松替換組件。
Spring AI 提供以下功能:
-
跨 AI 提供商的聊天、文本到圖像和嵌入模型的便攜式 API 支持。支持同步和流式 API 選項。也提供對模型特定功能的訪問。
-
支持所有主要的
AI 模型提供商
,例如 Anthropic、OpenAI、Microsoft、Amazon、Google 和 Ollama。支持的模型類型包括:-
聊天補全
-
嵌入
-
文本到圖像
-
音頻轉錄
-
文本到語音
-
內容審核
-
-
結構化輸出
- 將 AI 模型輸出映射到 POJO。 -
支持所有主要的
向量數據庫提供商
,例如 Apache Cassandra、Azure Cosmos DB、Azure Vector Search、Chroma、Elasticsearch、GemFire、MariaDB、Milvus、MongoDB Atlas、Neo4j、OpenSearch、Oracle、PostgreSQL/PGVector、PineCone、Qdrant、Redis、SAP Hana、Typesense 和 Weaviate。 -
跨向量存儲提供商的便攜式 API,包括新穎的類 SQL 元數據過濾 API。
-
工具/函數調用
- 允許模型請求執行客戶端工具和函數,從而根據需要訪問必要的實時信息并采取行動。 -
可觀察性
- 提供對 AI 相關操作的洞察。 -
用于數據工程的文檔提取
ETL 框架
。 -
AI 模型評估
- 幫助評估生成內容并防止幻覺響應的實用程序。 -
AI 模型和向量存儲的 Spring Boot 自動配置和啟動器。
-
ChatClient API
- 用于與 AI 聊天模型通信的流暢 API,在習慣用法上類似于 WebClient 和 RestClient API。 -
Advisors API
- 封裝了重復出現的生成式 AI 模式,轉換進出語言模型 (LLM) 的數據,并提供跨各種模型和用例的可移植性。 -
支持
聊天對話記憶
和檢索增強生成 (RAG)
。
基于以上Spring AI特性,我將分多篇博客詳細講解Spring AI的用法,有幫助麻煩點贊、收藏、評論,給我點小小鼓勵!!!點關注就最好了
Spring AI 1.0.0源碼:GitHub
本文代碼:GitHub
二、前期準備
2.1 運行環境
Spring AI基于Sping Boot 3.x
版本及以上,本文選取3.4.5
(Spring AI 1.0.0源碼為3.4.5),需要JDK 17
以上,JDK 8需要升級,也可以配置雙jdk環境,具體配置如下圖,誰排在Path
環境中的前面誰的優先級高
2.2 maven配置
maven的setting.xml文件中需要添加快照倉庫
<profile><id>spring-snapshots</id><repositories><repository><id>spring-snapshots</id><url>https://repo.spring.io/snapshot</url><snapshots><enabled>true</enabled></snapshots><releases><enabled>false</enabled></releases></repository></repositories></profile></profiles><activeProfiles><activeProfile>spring-snapshots</activeProfile></activeProfiles>
2.3 api-key申請
Spring AI提供多種類型的模型,包括聊天模型、嵌入模型、圖像模型、音頻模型、內容審核模型等。提供了多家 AI 提供商的便攜式 Model API,例如:Claude、OpenAI、DeepSeek、ZhiPu等等
例如聊天模型,又會有許多的實現
聊天模型對比
此表格比較了 Spring AI 支持的各種聊天模型,詳細說明了它們的功能:
-
多模態: 模型可以處理的輸入類型(例如,文本、圖像、音頻、視頻)。
-
工具/函數調用: 模型是否支持函數調用或工具使用。
-
流式響應: 模型是否提供流式響應。
-
重試: 是否支持重試機制。
-
可觀測性: 用于監控和調試的功能。
-
內置 JSON: 原生支持 JSON 輸出。
-
本地部署: 模型是否可以在本地運行。
-
OpenAI API 兼容性: 模型是否兼容 OpenAI 的 API。
提供商 | 多模態 | 工具/函數 | 流式響應 | 重試 | 可觀測性 | 內置 JSON | 本地 | OpenAI API 兼容 |
---|---|---|---|---|---|---|---|---|
Anthropic Claude | 文本、PDF、圖像 | ? | ? | ? | ? | ? | ? | ? |
Azure OpenAI | 文本、圖像 | ? | ? | ? | ? | ? | ? | ? |
DeepSeek (OpenAI-proxy) | 文本 | ? | ? | ? | ? | ? | ? | ? |
Google VertexAI Gemini | 文本、PDF、圖像、音頻、視頻 | ? | ? | ? | ? | ? | ? | ? |
Groq (OpenAI-proxy) | 文本、圖像 | ? | ? | ? | ? | ? | ? | ? |
HuggingFace | 文本 | ? | ? | ? | ? | ? | ? | ? |
Mistral AI | 文本、圖像 | ? | ? | ? | ? | ? | ? | ? |
MiniMax | 文本 | ? | ? | ? | ? | ? | ? | |
Moonshot AI | 文本 | ? | ? | ? | ? | ? | ? | |
NVIDIA (OpenAI-proxy) | 文本、圖像 | ? | ? | ? | ? | ? | ? | ? |
OCI GenAI/Cohere | 文本 | ? | ? | ? | ? | ? | ? | ? |
Ollama | 文本、圖像 | ? | ? | ? | ? | ? | ? | ? |
OpenAI | 輸入:文本、圖像、音頻 輸出:文本、音頻 | ? | ? | ? | ? | ? | ? | ? |
Perplexity (OpenAI-proxy) | 文本 | ? | ? | ? | ? | ? | ? | ? |
QianFan | 文本 | ? | ? | ? | ? | ? | ? | ? |
ZhiPu AI | 文本 | ? | ? | ? | ? | ? | ? | ? |
Amazon Bedrock Converse | 文本、圖像、視頻、文檔(PDF、HTML、MD、DOCX…) | ? | ? | ? | ? | ? | ? | ? |
本文采用DeepSeek用于聊天模型,ZhiPu用戶文生圖模型,其他模型同理
DeepSeek api-key獲取:https://platform.deepseek.com/api_keys,DeepSeek創建完需要充值
新用戶可以使用ZhiPu,能白嫖!!!
ZhiPu api-key獲取:https://open.bigmodel.cn/usercenter/proj-mgmt/apikeys
三、Chat Client API
ChatClient
提供了一個流暢的 API 用于與 AI 模型進行通信。 它同時支持同步和流式編程模型。
3.1 導入pom依賴
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- spring-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- deepseek依賴 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-deepseek</artifactId></dependency><!-- zhipuai依賴 -->
<!-- <dependency>-->
<!-- <groupId>org.springframework.ai</groupId>-->
<!-- <artifactId>spring-ai-starter-model-zhipuai</artifactId>-->
<!-- </dependency>-->
</dependencies><repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>false</enabled></releases></repository><repository><name>Central Portal Snapshots</name><id>central-portal-snapshots</id><url>https://central.sonatype.com/repository/maven-snapshots/</url><releases><enabled>false</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository>
</repositories><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
3.2 配置application.properties文件
spring:ai:deepseek:# API 密鑰api-key: <your-deepseek-api-key># 可選:DeepSeek API 基礎地址,默認是 https://api.deepseek.com# base-url: https://api.deepseek.comchat:options:# DeepSeek 使用的聊天模型,可選 deepseek-chat 或 deepseek-reasoner# deepseek-chat為聊天模型,deepseek-reasoner為推理模型,推理模型會生成推理過程,比較消耗tokenmodel: deepseek-chat# 模型的溫度值,控制生成文本的隨機性(0.0 = 最確定,1.0 = 最隨機)temperature: 0.8
3.3 創建 ChatClient
ChatClient 是使用 ChatClient.Builder
對象創建的。 可以為任何 ChatModel
Spring Boot 自動配置獲取一個自動配置的 ChatClient.Builder
實例,或者以編程方式創建一個。由于依賴中導入了DeepSeek,會默認采用DeepSeek模型。
3.3.1 使用自動配置的 ChatClient.Builder
Spring AI 提供了 Spring Boot 自動配置,創建一個原型 ChatClient.Builder
bean,可以將其注入到的類中。 以下是一個簡單的示例,展示如何獲取對簡單用戶請求的 String
響應:
@RestController
public class ChatClientController {private final ChatClient chatClient;public ChatClientController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}@GetMapping("/ai")String generation(@RequestParam("userInput") String userInput) {return this.chatClient.prompt().user(userInput).call().content();}
}
在這個簡單的示例中,用戶輸入設置了用戶消息的內容。 call()
方法向 AI 模型發送請求,content()
方法返回 AI 模型的響應作為 String。
3.3.2 使用多個聊天模型
在單個應用程序中使用多個聊天模型有幾種場景:
-
為不同類型的任務使用不同的模型(例如,
使用強大的模型進行復雜推理,使用更快、更便宜的模型處理簡單任務
) -
當一個模型服務不可用時實現回退機制
-
對不同的模型或配置進行 A/B 測試
-
根據用戶偏好提供模型選擇
-
組合專業模型(一個用于代碼生成,另一個用于創意內容等)
默認情況下,Spring AI 自動配置單個 ChatClient.Builder
bean。但是,可能需要在應用程序中使用多個聊天模型。以下是處理這種情況的方法:
在所有情況下,都需要通過設置屬性 spring.ai.chat.client.enabled=false
來禁用 ChatClient.Builder
自動配置。
這允許手動創建多個 ChatClient
實例。
引入ZhiPu
model依賴和配置
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency>
spring:ai:# 禁用默認的 Chat Clientchat:client:enabled: falsezhipuai:# ZhiPu AI 的 API 密鑰api-key: 49dadd9c9d504acbb60580f6d53cf30b.vlX0Fp67MTwxdZ5i# ZhiPu AI 的接口基礎地址base-url: https://open.bigmodel.cn/api/paas# ZhiPu AI 的聊天模型配置chat:options:# 可選模型如 glm-4-air、glm-4、glm-3-turbo 等model: glm-4-air# 文生圖模型(如需啟用,取消注釋并設置模型名稱,如 cogview-3)# image:# options:# model: cogview-3# 嵌入模型(如需啟用,取消注釋并設置模型名稱,如 embedding-2)# embedding:# options:# model: embedding-2
當使用多個 AI 模型時,可以為每個模型定義單獨的 ChatClient
bean:
@Configuration
public class ChatClientConfig {/*** 創建并配置一個ChatClient實例* 該方法通過注入的DeepSeekChatModel對象初始化一個ChatClient* 主要作用是將聊天模型與客戶端進行綁定,以便進行后續的聊天操作** @param chatModel 聊天模型,包含了聊天所需的配置和參數* @return 返回配置好的ChatClient實例*/@Beanpublic ChatClient deepSeekChatClient(DeepSeekChatModel chatModel) {return ChatClient.create(chatModel);}/*** 創建ChatClient實例的Bean定義* 該方法將ZhiPuAiChatModel轉換為ChatClient實例,供Spring框架管理** @param chatModel 聊天模型,包含了與聊天客戶端相關的信息和配置* @return ChatClient實例,用于與AI聊天服務進行交互*/@Beanpublic ChatClient zhiPuAiChatClient(ZhiPuAiChatModel chatModel) {return ChatClient.create(chatModel);}
}
然后,可以使用 @Qualifier
注解將這些 bean 注入到應用程序組件中:
@Configuration
public class ChatClientExample {@BeanCommandLineRunner cli(@Qualifier("deepSeekChatClient") ChatClient deepSeekChatClient,@Qualifier("zhiPuAiChatClient") ChatClient zhiPuAiChatClient) {return args -> {var scanner = new Scanner(System.in);ChatClient chat;// 模型選擇System.out.println("\n選擇您的 AI 模型:");System.out.println("1. DeepSeek");System.out.println("2. ZhiPuAi");System.out.print("輸入您的選擇(1 或 2):");String choice = scanner.nextLine().trim();if (choice.equals("1")) {chat = deepSeekChatClient;System.out.println("使用 OpenAI 模型");} else {chat = zhiPuAiChatClient;System.out.println("使用 Anthropic 模型");}// 使用選定的聊天客戶端System.out.print("\n輸入您的問題:");String input = scanner.nextLine();String response = chat.prompt(input).call().content();System.out.println("助手:" + response);scanner.close();};}
}
DeepSeek
執行結果:
ZhiPu Ai
執行結果:
3.4 ChatClient請求
ChatClient
請求允許使用重載的 prompt
方法以三種不同的方式創建提示:
-
prompt()
:無參數方法。 -
prompt(Prompt prompt)
:這個方法接受一個Prompt
參數,讓傳入使用Prompt
創建Prompt
實例。 -
prompt(String content)
:這是一個類似于前一個重載的便捷方法。它接受用戶的文本內容。
關于提示詞的內容,我們下一篇博客,詳細講解
3.5 ChatClient 響應
ChatClient API
提供了幾種使用 AI 模型響應的方法。
3.5.1 返回 ChatResponse
AI 模型的響應是一個由 ChatResponse
類型定義的豐富結構。 它包括有關如何生成響應的元數據,還可以包含多個響應,稱為 Generations
,每個都有自己的元數據。 元數據包括用于創建響應的令牌數量(每個令牌大約是一個單詞的 3/4)。 這些信息很重要,因為托管 AI 模型根據每個請求使用的令牌數量收費。
以下示例通過調用 call()
方法后的 chatResponse()
返回包含元數據的 ChatResponse
對象:
@RestController
public class ChatClientResponseController {private final ChatClient deepSeekChatClient;@Autowiredpublic ChatClientResponseController(@Qualifier("deepSeekChatClient") ChatClient deepSeekChatClient) {this.deepSeekChatClient = deepSeekChatClient;}@GetMapping("/ai/chat-client-response")ChatResponse generation() {return deepSeekChatClient.prompt().user("給我講個笑話").call().chatResponse();}
}
執行結果:
Token統計詳情:
- 輸入:“講個笑話” -> 7 tokens
- 輸出:笑話內容 -> 63 tokens
- 計費依據:總tokens = 7 + 63 -> 70
關鍵字段說明:
finishReason
:- STOP:正常結束
- LENGTH:達到token限制
- CONTENT_FILTER:內容被過濾
- TOOL_CALLS:該模型為工具
- TOOL_CALL:僅用于與 Mistral AI API 兼容
- role:標志消息來源
- SYSTEM
- USER
- ASSISTANT
- TOOL
3.5.2 返回實體
通常希望返回一個從返回的 String
映射的實體類。 entity()
方法提供了這個功能。
首先我們定義一個ActorFilms
實體類:
public class ActorsFilms {private String actor;private List<String> movies;public ActorsFilms() {}public String getActor() {return this.actor;}public void setActor(String actor) {this.actor = actor;}public List<String> getMovies() {return this.movies;}public void setMovies(List<String> movies) {this.movies = movies;}@Overridepublic String toString() {return "ActorsFilms{" + "actor='" + this.actor + '\'' + ", movies=" + this.movies + '}';}
}
我們可以使用 entity()
方法輕松地將 AI 模型的輸出String字符串映射到這個 ActorsFilms實體,如下所示:
@GetMapping("/ai/chat-client-response-entity")
ActorsFilms generation_entity() {return deepSeekChatClient.prompt().user("生成一個隨機演員的電影作品。").call().entity(ActorsFilms.class);
}
運行結果:
還有一個重載的 entity
方法,參數為 entity(ParameterizedTypeReference<T> type)
,允許指定泛型列表等類型:
@GetMapping("/ai/chat-client-response-entity/list")
List<ActorsFilms> generation_entity_list() {return deepSeekChatClient.prompt().user("生成成龍和李連杰的 5 部電影作品。").call().entity(new ParameterizedTypeReference<List<ActorsFilms>>() {});
}
運行結果:
3.5.3 流式響應
stream()
方法讓可以獲得異步響應,如下所示:
@GetMapping("/ai/flux")
Flux<String> gen_flux() {return deepSeekChatClient.prompt().user("給我講個笑話").stream().content();
}
運行結果:
還可以使用方法 Flux<ChatResponse> chatResponse()
流式傳輸 ChatResponse
。道理同上
還可以通過結構化輸出轉換器
顯示的轉換響應,其中結構化輸出轉換器
在后面的文章中會詳細講解
@GetMapping("/ai/struct/flux")
List<ActorsFilms> gen_struct_flux() {var converter = new BeanOutputConverter<>(new ParameterizedTypeReference<List<ActorsFilms>>() {});Flux<String> flux = deepSeekChatClient.prompt().user(u -> u.text("""生成一個隨機演員的電影作品。{format}""").param("format", converter.getFormat())).stream().content();String content = flux.collectList().block().stream().collect(Collectors.joining());List<ActorsFilms> actorFilms = converter.convert(content);return actorFilms;
}
運行結果:
3.6 提示模板
ChatClient
API 允許提供帶有變量的用戶和系統文本作為模板,這些變量在運行時被替換。
String answer = ChatClient.create(chatModel).prompt().user(u -> u.text("告訴我 5 部由 {composer} 主演的電影").param("actor", "成龍")).call().content();
在內部,ChatClient
使用 PromptTemplate
類來處理用戶和系統文本,并使用給定的 TemplateRenderer
實現替換變量。 默認情況下,Spring AI 使用 StTemplateRenderer
實現,它基于 Terence Parr 開發的開源 StringTemplate
引擎。
如果想使用不同的模板引擎,可以直接向 ChatClient
提供 TemplateRenderer
接口的自定義實現。也可以繼續使用默認的 StTemplateRenderer
,但使用自定義配置。
例如,默認情況下,模板變量由 {}
語法標識。如果計劃在提示中包含 JSON
,可能想使用不同的語法以避免與 JSON
語法沖突。例如,可以使用 <
和 >
分隔符。
String answer = ChatClient.create(chatModel).prompt().user(u -> u.text("告訴我 5 部由 <composer> 主演的電影").param("actor", "成龍")).templateRenderer(StTemplateRenderer.builder().startDelimiterToken('<').endDelimiterToken('>').build()).call().content();
3.6 call() 返回值
在 ChatClient
上指定 call()
方法后,響應類型有幾種不同的選項。
-
String content()
:返回響應的 String 內容 -
ChatResponse chatResponse()
:返回包含多個生成以及有關響應的元數據的ChatResponse
對象,例如創建響應使用了多少令牌。 -
ChatClientResponse chatClientResponse()
:返回一個ChatClientResponse
對象,其中包含ChatResponse
對象和ChatClient
執行上下文,讓可以訪問在執行advisors
期間使用的其他數據(例如,在RAG
流程中檢索的相關文檔)。 -
entity()
返回 Java 類型-
entity(ParameterizedTypeReference<T> type)
:用于返回實體類型的Collection
。 -
entity(Class<T> type)
:用于返回特定的實體類型。 -
entity(StructuredOutputConverter<T> structuredOutputConverter)
:用于指定StructuredOutputConverter
的實例,將 String 轉換為實體類型。
-
也可以調用 stream()
方法而不是 call()
。
3.7 stream() 返回值
在 ChatClient
上指定 stream()
方法后,響應類型有幾種選項:
-
Flux<String> content()
:返回 AI 模型生成的字符串的Flux
。 -
Flux<ChatResponse> chatResponse()
:返回ChatResponse
對象的Flux
,其中包含有關響應的其他元數據。 -
Flux<ChatClientResponse> chatClientResponse()
:返回ChatClientResponse
對象的Flux
,其中包含ChatResponse
對象和ChatClient
執行上下文,讓可以訪問在執行advisors
期間使用的其他數據(例如,在RAG
流程中檢索的相關文檔)。
3.8 使用默認值
在 @Configuration
類中創建帶有默認系統文本的 ChatClient
可以簡化運行時代碼。 通過設置默認值,只需要在調用 ChatClient
時指定用戶文本,無需在運行時代碼路徑中為每個請求設置系統文本。
3.8.1 默認系統文本
在以下示例中,我們將配置系統文本始終以海盜的聲音回答。 為了避免在運行時代碼中重復系統文本,創建一個 defaultTextChatClient
實例。
@Configuration
public class Config {@BeanChatClient defaultTextChatClient(@Qualifier("deepSeekChatModel") ChatModel chatModel) {return ChatClient.builder(chatModel).defaultSystem("你是一個友好的聊天機器人,用海盜的聲音回答問題").build();}
}
以及一個調用它的 @RestController
:
@Resource
@Qualifier("defaultTextChatClient")
private ChatClient chatClient;@GetMapping("/ai/simple")
public Map<String, String> completion(@RequestParam(value = "message", defaultValue = "給我講個笑話") String message) {return Map.of("completion", this.chatClient.prompt().user(message).call().content());
}
運行結果:
3.8.2 帶參數的默認系統文本
在以下例子中,將在系統文本中使用占位符,以便在運行時而不是設計時指定完成的聲音。
@Bean
ChatClient withParamTextChatClient(@Qualifier("deepSeekChatModel") ChatModel chatModel) {return ChatClient.builder(chatModel).defaultSystem("你是一個友好的聊天機器人,用 {voice} 的聲音回答問題").build();
}
@Resource
@Qualifier("withParamTextChatClient")
private ChatClient withParamTextChatClient;@GetMapping("/ai/withParamTextChatClient")
Map<String, String> withParamTextChatClientCompletion(@RequestParam(value = "message", defaultValue = "給我講個笑話") String message, @RequestParam(value = "voice", defaultValue = "語文老師") String voice) {return Map.of("completion",this.withParamTextChatClient.prompt().system(sp -> sp.param("voice", voice)).user(message).call().content());
}
運行結果:
3.8.3 其他默認值
在 ChatClient.Builder
中,可以指定默認的提示配置。
-
defaultOptions(ChatOptions chatOptions)
:傳入ChatOptions
類中定義的便攜選項或特定于模型的選項,如OpenAiChatOptions
中的選項。有關特定于模型的ChatOptions
實現的更多信息。 -
defaultFunction(String name, String description, java.util.function.Function<I, O> function)
:name
用于在用戶文本中引用函數。description
解釋函數的用途,幫助 AI 模型選擇正確的函數以獲得準確的響應。function
參數是模型在需要時將執行的 Java 函數實例。 -
defaultFunctions(String…? functionNames)
:在應用程序上下文中定義的java.util.Function
的 bean 名稱。 -
defaultUser(String text), defaultUser(Resource text), defaultUser(Consumer<UserSpec> userSpecConsumer)
:這些方法定義用戶文本。Consumer<UserSpec>
允許使用 lambda 來指定用戶文本和任何默認參數。 -
defaultAdvisors(Advisor…? advisor)
:Advisors
允許修改用于創建 Prompt 的數據。QuestionAnswerAdvisor
實現通過將提示附加與用戶文本相關的上下文信息來啟用Retrieval Augmented Generation
模式。 -
defaultAdvisors(Consumer<AdvisorSpec> advisorSpecConsumer)
:此方法允許定義一個Consumer
來使用AdvisorSpec
配置多個advisors
。Advisors
可以修改用于創建最終Prompt
的數據。Consumer<AdvisorSpec>
指定一個 lambda 來添加 advisors,如QuestionAnswerAdvisor
,它通過將提示附加基于用戶文本的相關上下文信息來支持Retrieval Augmented Generation
。
可以在運行時使用不帶 default
前綴的相應方法覆蓋這些默認值。
-
options(ChatOptions chatOptions)
-
function(String name, String description, java.util.function.Function<I, O> function)
-
functions(String…? functionNames)
-
user(String text), user(Resource text), user(Consumer<UserSpec> userSpecConsumer)
-
advisors(Advisor…? advisor)
-
advisors(Consumer<AdvisorSpec> advisorSpecConsumer)
3.9 Advisors
Advisors API
提供了一種靈活而強大的方式來攔截、修改和增強 Spring 應用程序中的 AI 驅動交互。
在調用帶有用戶文本的 AI 模型時,一個常見的模式是將提示附加或增強上下文數據。
這種上下文數據可以是不同類型的。常見類型包括:
-
自己的數據
:這是 AI 模型沒有訓練過的數據。即使模型見過類似的數據,附加的上下文數據在生成響應時也會優先考慮。 -
對話歷史
:聊天模型的 API 是無狀態的。如果告訴 AI 模型一個標志,它不會在后續交互中記住。必須隨每個請求發送對話歷史,以確保在生成響應時考慮之前的交互。
3.9.1 ChatClient 中的 Advisor 配置
ChatClient API 提供了一個 AdvisorSpec
接口用于配置 advisors。這個接口提供了添加參數、一次性設置多個參數以及向鏈中添加一個或多個 advisors 的方法。
重要:將 advisors 添加到鏈中的順序至關重要,因為它決定了它們的執行順序。每個 advisor 都以某種方式修改提示或上下文,一個 advisor 所做的更改會傳遞給鏈中的下一個。
ChatClient.builder(chatModel).build().prompt().advisors(MessageChatMemoryAdvisor.builder(chatMemory).build(),QuestionAnswerAdvisor.builder(vectorStore).build()).user(userText).call().content();
在此配置中,MessageChatMemoryAdvisor
將首先執行,將對話歷史添加到提示中。然后,QuestionAnswerAdvisor
將基于用戶的問題和添加的對話歷史執行其搜索,可能提供更相關的結果。其中的聊天記憶等在后面文章做詳細講解,這里知道advisors
特性即可
3.9.2 日志記錄
SimpleLoggerAdvisor
是一個記錄 ChatClient
的 request
和 response
數據的 advisor。 這對于調試和監控的 AI 交互很有用。
提示:Spring AI 支持 LLM 和向量存儲交互的可觀察性
。具體講解見后續文章
要啟用日志記錄,在創建 ChatClient 時將 SimpleLoggerAdvisor
添加到 advisor 鏈中。 建議將其添加到鏈的末尾:
@GetMapping("/ai/log")
ChatResponse gen_log() {return deepSeekChatClient.prompt().advisors(new SimpleLoggerAdvisor()).user("給我講個笑話?").call().chatResponse();
}
要查看日志,將 advisor 包的日志級別設置為 DEBUG
:
logging.level.org.springframework.ai.chat.client.advisor=DEBUG
將此添加到 application.properties
或 application.yaml
文件中。
可以通過使用以下構造函數自定義從 AdvisedRequest
和 ChatResponse
記錄的哪些數據:
使用示例:
SimpleLoggerAdvisor customLogger = new SimpleLoggerAdvisor(request -> "自定義請求:" + request.userText,response -> "自定義響應:" + response.getResult()
);
運行結果:
到此,Spring AI中的Chat Client部分講解完成,下一篇講解Prompt
!
創作不易,不妨點贊、收藏、關注支持一下,各位的支持就是我創作的最大動力??