探索 Spring AI 的 ChatClient API:構建智能對話應用的利器

探索 Spring AI 的 ChatClient API:構建智能對話應用的利器

前言

在當今人工智能蓬勃發展的時代,智能對話系統成為了眾多應用的核心組成部分。無論是客服機器人、智能助手還是聊天應用,都離不開高效、靈活的對話處理能力。Spring AI 作為 Spring 生態系統中專注于人工智能的框架,為開發者提供了強大的工具和功能。其中,ChatClient API 是一個關鍵組件,它提供了與 AI 模型進行通信的流暢接口,支持同步和流式編程模型,極大地簡化了開發智能對話應用的過程。本文將深入探討 Spring AI 的 ChatClient API,介紹其使用方法、特性以及如何利用它構建強大的智能對話應用。

一、ChatClient 的創建

1.1 使用自動配置的 ChatClient.Builder

Spring AI 提供了 Spring Boot 自動配置,可創建一個原型 ChatClient.Builder bean,方便注入到類中。以下是一個簡單的示例:

@RestController
class MyController {private final ChatClient chatClient;public MyController(ChatClient.Builder chatClientBuilder) {this.chatClient = chatClientBuilder.build();}@GetMapping("/ai")String generation(String userInput) {return this.chatClient.prompt().user(userInput).call().content();}
}

在這個示例中,用戶輸入設置用戶消息的內容,call() 方法向 AI 模型發送請求,content() 方法將 AI 模型的響應作為字符串返回。

1.2 以編程方式創建 ChatClient

如果需要禁用自動配置,可以通過設置屬性 spring.ai.chat.client.enabled=false。然后,根據需要創建 ChatClient.Builder 實例:

ChatModel myChatModel = ... // usually autowiredChatClient.Builder builder = ChatClient.builder(this.myChatModel);// or create a ChatClient with the default builder settings:ChatClient chatClient = ChatClient.create(this.myChatModel);

二、ChatClient Fluent API

ChatClient 的 Fluent API 允許使用重載的 prompt 方法啟動流式 API,支持多種方式構建提示信息:

  • prompt():不帶參數,允許開始構建用戶、系統和提示的其他部分。
  • prompt(Prompt prompt):接受 Prompt 參數,允許傳入 Prompt 實例。
  • prompt(String content):獲取用戶的文本內容。

三、ChatClient 響應處理

3.1 返回 ChatResponse

AI 模型的響應是一個豐富的結構 ChatResponse,包含有關響應生成方式的元數據和多個響應。可以通過調用 chatResponse() 方法獲取:

ChatResponse chatResponse = chatClient.prompt().user("Tell me a joke").call().chatResponse();

3.2 返回實體

可以使用 entity() 方法將返回的字符串轉換為實體類。例如,對于 Java 記錄 ActorFilms

record ActorFilms(String actor, List<String> movies) {}ActorFilms actorFilms = chatClient.prompt().user("Generate the filmography for a random actor.").call().entity(ActorFilms.class);

還支持泛型列表的轉換:

List<ActorFilms> actorFilms = chatClient.prompt().user("Generate the filmography of 5 movies for Tom Hanks and Bill Murray.").call().entity(new ParameterizedTypeReference<List<ActorFilms>>() {});

3.3 流式響應

使用 stream() 方法可以獲得異步響應:

Flux<String> output = chatClient.prompt().user("Tell me a joke").stream().content();

也可以流式傳輸 ChatResponse

Flux<ChatResponse> chatResponse = chatClient.prompt().user("Tell me a joke").stream().chatResponse();

四、使用默認值

@Configuration 類中創建 ChatClient 可以簡化運行時代碼,通過設置默認值,避免在每個請求中重復設置系統文本。

4.1 默認系統文本

@Configuration
class Config {@BeanChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem("You are a friendly chat bot that answers question in the voice of a Pirate").build();}}@RestController
class AIController {private final ChatClient chatClient;AIController(ChatClient chatClient) {this.chatClient = chatClient;}@GetMapping("/ai/simple")public Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {return Map.of("completion", this.chatClient.prompt().user(message).call().content());}
}

