生成AIの判定精度向上を目的としたプロンプトエンジニアリング
はじめに
システムゼウスの杉山です。
研修で行われている一問一答形式でのSQL学習の効率化を目的として、生成AIを活用した自動判定システムを開発しました。
今回開発したシステムを例として、精度向上の為にプロンプトに行ったことを紹介したいと思います。
開発で使用した基盤モデルはClaude 3.5 sonnet v2です。
Claudeについて↓
対象読者
プロンプトの改善で生成AIの精度向上を目指している方
例で使用するシステム概要
- 生成AIを使用した正誤判定
- データベースによる問題・解答管理
- 改善提案の提供
回答プロセス
- ユーザーがSQLを入力
- DBから問題情報と模範解答を取得
- 判定処理
- フィードバックの生成と表示
初期アプローチで発生した課題
最初のアプローチでは、単一のプロンプトで以下のすべての要素を確認しようとしていました。
- SQL構文の正確性
- 問題の条件との適合性
- 実行結果の正確性
- 最終的な正誤判定
しかし、この方法では以下の問題が発生しました。
- 構文エラーの見落とし
SELECT * FMRO table;
//例:FROMのスペルミス
- 条件チェックの不完全性
例:「身長の昇順で表示」とある問題で昇順出力していないのに正解となってしまう。 - 出力フォーマットの揺れ
例:「正誤判定:〇or✕」と指定していても、「正解」と出力されてしまうことがある。
対策
発生した課題に対して、以下3つの対策を行いました。
XML形式での記述
最初に、公式のドキュメントを参考にしてXML形式のプロンプトに変更しました。
具体的には確認項目や出力をそれぞれセクションで区切り、タグ名を付けて指示の中で「(タグ名)を使用して判断してください。」といった書き方をしました。
主なメリット
- 構造化された情報の明確な区分け
- 基盤モデルの理解しやすさ
- 出力フォーマットの固定化
各問題ごとの補足情報を追加
ユーザーに表示している問題文とテーブル定義をプロンプトに組み込むだけでは、正確に条件を読み取れず同じSQLを判定させても回答が揺れてしまい使用できるレベルにはなりませんでした。
そこで、問題固有の条件や制約を明確に伝えるために、問題ごとに補足情報を作成してプロンプトに追加しました。
<補足情報>
- 使用すべきテーブル名の指定
- 必要な結合条件
- 特定の関数使用の制限事項
</補足情報>
プロンプト分割
トークン数削減による精度向上を目的として確認項目をタスクとしてを3つに分割し、その結果を元に判定を行うことで精度を向上させることが出来ました。
行った対策の中でも最も効果を実感できたアプローチになります。
タスクに割り当てた情報
タスク | 内容 | 与えた情報 |
---|---|---|
構文チェック | SQL構文の正確性を確認 | 回答 |
条件チェック | 問題の条件との適合性を確認 | 回答・問題文・補足情報 |
実行結果予測 | 実行結果を予測して判断 | 回答・問題文・補足情報・模範解答・テーブル定義 |
最終判定 | 各タスク結果を元に正誤判定 | 各タスク結果 |
参考記事↓
検証結果
検証方法
- 対象:70問のSQL問題
- テストデータ : 正解の回答4パターンと不正解の回答1パターンを用意
- 合計判定回数: 1,750回(70問 × 5パターン × 5回)
結果
- 改善前:82.5%
- 改善後:98.7%
まとめ
プロンプト分割はサブタスク化により判断揺れを抑制し、コストは増加(約4倍)しますが精度は十分に確保出来たように感じます。
生成AIシステムでは、単一の多機能プロンプトより明確に責任分担した複数プロンプトの組み合わせが高信頼性をもたらすことが判明しました。
免責事項
作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。
Discussion