Amazon  Bedrock モデル評価の「人間ベースの評価」を試してみた

# はじめに
こんにちは、朝日新聞社メディア研究開発センターの杉野です。
新機能や使用可能なLLMモデルが次々と更新され、目が離せないAmazon Bedrockですが、今回は、先日公開された新機能「モデル評価」について書いてみたいと思います。3種類の評価方法があり、中でも「人間ベースの評価」が気になったので、一体どんなものか試してみました。

https://aws.amazon.com/blogs/aws/amazon-bedrock-model-evaluation-is-now-generally-available/

https://japan.zdnet.com/article/35218209/

# 人間ベースの評価とは
Amazon Bedrockメニューの「評価と導入」の中の「モデル評価」ページに進むと、「自動評価」「人間ベースの評価」「AWSマネージド評価」の3種類の評価方法が提示されます。そのうちの真ん中の機能です。
![スクリーンショット 2024-05-09 22.33.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/efed1588-4507-a654-943a-a3e585d7a370.png)


「人間ベースの評価」は、以下の作業を一気通貫で簡単に行える機能です。
- Bedrockが提供する基盤モデルを使ったLLMタスクについて、評価メトリクスを設定
- 任意の作業チームに評価を依頼（作業ポータルへの案内がメール送信される）
- 用意されたUIで評価作業
- レポート作成

また「自動評価」は、推奨される3つのメトリクス、精度(Acuracy)、頑健性(Robustness)、毒性 (Toxicity)について自動評価が行えます。
「AWSマネージド評価」はAWSチームに直接評価作業を委託できるもので、用意されたフォームから要望を伝えてサポートが始まるようです。
「自動評価」についてはすでにこちらの記事で詳しく紹介されています。

https://qiita.com/kanuazut/items/786500d9b04d19d9c3b3

# 想定用途
人間ベースの評価については、例えば下記のような用途に役立つのではと思います。
- 自動評価にあるメトリクスでは評価できない観点や独自タスクの評価
- プロンプトのブラッシュアップ
- 固定のプロンプトで複数の基盤モデルの性能比較
- ゆくゆくは自前モデルの評価も可能？（個人的期待。2024.5.9時点では未対応です）

# 料金とリージョン
人間ベースの評価は、AWSニュースブログによれば、推論の料金と完了タスクごとに0.21ドルがかかるとのことです。
>価格– モデルの評価中に実行される推論に対して料金を支払います。アルゴリズムによって生成されたスコアには追加料金はかかりません。独自のチームで人間ベースの評価を使用する場合は、推論の料金と、完了したタスクごとに 0.21 ドルを支払います。つまり、人間の作業者が人間の評価ユーザー インターフェイスで 1 つのプロンプトとそれに関連する推論応答の評価を送信します。 AWS 管理の作業チームによって実行される評価の価格は、評価に重要なデータセット、タスク タイプ、メトリクスに基づいています。詳細については、Amazon Bedrock の料金ページを参照してください。

>リージョン– モデルの評価は、米国東部 (バージニア北部) と米国西部 (オレゴン) の AWS リージョンで利用できます。

https://aws.amazon.com/blogs/aws/amazon-bedrock-model-evaluation-is-now-generally-available/

# タスク設定
今回はお試し用として「くだけた文を、LLMを使って丁寧でフォーマルな文に書き換える」というタスク設定でこの機能の挙動を一通り見てみたいと思います。

```text:書き換え前
このサンプル文さ、もっと丁寧なやつにしたいんだよね。
```
```text:書き換え後
このサンプル文を、より丁寧なものにしたいと思います。
```
下記の簡単なプロンプトで試してみます。モデルはAnthropicのClaudeを使用してみます。公式ドキュメントによるとClaudeはXMLタグを使ったプロンプトがおすすめとのことなので、入出力は`<input></input>`のようなタグで囲んだ形式で指示しています。

```text:prompt
"<input></input>に囲まれたくだけた文章を、より丁寧さのあるフォーマルな文章に書き換えてください。\n<input> このサンプル文さ、もっと丁寧なやつにしたいんだよね。</input>"
```

https://docs.anthropic.com/en/docs/use-xml-tags

