BedrockのナレッジベースがClaude 3 Sonnetに対応！

:::note info
3/27追記：ようやく本家What's Newも僕らに追いついて来たようです😆
:::

https://aws.amazon.com/about-aws/whats-new/2024/03/knowledge-bases-amazon-bedrock-claude-3-sonnet/

# ついにSonnetにも対応！

まだAWS公式のアナウンスはありませんが、ドキュメントが更新されているのがいち早く発見されました。

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

ひるたさん、いつも発見が早い！

https://x.com/web_se/status/1772417932024320397?s=20

現状、3つあるモデルのうちSonnetだけですが、既にBedrockにリリースされているHaikuモデルへの対応も時間の問題だと思われます。

また、エージェント for Amazon BedrockもじきにClaude 3対応されることが予想されます。


# 何が嬉しいの？

ナレッジベースとは、いわゆる「社内文書検索AIチャット」などを実現できるRAGアーキテクチャをAmazon Bedrockで簡単に作成できる機能です。

https://qiita.com/minorun365/items/24dfb0ea3afde6ed0a56

先日、BedrockのメインLLMと言えるAnthropic社のClaudeモデル最新版 v3がリリースされていましたが、ナレッジベースへの対応はまだでした。

https://qiita.com/minorun365/items/e6f3aa71f5e1bdf21139


# ナレッジベースには2種類のAPIメソッドがある

お気づきの方もいるかもですが、ナレッジベース自体にClaude 3が未対応のときでもRAG回答生成にClaude 3を利用することは可能でした。なぜなら、ナレッジベースのAPIには2種類のメソッドがあるためです。

- `Retrieve`：ドキュメントの検索結果のみを返す
- `RetrieveAndGenerate`：ドキュメントの検索結果をもとに、LLMで生成した回答を返す

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

`RetrieveAndGenerate` には回答生成用のLLMをナレッジベースへ組み込む必要があるため、Claude 3の利用ができませんでした。

`Retrieve` を使えば、ナレッジベースの外（アプリケーションロジック内など）で自分の好きなLLMを組み合わせることができるため、Claude 3も利用可能だったというわけです。


# 実機確認（マネコン）

マネジメントコンソールを見ると、ナレッジベースのテスト画面にはまだSonnetが出現していませんでした。

![スクリーンショット 2024-03-26 11.38.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/54b682f8-e107-7e4e-bdfe-4a5d656515e6.png)

※人によってはすでに出現しているようです。

https://x.com/shimagaji/status/1772430903215587626?s=20


# 実機確認（API）

APIも確認してみます。Cloud9などを使って検証してみましょう。

まずはAWS SDK for Python (Boto3）のバージョンを最新化しておきます。

```bash: ターミナル
pip install -U boto3
```

Claude 3 Sonnetで `RetrieveAndGenerate` を試してみます。

```py:RAG-Sonnet.py
# Python外部ライブラリをインポート
import boto3

# Bedrockクライアントを作成
kb = boto3.client("bedrock-agent-runtime")

# ナレッジベースを定義
response = kb.retrieve_and_generate(
    input={"text": "ECSとEKSの使い分けは？"},
    retrieveAndGenerateConfiguration={
        "type": 'KNOWLEDGE_BASE',
        "knowledgeBaseConfiguration": {
            "knowledgeBaseId": "XXXXXXXXXX", # ここにナレッジベースIDを記載する
            "modelArn": "arn:aws:bedrock:us-east-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0",
        },
    },
)

# RAG結果を画面に表示
print(response["output"]["text"])
```

AWS活用ナレッジ集を食わせたナレッジベースを用いて、RAGで簡単に回答生成することができました！（内容の是非についてはここでは言及しません😷）

```bash:ターミナル
minorun365:~/environment $ python3 RAG-Sonnet.py 
ECSとEKSの主な違いは以下の通りです:

- ECSはAWS独自のコンテナオーケストレーションサービスで、EKSはKubernetesをベースにしています。EKSの方が機能が豊富ですが、Kubernetesのバージョンアップ対応が必要になります。

- ECSはコントロールプレーンの管理が不要ですが、EKSではKubernetesのバージョンアップに合わせてコントロールプレーンの管理が必要です。

- データプレーンでは、ECSはEC2インスタンスの管理が必要ですが、Fargateを使えばサーバーレスで運用できます。EKSでもEC2インスタンスまたはFargateを選択できます。 使い分けとしては、以下のようなケースが考えられます:

- 既存のKubernetesスキルを活かしたい場合や、Kubernetesの豊富なエコシステムを活用したい場合はEKSを選択します。

- 単純なコンテナワークロードで、Kubernetesの複雑さを避けたい場合はECSを選択します。

- サーバーレスでコンテナを運用したい場合は、ECS+FargateまたはEKS+Fargate
```

# おまけ：Retrieve単体で実行するコード例

以下のように実行すると、JSON形式でドキュメント検索結果のみが返却されます。

```py:retrieve-Sonnet.py
# Python外部ライブラリをインポート
import boto3

# Bedrockクライアントを作成
kb = boto3.client("bedrock-agent-runtime")

# ナレッジベースを定義
response = kb.retrieve(
    knowledgeBaseId="XXXXXXXXXX", # ここにナレッジベースIDを記載する
    retrievalQuery={"text": "ECSとEKSの使い分けは？"}
)

# 取得結果を画面に表示
print(response)
```

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