[アップデート] Knowledge bases for Amazon Bedrock でデータの取り込み/エンべディングに関するログ記録をサポートしました

Knowledge bases for Amazon Bedrock でデータの取り込み/エンべディングに関するログ記録をサポートしました。取り込みジョブに対して監視や監査/トラブルシューティングでログを確認したいときに使えそうです。
2024.06.24

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

What's New に載っていないのですが、 Knowledge bases for Amazon Bedrock でデータの取り込み/エンべディングに関するログ記録をサポートしました。

今まで

Knowlege bases for Amazon Bedrock のデータ取り込みは CloudWatch メトリクスをサポートしておらず、実行結果を監視するには、マネジメントコンソールや AWS CLI からジョブの成功/失敗を確認する必要がありました。

20240619 at 22.51.04 ---Amazon Bedrock  us-west-2@2x

同期してデータソースをナレッジベースに取り込む - Amazon Bedrock

ログ記録をサポートしていれば、メトリクスフィルターから監視可能だったりしますが、ログ記録や EventBridge 1 もデータ取り込み単体に対してサポートしておらず、監視面で少しツライ印象でした。加えて、データソースを消してしまったら、データ取り込みの情報は消えてしまうため、監査やトラブルシュートする際に動きづらくなる気がしていました。

Monitor Amazon Bedrock events in Amazon EventBridge - Amazon Bedrock

また、エンべディング処理に関してもなぜエンべディングが失敗したのかを判断するためには、 アカウント全体に対しての モデル呼び出しのログ記録を有効にする必要があり、料金面含めて少しハードルが高めでした。

これから

今回のアップデートにより、データ取り込みやエンべディングに対するログ記録をサポートしました。加えて、送信先に CloudWatch Logs 以外の選択肢があります。ログの保管料金の観点からも優しいですね。

  • CloudWatch Logs
  • S3
  • Data Firehose
  • Configure log delivery details: Enter the details for the log delivery, including:
  • Logging destination (either CloudWatch Logs, Amazon S3, Amazon Data Firehose)
  • (If using CloudWatch Logs as the logging destination) Log group name
  • (If using Amazon S3 as the logging destination) Bucket name
  • (If using Amazon Data Firehose as the logging destination) Firehose stream

Knowledge bases logging - Amazon Bedrock

やってみる

今回は CloudWatch Logs にデータ取り込みのログを保管してみて中身を確認してみます。その辺にあった、ナレッジベースにマネジメントコンソールから設定してみます。

Log Deliveries オプションが増えていますね。

20240622 at 15.47.27 ---Amazon Bedrock  us-west-2 2@2x

編集画面へ行ってみます。 S3 や Firehose を選択するとクロスアカウントオプションも選択できます。 ログアーカイブアカウント等に直接配信できるの嬉しいですね。

また、 You can configure up to 3 log deliveries. と記載の通り、複数の配信先が選べるようです。 CloudWatch Logs はメトリクスフィルター用、 S3 や Firehose は ログアーカイブアカウントや 3rd パーティー製品への送信など幅広く活用できそうです。

20240622 at 15.52.45 ---Amazon Bedrock  us-west-2@2x

今回はロググループを作成し、 CloudWatch Logs に配信するように設定してみました。

もう少し深掘り

これで CloudWatch Logs に送れるようになったのですが、画面上だと誰がどのように権限周りを設定しているのか IAM の部分が見当たりませんね。

実は裏側で次のようなリソースポリシーが作成されています。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "AWSLogDeliveryWrite-1165503059",
			"Effect": "Allow",
			"Principal": {
				"Service": "delivery.logs.amazonaws.com"
			},
			"Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
			"Resource": "arn:aws:logs:us-west-2:アカウントID:log-group:指定したロググループ:log-stream:*",
			"Condition": {
				"StringEquals": {
					"aws:SourceAccount": "アカウントID"
				},
				"ArnLike": {
					"aws:SourceArn": "arn:aws:logs:us-west-2:アカウントID:delivery-source:WdDeliverySource-700180713"
				}
			}
		}
	]
}

ナレッジベースごとに送信先を設定するため、もしも CloudWatch Logs のリソースポリシーの制限に引っかかった場合は、次のようなリソースポリシーを設定してあげるといいと思います。

