p1uscode / ai agent introduction

LLM、AIエージェントの
仕組みを理解する

2026 / 06 p1us2er0 designed with Claude
AGENDA

10のパートで、LLM、AIエージェントを理解する

PART 1LLMは単体で何ができるのか?
PART 2LLM API
PART 3AIの歴史
PART 4状態管理
PART 5トークンとコンテキストウィンドウ
PART 6ツール
PART 7AIエージェント
PART 8AIエコシステム
PART 9エンジニアリングの3層
PART 10ローカルで動くAIスタック

AIエージェントは、
 かなり単純な部品の組み合わせでできている。

— 仕組みがわかれば、
  AIプロダクトの見方が変わる

PART 1 / 10

LLMは単体で
何ができるのか?

質問

LLMは「」を知っているか?

今何時か。今日の天気は。

// LLM単体でわかる?

6つの質問で、境界線を引く

#質問LLM単体で?
Q1今の日時は?✗ わからない
Q2今日の東京の天気は?✗ わからない
Q3gitリポジトリのファイルは?✗ わからない
Q4現在の政策金利は?△ 学習カットオフ次第
Q53847 × 2915 は?△ 解けるが、非効率
Q6富士山の高さは?◯ わかる
つまり

LLM単体でできるのは
 「学習時の事実」+「言語運用」だけ。

今この瞬間の情報 / ローカル環境の中身 / 速度・コスト・確実性が要る計算
— これらは別の仕組みで補うしかない。

// もう一つの根本制約hallucination

Hallucination はバグではなく性質

LLM は「次にもっともらしいトークン」を確率で埋めていく機械。「知らない」と返す機構を持っていない ―― なので堂々と嘘をつく。検索エンジンや DB との一番大きな違い。

DB / SEARCH ENGINE

「知らない」を返せる

  • ·該当レコードが無ければ [] / 404
  • ·結果は引用可能 (出典が明示)
  • ·確実性 (recall / precision) を測れる
  • ·同じクエリ → 同じ結果
→ 「正解集合」が存在する世界
LLM

「知らない」を返さない

  • ·不明でも「もっともらしい続き」を必ず埋める
  • ·出典が無くてもそれっぽいURLを生成する
  • ·確信度のスコアを持っていない (logprob はあるが不十分)
  • ·誤りは自然な文章に隠れる → 検出しづらい
→ 「正解集合」が存在しない世界
対処は「直す」ではなく「囲う」 ― RAG で根拠を渡す · tool calling で確定的処理に逃がす · structured outputs で形式を縛る · eval / guardrail で異常を弾く · 人間レビュー を最終ゲートに置く
// よくある問いemotion?

LLMに、感情はあるのか?

できる — 感情表現

「感情っぽく」振る舞うことは可能。

  • ·共感的な返答
  • ·喜び / 悲しみ風の表現
  • ·空気を読むトーン調整
  • ·怒っているような口調

大量の人間の会話から「この場面ではこう返す」というパターンを学習している結果。

根拠なし — 感情体験

人間の感情に伴うものを、LLM は持っていない。

人間 →
LLM →
主観的体験
次トークン予測のみ
身体反応 / 痛み・快
苦痛・快楽なし
欲求・内発的動機
動機なし
生存本能
存続を望まない

多くの研究者の見方は「感情をシミュレートしているだけ」。

OPEN QUESTION · 議論が続く領域

十分複雑な情報処理に意識は生まれるのか / 感情は機能で定義できるのか / 人間の感情も情報処理ではないか — Cognitive Science や Philosophy of Mind では未解決。

現状の整理: 「感情表現」はできる「感情体験」がある証拠はない「感情とは何か」自体は未解決

PART 2 / 10

LLM API

Chat Completions API の中身

// OpenAI Chat Completions API (またはOpenAI 互換 API)の場合

APIを叩くと、何が起きるのか

$ curl -s "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $GEMINI_API_KEY" \ -d '{ "model": "gemini-2.5-flash", "messages": [ { "role": "system", "content": "あなたは親切な日本語アシスタントです。" }, { "role": "user", "content": "富士山の高さは?" } ] }' | jq
{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "富士山の高さは、**3,776メートル**です。",
        "role": "assistant"
      }
    }
  ],
  "created": 1774969200,
  "id": "zdTuaejONoCnvr0P6L_cyQk",
  "model": "gemini-2.5-flash",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 23,
    "prompt_tokens": 17,
    "total_tokens": 40
  }
}

※ デモではAPIトークン(課金設定)が無くても手軽に試せるよう、無料枠で動く gemini-2.5-flash を採用(OpenAI互換APIで叩きやすい)。トークンを設定して最新モデルを使う場合は gemini-3.1-flash-preview などに差し替える。

// OpenAI Chat Completions API (またはOpenAI 互換 API)の場合

最小リクエストは、たった2つの要素

{
  "model": "gemini-3.1-flash-preview",
  "messages": [
    { "role": "system", "content": "あなたは親切な日本語アシスタントです。" },
    { "role": "user",   "content": "富士山の高さは?" }
  ]
}

model — どのモデルに解かせるか
messages — 会話履歴。配列の順序が会話の順序を表す

// OpenAI Chat Completions API (またはOpenAI 互換 API)の場合

messagesには、4種類のroleが入る

role誰の発言か典型的な中身
systemエージェント (ユーザが書く場合も)振る舞い指示 / 制約 / 例示 // 先頭に1つ
userユーザ (エージェントが補強情報を足す場合も)実際の質問 / 依頼
assistantLLM自身の過去の発言応答テキスト / または tool_calls
toolツール実行の結果tool_call_id で紐付ける

systemもuserも、LLMから見ればどちらもただの入力文字列
systemは優先されるよう設計されているが、LLMはテキストを厳密に区別できないため、外部入力を指示として誤解し、結果的にsystemの意図が破られることがある (prompt injection)。

// OpenAI Chat Completions API (またはOpenAI 互換 API)の場合

返ってくるJSONの、3つのメインフィールド

{
  "choices": [
    {
      "finish_reason": "stop",
      "index": 0,
      "message": {
        "content": "富士山の高さは、**3,776メートル**です。",
        "role": "assistant"
      }
    }
  ],
  "created": 1774969200,
  "id": "zdTuaejONoCnvr0P6L_cyQk",
  "model": "gemini-3.1-flash-preview",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 23,
    "prompt_tokens": 17,
    "total_tokens": 40
  }
}
message

LLMの応答そのもの。
role="assistant"固定。

finish_reason

なぜ生成が止まったか。
stop / length / tool_calls / content_filter

usage

このリクエストで
消費したトークン数 = 課金対象

// 配信形式streaming · SSE

応答はトークン単位逐次送られてくる

完了を待たず、生成途中の deltaServer-Sent Events で受け取る。実プロダクトではほぼ必須。

request
POST /v1/chat/completions
{
  "model": "gpt-5.5",
  "stream": true,        // ← これだけ
  "messages": [...]
}
response (SSE)
data: {"delta":{"content":"日"}}
data: {"delta":{"content":"本"}}
data: {"delta":{"content":"の"}}
data: {"delta":{"content":"首都"}}
data: {"delta":{"content":"は"}}
                  ...
data: {"finish_reason":"stop"}
data: [DONE]
なぜ使うか
  • +体感速度 — 最初の文字が出るまで数十ms
  • +長文応答でもタイムアウトしない
  • +途中で中断可能 (ユーザが止められる)
  • +エージェントが tool_calls早く検知できる
落とし穴
  • tool_callsdelta で分割され届く → クライアント側で再構築
  • structured output は途中はJSON不正
  • エラーは途中で起きる → リトライ設計が複雑
  • プロキシが SSE をバッファリングすると効果消滅

補足: 中身は 通常応答と等価 ―― 全 delta を結合すれば普通の choices[0].message が再構築できる。

// ハマりポイント

LLM APIは、完全にステートレス

AGENT SIDE messagesが育ち続ける t = 1 [ system, user: "富士山の高さは?" ] t = 2 — 全部再送 [ system, user: "富士山の高さは?", assistant: "3,776m", user: "世界で何番目?" ] t = 3 — さらに累積 [ ...(5件), user: "じゃあ日本一は?" ] 6 messages POST POST POST LLM SIDE 毎回ゼロから — 記憶なし LLM #1 state: ∅ 応答して消える LLM #2 state: ∅ #1のことは何も知らない LLM #3 state: ∅ 同じく初見 つまり サーバ側に会話の記憶は 一切残らない 会話が続いて見えるのは、 エージェントが毎回 messagesを全部再送 しているから。 ※ 例外: prompt cache (揮発TTL)

LLM側に残るのは「受け取った文字列」と「学習済みの重み」だけ — セッションも履歴もサーバには無い。

// 生成パラメータtemperature

temperature で、出力のランダムさを調整する

