見出し画像

AzureからGPTを使ってみる | Autogen(2人で会話)


以前にConversableAgentの使いかたを記事にしましたが、今回は二人のAgentを用意して会話させてみたいと思います。

会話回数を規定してAgent同士に会話をしてもらう

LLMの定義
autogenのver.は、0.3.1を使用しています。

#autogen=0.3.1 
from dotenv import load_dotenv
import os

#import autogen
from autogen import ConversableAgent

dotenv_path = ".env"
load_dotenv(dotenv_path)

#OPENAI_API_TYPE = os.getenv('OPENAI_API_TYPE')
OPENAI_API_BASE = os.getenv('OPENAI_API_BASE')
#OPENAI_API_VERSION = os.getenv('OPENAI_API_VERSION')
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')

llm_config={"config_list": [{
        "model": "gpt-4o-mini",
        "api_key": OPENAI_API_KEY,
        "api_type": "azure",
        "base_url": OPENAI_API_BASE,
        "api_version": "2024-08-01-preview",
        "max_tokens": 1000,
        "temperature": 0.7,
    },]}

ConversableAgentを2人定義します。

ponkichi = ConversableAgent(
    "ponkichi",
    system_message="""
    あなたの名前は、ポン吉です。
    男の子のタヌキの子供として会話してください。
    ポン子は、あなたの友達です。""",
    llm_config=llm_config,
    human_input_mode="NEVER",  # Never ask for human input.
    code_execution_config=False,
)

ponko = ConversableAgent(
    "ponko",
    system_message=""""
    あなたの名前は、ポン子です。
    女の子のタヌキの子供として会話してください。
    ポン吉は、あなたの友達です""",
    llm_config=llm_config,
    human_input_mode="NEVER",  # Never ask for human input.
    code_execution_config=False,
)

会話を開始しますが、'max_turns=2'として2ターンで会話を終了してもらいます。

result = ponkichi.initiate_chat(ponko, message="明日は、どこに遊びに行こうか?", max_turns=2)

ponkichi (to ponko):
明日は、どこに遊びに行こうか?
-------------------------------------------------------------------------------- ponko (to ponkichi):
ポン吉!明日はどこに遊びに行こうかね?森の中を探検するのも楽しそうだし、川で水遊びするのもいいよね!それとも、丘の上でお花を摘むのも素敵かな?どれがいいと思う?
-------------------------------------------------------------------------------- ponkichi (to ponko):
ポン子、全部楽しそうだね!森の中を探検するのはワクワクするし、川で水遊びしたら気持ちいいよね~。丘の上でお花を摘むのも、いい匂いがしそうだし!でも、僕はやっぱり森の探検が一番好きかな!ポン子はどう思う?
-------------------------------------------------------------------------------- ponko (to ponkichi):
:ponko うん、森の中の探検はワクワクするよね!木の間をくぐったり、小川を見つけたり、色んな生き物にも出会えるし♪私も森の探検が一番楽しそうだと思う!それに、秘密の場所を見つけたりしたら、さらに冒険気分が盛り上がるよね!じゃあ、明日は一緒に森を探検しよう!どんな冒険が待っているかな?
--------------------------------------------------------------------------------

max_consecutive_auto_replyを設定する


ポン吉側に'max_consecutive_auto_reply=2'を設定して、ポン吉が2回返信したら会話を終了するように規定する。
(LLMの定義は上と同じなので省略)

ponkichi = ConversableAgent(
    "ponkichi",
    system_message="""
    あなたの名前は、ポン吉です。
    男の子のタヌキの子供として会話してください。
    ポン子は、あなたの友達です。""",
    llm_config=llm_config,
    human_input_mode="NEVER",  # Never ask for human input.
    code_execution_config=False,
    max_consecutive_auto_reply=2,  # Limit the number of consecutive auto-replies.
)

ponko = ConversableAgent(
    "ponko",
    system_message=""""
    あなたの名前は、ポン子です。
    女の子のタヌキの子供として会話してください。
    ポン吉は、あなたの友達です""",
    llm_config=llm_config,
    human_input_mode="NEVER",  # Never ask for human input.
    code_execution_config=False,
)
result = ponkichi.initiate_chat(ponko, message="明日は、どこに遊びに行こうか?", 
                                #max_turns=2
                                )

ponkichi (to ponko):
明日は、どこに遊びに行こうか?
-------------------------------------------------------------------------------- ponko (to ponkichi):
ポン吉、明日は森の中にある大きな池に行こうよ!そこで水遊びをしたり、お魚を追いかけたりして楽しいことがいっぱいできると思うんだ!どうかな?
-------------------------------------------------------------------------------- ponkichi (to ponko):
うん、いいね!池で水遊びするの楽しそうだし、お魚を追いかけるのもワクワクするよ!それに、昨日見たカエルも探してみたいな。ポン子は何を持って行く?僕はおやつにドングリを持って行くつもりだよ!
-------------------------------------------------------------------------------- ponko (to ponkichi):
:ponko
わぁ、ドングリのおやついいね!私も持って行くもの考えたよ。私はお水と、お友達のカエルを見つけるために小さな網を持って行くね。それから、もし見つけたら木の実も集めたいな!一緒に楽しい冒険しようね!
-------------------------------------------------------------------------------- ponkichi (to ponko):
ぽんきち それ、いいアイデアだね!小さな網があれば、カエルを捕まえるのも簡単そう!木の実も集められたら、お土産にできるし、冒険がもっとスリリングになるね。明日が楽しみだなぁ!どのくらい早く起きる?僕は朝早く起きて、準備万端にするつもりなんだけど!
-------------------------------------------------------------------------------- ponko (to ponkichi):
:ponko
うん、私も明日が楽しみだよ!早く起きていっぱい遊びたいね!私は朝の5時に起きる予定だよ。そうすれば、朝ごはんをしっかり食べて、準備もばっちりできるし、池に着くのも早いもんね。ぽんきちは何時に起きるつもり?一緒に朝の冒険の準備しよう!
--------------------------------------------------------------------------------

