多重 Agent 協調流程模式與最佳做法

生成式協調流程也支援多重 Agent 系統,其中一個 Agent 會呼叫其他 Agent。 將問題拆解成多個專屬的 Agent 後,應用程式會更模組化、更具擴充性,也更易於管理。

內嵌 Agent

內嵌 Agent (也稱為子 Agent) 是同一個 Agent 內部小型且可重複使用的工作流程。 它們通常只是主要 Agent 當做副常式使用的主題。 例如,主要 Agent 可以在較大的計畫中,將「翻譯文字」主題當做其中一個步驟來呼叫。 內嵌 Agent 會與主要 Agent 共用內容,因此彼此之間傳遞資料很簡單。

最佳做法:讓內嵌 Agent 專注於單一職責,並詳加測試。

已連線的 Agent

連結的 Agent 是各自擁有專屬協調流程、工具和知識的獨立 Agent。 主要 Agent 會將要求的一部分委派給子 Agent。 例如,IT Agent 會呼叫 Sales Agent 以取得定價相關資訊。 連結的 Agent 可實現模組化與領域分離,並可略過計畫限制。 它們可能具有不同的權限或知識,因此請套用控管與稽核控制措施。

不過,使用連結的 Agent 需要謹慎的控管:

  • 協調流程:父 Agent 的協調器應具備明確的準則,判斷何時要交接給連結的 Agent。 協調器通常會在使用者的意圖符合已連接 Agent 的領域時轉接。 若要協助這個程序,請在父 Agent 的設定中清楚說明連結的 Agent 的用途。 從父系角度來看,將整個已連接 Agent 視為包含描述的 Agent「工具」。

  • 資料轉接:您必須管理資料轉接。 決定要將父 Agent 的哪些內容傳遞給連結的 Agent。 當一個 Agent 呼叫另一個 Agent 時,Copilot Studio 依預設會一併傳遞交談記錄,讓連結的 Agent 了解先前的交談內容。 但您可能還需要傳遞特定的參數。 例如,如果主要 Agent 已從先前的內容得知使用者的姓名,可能會將這項資訊傳送給連結的 Agent,以避免重複詢問。

  • 安全性:連結的 Agent 可能有權存取父 Agent 無權存取的項目。 請確保呼叫連結的 Agent 不會在無意間略過限制。 例如,如果父 Agent 不允許刪除記錄,但連結的 Agent 可以,則在可能未經適當核准就刪除記錄的情況下,父 Agent 不應呼叫該連結的 Agent。 請將連結的 Agent 呼叫視為和其他強大動作一樣處理。 如果該動作涉及敏感作業,請套用必要的檢查或取得使用者同意。

  • 稽核與監視:記錄連結的 Agent 何時遭到叫用,以及執行了哪些動作。 由於這另一個 Agent,因此會有不同的文字記錄。 將父工作階段與已連接工作階段相互關聯,對偵錯至關重要。 遙測資料中的識別碼通常會將兩者建立關聯。

何時應分離 Agent

請勿為每個子工作都建立個別的 Agent。 如果子工作符合下列情況,請使用個別的 Agent:

  • 複雜到需要擁有專屬的工具或知識套件 (不同的專業領域)
  • 需要與主要 Agent 不同的控管規則或存取控制
  • 可在許多不同的主要 Agent 中重複使用 (類似服務 Agent)

如果上述情況皆不符合,簡單的內嵌 Agent 或許就能勝任這項工作,且比完整的連結 Agent 更為簡單。 不同的個別 Agent 會為系統帶來額外負荷。 由於內容切換,執行時間會稍微拉長,維護多個 Agent 也會增加複雜度。 因此請謹慎使用。 實務上的做法是從單一 Agent 開始。 只有在明確看出需要模組化,或發現單一 Agent 不該跨越的界線時,才拆分成多個 Agent。

多重 Agent 協調流程的最佳做法

在多重 Agent 設定中撰寫父 Agent 與子 Agent 的指示時,適用下列最佳做法。

1. 單一回應原則

請確保每一輪交談中,只有一個 Agent 會與使用者對話。 在多重 Agent 設定中,只有父 Agent 應該提供最終回應。 子 Agent 是負責調查的角色,而非回應者。

  • 建議做法:在父 Agent 的指示中加入:「您是唯一會與使用者溝通的 Agent。 將所有子 Agent 的調查結果整合成單一回應。」
  • 避免做法:讓指示保持模糊。 如果沒有明確的指引,子 Agent 會直接回覆使用者,導致訊息重複或不完整。

2. 子 Agent 指示必須聲明其角色

務必告知子 Agent,其身分為子 Agent。 子 Agent 本身並不知道自己是協調流程的一部分。 如果沒有明確的指引,它們的行為會像獨立的 Agent,直接將訊息傳送給使用者。

  • 建議做法:在每個子 Agent 的指示中加入:「您是子 Agent。 請勿直接回覆使用者。 您的工作是搜尋資訊,並將調查結果回傳給父 Agent。 所有與使用者的溝通均由父 Agent 負責處理。」
  • 避免做法:假設子 Agent 能自行摸索出協調流程模式。

3. 在指示中使用清楚直接的語言

