[アップデート] Knowledge bases for Amazon Bedrock が東京リージョンでサポートされました

Knowledge bases for Amazon Bedrock が東京リージョンでサポートされました。東京リージョンの現状のおさらいと、リージョン(モデル)を使い分けて回答を生成してみました。
2024.05.03

こんにちは! AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。

ついに、 Knowledge bases for Amazon Bedrock が東京リージョンでサポートされました。

ドキュメントにも Knowlege base の列に Yes と記載されていますね。

Supported AWS Regions - Amazon Bedrock

そこで今回は、東京リージョンでナレッジベースを作成してみたいと思います。

東京リージョンをおさらいする

執筆している日本時間の 2024/05/03 時点では次のモデルが利用可能です。

Embedding モデル

  • Amazon Titan Embeddings G1 - Text
  • Cohere Embed English
  • Cohere Embed Multilingual

Text モデル

  • Amazon Titan Text G1 - Express
  • Anthropic Claude
  • Anthropic Claude Instant

Bedrock のアップデートが活発なバージニア北部やオレゴンリージョンに比べて、 Text モデルが若干手薄なため、Retrieve API を東京リージョンで呼び出し、他のリージョンの Txet モデルを使ったりするのがいいのかもしれません。

やってみる

今回は以下の Terraform コードを流してみます。 providerregion だけ変更して、リソースを展開します。(IaC って便利ですね)

ナレッジベースのデータソース部分は手動で作成します。

カラムの追加

メタデータフィルタリングも可能かどうかを試したいので、ベクトルデータベースで利用している Aurora にカラムの追加を行います。

ALTER TABLE bedrock_integration.bedrock_kb
ADD COLUMN IF NOT EXISTS target VARCHAR(100),
ADD COLUMN IF NOT EXISTS year SMALLINT,
ADD COLUMN IF NOT EXISTS for_managers BOOLEAN;

Knowledge bases を眺める

出来上がったナレッジベースをみてみましょう。確かに Tokyo リージョンで作成できていますね。(感動です)

データソースの追加

データソースの追加を行います、 Add からデータソースを追加します。

データソース名は、 kb-tokyo-kb とします。(検証してからブログを書いているのですが、変な名前をつけてしまったことに少し後悔しています。)

データソースとなる S3 に資材のアップロードを行います。 Git にあげている、 サンプルドキュメントcompany-wide フォルダをアップロードします。

Snyc を押して、データソースの同期を行います。

無事、同期が完了すると Source files, Metadata files どちらも認識されていました。(メタデータフィルタリングできそうですね)

ベクトルデータベース側からも列にメタデータが配置されていることが確認できます。

検索

それでは、ナレッジベースに対して検索をかけてみます。以下の条件で検索をかけてみました。

  • 質問文:事業計画について教えてください
  • year:2023
  • for_managers:true

Text モデルは Claude 2.1 を利用しましたが、ソースを元にしっかり回答生成できていますね。

AWS SDK でもやってみる

AWS SDK (boto3) でも試してみます。

Retrieve API は東京リージョンのナレッジベースを、回答分の生成はオレゴンリージョンの Command R+ を利用してみます。

cross_region_retrieve_and_generate.py

import os
import json
import boto3

bucket_name = os.environ.get("BUCKET_NAME")
kb_id = os.environ.get("KNOWLEDGE_BASE_ID")
agent_runtime_tokyo = boto3.client(
    "bedrock-agent-runtime", region_name="ap-northeast-1"
)
agent_runtime_oregon = boto3.client("bedrock-agent-runtime", region_name="us-west-2")
bedrock_runtime_oregon = boto3.client("bedrock-runtime", region_name="us-west-2")

text_model_id = "cohere.command-r-plus-v1:0"
messsage = "事業計画について教えてください"

filter = {
    "andAll": [
        {"equals": {"key": "year", "value": 2023}},
        {"equals": {"key": "for_managers", "value": True}},
    ]
}

# 東京リージョン
## ベクトル検索
vector_search_response = agent_runtime_tokyo.retrieve(
    knowledgeBaseId=kb_id,
    retrievalConfiguration={
        "vectorSearchConfiguration": {
            "filter": filter,
            "numberOfResults": 5,
        },
    },
    retrievalQuery={"text": messsage},
)
retrieval_results = vector_search_response.get("retrievalResults")

# オレゴンリージョン
## 質問文の生成
generate_search_query_request = json.dumps(
    {
        "message": messsage,
        "search_queries_only": True,
    }
)

generate_search_query_response = bedrock_runtime_oregon.invoke_model(
    body=generate_search_query_request,
    contentType="application/json",
    accept="application/json",
    modelId=text_model_id,
)

generate_search_query_response_body = json.loads(
    generate_search_query_response.get("body").read()
)
search_queries = generate_search_query_response_body.get("search_queries")

## ドキュメントの整形
documents = []
for query in search_queries:
    query_text = query.get("text")
    for result in retrieval_results:
        result_text = result.get("content").get("text")
        documents.append({"title": query_text, "snippet": result_text})

## 回答分の生成
answer_request = json.dumps(
    {
        "message": messsage,
        "documents": documents,
    }
)

answer_response = bedrock_runtime_oregon.invoke_model(
    body=answer_request,
    contentType="application/json",
    accept="application/json",
    modelId=text_model_id,
)

answer_response_body = json.loads(answer_response.get("body").read())
output_text = answer_response_body.get("text")

print(output_text)

参考:[アップデート] Amazon Bedrock で新モデル「Cohere Command R/R+」が利用可能になったので、RAG で使ってみた | DevelopersIO

回答分を生成するモデルが異なるため、回答内容は異なりますがより詳しく説明いただいているようですね。

takakuni@app % python cross_region_retrieve_and_generate.py
事業計画は、企業の目標、戦略、予算、潜在的なリスクなど、特定の期間における企業の事業活動を概説するものです。事業計画の例としては、タイムトラベル事業と動物言語翻訳事業に注力する株式会社サンプルの2023年度事業計画が挙げられます。この計画には、タイムマシン利用者数1,000人、動物言語翻訳デバイス販売台数100,000台、売上高10兆円、営業利益率80%などの目標が含まれています。戦略としては、歴史上の有名人とのディナー体験ツアーやAIアルゴリズムの開発、マーケティングではハリウッド映画とのプロモーションなどが挙げられます。予算は200兆円で、タイムマシン開発、動物言語翻訳AIの開発、マーケティング、人件費などが含まれます。また、タイムパラドックスや動物倫理などのリスクも考慮する必要があります。

まとめ

以上、「Knowledge bases for Amazon Bedrock が東京リージョンでサポートされました。」でした。

東京リージョンでもついにナレッジベースがサポートしたため、もっと勉強しないとなぁと思う日々です。アップデートが GW の中盤でよかったなと思いました。これからもどんどん発信できるよう頑張ります。

AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!