※ ただし、ロググループの命名規則を /aws/vendedlogs/bedrock に合わせる必要があります。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "AWSLogDeliveryWrite",
			"Effect": "Allow",
			"Principal": {
				"Service": "delivery.logs.amazonaws.com"
			},
			"Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
			"Resource": [
				"arn:aws:logs:リージョン:アカウントID:log-group:/aws/vendedlogs/bedrock/*:*"
			],
			"Condition": {
				"StringEquals": {
					"aws:SourceAccount": "アカウントID"
				},
				"ArnLike": {
					"aws:SourceArn": "arn:aws:logs:リージョン:アカウントID:*"
				}
			}
		}
	]
}

CloudWatch Logs のリソースポリシーがサイズ制限に抵触した場合の対処方法 | DevelopersIO

その他、 S3 や Data Firehose のリソースポリシーは以下をご覧ください。

Enabling logging from AWS services - Amazon CloudWatch Logs

同期してみる

それでは、ジョブを実行し同期を行なってみます。

20240622 at 16.54.59 ---Amazon Bedrock  us-west-2@2x

CloudWatch Logs にログが送信されていますね。ログストリームは bedrock/knowledgebaseslogs で作成されていました。

20240622 at 16.57.18 ---CloudWatch  us-west-2@2x

ログの中身です。モデルは Cohere 社の cohere.embed-multilingual-v3 を利用しました。トークン過多で敢えてエンべディングの一部を失敗させています。

取り込み開始

{
	"event_timestamp": 1719104518989,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"data_source_id": "N28PS05C9P",
		"ingestion_job_status": "INGESTION_JOB_STARTED",
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"resource_statistics": {
			"number_of_resources_updated": 0,
			"number_of_resources_ingested": 0,
			"number_of_resources_scheduled_for_update": 0,
			"number_of_resources_scheduled_for_ingestion": 0,
			"number_of_resources_scheduled_for_metadata_update": 0,
			"number_of_resources_deleted": 0,
			"number_of_resources_with_metadata_updated": 0,
			"number_of_resources_failed": 0,
			"number_of_resources_scheduled_for_deletion": 0
		}
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.StatusChanged",
	"level": "INFO"
}

取り込みがスケジュールされた

{
	"event_timestamp": 1719104519255,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"document_location": {
			"type": "S3",
			"s3_location": {
				"uri": "s3://pinecone-serverless-dev-us-west-2-kb-datasource-アカウントID/bedrock/bedrock-ug.pdf"
			}
		},
		"data_source_id": "N28PS05C9P",
		"status_reasons": [],
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"status": "SCHEDULED_FOR_INGESTION"
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.ResourceStatusChanged",
	"level": "INFO"
}

取り込み完了

{
	"event_timestamp": 1719104519255,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"data_source_id": "N28PS05C9P",
		"ingestion_job_status": "CRAWLING_COMPLETED",
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"resource_statistics": {
			"number_of_resources_updated": 0,
			"number_of_resources_ingested": 0,
			"number_of_resources_scheduled_for_update": 0,
			"number_of_resources_scheduled_for_ingestion": 1,
			"number_of_resources_scheduled_for_metadata_update": 0,
			"number_of_resources_deleted": 0,
			"number_of_resources_with_metadata_updated": 0,
			"number_of_resources_failed": 0,
			"number_of_resources_scheduled_for_deletion": 0
		}
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.StatusChanged",
	"level": "INFO"
}

エンべディング開始

{
	"event_timestamp": 1719104570466,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"document_location": {
			"type": "S3",
			"s3_location": {
				"uri": "s3://pinecone-serverless-dev-us-west-2-kb-datasource-アカウントID/bedrock/bedrock-ug.pdf"
			}
		},
		"data_source_id": "N28PS05C9P",
		"status_reasons": [],
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"status": "EMBEDDING_STARTED"
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.ResourceStatusChanged",
	"level": "INFO"
}

エンべディング失敗

