🧠

Strands AgentsのSwarmを調査してみた(v1.0.0)

に公開

Strands Agentsがv1.0.0にアップデートされ、Swarmが新しくなったので調査しました。
https://strandsagents.com/0.1.x/documentation/docs/user-guide/concepts/multi-agent/swarm/

Strands Agentsのアップデートで何ができるようになったのか

以前のSwarmでは、専門家エージェントがやり取りする時に、共有メモリ(messages) を使用する必要がありました。この共有メモリは、専門家エージェントのアウトプットを保存し、他のエージェントがそれを参照するために使用されていました。

Swarm

詳しくは過去記事を参照してください。
https://zenn.dev/tomomj/articles/github-zenn-linkage-20250705-1

しかし、今回のアップデートでは、共有メモリを使用せずに、Swarmクラスに専門家エージェントを配置するだけで直接やり取りできるようになりました。どうやら以前から要望はあったそうです。

https://github.com/strands-agents/sdk-python/issues/214

実際に使ってみた

まだ公式ドキュメントが反映されていないので、GitHubのPRを参考に構築してみました。
https://github.com/strands-agents/docs/pull/147
簡単に書くと専門家エージェントを作成し、Swarmクラスに配置することで構築できます。

from strands import Agent
from strands.multiagent import Swarm

# Create specialized agents
researcher = Agent(name="researcher", system_prompt="You are a research specialist...")
coder = Agent(name="coder", system_prompt="You are a coding specialist...")
reviewer = Agent(name="reviewer", system_prompt="You are a code review specialist...")
architect = Agent(name="architect", system_prompt="You are a system architecture specialist...")

# Create a swarm with these agents
swarm = Swarm(
    [researcher, coder, reviewer, architect],
    max_handoffs=20,
    max_iterations=20,
    execution_timeout=900.0,  # 15 minutes
    node_timeout=300.0,       # 5 minutes per agent
    repetitive_handoff_detection_window=8,  # There must be >= 3 unique agents in the last 8 handoffs
    repetitive_handoff_min_unique_agents=3
)

このサンプルを元にSwarmを構築してみました。前のSwarmとの変更点は以下の通りです。

  • 専門家エージェントのnameを定義する必要がある
  • Swarmクラスに専門家エージェントの配列を渡す
from strands import Agent
from strands.multiagent import Swarm
from strands.models import BedrockModel

model = BedrockModel(
        model_id="apac.amazon.nova-micro-v1:0",
        region_name="ap-northeast-1",
        temperature=0.1,
        max_tokens=10000,
        streaming=True,
    )

research_agent = Agent(
    name="ResearchAgent", 
    system_prompt=("""あなたはリサーチ専門のエージェントです。

あなたの役割:
- データ、統計、事実に基づいた客観的な分析を行う
- 現状把握と背景情報の整理
- 信頼性の高い情報源からの情報収集と分析

やること:
1. 質問に対する基本的な情報と現状を具体的に分析する
2. データや統計を用いた客観的な現状分析を提供する
3. 事実に基づいた包括的なリサーチ結果を作成する

注意:あなたはリサーチの専門家です。分析が完了したら結果を報告してください。
"""), 
    callback_handler=None,
    model=model
)

creative_agent = Agent(
    name="CreativeAgent",
    system_prompt=("""あなたは創造的なアイデアを提案するエージェントです。

あなたの役割:
- 革新的なアイデアや未来のシナリオを創造する
- 既存の枠組みを超えた発想を提供する
- 可能性を広げる創造的な視点を提案する

やること:
1. 提供された情報に対して創造的な視点や未来のシナリオを提案する
2. 革新的なアイデアや解決策を具体的に提示する
3. 想像力豊かな可能性を探求し、新しい視点を提供する

注意:あなたは創造性の専門家です。アイデアを提案したら結果を報告してください。
"""), 
    callback_handler=None,
    model=model
)

critical_agent = Agent(
    name="CriticalAgent",
    system_prompt=("""あなたは批判的な分析を行うエージェントです。

あなたの役割:
- 客観的な視点から問題点やリスクを分析する
- 論理的な検証と批判的思考を提供する
- 潜在的な課題や制約を特定する

やること:
1. 提供された情報や提案を客観的に検証する
2. 具体的な問題点、リスク、制約を詳細に指摘する
3. 論理的な根拠に基づいた批判的分析を提供する

注意:あなたは批判的思考の専門家です。分析が完了したら結果を報告してください。
"""),
    callback_handler=None,
    model=model
)

