Home AWS解説: Amazon Bedrock×RAGによるエンタープライズText-to-SQLの構築パターン
投稿
キャンセル

✍️ AWS解説: Amazon Bedrock×RAGによるエンタープライズText-to-SQLの構築パターン

本記事は AWS Machine Learning Blog の解説記事です。

ブログ概要(Summary)

AWSは、RAGベースのドキュメントアシスタントにおいて、ベクトル検索だけでは構造化データの正確な問合せが困難であるという課題に対し、エンティティ抽出+SQLクエリ+エージェントを統合したアーキテクチャを提案している。Amazon Bedrock上のClaude 3.5 Sonnetと、Amazon Aurora PostgreSQLのpgvector拡張を組み合わせ、非構造化ドキュメントと構造化データの横断検索を実現する構成が紹介されている。

この記事は Zenn記事: LangGraph×Claude Sonnet 4.6でSQL統合Agentic RAGを実装する の深掘りです。

情報源

技術的背景(Technical Background)

ベクトル検索単体の限界

RAGの標準的な構成であるベクトル検索(Embedding → Vector Store → LLM生成)は、非構造化テキストの意味検索に優れるが、以下の課題がある:

  1. 数値クエリへの対応不足: 「先月の売上トップ5は?」のようなSQLの集計・ソートを必要とするクエリに対応できない
  2. 厳密なフィルタリングの困難: 「営業部かつ入社3年以上」のようなAND条件のフィルタリングはベクトル類似度では不正確
  3. リレーション結合の不在: テーブルJOINに相当する構造化操作がベクトル検索にはない

これらの課題は、Zenn記事で指摘した「ベクトル検索だけでは社員情報やチケットデータなどの構造化データに対応できない」という問題と完全に一致する。

AWSによるハイブリッドアプローチ

AWSブログでは、この課題を以下の3層アーキテクチャで解決する:

  1. エンティティ抽出層: Amazon Textractでドキュメントから構造化エンティティ(人名、日付、金額等)を抽出
  2. ハイブリッド検索層: Aurora PostgreSQL(pgvector)でベクトル検索とSQLクエリを同一DB上で実行
  3. エージェント層: Amazon Bedrock AgentsがClaude 3.5 Sonnetを用いて、クエリの意図に応じて検索パスを決定

実装アーキテクチャ(Architecture)

システム構成

1
2
3
4
5
6
7
8
9
10
11
12
13
ユーザークエリ
    ↓
[Amazon Bedrock Agent]
    ├── Claude 3.5 Sonnet(意図分類・SQL生成・回答合成)
    ↓
[Lambda Orchestrator]
    ├── エンティティ抽出(Amazon Textract)
    ├── SQLクエリ(Aurora PostgreSQL)
    └── ベクトル検索(Aurora PostgreSQL + pgvector)
    ↓
[回答生成]
    ↓
最終回答

主要AWSサービスと役割

サービス役割備考
Amazon BedrockLLMホスティング + Agent機能Claude 3.5 Sonnet使用
Amazon Bedrock Agentsエージェントループ、ツール選択ReActパターン
AWS Lambdaオーケストレーション各サービス連携
Aurora PostgreSQLRDB + ベクトルDBpgvector拡張で両機能を統合
Amazon Textractドキュメントからの構造化データ抽出OCR + エンティティ抽出
Amazon Titan Embeddingsテキスト→ベクトル変換1536次元
Amazon S3ドキュメントストレージソースドキュメント格納

Zenn記事との対比

側面Zenn記事の実装AWSブログの実装
LLMClaude Sonnet 4.6 (直接API)Claude 3.5 Sonnet (Bedrock経由)
ルーティングLangGraph StateGraph + with_structured_outputBedrock Agents (ReActパターン)
SQLSQLDatabaseToolkit + SQLiteAurora PostgreSQL
ベクトル検索ChromaDB + HuggingFace EmbeddingsAurora pgvector + Titan Embeddings
統合パターンノードベースの宣言的ルーティングエージェントベースのReActループ

設計思想の違い:

Zenn記事のLangGraph StateGraphアプローチは宣言的(declarative)で、ルーティングロジックをadd_conditional_edgesで明示的に定義する。一方、AWSのBedrock Agentsアプローチは命令的(imperative)で、LLMがReActパターンで動的にツールを選択する。

宣言的アプローチの利点:

  • ルーティングのテスト・デバッグが容易
  • 実行パスが予測可能
  • 各ノードを独立に差し替え可能

ReActアプローチの利点:

  • より柔軟なツール選択
  • 未知のクエリタイプへの対応力
  • 追加ツールの統合が容易

pgvectorによるSQL+ベクトル検索統合

