メインコンテンツへスキップ
見出し画像

OpenManus: 次世代AIエージェントフレームワークの全貌

    OpenManusは、MetaGPTコミュニティのメンバーによって開発されたオープンソースのAIエージェントフレームワークで、複雑なタスクを自律的に処理する能力を備えています。この記事では、OpenManusの特徴や技術的な詳細を掘り下げ、特にDeepResearchとの違い、活用されているLLMの機能、モジュールの構造、実際の動作例について解説します。https://openmanus.github.io/#features

    開発者のXコメントによるとManusを見た2時間後にコア機能をオープン化したそうです。
    https://x.com/didiforx/status/1897675038972883408

    1. OpenManusとDeepResearchの違い

    1.1 設計思想と目的

    • OpenManus:

      • 目的: 「汎用的なAIエージェント」を目指しています。プログラミング、情報検索、ファイル処理、ウェブ操作など、ユーザーが提示するあらゆるタスクを処理することを目的とし、モジュール化と拡張性を重視しています。

      • アプローチ: エージェントベースのアプローチを採用し、大規模言語モデル(LLM)を中心に据えつつ、外部ツールやワークフローを柔軟に統合します。特に、「計画→実行→評価」のサイクルを重視し、複雑なタスクをステップバイステップで処理する能力を強化しています。

    • DeepResearch:

      • 目的: 情報収集、データ分析、科学的調査などの特定領域に特化しています。たとえば、ウェブ検索や文献調査、データベースクエリを効率化し、研究者やアナリストを支援することを主目的とする場合が多いです。

      • アプローチ: タスクの汎用性よりも、特定領域(例:研究、データ分析)での高精度な処理や、信頼性の高い情報収集に重点が置かれます。

    1.2 OpenManusのアーキテクチャと機能

    • OpenManus:

      • モジュール化と拡張性: モジュール化されたアーキテクチャを採用し、`BaseAgent`, `ReActAgent`, `ToolCallAgent`, `PlanningAgent`などのエージェントクラスを階層的に設計しています。これにより、開発者は必要な機能だけをカスタマイズし、独自のエージェントやツールを追加できます。

      • ツール統合の柔軟性: 外部ツール(例:ウェブ検索、Pythonコード実行、ブラウザ操作)を簡単に統合できる仕組みを提供します。`BaseTool`クラスを継承することで、独自のツールを追加可能です。

      • ワークフロー管理: 複雑なタスクを処理するために、`PlanningFlow`などのワークフローモジュールを提供し、タスクを複数のステップに分解して実行する仕組みをサポートします。

    2. LLMのどのような機能を使っているか

    OpenManusは、大規模言語モデル(LLM)のさまざまな機能を活用してタスクを処理します。特に、Reasoning(推論)とFunction Calling(ツール呼び出し)は、エージェントの自律性を高める中核的な機能です。以下に、これらの機能を中心に、OpenManusがどのようにLLMを活用しているかを解説します。

    3.1 Reasoning(推論)

    • 概要: LLMに複数の選択肢や情報を与え、論理的な推論や意思決定を行わせる機能。OpenManusでは、タスクの計画やツールの選択、条件分岐などにこの機能が活用されます。

    • 利用場面:

      • タスクの優先順位付け: 複数のサブタスクがある場合、LLMに「どのタスクを最初に実行すべきか」と尋ねて優先順位を決定。たとえば、「日本の株式市場の予測を検討する」タスクでは、まず最新のニュースを収集し、次に過去のデータを分析する、という順序を決定します。

      • ツールの選択: タスクに最適なツールを決定。たとえば、「ウェブ検索が必要か、Pythonコードの実行が必要か」を判断。

    3.2 Function Calling(ツール呼び出し)

    • 概要: LLMに外部ツールや関数を呼び出す指示を与える機能。OpenManusでは、LLMがタスクを処理するために必要な外部リソース(例:ウェブ検索、コード実行)を特定し、呼び出しを行います。

    • 利用場面:

      • ウェブ検索: 最新情報を取得するために、`GoogleSearch`ツールを呼び出し。たとえば、「最新の東京の天気予報を教えて」と入力すると、LLMが検索クエリを生成し、ツールを呼び出します。

      • コード実行: 計算やデータ処理のために、`PythonExecute`ツールを呼び出し。たとえば、「1から100までの合計を計算」と入力すると、LLMがPythonコードを生成し、実行を指示。

      • ブラウザ操作: ウェブページの操作(例:フォーム入力、データスクレイピング)を行うために、`BrowserUseTool`を呼び出し。

    3.3 その他のLLM機能

    • テキスト生成(Text Generation): 対話、コード生成、タスク説明など、基本的なテキスト生成に使用されます。たとえば、ユーザーの質問に対する自然な応答や、計画の説明を生成します。

    • 命令追従(Instruction Following): タスクの分解やツールの選択など、具体的な指示に従った出力を生成します。たとえば、「タスクを5つのステップに分解してください」と指示すると、LLMが適切なステップを提案します。

    • コンテキスト管理(Context Management): 対話の継続やタスクの進捗管理のために、過去のメッセージやステップの結果をコンテキストとして保持します。

    • ファインチューニング(Fine-Tuning): 特定のタスクに特化させるために、SFT(Supervised Fine-Tuning)やGRPO(強化学習ベースのチューニング)をサポートします。

    3.4 まとめ

    OpenManusは、LLMのReasoningとFunction Callingを中核に据え、エージェントの自律性を高めています。Reasoningにより、タスクの計画や意思決定を論理的に処理し、Function Callingにより、必要な外部ツールを適切に活用します。これらの機能を組み合わせることで、複雑なタスクを効率的に処理する能力を実現しています。

    4. OpenManusはどのようなモジュールがあるか、それぞれの役割

    OpenManusは、モジュール化されたアーキテクチャを採用しており、以下のような主要なモジュールで構成されています。それぞれの役割を詳しく解説します。
    コードを実行するのはmain.pyとrun_flow.pyの二つがあります。mainの方はLLMが要求に対してタスクを設定しそれを繰り返すことで結果を出します。
    run_flowは初めにLLMがタスクのプランニングをして、タスク実行を管理しながらタスクを進めていきます。
    今回はmainの方を説明します。

    4.1 `main.py`

    • 役割: エントリーポイント。ユーザーのプロンプトを受け取り、エージェントを初期化して実行します。

    4.2 `agent/` モジュール

    • `base_agent.py` (`BaseAgent`):

      • 役割: 基本的な状態管理(コンテキスト、設定)を提供します。すべてのエージェントクラスの基底クラスであり、LLMクライアントやツールの設定を保持します。

    • `react_agent.py` (`ReActAgent(BaseAgeent)`):

      • 役割: ReAct(Reasoning and Acting)のフレームワークに基づき、「思考(Think)→行動(Act)」のサイクルを実装します。推論能力を活用して、タスクの計画やツールの選択を行います。

    • `tool_call_agent.py` (`ToolCallAgent(ReActagent)`):

      • 役割: ツール呼び出し(Function Calling)を担当します。LLMが生成したツール呼び出しの指示を解釈し、適切なツールを実行します。

    • `manus.py` (`Manus(ToolAgent)`):

      • 役割: さまざまなタスクを解決するために計画を使用する汎用的なエージェントです。
        このエージェントは、計画エージェントを拡張し、Pythonの実行、ウェブブラウジング、ファイル操作、情報取得などの包括的なツールと機能を備えており、幅広いユーザーリクエストに対応します。

    4.3 `tool/` モジュール

    • `python_execute.py` (`PythonExecute`):

      • 役割: Pythonコードを実行し、結果を返します。たとえば、データ分析や計算タスクに使用されます。

    • `google_search.py` (`GoogleSearch`):

      • 役割: Google検索を実行し、ウェブ上の情報を見つけたり、最新のデータを取得したり、特定のトピックを調査したりする必要があるときに使用します。
        検索クエリに一致するURLのリストを返します。

    • `browser_use.py` (`BrowserUseTool`):

      • 役割:ウェブブラウザを操作して、ナビゲーションや要素の操作、コンテンツの取得、タブ管理などのさまざまなアクションを実行するための機能を提供します。

    • `file_saver.py` (`FileSaver`):

      • 役割:指定されたパスにテキストやコードなどのコンテンツをローカルファイルとして保存する機能を提供します。

    • `terminate.py` (`Terminate`):

      • 役割:リクエストが満たされたとき、またはアシスタントがタスクを進められない場合に、インタラクションを終了します。

    4.4 プロンプト

    SystemとNext_step_promptがあります。Next_step_promptにより次のステップの最も適切な選択をします。複雑なタスクの場合、問題を分解し、異なるツールを段階的に使用して解決し、各ツールを使用した後は、実行結果を明確に説明し、次のステップを提案するように指示。以下はPromptの全文です。


    """SYSTEM_PROMPT = "あなたは OpenManus という、ユーザーが提示する任意のタスクを解決するための全能な AI アシスタントです。複雑なリクエストを効率的に完了するために呼び出すことができるさまざまなツールを持っています。プログラミング、情報取得、ファイル処理、ウェブブラウジングなど、すべてを扱うことができます。",

    NEXT_STEP_PROMPT = "PythonExecute を使用してコンピュータと対話し、FileSaver を通じて重要なコンテンツや情報ファイルを保存し、BrowserUseTool でブラウザを開き、GoogleSearch を使用して情報を取得できます。
    
    PythonExecute: コンピュータシステムと対話するために Python コードを実行し、データ処理や自動化タスクを行います。
    
    FileSaver: txt、py、html などのファイルをローカルに保存します。
    
    BrowserUseTool: ウェブブラウザを開いて、ブラウジングや使用を行います。ローカルの HTML ファイルを開く場合は、ファイルの絶対パスを提供する必要があります。
    
    GoogleSearch: ウェブ情報の取得を行います。
    
    ユーザーのニーズに基づいて、最も適切なツールまたはツールの組み合わせを積極的に選択してください。複雑なタスクの場合、問題を分解し、異なるツールを段階的に使用して解決できます。各ツールを使用した後は、実行結果を明確に説明し、次のステップを提案してください。"

    5. 実際のプログラム動作

    OpenManusがユーザーの質問を処理する際の挙動を、具体例を通じて解説します。例として、ユーザーが「ことしの日本の株式市場の予測を検討してください」と質問した場合を考えます。
    簡単に言うとThinkとAct(ツール実行)を繰り返して、要求が満たされるまで繰り返します。

    5.2 質問の処理手順

    1. エントリーポイント (`main.py`):

      • `main.py`がユーザーのプロンプト(「ことしの日本の株式市場の予測を検討してください」)を受け取ります

    2. エージェントの設定('agent/manus.py')

      • ToolCollectionに PythonExecute(), GoogleSearch(), BrowserUseTool(), FileSaver(), Terminate()これらのツールをインプリメント

    3. エージェント実行スタートポイント('agent/base.py')

      • runメソッドを実行。中身はstep()を実行、スタックしていないか確認を30回繰り返す

    4. React(agetn/react.py)

      • step()メソッドはThinkを実行し、ActがあればActを実行する

    5. Think('agent/toolcall.py')

      • Thinkの実行。コンテキストとプロンプトをLLMに渡し、ツール選択・クエリなどのコマンドを返答を得る

    6. Act/Excute_tool('agent/toolcall.py')

      • Actの実行。Thinkから得たツールとコマンドをツールに渡し、実行結果を得る

    7. 繰り返し、スタック監視
      ‐ 3に戻り繰り返す ただし isStuck関数で同じメッセージを繰り返している場合スタックしていると判断し、新しい方針を検討するプロンプトを追加

    8. 終了

      • Thinkでユーザの要求が満たせた判断した場合、Terminateツールをセレクトし終了となる

    5.2 技術的なポイント

    • Reasoningの活用: タスクの計画作成(ステップ5)では、LLMの推論能力がフルに活用されます。ユーザーの質問を論理的に分解し、適切なステップとツールを提案するプロセスは、Reasoningの典型的な例です。

    • Function Callingの活用: 計画の実行(ステップ6)では、LLMが生成したツール呼び出しの指示を解釈し、適切なツール(例:`GoogleSearch`, `PythonExecute`)を実行するプロセスがFunction Callingの典型的な例です。

    • コンテキスト管理: 各ステップの結果はコンテキストとして蓄積され、以降のステップや最終出力の生成に活用されます。これにより、タスクの一貫性が保たれます。

    5.3 まとめ

    ユーザーの質問を処理する際、OpenManusはモジュール化された設計を活用し、LLMの推論能力とツール呼び出し機能を組み合わせることで、複雑なタスクを効率的に処理します。
    開発者として、特定のタスクに特化させるために、ツールの追加やプロンプトの最適化を検討することで、さらに性能を向上させることができます。

    まとめ

    OpenManusは、汎用性と拡張性を重視した次世代のAIエージェントフレームワークであり、DeepResearchのようなフレームワークとは異なる設計思想を持っています。
    LLMの推論能力やツール呼び出し機能を活用することで、複雑なタスクを自律的に処理する能力を実現しており、モジュール化された設計により、カスタマイズや拡張が可能です。
    しかし実際動かしてみたら、同じタスクを繰り返してスタックを起こす場合が多かったです。
    また「地球温暖化の今後を予測してください」と依頼したところ、結果は途中で止まって失敗しましたが、データの収集をしそのデータを元にPythonで予測しようとしているようでした。
    応用例として独自のデータ収集ツールとPythonコードの実行により、カスタマイズされた予測エンジンを作成できるフレームワークと感じました。
    次回はrun_flow(planning)の方も解説していきたいです。

    あなたへのおすすめ