LLM・LLM活用 Advent Calendar 2024の14日目です!
https://qiita.com/advent-calendar/2024/large-language-model
面白い記事がたくさん投稿されていますので、他の方の記事もぜひご覧ください!
要約
- プロンプト最適化によって安定したinstructionの進化が行えるようになった
目的
Evol-Instructは、合成データを作る際にLLMを使ってinstructionをより難しいものに書き換えることで、指示追従性の高いモデルを作るためのデータを構築することができる手法です。
MicrosoftのWizard-LMで提案された手法なのですが、新たにWizard-LM2ではAuto Evol-Instructという手法が提案されました。これは、
- 進化させたいinstructionからサブセットを取得
- サブセットに対して初期の進化プロンプトでinstructionを進化
- 実際に進化していたinstructionの数をカウント
- 最適化プロンプトで進化プロンプトを改善
- 改善した進化プロンプトでサブセットのinstructionを進化
- 実際に進化していたinstructionの数をカウント
- 5,6を複数回繰り返して、instructionの進化数が最も多かった進化プロンプトを採用
- 採用された進化プロンプトで4〜7を行い、スコアが改善し続けるまで繰り返す
- 最終的な進化プロンプトでinstruction全体を進化
というサイクルを回すことでinstructionの進化を最適化していくことで、人の手を介すことなく、より高品質なinstructionデータセットを構築していくというものです。
詳しくはこちらをご覧ください。
https://arxiv.org/abs/2406.00770
https://note.com/hatti8/n/nb70175b906ed
今回はこちらをローカルモデルを使って実装していこうと思います。
実施方法について
実験に使ったコードは以下のリポジトリにまとめてあります。
https://github.com/kkendama/Auto-Evol-Instruct
進化用モデルと評価用モデルにはQwen/Qwen2.5-32B-Instructを使用しましたが、このタスクは難しかったようで動作が少し不安定になります。
進化対象のinstructionデータセットにはaya-datasetの日本語instructionを使用しました。
プロンプトの進化
instructionの進化に用いるプロンプトは、本家を参考にして少し調整を加えたものを使用しました。
これでinstructionの進化を行い、<finally_rewritten_instruction>タグで囲まれた最終的なinstructionを進化後のinstructionとして取得します。
進化の評価
instructionの進化を行ってみると、実際には与えられたinstructionの応答を生成してしまうケースや、冗長なものになっただけで難易度自体変わらないケースなど、進化に失敗していることがあります。
Auto Evol-Instructではそういった失敗を減らすことも目的の一つで、プロンプト最適化の評価指標は実際にinstructionが進化していた割合になります。
そこで、元のinstructionと進化後のinstructionを比較して、実際に難易度が上がっているかをLLMに評価させます。
評価のプロンプトには以下のものを使用していますが、結果を一つひとつ確認すると評価精度はあまり良くなかったです(おそらくモデルサイズによる性能の限界)
プロンプトの最適化
評価の結果を受けて、さらに最適な進化プロンプトを探索していきます。
ここでは生成時のステップを加えたり、説明を書き換えたりすることで、多様な進化プロンプトを生成させるようにします。
このプロンプトで複数の進化プロンプトを生成し、それぞれのプロンプトでinstructionを進化させ、その進化を評価します。ここで最も進化に成功していたプロンプトを起点に、さらなる最適化を行うサイクルを回していきます。
結果
実際に上記のプロンプトを使って進化プロンプトの最適化を行いました。
| step | 進化成功率 |
|---|---|
| 初期プロンプト | 54.4% |
| step1 | 68.4% |
| step2 | 70.9% |
当初は54%だった進化成功率が1度目の最適化で68%に上昇し、2度目の最適化でさらに少し上昇しています。
3週目には71%を超えるプロンプトがなく、2週目の進化プロンプトが今回の最適解として採用されました。
最終的なプロンプトはこちらです。
大きく変わったのは、最終的なinstructionを生成したあとに評価を行い、複雑化していない場合には進化の計画を立てるところからやりなおすようになっている部分です。
これが1週目の最適化で導入され、進化率の大幅な向上に繋がりました。
この方法は自分でプロンプトを考えているときには思いつかなかったので、32Bのモデルでもちゃんと最適化がされていることに驚きました。
まとめ
今回はAuto Evol-Instructのプロンプト最適化をQwen2.5-32B-Instructでやってみました。
プロンプトの最適化は色々な場面に適用できる技術で、特にプロンプトの設計が重要になるローカルモデルでは今後も使われていくのではないかと思います。プロンプトエンジニアリングは精神的負荷も高く、個人的には可能な限り避けたいと思っているので、今後は適用できそうな場面を探って色々と検証していければと思います!
また、今回はリソースの関係で進化の有無によるモデルの性能向上については検証できませんでしたが、そちらも追々やっていこうと思います!
