はじめに
LLM に最新情報を答えさせようとすると、大抵は自前で Web 検索 API を契約して、検索結果をプロンプトに詰め込んで……という「グラウンディング」の仕組みを自分で組む羽目になります。
ベンダー選定や API キー管理、レイテンシ調整まで含めると地味に手間のかかる部分です。
2026年8月4日、Amazon Bedrock にこの検索処理をサーバーサイドで完結させる「Web Search」が GA になったようです。
Web Searchとは
Web Searchは、Bedrock の推論リクエストに 1 パラメータ足すだけで、Amazon 自身が運用するWebインデックス(数百億ドキュメント規模)とナレッジグラフを検索し、その結果をモデルに読ませたうえでグラウンディングされた回答を返してくれる組み込みツールのようです。
これまでのやり方との違いはこうなります。
検索・ページ内容の要約(セマンティックスニペット抽出)・引用付け、すべて Bedrock 側の 1 リクエストで完結する点が特徴のようです。
クライアント側でツール呼び出しのループを組む必要がありません。
また処理は Bedrock のインフラ内で完結し、データは AWS 環境の外に出ないとのことです。
現時点では OpenAI の GPT モデル(openai.gpt-5.4など)が、Bedrock の次世代推論エンジン(bedrock-mantle)経由・OpenAI Responses API 互換で対応しています。
発表時点での対応リージョンは米国東部(バージニア北部)・米国東部(オハイオ)・米国西部(オレゴン)の 3 つです。
やってみた
Python + OpenAI SDK + aws_bedrock_token_generator で、実際に Web Search 付きのリクエストを投げてみます。
pip install openai aws-bedrock-token-generator
手順1: AWS 認証情報からベアラートークンを発行する
bedrock-mantleエンドポイントは API キーではなく、既存の AWS 認証情報(IAM ロールや CLI プロファイル)から発行するベアラートークンで認証します。
裏側は SigV4 で、有効期限は最大 12 時間です。
from openai import OpenAI
from aws_bedrock_token_generator import provide_token
REGION = "us-east-1"
client = OpenAI(
base_url=f"https://bedrock-mantle.{REGION}.api.aws/openai/v1",
api_key=provide_token(region=REGION),
)
呼び出し元の IAM には、推論用のAmazonBedrockMantleInferenceAccessマネージドポリシーに加えて、Web Search 用にbedrock-websearch:InvokeSearchが必要なようです。
今回はローカルの検証用 IAM ユーザー(管理者権限)でそのまま実行しましたが、最小権限で運用するならこの 2 つを付与する形になると思われます。
手順2: tools に Web Search を追加して呼び出す
通常の Responses API 呼び出しに、tools を 1 エントリ足すだけです。
response = client.responses.create(
model="openai.gpt-5.4",
input="2026年8月時点でのAmazon Novaモデルファミリーの最新バージョンは何ですか?簡潔に答えてください。",
tools=[{"type": "web_search", "external_web_access": False}],
)
external_web_access は検索先の切り替えで、
True(既定値)だとライブの Web 取得、
Falseだと Amazon 側の事前インデックスから検索します。
ライブ取得には、bedrock-websearch:ExternalWebAccess権限が別途必要な一方、現時点ではライブ取得自体は未提供(インデックス検索のみ提供中)とのことなので、今はFalseにしておけば追加権限なしで動きます。
結果確認
実行すると、response.outputの中に検索ステップ(web_search_call)と、引用付きの本文(message)が入ってきます。
searches = [item for item in response.output if item.type == "web_search_call"]
print(f"Retrieval steps: {len(searches)}")
for call in searches:
if call.action.type == "search":
print(f" search: {call.action.queries}")
for item in response.output:
if item.type == "message":
for content in item.content:
if content.type == "output_text":
print(content.text)
for citation in content.annotations or []:
if citation.type == "url_citation":
print(f" [{citation.title}] {citation.url}")
出力はこうなりました。
Retrieval steps: 1
search: ['Amazon Nova model family latest version August 2026 official']
最新は **Amazon Nova 2.0** です。AWS公式ドキュメントでも「Amazon Nova 2.0」と明記されています。
([docs.aws.amazon.com](...), [docs.aws.amazon.com](...))
[] https://docs.aws.amazon.com/nova/
[What is Amazon Nova 2?] https://docs.aws.amazon.com/nova/latest/nova2-userguide/what-is-nova-2.html
1 件目の引用はタイトルが空文字列で返ってきました。トップページのようにページ内に<title>が無い(薄い)URL だと、こうしてタイトル抜きの引用になることもあるようです。
自前で検索 API を叩いてプロンプトに詰め直す処理を一切書かずに、モデルが自分で検索クエリを組み立て、公式ドキュメントを引用付きで回答してくれました。
url_citation には start_index/end_indexも入っているので、本文中の該当箇所にインライン脚注を付けるような表示も作れそうです。
まとめ
- Bedrock のリクエストに
tools=[{"type": "web_search"}]を足すだけで、外部 Web 検索ベンダーなしにグラウンディングされた回答が引用付きで得られるようになりました - 現状は OpenAI モデル限定なので、対応状況を見ながら既存の RAG/検索連携をどこまで置き換えられそうか検討してみると良さそうです