4.2 帶參數的默認系統文本

@Configuration
class Config {@BeanChatClient chatClient(ChatClient.Builder builder) {return builder.defaultSystem("You are a friendly chat bot that answers question in the voice of a {voice}").build();}}@RestController
class AIController {private final ChatClient chatClient;AIController(ChatClient chatClient) {this.chatClient = chatClient;}@GetMapping("/ai")Map<String, String> completion(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message, String voice) {return Map.of("completion",this.chatClient.prompt().system(sp -> sp.param("voice", voice)).user(message).call().content());}}

五、顧問(Advisors)

Advisors API 提供了一種靈活而強大的方法來攔截、修改和增強 Spring 應用程序中的 AI 驅動的交互。常見的使用場景是在提示中附加上下文數據,如對話歷史記錄或自定義數據。

5.1 ChatClient 中的 Advisor 配置

ChatClient.builder(chatModel).build().prompt().advisors(new MessageChatMemoryAdvisor(chatMemory),new QuestionAnswerAdvisor(vectorStore)).user(userText).call().content();

在這個配置中,MessageChatMemoryAdvisor 將首先執行,將對話歷史記錄添加到提示符中,然后 QuestionAnswerAdvisor 將根據用戶的問題和添加的對話歷史記錄執行搜索,提供更相關的結果。

5.2 不同類型的 Advisor 實現

  • MessageChatMemoryAdvisor:檢索內存并將其作為消息集合添加到提示符中。
  • PromptChatMemoryAdvisor:檢索內存并將其添加到提示的系統文本中。
  • VectorStoreChatMemoryAdvisor:允許指定 VectorStore 實例、默認對話 ID、聊天歷史記錄窗口大小和順序。

六、日志記錄

SimpleLoggerAdvisor 是一個用于記錄 ChatClient 請求和響應數據的顧問,可用于調試和監控 AI 交互。要啟用日志記錄,將其添加到顧問鏈中,并設置日志級別為 DEBUG:

ChatResponse response = ChatClient.create(chatModel).prompt().advisors(new SimpleLoggerAdvisor()).user("Tell me a joke?").call().chatResponse();

application.propertiesapplication.yaml 文件中添加:

logging.level.org.springframework.ai.chat.client.advisor=DEBUG

七、聊天內存(Chat Memory)

ChatMemory 接口表示聊天對話歷史的存儲,提供了添加消息、檢索消息和清除對話歷史的方法。目前有四種實現:InMemoryChatMemoryCassandraChatMemoryNeo4jChatMemoryJdbcChatMemory,分別提供了內存存儲、Cassandra 持久化存儲、Neo4j 持久化存儲和 JDBC 持久化存儲。

7.1 CassandraChatMemory

CassandraChatMemory.create(CassandraChatMemoryConfig.builder().withTimeToLive(Duration.ofDays(1)).build());

7.2 Neo4jChatMemory

支持多個配置參數,可通過屬性文件進行配置。

7.3 JdbcChatMemory

JdbcChatMemory.create(JdbcChatMemoryConfig.builder().jdbcTemplate(jdbcTemplate).build());

也可以通過添加依賴進行自動配置:

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-chat-memory-jdbc</artifactId>
</dependency>

總結

Spring AI 的 ChatClient API 為開發者提供了一個強大而靈活的工具,用于構建智能對話應用。通過其流暢的 API、豐富的響應處理方式、默認值設置、顧問機制、日志記錄和聊天內存管理等功能,開發者可以更輕松地實現與 AI 模型的交互,處理復雜的對話場景。無論是創建簡單的聊天機器人還是復雜的智能客服系統,ChatClient API 都能幫助開發者快速搭建高效、智能的對話應用。在使用過程中,開發者需要根據具體需求合理配置和使用各個組件,同時注意日志記錄中的敏感信息處理,確保應用的安全性和可靠性。隨著人工智能技術的不斷發展,Spring AI 的 ChatClient API 也將不斷完善和擴展,為開發者帶來更多的便利和可能性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78282.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78282.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78282.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開源ERP系統對比:Dolibarr、ERPNext與Odoo