# 人間ベースの評価を作成
では早速、評価の設計をしていきたいと思います。
### ボタンを押して作成に進む
![スクリーンショット 2024-05-09 23.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/be2e0383-2e1f-4935-9651-776bd4829df3.png)
### ジョブ詳細を記入
任意の評価名、説明等を記載します。
![スクリーンショット 2024-05-13 14.53.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/ce0a303e-00c2-b729-231a-21c5e345c5f7.png)

### モデルを選択
モデルアクセスが付与されている基盤モデルから、比較したいモデルを２つまで選択できます。Temperatureやtop_p等、ハイパーパラメータの設定も可能です。
本当はClaude3のSonnetやHaikuなどを評価したかったのですが、現時点（2024.5.9）ではClaude2.1まで対応のようです。最新モデルへの対応が待たれるところです。
![スクリーンショット 2024-05-09 18.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/ac857f6e-97cf-eff2-bec1-f4d3cabdfe60.png)
### タスクタイプを選択し、評価メトリクスを設定
今回のタスクは選択肢にある規定タスクタイプのどれにも当てはまらないので、カスタムを選択しました。すると評価メトリクスの定義項目が表示されますので、適宜指定していきます。`Rating method`としては以下の２つの選択肢があります。
`Thumbs up/down` → いいね👍 とよくない👎の２択
`Likert scale - Individual` → リッカート尺度、５段階評価
いずれかのUIを選び、後ほど出てくる「指示の入力」画面で判定基準に関する指示を定義すると、それらがUI上に表示され、独自のメトリクスで評価ができるということのようです。
![スクリーンショット 2024-05-13 15.41.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/57f3358b-12de-a3d5-3444-599c3a07f98f.png)


https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%83%E3%82%AB%E3%83%BC%E3%83%88%E5%B0%BA%E5%BA%A6#:~:text=%E3%83%AA%E3%83%83%E3%82%AB%E3%83%BC%E3%83%88%E5%B0%BA%E5%BA%A6%EF%BC%88%E3%83%AA%E3%83%83%E3%82%AB%E3%83%BC%E3%83%88%E3%81%97%E3%82%83%E3%81%8F%E3%81%A9,%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%E3%82%92%E5%9B%9E%E7%AD%94%E3%81%99%E3%82%8B%E3%80%82

### プロンプトデータセット、評価結果出力先を指定
プロンプトデータセットをS3にアップロードしておき、指定します。S3バケットは、CORSの設定も必要です。設定がない場合はエラーメッセージに従って設定します。
![スクリーンショット 2024-05-09 23.46.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/91c88429-2474-1b65-05b4-d74cfa5ff81e.png)

#### プロンプトデータセットとは
プロンプトデータセットのフォーマットは以下のページに定義されているので、それに従ってjsonlファイルで作成しました。

https://docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation-prompt-datasets-custom.html

`"prompt"`は必須キーで、`"referenceResponse"`はオプションです。評価用UIにリファレンスとして表示できるので、書き換え後の正解テキストをセットし、評価時に参照できるようにしました。

```sample.jsonl
{
	"prompt": "<input></input>に囲まれたくだけた文章を、より丁寧さのあるフォーマルな文章に書き換えてください。結果は<output></output>で囲んで返してください。\n<input> このサンプル文さ、もっと丁寧なやつにしたいんだよね。</input>",
	"referenceResponse": "このサンプル文を、より丁寧なものにしたいと思います。"
}
```

### Amazon Bedrock IAMロールを作成
S3への入出力や選択したモデルへのアクセス等をAmazon Bedrockに許可するロールを作成します。一番下の「ロールを作成」ボタンを押します。
![スクリーンショット 2024-05-09 23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/cae5a3aa-f45c-24b6-74a9-93f97862e868.png)
既存のロールを使用したい場合は、以下のページでモデル評価ジョブのための要件を満たしているか確認すると良さそうです。