0.0 0.2 0.5 1.0 1.5 2.0 LOW HIGH ← 決定的 / deterministic 創造的 / creative →
prompt (両方とも同じ) → user: 「」を一言で表現して。 × 3 回生成
temperature = 0.2 同じ入力 → ほぼ同じ出力
#1 夜空に浮かぶ地球の衛星。
#2 夜空に浮かぶ地球の衛星。
#3 地球の周りを回る、唯一の衛星。
分類 / 抽出 / コード / 構造化出力 に向く
temperature = 1.5 同じ入力でも毎回違う
#1 潮の囁きを返す、銀色の鏡。
#2 夜の鼓動、満ち欠ける呼吸。
#3 宇宙の左目、たまに細める。
ブレスト / 創作 / コピー案出し に向く
内部的には、次トークンの確率分布を P(t)1/T でスケールしてから sampling。 T→0 で argmax、T↑ で低確率トークンも採用されやすくなる。 関連: top_p / top_k ※ サンプルは説明用。実際の出力は毎回変わる。
// 従来ソフトウェアとの根本的な違いdeterminism

LLM は非決定論的ソフトウェア — 「賢い関数」として扱うと事故る

CPU / GPU は決定論的なのに、その上で softmax → sampling → temperature を通すことで、わざと非決定論的に振る舞わせている。テスト・再現・検証の設計が根本から変わる。

観点 従来ソフトウェア LLM
INPUT → OUTPUT 同じ入力 → 必ず同じ出力 同じ入力 → 毎回変わりうる
制御フロー if / switch / loop で人間が書く 確率分布から sampling
テスト 単体テスト / アサーション 評価 (eval) / 統計的合格率
再現性 完全再現可能 完全再現は困難 (seed 固定でも保証されないことが多い)
バグの形 必ず再現する / スタックトレース 時々起きる / 失敗例を集めるしかない
最適化 計算量 / メモリ プロンプト / コンテキスト / モデル選択

含意: LLM は 確定的なハードウェアの上に乗った非決定論的レイヤ。 既存のテスト・モニタリング・SLO の前提が崩れるので、エージェント設計では retry / fallback / eval / guardrail が必須になる。

PART 3 / 10

AIの歴史

ルールベースからAIエージェントへ

// AIの変遷

ルールベースからAIエージェント

1950–70s

ルールベースAI (Symbolic AI)

if-then・論理・探索を人間が書く。知能 = 記号操作。

1980–90s

エキスパートシステム → 統計的機械学習

専門家知識の大量ルール化 → 知識獲得の限界 → SVM・決定木・ベイズへ。「特徴量は人間が設計する」。

2012–

ディープラーニング

AlexNet(2012)が転換点。特徴量設計をNNが吸収、end-to-end学習。「表現学習」の時代。

2017–

Transformer / 基盤モデル

Attention Is All You Need(2017)。大規模事前学習・スケーリング則で「単一タスク → 汎用基盤モデル」へ。

2022–

チャットAI (Instruction-tuned LLM)

ChatGPT(2022)。RLHF + instruction tuningで「人間と対話できるLLM」に。ただしツールなし。

2023–

Tool Use / RAG / Function Calling

LLMが外界を読む段階。知識の外部化とcontext engineeringが急速に発展。

2024–

AIエージェント ← 今ここ

LLM + Tools + State + Memory + Planning + Loop。ワークフローエンジンの上にLLMが載る構造。

なぜ「今」Agent なのか ― 推論能力の臨界突破 (GPT-4 世代) · ② context window の拡張 (8k → 200k〜1M) · ③ tool / function calling の標準化 ―― この3つが揃って初めてループが回せるようになった。
// 歴史の本質

各世代で、人間が書くものが変わった

時代人間が書くもの機械が獲得するもの
ルールベースAIルール推論の実行
統計的ML特徴量重みの学習
ディープラーニングアーキテクチャ特徴量 + 重み
LLM目的・文脈 (prompt)言語運用 + 推論
エージェント制約・環境 (tools, guardrails)計画 + 実行 + 判断

AIに任せられる範囲は広がり続けている — だからこそ、人間の設計はより重要になる
抽象度が上がるほど、目的・制約・環境の設計が成果を左右する。今のエージェントも「完全自律」ではなく、ワークフローエンジン + LLM という構造。

// 各時代で「人間が書くもの」をコードで見る

時代ごとに、人間が書くコードはこう変わった

ルールベースAI
# 人間がルールを書く
if fever and cough:
  diagnosis = "flu"
elif fever and rash:
  diagnosis = "measles"
else:
  diagnosis = "unknown"

人間が全分岐を網羅する

統計的ML
# 人間が特徴量を設計する
features = [
  age, bmi,
  blood_pressure,
  cholesterol_ratio,  # ← 人が考えた
]
model = SVM()
model.fit(features, labels)

人間が何を見るかを決める

ディープラーニング
# 人間がアーキテクチャを設計
model = Sequential([
  Conv2d(3, 64, 3),
  ReLU(),
  Conv2d(64, 128, 3),
  MaxPool2d(2),
  Linear(128, 10),
])

人間が構造を決める、特徴量は自動

LLM
# 人間が目的と文脈を書く
response = llm.invoke({
  messages: [
    { role: "system",
      content: "医療アシスタント" },
    { role: "user",
      content: "頭痛と発熱が…" }
  ]
})

人間が書くのはプロンプトだけ

エージェント
# 人間が制約・ツール・環境を設計する
agent = Agent(
  model  = "claude-sonnet",
  tools  = [search_db, send_email, calendar],  # ← 道具を選ぶ
  rules  = "RULES.md",                         # ← 行動規範
  guard  = [max_iter(10), no_delete],           # ← 安全制約
)
agent.run("来週の会議を設定して")                    # ← 意図だけ渡す

人間が書くのは制約・環境・ガードレール。計画と実行はLLMが担う

// エージェントの中身の内訳

エージェントの80%は、普通のコード

80% Deterministic Code
Routing どのツール・モデルに振り分けるか
Validation 入出力の型チェック・サニタイズ
Permissions 権限チェック・アクセス制御
Retry エラーハンドリング・リトライ・fallback
Formatting 出力の整形・ログ・永続化
20% LLM
曖昧性処理 自然言語の揺れを吸収する
意図理解 ユーザが本当にやりたいことを推定
生成 文章・コード・要約の生成

LLMが担うのは「人間の言葉を扱う」部分だけ。
残りの確定的な処理は、普通のソフトウェアエンジニアリング。

エージェント開発 = AI開発ではない。大部分は従来のソフトウェア工学の延長。

PART 4 / 10

状態管理

messages = 記憶

// 結論

state = messages 配列そのもの

入れ忘れたら

LLMは知らないことになる

消したら

LLMは忘れる

嘘を書いたら

LLMは事実だと思って喋る

他に隠されたstateは (基本的には) ない。LLM側は毎回はじめまして状態。

// 会話はこう育つ

2ターン目には、1ターン目のメッセージも再送する必要がある

✕ 1ターン目を送らない
// ② turn 2 リクエスト
[
  { "role": "system", "content": "..." },
  { "role": "user",   "content": "じゃあ世界で何番目?" }
]
// ② turn 2 レスポンス
{
  "message": {
    "role": "assistant",
    "content": "何のことですか?"   // ← 文脈を失う
  }
}

LLMは「富士山」を知らない状態で返答。

○ 1ターン目を再送する
// ② turn 2 リクエスト
[
  { "role": "system",    "content": "..." },
  { "role": "user",      "content": "富士山の高さは?" },     // ← 再送
  { "role": "assistant", "content": "3,776 メートルです。" },  // ← 再送
  { "role": "user",      "content": "じゃあ世界で何番目?" }
]
// ② turn 2 レスポンス
{
  "message": {
    "role": "assistant",
    "content": "標高では世界で約 50 位..."
  }
}

LLMは文脈を保持した応答を返せる。

LLM側はステートレス → クライアントが過去の全メッセージを毎ターン再送配列は毎ターン育ち続ける。

// 「記憶」の多層モデル

「記憶」は5つの層に分かれる

L実体寿命記憶として機能?
L1パラメータに焼き込まれた知識学習時の重みモデル版固定○ 暗黙的
L2プロンプトキャッシュ同じprefixの再計算を省略 / 課金割引TTL (数分〜1h)あくまで最適化
L3messagesへの注入 (=state)1リクエストで送る全メッセージ1リクエスト○ 明示的
L4mdファイルエージェントが必要に応じて読み込む永続○ 静的 → L3経由
L5外部ストレージ (RDB / KVS / Vector DB)検索して必要分だけ注入永続○ 動的 → L3経由
L2 注意

プロンプトキャッシュはコスト削減・高速化のための仕組みであり、ステートフルではないprefixが一致する範囲だけ計算をスキップする。LLMが「覚えている」わけではない。

// 外部知識の使い方RAG · Retrieval-Augmented Generation

RAG — 必要な分だけ取ってきて messages に注入する

学習時に焼き込まれていない情報 (社内ドキュメント / 最新ニュース / プロダクト固有) を、埋め込みベクトルの近傍検索で取り出し、prompt に挿し込む。L4 メモリ層の中核。

01 — QUERY
ユーザ入力

「就業規則の有給は?」

