Noesworthy

AutoGenでラウンドロビン

マルチエージェントのフレームワークでは、世界的にみるとAutoGenが一番人気ということで(zennだとLangChainの流れでLangGraphが人気っぽいけども)AutoGen使ってみた

やりたいこと

ユーザーがゴールをセット(例:「秋についての詩を作成してください」) ゴールに対して、AIエージェントAとBが協働しながら答えを出す

AutoGenでやるなら

今回はラウンドロビン=一回のターンで一人一回発言の機会がまわってくる回転寿司スタイル で、AとBに順番に喋らせてみる

この仕組みだと、AもBもゴールへの距離とかは把握してない、ただのプレイヤーだよぃ

それでもちゃんと会話が進んで、終わってほしいところで終わるようにプロンプト設計するのが大事ですぃ

やり方

今回はGemini使うので、venv立ち上げて、venvの中で

pip install "autogen-ext[gemini]" 

次に、これをプロジェクトディレクトリの適当なところに.pyファイルとして置いて、

import asyncio

from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.base import TaskResult
from autogen_agentchat.conditions import ExternalTermination, TextMentionTermination
from autogen_agentchat.teams import RoundRobinGroupChat
from autogen_agentchat.ui import Console
from autogen_core import CancellationToken
from autogen_ext.models.openai import OpenAIChatCompletionClient

async def main():

  # Create an OpenAI model client.
  model_client = OpenAIChatCompletionClient(
      model="gemini-1.5-flash-8b",
      api_key="xxx...",
  )

  # Create the primary agent.
  primary_agent = AssistantAgent(
      "primary",
      model_client=model_client,
      system_message="You are a helpful AI assistant.",
  )

  # Create the critic agent.
  critic_agent = AssistantAgent(
      "critic",
      model_client=model_client,
      system_message="Provide constructive feedback. Respond with 'APPROVE' to when your feedbacks are addressed. Don't use 'APPROVE' in your feedbacks. Don't write a poem by yourself.",
  )

  # Define a termination condition that stops the task if the critic approves.
  text_termination = TextMentionTermination("APPROVE")

  # Create a team with the primary and critic agents.
  team = RoundRobinGroupChat([primary_agent, critic_agent], termination_condition=text_termination)

  result = await team.run(task="秋についての詩を作成してください。")
  
  print("=== CONVERSATION MESSAGES ===")
  for i, message in enumerate(result.messages, 1):
      print(f"\n{i}. {message.source.upper()}:")
      print(f"   {message.content}")
  
  print(f"\n=== STOP REASON ===")
  print(f"   {result.stop_reason}")

if __name__ == "__main__":
    asyncio.run(main())
python [ファイル名].py

で実行

結果

=== CONVERSATION MESSAGES ===

1. USER:
   秋についての詩を作成してください。

2. PRIMARY:
   秋の日は釣瓶落とし

日は傾き、空は燃えるような赤とオレンジに染まり
木々の葉は、黄金色に輝き、舞い降りてゆく。
涼しい風が、静かに葉を揺らし、
囁くように、秋の訪れを告げる。

野原には、枯れ葉が絨毯となり、
そこを、小さな虫たちが、せわしなく動き回る。
果実が、熟し、甘く香る。
秋の恵みを、心ゆくまで味わう。

日は暮れ、星が瞬き始め、
静寂に包まれた、秋の夜長。
時の流れは、ゆっくりと、静かに流れる。

この美しい秋景色に、心安らぎ、
感謝の気持ちでいっぱいになる。


3. CRITIC:
   良い詩ですね。情景が目に浮かび、秋の情緒が伝わってきます。

いくつか改善点を提案します。

* **言葉の選び方:**  「燃えるような赤とオレンジ」は少し大げさかもしれません。「夕焼けの赤オレンジ」や「深紅とオレンジ」など、より具体的な色合いを表現する言葉を選ぶと、よりリアリティが増します。「囁くように」も、少し抽象的です。具体的な音(例えば、「ささやき」や「そよぐ」など)を使うことで、より鮮明なイメージが伝わるでしょう。