https://docs.aws.amazon.com/bedrock/latest/userguide/model-evaluation-security-service-roles.html
### 作業チームを設定
必要事項を記入していきます。メールアドレスの欄には最大40名までアドレスを入力できるようで、大人数に評価作業を割り当てることもできそうです。ただし、1タスク（=1データセット？）を評価できるワーカーは最大3名までのようです。
![スクリーンショット 2024-05-09 18.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/863d7e19-b222-46c9-5a3f-254f0e262d1a.png)
### ヒューマンワークフロー IAMロールを作成
先ほどのAmazon Bedrock用に加えて、人間のワークフロー用のIAMロールも必要となります。ここが自動評価とは異なる点です。要件を満たした既存ロールが特になければ、一番下の「ロールを作成」を押して新しいロールを作成します。
![スクリーンショット 2024-05-10 0.31.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/de0fd955-e0a0-4ac8-18d1-b37b469d15f7.png)
### 指示を入力
評価するワーカーへのタスク指示をマークダウン記法で記入します（下記は最初から入力されているサンプル文です）。ここにタスクや評価基準等の詳細を記入し、右上のボタンで評価UIをプレビューできます。
![FireShot Capture 031 - Amazon Bedrock - us-east-1 - us-east-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/eae7dc6e-31ca-b484-3e7e-853de978173d.png)

プレビュー画面です。
![スクリーンショット 2024-05-13 16.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/3b2f66f4-ff14-c136-b895-e7ddd29f6e87.png)

左側はタスクや判定基準の指示、右側はプロンプトとそれに対するレスポンス、そしてリファレンス（プロンプトデータセットに`"referenceResponse"`キーでセットしたもの）が表示され、その下には今回選択した`Likert scale - Individual`の5段階評価のラジオボタンがあります。
ちなみに先ほどS3で私が設定したプロンプトデータは日本語なのですが、プレビューにはそれは表示されず、もともと用意されている英文サンプルが表示されるようです。
### 最終確認
設定したモデル評価ジョブの内容を確認し、「作成」を押してワーカーに評価を依頼します。
![FireShot Capture 033 - Amazon Bedrock - us-east-1 - us-east-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/3c463f7a-2c1b-688e-d07e-4dab02832c91.png)

画面は最初に戻り、モデル評価ジョブの一覧にここまで設定してきた評価ジョブが追記されます。
![スクリーンショット 2024-05-13 16.12.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/cb4377ca-acd4-3e1a-4777-ef4d284dff37.png)


### ワーカーをポータルサイトへ招待する
登録したワーカーのメールアドレスに招待が届きます。ワーカーポータルサイトにログインすると、以下のように依頼された評価ジョブがリストされています（モデル評価ジョブが一覧に追記されてから、ワーカーポータルサイトにそのジョブが表示されるようになるまで、少し時間がかかるようです）。ワーカーは取り組むジョブを選択し、右の「Start Working」を押して評価を開始します。
![スクリーンショット 2024-05-13 16.16.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/d142e17e-a21f-744f-c942-58c2b3cb39e4.png)

このような画面で、LLMの出力を1件ずつ評価していきます。
![スクリーンショット 2024-05-13 17.04.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/fb379125-f5ad-ac06-84a7-1bce07a7e0a5.png)


### モデル評価レポート
完了された評価ジョブは、先ほどのモデル評価ジョブ一覧で完了済みステータスとなり、しばらくすると評価ジョブ名がリンクに変わってレポートページに進めます。
![スクリーンショット 2024-05-13 17.07.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/baba8c3a-7f68-f001-c9c8-99f7577afbba.png)

ワーカーがつけた評価数が集計されています（サンプルなので3件ですが、実際はもっと多くのデータで評価を行うかと思います）。
![FireShot Capture 035 - Amazon Bedrock - us-east-1 - us-east-1.console.aws.amazon.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737805/0f4ebca9-b71f-7929-168b-5ad2ee8e560b.png)


# おわりに
ちょうど、Amazon BedrockのClaude3を使ったタスクで、モデルをSonnetにするかHaikuにするか、コストと性能のバランスなどを検証していたところでしたので、このBedrock上で完結できる評価機能にとても興味を持ちました。自前の検証では、LLMの推論結果からデータセットを作り、別のアノテーションツールで評価用画面を準備し、作業者にアナウンスして、結果をまとめて...と結構手間がかかっていたので、推論〜作業者への評価依頼〜分析、レポート作成までが一気にやれるのは便利！だと思いました。肝心の、評価したいモデルへの対応がまだというところが残念ですが、おそらく今の勢いなら少し待てば対応されるのではと思っています。
また、自前モデルの評価が可能になれば（Imported modelsの料金体系がどんな感じか気になりますが）さらに便利では、と期待が高まっています。