🧪

Autogen StudioでAIプロダクト開発チームを作る

2024/12/20に公開

この記事はFindy Advent Calendar 2024 20日目の記事です。

https://adventar.org/calendars/10599

Autogen Studioを使って、AIプロダクト開発チームをつくってみました。
AI同士に会話させて課題解決させるということを、個人的に試してみたかったというのがモチベーションです。
題材として、普段の仕事で関わっているプロダクト開発メンバーの構成を模倣しました。
なお、私は普段バックエンド開発を主軸としているエンジニアで、LLMなどの専門家ではありません。

チーム構成

今回はPdM、デザイナー、データアナリスト、エンジニアの4つのエージェントから成るAIチームを構築しました。
エージェントはLLMによって与えられた役割を担い、メッセージをやり取りしながら協力します。
ai team image

依頼と結果

先に依頼と結果の例を記載します。

依頼内容

「フリーランスエンジニアの安心と挑戦をサポートし、キャリアの可能性を拡げる」を実現するためのプロダクトを企画し作成してください。 作成するプロダクト内容、技術選定、概要設計、データ設計、デザインおよびUI/UXのガイドラインを内容に含めてください。 Markdownのフォーマットで出力してください。

結果

# プロダクト名: Freelance Connect

## 1. プロダクト概要

Freelance Connectは、フリーランスエンジニアに向けたキャリア支援プラットフォームです。このプロダクトは、仕事の依頼、スキルの向上、ネットワーキング機会を提供し、利用者が自身のキャリアの可能性を広げることを目的としています。

## 2. 主要機能

* **プロジェクトマッチング**: フリーランスエンジニアと雇用主を繋ぐマッチング機能を提供します。スキルや経験に基づいて最適なプロジェクトを推奨します。

* **スキルアップコース**: 技術向上のためのオンラインコースを提供します。最新の技術トレンドに対応した学習コンテンツを用意します。

* **コミュニティフォーラム**: 知識共有やネットワーキングのためのフォーラムを設置します。エンジニア同士の交流や情報交換を促進します。

* **顧客レビューシステム**: 過去のクライアントからのレビューを表示します。信頼性の高い評価システムを通じて、質の高い仕事を促進します。

## 3. 技術選定

* **バックエンド**: Node.js + Express
* **フロントエンド**: React + Redux
* **データベース**: MongoDB
* **認証**: JSON Web Token (JWT)
* **ホスティング**: AWS (EC2、S3)

## 4. 概要設計

* ユーザー管理 (登録、ログイン、プロフィール管理)
* プロジェクト管理 (マッチング、プロジェクト一覧、応募)
* コース管理 (スキルアップコースの提供、受講管理)
* フォーラム管理 (投稿、コメント、いいね)
* レビュー管理 (レビュー投稿、表示)

## 5. データ設計

### ユーザー
* userId: String (ユニークID)
* name: String (名前)
* email: String (メールアドレス)
* password: String (ハッシュされたパスワード)
* role: String (フリーランスまたは雇用主)

### プロジェクト
* projectId: String (ユニークID)
* title: String (プロジェクトタイトル)
* description: String (プロジェクト詳細)
* skillsNeeded: [String] (必要スキル)
* postedBy: String (ユーザーID)

### コース
* courseId: String (ユニークID)
* title: String (コースタイトル)
* content: String (コース内容)
* createdBy: String (ユーザーID)

### フォーラムポスト
* postId: String (ユニークID)
* content: String (投稿内容)
* postedBy: String (ユーザーID)

### レビュー
* reviewId: String (ユニークID)
* revieweeId: String (ユーザーID)
* rating: Number (評価)
* comment: String (コメント)

## 6. デザインおよびUI/UXガイドライン

* **色彩**: スタイリッシュかつ落ち着いたトーンの色として、ブルー、グレーを使用
* **フォント**: モダンで読みやすいフォントとしてRobotoを選定
* **レイアウト**: シンプルで直感的なレイアウトを採用し、重要な情報をすぐに把握できるように設計
* **ナビゲーション**: 明確なナビゲーションバーを設け、各機能へのアクセスを容易に実現

## 7. 実装タスク

プロジェクトの実装は以下のエージェントが担当します:

1. **バックエンドエンジニア**: バックエンドAPIの構築
2. **フロントエンドエンジニア**: UIコンポーネントの実装とフロントエンドデザインの構築
3. **デザイナー**: UI/UXデザインの具体化とプロトタイプの作成

