Amazon Bedrockでリランクモデルを有効化する方法とログ確認手順

# 内容
Amazon Bedrockのナレッジベースで構築したRAGシステムの回答精度を向上させるため、リランク機能の検証を行います。以下記事に記載のリランクモデル`Amazon Rerank 1.0`を使用してみます。

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/amazon-bedrock-rerank-api-accuracy-rag-applications/

# イメージ
イメージは下記のようになります。ユーザからの入力をエンベディングモデルでベクトル変換後、リランクモデルを使用して、ベクトル検索でドキュメントのリスト取得・ランク付けを実施します。ランク付けされた上位コンテンツをもとに基盤モデルで回答生成後、最終的な回答をユーザへ返す流れです。

![rag30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/b551b9d6-9d44-42c6-b690-b3f06408517b.png)

# 設定

## モデル呼出ログの有効化

リランク処理が実際に行われているかを確認するため、モデル呼び出し時のログを有効化します。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/model-invocation-logging.html

事前にIAMロールとCloudWatch Logsのロググループを作成後、Bedrockの設定画面からログ記録を有効にします。

![rag31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/328ec1a4-20ca-4401-a39e-89510228b335.png)

ロググループ内にログストリームが作成されました。

![rag32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/70ebdd05-5e89-4620-beaf-23c2d31ae589.png)


## リランクの有効化
`RetrieveAndGenerate`APIでリランクの設定を行います。以下はテスト用プログラムの全文です。

```python
import boto3
import json

REGION = "ap-northeast-1"
MODEL_ARN = "arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-3-haiku-20240307-v1:0"
MODEL_ARN_RERANK = "arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.rerank-v1:0"
KNOWLEDGEBASE_ID = '********'

bedrock_agent = boto3.client("bedrock-agent-runtime", region_name=REGION)
user_question = "質問内容を入力"

context_prompt = f"""
以下はユーザーからの質問です：

<question>
{user_question}
</question>
"""

# retrieve_and_generate_stream 呼び出し
response = bedrock_agent.retrieve_and_generate_stream(
    input={"text": context_prompt},
    retrieveAndGenerateConfiguration={
        "type": "KNOWLEDGE_BASE",
        "knowledgeBaseConfiguration": {
            "knowledgeBaseId": KNOWLEDGEBASE_ID,
            "modelArn": MODEL_ARN,
            "retrievalConfiguration": {
                "vectorSearchConfiguration": {
                    "rerankingConfiguration": {
                        "bedrockRerankingConfiguration": {
                            "metadataConfiguration": {
                                "selectionMode": "ALL",
                            },
                            "modelConfiguration": {
                                "modelArn": MODEL_ARN_RERANK
                            },
                        },
                        "type": "BEDROCK_RERANKING_MODEL"
                    }
                }
            }
        }
    }
)

stream = response.get("stream")
raw_events = []

if stream:
    for event in stream:
        raw_events.append(event)

print(json.dumps(raw_events, indent=2, ensure_ascii=False))

```

変更箇所は下記になります。まずリランクモデルを定義を追加します。

```python
MODEL_ARN_RERANK = "arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.rerank-v1:0"
```

`retrieveAndGenerateConfiguration`の中に下記を追加しました。

```python
"retrievalConfiguration": {
    "vectorSearchConfiguration": {
        "rerankingConfiguration": {
            "bedrockRerankingConfiguration": {
                "metadataConfiguration": {
                    "selectionMode": "ALL",
                },
                "modelConfiguration": {
                    "modelArn": MODEL_ARN_RERANK
                },
            },
            "type": "BEDROCK_RERANKING_MODEL"
        }
    }
}
```

## 結果の確認
CloudWatch Logsで実行結果を確認すると、リランク処理が行われていることが確認出来ます。レスポンスの形式は以下のようになります。

https://docs.aws.amazon.com/ja_jp/bedrock/latest/APIReference/API_agent-runtime_RerankResult.html


```json
 "output": {
        "outputContentType": "application/json",
        "outputBodyJson": {
            "results": [
                {
                    "index": 1,
                    "relevance_score": 0.00013765463********
                },
                {
                    "index": 3,
                    "relevance_score": 0.000016061610********
                },
                {
                    "index": 4,
                    "relevance_score": 0.0000098953323********
                },
                {
                    "index": 0,
                    "relevance_score": 0.00000297113812********
                },
                {
                    "index": 2,
                    "relevance_score": 0.0000028350801********
                }
            ]
        }
```