大規模言語モデルの有効性は、ユーザーが与える指示に大きく依存します。プロンプト エンジニアリングは、LLM から最適な出力を得るように質問を作成するプロセスです。これは、LLM ベースの機能を実装するうえで重要なステップです。
プロンプト エンジニアリングは反復的なプロセスです。さまざまな LLM を試したことがある方は、より良い結果を得るためにプロンプトを調整する必要があることに気づいたかもしれません。
これは、サイズの異なるモデルにも当てはまります。
Gemini や ChatGPT などの大規模な LLM を搭載したチャット インターフェースでは、最小限のプロンプトで満足のいく結果が得られることがよくあります。ただし、ファインチューニングされていないデフォルトの小規模な LLM を使用する場合は、アプローチを調整する必要があります。
LLM が小さいほど、能力が低く、引き出す情報のプールも小さくなります。
「小規模な LLM」とはどういう意味ですか?
LLM のサイズの定義は複雑で、メーカーによって常に開示されるとは限りません。
このドキュメントでは、「小規模な LLM」とは 300 億個未満のパラメータを持つモデルを指します。現在、数百万から数十億のパラメータを持つモデルは、一般消費者向けのデバイスのブラウザで現実的に実行できます。
小型の LLM はどこで使用されていますか?
- オンデバイス/ブラウザ内生成 AI。たとえば、MediaPipe の LLM 推論 API で Gemma 2B を使用している場合(CPU のみのデバイスにも適しています)、または Transformers.js でブラウザ内の DistilBert を使用している場合などです。モデルをダウンロードしてユーザーのデバイスで推論を実行できるのは、ウェブ ダウンロードを妥当な範囲に抑え、デバイスのメモリと GPU/CPU の制約に適合させるために、これらの小規模な LLM のみです。
- カスタム サーバーサイド生成 AI。Gemma 2B、Gemma 7B、Gemma 27B などの小規模なオープン ウェイト モデルは、独自のサーバーで実行できます(必要に応じてファインチューニングも可能です)。
始める
Gemini や ChatGPT などの大規模な LLM を搭載したチャット インターフェースでは、プロンプトの労力を最小限に抑えながら、満足のいく結果が得られることがよくあります。ただし、小規模な LLM を使用する場合は、アプローチを適応させる必要があります。LLM が小さいほど、能力が低く、引き出す情報のプールも小さくなります。
コンテキストと正確な形式の指示を提供する
小規模な LLM で最適な結果を得るには、より詳細で具体的なプロンプトを作成します。
次に例を示します。
Based on a user review, provide a product rating as an integer between 1 and 5. \n
Only output the integer.
Review: "${review}"
Rating:
| 入力(レビュー) | 出力(評価) | |
|---|---|---|
| 大規模な LLM(Gemini 1.5) | 小規模な LLM(Gemma 2B) | |
| フィット感が最高です。重量をうまく分散し、一日中のトレッキングでも驚くほど快適です。おすすめします。 | 5 | 5 つ星中 4 つ星** |
| ストラップが薄く、重い荷物を入れると肩に食い込み始めました。 | 1 | 2/5 |
Gemini 1.5 はこのシンプルなプロンプトで目的の出力を提供しますが、Gemma の出力は満足のいくものではありません。
- 形式が正しくありません。評価には整数をリクエストしました。
- 評価が正確ではないようです。最初のレビューは、5 つ星のレビューを示すのに十分な熱意があります。
この問題を解決するには、プロンプト エンジニアリング手法であるワンショット、少数ショット、マルチショット プロンプトとChain-of-Thought プロンプトを使用する必要があります。また、明確な形式の指示を提供し、モデルが評価の全範囲を使用するように要求する必要があります。
次に例を示します。
`Analyze a product review, and then based on your analysis give me the
corresponding rating (integer). The rating should be an integer between 1 and
5. 1 is the worst rating, and 5 is the best rating. A strongly dissatisfied
review that only mentions issues should have a rating of 1 (worst). A strongly
satisfied review that only mentions positives and upsides should have a rating
of 5 (best). Be opinionated. Use the full range of possible ratings (1 to
5). \n\n
\n\n
Here are some examples of reviews and their corresponding analyses and
ratings:
\n\n
Review: 'Stylish and functional. Not sure how it'll handle rugged outdoor
use, but it's perfect for urban exploring.'
Analysis: The reviewer appreciates the product's style and basic
functionality. They express some uncertainty about its ruggedness but
overall find it suitable for their intended use, resulting in a positive,
but not top-tier rating.
Rating (integer): 4
\n\n
Review: 'It's a solid backpack at a decent price. Does the job, but nothing
particularly amazing about it.'
Analysis: This reflects an average opinion. The backpack is functional and
fulfills its essential purpose. However, the reviewer finds it unremarkable
and lacking any standout features deserving of higher praise.
Rating (integer): 3
\n\n
Review: 'The waist belt broke on my first trip! Customer service was unresponsive too. Would not recommend.'
Analysis: A serious product defect and poor customer service experience naturally warrants the lowest possible rating. The reviewer is extremely unsatisfied with both the product and the company.
Rating (integer): 1
\n\n
Review: 'Love how many pockets and compartments it has. Keeps everything organized on long trips. Durable too!'
Analysis: The enthusiastic review highlights specific features the user loves (organization and durability), indicating great satisfaction with the product. This justifies the highest rating.
Rating (integer): 5
\n\n
Review: 'The straps are a bit flimsy, and they started digging into my shoulders under heavy loads.'
Analysis: While not a totally negative review, a significant comfort issue leads the reviewer to rate the product poorly. The straps are a key component of a backpack, and their failure to perform well under load is a major flaw.
Rating (integer): 1
\n\n
Now, here is the review you need to assess:
\n
Review: "${review}" \n`;
| 入力(レビュー) | より小さな LLM(Gemma 2B)での出力 |
|---|---|
フィット感が最高です。重量をうまく分散し、一日中のトレッキングでも驚くほど快適です。おすすめします。 |
分析: このレビューは非常に肯定的で、商品のフィット感と快適さが強調されており、商品に対する満足度が非常に高いことがわかります。このため、高い評価が妥当です。 評価(Rating)(整数): 5 |
ストラップが薄く、重い荷物を入れると肩に食い込み始めました。 |
**分析:** レビューでは、ストラップの快適性に関する重大な問題が指摘されています。また、重い荷物や長時間の外出には適していない可能性も示唆しています。 **評価:** 1(最悪) |
より詳細なプロンプトと、少数ショット プロンプトと Chain-of-Thought プロンプトの手法を組み合わせることで、より正確な評価が得られます。
手動出力解析を想定する
LLM の出力は常に手動でクリーンアップして解釈する必要がありますが、特に小規模な LLM では、結果の精度が低くなる可能性があるため、Chain-of-Thought プロンプトが必要になることがあります。
最初の例では、Chain-of-Thought プロンプトを使用しているため、出力には分析と評価の両方が含まれています。評価を手動で解析する必要があります。また、前のセクションの出力の形式が一貫していないことにも注意してください。モデルはマークダウンを出力することがありますが、毎回ではありません。
// Use try/catch to catch (parsing) errors
try {
// Parse the output for a rating
const int = /[1-5]/;
const ratingAsString = llmOutput.match(int)[0];
// Parse as int
const ratingAsInt = parseInt(ratingAsString);
// `checkRating` checks the rating is a number between 1 and 5, since the
// regEx may catch a number like "100"
const finalRating = checkRating(ratingAsInt);
} catch (e) {
console.error('Error', e);
}
Mind API の違い
Gemini API や OpenAI などの LLM クラウド API は、通常、大規模な LLM へのエントリ ポイントであり、便利なプロンプト機能を提供します。たとえば、Gemini 1.5 Pro にはシステム指示と JSON モードがあります。
現時点では、これらの機能は、カスタムモデルの使用や、MediaPipe LLM 推論 API や Transformers.js などのブラウザ内 AI API を使用してアクセスする小規模な LLM では、常に利用できるとは限りません。これは必ずしも技術的な制限ではありませんが、ブラウザ内 AI API はより軽量になる傾向があります。
トークンの上限に注意する
小さい LLM のプロンプトには、例や詳細な指示を含める必要があるため、長くなる可能性があり、入力トークンの上限がある場合は、その上限をより多く消費する可能性があります。
また、モデルが小さいほど、入力トークンの上限が小さくなる傾向があります。たとえば、Gemini 1.5 Pro には 100 万トークンの入力トークン上限があり、Gemma モデルには 8K コンテキスト ウィンドウがあります。
トークン数関数を使用して、上限に達しないようにします。
所要時間の見積もりを調整する
エンジニアリング時間の見積もりで、プロンプトの設計とテストを考慮します。
API の違いとトークン上限により、大規模な LLM よりも小規模な LLM の方が、プロンプトの作成に時間と労力がかかる可能性があります。LLM の出力をテストして検証する作業も増える可能性があります。
プロンプト エンジニアリングとファインチューニングのどちらを使用すべきか?
ウェブ デベロッパーにとって、プロンプト エンジニアリングは、カスタム トレーニングやファインチューニングよりも生成 AI を活用するのに適した方法です。ただし、高度なプロンプト エンジニアリングでも、特に小規模な LLM を使用している場合は、一部のユースケースで十分でない可能性があります。
ファインチューニングは次の場合に使用します。
- 特定のタスクで最高の精度とパフォーマンスが必要な場合。ファインチューニングでは、最適な結果を得るためにモデルの内部パラメータを直接調整します。
- タスクに関連する、適切にキュレートされたデータがあり、望ましい出力でラベル付けされている。効果的なファインチューニングにはこのデータが必要です。
- モデルを同じ目的で繰り返し使用する。ファインチューニングは 1 回だけ行い、特定のタスクに再利用できます。