在Deep Agents中引入動態子代理
動態子代理允許AI智慧體使用程式碼而非工具呼叫來大規模編排工作。瞭解Deep Agents中的程式化編排如何保證覆蓋範圍、處理扇出,並透過常見編排模式和即時跟蹤實現可靠的多步驟複雜智慧體管道。
隨著AI智慧體承擔越來越複雜的任務,它們在規模化的可靠執行和上下文管理方面面臨挑戰。Deep Agents引入的動態子代理(Dynamic Subagents)透過一種全新的方式解決了這些問題:智慧體不再透過通用的工具呼叫逐個啟動子任務,而是編寫一段簡短的指令碼來驅動子代理的執行。這種方式利用了模型在編寫程式碼(如迴圈、分支、併發等)方面的優勢,生成適合任務的編排邏輯。
傳統的子代理呼叫方式在規模較小時工作良好,但當需要同時啟動數百個子代理,或者編排邏輯涉及條件分支和多階段處理時,就會失效。動態子代理透過程式化編排解決了這一難題:智慧體編寫一個簡短的指令碼,在輕量級直譯器中執行,從而實現對子代理的靈活排程。例如,在處理一份300頁的文件時,智慧體不再需要呼叫300次工具,而是編寫一個迴圈,使用Promise.all並行處理所有頁面。這種方法的優勢在於:第一,確定性覆蓋——指令碼保證了所有項都會被處理,而不會像無結構方法那樣只處理部分就停止;第二,可靠複雜編排——將編排邏輯寫成程式碼,比讓模型透過一系列工具呼叫來重現更加可靠。
要使用動態子代理,需要兩個元件:用於分派工作的子代理和程式碼直譯器。Deep Agents自帶一個基於QuickJS的可選直譯器。使用者只需安裝相應的中介軟體包,並在建立智慧體時傳入CodeInterpreterMiddleware即可。此外,Deep Agents內建了一個通用子代理,使用者也可以配置自定義子代理,透過名稱、描述和系統提示來指定不同角色。要觸發動態子代理,只需在提示中包含“workflow”一詞。例如,要求智慧體“執行一個工作流,檢查src/routes/中的每個檔案並總結主要風險”。最快的嘗試方式是使用dcode,這是基於Deep Agent構建的終端編碼智慧體,預設啟用了程式碼直譯器,開箱即支援動態子代理。
動態子代理的工作原理是:智慧體獲得一個評估工具,它編寫JavaScript程式碼在直譯器中安全執行。直譯器暴露了一個內建的task()全域性函式,用於從程式碼中分派子代理。task()接受描述、子代理型別和可選的響應模式,返回結構化結果。模型根據任務編寫不同的程式碼(迴圈、分支、Promise.all等),直譯器確定性地執行。
文章還介紹了六種常見的編排模式,這些模式並非固定功能,而是根據任務自然形成的結構:
- 分類執行:先對專案進行分類,然後由專門的子代理處理每一類。適用於混合輸入需要不同處理的情況,如支援工單分類。
- 扇出合成:並行執行相同型別的任務,然後合併結果。適用於批次文件分析或程式碼審查。
- 對抗驗證:兩輪驗證,第一輪產生髮現,第二輪獨立驗證每個發現,僅保留一致同意的結果。適用於誤報代價高的安全審計。
- 生成過濾:多個子代理獨立生成解決方案,然後比較評分,保留最佳。適用於架構方案或內容變體。
- 錦標賽式:兩兩比較,勝者晉級,直到選出冠軍。適用於主觀標準下的最佳化。
- 迴圈直至完成:重複發現迴圈,去重,直到沒有新結果。適用於範圍未知的全面搜尋。
動態子代理是遞迴語言模型(Recursive Language Model)理念的簡單實現:智慧體編寫程式碼,程式碼呼叫更多智慧體。它不受上下文視窗的限制,也不被固定工作流所束縛。智慧體可以自主分解問題並重組結果。隨著模型程式碼編寫能力的提升,這種方法的潛力將不斷增長。Deep Agents今天就將動態子代理交到了使用者手中,使用者可以透過新增程式碼直譯器來開始使用,或者直接使用dcode體驗其開箱即用的能力。