MetaGPT: マルチLLMエージェントフレームワークを使ってみる

近年、AI技術は目覚ましい進化を遂げており、特に大規模言語モデル(LLM)の発展がソフトウェア開発の分野に革新をもたらしています。その中でも、MetaGPTは、マルチエージェントシステムを活用してソフトウェア開発の自動化を推進する画期的なフレームワークとして注目を集めています。

MetaGPTは、実際の開発チームのように、各エージェントが役割を分担して連携しながらタスクを遂行することができます。これにより、開発効率が大幅に向上し、質の高い成果物を短時間で生成することが可能となります。

今回は、MetaGPTの基本機能から実際の活用事例、さらに導入方法について解説していきます。

はじめに

MetaGPTとは?

MetaGPTは、大規模言語モデル(LLM)を活用したマルチエージェントフレームワークで、AIエージェントによるソフトウェア開発の自動化を実現します。従来の単一AIモデルによる開発手法とは異なり、MetaGPTはチーム開発を模した独自のマルチエージェントシステムを採用しています。各エージェントはプロダクトマネージャー、エンジニア、テスト担当者といった特定の役割を担当し、要件定義から設計、コーディング、テストに至るまでの各開発工程を連携して進めていきます。

なぜMetaGPTが注目されているのか?

MetaGPTが注目を集めている主な理由は、革新的なアプローチによる開発効率の向上と、質の高い成果物を生成できる能力にあります。従来のソフトウェア開発では多くの時間と労力を要していましたが、MetaGPTを活用することで開発プロセスを大幅に自動化し、開発期間の短縮とコスト削減を実現できます。

さらに、MetaGPTはAIによるソフトウェア開発の新たな可能性を切り拓くものとして期待されています。AI技術の進化に伴い、より複雑で高度な開発タスクの自動化が可能となり、開発者はより創造的で付加価値の高い業務に注力できるようになります。

MetaGPTの基本機能

マルチエージェントシステム

MetaGPTの最大の特徴は、マルチエージェントシステムを採用している点にあります。これは、複数のAIエージェントがそれぞれの役割を担当し、連携しながらソフトウェア開発を進めていく仕組みです。

  • 各エージェントの役割と連携:
    • MetaGPTでは、プロダクトマネージャー、アーキテクト、エンジニア、テスト担当者など、実際のソフトウェア開発チームにおける役割を模倣したエージェントが存在します。
    • これらのエージェントは、それぞれの専門知識とスキルに基づいてタスクを実行し、互いに情報を共有し、連携しながら開発を進めます。
  • 標準作業手順(SOP)による効率化:
    • MetaGPTは、標準作業手順(SOP)と呼ばれる事前に定義されたワークフローに従って各エージェントの行動を調整します。
    • SOPにより、各エージェントは自身の役割とタスクを明確に理解し、効率的に作業を進めることができます。これにより、開発プロセス全体がスムーズに進行し、品質の安定化が図られます。
図1. MetaGPT の概要https://arxiv.org/pdf/2308.00352 より引用)

主要な機能

MetaGPTは、ソフトウェア開発のライフサイクル全体を網羅する多彩な機能を備えています。

  • ユーザーストーリー、要件定義、設計、コード生成、テスト、ドキュメント生成:
    • MetaGPTは、ユーザーストーリーの作成から要件定義、設計、コーディング、テスト、ドキュメント生成まで、ソフトウェア開発の全工程をサポートします。
    • 各エージェントは、それぞれの専門分野において必要なタスクを実行し、成果物を生成します。
  • Data Interpreterによるデータ分析:
    • MetaGPTは、Data Interpreterと呼ばれる機能を備えており、これによりデータ分析やデータに基づいた意思決定の自動化が可能です。
  • 他のエージェントフレームワークとの比較:
    • MetaGPTは、AutoGPTやBabyAGIなどの他のエージェントフレームワークと比べ、より高度な協調性と計画性を備えているのが特徴です。
    • AutoGPTやBabyAGIは単一の目標に向かって自律的にタスクを実行することに重点を置いていますが、MetaGPTはチームでの協調作業を重視し、より複雑なソフトウェア開発タスクに対応できます。
    • MetaGPTの優位性は、SOPによる明確な役割分担と連携、そしてソフトウェア開発に特化した機能群にあります。これにより、より効率的で質の高い開発が実現可能です。