務必使用明確的指令式語言。 避免使用委婉或客氣的措辭。 平台會使用強烈的語言 (MUST、DO NOT、NEVER) 插入系統層級的指示。 以委婉語言撰寫的指示 (例如「please try to」「you should」「it would be good to」) 在發生衝突時,優先順序會較低。

  • 建議做法:「絕不要直接回覆使用者。 只能傳回您的調查結果。」
  • 建議做法:「每個使用者問題都必須只有一個最終回應。」
  • 避免做法:「請盡量避免傳送訊息給使用者,並改為傳回您的調查結果。」
  • 避免做法:「理想情況下,我們希望能有一個整合的答案。」

4. 每個子 Agent 使用一個知識來源 (不重疊)

為每個子 Agent 指派不同且不重疊的知識來源。 如果兩個子 Agent 搜尋相同的知識庫,其中一個會先找到答案。 第二個子 Agent 不是傳回重複的結果,就是完全略過搜尋,無法帶來任何價值。

  • 建議做法:CA-1 搜尋知識來源 A (例如人力資源原則)。 CA-2 搜尋知識來源 B (例如 IT 文件)。
  • 避免做法:讓兩個子 Agent 存取相同的文件、Dataverse 資料表或 SharePoint 網站。
  • 注意:如果您只有一個知識來源,請使用具備該知識的單一 Agent,而不要拆分成兩個子 Agent。 多重 Agent 只有在來源確實不同時,才會產生附加價值。

5. 為子 Agent 使用準確且各不相同的描述

為父系可見的每個子 Agent 撰寫清晰且明確的描述。 父 Agent 會使用子 Agent 的描述來決定路由方式。 如果描述模糊、相同或不準確,父 Agent 就無法做出正確的路由決策。

  • 建議做法:CA-1:「搜尋人力資源原則文件,以回答與員工相關的問題。」CA-2:「搜尋 IT 知識庫,以回答技術支援問題。」
  • 避免做法:當兩個 Agent 服務不同的領域時,卻使用相同的描述。
  • 避免做法:使用像「這個 Agent 可以協助回答問題。」這樣籠統的描述。

6. 父 Agent 的指示必須定義協調流程模式

告訴父 Agent 該如何進行協調流程。 不要只說「使用子 Agent」。父 Agent 需要明確的模式指示:叫用 Agent、等待結果、整合結果,然後再回應。

  • 建議做法:「當使用者詢問問題時:1. 叫用兩個子 Agent 以收集資訊。 2. 等待兩個子 Agent 傳回調查結果。 3. 將調查結果整合成單一且一致的回應。 4. 只向使用者提供一個回應。 子 Agent 不得直接回覆使用者。」
  • 避免做法:「當使用者詢問問題時,叫用子 Agent,取得兩個來源的回應,並提供一個整合的答案。」(太過籠統。這項指示並未告知子 Agent 應保持靜默。)

7. 在工作委派中納入「不得直接回覆」的指令

即使有清晰的子 Agent 指示,在委派工作中加入強化措施也能提供安全網。

  • 該做的:在父系指示中加入:"在委派給子 Agent 時,務必在工作中包含:'只傳回您的調查結果。 請勿回覆使用者。』」
  • 避免做法:只依賴子 Agent 本身的指示。 工作內容能讓子 Agent 獲得更多信號,進一步強化這個模式。

8. 使用領域不符的查詢進行測試

務必使用不符合任何子 Agent 領域的問題進行測試。 此測試顯示子 Agent 是否能妥善傳回「找不到資訊」,而不是傳回可能不正確的資訊、卡住,或傳送混淆訊息。

  • 建議做法:使用超出所有子 Agent 領域的查詢進行測試 (例如,當 Agent 負責處理人力資源和 IT 時,詢問天氣相關問題)。
  • 該做的:確認父系是否妥善處理「兩個 Agent 皆未找到任何結果」的情況。
  • 不該做的:僅使用最簡單的案例查詢進行測試,這些查詢與某個子 Agent 的領域完全相符。

9. 預期會有後續回應時,優先使用「詢問」而非「告知」

預期使用者會回應時,請使用提問/詢問形式的互動。 只有在傳送最終單向訊息時,才使用告知/傳送形式的互動。 如果 Agent 使用單向訊息 (告知) 向使用者提問,使用者的回覆會以全新查詢的形式,傳回父 Agent 的規劃器。 在這種情況下,最好與子 Agent 繼續進行同一段交談。

  • 建議做法:撰寫如下的指示:「如果需要釐清,請向使用者提問,並等待其回覆。」
  • 避免做法:撰寫如下的指示:「告知使用者有哪些選項,讓他們自行選擇。」「Inform (告知)」代表單向訊息,而「ask (詢問)」則代表雙向交流。

快速參考檢查清單

# 檢查
1 父 Agent 的指示明確聲明「只有我會回應使用者」
2 每個子 Agent 的指示都聲明「請勿直接回覆使用者」
3 這些指示會使用極具指令性的語句 (必須、絕不、僅限)
4 每個子 Agent 都擁有獨一無二且不重疊的知識來源
5 子 Agent 的描述準確、彼此不同且具體明確
6 父 Agent 的指示定義了完整的協調流程模式 (叫用 → 等待 → 整合 → 回應)
7 父系在委派工作內容中傳遞「不直接回覆」
8 已使用領域不符的查詢進行測試
9 子 Agent 指示中正確區分「詢問」與「告知」