2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AutoGen の SocietyOfMindAgent によるネスト型マルチエージェント構成(GraphFlow)

Last updated at Posted at 2025-05-30

AutoGen v0.5.6 に GraphFlow が追加されワークフローを定義可能なったということで、より複雑なマルチエージェント構成を考えてみます。AutoGen を愛用しているユーザーにとっては、GraphFlow と既存の自律性の高い SelectorGroupChatRoundRobinGroupChat と組み合わせてみたいと考えるのは自然かと思います。

Azure OpenAI Developers Seminar 2025 においても複合型のデザインパターンを解説しましたが、実際にこれらの実装を行います。

image.png

全体フロー(GraphFlow)

チーム編成

RoundRobinGroupChat で 2 つの井戸端会議的パターンを定義。例として批判的評価チームと肯定的評価チームに分けてみました。実際は各 AssistantAgent には適切なロールとナレッジ、アクションをアタッチします。今回は簡単のため、TextMessageTermination("critic_agent3") のようにして会話終了条件を 3 人目のエージェントが発言したら終了するようにしました。

エージェント定義(SocietyOfMindAgent)

Agent Specific な toolsmemory は省略しています。

from autogen_agentchat.ui import Console
from autogen_agentchat.agents import AssistantAgent, SocietyOfMindAgent
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.conditions import TextMessageTermination  

# Create the final reviewer agent
writer_agent = AssistantAgent(
    "writer_agent",
    model_client=model_client,
    system_message="あなたはプロの小説家です。魅力的な文章を完結なタッチで書くことができます。",
)

# Create the final reviewer agent
critic_agent1 = AssistantAgent(
    "critic_agent1",
    model_client=model_client,
    system_message="作成された文章を批判的な観点から評価し、改善点を提案すること。",
)

# Create the final reviewer agent
critic_agent2 = AssistantAgent(
    "critic_agent2",
    model_client=model_client,
    system_message="あなたはリスクアドバイザーです。作成された文章のアイデア被りやSMS等で炎上しないかどうかを評価し、改善点を提案すること。",
)

# Create the final reviewer agent
critic_agent3 = AssistantAgent(
    "critic_agent3",
    model_client=model_client,
    system_message="あなたは法学のスペシャリストです。作成された文章を法的観点から評価し、改善点を提案すること。",
)

# add agents to array
critic_agents: List[AssistantAgent] = [
    critic_agent1,
    critic_agent2,
    critic_agent3,
]

termination_condition = TextMessageTermination("critic_agent3") #3人目が発言したら終了
critic_team = RoundRobinGroupChat(critic_agents, termination_condition=termination_condition)


# Create the final reviewer agent
progressive_agent1 = AssistantAgent(
    "progressive_agent1",
    model_client=model_client,
    system_message="作成された文章を肯定的な観点から評価し、改善点を提案すること。",
)

# Create the final reviewer agent
progressive_agent2 = AssistantAgent(
    "progressive_agent2",
    model_client=model_client,
    system_message="あなたは先進的なアイデアを持っています。作成された文章を肯定的に評価し、品質を向上させるアイデアを提案すること。",
)

# Create the final reviewer agent
progressive_agent3 = AssistantAgent(
    "progressive_agent3",
    model_client=model_client,
    system_message="あなたは生ける百科事典です。作成された文章を万物を理解している俯瞰的視点から評価し、作品背景をよりリッチで深みのあるものにするために提案すること。",
)

# add agents to array
progressive_agents: List[AssistantAgent] = [
    progressive_agent1,
    progressive_agent2,
    progressive_agent3,
]

termination_condition = TextMessageTermination("progressive_agent3") #3人目が発言したら終了
progressive_team = RoundRobinGroupChat(progressive_agents, termination_condition=termination_condition)

society_of_mind_agent1 = SocietyOfMindAgent("society_of_mind1", team=critic_team, model_client=model_client)
society_of_mind_agent2 = SocietyOfMindAgent("society_of_mind2", team=progressive_team, model_client=model_client)


# Create the final reviewer agent
summary_agent = AssistantAgent(
    "summary_agent",
    model_client=model_client,
    system_message="作成された文章を簡潔なあらすじにして出力すること。",
)

GraphFlow 定義

並行ファンアウト/ファンインパターンを実装します。

# Build the workflow graph
builder = DiGraphBuilder()
builder.add_node(writer_agent).add_node(society_of_mind_agent1).add_node(society_of_mind_agent2).add_node(summary_agent)

# Fan-out from writer to editor1 and editor2
builder.add_edge(writer_agent, society_of_mind_agent1)
builder.add_edge(writer_agent, society_of_mind_agent2)

# Fan-in both editors into final reviewer
builder.add_edge(society_of_mind_agent1, summary_agent)
builder.add_edge(society_of_mind_agent2, summary_agent)

# Build and validate the graph
graph = builder.build()

# Create the flow
flow = GraphFlow(
    participants=builder.get_participants(),
    graph=graph,
)

image.png

stream = flow.run_stream(task="SEが異世界に転生して無双する異世界転生系短編小説を書いてください。")
await Console(stream)

トレース解析から分かる実際のフロー

SocietyOfMindAgent

ソサイアティ・オブ・マインド(多重思考)の名前の通り、複数のエージェントが協働してまず内部で議論し、その議論の要旨をもとに最終的な回答だけを LLM に生成させるという役割を担うエージェントです。SocietyOfMindAgent1 には 3つのエージェントを含む RoundRobinGroupChat を内部チームとして含めていますが、チームの議論終了後に SocietyOfMindAgent が議論の結果を集約するのがポイントです。

System Prompt

DEFAULT_RESPONSE_PROMPT = """
元のリクエストに対して、中間での議論を一切言及せずに独立した回答を出力します。
"""

SocietyOfMindAgent1 集約結果例

Critic Agent 1~3 までの評価結果をコンテキストとして集約を実行している。

ご依頼の異世界転生×SE(システムエンジニア)無双短編小説に対する総合的な評価と、今後の改善ポイントを以下にまとめます。

総合評価

本作は、現実世界のSE(システムエンジニア)が異世界に転生し、現代の知識やスキルで問題を次々に解決していく「無双」系の定番構成と言えます。エラーやデバッグなどIT用語をうまく取り入れるギャグ展開やイベントは、ライトな読み味を目指すうえで有効です。しかし、題材・発想の面で既視感が強く、他作品との差別化に課題が見受けられます。主人公の心理描写や世界観の掘り下げもやや浅く、物語の印象や読後感に深みを持たせる余地があります。
法的にも現段階で大きな問題点はありませんが、今後商業展開などを考える場合は固有性や独自世界観の強化が望ましいです。

改善点・アドバイス

中略

  1. オリジナル要素の強化
  2. 主人公とキャラクター性の掘り下げ
  3. 万能スキルからの脱却
  4. 世界観や用語設定の一貫性・説得力強化
  5. 固有名詞・描写の配慮

まとめ

表現やアイデアの工夫によって、既存ジャンルの枠を超えた魅力的な作品へと発展させる余地は十分にあります。主人公や異世界、その両者の関係性を深掘りし、システムエンジニアの視点を活かした唯一無二の物語を目指してください。また、投稿サイトや出版の運用規則等も事前に確認し、リスク要因を把握のうえで創作を進めることをおすすめします。

v0.6.0で Concurrent 実行に対応

Autogen v0.6.0 から GraphFlow が Concurrent 実行に対応しました。

image.png

Jaeger によるトレースの結果、society_of_mind1society_of_mind2 が並列に実行され、結果を待ってから summary_agent が実行されていることが分かります。

自律性+ワークフロー=😎

夢が広がる

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?