こんにちは、FastLabelで機械学習エンジニアをしているhachimadaです。
本記事では、LLM(Large Language Model)のインストラクションチューニング用データを、合成データで効率的かつ高品質に作るために実践した方法と、その際の勘所について紹介します。
ここでは概要をざっくりと説明していますので、興味があれば詳細を記載しているFastLabelのブログ記事の方もご覧ください。
なぜ合成データが必要なのか
LLMの学習は大きく3つのステップから成り立つのが一般的です。
- 事前学習
Webや書籍などの大量のデータから「次の単語を予測」する学習を行う。 - インストラクションチューニング
特定タスクの性能を高めるための追加学習で、指示文と期待出力のペアを大量に用意する必要がある。 - 強化学習
好ましくない出力を減らしたり、思考過程を鍛える工程。
インストラクションチューニングでは、各タスクに合わせた「指示文と期待出力」ペアのデータが大量に必要です。しかし、人間がすべてを手作業で作成するのは非常に大変なため、LLMを活用して合成データを作ることが一般的です。データの質をさらに高めるためには有識者に最終チェックをしてもらうことも行われます。
合成データ作成の全体像
今回は、特定のプログラミング言語に対して、コーディングに関する質問と回答を生成することに取り組みました。
1. データ要件を明確化する
まず大切なのは、合成データの質(正確性・一貫性)と多様性(幅広いシナリオや条件をカバーできるか)がどの程度必要かを明確にすることです。具体例として、R言語における統計解析の回答精度を高めたい場合を考えます。この場合、
- コードの説明
- コードの修正
- コードの生成
といったタスクがあり、さらに「平均・分散」「仮説検定」「回帰モデル」などのテーマが存在します。
タスク × テーマを組み合わせることで、多様性と必要な質の両面を担保できます。
2. 複数ステップで生成する
既存論文で提案されているプロンプトをそのまま使っても、使用するLLMの性能や対象とするドメインにより、高品質な問題・回答が出てこないケースが多々あります。そのため、次のような工夫を重ねることが重要です。
- コーディング規約や問題/回答の形式を具体的に指示する
- few-shot例を入れるなど、生成したい形式を丁寧に示す
- 問題と回答を分けて生成することで、プロンプトが長くなりすぎないようにする
このように生成を単純な複数のステップに分割して具体的なプロンプトを与えてやれば、質を高めつつ多様性も保ちやすくなります。
3. 詳細な要件が質の高いデータを生む
OSS-Instructのように、「コードスニペット → 問題/回答」を同時生成する手法は、超大規模データを一気に作るのには有効です。しかし、特定ドメインの精度を上げたい場合は「コードスニペットの多様性」に強く依存するため、不十分な結果になることもあります。
一方、「詳細なタスク要件から問題を直接生成 → 回答を生成」の手順を踏めば、コードスニペットなしでも十分に高品質で多様性あるデータを作れます。例えばR言語の統計解析タスクで、コーディング規約や回答ルールをきめ細かく設定することで、回答の精度や一貫性が向上しました。
4. 重複を排除する
プロンプトを固定したまま大量に生成すると、類似問題が量産されるリスクがあります。
そこで、生成された問題や回答について類似度チェックを行い、閾値を超える場合はスキップして重複を排除します。
Embeddingベースのコサイン類似度を使う方法もありますが、類似度にあまり差が出ず閾値を決めることが困難だったため、ROUGE-Lを用いました。
まとめと今後の展望
1.合成用LLMは最新最強ではない
使えるモデルの性能には限界があり、プロンプトは可能な限り詳細である方が望ましい。
2.要件を細分化して多様性を担保する
「どんなタスクでどんなテーマを扱うか」を整理すれば、網羅的かつ多様性のあるデータを作りやすくなる。
3.具体的なプロンプトで質を高める
問題・回答を分割するなど、生成ステップを細かく設計すると指示に忠実なデータを得られる。
4.重複データの排除は必須
類似度チェックを挟まないと、同じような合成データが増え続けてしまう恐れがある。
5.最終的には人間のチェックが鍵
完全に自動化するのは難しく、合成データの品質を確保するためには有識者のレビュー・修正が欠かせない。
合成データを賢く作れば、インストラクションチューニングの工程を効率化でき、高性能なLLMを目指すことができます。一方で、合成データ自体の精度が低いと修正コストが膨大になるため、今回ご紹介したようなステップを踏んで“まずは質を上げておく”ことが重要です。
どうしても、効率化のためにLLMでいい感じに合成データを作って欲しくなりますが、いいデータを作るためには、ドメイン領域と向き合い、細かい要件を詰めて、プロンプトを調整していくという、地味な作業が非常に重要だと強く感じさせられました。
FastLabelでは、データセントリックなAI開発を支援するため、データ収集・アノテーション・モデル開発まで一貫して行えるサービスを提供しています。興味がある方はぜひこちらからお問い合わせください。