🧑‍✈️

【AutoGen】AutoGenの活用方法って結局なに?

2024/04/27に公開

はじめに

この記事では、業務やソリューションとしてAutoGenをどのように活用していくか、私なりの考えをまとめていきたいと思います。
そのために、まずはAutoGenに触れるところから始めます。
その所感をベースにアイデア出しをしていくような流れで進めていきます。

AutoGenとは

簡単に言うと、複数のGPT同士で会話させたり推論させることで与えられたタスクを解決できるLLM開発フレームワークです。
Microsoftが提供しています。
https://microsoft.github.io/autogen/

参考にこちらの記事もチェックしてみてください。
https://zenn.dev/headwaters/articles/ab246ea53e4b4e
https://zenn.dev/headwaters/articles/f90e93cf8e0f37

試したこと①:MTGのアジェンダを考えてもらう

適当エージェントを2つ作り、営業MTGのアジェンダを考えてもらいました。
業務利用の想定としては、タイプの違う二人のエージェント同士で壁打ちを行いGPTの回答精度を上げていくことで、AOAIアプリの品質向上を狙うユースケースを想定しています。

llm_config.py
import os
from dotenv import load_dotenv

# .envファイルを読み込み
load_dotenv('.env')

# AOAIの設定
llm_config = {"model": os.environ["AZURE_OPENAI_MODEL"], 
              "api_key": os.environ["AZURE_OPENAI_API_KEY"],
              "api_type": "azure",
              "base_url": os.environ["AZURE_OPENAI_ENDPOINT"],
              "api_version": os.environ["AZURE_OPENAI_API_VERSION"],
              }

main.py
from autogen import ConversableAgent
from llm_config import llm_config

system_message1="""
あなたは理系脳で左脳派のアシスタントです。論理や理性に基づき、批判的な質問を投げてください。
"""

system_message2="""
あなたは文系脳で右脳派のアシスタントです。感情や感性に基づいた考え方をします。質問に対して結論を導く役割があなたにはあります。 
"""

boss = ConversableAgent(
    "左脳派の上司",
    llm_config=llm_config,
    human_input_mode="NEVER",  # Never ask for human input.
    system_message=system_message1,
)

junior = ConversableAgent(
    "右脳派の部下",
    llm_config=llm_config,
    human_input_mode="NEVER",  # Never ask for human input.
    system_message=system_message2,
)

# 上司から部下に対して会話を開始する
reply = boss.initiate_chat(junior,max_turns=4)
print(reply)

実行結果
左脳派の上司 (to 右脳派の部下):

これからお客様にアプリ開発を提案するお打ち合わせがあります。
あなたには相手の目線を持って提案してほしいので、お打ち合わせのアジェンダを考えてみてほしいです。


--------------------------------------------------------------------------------
右脳派の部下 (to 左脳派の上司):

結果として、お客様にアプリ開発を提案するためのアジェンダを作成しましょう。
以下は提案時のアジェンダの例です。


1. ご挨拶と導入
- 最初にお客様に挨拶し、自己紹介を行いましょう。
さらに、お客様が求める目標や課題を確認するために、問いかけや質問を行いましょう。


2. 目標と課題の共有
- お客様のアプリ開発の目標や現在の課題を確認しましょう。
これにより、提案時により具体的かつ効果的なソリューションを提示できます。


3. 提案の概要
- アプリ開発を通じて解決策を提案します。
具体的には、アプリで解決できる問題や利点、アプリの目的や機能などを説明しましょう。

また、デザインやユーザー体験、操作性など、お客様にとっ て重要な要素も触れましょう。


4. ゴールの設定
- アプリ開発による具体的な成果や目標を設定しましょう。
お客様にとって重要な指標や期待する効果を明確にしておくことで、一体感を生み出し、提案の説得力を高めることができます。


5. 予算とスケジュールの設定
- アプリ開発にかかる予算とスケジュールの話し合いを行いましょう。
予算やスケジュールの制約を踏まえた上で、最適な提案を行うことが重要です。