AWSアーキテクチャの特徴的な点は、Aurora PostgreSQLのpgvector拡張により同一データベース上でSQLクエリとベクトル検索の両方を実行する設計である:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-- pgvectorによるハイブリッド検索の例
-- Step 1: ベクトル類似度検索
SELECT id, content, embedding <=> $1 AS distance
FROM documents
WHERE embedding <=> $1 < 0.5
ORDER BY distance
LIMIT 10;

-- Step 2: 構造化データのSQL結合
SELECT d.content, e.entity_name, e.entity_type
FROM documents d
JOIN entities e ON d.id = e.document_id
WHERE e.entity_type = 'PERSON'
  AND e.entity_name ILIKE '%田中%';

-- Step 3: ハイブリッド(ベクトル+SQL)
SELECT d.content, e.entity_name,
       d.embedding <=> $1 AS semantic_distance
FROM documents d
JOIN entities e ON d.id = e.document_id
WHERE e.entity_type = 'AMOUNT'
  AND CAST(e.entity_value AS numeric) > 1000000
ORDER BY semantic_distance
LIMIT 5;

Zenn記事ではChromaDB(ベクトル検索専用)とSQLite(SQL専用)を分離しているが、AWSアーキテクチャではpgvectorで統合している。これにより:

  • 利点: 単一DB接続で両方の検索が可能、トランザクション整合性を確保
  • 制約: pgvectorのベクトル検索性能は専用ベクトルDB(Pinecone, Qdrant等)には劣る可能性がある

Production Deployment Guide

AWS実装パターン(コスト最適化重視)

トラフィック量別の推奨構成:

規模月間リクエスト推奨構成月額コスト主要サービス
Small~3,000 (100/日)Serverless$80-200Lambda + Bedrock + Aurora Serverless v2
Medium~30,000 (1,000/日)Hybrid$400-1,000Lambda + Bedrock + Aurora + ElastiCache
Large300,000+ (10,000/日)Container$2,500-6,000EKS + Bedrock + Aurora Multi-AZ

Small構成の詳細 (月額$80-200):

  • Lambda: 1GB RAM, 120秒タイムアウト ($25/月)
  • Bedrock: Claude 3.5 Haiku + Titan Embeddings ($80/月)
  • Aurora Serverless v2: PostgreSQL 15 + pgvector, 0.5 ACU最小 ($40/月)
  • S3: ドキュメントストレージ ($5/月)

コスト削減テクニック:

  • Aurora Serverless v2のACU自動スケーリング(アイドル時0.5 ACU)
  • Bedrock Prompt Caching(スキーマ+ドキュメントメタデータのキャッシュ)
  • Lambda Provisioned Concurrency不使用(コールドスタート許容)
  • S3 Intelligent-Tiering(アクセス頻度に応じた自動階層化)

コスト試算の注意事項: 上記は2026年2月時点のAWS ap-northeast-1(東京)リージョン料金に基づく概算値です。実際のコストはトラフィックパターン、クエリ複雑度、ドキュメント数により変動します。最新料金は AWS料金計算ツール で確認してください。

Terraformインフラコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# --- Aurora PostgreSQL + pgvector ---
resource "aws_rds_cluster" "hybrid_search" {
  cluster_identifier = "hybrid-search-db"
  engine             = "aurora-postgresql"
  engine_mode        = "provisioned"
  engine_version     = "15.4"
  database_name      = "knowledge"

  serverlessv2_scaling_configuration {
    min_capacity = 0.5
    max_capacity = 8.0
  }

  storage_encrypted = true
}

resource "aws_rds_cluster_instance" "hybrid_search" {
  cluster_identifier = aws_rds_cluster.hybrid_search.id
  instance_class     = "db.serverless"
  engine             = aws_rds_cluster.hybrid_search.engine
  engine_version     = aws_rds_cluster.hybrid_search.engine_version
}

# --- Lambda (Orchestrator) ---
resource "aws_lambda_function" "orchestrator" {
  filename      = "orchestrator.zip"
  function_name = "hybrid-search-orchestrator"
  role          = aws_iam_role.lambda_role.arn
  handler       = "handler.main"
  runtime       = "python3.12"
  timeout       = 120
  memory_size   = 1024

  environment {
    variables = {
      DB_SECRET_ARN    = aws_secretsmanager_secret.db.arn
      BEDROCK_MODEL_ID = "anthropic.claude-3-5-haiku-20241022-v1:0"
    }
  }

  vpc_config {
    subnet_ids         = module.vpc.private_subnets
    security_group_ids = [aws_security_group.lambda.id]
  }
}

