遞迴顧問
什麼是遞迴顧問?
遞迴顧問是一種特殊型別的顧問,可以多次迴圈執行下游顧問鏈。當您需要重複呼叫 LLM 直到滿足某個條件時,此模式非常有用,例如:
-
迴圈執行工具呼叫直到不再需要呼叫工具
-
驗證結構化輸出並在驗證失敗時重試
-
使用對請求的修改來實現評估邏輯
-
使用對請求的修改來實現重試邏輯
CallAdvisorChain.copy(CallAdvisor after) 方法是實現遞迴顧問模式的關鍵實用程式。它建立一個新的顧問鏈,其中僅包含原始鏈中指定顧問之後的顧問,並允許遞迴顧問根據需要呼叫此子鏈。這種方法確保了:
-
遞迴顧問可以迴圈執行鏈中剩餘的顧問
-
鏈中的其他顧問可以觀察和攔截每次迭代
-
顧問鏈保持正確的順序和可觀察性
-
遞迴顧問不會重新執行在其之前執行過的顧問
內建遞迴顧問
Spring AI 提供了兩個內建的遞迴顧問來演示這種模式
ToolCallAdvisor
ToolCallAdvisor 將工具呼叫迴圈作為顧問鏈的一部分實現,而不是依賴模型的內部工具執行。這使得鏈中的其他顧問能夠攔截和觀察工具呼叫過程。
主要功能
-
透過設定
setInternalToolExecutionEnabled(false)停用模型的內部工具執行 -
迴圈執行顧問鏈,直到不再存在工具呼叫
-
支援“直接返回”功能——當工具執行具有
returnDirect=true時,它會中斷工具呼叫迴圈並將工具執行結果直接返回給客戶端應用程式,而不是將其傳送回 LLM -
使用
callAdvisorChain.copy(this)建立子鏈以進行遞迴呼叫 -
包含空安全檢查,以處理聊天響應可能為空的情況
示例用法
var toolCallAdvisor = ToolCallAdvisor.builder()
.toolCallingManager(toolCallingManager)
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 300)
.build();
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(toolCallAdvisor)
.build();
StructuredOutputValidationAdvisor
StructuredOutputValidationAdvisor 根據生成的 JSON Schema 驗證結構化 JSON 輸出,並在驗證失敗時重試呼叫,最多重試指定次數。
主要功能
-
從預期輸出型別自動生成 JSON Schema
-
根據 Schema 驗證 LLM 響應
-
如果驗證失敗,重試呼叫,最多可配置次數
-
在重試嘗試時透過驗證錯誤訊息增強提示,以幫助 LLM 糾正其輸出
-
使用
callAdvisorChain.copy(this)建立子鏈以進行遞迴呼叫 -
可選支援自定義
ObjectMapper用於 JSON 處理
示例用法
var validationAdvisor = StructuredOutputValidationAdvisor.builder()
.outputType(MyResponseType.class)
.maxRepeatAttempts(3)
.advisorOrder(BaseAdvisor.HIGHEST_PRECEDENCE + 1000)
.build();
var chatClient = ChatClient.builder(chatModel)
.defaultAdvisors(validationAdvisor)
.build();