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