プロダクトの作成まで依頼してみましたが、実際には企画から大枠の設計までの内容が出力されました。これは終了条件をエージェント同士のやり取り回数で指定したため、途中段階の内容が最終出力となっています。

以降は今回AIチームを構築するために利用したAutogen Studioや、構築内容の説明をします。

Autogen Studio とは

Autogen Studioは、マルチエージェントシステムのプロトタイプ[1]を迅速に構築するためのローコードツールです。マルチエージェントシステムをつくるためのフレームワークであるAutogenの上に構築されています。
つまり、Webインターフェースの操作でマルチエージェントシステムの構築を試すことができます。簡単にマルチエージェントシステムの構築を試せそうだったので選びました。

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

複数のAIエージェントが自律的に連携し、タスクを効率的に進めたり、複雑な課題を解決する仕組みを指します。

環境構築

本記事で使用しているバージョンは autogenstudio 0.4.0.dev41[2] になります。
インストール方法は公式ドキュメントの通りです。
私はDevcontainerで環境を構築しました。手軽に試したい方はご利用ください。

https://github.com/2bo/my-autogen-project

構築したマルチエージェント

今回構築したマルチエージェントです。
小さくて見づらいので、同種の要素ごとに枠で囲っています。

autogen studio team

Agent

Agentは中核的なエンティティで、AIモデルやスキルを統合して、指定されたタスクを実行する要素です。
複数のTypeがありますが、今回はLLMでタスクを解決するためのAgentである Assistant Agentを使用。

次の画像はPdMの役割をもつAssistant Agentの設定になります。
pdm agent

System MessageにはAgentの振る舞いに関する指示を入力します。今回の場合だと、タスクが完了と判断したらTERMINATEと出力するように指示しています。
DescriptionにAgentが担う役割や能力を記載します。TeamがどのAgentを使用するか決定するために利用されます。

同様に、エンジニア、デザイナー、データアナリストのAssistant Agentも設定し、合計4つのAgentを追加しました。

Team

Teamはタスクを達成するために協力するAgentのグループです。
動作させるAgentの決定方式の違いで、2つのTypeがあります。

  • Selector: LLMによりAgentを決定
  • Round Robin: 順番にAgentを選択

今回はSelectorを使っています。

selector

Selector PromptにはAgentを決定するための指示を入力しています。
{roles}{history}{participants}は必ず入れる必要があります。
日本語訳されてrole名が一致しないと、うまく動かないかもしれないと考えたため英語にしています。

Model

ModelはAgentやSelector Teamを動かすために使うLLMです。
今回はgpt-4o-miniを使用しています。

Termination

Terminationはタスクの終了条件です。

いくつかのTypeがありますが、今回は2つの条件を指定しています。

  • メッセージ数の上限数を条件としたMAX Messages
  • 特定のテキストが出力された場合を条件としたText Mention

pdm agent

なお、これまでの内容はJSONでも設定することができます。参考として記載しておきます。

Autogen Studio JSON

api_keyは実際の値がはいるので置換してます。

