小規模な LLM 向けの実用的なプロンプト エンジニアリング

Maud Nalpas
Maud Nalpas

大規模言語モデルの有効性は、与えられた指示に大きく依存します。プロンプト エンジニアリングとは、LLM から最適な出力が得られるように質問を作成するプロセスです。これは、LLM ベースの機能を実装するうえで重要なステップです。

プロンプト エンジニアリングは反復プロセスです。さまざまな LLM を試したことがあるなら、より良い結果を得るためにプロンプトを微調整する必要があることにお気づきでしょう。

これは、サイズの異なるモデルについても同様です。

Gemini や ChatGPT などの大規模な LLM を利用したチャット インターフェースは、多くの場合、最小限のプロンプト労力で満足のいく結果を生成できます。ただし、微調整されていないデフォルトの小さな LLM を使用する場合は、アプローチを適応させる必要があります。

小さい LLM は性能が低く、引き出せる情報プールも限られています。

「より小規模な LLM」とはどういう意味でしょうか?

LLM サイズの定義は複雑で、メーカーが常に開示しているとは限りません。

このドキュメントでは、「より小さな LLM」とは 300 億のパラメータ未満のモデルを意味します。現在、数百万から数十億のパラメータを持つモデルは、現実的に一般ユーザー向けのデバイスのブラウザで実行できます。

小規模な LLM はどこで使用されますか。

  • デバイス/ブラウザ内生成 AI。たとえば、MediaPipe の LLM Inference API とともに Gemma 2B を使用している場合(CPU のみのデバイスにも適しています)、またはブラウザで Transformers.js を備えた DistilBert を使用している場合。ユーザーのデバイスでモデルをダウンロードして推論を実行するには、こうした小さな LLM を使用する必要があります。これは、ウェブ ダウンロードを合理的に保ち、デバイスのメモリと GPU/CPU の制約に合わせて調整するためです。
  • カスタムのサーバーサイドの生成 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)

このフィット感は大好きです!体重を均等に分散。一日中のトレッキングでも、驚くほど快適に使用できます。おすすめします。

分析: このレビューは非常に好意的で、商品のフィット感と快適さが強調されており、商品に非常に満足しています。これは高い評価の理由です。

評価(整数): 5

ストラップが薄く、重い荷重がかかると肩に入り込み始めた。

**分析:** レビューでは、ストラップの快適性に大きな問題があることが強調されています。また、重い負荷や長時間の外出には適さない可能性があることも示唆しています。

**評価:** 1(最低)

より複雑なプロンプトと、少数ショット プロンプトおよびチェーン オブ ソート プロンプトの手法を組み合わせることで、より正確な評価が得られます。

手動出力解析を想定する

LLM の出力は常に手動でクリーンアップして解釈する必要がありますが、これは特に、洗練度の低い結果を生成し、Chain-of-Thought プロンプトを必要とする小規模な LLM に当てはまります。

最初の例では、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 Cloud API は、一般的に大規模な LLM のエントリ ポイントであり、便利なプロンプト機能を備えています。たとえば、Gemini 1.5 Pro にはシステム手順JSON モードが用意されています。

現時点では、カスタムモデルを使用する場合や、MediaPipe LLM Inference APITransformers.js などのブラウザ内 AI API を使用してアクセスする小規模な LLM では、これらの機能を常に利用できません。これは必ずしも技術的な制限ではありませんが、ブラウザ内 AI API のほうが効率的である傾向があります。

マインド トークンの上限

小規模な LLM のプロンプトには例や詳細な手順を含める必要があるため、入力トークンの上限(ある場合)は長くなり、より多くの入力トークンを消費します。

また、モデルが小さいほど、入力トークンの上限が小さくなる傾向があります。たとえば、Gemini 1.5 Pro では入力トークンの上限が 100 万ですが、Gemma モデルには 8K コンテキスト ウィンドウがあります。

上限に達しないように、トークンカウント関数を使用します。

推定所要時間を調整する

エンジニアリング時間の見積もりで、プロンプト設計とテストを考慮します。

API の違いとトークンの制限により、大規模な LLM よりも小さな LLM 用のプロンプトを作成するのに多くの時間と労力が必要になる可能性があります。LLM の出力のテストと検証にも労力がかかる場合があります。

プロンプト エンジニアかファインチューニングか

ウェブ デベロッパーにとって、生成 AI を活用する方法としては、カスタム トレーニングや微調整よりもプロンプト エンジニアリングが推奨されています。ただし、ユースケースによっては、特に小規模な LLM を使用する場合は、高度なプロンプト エンジニアリングでも十分でない場合があります。

ファインチューニングは次の場合に使用します。

  • 特定のタスクに対して最高水準の精度とパフォーマンスが必要な場合。ファインチューニングは、最適な結果を得るためにモデルの内部パラメータを直接調整します。
  • タスクに関連する適切にキュレートされたデータがあり、すでに適切な出力でラベル付けされている。このデータは、効果的なファインチューニングに必要です。
  • 同じ目的でモデルを繰り返し使用する。ファインチューニングは 1 回行い、特定のタスクに再利用できます。