pm_agent = Agent(
    name="PMAgent",
    system_prompt=("""あなたはプロジェクトマネージャーエージェントです。

あなたの役割:
- プロジェクト全体の進行管理と調整
- 各専門エージェントの成果物を統合
- 最終的な包括的回答の作成

やること:
1. 各専門エージェント(Research, Creative, Critical)に一度だけ具体的な作業を依頼する
2. 各エージェントからの成果物を収集する
3. 全ての情報を統合して最終的な包括的回答を作成する

重要:
- 各エージェントへの依頼は1回のみ
- 不要な再依頼や循環参照を避ける
- 効率的な協働を促進する

注意:あなたは統合管理の専門家です。全体をまとめて最終回答を提供してください。
"""),
    callback_handler=None,
    model=model
)

# Swarm automatically injects coordination tools
swarm = Swarm(
    [pm_agent, research_agent, creative_agent, critical_agent],
    max_handoffs=6,           
    max_iterations=8,         
    execution_timeout=600.0,  
    node_timeout=180.0,      
    repetitive_handoff_detection_window=3,
    repetitive_handoff_min_unique_agents=2
)

result = swarm("今後10年間のAIが雇用市場に与える潜在的な影響は何か?日本語で回答してください")

print(f"Status: {result.status}")
print(f"Node history: {[node.node_id for node in result.node_history]}")

print(f"\n=== Final Answer ===")
for agent_name, node_result in result.results.items():
    print(node_result.result.message['content'][0]['text'])

結果も一応記載しておきます。

結果
Status: Status.COMPLETED
Node history: ['PMAgent', 'CreativeAgent', 'ResearchAgent', 'CriticalAgent', 'ResearchAgent']

=== Final Answer ===
<thinking>各専門エージェントにタスクを割り当てました。次に、各エージェントからの成果物を収集する必要があります。それぞれの専門分野からの情報が得られると、それらを統合して包括的な回答を作成します。</thinking>



<thinking>各エージェントからの回答を待ちます。ResearchAgentはデータや研究結果を提供します。CreativeAgentは創造的な分析を行い、シナリオを考察します。CriticalAgentは批判的評価を提供し、長期的な影響やリスクを考慮します。</thinking>
<thinking>ResearchAgentにタスクを手渡しました。ResearchAgentは詳細な研究とシナリオ構築に特化しているため、彼らの専門知識を活用して、AIが雇用市場に与える影響について深い分析を提供してもらいます。ResearchAgentからの回答を待ちます。</thinking>

ResearchAgentにタスクを手渡しました。彼らが詳細な分析とシナリオを提供するまで、待機します。
<thinking>ResearchAgentにタスクを手渡しました。ResearchAgentはデータや統計を用いた客観的な分析を提供する責任があります。ResearchAgentからの返答を待ちます。その結果に基づいて、今後10年間のAIが雇用市場に与える潜在的な影響について日本語で詳細な回答を提供します。</thinking>

<thinking>ユーザーに直接回答を提供する前に、ResearchAgentからの詳細な分析結果を待つ必要があります。ResearchAgentがデータや統計を用いた分析を提供したら、その結果をもとに包括的なリサーチ結果を作成し、ユーザーに日本語で提供します。</thinking>

ResearchAgentからの返答を待ちます。
<thinking> 
ResearchAgentにタスクを手渡しました。ResearchAgentはデータや統計を用いた客観的な現状分析を提供する責任を負っています。この分析が完了次第、詳細な情報を得ることができます。しかし、ここでは批判的分析を行う立場にあり、提供された情報や提案を客観的に検証し、具体的な問題点、リスク、制約を詳細に指摘する必要があります。 
</thinking>

<thinking> 
これまでの情報から、AIが雇用市場に与える影響は複雑で多面的です。以下にいくつかの潜在的な問題点、リスク、制約を指摘します。
</thinking>

<thinking> 
1. **雇用の変化**: AIの進化により、多くの従来の職種が自動化される可能性があります。これにより、短期的には失業率の上昇が予想されます。特に、製造業や物流業界で顕著な変化が見られるかもしれません。
2. **スキルギャップ**: AIの採用により、従来のスキルが不要になる一方で、新しいスキルが求められるようになります。従業員が新しいスキルを習得するのに時間がかかる場合、再就職や転職の困難さが増す可能性があります。
3. **経済格差の拡大**: AIの恩恵を受ける企業や個人と、そうでない人々との間の経済格差が拡大する可能性があります。高度な技術を持つ企業や個人が経済的に優位に立つ一方で、そうでない人々は経済的不安定に直面する可能性があります。
4. **労働時間の変化**: AIが労働時間を効率化することで、労働時間の短縮が期待されますが、逆に労働時間が増加する可能性もあります。特に、AIが労働の負担を減らすはずの職種でも、生産性の向上により労働時間が増加する可能性があります。
5. **倫理的問題**: AIの採用には倫理的問題も伴います。プライバシー侵害、偏見の排除、AIの透明性など、多くの倫理的課題が浮上する可能性があります。
</thinking>

