🧠

Amazon Bedrock Knowledge Bases(Pinecone)をCDKで作る方法

2024/10/22に公開

Amazon Bedrock Knowledge Bases(以下KB)をCDKで作ってみました。
今回構成するインフラの構成図は以下の通りです。


構成図

前提

  • Pineconeが作成されている
  • Bedrockで使用するモデルアクセスが許可されている
  • CDKのバージョンは2.163.0

必要なリソース

今回作成するKBに必要なリソースのCDKを記載します。
Constructsに切り分けてもいいですし、Stackに直接書いても構いません。
使用する変数を以下に記載しておきます。

// embeddingModelのArn。任意のモデルを使用してください。
const embeddingModelArn = `arn:aws:bedrock:${this.region}::foundation-model/amazon.titan-embed-text-v2:0`;

// KBに関するtag。任意の名前に変更してください。
const tag = `${this.stackName}-kb`;

// PineconeにあるHost。詳細は以下の画像を確認してください。
const connectionString = "hogehoge";


Hostの場所

S3

KBのデータソースとして使用するS3です。

import * as s3 from "aws-cdk-lib/aws-s3";

const bucket = new s3.Bucket(this, "Bucket");

SecretsManager

Pineconeのシークレット情報(apiKey)を格納するSecrets Managerです。
作成された後に、apiKeyを設定してください。

import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager";

const secret = new secretsmanager.Secret(this, "Secret", {});

KB

まず、KBに設定するIam Roleです。

const role = new aws_iam.Role(this, `KnowledgeBaseRole`, {
  roleName: `${tag}_role`,
  assumedBy: new aws_iam.ServicePrincipal("bedrock.amazonaws.com"),
  inlinePolicies: {
    inlinePolicy1: new aws_iam.PolicyDocument({
      statements: [
        new aws_iam.PolicyStatement({
          resources: [credentialsSecretArn], // 先ほど作成したSecretsManagerのArn
          actions: ["secretsmanager:GetSecretValue"],
        }),
        new aws_iam.PolicyStatement({
          resources: [embeddingModelArn], // 使用するモデルのArn。複数ある場合は複数指定してください。
          actions: ["bedrock:InvokeModel"],
        }),
        new aws_iam.PolicyStatement({
          resources: [
            bucket.bucketArn, // 先ほど作成したS3のArn
            `${bucket.bucketArn}/*`
          ],
          actions: ["s3:ListBucket", "s3:GetObject"],
        }),
      ],
    }),
  },
});

次にKBを作成します。
先ほど作成したroleをroleArnに追加します。

// KB
const knowledgeBase = new aws_bedrock.CfnKnowledgeBase(
  this,
  "KnowledgeBase",
  {
    knowledgeBaseConfiguration: {
      type: "VECTOR",
      vectorKnowledgeBaseConfiguration: {
        embeddingModelArn: embeddingModelArn, // EmbeddingModelのArn
      },
    },
    name: tag,
    roleArn: role.roleArn, // 先ほど作成したrole
    storageConfiguration: {
      type: "PINECONE",
      pineconeConfiguration: {
        connectionString: connectionString, // PineconeのHost
        credentialsSecretArn: credentialsSecretArn, // SecretsManagerのArn
        fieldMapping: {
          metadataField: "metadata",
          textField: "text",
        },
        namespace: "hogehoge", // Pineconeのnamaspace
      },
    },
  },
);

最後はKBで設定するデータソースです。

// デフォルトチャンキング
new aws_bedrock.CfnDataSource(this, "DefaultChunking", {
  name: "default_chunking",
  knowledgeBaseId: knowledgeBase.ref, // 先ほど作成したKB
  dataSourceConfiguration: {
    s3Configuration: {
      bucketArn: bucket.bucketArn, // 先ほど作成したS3
      inclusionPrefixes: ['default_chunking'],
    },
    type: "S3",
  },
});

チャンキング方法を指定する場合はvectorIngestionConfigurationで設定します。
例として、HierarchicalChunkingを記載しておきます。

// Hierarchical Chunking
new aws_bedrock.CfnDataSource(this, "HierarchicalChunking", {
  name: "hierarchical_chunking",
  knowledgeBaseId: knowledgeBase.ref, // 先ほど作成したKB
  dataSourceConfiguration: {
    s3Configuration: {
      bucketArn: bucket.bucketArn, // 先ほど作成したS3
      inclusionPrefixes: ['hierarchical_chunking'],
    },
    type: "S3",
  },
  vectorIngestionConfiguration: {
    chunkingConfiguration: {
      chunkingStrategy: 'HIERARCHICAL',
      hierarchicalChunkingConfiguration: {
        levelConfigurations: [
          {
            maxTokens: 1000, // 親チャンクのToken数
          },
          {
            maxTokens: 300, // 子チャンクのToken数
          }
        ],
        overlapTokens: 200,
      },
    },
  },
});

それ以外にも様々なデータソースの設定方法があるので、公式ドキュメントにて確認してください。
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_bedrock.CfnDataSource.html

まとめ

CDKでKBを作成してみました。
次はAmazon Bedrock Agentsにチャレンジしようと思います。

Fusic 技術ブログ

Discussion