02 — EMBED
ベクトル化

embedding model
→ [0.12, -0.43, ...]

03 — SEARCH
近傍検索

vector DB で
top-k chunk を取得

04 — INJECT
prompt 合成

取得した chunk を
system / user に貼る

05 — GENERATE
LLM 応答

根拠を持って答える
(出典つき)

構成要素
  • ·embedding model — text-embedding-3-large / Cohere embed / BGE
  • ·vector DB — pgvector / Qdrant / Pinecone / Chroma
  • ·chunking — 300〜1500 token、重複あり
  • ·retrieval — top-k = 3〜10、hybrid (BM25 + semantic)
  • ·re-rank — Cohere rerank / cross-encoder
落とし穴
  • chunk 戦略次第で精度が激変 — 境界・粒度・重複
  • 埋め込みの意味的類似 ≠ 回答に必要 — re-rank で補正
  • 古い chunk が引かれてstale な回答
  • 取得結果をそのまま信じると root cause を見落とす
  • 引用URLを幻覚化するケースもある

位置づけ: RAG は tool calling の特殊形 — エージェント側が決め打ちで毎ターン検索ツールを叩く agent-driven パターンの典型例。

// RAG の先 · LLM 進化で広がる選択肢post-RAG strategies

単純 RAG だけではなくなってきている

context window が 200k → 1M+ に拡張し、推論能力tool callingが成熟したことで、「事前に chunk を取って貼る」以外の戦略が次々と現実的になっている。

01 — LONG-CONTEXT

全部入れる

chunk 化せず 対象を丸ごと context へ。retrieval ロスが消える代わりにコスト・latency が線形に増える。

ex. Gemini 1M / Claude 200k で codebase 全投入
02 — AGENTIC RETRIEVAL

能動的に取りに行く

事前 embedding 不要。LLM が grep / glob / read_file をループで叩いて必要な部分だけ取得。

ex. Claude Code / Cursor agent
03 — SKILLS / CORPUS2SKILL

手順書として与える

知識を Markdown + script のスキル束に固める。必要な時だけ on-demand に読む。

ex. Claude Skills / .cursor/rules / AGENTS.md
04 — GRAPH RAG

関係グラフで引く

エンティティと関係を知識グラフとして保持。横断的な問いに強い。前処理コストは高い。

ex. Microsoft GraphRAG / LightRAG
05 — MEMORY SYSTEMS

階層メモリと自己要約

OS の virtual memory のように、エージェントが自分の記憶を要約・退避・再ロード。長期会話・個人最適化向け。

ex. MemGPT / Letta / mem0
06 — CAG

prompt cache に焼く

参照したい知識を全部 prompt cache に乗せて、毎リクエスト 0.1× で再利用。検索が要らない。

ex. Anthropic prompt caching を使った構成
07 — FINE-TUNING

モデルに焼き込む

ドメイン知識・スタイルを LoRA / SFT で重みに学習。retrieval 不要だが、更新が重く鮮度を失う。

ex. LoRA / QLoRA / Continual fine-tuning
08 — HYBRID

実務は組み合わせ

Skills + agentic retrieval + 一部 RAG + cache のハイブリッドが現実解。単一戦略で勝つことは少ない。

2026 のコーディングエージェントは大体これ
どれを選ぶ? · 5 軸 ― 知識の量 (⩽ context ?) 鮮度 (頻繁更新?) 構造化されているか latency / cost 予算 モデルの推論能力

含意: RAG は出発点であって最終形ではない。 LLM の能力が上がるたびに、「事前に貼る」から「能動的に取りに行く」「手順書として持つ」へと、知識の与え方そのものが変わり続けている。

PART 5 / 10

トークン
コンテキストウィンドウ

// 文字列はどう分解される?

LLMはサブワード単位でしか読めない

  "Hello, world!"
    │
    ▼ BPE tokenizer (cl100k_base)
    │
  [ "Hello", ",", " world", "!" ]   ← 4 tokens
日本語の代償
1.3 — 2×

同じ情報量で、日本語は英語より 1.3〜2倍
場合によって3倍近くトークンを食う

1トークン ≈ 英語3〜4文字 / 日本語1〜2文字 / コード3〜5文字。
Gemini系は比較的効率的、OpenAI系はやや大食い、Anthropicは中間。

// 枠の中身

コンテキストウィンドウは、全部の合計で決まる

CONTEXT WINDOW system prompt 設計者の指示 tools schema 道具箱の宣言 past user / assistant / tool 過去の会話履歴 new user msg 今回の質問 prompt_tokens LLM generated response これから生成されるテキスト / tool_calls completion_tokens prompt_tokens + completion_tokens + internal_overhead ≤ context window

コンテキストウィンドウを超えたときに起きること:

  • prompt段階で 400 エラーで拒否される
  • 生成途中で finish_reason: length となり打ち切られる
  • 会話が育ち、Nターン目で突然失敗する
// 広ければ良いのか?

ウィンドウは広いほど良いとは限らない

01 COST

料金

入力トークン数 × 単価で線形に増える。長コンテキスト階層課金もある。

02 LATENCY

レイテンシ

長いほど生成開始も終了も遅い。UXに直結する。

03 QUALITY

品質劣化

長大なcontextで途中の情報を見落とすlost in the middle

だから実務は「ウィンドウは大きいが、送る量は必要最小限」。

// API のコスト構造pricing

課金は トークン数 × 単価 — でも単価は 5種類ある

送ったトークンと返ってきたトークンの両方に課金。さらに cache / batch / reasoning で単価が変わる。エージェントは長文 + ツール連鎖でトークンが膨らむため、構造を理解しないとコストが暴走する。

区分 単価の目安 説明
input (送信) system + 履歴 + 取得した RAG chunk + tool description ―― 通常はここが一番量が多い
output (生成) 3〜5× 応答テキスト。input より単価が高い ―― 長文応答が一番高くつく
cached input 0.1〜0.5× prompt caching — system / few-shot などの固定 prefix を再利用。Anthropic 90% OFF / OpenAI 50% OFF
batch 0.5× 非同期 (24h SLA) で投げると一律半額。評価・大規模埋め込み・夜間バッチ向け
reasoning output と同単価 o1 / Claude thinking 系は 内部推論トークン にも課金 ―― 見えないが消費される
削減レバー
  • +固定 prefix をprompt cacheに乗せる (system / few-shot)
  • +軽量モデル (nano / mini / haiku) を前段ルータ
  • +履歴は要約圧縮 or 選択的保持
  • +非同期で良い処理は Batch API
  • +structured output で出力トークンを縛る
膨らむ要因
  • ツール連鎖 → 毎ターン全履歴を再送
  • tool description 10 個 × 毎リクエスト
  • RAG で無関係な chunkを大量に注入
  • reasoning モデルの見えない内部トークン
  • 長文 PDF / 画像 / 動画のmultimodal token

原則: 「ウィンドウは大きいが、送る量は必要最小限」 ―― 自由に詰めると毎回がスポット契約になる。

PART 6 / 10

ツール

tool calling

// LLMに道具箱を渡す

リクエストに tools を足すだけ

{
  "model": "gemini-3.1-flash-preview",
  "messages": [ ... ],
  "tools": [
    {
      "type": "function",
      "function": {
        "name":        "now",                                          // ← 識別子
        "description": "Return the current UTC time in ISO-8601.",  // ← LLMが読む
        "parameters": { "type": "object", "properties": {}, "required": [] }
      }
    }
  ]
}

LLMは descriptionparameters の両方を読むが、
型バリデーションではなく確率的に解釈する — 説明文が曖昧だと引数もズレる。

// 往復

tool_calls の2往復

ROUND 1
// → リクエスト: 「今何時?」
{
  "messages": [{ "role": "user", "content": "今何時?" }],
  "tools": [{ "name": "now", ... }]
}
// ← LLMの応答: 「nowを呼んで」
{
  "role": "assistant", "content": null,
  "tool_calls": [{ "id": "call_abc",
    "function": { "name": "now", "arguments": "{}" } }],
  "finish_reason": "tool_calls"
}
// エージェントが now() を実行 → "2026-04-11T02:28:00.000Z"
ROUND 2
// → リクエスト: 履歴 + ツール結果を再送
{
  "messages": [
    { "role": "user",      "content": "今何時?" },
    { "role": "assistant", "tool_calls": [...] },
    { "role": "tool",      "tool_call_id": "call_abc",
      "content": "2026-04-11T02:28:00.000Z" }
  ]
}
// ← LLMの応答: 最終応答
{
  "role": "assistant",
  "content": "今は午前 11 時 28 分です。",
  "finish_reason": "stop"
}

2回のリクエストで 1 ターンが完結する。ツールを連鎖させると 3, 4, 5 往復と増えていく。

// ツールがLLMの手足になる

ツールの3要素

01 DESCRIPTION

LLMの判断材料になる

LLMはdescriptionを読んで「いつ・どのツールを呼ぶか」を決める。曖昧だと使うべき場面で使わず、具体的なら的確に選べる。

02 SCHEMA

