AWS CDK v2.115.0 で Amazon Bedrock の L2 Construct がサポートされました

2023.12.15

本記事は AWS CDK Advent Calendar 2023 の 16 日目です。

こんにちは、CX 事業本部 Delivery 部の若槻です。

Amazon Bedrock は、大手 AI 企業が提供する基盤モデル(FM:Fundamental Model)や、それらを特定のユースケース向けにカスタマイズしたモデルを API から簡単に利用可能とする AWS サービスです。

本日リリースされた AWS CDK v2.115.0 で、この Amazon Bedrock の L2 Construct がサポートされました。

README はこちらになります。早速試してみました。

試してみた

CDK ライブラリのアップグレード

AWS CDK のモジュールを v2.115.0 以上にアップグレードします。

npm i aws-cdk@latest aws-cdk-lib@latest

コンストラクトの確認

aws_bedrock で使用できる L2 コンストラクトを確認してみます。と言ってもリソースの作成は現状ではできず、できることはモデルの情報取得のみです。

lib/cdk-sample-stack.ts

import { aws_bedrock, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    /**
     * FoundationModel.fromFoundationModelId
     * 基盤モデルの取得
     */
    aws_bedrock.FoundationModel.fromFoundationModelId(
      this,
      'FoundationModel',
      /**
       * FoundationModelIdentifier
       * 基盤モデルの識別子
       */
      aws_bedrock.FoundationModelIdentifier.ANTHROPIC_CLAUDE_V2
    );

    /**
     * ProvisionedModel.fromProvisionedModelArn
     * プロビジョンされたモデルの取得
     */
    aws_bedrock.ProvisionedModel.fromProvisionedModelArn(
      this,
      'ProvisionedModel',
      `arn:aws:bedrock:${this.region}:${this.account}:provisioned-model/abc-123`
    );
  }
}

使用できるコンストラクトクラスは次の 3 つです。

クラス 説明 インスタンスプロパティ
FoundationModel.fromFoundationModelId 基盤モデルの取得 modelArn, modelId
FoundationModelIdentifier 基盤モデルの識別子 -
ProvisionedModel.fromProvisionedModelArn プロビジョンされたモデルの取得 modelArn

/**
 * The model identifiers for the Bedrock base foundation models.
 *
 * @see https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids-arns.html
 */
export declare class FoundationModelIdentifier {
  readonly modelId: string;
  /** Base model "ai21.j2-mid-v1". */
  static readonly AI21_LABS_JURASSIC_2_MID_V1: FoundationModelIdentifier;
  /** Base model "ai21.j2-ultra-v1". */
  static readonly AI21_LABS_JURASSIC_2_ULTRA_V1: FoundationModelIdentifier;
  /** Base model "amazon.titan-embed-text-v1". */
  static readonly AMAZON_TITAN_EMBEDDINGS_G1_TEXT_V1: FoundationModelIdentifier;
  /** Base model "amazon.titan-text-express-v1". */
  static readonly AMAZON_TITAN_TEXT_G1_EXPRESS_V1: FoundationModelIdentifier;
  /** Base model "amazon.titan-embed-image-v1". */
  static readonly AMAZON_TITAN_MULTIMODAL_EMBEDDINGS_G1_V1: FoundationModelIdentifier;
  /** Base model "amazon.titan-image-generator-v1". */
  static readonly AMAZON_TITAN_IMAGE_GENERATOR_G1_V1: FoundationModelIdentifier;
  /** Base model "anthropic.claude-v1". */
  static readonly ANTHROPIC_CLAUDE_V1: FoundationModelIdentifier;
  /** Base model "anthropic.claude-v2". */
  static readonly ANTHROPIC_CLAUDE_V2: FoundationModelIdentifier;
  /** Base model "anthropic.claude-v2:1". */
  static readonly ANTHROPIC_CLAUDE_V2_1: FoundationModelIdentifier;
  /** Base model "anthropic.claude-instant-v1". */
  static readonly ANTHROPIC_CLAUDE_INSTANT_V1: FoundationModelIdentifier;
  /** Base model "cohere.command-text-v14". */
  static readonly COHERE_COMMAND_V14: FoundationModelIdentifier;
  /** Base model "cohere.command-light-text-v14". */
  static readonly COHERE_COMMAND_LIGHT_V14: FoundationModelIdentifier;
  /** Base model "cohere.embed-english-v3". */
  static readonly COHERE_EMBED_ENGLISH_V3: FoundationModelIdentifier;
  /** Base model "cohere.embed-multilingual-v3". */
  static readonly COHERE_EMBED_MULTILINGUAL_V3: FoundationModelIdentifier;
  /** Base model "meta.llama2-13b-chat-v1". */
  static readonly META_LLAMA_2_CHAT_13B_V1: FoundationModelIdentifier;
  /** Base model "meta.llama2-70b-chat-v1". */
  static readonly META_LLAMA_2_CHAT_70B_V1: FoundationModelIdentifier;
  /**
   * Constructor for foundation model identifier
   * @param modelId the model identifier
   */
  constructor(modelId: string);
}