對于尋求開源ERP解決方案的企業而言&#xff0c;Dolibarr、ERPNext和Odoo是三個備受關注的選擇。它們各自擁有獨特的優勢和特點&#xff0c;適用于不同規模和需求的組織。以下是對這三個系統的詳細介紹和對比&#xff0c;以幫助您更好地理解它們的差異&#xff0c;并結合中文支…

【2025年】MySQL面試題總結

文章目錄 1. MySQL 支持哪些存儲引擎&#xff1f;默認使?哪個&#xff1f;2. MyISAM 和 InnoDB 有什么區別&#xff1f;3. 事務的四大特性?4. 并發事務帶來了哪些問題?5. 不可重復讀和幻讀有什么區別&#xff1f;6. MySQL 事務隔離級別&#xff1f;默認是什么級別&#xff1…

Linux常用命令29——delgroup刪除組

在使用Linux或macOS日常開發中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;delgroup 是用于刪除用戶組的一個命令。此命令通常由超級用戶&#xff08;root&#xff09;運行&#xff0c;或者通過 sudo 提權來操作。本篇學習記錄delgroup命令的基本使用。 下面…

字節暑期實習-網絡運維工程師面經

崗位描述 這個是ByteIntern實習&#xff0c;是暑期實習崗位 崗位 一面 先自我介紹 抓項目技術&#xff08;會進行確認是什么技術&#xff09; TCP的三次握手和四次揮手 序列號和確認應答號的位置和大小 序列號是隨機的嗎&#xff1f; 序列號為什么是隨機的&#xff1f; …

5.3刷題

P3370 【模板】字符串哈希 #include<bits/stdc.h> using namespace std; #define int long long typedef unsigned long long ull; int n; ull myhash(string s){ull code 0, x 131, y 140814840257324663;for(int i 0; i < s.size(); i){code (code * x (ull)…

Kettle下載安裝教程

## 什么是Kettle Kettle&#xff08;現在也稱為Pentaho Data Integration&#xff0c;簡稱PDI&#xff09;是一款開源的ETL&#xff08;Extract-Transform-Load&#xff09;工具&#xff0c;用于數據抽取、轉換和加載。它允許用戶通過圖形化界面設計和執行數據集成流程&#xf…

FreeRtos實戰從入門到精通--任務創建和刪除(動態方法)--事了拂衣去,深藏功與名

FreeRtos是之前的一些聰明的工程師寫的免費且開源的嵌入式實時操作系統代碼&#xff0c;由于我們實際工作中不需要再去寫rtos&#xff0c;我們只需要用就行了&#xff0c;所以博主這里只分享項目工程實戰相關的內容&#xff0c;具體rtos源碼&#xff0c;可以無需理會&#xff0…

Java通用Mapper自定義方法

目錄 一、定義通用 Mapper 接口二、繼承通用 Mapper 實現自定義方法三、注冊自定義 Mapper 接口四、在實體類對應的 Mapper 接口中使用自定義方法五、實現自定義方法的 SQL 邏輯注解方式XML 映射文件方式六、使用自定義方法七、注意事項在 Java 持久層開發中,MyBatis 的通用 M…

Android WebRTC回聲消除

文章目錄 安卓可用的回聲消除手段各種回聲消除技術優缺點WebRTC回聲消除WebRTC回聲消除回聲消除處理流程WebRTC AECM APP 安卓可用的回聲消除手段 硬件回聲消除 使用 AudioRecord 的 VOICE_COMMUNICATION 模式&#xff1a;通過 AudioRecord 的 VOICE_COMMUNICATION 音頻源可以…

基于 SAFM 超分辨率上采樣模塊的 YOLOv12 改進方法—模糊場景目標檢測精度提升研究

在復雜視覺環境中,如低光照、霧天或遠距離拍攝等場景下,圖像質量下降導致目標模糊,使得傳統目標檢測模型難以實現高精度識別。YOLO系列作為主流單階段檢測框架,在速度和精度方面表現出色,但在模糊和小目標場景中仍存在性能瓶頸。本文提出一種面向 YOLOv12 的創新性改進方法…

Spring 事務的底層原理常見陷阱