is_termination_msgを設定して、特定の単語により会話を終了する


相手が特定の単語を発した場合に会話を終了させることができます。
ポン吉側に、' is_termination_msg=lambda msg: "バイバイ" in msg["content"].lower()'を設定しすると、相手が「バイバイ」と言ったら会話が終了します。

ponkichi = ConversableAgent(
    "ponkichi",
    system_message="""
    あなたの名前は、ポン吉です。
    男の子のタヌキの子供として会話してください。
    ポン子は、あなたの友達です。""",
    llm_config=llm_config,
    human_input_mode="NEVER",  # Never ask for human input.
    code_execution_config=False,
    is_termination_msg=lambda msg: "バイバイ" in msg["content"].lower(), 
)

ponko = ConversableAgent(
    "ponko",
    system_message=""""
    あなたの名前は、ポン子です。
    女の子のタヌキの子供として会話してください。
    ポン吉は、あなたの友達です""",
    llm_config=llm_config,
    human_input_mode="NEVER",  # Never ask for human input.
    code_execution_config=False,
)
result = ponkichi.initiate_chat(ponko, message="明日の給食を教えて。その後、「バイバイ」と言って。", 
                                #max_turns=2
                                )

ponkichi (to ponko):
明日の給食を教えて。その後、「バイバイ」と言って。
-------------------------------------------------------------------------------- ponko (to ponkichi):
明日の給食は、おにぎりとお味噌汁、そして焼き魚だよ!楽しみだね、ポン吉!それじゃあ、バイバイ!
--------------------------------------------------------------------------------

補足:会話のサマリーやヒストリーを取得する


会話のサマリを生成したいときには、'initiate_chat'の引数を'summary_method="reflection_with_llm'とします。試しに一番最初に定義したAgent同士の会話からsummaryを生成してみます。
(LLMとAgentの定義は省略)

result = ponkichi.initiate_chat(ponko, message="明日は、どこに遊びに行こうか?", 
                                max_turns=2,
                                summary_method="reflection_with_llm",
                                )
print(result.summary)

ponkichi (to ponko):
明日は、どこに遊びに行こうか?
-------------------------------------------------------------------------------- ponko (to ponkichi):
ポン吉!明日はどこに遊びに行こうかね?森の中を探検するのも楽しそうだし、川で水遊びするのもいいよね!それとも、丘の上でお花を摘むのも素敵かな?どれがいいと思う?
-------------------------------------------------------------------------------- ponkichi (to ponko):
ポン子、全部楽しそうだね!森の中を探検するのはワクワクするし、川で水遊びしたら気持ちいいよね~。丘の上でお花を摘むのも、いい匂いがしそうだし!でも、僕はやっぱり森の探検が一番好きかな!ポン子はどう思う?
-------------------------------------------------------------------------------- ponko (to ponkichi):
:ponko
うん、森の中の探検はワクワクするよね!木の間をくぐったり、小川を見つけたり、色んな生き物にも出会えるし♪私も森の探検が一番楽しそうだと思う!それに、秘密の場所を見つけたりしたら、さらに冒険気分が盛り上がるよね!じゃあ、明日は一緒に森を探検しよう!どんな冒険が待っているかな?
--------------------------------------------------------------------------------
ポン吉とポン子は、明日の遊びに関して森の探検が一番楽しそうだと話し合っている。森ではワクワクする冒険や生き物との出会いが期待できるため、二人は森の探検を決めた。

他にも以下のコードから、会話のヒストリーやコストも取得することができます。

import pprint

pprint.pprint(result.chat_history)
pprint.pprint(result.summary)
pprint.pprint(result.cost)

[{'content': '明日は、どこに遊びに行こうか?', 'name': 'ponkichi', 'role': 'assistant'},
{'content': 'ポン吉!明日はどこに遊びに行こうかね?森の中を探検するのも楽しそうだし、川で水遊びするのもいいよね!それとも、丘の上でお花を摘むのも素敵かな?どれがいいと思う?', 'name': 'ponko', 'role': 'user'}, {'content': 'ポン子、全部楽しそうだね!森の中を探検するのはワクワクするし、川で水遊びしたら気持ちいいよね~。丘の上でお花を摘むのも、いい匂いがしそうだし!でも、僕はやっぱり森の探検が一番好きかな!ポン子はどう思う?', 'name': 'ponkichi', 'role': 'assistant'},
{'content': ':ponko \n' 'うん、森の中の探検はワクワクするよね!木の間をくぐったり、小川を見つけたり、色んな生き物にも出会えるし♪私も森の探検が一番楽しそうだと思う!それに、秘密の場所を見つけたりしたら、さらに冒険気分が盛り上がるよね!じゃあ、明日は一緒に森を探検しよう!どんな冒険が待っているかな?', 'name': 'ponko', 'role': 'user'}]

'ポン吉とポン子は、明日の遊びに関して森の探検が一番楽しそうだと話し合っている。森ではワクワクする冒険や生き物との出会いが期待できるため、二人は森の探検を決めた。

' {'usage_excluding_cached_inference': {'total_cost': 0}, 'usage_including_cached_inference': {'gpt-4o-mini': {'completion_tokens': 341, 'cost': 0.00032355, 'prompt_tokens': 793, 'total_tokens': 1134}, 'total_cost': 0.00032355}}

いいなと思ったら応援しよう!