?
核心組件
API 由非流式處理方案和 和 流式處理方案組成。?
在1.0.0版本中,顧問鏈AdvisorChain相關接口已經棄用,可能是老版本的思想不太合倫理吧
可以使用下面的方式實現多個顧問按oder順序訪問模型
public ChatController(ChatClient.Builder chatClientBuilder) {MySimpleLoggerAdvisor advisor3= new MySimpleLoggerAdvisor(3);MySimpleLoggerAdvisor advisor2= new MySimpleLoggerAdvisor(2);MySimpleLoggerAdvisor advisor1= new MySimpleLoggerAdvisor(1);this.chatClient = chatClientBuilder//此處執行順序由order決定,并非添加順序決定.defaultAdvisors(List.of(advisor3,advisor2,advisor1)).defaultSystem("You are a helpful assistant").build();}
下圖說明了顧問鏈和聊天模型之間的交互:
顧問advice之間的request和response 基于order 對稱,比如三個女孩子按順序123追你,你給出的答復順序則應該是321
?
交互返回:
Spring AI 提供了兩種類型的內存顧問程序來維護對話上下文:
顧問 | 存儲機制 | 模板占位符 |
---|---|---|
PromptChatMemoryAdvisor | 內存中或自定義 | instructions ,memory |
VectorStoreChatMemoryAdvisor | 向量數據庫 | instructions ,long_term_memory |
下面是一個簡單顧問的實現用于參考學習:
package com.example.advisor;import org.springframework.ai.chat.client.ChatClientRequest;
import org.springframework.ai.chat.client.ChatClientResponse;
import org.springframework.ai.chat.client.advisor.api.CallAdvisor;
import org.springframework.ai.chat.client.advisor.api.CallAdvisorChain;
import org.springframework.ai.chat.client.advisor.api.StreamAdvisor;
import org.springframework.ai.chat.client.advisor.api.StreamAdvisorChain;
import reactor.core.publisher.Flux;public class MySimpleLoggerAdvisor implements CallAdvisor, StreamAdvisor {private Integer order;public MySimpleLoggerAdvisor() {super();}public MySimpleLoggerAdvisor(Integer preOrder) {order = preOrder;}public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAdvisorChain callAdvisorChain) {System.out.println("BEFORE: {}" + chatClientRequest);System.out.println("do something order " + this.order);ChatClientResponse chatClientResponse = callAdvisorChain.nextCall(chatClientRequest);System.out.println("AFTER: {}" + chatClientResponse);System.out.println("was do something order " + this.order);return chatClientResponse;}@Overridepublic String getName() {return "MySimpleLoggerAdvisor";}@Overridepublic int getOrder() {return this.order == null ? 0 : this.order;}// @Override
// public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {
//
// logger.debug("BEFORE: {}", advisedRequest);
//
// AdvisedResponse advisedResponse = chain.nextAroundCall(advisedRequest);
//
// logger.debug("AFTER: {}", advisedResponse);
//
// return advisedResponse;
// }
//@Overridepublic Flux<ChatClientResponse> adviseStream(ChatClientRequest chatClientRequest, StreamAdvisorChain streamAdvisorChain) {System.out.println("BEFORE: {}" + chatClientRequest);System.out.println("do something");Flux<ChatClientResponse> chatClientResponse = streamAdvisorChain.nextStream(chatClientRequest);System.out.println("AFTER: {}" + chatClientResponse);System.out.println("was do something");return chatClientResponse;}// @Override
// public Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {
//
// logger.debug("BEFORE: {}", advisedRequest);
//
// Flux<AdvisedResponse> advisedResponses = chain.nextAroundStream(advisedRequest);
//
// return new MessageAggregator().aggregateAdvisedResponse(advisedResponses,
// advisedResponse -> logger.debug("AFTER: {}", advisedResponse));
// }
}
最后分析一下顧問模塊的依賴關系:chatclient客戶端是依賴于它的,他和chatclient客戶端也同時依賴于spring-ai-模型,Core Advisor 框架在spring-ai-模型中得到定義和泛化
?
?