図2. Data Interpreter のワークフローhttps://arxiv.org/pdf/2402.18679 より引用)

MetaGPTの活用事例

MetaGPTは、高い柔軟性と自動化機能を活かし、様々な開発プロジェクトで活用されています。ここでは、具体的な活用事例とその成果を紹介します。

実際の開発プロジェクトでの利用例

  • Webアプリケーション開発:
    • MetaGPTは、フロントエンドからバックエンドまでのWebアプリケーション開発を自動化できます。例えば、ECサイトやブログプラットフォームなどの開発において、要件定義からコーディング、テスト、デプロイまでを自動化し、開発期間を大幅に短縮できます。
  • モバイルアプリ開発:
    • iOSやAndroid向けのモバイルアプリ開発にもMetaGPTは活用できます。UI/UXデザイン、機能実装、テスト、ストアへのデプロイなど、一連の開発プロセスを自動化し、効率的なアプリ開発を実現します。
  • API開発:
    • RESTful APIやGraphQL APIの開発にもMetaGPTは適しています。APIの設計、エンドポイントの実装、ドキュメント生成などを自動化し、迅速なAPI開発を可能にします。
  • 特定の業界や技術領域での活用事例:
    • 金融、医療、教育など、特定の業界に特化したアプリケーション開発にもMetaGPTは活用されています。また、機械学習モデルのデプロイやデータ分析パイプラインの構築など、特定の技術領域における開発も自動化できます。
図3. MetaGPTによるソフトウェア開発の例https://arxiv.org/pdf/2308.00352 より引用)

具体的な成果

  • 開発期間の短縮、コスト削減:
    • MetaGPTの活用により、開発期間を従来の数分の1に短縮し、開発コストを大幅に削減できます。数カ月を要していたプロジェクトを数週間で完了できるようになります。
  • コード品質の向上、バグの減少:
    • MetaGPTは、高品質なコードを自動生成し、テストも自動化することで、コード品質を向上させ、バグの発生を抑制します。
  • 開発フローの紹介:
    • MetaGPTを使用した開発の流れは以下の通りです。
        1. ユーザーストーリーの作成:プロダクトマネージャーエージェントが、ユーザーの要求を元にユーザーストーリーを作成します。
        1. 要件定義:アーキテクトエージェントが、ユーザーストーリーを元に必要な要件を定義します。
        1. 設計:アーキテクトエージェントが、システムの設計図を作成します。
        1. コード生成:エンジニアエージェントが、設計図を元にコードを自動生成します。
        1. テスト:テスト担当者エージェントが、生成されたコードのテストを自動実行します。
        1. ドキュメント生成:ドキュメント担当者エージェントが、開発プロセス全体のドキュメントを生成します。
    • 各エージェントは、それぞれの専門分野において必要なタスクを実行し、成果物を生成します。

MetaGPTの導入と使い方

MetaGPTのインストールは、pipパッケージマネージャー経由で行います。まずは、Python3.9以上の環境を作成し、以下のコマンドを実行してください。

# MetaGPT のインストール
$ pip install --upgrade metagpt

# MetaGPT の初期設定
$ metagpt --init-config

設定ファイル config2.yaml が作成されるので、利用するLLMの情報を編集していきます。初期状態では、次のような内容になっています。LLMのプロバイダーやモデル、APIキーなどを設定してください。LLMプロバイダーごとの設定方法については、「LLM API Configuration」に設定例が記載されていますので、ご確認ください。

# Full Example: https://github.com/geekan/MetaGPT/blob/main/config/config2.example.yaml
# Reflected Code: https://github.com/geekan/MetaGPT/blob/main/metagpt/config2.py
llm:
  api_type: "openai"  # or azure / ollama / open_llm etc. Check LLMType for more options
  model: "gpt-4-turbo-preview"  # or gpt-3.5-turbo-1106 / gpt-4-1106-preview
  base_url: "https://api.openai.com/v1"  # or forward url / other llm url
  api_key: "YOUR_API_KEY"

