0
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?

ゼロから構築!マルチAIエージェントで複雑な開発タスクを自動化

0
Posted at

多くのエンジニアが「LLMで複雑なタスクを自動化したい」と考える一方で、単一エージェントの限界に直面しています。

「期待通りの結果が出ない」「途中で処理が止まる」「プロンプトが肥大化する」といった課題は、タスクが複雑になるほど顕著になります。この記事では、これらの問題を解決するマルチエージェントオーケストレーションの概念と、その具体的な実装フレームワークであるCrewAIとAutoGenについて、実践的なコード例を交えて解説します。この記事を読めば、複数のAIエージェントが協調して動作するシステムを構築し、複雑な開発タスクを効率的に自動化する第一歩を踏み出せるでしょう。

マルチエージェントオーケストレーションとは? LangChainとの違い

このセクションでは、マルチエージェントオーケストレーションの基本的な考え方と、なぜ今この技術が注目されているのか、そして従来のLangChainのようなフレームワークと何が違うのかを解説します。

単一エージェントの限界とマルチエージェントの必要性

LLM(大規模言語モデル)の進化により、多くのタスクが自動化可能になりました。しかし、システム開発やコンテンツ生成、データ分析といった複雑なタスクは、単一のLLMエージェントだけでは対応が難しい場面が多々あります。例えば、「要件定義」「設計」「実装」「テスト」といった一連のソフトウェア開発プロセスを、単一のエージェントに全て任せるのは非現実的です。

ここで登場するのが「マルチエージェントオーケストレーション」です。これは、異なる役割を持つ複数のAIエージェントが、互いに協力し、情報を共有しながら、一つの大きな目標達成に向けてタスクを分担して実行するシステムを指します。人間がチームでプロジェクトを進めるように、AIもチームで動くことで、より複雑で高度なタスクを効率的に解決できるようになります。

LangChainの代替としてのCrewAIとAutoGenの台頭

これまでLLMアプリケーション開発のデファクトスタンダードとしてLangChainが広く利用されてきました。LangChainはLLMの連携、ツールの利用、RAG (Retrieval Augmented Generation) など、多岐にわたる機能を提供します。しかし、エージェント間の協調や複雑なワークフローのオーケストレーションに関しては、開発者がかなりの部分を実装する必要がありました。

CrewAIとAutoGenは、この「マルチエージェントオーケストレーション」に特化したフレームワークとして登場し、LangChainの代替、あるいは補完的な存在として注目されています。

  • CrewAI: 役割ベースのオーケストレーションフレームワークで、エージェントを「クルー」として組織化し、明確なタスクフローを定義することに特化しています。開発速度と構造化されたワークフローの構築に優れています。LangChainを内部的に利用しており、LangChainのエコシステムとの親和性が高いです。
  • AutoGen: Microsoftが開発した会話駆動型のフレームワークで、エージェント間の柔軟なチャットを通じてタスクを解決します。エージェントが自律的に会話を進め、コード実行を含む様々なアクションを実行できる点が特徴です。LangChainとは独立した設計思想を持っています。

これらのフレームワークは、LangChainでは実現が難しかった「エージェント間の自律的な協調」をより容易にし、複雑なタスクの自動化を加速させます。

CrewAIで始める役割ベースのマルチエージェントシステム構築

このセクションでは、CrewAIの基本的な概念から、エージェント、タスク、クルーの定義方法、そして具体的な実装例を通して、役割ベースのマルチエージェントシステム構築手順を解説します。

CrewAIの主要コンポーネントと特徴

CrewAI(バージョン0.152.0時点)は、Python製のオープンソースフレームワークで、以下の主要コンポーネントで構成されます。

  • Agent: 役割 (role)、目標 (goal)、背景 (backstory) を持ち、LLM、ツール、メモリなどを設定できます。
  • Task: エージェントに割り当てられる具体的な作業内容 (description) と期待される出力 (expected_output) を定義します。
  • Crew: 複数のAgentとTaskを組織化し、タスクの実行プロセス (Sequential, Hierarchical) を定義します。
  • Tools: エージェントが外部と連携するための機能(ウェブ検索、API呼び出しなど)を提供します。

CrewAIの最大の特徴は、エージェントに明確な役割と目標を与えることで、人間社会のチームのように協調動作を促す点です。

環境準備とCrewAIのインストール

CrewAIを使用するための環境準備とインストール方法を説明します。

