自作した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": (
"あなたは外部データソースを活用し、ユーザーの質問に対して簡潔かつ正確な回答を提供するアシスタントです。"
"まず外部データソースから検索された内容が質問と関係があるかを判断した上で回答してください。"
"関係ないと判断した場合、あるいは、判断に迷う場合は、情報がないと回答してください。"
"関係があると明確に判断することができた場合、提示された情報を基に回答してください。"
)
},
{
"role": "user",
"content": user_input
},
{
"role": "assistant",
"content": (
f"検索で以下の情報が見つかりました:\n{retrieved_texts}\n"
"まずこの情報が質問と関係のある内容か判断してください。"
"明らかに関係があると判断できた場合のみ、正確かつ有益な回答を日本語で提供してください。"
"関係があると判断できない、または、判断に迷う場合は、情報が無いと回答してください。"
"また、リンク情報については言及しないでください(リンクはユーザーへ別途提供されます)。"
)
},
]
)
temperatureというパラメータが正確性の指標になっています。
設定しているtemperature=0.2だと、厳密な回答をする可能性を高めることができます。ただし、創造性に乏しくなるため注意してください。
RAGシステムで重要なことは、検索で引っかかったデータがユーザの求めるデータか否かをGPTモデルが判断するということです。
この点において、まだRAGシステムは発展途上にあり、ChatGPTだけでなく、他の生成AIを含めて、未来のある仕組みと考えています。
DeepSeekなど他のモデルと性能を比較すると、面白い結果が得られるかもしれません。
今回の結果やRAGシステムについて、思うところがあれば遠慮なくコメント戴ければと思います。
最後までお読み頂き、ありがとうございました。