今回は、Ollamaを使用してローカルに準備したqwen2.5-coderを利用したいと思います。具体的な設定は、次のようになります。

# Full Example: https://github.com/geekan/MetaGPT/blob/main/config/config2.example.yaml
# Reflected Code: https://github.com/geekan/MetaGPT/blob/main/metagpt/config2.py
llm:
  api_type: "ollama"  # or azure / ollama / open_llm etc. Check LLMType for more options
  model: "qwen2.5-coder"  # or gpt-3.5-turbo-1106 / gpt-4-1106-preview
  base_url: "http://localhost:11434/api"  # or forward url / other llm url

まずは、コマンドラインから次のように入力してみます。実行すると、workspace という名前でディレクトリが作成され、その下にプログラムが作成されていきます。

$ metagpt "C#の遺伝的アルゴリズムのライブラリを作成して"

今回は、次のようなディレクトリとファイルが作成されました。

├─genetic_algorithm_library
    │  .dependencies.json
    │  .gitignore
    │  requirements.txt
    │  
    ├─.git
    │  │  config
    ... (省略)
    │  │  └─pack
    │  └─refs
    │      ├─heads
    │      │      master
    │      │      
    │      └─tags
    ├─docs
    │  │  requirement.txt
    │  │  
    │  ├─class_view
    │  ├─code_plan_and_change
    │  ├─code_summary
    │  ├─graph_repo
    │  ├─prd
    │  │      20250224221439.json
    │  │      
    │  ├─system_design
    │  │      20250224221439.json
    │  │      
    │  └─task
    │          20250224221439.json
    │          
    ├─genetic_algorithm_library
    │  └─genetic_algorithm_library
    │          Chromosome.cs
    │          FitnessFunction.cs
    │          Gene.cs
    │          GeneticAlgorithm.cs
    │          ParallelExecution.cs
    │          Population.cs
    │          SavingLoading.cs
    │          Visualization.cs
    │          
    ├─resources
    │  ├─api_spec_and_task
    │  ├─code_plan_and_change
    │  ├─code_summary
    │  ├─competitive_analysis
    │  │      20250224221439.mmd
    │  │      
    │  ├─data_api_design
    │  │      20250224221439.mmd
    │  │      
    │  ├─graph_db
    │  ├─prd
    │  │      20250224221439.md
    │  │      
    │  ├─sd_output
    │  ├─seq_flow
    │  │      20250224221439.mmd
    │  │      
    │  └─system_design
    │          20250224221439.md
    │          
    ├─tests
    └─test_outputs

今回作成されたプログラムの一部を参考までに掲載すると、次のようになりました。(実際に動かして確認までしていませんが、おおかた遺伝的アルゴリズムとして正しそうな実装になっています。)

using System;
using System.Collections.Generic;
using System.Linq;

public class Gene
{
    public double Value { get; set; }

    public Gene(double value)
    {
        Value = value;
    }
}

public class Chromosome
{
    public List<Gene> Genes { get; set; }
    public double Fitness { get; set; }

    public Chromosome(int length)
    {
        Genes = new List<Gene>();
        for (int i = 0; i < length; i++)
        {
            Genes.Add(new Gene(Random.NextDouble()));
        }
    }
}

public class Population
{
    public List<Chromosome> Individuals { get; set; }

    public Population(List<Chromosome> individuals)
    {
        Individuals = individuals;
    }
}

public class GeneticAlgorithm
{
    private Population population;
    private Func<Chromosome, double> fitnessFunction;
    private int generations;
    private double mutationRate;

    public GeneticAlgorithm(int populationSize, int chromosomeLength, int generations, double mutationRate, Func<Chromosome, double> fitnessFunction)
    {
        this.population = new Population(GenerateInitialPopulation(populationSize, chromosomeLength));
        this.fitnessFunction = fitnessFunction;
        this.generations = generations;
        this.mutationRate = mutationRate;
    }

    private List<Chromosome> GenerateInitialPopulation(int size, int length)
    {
        var population = new List<Chromosome>();
        for (int i = 0; i < size; i++)
        {
            population.Add(new Chromosome(length));
        }
        return population;
    }