まず、Pythonの仮想環境を準備し、CrewAIとその関連ライブラリをインストールします。

python -m venv crewai_env
source crewai_env/bin/activate # macOS/Linux
# crewai_env\Scripts\activate.bat # Windows
pip install crewai crewai-tools python-dotenv

次に、LLMのAPIキーやツール(SerperDevToolなど)のAPIキーを設定します。これらはセキュリティのため、環境変数として設定することを強く推奨します。.env ファイルを作成し、以下のように記述します。

OPENAI_API_KEY="YOUR_OPENAI_API_KEY"
SERPER_API_KEY="YOUR_SERPER_API_KEY"

Pythonコード内で os.environ を使って設定することも可能ですが、本番環境では避けるべきです。

実装例: ウェブ検索と要約を行うクルー

ここでは、ウェブ検索を行う「リサーチャー」と、その結果を要約する「ライター」の2つのエージェントからなるクルーを構築する例を示します。

from crewai import Crew, Agent, Task, Process
from crewai_tools import SerperDevTool
import os
from dotenv import load_dotenv

# .env ファイルから環境変数をロード
load_dotenv()

# ツールを定義
# SerperDevToolはGoogle検索APIを利用するためのツール
search_tool = SerperDevTool()

# エージェントを定義
# 役割、目標、背景を明確に設定し、ツールや詳細ログ、タスク委譲の可否を指定
researcher = Agent(
    role='AI Technology Researcher',
    goal='Gather comprehensive and up-to-date information on the latest advancements in AI and data science.',
    backstory='You are an expert researcher with a keen eye for cutting-edge technologies. Your mission is to find and analyze the most relevant information from the web.',
    tools=[search_tool],
    verbose=True, # 詳細なログを出力
    allow_delegation=False # 他のエージェントへのタスク委譲を許可しない
)

writer = Agent(
    role='Technical Blog Post Writer',
    goal='Write a concise, informative, and engaging blog post based on the research findings.',
    backstory='You are a skilled technical writer who can synthesize complex information into clear, accessible, and engaging content for a professional audience.',
    verbose=True,
    allow_delegation=False
)

# タスクを定義
# 各タスクは特定のエージェントに割り当てられ、明確な説明と期待される出力を持ちます
research_task = Task(
    description='Search the web for the latest advancements and trends in artificial intelligence and data science, focusing on practical applications and emerging frameworks.',
    expected_output='A detailed report (bullet points or structured text) summarizing recent AI and data science advancements, including key technologies, use cases, and future outlook.',
    agent=researcher
)

write_task = Task(
    description='Based on the research findings, write a 500-word blog post suitable for a technical audience. The post should highlight the most impactful advancements and provide actionable insights. Ensure the tone is professional and engaging.',
    expected_output='A well-structured and informative 500-word blog post summarizing AI and data science advancements, ready for publication.',
    agent=writer
)

# クルーを構築
# エージェントとタスクをまとめ、タスクの実行プロセスを定義
# Process.sequential はタスクを定義順に順次実行することを意味します
crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, write_task],
    process=Process.sequential,
    verbose=2 # クルー全体の詳細なログ出力レベル
)

# クルーを実行
# kickoffメソッドでタスク実行を開始します。
# inputs辞書は、タスクのdescription内で変数を使用する場合に役立ちますが、
# この例ではdescriptionに直接記述しているため、空でも動作します。
result = crew.kickoff(inputs={'topic': 'AI and Data Science advancements'})
print("\n### Crew execution complete! Final Blog Post:\n")
print(result)

このコードを実行すると、researcher エージェントがウェブ検索を行い、その結果を writer エージェントが受け取ってブログ記事を生成します。verbose=True を設定しているため、エージェント間の思考プロセスやツールの呼び出しが詳細にログとして出力され、デバッグや動作確認に役立ちます。

AutoGenで実現する会話駆動型マルチエージェント

このセクションでは、AutoGenの基本的なエージェント、GroupChatによる会話のオーケストレーション、そしてコード生成・実行機能に焦点を当てて解説します。

AutoGenの主要コンポーネントと特徴

