見出し画像

Microsoft autogen, ローカルLLMでAI同士を会話させる

初めに

AIが勝手に判断してタスクをこなしてくれると嬉しいです(GPTAutoに期待を込めて)。そんな大それた事でなくてもAI同士の会話を見て参考にするのも良いでしょう。というわけで、今回はautogenというMicrosoft提供のライブラリを使ってローカルLLM同士を会話させてみました。

会話だけでなく、Pythonコードのコーディング、デバックなどをさせたり、チェスなどのゲームをさせたりと色々できますが、今回は単純な会話です。

結論

期待して読み進めるとガッカリするので最初に結論を書いておきます。

  • そもそもGPT-4APIを前提としているライブラリなのでローカルLLMでは精度が悪い。

  • 英語ならばまだマシであるが日本語では使えたものではない。

  • 精度の問題か不明だが会話が進むと崩壊する。

  • githubのディスカッションでも不具合を報告している人がそれなりに多く、どうやらライブラリ自体の問題の可能性もある。

  • まだまだ発展途上なので実験的である事を念頭に入れる必要がある。

ざっくりとしたやり方

事細かな方法は公式サイトを見た方がいいです。なぜならアップデートが激しく調べても古い方法で説明されていたりと混乱するからです。

ローカルサーバー

OpenAI OAPIと相互性のあるローカルサーバーを作れればなんでもいいです。私はllama cpp pythonを使いました。

LLMモデル

マシンスペックに合わせて選びます。モデルによっては何も出力しない場合があるので、色々と試してみた方がいいです。ELYZA-japanese-Llama-2-13b-fast-instruct-q6_K.ggufを私は使いました。日本語チューニングモデルです。

コード

user_proxy.initiate_chatで渡すmessageが開始のプロンプトとなるようです。ChatGPTでいう一番最初に入力するメッセージです。
autogen.AssistantAgentで渡すsystem_messageはキャラクター付けです。キャラクターを維持できるかは元のLLMモデルの精度次第です。
llm_configで何が渡せて何が渡せないのか不明です。max_tokensは可能でしたがtop_kなどは無理でした。そもそもOpenAI OAPIでも渡せない?

import autogen

api_keys = ["sk-********************"]
base_urls = ["http://localhost:8000/v1"]  # 必要に応じて、API ベース URL を指定できます。 例: ローカルホスト:8000
api_type = 'openai'  # API のタイプ (例: 'openai'または'aoai')。
api_version = 3.1  # 必要に応じて API バージョンを指定します。

config_list = autogen.get_config_list(
    api_keys,
    base_urls=base_urls,
    #api_type=api_type, ←なぜか受け付けないのでコメントアウト
    api_version=api_version,
)

# print(config_list) 確かめる用プリント


llm_config= {"config_list": config_list, "cache_seed": 40, "temperature": 0.5}
user_proxy = autogen.UserProxyAgent(
   name="Admin", # デフォルトで渡される名前がAdminなのでここを変えると引数で渡す必要が出てきてめんどくさい。
   system_message="次期アメリカ大統領が共和党か民主党かについて議論したいと思います。",
   human_input_mode="TERMINATE", # この値を変えると人間が解答するタイミングが選べる。
)

hiroyuki = autogen.AssistantAgent(
    name="バイデン",
    system_message="あなたはアメリカの民主党支持者になり議論に参加します。共和党支持者の意見に反論し、民主党の良い点を述べてください。80文字で解答してください。",
    llm_config=llm_config,
)

narita = autogen.AssistantAgent(
    name="トランプ",
    system_message="あなたはアメリカの共和党員になり議論に参加します。民主党支持者の意見に反論し、共和党の良い点を述べてください。80文字で解答してください。",
    llm_config=llm_config,
)

groupchat = autogen.GroupChat(agents=[user_proxy, hiroyuki, narita], messages=[], max_round=12, speaker_selection_method="round_robin",)
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config=llm_config)
# print(llm_config) 確かめる用プリント

user_proxy.initiate_chat(manager, message="回答に制限はありません。次のアメリカ大統領選挙では共和党と民主党のどちらに投票するべきでしょうかで議論を展開してください。箇条書きは使用しない事。同じ事を繰り返さない。あなたの意見を80字で述べて相手に質問してください。")

AI同士のやり取り全文

全く同じような内容の事を繰り返す。しかしよく見ればちょっと違う箇所もある。と言った感じです。英語で聞いた方がもう少しマトモでした。やはりモデルの精度の問題かと思いますがどうでしょうか?

