做音頻的網(wǎng)站正規(guī)接單賺傭金的平臺
Spring AI 1.0.0-M1 版本已經發(fā)布,距離 1.0.0?正式版又更近了一步。同時這也意味著,Spring AI 1.0.0?的 API 已經基本確定,不會發(fā)生大的改動。這里介紹一下,相對于上一個發(fā)布版本?0.8.1,Spring AI 1.0.0?的一些重要的變化。
首先是把與 AI 模型進行交互的?ModelClient?拆分成了兩個接口。Model 接口負責與模型進行交互,承接了之前的 ModelClient 的功能。Client 則負責創(chuàng)建調用 Model 時的請求,以及對 Model 返回的結果進行解析。每個不同類型的 Model , 都應該有與之對應的 Client。目前來說,只提供了與 ChatModel 對應的 ChatClient。ChatClient 提供的是流式 API 接口,在設計上類似 Spring 中已有的 RestClient 和 WebClient。
ChatClient 由 ChatClient.Builder 來負責創(chuàng)建。在創(chuàng)建時,可以配置 ChatClient 的默認行為。ChatClient 的流式 API,可以對發(fā)送給 ChatModel 的 Prompt 進行配置,并對返回的 ChatResponse 進行解析。
使用了 ChatClient 的流式 API 之后,調用大模型并返回結果的基本方式如下所示。
String output = chatClient.prompt().user(input).call().content();
第二個改動是增加了?RequestResponseAdvisor?接口。這個接口的作用是對發(fā)送給模型的請求和得到的響應,進行統(tǒng)一的處理。從接口名稱中可以看出來,用到的是 AOP 的思想。多個 Advisor 可以串聯(lián)成一個鏈條,依次對請求和響應進行處理。多個 Advisor 通過一個 Map 來共享上下文。Spring AI 提供了一些內置的 RequestResponseAdvisor 實現(xiàn),包括在請求中添加歷史消息,以及實現(xiàn)基于向量數(shù)據(jù)庫的問答功能。
public interface RequestResponseAdvisor {default AdvisedRequest adviseRequest(AdvisedRequest request, Map<String, Object> context) {return request;}default ChatResponse adviseResponse(ChatResponse response, Map<String, Object> context) {return response;}default Flux<ChatResponse> adviseResponse(Flux<ChatResponse> fluxResponse, Map<String, Object> context) {return fluxResponse;}}
第三個改動是添加了內置的 Memory 支持,也就是 ChatMemory 接口,以及一個基于內存中的 ConcurrentHashMap 的實現(xiàn)。
public interface ChatMemory {default void add(String conversationId, Message message) {this.add(conversationId, List.of(message));}void add(String conversationId, List<Message> messages);List<Message> get(String conversationId, int lastN);void clear(String conversationId);}
ChatMemory?一般與?RequestResponseAdvisor?搭配使用,以非侵入的方式實現(xiàn)消息歷史記錄功能。Spring AI 內置提供了?MessageChatMemoryAdvisor?和 PromptChatMemoryAdvisor?兩種實現(xiàn)來添加消息歷史記錄。這兩種實現(xiàn)都用到了?ChatMemory。
第四個改動是廢棄了解析模型輸出的?OutputParser?接口及其實現(xiàn),改為使用 StructuredOutputConverter 接口及其實現(xiàn)。同樣提供了 List、Map 和 Bean 三種內置實現(xiàn)。新的接口及其實現(xiàn),可以完全替代之前的接口和實現(xiàn)。
第五個改動是新增了對大模型的輸出進行評價的?Evaluator?接口,以及一個默認的實現(xiàn) RelevancyEvaluator。該默認實現(xiàn)使用大模型來進行評價。
public interface Evaluator {EvaluationResponse evaluate(EvaluationRequest evaluationRequest);}
第六個改動是新增了?DocumentRetriever?接口,表示根據(jù)查詢條件,獲取相關的文檔。
public interface DocumentRetriever extends Function<String, List<Document>> {List<Document> retrieve(String query);default List<Document> apply(String query) {return retrieve(query);}}
以上就是 Spring AI 1.0.0?中比較大的變化。
下面看一下怎么從 Spring AI 0.8.1 升級到 1.0.0。最大的改動來自于 ChatClient。Spring Boot 的自動配置功能,不會再創(chuàng)建 ChatClient 對象,取而代之的是創(chuàng)建 ChatClient.Builder 對象,需要從 Builder 中創(chuàng)建出 ChatClient。
Spring Boot 的自動配置功能會創(chuàng)建 ChatModel。也可以自己創(chuàng)建 Builder 對象。在創(chuàng)建 Builder 對象時必須提供的是 ChatModel。ChatClient 的使用方式也發(fā)生了變化,根據(jù)新的 API 來調整即可。
下面的代碼展示了如何從自定義的 ChatClient.Builder 中創(chuàng)建出 ChatClient。
public class AppConfiguration {@Beanpublic ChatClient chatClient(ChatModel chatModel) {return ChatClient.builder(chatModel).build();}
}
如果使用了解析輸出的 OutputParser 接口,把每個 OutputParser 實現(xiàn)替換成對應的 StructuredOutputConverter 實現(xiàn)即可。比如,ListOutputParser 替換成 ListOutputConverter。解析時調用的方法,從 parse 改成 convert 即可。功能上并沒有什么變化。
其他的功能屬于新增的內容,對使用 Spring AI 0.8.1 的代碼并沒有影響。