こんにちは、CCCMKホールディングス TECH LABの三浦です。
最近オープンソースのLLMのFine-Tuningにとても可能性を感じていて、色々なことに活用していきたいな、と考えています。ところがFine-Tuning用の学習用データが十分に集まらないことが多く、データが集まらないタスクではFine-Tuningの効果を検証することが出来ないという課題を持っています。
これまでその課題に対して、より高性能なLLMを使って学習データを生成させる、といったことを試してみました。かなり高品質なデータが出来るのですが、バラエティに富んだデータを生成しようとするとなかなかプロンプトによる指示だけでは難しいように感じます。
こういった課題に対するヒントになりそうだな、と感じた論文を最近読みました。こちらの論文です。
【Title】AgentInstruct: Toward Generative Teaching with Agentic Flows
【Authors】 Arindam Mitra, Luciano Del Corro, Guoqing Zheng, Shweti Mahajan, Dany Rouhana, Andres Codas, Yadong Lu, Wei-ge Chen, Olga Vrousgos, Corby Rosset, Fillipe Silva, Hamed Khanpour, Yash Lara, Ahmed Awadallah
【Submitted】3 Jul 2024
【arXiv URL】: https://arxiv.org/abs/2407.03502
この論文ではLLMにWeb検索や計算機能などのToolを与え、自律的にそのToolを実行してタスクを解くAgentを組み合わせて多種多様なLLMの学習用データを生成する、という手法が提案されています。この手法を用いて学習されたLLMは様々なタスク領域において精度の改善が示されています。
今回の記事は、この論文を参考にし、内容についてまとめ、感じたことなどを書いていこうと思います。
高品質なデータをLLMで生成するには?
数十億のパラメータで構成される比較的小サイズのLLMをInstruction-TuningやFine-Tuningする際に、より大規模なLLMで生成したデータを使って学習を行う、といったアプローチが取られます。このアプローチによって人手をかけなくてもデータを集められる一方で、そのデータをそのまま使うと学習対象のLLMがテキストの表面的なスタイルだけ学習し、言語能力が落ちてしまう、といったモデルの崩壊が起きてしまうこともあります。これを防ぐためには結局人による品質チェックやフィルタリングが必要になってしまいます。
一方で複数のAgent同士を交互に作用させて複雑なタスクを解かせる、というMulti-agentというテクニックが用いられるようになりました。たとえばあるAgentがタスクを解くためのプランを生成し、別のAgentがコードを書いて、さらに別のAgentがその内容を精査する、といったやり取りを行わせます。さらにAgentにはLLMに加えてWeb検索やコード実行環境などのToolを与えることが出来るので、結果の精査の際に外部の情報を参照してその真偽を確認させる、といったことも可能になります。
このMulti-agentのテクニックをデータ生成に応用したのがこの論文で紹介されているAgentInstructです。AgentInstructでは言語理解やコード生成、Toolの利用などのスキルをAIに学習させるために必要なInstruction(指示)データセットを多数のAgentを使うことで生成します。たとえば言語理解を身に着けるためには文章内の主題やどんな主張が述べられているのかを理解する必要がありますが、それぞれに応じた学習データをそれぞれのAgentに生成させます。さらに生成されたデータをより複雑に書き換えるための指示を提案するAgent、それを受けて書き換えるAgentなども含まれています。
AgentInstructによって次を満たすデータを生成出来ることが期待されます。
- GPT-4などの強力なLLMとToolを組み合わせることで高品質なデータの生成を実現する
- 必要なスキルに対し必要な細かいタスクを定義、それぞれに特化したAgentを用意することで多様なデータの生成を実現する
- データの生成からその評価やフィルタリングまでを自動化することで大規模なデータの生成を実現する
論文の中ではAgentInstructによって2,500万のpromptとresponseのデータを生成し、Mistral-7BというLLMをFine-Tuningさせたモデル"Orca-3"を複数のベンチマークで評価しています。Orca-3は同じMistral-7BをInstruction-Tuningした"Mistral-Instruct-7B"というモデルと比較して様々なベンチマークにおいて性能の向上が見られています。
AgentInstructの仕組み
AgentInstructでは3つのステージを通じて元になるテキストやコードからデータを生成します。それらは順に"Content Transformation Flow", "Seed Instruction Flow", "Instruction Refinement Flow"と呼ばれています。
それぞれのステージでどのようなことが行われるのかを、まとめていきます。
Content Transformation Flow
このステージでは元になるテキストやコードを、別の形式に変換する処理が行われます。たとえばWebから取得したコンテンツはそのままでは構造化されておらず、学習データとして使用するには適していません。それらを整形したり、別の形式、たとえば会話形式にしたりする処理がContent Transformation Flowでは行われます。
たとえばReading Comprehension Skill(読解力)用のデータセットを作成する場合、このステージでは9種類の変換が行われます。それぞれの変換を担うAgentが用意され、それらのAgentがランダムで選択され、コンテンツの変換に使用されます。
Seed Instruction Generation Flow
Content Transformation Flowで変換されたデータを元に、Instructionを生成するステージです。たとえばReading Comprehension Skillはさらに43のサブタスクで構成されていて、それぞれのタスク向けのInstructionと具体的な質問がそれぞれに対応したAgentによって生成されます。
Instruction Refinement Flow
このステージでは、Seed Instruction Generation Flowで生成されたInstructionをより複雑で高品質なものに変換され、最終的なInstructionデータが生成されます。ここではSuggesterとEditorというAgentが相互にやり取りを行います。SuggesterはInstructionをより複雑にするための提案を行い、Editorがその提案に基づきInstructionの書き換えを行います。
Reading Comprehension Skillではこのステージで前の2ステージで変換されたコンテンツとInstructionおよび質問が与えられ、
- 質問が答えられないようにコンテンツを書き換える
- 質問に対する回答が変わるようにコンテンツを書き換える
- 質問もしくは回答の選択肢を複雑になるように書き換える
これらの3つの方針に基づいた提案をSuggesterが行い、それに基づいてコンテンツ、Instruction、質問がEditorによって書き換えられます。
論文から読み取れなかった点
それぞれの役割を担うAgentは、System Messageにそれぞれの役割や指示が与えられているそうですが、この論文では具体的なプロンプトの内容には触れられていませんでした。Agentに搭載するLLMについては文脈を読み取る限り、おそらくGPT-4が使われているのではと思います。
また、AgentInstructでは多様で高品質なInstructionデータを生成する手順が記されていますが、それらに対する回答データをどのタイミングで生成するのかを読み取ることが出来ませんでした。Instruction生成時に回答まで生成させるのか、あるいは一度Instructionを作った後に回答を生成させるのか、おそらくどちらかだと考えています。
まとめと感想
今回はAgentInstructという、Multi-agentのテクニックを使った高品質な学習データ生成方法について、論文を読んでまとめてみました。特にデータを生成する過程がシステム化されていて、とても面白いと感じました。この方法で生成されたデータによって精度が高いモデルが構築できるという結果も出ているので、全自動でLLMの学習に必要なデータセットが生成され、さらに学習まで自動的に行われるような世界が近いように思います。
私も現在色々なタスクでLLMのFine-Tuningを試しているのですが、そのタスクをさらに細かいサブタスクに分割し、それぞれに応じたInstructionデータをAgentに生成させる、というアプローチはすぐに試してみたいと思いました。