Admin (to chat_manager):
回答に制限はありません。次のアメリカ大統領選挙では共和党と民主党のどちらに投票するべきでしょうかで議論を展開してください。箇条書きは使用しない事。同じ事を繰り返さない。あなたの意見を80字で述べて相手に質問してください。
---------------------------------------------------------------------------
バイデン (to chat_manager):
承知しました。私はアメリカの民主党を支持します。なぜ、私は民主党を、支持するのかと言いますと、民主党は社会保障や教育、医療などの分野でより大きな政府を目指す一方で、共和党はその対義として小さな政府を目指し、政府の役割は最小限にとどめるべきだと考えています。そのため、私は国民の福祉を広げるために政府がより積極的な役割を果たすべきだと考えるため、民主党に投票します。
---------------------------------------------------------------------------
トランプ (to chat_manager):
私はアメリカの共和党を支持します。なぜなら、私は小さな政府を望み、国の費用の無駄な支出を避けたいからです。また、社会保障や教育、医療などの分野は、個人や家族の努力と責任によって支えることが重要です。政府はこれらの分野で過剰に干渉しすぎないことが重要であると考えています。
---------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
Admin (to chat_manager):
---------------------------------------------------------------------------
バイデン (to chat_manager):
私はアメリカの民主党を支持します。なぜ、私は民主党を、支持するのかと言いますと、民主党は社会保障や教育、医療などの分野でより大きな政府を目指す一方で、共和党はその対義として小さな政府を目指し、政府の役割は最小限にとどめるべきだと考えています。そのため、私は国民の福祉を広げるために政府がより積極的な役割を果たすべきだと考えるため、民主党に投票します。
---------------------------------------------------------------------------
トランプ (to chat_manager):
私はアメリカの共和党を支持します。なぜなら、私は小さな政府を望み、国の費用の無駄な支出を避けたいからです。また、社会保障や教育、医療などの分野は、個人や家族の努力と責任によって支えることが重要です。政府はこれらの分野で過剰に干渉しすぎないことが重要であると考えています。
---------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
Admin (to chat_manager):
---------------------------------------------------------------------------
バイデン (to chat_manager):
私はアメリカの民主党を支持します。なぜ、私は民主党を、支持するのかと言いますと、民主党は社会保障や教育、医療などの分野でより大きな政府を目指す一方で、共和党はその対義として小さな政府を目指し、政府の役割は最小限にとどめるべきだと考えています。そのため、私の国民の福祉を広げるために政府がより積極的な役割を果たすべきだと考えるため、民主党に投票します。 私はアメリカ大統領選挙の候補者の一人、バイデン氏を支持いたします。なぜなら、彼は社会保障や教育、医療などの分野でより大きな政府を目指す民主党の価値と共感できます。また、私は彼の外交政策にも賛同しています。彼は強硬な姿勢で臨むのではなく、対話と協力を通じて国際問題に対処していく方針です。そのため、世界のリーダーとして適切な対応をできると考えています。
---------------------------------------------------------------------------
トランプ (to chat_manager):
私はアメリカの共和党を支持します。なぜなら、私は小さな政府を望み、国の費用の無駄な支出を避けたいからです。また、社会保障や教育、医療などの分野は、個人や家族の努力と責任によって支えることが重要です。政府はこれらの分野で過剰に干渉しすぎないことが重要であると考えています。 ただし、バイデン氏の外交政策については賛成です。強硬な姿勢で臨むのではなく、対話と協力により国際問題に対処していく方針は、世界から支持されるでしょう。
---------------------------------------------------------------------------
>>>>>>>> USING AUTO REPLY...
Admin (to chat_manager):
---------------------------------------------------------------------------
バイデン (to chat_manager):
私はアメリカの民主党を支持します。なぜなら、私は社会の福祉を広げるために政府がより積極的な役割を果たすべきだと考えるからです。そのため、社会保障や教育、医療などの分野でより大きな政府を目指す民主党の政策に共感できます。
---------------------------------------------------------------------------
トランプ (to chat_manager):
私はアメリカの共和党を支持します。なぜなら、私は小さな政府を望み、国の費用の無駄な支出を避けたいからです。また、社会保障や教育、医療などの分野は、個人や家族の努力と責任によって支えることが重要です。政府はこれらの分野で過剰に干渉しすぎないことが重要であると考えています。 ただし、あなたが社会的福祉を広げるために政府がより積極的な役割を果たすべきだと考えるのならば、民主党の政策が適切です。

この記事が気に入ったらサポートをしてみませんか?