自作したRAGシステムの性能を評価してみた
企業や組織の中にしか存在しない情報を検索して回答してくれる仕組みがあったら嬉しいですよね。ということで、Microsoftのクラウド「Azure」を利用して構築した検索システム(RAG)の性能を評価してみました。
検索の流れは以下の通りです。
一度の問い合わせでGPTモデルを2回使うことが特徴になっています。

評価指標ですが、以下2つで評価しました。
⚫︎正答率 … 参照先と回答内容が正しかった確率 [%](高いほうが良い)
⚫︎虚偽回答率 … 参照先無しが正解だが誤回答してしまった確率 [%](低いほうが良い)
テストデータは以下のように、架空の企業名、部署名、商品名、人物名を10個ずつ使用しました。そのうち5個のデータを実際に保存し、残り5個はデータを保存せず、質問のみ行いました。

データありのテストケースでは、以下のようにユーザが求める情報を回答できたことを確認しました。

⚫︎正答率 = 正答回数20回 / 全試行回数20回 = 100 [%]
データなしのテストケースでは、以下のようにユーザが求める情報が無い旨回答できたことを確認しました。

⚫︎虚偽回答率 = 虚偽回答回数0回 / 全試行回数20回 = 0 [%]
ということで、どちらの評価指標についても良い結果が得られました。
品質のポイントは、いわゆる
「プロンプトエンジニアリング」の部分であると感じています。
プログラムコードの中で言うと、以下が該当の部分となります。
# チャットモデルへのリクエスト
final_response = openai.ChatCompletion.create(
engine="my-chat-model",
temperature=0.2,
timeout=10,
messages=[
{
"role": "system",
"content": (
"あなたは外部データソースを活用し、ユーザーの質問に対して正確かつ簡潔に回答を提供するアシスタントです。\n"
"提供された検索結果とユーザーの質問が意味的に関連しているかを厳密に判断してください。\n"
"以下の基準で判断を行ってください:\n"
"1. 質問と検索結果の固有名詞、キーワード、話題が明確に一致しているかを確認する。\n"
" - 部分的な一致(例: 「部署」 という単語のみの一致)は不十分とする。\n"
" - 企業名や特定の話題が直接一致しない場合は関連がないと判断する。\n"
"2. 検索結果の内容が、質問の意図に対して直接的な情報を提供しているか確認する。\n"
" - 例: 「企業の部署」に関する質問なのに「企業の事業内容」に関する情報しかない場合、関連がないとみなす。\n"
"3. 関連する情報がない場合、『情報がありません』と回答する。\n"
" - 無理に情報をこじつけたり、推測を含めて回答しないこと。\n"
" - 質問の主語(企業名・人物名など)と検索結果の主語が一致しない場合も『情報がありません』とする。\n"
"4. 関連がある場合のみ、検索結果の内容を簡潔にまとめて回答を作成する。\n"
" - 検索結果に基づかない推測を追加しないこと。\n"
" - 回答を簡潔にまとめ、不要な情報は省略する。\n"
"5. 検索結果のリンク情報については言及しない。\n"
" - 検索情報が参考リンクとしてユーザーに別途提供されるため、回答中では触れない。\n"
)
},
{
"role": "user",
"content": user_input
},
{
"role": "assistant",
"content": (
f"検索で以下の情報が見つかりました:\n{retrieved_texts}\n"
"検索結果と質問の関連性を厳密に評価します。\n"
"関連がない場合は『情報がありません』と回答し、関連がある場合のみ、検索結果を基に簡潔に回答します。\n"
"検索結果にない情報を推測で補うことは禁止します。\n"
)
},
]
)temperatureというパラメータが正確性の指標になっています。
設定しているtemperature=0.2だと、厳密な回答をする可能性を高めることができます。ただし、創造性に乏しくなるため注意してください。
RAGシステムで重要なことは、検索で引っかかったデータがユーザの求めるデータか否かをGPTモデルが判断するということです。
この点において、まだRAGシステムは発展途上にあり、ChatGPTだけでなく、他の生成AIを含めて、未来のある仕組みと考えています。
DeepSeekなど他のモデルと性能を比較すると、面白い結果が得られるかもしれません。
今回の結果やRAGシステムについて、思うところがあれば遠慮なくコメント戴ければと思います。
最後までお読み頂き、ありがとうございました。
