この事例を読むべき理由
「社内にドキュメントが山ほどあるので、AIで質問に答えるチャットボットを作ってほしい」——この依頼が来たとき、多くのエンジニアはこう思います。「またRAGを組むのか……」 😅
Gallupはこの問題を少し違う角度で解きました。90年以上蓄積された職場心理学の研究、従業員エンゲージメントのデータ、CliftonStrengthsの診断結果を、単なる検索可能なドキュメント倉庫ではなく、リーダーが業務フローの中で即座に引き出せる「コーチ」へと変えたのです。
本記事は「AWSブログに良い事例があった」という要約ではありません。自社のRAGを構築する際にそのまま参考にできるアーキテクチャ上の意思決定ポイントを抽出して整理したものです。Bedrockを触ったことがなくても読めるように構成しています。
先に結論を述べます。
- Amazon Bedrock Knowledge Bases でマネージドRAGを採用(ベクトルDBを自前運用しない)
- Amazon Kendra で最新Webドキュメントまで二重インデックス化(過去アーカイブ+最新研究)
- Bedrock Guardrails で生成途中のポリシー違反をブロック
- Lambda + FastAPI + ElastiCache Serverless でsub-secondのストリーミング応答
- プロトタイプから本番まで MLOps専任チームなしで数週間
なお、本記事の元となるアーキテクチャ解説は AWS Architecture BlogのGallup事例 で根拠資料として確認できます。

アーキテクチャを分解する:5レイヤーで見るGallup AI
Gallup AIの構成は大きく ① データ収集 → ② 検索/グラウンディング → ③ 生成 → ④ キャッシュ/永続化 → ⑤ 可観測性 の5段レイヤーに分かれます。サーバーレス基盤のためオートスケールがデフォルトであり、マルチテナント(複数組織の同時利用)をサポートしています。
1) データ収集レイヤー — 「過去アーカイブ+最新Web」の二重化
# 概念的な疑似コード:Gallupの二重インデックス戦略
# (実際のコードではなく、アーキテクチャ理解用の例です)
# 1-A. 静的研究アーカイブ → Bedrock Knowledge Bases(マネージドRAG)
s3_bucket = "s3://gallup-research-archive"
knowledge_base = bedrock.create_knowledge_base(
name="gallup-proprietary-research",
data_source=s3_bucket,
embedding_model="amazon.titan-embed-text-v2",
vector_store="opensearch-serverless" # マネージドのため自前運用不要
)
# 1-B. 最新Webドキュメントのクロール → Amazon Kendra(リアルタイムインデックス)
kendra_index = kendra.create_index(name="gallup-live-web")
kendra.crawl(
start_url="https://www.gallup.com",
schedule="daily",
index=kendra_index
)
なぜ2つを併用するのか? Bedrock Knowledge Basesは不変に近い大容量アーカイブに強く、Kendraは頻繁に更新されるWebコンテンツに強いという特性があります。どちらか一方に統一すると、鮮度が落ちるかコストが跳ね上がります。二重化が定石です。
2) 検索/グラウンディングレイヤー — 信頼度スコアリング
リーダーが質問を投げると:
- Bedrock Knowledge Bases + Kendra の両方から並列検索
- ドキュメントごとに confidence threshold でフィルタリング
- 通過したドキュメントを consolidate(統合)
- Claudeモデルにコンテキストとして注入
ポイントは 「単にtop-kを取って突っ込む」のではなく、信頼度ベースのフィルタリングを行うことです。これがないとハルシネーションが急増します。
3) 生成レイヤー — Claude+Guardrailsの同時適用
# Bedrock呼び出し時にGuardrailsを生成途中で介入させる概念
response = bedrock_runtime.converse_stream(
model_id="anthropic.claude-sonnet-4-5", # リージョンごとの対応モデルを要確認
messages=[{"role": "user", "content": [{"text": user_query}]}],
guardrail_config={
"guardrailIdentifier": "gallup-content-safety",
"guardrailVersion": "1",
"trace": "enabled"
}
)
# 重要:ストリーミング中にポリシー違反が検知された場合、
# mid-streamで応答を遮断できる(事後フィルタリングではない)
mid-streamでの介入が本質的に重要です。事後フィルタリングでは、すでに危険な文がユーザー画面に表示された後になります。Guardrailsはトークンが出力される途中で遮断します。
4) キャッシュ/永続化レイヤー — 会話履歴の二重化
| ストレージ | 役割 | レイテンシ特性 |
|---|---|---|
| ElastiCache Serverless | 直近の会話履歴キャッシュ | sub-millisecond |
| RDS for MySQL | 会話/プロンプト/応答/出典の永続保存 | 標準RDBMS |
| DynamoDB | ユーザーロール別のパーソナライズコンテキスト | 柔軟なスキーマ |
「なぜRedis一つで済まないのか?」 → 監査(audit)と出典引用(citation)が必要だからです。リーダー向け製品では「この回答の根拠は何か」という問いが規制リスクに直結します。
5) 可観測性レイヤー — トークン単位のコスト追跡
# Data Firehoseに流す主要メトリクス
metrics = {
"input_tokens": response.usage.input_tokens,
"output_tokens": response.usage.output_tokens,
"cached_tokens": response.usage.cache_read_input_tokens, # コスト最適化の鍵
"ttfb_ms": time_to_first_byte,
"stop_reason": response.stop_reason # guardrail_intervened の有無を確認
}
firehose.put_record(DeliveryStreamName="gallup-ai-metrics", Record=json.dumps(metrics))
cached_tokens は必ず確認してください。 プロンプトキャッシュがどれだけ効いているかが、そのまま月次請求額になります。stop_reason に guardrail_intervened がどれだけ記録されるかも、安全性指標として活用できます。