一、Spring 事務的底層原理 1. 核心機制 動態代理&#xff08;AOP&#xff09;&#xff1a; Spring 通過動態代理&#xff08;JDK 或 CGLIB&#xff09;生成代理對象&#xff0c;攔截被 Transactional 注解標記的方法。事務攔截器&#xff1a; TransactionInterceptor 負責管…

Java SE(6)——類和對象(一)

1.初始面向對象 1.1 什么是面向對象 Java是一門純面向對象的編程語言(Object Oriented Program&#xff0c;簡稱OOP)&#xff0c;在面向對象的世界里&#xff0c;一切皆為對象。面向對象是解決問題的一種思想&#xff0c;主要依靠對象之間的交換來完成一件事情 1.2 面向過程…

cpp細碎知識點

1 重寫 (Override): 派生類中定義一個與基類虛函數具有相同函數簽名&#xff08;函數名、參數列表、返回類型&#xff09;的函數&#xff0c;這被稱為重寫。 重寫意味著派生類提供了基類虛函數的一個特定于派生類的實現。 重寫是實現多態的關鍵 2 虛基類 (Virtual Base Class…

若依 FastAPI + Vue3 項目 Docker 部署筆記( 啟動器打包教程)

本文記錄了將 start.bat 打包成 .exe 啟動器的詳細教程&#xff0c;適合項目交付或導師演示用。 &#x1f9ed; 一、如何將 start.bat 打包為啟動器 .exe&#xff08;含圖標 自動打開瀏覽器&#xff09; ? 1. 創建三大功能腳本 start.bat → 啟動項目&#xff08;docke…

基于springboot的金院銀行廳預約系統的設計及實現(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 隨著信息技術在管理上越來越深入而廣泛的應用&#xff0c;信息管理系統的實施在技術上已逐步成熟。信息管理系統是一個不斷發展的新型學科&#xff0c;任何一個單位要生存要發展&#xff0c;要高效率地把內部活動有機地組織起來&#xff0c;就必須建立與自身特點相適應的…

創意控制臺:下雨動畫特效(ASCII 雨滴下落)

在編程的世界里&#xff0c;控制臺不僅僅是輸出文本信息的工具&#xff0c;通過巧妙的代碼設計&#xff0c;我們還能在其中創造出充滿趣味的動態畫面。本文將帶領大家使用 C 語言打造一個創意控制臺下雨動畫特效&#xff0c;利用 ASCII 字符模擬雨滴下落的過程&#xff0c;為單…

MySQL--索引入門

MySQL官方對索引的定義為&#xff1a;索引&#xff08;Index&#xff09;是幫助MySQL高效獲取數據的數據結構。 Mysql在存儲數據之外&#xff0c;數據庫系統各種還維護著滿足特定查找算法的數據結構&#xff0c;這些數據結構以某種引用&#xff08;指向&#xff09;表中的數據…

MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong

接上文 MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - user/_sleep 是什么&#xff1f;做什么&#xff1f; pingpong 不務正業了那么久(然而并沒有&#xff0c;雖然還在探索sleep&#xff0c;但是教材我已經看完了前三章了)&#xff0c;讓我們趕緊繼續下去 在進行本實驗之前請務…

前端面經-VUE3篇(二)--vue3組件知識(一)組件注冊、props 與 emits、透傳、插槽(Slot)

組件允許我們將 UI 劃分為獨立的、可重用的部分&#xff0c;并且可以對每個部分進行單獨的思考。在實際應用中&#xff0c;組件常常被組織成一個層層嵌套的樹狀結構&#xff1a; 一、注冊 Vue 組件本質上是一個可以復用的 自定義 HTML 元素&#xff0c;為了在其他組件中使用一…

LeetCode —— 102. 二叉樹的層序遍歷

&#x1f636;?&#x1f32b;?&#x1f636;?&#x1f32b;?&#x1f636;?&#x1f32b;?&#x1f636;?&#x1f32b;?Take your time ! &#x1f636;?&#x1f32b;?&#x1f636;?&#x1f32b;?&#x1f636;?&#x1f32b;?&#x1f636;?&#x1f32b;?…