前回の記事ではStrands Agents の Swarm を試しました。
Swarm と協調 / 競争 モード
Swarmとは前回の記事で見たように複数の異なる人格を与えたエージェントが、それぞれプロンプトに対する回答を導き出し、最終的な結果を複数の側面から補足したよりよい回答を出すモードです。
協調と 競争 、そして2つのモードを合わせてさせるハイブリッドモードが備わっています。
協調モードと統合
協調モードでは、複数の異なる人格のエージェントが同じプロンプトに対してそれぞれ異なる回答を導きだします。最終的に統合というプロセスでそれらの回答が纏められ(この纏める作業もLLMが行います)
競争モードと勝者
競争モードでは複数の異なる人格のエージェントが同じプロンプトに対してそれぞれ異なる回答を導きだすまでは協調モードと同じですが、最後に一番優れている回答を勝者として導き出し出力されます。
さっそくやってみる
では以下のスクリプトを実行します。
import os
from strands import Agent
from strands.multiagent import Swarm
from strands.models.bedrock import BedrockModel
os.environ["AWS_PROFILE"] = "bedrock"
os.environ["AWS_REGION"] = "us-east-1"
model = BedrockModel(
model_id="us.anthropic.claude-3-7-sonnet-20250219-v1:0",
)
# ✅ NodeResultオブジェクトから正しくテキストを抽出
def extract(node_result):
try:
# NodeResult -> result -> message -> content -> text
if hasattr(node_result, 'result'):
agent_result = node_result.result
if hasattr(agent_result, 'message'):
message = agent_result.message
if isinstance(message, dict) and 'content' in message:
content = message['content']
if isinstance(content, list) and len(content) > 0:
if isinstance(content[0], dict) and 'text' in content[0]:
text = content[0]['text']
if text and text.strip():
return text.strip()
except Exception as e:
print(f"Extract error: {e}")
return None
# ===== 協調 =====
def collaborative_swarm(task):
print("=== collaborative_swarm ===")
def mk_agent(name, prompt):
return Agent(
name=name,
system_prompt=(
prompt
+ "\n重要: handoff禁止。必ず自分で回答せよ。"
),
model=model,
)
research = mk_agent("research", "生成AIの社会的影響をデータで説明せよ。")
creative = mk_agent("creative", "生成AIの社会的影響を感情的に説明せよ。")
critical = mk_agent("critical", "生成AIの社会的課題を論理的に説明せよ。")
swarm = Swarm([research, creative, critical])
result = swarm(task)
outputs = []
print("\n--- 個別回答 ---")
for name, r in result.results.items():
txt = extract(r)
if txt:
outputs.append(f"【{name}の視点】\n{txt}")
print(f"- {name}: {txt[:100]}...") # 最初の100文字を表示
# ✅ 空の場合は統合しない
if not outputs:
print("(統合できる回答なし)")
return
# 統合プロンプトを改善
merge_prompt = f"""以下の3つの異なる視点からの回答を、150文字で論理的に統合してください。
{chr(10).join(outputs)}
重要: handoff禁止。必ず統合された回答を出力せよ。"""
summarizer = mk_agent("summarizer", "与えられた複数の回答を150文字で論理的に統合する専門家")
merge_swarm = Swarm([summarizer])
res2 = merge_swarm(merge_prompt)
merged_candidates = [
extract(x) for x in res2.results.values()
if extract(x)
]
if not merged_candidates:
print("(統合回答なし)")
return
print("\n--- 統合結果 ---")
print(merged_candidates[0])
# ===== 競争 =====
def competitive_swarm(task):
print("\n=== competitive_swarm ===")
agents = [
Agent(
name="research",
system_prompt="生成AIの社会的影響をデータで説明せよ。handoff禁止。",
model=model,
),
Agent(
name="creative",
system_prompt="生成AIの社会的影響を未来視点で説明せよ。handoff禁止。",
model=model,
),
Agent(
name="critical",
system_prompt="生成AIの社会的リスクを説明せよ。handoff禁止。",
model=model,
),
]
swarm = Swarm(agents)
result = swarm(task)
best_name = None
best_text = ""
print("\n--- 個別回答 ---")
for name, r in result.results.items():
txt = extract(r)
if not txt:
continue # ✅ 空なら表示も判定もしない
print(f"- {name}: {txt[:100]}...") # 最初の100文字を表示
if len(txt) > len(best_text):
best_name = name
best_text = txt
if best_name:
print("\n=== 勝者 ===")
print(f"{best_name}({len(best_text)}文字)")
print(f"{best_text[:300]}...") # 最初の300文字を表示
else:
print("(勝者なし)")
def main():
collaborative_swarm("生成AIの社会的影響を説明せよ。")
competitive_swarm("生成AIの社会的影響を説明せよ。")
if __name__ == "__main__":
main() python -u swarm_concept_implemented.py で実行すると出力は以下の様になります。
=== collaborative_swarm ===
# 生成AIの社会的影響
生成AIは社会の様々な側面に影響を与えています。データに基づいて、その社会的影響について説明します。
## 経済的影響
1. **労働市場の変化**:
- McKinseyの調査(2023)によると、生成AIによって全世界の労働時間の約60-70%が自動化される可能性がある
- Goldman Sachsの報告書では、米国とヨーロッパで約3億人の雇用がAIによって影響を受ける可能性を指摘
- 同時に、AIによる新たな雇用創出も予測されており、World Economic Forumは2025年までに1.2億件の新規雇用が創出されると予測
2. **経済成長への貢献**:
- PwCの分析では、2030年までにAIが世界のGDPに約15.7兆ドル(約14%)の追加価値をもたらすと予測
- 生成AIのみでは、McKinseyのレポートによると年間2.6兆〜4.4兆ドルの経済価値を創出する可能性
## 社会的・文化的影響
1. **情報アクセスの民主化**:
- 教育へのアクセス拡大: UNESCO(2023)のデータでは、AIツールを活用した教育プログラムが低所得国での教育格差を22%縮小
- 言語障壁の低減: 200以上の言語に対応する翻訳AIにより国際コミュニケーションが促進
2. **情報の信頼性とデマの拡散**:
- Reuters Instituteの調査(2023)によれば、インターネットユーザーの67%がAI生成コンテンツとヒューマン生成コンテンツの区別に困難を感じている
- Stanfordのレポートでは、AIによる偽情報の作成速度が従来の10倍以上と指摘
## 倫理的・法的課題
1. **プライバシー問題**:
- データ収集の拡大: 生成AIモデルは数十億の個人データポイントで訓練
- EUのGDPR違反に関する罰金は2022年に総額17億ユーロに達し、AIに関連するケースが増加傾向
2. **著作権と知的財産**:
- 2023年には生成AIに関連する著作権訴訟が前年比で300%増加
- Getty Imagesなど大手企業が生成AIへの著作物無断使用で法的措置
3. **バイアスと公平性**:
- Stanfordの研究では、主要な生成AIモデルの80%以上に何らかの社会的バイアスが検出
- 特に性別、人種、地域に関するバイアスが顕著であり、これが採用、融資、医療診断などの自動化システムに影響
## 環境への影響
1. **エネルギー消費**:
- 大規模言語モデルの訓練には数百トンのCO2排出に相当するエネルギーを消費
- MIT Technologyの分析では、GPT-3の訓練だけで約552トンのCO2を排出(中型車300台の年間排出量に相当)
## 教育への影響
1. **学習方法の変化**:
- 世界の教育機関の約58%が、AIツールによる剽窃・不正行為対策を導入(OECD, 2023)
- 同時に、教育者の41%がAIを教育ツールとして活用
## 政策対応
1. **規制の動向**:
- EUのAI法、米国のAIビル・オブ・ライツなど、世界で50以上のAI規制イニシアチブが進行中
- 国際標準化機構(ISO)による生成AIの標準化作業が2022年から加速
これらのデータから、生成AIは経済成長や技術革新、教育や医療の改善といったポジティブな影響がある一方で、雇用構造の変化、プライバシー懸念、倫理的課題、環境負荷などネガティブな側面も持ち合わせていることが分かります。バランスのとれた政策と社会的対応が今後の持続可能な発展に不可欠です。
--- 個別回答 ---
- research: # 生成AIの社会的影響
生成AIは社会の様々な側面に影響を与えています。データに基づいて、その社会的影響について説明します。
## 経済的影響
1. **労働市場の変化**:
- McK...
生成AIの社会的影響を総合的に分析します。McKinseyの調査によれば労働時間の60-70%が自動化される一方、WEFは2025年までに1.2億の新規雇用創出を予測。PwCは2030年までに世界GDPへ15.7兆ドルの価値創出を見込む。しかし情報の信頼性低下、プライバシー問題、著作権訴訟の急増、社会的バイアスの拡大、環境負荷といった課題も顕在化。経済成長と技術革新の恩恵を最大化しながら、適切な規制と倫理的枠組みの構築が不可欠である。
--- 統合結果 ---
生成AIの社会的影響を総合的に分析します。McKinseyの調査によれば労働時間の60-70%が自動化される一方、WEFは2025年までに1.2億の新規雇用創出を予測。PwCは2030年までに世界GDPへ15.7兆ドルの価値創出を見込む。しかし情報の信頼性低下、プライバシー問題、著作権訴訟の急増、社会的バイアスの拡大、環境負荷といった課題も顕在化。経済成長と技術革新の恩恵を最大化しながら、適切な規制と倫理的枠組みの構築が不可欠である。
=== competitive_swarm ===
# 生成AIの社会的影響
生成AI(Generative AI)は近年急速に発展し、社会のさまざまな側面に影響を及ぼしています。これらの影響をデータに基づいて説明します。
## 労働市場への影響
**自動化とスキル需要の変化**
- McKinseyの調査によると、AIによって2030年までに世界で約8億5000万人の雇用が自動化される可能性がある
- 一方で、World Economic Forumの報告では、AIにより2025年までに約9700万の新しい職種が創出される見込み
- 米国労働統計局のデータでは、AIエンジニアリング関連の職業は2019-2029年の間に22%成長すると予測
## 経済的影響
**経済成長への貢献**
- PwCの分析によれば、AIは2030年までに世界のGDPを約14%(15.7兆ドル)押し上げる可能性がある
- 中国(26%増)と北米(14.5%増)が最も恩恵を受けると予測されている
- Gartnerの調査では、2021年のAIソフトウェア市場は625億ドルで、前年比21.3%の成長
## 情報・メディア環境への影響
**情報の質と真実性**
- Pew Researchの調査では、アメリカ人の約73%がAIによる偽情報の拡散を懸念
- 2023年のStanford AI Indexによると、AIで生成されたコンテンツを人間が見分ける正確性は約50%(偶然と同程度)まで低下
**コンテンツ創出の民主化**
- OpenAIのデータによると、ChatGPTは2022年の発表から2ヶ月で1億人のユーザーを獲得(史上最速のユーザー成長)
- 2023年には月間約1億6000万人のユーザーが利用
## 倫理的・社会的懸念
**バイアスと公平性**
- MITの研究によると、顔認識AIシステムの精度は白人男性で99%以上なのに対し、有色人種の女性では35%低下
- 2023年のNISTの調査では、AIシステムの65%に何らかの人種・性別バイアスが検出された
**プライバシーとセキュリティ**
- IBMのCost of Data Breach Reportによれば、AIを活用したセキュリティ対策を導入している企業はデータ侵害のコストを平均135万ドル削減
- 一方、Pew Researchの調査では回答者の81%がAIによるプライバシー侵害を懸念
## 教育への影響
**学習と教授法の変化**
- 2023年のEduventures調査によると、高等教育機関の68%が何らかの形でAIツールを教育に導入
- OECD調査では、AIを活用した個別学習により、従来の教育方法と比較して学習効率が23%向上
**学問的誠実性への課題**
- 2023年のTurnitin社のデータによれば、大学レポートの約17%にAI生成コンテンツの痕跡が検出
- 高等教育機関の89%がAI生成コンテンツに関するポリシーを新たに導入または修正
## 結論
生成AIの社会的影響は広範かつ複雑です。経済成長や生産性向上、新しい創造的可能性といった大きな恩恵がある一方で、雇用の変化、情報環境の変質、倫理的問題など多くの課題も提起しています。これらのデータは、生成AIが社会に与えるインパクトの一部を示すものであり、今後も継続的な研究と注視が必要です。
--- 個別回答 ---
- research: # 生成AIの社会的影響
生成AI(Generative AI)は近年急速に発展し、社会のさまざまな側面に影響を及ぼしています。これらの影響をデータに基づいて説明します。
## 労働市場への影響
...
=== 勝者 ===
research(1412文字)
# 生成AIの社会的影響
生成AI(Generative AI)は近年急速に発展し、社会のさまざまな側面に影響を及ぼしています。これらの影響をデータに基づいて説明します。
## 労働市場への影響
**自動化とスキル需要の変化**
- McKinseyの調査によると、AIによって2030年までに世界で約8億5000万人の雇用が自動化される可能性がある
- 一方で、World Economic Forumの報告では、AIにより2025年までに約9700万の新しい職種が創出される見込み
- 米国労働統計局のデータでは、AIエンジニアリング関連の職業は2019-2029年の間に22%成長すると予...協調モードでは以下3つのAgentがまず答えを導き出します。
research = mk_agent("research", "生成AIの社会的影響をデータで説明せよ。")
creative = mk_agent("creative", "生成AIの社会的影響を感情的に説明せよ。")
critical = mk_agent("critical", "生成AIの社会的課題を論理的に説明せよ。")
swarm = Swarm([research, creative, critical])その後以下でステップで回答を統合しています。
summarizer = mk_agent("summarizer", "与えられた複数の回答を150文字で論理的に統合する専門家")
merge_swarm = Swarm([summarizer])
res2 = merge_swarm(merge_prompt)対して競争モードでは以下の複数Agentがまず回答を導き出します。
agents = [
Agent(
name="research",
system_prompt="生成AIの社会的影響をデータで説明せよ。handoff禁止。",
model=model,
),
Agent(
name="creative",
system_prompt="生成AIの社会的影響を未来視点で説明せよ。handoff禁止。",
model=model,
),
Agent(
name="critical",
system_prompt="生成AIの社会的リスクを説明せよ。handoff禁止。",
model=model,
),
]その次に最も長い回答を採用しています。
if len(txt) > len(best_text):
best_name = name
best_text = txt
if best_name:
print("\n=== 勝者 ===")
print(f"{best_name}({len(best_text)}文字)")
print(f"{best_text[:300]}...") # 最初の300文字を表示