{
	"event_timestamp": 1719104716086,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"document_location": {
			"type": "S3",
			"s3_location": {
				"uri": "s3://pinecone-serverless-dev-us-west-2-kb-datasource-アカウントID/bedrock/bedrock-ug.pdf"
			}
		},
		"data_source_id": "N28PS05C9P",
		"status_reasons": [
			"Input is too long for requested model. (Service: BedrockRuntime, Status Code: 400, Request ID: 0e548f98-2eb0-48b3-9f70-c886b79824a0)",
			"Input is too long for requested model. (Service: BedrockRuntime, Status Code: 400, Request ID: f0d9b702-27c9-44fd-af38-26d8dd373f55)"
		],
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"status": "EMBEDDING_FAILED"
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.ResourceStatusChanged",
	"level": "WARN"
}

※ 全ての文章が失敗したわけではなく、チャンク化した一部のドキュメントに対してエラーが発生しているイメージです。

エンべディング完了

{
	"event_timestamp": 1719104716086,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"document_location": {
			"type": "S3",
			"s3_location": {
				"uri": "s3://pinecone-serverless-dev-us-west-2-kb-datasource-アカウントID/bedrock/bedrock-ug.pdf"
			}
		},
		"data_source_id": "N28PS05C9P",
		"status_reasons": [],
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"status": "EMBEDDING_COMPLETED"
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.ResourceStatusChanged",
	"level": "INFO"
}

インデックス化開始

{
	"event_timestamp": 1719104718527,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"document_location": {
			"s3_location": {
				"uri": "s3://pinecone-serverless-dev-us-west-2-kb-datasource-アカウントID/bedrock/bedrock-ug.pdf"
			},
			"type": "S3"
		},
		"data_source_id": "N28PS05C9P",
		"status_reasons": [],
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"status": "INDEXING_STARTED"
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.ResourceStatusChanged",
	"level": "INFO"
}

インデックス化完了

{
	"event_timestamp": 1719104724716,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"document_location": {
			"s3_location": {
				"uri": "s3://pinecone-serverless-dev-us-west-2-kb-datasource-アカウントID/bedrock/bedrock-ug.pdf"
			},
			"type": "S3"
		},
		"data_source_id": "N28PS05C9P",
		"status_reasons": [],
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"status": "INDEXING_COMPLETED"
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.ResourceStatusChanged",
	"level": "INFO"
}

インデックス化の結果

{
	"event_timestamp": 1719104725713,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"document_location": {
			"s3_location": {
				"uri": "s3://pinecone-serverless-dev-us-west-2-kb-datasource-アカウントID/bedrock/bedrock-ug.pdf"
			},
			"type": "S3"
		},
		"chunk_statistics": {
			"ignored": 0,
			"metadata_updated": 0,
			"failed_to_update_metadata": 0,
			"deleted": 0,
			"failed_to_delete": 0,
			"created": 2458,
			"failed_to_create": 0
		},
		"data_source_id": "N28PS05C9P",
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"status": "INDEXED"
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.ResourceStatusChanged",
	"level": "INFO"
}

全体処理完了

{
	"event_timestamp": 1719104726046,
	"event": {
		"ingestion_job_id": "PWA3CRTMT5",
		"data_source_id": "N28PS05C9P",
		"ingestion_job_status": "COMPLETE",
		"knowledge_base_arn": "arn:aws:bedrock:us-west-2:アカウントID:knowledge-base/4RNIPSDCOH",
		"resource_statistics": {
			"number_of_resources_updated": 0,
			"number_of_resources_ingested": 1,
			"number_of_resources_deleted": 0,
			"number_of_resources_with_metadata_updated": 0,
			"number_of_resources_failed": 0
		}
	},
	"event_version": "1.0",
	"event_type": "StartIngestionJob.StatusChanged",
	"level": "INFO"
}

ログレベルが WARN の場合や、 resource_statistics の項目をカスタムメトリクスとして設定するのが良さそうですね。

まとめ

以上、「Knowledge bases for Amazon Bedrock でデータの取り込み/エンべディングジョブに関するログ記録をサポートしました」でした。

RAG の導入が本格化してきている中、ログや監視周りのアップデートはかなり嬉しいですね。なぜ、エンべディング処理が失敗しているのかも理由がわかって良きでした。

このブログがどなたかの参考になれば幸いです。AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!


  1. EventBridge で受け取ったイベントを Lambda でログ記録するようなアプローチを考えていました。