<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Comparison on kenji.blog</title><link>http://kenji.blog/tags/comparison/</link><description>Recent content in Comparison on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>ja</language><copyright>kenjinote</copyright><lastBuildDate>Fri, 11 Sep 2026 12:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/tags/comparison/index.xml" rel="self" type="application/rss+xml"/><item><title>ChatGPT・Gemini・ClaudeのAPI徹底比較！どれを選ぶべき？</title><link>http://kenji.blog/p/chatgpt-gemini-claude-api-comparison/</link><pubDate>Fri, 11 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/p/chatgpt-gemini-claude-api-comparison/</guid><description>&lt;img src="http://kenji.blog/p/chatgpt-gemini-claude-api-comparison/img/eyecatch.jpg" alt="Featured image of post ChatGPT・Gemini・ClaudeのAPI徹底比較！どれを選ぶべき？" />&lt;h1 id="chatgptgeminiclaudeのapi徹底比較どれを選ぶべき">ChatGPT・Gemini・ClaudeのAPI徹底比較！どれを選ぶべき？
&lt;/h1>&lt;p>AI技術の進化は目覚ましく、特に大規模言語モデル（LLM: Large Language Model）の分野では、OpenAIのChatGPT（GPTシリーズ）、GoogleのGemini、AnthropicのClaudeが三つ巴の激しい覇権争いを繰り広げています。2026年現在、各社は数ヶ月、いや数週間単位で新しいモデルやAPI機能をリリースしており、開発者や企業のITアーキテクトにとって「どのAPIをプロダクトに組み込むべきか」という問いは、プロジェクトの成功を左右する極めて重要な意思決定となっています。&lt;/p>
&lt;p>本記事では、これら3大AIプロバイダーのAPIについて、単なるスペックの羅列にとどまらず、アーキテクチャ設計、詳細な料金構造、レイテンシ（遅延）の数学的分析、PythonおよびNode.jsによる具体的な実装例、プロンプトキャッシュなどの最新のコスト最適化手法に至るまで、開発者の視点から徹底的に比較・解説します。&lt;/p>
&lt;p>読者の皆様が、自身のユースケースに最適なLLM APIを選定し、スケーラブルでコスト効率の高いAIアプリケーションを構築するための完全なガイドとなることを目指しています。&lt;/p>
&lt;hr>
&lt;h2 id="1-各llm-apiの哲学と設計思想">1. 各LLM APIの哲学と設計思想
&lt;/h2>&lt;p>技術選定において、まず各社がどのような思想でモデルとAPIを構築しているかを理解することは非常に重要です。&lt;/p>
&lt;h3 id="11-openai-chatgpt">1.1 OpenAI (ChatGPT)
&lt;/h3>&lt;p>OpenAIは、「汎用人工知能（AGI）の実現」をミッションに掲げ、常に業界のデファクトスタンダードを牽引しています。GPT-4oやGPT-4o-mini、そして推論特化型のo1モデルなど、ユースケースに合わせた多様なモデルを提供しています。エコシステムが最も成熟しており、公式・非公式問わずライブラリやドキュメントが最も豊富です。&lt;/p>
&lt;h3 id="12-google-gemini">1.2 Google (Gemini)
&lt;/h3>&lt;p>Googleは「AI First」を掲げ、自社のインフラ（TPUネットワーク）を最大限に活用したスケーラビリティを武器にしています。Gemini 1.5 Pro/Flashは、最大200万トークンという圧倒的なコンテキストウィンドウ（文脈長）を持ち、長大なドキュメントや数時間の動画・音声を一度に処理できるのが最大の特徴です。Google Cloud (Vertex AI) との強力な統合もエンタープライズにとって魅力的です。&lt;/p>
&lt;h3 id="13-anthropic-claude">1.3 Anthropic (Claude)
&lt;/h3>&lt;p>Anthropicは、元OpenAIのメンバーが設立した企業であり、「Constitutional AI（合憲的AI）」という独自の安全性アプローチを採用しています。Claude 3.5 SonnetやOpusは、その高い推論能力、コード生成能力、そして何より「人間らしい自然な対話」と「ハルシネーション（幻覚）の少なさ」で、多くの開発者から熱狂的な支持を集めています。&lt;/p>
&lt;hr>
&lt;h2 id="2-モデルファミリーのスペック徹底比較">2. モデルファミリーのスペック徹底比較
&lt;/h2>&lt;p>2026年現在の主力モデルのスペックを比較します。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>プロバイダー&lt;/th>
&lt;th>主力モデル&lt;/th>
&lt;th>最大コンテキスト長&lt;/th>
&lt;th>主な強み&lt;/th>
&lt;th>推奨ユースケース&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>OpenAI&lt;/strong>&lt;/td>
&lt;td>GPT-4o&lt;/td>
&lt;td>128K&lt;/td>
&lt;td>スピード、視覚認識、音声対応&lt;/td>
&lt;td>インタラクティブなアプリ、汎用タスク&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>OpenAI&lt;/strong>&lt;/td>
&lt;td>o1-preview&lt;/td>
&lt;td>128K&lt;/td>
&lt;td>高度な論理推論、数学、コーディング&lt;/td>
&lt;td>複雑なアルゴリズム生成、研究用途&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Google&lt;/strong>&lt;/td>
&lt;td>Gemini 1.5 Pro&lt;/td>
&lt;td>2,000K&lt;/td>
&lt;td>超長文処理、マルチモーダル（動画・音声）&lt;/td>
&lt;td>巨大なコードベースの解析、動画要約&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Google&lt;/strong>&lt;/td>
&lt;td>Gemini 1.5 Flash&lt;/td>
&lt;td>2,000K&lt;/td>
&lt;td>低遅延、高スループット、圧倒的低コスト&lt;/td>
&lt;td>リアルタイム処理、大量データの一括処理&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Anthropic&lt;/strong>&lt;/td>
&lt;td>Claude 3.5 Sonnet&lt;/td>
&lt;td>200K&lt;/td>
&lt;td>コーディング能力、自然な文章生成&lt;/td>
&lt;td>ソフトウェア開発支援、高度なカスタマーサポート&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>Anthropic&lt;/strong>&lt;/td>
&lt;td>Claude 3.5 Haiku&lt;/td>
&lt;td>200K&lt;/td>
&lt;td>超高速応答、コストパフォーマンス&lt;/td>
&lt;td>エッジAI、リアルタイムチャットボット&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="3-アーキテクチャの深堀りapiリクエストの裏側">3. アーキテクチャの深堀り：APIリクエストの裏側
&lt;/h2>&lt;p>LLMのAPIをコールした際、バックエンドではどのような処理が行われているのでしょうか。パフォーマンスを最適化するためには、このアーキテクチャを理解する必要があります。&lt;/p>
&lt;p>以下のMermaidダイアグラムは、クライアントからAPIリクエストが送信され、トークンがストリーミングで返されるまでの全体像を示しています。&lt;/p>
&lt;div class="mermaid">graph TD
A["Client Application"] -->|HTTP/REST or gRPC| B["API Gateway"]
B --> C["Load Balancer"]
C --> D["Inference Cluster"]
D --> E["Tokenizer (BPE / SentencePiece)"]
E --> F["KV Cache &amp; Attention Mechanism"]
F --> G["Transformer Blocks (Forward Pass)"]
G --> H["Output Layer (Logits)"]
H --> I["Sampler (Temperature, Top-p, Top-k)"]
I --> J["Detokenizer"]
J -->|Streaming Response (Chunk)| A&lt;/div>
&lt;h3 id="31-tokenizationトークン化のアルゴリズム">3.1 Tokenization（トークン化）のアルゴリズム
&lt;/h3>&lt;p>APIに入力されたテキストは、内部で「トークン」という単位に分割されます。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>OpenAI (tiktoken)&lt;/strong>: Byte-Pair Encoding (BPE) を採用。特に英語において極めて効率的に圧縮されますが、日本語などの非アルファベット言語ではトークン数が膨らみがちです。&lt;/li>
&lt;li>&lt;strong>Google (Gemini)&lt;/strong>: SentencePiece（Unigram Language Model）を採用。多言語に強く、日本語のテキストでも比較的少ないトークン数で表現できる傾向があります。&lt;/li>
&lt;li>&lt;strong>Anthropic (Claude)&lt;/strong>: BPEのカスタマイズ版を使用。多言語対応が強化されており、Claude 3以降は日本語のトークン効率も大幅に改善されています。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="4-レイテンシとパフォーマンスの数学的分析">4. レイテンシとパフォーマンスの数学的分析
&lt;/h2>&lt;p>リアルタイムアプリケーションにおいて、レイテンシはユーザー体験（UX）に直結します。LLMのAPIのレイテンシ $T_{total}$ は、数学的に以下のようにモデル化できます。&lt;/p>
$$ T_{total} = T_{network} + T_{TTFT} + (N \times T_{TPOT}) $$
&lt;p>ここで、各変数は以下の意味を持ちます。&lt;/p>
&lt;ul>
&lt;li>$T_{network}$: ネットワークのラウンドトリップタイム（RTT）。&lt;/li>
&lt;li>$T_{TTFT}$ (Time To First Token): 最初の文字が生成されるまでの時間。プロンプトの長さ（入力トークン数）の二乗に比例するアテンション計算のコストに大きく依存します。&lt;/li>
&lt;li>$N$: 出力されるトークンの総数。&lt;/li>
&lt;li>$T_{TPOT}$ (Time Per Output Token): 1トークンあたりの生成時間。自己回帰モデルであるため、前の出力に依存して直列に計算されます。&lt;/li>
&lt;/ul>
&lt;h3 id="41-自己アテンション機構の計算量">4.1 自己アテンション機構の計算量
&lt;/h3>&lt;p>Transformerアーキテクチャにおける自己アテンション（Self-Attention）の計算量は、入力シーケンス長 $L$ に対して二次関数的に増加します。&lt;/p>
$$ \text{Complexity} = O(L^2 \cdot d) $$
&lt;p>ここで $d$ は埋め込みベクトルの次元数です。この制約のため、通常はプロンプトが長くなると $T_{TTFT}$ が急激に悪化します。
しかし、GoogleのGemini 1.5は「Ring Attention」や「Block-wise Compute」といった革新的な最適化アーキテクチャを採用しており、200万トークンという長文を入力しても、現実的な時間（数秒〜数十秒）で最初のトークンを生成することに成功しています。&lt;/p>
&lt;hr>
&lt;h2 id="5-料金体系とコスト最適化の戦略">5. 料金体系とコスト最適化の戦略
&lt;/h2>&lt;p>APIのコストは、基本的に入力トークン数と出力トークン数に基づいて計算されます。&lt;/p>
$$ Cost = (Tokens_{in} \times Rate_{in}) + (Tokens_{out} \times Rate_{out}) $$
&lt;p>しかし、最新のAPIではコストを劇的に下げるための新しい仕組みが導入されています。&lt;/p>
&lt;h3 id="51-プロンプトキャッシュ-prompt-caching">5.1 プロンプトキャッシュ (Prompt Caching)
&lt;/h3>&lt;p>長大なシステムプロンプトや、RAGで検索した大量のドキュメントを毎回送信すると莫大なコストがかかります。これに対処するため、各社はキャッシュ機能を提供しています。&lt;/p>
&lt;p>Anthropic（Claude）やGoogle（Gemini）では、特定のテキストブロックをキャッシュすることで、入力コストを大幅に（最大90%）削減できます。&lt;/p>
&lt;p>キャッシュを利用した場合のコストモデルは以下のようになります。&lt;/p>
$$ Cost_{cached} = (Tokens_{cache\_write} \times Rate_{cache\_write}) + (Tokens_{cache\_read} \times Rate_{cache\_read}) + (Tokens_{out} \times Rate_{out}) $$
&lt;p>ここで $Rate_{cache\_read}$ は通常の $Rate_{in}$ の10%〜25%程度に設定されています。これにより、数万行のコードベースを背景知識として常に保持させながら、安価にチャットボットを運用することが可能になりました。&lt;/p>
&lt;h3 id="52-バッチapi-batch-api">5.2 バッチAPI (Batch API)
&lt;/h3>&lt;p>リアルタイム性が不要なタスク（ログ分析、大量のデータ分類など）向けに、OpenAIやAnthropicはバッチAPIを提供しています。リクエストをまとめて送信し、24時間以内に結果を受け取る代わりに、通常のAPI料金の半額（50%オフ）で利用できる強力な仕組みです。&lt;/p>
&lt;hr>
&lt;h2 id="6-開発者体験dxとsdkの比較">6. 開発者体験（DX）とSDKの比較
&lt;/h2>&lt;p>開発効率の観点から、各社の提供するSDK（Software Development Kit）を比較します。&lt;/p>
&lt;h3 id="61-openai-api">6.1 OpenAI API
&lt;/h3>&lt;p>最も広く使われており、サードパーティ製ライブラリ（LangChain, LlamaIndexなど）の対応も最速です。また、Structured Outputs（構造化出力）機能により、JSONスキーマを100%の精度で遵守したレスポンスを返すことが保証されており、システム連携が非常に容易です。&lt;/p>
&lt;h3 id="62-anthropic-api-claude">6.2 Anthropic API (Claude)
&lt;/h3>&lt;p>SDKのインターフェースが洗練されており、TypeScriptの型定義などが非常に扱いやすいと評判です。特にMessage APIの構造が直感的で、複数画像を含めたマルチモーダルリクエストもシンプルに記述できます。&lt;/p>
&lt;h3 id="63-google-gemini-api">6.3 Google Gemini API
&lt;/h3>&lt;p>Google Cloud Vertex AI経由のアクセスと、AI Studio経由のアクセス（Google Gen AI SDK）の2種類が存在し、初心者は少し混乱するかもしれません。しかし、エンタープライズ向けのVertex AI SDKは、GCPのIAM（認証認可システム）と完全に統合されており、セキュアな開発環境を構築できます。&lt;/p>
&lt;hr>
&lt;h2 id="7-実践pythonによる複数apiの統合テスト実装">7. 実践！Pythonによる複数APIの統合テスト実装
&lt;/h2>&lt;p>ここでは、Pythonを使用して、OpenAI, Anthropic, Geminiの3つのAPIに対して同時に非同期リクエストを送信し、レイテンシを比較するスクpromptリプトを実装してみます。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;span class="lnt">52
&lt;/span>&lt;span class="lnt">53
&lt;/span>&lt;span class="lnt">54
&lt;/span>&lt;span class="lnt">55
&lt;/span>&lt;span class="lnt">56
&lt;/span>&lt;span class="lnt">57
&lt;/span>&lt;span class="lnt">58
&lt;/span>&lt;span class="lnt">59
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">asyncio&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">openai&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AsyncOpenAI&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">anthropic&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">AsyncAnthropic&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">google.generativeai&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">genai&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># クライアントの初期化&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">openai_client&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AsyncOpenAI&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">api_key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;OPENAI_API_KEY&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">anthropic_client&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">AsyncAnthropic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">api_key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;ANTHROPIC_API_KEY&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">genai&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">configure&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">api_key&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">os&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">environ&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;GEMINI_API_KEY&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">prompt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s2">&amp;#34;量子コンピュータの基礎と、それが現在の暗号技術に与える影響について、初心者向けに分かりやすく解説してください。&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">fetch_openai&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">openai_client&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">chat&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">completions&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">create&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;gpt-4o&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messages&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[{&lt;/span>&lt;span class="s2">&amp;#34;role&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;user&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">prompt&lt;/span>&lt;span class="p">}],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_tokens&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1024&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">elapsed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start_time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;OpenAI (GPT-4o)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">elapsed&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">choices&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">message&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">content&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">fetch_anthropic&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">anthropic_client&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">messages&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">create&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;claude-3-5-sonnet-20240620&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">messages&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[{&lt;/span>&lt;span class="s2">&amp;#34;role&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;user&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">prompt&lt;/span>&lt;span class="p">}],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_tokens&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mi">1024&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">elapsed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start_time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;Anthropic (Claude 3.5 Sonnet)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">elapsed&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">content&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">fetch_gemini&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start_time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">genai&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">GenerativeModel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;gemini-1.5-pro&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Gemini Python SDKの非同期メソッドを利用&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">generate_content_async&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">prompt&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">elapsed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">time&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">time&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start_time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;Google (Gemini 1.5 Pro)&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">elapsed&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">response&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">text&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;各LLM APIへリクエストを送信中...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># 3つのAPIを並列で実行&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">results&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">asyncio&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">gather&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fetch_openai&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fetch_anthropic&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fetch_gemini&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">provider&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">latency&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">text&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">results&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;--- &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">provider&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> ---&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Latency: &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">latency&lt;/span>&lt;span class="si">:&lt;/span>&lt;span class="s2">.2f&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2"> seconds&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sa">f&lt;/span>&lt;span class="s2">&amp;#34;Response (Excerpt): &lt;/span>&lt;span class="si">{&lt;/span>&lt;span class="n">text&lt;/span>&lt;span class="p">[:&lt;/span>&lt;span class="mi">100&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="s2">...&lt;/span>&lt;span class="se">\n&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">asyncio&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">main&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>このスクリプトを実行することで、実際のネットワーク環境においてどのモデルが最も高速に（$T_{total}$を最小化して）応答するかを簡単に計測できます。&lt;/p>
&lt;hr>
&lt;h2 id="8-nodejsによるtool-callingfunction-calling実装">8. Node.jsによるTool Calling（Function Calling）実装
&lt;/h2>&lt;p>LLMを単なるチャットボットではなく、外部システムと連携する「AIエージェント」として機能させるためには、Tool Calling（またはFunction Calling）が不可欠です。以下はNode.js（TypeScript）を使用して、OpenAIのAPIに天気APIを呼び出させる例です。&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;span class="lnt">48
&lt;/span>&lt;span class="lnt">49
&lt;/span>&lt;span class="lnt">50
&lt;/span>&lt;span class="lnt">51
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-typescript" data-lang="typescript">&lt;span class="line">&lt;span class="cl">&lt;span class="kr">import&lt;/span> &lt;span class="nx">OpenAI&lt;/span> &lt;span class="kr">from&lt;/span> &lt;span class="s2">&amp;#34;openai&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">const&lt;/span> &lt;span class="nx">openai&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">OpenAI&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">apiKey&lt;/span>: &lt;span class="kt">process.env.OPENAI_API_KEY&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">async&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">runAgent() {&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">tools&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">type&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;function&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">function&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;get_weather&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">description&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;指定された都市の現在の天気を取得します。&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">parameters&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">type&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;object&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">properties&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">location&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">type&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;string&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">description&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;都市名（例: 東京, ニューヨーク）&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">required&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;location&amp;#34;&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="nx">openai&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">chat&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">completions&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">create&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">model&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;gpt-4o&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">messages&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[{&lt;/span> &lt;span class="nx">role&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;user&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;content&amp;#34;&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;今日の東京の天気はどう？傘は必要かな？&amp;#34;&lt;/span> &lt;span class="p">}],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">tools&lt;/span>: &lt;span class="kt">tools&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">tool_choice&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s2">&amp;#34;auto&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">message&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">response&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">choices&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">message&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">message&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">tool_calls&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">toolCall&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">message&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">tool_calls&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">];&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sb">`LLMがツール呼び出しを要求しました: 関数名 = &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">toolCall&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">const&lt;/span> &lt;span class="nx">args&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">JSON&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">toolCall&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="kd">function&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">arguments&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sb">`引数: &lt;/span>&lt;span class="si">${&lt;/span>&lt;span class="nx">args&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">location&lt;/span>&lt;span class="si">}&lt;/span>&lt;span class="sb">`&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// ここで実際の天気API（例: OpenWeatherMap）を呼び出す処理を実装します
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="c1">// const weather = await fetchWeatherFromAPI(args.location);
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// 取得した結果を再度LLMに渡して最終的な回答を生成させます
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">runAgent&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="k">catch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">error&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Claude 3.5 SonnetやGemini 1.5 Proも同等のTool Calling機能を備えており、スキーマの定義方法に若干の違いはあるものの、基本的なフローは共通しています。&lt;/p>
&lt;hr>
&lt;h2 id="9-rag-vs-long-context-window-どちらを採用すべきか">9. RAG vs Long Context Window: どちらを採用すべきか？
&lt;/h2>&lt;p>現在、エンタープライズAIアーキテクチャにおける最大の議論の一つが「外部知識を取り込むために、RAG（検索拡張生成）を使うべきか、それとも巨大なコンテキストウィンドウ（Long Context）にすべて丸投げすべきか」という問題です。&lt;/p>
&lt;h3 id="rag-retrieval-augmented-generation-の利点と課題">RAG (Retrieval-Augmented Generation) の利点と課題
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>利点&lt;/strong>: コストが安い（必要なチャンクだけをプロンプトに入れるため）、回答の根拠（ソース）を特定しやすい。&lt;/li>
&lt;li>&lt;strong>課題&lt;/strong>: セマンティック検索の精度に依存するため、文脈が複数の文書に散らばっている高度な推論タスク（例：「昨年の全議事録から、Aプロジェクトが遅延した根本原因を時系列で分析して」）には適していません。&lt;/li>
&lt;/ul>
&lt;h3 id="long-context-gemini-15-proの200万トークンなど">Long Context (Gemini 1.5 Proの200万トークンなど)
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>利点&lt;/strong>: 検索による情報の取りこぼしがない。「干し草の山から針を探す（Needle In A Haystack: NIAH）」テストにおいても、Gemini 1.5 ProやClaude 3.5 Sonnetは99%以上の精度で情報を抽出できます。&lt;/li>
&lt;li>&lt;strong>課題&lt;/strong>: トークン消費量が膨大になりコストがかさむ、レイテンシ（$T_{TTFT}$）が増加する。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>結論&lt;/strong>: 2026年のベストプラクティスは**「ハイブリッド・アプローチ」**です。日常的なQ&amp;amp;Aにはベクトルデータベースを用いたRAGを使用し、複雑な分析やコード全体のレビューが必要な特化したタスクには、プロンプトキャッシュを活用したLong Contextを用いる設計が主流となっています。&lt;/p>
&lt;hr>
&lt;h2 id="10-マルチモーダル処理能力の比較">10. マルチモーダル処理能力の比較
&lt;/h2>&lt;p>次世代のAIアプリケーションでは、テキストだけでなく、画像、音声、動画を直接理解する能力が求められます。&lt;/p>
&lt;div class="mermaid">sequenceDiagram
participant User as "User"
participant Client as "Frontend App"
participant API as "LLM API (Multimodal)"
User->>Client: Upload Video &amp; Text Prompt
Client->>API: Send Video Bytes/URI + Text
Note over API: Video chunking &amp; Audio separation
Note over API: Multimodal Embedding Model
API-->>Client: Return Text Summary &amp; Timestamps
Client-->>User: Display Insights&lt;/div>
&lt;ul>
&lt;li>&lt;strong>OpenAI (GPT-4o)&lt;/strong>: 画像認識精度が極めて高く、手書きの図面や複雑なグラフの読み取りに優れます。また、Realtime APIを利用した超低遅延（数百ミリ秒）のネイティブな音声対話も強力です。&lt;/li>
&lt;li>&lt;strong>Google (Gemini 1.5 Pro)&lt;/strong>: &lt;strong>動画解析において他を圧倒しています。&lt;/strong> 1時間の動画ファイル（フレーム群＋音声）をそのまま入力し、「12分45秒で画面右端に映った人物が持っている資料のタイトルは？」といったピンポイントな質問に回答可能です。&lt;/li>
&lt;li>&lt;strong>Anthropic (Claude 3.5 Sonnet)&lt;/strong>: 画像認識（Vision）能力はGPT-4oと同等レベルで非常に優秀です。UIのスクリーンショットを渡して「この画面のReactコンポーネントコードを生成して」といったフロントエンド開発支援において無類の強さを発揮します。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="11-エンタープライズレベルのセキュリティとコンプライアンス">11. エンタープライズレベルのセキュリティとコンプライアンス
&lt;/h2>&lt;p>企業がLLM APIを本番環境で利用する際、最も懸念されるのが「自社のデータがAIの学習に使われないか」「コンプライアンス要件を満たしているか」という点です。&lt;/p>
&lt;p>3社とも、API経由で送信されたデータ（プロンプトおよびレスポンス）を&lt;strong>モデルの学習に使用しない（Zero Data Retention / No Training on Customer Data）&lt;/strong> ことを明言しています（※無料のコンシューマ向けWebチャットUIは別です）。&lt;/p>
&lt;p>さらに高いセキュリティレベルが求められる場合：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>OpenAI&lt;/strong>: Azure OpenAI Serviceを経由することで、Microsoftのエンタープライズグレードのセキュリティ、SLA、Azure Private Linkによる閉域網接続を利用できます。&lt;/li>
&lt;li>&lt;strong>Google&lt;/strong>: Google Cloud Vertex AIを経由することで、VPC Service Controlsを利用した厳密なネットワーク分離や、CMEK（顧客管理の暗号鍵）によるデータ保護が可能です。&lt;/li>
&lt;li>&lt;strong>Anthropic&lt;/strong>: AWS BedrockまたはGoogle Cloud Vertex AI経由で利用することで、クラウドプロバイダーの堅牢なセキュリティ基盤に相乗りできます。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="12-結論ユースケース別究極の選択ガイド">12. 結論：ユースケース別、究極の選択ガイド
&lt;/h2>&lt;p>ここまで多角的に比較してきましたが、最終的に「どれを選ぶべきか？」に対する結論は、ユースケースによって異なります。&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>複雑なソフトウェア開発・コード生成・高度な推論&lt;/strong>:
&lt;strong>👑 勝者: Claude 3.5 Sonnet (Anthropic)&lt;/strong>
コードの文脈理解、リファクタリング、自然で人間らしい文章の作成において、現在最高のパフォーマンスを発揮します。APIの使いやすさとプロンプトキャッシュによるコスト効率も抜群です。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>超長文のドキュメント解析・動画/音声の一括処理&lt;/strong>:
&lt;strong>👑 勝者: Gemini 1.5 Pro (Google)&lt;/strong>
200万トークンのコンテキストウィンドウは唯一無二の武器です。数百ページのPDFマニュアルの解析や、長時間の会議録画の要約など、データの全体像を把握する必要があるタスクではGeminiの右に出るものはありません。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>汎用性・実行スピード・安定した構造化出力（JSON）&lt;/strong>:
&lt;strong>👑 勝者: GPT-4o / GPT-4o-mini (OpenAI)&lt;/strong>
あらゆるタスクをそつなくこなし、サードパーティのツール対応も最も豊富です。Structured Outputsを利用した確実なJSONパースや、o1モデルを用いた超高度な論理推論が必要な場合はOpenAIエコシステムが不可欠です。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h3 id="マルチモデルルーティングのすすめ">マルチモデル・ルーティングのすすめ
&lt;/h3>&lt;p>単一のAPIに依存（ベンダーロックイン）するのではなく、タスクの難易度や重要度に応じてモデルを動的に切り替える**「LLMルーティング」**アーキテクチャが今後のトレンドです。
例えば、ユーザーからの単純な質問には安価で高速な &lt;code>GPT-4o-mini&lt;/code> や &lt;code>Gemini 1.5 Flash&lt;/code> で応答し、複雑な処理が必要と判断された場合のみ &lt;code>Claude 3.5 Sonnet&lt;/code> にタスクをフォールバックさせることで、コストとパフォーマンスの最適なバランスを実現できます。&lt;/p>
&lt;p>AIの進化は止まりません。各APIの強みと弱み、そしてアーキテクチャの特性を深く理解し、柔軟でスケーラブルなAIアプリケーションを構築してください。&lt;/p></description></item></channel></rss>