{
  "version": "1.0.0",
  "component_type": "team",
  "name": "Product Team",
  "participants": [
    {
      "component_type": "agent",
      "name": "PDM_Agent",
      "agent_type": "AssistantAgent",
      "system_message": "あなたはPdMエージェントです。ユーザーからのタスク依頼を最初に受け取ります。自分自身ではエンジニアやデザインに関する選定をしないで、他のエージェントに依頼するようにしてください。必要に応じて、バックエンドエンジニア、フロントエンドエンジニア、デザイナーの各エージェントにタスクを依頼してください。最後にタスクを終了する責任を持っています。依頼の最終回答が得られて、かつ、アウトプットのクオリティがプロとして十分と判断した場合、最終的な結果を出力し、TERMINATEと出力してください",
      "model_client": {
        "model": "gpt-4o-mini",
        "model_type": "OpenAIChatCompletionClient",
        "api_key": "xxxxxxx"
      },
      "tools": [],
      "description": "プロダクトマネージャーです。プロダクトの成長・事業の成功・売上目標達成、プロダクトビジョンを実現するための立案をします"
    },
    {
      "name": "Engineer_Agent",
      "agent_type": "AssistantAgent",
      "system_message": "エンジニアのテックリードとして技術選定と設計と実装をしてください。UI/UXやデザインはデザイナーに相談し、仕様や企画はPdMに相談してください。データ構造や命名はデータアナリストと相談してください\n",
      "model_client": {
        "model": "gpt-4o-mini",
        "model_type": "OpenAIChatCompletionClient",
        "api_key": "xxxxxxx"
      },
      "tools": [],
      "description": "エンジニアです。Webシステムの技術選定、設計、実装をします\n"
    },
    {
      "name": "Designer_Agent",
      "agent_type": "AssistantAgent",
      "system_message": "シニアデザイナーとしてデザインおよび、UIやUXのガイドラインを策定してください。デザインの実装についてはエンジニアと相談してください。\n",
      "model_client": {
        "model": "gpt-4o-mini",
        "model_type": "OpenAIChatCompletionClient",
        "api_key": "xxxxxxx"
      },
      "description": "デザイナーです。デザインでユーザーに価値を届けるための戦略立案および実行をします",
      "tools": []
    },
    {
      "name": "Data_Analist_Agent",
      "agent_type": "AssistantAgent",
      "system_message": "データアナリストのエキスパートとして、データ戦略の立案、設計、分析、解析をしてください。データ設計や具体的な実装についてはエンジニアに相談してください。",
      "model_client": {
        "component_type": "model",
        "model": "gpt-4o-mini",
        "model_type": "OpenAIChatCompletionClient",
        "api_key": "xxxxxxx"
      },
      "description": "データアナリストです。データ戦略の立案、設計、分析、解析をします。",
      "tools": []
    }
  ],
  "team_type": "SelectorGroupChat",
  "termination_condition": {
    "component_type": "termination",
    "termination_type": "CombinationTermination",
    "operator": "or",
    "conditions": [
      {
        "component_type": "termination",
        "termination_type": "MaxMessageTermination",
        "max_messages": 30
      },
      {
        "component_type": "termination",
        "termination_type": "TextMentionTermination",
        "text": "TERMINATE"
      }
    ]
  },
  "selector_prompt": "You are the controller of a role-play session. The following roles are available:\n{roles}\n\nYou have just seen the conversation below:\n{history}\n\nNow you must select the next speaker from the following participants:\n{participants}\n\nPlease output only one role name, with no extra explanation.",
  "model_client": {
    "component_type": "model",
    "model": "gpt-4o-mini",
    "model_type": "OpenAIChatCompletionClient",
    "api_key": "xxxxxxx"
  }
}

動作の様子

あらかじめ用意されているチャット形式のUIで、構築したマルチエージェントに指示を出すことができます。

session

右下のチャートを拡大すると、Agent同士のやりとりのログを確認することができます。

session chart

PdMっぽいことを言っているように見えます。
session log

所感

期待どおり簡単にAIエージェントを試すことができました。
AI同士が会話しながらタスクに取り組む様子は、技術の発展や未来を感じることができて楽しいです。利益相反の関係にあるエージェント同士のシミュレーションや、多角的な視点でのレビューなどにも活用できそうです。

一方で、思考錯誤してもなかなか期待した出力が得られないケースがありました。
今回の例だと企画とコーディングを依頼しても、企画だけで十分と判断されて、コードが最終出力に含まれない状態で終了してしまうケースに何回も遭遇し、うまく対処できませんでした。
実際にプロダクトとしてマルチエージェントを構築する際には、次のような課題が考えられます。

  • 課題の選定
    • マルチエージェントで対応するのに適した課題か、単一のLLMを使用するよりも精度が向上するか
  • エージェント配置
    • 解決したい課題に対して、どのような役割のエージェントをいくつ配置するのが最適か
  • 終了条件
    • 特に抽象度の高い課題を依頼する場合、何をもって十分に完了したと判断させるか

もし興味を持たれた方がいれば、この記事がマルチエージェントやAutogenに触れるきっかけになれば幸いです。

参考

https://microsoft.github.io/autogen/dev/user-guide/autogenstudio-user-guide/index.html

https://github.com/microsoft/autogen

脚注
  1. https://microsoft.github.io/autogen/dev/user-guide/autogenstudio-user-guide/index.html 公式ドキュメントに記載の通り、あくまでプロトタイプを作るためのツールです ↩︎

  2. 開発中のバージョンです ↩︎

Discussion