LangChainで対話型ロールプレイモデルCAMELを試す
「CAMEL(Communicative Agents for “Mind” Exploration of Large Scale Language Model Society)」という、言語モデル同士が対話を通して複雑なタスクを遂行していくエージェントモデルのモデル実装がLangChainのドキュメントに追加されていたので試してみました。
CAMELの問題意識は会話やチャットに基づく言語モデルの急速な進歩によって複雑なタスクをコンピューターが遂行できるようになったものの、あくまでそれは会話を誘導する(プロンプトを入力する)人間の能力に大きく依存している、というところにあります。
AI同士が協力しあってくれれば、扱う人間能力にそこまで依存せずとも高度なタスクをこなしてくれるんじゃないかな?という仮説。
ドキュメントでは以下の実装をLangChainで実装してみている感じです。
というわけで、早速見てみましょう。
用意するもの
CAMELAgentというクラスがライブラリで提供されている訳ではないので、基本的にはドキュメントからコピペしていく形になります。
面白いのは最初に処理するタスクの精緻化すらもLLMにやらせているところ。
assistant_role_name = "Python Programmer"
user_role_name = "Stock Trader"
task = "Develop a trading bot for the stock market"
word_limit = 50 # word limit for task brainstorming
サンプルではこのように、Pythonプログラマと株トレーダーが対話しながらトレーディングボットを開発する、という設定にしています。
サンプルのままじゃつまらないので、今回は何か新しいビジネスをつくりたいプログラマーが起業家パイセンに相談しながら「大規模言語モデルを利用して新しいビジネスモデルをつくる」というタスクに取り組む設定にしてみます。
assistant_role_name = "Entrepreneur"
user_role_name = "Programmer who wants to create a new business"
task = "Develop new business models using large language models"
word_limit = 50 # word limit for task brainstorming
すると以下のコードを経て詳細なタスクが生成されました。
task_specifier_sys_msg = SystemMessage(content="You can make a task more specific.")
task_specifier_prompt = (
"""Here is a task that {assistant_role_name} will help {user_role_name} to complete: {task}.
Please make it more specific. Be creative and imaginative.
Please reply with the specified task in {word_limit} words or less. Do not add anything else."""
)
task_specifier_template = HumanMessagePromptTemplate.from_template(template=task_specifier_prompt)
task_specify_agent = CAMELAgent(task_specifier_sys_msg, ChatOpenAI(temperature=1.0))
task_specifier_msg = task_specifier_template.format_messages(assistant_role_name=assistant_role_name,
user_role_name=user_role_name,
task=task, word_limit=word_limit)[0]
specified_task_msg = task_specify_agent.step(task_specifier_msg)
print(f"Specified task: {specified_task_msg.content}")
specified_task = specified_task_msg.content
では続けて行ってみましょう。
残りのコードをコピペして実行する
ドキュメントのコードのままだと、対話が長く続くとトークンオーバーでエラーになってしまうので、雑に直近10件までの会話を保持するように変更しています。
class CAMELAgent:
def __init__(
self,
system_message: SystemMessage,
model: ChatOpenAI,
) -> None:
self.system_message = system_message
self.model = model
self.init_messages()
def reset(self) -> None:
self.init_messages()
return self.stored_messages
def init_messages(self) -> None:
self.stored_messages = [self.system_message]
def update_messages(self, message: BaseMessage) -> List[BaseMessage]:
if len(self.stored_messages) == 10:
self.stored_messages.pop(0)
self.stored_messages.append(message)
return self.stored_messages
def step(
self,
input_message: HumanMessage,
) -> AIMessage:
messages = self.update_messages(input_message)
output_message = self.model(messages)
self.update_messages(output_message)
return output_message
あとはドキュメントのコードをJupyter Notebookにコピペしていくだけの作業なので記事では割愛します。
そして実行した結果、出力されたのが以下のような対話でした。全て英語で出力されるので日本語訳してお送りします↓
(2021年時点の新興トレンド感がありますね。ちゃんとした新興トレンドを入力しておけばもっと有益な情報を返してくれそうな気がします)
(ビジネスモデルを作ってくれと言っているのに、なかなか作ってくれないなぁ。。)
(プロンプトでは具体的な話をしろって指示されているのに、いつまでもふわふわしたことを話しておる・・・)
感想
ビジネスモデルを作ってくれとオーダーしているのにもかかわらず、いかにも本に書いてありそうな杓子定規なアドバイスだけして去っていった起業家パイセンですが、途中で適切な入力をAgentなどを使ってコンテキスト注入すればもっと対応が変わったのかも知れません。
あと、GPT-3.5という知性の限界もありましたね。OpenAIさんはマジでいつになったらGPT-4を使わせてくれるのでしょうか・・・。
対話を見てみると、やはりふわっとした質問にはふわっとしたことしか返さないのがGPTという感じなので、いかに突っ込んだ質問(コンテキストを絞った質問)をできるか、というところがAI同士の対話であってもミソになるなと感じました。対話をいくら続けても、質問の質が上がらないと全くブレイクスルーが起きないということがまざまざと分かる対話ログで、人間同士の会話もそんな感じだよなー、などといったことを感じるのでした。
現場からは以上です。
この記事が気に入ったらサポートをしてみませんか?