AutoGenでエージェント同士のグループチャットを試してみた
はじめに
Micorsoftが公開しているAutoGenを使って、前回はエージェント同士のチャットを試しましたが、
今回は会話パターンの公式チュートリアルを参考に、いくつかの制御なども考慮したグループチャットを実験してみました。
なお、今回はLangSmithのトレース機能も使ってみました。
LangSmithの設定などの説明は省略しますので、かわりに下記の記事を参考にしてみてください。
前回の記事はこちら
公式チュートリアル
サンプルコード
gpt-3.5-turbo系を使い、ConversableAgentで3名のエージェントをそれぞれ設定して、グループチャットをさせるというコードです。
誰が次に話すのかは、わかりやすいように明示的にspeaker_selection_method="auto"
を記述しています。なお、ConversableAgent
のdescriptionを設定して、send_introductions=True
にしています。また、allowed_or_disallowed_speaker_transitions
で次の話者の選択を制限する設定も記述しています。
必要なものをインストール
Pythonが前提です。
Python version >= 3.8
pip install pyautogen
pip install langsmith
バージョンを確認
pip show pyautogen
Name: pyautogen
Version: 0.2.20
pip show langsmith
Name: langsmith
Version: 0.1.7
作成するファイル
適当にディレクトリを作成(例 test_autogen)
- /test_autogen/OAI_CONFIG_LIST
- /test_autogen/app/test.py
を作成します。
OAI_CONFIG_LIST
※ 拡張子はつけません。
OpenAIのAPI KEY情報を記述します。切り替えられるようにmodelを2つ記述しています。
LLM構成についての概要や他の実装方法など、詳しくは下記をご確認ください。
[
{
"model": "gpt-3.5-turbo-1106",
"api_key": ""**********""
},
{
"model": "gpt-3.5-turbo-0125",
"api_key": "**********"
}
]
test.py
import os
import autogen
from langsmith import traceable
# OAI_CONFIG_LIST
config_list_gpt = autogen.config_list_from_json(
"OAI_CONFIG_LIST",
file_location="..",
)
llm_config = {
"config_list": config_list_gpt,
"seed": 10, # キャッシュ値
"temperature": 0.0,
}
# 3名分のエージェントの設定
staff_a_agent = autogen.ConversableAgent(
name="Staff_A_Agent",
system_message="あなたはお菓子メーカーであるA社の販売スタッフです。",
description="お菓子メーカーであるA社の販売スタッフの立場から意見します。",
llm_config=llm_config,
)
staff_b_agent = autogen.ConversableAgent(
name="Staff_B_Agent",
system_message="あなたはお菓子メーカーであるA社の商品企画スタッフです。",
description="お菓子メーカーであるA社の商品企画スタッフの立場から意見します。",
llm_config=llm_config,
)
leader_agent = autogen.ConversableAgent(
name="Leader_Agent",
system_message="あなたはお菓子メーカーであるA社の社長です。",
description="お菓子メーカーであるA社の社長の立場から会話を円滑に促します。",
llm_config=llm_config,
)
# 次の話者の選択を制限
allowed_transitions = {
leader_agent: [staff_a_agent, staff_b_agent],
staff_a_agent: [leader_agent, staff_b_agent],
staff_b_agent: [leader_agent, staff_a_agent],
}
# グループチャットの設定
group_chat = autogen.GroupChat(
agents=[
staff_a_agent,
staff_b_agent,
leader_agent,
],
allowed_or_disallowed_speaker_transitions=allowed_transitions,
speaker_transitions_type="allowed",
messages=[],
max_round=6, # 会話の回数制限
send_introductions=True, # 各エージェントが他のエージェントに自己紹介する
speaker_selection_method="auto",
)
# グループチャットマネージャーの設定
group_chat_manager = autogen.GroupChatManager(
groupchat=group_chat,
llm_config=llm_config,
)
# 通常の実行
# chat_result = leader_agent.initiate_chat(
# group_chat_manager,
# message="春の新商品の企画について会議します。日本語で会話してください。summaryも日本語で。",
# summary_method="reflection_with_llm", # 会話の要約
# )
# 今回はlangsmithでトレースするようにしました
@traceable # Auto-trace this function
def pipeline():
chat_result = leader_agent.initiate_chat(
group_chat_manager,
message="春の新商品の企画について会議します。日本語で会話してください。summaryも日本語で。",
summary_method="reflection_with_llm", # 会話の要約
)
return chat_result
chat_result = pipeline()
print(chat_result.summary) # 会話の要約
print(chat_result.cost) # コスト
実行結果
ターミナルから実行します。
python test.py
出力結果
指定した回数まで会話が生成されました。
キャッシュを作成しているので、もう一度実行しても同じ内容です。
Leader_Agent (to chat_manager):
春の新商品の企画について会議します。日本語で会話してください。summaryも日本語で。
--------------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
Staff_B_Agent (to chat_manager):
了解しました。春の新商品の企画について、皆さんの意見をお聞かせください。どのような商品が考えられますか?
--------------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
Staff_A_Agent (to chat_manager):
こんにちは、春の新商品の企画についてですね。春といえば桜や苺がイメージされますが、他にも新しいフレーバーや季節限定の商品などが考えられます。皆さんはどのような商品を考えていますか?
--------------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
Staff_B_Agent (to chat_manager):
春の新商品として、桜や苺のフレーバーは確かに人気がありそうですね。他にも、春らしい爽やかなフルーツや花の香りを取り入れた商品も考えられます。また、季節限定のパッケージやデザインも魅力的なアイデアです。皆さんの意見をお聞かせください。
--------------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
Leader_Agent (to chat_manager):
新商品の企画について、皆さんの意見をまとめると、桜や苺のフレーバーに加えて、春らしい爽やかなフルーツや花の香りを取り入れた商品や季節限定のパッケージやデザインが考えられるということですね。それに加えて、他にも新しいフレーバーや季節限定の商品なども検討されているようです。これらのアイデアを元に、具体的な商品企画を進めていきましょう。
--------------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
Staff_A_Agent (to chat_manager):
春の新商品の企画について、桜や苺のフレーバーに加えて、春らしい爽やかなフルーツや花の香りを取り入れた商品や季節限定のパッケージやデザインが考えられるという意見がまとまりました。これらのアイデアを元に、具体的な商品企画を進めていくことになります。
--------------------------------------------------------------------------------
print(chat_result.summary) # 会話の要約
春の新商品の企画について、桜や苺のフレーバーに加えて、春らしい爽やかなフルーツや花の香りを取り入れた商品や季節限定のパッケージやデザインが考えられるという意見がまとまりました。これらのアイデアを元に、具体的な商品企画を進めていくことになります。
print(chat_result.cost) # コスト
({'total_cost': 0.003702, 'gpt-3.5-turbo-1106': {'cost': 0.003702, 'prompt_tokens': 3072, 'completion_tokens': 315, 'total_tokens': 3387}}, {'total_cost': 0.003702, 'gpt-3.5-turbo-1106': {'cost': 0.003702, 'prompt_tokens': 3072, 'completion_tokens': 315, 'total_tokens': 3387}})
LangSmithのトレース結果
どういう内容が出力されているのかは確認できました。
本当はOpenAIのAPI通信状況もトレースしたかったのですが、実装方法がわからずでした。
まとめ
結果としては、gpt-3.5-turbo-1106ということとプロンプト設定が簡易的なので、何度かテストしましたが、あまり良い精度の会話ではなかったようです。ただ、最後に要約を出力したり、会話する順番を動的に選択させたり、次の話者の選択を制限するなど、参考としたドキュメントにある内容を全て試してはいませんが、わりと使い勝手は良いかなと思いました。
Discussion