FoundationModelIdentifier では基盤モデルの識別子がプロパティとして一通り定義されています。

プロパティ モデル ID
AI21_LABS_JURASSIC_2_MID_V1 ai21.j2-mid-v1
AI21_LABS_JURASSIC_2_ULTRA_V1 ai21.j2-ultra-v1
AMAZON_TITAN_EMBEDDINGS_G1_TEXT_V1 amazon.titan-embed-text-v1
AMAZON_TITAN_TEXT_G1_EXPRESS_V1 amazon.titan-text-express-v1
AMAZON_TITAN_MULTIMODAL_EMBEDDINGS_G1_V1 amazon.titan-embed-image-v1
AMAZON_TITAN_IMAGE_GENERATOR_G1_V1 amazon.titan-image-generator-v1
ANTHROPIC_CLAUDE_V1 anthropic.claude-v1
ANTHROPIC_CLAUDE_V2 anthropic.claude-v2
ANTHROPIC_CLAUDE_V2_1 anthropic.claude-v2:1
ANTHROPIC_CLAUDE_INSTANT_V1 anthropic.claude-instant-v1
COHERE_COMMAND_V14 cohere.command-text-v14
COHERE_COMMAND_LIGHT_V14 cohere.command-light-text-v14
COHERE_EMBED_ENGLISH_V3 cohere.embed-english-v3
COHERE_EMBED_MULTILINGUAL_V3 cohere.embed-multilingual-v3
META_LLAMA_2_CHAT_13B_V1 meta.llama2-13b-chat-v1
META_LLAMA_2_CHAT_70B_V1 meta.llama2-70b-chat-v1

使用例

Bedrock の InvokeModel API を呼び出して推論を実行する Lambda 関数を CDK で構築する場合を考えてみます。

その場合は Amazon Bedrockでテキスト&画像生成してみた[with Node.js] | DevelopersIO にあるように、API 呼び出し時に「モデル ID」の指定が必要です。

src/main.ts

import { BedrockRuntime } from "@aws-sdk/client-bedrock-runtime";

const client = new BedrockRuntime({ region: "us-east-1" });

const main = async (): void => {
  const res = await client.invokeModel({
    modelId: "ai21.j2-ultra-v1", // モデル ID の指定
    body: JSON.stringify({
      prompt: "Knock, knock!",
      maxTokens: 200,
      temperature: 0.7,
      topP: 1,
    }),
    accept: "application/json",
    contentType: "application/json",
  });

  const body = JSON.parse(Buffer.from(res.body).toString("utf-8"));
  console.log(body.completions[0].data.text.trim());
};

main();

そこで、AWS CDK 側で基盤モデルの L2 コンストラクトクラスから取得した modelId を Lambda 関数の環境変数に設定することにより、推論に使用するモデル情報の注入をクラスの識別子の指定だけで行えるようになります。

lib/cdk-sample-stack.ts

import { aws_bedrock, aws_lambda_nodejs, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class CdkSampleStack extends Stack {
  constructor(scope: Construct, id: string, props: StackProps) {
    super(scope, id, props);

    const claudeV2FM = aws_bedrock.FoundationModel.fromFoundationModelId(
      this,
      'FoundationModel',
      aws_bedrock.FoundationModelIdentifier.ANTHROPIC_CLAUDE_V1
    );

    new aws_lambda_nodejs.NodejsFunction(this, 'Lambda', {
      environment: {
        // FoundationModel.fromFoundationModelId で取得した modelId を環境変数に設定
        MODEL_ID: claudeV2FM.modelId,
      },
    });
  }
}

おわりに

AWS CDK v2.115.0 で Amazon Bedrock の L2 Construct がサポートされたのでご紹介しました。

現状サポートされているのはリソースの作成ではなく読み取りだけですが、L2 コンストラクトでスマートにモデルの情報を取得して CDK アプリケーション内で使えるようになりました。Bedrock 周りのアップデートは目まぐるしいので、今後のアップデートでプロビジョンドモデルスループットや、モデルカスタマイゼーションジョブの作成などもまもなくサポートされるのではないでしょうか。

また以下で紹介されているように Bedrock を利用したアプリケーションインフラ実装のリファレンスとなる L3 相当のコンストラクトも提供されています。「CDK で Bedrock をやってみたい!」という方は合わせてチェックしてみてください。

以上