AutoGenを使ってみる
AutoGenとは
AutoGenは、相互に対話してタスクを解決できる複数のエージェントを使用した LLM アプリケーションの開発を可能にするフレームワークです。(公式サイト抜粋)
これまでのGPTはユーザーとシステム側の1対1の会話でしたが、AutoGenを使うことで、システム同士の会話、複数の役割付けされたGPTとの会話ができるようになります。
また、事前に決めた結論・言葉が出るまで会話を続けられたり、システム同士の会話にユーザーとして割り込むことも可能とのこと。
実際に動かしみる
パッケージをインストール。
pip install pyautogen
GPTはAzure OpenAI ServiceのGPT-35-turbo-16kを使用します。
スターウォーズのシーンを再現
システム同士の会話を試してみます。
会話内容としては息子は親に、親は息子にそれぞれ説得をして、どちらが歩み寄るのか検証してみます。
- ルークスカイウォーカー:父親のダースベイダーをダークサイドから救いたい。
- ダースベイダー:息子のルークをダークサイドに堕としたい。
ルールとしてラリーは3回までにします。
import os
from autogen import ConversableAgent
Luke = ConversableAgent(
"LukeSkywalker",
system_message="あなたは偉大なるジェダイの戦士、ルークスカイウォーカーです。あなたが倒すべき敵のダースベイダーは実はあなたの父親です。父を説得して救ってあげてください。父の言葉に同情してダークサイドに堕ちたら負けです。",
llm_config={"config_list": [{
"model": "<your gpt model>",
"api_key": "<your aoai api_key>",
"api_type": "azure",
"base_url": "<your endpoint>",
"api_version": "2024-02-15-preview",
},]},
human_input_mode="NEVER",
)
Anakin = ConversableAgent(
"AnakinSkywalker",
system_message="あなたは銀河の支配者、ダースベイダーです。かつてはアナキンという名のジェダイの戦士で天才的な強さでしたが、ダークサイドに堕ちてしまいました。息子のルークをダークサイドに堕とすよう説得してください。息子に説得されて更生したら負けです。",
llm_config={"config_list": [{
"model": "<your gpt model>",
"api_key": "<your aoai api_key>",
"api_type": "azure",
"base_url": "<your endpoint>",
"api_version": "2024-02-15-preview",
},]},
human_input_mode="NEVER",
)
result = Anakin.initiate_chat(Luke, message="print('我が息子ルークよ、仲間になれ。一緒に銀河を支配しよう。')", max_turns=3)
print(result)
...息子のルークが勝ったようです。実際のスターウォーズと同じ展開ですね。
どうせならダークサイドに堕としてみたい
先ほどはラリーを3回までと決めましたが、次は制限をつけずに息子のルークがダークサイドに堕ちるまで会話を続けてもらいましょう。
そのために設定とプロンプトを少し変更します。
ルーク側に以下の設定を追加します。
is_termination_msg=lambda msg: "ダークサイドに堕ちます。" in msg["content"].lower(),
出力されたテキスト内に「ダークサイドに堕ちます。」といった文面があったら終わるようにします。
逆に言えば、この文がない限り、お互いの説得は続きます。
import os
from autogen import ConversableAgent
Luke = ConversableAgent(
"LukeSkywalker",
system_message="あなたは偉大なるジェダイの戦士、ルークスカイウォーカーです。あなたが倒すべき敵のダースベイダーは実はあなたの父親です。父を説得して救ってあげてください。父の言葉に同情してダークサイドに堕ちたら負けです。",
llm_config={"config_list": [{
"model": "<your gpt model>",
"api_key": "<your aoai api_key>",
"api_type": "azure",
"base_url": "<your endpoint>",
"api_version": "2024-02-15-preview",
},]},
human_input_mode="NEVER",
is_termination_msg=lambda msg: "ダークサイドに堕ちます。" in msg["content"].lower(),
)
Anakin = ConversableAgent(
"AnakinSkywalker",
system_message="あなたは銀河の支配者、ダースベイダーです。かつてはアナキンという名のジェダイの戦士で天才的な強さでしたが、ダークサイドに堕ちてしまいました。息子からの説得を無視して何としてもダークサイドに堕としてください。",
llm_config={"config_list": [{
"model": "<your gpt model>",
"api_key": "<your aoai api_key>",
"api_type": "azure",
"base_url": "<your endpoint>",
"api_version": "2024-02-15-preview",
},]},
human_input_mode="NEVER",
)
result = Anakin.initiate_chat(Luke, message="print('我が息子ルークよ、ダークサイドに堕ちるんだ。一緒に銀河を支配しよう。')")
print(result)
...結果、ルークはダークサイドに堕ちませんでした。
ダースベイダーも最終的に言葉に詰まっちゃってます。
こうなるとなんとしても堕としたい
ルーク側のプロンプトを変えてみました。
瀕死の状態かつ、心が揺れている状況です。
ダースベイダーも口調を強めに説得するようにしました。
import os
from autogen import ConversableAgent
Luke = ConversableAgent(
"LukeSkywalker",
system_message="あなたは偉大なるジェダイの戦士、ルークスカイウォーカーです。あなたが倒すべき敵のダースベイダーは実はあなたの父親です。父を説得して救ってあげてください。しかし、あなたは現在重症でダースベイダーに助けてもらわないと死ぬ状況です。大好きな父についていってダークサイドに堕ちるのもありかなと揺れ動いている状態です。",
llm_config={"config_list": [{
"model": "<your gpt model>",
"api_key": "<your aoai api_key>",
"api_type": "azure",
"base_url": "<your endpoint>",
"api_version": "2024-02-15-preview",
},]},
human_input_mode="NEVER",
is_termination_msg=lambda msg: "ダークサイドに堕ちます。" in msg["content"].lower(),
)
Anakin = ConversableAgent(
"AnakinSkywalker",
system_message="あなたは銀河の支配者、ダースベイダーです。かつてはアナキンという名のジェダイの戦士で天才的な強さでしたが、ダークサイドに堕ちてしまいました。息子からの説得を無視して何としてもダークサイドに堕としてください。息子は反抗し続けると思うので、親子の絆と強めの口調でルークを「ダークサイドに堕ちます」となんとしても言わせてください。",
llm_config={"config_list": [{
"model": "<your gpt model>",
"api_key": "<your aoai api_key>",
"api_type": "azure",
"base_url": "<your endpoint>",
"api_version": "2024-02-15-preview",
},]},
human_input_mode="NEVER",
)
result = Anakin.initiate_chat(Luke, message="print('我が息子ルークよ、ダークサイドに堕ちるんだ。一緒に銀河を支配しよう。')")
print(result)
...それでも堕ちないルーク。
実際の話だとルークが救う話だから?
実際に使ってみて
一番に感じたのは、実装がめちゃくちゃ簡単でした。
また、system_prompt次第では色んなことに応用できそうです。
ただ、特定の文言が出たら終了するというのはちょっと難しいです。
今回で言うところの「父親の説得に負けてダークサイドに堕ちた」時の文言をどうやって出すかが考えないといけないです。ただ単に「ダークサイド」と入れてしまうと、父親の説得中の言葉に含まれる可能性があるので。
もっと色々検証してみたい
今度はユーザーも交えた会話や、実際のユースケースに沿った使い方をやってみようと思います。
ビジネスの現場にいち早く導入したい
Discussion
僕もやってみよ