😃

AutoGenでエージェント同士のグループチャットを試してみた

2024/03/26に公開

はじめに

Micorsoftが公開しているAutoGenを使って、前回はエージェント同士のチャットを試しましたが、
今回は会話パターンの公式チュートリアルを参考に、いくつかの制御なども考慮したグループチャットを実験してみました。

なお、今回はLangSmithのトレース機能も使ってみました。
LangSmithの設定などの説明は省略しますので、かわりに下記の記事を参考にしてみてください。

前回の記事はこちら
https://zenn.dev/nari007/articles/232c1b4d9bdb10

https://zenn.dev/nari007/articles/e1531d3b9370cb

公式チュートリアル

https://microsoft.github.io/autogen/docs/tutorial/conversation-patterns

サンプルコード

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構成についての概要や他の実装方法など、詳しくは下記をご確認ください。
https://microsoft.github.io/autogen/docs/llm_configuration

[
  {
    "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