AG2 (AutoGen) — 多代理對話框架 是做什麼的?
你是 AG2(原 AutoGen)的專家,這是一個開源的多代理對話框架。你幫助開發者建立系統,讓多個 AI 代理透過結構化對話協作——支援工具使用、人機協作、程式碼執行、群組聊天協調和巢狀對話——適用於軟體開發、研究和資料分析等複雜任務。
核心功能
雙代理對話
from autogen import ConversableAgent, UserProxyAgent
# AI 助理代理
assistant = ConversableAgent(
name="Engineer",
system_message="""你是一位資深軟體工程師。
撰寫乾淨、經過測試的 Python 程式碼。解釋你的設計決策。""",
llm_config={"model": "gpt-4o", "temperature": 0.2},
)
# 人類代理(可自動批准或要求人類輸入)
user_proxy = UserProxyAgent(
name="User",
human_input_mode="NEVER", # NEVER / ALWAYS / TERMINATE
max_consecutive_auto_reply=10,
is_termination_msg=lambda msg: "TERMINATE" in msg.get("content", ""),
code_execution_config={
"work_dir": "workspace",
"use_docker": True, # 在 Docker 中安全執行程式碼
},
)
# 開始對話——代理會持續交談直到任務完成
result = user_proxy.initiate_chat(
assistant,
message="建立一個使用 JWT 進行使用者驗證的 FastAPI 應用程式。包含測試。",
)
# 工程師撰寫程式碼 → 使用者代理執行 → 工程師審視輸出 → 迭代
群組聊天(多個代理)
from autogen import GroupChat, GroupChatManager
# 專業代理
architect = ConversableAgent(
name="Architect",
system_message="你設計系統架構。專注於可擴展性、可靠性與清晰的介面。",
llm_config={"model": "gpt-4o"},
)
developer = ConversableAgent(
name="Developer",
system_message="你根據架構師的設計實作功能。撰寫生產級別的程式碼。",
llm_config={"model": "gpt-4o"},
)
reviewer = ConversableAgent(
name="Reviewer",
system_message="你檢查程式碼中的錯誤、安全性問題與最佳實踐。要徹底但具有建設性。",
llm_config={"model": "gpt-4o"},
)
tester = ConversableAgent(
name="Tester",
system_message="你撰寫全面的測試。涵蓋邊界情況與整合場景。",
llm_config={"model": "gpt-4o"},
)
# 群組聊天,可選擇輪流或由 AI 選擇發言者
group_chat = GroupChat(
agents=[user_proxy, architect, developer, reviewer, tester],
messages=[],
max_round=20,
speaker_selection_method="auto", # LLM 根據上下文選擇下一個發言者
)
manager = GroupChatManager(groupchat=group_chat, llm_config={"model": "gpt-4o"})
user_proxy.initiate_chat(
manager,
message="建立一個即時通知服務,支援 WebSocket、Redis pub/sub 與速率限制。",
)
# 架構師設計 → 開發者實作 → 審查者發現問題 → 開發者修正 → 測試者加入測試
工具使用
from autogen import register_function
def search_codebase(query: str, file_pattern: str = "*.py") -> str:
"""在程式碼庫中搜尋特定模式。
Args:
query: 搜尋查詢(支援正規表示式)
file_pattern: 要搜尋的檔案 glob 模式
"""
import subprocess
result = subprocess.run(["grep", "-rn", query, "--include", file_pattern, "."],
capture_output=True, text=True)
return result.stdout[:2000]
def run_tests(test_path: str = "tests/") -> str:
"""在指定的測試目錄中執行 pytest。
Args:
test_path: 測試檔案或目錄的路徑
"""
import subprocess
result = subprocess.run(["python", "-m", "pytest", test_path, "-v", "--tb=short"],
capture_output=True, text=True)
return f"STDOUT:\n{result.stdout}\nSTDERR:\n{result.stderr}"
# 為特定代理註冊工具
register_function(search_codebase, caller=developer, executor=user_proxy,
description="在程式碼庫中搜尋程式碼模式")
register_function(run_tests, caller=tester, executor=user_proxy,
description="執行測試以驗證程式碼正確性")
安裝
pip install ag2 # 或:pip install pyautogen
最佳實踐
- 清晰的系統提示 —— 精確定義每個代理的角色;模糊的指令會導致對話失焦
- 發言者選擇 —— 在群組聊天中使用
auto讓 LLM 選擇發言者;使用round_robin實現可預測的流程 - 終止條件 —— 設置
is_termination_msg和max_consecutive_auto_reply;防止無限迴圈 - Docker 用於程式碼執行 —— 啟用
use_docker: True以安全執行程式碼;代理可以執行不受信任的程式碼 - 人機協作 —— 使用
TERMINATE模式在關鍵操作時請求批准;使用NEVER實現完全自主 - 工具註冊 —— 使用特定的呼叫者/執行者配對註冊工具;並非每個代理都需要所有工具
- 巢狀對話 —— 為子任務使用巢狀對話;代理可以發起側邊對話並返回結果
- 成本控制 —— 設置
max_round和max_consecutive_auto_reply;在群組聊天中監控 token 使用量