今さらLLMのモデルの違いとプロンプトエンジニアリングについて
まとめ
Ollamaですごく簡単にLLMを動かせたけど… (2023-12-29) | あーありがち 以来、LLM については、自分が調べたものの理解が概ね合っているか確認するとか、ちょっといじわるな問答をして確かめるみたいな、普通に使ってみる以外にアプリケーション開発に組み込んだりはしないまま時間だけが過ぎていた。今回は、2024年にもそれなりに新しいモデルが発表されているし、現状をもう一度おさらいし、以前概念だけをさらって分かった気になっていた部分を復習しながらより具体的に考えられるように何かやらせてみようとして、いろいろ分かっていないことに気付かされた話。
まずローカルでも動かせるツール周りの状況
上記時点からローカルのマシンスペックなどもろもろ変わっていないので、以下、主観的な比較はすぐできる前提。
- 2023年末にたどり着いていた Ollama については引き続き安定して使える
- むしろ対応モデルも増え、Hugging Face から直接 run のコマンドラインがコピペできるようになり、環境的には完全に追い風
- Google Gemma2 が 2B でもちょっと動かすレベルではなんかすごく性能がよい
Gemma2 2B モデルについては本当に予想以上だった。以前は他の 7B モデルを頑張って量子化して使ってみたうえで、「えーこんなもんか?」という感じだったけど、これはだいぶ嬉しい誤算。クラウドや API の利用料金を気にせずアプリケーションコードをガンガン回せるのは全体構造を考えたりする時にとてもありがたい感じがする。
Langchain.rbはまだ荒削りだった
- Ollama + Gemma2 2B + Langchain.rb で単純なプロンプトを機械的に動かすものを書いた
- Langchain::LLM::Ollama が出力を適切に処理できずに例外で止まるケースがある
patterns-ai-core/langchainrb: Build LLM-powered applications in Ruby
おーん。あんまり Ollama + Langcharin.rb で使われてなくて、結局みんなクラウド API を叩いてる感じなのかなぁ。コントリビュートチャンスではあるけど、ちょっと今はもっと全体感を知りたい過程なのでいったんスルー。
ということで切り替えて
flori/ollama-ruby: Ollama Ruby Library
でやってみる。一応やりたいことはできた。
モデルの挙動に苦しみ、モデルの違いを知る
ここから面白かったところ。
- 要約のタスクを依頼した
- ずっと元気に会話してくれる。与えた文章を「あなた」1と結びつけて語りかけてくる
- 要約自体はおかしくないが、要約の内容を寸評し、新たな提案を投げかけてくる
- プロンプトを「要約だけして余計なことを言わないように」指示しても無視する
お? いろいろプロンプトをいじってみてもどうにもならなくて「これは無理」と結論付けた。
で、このあとローカル LLM を諦め、Google AI を利用してモデルを変えて試していくと、一気に LLM に対する無理解が分かってきた。
引き続き「要約」タスクでやっていくと、以下のような傾向になった。
モデル | 傾向 |
---|---|
Gemma2 Baku 2B it | 「あなた」呼び、「提案」が止まらない |
Gemma2 27B it | 「会話」感は拭えないが「あなた」呼びではない |
Gemini 1.5 Flash | 元の「だ・である調」も維持できるし、かなり自然 |
なるほどー。でかいモデルってほんとにすごいんだな(小並感
ファインチューニングに失敗する
これは半分以上は予想通り。
- 普通の長文の要約に合う都合のいいデータセットはない
- ニュース向けはある
とりあえずBBCニュースを元にしたデータセットで試してみた。方法は Google AI Studio に付いている機能2。
結果、
- 要約文が短すぎる
- 学習した要約より長い文章の出力を指定すると意味を成さない同じ文言のくり返しで「埋め」てくる
という挙動になった。これなら学習しない方がマシ。今回はサンプル数500でチューニングしたんだけど、これは
ファインチューニングで、汎用的な要約モデルを作るためのデータセット設定
によると、どうも多すぎるようだ3。しかも欲しい要約のサイズとも合っていないし、まぁそんなもんだろうと思う。ただファインチューニングで結構大きく出力が変わることは分かった。
ここまで分かったこと
ここから予測できることは
- 小さなモデルは大きなモデルより単純なプロンプトエンジニアリングでの制御が難しくなる
- instructモデルの学習次第ではあるが、instruct傾向がより顕著に出る
- 安易にチューニングするより、大きなモデルを安定して利用するためのプロンプトエンジニアリングの方が、出力や用途を探っている段階では有用
ファインチューニングについては目的に応じて適切な手法と適切なデータセットが必要で適切なボリュームが重要になってくることが分かった。試行錯誤をくり返すことになるので検証用データセットで自動テストする仕組みを作るのが大事そうだけど、これは実際に必要になってから詰めようと思う。