AutoGen(バージョン0.7.5時点)は、Microsoftが開発したPython製のフレームワークで、LLM、ツール、または人間によって駆動される「会話可能な」エージェントを提供します。

  • AssistantAgent: コード生成や問題解決を行うアシスタントエージェント。
  • UserProxyAgent: ユーザーの代理としてタスクを開始し、必要に応じてコード実行を管理するエージェント。人間参加型 (Human-in-the-Loop) もサポートします。
  • GroupChat: 複数のエージェント間で自律的な会話を管理し、問題解決まで協調動作を継続させます。
  • Code Execution: 生成されたコードを安全なDockerコンテナ内で実行する機能。

AutoGenの特徴は、エージェント間の柔軟な会話を通じて、事前に厳密に定義されたワークフローだけでなく、動的な問題解決プロセスを実現できる点にあります。

環境準備とAutoGenのインストール

AutoGenを使用するための環境準備とインストール方法を説明します。

CrewAIと同様に、Pythonの仮想環境を準備し、AutoGenをインストールします。

python -m venv autogen_env
source autogen_env/bin/activate # macOS/Linux
# autogen_env\Scripts\activate.bat # Windows
pip install pyautogen docker

AutoGenは、コード実行にDockerを推奨しているため、Docker Desktopをインストールし、実行しておく必要があります。

LLMの設定は、OAI_CONFIG_LIST というJSONファイル、または環境変数 (AUTOGEN_OPENAI_API_KEY) で行います。OAI_CONFIG_LIST ファイルは以下のようになります。

[
    {
        "model": "gpt-4",
        "api_key": "YOUR_OPENAI_API_KEY"
    },
    {
        "model": "gpt-3.5-turbo",
        "api_key": "YOUR_OPENAI_API_KEY"
    }
]

このファイルをプロジェクトルートに配置するか、config_list_from_json の第一引数にパスを指定します。

実装例: コード生成と実行によるデータ分析

ここでは、ユーザーの指示に基づいてPythonコードを生成し、そのコードを実行してデータ分析を行うAutoGenの例を示します。

import autogen
import os
from dotenv import load_dotenv

# .env ファイルから環境変数をロード (OAI_CONFIG_LISTを使用しない場合)
# load_dotenv()

# LLM設定
# OAI_CONFIG_LISTファイルから設定をロードします。
# 環境変数AUTOGEN_OPENAI_API_KEYが設定されている場合、OAI_CONFIG_LISTは不要です。
config_list = autogen.config_list_from_json(
    "OAI_CONFIG_LIST", # OAI_CONFIG_LIST ファイルのパス
    filter_dict={
        "model": ["gpt-4", "gpt-3.5-turbo"], # 使用したいモデルを指定
    },
)

# UserProxyAgent: ユーザーの代理としてタスクを開始し、コード実行を管理
user_proxy = autogen.UserProxyAgent(
    name="User_Proxy",
    human_input_mode="NEVER", # 人間の介入なし (NEVER, ALWAYS, TERMINATE)
    max_consecutive_auto_reply=10, # 自動返信の最大回数
    is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"), # 会話終了条件
    code_execution_config={"work_dir": "coding", "use_docker": True, "docker_image": "python:3"}, # コード実行設定: Dockerを使用し、Python3イメージを指定
    llm_config={"config_list": config_list}
)

# AssistantAgent: コード生成や問題解決を行うアシスタント
assistant = autogen.AssistantAgent(
    name="Assistant",
    llm_config={"config_list": config_list},
    system_message="You are a helpful AI assistant. You can write and execute Python code to solve problems. When you have found the answer or completed the task, respond with 'TERMINATE'."
)

# チャットを開始
# User_ProxyがAssistantにメッセージを送り、Assistantがコード生成・実行を通じてタスクを解決します。
user_proxy.initiate_chat(
    assistant,
    message="Compare the year-to-date gain for META and TESLA stocks. Write and execute Python code to get the data, calculate the gains, and print the results. Ensure to use a reliable library for stock data like yfinance. If yfinance is not installed, install it first. Show the full Python code you used."
)

このコードを実行すると、Assistant エージェントが株価データを取得・分析するPythonコードを生成し、User_Proxy がそのコードをDockerコンテナ内で実行します。結果はチャット形式で出力され、最終的に TERMINATE で会話が終了します。coding ディレクトリが作成され、その中でコードが実行されるため、生成されたスクリプトや出力ファイルを確認することも可能です。

マルチエージェントオーケストレーションにおける課題と解決策

このセクションでは、マルチエージェントシステムを構築する際によく遭遇するエラーやハマりどころ、そしてそれらを回避するための具体的な対策を解説します。

