【AutoGen0.7.1】 SelectorGroupChat(1)Tools,Selector_func: 2025/7/30

エージェント

✅① ツール連携の具体例(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_selectorselector_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

これで「会話の内容を分析して、キーワードに応じて話者を変える」といった柔軟な制御ができます。


🔚まとめ

機能説明
toolsPython関数を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_promptLLMに選ばせたいときのガイド文。文脈やルールを書いて賢く指示できる

もし、「Agentが5人いる中で、特定の条件のときだけAとBに絞りたい」「GPT-4に話者を選ばせたいけどルールを守らせたい」といったケースなら、これらを組み合わせるのがベスト!

コメント

タイトルとURLをコピーしました