如何構建自定義代理腳手架
本文介紹了使用LangChain的create_agent和中間件構建自定義代理腳手架的方法。代理由模型和腳手架組成,腳手架負責將模型連接到真實世界。通過中間件,可以在代理循環的各個階段插入自定義邏輯、工具、狀態管理等,從而實現高度定製化的代理。
構建有用的代理在很大程度上取決於定製化:將代理連接到正確的上下文、數據和環境以完成特定任務。從本質上看,代理是一個模型在循環中調用工具,直到完成任務並返回結果。你也可以將代理定義為:代理 = 模型 + 腳手架。腳手架是圍繞模型的框架,將模型連接到真實世界。一個代理的好壞取決於提供給模型的上下文,而腳手架的工作就是在每一步為模型提供正確的上下文。因此,要構建有用的代理,你需要一個擅長為給定任務傳遞正確上下文的腳手架。
create_agent是LangChain用於構建腳手架的原語。傳入模型、工具和系統提示,你就擁有了一個可工作的代理。像Deep Agents和Claude Agent SDK這樣的腳手架預裝了意見性的中間件堆棧:記憶、上下文管理、沙箱等。它們旨在讓你快速獲得一個生產就緒的代理,並且在大多數情況下表現良好。但許多代理需要比這些腳手架支持的更細粒度的定製:自定義提示、業務邏輯、護欄等。
create_Agent採用了不同的方法:它故意保持極簡。我們的理念與高度可配置的編碼代理腳手架Pi類似。create_agent僅實現核心代理循環,並將中間件作為定製化的原語公開。中間件在代理循環的每個步驟中掛接:模型調用前後、工具調用前後、代理啓動和關閉時。每個中間件處理一個關注點,並可以與其他中間件自由組合。
中間件允許你通過幾個通常協同工作的槓桿為代理添加能力:確定性邏輯、工具、自定義狀態和流處理器。確定性邏輯包括業務邏輯、策略執行、動態代理控制等,這些都不能也不應該放在提示中。工具方面,中間件可以處理工具的完整生命週期——設置、拆除、註冊——並給代理提供一套乾淨的工具。自定義狀態允許中間件在鈎子之間跟蹤狀態,例如維護計數器、標誌或其他在代理運行期間持續存在的值。流處理器可以攔截和轉換代理的輸出流——過濾事件、注入元數據、將不同事件類型路由到不同消費者。
中間件的優點在於:它允許在代理循環的任何點進行定製,並將相關邏輯捆綁到可組合、可共享的代碼單元中。LangChain為最常見的模式提供了預構建的中間件。任何針對你用例的定製都可以通過一個自定義中間件實現。由於每個中間件是隔離的,同一個中間件可以跨組織中的每個代理重用,從而新代理無需重新構建即可繼承經過實戰檢驗的行為。
腳手架的工作是在正確的時間為給定任務提供正確的上下文。下表將常見能力映射到支持這些能力的中間件。大多數生產代理最終會同時使用多種中間件,具體取決於代理的需求(是否長時間運行?任務有多複雜?代理的行為有多敏感?等):防止上下文溢出(SummarizationMiddleware, ContextEditingMiddleware)、訪問和更新記憶(FilesystemMiddleware, MemoryMiddleware, SkillsMiddleware)、在環境中執行操作(ShellToolMiddleware, FilesystemMiddleware, CodeInterpreterMiddleware)、委託任務(SubAgentMiddleware, AsyncSubAgentMiddleware, TodoListMiddleware)、處理暫時性故障(ToolRetryMiddleware, ModelRetryMiddleware, ModelFallbackMiddleware)、執行策略(PIIMiddleware, HumanInTheLoopMiddleware)、引導代理(HumanInTheLoopMiddleware)、控制成本(ModelCallLimitMiddleware, ToolCallLimitMiddleware, PromptCachingMiddleware)。
任務與腳手架的匹配度決定了你的腳手架與實際任務需求的契合程度:所需的上下文、將遇到的失敗、必須執行的策略、操作的環境。客服代理的腳手架與長時間運行的編碼代理的腳手架截然不同。我們在LangChain構建的每個代理,包括我們的GTM代理、異步編碼代理和無代碼代理構建器,都基於create_agent,並配有適合該代理使命的中間件堆棧。最好的代理不僅由強大的模型構建,還由緊密契合任務的腳手架構建。使用create_agent構建自定義腳手架是最簡單的方法。