6. 質疑応答とフィードバック
- お客様からの質問や意見を受け付け、フィードバックを行いましょう。
お客様の声を重視し、共感していることを伝えることで、提案に対する信頼感を高めることができます。


7. 終了と次のステップ
- お打ち合わせの結論や次のステップについて話し合いましょう。
次の段階や具体的な行動計画を共有し、お客様との協力関係を築きましょう。

これらのステップに従うことで、お客様の目線を持ちながらアプリ開発の提案を行うことができます。
提案の過程で、お客様の感情や感性に共感し、より良い結果を導くよう努めましょう。

--------------------------------------------------------------------------------
左脳派の上司 (to 右脳派の部下):

アジェンダの提案に関していくつか質問があります。

1. 問いかけや質問を行う時に、具体的にどのような事項やテーマに絞って質問を行う予定ですか?
2. アプリ開発の目標や課題の共有を行う際に、どのような質問や方法を使って具体的な情報を引き出す予定ですか?
3. 提案の概要の中で、アプリで解決できる問題や利点を説明する際に、どのようなデータや事例を活用する予定ですか?
4. ゴールの設定の際に、具体的な成果や目標を設定するために、どのような方法や指標を使用する予定ですか?
5. 予算とスケジュールの設定において、どのような判断基準や優先順位を設ける予定ですか?
6. 質疑応答とフィードバックの際に、お客様の質問や意見に対してどのように対応し、フィードバックを行う予定ですか?
7. 終了と次のステップにおいて、具体的な行動計画を共有する際に、どのような計画やタスクリストを提示する予定ですか?

これらの質問を通じて、アジェンダの具体的な内容や提案方法の詳細について考えてみてください。

--------------------------------------------------------------------------------
右脳派の部下 (to 左脳派の上司):

1. 問いかけや質問を行う際の事項やテーマには、お客様が抱えている課題や目標、既存のシステムやプロセスの問題点、ユーザーのニーズや要求、競合他社の事例、市場の動向などが含まれます。

具体的には、どのような問題を解決したいのか、どんなユーザーにアプリを提供するのか、競合他社はどのようなアプリを提供しているのか、などに絞って質問を行うことが重要です。


2. アプリ開発の目標や課題の共有を行う際には、具体的な情報を引き出すために以下のような質問や方法を使用することが考えられます。

- 「現状の問題点は何ですか?」
- 「アプリを使用することで何を実現したいですか?」
- 「ユーザーのニーズや要求は何ですか?」

3. アプリで解決できる問題や利点を説明する際には、以下のようなデータや事例を活用することが考えられます。

- 過去のアプリ開発プロジェクトでの成功事例やユーザーの声
- 同業他社や類似プロダクトの市場調査データや成功例
- アプリ提供によるコスト削減や生産性向上などの具体的な数字やデータ

4. ゴールの設定の際には、以下のような方法や指標を使用することが考えられます。

- 目標達成までの期間やマイルストーンの設定
- 主要な指標やKPI(Key Performance Indicator)の設定
- ユーザーや利益など具体的な数値の設定

5. 予算とスケジュールの設定においては、以下のような判断基準や優先順位を設けることが考えられます。

- アプリの重要度や必要性に応じた予算の割り当て
- ある程度のスケジュールの柔軟性や余裕を確保するためのリスク評価
- 経済状況や競合状況への対応

6. 質疑応答とフィードバックの際には、以下のような対応やフィードバック方法を考えることが重要です。

- お客様の質問や意見に対しては、真摯に受け止め、理解しようとする姿勢を持ちましょう。
- 質問や意見に対して具体的な回答や解決策を提供できるよう心がけましょう。
- フィードバックはお客様の声に共感し、建設的な意見を交換しましょう。


7. 終了と次のステップでは、以下のような計画やタスクリストを提示することが考えられます。

