領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多在快速發展的人工智慧世界中,開發人員不斷尋求增強其 AI 應用程式的方法。Spring AI,一個用於構建 AI 驅動型應用程式的 Java 框架,引入了一項強大的功能:Spring AI Advisors。
Advisors 可以為您的 AI 應用程式提供強大的支援,使其更具模組化、可移植性,並且更易於維護。
如果閱讀文章不方便,您可以收聽這個**實驗性**播客,它**由 AI 生成**,內容來自部落格文章。
Spring AI Advisor 的核心是元件,它們會攔截並可能修改 AI 應用程式中聊天補全請求和響應的流程。系統中的關鍵參與者是 AroundAdvisor,它允許開發人員動態地轉換或利用這些互動中的資訊。
使用 Advisor 的主要好處包括:
Advisor 系統作為一個鏈式結構執行,序列中的每個 Advisor 都有機會處理傳入的請求和傳出的響應。下面是簡化的流程:
AdvisedRequest,以及一個空的 advisor-context。AdvisedResponse 傳遞迴 Advisor 鏈,它結合了原始的 ChatResponse 和鏈的輸入路徑中的 advise context。AdvisedResponse 中增強的 ChatResponse 被返回給客戶端。Spring AI 提供了幾個預構建的 Advisor 來處理常見場景和 Gen AI 模式。
使用 ChatClient API,您可以在管道中註冊所需的 Advisor。
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(
new MessageChatMemoryAdvisor(chatMemory), // chat-memory advisor
new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()) // RAG advisor
)
.build();
String response = chatClient.prompt()
// Set chat memory parameters at runtime
.advisors(advisor -> advisor.param("chat_memory_conversation_id", "678")
.param("chat_memory_response_size", 100))
.user(userText)
.call()
.content();
Advisor API 包含用於非流式處理的 CallAroundAdvisor 和 CallAroundAdvisorChain,以及用於流式處理場景的 StreamAroundAdvisor 和 StreamAroundAdvisorChain。它還包括 AdvisedRequest 來表示未封鎖的 Prompt 請求資料,以及 AdvisedResponse 來表示聊天補全資料。AdvisedRequest 和 AdvisedResponse 都有一個 advise-context 欄位,用於在 Advisor 鏈中共享狀態。
建立自定義 Advisor 非常簡單。讓我們實現一個簡單的日誌 Advisor 來演示這個過程。
public class SimpleLoggerAdvisor implements CallAroundAdvisor, StreamAroundAdvisor {
private static final Logger logger = LoggerFactory.getLogger(SimpleLoggerAdvisor.class);
@Override
public String getName() {
return this.getClass().getSimpleName();
}
@Override
public int getOrder() {
return 0;
}
@Override
public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {
logger.debug("BEFORE: {}", advisedRequest);
AdvisedResponse advisedResponse = chain.nextAroundCall(advisedRequest);
logger.debug("AFTER: {}", advisedResponse);
return advisedResponse;
}
@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));
}
}
此 Advisor 會在請求被處理之前記錄請求,並在收到響應之後記錄響應,從而為 AI 互動過程提供有價值的見解。
aggregateAdvisedResponse(...) 工具將 AdviseResponse 塊聚合為單個 AdvisedResponse,返回原始流並接受一個 Consumer 回撥以獲取完成的結果。它保留了原始內容和上下文。
讓我們基於 Re-Reading (Re2) 技術實現一個更高階的 Advisor,該技術受此 論文 啟發,可以提高大型語言模型的推理能力。
public class ReReadingAdvisor implements CallAroundAdvisor, StreamAroundAdvisor {
private static final String DEFAULT_USER_TEXT_ADVISE = """
{re2_input_query}
Read the question again: {re2_input_query}
""";
@Override
public String getName() {
return this.getClass().getSimpleName();
}
@Override
public int getOrder() {
return 0;
}
private AdvisedRequest before(AdvisedRequest advisedRequest) {
String inputQuery = advisedRequest.userText(); //original user query
Map<String, Object> params = new HashMap<>(advisedRequest.userParams());
params.put("re2_input_query", inputQuery);
return AdvisedRequest.from(advisedRequest)
.withUserText(DEFAULT_USER_TEXT_ADVISE)
.withUserParams(params)
.build();
}
@Override
public AdvisedResponse aroundCall(AdvisedRequest advisedRequest, CallAroundAdvisorChain chain) {
return chain.nextAroundCall(before(advisedRequest));
}
@Override
public Flux<AdvisedResponse> aroundStream(AdvisedRequest advisedRequest, StreamAroundAdvisorChain chain) {
return chain.nextAroundStream(before(advisedRequest));
}
}
此 Advisor 修改輸入查詢,以包含一個“重讀”步驟,可能可以提高 AI 模型對問題的理解和推理能力。
Spring AI 的高階主題涵蓋了 Advisor 管理的重要方面,包括*順序控制*、*狀態共享*和*流式處理能力*。Advisor 的執行順序由 getOrder() 方法決定。Advisor 之間的狀態共享透過共享的 advise-context 物件實現,從而支援複雜的多個 Advisor 場景。該系統同時支援流式處理和非流式處理 Advisor,允許處理完整的請求和響應,或使用響應式程式設計概念處理連續的資料流。
Advisor 在鏈中的順序至關重要,它由 getOrder() 方法決定。具有較低順序值的 Advisor 會先執行。由於 Advisor 鏈是一個棧,鏈中的第一個 Advisor 最後處理請求,最先處理響應。如果您想確保某個 Advisor 最後執行,請將其順序設定為接近 Ordered.LOWEST_PRECEDENCE 的值;反之,要先執行,請將其順序設定為接近 Ordered.HIGHEST_PRECEDENCE 的值。如果您有多個具有相同順序值的 Advisor,則執行順序不確定。
AdvisedRequest 和 AdvisedResponse 都共享一個 advise-context 物件。您可以使用 advise-context 在鏈中的 Advisor 之間共享狀態,並構建涉及多個 Advisor 的更復雜的處理場景。
Spring AI 支援流式處理和非流式處理 Advisor。非流式處理 Advisor 處理完整的請求和響應,而流式處理 Advisor 則使用響應式程式設計概念(例如,Flux 用於響應)來處理連續的流。
對於流式處理 Advisor,需要注意的是,單個 AdvisedResponse 例項僅代表整個 Flux<AdvisedResponse> 響應的一部分。相比之下,對於非流式處理 Advisor,AdvisedResponse 包含了完整的響應。
advise-context 在 Advisor 之間共享狀態。Spring AI Advisor 提供了一種強大而靈活的方式來增強您的 AI 應用程式。透過利用此 API,您可以建立更復雜、可重用且易於維護的 AI 元件。無論您是實現自定義邏輯、管理對話歷史還是改進模型推理,Advisor 都提供了清晰有效的解決方案。
我們鼓勵您在專案中嘗試使用 Spring AI Advisor,並與社群分享您的自定義實現。可能性是無限的,您的創新可能有助於塑造 AI 應用程式開發的未來!
祝您編碼愉快,願您的 AI 應用程式越來越智慧、響應迅速!