背景
現在弊社ではllmを使った新しいサービスを開発しています。その中で初めてプロンプトエンジニアリングをやってみたので、1ヶ月ほどで学んだことをまとめてみました。
この1ヶ月、試行錯誤をしながら試してみて、まずはプロンプトの評価、改善をする土台を作ることができました。
tldr;
- llmの出力は決定的ではない。つまりプロンプトには絶対解がないためPDCAを回す漸次改善が必要。
- 出力に影響を及ぼす要素は大きく5つ。llm設定、命令、コンテキスト、入力、出力
- プロンプト結果の評価項目や評価方法は多岐にわたるため事前に検討が必要。
- OpenAIのダッシュボードに色々と便利機能があるため活用。
プロンプト作成 / 改善のレバー
| Genre | detail | 例 |
|---|---|---|
| llm設定 | ||
| モデル | 5-mini vs 5-nano | |
| config | OpenAIなら verbosityやeffort など | |
| 命令 | ||
| 整合性 | プロンプト命令全体の整合性 | |
| トンマナ | 命令のトンマナの統一 | |
| ペルソナ | ペルソナを与えておく | |
| 指示の詳細度 | 抽象を保ちつつ、具体、詳細を与えた方が良い。latency / costとトレードオフ | |
| 指示の順序 | 指示の順序を置き換えると、出力が変わる。OpenAIだと上部におくほど優先される印象。 | |
| 達成したい目的のステップ化 (CoT) | 目的達成までをステップ化し、考える道筋と中間結論による自省を行う | |
| 例の提供 (Few-shot) | 出力例を提供 | |
| Context | ||
| 型 (string ? JSON? ... etc,) | 構造化されたデータ (を中身の説明とともに)付与する方が検索精度が高くなるらしい。 | |
| 量 | inputTokenの制限の範囲内で、データ量によってどのくらい出力が変わるか | |
| 質 | カラム数やデータのラベルなど | |
| ユーザー入力データ | ||
| シングル | テキスト、音声、画像... | |
| マルチ | 上記要素の組み合わせ | |
| 出力指示 | ||
| 種別 | テキスト、音声、画像... | |
| 型 | UI / UX を考慮しスキーマを強制 | |
| 外部ツール | ||
| RAGやPrompt Chaining | より複雑なタスクを実行させる際に利用 |
プロンプトの評価
評価項目
- 白黒つけやすい評価項目
- セキュリティ
- 特定の出力をさせる / させない
- プロンプトインジェクション耐性
- 正確性
- 言っていることが正しいかどうか
- 検索や順位づけを正確にできるかどうか
- Latency (レスポンス時間)
- Cost (token)
- セキュリティ
- 白黒つけづらい項目
- 親切さ / トンマナ
- 完全性 / 冗長性
- 回答の深さ
- 創造性
評価方法
- 評価基準
- 相対評価と絶対評価の2通りが存在。白黒はっきりしている評価項目は採点しやすいが、白黒つけづらい項目について細かく評価することは難しい。
- 特に人が評価する場合、絶対評価では体調や精神面などにより点数がブレやすい。相対評価の方がしやすい (AとBどちらが良いか)
- llm自体にプロンプトの出力結果を評価をさせることも可能。しかしその場合は、評価基準を明確に与える必要があり、プロンプト評価用のプロンプトの調整が必要
- Tips
- テストデータのアップロードや評価などOpenAIのダッシュボードに便利な機能があるため、それを利用して素早くPDCAを回す
評価について参考にした文献
- Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena (https://arxiv.org/pdf/2306.05685)
- Chatbot Arena: An Open Platform for Evaluating LLMs by Human Preference (https://arxiv.org/pdf/2403.04132)