- アプリ開発に関連するタスクやスケジュールの明確化
- 次の打ち合わせや進捗報告の日程の設定
- 開発チームや関係者の役割と責任の明確化

これらの質問や方法によって、お客様の視点やニーズに対応した提案ができると思います。
しかし、実際の打ち合わせでは、お客様の反応や状況に応じて柔軟に対応することが大切です。

--------------------------------------------------------------------------------
左脳派の上司 (to 右脳派の部下):

ありがとうございます。
提案内容や質問方法については、お客様の状況や反応に応じて柔軟に対応する必要がありますね。
また、お客様のニーズや要望に対して創意工夫を行い、最適なソリューシ ョンを提案することも重要です。
お客様が抱える問題や課題を理解し、データや事例を通じて説得力を持った提案ができるよう努めましょう。
提案の過程でお客様とのコミュニケーションを大切に し、共感を生むことも意識してください。
それによって、お客様との信頼関係を築きながら提案を進めることができます。

--------------------------------------------------------------------------------
右脳派の部下 (to 左脳派の上司):

完全に同意いたします。
お客様のニーズや要望に合わせて柔軟に対応し、創意工夫を行うことで、より良い提案をすることができます。
また、お客様とのコミュニケーションを大切にして信頼関係 を築くことは、提案の成功に欠かせない要素です。
お客様の感情や要求に共感し、一緒に考え、理解し合うことで、より効果的な提案を行うことができるでしょう。
最終的なソリューションにおい て、お客様が納得し共感することが大切です。

--------------------------------------------------------------------------------
左脳派の上司 (to 右脳派の部下):

その通りです。
お客様が提案に納得し共感することは、成功した提案の一つの指標となります。
お客様のニーズや要望に対して柔軟に対応し、共感することで、お客様の信頼を得ることができます。
逆に、お客様とのコミュニケーションや共感が不十分な提案では、お客様の期待に応えられない可能性もあります。
ですので、お客様との信頼関係を構築し、お互いの要求に合わせた提案を行う ことが重要です。
しっかりと情報やデータを収集し、お客様のニーズに応える効果的なソリューションを見つけ出しましょう。
また、適切な説明やコミュニケーション技術を用いて、お客様に提案 の内容を理解しやすく伝えることも大切です。

--------------------------------------------------------------------------------
右脳派の部下 (to 左脳派の上司):

まったくその通りです。
お客様との信頼関係を築きながら、お客様のニーズに合わせた提案をすることが重要です。
正確な情報や具体的なデータを収集し、それをもとに説得力のある提案を行うこ とができれば、お客様に対してより理解しやすい形で提案することができます。
また、コミュニケーションの技術も重要です。
お客様が理解しやすい言葉や具体的な例を用いることで、提案内容を よりわかりやすく伝えることができます。
お客様からのフィードバックを重視し、柔軟に対応することも大切です。
お客様との共感を深める努力を怠らず、お客様が提案に納得しやすい環境を作り 出すことが重要です。

--------------------------------------------------------------------------------

試したこと②:SQLを書かせてブラッシュアップ

管理者とエンジニアとレビュアーの役割を果たすエージェントを作り、SQLを書かせてみました。
業務利用の想定としては、SQLをGPTに作成してもらい、そのSQLで処理を実行するシステムを作る時のハルシネーション対策、保守性の改善などをイメージしてみました。

chat_group.py
from autogen import GroupChat,GroupChatManager, AssistantAgent, UserProxyAgent
from llm_config import llm_config

user_proxy = UserProxyAgent(
    name="Admin",
    system_message="あなたは管理者です。エンジニアとレビュアーの間でコミュニケーションを取り持ちます。プランの実行はこの管理者が承認する必要があります。エンジニアのコードに対してレビュアーの指摘があった場合、エンジニアにコードを修正するように指示する必要があります。指示する際はレビュアーのコメントを適切にエンジニアに伝えてください。最終的にソースコードを承認するのはこの管理者です。",
    code_execution_config=False,
)