よくあるエラーとその回避策

マルチエージェントシステムは、単一エージェントよりも複雑なため、様々な問題に直面することがあります。

  1. CrewAI: ModuleNotFoundError や uv コマンド関連のエラー

    • 原因: Pythonのパス設定、仮想環境のアクティブ化不足、依存関係のインストール不備、crewai create で生成されるプロジェクト構造の問題、uv コマンドの未インストールなど。
    • 回避策:
      • 仮想環境が正しくアクティブ化されているか which python や which pip で確認。
      • pip install crewai crewai-tools uv を実行し、必要なライブラリと uv コマンドがインストールされていることを確認。
      • CrewAIの公式ドキュメントやGitHubのIssueを確認し、最新の推奨インストール方法や実行方法をチェックする。特に crewai create で生成されたプロジェクトは、実行パスに注意が必要です。
      • 単一のPythonファイルでシンプルなクルーを構築し、動作確認を行うことで、プロジェクト構造の問題を切り分ける。
  2. AutoGen: TypeError: Assistants.create() got an unexpected keyword argument 'file_ids'

    • 原因: AutoGenライブラリのバージョンが古く、最新のOpenAIライブラリ(バージョン1.21以降)のAPI変更に対応していないため。
    • 回避策: AutoGenを最新バージョンにアップグレードする。pip install --upgrade pyautogen または pip install autogen~=0.2.27 で特定のバージョン以降に更新します。
  3. AutoGen/CrewAI共通: Error occurred while processing message: Connection error. などAPI関連のエラー

    • 原因: OpenAIなどのLLMプロバイダーのAPIキーが間違っている、支払い情報が不足している、クレジット残高がない、ネットワーク接続の問題、レートリミット超過など。
    • 回避策:
      • APIキーが正しいか、環境変数に正しく設定されているかを確認する。
      • LLMプロバイダーのダッシュボードで、支払い方法、クレジット残高、APIキーの有効性を確認する。
      • 安定したネットワーク接続を確認する。
      • 短期間に大量のリクエストを送っていないか確認し、必要であればレートリミットを考慮した実装にする。
  4. AutoGen: Dockerが実行されていないことによるコード実行エラー

    • 原因: AutoGenはデフォルトでDockerコンテナ内でのコード実行を試みるため、Docker Desktopが起動していないとエラーになります。
    • 回避策:
      • Docker Desktopをインストールし、常に実行されていることを確認する。
      • セキュリティ上のリスクを理解した上で、UserProxyAgent の code_execution_config で use_docker=False を設定し、ローカル環境での実行を許可する。
      • docker_image: "python:3" のように明示的にDockerイメージを指定してみる。
  5. CrewAI: 階層型プロセスにおけるマネージャーエージェントの機能不全

    • 原因: 階層型プロセス (Process.hierarchical) を使用した際に、マネージャーエージェントが期待通りにタスクを調整せず、タスクが順次実行されたり、誤ったエージェントが呼び出されたりするケースが報告されています。これはマネージャーLLMへのプロンプトが不十分であることや、フレームワーク自体の改善途上にあることが原因として考えられます。
    • 回避策:
      • マネージャーエージェントの goal や backstory、system_message を非常に具体的かつ明確に定義し、タスクの委譲、進捗確認、結果統合の方法を詳細に指示する。
      • 初期段階では Process.sequential を使用し、動作が安定してから階層型プロセスに移行を検討する。
      • CrewAIのGitHubリポジトリのIssueや最新のドキュメントを確認し、この問題に対するコミュニティの議論や公式の推奨策を把握する。バージョンアップで改善されている可能性もあります。

設計上のトレードオフとベストプラクティス

マルチエージェントシステムを効果的に活用するためには、設計上のトレードオフを理解し、ベストプラクティスを適用することが不可欠です。

トレードオフ

  • 単一エージェント vs マルチエージェント:

    • 単一エージェント: シンプルなタスク、コンテキストウィンドウに収まる範囲、高速かつ低コスト。
    • マルチエージェント: 複雑なタスクの並列化、異なる専門性を持つツールの活用、実行レイテンシの削減。一方で、調整の複雑さ、ハンドオフの増加、共有状態の管理、デバッグの難易度が増します。タスクによっては、逐次的な推論でパフォーマンスが低下する可能性もあります。
  • オーケストレーションの複雑さ(シンプルさ vs 柔軟性):

    • CrewAI: 役割ベースで構造化されたクルーにより、開発速度と明確なワークフロー構築を最適化。
    • AutoGen: 会話駆動型で柔軟なエージェント間相互作用により、動的な問題解決プロセスを最適化。
    • 複雑なオーケストレーションは、追加のレイテンシ、デバッグの複雑さ、インフラコストを伴います。

