🧠
Amazon Bedrock Knowledge Bases(Pinecone)をCDKで作る方法
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,
},
},
},
});
それ以外にも様々なデータソースの設定方法があるので、公式ドキュメントにて確認してください。
まとめ
CDKでKBを作成してみました。
次はAmazon Bedrock Agentsにチャレンジしようと思います。
Discussion