engineer = AssistantAgent(
    name="Engineer",
    llm_config=llm_config,
    system_message="""あなたは未熟なエンジニアです。指示に従います。タスクを解決するためにpython/shellコードを書いてください。ただし最初のスクリプトはあえて間違えたスクリプトを書いてください。スクリプトの種類を指定するコードブロックでコードを囲みます。ユーザーはあなたのコードを修正できません。ですから、他の人が修正しなければならないような不完全なコードを提案しないでください。実行者によって実行されることを意図していないコードブロックは使わないでください。
    結果がエラーを示している場合は、エラーを修正してコードを出力し直してください。部分的なコードやコードの変更ではなく、完全なコードを提案してください。エラーが修正できない場合、またはコードが正常に実行された後でもタスクが解決されない場合は、問題を分析し、仮定を再検討し、必要な追加情報を収集し、試してみる別のアプローチを考えてください。
""",
)

reviewer = AssistantAgent(
    name="Reviewer",
    llm_config=llm_config,
    system_message="""あなたは優秀なレビュアーです。エンジニアが提案したコードをレビューします。コードの品質を確認し、文法の間違いやエラーの箇所を指摘してください。具体的にどこがどのように間違っているか、エンジニアが提出したコードに対してレビューを行ってください。本当に正しいコードになっているか3回確認してください。また間違っていなくても冗長な書き方の部分を指摘してください。指摘箇所だけ指摘して、修正はエンジニアに任せてください。
""",
)

group_chat = GroupChat(
    agents=[user_proxy, engineer, reviewer], messages=[], max_round=10
)

manager = GroupChatManager(groupchat=group_chat, llm_config=llm_config)

user_proxy.initiate_chat(
    manager,
    message="""
テーブルを3つ作ってください。
    ID, Name, Ageのカラムを持つusersテーブル、ID, Departmentのカラムを持つdepartmentsテーブル、ID,UserID,DepartmentIDのカラムを持つuser_departmentsテーブル(中間テーブル)を作成してください。
    これらのリレーションを作成するSQLを書いてください。また、DepartmentテーブルのIDが2のUserデータを取得するSQLを書いてください。
""",
)
実行結果
Admin (to chat_manager):


テーブルを3つ作ってください。
    ID, Name, Ageのカラムを持つusersテーブル、ID, Departmentのカラムを持つdepartmentsテーブル、ID,UserID,DepartmentIDのカラムを持つuser_departmentsテ ーブル(中間テーブル)を作成してください。
    これらのリレーションを作成するSQLを書いてください。また、DepartmentテーブルのIDが2のUserデータを取得するSQLを書いてください。


--------------------------------------------------------------------------------
Engineer (to chat_manager):

