AIエージェントは、
かなり単純な部品の組み合わせでできている。
— 仕組みがわかれば、
AIプロダクトの見方が変わる。
今何時か。今日の天気は。
| # | 質問 | LLM単体で? |
|---|---|---|
| Q1 | 今の日時は? | ✗ わからない |
| Q2 | 今日の東京の天気は? | ✗ わからない |
| Q3 | gitリポジトリのファイルは? | ✗ わからない |
| Q4 | 現在の政策金利は? | △ 学習カットオフ次第 |
| Q5 | 3847 × 2915 は? | △ 解けるが、非効率 |
| Q6 | 富士山の高さは? | ◯ わかる |
LLM単体でできるのは
「学習時の事実」+「言語運用」だけ。
今この瞬間の情報 / ローカル環境の中身 / 速度・コスト・確実性が要る計算
— これらは別の仕組みで補うしかない。
LLM は「次にもっともらしいトークン」を確率で埋めていく機械。「知らない」と返す機構を持っていない ―― なので堂々と嘘をつく。検索エンジンや DB との一番大きな違い。
「感情っぽく」振る舞うことは可能。
大量の人間の会話から「この場面ではこう返す」というパターンを学習している結果。
人間の感情に伴うものを、LLM は持っていない。
多くの研究者の見方は「感情をシミュレートしているだけ」。
十分複雑な情報処理に意識は生まれるのか / 感情は機能で定義できるのか / 人間の感情も情報処理ではないか — Cognitive Science や Philosophy of Mind では未解決。
現状の整理: 「感情表現」はできる、「感情体験」がある証拠はない、「感情とは何か」自体は未解決。
※ デモではAPIトークン(課金設定)が無くても手軽に試せるよう、無料枠で動く gemini-2.5-flash を採用(OpenAI互換APIで叩きやすい)。トークンを設定して最新モデルを使う場合は gemini-3.1-flash-preview などに差し替える。
{
"model": "gemini-3.1-flash-preview",
"messages": [
{ "role": "system", "content": "あなたは親切な日本語アシスタントです。" },
{ "role": "user", "content": "富士山の高さは?" }
]
}
model — どのモデルに解かせるか
messages — 会話履歴。配列の順序が会話の順序を表す
| role | 誰の発言か | 典型的な中身 |
|---|---|---|
| system | エージェント (ユーザが書く場合も) | 振る舞い指示 / 制約 / 例示 // 先頭に1つ |
| user | ユーザ (エージェントが補強情報を足す場合も) | 実際の質問 / 依頼 |
| assistant | LLM自身の過去の発言 | 応答テキスト / または tool_calls |
| tool | ツール実行の結果 | tool_call_id で紐付ける |
⚠ systemもuserも、LLMから見ればどちらもただの入力文字列。
systemは優先されるよう設計されているが、LLMはテキストを厳密に区別できないため、外部入力を指示として誤解し、結果的にsystemの意図が破られることがある (prompt injection)。
{
"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
}
}
LLMの応答そのもの。
role="assistant"固定。
なぜ生成が止まったか。
stop / length / tool_calls / content_filter
このリクエストで
消費したトークン数 = 課金対象
完了を待たず、生成途中の delta を Server-Sent Events で受け取る。実プロダクトではほぼ必須。
POST /v1/chat/completions { "model": "gpt-5.5", "stream": true, // ← これだけ "messages": [...] }
data: {"delta":{"content":"日"}} data: {"delta":{"content":"本"}} data: {"delta":{"content":"の"}} data: {"delta":{"content":"首都"}} data: {"delta":{"content":"は"}} ... data: {"finish_reason":"stop"} data: [DONE]
補足: 中身は 通常応答と等価 ―― 全 delta を結合すれば普通の choices[0].message が再構築できる。
LLM側に残るのは「受け取った文字列」と「学習済みの重み」だけ — セッションも履歴もサーバには無い。
CPU / GPU は決定論的なのに、その上で softmax → sampling → temperature を通すことで、わざと非決定論的に振る舞わせている。テスト・再現・検証の設計が根本から変わる。
| 観点 | 従来ソフトウェア | LLM |
|---|---|---|
| INPUT → OUTPUT | 同じ入力 → 必ず同じ出力 | 同じ入力 → 毎回変わりうる |
| 制御フロー | if / switch / loop で人間が書く | 確率分布から sampling |
| テスト | 単体テスト / アサーション | 評価 (eval) / 統計的合格率 |
| 再現性 | 完全再現可能 | 完全再現は困難 (seed 固定でも保証されないことが多い) |
| バグの形 | 必ず再現する / スタックトレース | 時々起きる / 失敗例を集めるしかない |
| 最適化 | 計算量 / メモリ | プロンプト / コンテキスト / モデル選択 |
含意: LLM は 確定的なハードウェアの上に乗った非決定論的レイヤ。 既存のテスト・モニタリング・SLO の前提が崩れるので、エージェント設計では retry / fallback / eval / guardrail が必須になる。
if-then・論理・探索を人間が書く。知能 = 記号操作。
専門家知識の大量ルール化 → 知識獲得の限界 → SVM・決定木・ベイズへ。「特徴量は人間が設計する」。
AlexNet(2012)が転換点。特徴量設計をNNが吸収、end-to-end学習。「表現学習」の時代。
Attention Is All You Need(2017)。大規模事前学習・スケーリング則で「単一タスク → 汎用基盤モデル」へ。
ChatGPT(2022)。RLHF + instruction tuningで「人間と対話できるLLM」に。ただしツールなし。
LLMが外界を読む段階。知識の外部化とcontext engineeringが急速に発展。
LLM + Tools + State + Memory + Planning + Loop。ワークフローエンジンの上にLLMが載る構造。
| 時代 | 人間が書くもの | 機械が獲得するもの |
|---|---|---|
| ルールベースAI | ルール | 推論の実行 |
| 統計的ML | 特徴量 | 重みの学習 |
| ディープラーニング | アーキテクチャ | 特徴量 + 重み |
| LLM | 目的・文脈 (prompt) | 言語運用 + 推論 |
| エージェント | 制約・環境 (tools, guardrails) | 計画 + 実行 + 判断 |
AIに任せられる範囲は広がり続けている — だからこそ、人間の設計はより重要になる。
抽象度が上がるほど、目的・制約・環境の設計が成果を左右する。今のエージェントも「完全自律」ではなく、ワークフローエンジン + LLM という構造。
# 人間がルールを書く if fever and cough: diagnosis = "flu" elif fever and rash: diagnosis = "measles" else: diagnosis = "unknown"
人間が全分岐を網羅する
# 人間が特徴量を設計する 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),
])
人間が構造を決める、特徴量は自動
# 人間が目的と文脈を書く 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が担う
LLMが担うのは「人間の言葉を扱う」部分だけ。
残りの確定的な処理は、普通のソフトウェアエンジニアリング。
エージェント開発 = AI開発ではない。大部分は従来のソフトウェア工学の延長。
LLMは知らないことになる
LLMは忘れる
LLMは事実だと思って喋る
他に隠されたstateは (基本的には) ない。LLM側は毎回はじめまして状態。
// ② turn 2 リクエスト [ { "role": "system", "content": "..." }, { "role": "user", "content": "じゃあ世界で何番目?" } ]
// ② turn 2 レスポンス { "message": { "role": "assistant", "content": "何のことですか?" // ← 文脈を失う } }
LLMは「富士山」を知らない状態で返答。
// ② 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側はステートレス → クライアントが過去の全メッセージを毎ターン再送。配列は毎ターン育ち続ける。
| L | 層 | 実体 | 寿命 | 記憶として機能? |
|---|---|---|---|---|
| L1 | パラメータに焼き込まれた知識 | 学習時の重み | モデル版固定 | ○ 暗黙的 |
| L2 | プロンプトキャッシュ | 同じprefixの再計算を省略 / 課金割引 | TTL (数分〜1h) | ✕ あくまで最適化 |
| L3 | messagesへの注入 (=state) | 1リクエストで送る全メッセージ | 1リクエスト | ○ 明示的 |
| L4 | mdファイル | エージェントが必要に応じて読み込む | 永続 | ○ 静的 → L3経由 |
| L5 | 外部ストレージ (RDB / KVS / Vector DB) | 検索して必要分だけ注入 | 永続 | ○ 動的 → L3経由 |
プロンプトキャッシュはコスト削減・高速化のための仕組みであり、ステートフルではない。prefixが一致する範囲だけ計算をスキップする。LLMが「覚えている」わけではない。
学習時に焼き込まれていない情報 (社内ドキュメント / 最新ニュース / プロダクト固有) を、埋め込みベクトルの近傍検索で取り出し、prompt に挿し込む。L4 メモリ層の中核。
「就業規則の有給は?」
embedding model
→ [0.12, -0.43, ...]
vector DB で
top-k chunk を取得
取得した chunk を
system / user に貼る
根拠を持って答える
(出典つき)
位置づけ: RAG は tool calling の特殊形 — エージェント側が決め打ちで毎ターン検索ツールを叩く agent-driven パターンの典型例。
context window が 200k → 1M+ に拡張し、推論能力とtool callingが成熟したことで、「事前に chunk を取って貼る」以外の戦略が次々と現実的になっている。
chunk 化せず 対象を丸ごと context へ。retrieval ロスが消える代わりにコスト・latency が線形に増える。
事前 embedding 不要。LLM が grep / glob / read_file をループで叩いて必要な部分だけ取得。
知識を Markdown + script のスキル束に固める。必要な時だけ on-demand に読む。
エンティティと関係を知識グラフとして保持。横断的な問いに強い。前処理コストは高い。
OS の virtual memory のように、エージェントが自分の記憶を要約・退避・再ロード。長期会話・個人最適化向け。
参照したい知識を全部 prompt cache に乗せて、毎リクエスト 0.1× で再利用。検索が要らない。
ドメイン知識・スタイルを LoRA / SFT で重みに学習。retrieval 不要だが、更新が重く鮮度を失う。
Skills + agentic retrieval + 一部 RAG + cache のハイブリッドが現実解。単一戦略で勝つことは少ない。
含意: RAG は出発点であって最終形ではない。 LLM の能力が上がるたびに、「事前に貼る」から「能動的に取りに行く」「手順書として持つ」へと、知識の与え方そのものが変わり続けている。
"Hello, world!" │ ▼ BPE tokenizer (cl100k_base) │ [ "Hello", ",", " world", "!" ] ← 4 tokens
同じ情報量で、日本語は英語より 1.3〜2倍、
場合によって3倍近くトークンを食う
1トークン ≈ 英語3〜4文字 / 日本語1〜2文字 / コード3〜5文字。
Gemini系は比較的効率的、OpenAI系はやや大食い、Anthropicは中間。
⚠ コンテキストウィンドウを超えたときに起きること:
入力トークン数 × 単価で線形に増える。長コンテキスト階層課金もある。
長いほど生成開始も終了も遅い。UXに直結する。
長大なcontextで途中の情報を見落とすlost in the middle。
だから実務は「ウィンドウは大きいが、送る量は必要最小限」。
送ったトークンと返ってきたトークンの両方に課金。さらに cache / batch / reasoning で単価が変わる。エージェントは長文 + ツール連鎖でトークンが膨らむため、構造を理解しないとコストが暴走する。
| 区分 | 単価の目安 | 説明 |
|---|---|---|
| input (送信) | 1× | 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 系は 内部推論トークン にも課金 ―― 見えないが消費される |
原則: 「ウィンドウは大きいが、送る量は必要最小限」 ―― 自由に詰めると毎回がスポット契約になる。
{
"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は description と parameters の両方を読むが、
型バリデーションではなく確率的に解釈する — 説明文が曖昧だと引数もズレる。
// → リクエスト: 「今何時?」 { "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" }
// → リクエスト: 履歴 + ツール結果を再送 { "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はdescriptionを読んで「いつ・どのツールを呼ぶか」を決める。曖昧だと使うべき場面で使わず、具体的なら的確に選べる。
enum / required / min / max — JSON Schemaで縛るほど、LLMが不正な引数を送る確率が下がる。
ツールが嘘を返せばLLMは嘘を真実として喋る。正常系だけでなくエラー処理も道具の品質。
ツールはLLMの手足 — 単体では「知っていること」しか語れないLLMに、外の世界に触れる力を与える拡張レイヤ。
「高機能そうに見える」ものほど、実はプリミティブ数個の組み合わせで成立している。
ファイル読み書きもgrepもshell経由 (cat / rg / sed)。Unixパイプを信頼する設計。
差を生むのはツールの数ではなく、プロンプト設計 × モデルの賢さ × ループの回し方。
shell 1本あれば、cat も rg も git も curl も python も全部使える — プリミティブで十分。
Claude Code / Codex は「汎用」なので抽象度の高いプリミティブを選んでいる。専門エージェントなら話が別。
何でも屋 / タスクの幅が事前に決まらない
プリミティブを少数、組み合わせで何でもこなす。
設計判断は「LLMにやらせる」。ツールは道具であってワークフローではない。
例: Claude Code / Codex CLI / Cursor
業務・ドメインが固定 / 安全性や再現性が必要
ツール名と引数が業務語彙そのまま。
正解パスが決まっていて、「LLMに自由に考えさせない」ことが品質になる。
例: カスタマーサポート / 経理 / 医療 / 社内SaaS連携
具体すぎると — ツールが爆発、新ケースで全部作り直し、LLMの選択肢で迷う。
抽象すぎると — 業務ドメインで事故る、権限境界が曖昧、監査できない。
正解は「業務の不変な動詞を特定して、そこだけ専用ツール化」。残りは汎用プリミティブに任せる。
Anthropic が提唱、JSON-RPC ベースのオープン仕様。「AI のための USB-C」 — ホスト(Claude Desktop / IDE / Agent) が、多様なサーバを同じ口で差し込める。
JSON Schema 引数。create_issue, run_sql, send_email など。
URI で指す(file://, git://, db://…)。LLM のコンテキストに添える。
「コードレビュー」「PR 要約」などをサーバ側で名前付き定義。
サーバが独自に LLM を持たず、ホストの LLM を借りる仕組み。
結果: AI ホストごとに独自プラグイン API を作る必要がなくなる。同じ MCP サーバを Claude / Cursor / Cline / 自作 Agent で使い回せる。
実務的には: 「手元の開発はローカル MCP を積極的に、本番エージェントでは認可境界とコンテキスト圧迫を見て厳選」。
いま「Agent」は曖昧に使われている。自律的にツールを選択・実行し、状態を持ちながら目的を達成するシステム ―― ここを軸に近傍と比べる。
入力→生成→返答。ツール無し / 状態は会話履歴のみ。ループしない。
※ 最近の ChatGPT / Claude.ai は web 検索・code interpreter・MCP を統合し、エージェント化が進行中 ―― 境界は溶けつつある。
人間がDAGを設計。LLM は各ノードのテキスト処理係。経路はLLMが決めない。
LLMがツール選択 / 順序 / 終了条件を判断。ループ + 状態 + 道具箱。
人間が主体で承認しながら進める形。Agent と地続きで境界は曖昧。
いかに
完成された体験として
提供するか。
UI/UX を磨き、エラーや試行錯誤を隠し、
ユーザに魔法のように見せることが価値。
いかに
仕組みを理解して
使いこなすか。
中身は messages・tools・loop。
分かれば、限界も強みも、設計判断もつく。
「LLMに聞く → ツールを叩く → 結果をmessagesに積む」を繰り返し、人へ回答か追加質問を返す。ユーザの返答でまたループが続く。
| 登場人物 | 何をする | 責任範囲 |
|---|---|---|
| 人 | 要求を入力し、最終応答を受け取る | 問いの起点 / 最終の受け手 |
| エージェント | 問いかけ → ツール実行 → 再問いかけ のオーケストレーション | ループ制御 / state保持 / ツール呼び出し |
| LLM | 次に何を言うか / どのツールを呼ぶかを判断する | 判断だけ。外部システムには触れない |
| ツール | LLMが持っていない情報・能力を提供する | search / now / calc / file / … |
| プレイブック | 振る舞いの方針・手順を事前に与える | AGENTS.md / CLAUDE.md / skills / rules |
| メモリ | 過去のやり取りや状態を保持・参照する | messages履歴 / session / KVS / 好み |
| ガード | 安全性 / 整合性 / 認可の担保 | 入力検査 / 権限 / レート / 出力フィルタ |
| 質問のタイプ | LLM呼び出し | 内訳 (各呼び出し: リクエストの最終message → レスポンス) |
|---|---|---|
| シンプルなQ&A | 1 回 | ① 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回 呼ばれる。
// 擬似コード 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]
// 初期状態 [ 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ターン。コストは積算。
01・02はLLMが返すfinish_reasonで判断。03〜05はエージェント側の判断。
LLMがtool_callsで
「これを呼びたい」と返す
response = LLM.invoke(messages, tools) if response.tool_calls: result = execute(response.tool_calls) messages.push(tool_result) // → もう一度LLMに聞く
LLMがいつ・何を呼ぶか判断
柔軟だがAPI往復が増える
エージェントのコードが
LLMを介さず直接呼ぶ
// LLMの判断なしで毎回実行 context = search_db(user_query) messages.push({ role: "system", content: context }) response = LLM.invoke(messages)
エージェントが確定的に実行
速い・安い・確実。RAGが典型
LLMがプログラムを書いて
複数ツールをまとめて呼ぶ
// LLMがコードを生成 program = LLM.generate_code( messages, tools) // エージェントがまとめて実行 result = sandbox.exec(program)
LLMが実行計画をコードで書く
往復1回で複数ツール連鎖 →
実際のエージェントは組み合わせて使う。状況判断はLLM-driven、確実な前処理はagent-driven、複雑な連鎖はprogrammatic。
// 往復 ① user → assistant(tool_calls: now) // 往復 ② tool(時刻) → assistant(tool_calls: calc) // 往復 ③ tool(計算結果) → assistant(tool_calls: format) // 往復 ④ tool(整形済) → assistant(最終応答) → LLM API 4回呼び出し
// LLMが生成するプログラム: time = call(now) result = call(calc, { expr: time.min * 15 }) output = call(format, { value: result }) return output → LLM API 1回 + sandbox実行 1回
Anthropicのtool_use with code execution、OpenAIのCode Interpreterなどがこのパターン。
LLM自身は、外部システムに一切触れない。
Webを見ない、ファイルを読まない、計算もしない。JSONで「呼んでほしい」と意思表示するだけ。
tool_calls は LLM の出力であって命令ではない。エージェント側でいくらでも介入できる。
ここまでの7パートで基礎を押さえた。しかしエージェント技術は過渡期にあり、各要素が独立に急速進化している。
今日の講義では全てをカバーできないが、主要な進化軸を俯瞰しておく。
GPT-3.5 → 4 → 4o → o1 / Claude 3 → 3.5 → 4 — モデルが賢くなるだけでエージェント全体の品質が上がる。推論能力、コンテキスト長、マルチモーダル対応が急速に進化。
function calling → parallel tool use → MCP(Model Context Protocol) — ツール定義と接続が標準化され、エージェントが使える道具の幅が爆発的に拡大。
RAG(検索拡張生成)でLLMに外部知識を注入。コンテキスト圧縮・要約でウィンドウを有効活用。prompt cacheでコスト削減。
単純なsystem prompt → スキル定義、.mdルールファイル、few-shot、structured outputs — 「LLMへの指示」自体がソフトウェアエンジニアリングに。
LLM-driven → agent-driven → programmatic → マルチエージェント — 単一ループから、複数エージェントの協調・委譲へ。
content filter → moderation API → 入出力ガードレール → human-in-the-loop — エージェントが自律的になるほど制御設計が重要に。
今日はこれらの基盤となる仕組みを理解することがゴール。各要素の最新動向は、この土台の上に積み上がる。
エージェントは道具。どれだけ賢くても、使い方を間違えれば壊れる。人間の役割は「指示を出して待つ」だけではない。
曖昧な指示 → 曖昧な出力。「いい感じに」では動かない。
目的・制約・期待する出力形式を明示する。プロンプトは仕様書。
LLMは自信満々に嘘をつく。コードも文章も「正しそうに見える」が保証はない。
人間のレビューが最終品質ゲートになる。
LLMはあなたの状況を知らない。社内ルール、過去の経緯、ドメイン知識 —
足りない文脈は人間が補う。渡さなければ「知らない」のと同じ。
何をさせて、何をさせないか。ファイル削除、外部通信、課金 —
エージェントの行動範囲を制限するのは人間の責任。
「違う」「こっちの方向」「もっと具体的に」 — 対話の中で軌道修正する。
エージェントは1発で正解を出す魔法ではなく、対話で磨く道具。
「AIにやらせれば全部解決」は幻想。得意な仕事と苦手な仕事がある。
人間がやるべきことと、エージェントに任せることを分ける判断も人間の仕事。
「プロンプトを書く」から「エージェントを設計・構築する」へ。
「AIに聞く」から「AIに任せる」へ。
公開形態 / 提供形態 / 性能帯 / モーダル / マシンスペック / セキュリティ — 6 軸でモデルの性格を見る
重み非公開。API経由でのみ利用。
モデル内部はブラックボックス。
重み公開 (open-weight)。
自前でホスト・ファインチューン可能。
API経由で利用。従量課金。
データは外部に送信される。
手元のPC/サーバで実行。
LLMの処理はローカル。ツール経由で外部通信する場合はある。
カテゴリは排他ではない。1つのモデルが複数に該当する(例: DeepSeek V4 = オープン + クラウド + フロンティア)。
能力の最前線を走る最先端モデル。クローズド/オープン両方に存在。
各社の看板となる主力モデル。フロンティア級を実用バランスで提供。
小型で高速・低コスト。エッジ/モバイルでも動く。
コーディングなど特定ドメインに最適化。
テキスト入出力のみ。最も基本的な形態。
テキスト+画像+動画を入力可能。出力はテキスト。
テキスト・画像・音声・動画の入出力すべてをネイティブ処理。
画像・動画・音声の生成に特化。LLMとは別系統。
カテゴリは排他ではない。1つのモデルが複数に該当する。
OpenAIの最高性能モデル。テキスト・画像・音声・動画の入出力すべてをネイティブ処理。API経由でのみ利用可能。
オープンウェイトかつフロンティア級。API経由でもローカルでも利用可能。クローズドとの差を急速に縮めている代表例。
0.8Bパラメータの超軽量モデル。ノートPCのCPUでも動作。オフラインで使えるため、プライバシー重視のユースケースに。
モデルの重みをメモリ(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枚 個人利用は非現実的 |
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 + ネット遮断、が最も閉じた構成。
誰が LLM を作り、誰がエージェントを作るのか — 4 カテゴリ × Big-3 のレイヤ構造
ほぼ全員が「LLM + エージェント」の今、競争軸は モデル主導 vs エージェント主導 / ファースト vs サード の2軸。境界は流動的(② が自社LLM強化 / ③ が独自モデル投入 など)。
前ページの 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 |
| 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社とも全レイヤを揃えている。「どのレイヤの話か」を明示しないと議論がねじれる。
3rd-party エージェントが他社 LLM を呼ぶ 3 つの経路、そして OpenAI 自身の API 遍歴・収束と分化
エージェントとLLMの提供元が同じか違うかで挙動が変わる。固有名詞は前ページの整理に従う。
LLM提供会社が出す純正エージェント — 自社モデル専用。
エージェント会社が他社LLMを呼ぶ — モデル選択が前提。
3rd-partyエージェントがどうやって違うプロバイダのLLMを呼ぶのか — 答えは3経路。次から1つずつ見る。
各社が本来提供するネイティブ形式。エージェントがプロバイダごとに分岐コードを持つ。
POST /v1/chat/completions
POST /v1/messages — system別フィールド / contentが配列
POST ...models/<m>:generateContent — role=user/model
各社が「OpenAI形式でも受ける」別口エンドポイントを用意している。baseURLとmodel名だけ差し替えで全社呼べる。
api.anthropic.com/v1/openai/chat/completions (beta)
generativelanguage.googleapis.com/v1beta/openai
localhost:11434/v1/chat/completions — ローカルも同じ形
ChatGPT普及でOpenAI形式が事実上の標準になり、新規モデル投入の必須条件に近くなった。
エージェントと各LLMのあいだに翻訳プロキシを挟む。エージェントはプロキシ1つだけ相手にする。
統一OpenAI形式 / 数百モデルを同じキーで
Together / Fireworks / Groq / DeepInfra
LiteLLM / Helicone / Portkey — 社内ゲートウェイ
どれが正解ではなく併用が現実 — 同じエージェントでも、モデルごとに Route 1 / 2 / 3 が混在する。
「OpenAI形式 = Chat Completions」が業界標準として固定化される一方、OpenAI 自身は次のAPI形態へ移り始めている。後発のものほどまだ普及途上。
含意: 互換エコシステムは Chat Completions に固定 されたまま、OpenAI 自身は Responses + built-in tools + Agents SDK に重心を移している。 他社が追従するかは未定 — Route 2 の射程の外。
OpenAI / Anthropic / Google の API は messages・role・tools・streaming・temperature・top_p など基本部分が実質業界標準に寄っている。一方で高度機能は各社かなり独自。
HTTP + JSON + streaming + tools は共通化。
SQL / OAuth / OpenTelemetry / Kubernetes CRD のように 「完全同一ではないが概念互換」 に着地。
Agent platform / IDE 統合 / enterprise governance / reasoning / workflow で差別化。
クラウドが S3互換・K8s対応しつつ Lambda / BigQuery / Cosmos で独自進化したのと同じ。
LangChain / Vercel AI SDK / LiteLLM / OpenRouter / MCP が間に入る。
enterprise では モデル切替・コスト制御・ベンダ回避・ガバナンス の要請が強く、この流れは加速。
基本 API は収束するが、上位機能はむしろ分化していく。
サブスクは 人間がそのUIで使う 前提の定額プラン。サードパーティエージェントから自由に呼ばせると、提供側のビジネスとモデル品質の両方が崩れる。
結論: 「サブスクは人間用 / API は機械用」と、提供側は入口を分ける戦略で運用している。
「サブスクで勝手に叩く」のは禁止だが、提携契約・収益分配・コミット買いを結べば、両者にとって良好な関係になる。
サブスクの裏口を塞ぐ ↔ 提携で正面を開ける はワンセット。「Cursor が公式に Sonnet を使えるのは、Anthropic と契約しているから」「Copilot が GPT を呼べるのは Microsoft が出資しているから」 — 技術ではなく契約の話。
LLMに読ませる文字列の書き方。
system prompt / few-shot / tool description / 出力フォーマット
contextに何を詰めるか。
履歴圧縮 / 選択的保持 / プロンプトキャッシュ / 外部知識の注入
LLMを包むコード設計。
loop / state store / tool実装 / retry / fallback / ガード
3層は独立だが補完的。どれか1つだけ最適化しても全体は良くならない。
LLMに読ませる文字列の質。
指示が曖昧なら、どんなに良いモデルでも出力はブレる。
contextに何を詰めるか。
必要な情報がなければLLMは嘘をつくか「知らない」と返す。
LLMを包むコード設計。
ループ制御・エラー処理・コスト管理はここの責任。
3層は独立だが補完的 — 1つだけ最適化しても全体は良くならない。
不具合時はどの層の問題かを先に切り分ける。
単体テストは「同じ入力 → 同じ出力」が前提。LLM は出力が変わる以上、統計的合格率と本番トレースで品質を担保するしかない。
| golden set | 固定の input × 期待 output を集めて、回帰検知。CI に挟む |
| LLM-as-judge | 強いモデルに「合格 / 不合格」を採点させる。高速・安価 |
| pairwise | 2 案を比較投票。改善 A/B のランキングに使う |
| human eval | 最終ゲート。ドメイン専門家のサンプリングレビュー |
ツール: OpenAI Evals / Anthropic Eval / promptfoo / DeepEval
| trace | 1リクエスト内の LLM 呼び出し / tool / retrieval を木構造で記録 |
| metric | 成功率・P50/P95 latency・token 消費・コスト/req |
| prompt version | system prompt の改訂と性能変化を紐づけて追跡 |
| replay | 失敗トレースを保存し、改良後に再実行して回帰を確認 |
ツール: Langfuse / LangSmith / Helicone / Arize / OpenTelemetry GenAI
基礎を押さえた後に追加
| サービス | URL | 役割 | |
|---|---|---|---|
| AI | Ollama | localhost:11434 | ローカルモデルをホスト (ホスト上で稼働) |
| AI | LiteLLM | litellm.home.arpa | OpenAI互換プロキシ / 各社モデルを束ねる |
| AI | Open WebUI | open-webui.home.arpa | チャットUI / モデル切替で単体の限界を体感 |
| AI | agent-demo | LangChain エージェント実装サンプル (Node/TS) | |
| 基盤 | Traefik | traefik.home.arpa | リバースプロキシ / 全サービスの前段 |
| ログ | Langfuse | langfuse.home.arpa | トレース / コスト / レイテンシ / 評価の可視化 |
| ログ | mitmproxy | mitmproxy.home.arpa | LiteLLMのアウトバウンドを覗くデバッグプロキシ |
| サービス | URL | 役割 |
|---|---|---|
| Dify | dify.home.arpa | LLMアプリ開発プラットフォーム (GUI) |
| n8n | n8n.home.arpa | ワークフロー自動化 / AI Agent ノード |
| Qdrant | qdrant.home.arpa | ベクトルDB — RAG の retrieval を手で組む学習用 |
| SearXNG | searxng.home.arpa | 70+エンジンのメタ検索 — agent-demoが叩く |
設定してツールを起動する。
画面を触って動作を観察する。
セットアップ完了が前提。
仕組みと原理の独立資料。