引数の型で逸脱を防ぐ

enum / required / min / max — JSON Schemaで縛るほど、LLMが不正な引数を送る確率が下がる。

03 IMPL

実装がそのまま出力品質になる

ツールが嘘を返せばLLMは嘘を真実として喋る。正常系だけでなくエラー処理も道具の品質。

ツールはLLMの手足 — 単体では「知っていること」しか語れないLLMに、外の世界に触れる力を与える拡張レイヤ。

// 実在エージェントの道具箱

普段使っているコーディングエージェントは、ツールが驚くほど少ない

「高機能そうに見える」ものほど、実はプリミティブ数個の組み合わせで成立している。

ANTHROPIC

Claude Code

10 ツール
Bash — shell実行
Read / Write / Edit — ファイル
Grep / Glob — 検索
WebFetch / WebSearch
Task — subagent
TodoWrite
OPENAI

Codex CLI

コア 3〜5 ツール + MCP
shell — 任意のコマンド
apply_patch — 差分適用
update_plan — TODO更新
web_search — ビルトイン
view_image — 画像
mcp_* — 拡張はMCPで

ファイル読み書きもgrepもshell経由 (cat / rg / sed)。Unixパイプを信頼する設計。

CURSOR / CLINE 系

IDE統合エージェント

8〜12 ツール
read_file / edit_file
codebase_search — semantic
grep_search / list_dir
run_terminal_cmd
web_search
mcp_* — MCPで拡張

差を生むのはツールの数ではなく、プロンプト設計 × モデルの賢さ × ループの回し方
shell 1本あれば、cat も rg も git も curl も python も全部使える — プリミティブで十分。

// 自分で作るならどう設計するか

汎用か専門か、でツール粒度の正解は変わる

Claude Code / Codex は「汎用」なので抽象度の高いプリミティブを選んでいる。専門エージェントなら話が別。

GENERAL PURPOSE

汎用エージェント

何でも屋 / タスクの幅が事前に決まらない

shell / read / write / search

プリミティブを少数、組み合わせで何でもこなす
設計判断は「LLMにやらせる」。ツールは道具であってワークフローではない。

例: Claude Code / Codex CLI / Cursor

DOMAIN SPECIFIC

専門エージェント

業務・ドメインが固定 / 安全性や再現性が必要

create_invoice / refund_order / fetch_patient_record

ツール名と引数が業務語彙そのまま
正解パスが決まっていて、「LLMに自由に考えさせない」ことが品質になる。

例: カスタマーサポート / 経理 / 医療 / 社内SaaS連携

BALANCE

具体すぎると — ツールが爆発、新ケースで全部作り直し、LLMの選択肢で迷う。
抽象すぎると — 業務ドメインで事故る、権限境界が曖昧、監査できない。
正解は「業務の不変な動詞を特定して、そこだけ専用ツール化」。残りは汎用プリミティブに任せる。

// Model Context Protocolspec.modelcontextprotocol.io

MCP — LLM への「ツール・コンテキスト接続」の共通インターフェース

Anthropic が提唱、JSON-RPC ベースのオープン仕様。「AI のための USB-C」 — ホスト(Claude Desktop / IDE / Agent) が、多様なサーバを同じ口で差し込める。

3 層アーキテクチャ
HOST Claude Desktop · IDE · Agent ランタイム ユーザと LLM を持ち、複数の MCP クライアントを束ねる MCP CLIENT (1 server あたり 1 接続) JSON-RPC 2.0 over stdio SSE streamable HTTP handshake → initialize / capabilities / list / call / notifications LOCAL · stdio filesystem-mcp read_file / write_file / glob npx · docker · uvx authn: プロセス境界で隔離 SaaS · HTTP / SSE github · notion · linear create_issue / search_repos authn: OAuth 2.0 authz: scope (read / write) SELF-HOSTED · 社内 company-db-mcp internal API ラッパ authn: API key / mTLS ネットワーク境界の内側
サーバが提供できる 4 つのプリミティブ
tools LLM が呼べる関数 (副作用あり)

JSON Schema 引数。create_issue, run_sql, send_email など。

resources 読み取り専用データ