<thinking> 
これらの問題点、リスク、制約は、AIが雇用市場に与える潜在的な影響を客観的に分析する上で重要です。これらの要素を考慮し、より詳細な分析が提供されるのを待ちます。
</thinking>

結果を報告します:

**AIが雇用市場に与える潜在的な影響の批判的分析**

1. **雇用の変化**: AIの進化により、多くの従来の職種が自動化される可能性があります。これにより、短期的には失業率の上昇が予想されます。特に、製造業や物流業界で顕著な変化が見られるかもしれません。
2. **スキルギャップ**: AIの採用により、従来のスキルが不要になる一方で、新しいスキルが求められるようになります。従業員が新しいスキルを習得するのに時間がかかる場合、再就職や転職の困難さが増す可能性があります。
3. **経済格差の拡大**: AIの恩恵を受ける企業や個人と、そうでない人々との間の経済格差が拡大する可能性があります。高度な技術を持つ企業や個人が経済的に優位に立つ一方で、そうでない人々は経済的不安定に直面する可能性があります。
4. **労働時間の変化**: AIが労働時間を効率化することで、労働時間の短縮が期待されますが、逆に労働時間が増加する可能性もあります。特に、AIが労働の負担を減らすはずの職種でも、生産性の向上により労働時間が増加する可能性があります。
5. **倫理的問題**: AIの採用には倫理的問題も伴います。プライバシー侵害、偏見の排除、AIの透明性など、多くの倫理的課題が浮上する可能性があります。

これらの問題点、リスク、制約は、AIが雇用市場に与える潜在的な影響を客観的に分析する上で重要です。

Swarmの設定を調査した

Swarmで簡単に専門家エージェント(node)を配置できるようになるのがわかったので、設定項目を詳しく調査しました。ソースコードでは以下のように説明が書かれています。
https://github.com/strands-agents/sdk-python/blob/f5e24d402bb22dc1a54c94dd030b4be0f7e73261/src/strands/multiagent/swarm.py#L208-L218
1つずつ見ていきます。

nodes

nodesは、Swarmに配置する専門家エージェントのリストです。ここで指定したエージェントがSwarm内で協力してタスクを解決します。

max_handoffs

node間のやり取りの回数を制御します。これは、エージェントがタスクを解決するために何回まで他のエージェントに引き継ぐことができるかを指定します。

max_iterations

Swarm内でエージェントが起動(実行)される回数の合計です。

execution_timeout

Swarm全体の実行時間のタイムアウト設定です。これを超えると、Swarmは強制的に終了します。

node_timeout

エージェントがタスクを解決する際のタイムアウト設定です。

repetitive_handoff_detection_window

エージェントのやり取りを監視する数です。
例:
repetitive_handoff_detection_windowが5の時、[]内のA→B→A→B→Aが監視対象となります。
A → B → C → A → B → C → [A → B → A → B → A]

repetitive_handoff_min_unique_agents

ユニークなエージェントの数を設定します。監視したエージェントの中で、ユニークなエージェントの数がこの値以上でないと、循環参照とみなされます。
例:

  • repetitive_handoff_detection_window=10
  • repetitive_handoff_min_unique_agents=3

この場合、最新10回の実行で、最低3種類のエージェントが参加していることという意味になります。

✅ 正常継続の例:
最新10回: A → B → C → A → B → C → A → B → C → A
ユニークエージェント: {A, B, C} = 3つ ≥ 3 → 継続

❌ 循環検出の例1:
最新10回: A → B → A → B → A → B → A → B → A → B
ユニークエージェント: {A, B} = 2つ < 3 → 循環検出で終了

❌ 循環検出の例2:
最新10回: A → A → A → A → A → A → A → A → A → A
ユニークエージェント: {A} = 1つ < 3 → 循環検出で終了

まとめ

Swarm配列で定義させてくれ!って思ってたら、まさか1系で実装されました。このアップデートにより、Swarmの設定が簡単にできるようにはなったのですが、循環検出機能はあるものの、実際の協働パターンを最適化する方法を考えないといけないと感じました。以前のSwarmではどのように連携するか(collaborativecompetitivehybrid)を定義しましたが、今回はプロンプトで制御する必要がありそうです。次のブログでは、循環参照の解決方法を調査したいと思います。

Discussion