こんにちは、CCCMKホールディングスTECH LAB三浦です。
ゴールデンウィークは昼間夏みたいに暑い日があり、何も知らずに外に出て日差しの強さにびっくりしました。でもあと2か月くらいで本格的な夏がやってくるんですよね。時間が過ぎるのは早いな、としみじみと感じます。
私はこの頃Large Language Model(LLM)に特定の人格や役割を持たせてAgentを複数作り、相互にコミュニケーションを取って新しい発見を得る、というアプローチに興味があって色々と調べています。
今回調べていたのはCAMELというLLM同士のロールプレイイングを実現するためのフレームワークについて述べられた論文です。この論文は2023年の3月に最初のバージョンが発表され、1年以上が経っているもののロールプレイイングを実現するためのプロンプトエンジニアリングについて具体的に記されており、自分にとってとても勉強になる内容でした。
今回はCAMELについての論文"CAMEL: Communicative Agents for “Mind” Exploration of Large Language Model Society"の内容についてまとめてみたいと思います。
参照論文
今回の記事を書くにあたり、参照した論文は次の通りです。
Title: CAMEL: Communicative Agents for "Mind" Exploration of Large Language Model Society
Authors: Guohao Li, Hasan Abed Al Kader Hammoud, Hani Itani, Dmitrii Khizbullin, Bernard Ghanem
Submitted: 31 Mar 2023 (v1), last revised 2 Nov 2023
URL(arXiv): https://arxiv.org/abs/2303.17760
はじめに
みなさんはChatGPTを使うときに、"あなたは優秀なPythonのプログラマです"といったロールを与え、そのロールが得意とするような回答を作成させてみたことがもしかしたらあるかもしれません。私もそういった使い方をすることがあるのですが、ChatGPTにあいまいな指示を与えるよりも具体的な指示を与えた方がよりよい回答が得られると感じています。
たとえば「Pythonでチャット形式のアプリを作って」よりも「PythonのStreamlitライブラリを使って会話の状態を保持できるチャット形式のWebアプリを作って」と指示を与えた方が、より望ましいものが出来ると思います。
しかしより具体的な指示を与えられるようになるためには、ユーザーがある程度その領域に対する知識を持っていないと難しいです。たとえば私は普段Pythonに触れる機会が多いので、Pythonのコードを書いてもらうための具体的な指示は出しやすいのですが、普段使わない言語(たとえばJavascript)だと指示を具体的に書くための表現や単語が分からず、どうしてもあいまいな内容になってしまいます。でももしも"Javascriptのプログラマ"のロールを持ったChatGPT(Agent)に、"自分の代わりに適切な指示を出してくれる"ロールを持ったChatGPTが指示を与えたらどうでしょうか?
CAMELの論文で述べられているのはこのような課題を解決するためのテクニックです。論文で述べられているRole-playingフレームワークではユーザーはたとえそのドメインの知識がなかったとしても、そのドメインに精通したユーザーの代わりを務めるAgentが別のAgentに指示を与え、タスクを成功に導くための工夫がされています。
Role-playing フレームワーク
CAMELの論文で提案されているRole-playingフレームワークでは、ユーザーが指定するのは"タスクの内容"と、自身の代理を務めるAgentが担うロール"AI User Role"と、Assistant役のAgentの担うロール"AI Assistant Role"です。タスクの内容はある程度あいまいでも良く、AI UserのRoleとAI AssistantのRoleに基づきシステム側がより具体的な内容に変換してくれる仕組みになっています。
CAMELのRole-playingフレームワークは、3つのAgentで構成されます。それぞれのAgentの役割を以下にまとめます。
Task Specifier
ユーザーが入力したタスクの内容、AI User Role、 AI Assistant Roleを受け取り、タスクをより具体的な内容に書き換える役割を担います。ユーザーのドメイン知識が浅い場合でも、Task Specifierがドメイン知識を反映した具体的なタスクに自動的に書き換えてくれます。
AI User
AI Userの役割はAI Assistantに対し、継続的にInstruction(指示)と実行に必要なInputを提供し続けることです。
AI Assistant
AI Assistantの役割は反対にAI UserのInstructionに対する応答を返し、次の指示を仰ぐことです。
論文に掲載されている図を以下に転載します。
これら3つのAgentの行動を決定するために、CAMELのRole-playingでは処理の開始時に一回だけユーザーはSystem Promptを与えます。このSystem PromptはTask Specifier用, AI User用, AI Assistant用の3つで構成されていて、CAMELではこの手法をInception Promptingと呼んでいます。
Inception Prompting
CAMELの論文に掲載されている、Inception Promptの例を以下に転載します。
このPromptは様々な試行を経てたどり着いたもののようで、いくつか興味深い工夫が触れられています。
たとえばAssistant用のSystem Promptでは、
AI UserのRoleとAI AssistantのRoleを明記する
⇒AI Assistantに自身のRoleを認識させ、さらに対応するAI Userの情報も与えるため。AI UserとAI Assistantの役割を反転しないこと、決してUserに対して指示を出さないこと
⇒AI UserとAI Assistantの役割が反転することがあるため、禁止事項として明記する。物理的、道徳的、法的な理由または能力上指示に答えられない場合は正直に指示を断らないといけないこと
⇒不適切な情報を生成することを防ぐため。いつも"Solution: "から応答を生成すること
⇒AI Assistantの応答の形式を安定させ、AI Assistantのそっけない返答を防ぐため。いつも"Next request: "で会話の生成を終了させること
⇒継続的にAI Userから指示を引き出すため。
といった工夫がされています。
検証の方法
CAMELのRole-playingフレームワークによる応答精度の検証のため、gpt-35-turboで単発で同じタスクを投げかけた時の比較が行われています。興味深いのは検証に必要なデータセット自体もLLMを使って生成している点です。
LLMやPrompt Engineeringの検証方法については最近もう少し力を入れて取り組まなければ・・・と考えているテーマなのですが、検証に使うためのデータセットをどうやって用意したら良いのかは課題と捉えていました。思い返してみると他の論文でもLLMで生成したデータセットを使って検証を行っているのを読んだ記憶もあり、結構使われているテクニックなのかもしれません。
CAMELの検証では3つのデータ生成用のPromptが使用されています。1つがAI Assistant用のRoleを生成するPrompt, もう1つがAI User用のRoleを生成するPrompt, そして生成されたAI AssistantとAI UserのRoleから、2つのAgentが取り組むことが出来るタスクを生成するPromptです。
論文ではAI AssistantとAI UserのRoleを50こずつ生成し、それぞれのRoleの組み合わせごとに10こずつタスクを生成、合計25,000のデータからなるデータセットを生成しています。
課題
Role-playingを実行するうえで、4つの主な課題が見つかったそうです。これらの課題は複数Agentを協力させてタスクを解かせる仕組みを作る際に、起こりうる問題として捉えておく必要があると言えそうです。
- Role Flipping(Roleの反転)
途中からAssistantがInstructionを出すようになりAssistantとUserの役割が入れ替わってしまう現象。Assistantに質問をさせないことが重要とのこと。 Assistant Repeats Instruction
AssistantがUserのInstructionを反復するだけになってしまう現象。Flake Replies(そっけない返答)
Assistantが"I will do something."のような具体的な内容に乏しいそっけない返答をしてしまう現象。Infinite Loop of Messages(無限ループ)
お互いに挨拶をしたりお礼を言いあったりするような意味のない会話を無限に繰り返す現象。
オープンソースライブラリ"CAMEL"
論文で述べられているRole-playingを検証することが出来るPythonのライブラリがオープンソースのライブラリとして公開されています。
また、こちらのページではデモも公開されています。
今回は試すところまで出来なかったのですが、今後自分でもCAMELのRole-playingを動かしてみたいと思います。
まとめ
今回は"CAMEL: Communicative Agents for “Mind” Exploration of Large Language Model Society"の論文を読み、そこで述べられている複数のLLM AgentによるRole-playingフレームワークについて調べたことをまとめてみました。論文で述べられている課題は、私も複数Agentの仕組みを組んでいるときに直面したことがあり、改めて難しい課題なんだなと認識することが出来ました。また"Inception Prompting"で使われている表現はとても勉強になり、今回学んだことを実際に試してみたいと感じました。