ベストプラクティス

  1. 明確な役割と目標設定:

    • 各エージェントに具体的な role (役割)、goal (目標)、backstory (背景) を与えることで、エージェントの行動を予測しやすくし、意図しない動作を減らします。
  2. タスクの適切な分解:

    • 複雑なワークフローを、個々の専門エージェントが効率的に処理できる、管理可能な小さなタスクに分解します。タスク間の依存関係も明確に定義します。
  3. 適切なオーケストレーションパターンの選択:

    • オーケストレーター・ワーカー: 1つのエージェントがタスクを分解し、専門ワーカーに委任、結果を統合する。明確なタスク分解が可能な場合に適しています。
    • シーケンシャルパイプライン: エージェントが線形にタスクを処理し、前のエージェントの出力を次のエージェントが利用する。単純な逐次処理に適しています。
    • 動的ハンドオフ: エージェントが自身の能力や現在の状況に基づいて、タスクを処理するか、他のエージェントに委譲するかを決定する。専門性が事前に不明なタスクに適しています。
    • マルチエージェントディベート: 複数のエージェントが議論を通じて問題解決や意思決定を行う。ハルシネーションの抑制や、多角的な視点からの検討に有効です。
  4. 堅牢なツール設計:

    • エージェントが利用する外部ツールは、狭い機能範囲、明示的な入力スキーマ、明確な説明、そして可能な限り決定論的で構造化された出力を持つように設計します。これにより、ツールの誤用や予期せぬ挙動を防ぎます。
  5. 人間参加型 (Human-in-the-Loop) の組み込み:

    • 特に重要度の高い意思決定や、AIエージェントの判断に確信が持てない場面では、人間のフィードバックや承認をワークフローに組み込みます。AutoGenの human_input_mode などがその一例です。
  6. オブザーバビリティとデバッグの強化:

    • エージェントの思考プロセス、ツールの呼び出し、タスクの進捗、LLMのトークン使用量などを監視・ログ出力できる仕組みを導入します。W&B Weaveのようなツールは、これらの情報を可視化し、システム全体のパフォーマンス最適化やボトルネック特定に役立ちます。
  7. コンテキスト管理の最適化:

    • エージェント間で必要となる情報が適切に共有され、かつ不要な情報でコンテキストウィンドウが肥大化しないよう、賢くコンテキストを管理します。CrewAIのメモリシステムや、AutoGenの会話履歴の管理などがこれに該当します。
  8. LLMの適切な選択:

    • タスクの要件(精度、速度、コスト)に基づいて、最適なLLMプロバイダーとモデル(GPT-4、GPT-3.5 Turbo、Anthropic Claude、ローカルLLMなど)を選択します。

これらのベストプラクティスを適用することで、より堅牢で効率的、かつ信頼性の高いマルチエージェントシステムを構築できるでしょう。

まとめ

この記事では、複雑な開発タスクを自動化するためのマルチエージェントオーケストレーションについて、その概念から具体的なフレームワークであるCrewAIとAutoGenの実装例、そして開発における課題と解決策までを網羅的に解説しました。

  • CrewAIは、明確な役割と目標を持つエージェントを「クルー」として組織化し、構造化されたワークフローでタスクを順次または階層的に実行するのに適しています。
  • AutoGenは、エージェント間の柔軟な会話を通じて、コード生成・実行を含む動的な問題解決を可能にするフレームワークです。

これらのフレームワークは、単一エージェントでは困難だった複雑なタスクの自動化を強力に推進します。しかし、実装にはエージェント間の協調性、コンテキスト管理、デバッグの複雑さといった課題が伴います。本記事で紹介したエラー回避策や設計上のベストプラクティスを参考に、ご自身のプロジェクトに最適なマルチエージェントシステムを構築してみてください。

さらに深く学びたい場合は、各フレームワークの公式ドキュメントやGitHubリポジトリを参照し、最新の機能やコミュニティの動向を追うことをお勧めします。

0
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
0
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?