この記事は、Exa の Ishan Goswami と Nitya Sridhar との共著です。
研究、ファクトチェック、競合分析のためのWeb検索対応AIエージェントを構築する場合、最新かつ信頼性の高い情報へのアクセスは極めて重要です。一般的な検索APIの大半はエージェントのワークフロー向けに設計されていません。これらは人間のブラウジングに最適化されたHTMLページや短いスニペットを返すため、エージェントが直接利用できる構造化データではありません。その結果、開発者は通常、このコンテンツをエージェントワークフロー内で利用可能な形に変換するために、カスタムクローラー、パーサー、ランキングロジックといった追加レイヤーを構築する必要があります。
Exa と Strands Agents SDK の統合は、AIネイティブな検索・取得レイヤーをツールインターフェースに直接組み込むことで、このギャップに対処します。Exa は、LLM のコンテキストウィンドウで直接使用できるようにフォーマットされた、クリーンで構造化されたコンテンツを提供します。マークアップの除去や出力の再フォーマットのための後処理は不要です。Strands Agents SDK のモデル駆動型アーキテクチャ(モデルがツールをいつ呼び出すか、その出力をどのように使用するかを決定する)と組み合わせることで、エージェントはリアルタイムのWeb知識を推論ループに取り込むことができます。
実際には、エージェントは2つのツールを通じてこの統合にアクセスします。exa_search は、ニュース、研究論文、リポジトリなどのカテゴリをサポートするセマンティック検索を実行し、exa_get_contents は選択したURLから完全なコンテンツを取得します。この記事では、Strands Agents で Exa 統合をセットアップする方法、公開される2つのコアツールを理解し、エージェントがWeb検索を使用してマルチステップタスクを完了する実際のユースケースを段階的に説明します。
Strands Agents
Strands Agents SDK は、モデル駆動型アプローチでAIエージェントを構築するための AWS のオープンソースフレームワークです。開発者は、すべてのステップを指示するハードコードされたワークフローを記述する代わりに、モデル、システムプロンプト、ツールのリストを提供します。モデル自体が次に何をすべきか(どのツールをどの順序で呼び出すか、いつタスクが完了するか)を決定します。Strands Agents の核となるのはエージェントループです。各イテレーションで、モデルは以前のすべてのツール呼び出しとその結果を含む完全な会話履歴を受け取ります。モデルがさらに情報を必要とする場合、ツールを要求します。Strands Agents がそれを実行し、結果をフィードバックします。このループは、モデルが最終的な回答を生成するまで続きます。このイテレーションをまたいだコンテキストの蓄積こそが、単一のLLM呼び出しで処理できる範囲を超えるマルチステップタスクをエージェントが処理できるようにする理由です。Strands Agents SDK には、ファイルI/O、シェル実行、Web検索、AWS API、メモリ、コード実行などをカバーする40以上のプリビルドツールが付属しています。また、Model Context Protocol (MCP) をサポートしているため、MCPサーバーによって公開されたツールは追加の統合作業なしでエージェントが利用できます。Exa のWeb検索ツールを含む新しいツールの追加も同じパターンに従います。ツールを tools=[] リストに追加するだけで、モデルはそのシグネチャから使用方法を学習します。
Exa
Exa は、LLM と AI エージェントのために特別に構築されたWebスケールの検索エンジンです。Exa は、クエリのキーワードだけでなく、意味を理解する検索エンジンです。「気候変動対策を構築するスタートアップ」のようなクエリは、たとえそれらのページがその正確なフレーズを使用していなくても、実際の気候スタートアップを返します。モデルは文字列の重複ではなく、セマンティック類似性でマッチングします。結果は、広告やSEOノイズのない、クリーンで構造化されたコンテンツとして返され、LLMが直接消費できる状態になります。
Strands Agents と Exa:統合の概要
Exa 統合は、strands-agents-tools パッケージを通じて利用可能です。これにより、エージェントは2つの機能を利用できます。関連コンテンツのWeb検索と、特定のURLからの全文テキストの抽出です。以下の図は、このブログの後半で詳しく説明する深層研究アシスタントの例を視覚化しています。
どちらもAI消費向けに最適化されており、エージェントが直接推論できる構造化コンテンツを返します。
- exa_search: auto、fast、deep を含む複数のモードを使用してWebを検索します。エージェントは、カテゴリ、ドメイン、日付、テキストコンテンツのフィルターで結果を絞り込むことができます。
- exa_get_contents: エージェントが発見したURL(以前の検索からか、自身の推論から)から完全なページコンテンツを取得します。このツールは最初にキャッシュされた結果をチェックして繰り返しのリクエストを高速化します。新しいコンテンツが必要な場合、自動的にライブクローリングにフォールバックしてページの最新バージョンを取得できます。
exa_search を使用したWeb検索
exa_search ツールは、エージェントに基本的なクエリ文字列を超えたWeb検索の制御を提供します。このツールは4つの検索モードをサポートしています。
- Instant (~200ms) – オートコンプリート、ライブ提案、音声エージェントなどのリアルタイムアプリケーション向けに設計されています。
- Fast (~450ms) – 速度を最適化しつつ、Exa の高品質インデックスにアクセスします。エージェントが数十回の検索呼び出しを行うエージェンティックワークフローに適しています。
- Auto (~1s) [推奨] – 待機時間と高品質結果のバランスが取れています。ほとんどのユースケースで推奨されます。
- Deep (~3-6s) – 最大のカバレッジを得るためにクエリバリエーションにわたって並列検索を実行します。完全性が重要な研究タスクに最適です。
検索モードに加えて、exa_search はエージェントに結果のフィルタリングとスコープの細かい制御を提供します。検索をニュース記事、企業ウェブサイト、GitHubリポジトリ、PDF、人物プロフィール、財務レポートなどの特定のコンテンツカテゴリに絞り込むことができます。カテゴリフィルタリングは、エージェントが必要とするソースの種類を既に知っている場合に最も効果的です。例えば、クエリが技術的な場合は研究論文にフィルタリングし、最新性を優先する場合はニュースソースにフィルタリングします。また、検索結果とともにコンテンツと要約を1回の呼び出しで要求することもできます:
agent.tool.exa_search(
query="recent advances in AI safety research",
num_results=10,
summary={"query": "key research areas and findings"}
)レスポンスには、タイトル、URL、および指定したクエリに焦点を当てた各結果の合成要約が含まれます。エージェントはすべてのページを完全に読むことなく、トピックの基礎的な理解を構築できます。
exa_get_contents を使用したコンテンツの抽出
エージェントが関連URLを見つけたら(以前の検索からでも自身の推論からでも)、exa_get_contents ツールが完全なページコンテンツを取得します。URLのリストを渡すと、抽出されたテキストが返され、エージェントが処理できる状態になります。Exa はコンテンツキャッシュを維持しており、既にクロールされているページには即座に結果を提供します。キャッシュにないページや、エージェントがページの最新バージョンを必要とする場合、このツールはライブクローリングをサポートしています。この動作は livecrawl モードで制御します。設定可能なタイムアウトにより、ライブクロールの完了を待つ時間を制御できます。また、返されるテキストの量も制御できます。例えば、ページから最大5000文字のプレーンテキストを取得するには:
agent.tool.exa_get_contents(
urls=["https://example.com/blog-post"],
highlight={"maxCharacters": 5000}
)前提条件
この記事の例に従うには、以下が必要です:
- Python 3.10 以降
- Amazon Bedrock アクセス権を持つ AWS アカウント
- Exa API キー
- strands-agents および strands-agents-tools パッケージのインストール:
pip install strands-agents strands-agents-toolsセットアップ
Exa ツールは、Strands Agents フレームワーク内の他のすべてのツールと同じパターンに従うため、他の Strands ツールを使用したことがあれば、同じエクスペリエンスです。Strands Agents SDK には、ファイル操作、Web検索、コード実行、AWS サービス、メモリ管理などをカバーするプリビルドツールのライブラリが含まれています。Exa ツールはこのライブラリの一部です。これらをインポートし、Agent コンストラクタに tools パラメータを通じて渡します。その後、エージェントの基盤となるLLMは、推論ループの一部として各ツールをいつ呼び出すかを決定します。統合は Exa REST API と直接通信するため、別の SDK をインストールしたり管理したりする必要はありません。唯一の新しい依存関係は strands-agents-tools パッケージです。
Exa を Strands Agents で使用するには、次の手順に従います:
- Exa API キーを設定する
Exa は認証アクセスに API キーを必要とします。エージェントを実行する前に、EXA_API_KEY 環境変数にキーを設定します。キーは Exa ダッシュボードから取得できます:
```bash export EXA_API_KEY="your_exa_api_key_here" ```
- ツールをインポートして登録する
エージェントコードで、strands_tools.exa から exa_search と exa_get_contents をインポートし、エージェントのツールリストに含めます:
```python from strands import Agent from strands_tools.exa import exa_search, exa_get_contents
agent = Agent(tools=[exa_search, exa_get_contents]) ```
- エージェントを呼び出す
ツールが登録されると、エージェントはその推論フローの一部として、検索とコンテンツ抽出を自然にインターリーブできます:
```python response = agent( "Search for the most recent trends in AI agents and provide a concise summary of key developments" ) ```
エージェントのセットアップが完了すると、さまざまな検索シナリオで Exa ツールを使い始めることができます。
例:Exa を使用した深層研究エージェントの構築
両方のツールがどのように連携するかを確認するために、以下の例では、マルチステップワークフローで両方の Exa ツールを実証する深層研究アシスタントを構築します。研究質問が与えられると、エージェントは異なるソースタイプにわたって4つのターゲット検索を実行し、最も有望な結果から完全なコンテンツを抽出し、すべてを構造化された研究ブリーフに統合します。ワークフロー全体は単一のエージェント呼び出し内で実行され、複数のツール呼び出しが推論ループの一部として行われます。
重要な設計上の洞察は、異なるソースタイプには異なる検索パラメーターが必要ですが、異なるツールは必要ないということです。2つの Exa ツールは、各ステップで異なるパラメーター構成(カテゴリをニュース、PDF、リポジトリにターゲット設定、日付フィルターで鮮度、JSON スキーマで構造化抽出、ライブクローリングで新しさ)でワークフロー全体で再利用されます。
はじめに
- Exa ダッシュボードで Exa API キーにサインアップ
- サンプルリポジトリをクローンし、深層研究アシスタントを実行
- システムプロンプトを自分のドメインに合わせて変更:ユースケースに合わせてカテゴリフィルター、日付範囲、JSON スキーマを交換
エージェントのセットアップ
セットアップには、モデル、システムプロンプト、および2つの Exa ツールが必要です:
from strands import Agent
from strands.models.bedrock import BedrockModel
from strands_tools.exa import exa_search, exa_get_contents
def create_research_agent() -> Agent:
model = BedrockModel(
model_id="us.anthropic.claude-sonnet-4-6",
region_name="us-west-2",
max_tokens=20000,
)
return Agent(
model=model,
system_prompt=load_system_prompt(),
tools=[exa_search, exa_get_contents],
)システムプロンプトは研究ワークフローを定義し、エージェントを6つのステップに導きます:異なるソースタイプに対する4つのターゲット検索、深掘りコンテンツ抽出、および最終的な統合パス。エージェントは、各ツールをいつどのように呼び出すか、結果をどのように解釈するか、いつ次のステップに移行するかを、推論ループの一部として決定します。
6ステップの研究ワークフロー
各ステップは、エージェントにその種類のコンテンツ向けに調整された異なるパラメーターで Exa ツールを呼び出すように指示します。
ステップ1:概要検索 – auto モードを使用した広範なスイープで基礎的な理解を構築します。システムプロンプトは、エージェントに以下のパラメーターで exa_search を呼び出すように指示します:
- type: "auto"
- num_results: 5
- text: {"maxCharacters": 2000}
- highlights: {"maxCharacters": 4000}
- summary: {"query": "What are the key concepts, main points, and important details?"}
- subpages: 2
- subpage_target: ["overview", "about", "introduction"]
- max_age_hours: 168
ステップ2:ニュース検索 – 焦点を30日間の日付ウィンドウ内のニュースソースに狭めます。日付の境界は Python で計算され、プロンプトに注入されます。max_age_hours は、キャッシュされたコンテンツの最大許容経過時間(時間単位)を設定します。
- category: "news"
- num_results: 5
- start_published_date: (計算値)
- text: {"maxCharacters": 1500}
- summary: {"query": "What are the key announcements, developments, and news?"}
- max_age_hours: 24
ステップ3:研究論文 – 研究論文やその他のソースを対象に後続のステップを続行します。紙面の都合上、詳細な設定は省略します。
このようにして、深層研究エージェントは複雑な研究タスクを自律的に完了し、Web情報をリアルタイムで取得して統合することができます。