AgentAgenticPatterns 簡介
在最近的一篇研究報告《構建高效代理》 中,Anthropic
分享了關于構建高效大語言模型(LLM
)代理的寶貴見解。這項研究特別有趣的地方在于,它強調簡單性和可組合性,而非復雜的框架。讓我們來探索如何利用Spring AI
將這些原則轉化為實際的實現。
什么是智能體
”智能體” 有多種定義方式。一些用戶將智能體定義為完全自主的系統,這類系統能夠長時間獨立運行,使用各種工具完成復雜任務。還有一些人用這個術語描述遵循預定義工作流程、指令性更強的實施方案。在Anthropic的定義當中,將所有這些變體都歸類為智能系統,但在架構上對工作流程和智能體做出了重要區分:
- 工作流:指通過預定義代碼路徑來協調大語言模型和工具的系統。
- 智能體:則是大語言模型能夠動態指導自身流程和工具使用,對完成任務的方式保持控制權的系統。
關鍵的一點是,雖然完全自主的代理可能很有吸引力,但對于定義明確的任務,工作流通常能提供更好的可預測性和一致性。這與企業對可靠性和可維護性至關重要的要求完美契合。接下來,我們將詳細探討這兩類智能系統。
代理系統
在使用大語言模型構建應用程序時,我們建議盡可能尋找最簡單的解決方案,僅在必要時增加復雜性。這可能意味著根本無需構建智能系統。智能系統通常會用延遲和成本來換取更好的任務性能,應該考慮這種權衡在何種情況下是合理的。
當確實需要增加復雜性時,對于定義明確的任務,工作流程能提供可預測性和一致性。
而當大規模需要靈活性和基于模型的決策時,智能體則是更好的選擇。然而,對于許多應用程序而言,通過檢索和上下文示例優化單個大語言模型調用通常就已足夠。
讓我們通過五個基本模式來看看Spring AI是如何實現這些概念的,每個模式都適用于特定的用例:
鏈式工作流
這個模式就像工廠流水線——把復雜任務拆成一個個小工序,前一道工序的結果自動傳給下一道。技術實現上用了”責任鏈”設計模式,支持隨時增加新的處理環節。
使用場景
這個實現展示了幾個關鍵原則:
- 需要分步驟完成的復雜任務(比如先查天氣再規劃行程最后生成攻略)
- 寧愿多花點時間也要保證準確率(像重要文件的多級審批)
- 后一步依賴前一步的結果(就像做菜必須按洗菜→切菜→炒菜的順序)
以下是Spring AI實現的一個實際示例:
public class ChainWorkflow {private final ChatClient chatClient;private final String[] systemPrompts;// 通過一系列提示處理輸入,其中每一步的輸出成為鏈中下一個步驟的輸入。public String chain(String userInput) {String response = userInput;for (String prompt : systemPrompts) {// 將系統提示與上一個響應結合String input = String.format("{%s}\n {%s}", prompt, response);// 通過大語言模型處理并捕獲輸出response = chatClient.prompt(input).call().content();}return response;}
}
并行化工作流
這個模式就像開了多個窗口同時干活——讓多個大模型同時處理任務,最后把結果匯總起來。主要有兩種方式:
- 分片處理:把大任務拆成小任務,分給不同的大模型同時處理(類似分工作業)
- 投票機制:讓多個大模型同時處理同一個任務,最后投票選出最佳結果(像開會討論)
使用場景
并行化工作流模式展示了對多個大語言模型操作的高效并發處理。這種模式對于需要并行執行大語言模型調用并自動聚合輸出的場景特別有用。
- 要處理一堆相似但互不干擾的任務(比如同時分析多個用戶群體的數據)
- 需要多個任務獨立運行(像工廠里的流水線作業)
- 任務能快速拆解且可以并行執行(比如同時生成多個產品描述)
以下是Spring AI實現的一個實際示例,比如要分析市場變化對四類利益群體的影響,我們可以讓四個大模型同時開工::
List<String> parallelResponse = new ParallelizationWorkflow(chatClient).parallel("Analyze how market changes will impact this stakeholder group.",List.of("Customers: ...","Employees: ...","Investors: ...","Suppliers: ..."),4);
路由工作流
路由模式實現了智能任務分配,能夠針對不同類型的輸入進行專門處理,這種模式專為復雜任務設計,不同類型的輸入由專門的流程處理會更好。 這個模式就像智能分診臺——能自動識別問題類型,轉給最專業的處理流程。技術實現上相當于給大模型裝了個智能路由器,不同的問題自動走專用通道。
使用場景
它使用大語言模型分析輸入內容,并將其路由到最合適的專門提示或處理程序。
- 要處理五花八門的問題類型(比如客服系統同時接咨詢、投訴、技術問題)
- 不同問題需要不同專家處理(像醫院分內科/外科/急診)
- 需要精準分類輸入內容(像快遞自動分揀系統)
以下是使用路由工作流的基本示例:
@Autowired private ChatClient chatClient;// 創建工作流
RoutingWorkflow workflow = new RoutingWorkflow(chatClient);// 為不同類型的輸入定義專門的提示
Map<String, String> routes = Map.of("billing", "You are a billing specialist. Help resolve billing issues...","technical", "You are a technical support engineer. Help solve technical problems...","general", "You are a customer service representative. Help with general inquiries..."
);// 處理輸入
String input = "My account was charged twice last week";
String response = workflow.route(input, routes);
協調者-執行者
這個模式就像電影拍攝現場——導演(協調者)負責分鏡頭,各工種(執行者)專注自己的專業領域。技術實現上采用”中央指揮部+特種部隊”的架構,既保持靈活又確保可控。
使用場景
當你的任務像建造摩天大樓需要多方協作時:
- 任務復雜到無法提前拆解(像應對突發事件的應急小組)
- 需要不同專業視角(像建筑設計需要結構/水電/裝修多方配合)
- 解決方案需要動態調整(像軍事行動中的實時戰術變化)
實現使用Spring AI的ChatClient
進行大語言模型交互,包括:
public class OrchestratorWorkersWorkflow {public WorkerResponse process(String taskDescription) {// 1. 協調器分析任務并確定子任務OrchestratorResponse orchestratorResponse = //...// 2. 工作器并行處理子任務List<String> workerResponses = //...// 3. 結果合并為最終響應return new WorkerResponse(/*...*/);}
}ChatClient chatClient = //... 初始化聊天客戶端
OrchestratorWorkersWorkflow workflow = new OrchestratorWorkersWorkflow(chatClient);// 處理任務
WorkerResponse response = workflow.process("Generate both technical and user-friendly documentation for a REST API endpoint"
);// 訪問結果
System.out.println("Analysis: " + response.analysis());
System.out.println("Worker Outputs: " + response.workerResponses());
評估者-優化者
這個模式就像作家與編輯的協作——寫手(生成者)負責創作初稿,編輯(評估者)逐字推敲提出修改意見。技術實現上采用”創作-反饋”循環機制,直到作品達到出版標準。
- 生成者大語言模型:生成初始響應并根據反饋進行改進。
- 評估者大語言模型:分析響應并提供詳細的改進反饋。
使用場景
評估者 - 優化者模式適用于需要多輪迭代以提高質量的任務。
- 有明確的品質標準(像學術論文需要同行評審)
- 迭代改進能顯著提升價值(像廣告文案的AB測試)
- 追求完美輸出(像電影劇本的多次修訂)
實現使用Spring AI的ChatClient
進行大語言模型交互,包括:
public class EvaluatorOptimizerWorkflow {public RefinedResponse loop(String task) {// 1. 生成初始解決方案Generation generation = generate(task, context);// 2. 評估解決方案EvaluationResponse evaluation = evaluate(generation.response(), task);// 3. 如果通過,返回解決方案// 4. 如果需要改進,結合反饋并生成新的解決方案// 5. 重復直到滿意return new RefinedResponse(finalSolution, chainOfThought);}
}ChatClient chatClient = //... 初始化聊天客戶端
EvaluatorOptimizerWorkflow workflow = new EvaluatorOptimizerWorkflow(chatClient);// 處理任務
RefinedResponse response = workflow.loop("Create a Java class implementing a thread-safe counter"
);// 訪問結果
System.out.println("Final Solution: " + response.solution());
System.out.println("Evolution: " + response.chainOfThought());
結論
Anthropic的研究見解與Spring AI的實際實現相結合,為構建有效的基于大語言模型的系統提供了強大的框架。通過遵循這些模式和原則,開發人員可以創建健壯、可維護且高效的AI應用程序,在避免不必要復雜性的同時提供真正的價值。
關鍵是要記住,有時最簡單的解決方案就是最有效的。從基本模式開始,徹底了解你的運用場景,只有在復雜性能顯著提高系統性能或功能時才進行設計。