このアーキテクチャの限界と注意点(冷静に)
AWSブログの事例記事は成功談のみが並ぶ傾向があるため、実務者が見るべき影の部分を指摘します。
⚠️ 1) Claudeモデルのリージョン制約
Anthropic Claude on Bedrockはすべてのリージョンで提供されているわけではありません。 原文でも「select AWS Regions」と明記されています。日本国内でサービス提供する場合、東京リージョン(ap-northeast-1)でどのClaudeモデルがサポートされているかを最初に確認する必要があります。対応していない場合は大阪やバージニアへのクロスリージョン呼び出しになりますが、レイテンシとデータレジデンシーの問題が即座に表面化します。
⚠️ 2) Bedrock Knowledge BasesのマネージドRAGは「ただ飯」ではない
- チャンキング戦略をカスタマイズしにくいです。文書構造が特殊な場合(例:表が多いHRレポート)は検索品質が急落します。
- ハイブリッド検索(キーワード+ベクトル)のチューニングが限定的です。ドメイン特化検索が必要なら、OpenSearchを直接接続する方が適しています。
- コストモデルが不透明です。埋め込み再生成、ベクトルストアのストレージ、クエリコストがそれぞれ課金されます。PoC時点では安く見えても、本番で驚くことがあります。
⚠️ 3) Kendraは強力だが高価
Kendraはエンタープライズ検索品質が高い代わりに、時間単位のインデックスコストが相当かかります。「Webクロールを数件」程度なら、Bedrock Knowledge BasesにWebクローラーを直接接続する方がはるかに安価です。Kendraは真に大規模な文書セット+コネクタが必要な場合にのみ使用してください。
⚠️ 4) Guardrailsは万能ではない
Guardrailsはポリシーベースのフィルターです。ドメイン特化の微妙な不適切応答(例:労働法に関する誤った助言)は捕捉できません。Gallupのようにドメイン専門家が応答を定期的にレビューするヒューマン・イン・ザ・ループが必須です。
⚠️ 5) 「MLOpsチームなしで数週間」は条件付き
これはAWSマネージドサービスに最大限乗った場合に成立します。カスタムモデルのファインチューニング、自前ベクトルDB運用、独自評価パイプラインを入れた瞬間にMLOps人材が必要になります。Gallupが速く進めた理由は、**「ファインチューニングを諦めてRAGに集中したから」**です。
日本の開発エコシステムにおける適用文脈
国内のSI/エンタープライズ環境でこのアーキテクチャをそのまま持ち込むと、いくつかの点で齟齬が生じます。
- 規制産業(金融/医療/公共):データレジデンシー要件により東京リージョン内での完結が強制されます。Claudeモデルの対応可否がプロジェクトの成否を分けます。
- 社内文書はほとんどが非構造化:日本の企業文書は表、画像、スキャンPDFの比率が高く、Bedrock Knowledge Basesのデフォルトパーサーでは不十分です。Textract+カスタムチャンキングを前段に置くことを推奨します。
- 権限体系が複雑:Gallupは「リーダー」ロール中心ですが、日本の組織はチーム/本部/役員ごとに閲覧権限が多層的です。DynamoDBのパーソナライズレイヤーに権限フィルターを必ず入れる必要があります。そうしないと役員専用文書がチームリーダーに漏れます。
次のステップ学習の方向性
このアーキテクチャを自分で作ってみるなら、以下の順序で進めてください。
- Bedrock Knowledge BasesのチュートリアルでS3 → ベクトル検索まで30分で貫通する
- Bedrock GuardrailsでPIIマスキングポリシーを1つ作成し、ストリーミング途中の遮断を確認
- Lambda + FastAPI +
converse_streamでsub-secondストリーミング応答のPoC - Data Firehose → S3 → Athena でトークン/コストダッシュボード構築(ここで実力が分かれます)
- 余裕があれば Bedrock AgentCore でエージェント化(Gallupの次のロードマップがここです)
特に4番を飛ばすチームが多いのですが、トークン可観測性なしで運用する生成AIサービスは請求書地獄に直行します。

まとめ
Gallupの事例が印象的な理由は、**「最新モデルを使った」ことではなく「マネージドサービスの組み合わせでMLOps負担を排除し、RAG品質と可観測性に集中した」**点にあります。
そのまま持ち帰れる原則は3つです。
- RAGは二重化せよ — 不変アーカイブ(Bedrock KB)+最新Web/文書(Kendraまたは自前クローラー)
- Guardrailsは生成途中で介入させよ — 事後フィルタリングは遅い
- トークン単位の可観測性を最初から付けよ — 後から付けるのは手遅れ
AIアシスタントを「とりあえず作ってみよう」で始めるチームと、「可観測な状態にしよう」で始めるチームは、6か月後の保守コストで完全に分かれます。
あわせて読みたい記事
- CSSで完璧なパイチャートを作る:セマンティクスとアクセシビリティを考慮した実践ガイド — フロントエンド観点でAI応答を可視化する際に参考になるアクセシビリティ原則
- 2026年第1四半期、世界のインターネットを麻痺させた7つの衝撃的事件 — AI依存インフラが拡大した今、障害対応の観点から読み返す価値のあるまとめ