llm prompting practices ja
2024.03.12
品質の高い参考資料をもとに LLM (大規模言語モデル)プロンプト作成のコツをかんたんにまとめました。
概要のみ記載しています。 詳細は各資料を参照してください。
プロンプトエンジニアリングのテクニックは公開されている資料である程度学習できます。 プロンプトエンジニアリングに関する(多くは情報弱者向けの)コース・商材・書籍の購入を検討されている方はぜひこれらの資料に先に目を通してみてください。
Prompt engineering - OpenAI API
6 つの戦略
- 明確な指示を書く
- 詳細を含める
- ペルソナを割り当てる
- 入力文の異なるパーツの間を明確に分ける
- タスクの完了に必要な手順を指定する
- 例を提示する
- 求める回答の長さを指定する
- 参考テキストを提供する
- リファレンステキストを使って回答するように指示する
- リファレンステキストからの引用を添えて解凍するように指示する
- 複雑なタスクをシンプルなサブタスクに分割する
- インテント分類を使ってユーザのクエリに関連性の高い指示を特定する
- 非常に長い会話を必要とする対話アプリケーションでは以前の対話を要約またはフィルタリングする
- 長い文書は断片的に要約してから再帰的に全体の要約を構築する
- モデルに考える時間を与える
- 結論に飛びつく前にモデル自身に解決策を見つけるように指示する
- インナーモノローグや一連のクエリを使ってモデルの推論プロセスを隠す
- 前のパスで何か見落としがなかったかモデルに尋ねる
- 外部のツールを使う
- embeddings ベースの検索を使って効率的な knowledge retrievel を行う
- code execution を使ってより精確な計算や外部 API 呼び出しをする
- モデルに特定の function へのアクセスを与える
- システマティックに変更をテストする
- ゴールドスタンダードの答えを参考にモデルの出力を評価する
Prompt design strategies | Google AI for Developers
プロンプトデザイン戦略
- 明確で具体的な指示を出す
- 実行すべきタスクを定義する
- すべての制約を指定する
- 回答のフォーマットを定義する
- 数個の例を含める
- zero-shot と few-shot プロンプト
- 例の最適な数を見つける
- 例はアンチパターン(べからず集)ではなくパターンを示すために用いる
- 提示する例では一貫したフォーマットを使う
- コンテキスト情報を加える
- プリフィックスを加える
- 入力プリフィックス
- 出力プリフィックス
- 例プリフィックス
- モデルに部分的な入力を与えて補完をさせる
- プロンプトをシンプルなコンポーネントにブレークダウンする
- 指示をブレークダウンする
- プロンプトのチェーンを作る(前のプロンプトの出力を次のプロンプトの入力にする)
- レスポンスを集約する
- さまざまなパラメータ値を試す
- 最大出力トークン
- Temperature (温度)
- Top-K
- Top-P
- プロンプトの改善サイクル戦略
- 異なる言い回しを使う
- 類似のタスクに切り替える
- プロンプトコンテンツの順序を変える
- フォールバックレスポンス
- 避けるべきこと
- 事実に関する情報の生成をモデルに頼るのは避ける
- 数学とロジックの問題には注意をして使う
Prompt Engineering for Generative AI | Machine Learning | Google for Developers
生成 AI のためのプロンプトエンジニアリング
プロンプト作成ベストプラクティス
- どのコンテンツ・情報が最も重要なのかを明確に伝える。
- プロンプトを構造化する: 役割の定義から始めて、コンテキストと入力のデータを与えて、指示を出す。
- 具体的で多様な例を使って、モデルが焦点を絞って精確な結果を生成できるようにする。
- 制約を与えてモデルの出力のスコープを制限する。そうすることで指示から逸脱して不正確な情報を出すのを避ける。
- 複雑なタスクはブレークダウンしてシンプルなシーケンスの連なりにする。
- モデルに自身の回答を生成する前に評価・チェックするよう指示する(「回答は 3 文以内にしてください。」「出力の簡潔さを 1 - 10 の尺度で評価してください。」「これが正しいと思いますか?」)。
プロンプトのタイプ
- ダイレクトプロンプティング( zero-shot )
- 例を付けたプロンプティング( one-shot / few-shot / multi-shot )
- CoT (Chain-of-Thought) プロンプティング
- zero-shot CoT
- プロンプトの改善サイクル戦略
Prompt engineering
- タスクと成功基準を定める
- 考えるべき主要な成功基準
- パフォーマンスと精度
- レイテンシー
- 価格
- テストケースを作る
- 暫定のプロンプトを作る
- テストケースに対してプロンプトを試す
- プロンプトを改良する
- ステップ 4 に戻って改良を繰り返す
- 磨き上げたプロンプトをリリースする
最初に最も能力の高いモデルと長いプロンプトから始めて、望ましいアウトプット品質が得られるようになったら、レイテンシーとコスト削減のためにより小さいモデルや短いプロンプトを試すとよい。
プロンプトエンジニアリングテクニック
- 明確に直接伝える
- 例を使う
- モデルに役割を与える
- XML タグを使う( Claude 固有)
- 大きなプロンプトを分ける
- モデルに step-by-step で考えさせる
- 期待する出力の先頭を指定する
- 出力フォーマットを指定する
- リライトをお願いする
- コンテキストウィンドウが長いモデルはそれを活用する
Prompt Engineering Guide
LLM 設定
名前 説明 temperature ランダムさの度合い。 temperature を上げるとランダムさが上がり、下げるとランダムさが下がる。 top P nucleus sampling (核サンプリング)と呼ばれるサンプリングの方法。 top P を高くすると回答の多様性が上がる。 max length 回答の最大長。単位はトークン数や文字数などモデルによって異なる。 stop sequence 回答の生成を停止する文字列パターン。 frequency penalty 特定のトークンの出現頻度のペナルティ。 presence penalty あらゆるトークンの出現頻度のペナルティ。 プロンプトの構成要素
プロンプトの構成要素として次のものを考慮するとよい。
名前 日本語 説明 instruction 指示 モデルに行ってもらいたいタスク context コンテキスト 外部情報や追加のコンテキスト input data 入力データ 回答を求める入力や質問 output indicator 出力インジケータ 出力のタイプやフォーマット 全般的なヒント
- シンプルに始めて改良を繰り返す
- 命令調で要望を指示する
- 具体的に直接的に
- 不正確さを避ける
- 「こうしないで」よりも「こうして」
プロンプト作成テクニック
- Zero-shot Prompting
- Few-shot Prompting
- CoT (Chain-of-Thought) Prompting
- Self-Consistency
- Generated Knowledge Prompting
- Prompt Chaining
- ToT (Tree of Thoughts)
- RAG (Retrieval Augmented Generation)
- ART (Automatic Reasoning and Tool-use)
- APE (Automatic Prompt Engineer)
- Active-Prompt
- Directional Stimulus Prompting
- PAL (Program-Aided Language Models)
- ReAct Prompting
- Reflexion
- Multimodal CoT Prompting
- GraphPrompt
リスクと誤用
- 敵対的プロンプティング(プロンプト攻撃)
- プロンプトインジェクション
- プロンプトリーキング
- ジェイルブレーキング(脱獄)
- 真実性
- バイアス