    public void Run()
    {
        for (int generation = 0; generation < generations; generation++)
        {
            var newPopulation = new List<Chromosome>();

            // Selection
            var selectedIndividuals = Select(population.Individuals);

            // Crossover and Mutation
            while (newPopulation.Count < population.Individuals.Count)
            {
                var parent1 = selectedIndividuals[0];
                var parent2 = selectedIndividuals[1];

                var child1 = CrossOver(parent1, parent2);
                Mutate(child1);

                newPopulation.Add(child1);

                if (newPopulation.Count < population.Individuals.Count)
                {
                    var child2 = CrossOver(parent2, parent1);
                    Mutate(child2);

                    newPopulation.Add(child2);
                }

                selectedIndividuals.RemoveAt(0);
                selectedIndividuals.RemoveAt(0);
            }

            // Evaluate fitness
            foreach (var chromosome in newPopulation)
            {
                chromosome.Fitness = fitnessFunction(chromosome);
            }

            population = new Population(newPopulation);
        }
    }

    private List<Chromosome> Select(List<Chromosome> individuals)
    {
        var selectedIndividuals = new List<Chromosome>();
        double totalFitness = individuals.Sum(ind => ind.Fitness);
        for (int i = 0; i < individuals.Count; i++)
        {
            double randomValue = Random.NextDouble() * totalFitness;
            double cumulativeProbability = 0;
            foreach (var individual in individuals)
            {
                cumulativeProbability += individual.Fitness / totalFitness;
                if (randomValue <= cumulativeProbability)
                {
                    selectedIndividuals.Add(individual);
                    break;
                }
            }
        }
        return selectedIndividuals;
    }

    private Chromosome CrossOver(Chromosome parent1, Chromosome parent2)
    {
        var child = new Chromosome(parent1.Genes.Count);
        for (int i = 0; i < child.Genes.Count; i++)
        {
            if (Random.NextDouble() < 0.5)
            {
                child.Genes[i] = parent1.Genes[i];
            }
            else
            {
                child.Genes[i] = parent2.Genes[i];
            }
        }
        return child;
    }

    private void Mutate(Chromosome chromosome)
    {
        foreach (var gene in chromosome.Genes)
        {
            if (Random.NextDouble() < mutationRate)
            {
                gene.Value = Random.NextDouble();
            }
        }
    }
}

MetaGPTはコマンドライン実行だけではなく、次のようにライブラリとしても利用できます。

from metagpt.software_company import generate_repo, ProjectRepo

repo: ProjectRepo = generate_repo("C#の遺伝的アルゴリズムのライブラリを作成して")  # or ProjectRepo("<path>")

print(repo)  # it will print the repo structure with files

以上、MetaGPTの導入方法と簡単な使い方の例でした。MetaGPTには豊富な機能があるので、公式ドキュメントを参照して、どのような利用方法があるのか確認してみてください。また、GitHubにも豊富なサンプルコードがあるので、プロダクトの作成の際の参考になると思います。

まとめと今後の展望

MetaGPTは、ソフトウェア開発の自動化を強力に推進する画期的なフレームワークです。開発期間の短縮、コスト削減、コード品質の向上など、多くのメリットがあります。一方で、LLMの制約やセキュリティに関する課題も存在しており、これらを克服してMetaGPTをより効果的に活用するには、継続的な改善と進化が求められます。

AI技術の発展に伴い、MetaGPTをはじめとするAIエージェントによるソフトウェア開発は、今後さらなる進化を遂げると予想されます。より高度な自動化の実現や複雑なタスクへの対応、多様な開発ニーズへの適応などが期待されています。また、MetaGPTはオープンソースコミュニティの貢献により、新機能の追加や改善が進むことで、さらなる発展が見込まれます。

MetaGPTは、ソフトウェア開発の新たな可能性を切り拓く強力なツールです。ぜひMetaGPTを活用し、より効率的で創造的な開発にチャレンジしてください。そして、AI技術の進化を常に意識しながら、継続的な学習と最新情報の収集を心がけていきましょう。

More Information