概要
前回はGenUのデフォルト状態で使えるユースケースのバックエンド処理を深掘りしました。
今回はデフォルトで有効化されていない機能を実際に有効化してみます。対象は下記の2つです。
- RAG チャット(Knowledge Base)
- モニタリング用ダッシュボード
どちらもアーキテクチャのページで構成図が示されており、デプロイオプションのページに有効化手順が載っています。手順通りに進めつつ、実際に手を動かすと出てくるエラーや確認ポイントを記録していきます。
RAG チャット(Knowledge Base)の有効化
cdk.jsonの変更
packages/cdk/cdk.jsonのcontext以下に、下記のパラメータを追加します。
"ragKnowledgeBaseEnabled": true,
"ragKnowledgeBaseStorageType": "s3vectors",
"rerankingModelId": "amazon.rerank-v1:0",
"ragKnowledgeBaseAdvancedParsing": true,
"ragKnowledgeBaseAdvancedParsingModelId": "amazon.nova-lite-v1:0",
各パラメータの意味は下記の通りです。
-
ragKnowledgeBaseEnabled:Knowledge Base連携のRAGチャットユースケースを有効化するフラグ -
ragKnowledgeBaseStorageType:ベクトルストアのバックエンド。デフォルトはopensearch(OpenSearch Serverless)ですが、今回はs3vectors(Amazon S3 Vectors)を選択しました。OpenSearch Serverlessは常時起動のOCU課金が発生するのに対し、S3 Vectorsは使った分だけの課金で固定費がかからないためです -
rerankingModelId:検索結果を再ランキングするモデル -
ragKnowledgeBaseAdvancedParsing/ragKnowledgeBaseAdvancedParsingModelId:Advanced Parsingの有効化と、そこで使うモデル。Advanced Parsingは、PDF内の表やグラフといった非構造化データから情報を抽出してチャンクに含める機能です
チャンク戦略の変更
packages/cdk/lib/rag-knowledge-base-stack.tsにチャンク戦略を指定する箇所があり、コメントアウトで複数の戦略が用意されています。今回はセマンティックチャンクを使うようにコメントアウトを外しました。
// packages/cdk/lib/rag-knowledge-base-stack.ts
chunkingConfiguration: {
chunkingStrategy: 'SEMANTIC',
semanticChunkingConfiguration: {
maxTokens: 300,
bufferSize: 0,
breakpointPercentileThreshold: 95,
},
},
デフォルトの固定サイズチャンクは単純に文字数で分割しますが、セマンティックチャンクは文章の意味的なまとまりを見て分割位置を決めます。breakpointPercentileThresholdが分割の閾値で、値を大きくするほどチャンクが大きくまとまりやすくなります。
デプロイとエラー
ここまでの変更を反映するため、デプロイを実行します。
npm run cdk:deploy
デプロイ自体は成功し、Knowledge Baseが作成されました。しかし、データソースの同期(Sync)を実行した段階で下記のエラーが発生しました。
データ同期が失敗しました。 "Knowledge base role arn:aws:iam::xxxxxxxxxxxx:role/RagKnowledgeBaseStack-KnowledgeBaseRoleXXXXXXXX-XXXXXXXXXXXX is not able to call the specified model arn:aws:bedrock:ap-northeast-1::foundation-model/anthropic.claude-3-sonnet-20240229-v1:0: This model version has reached the end of its life. Please refer to the AWS documentation for more details. (Service: BedrockRuntime, Status Code: 404, Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) (SDK Attempt Count: 1)"
原因はragKnowledgeBaseAdvancedParsingModelIdです。ドキュメントに載っているデフォルト値のanthropic.claude-3-sonnet-20240229-v1:0(Claude 3 Sonnet)が、すでにEnd of Life(提供終了)になっているモデルでした。IAMロールの権限不足ではなく、指定したモデル自体がもう呼び出せない状態だったということです。
対処として、Advanced Parsingで利用するモデルをamazon.nova-lite-v1:0に変更しました。前述のcdk.jsonの設定は、この対処後の値になっています。変更後に再度デプロイし、Syncをやり直すことでエラーが解消しました。
ナレッジベースの確認
デプロイ完了後、Bedrockのコンソールからナレッジベースが作成されていることを確認します。
データソースの設定を確認すると、ナレッジベースのソースとなっているS3バケットが指定されています。
このS3バケットを開くと、下記の通りBedrockのドキュメントが格納されていることを確認できます。デプロイ時に/packages/cdk/rag-docs/docs配下のサンプルデータが自動でこのバケットにアップロードされる仕組みです。
データソースの画面に戻り、同期(Sync)を実行します。Statusが「Available」になれば取り込み完了です。
動作確認
GenUの画面からRAGのユースケースを選択し、質問を入力します。
RAGを使用した回答が返ってくることを確認できました。回答の根拠として、ナレッジベースから検索されたドキュメントの引用も一緒に表示されます。
モニタリング用ダッシュボードの有効化
cdk.jsonの変更
続いてモニタリング用ダッシュボードを有効化します。packages/cdk/cdk.jsonのcontextに下記を追加します。
"dashboard": true,
デプロイ
npm run cdk:deploy
modelRegionに指定したリージョンにGenerativeAiUseCasesDashboardStackという名前のスタックが新たに作成されます。デプロイ完了時の出力に、このあとの手順で使うBedrockLogGroupとDashboardUrlが表示されます。
Bedrockのログ出力設定
ダッシュボードにはBedrockの呼び出しログ(プロンプトの内容など)を表示するウィジェットがありますが、これはCloudWatch Dashboardが自動で収集するわけではなく、Bedrock側でログ出力を有効化しておく必要があります。
Amazon Bedrockの設定画面を開き、Model invocation loggingを有効化します。
- Select the logging destinations:
CloudWatch Logs onlyを選択(S3にも残したい場合はBoth S3 and CloudWatch Logsでも構いません) - Log group name:デプロイ時に出力された
BedrockLogGroupの値を指定します - Service role:新規に作成
この設定はmodelRegionと同じリージョンで行う必要があります。リージョンを間違えるとログがダッシュボードに反映されないので注意が必要です。
ダッシュボードの確認
設定完了後、デプロイ時に出力されたDashboardUrlを開きます。CloudWatchのダッシュボードなので、GenUの画面には組み込まれておらず、マネジメントコンソール側で確認する形になります。







