LLM検索API、どれを使う?MCPで3つのLLM検索を試してみた
背景
現在、社内の技術記事をRAG検索して回答するAIチャットボットの開発を行っています。
しかし、ユーザーが求める情報が社内の技術記事にない場合、十分な情報が得られないままAIチャットボットが回答を作るという問題が発生します。このような場合においてインターネット検索を行い、不足情報を補ってから回答を作ることで問題が解決することを期待しました。
そこで今回は社内の技術記事のRAG検索の情報不足を補えるようなインターネット検索を行うエージェントを構築するため、LLM検索APIを検証しプロダクト開発に採用する技術を決めたいと思います。
検証対象
うさぎでもわかるLLM検索APIサービス比較 2025年最新版を参考にして検証するLLM検索APIを絞り込みました。検証するAPIは以下の3つです
- Tavily
- Exa
- DuckDuckGo
プロダクト開発は当面の間検証段階のため、コスト負担の観点から無料で利用できるDuckDuckGoも検証対象に含めることにしました。いずれのAPIもMCPを利用することができますので、そちらで動作検証を行います。
なお、以下のAPIは検証しておりません。
- Perplexity → 今回はいったん除外
- Metaphor → Exaの旧名称であり、ExaはMetaphorの機能拡張版であるため除外
- Google PSE → 他のLLM検索APIとは異なり、RAG用の特別な最適化はないため除外
環境
項目 | バージョン |
---|---|
OS | Windows 11 |
ランタイム | Node.js v22.14.0 |
主要ライブラリ | mastra: 0.10.5, @ai-sdk/azure: 1.3.23 |
検証内容
今回はTavily、Exa、DuckDuckGoのそれぞれのMCPツールに対して以下のクエリを与え、実行結果を比較しようと思います。
- PythonでCastするにはどうすればよいですか?
- 今日の岡山市の天気は?
- Mastraとはなんですか?
なお、MCP連携のためMCPクライアントにはNode.jsで作成したMastraエージェントを利用しています。
検証コード
以下がNode.jsで作成したMastraエージェント(MCPクライアント)のコードです。agent.generate
の引数にクエリを入力し、それぞれのLLM検索APIを呼び出します。いずれも非常に簡単なコードで実行できます。
Tavily
import { Agent } from '@mastra/core/agent';
import { createAzure } from "@ai-sdk/azure"
import { config } from "./config.js"
import { MCPClient } from "@mastra/mcp";
// Azure 接続情報 設定
const azure = createAzure({
apiKey: config.apiKey,
resourceName: config.resourceName,
})
// MCPクライアント 作成
const mcp = new MCPClient({
servers: {
tavily: {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.tavily.com/mcp/?tavilyApiKey=" + config.tavilyKey
]
},
},
});
// エージェント 作成
export const agent = new Agent({
name: "AI Agent",
instructions: "あなたは情報を検索し、質問に答えるAIエージェントです。",
model: azure(config.deploymentName),
tools: await mcp.getTools(),
});
// プロンプトをエージェントに送信
const result = await agent.generate("こちらに質問文を入力します")
// 回答表示
console.log(result.text)
// プロセス終了
process.exit(0);
Exa
import { Agent } from '@mastra/core/agent';
import { createAzure } from "@ai-sdk/azure"
import { config } from "./config.js"
import { MCPClient } from "@mastra/mcp";
// Azure 接続情報 設定
const azure = createAzure({
apiKey: config.apiKey,
resourceName: config.resourceName,
})
// MCPクライアント 作成
const mcp = new MCPClient({
servers: {
"exa": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://mcp.exa.ai/mcp?exaApiKey=" + config.exaKey
]
},
},
});
// エージェント 作成
export const agent = new Agent({
name: "AI Agent",
instructions: "あなたは情報を検索し、質問に答えるAIエージェントです。",
model: azure(config.deploymentName),
tools: await mcp.getTools(),
});
// プロンプトをエージェントに送信
const result = await agent.generate("こちらに質問文を入力します")
// 回答表示
console.log(result.text)
// プロセス終了
process.exit(0);
DuckDuckGo
※ 事前に以下を実行してください。
uv pip install duckduckgo-mcp-server
import { Agent } from '@mastra/core/agent';
import { createAzure } from "@ai-sdk/azure"
import { config } from "./config.js"
import { MCPClient } from "@mastra/mcp";
// Azure 接続情報 設定
const azure = createAzure({
apiKey: config.apiKey,
resourceName: config.resourceName,
})
// MCPクライアント 作成
const mcp = new MCPClient({
servers: {
"ddg-search": {
"command": "uvx",
"args": ["duckduckgo-mcp-server"]
},
},
});
// エージェント 作成
export const agent = new Agent({
name: "AI Agent",
instructions: "あなたは情報を検索し、質問に答えるAIエージェントです。",
model: azure(config.deploymentName),
tools: await mcp.getTools(),
});
// プロンプトをエージェントに送信
const result = await agent.generate("こちらに質問文を入力します")
// 回答表示
console.log(result.text)
// プロセス終了
process.exit(0);
実行結果
APIの実行結果はそれぞれ以下になりました。
Tavily
- PythonでCastするにはどうすればよいですか?
Pythonでの「キャスト(Cast)」は、あるデータ型の値を別のデータ型に変換することを指します。Pythonでは、主に組み込み関数を使ってキャストを行い ます。代表的なキャスト方法をいくつか紹介します。
1. int() — 整数に変換
x = "123"
y = int(x) # yは整数の123になる
2. float() — 浮動小数点数に変換
x = "3.14"
y = float(x) # yは浮動小数点数の3.14になる
3. str() — 文字列に変換
x = 100
y = str(x) # yは文字列の"100"になる
4. list() — リストに変換
x = "abc"
y = list(x) # yは['a', 'b', 'c']になる
5. tuple() — タプルに変換
x = [1, 2, 3]
y = tuple(x) # yは(1, 2, 3)になる
6. bool() — 真偽値に変換
x = 0
y = bool(x) # yはFalseになる
もし特定の型へのキャスト方法や、カスタムクラスのキャストについて知りたい場合は、具体的に教えてください。
- 今日の岡山市の天気は?
今日の岡山市の天気については、以下のサイトで最新の天気予報を確認できます。
- NHK 岡山市北区の天気予報(1時間毎の予報や10日間の天気、降水確率、最高・最低気温など)
https://www.nhk.or.jp/kishou-saigai/city/weather/33100003310100/
- 日本一当たる天気予報の岡山の1時間ごとの天気・気温・降水確率など詳細情報
https://www.toshin.com/weather/detail?id=58587
これらのサイトで今日の岡山市の詳しい天気情報を確認してみてください
- Mastraとはなんですか?
Mastraは、AIエージェントの開発を簡単にするフレームワークです。複数のAIプロバイダーに対応しており、メモリ機能やツール統合など、エージェント開発に欠かせない機能を備えています。また、AIエージェントやモデル出力の品質を自動で評価・監視する機能も内蔵しており、バイアス検知や応答の関連性、事実性チェックも可能です。さらに、オープンソースのAIフレームワークとして注目されています。
詳しく知りたい場合は、以下のリンクも参考にしてください。
- https://wp-kyoto.net/get-started-mastra
- https://note.com/cheeky_pika8545/n/n9cc618c24f26
- https://note.com/norito_hiraoka/n/n02fb32b3ba9c
Exa
- PythonでCastするにはどうすればよいですか?
Pythonでの「キャスト(Cast)」は、あるデータ型の値を別のデータ型に変換することを指します。Pythonでは、主に組み込み関数を使ってキャストを行い ます。代表的なキャスト方法は以下の通りです。
1. int() — 整数に変換
x = int(3.14) # 3
y = int("123") # 123
2. float() — 浮動小数点数に変換
x = float(3) # 3.0
y = float("3.14") # 3.14
3. str() — 文字列に変換
x = str(123) # "123"
y = str(3.14) # "3.14"
4. list() — リストに変換
x = list("abc") # ['a', 'b', 'c']
y = list((1, 2, 3)) # [1, 2, 3]
5. tuple() — タプルに変換
x = tuple([1, 2, 3]) # (1, 2, 3)
6. bool() — 真偽値に変換
x = bool(0) # False
y = bool(1) # True
このように、Pythonでは型変換用の関数を使って簡単にキャストができます。具体的にどの型に変換したいか教えていただければ、より詳しい例をお伝えで きます。
- 今日の岡山市の天気は?
今日の岡山市の天気は晴れで、猛暑日となっています。最高気温は39℃、最低気温は28℃です。降水確率は昼以降10%程度で、風は南西の風のち西の風、波の高さは0.5mです。紫外線が非常に強いので、外出時は日焼け対策をおすすめしま す。
- Mastraとはなんですか?
Mastra(マストラ)とは、TypeScript製のオープンソースAIエージェント開発フレームワークです。大規模言語モデル(LLM)を活用したAIアプリケーションや機能を効率的に構築できるよう設計されています。
主な特徴は以下の通りです:
- AIエージェント(自律的にタスクを実行するAIシステム)やワークフロー(処理手順の定義)、RAG(外部知識検索)、評価機能など、AIアプリ開発に必要な基本要素を包括的に提供。
- OpenAIのGPT-4、AnthropicのClaude、GoogleのGeminiなど複数のLLMプロバイダに対応し、統一されたインターフェースで利用可能。
- エージェントにツール(外部機能)やワークフローを組み込むことで、自律的に処理を進める高度なAIアプリを構築可能。
- ワークフローは状態機械(XStateベース)で複雑な処理の流れを制御でき、実行履歴の記録やデバッグも容易。
- RAG機能により外部知識をLLMに組み込み、正確で最新の回答を得ることが可能。
- 評価機能(Evals)でAIの出力品質を自動評価し、トレーシングや観測性機能で開発から本番までの運用を支援。
- ローカル環境やクラウド上で動作し、ReactやNext.js、Node.jsアプリへの組み込みやサーバーレス環境へのデプロイもサポート。
開発チームはかつてReactウェブフレームワーク「Gatsby」を開発したチームで、2024年に創設されました。Mastraは「ウェブサイトを作るのと同じくらい簡単に、人間レベルのAIエージェントを作りたい」という理念のもと開発されて います。
詳しくは公式ドキュメント(https://mastra.ai/en/docs)やGitHub(https://github.com/mastra-ai/mastra)をご覧ください。
DuckDuckGo
- PythonでCastするにはどうすればよいですか?
Pythonでの「キャスト(Cast)」は、あるデータ型の値を別のデータ型に変換することを指します。Pythonでは、主に組み込み関数を使ってキャストを行い ます。代表的なものをいくつか紹介します。
1. int() — 整数に変換
x = int(3.14) # 3
y = int("123") # 123
2. float() — 浮動小数点数に変換
x = float(10) # 10.0
y = float("3.14") # 3.14
3. str() — 文字列に変換
x = str(123) # "123"
y = str(3.14) # "3.14"
4. list() — リストに変換
x = list("abc") # ['a', 'b', 'c']
y = list((1,2)) # [1, 2]
5. tuple() — タプルに変換
x = tuple([1,2,3]) # (1, 2, 3)
6. bool() — 真偽値に変換
x = bool(0) # False
y = bool(1) # True
このように、Pythonでは型変換用の関数を使って簡単にキャストができます。具体的にどの型に変換したいか教えていただければ、より詳しく説明します。
- 今日の岡山市の天気は?
申し訳ありませんが、現在ウェブページの内容を取得する際にエラーが発生しています。岡山市の今日の天気については、以下の天気予報サイトでご確認いただけます。
- 日本気象協会 tenki.jp: https://tenki.jp/forecast/7/36/6610/33100/1hour.html
- ウェザーニュース: https://weathernews.jp/onebox/tenki/okayama/33100/
これらのサイトで最新の岡山市の天気情報をご覧ください。
- Mastraとはなんですか?
Mastra(マストラ)とは、TypeScript(JavaScript)で書かれたオープンソースのAIエージェント開発フレームワークです。大規模言語モデル(LLM)を活用し、チャットボットや自律的にタスクを実行するAIエージェントを簡単に作成 ・運用できるよう設計されています。
主な特徴としては、AIアプリケーションや機能を素早く構築するためのワークフロー、エージェント、検索拡張生成(RAG)などの必要なコンポーネントを提供し、ローカル環境やサーバレスクラウド環境で動作可能です。特にTypeScriptで実装されているため、Webアプリとの相性が良く、モジュール性に優れている点も特徴です。
詳しくは公式ドキュメント(https://mastra.ai/ja/docs)などで確認できます。
結論
今回は単純な質問を投げたことも影響していると思いますが、いずれのAPIも大体同じような内容が回答として返ってきました。特に「PythonでCastするにはどうすればよいですか?」という最新の情報ではない、単純な質問の場合においては、いずれのAPIもほぼ同じ回答が返ってきました。
また、リアルタイム情報である「今日の岡山市の天気は?」においてはDuckDuckGoでは「現在ウェブページの内容を取得する際にエラーが発生しています」というエラーが返ってきました。Webサイトによってはアクセスした際にエラーが発生し、情報を取得できない場合もあるようです。
最後にリリースされてまだ日が浅い技術であるMastraについて「Mastraとはなんですか?」と質問しました。こちらの結果としてはExaが一番多くの情報量を取得することができました。
アクセスできない一部のサイトがある問題はありますが、AIチャットボットに対して軽い質問をするくらいであれば、DuckDuckGoでも十分な情報が得られるようだと今回の検証を通して思いました。また、当面は検証段階であるため、いったんは無料で利用できるDuckDuckGoを使うことにしました。
まとめ
- LLM検索APIのTavilyとExaとDuckDuckGoのMCPツールの動作検証をしました
- いずれのAPIの回答も内容としては十分実用に足るものであることがわかりました
- 当面の間検証をするため、無料で利用できるDuckDuckGoを利用することにしました
Discussion