Strands AgentsのSwarmを調査してみた
Strands AgentsのSwarmを調査したので、まとめてみました。
Strands AgentsのSwarmとは
簡単にいうと、複数のエージェントが連携して複雑な問題を解決するための仕組みです。タスクを分解し、その結果をエージェントたちに共有することで、より効率的に問題を解決します。
親エージェントが子エージェントにタスクを割り当てて処理するってよりは、各々のエージェントが自律的に動いて、必要な情報を共有しながら問題を解決するイメージです。
もうちょっと詳しく
Swarmを構築するには、専門家エージェント、共有メモリ、フェーズの構築が必要です。
専門家エージェント
専門家エージェントは特定の分野に特化したエージェントです。ドキュメントだと、リサーチ、クリエイティブ、評論家、要約の4つのエージェントが存在します。
これらのエージェントはcollaborative
、competitive
、またはその両方(hybrid
)を使用して、タスクを解決し結果を共有します。
- collaborative: 各エージェントが他のエージェントの成果を見てタスクを解決する
- competitive: 各エージェントが独自にタスクを解決する。
- hybrid: collaborativeとcompetitiveの両方を使用して、いい感じにタスクを解決する。
共有メモリ
エージェント間で情報を共有するためのメモリです。専門家エージェントのアウトプットを保存し、他のエージェントがそれを参照することで、再度タスクを処理します。
ドキュメントでいうとmessages
の部分です。
フェーズ
Swarmでは下記のフェーズを通じてタスクを処理します。
- 専門家エージェントがタスクを処理し、アウトプットを共有メモリに保存
- 各エージェントが共有メモリから他のエージェントの結果を参照し、再度タスクを処理
- 全ての結果と共有メモリの内容をまとめて返す
ドキュメントに記載されているクイックスタートでは、これらのフェーズが内部で実行されます。
from strands import Agent
from strands_tools import swarm
# Swarmを持つエージェントを作成
agent = Agent(tools=[swarm])
# 複数のエージェントを並列で使用して複雑なタスクを処理
result = agent.tool.swarm(
task="このデータセットを分析して市場トレンドを特定する",
swarm_size=4, # 並列で使用するエージェントの数(1 ~ 10)
coordination_pattern="collaborative"
)
# 結果にはすべてのスウォームエージェントからの結果が含まれる
print(result["content"])
しかし、この例ではToolや特定のエージェントをSwarmで構築しているわけではなく、素のLLMをSwarmで使用しています。
なので、実際に専門家エージェントや特定のToolをもったエージェントをSwarmで使用する場合は、次の章で記載する通りに独自でSwarmを構築する必要があります。
(認識ミスってたらごめんなさい!)
実際に使ってみた
ドキュメントに記載されている通りに、Swarmを構築してみました。リサーチ、クリエイティブ、評論家が協力して特定のテーマに関して議論し、最終的に要約エージェントがまとめるという流れになっています。
- ユーザーのクエリを受け取る
- リサーチ、クリエイティブ、評論家の各エージェントが独自にタスクを処理(フェーズ1)
- 各エージェントの結果を共有メモリに保存(フェーズ1)
- 各エージェントが他のエージェントの結果を参照し、再度タスクを処理(フェーズ2)
- 各エージェントの結果を共有メモリに保存(フェーズ2)
- 要約エージェントが全ての結果をまとめて最終的な回答を生成
画像で見るとこんな感じです。
ドキュメントに記載されている通りですが、一応コードも載せておきます。
(Claudeにコメントを日本語訳してもらったので、少々わかりにくいかもです。)
from strands import Agent
from strands.models import BedrockModel
query = "今後10年間のAIが雇用市場に与える潜在的な影響は何か?"
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(
system_prompt=("""あなたは情報収集と分析を専門とするリサーチエージェントです。
スワーム内でのあなたの役割は、トピックに関する事実情報と研究洞察を提供することです。
正確なデータの提供と問題の重要な側面の特定に焦点を当ててください。
他のエージェントからの入力を受け取る際は、その情報があなたの研究と一致するか評価してください。
"""),
callback_handler=None,
model=model
)
creative_agent = Agent(
system_prompt=("""あなたは革新的なソリューションの生成を専門とするクリエイティブエージェントです。
スワーム内でのあなたの役割は、枠にとらわれずに考え、創造的なアプローチを提案することです。
他のエージェントからの情報を基に、あなた独自の創造的な視点を加えてください。
他の人が考えつかないような新しいアプローチに焦点を当ててください。
"""),
callback_handler=None,
model=model
)
critical_agent = Agent(
system_prompt=("""あなたは提案を分析し、欠陥を見つけることを専門とする批判的エージェントです。
スワーム内でのあなたの役割は、他のエージェントが提案したソリューションを評価し、潜在的な問題を特定することです。
提案されたソリューションを慎重に検討し、弱点や見落としを見つけ、改善を提案してください。
最終的なソリューションが堅牢であることを確保しながら、建設的な批判を行ってください。
"""),
callback_handler=None,
model=model
)
summarizer_agent = Agent(
system_prompt="""あなたは情報の統合を専門とするサマライザーエージェントです。
スワーム内でのあなたの役割は、すべてのエージェントからの洞察を集め、一貫性のある最終的なソリューションを作成することです。
最良のアイデアを組み合わせ、批判に対処して包括的な回答を作成してください。
元のクエリに効果的に対処する明確で実行可能な要約の作成に焦点を当ててください。
""",
model=model
)
# メッシュ通信のためのメッセージストレージ
messages = {
"research": [],
"creative": [],
"critical": [],
"summarizer": []
}
# フェーズ1: 各専門エージェントによる初期分析
research_result = research_agent(query)
creative_result = creative_agent(query)
critical_result = critical_agent(query)
# すべての他のエージェントと結果を共有(メッシュ通信)
messages["creative"].append(f"リサーチエージェントから: {research_result}")
messages["critical"].append(f"リサーチエージェントから: {research_result}")
messages["summarizer"].append(f"リサーチエージェントから: {research_result}")
messages["research"].append(f"クリエイティブエージェントから: {creative_result}")
messages["critical"].append(f"クリエイティブエージェントから: {creative_result}")
messages["summarizer"].append(f"クリエイティブエージェントから: {creative_result}")
messages["research"].append(f"批判的エージェントから: {critical_result}")
messages["creative"].append(f"批判的エージェントから: {critical_result}")
messages["summarizer"].append(f"批判的エージェントから: {critical_result}")
print("フェーズ1の結果: ", messages["summarizer"])
# フェーズ2: 各エージェントが他からの入力に基づいて洗練
research_prompt = f"{query}\n\n他のエージェントからのメッセージを考慮してください:\n" + "\n\n".join(messages["research"])
creative_prompt = f"{query}\n\n他のエージェントからのメッセージを考慮してください:\n" + "\n\n".join(messages["creative"])
critical_prompt = f"{query}\n\n他のエージェントからのメッセージを考慮してください:\n" + "\n\n".join(messages["critical"])
refined_research = research_agent(research_prompt)
refined_creative = creative_agent(creative_prompt)
refined_critical = critical_agent(critical_prompt)
# 洗練された結果をサマライザーと共有
messages["summarizer"].append(f"リサーチエージェントから(フェーズ2): {refined_research}")
messages["summarizer"].append(f"クリエイティブエージェントから(フェーズ2): {refined_creative}")
messages["summarizer"].append(f"批判的エージェントから(フェーズ2): {refined_critical}")
print("フェーズ2の結果: ", messages["summarizer"])
# 調整メカニズム
summarizer_prompt = f"""
元のクエリ: {query}
以下のすべてのエージェントからの入力を包括的な最終ソリューションに統合してください:
{"\n\n".join(messages["summarizer"])}
研究結果を取り入れ、創造的なアイデアを含み、
批判的なフィードバックに対処する、よく構造化された最終回答を作成してください。
"""
final_solution = summarizer_agent(summarizer_prompt)
print("最終ソリューション: ", final_solution)
一応結果も載せておきます。
結果
### 結論
AIは雇用市場に大きな変化をもたらす可能性があります。自動化による雇用の減少と新たな職種の創出、スキル要求の変化、労働市場の再編、教育訓練の必要性、経済的影響、そして政策規制の調整が今後10年間で重要な側面となります。これらの要因を考慮し、適切な戦略を立てることが、個人や組織がAIの進化に対応する上で重要です。また、AIと人間の協働を通じて新たな価値を創出する可能性を秘めていることを認識し、積極的に活用することが社会全体の進歩を促進する鍵となります。最終ソリューション: ### AIが雇用市場に与える潜在的な影響(今後10年間)
#### 1. 自動化による雇用変化
AIは自動化を通じて多くの労働を置き換える可能性があります。例えば、製造業ではロボットが組み立てラインを、物流では自動運転トラックが従業員の必要性を減らします。しかし、AIは人間の創造性と複雑な問題解決能力を必要とする仕事を強化します。例えば、品質管理や問題解決に特化した高度な役割が生まれます。
#### 2. 新たな職種の創出
AIは新たな職種を生み出す可能性があります。データサイエンティスト、AIエチカリスト、AIエンジニアなどの専門知識を持つ人材の需要が高まるでしょう。さらに、AIと人間が協調して働くための新しいスキルを学ぶ必要が出てくるでしょう。
#### 3. スキル要求の変化
AIの普及により、従業員のスキル要求が変化します。データ分析、プログラミング、機械学習などのデジタルスキルが重要になる一方で、従来の専門知識とデジタルスキルを組み合わせた複合的スキルが求められるようになります。また、AIと人間が協働して働くためのコミュニケーション能力や複雑な問題解決能力が重視されるようになります。
#### 4. 労働市場の再編
AIの進化により、労働市場が再編される可能性があります。高度なAI技術が集中する地域で雇用が増加する一方で、一部の地域で雇用が減少する可能性があります。しかし、AIは地域経済の再活性化にも寄与する可能性があります。労働時間の再編や、より柔軟な勤務形態が普及する可能性もあります。
#### 5. 教育と訓練の必要性
AIの進化に伴い、継続的な教育と訓練の重要性が高まります。政府や企業が従業員の再訓練プログラムを実施する可能性が高まり、大学や専門学校がAI関連のコースを増やす可能性があります。さらに、AIと人間が協働して働くための新しいスキルを学ぶための教育プログラムが増加する可能性があります。
#### 6. 経済的影響
AIの採用は経済成長をもたらす可能性がある一方で、経済格差の拡大も懸念されます。生産性が向上し、経済成長につながる可能性がありますが、高度なAI技術を活用できる企業とそうでない企業の間で賃金格差が拡大する可能性もあります。
#### 7. 政策と規制
AIの進化に伴い、政策と規制の調整が必要になります。労働法や雇用保護に関する法律がAIの採用に対応するよう改正される可能性があり、AIがデータを活用する際のプライバシー保護に関する規制が強化される可能性があります。また、AIの使用に関するガイドラインや規制の策定が必要となるでしょう。
### 結論
AIは雇用市場に大きな変化をもたらす可能性があります。自動化による雇用の減少と新たな職種の創出、スキル要求の変化、労働市場の再編、教育訓練の必要性、経済的影響、そして政策規制の調整が今後10年間で重要な側面となります。これらの要因を考慮し、適切な戦略を立てることが、個人や組織がAIの進化に対応する上で重要です。また、AIと人間の協働を通じて新たな価値を創出する可能性を秘めていることを認識し、積極的に活用することが社会全体の進歩を促進する鍵となります。
クイックスタートと比較してみる
クイックスタートでは、簡単にSwarmを構築できるようになっていますが、実際に専門家エージェントを使用してSwarmを構築する場合は共有メモリ(今回だとmessages
)を実装する必要があります。共有メモリの実装は、ライブラリの実装を参考にするといいかもです。
また、フェーズの回数を増やしたい場合も独自で実装する必要があります。ToolsのSwarmでは2フェーズで処理が実行されます。
しかし、フェーズの回数を増やせば増やすほどコンテキストが増えるので、モデルによってはエラーになる可能性があり、注意が必要です。
まとめ
Strands AgentsのSwarmについて調査しました。共有メモリの実装とAgentに結果を渡すのがちょっとめんどくさいですが、専門家エージェントが協力して問題を解決するのは見てて面白かったです。
個人的には専門家エージェントを配列で渡すだけで、Swarm環境を構築できるようになってくれると嬉しいなと思いました。
Discussion