はじめに
#4でCDKとGitHub ActionsによるCI/CDを構築しました。
今回の#5では、Amazon Bedrockを使って、走行データを自然言語で分析できる基盤と、A2D2論文をRAGで参照できる知識ベースを構築します。
アーキテクチャ(#5追加分)
構成の選定理由
Lambda + Action Groupでtext-to-SQLを実装しようとしたが詰まり、Bedrock Knowledge Basesの構造化データストア機能に切り替えました。Lambda・Action Group不要でRedshiftへのtext-to-SQLが動作する最短構成です。
ハマりポイント
① テーブルの説明がないとSQL生成に失敗する
テーブル名だけ指定してもスキーマ情報が不足しているため「No valid SQL generated」エラーが発生します。テーブルと列の説明を追加することで解決します。
② マルチモーダルストレージとデータソースに同じバケットを指定するとエラー
「An error occurred while validating write access」エラーが発生します。マルチモーダルストレージには別バケットを指定する必要があります。
③ ベクトルストアKBのデータソースに基盤モデルパーサーを使うとAgentが400エラー
基盤モデルパーサーを使うとPDFの図・表が画像(base64)として返され、Agentがそれを処理できない問題が発生します。デフォルトパーサー(テキストのみ)を使うことで解決します。
④ Redshiftが停止しているとAgentが400エラー
構造化データストアKBはRedshiftに直接クエリするため、Redshiftが停止していると即座に失敗します。Agentを使う前にRedshiftを起動してください。
⑤ Agentがクエリ結果の単位を曖昧に回答することがある
Redshiftから返る値は数値のみで単位情報が含まれません。Claude Sonnet 4.6では「12.71 km/h(またはm/s)」と曖昧な回答になりました。AS句でカラム名に単位を含める(例:AVG(vehicle_speed) AS avg_speed_kmh)ことで正確な単位を伝えられます。
手順
Part 1:構造化データストアKB(Redshiftへのtext-to-SQL)
Step 1:Knowledge Base作成
AWSコンソール → Bedrock → Knowledge bases → 作成 → 「構造化データストアを含むナレッジベース」
⚠️ 「ベクトルストアを含むナレッジベース」ではないので注意。
設定:
-
名前:
a2d2-structured-kb - クエリエンジン:Amazon Redshift プロビジョン済み
- 認証:Secrets Manager
Secrets Managerへの認証情報登録:
aws secretsmanager create-secret \
--name a2d2-redshift-secret \
--secret-string '{
"username": "admin",
"password": "<YOUR_PASSWORD>",
"engine": "redshift",
"host": "<REDSHIFT_ENDPOINT>",
"port": 5439,
"dbname": "adasdb",
"dbClusterIdentifier": "adas-portfolio"
}' \
--region ap-northeast-1
Step 2:テーブルの説明を追加
テーブルの説明がないとSQL生成に失敗します。クエリエンジンの編集 → テーブルと列の説明に追加:
| テーブル名 | 説明 |
|---|---|
adasdb.a2d2.bus_data |
A2D2走行データのCAN信号。vehicle_speed(km/h), brake_pressure, steering_angle_calculated(degree), acceleration_x/y/z, latitude_degree, longitude_degreeなどを含む |
adasdb.a2d2.drive_data |
カメラ・LiDARのS3パス管理テーブル。sensor_id, data_ts, s3_bucketなどを含む |
Step 3:テスト結果
質問: a2d2.bus_dataテーブルの全レコードの平均速度と最高速度と総レコード数を教えてください
回答: `a2d2.bus_data`テーブルの全レコード(45,984件)を集計した結果、
平均速度は約12.71 km/h、最高速度は約38.47 km/hでした。
生成SQL:
SELECT AVG("vehicle_speed") AS "avg_vehicle_speed",
MAX("vehicle_speed") AS "max_vehicle_speed",
COUNT(*) AS "total_records"
FROM a2d2.bus_data;
Part 2:ベクトルストアKB(A2D2論文RAG)
Step 1:A2D2論文をS3にアップロード
wget https://arxiv.org/pdf/2004.06320 -O a2d2_paper.pdf
aws s3 cp a2d2_paper.pdf \
s3://your-adas-portfolio-kb/docs/a2d2_paper.pdf \
--region ap-northeast-1
Step 2:Knowledge Base作成
# マルチモーダルストレージ用に別バケットを作成(データソースと同じバケットはNG)
aws s3 mb s3://your-adas-portfolio-kb-mm --region ap-northeast-1
コンソールで作成:Bedrock → Knowledge bases → 作成 → 「ベクトルストアを含むナレッジベース」
- 解析戦略:Amazon Bedrockデフォルトパーサー(テキストのみ・画像なし)
-
マルチモーダルストレージ:
s3://your-adas-portfolio-kb-mm/(データソースと別バケット必須) - 埋め込みモデル:Titan Text Embeddings V2
- ベクトルストア:OpenSearch Serverless クイック作成(コンソールが自動で作成)
KB作成後、コンソールに表示されるサービスロール名を確認してS3権限を付与:
aws iam attach-role-policy \
--role-name <コンソールで確認したロール名> \
--policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
CLIでデータソースを追加・同期:
KB_ID=<YOUR_KB_ID>
# デフォルトパーサーでデータソース作成
DS_ID=$(aws bedrock-agent create-data-source \
--knowledge-base-id $KB_ID \
--name a2d2-paper-text \
--data-source-configuration '{
"type": "S3",
"s3Configuration": {
"bucketArn": "arn:aws:s3:::your-adas-portfolio-kb",
"inclusionPrefixes": ["docs/"]
}
}' \
--region ap-northeast-1 \
--query 'dataSource.dataSourceId' \
--output text)
# 同期
aws bedrock-agent start-ingestion-job \
--knowledge-base-id $KB_ID \
--data-source-id $DS_ID \
--region ap-northeast-1
Step 3:テスト結果
質問: A2D2データセットはどのような車両とセンサーを使用していますか?
回答:
A2D2データセットは、Audi Q7 e-tronを使用してデータを収集しました。
センサー構成としては、6台のカメラと5台のVelodyne VLP-16 LiDARセンサーが
搭載されており、合計80チャンネルのLiDARを備えています。これにより、車両周囲の
360°全方位のセンサーカバレッジが実現されています。また、カメラとLiDARデータに
加えて、加速度、角速度、GPS座標、ブレーキ圧力、ピッチ・ロール角、ステアリング
ホイール角、スロットルなどを含む車両バスデータも記録されています。
Part 3:Bedrock Agent(2つのKBを統合)
Step 1:エージェント作成
AWSコンソール → Bedrock → エージェント → 作成
設定:
-
名前:
a2d2-analyst - モデル:Claude Sonnet 4.6(JP)
- 指示:「あなたはA2D2走行データセットの分析エージェントです。利用可能なテーブル:a2d2.bus_data、a2d2.drive_data。ユーザーの質問に対してKnowledge Baseを使って回答してください。」
Step 2:2つのKBを紐付け
-
a2d2-structured-kb:走行データの統計・分析に関する質問に答える -
a2d2-paper-kb:A2D2データセットの仕様・センサー・論文に関する質問に答える
Step 3:テスト結果
質問: 走行データの平均速度と、A2D2データセットで使用されているセンサーを教えてください
回答:
走行データの平均速度は約12.71 km/h(またはm/s)です。
A2D2データセットでは、以下のセンサーが使用されています:
- カメラ: 6台(広角レンズおよびフィッシュアイレンズ)- 全方位360°のカバレッジを実現
- LiDAR: 5台のVelodyne VLP-16センサー(合計80チャンネル)
- 車両バスデータ: 加速度・角速度・GPS座標・ブレーキ圧力・ピッチ・ロール角など
データ収集車両は**Audi Q7 e-tron**で、ドイツ南部の高速道路・郊外道路・市街地において
曇り・雨・晴れなど様々な天候条件下で収録されています。
1つの質問に対してAgentが:
-
a2d2-structured-kb(Redshift)から平均速度を取得 -
a2d2-paper-kb(論文RAG)からセンサー情報を取得 - 両方を統合して日本語で回答
を自動的に行っています。
#5 まとめ
| 項目 | 内容 |
|---|---|
a2d2-structured-kb |
構造化データストア → Redshiftにtext-to-SQL |
a2d2-paper-kb |
ベクトルストア → A2D2論文RAG |
| Bedrock Agent | 2つのKBを統合 → 自然言語で横断分析 |
| 結果 | 45,984件 / 平均12.71km/h / センサー仕様を論文から回答 |
追記
最後にお恥ずかしい失敗談の共有です。
本検証の終了後、aws-nuke を使用して関連リソースを削除しましたが、OpenSearch Serverless のリソースが削除できておらず、そのまま残存する事象が発生しました。
試行錯誤の過程で複数作成されてしまっていたリソースが稼働し続け、結果として$15/日程度の意図しない課金が数日間発生してしまいました。AWS Budgets のアラートを設定していたおかげで気づけましたが……。
本記事の内容に関わらずですが、クラウドを使って検証した後は、必ずマネジメントコンソールから全リソースが削除されていることを確認してください。
AWSの場合は、Management Console上の Amazon Q を活用し、リソースの残存状況や課金状況を対話的にダブルチェックする手法も有効かと思います。