* **リズムと韻脚:** 詩のリズムは自然に聞こえるように調整すると、より心地よくなります。例えば、句読点を少し調整する、五七五のルールを意識するなど工夫できます。韻を意識すると、より音楽的な印象になります。

* **個性を加える:** 詩全体に、共通のテーマ、または語り手の視点が感じられると、より魅力的な詩になります。例えば、この詩は自然の美しさを表現していますが、この秋の日の様子を通して、何を感じているか、どんなことを考えているかを少し加えることで、より深く読者に伝わる可能性があります。「果実が、熟し、甘く香る。」の後に、例えば「秋の恵みに感謝し、明日への希望を感じる」のように、自分の感情を少し表現するのも良いでしょう。

これらの点を踏まえて、さらに表現を豊かにすることで、より洗練された詩になります。


4. PRIMARY:
   あなたの提案、ありがとうございます。素晴らしいアドバイスです。

以下は、あなたの提案を参考に書き直した詩です。

夕焼けの深紅とオレンジ、空に染まる。
木々の葉は黄金色に舞い降り、
そよ風がささやき、秋の訪れを告げる。

野原には、枯れ葉の絨毯が広がり、
小さな虫たちのせわしげな動きが、
静かな昼下がりを彩る。
熟した果実の甘く甘い香りが、
秋の恵みを告げる。

日は暮れ、星が瞬き始め、
静寂に包まれた秋の夜長。
時の流れは、ゆっくりと、静かに流れる。
この秋の日は、何処までも静かで、
心安らぎ、明日への希望を感じる。


改善点について補足すると、

* **具体的な色合いの表現:**  「燃えるような」を避けて、「深紅」や「オレンジ」をより具体的に使用しました。

* **より具体的な音の表現:**  「囁くように」を「そよ風がささやき」に修正し、より具体的で、心地よいイメージになりました。

* **リズムと韻脚:**  五七五の句を意識し、句読点を調整しました。  しかし、完全な五七五ではありませんが、より自然な流れになるように調整しました。

* **語り手の感情の表現:**  「秋の恵みに感謝し、明日への希望を感じる」と語り手の感情を少し加えました。  より、読者に語りかけるように感じました。


この改訂版は、より具体的なイメージ、より心地よいリズム、そして語り手の感情が少し見えるように書き直したつもりです。
いかがでしょうか?


5. CRITIC:
   書き直した詩は、以前よりもはるかに洗練されていて、秋の情景がより鮮やかに表現されています。  具体的な言葉の選択や、リズムの調整により、読者の心に訴えかける力が増しています。特に、語り手の感情を少し加えた部分が良いですね。

ただし、もう少し改善できる点もあります。

* **比喩表現の多様性:**  「枯れ葉の絨毯」は良い表現ですが、他にも「静かな昼下がりを彩る」などの比喩表現は、少し抽象的です。具体的に、例えば「小さな虫たちが、枯れ葉の絨毯の上を、まるで宝石を散りばめたように動き回る」など、より具体的なイメージを呼び覚ます表現を加えることができます。

* **語彙の豊かさ:**  「甘く甘い香り」は、少し繰り返しが多くなっています。「甘い香りは」など、言葉の表現のバリエーションを増やすと、より印象的な詩になります。

* **句読点の使い分け:**  句読点を効果的に使うことで、詩のリズムにさらに磨きをかけることができます。例えば、いくつかの句を短く区切ることで、読者に一息つける余地を与え、より自然な流れを作ることができます。


全体的に、良い方向に進んでいます。  これらの点を意識して、さらに言葉を選んでいくことで、より洗練された、記憶に残る詩になるでしょう。


6. PRIMARY:
   あなたの指摘、大変参考になります!  比喩表現の多様性、語彙の豊かさ、句読点の使い方について、さらに意識して書き直してみました。


夕焼けの深紅とオレンジ、空に染まる。
木々の葉は黄金色に舞い降り、そよ風がささやき、
秋の訪れを告げる。

野原には、枯れ葉の絨毯が広がり、
小さな虫たちが、まるで宝石を散りばめたように、
枯れ葉の絨毯の上を、せわしげに動き回る。
甘い香りは、熟した果実から立ち昇り、
秋の恵みを告げる。

