AI: 生成 AI と大規模モデル
最終更新:2026-08-26
生成 AI は現在最も熱い技術トレンドです。ChatGPT、Midjourney、GitHub Copilot はすべてこの分野の産物です。この章では以下を理解します。生成 AI とは何か?大規模言語モデル(LLM)はどう動くのか?トークン・コンテキストウィンドウ・温度パラメータとは?Python をわずか 5 行書くだけで LLM API を呼び出せるようになるには?
1. 学べること
- 生成 AI と判別 AI の違い
- 大規模言語モデル(LLM)の仕組み
- トークンとコンテキストウィンドウ
- GPT / Claude / Llama モデルファミリー概観
- Python で LLM API を呼び出す方法
2. ストーリー:5 行のコードで作る AI アシスタント
(1) 痛みの種:カスタマーサポートの知能化
Alice は EC 企業のバックエンド開発者です。上司から、よくあるユーザーの質問に自動で答える AI アシスタントをカスタマーサポートに追加するよう頼まれました。Alice は GPT や ChatGPT の噂は聞いていますが使い方が分かりません。「あれってアルゴリズム専門家の仕事じゃないの?CRUD ばかり書いてる私に本当にできるの?」
(2) Bob の 5 行ソリューション
Bob はキーボードを引き寄せ、5 分で 5 行の Python コードを書き、OpenAI API を動かしました。
from openai import OpenAI
client = OpenAI(api_key="your-api-key")
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "How to return a product?"}]
)
print(response.choices[0].message.content)
Bob は言いました。「見てよ、大規模言語モデルなんてただの超強力なテキスト生成器さ。プロンプトを渡せば答えが返ってくる。REST API を呼ぶのと同じことだよ。」
▶ サンプル: 5 行のコードで OpenAI API に接続(難易度:⭐)
# OpenAI API の最小呼び出し
from openai import OpenAI
client = OpenAI() # 環境変数 OPENAI_API_KEY を使用
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Say hello in 3 languages."}]
)
print(response.choices[0].message.content)
Hello! / ¡Hola! / Hello!
(3) 得られるもの:API 思考で壁を突破
Alice は気づきました。LLM を呼ぶのに Transformer の数式的な導出を理解する必要はない。データベースを呼ぶのに B+ 木の仕組みを理解する必要がないのと同じです。原理を知っていればより良い選択ができますが、始めるために必要なのは API だけです。
3. AI と生成 AI を見分ける
(1) 2 つの AI パラダイム
AI モデルは出力の目的によって大きく 2 つのパラダイムに分類されます。
| 次元 | 判別 AI | 生成 AI |
|---|---|---|
| 目的 | 既存データの分類 | 新しいデータの生成 |
| 学習内容 | 決定境界(分類線) | データ分布(どう生成するか) |
| 入力 → 出力 | 特徴 → クラス/値 | プロンプト → 新しいテキスト/画像/コード |
| 典型タスク | 分類、回帰、検出 | テキスト生成、画像生成、コード生成 |
| 代表モデル | ResNet、SVM、BERT(エンコーダ) | GPT、Stable Diffusion、Midjourney |
| 典型アプリ | スパムフィルタ、顔認識 | ChatGPT、AI 生成アート、コード補完 |
| 出力の決定性 | 決定的(同じ入力なら同じ出力) | 確率的(同じプロンプトでも出力が異なる) |
直感的な理解:判別 AI は「これは何か?」に答え、生成 AI は「1 つ作って」に答えます。
(2) なぜ生成 AI はこれほど人気なのか?
生成 AI は 2022–2023 年に爆発的に広がりました。3 つの理由があります。
- Transformer アーキテクチャ(2017)により、モデルが長文を処理できるようになった
- 大量データ + 高い計算能力により、モデル規模が数億から数千億へと飛躍した
- RLHF(人間フィードバックによる強化学習)により、モデルの出力が人間の好みに沿うよう調整された
(3) 判別と生成は組み合わせられるか?
はい。現代の AI アプリは両者を組み合わせることがよくあります。まず判別モデルで意図分類を行い、次に生成モデルで回答を生成します。ChatGPT の「関数呼び出し(function call)」機能は本質的に、判別(どの関数を呼ぶかの判定)と生成(関数の引数と自然言語の回答の生成)の組み合わせです。
4. 大規模言語モデル(LLM)の仕組み
(1) 中核メカニズム:次のトークンを予測する
LLM の本質は極めて単純です。与えられた前置きのテキストから、最もありそうな次のトークンを予測する。この予測を繰り返すことで、完全な回答が生成されます。
入力: "The cat sat on the"
手順 1: "The cat sat on the" → "mat" を予測(最もありそうな次トークン)
手順 2: "The cat sat on the mat" → "." を予測
手順 3: "The cat sat on the mat." → "<END>" を予測
出力: "The cat sat on the mat."
これはテキストを「理解」しているのではなく、巨大なコーパス内でのトークンの出現パターンを統計的に学習しています。しかし学習データが十分に大きい(インターネット規模)ため、その統計的パターンは驚くべき「知性」を示します。
(2) LLM の生成プロセス
graph LR
A[プロンプト<br/>入力テキスト] --> B[トークナイザ<br/>トークン化]
B --> C[Transformer<br/>モデル推論]
C --> D[次トークン<br/>確率分布]
D --> E[サンプリング<br/>温度/Top-P]
E --> F[復号<br/>テキストへ]
F --> G{完了?}
G -->|No| C
G -->|Yes| H[出力<br/>全文]
(3) Transformer アーキテクチャの直感
Transformer は大規模言語モデルのコアエンジンであり、2017 年に Google が論文「Attention Is All You Need」で提案しました。その重要な革新は自己注意機構(self-attention)です。これにより、各トークンを処理する際に入力内の他のすべてのトークンを「見て」、その関連性を計算できます。
| 構成要素 | 機能 | 直感 |
|---|---|---|
| 自己注意(Self-Attention) | トークン間の相関を計算 | 読みながら自動的に重要情報に注目 |
| フィードフォワード | 各トークンに非線形変換を適用 | 情報を理解・処理 |
| 層正規化(Layer Norm) | 学習を安定化 | 値を安定させる |
| 位置エンコーディング | 位置情報を付与 | 語順を理解(「猫が魚を食べる」≠「魚が猫を食べる」) |
5. トークンとコンテキストウィンドウ
(1) トークンとは?
トークンは LLM が処理する最小のテキスト単位です。文字でも単語でもなく、その中間にある「サブワード」です。
テキスト: "Hello, world!"
トークン: ["Hello", ",", " world", "!"] → 4 トークン
テキスト: "artificial intelligence"
トークン: ["art", "ific", "ial"] → 3 トークン(サブワード分割)
英語:平均して 1 トークン ≈ 4 文字(約 0.75 語)。中国語:平均して 1 トークン ≈ 1〜2 文字で、中国語のトークン消費量は英語の約 2〜3 倍になります。
▶ サンプル: tiktoken でトークン数を計算(難易度:⭐)
# tiktoken でトークン数を計算
import tiktoken
encoding = tiktoken.encoding_for_model("gpt-4o-mini")
texts = [
"Hello, world!",
"The quick brown fox jumps over the lazy dog.",
"Artificial intelligence is changing the world.",
"Generative AI is transforming the world."
]
for text in texts:
tokens = encoding.encode(text)
print(f"Text: {text}")
print(f" Tokens: {len(tokens)} | Decoded: {encoding.decode(tokens[:3])}...")
print()
テキスト: Hello, world!
トークン数: 3 | 復号: Hello...
テキスト: The quick brown fox jumps over the lazy dog.
トークン数: 10 | 復号: The quick brown...
テキスト: Artificial intelligence is changing the world.
トークン数: 8 | 復号: Artifici...
テキスト: Generative AI is transforming the world.
トークン数: 8 | 復号: Generative AI is...
(2) コンテキストウィンドウ
コンテキストウィンドウは、LLM が一度に処理できるトークンの最大数です。モデルが「覚えられる」情報量を決定します。入力と出力のトークン数の合計がこの上限を超えてはいけません。
| モデル | コンテキストウィンドウ | おおよその容量 |
|---|---|---|
| GPT-4o-mini | 128K トークン | 英語の本で約 300 ページ |
| GPT-4o | 128K トークン | 英語の本で約 300 ページ |
| Claude 3.5 Sonnet | 200K トークン | 英語の本で約 500 ページ |
| Llama 3.1 405B | 128K トークン | 英語の本で約 300 ページ |
(3) トークン課金方式の比較
LLM API はトークン使用量に応じて課金され、入力と出力で価格が異なります。
| モデル | 入力価格(100 万トークンあたり) | 出力価格(100 万トークンあたり) | 説明 |
|---|---|---|---|
| GPT-4o-mini | $0.15 | $0.60 | コスパ最強、日常用途の第一選択 |
| GPT-4o | $2.50 | $10.00 | 高品質、複雑なタスク向け |
| Claude 3.5 Sonnet | $3.00 | $15.00 | 長文とコードに強い |
| Llama 3.1 70B(ホスト版) | 約 $0.20 | 約 $0.20 | オープンソースモデル。自己ホストなら無料 |
6. 温度とサンプリングパラメータ
(1) 温度(Temperature)
温度は LLM 出力のランダム性を制御します。温度が低いほど決定的な出力になり、高いほど多様な出力になります。
温度 = 0 → 常に最もありそうなトークンを選択(決定的)
温度 = 0.7 → 基本はありそうだが多少のばらつき(チャットのデフォルト)
温度 = 1.0 → 自然なばらつき、学習した分布に従う
温度 = 2.0 → 非常にランダム、しばしば意味不明
(2) Top-P
Top-P はランダム性を制御する別のパラメータです。確率分布の上位 P までのトークンのみをサンプリングします。
Top-P = 0.1 → 最もありそうな上位 10% のトークンのみ(保守的)
Top-P = 0.9 → 確率の 90% をカバーするトークンを考慮(中程度)
Top-P = 1.0 → すべてのトークンを考慮(フィルタなし)
| パラメータのシナリオ | 温度 | Top-P | 結果 |
|---|---|---|---|
| コード生成 | 0 | 1 | 高い確実性、正しいコード |
| 創作ライティング | 0.8 | 0.9 | 創造的だが突飛ではない |
| ブレインストーミング | 1.2 | 0.95 | 多様性が高く、意外な結果が得られることも |
| データ抽出 | 0 | 1 | 形式が一貫し、信頼できる JSON |
▶ サンプル: 温度パラメータごとの出力比較(難易度:⭐⭐)
# 異なる温度での出力を比較
from openai import OpenAI
client = OpenAI()
prompt = "Write a one-sentence description of a sunset."
temperatures = [0, 0.5, 1.0, 1.5]
for temp in temperatures:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=temp,
max_tokens=50
)
text = response.choices[0].message.content
print(f"Temperature={temp}: {text}")
print()
Temperature=0: 太陽が地平線の下に沈み、空をオレンジとピンクの色合いに染めた。
Temperature=0.5: 金色の光が地平線に広がり、太陽は琥珀色の雲の海に溶けていった。
Temperature=1.0: その日の最後の息吹が雲を燃やし、世界をクリムゾンと金の温かな夕映えで包んだ。
Temperature=1.5: 銅色、すみれ色、あり得ないばらの色が、太陽が降伏する中、砕けた空に枯れ花のように咲き乱れた。
7. GPT シリーズとモデルファミリーの進化
(1) GPT シリーズの進化
| モデル | 年 | パラメータ数 | 重要なブレイクスルー |
|---|---|---|---|
| GPT-1 | 2018 | 1.17 億 | 事前学習 + 微調整パラダイムの実現性を示した |
| GPT-2 | 2019 | 15 億 | スケーラビリティを示したが「危険すぎる」として全面公開を見送った |
| GPT-3 | 2020 | 1750 億 | 文脈内学習、少ショット学習 |
| Codex | 2021 | 12 億(コード特化) | コード生成、GitHub Copilot のエンジン |
| ChatGPT | 2022 | GPT-3.5 | RLHF を追加し、対話 AI が主流に |
| GPT-4 | 2023 | 非公開(推定 1 兆超) | マルチモーダル(テキスト+画像)、推論能力が大きく飛躍 |
| GPT-4o | 2024 | 非公開 | ネイティブマルチモーダル(テキスト/画像/音声)、2 倍の速度 |
(2) 主要 LLM の比較
| 次元 | GPT-4o | Claude 3.5 Sonnet | Llama 3.1 405B | Qwen 2.5 72B |
|---|---|---|---|---|
| 開発元 | OpenAI | Anthropic | Meta | 阿里巴巴(アリババ) |
| 種類 | 独占(プロプライエタリ) | 独占(プロプライエタリ) | オープンソース | オープンソース |
| コンテキスト | 128K | 200K | 128K | 128K |
| マルチモーダル | テキスト/画像/音声 | テキスト/画像 | テキスト | テキスト/画像 |
| 強み | バランスが良い | 長文/コード/安全性 | 自己ホスト/カスタマイズ | 中国語/多言語 |
| API 価格 | 中〜高 | 中〜高 | 自己ホストなら無料 | 自己ホストなら無料 |
| 向いている用途 | 一般的な本番環境 | 企業レベルのアプリ | プライベート/研究用途 | 中国語シナリオ |
(3) オープンソースとクローズドソースの比較
| 次元 | 独占モデル(GPT/Claude) | オープンソースモデル(Llama/Qwen/Mistral) |
|---|---|---|
| 重み | 非公開 | 公開されてダウンロード可能 |
| デプロイ | API のみ | 自己デプロイ可能(GPU が必要) |
| データプライバシ | データは第三者サーバを経由 | データはローカルに留まる |
| カスタマイズ | プロンプト/微調整 API のみ | 完全な微調整/LoRA/RLHF |
| コスト | トークン課金、量が多いほど高い | 固定 GPU コスト、量が多いほど安い |
| 使いやすさ | 低い(API を呼ぶだけ) | 高い(GPU とデプロイ知識が必要) |
| モデル能力 | 最高(GPT-4o 相当) | やや劣るが近い(Llama 3.1 405B は GPT-4 に近い) |
8. API 呼び出しのパターン
(1) 基本の呼び出しパターン
LLM API を呼び出すコアパラメータは 3 つだけです。model、messages、そして任意の temperature です。
▶ サンプル: 基本的な OpenAI API 呼び出し(難易度:⭐)
# システムプロンプト付きの基本的な OpenAI API 呼び出し
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "You are a concise technical assistant."},
{"role": "user", "content": "What is a Transformer in 2 sentences?"}
],
temperature=0.3
)
print(response.choices[0].message.content)
print(f"\nTokens used: {response.usage.total_tokens}")
Transformer は自己注意を基盤とするニューラルネットワークアーキテクチャで、すべての入力トークンを並列に処理できる。2017 年に提案され、GPT や BERT といった現代の LLM の基盤となった。
使用トークン数: 58
(2) マルチターン対話モード
Chat API は messages 配列で会話履歴を保持し、1 ラウンドごとに 1 件ずつメッセージを追加します。
▶ サンプル: マルチターン会話の API 呼び出し(難易度:⭐⭐)
# OpenAI API を使ったマルチターン会話
from openai import OpenAI
client = OpenAI()
conversation = [
{"role": "system", "content": "You are a helpful Python tutor."}
]
questions = [
"What is a list comprehension?",
"Can you show me an example?",
"What if I want to filter even numbers?"
]
for q in questions:
conversation.append({"role": "user", "content": q})
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=conversation,
temperature=0.3
)
reply = response.choices[0].message.content
conversation.append({"role": "assistant", "content": reply})
print(f"User: {q}")
print(f"Bot: {reply[:120]}...")
print()
ユーザー: What is a list comprehension?
ボット: リスト内包表記は Python でリストを簡潔に作る方法で、for ループと任意の条件を 1 行の構文にまとめられる…
ユーザー: Can you show me an example?
ボット: もちろん。基本的な例はこうです。squares = [x**2 for x in range(10)] これで [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] が作れる…
ユーザー: What if I want to filter even numbers?
ボット: 条件を加えます。evens = [x for x in range(20) if x % 2 == 0] これで [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] が得られる…
(3) ストリーム出力モード
ストリーミング出力はトークンを 1 つずつ返し、より良いユーザー体験(タイプライター効果のよう)を提供し、最初のトークンをより早く表示します。
▶ サンプル: ストリーミング出力(stream=True)の体験(難易度:⭐⭐)
# OpenAI API を使ったストリーミング出力
from openai import OpenAI
client = OpenAI()
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Explain quantum computing in 3 sentences."}],
temperature=0.5,
stream=True
)
print("Streaming response: ", end="")
for chunk in stream:
if chunk.choices[0].delta.content is not None:
print(chunk.choices[0].delta.content, end="", flush=True)
print("\n\n[Stream complete]")
ストリーミング応答: 量子コンピュータは重ね合わせ状態になれる量子ビット(キュービット)を使い、0 と 1 を同時に表す。これにより量子コンピュータは多くの計算を並列に処理でき、特定の問題を指数関数的に高速化する。主な応用には暗号化、創薬、最適化がある。
[ストリーム完了]
stream=True は完全な応答ではなくイテレータを返すため、Web アプリで 1 文字ずつ表示するのに適しています。ただしトークン総数は事前に分からず、最後のチャンクの usage フィールドから取得する必要があります。
9. 総合例:AI コピーライティングアシスタント
「AI コピーライティングアシスタント」を作ります。商品説明を入力すると、OpenAI API を呼び出して 3 つの異なるスタイルの広告コピーを生成し、比較のために出力します。
▶ サンプル: AI コピーライティングアシスタント——3 スタイルの広告コピー生成(難易度:⭐⭐⭐)
# ============================================
# AI コピーライティングアシスタント
# 入力: 商品説明
# 出力: 3 スタイルの広告コピー
# ============================================
from openai import OpenAI
client = OpenAI()
product = "Wireless noise-cancelling headphones, 40-hour battery, $199"
styles = [
("Professional", "Write a professional, feature-focused ad copy."),
("Emotional", "Write an emotional, lifestyle-focused ad copy."),
("Humorous", "Write a humorous, witty ad copy.")
]
print("=" * 60)
print(f"Product: {product}")
print("=" * 60)
for style_name, style_prompt in styles:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": f"You are an expert copywriter. {style_prompt}"},
{"role": "user", "content": f"Write ad copy for: {product}. Keep it under 80 words."}
],
temperature=0.8,
max_tokens=150
)
copy = response.choices[0].message.content
tokens = response.usage.total_tokens
cost = (response.usage.prompt_tokens * 0.15 + response.usage.completion_tokens * 0.60) / 1_000_000
print(f"\n[{style_name}]")
print(f"{copy}")
print(f"\n(トークン数: {tokens}, コスト: ${cost:.6f})")
print("\n" + "=" * 60)
============================================================
商品: Wireless noise-cancelling headphones, 40-hour battery, $199
============================================================
[Professional]
プレミアムなノイズキャンセリング技術と 40 時間の连续再生バッテリーを体験。当社のワイヤレスヘッドホンはクリアな音質と快適な設計を $199 で提供。集中と品質を求めるプロフェッショナルに最適。
(トークン数: 72, コスト: $0.000032)
[Emotional]
雑音から逃れよう。このヘッドホンを着ければ世界が遠のく——40 時間の純粋で途切れない bliss。朝の通勤でも静かな夜でも、あなたのサウンドトラックが待っている。$199 で手に入る、聴こえる平和。
(トークン数: 68, コスト: $0.000030)
[Humorous]
隣人のカラオケがうるさくて疲れた?このノイズキャンセリングヘッドホンが混沌を遮断し、40 時間の甘い静寂を届ける。引っ越すより安い $199。あなたの耳が感謝するはず。
(トークン数: 58, コスト: $0.000025)
============================================================
❓ よくある質問
tiktoken ライブラリを使えます。📖 まとめ
- 生成 AI はデータ分布から新しいコンテンツを作り、判別 AI は決定境界から分類する——両者は組み合わせて使える
- LLM の中核は「次トークン予測」:最もありそうな次トークンを繰り返し予測し、つなげて完全な出力を形成する
- トークンは LLM が処理する最小単位。中国語トークンは英語の 2〜3 倍のリソースを消費する。コンテキストウィンドウはモデルが一度に処理できるテキスト量を決定する
- 温度は出力のランダム性を制御:0 = 決定的、0.7 = 自然、1.5 以上 = 創造的。Top-P は別のランダム性フィルタ
- GPT シリーズは 1 億パラメータから 1 兆級へ進化。GPT-4o は現在 OpenAI のフラグシップ。オープンソース陣営には Llama、Qwen、Mistral がある
- LLM API の呼び出しに必要なコアパラメータは 3 つだけ:model、messages、temperature。マルチターン会話は完全な履歴の保持が必要。ストリーミング出力はユーザー体験を高める
📝 練習問題
- 基礎問題(難易度 ⭐): OpenAI API を使って小さな翻訳プログラムを書きなさい。中国語入力を受け取り、英語訳を出力する。要件:システムプロンプトで役割を「翻訳アシスタント」と指定し、一貫した翻訳のため
temperature=0を設定すること。 - 応用問題(難易度 ⭐⭐): 同じプロンプト(例:「秋についての詩を書け」)を使い、
temperature=0とtemperature=1でそれぞれ 5 回モデルを呼び出しなさい。出力の違いを記録・比較し、温度が出力にどう影響するかパターンをまとめなさい。 - チャレンジ(難易度:⭐⭐⭐): API を使って簡単なチャットボットを作りなさい。マルチターン会話(「bye」と出会ったらループを終了)をサポートし、ボットに特定の役割(「Python プログラミングチューター」など)を演じさせるプロンプトを含め、ストリーム出力で応答をそのまま 1 文字ずつ表示してみなさい。