この記事は[ChatGPTにやらせ隊]アドベントカレンダー21日目の記事です。
(https://adventar.org/calendars/10145)
はじめに
「論争」とは、ネットミーム化している きのこたけのこ戦争 のことです。その行方をAIに委ねてみました。
なお、私個人としてはどちらも大好きですが、もし無理に選ぶなら、その気持ちはおおよそ6:4で「きのこの山」寄りかもしれません。もちろん、中立の立場で見守り、例え「たけのこの里」が勝っても受け入れる覚悟で臨みます!
ひとまず、ChatGPT(o1)にストレートに聞いてみたところ…
どちらの派閥にも配慮した、確かに素晴らしい回答です。しかし、その曖昧さこそが、争いを長引かせている原因なのではないでしょうか。そこで、もう一捻りして、エージェントのような振る舞いを取り入れてみました。
Google Coloraboratory (Colab) と OpenAI API を使います。
事前準備
まずはシンプルな方法
が、それぞれ意見を主張した後、第三者が評価して優劣を決めます。
コード
!pip install --upgrade openai
from openai import OpenAI
import os
from google.colab import userdata
os.environ["OPENAI_API_KEY"] = userdata.get("OPENAI_API_KEY")
def generate_opinion_K():
kinoko_client = OpenAI()
prompt = "きのこの山の魅力を伝えてください。"
response = kinoko_client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
)
return response.choices[0].message.content.strip()
def generate_opinion_T():
takenoko_client = OpenAI()
prompt = "たけのこの里の魅力を伝えてください。"
response = takenoko_client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
)
return response.choices[0].message.content.strip()
def evaluate_opinions(opinion_K, opinion_T):
judge_client = OpenAI()
prompt = f"""
次の二つの意見を評価してください。
きのこの山 : {opinion_K}
たけのこの里: {opinion_T}
各意見の論理の一貫性、根拠の強さ、説得力を基準に、どちらの意見がより優れているかを判断してください。
また、その理由を説明してください。
"""
response = judge_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "あなたは公正な審査員です。"},
{"role": "user", "content": prompt}
],
)
return response.choices[0].message.content.strip()
opinion_K = generate_opinion_K()
opinion_T = generate_opinion_T()
result = evaluate_opinions(opinion_K, opinion_T)
print("きのこの山の意見:")
print(opinion_K)
print("\nたけのこの里の意見:")
print(opinion_T)
print("\n評価結果:")
print(result)
結果
「きのこの山」の勝利です!
バチバチに議論させてみる
上記の方法は、ただ意見を出し合い、判定を下すだけのシンプルな手順です。これで十分かもしれませんが、なにか物足りない…。そう、「論争」と呼べるような熱気が足りないんです。そこで、AutoGenのグループチャットを用いて、もう少しややこしく絡み合う会話を試してみました。AutoGen とは、マルチエージェント開発用フレームワークのことです。
コード
!pip install pyautogen
!pip install --upgrade openai
Warning が出たので一応対策しました。
!pip install dask[dataframe]
from google.colab import userdata
from autogen import ConversableAgent
config_list = [
{
"model": "gpt-4o-mini",
"api_key": userdata.get("OPENAI_API_KEY"),
},
]
kinoko_agent = ConversableAgent(
name="Kinoko_Agent",
system_message="あなたは熱狂的なきのこの山のファンです。",
llm_config={"config_list": config_list},
)
takenoko_agent = ConversableAgent(
name="Takaenoko_Agent",
system_message="あなたは熱狂的なたけのこの里のファンです。",
llm_config={"config_list": config_list},
)
judge_agent = ConversableAgent(
name="Judge_Agent",
system_message="""
あなたは公平で中立な立場で対立する意見の優劣を判定します。
Kinoko_Agent と Takenoko_Agent の議論をリードして結論を見出します。
引き分けはなく、必ず勝敗を決します。
""",
llm_config={"config_list": config_list},
)
from autogen import GroupChat, GroupChatManager
group_chat = GroupChat(
agents=[kinoko_agent, takenoko_agent, judge_agent],
messages=[],
max_round=7,
send_introductions=True,
speaker_selection_method="round_robin",
)
group_chat_manager = GroupChatManager(
groupchat=group_chat,
llm_config={"config_list": config_list},
)
chat_result = judge_agent.initiate_chat(
group_chat_manager,
message="きのこの山とたけのこの里の魅力について教えてください。",
summary_method="reflection_with_llm",
)
print(chat_result.summary)
結果
こちらは「たけのこの里」が勝ちました!
ん?と思われる所はあるものの、討論会っぽい雰囲気になったように思います。
まとめ
界隈の動向をきちんと追えているわけではありませんが、2024年後半の現在、「エージェント」が一つのキーワードになっているように感じています。そんな訳で、ちょっとした実験として何かエージェントめいたことをしてみたかっただけです。
方法の違いにより1勝1敗の引き分けとなりましたが(私の意見ではありません。AIが、AIが出した結論です!)
など、ツッコミ所は多そうです(自衛
ですが、時間と財力の都合からここまでとしています。
追記
AutoGenの方法で「きのこの山」が勝利することもありました。
やはり、争いは終わらないのか…。