日は暮れ、星が瞬き始め、
静寂に包まれた秋の夜長。
時の流れは、ゆっくりと、静かに流れる。
この秋の日は、何処までも静かで、
心安らぎ、明日への希望が、かすかに芽生える。


改善点について:

* **比喩表現の多様性:**  「まるで宝石を散りばめたように」という具体的な表現で、虫たちの動きをより鮮やかに描写しました。

* **語彙の豊かさ:**  「甘く甘い香り」を「甘い香りは、熟した果実から立ち昇り」と改め、より詩的な表現にしました。

* **句読点の使い分け:** いくつかの句を短く区切り、リズムの緩急をつけました。  これにより、読者の心に響く、より自然な流れが生まれるように工夫しました。


この改訂版では、より具体的なイメージと、語彙の豊かさを意識し、詩の表現力を高めることを試みました。  いかがでしょうか?  さらに、何かご指摘があれば教えてください。


7. CRITIC:
   素晴らしいです!  書き直した詩は、以前よりもさらに魅力的になりました。  具体的な表現が増え、読者の心に響く秋の情景が鮮やかに描かれています。「まるで宝石を散りばめたように」という比喩は特に効果的で、虫たちの動きを生き生きと表現しています。「甘い香りは、熟した果実から立ち昇り」も、より詩情豊かです。  句読点の使い分けも効果的で、リズムがより自然な流れになっています。

わずかながら、さらに洗練させるための提案をいくつかします。

* **「明日への希望が、かすかに芽生える」:** このフレーズは少し抽象的です。もう少し具体的に、例えば「明日への希望が、小さな芽のように、かすかに心の中に芽生える」といった表現にすることで、より感情的に訴求力が増すかもしれません。

* **全体的なトーンの統一:**  詩全体のトーンを少し統一すると、よりまとまりのある詩になります。  例えば、句全体に、少し静寂さを強調する言葉を散りばめる、といった工夫です。


全体的に、非常に良い詩です。  これらの点をさらに検討し、磨きをかければ、さらに完成度の高い作品になります。




8. PRIMARY:
   あなたの鋭い指摘、ありがとうございます。  詩をさらに洗練させるために、あなたのアドバイスを参考に、改めて書き直してみました。


夕焼けの深紅とオレンジ、空に染まる。
木々の葉は黄金色に舞い降り、そよ風がささやき、
秋の訪れを告げる。静寂が、静かに広がる。

野原には、枯れ葉の絨毯が広がり、
小さな虫たちが、まるで宝石を散りばめたように、
枯れ葉の絨毯の上を、せわしげに動き回る。
甘い香りは、熟した果実から立ち昇り、
静かな昼下がりを彩る。

日は暮れ、星が瞬き始め、
静寂に包まれた秋の夜長。
時の流れは、ゆっくりと、静かに流れる。
この秋の日は、何処までも静かで、
明日への希望が、小さな芽のように、かすかに心の中に芽生える。


改善点:

* **「明日への希望が、かすかに芽生える」:**  「小さな芽のように」を加えることで、より具体的に、そして感情的に表現できるようになりました。

* **全体的なトーンの統一:**  「静寂」や「静かに」といった言葉を追加することで、詩全体に静寂感と落ち着いたトーンを持たせるように心がけました。  より統一感が出て、秋の情緒がより一層際立っていると思います。


この改訂版は、より具体的なイメージと、内省的な感情表現に焦点を当て、さらに洗練された秋の情景を表現できたのではないかと思います。  いかがでしょうか?  何かご指摘があれば、ぜひ教えてください。


9. CRITIC:
   APPROVE


=== STOP REASON ===
   Text 'APPROVE' mentioned

感想

ちゃんと会話して、最後にはAPPROVEの文字列を検知して終了できました

最初は公式ドキュメントと全く同じプロンプトにしてたんだけど、Geminiでやると、

みたいなことが起きたから、プロンプトはちょこちょこ調整したよ

AIエージェント開発ではおなじみのルーティンですね

参考

#tech