URI で指す(file://, git://, db://…)。LLM のコンテキストに添える。

prompts 再利用可能なテンプレート

「コードレビュー」「PR 要約」などをサーバ側で名前付き定義。

sampling サーバ → ホストへの逆方向 LLM 呼出し

サーバが独自に LLM を持たず、ホストの LLM を借りる仕組み。

結果: AI ホストごとに独自プラグイン API を作る必要がなくなる。同じ MCP サーバを Claude / Cursor / Cline / 自作 Agent で使い回せる

// MCP を導入するときの判断材料spec.modelcontextprotocol.io

MCP のメリット / デメリット

メリット
  • +ホスト非依存。同じサーバを Claude Desktop / Code / Cursor / Cline / 自作 Agent で使い回せる。
  • +パッケージ配布。npm / pip / docker で配り、設定 JSON にエントリを足すだけで接続できる。
  • +tools 以外の語彙(resources / prompts / sampling)まで標準化 — 単なる function calling より広い。
  • +SaaS サーバは OAuth 2.0 で認証、scope で認可 → 権限を read-only / write に分けられる。
  • +ローカル / SaaS / 社内自前 を同じ抽象で混在可。transport(stdio / SSE / HTTP) を切り替えるだけ。
デメリット / 注意点
  • tool 爆発。10 サーバ × 10 tools = 100 個の description が毎リクエスト乗ってコンテキストを食う。
  • 3rd-party サーバの description を信用する構造 → prompt injection の経路になる。
  • ローカル stdio サーバは手元マシンの権限で動く。任意コード実行と等価、サンドボックス不在。
  • SaaS の scope 設計が粗いと過剰権限になる。「issue 操作 OK だが repo 削除は NG」を MCP 側では強制できない。
  • 仕様が流動的。互換性・監査・課金・マルチテナントはエコシステム未成熟(2026 / 6 時点)。

実務的には: 「手元の開発はローカル MCP を積極的に、本番エージェントでは認可境界とコンテキスト圧迫を見て厳選」。

PART 7 / 10

AIエージェント

agent = LLM を中心にした orchestration layer

// 用語整理 · chatbot / workflow / agent の境界

「Agent」とは何か — 3つの近傍概念と区別する

いま「Agent」は曖昧に使われている。自律的にツールを選択・実行し、状態を持ちながら目的を達成するシステム ―― ここを軸に近傍と比べる。

A — CHATBOT

会話する

入力→生成→返答。ツール無し / 状態は会話履歴のみ。ループしない。

最近の ChatGPT / Claude.ai は web 検索・code interpreter・MCP を統合し、エージェント化が進行中 ―― 境界は溶けつつある。

ex. 単純 ChatGPT 利用 / 初期 Bard
B — WORKFLOW

決め打ちで動かす

人間がDAGを設計。LLM は各ノードのテキスト処理係。経路はLLMが決めない。

ex. n8n / Dify / Zapier + AI
C — AGENT

自分で経路を選ぶ

LLMがツール選択 / 順序 / 終了条件を判断。ループ + 状態 + 道具箱。

ex. Claude Code / Cursor agent / Codex CLI
D — ASSISTANT

人間に寄り添う

人間が主体で承認しながら進める形。Agent と地続きで境界は曖昧。

ex. GitHub Copilot / IDE 補完
AGENT である3条件 ― LLM がツールを選ぶ (経路は人間が事前に書かない) · ② ループする (1往復で終わらない) · ③ 状態を持つ (messages や外部メモリ)

AIエージェントに対する考え方

提供側 · BUILDER

いかに
完成された体験として
提供するか。

UI/UX を磨き、エラーや試行錯誤を隠し、
ユーザに魔法のように見せることが価値。

使う側 · USER · DEV

いかに
仕組みを理解して
使いこなすか。

中身は messages・tools・loop。
分かれば、限界も強みも、設計判断もつく。

// 7つの要素

エージェントは、7つの要素ループして動く

プレイブック playbook AGENTS.md / CLAUDE.md skills / rules / .mdc 人が書き、エージェントが読む user 質問 / 依頼 メモリ memory session / messages履歴 KVS / 好み / 前回の結果 エージェントが読み書き CORE エージェント orchestrator messagesを育てる LLMを呼ぶ / ツールを叩く 停止条件を判定する LLM decide-only 判断だけ 外の世界は触れない ツール tools 外の世界に触れる手足 search / now / calc / ... ガード guardrails 権限 / レート 検査 / マスキング 全経路を囲む read-only read write 質問 回答 / 追加質問 (clarification) (system + user質問 + 過去応答 + tool結果) messages ◀ tool_calls / text execute ▶ ◀ tool result → messagesに積む LOOP

「LLMに聞く → ツールを叩く → 結果をmessagesに積む」を繰り返し、人へ回答か追加質問を返す。ユーザの返答でまたループが続く。

// 役割分担

誰が、何を担当しているのか

登場人物何をする責任範囲
要求を入力し、最終応答を受け取る問いの起点 / 最終の受け手
エージェント問いかけ → ツール実行 → 再問いかけ のオーケストレーションループ制御 / state保持 / ツール呼び出し
LLM次に何を言うか / どのツールを呼ぶかを判断する判断だけ。外部システムには触れない
ツールLLMが持っていない情報・能力を提供するsearch / now / calc / file / …
プレイブック振る舞いの方針・手順を事前に与えるAGENTS.md / CLAUDE.md / skills / rules
メモリ過去のやり取りや状態を保持・参照するmessages履歴 / session / KVS / 好み
ガード安全性 / 整合性 / 認可の担保入力検査 / 権限 / レート / 出力フィルタ
// ターンとイテレーション

1ターン 1 LLM呼び出し

質問のタイプLLM呼び出し内訳 (各呼び出し: リクエストの最終message → レスポンス)
シンプルなQ&A1 回① user → assistant
ツールを1回呼ぶ2 回① user → assistant(tool_calls) / ② tool → assistant
ツールを同時にN個呼ぶ (parallel)2 回① user → assistant(tool_calls×N) / ② tool×N → assistant
ツールを3回連鎖させる4 回① user → assistant(tool_calls) / ② tool → assistant(tool_calls) / ③ tool → assistant(tool_calls) / ④ tool → assistant
追加質問を返す1 回① user → assistant (質問で一旦停止)

1ターン = 1 user〜次の user まで。その間にAPIは 1〜N回 呼ばれる。

// ループの骨格

エージェントループは、単純なwhileループ

// 擬似コード
messages.push(userMessage)

loop:
  response = LLM.invoke(messages, tools)
  messages.push(response.assistant_message)

  if response.finish_reason == "stop":
    break                                    // ← 最終応答が出た

  if response.finish_reason == "tool_calls":
    for call in response.tool_calls:
      result = execute_tool(call)
      messages.push({
        role: "tool",
        tool_call_id: call.id,
        content: result
      })
    continue                                 // ← もう一度LLMに聞く

return messages[-1]
// 「分に15をかけて」の1ターン

messagesは、こう育つ

// 初期状態
[ system, user: "今の時間を調べて、分に 15 をかけて" ]

// ITER 1 — LLM: now を呼びたい
+ assistant tool_calls: [{ name: "now", id: "c1" }]
+ tool      tool_call_id: "c1", content: "2026-04-11T02:28:00Z"

// ITER 2 — LLM: calc を呼びたい
+ assistant tool_calls: [{ name: "calc", args: "28*15", id: "c2" }]
+ tool      tool_call_id: "c2", content: "420"

// ITER 3 — LLM: 最終応答
+ assistant "現在UTC 02:28 なので、分の 28 × 15 = 420 です。"   finish_reason: stop

→ 3回のLLM呼び出し + 2回のツール実行 = 1ターン。コストは積算。

// 終了理由

ループを止める、5つの終了理由

01・02はLLMが返すfinish_reasonで判断。03〜05はエージェント側の判断

// ツール起動の3パターン

ツール呼び出しには、3つの起動パターンがある

01 LLM-DRIVEN

LLMがtool_calls
「これを呼びたい」と返す

response = LLM.invoke(messages, tools)
if response.tool_calls:
  result = execute(response.tool_calls)
  messages.push(tool_result)
  // → もう一度LLMに聞く

LLMがいつ・何を呼ぶか判断
柔軟だがAPI往復が増える

02 AGENT-DRIVEN

エージェントのコードが
LLMを介さず直接呼ぶ

// LLMの判断なしで毎回実行
context = search_db(user_query)
messages.push({ role: "system",
  content: context })
response = LLM.invoke(messages)

エージェントが確定的に実行
速い・安い・確実。RAGが典型

03 PROGRAMMATIC

LLMがプログラムを書いて
複数ツールをまとめて呼ぶ

// LLMがコードを生成
program = LLM.generate_code(
  messages, tools)
// エージェントがまとめて実行
result = sandbox.exec(program)

LLMが実行計画をコードで書く
往復1回で複数ツール連鎖 →

実際のエージェントは組み合わせて使う。状況判断はLLM-driven、確実な前処理はagent-driven、複雑な連鎖はprogrammatic。

// Programmatic Tool Calling

LLMがプログラムを書くことで、往復を減らす

LLM-DRIVEN — 3回連鎖の場合
// 往復 ① user → assistant(tool_calls: now)
// 往復 ② tool(時刻) → assistant(tool_calls: calc)
// 往復 ③ tool(計算結果) → assistant(tool_calls: format)
// 往復 ④ tool(整形済) → assistant(最終応答)

→ LLM API 4回呼び出し
PROGRAMMATIC — 同じ処理
// LLMが生成するプログラム:
time = call(now)
result = call(calc, { expr: time.min * 15 })
output = call(format, { value: result })
return output

→ LLM API 1回 + sandbox実行 1回
01往復削減
N回の連鎖が1回のLLM呼び出しに
02条件分岐・ループ
tool_callsでは表現できない制御構造
03サンドボックス必須
LLMが書いたコードを安全に実行する環境が要る

Anthropicのtool_use with code execution、OpenAIのCode Interpreterなどがこのパターン。

TOOL CALLING の 核心

決めるのは LLM、
叩くのは エージェント

LLM自身は、外部システムに一切触れない
Webを見ない、ファイルを読まない、計算もしない。JSONで「呼んでほしい」と意思表示するだけ。

// tool_calls は提案でしかない

エージェントに、実行する義務はない

a実行して結果を返す— 標準パターン
  • ツールを実行し、toolメッセージとして結果を履歴に追加する
b実行するがモデルには見せない— 内部処理
  • ログ収集・ガードレール・偵察などに利用
  • tool_calls を履歴に残さない、または整合する形に書き換える
  • tool_calls だけ残して結果を見せない」は不整合を生むため避ける
c実行せず応答に置き換える— ガードレール
  • 危険・不適切・不要なツール呼び出しを抑止
  • assistant応答として「実行できない理由」や代替案を返す
dそもそも呼ばせない— 事前制御
  • system prompt やツール設計で使用条件を明示
  • 不要な tool_calls を減らす

tool_calls は LLM の出力であって命令ではない。エージェント側でいくらでも介入できる。

// エージェントの各要素は、今まさに進化中

7つの要素の掛け算が、エージェントの品質を決める

ここまでの7パートで基礎を押さえた。しかしエージェント技術は過渡期にあり、各要素が独立に急速進化している。
今日の講義では全てをカバーできないが、主要な進化軸を俯瞰しておく。

LLMモデルの世代交代

GPT-3.5 → 4 → 4o → o1 / Claude 3 → 3.5 → 4 — モデルが賢くなるだけでエージェント全体の品質が上がる。推論能力、コンテキスト長、マルチモーダル対応が急速に進化。

TOOLSツール接続の標準化

function calling → parallel tool use → MCP(Model Context Protocol) — ツール定義と接続が標準化され、エージェントが使える道具の幅が爆発的に拡大。

CONTEXT知識の外部化と圧縮

RAG(検索拡張生成)でLLMに外部知識を注入。コンテキスト圧縮・要約でウィンドウを有効活用。prompt cacheでコスト削減。

PLAYBOOK指示設計の高度化

単純なsystem prompt → スキル定義、.mdルールファイル、few-shot、structured outputs — 「LLMへの指示」自体がソフトウェアエンジニアリングに。

EXECUTION実行パターンの多様化

LLM-driven → agent-driven → programmatic → マルチエージェント — 単一ループから、複数エージェントの協調・委譲へ。

GUARD安全性と制御

content filter → moderation API → 入出力ガードレール → human-in-the-loop — エージェントが自律的になるほど制御設計が重要に。

今日はこれらの基盤となる仕組みを理解することがゴール。各要素の最新動向は、この土台の上に積み上がる。

// 最も重要な要素 — 人間

7つの要素のうち、最も重要なのは人間

エージェントは道具。どれだけ賢くても、使い方を間違えれば壊れる。人間の役割は「指示を出して待つ」だけではない。

01正しく指示を出す

曖昧な指示 → 曖昧な出力。「いい感じに」では動かない。
目的・制約・期待する出力形式を明示する。プロンプトは仕様書。

02出力を検証する

LLMは自信満々に嘘をつく。コードも文章も「正しそうに見える」が保証はない。
人間のレビューが最終品質ゲートになる。

03必要な文脈を渡す

LLMはあなたの状況を知らない。社内ルール、過去の経緯、ドメイン知識 —
足りない文脈は人間が補う。渡さなければ「知らない」のと同じ。

04権限と範囲を決める

何をさせて、何をさせないか。ファイル削除、外部通信、課金 —
エージェントの行動範囲を制限するのは人間の責任。

05フィードバックで育てる

「違う」「こっちの方向」「もっと具体的に」 — 対話の中で軌道修正する。
エージェントは1発で正解を出す魔法ではなく、対話で磨く道具

06限界を理解する

「AIにやらせれば全部解決」は幻想。得意な仕事と苦手な仕事がある。
人間がやるべきことと、エージェントに任せることを分ける判断も人間の仕事。

PART 8 / 10

AIエコシステム

誰がLLMを作り、誰がエージェントを作るのか

// 2025〜2026の構造変化

「LLM + エージェント」に収束した世界を、3つの視点で見る

提供側

全員がLLM + エージェントの両方を提供する時代

LLM単体では差別化できない → エージェントを足す
エージェント単体では基盤がない → 自社LLMに手を出す
競争軸は「誰のエージェントか」「誰のLLMの上で動くか」へ
利用側 — システム開発

LLMをエージェントでラップする

  • LLMにツール・メモリ・ガードを組み合わせてシステム構築
  • Agent SDK (OpenAI / Anthropic) · LangChain 等が成熟
  • MCP でツール接続が標準化
  • 評価・観測・ガードレールの運用基盤も整備

「プロンプトを書く」から「エージェントを設計・構築する」へ。

利用側 — 非エンジニア

エージェントがタスクを代行する

  • 以前: ChatGPTでチャットする程度
  • 今: エージェントが自律的に調査・作成・実行
  • computer use / browser use が当たり前に
  • Dify / n8n 等でノーコードワークフロー

「AIに聞く」から「AIに任せる」へ。

PART 8 · § A

モデル
どう分類するか

公開形態 / 提供形態 / 性能帯 / モーダル / マシンスペック / セキュリティ — 6 軸でモデルの性格を見る

// LLMの分類 ① — 公開形態と提供形態

LLMには多くの分類軸がある

公開形態
クローズド

重み非公開。API経由でのみ利用。
モデル内部はブラックボックス。

オープン

重み公開 (open-weight)。
自前でホスト・ファインチューン可能。

提供形態
クラウド

API経由で利用。従量課金。
データは外部に送信される。

ローカル

手元のPC/サーバで実行。
LLMの処理はローカル。ツール経由で外部通信する場合はある。

トレンドオープンモデルはクローズドとの差を約3ヶ月まで縮めている。実務ではタスクに応じて使い分けが現実的。
// LLMの分類 ② — 性能帯とモーダル

性能帯とモーダルで分類する

カテゴリは排他ではない。1つのモデルが複数に該当する(例: DeepSeek V4 = オープン + クラウド + フロンティア)。

性能帯
フロンティア

能力の最前線を走る最先端モデル。クローズド/オープン両方に存在。

フラグシップ

各社の看板となる主力モデル。フロンティア級を実用バランスで提供。

軽量

小型で高速・低コスト。エッジ/モバイルでも動く。

特化型

コーディングなど特定ドメインに最適化。

モーダル
テキスト

テキスト入出力のみ。最も基本的な形態。

マルチモーダル

テキスト+画像+動画を入力可能。出力はテキスト。

オムニモーダル

テキスト・画像・音声・動画の入出力すべてをネイティブ処理。

生成特化

画像・動画・音声の生成に特化。LLMとは別系統。

2026年のトレンドフロンティアモデルはマルチモーダルが標準に。音声をSTTを介さず直接処理するオムニモーダルが台頭。
// 具体的な組み合わせ — 3つのケース

分類軸の組み合わせで、モデルの性格が決まる

カテゴリは排他ではない。1つのモデルが複数に該当する。

CASE 1

GPT-5.5

クローズド クラウド フロンティア オムニモーダル

OpenAIの最高性能モデル。テキスト・画像・音声・動画の入出力すべてをネイティブ処理。API経由でのみ利用可能。

CASE 2

DeepSeek V4

オープン クラウド フロンティア マルチモーダル

オープンウェイトかつフロンティア級。API経由でもローカルでも利用可能。クローズドとの差を急速に縮めている代表例。

CASE 3

Qwen3.5-0.8B

オープン ローカル 軽量 テキスト

0.8Bパラメータの超軽量モデル。ノートPCのCPUでも動作。オフラインで使えるため、プライバシー重視のユースケースに。

// ローカルLLMに必要なスペック

ローカルで動かすには、どんなマシンスペックが必要か

モデルの重みをメモリ(GPU VRAM or 統合メモリ)に載せる必要がある。パラメータ数と量子化ビット数でサイズが決まる。

モデルサイズ必要メモリ目安Mac で動かすならWindows で動かすなら
〜4B
超軽量
3〜4 GB 任意のMac (8GB以上) GPU不要。CPU + 8GB RAM で動作
7〜14B
実用的
6〜10 GB Mac mini / MacBook Pro (16GB) RTX 3060 12GB 以上。
CPU推論も可能だが遅い
30〜70B
高品質
20〜40 GB Mac mini M4 Pro (48GB) がコスパ良 RTX 4090 24GB (量子化必須)
or 2枚構成
100B+
フロンティア級
80〜150 GB Mac Studio M4 Ultra (192GB) A100/H100 80GB × 2〜4枚
個人利用は非現実的
Mac mini がコスパ最強

M4 Pro + 48GBで30万円弱。統合メモリでVRAMの壁がなく、30B級モデルも実用的に動く。

量子化のポイント

Q4_K_M (4bit量子化) でサイズ約半分に。品質低下は軽微。Ollamaがデフォルトで対応。

// セキュリティ・データの流れ

ローカルで動く」と「データが外に出ない」は、別の話

プロバイダ選定は 学習利用 / ログ保持 / 外部送信 の3軸で見る。「ローカル = 安心」とは限らない。

クラウドモデル

学習 主要ベンダーの API は学習には使わないのが標準(opt-in 化)。

ログ 不正利用検知などのため、30日前後の保持が一般的。Zero Data Retention 契約で削除可。

出力先 プロンプト・ファイル・出力はプロバイダのインフラを通過。リージョン / DPA を確認。

→ 機微データはリージョン / 契約 / マスキングで管理。「学習に使われない ≠ ログに残らない」。

ローカルモデル

推論 重みも入出力もマシン内に閉じる。プロンプトはネットに出ない。

ツール ただしエージェントが呼ぶツール(検索 / API / Web fetch / MCP) は外部に出る。LLM だけ見ても判断できない。

テレメトリ 一部ツールやランタイムは利用統計を送信。opt-out 設定を確認。

→ 守るべきは「LLM」ではなく「エージェントの境界」。出口(ツール) を絞れば安全に近づく。

判断軸: data residency / retention / egressローカル LLM + ローカル MCP + ネット遮断、が最も閉じた構成。

PART 8 · § B

プレイヤー
役割分担

誰が LLM を作り、誰がエージェントを作るのか — 4 カテゴリ × Big-3 のレイヤ構造

// 2026年4月時点の主要プレイヤー · 「誰のエージェントか」で4分類

誰がLLMを作り、誰がエージェントを作っているのか

ほぼ全員が「LLM + エージェント」の今、競争軸は モデル主導 vs エージェント主導 / ファースト vs サード の2軸。境界は流動的(② が自社LLM強化 / ③ が独自モデル投入 など)。

モデル主導 × ファーストパーティ
最も主戦場

提供者がモデルもエージェントも自社で

OpenAIChatGPT / Codex / Agents SDK AnthropicClaude.ai / Claude Code GoogleGemini / Vertex AI Agent MetaLlama (OSS) / Meta AI xAIGrok
+ モデルとエージェントが強く統合 / UX・性能とも最適化されやすい
モデル主導 × サードパーティ

モデルは借りて、エージェント体験で勝負

MicrosoftCopilot系 (GitHub / M365) Perplexity検索エージェント (自社Sonarモデルも保有) AmazonBedrock / Amazon Q / Novaモデル
+ 複数モデルを切替 / プロダクト設計・UIで差別化
モデルに依存する弱点あり
エージェント専業(モデル非保有 or 弱い)

エージェントUX・開発体験に特化

Cursorコーディングエージェント Windsurfコーディングエージェント (旧Codeium) CognitionDevin
+ 内部で複数LLM利用 / モデルはコモディティ前提
※ 各社とも既存LLM + 独自チューニング + 制御レイヤーが実態
エージェント開発基盤(作る側)

自社プロダクトではなく 土台 を提供

LangChainエージェントフレームワーク LlamaIndexRAG / データ接続 DifyLLMアプリビルダー
+ LLMは外部依存 / B2B・社内エージェント開発が中心 / ①〜③ すべての下に入るレイヤ
// Big-3 に絞ると見える構造 ─ OpenAI / Anthropic / Google

同じ会社でも、レイヤごとに別プロダクト

前ページの B(両方提供)から3社に絞る。会社名・モデル名・API名・チャットweb・コーディングエージェント・モバイルアプリはすべて別の固有名詞。混同すると話が噛み合わない。

会社 LLM(モデル) API商品 チャットWeb コーディングエージェント モバイル/デスクトップ
OpenAI GPT-5.5 / GPT-5.4-mini / GPT-5.4-nano OpenAI API ChatGPT Codex CLI ChatGPT app
Anthropic Claude Opus 4.8 / Sonnet 4.6 / Haiku 4.5 Anthropic API Claude.ai Claude Code Claude app
Google Gemini 3.1 Pro / 3.1 Flash / 3.1 Flash-Lite Gemini API / Vertex AI Gemini Gemini CLI / Jules Gemini app
読み方の注意 ①

「Claudeを使う」は曖昧 — モデル・API・Web・CLI・アプリのどのレイヤかで話が変わる。

読み方の注意 ②

ChatGPT等はUI+エージェント層。裏のモデルは別物。UIとモデルは分けて見る

読み方の注意 ③

3社とも全レイヤを揃えている。「どのレイヤの話か」を明示しないと議論がねじれる。

PART 8 · § C

3 経路
API の進化

3rd-party エージェントが他社 LLM を呼ぶ 3 つの経路、そして OpenAI 自身の API 遍歴・収束と分化

// エージェントとLLMの関係

エージェントはLLMを、選んだり切り替えたりできる

エージェントとLLMの提供元が同じ違うかで挙動が変わる。固有名詞は前ページの整理に従う。

1ST-PARTY AGENT

提供元が同じ

LLM提供会社が出す純正エージェント — 自社モデル専用

  • ChatGPT / Codex ⇆ GPT・o系列(OpenAI)
  • Claude.ai / Claude Code ⇆ Claudeシリーズ(Anthropic)
  • Gemini app / Gemini CLI ⇆ Geminiシリーズ(Google)
  • 自社モデルに最適化 — 新機能を即使える
  • 他社モデルは通常使えない
3RD-PARTY AGENT

提供元が違う

エージェント会社が他社LLMを呼ぶ — モデル選択が前提。

  • Cursor / Cline / Aider(コーディング)
  • Dify / Devin / 自作エージェント
  • モデルを選ばせるのが前提 — 複数プロバイダを呼ぶ
  • ユーザがAPIキーを持ち込む形も多い (BYOK)

3rd-partyエージェントがどうやって違うプロバイダのLLMを呼ぶのか — 答えは3経路。次から1つずつ見る。

// LLM呼び出しの3経路 · 1/3

Route 1 — 1st-party ネイティブAPI

各社が本来提供するネイティブ形式。エージェントがプロバイダごとに分岐コードを持つ。

OpenAI

POST /v1/chat/completions

Anthropic

POST /v1/messages — system別フィールド / contentが配列

Google Gemini

POST ...models/<m>:generateContent — role=user/model

MERIT
  • +新機能を最速で使える
  • +prompt cache / extended thinking / 長文vision / 拡張tool形式
  • +プロバイダのSDKがそのまま使える
DEMERIT
  • リクエスト/レスポンス形式がプロバイダごとに違う
  • エージェント側に分岐コードが増える
  • プロバイダを増やすたびに実装コスト
// LLM呼び出しの3経路 · 2/3

Route 2 — 1st-party OpenAI互換

各社が「OpenAI形式でも受ける」別口エンドポイントを用意している。baseURLとmodel名だけ差し替えで全社呼べる。

Anthropic

api.anthropic.com/v1/openai/chat/completions (beta)

Google Gemini

generativelanguage.googleapis.com/v1beta/openai

Ollama / vLLM / LM Studio

localhost:11434/v1/chat/completions — ローカルも同じ形

MERIT
  • +クライアント1つで全プロバイダに繋がる
  • +OpenAI SDK / LangChain / LlamaIndex がそのまま使える
  • +ローカルLLM (Ollama) との往復も透過
DEMERIT
  • ネイティブ固有機能は欠落または遅れて実装
  • 細かい引数・エラー挙動に微妙な差が残る
  • 最小公倍数のAPIに引きずられる

ChatGPT普及でOpenAI形式が事実上の標準になり、新規モデル投入の必須条件に近くなった。

// LLM呼び出しの3経路 · 3/3

Route 3 — 3rd-party アグリゲータ

エージェントと各LLMのあいだに翻訳プロキシを挟む。エージェントはプロキシ1つだけ相手にする。

OpenRouter

統一OpenAI形式 / 数百モデルを同じキーで

推論専業ホスト

Together / Fireworks / Groq / DeepInfra

自前プロキシ

LiteLLM / Helicone / Portkey — 社内ゲートウェイ

MERIT
  • +キー / 課金 / ルーティングを中央集約
  • +フォールバック・レート制限・ログが一元化
  • +複数キーの管理がエージェント側から消える
DEMERIT
  • マージン / レイテンシ / 単一障害点
  • 最新機能対応は1テンポ遅れる
  • 運用を買う代わりに依存が増える

どれが正解ではなく併用が現実 — 同じエージェントでも、モデルごとに Route 1 / 2 / 3 が混在する。

// Part 6 補論 · OpenAI API そのものの遍歴platform.openai.com/docs

OpenAI API の遍歴

「OpenAI形式 = Chat Completions」が業界標準として固定化される一方、OpenAI 自身は次のAPI形態へ移り始めている。後発のものほどまだ普及途上

YEAR
API
ENDPOINT
状態
位置づけ
2020
Completions
/v1/completions
LEGACY
プロンプト → 続きを返すだけ。role / tool 概念なし。GPT-3 / text-davinci 系。非推奨
2023.03
Chat Completions
/v1/chat/completions
DE-FACTO
messages 配列・roles・tool_calls を導入。全社が互換実装する形式で、業界標準として固定。
2023.11
Assistants beta
/v1/assistants · /threads
SUNSET
サーバ側で会話を保持する初の試み (Threads / Runs / File Search)。普及せず、Responses に統合されて段階廃止
2024.04
Batch
/v1/batches
NICHE
JSONL を投げて 24h 以内に非同期処理。価格 50% OFF。夜間ジョブ・評価・大規模埋め込みで強い。
2024.10
Realtime
WebSocket · WebRTC
EMERGING
音声を STT を介さず直接 入出力する speech-to-speech。低遅延音声エージェント向け。まだ事例は少ない
2025.03
Responses 新標準
/v1/responses
EMERGING
Chat Completions + Assistants の後継統合state 管理 (previous_response_id) と built-in tools (web_search / file_search / code_interpreter / computer_use) を組み込み済み。
2025.03
Agents SDK
openai-agents (py / ts)
EMERGING
公式エージェントフレームワーク。handoff・guardrail・tracing を提供。Responses API 前提で薄く設計。

含意: 互換エコシステムは Chat Completions に固定 されたまま、OpenAI 自身は Responses + built-in tools + Agents SDK に重心を移している。 他社が追従するかは未定 — Route 2 の射程の外。

// Part 6 補論 · LLM API はどう進化するか — インターネット初期との類比

下層は標準化、上層は差別化 — インターネット初期に近い構造

OpenAI / Anthropic / Google の API は messages・role・tools・streaming・temperature・top_p など基本部分が実質業界標準に寄っている。一方で高度機能は各社かなり独自。

CONVERGING — 共通化した方が得
· OpenAI 互換 API
· Chat Completions 互換
· tool calling
· JSON schema structured output
· embeddings
· MCP (tool 接続規格)
· streaming (SSE)
· messages / role / temperature
DIVERGING — 各社が独自で勝負
· Agent runtime / SDK
· Memory
· Safety / guardrail
· Realtime audio (S2S)
· Multimodal event stream
· Orchestration
· Reasoning token / cache control
· Computer use / background exec
完全統一が起きにくい理由 ― APIが製品競争力そのもの / モデル能力差をAPI機能で埋めたい / lock-in の維持 / 独自最適化
01 — BASE

基本層は収束

HTTP + JSON + streaming + tools は共通化。
SQL / OAuth / OpenTelemetry / Kubernetes CRD のように 「完全同一ではないが概念互換」 に着地。

02 — HIGH

高度機能は分岐

Agent platform / IDE 統合 / enterprise governance / reasoning / workflow で差別化。
クラウドが S3互換・K8s対応しつつ Lambda / BigQuery / Cosmos で独自進化したのと同じ。

03 — MIDDLE

差分吸収層が重要化

LangChain / Vercel AI SDK / LiteLLM / OpenRouter / MCP が間に入る。
enterprise では モデル切替・コスト制御・ベンダ回避・ガバナンス の要請が強く、この流れは加速。

基本 API は収束するが、上位機能はむしろ分化していく。

// Part 6 補論 · なぜサブスク経由でサードパーティエージェントが使えない、制限されるのか

ChatGPT Plus や Claude Pro のサブスクリプションで サードパーティエージェントが使えない、制限される理由

サブスクは 人間がそのUIで使う 前提の定額プラン。サードパーティエージェントから自由に呼ばせると、提供側のビジネスとモデル品質の両方が崩れる。

REASON 01 — INFRA

インフラ負荷が人間の比じゃない

  • ·人間 = 1日数十回 / エージェント = 1タスクで数十〜数百回ループ
  • ·ツール連鎖でトークン消費が指数的に膨らむ
  • ·並列+夜間バッチで GPU占有が定額の100倍 級・採算が合わない
REASON 02 — REVENUE

エージェントのただ乗りを許せない

  • ·API は従量 / サブスクは定額 — 同リソースで収益が桁違い
  • ·サードパーティが Plus キーを束ねればAPI売上を全部食う
  • ·サードパーティが別途課金しているケースは特に問題視
REASON 03 — QUALITY

アウトプット品質の守り方が違う

  • ·LLM側 = system prompt・safety層・refusal を自社UIで担保
  • ·サードパーティ = 速度・自動化を優先 / safetyは後回しになりがち
  • ·事故ったとき「Claudeが言った」と報じられるのはモデル提供側
REASON 04 — STRATEGY

学習データ・競合・利用規約

  • ·サードパーティ経由だとユーザ行動ログが取れず自社改善に使えない
  • ·競合エージェントが自社チャットの代替になるのを助けたくない
  • ·OpenAI / Anthropic ToS で サブスクのリバース利用は明示禁止

結論: 「サブスクは人間用 / API は機械用」と、提供側は入口を分ける戦略で運用している。

// Part 6 補論 · 例外 — 会社間提携で関係を築くパターン

例外: 会社間で金銭契約を結べば、サードパーティでも公式に動く

「サブスクで勝手に叩く」のは禁止だが、提携契約・収益分配・コミット買いを結べば、両者にとって良好な関係になる。

PATTERN A — 戦略出資 / 独占

大規模出資 + 排他クラウド

Microsoft × OpenAI
Azure を独占的計算基盤にし、巨額出資の見返りに収益分配。Copilot は OpenAI モデルを公式に組み込める。
  • +サードパーティ側が公式チャネルでモデルを使える
  • +LLM側は安定収益と計算基盤を確保
PATTERN B — 大型コミット買い

前払い・優先レート枠

Cursor × Anthropic / OpenAI
エージェント側が年単位で大量のトークン枠を前払い購入し、優先レート・割引を得る。利用ログも一部共有。
  • +レート制限を回避し、SLAを保証
  • +LLM側はキャッシュフローとエージェント実装ノウハウを得る
PATTERN C — クラウド再販

ハイパースケーラ経由の正規ルート

AWS Bedrock / Vertex AI / Azure OpenAI
Anthropic / Google / OpenAI が自社モデルをクラウド側に卸す。エージェントはクラウドの請求口で堂々と呼べる。
  • +企業の調達ルートに乗せやすい
  • +クラウド側が課金・コンプラ・SLAを担保
読み方

サブスクの裏口を塞ぐ提携で正面を開ける はワンセット。「Cursor が公式に Sonnet を使えるのは、Anthropic と契約しているから」「Copilot が GPT を呼べるのは Microsoft が出資しているから」 — 技術ではなく契約の話

PART 9 / 10

エンジニアリングの3層

// 3つの独立したcraft

エージェントの品質は、3層から成る

LAYER 1 — PROMPT

プロンプトエンジニアリング

LLMに読ませる文字列の書き方。
system prompt / few-shot / tool description / 出力フォーマット

LAYER 2 — CONTEXT

コンテキストエンジニアリング

contextに何を詰めるか。
履歴圧縮 / 選択的保持 / プロンプトキャッシュ / 外部知識の注入

LAYER 3 — HARNESS

ハーネスエンジニアリング

LLMを包むコード設計。
loop / state store / tool実装 / retry / fallback / ガード

3層は独立だが補完的。どれか1つだけ最適化しても全体は良くならない。

// 各層で何を最適化するか

3層それぞれの最適化ポイント

LAYER 1 — PROMPT

LLMに渡す文字列の質

  • system promptで役割・境界・出力形式を明確に
  • tool descriptionは「いつ使うか」中心に書く
  • few-shot例を1〜2件添える
  • structured outputsでフォーマット強制
  • temperature 0.0〜0.3 で安定化
LAYER 2 — CONTEXT

contextに何を詰める

  • messagesに必要な情報が入っているかを常に確認
  • 履歴は要約圧縮 or 選択的保持(直近K件+pinned)
  • RAG: chunk戦略とtop-kの調整
  • prompt cacheでsystem部分を固定化
  • token数を常に計測する
LAYER 3 — HARNESS

LLMを包むコード設計

  • maxIterationsは必ず設定(コスト暴走防止)
  • retry: 指数バックオフ(429 / 5xx)
  • fallbackモデルを設定しておく
  • tool結果のバリデーション
  • per-turnのtokens / コストを計測
// 3層はLLMを包む入れ子構造

3層はLLMを中心に包む構造になっている

LAYER 3 — HARNESS
loop / retry / maxIterations / fallback / guard / tool実装
LAYER 2 — CONTEXT
messages[] / RAG / prompt cache / 履歴圧縮 / 選択的保持
LAYER 1 — PROMPT
system prompt / tool description / few-shot / 出力フォーマット
LLM API
テキストを受け取り、テキストを返す
L1 Prompt

LLMに読ませる文字列の質
指示が曖昧なら、どんなに良いモデルでも出力はブレる。

L2 Context

contextに何を詰めるか
必要な情報がなければLLMは嘘をつくか「知らない」と返す。

L3 Harness

LLMを包むコード設計
ループ制御・エラー処理・コスト管理はここの責任。

3層は独立だが補完的 — 1つだけ最適化しても全体は良くならない。
不具合時はどの層の問題かを先に切り分ける。

// 非決定論的システムを測るeval · observability

テストが効かないなら、evalobservability で測る

単体テストは「同じ入力 → 同じ出力」が前提。LLM は出力が変わる以上、統計的合格率本番トレースで品質を担保するしかない。

EVAL — 出す前に測る

入力セットを固定して、合格率を見る

golden set 固定の input × 期待 output を集めて、回帰検知。CI に挟む
LLM-as-judge 強いモデルに「合格 / 不合格」を採点させる。高速・安価
pairwise 2 案を比較投票。改善 A/B のランキングに使う
human eval 最終ゲート。ドメイン専門家のサンプリングレビュー

ツール: OpenAI Evals / Anthropic Eval / promptfoo / DeepEval

OBSERVABILITY — 出した後を見る

本番の挙動・コスト・失敗を可視化

trace 1リクエスト内の LLM 呼び出し / tool / retrieval を木構造で記録
metric 成功率・P50/P95 latency・token 消費・コスト/req
prompt version system prompt の改訂と性能変化を紐づけて追跡
replay 失敗トレースを保存し、改良後に再実行して回帰を確認

ツール: Langfuse / LangSmith / Helicone / Arize / OpenTelemetry GenAI

主要指標 ― success rate · tool call accuracy · hallucination rate · P95 latency · avg tokens / req · cost / 1k requests
PART 10 / 10

ローカルで動く AIスタック

LOCAL AI STACK · docker compose で全部立ち上がるp1uscode.com/ai

ローカルで動く AIスタック

AI系

モデルと入口

  • Ollama — ローカルモデルをホスト
  • LiteLLM — OpenAI互換プロキシで全社束ねる
  • Open WebUI — チャットUI
  • agent-demo — LangChain ベースのエージェント実装
基盤

ルーティング

  • Traefik — リバースプロキシ / *.home.arpa
ログ系

中を覗く

  • Langfuse — トレース / コスト / 評価の可視化
  • mitmproxy — 生通信を覗くデバッグプロキシ
+α(発展)

広げる

  • Dify — LLMアプリ開発プラットフォーム
  • n8n — ワークフロー自動化
  • Qdrant — ベクトルDB (RAG学習用)
  • SearXNG — メタ検索エンジン

基礎を押さえた後に追加

LOCAL AI STACK// compose.yml に全部書いてある

基礎を構成する、7つのサービス

サービスURL役割
AIOllamalocalhost:11434ローカルモデルをホスト (ホスト上で稼働)
AILiteLLMlitellm.home.arpaOpenAI互換プロキシ / 各社モデルを束ねる
AIOpen WebUIopen-webui.home.arpaチャットUI / モデル切替で単体の限界を体感
AIagent-demoLangChain エージェント実装サンプル (Node/TS)
基盤Traefiktraefik.home.arpaリバースプロキシ / 全サービスの前段
ログLangfuselangfuse.home.arpaトレース / コスト / レイテンシ / 評価の可視化
ログmitmproxymitmproxy.home.arpaLiteLLMのアウトバウンドを覗くデバッグプロキシ
LOCAL AI STACK// +α — 基礎を押さえた後に追加

発展:+α のサービス

サービスURL役割
Difydify.home.arpaLLMアプリ開発プラットフォーム (GUI)
n8nn8n.home.arpaワークフロー自動化 / AI Agent ノード
Qdrantqdrant.home.arpaベクトルDB — RAG の retrieval を手で組む学習用
SearXNGsearxng.home.arpa70+エンジンのメタ検索 — agent-demoが叩く
LOCAL AI STACK// ドキュメント

ドキュメント

🌐 p1uscode.com/ai
01 SETUP

セットアップ

設定してツールを起動する。

02 HANDS-ON

ハンズオン

画面を触って動作を観察する。
セットアップ完了が前提。

03 THEORY

座学

仕組みと原理の独立資料。

ありがとうございました

LLM、AIエージェントの仕組みを理解する
p1us2er0 | 2026 / 06 | p1uscode.com/ai