✅① ツール連携の具体例(Tools in AutoGen)
🧰 基本:ツールとは?
ツールとは、各エージェントが「外部関数」を呼び出して処理を行うための仕組み。
たとえば、「Web検索」や「計算処理」「ファイルの読み書き」などをPython関数として渡すことで、Agentが自分で呼び出せるようになります。
🧪 例:検索エージェントとデータ分析エージェント
pythonCopyEditfrom autogen_agentchat.tools import PythonFunctionTool
# 検索ツール(シンプルな疑似検索)
def dummy_search(query: str) -> str:
return f"Search results for '{query}'"
search_tool = PythonFunctionTool.from_function(dummy_search, name="WebSearch")
# パーセント変化を計算するツール
def percentage_change(old: float, new: float) -> float:
return ((new - old) / old) * 100
percentage_tool = PythonFunctionTool.from_function(percentage_change, name="PercentageChange")
# エージェントにツールを付与
search_agent = AssistantAgent(
name="WebSearchAgent",
description="検索担当",
tools=[search_tool]
)
analyst_agent = AssistantAgent(
name="AnalystAgent",
description="計算担当",
tools=[percentage_tool]
)
このように、関数を PythonFunctionTool.from_function() でラップしてから、tools=[] に渡せばOKです。
✅② selector_funcのカスタマイズ例
💡 selector_funcとは?
SelectorGroupChat に渡せるカスタム関数で、
「次に発言すべきエージェント」を自前のロジックで決めたい時に使います。
🔧 例:常に WebSearchAgent → AnalystAgent の順で回したい
pythonCopyEditdef fixed_selector(participants, last_speaker, history, selector_prompt, **kwargs):
# 固定順で選出(ただの例)
if last_speaker is None:
return "WebSearchAgent"
elif last_speaker == "WebSearchAgent":
return "AnalystAgent"
else:
return "WebSearchAgent"
この fixed_selector を selector_func= に渡します:
pythonCopyEditteam = SelectorGroupChat(
[search_agent, analyst_agent],
model_client=model_client,
selector_func=fixed_selector,
termination_condition=MaxMessageTermination(10)
)
🧠 応用例:役割ベースで動的に選出(自前のルールを追加)
pythonCopyEditdef role_based_selector(participants, last_speaker, history, **kwargs):
if "calculate" in history[-1]["content"].lower():
return "AnalystAgent"
elif "search" in history[-1]["content"].lower():
return "WebSearchAgent"
else:
# デフォルト候補
return participants[0].name
これで「会話の内容を分析して、キーワードに応じて話者を変える」といった柔軟な制御ができます。
🔚まとめ
| 機能 | 説明 |
|---|---|
| tools | Python関数をAgentが使えるようにする |
| selector_func | 誰を次に話すか、完全に制御できる関数 |
| 応用 | historyの中身を見て分岐も可能 |
✅③ candidate_func: 発言候補者を絞り込む関数
💡 目的:
「次に話す可能性があるエージェント」の候補を制限したいときに使います。
最終的にその中から selector_func または LLM が一人を選びます。
🔧 例:WebSearchAgent は2ターンに1回だけ発言できるよう制御
pythonCopyEditdef limited_candidate_func(participants, last_speaker, history, **kwargs):
# 2ターンごとにWebSearchAgentが話せるようにする例
recent_turns = [msg["name"] for msg in history[-4:]] # 直近4ターンだけ見る
if recent_turns.count("WebSearchAgent") >= 1:
return [p for p in participants if p.name != "WebSearchAgent"]
return participants
この関数を candidate_func= に渡せば、候補者にフィルタがかかる。
✅ 使用例:
pythonCopyEditSelectorGroupChat(
[search_agent, analyst_agent],
model_client=model_client,
selector_func=fixed_selector, # ←誰にするか
candidate_func=limited_candidate_func, # ←候補を制限
termination_condition=MaxMessageTermination(10)
)
✅④ selector_prompt: LLMが選ぶ場合のプロンプトカスタマイズ
💡 デフォルトのプロンプト
textCopyEditSelect an agent to perform task.
{roles}
Current conversation context:
{history}
Pick one agent from {participants}.
{roles} には description(Agentの説明)、{history} には今までの会話履歴、{participants} には選択肢が入る。
🛠️ カスタマイズ例:分析の後は必ず検索を挟むよう指示
pythonCopyEditcustom_selector_prompt = """
以下の会話と各エージェントの説明を読み、次に誰が話すべきかを決定してください。
- AnalystAgent が発言したあとは、必ず WebSearchAgent を挟んでから次へ進めてください。
- エージェントは以下から選択してください: {participants}
【エージェントの役割】
{roles}
【会話履歴】
{history}
次に話すべきエージェントの名前だけを出力してください。
"""
このプロンプトを selector_prompt= に渡せば、GPT-4 などがルールに従って判断するようになる。
📌 まとめ
| 機能 | 説明 |
|---|---|
candidate_func | 発言候補を制限したいときに使う(たとえばローテーション制御) |
selector_func | 自前ロジックで次の発言者を選ぶ |
selector_prompt | LLMに選ばせたいときのガイド文。文脈やルールを書いて賢く指示できる |
もし、「Agentが5人いる中で、特定の条件のときだけAとBに絞りたい」「GPT-4に話者を選ばせたいけどルールを守らせたい」といったケースなら、これらを組み合わせるのがベスト!


コメント