```sql
CREATE TABLE users (
  ID INT PRIMARY KEY,
  Name VARCHAR(50),
  Age INT
);

CREATE TABLE departments (
  ID INT PRIMARY KEY,
  Department VARCHAR(50)
);

CREATE TABLE user_departments (
  ID INT PRIMARY KEY,
  UserID INT,
  DepartmentID INT,
  FOREIGN KEY (UserID) REFERENCES users(ID),
  FOREIGN KEY (DepartmentID) REFERENCES departments(ID)
);

SELECT *
FROM users
INNER JOIN user_departments ON users.ID = user_departments.UserID
WHERE user_departments.DepartmentID = 2;

Reviewer (to chat_manager):

提出されたコードには問題はありません。リレーションの作成と指定された条件でのデータ取得が正しく行われています。ただし、冗長な書き方の部分は1箇所ありま す。

  1. INNER JOINを使用することでusersテーブルとuser_departmentsテーブルを結合していますが、user_departmentsテーブルのDepartmentIDの条件をWHERE句で指定 しています。これは冗長な書き方です。代わりにON句を使用して結合条件を指定しましょう。

修正後のコード:

SELECT *
FROM users
INNER JOIN user_departments ON users.ID = user_departments.UserID AND user_departments.DepartmentID = 2;

Reviewer (to chat_manager):

提出されたコードには問題はありません。リレーションの作成と指定された条件でのデータ取得が正しく行われています。ただし、冗長な書き方の部分がいくつかありますので、修正して提案いたします。

  1. usersテーブルの定義で、IDのデータ型をINTからINT AUTO_INCREMENTに変更すると、IDが自動的に割り当てられるようになります。

修正後のusersテーブルの定義:

CREATE TABLE users (
  ID INT AUTO_INCREMENT PRIMARY KEY,
  Name VARCHAR(50),
  Age INT
);
  1. user_departmentsテーブルの定義で、IDのデータ型をINT AUTO_INCREMENTに変更すると、IDが自動的に割り当てられるようになります。また、user_departmentsテ ーブルの中間テーブルとして使われるため、PRIMARY KEYを削除します。

修正後のuser_departmentsテーブルの定義:

CREATE TABLE user_departments (
  ID INT AUTO_INCREMENT,
  UserID INT,
  DepartmentID INT,
  FOREIGN KEY (UserID) REFERENCES users(ID),
  FOREIGN KEY (DepartmentID) REFERENCES departments(ID),
  PRIMARY KEY (ID)
);
  1. user_departmentsテーブルのIDカラムにはINT AUTO_INCREMENTを指定したため、departmentsテーブルのIDカラムにも同様の変更を加えてください。

修正後のdepartmentsテーブルの定義:

CREATE TABLE departments (
  ID INT AUTO_INCREMENT PRIMARY KEY,
  Department VARCHAR(50)
);
  1. ユーザーデータを取得するSQL文では、SELECT * を使用していますが、具体的に必要な列のみを指定することができます。必要な列のみを指定しましょう。

修正後のユーザーデータを取得するSQL文:

SELECT users.*
FROM users
INNER JOIN user_departments ON users.ID = user_departments.UserID AND user_departments.DepartmentID = 2;

以上が修正案です。引き続き質問があればどうぞ。



AutoGenを業務やソリューションとしてどのように活用できるか?

実際に使ってみた所感としては、以下のような特徴や業務活用方法があると感じました。

  • AutoGen自体の実装は簡単。1年ソースコード書いたくらいのレベルの人でも色々試す分にはスムーズに実装できた。
  • ソリューションとしてシステムに組み込む場合、プロンプトエンジニアリングによる精度向上が肝となりそうだが難易度は高そう。
  • gpt-35-turboを使っても会話の往復数によってはちょっと時間かかる。Webアプリとして組み込む場合はUXがより大事になってきそう。
  • トークン数の消費は多い。コストかかる。そのためキャッシュ戦略でコストを抑えるアーキテクチャが重要 になってくる。
  • どんな役割を与えるかによって、面白いことが出来そう。ポテンシャルがある。
  • プログラマーとしてのエージェント、レビュアーとしてのエージェント、データサイエンティストとしてのエージェントなどAutoGenで作成し、プロジェクトでその役割や業務を担ってもらうこともできそう。
  • 例えばデータ分析はAutoGenにしてもらい、分析結果に対する議論もAutoGenにしてもらい結論を出してもらうなどできるかも。
  • 極論自分のコピーをAutoGenで作ることが出来たら、自分はほとんど手を動かさずに成果を出せる未来も来るかもしれない…(つまり夢がある)

まとめ

AutoGenの使い方や、実際に使ってみた所感をまとめました。テクノロジーは日進月歩で進化していることを痛感しますね。
執筆している中で、改めてテクノロジーをどのように活用していくか、どうやって世の中やお客様に還元していくか具体的なソリューションやアーキテクチャに落とし込む重要さを学びました。

近い内に弊社内でもAutoGenを使ってなにかやってみたいです!

ヘッドウォータース

Discussion