はじめに
2023/9/28、ついに Amazon Bedrock が一般提供開始 (GA) されました🎉🎉🎉
Bedrock は Amazon や主要な AI スタートアップ企業が提供する基盤モデル (FM) を API を通じて利用できるようにするサービスです。2023/10/3 時点で以下のリージョンで利用できます。
- us-east-1
- us-east-2
- us-west-2
- ap-southeast-1
- ap-northeast-1 (2023/10/3)
Bedrock の魅力を体感するために Chanilit および LangChain を使用したサンプル Chatbot アプリケーションを作成しました。
特に Bedrock + Claude v2 組合せは日本の AWS ユーザーにとって強力な選択肢となるのではないでしょうか!複雑なことはできませんが、Playgrouds や CLI 以外からも触ってみたいみたいという方の参考になれば幸いです。
ソースコード
以下の GitHub リポジトリで公開しています。
動作環境
以下の環境で動作確認をしています。
- AWS リージョン: us-east-1
- AWS Copilot CLI: v1.30.1
- Python: v3.11.5
- boto3: v1.28.57
- LangChain: v0.0.309
- Chainlit: v0.7.1
GA Version の Bedrock API をサポートするため、LangChain および boto3 については必ず上記より新しいバージョンを使用してください。古いバージョンでは正常に動作しません。
Bedrock の利用開始
Amazon Bedrock の利用を開始するには事前に各基盤モデルへのアクセスリクエストを行う必要があります。モデルへのアクセスを追加するには Bedrock コンソールの Model access から Edit をクリックします。
利用したいモデルにチェックを入れて設定を保存します。
Jurassic-2 や Claude などのサードパーティのモデルは AWS Marketplace を通じてアクセスをリクエストします。つまりモデルの利用料金も Marketpalce の料金として発生することになります。
リージョンによって提供されるモデルに違いがあるようです。例えば東京リージョンでは 2023/10/3 時点では Titan Embeddings G1 - Text および Claude Instant のみが使用可能です。
各モデルが利用できるようになるまでに少し時間がかかります。Access status が Access granted
になったモデルは利用開始できます。Titan Text G1 - Express など GA 時点で Preview であり、すぐに利用開始できないモデルも含まれていますのでご注意ください。
AWS Marketplace から各モデルの Subscription についてメールが通知されます。
Bedrock コンソールの Chat playgloud でモデルを選択し、文章を送信してみます。正常に応答があれば準備 OK です。
デプロイ
冒頭の GitHub リポジトリには AWS Copilot CLI でAWS App Runner にデプロイするためのマニフェストファイルが含まれています。以下の手順でデプロイできます。Copilot CLI を使用せずに Dockerfile で手動でイメージをビルドし、任意のインフラにデプロイすることも可能です。
必要に応じて AWS Copilot CLI をインストールします。
sudo curl -Lo /usr/local/bin/copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-linux && sudo chmod +x /usr/local/bin/copilot
次の手順で App Runner にデプロイします。
export AWS_REGION=us-east-1
copilot app init bedrockchat-app
copilot deploy --name bedrockchat --env dev
デプロイが成功したらメッセージに出力された URL にアクセスします。以下のような画面が表示されたらデプロイ成功です!
環境を削除する際は以下のコマンドを実行します。CloudWatch Logs group は残存してしまうので手動で削除してください。
copilot app delete
使い方
Settings panel から基盤モデル、Temperature、最大トークンサイズが変更できます。
サンプルコードでは ListFoundationModels API からモデル ID のリストを取得しています。Claude, Jurassic-2, Cohere Command, Amazon Titan Text といったモデルを切り替えながら性能を検証することができます。
Amazon Titan Text G1 - Express (旧称: Amazon Titan Large) は 2023/9/29 時点では Preview ステータスです。アクセス許可は順次ロールアウトされるため、利用できないアカウントもあります。
あとは AI アシスタントと自由な会話をお楽しみください!セッション中の会話履歴を保持しているため、文脈を考慮して返答してくれます。
ソースコードの補足
基盤モデルの選択
前述のとおり、ListFoundationModels API からモデル ID の一覧を取得し、Chainlit の ChatSettings で選択可能にしています。
@cl.on_chat_start
async def main():
bedrock = boto3.client("bedrock", region_name=AWS_REGION)
response = bedrock.list_foundation_models(
byOutputModality="TEXT"
)
model_ids = []
for item in response["modelSummaries"]:
model_ids.append(item['modelId'])
settings = await cl.ChatSettings(
[
Select(
id="Model",
label="Amazon Bedrock - Model",
values=model_ids,
initial_index=10,
),
以下省略
モデル ID は Bedrock コンソール上の各モデル情報に記載されているサンプル API request から確認することもできます。
モデルの設定値を読み取り、LangChain で Bedrock の LLM をインスタンス化します。
from langchain.llms.bedrock import Bedrock
@cl.on_settings_update
async def setup_agent(settings):
global bedrock_model_id
bedrock_model_id = settings["Model"]
llm = Bedrock(
region_name=aws_region,
model_id=bedrock_model_id,
model_kwargs={"temperature": settings["Temperature"]}
)
2023/9/29 時点で Bedrock の Chat model は Anthropic のみをサポートしているため、意図的に LLM の方を使用しています。参考: LLMs vs chat models
AWS Copilot CLI
アプリケーションが使用する IAM ポリシーで Bedrock のモデル実行アクションおよびListFoundationModels アクションが許可されている必要があります
App Runner のインスタンスロールにポリシーを追加するため、Copilot の Addon 機能でテンプレートを追加しています。
Parameters:
App:
Type: String
Description: Your application's name.
Env:
Type: String
Description: The environment name for the service.
Name:
Type: String
Description: The name of the service.
Resources:
BedrockAccessPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: AllowInvokeModel
Effect: Allow
Action:
- "bedrock:InvokeModel"
- "bedrock:InvokeModelWithResponseStream"
- "bedrock:ListFoundationModels"
Resource: "*"
Outputs:
ListBucketPolicyArn:
Description: "The ARN of the ManagedPolicy to attatch to the instance role."
Value: !Ref BedrockAccessPolicy
ドキュメント
以上です。
参考になれば幸いです。