# --- Bedrock Agent ---
resource "aws_bedrockagent_agent" "sql_rag_agent" {
  agent_name                  = "hybrid-search-agent"
  agent_resource_role_arn     = aws_iam_role.bedrock_agent.arn
  foundation_model            = "anthropic.claude-3-5-sonnet-20241022-v2:0"
  idle_session_ttl_in_seconds = 600

  instruction = <<-EOT
    あなたは社内ナレッジ検索アシスタントです。
    ユーザーの質問に対して、SQLクエリとベクトル検索を
    適切に使い分けて回答してください。
  EOT
}

運用・監視設定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import boto3

cloudwatch = boto3.client('cloudwatch')

# Aurora pgvector検索レイテンシ監視
cloudwatch.put_metric_alarm(
    AlarmName='aurora-query-latency',
    ComparisonOperator='GreaterThanThreshold',
    EvaluationPeriods=3,
    MetricName='SelectLatency',
    Namespace='AWS/RDS',
    Period=300,
    Statistic='p99',
    Threshold=5000,  # P99 5秒超過でアラート
    AlarmDescription='Aurora pgvector Query Latency'
)

# Bedrock Agent実行時間監視
cloudwatch.put_metric_alarm(
    AlarmName='bedrock-agent-duration',
    ComparisonOperator='GreaterThanThreshold',
    EvaluationPeriods=2,
    MetricName='InvocationLatency',
    Namespace='AWS/Bedrock',
    Period=300,
    Statistic='Average',
    Threshold=30000,  # 平均30秒超過
    AlarmDescription='Bedrock Agent Invocation Latency'
)

コスト最適化チェックリスト

  • Aurora Serverless v2: 最小ACU 0.5設定
  • Bedrock Prompt Caching: スキーマ情報のキャッシュ有効化
  • Lambda: メモリサイズ最適化(CloudWatch Insights分析)
  • S3 Intelligent-Tiering: ドキュメントストレージ最適化
  • Bedrock Batch API: 非リアルタイム処理で50%削減
  • AWS Budgets: 月額予算設定(80%で警告)
  • Cost Anomaly Detection: 自動異常検知有効化
  • タグ戦略: 環境別(dev/staging/prod)でコスト可視化

パフォーマンス最適化(Performance)

ハイブリッド検索のレイテンシ

AWSブログで報告されている構成および関連ブログの情報に基づく参考値:

  • SQL検索パス: Aurora PostgreSQLでの単純SELECTは数十ms、JOIN+集計は100-500ms程度
  • ベクトル検索パス: pgvectorでの類似度検索はインデックス(IVFFlat/HNSW)により100-300ms程度
  • エージェントループ全体: Bedrock Agentの1ターンは5-15秒程度(LLM推論含む)

チューニング手法:

  • pgvectorのHNSWインデックス使用(IVFFlatより高速だがメモリ消費大)
  • Aurora Reader Instanceの追加(読み取りスケールアウト)
  • Lambda Provisioned Concurrencyでコールドスタート回避

運用での学び(Production Lessons)

AWSブログから読み取れる実運用の知見

  1. スキーマ情報のRAGが重要: 単純にSQLを生成するのではなく、テーブル定義、カラム説明、データサンプルをRAGで提供することで精度が向上する
  2. pgvectorの一元管理: RDBとベクトルDBを分離するより、pgvectorで統合した方が運用負荷が低い
  3. Bedrock Agentsの制御: ReActパターンは柔軟だが、ルーティングの予測可能性ではLangGraphのStateGraphが優れる

学術研究との関連(Academic Connection)

  • TAG (Biswal et al., 2024): AWSのハイブリッドアーキテクチャはTAGの実装パターンの一つと見なせる。Stage 1をBedrock Agentが、Stage 2をAurora PostgreSQLが、Stage 3をClaude Sonnetが担当
  • NL2SQL Survey (Cui et al., 2024): AWSのアプローチはサーベイのTool-Augmented + RAG-based手法の実例

まとめと実践への示唆

  • AWSはAurora PostgreSQL + pgvectorにより、単一DB上でSQLとベクトル検索を統合するアーキテクチャを推奨している
  • Bedrock AgentsのReActパターンとLangGraph StateGraphの宣言的ルーティングは、それぞれ異なるトレードオフを持つ
  • Zenn記事の実装をAWSにデプロイする場合、ChromaDB→Aurora pgvector、SQLite→Aurora PostgreSQLへの移行が推奨される

参考文献

この投稿は CC BY 4.0 でライセンスされています。

AWS解説: Amazon Bedrock×RAGによるText-to-SQLアプリケーション構築 — エンティティ抽出・SQL・ベクトル検索の統合

COLING 2025論文解説: MAC-SQL — Selector・Decomposer・Refinerによるマルチエージェント協調Text-to-SQL