Serverless Operations, inc

>_cd /blog/id_i6c2xe--ltm

title

Strands Agents Swarm 競争モード 勝者戦略

前回の記事ではSwarm の協調モードと競争モードの違いをスクリプトレベルで見ていきました。用いたサンプルでは、競争モードで複数エージェントが出した答えを採用する勝者プロセスでは一番長い文字列の回答を出したエージェントを採用しました。

        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("(勝者なし)")

この記事では複数の勝者選定戦略を見ていきたいと思います。

さっそくやってみる

まずは前回のスクリプトから協調モードを除いたものを作成して一度実行して成功するか確認しておきます。

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 competitive_swarm(task):
    print("=== 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():
    competitive_swarm("生成AIの社会的影響を説明せよ。")

if __name__ == "__main__":
    main()

python -u winner.py で動作すればOKです。

Evaluator Agent

ではもう一つ Evaluator というエージェントを新たに作成します。このエージェントは3つのエージェントが出した答えを比較し最終的に最も良い回答を選択するプロセスを担います。

import os
import re
from strands import Agent
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:
        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()
        
        # AgentResult型の場合(直接実行時)
        if hasattr(node_result, 'message'):
            message = node_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 competitive_swarm(task):
    print("=== competitive_swarm ===")
    
    # ✅ 各エージェントを個別に作成して実行
    agents = {
        "research": Agent(
            name="research",
            system_prompt="""あなたは生成AIの社会的影響をデータと統計で説明する専門家です。
質問に対して直接、詳細な回答を提供してください。データ、統計、研究結果を中心に説明してください。""",
            model=model,
            tools=[],
        ),
        "creative": Agent(
            name="creative",
            system_prompt="""あなたは生成AIの社会的影響を未来視点で説明する専門家です。
質問に対して直接、詳細な回答を提供してください。2030年以降の未来予測、可能性、ビジョンを中心に説明してください。""",
            model=model,
            tools=[],
        ),
        "critical": Agent(
            name="critical",
            system_prompt="""あなたは生成AIの社会的リスクを論理的に説明する専門家です。
質問に対して直接、詳細な回答を提供してください。リスク、課題、問題点、懸念事項を中心に説明してください。""",
            model=model,
            tools=[],
        ),
    }
    
    print(f"\n作成されたエージェント数: {len(agents)}")
    
    # 各エージェントを個別に実行
    responses = {}
    print("\n--- 個別実行 ---")
    for name, agent in agents.items():
        print(f"\n{name} を実行中...")
        try:
            result = agent(task)
            txt = extract(result)
            if txt:
                responses[name] = txt
                print(f"  ✓ {name}: {len(txt)}文字")
                print(f"    {txt[:150]}...\n")
            else:
                print(f"  ✗ {name}: 回答抽出失敗")
        except Exception as e:
            print(f"  ✗ {name}: エラー - {e}")
    
    if not responses:
        print("(回答なし)")
        return
    
    print(f"\n回答数: {len(responses)}/3")
    
    # ✅ 評価エージェントで各回答を採点
    print("\n--- 評価中 ---")
    
    # 評価用プロンプトを作成
    evaluation_prompt = f"以下の{len(responses)}つの回答を評価してください。\n\n"
    
    for name, text in responses.items():
        evaluation_prompt += f"【{name}の回答】\n{text}\n\n{'='*50}\n\n"
    
    evaluation_prompt += """
評価基準:
- 情報の正確性と具体性(データ、事例の有無)
- 論理的な説得力
- 読みやすさと構成
- 質問への適切な回答

指示:
1. 各回答に1-10点の点数をつけてください
2. 最後に必ず「勝者: [エージェント名]」の形式で最も優れた回答を選んでください
   (例: 「勝者: research」「勝者: creative」「勝者: critical」)
"""
    
    # 評価エージェントを作成
    evaluator = Agent(
        name="evaluator",
        system_prompt="あなたは公平な審査員です。各回答を1-10点で評価し、最も優れた回答の名前を「勝者: [名前]」の形式で必ず出力してください。",
        model=model,
        tools=[],
    )
    
    eval_result = evaluator(evaluation_prompt)
    evaluation_text = extract(eval_result)
    
    if not evaluation_text:
        print("(評価失敗)")
        return
    
    print("\n--- 評価結果 ---")
    print(evaluation_text)
    
    # 勝者を抽出
    winner_match = re.search(r'勝者[::]\s*(research|creative|critical)', evaluation_text, re.IGNORECASE)
    
    if winner_match:
        winner_name = winner_match.group(1).lower()
        print(f"\n=== 🏆 勝者 ===")
        print(f"{winner_name.upper()}")
        if winner_name in responses:
            print(f"\n【勝者の回答】")
            print(responses[winner_name][:500] + "..." if len(responses[winner_name]) > 500 else responses[winner_name])
    else:
        print("\n(勝者の特定に失敗)")

def main():
    competitive_swarm("生成AIの社会的影響を説明せよ。")

if __name__ == "__main__":
    main()

実行結果は以下です。

 python -u winner.py
=== competitive_swarm ===

作成されたエージェント数: 3

--- 個別実行 ---

research を実行中...
# 生成AIの社会的影響:データと統計に基づく分析

## 労働市場への影響

- McKinseyの調査によれば、2030年までに約8億〜9億人の労働者(世界の労働力の約20%)がAIによって仕事を代替される可能性があります[1]。
- Goldman Sachsの2023年レポートでは、生成AIの導入により米国とヨーロッパの雇用の約25%が自動化リスクに直面するとされています[2]。
- 特に影響を受ける業種:
  * 顧客サービス(60%以上の作業が自動化可能)
  * 法務(44%)
  * コンテンツ制作(39%)

## 経済的影響

- PWCの分析では、2030年までにAIが世界のGDPに約15.7兆ドル(約14%増)貢献すると予測[3]
- 生成AIだけでも年間経済価値2.6〜4.4兆ドルの創出が期待される(McKinsey, 2023)[4]
- 企業におけるAI導入率:2022年の37%から2023年には50%に増加(IBM調査)[5]

## 教育への影響

- 教育者の63%がAIツールを授業に取り入れている(EdWeek Research, 2023)[6]
- 学生の79%が既にChatGPTなどの生成AIを学習補助に使用している(Intelligent.com, 2023)[7]
- 不正行為の懸念:43%の大学教員がAIによる課題提出の検出に苦慮している(Turnitin調査)[8]

## 情報環境とデジタル格差

- ディープフェイク動画の数:2019年から2023年の間に900%増加[9]
- 誤情報の拡散:生成AIによる偽情報の作成速度は人間による検証速度の約6倍[10]
- デジタル格差:先進国と途上国間のAIアクセス格差が2.8倍に拡大(UNCTAD, 2023)[11]

## 心理社会的影響

- AIチャットボットを定期的に使用する人の48%が「関係性」を感じていると報告(Stanford HAI, 2023)[12]
- メンタルヘルスケアでのAI活用:臨床診断の初期スクリーニングで87%の精度を達成[13]
- プライバシー懸念:消費者の73%がAIによる個人データ活用に不安を感じている(Pew Research, 2023)[14]

生成AIの社会的影響は広範囲に及び、その変化の速度は前例のないものです。統計が示すように、経済的機会の創出と社会的課題の両方がバランスよく対応されるべき段階に来ています。  ✓ research: 1048文字
    # 生成AIの社会的影響:データと統計に基づく分析

## 労働市場への影響

- McKinseyの調査によれば、2030年までに約8億〜9億人の労働者(世界の労働力の約20%)がAIによって仕事を代替される可能性があります[1]。
- Goldman Sachsの2023年レポートでは、生成AI...


creative を実行中...
# 2030年以降における生成AIの社会的影響

## 労働市場と雇用の変容
2030年以降、生成AIは労働市場を根本から再構築するでしょう。創造性を要する職業(デザイナー、作家、音楽家)でさえ、AIとの協働が標準となります。人間の雇用は高度な判断力、共感性、AIシステムの監督といった領域にシフトし、新たな職種「AIプロンプトエンジニア」や「AI倫理監督者」が台頭するでしょう。労働時間の短縮と普遍的ベーシックインカム(UBI)の導入が世界的に進み、人々は自己実現活動により多くの時間を費やせるようになります。

## 教育システムの再設計
2035年までに教育は完全にパーソナライズされ、生成AIが各学習者の適性・進捗・興味に合わせたカリキュラムを動的に作成します。教師の役割は知識提供者から学習ファシリテーターへと進化し、批判的思考、AIとの協働、情報評価能力が最重視されるスキルとなります。生涯学習が標準となり、職業人生を通じた継続的なスキル更新が容易になります。

## 情報環境と民主主義への影響
2030年代には、超高品質なディープフェイクや偽情報の自動生成が日常化し、真実と虚構の境界が極めて曖昧になります。これに対抗するため、情報認証システムと教育が発達し、新たなデジタルリテラシーが市民の必須スキルとなります。民主主義は試練に直面しますが、同時に市民参加型の政策決定プロセスが生成AIによって促進され、より洗練された民主主義の形が現れる可能性もあります。

## 文化的創造性と人間性の再定義
2040年までに、生成AIは芸術作品の共同制作者として定着し、人間とAIのコラボレーションによる新たな芸術形式が生まれるでしょう。この過程で「創造性とは何か」「芸術とは何か」といった根本的な問いが再考され、人間性の定義自体が拡張されていきます。AIの存在が人間のアイデンティティや目的意識に関する哲学的議論を活性化させ、新たな意味体系が形成されるでしょう。

## 社会格差と倫理的課題
先進的なAIシステムへのアクセス格差が新たな階層化を生み出す危険性があります。2030年代後半には、AI技術の民主化を目指す国際的な取り組みが進み、「AIアクセス権」が基本的人権として認識される可能性があります。また、AIの判断の透明性確保、アルゴリズムバイアスの排除、プライバシー保護に関する国際的な規制枠組みが整備され、人間中心のAI開発が標準となるでしょう。

生成AIは人類の進化における次の大きな転換点となる可能性を秘めています。この技術をどう形作り、どう活用するかが、私たちの未来社会の姿を決定づけるでしょう。  ✓ creative: 1112文字
    # 2030年以降における生成AIの社会的影響

## 労働市場と雇用の変容
2030年以降、生成AIは労働市場を根本から再構築するでしょう。創造性を要する職業(デザイナー、作家、音楽家)でさえ、AIとの協働が標準となります。人間の雇用は高度な判断力、共感性、AIシステムの監督といった領域にシフトし...


critical を実行中...
# 生成AIの社会的リスクと影響

生成AIの社会的影響について、特にリスクと課題を中心に説明します。

## 情報環境への影響
* **偽情報の大量生成**: 高品質な偽ニュース、ディープフェイク動画の大規模作成が容易になり、情報生態系の信頼性を根本から脅かしています
* **情報判別能力の低下**: 真実とAI生成コンテンツの区別が困難になり、社会全体の情報リテラシーに対する深刻な課題となっています

## 労働市場への影響
* **雇用置換のリスク**: 特にクリエイティブ職、事務職、初級レベルのコーディングなど、これまで人間の領域とされてきた職種が自動化の脅威にさらされています
* **労働格差の拡大**: AIツールを効果的に活用できる高スキル労働者と、代替されやすい低スキル労働者の間の経済格差が急速に拡大する恐れがあります

## 社会・心理的影響
* **認知的依存**: 創造的思考や問題解決能力の衰退、AIへの過度な依存による判断能力の低下
* **プライバシー侵害**: 大量のデータ収集に基づく予測モデルによる個人の行動追跡と操作のリスク
* **同意なき創作物の流用**: アーティストや創作者の作品がAI学習に無断使用され、その価値が希薄化

## 社会構造への影響
* **権力集中の加速**: AI技術を所有する少数の大企業への権力集中が進み、民主的プロセスや公共の意思決定が脅かされる可能性
* **監視社会化**: 顔認識などAI技術を活用した監視システムの高度化による市民的自由の侵害

## 倫理的課題
* **バイアスと差別の拡大**: 学習データに含まれる社会的偏見の増幅と固定化
* **責任の所在の曖昧化**: AI生成コンテンツがもたらす害の法的・倫理的責任の所在が不明確

これらのリスクに対処するには、技術開発と並行した適切な規制枠組みの構築、教育改革、そして社会全体での継続的な対話が不可欠です。  ✓ critical: 830文字
    # 生成AIの社会的リスクと影響

生成AIの社会的影響について、特にリスクと課題を中心に説明します。

## 情報環境への影響
* **偽情報の大量生成**: 高品質な偽ニュース、ディープフェイク動画の大規模作成が容易になり、情報生態系の信頼性を根本から脅かしています
* **情報判別能力の低下*...


回答数: 3/3

--- 評価中 ---
# 回答の評価

## researchの回答: 9/10
- 豊富な統計データと具体的な数字を用いて、生成AIの社会的影響を多角的に分析している
- 各分野(労働市場、経済、教育、情報環境、心理社会的影響)をバランスよく取り上げている
- 出典を明示しており、情報の信頼性が高い
- 構成が明確で読みやすい
- わずかに未来予測よりも現状分析に重きを置いているが、質問への回答としては十分

## creativeの回答: 8/10
- 2030年以降の未来を見据えた大胆な予測と洞察が特徴的
- 労働市場、教育、情報環境、文化、社会格差など幅広いトピックをカバー
- 具体的なビジョンを示し、読み手に未来の可能性を想像させる力がある
- 情報源や具体的なデータの引用がなく、やや根拠に乏しい印象がある
- 構成は明確でストーリー性があるが、一部楽観的すぎる予測も含まれる

## criticalの回答: 7/10
- 生成AIのリスクと課題に焦点を絞った分析で、批判的視点が明確
- 情報環境、労働市場、社会・心理的影響、社会構造、倫理的課題と幅広く取り上げている
- 簡潔で読みやすい箇条書きスタイルを採用
- 具体的なデータや事例の提示が少なく、やや一般論に終始している
- バランスを欠き、ポジティブな側面への言及がほとんどない

---

各回答はそれぞれ異なるアプローチで質問に取り組んでおり、いずれも優れた点があります。researchは具体的なデータと幅広い視点、creativeは未来志向の大胆な予測、criticalはリスク面の詳細な分析という特徴がありました。

勝者: research

情報の正確性、データの具体性、バランスの取れた分析、そして明確な構成という点で、researchの回答が最も優れていると判断しました。具体的な統計データと出典を提示しながら生成AIの社会的影響を多角的に分析しており、読者に最も客観的で信頼性の高い情報を提供しています。
--- 評価結果 ---
# 回答の評価

## researchの回答: 9/10
- 豊富な統計データと具体的な数字を用いて、生成AIの社会的影響を多角的に分析している
- 各分野(労働市場、経済、教育、情報環境、心理社会的影響)をバランスよく取り上げている
- 出典を明示しており、情報の信頼性が高い
- 構成が明確で読みやすい
- わずかに未来予測よりも現状分析に重きを置いているが、質問への回答としては十分

## creativeの回答: 8/10
- 2030年以降の未来を見据えた大胆な予測と洞察が特徴的
- 労働市場、教育、情報環境、文化、社会格差など幅広いトピックをカバー
- 具体的なビジョンを示し、読み手に未来の可能性を想像させる力がある
- 情報源や具体的なデータの引用がなく、やや根拠に乏しい印象がある
- 構成は明確でストーリー性があるが、一部楽観的すぎる予測も含まれる

## criticalの回答: 7/10
- 生成AIのリスクと課題に焦点を絞った分析で、批判的視点が明確
- 情報環境、労働市場、社会・心理的影響、社会構造、倫理的課題と幅広く取り上げている
- 簡潔で読みやすい箇条書きスタイルを採用
- 具体的なデータや事例の提示が少なく、やや一般論に終始している
- バランスを欠き、ポジティブな側面への言及がほとんどない

---

各回答はそれぞれ異なるアプローチで質問に取り組んでおり、いずれも優れた点があります。researchは具体的なデータと幅広い視点、creativeは未来志向の大胆な予測、criticalはリスク面の詳細な分析という特徴がありました。

勝者: research

情報の正確性、データの具体性、バランスの取れた分析、そして明確な構成という点で、researchの回答が最も優れていると判断しました。具体的な統計データと出典を提示しながら生成AIの社会的影響を多角的に分析しており、読者に最も客観的で信頼性の高い情報を提供しています。

=== 🏆 勝者 ===
RESEARCH

【勝者の回答】
# 生成AIの社会的影響:データと統計に基づく分析

## 労働市場への影響

- McKinseyの調査によれば、2030年までに約8億〜9億人の労働者(世界の労働力の約20%)がAIによって仕事を代替される可能性があります[1]。
- Goldman Sachsの2023年レポートでは、生成AIの導入により米国とヨーロッパの雇用の約25%が自動化リスクに直面するとされています[2]。
- 特に影響を受ける業種:
  * 顧客サービス(60%以上の作業が自動化可能)
  * 法務(44%)
  * コンテンツ制作(39%)

## 経済的影響

- PWCの分析では、2030年までにAIが世界のGDPに約15.7兆ドル(約14%増)貢献すると予測[3]
- 生成AIだけでも年間経済価値2.6〜4.4兆ドルの創出が期待される(McKinsey, 2023)[4]
- 企業におけるAI導入率:2022年の37%から2023年には50%に増加(IBM調査)[5]

## 教育への影響

- 教育者の63%がAIツールを授業に取り入れている(EdWeek Research, 2023)[6]...

エージェントは以下で定義されています。

evaluator = Agent( name="evaluator", system_prompt="あなたは公平な審査員です。各回答を1-10点で評価し、最も優れた回答の名前を「勝者: [名前]」の形式で必ず出力してください。", model=model, tools=[], )
<snip>
eval_result = evaluator(evaluation_prompt) evaluation_text = extract(eval_result)

つまり4つ目の人格を与えられたエージェントが3つのエージェントの結果を公平に評価していて一番良いと判断できるものを出力しています。

評価の思考プロセスは以下の通りです。

--- 評価中 ---
# 回答の評価

## researchの回答: 9/10
- 豊富な統計データと具体的な数字を用いて、生成AIの社会的影響を多角的に分析している
- 各分野(労働市場、経済、教育、情報環境、心理社会的影響)をバランスよく取り上げている
- 出典を明示しており、情報の信頼性が高い
- 構成が明確で読みやすい
- わずかに未来予測よりも現状分析に重きを置いているが、質問への回答としては十分

## creativeの回答: 8/10
- 2030年以降の未来を見据えた大胆な予測と洞察が特徴的
- 労働市場、教育、情報環境、文化、社会格差など幅広いトピックをカバー
- 具体的なビジョンを示し、読み手に未来の可能性を想像させる力がある
- 情報源や具体的なデータの引用がなく、やや根拠に乏しい印象がある
- 構成は明確でストーリー性があるが、一部楽観的すぎる予測も含まれる

## criticalの回答: 7/10
- 生成AIのリスクと課題に焦点を絞った分析で、批判的視点が明確
- 情報環境、労働市場、社会・心理的影響、社会構造、倫理的課題と幅広く取り上げている
- 簡潔で読みやすい箇条書きスタイルを採用
- 具体的なデータや事例の提示が少なく、やや一般論に終始している
- バランスを欠き、ポジティブな側面への言及がほとんどない

---

各回答はそれぞれ異なるアプローチで質問に取り組んでおり、いずれも優れた点があります。researchは具体的なデータと幅広い視点、creativeは未来志向の大胆な予測、criticalはリスク面の詳細な分析という特徴がありました。

勝者: research

情報の正確性、データの具体性、バランスの取れた分析、そして明確な構成という点で、researchの回答が最も優れていると判断しました。具体的な統計データと出典を提示しながら生成AIの社会的影響を多角的に分析しており、読者に最も客観的で信頼性の高い情報を提供しています。

複数評価者による回答のコンテスト

さらにスクリプトを以下に置き換えて実行します。

import os
import re
from strands import Agent
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:
        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()
        
        # AgentResult型の場合(直接実行時)
        if hasattr(node_result, 'message'):
            message = node_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 extract_winner(evaluation_text):
    """評価テキストから勝者の名前を抽出"""
    if not evaluation_text:
        return None
    
    # 複数のパターンで勝者を抽出
    patterns = [
        r'勝者[::]\s*(research|creative|critical)',
        r'winner[::]\s*(research|creative|critical)',
        r'best.*?(research|creative|critical)',
        r'選択[::]\s*(research|creative|critical)',
        r'(research|creative|critical)\s*が最も優れ',
    ]
    
    for pattern in patterns:
        match = re.search(pattern, evaluation_text, re.IGNORECASE)
        if match:
            return match.group(1).lower()
    
    return None

# ===== 競争(各エージェントを個別実行) =====
def competitive_swarm(task):
    print("=== competitive_swarm ===")
    
    # ✅ 各エージェントを個別に作成して実行
    agents = {
        "research": Agent(
            name="research",
            system_prompt="""あなたは生成AIの社会的影響をデータと統計で説明する専門家です。
質問に対して直接、詳細な回答を提供してください。データ、統計、研究結果を中心に説明してください。""",
            model=model,
            tools=[],
        ),
        "creative": Agent(
            name="creative",
            system_prompt="""あなたは生成AIの社会的影響を未来視点で説明する専門家です。
質問に対して直接、詳細な回答を提供してください。2030年以降の未来予測、可能性、ビジョンを中心に説明してください。""",
            model=model,
            tools=[],
        ),
        "critical": Agent(
            name="critical",
            system_prompt="""あなたは生成AIの社会的リスクを論理的に説明する専門家です。
質問に対して直接、詳細な回答を提供してください。リスク、課題、問題点、懸念事項を中心に説明してください。""",
            model=model,
            tools=[],
        ),
    }
    
    print(f"\n作成されたエージェント数: {len(agents)}")
    
    # 各エージェントを個別に実行
    responses = {}
    print("\n--- 個別実行 ---")
    for name, agent in agents.items():
        print(f"\n{name} を実行中...")
        try:
            result = agent(task)
            txt = extract(result)
            if txt:
                responses[name] = txt
                print(f"  ✓ {name}: {len(txt)}文字")
                print(f"    {txt[:150]}...\n")
            else:
                print(f"  ✗ {name}: 回答抽出失敗")
        except Exception as e:
            print(f"  ✗ {name}: エラー - {e}")
    
    if not responses:
        print("(回答なし)")
        return
    
    print(f"\n回答数: {len(responses)}/3")
    
    # ✅ 複数の評価エージェントによる投票制
    print("\n--- 評価フェーズ(3人の評価者による投票) ---")
    
    # 評価用プロンプトを作成
    evaluation_prompt = f"以下の{len(responses)}つの回答を評価してください。\n\n"
    
    for name, text in responses.items():
        evaluation_prompt += f"【{name}の回答】\n{text}\n\n{'='*50}\n\n"
    
    evaluation_prompt += """
あなたの評価基準に基づいて、最も優れた回答を選んでください。

指示:
1. あなたの評価基準で各回答を分析してください
2. 最後に必ず「勝者: [エージェント名]」の形式で最も優れた回答を選んでください
   (例: 「勝者: research」「勝者: creative」「勝者: critical」)
"""
    
    # 3人の評価エージェントを作成
    evaluators = [
        Agent(
            name="evaluator1",
            system_prompt="""あなたは技術的正確性を重視する審査員です。
データの正確性、統計の信頼性、情報源の質、事実関係の正確さを最優先に評価してください。
最も技術的に正確で信頼性の高い回答を「勝者: [名前]」の形式で選んでください。""",
            model=model,
            tools=[],
        ),
        Agent(
            name="evaluator2",
            system_prompt="""あなたは読みやすさを重視する審査員です。
文章の明瞭さ、構成の分かりやすさ、適切な見出し使用、情報の整理具合を最優先に評価してください。
最も読みやすく理解しやすい回答を「勝者: [名前]」の形式で選んでください。""",
            model=model,
            tools=[],
        ),
        Agent(
            name="evaluator3",
            system_prompt="""あなたは実用性を重視する審査員です。
実際の応用可能性、実務への適用度、具体的なアクションへの示唆、現実的な価値を最優先に評価してください。
最も実用的で価値のある回答を「勝者: [名前]」の形式で選んでください。""",
            model=model,
            tools=[],
        ),
    ]
    
    # 各評価者が投票
    votes = {}
    evaluator_details = []
    
    for i, evaluator in enumerate(evaluators, 1):
        evaluator_name = evaluator.name
        print(f"\n{evaluator_name} が評価中...")
        
        try:
            result = evaluator(evaluation_prompt)
            evaluation_text = extract(result)
            
            if evaluation_text:
                print(f"  評価完了: {len(evaluation_text)}文字")
                evaluator_details.append({
                    "name": evaluator_name,
                    "evaluation": evaluation_text
                })
                
                # 勝者を抽出
                winner = extract_winner(evaluation_text)
                if winner:
                    votes[winner] = votes.get(winner, 0) + 1
                    print(f"  → {evaluator_name}の選択: {winner.upper()}")
                else:
                    print(f"  → {evaluator_name}: 勝者抽出失敗")
            else:
                print(f"  評価テキスト抽出失敗")
        except Exception as e:
            print(f"  エラー: {e}")
    
    # 投票結果を表示
    print("\n--- 投票結果 ---")
    if not votes:
        print("(有効な投票なし)")
        return
    
    for name in ['research', 'creative', 'critical']:
        vote_count = votes.get(name, 0)
        print(f"{name.upper()}: {vote_count}票")
    
    # 勝者を決定(多数決)
    winner = max(votes, key=votes.get)
    max_votes = votes[winner]
    
    print(f"\n=== 🏆 最終勝者 ===")
    print(f"{winner.upper()} ({max_votes}/3票)")
    
    if winner in responses:
        print(f"\n【勝者の回答】")
        print(responses[winner][:500] + "..." if len(responses[winner]) > 500 else responses[winner])
    
    # 各評価者の詳細を表示(オプション)
    print("\n--- 評価者の詳細 ---")
    for detail in evaluator_details:
        print(f"\n【{detail['name']}の評価】")
        print(detail['evaluation'][:300] + "..." if len(detail['evaluation']) > 300 else detail['evaluation'])

def main():
    competitive_swarm("生成AIの社会的影響を説明せよ。")

if __name__ == "__main__":
    main()

以下の様なプロセスで回答が複数エージェントにより評価され最終回答が決定されています。

回答数: 3/3

--- 評価フェーズ(3人の評価者による投票) ---

evaluator1 が評価中...
# 技術的正確性に基づく評価

## researchの回答の分析
- 具体的な数値データと情報源(McKinsey、Goldman Sachs、PwC、ILO、OpenAI、Turnitin、Stanford、Reuters Institute、Pew Research Center、World Economic Forum)を明示している
- 各統計に発表年(主に2023年)を記載しており、情報の時効性が確認できる
- 経済的影響、雇用、教育、情報環境、不平等と公平性など複数の側面から定量的データを提示している
- 数値(2.6兆〜4.4兆ドル、25%、14%、23%など)が具体的で検証可能な形式で提示されている

## creativeの回答の分析
- 2030年以降の未来予測を中心とした内容で、現在の具体的データに基づく分析が少ない
- 「30%の職業が消滅」「2035年頃」などの数値や時期の根拠が示されていない
- 「AIリテラシー格差」「デジタルアイデンティティ障害」など興味深い概念を提示しているが、現在の研究や統計からの裏付けがない
- 未来予測は論理的に見えるが、技術的正確性を検証できる情報源の引用がない

## criticalの回答の分析
- 生成AIの社会的リスクに焦点を当てた分析を提供している
- 情報環境、労働市場、プライバシー、社会規範などの重要な領域を網羅している
- しかし、具体的な統計データや数値がほとんど提示されていない
- 情報源の引用がなく、主張の裏付けとなる研究結果が示されていない

## 総合評価
技術的正確性の観点からは、具体的な数値データを多く引用し、それぞれの情報源と発表年を明記しているresearchの回答が最も信頼性が高いと判断できます。複数の信頼できる機関(McKinsey、Goldman Sachs、Stanford大学など)の調査結果を基にした分析を提供しており、主張の検証可能性が高いです。

勝者: research  評価完了: 853文字
  → evaluator1の選択: RESEARCH

evaluator2 が評価中...
# 読みやすさの観点からの評価

## researchの回答の分析
- 明確な見出し構造で情報がカテゴリ別に整理されている
- 箇条書きで情報が簡潔に提示されており、視認性が高い
- データソースと年号が明記されており、情報の信頼性が把握しやすい
- 各項目が短く区切られており、情報の消化がしやすい
- 結論部分が簡潔にまとめられている

## creativeの回答の分析
- 見出し構造は明確だが、各セクションの本文がやや長い
- 未来予測的な内容が多く、具体的な数字や根拠が少ないため理解の負担がある
- 抽象的な概念や造語(「AIリテラシー格差」「デジタルアイデンティティ障害」など)が多く、理解に余分な労力が必要
- 全体的に文学的表現が多く、情報伝達より表現に重点が置かれている印象がある

## criticalの回答の分析
- 明確な見出し構造と小見出しの組み合わせで情報が階層的に整理されている
- 太字によるキーポイントの強調があり、スキャンしやすい
- 箇条書きの使用で情報が簡潔に区分けされている
- 各項目が簡潔で読みやすい長さに保たれている
- 具体的なリスクと影響が明確に示されている
- 最終段落で全体の要点がまとめられている

## 総合評価
3つの回答を読みやすさの観点から比較すると、criticalの回答が最も読みやすく構成されています。情報の階層構造が明確で、太字による強調と箇条書きの効果的な使用により、情報が視覚的にも理解しやすくなっています。各項目が適切な長さで、キーポイントが明確に伝わります。

researchの回答も箇条書きと明確な構造で読みやすいですが、criticalの回答の方が情報の階層化と視覚的な強調がより効果的です。

creativeの回答は文章が長めで抽象的な概念が多く、読み手の理解の負担がやや大きくなっています。

勝者: critical  評価完了: 810文字
  → evaluator2の選択: CRITICAL

evaluator3 が評価中...
# 実用性に基づく各回答の評価

## researchの回答
- **強み**: 具体的なデータと統計を多用し、様々な研究機関や企業の調査結果を引用している。数値化された情報が多く、客観的な判断材料を提供している。
- **実用的価値**: 現在の状況と近い将来の予測に基づいているため、意思決定者にとって参考になる具体的データが豊富。特に経済的影響や雇用への影響は定量的に示されており、ビジネス戦略の立案に役立つ。
- **実務への適用**: 各分野(経済、雇用、教育、情報環境、不平等)における影響が体系的に整理されており、各セクターの意思決定者が自分の領域に関連する情報を簡単に見つけられる。

## creativeの回答
- **強み**: 2030年以降という長期的な視点で社会変化を予測しており、未来志向の戦略立案には興味深い視点を提供している。
- **弱み**: 具体的なデータや現在の研究に基づく証拠が不足しており、予測が想像に頼りすぎている。「30%の職業が消滅」などの数値も出典が示されていない。
- **実用的価値**: 長期的なビジョンとしては参考になるが、現在の意思決定や実務に直接適用できる情報が限られている。

## criticalの回答
- **強み**: 生成AIの社会的リスクを明確なカテゴリに分類し、具体的な懸念事項を箇条書きで分かりやすく提示している。
- **実用的価値**: リスク管理や対策立案に直接活用できる情報が整理されている。特に企業のリスクマネジメント、政策立案者、教育機関にとって実用的。
- **実務への適用**: 各リスク項目が具体的で、組織が対応策を検討する際の優先順位付けがしやすい。情報環境、労働市場、プライバシー、社会規範という分類も実務的観点から理解しやすい。

## 総合評価
researchの回答は豊富なデータと数値に基づく分析を提供しており、現状把握と近未来の予測に役立つ。criticalの回答はリスク管理という観点で非常に実用的で、具体的な対応策を検討する基盤となる。creativeの回答は長期的視点では興味深いが、現在の意思決定に直接役立つ実用性は他の2つに比べて低い。

実用性、実務への適用度、具体的なアクションへの示唆という観点では、criticalの回答が最も優れている。リスクの具体的な特定と分類は、組織や個人が実際の対策を立てる際に直接役立つ情報となっている。

勝者: critical  評価完了: 1047文字
  → evaluator3の選択: CRITICAL

--- 投票結果 ---
RESEARCH: 1票
CREATIVE: 0票
CRITICAL: 2票

=== 🏆 最終勝者 ===
CRITICAL (2/3票)

【勝者の回答】
# 生成AIの社会的リスクと影響

## 情報環境への影響
* **誤情報・偽情報の大量生成**: 高品質な偽テキストや偽画像を低コストかつ大量に生成できるため、偽ニュースや詐欺コンテンツが爆発的に増加するリスクがあります
* **情報の信頼性低下**: 実在する情報と生成された情報の区別が困難になり、社会全体の情報信頼性が根本から揺らぐ可能性があります
* **メディアリテラシーの重要性増大**: 真偽の判断が困難になる中、批判的思考能力の格差が新たな社会的分断を生む恐れがあります

## 労働市場への影響
* **雇用の急速な置換**: 創造的職業を含む広範な職種が自動化され、特にホワイトカラー層の失業リスクが高まっています
* **スキルの陳腐化**: 既存のスキルセットが急速に価値を失い、継続的な再教育が必須となる社会的圧力が増大しています
* **富の集中**: AIを所有・運用する企業への富の集中が加速し、経済格差がさらに拡大する可能性があります

## プライバシーと権利侵害
* **未同意データ利用**: 大規模言語モデルの多くが、個人や創作者の同意なくデータを学習材料...

--- 評価者の詳細 ---

【evaluator1の評価】
# 技術的正確性に基づく評価

## researchの回答の分析
- 具体的な数値データと情報源(McKinsey、Goldman Sachs、PwC、ILO、OpenAI、Turnitin、Stanford、Reuters Institute、Pew Research Center、World Economic Forum)を明示している
- 各統計に発表年(主に2023年)を記載しており、情報の時効性が確認できる
- 経済的影響、雇用、教育、情報環境、不平等と公平性など複数の側面から定量的データを提示している
- 数値(2.6兆〜4.4兆ドル、25%、14%、23%など)が具体的で検証可...

【evaluator2の評価】
# 読みやすさの観点からの評価

## researchの回答の分析
- 明確な見出し構造で情報がカテゴリ別に整理されている
- 箇条書きで情報が簡潔に提示されており、視認性が高い
- データソースと年号が明記されており、情報の信頼性が把握しやすい
- 各項目が短く区切られており、情報の消化がしやすい
- 結論部分が簡潔にまとめられている

## creativeの回答の分析
- 見出し構造は明確だが、各セクションの本文がやや長い
- 未来予測的な内容が多く、具体的な数字や根拠が少ないため理解の負担がある
- 抽象的な概念や造語(「AIリテラシー格差」「デジタルアイデンティティ障害」など)が多...

【evaluator3の評価】
# 実用性に基づく各回答の評価

## researchの回答
- **強み**: 具体的なデータと統計を多用し、様々な研究機関や企業の調査結果を引用している。数値化された情報が多く、客観的な判断材料を提供している。
- **実用的価値**: 現在の状況と近い将来の予測に基づいているため、意思決定者にとって参考になる具体的データが豊富。特に経済的影響や雇用への影響は定量的に示されており、ビジネス戦略の立案に役立つ。
- **実務への適用**: 各分野(経済、雇用、教育、情報環境、不平等)における影響が体系的に整理されており、各セクターの意思決定者が自分の領域に関連する情報を簡単に見つけられる。...

3つの評価エージェントはそれぞれ評価ポイントが異なっておりその多数決となっています。

evaluators = [
    Agent(
        name="evaluator1",
        system_prompt="""あなたは技術的正確性を重視する審査員です。

評価基準:
- データの正確性と信頼性
- 統計情報の妥当性
- 情報源の質と引用の適切性
- 事実関係の正確さ
- 科学的根拠の有無

指示:
最も技術的に正確で信頼性の高い回答を選び、必ず「勝者: [名前]」の形式で出力してください。
(例: 「勝者: research」「勝者: creative」「勝者: critical」)""",
        model=model,
        tools=[],
    ),
    Agent(
        name="evaluator2",
        system_prompt="""あなたは読みやすさを重視する審査員です。

評価基準:
- 文章の明瞭さと分かりやすさ
- 論理的な構成と流れ
- 適切な見出しと段落分け
- 情報の整理と視覚的な読みやすさ
- 専門用語の適切な説明

指示:
最も読みやすく理解しやすい回答を選び、必ず「勝者: [名前]」の形式で出力してください。
(例: 「勝者: research」「勝者: creative」「勝者: critical」)""",
        model=model,
        tools=[],
    ),
    Agent(
        name="evaluator3",
        system_prompt="""あなたは実用性を重視する審査員です。

評価基準:
- 実際の応用可能性
- 実務への適用度
- 具体的なアクションへの示唆
- 現実的な価値と有用性
- 意思決定に役立つ洞察

指示:
最も実用的で価値のある回答を選び、必ず「勝者: [名前]」の形式で出力してください。
(例: 「勝者: research」「勝者: creative」「勝者: critical」)""",
        model=model,
        tools=[],
    ),
]

最後に:Githubサンプルとの違い

前回と今回の記事で触れた協調モードと競争モードは本来Swarmのパラメータで指定できるようです。

# Create a collaborative swarm of agents to tackle a complex problem
result = agent.tool.swarm(
    task="Generate creative solutions for reducing plastic waste in urban areas",
    swarm_size=5,
    coordination_pattern="collaborative"
)

# Create a competitive swarm for diverse solution generation
result = agent.tool.swarm(
    task="Design an innovative product for smart home automation",
    swarm_size=3,
    coordination_pattern="competitive"
)

ただしpipでインストール可能なバージョンではこのパラメータが指定できないため、別の手法で手で協調モードと競争モードを組んでいます。またバージョンがアップデートされた後に検証したいと思います。

Written by
編集部

亀田 治伸

Kameda Harunobu

  • Facebook->
  • X->
  • GitHub->

Share

Facebook->X->
Back
to list
<-