Amazon NovaのWeb Groundingを使って、外部サービス不使用のWeb検索AIエージェントを作る
こんにちは👋
AWS上で開発したAIエージェントに、「今日の天気は?」や「XXのニュースについて教えてほしい」など、基盤モデルが知り得ない最新の情報を聞かれて困ることあると思います。
TavilyやBrave Searchなどの外部検索サービスを利用して、ツールやMCPとして組み込むのが従来のWeb検索AIエージェントの実装でしたが、なるべく外部サービスの契約をポコポコと増やすのは避けたいところです。
Amazon Nova Web Groundingの発表
最近、AWSに閉じた状態でWeb検索が可能になる「Amazon Nova Web Grounding」が発表されました。Amazon Nova限定ではあるものの、特に追加の設定など不要でWeb検索を利用できるという優れモノです。
今回はこちらを利用して、AWSだけで完結する外部サービスを使わないWeb検索AIエージェントを作ろうと思います。
Web Groundingを使ってみる
ちょうど最近Next.jsのメジャーバージョンがアップデートされたので、Web Groundingを使用して最新のリリースについて聞いてみたいと思います。
まずは、Nova Premier自身がNext.jsの最新リリースについて回答できないことを確認します。
import boto3
import json
client = boto3.client("bedrock-runtime", region_name="us-east-1")
response = client.converse(
modelId="us.amazon.nova-premier-v1:0",
messages=[
{
"role": "user",
"content": [{"text": "Next.jsの最新のアップデートについて教えて〜"}],
}
]
)
print(json.dumps(response, indent=2, ensure_ascii=False))
{
(省略)
"output": {
"message": {
"role": "assistant",
"content": [
{
"text": "Next.jsは、Reactフレームワークに基づいた人気の高いオープンソースのWeb開発フレームワークです。最新のアップデートバージョンについては、公式のNext.jsウェブサイトやGitHubリポジトリで確認するのが最も確実です。\n\nバージョン情報は頻繁に更新されるため、ここで具体的なバージョン番号を挙げることはできませんが、Next.jsのバージョンアップデートでは、一般的にパフォーマンスの改善、新機能の追加、セキュリティの強化などが行われることが多いです。\n\n最新情報を確認するには、以下の手順をおすすめします:\n\n1. **Next.jsの公式ウェブサイト**: [Next.js](https://nextjs.org/) にアクセスして、最新のドキュメントやアナウンスメントを確認してください。\n\n2. **GitHubリポジトリ**: Next.jsの[GitHubリポジトリ](https://github.com/vercel/next.js) にアクセスして、リリースノートを確認してください。リリースノートには、各バージョンの変更点や新機能が詳しく記載されています。\n\n3. **npmやyarn**: パッケージマネージャーを使用している場合は、以下のコマンドで最新バージョンを確認できます。\n ```bash\n npm show next version\n # または\n yarn info next version\n ```\n\nこれらのリソースを活用して、Next.jsの最新バージョンとその内容を確認してください。"
}
]
}
},
"stopReason": "end_turn",
(省略)
}
「最新のリリース情報については分からないから自分で調べてね」という優しい回答が返ってきました。詳しく聞き出しても知っているのはNext.js 15までの情報のようです。
次に、先ほどのコードにWeb検索を行うためのツールを追加します。
使い方を確認してみると、Converse APIに渡すsystemToolというパラメータが増えていますね。
AWS側で事前定義されているツールは、こちらに記載することで使えるようになるみたいです。
今回はWeb Groundingを使用したいので、ツール名にnova_groundingを指定します。
import boto3
import json
client = boto3.client("bedrock-runtime", region_name="us-east-1")
response = client.converse(
modelId="us.amazon.nova-premier-v1:0",
messages=[
{
"role": "user",
"content": [{"text": "Next.jsの最新のアップデートについて教えて〜"}],
}
],
toolConfig={
"tools": [{"systemTool": {"name": "nova_grounding"}}],
},
)
print(json.dumps(response, indent=2, ensure_ascii=False))
{
(省略)
"output": {
"message": {
"role": "assistant",
"content": [
{
"text": "<thinking>Next.jsの最新情報を取得する必要がある。</thinking>\n"
},
{
"toolUse": {
"toolUseId": "tooluse_JHY-BboncyRctPYStoAMqg",
"name": "nova_grounding",
"input": {
"query": "Next.jsの最新のアップデート"
},
"type": "server_tool_use"
}
},
{
"toolResult": {
"toolUseId": "tooluse_JHY-BboncyRctPYStoAMqg",
"content": [
{
"text": "[HIDDEN]"
}
],
"status": "success",
"type": "nova_grounding_result"
}
},
{
"text": "Next.jsの最新アップデートは、バージョン16で、いくつかの新機能と改善が導入されました"
},
{
"citationsContent": {
"citations": [
{
"location": {
"web": {
"url": "https://nextjs.org/blog/next-16",
"domain": "nextjs.org"
}
}
}
]
}
},
{
"text": "。\n\n主な変更点は次のとおりです:\n\n* Turbopackが安定版となり、デフォルトのバンドラーとして利用可能に\n* キャッシュコンポーネントの導入により、キャッシュの制御がより明示に\n* ルーティングとナビゲーションシステムの刷新\n* React 19.2のサポート\n\nバージョン16では、Turbopackが正式に安定版となり、デフォルトのバンドラーとして利用できるようになりました。また、キャッシュコンポーネントが導入され、キャッシュの制御がより明示かつ柔軟になりました。ルーティングとナビゲーションシステムも刷新され、パフォーマンスが向上しています。さらに、React 19.2がサポートされるようになりました。"
},
{
"citationsContent": {
"citations": [
{
"location": {
"web": {
"url": "https://nextjs.org/blog/next-16-beta",
"domain": "nextjs.org"
}
}
}
]
}
},
{
"citationsContent": {
"citations": [
{
"location": {
"web": {
"url": "https://nextjs.org/blog/next-16",
"domain": "nextjs.org"
}
}
}
]
}
}
]
}
},
"stopReason": "end_turn",
(省略)
}
ちゃんとWeb検索を実行した結果を引用して、Next.js 16のアップデート情報について回答することができていますね。
面白いことにWeb検索を使ったツールのやり取りを1回のAPIリクエストで返しています。
基本的にレスポンスとしてToolCallを受け取った場合、自力でToolResultを返してあげる必要があるのですが、SystemToolを利用するとConverse APIの裏側でよしなに実行した結果を返してくれるようです。
地味なポイントですが、外部サービスを使ってツールを自力で組むよりも、開発がちょっと楽になるので嬉しいですね。
Web Groundingのお困りポイント
Web Grounding自体は素晴らしい機能なんですが、とても大きな欠点を持っています。
それは...「Amazon Novaでしか使えない!」ということです。
AIエージェントにおける性能の良し悪しというのは、どれだけアーキテクチャを工夫しても基本的に元のLLMモデルに左右されます。GPT-5やClaude Sonnet 4.5といった強力なLLMモデルがAIエージェントとして採用されている中で、Amazon Novaの性能は少々心許ないです。
できれば、Amazon Bedrockでも利用可能なClaude Sonnet 4.5などと組み合わせてWeb検索機能を使いたいというのが、全Bedrockユーザの本音でしょう(Novaの組み込みツールではなく、AgentCoreのBuilt-in Toolsとして提供してほしかった)。
Strands AgentsでWeb検索AIエージェントを作る
Web Groundingの実行結果自体は「HIDDEN」として表示されるため、純粋なWeb検索ツールとして動かすことはできませんが、Brave SearchのSummarizer APIのように「Web検索結果の要約を返すツール」だと捉えれば、AIエージェントの一部として組み込むことができそうです。
今回は、簡単にAIエージェントを構築できるPythonフレームワークであるStrands Agentsを使用して、Calude Sonnet 4.5 + Web Groundingを使ったAIエージェントを構築してみます。
from typing import Annotated
import boto3
from strands import Agent, tool
from strands.models import BedrockModel
@tool(
name="WebSearch",
description="Searches the web for relevant information based on the given query and returns a consolidated summary.",
)
def web_search(
request: Annotated[str, "The search query describing what information to find"],
):
client = boto3.client("bedrock-runtime", region_name="us-east-1")
response = client.converse(
modelId="us.amazon.nova-premier-v1:0",
messages=[
{
"role": "user",
"content": [{"text": request}],
}
],
toolConfig={
"tools": [{"systemTool": {"name": "nova_grounding"}}],
},
)
result = ""
if "message" in (output := response["output"]):
for content in output["message"]["content"]:
if "text" in content and "<thinking>" not in content["text"]:
result += content["text"]
return result.strip()
if __name__ == "__main__":
agent = Agent(
model=BedrockModel(
model_id="jp.anthropic.claude-haiku-4-5-20251001-v1:0",
region_name="ap-northeast-1",
),
tools=[web_search],
)
agent("Next.jsの最新のアップデートについて教えて〜")
先ほどのWeb Groundingを使用したコードをStrands Agentsのtoolデコレータでラップしてあげます。こうすることによって、Strands Agentが利用できる1つのツールとして認識してくれるようになります。
ツールの実行結果としては、レスポンスから拡張思考やツールのやり取りを排除して整形した文字列を渡すようにします。あとは、AIエージェントに作成したWeb検索ツールを渡せば完成です。
Next.jsの最新のアップデートについて調べますね!
Tool #1: WebSearch
Next.jsの最新のアップデートについて情報をまとめました!🎉
## 📌 Next.js 16(最新版)- 2025年10月21日リリース
### 🚀 主な機能と改善
**1. Turbopackがデフォルトバンドラーに**
- 5〜10倍高速なリフレッシュ実現
- 5倍高速なビルド
- ビルド速度が大幅に向上
**2. 新しいキャッシング モデル**
- Partial Pre-Rendering(部分的な事前レンダリング)導入
- クライアント側キャッシング機構
- より細かいコントロール可能
**3. React 19.2 サポート**
- 最新のReactとの完全統合
- コンパイラー連携強化
**4. Next.js DevTools**
- Model Context Protocol(MCP)対応
- 開発効率向上
**5. Proxy.ts**
- ミドルウェアの代替機能
- ネットワーク境界管理の新方式
**6. ルーティング改善**
- レイアウト重複排除
- インクリメンタルプリフェッチング
### 📊 その他の主要バージョン
- **Next.js 15**: TypeScript強化、パフォーマンス最適化
- **Next.js 14**: React Server Components対応、Turbopackベータ版
これらのアップデートにより、**パフォーマンス面でも開発体験面でも大幅に改善**されています!何か特定の機能について詳しく知りたいことがあれば、教えてください😊
Web Groundingをラップしたツールをちゃんと内部で使ってくれていますね。
回答の内容も一応ちゃんと合っています(Novaから提供されるコンテキストが少ないので、情報スカスカの生成AI記事みたいになっちゃってますが...)。
これにより、Web検索機能を別のツールやMCPを並行して使用する複雑なタスクにも対応可能なAIエージェントになったのではないでしょうか?
ツールではなく、Remote MCPサーバとして実装することで、任意のメンバーが各々のMCPクライアントに自由に組み込んで使える検索サービスとして提供するとかもいいですね。夢が広がります。
まとめ
Amazon NovaのWeb Grounding機能を使用することで、TavilyやBrave Searchなどの外部検索サービスを新たに契約せずとも、AWSに閉じた状態でWeb検索AIエージェントを構築することができました。
そのうち任意の基盤モデルでWeb Groundingが利用できるようになる可能性もありますが、一時的な解決手段として役に立てば幸いです。
Discussion