Open4

プロンプトの品質をどう評価するか?

onaka_hettaonaka_hetta

チャットでユーザの問い合わせに対して、RAGで取得したデータをコンテキストとし、振る舞い・口調などを定義したうえで回答を生成するアプリを作る。

プロンプトを書いてみたはいいものの、そのプロンプトが要件に適っているかをどう評価するのが良いのかがわからず、試行錯誤する過程をスクラップとして残してみる。

onaka_hettaonaka_hetta

なぜ私は「どう評価していいかわからない」のか?

頭の中を整理してみる。

出力に再現性がないこと

LLMの出力はその時々によって変わりうる。
1回試してみて問題なかったからと言って、それで品質を担保したと言い切ることはできない。
単純に複数回テストするなどすればいいかもしれないが、ではどのくらいテストすればよいのだろう?

LLMの出力の評価方法

LLMの出力は単純な文字列比較で良し悪しを評価することはできないことも多い。
でも、限りなくヒューリスティックな評価を避けて、出力の評価を自動化したいとき、どうしたらよいだろう?

onaka_hettaonaka_hetta

以下、試してみる評価方法をメモしていく。

期待する回答かどうかをLLMに聞く

「どういう回答を生成してほしいのか」と「実際に生成された回答」をLLMに渡して、期待する回答かどうかをLLMに答えさせるテスト用のプログラムを作る。
繰り返し実行したり、自動テスト化も容易なので、人間が介在しなくてもある程度の品質は担保できそう。
テスト回数についても、LLMに回答させる料金が許容範囲内になるなら問題なさそう。

課題になりそうなところ

ドメイン情報が含まれるような回答が期待値になる場合は、学習していない限りLLMはその回答の意味解釈ができないので配慮する必要がありそう。

onaka_hettaonaka_hetta

期待回答と出力回答のベクトル類似度を測る

「想定回答とLLMの回答をそれぞれベクトル化し、類似度が一定数値以上になるか?」というアプローチはある程度有効な気はする。

課題になりそうなところ

しかし、システム要件的には大抵「ユーザにマストで回答すべき情報」(例えば免責事項など)があり、回答全体を単純にベクトル類似度で比較するだけでは、その部分を考慮できない。
LLMに「{具体的な要件}は回答されているか?」をマルバツで回答させればフォローできるかも。