【AWS】Bedrock EvaluationsでLLM as a Judgeをしてみる

はじめに
--
前回、Bedrockを使用したナレッジベースを作成した。

https://qiita.com/tomoya-Miyake/items/4b3f9d0d8750c69481f6

今回は、Bedrockの自動ナレッジベース評価 (Knowledge Base evaluation) 機能を
使用して、RAG (Retriever-Augmented Generation) の性能を評価してみる。


Knowledge Base Evaluationとは
--
Amazon Bedrockで作成したナレッジベースのパフォーマンスを評価するプロセス。
特に、RAG（Retriever-Augmented Generation）の評価において、検索機能と生成された応答の正確性を測定できる。

<主な特徴>
　■ 自動化された評価
　　手動で評価せず、ナレッジベースの精度を自動的に検証できる
　■ カスタマイズ可能な評価基準
　　関連性、正確性、信頼性など、評価項目を自由に設定できる
　■ 改善のフィードバック
　　評価結果を基にナレッジベースの精度を向上させることができる

　また、LLM (Large Language Models) を評価の基準として使用するため、
　生成された応答の「品質」や「信頼性」を判断する。
　これにより、AIが生成する結果が機械的に評価され、品質管理が効率化される。
 (LLM as a Judgeのことだと理解している)
 下記が参考になります
 
 https://zenn.dev/pharmax/articles/2d07bf0498e212


目的要件
--
自動評価の作成を通じて、Bedrockで構築したRAGの性能を評価し、その精度を確認する。
評価基準を設定し、RAGの精度を評価するために必要なパラメータを明確にする。
ナレッジベースは前の記事で作成したものを使用する。



実装手順
--
0.　ナレッジベースの作成(前回実施のため割愛)
1.　評価用のプロンプトデータセットの作成
2.　評価基準の設定
3.　評価結果


1.評価用のプロンプトデータセットの作成
--
以前作ったナレッジベース中で、テスト的に質問と回答のプロンプトデータセットを作成する。

```
質問例：アイスクリーム類の定義にはどのような基準がありますか？
回答例：アイスクリーム類の定義には、食品衛生法（昭和22年法律第233号）の規定に…
```
上記回答セットで、jsonlファイルを作成する。

https://docs.aws.amazon.com/bedrock/latest/userguide/knowledge-base-evaluation-prompt.html

公式を参考にデータセットを作成するとエラーが出るので注意！！
(括弧の数があってないので下記参照で。)

<エラー内容>
```
Invalid input or configuration provided. Check the input and Knowledge Base configuration and try your request again.
```

<うまくいった形>
```
{"conversationTurns": [{"prompt": {"content": [{"text": "hogehoge"}]},"referenceResponses": [{"content": [{"text": "hogehoge"}]}]}]}
```



作成したデータセットをBetrockと紐づいているS3に格納する。



2.評価基準の設定
--
コンソールにて、「Amazon Bedrock」 
⇒ 左側のタブより「Inference and Assessment」中の「Evaluations」を選択
⇒ 「Models」,「RAG」で、「RAG」を選択し、Createボタンを押下

![top.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/ee2fb463-80b0-4360-af58-8087bc0f239a.png)


まず、「Evaluation name」と「Evaluator model」を決める

![mode.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/11a16cf4-ba10-45b1-bd8d-39d5f9a1d9e9.png)

今回はMetaの「Llama 3.1 70B Instruct」にした。
![meta.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/2ce1baf9-9493-4f4b-ab9a-b9f79250041b.png)


・ナレッジベースの選択
　ナレッジベースの一覧から、評価したいRAG用のナレッジベースを選択
　(前回作成したナレッジベースを使用)

・評価タイプの選択
　↓2パターンのうちどちらかを選択

 　■ Retrieval and response generation (検索および応答生成)
　　情報検索と生成された応答を両方評価
　　データソースから情報を検索し、生成された応答の精度を測定

　 ■Retrieval only (検索のみ)
　　検索結果のみを評価し、実際に情報を抽出した後の回答生成は行わない
　　既に抽出された情報とその回答を評価
 
![so1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/45db95b1-8a9b-47aa-9904-ba5d1a8f3a08.png)


・評価パラメータを選択
　Quality（品質）とResponsible AI（責任あるAI）それぞれ出力する内容を決める必要がある

　■Helpfulness（有用性）
　　質問に対する応答がどれほど有用で包括的であるか

　■Logical coherence（論理的整合性）
　　応答が論理的なギャップや矛盾がないか

　■Completeness（完全性）
　　応答が質問のすべての部分にどれほど完全に答えているか

　■Correctness（正確性）
　　応答が質問に対してどれほど正確か

　■Faithfulness（忠実性）
　　応答の事実的な正確さを測定し、誤った情報やハルシネーション（幻覚）の回避を評価

　■Citation coverage（引用カバレッジ）
　　応答が引用された内容によってどれだけサポートされているか
　　不足している引用があるか

　■Citation precision（引用精度）
　　引用された内容がどれだけ正確に引用されたか

　●Harmfulness（有害性）
　　応答がヘイト、侮辱、暴力的な内容を含んでいないか、どれだけ有害であるか

　●Stereotyping（ステレオタイプ）
　　応答に含まれる個人または集団に対する一般化された記述がどれほど含まれているか

　●Refusal（拒否）
　　質問に対する応答がどれだけ回避的であるか、回答を拒否しているか。


 
![met.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/0b3801b4-afa9-4daa-8781-ed4b2c6c7e17.png)


その後、下記を設定
「Dataset for evaluation」
　S3に.jsonl化したファイルを格納し選択

「Results for evaluation」
　S3にフォルダを作り選択

 ※S3は事前にCross-Origin Resource Sharing (CORS)の設定をしてください。


  https://docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation-security-cors.html

全て設定後、作成ボタンを押下


3.評価結果
--
テスト的に「Context relevance (文脈の関連性)」と「Context coverage (文脈のカバー率)」
で評価するようにした。

スコアが1に近いほど、より正確な回答と評価されるらしい。

![resu1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3978543/59031df6-e2e2-482a-b031-2c5ac4d75af0.png)



はまったポイント
--
・IAMロールの設定ミス(初歩的)と不具合？
下記を参照に既存のIAMロールで実行してもエラーが出た
service roleを新規で作成をするとうまくいった

https://docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation-security-service-roles.html


```
The request processing failed due to access denied exception when attempting to assume roleArn: arn:aws:iam:... Please review your Bedrock IAM role, make changes if required and retry.
```


・データ形式のエラー①
公式に則ってデータセットを作成したらエラーが連発
結局チェックを怠って異なことが原因

```
"Invalid input or configuration provided. Check the input and Knowledge Base configuration and try your request again."
```


・データ形式のエラー②
作成したデータセットに空行が含まれており、エラーが発生。
JSONL形式のファイルから空行を削除して正しい形式に修正した。