はじめに: LLM の魅力を解き明かす
大規模言語モデルは魔法のように思えます。質問を書くと、一貫性のある構造化された質問が得られます。 しばしば驚くほど賢い。しかし、ボンネットの下には魔法はありません。 数学。 LLM は基本的に、シーケンス内の次のトークンを予測するシステムです。 トレーニング中に数十億の単語から学習した統計的パターン。
LLM がどのように機能するかを理解することは、学問的な作業ではなく、不可欠な実践的なスキルです。 プロンプトと生成された応答の間に何が起こるかを知ることで、より良いプロンプトを作成できるようになります。 予期しない動作をデバッグし、ユースケースに適したモデルを選択し、理解する LLMは幻覚を起こすからです。
この記事で学べること
- トークン化によってテキストが数値に変換される仕組み
- 意味論的な意味を表現する際の埋め込みの役割
- トランスフォーマーにおける注意メカニズムの仕組み
- テキスト生成プロセス: ロジットからトークンまで
- サンプリング戦略: 温度、top-k、top-p
- LLM が幻覚を起こす理由とコンテキスト ウィンドウの役割
フェーズ 1: トークン化 - テキストから数字へ
LLM を処理する最初のステップは、 トークン化:テキストを変換します 一連の整数で。神経パターンには文字や単語は含まれません。彼らは上で動作します 数値ベクトル。トークン化は人間の言語とモデル数学の間の架け橋です。
バイトペアエンコーディング (BPE)
最も一般的なアルゴリズムは、 バイトペアエンコーディング (BPE)、GPT、クロード、その他のほとんどの人が使用 現代モデルの一部。 BPE は反復的に動作します。個々の文字から開始してマージします。 長いトークンでは、ペアの頻度が徐々に高くなります。
その結果、最適な妥協点となる 50,000 ~ 100,000 トークンの語彙が得られます。 粒度と効率の間で。 「the」のような一般的な単語は単一のトークンになりますが、単語は レアなものはサブトークンに分割されます。
# Esempio di tokenizzazione con tiktoken (tokenizer di OpenAI)
import tiktoken
# Carica il tokenizer di GPT-4
enc = tiktoken.encoding_for_model("gpt-4")
# Tokenizza una frase
testo = "L'intelligenza artificiale generativa e rivoluzionaria"
tokens = enc.encode(testo)
print(f"Testo: {testo}")
print(f"Token IDs: {tokens}")
print(f"Numero token: {len(tokens)}")
# Decodifica ogni token per vedere la suddivisione
for token_id in tokens:
print(f" ID {token_id} -> '{enc.decode([token_id])}'")
# Output tipico:
# Testo: L'intelligenza artificiale generativa e rivoluzionaria
# Token IDs: [43, 6, 396, 40749, 80828, ...]
# Numero token: 8
トークン化の実際的な影響
トークン化には、すべての開発者が知っておくべき重要な実際的な影響があります。
- 料金: API はワードごとではなく、トークンごとに料金を請求します。単語は 1 ~ 4 個のトークンで構成できます
- コンテキストウィンドウ: 制限は単語ではなくトークンにあります。 4,000 トークンは英語の約 3,000 単語に相当します
- さまざまな言語: イタリア語は、同じ概念を表現するのに英語よりも多くのトークンを必要とします (約 1.3 倍)
- コード: ソースコードは多くの場合、自然テキストに比べてトークン効率が低い
フェーズ 2: 埋め込み - トークンから意味へ
トークン化後、各 ID トークンは 埋め込み: 密なベクトル トークンの意味論的な意味を捉える実数 (通常は 768 ~ 12,288 次元)。
埋め込みの力はその幾何学構造にあります。同様の意味を持つ単語にはベクトルがあります。 宇宙に近い。 「パリ」と「フランス」のように、「国王」と「女王」は近い存在です。こういった関係性 これらはトレーニング中に自動的に学習されます。
埋め込み: 意味のある数字
埋め込みは単純な数値 ID ではありません。埋め込みは、すべての次元が含まれる高次元ベクトルです。
意味の側面を捉えています。埋め込みに対する算術演算により結果が生成されます
意味的に賢明: vec("re") - vec("uomo") + vec("donna") ≈ vec("regina").
# Visualizzare la similarità semantica degli embedding
from openai import OpenAI
import numpy as np
client = OpenAI()
def get_embedding(text: str) -> list:
"""Ottieni l'embedding di un testo usando OpenAI."""
response = client.embeddings.create(
model="text-embedding-3-small",
input=text
)
return response.data[0].embedding
def cosine_similarity(a: list, b: list) -> float:
"""Calcola la similarità coseno tra due vettori."""
a, b = np.array(a), np.array(b)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Confronta similarità semantiche
parole = ["gatto", "cane", "automobile", "felino"]
embeddings = {p: get_embedding(p) for p in parole}
print("Similarità semantiche:")
print(f" gatto-felino: {cosine_similarity(embeddings['gatto'], embeddings['felino']):.4f}")
print(f" gatto-cane: {cosine_similarity(embeddings['gatto'], embeddings['cane']):.4f}")
print(f" gatto-auto: {cosine_similarity(embeddings['gatto'], embeddings['automobile']):.4f}")
# gatto-felino avra la similarità più alta!
位置エンコーディング
トランスフォーマーはセマンティック埋め込みに加えて、 位置エンコーディング:信号 これは、シーケンス内の各トークンの位置を示します。このメカニズムがなければ、モデルは機能しません。 アーキテクチャとして、「猫がネズミを追う」と「ネズミが猫を追う」を区別することになります。 Transformer は、すべてのトークンを順番にではなく並行して処理します。
フェーズ 3: トランスフォーマー - 必要なのは注意だけです
すべての最新の LLM の中心となるのはアーキテクチャです トランスフォーマー、繰り返されるブロックで構成されます の 自己注意 e フィードフォワードネットワーク。 GPT-4 のようなモデルには、 何百ものブロックが積み重ねられ、それぞれがテキストの表現を洗練させます。
自己注意: 重要なメカニズム
自己注意により、各トークンはシーケンス内の他のすべてのトークンを「見て」決定することができます。 現在の文脈におけるその意味とどの程度関連しているか。文の中で「猫は座った」 「彼は疲れていたのでカーペットの上で」、注意メカニズムは「彼は疲れていた」を(「カーペット」ではなく)「猫」に結び付けます。 共参照を解決します。
数学的には、トークンごとに 3 つのベクトルが計算されます。 クエリ (私は何を探しているのですか)、 Key (文脈として私が提供するもの) e 価値 (私の情報内容)。 クエリとキーの間のドット積により、値の重み付けに使用されるアテンションの重みが決まります。
マルチヘッドアテンション
単一の注意メカニズムが 1 つのタイプの関係を捉えます。の 多頭注意 複数のアテンションを並行して実行し(通常は 32 ~ 128 個の「ヘッド」)、それぞれが 1 つの側面に特化します 異なるもの: 構文、意味、近接性、共参照関係など。
変圧器ブロックの構造
各 Transformer ブロックは次の構造に従います。 レイヤーノルム 入力を安定させるために、 マルチヘッドセルフアテンション トークン間の関係を把握するため、 残留接続 元の情報を保存するため、 二番目 レイヤーノルム、そして1つ フィードフォワードネットワーク (緻密な2層) 表現を変換し、その後に別の表現を変換します 残留接続。 GPT-4 はこれらのブロックを約 120 個スタックします。
フェーズ 4: テキストの生成
入力テキストがすべての Transformer ブロックを通過した後、最後のレイヤーで 各位置の出力ベクトル。次のトークンを生成するには、このベクトルを投影します。 語彙全体にわたって i を生成する ロジット: 可能なそれぞれの数値スコア 語彙内のトークン。
ロジットから確率へ: Softmax
ロジットは関数を通じて確率に変換されます。 ソフトマックス、正規化します スコアを加算して 1 にします。最も高い確率と「最良の予測」を持つトークン モデルの選択ですが、常に選択されるわけではありません。
サンプリング戦略
次のトークンの選択は決定的ではありません。さまざまな戦略 サンプリング さまざまな特性を持つ出力を生成します。
- 貪欲なデコード: 常に最も可能性の高いトークンを選択します。決定的だが繰り返しが多く退屈なことが多い
- ランダムサンプリング: 完全なディストリビューションからのサンプル。創造的だが一貫性がない可能性がある
- 気温:「ランダム性」にチェックを入れます。 T=0 は貪欲、T=1 は元の分布、T>1 は創造性を高めます
- Top-k サンプリング: k 個の最も可能性の高いトークンからのみサンプリングします (例: k=40)
- Top-p (核) サンプリング: 累積確率が p を超えるトークンの最小セットからのサンプル (例: p=0.9)
# Esempio: effetto della temperature sulla generazione
from anthropic import Anthropic
client = Anthropic()
prompt = "Scrivi l'inizio di una storia fantasy in una riga:"
for temp in [0.0, 0.5, 1.0, 1.5]:
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=100,
temperature=temp,
messages=[{"role": "user", "content": prompt}]
)
print(f"\nTemperature {temp}:")
print(f" {response.content[0].text}")
# Temperature 0.0: output deterministico, sempre uguale
# Temperature 0.5: lieve variazione, ancora coerente
# Temperature 1.0: creativo, buon bilanciamento
# Temperature 1.5: molto creativo, possibile incoerenza
コンテキスト ウィンドウ: LLM のメモリ
La コンテキストウィンドウ LLM が 1 回で処理できるトークンの最大数 リクエスト (入力 + 出力)。これは事実上、会話中のモデルの「作業記憶」となります。
モデルのコンテキスト ウィンドウ
| モデル | コンテキストウィンドウ | おおよその同等品 |
|---|---|---|
| GPT-3.5 | 4,096 / 16,384 トークン | ~3,000 / 12,000 ワード |
| GPT-4 | 8,192 / 128,000 トークン | ~6,000 / 96,000 ワード |
| クロード 3.5 ソネット | 200,000トークン | ~150,000単語 |
| ジェミニ 1.5 プロ | 1,000,000トークン | 約750,000語 |
| ラマ 3.1 | 128,000トークン | 約96,000語 |
幻覚: LLM が発明する理由
Le 幻覚 LLM の最も重大な問題の 1 つである: モデルが情報を生成する true 情報を生成するのと同じ確実性で false を返します。これは、LLM が 事実を「知っている」: コンテキストを考慮して、最も可能性の高い次のトークンを予測します。
統計パターンが「オーストラリアの首都は」の後に最も可能性の高いトークンであることを示唆している場合 が「シドニー」の場合、正解が「キャンベラ」であっても、モデルは「シドニー」を生成します。モデル 出力の真実性を検証する内部メカニズムはありません。
軽減策: 検索拡張生成 (RAG)
幻覚や幻覚を軽減するための最も効果的な戦略 ラグ:モデルに提供 コンテキストの一部として信頼できる情報源から取得された事実情報。尋ねる代わりに 「記憶」モデルに更新されたデータを渡し、それについて推論してもらいます。
# RAG semplificato: fornire contesto fattuale al modello
from anthropic import Anthropic
client = Anthropic()
# Contesto recuperato da un database o motore di ricerca
contesto_fattuale = """
Dati aziendali aggiornati al Q3 2025:
- Fatturato: EUR 12.5M (+23% YoY)
- Dipendenti: 85
- Clienti attivi: 342
- NPS score: 72
"""
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
messages=[{
"role": "user",
"content": f"""Basandoti ESCLUSIVAMENTE sui dati seguenti,
rispondi alla domanda. Se i dati non contengono la risposta, di' "Non ho questa informazione".
DATI:
{contesto_fattuale}
DOMANDA: Qual è il fatturato attuale e quanti dipendenti abbiamo?"""
}]
)
print(response.content[0].text)
結論
LLM の内部動作を理解する - トークン化から生成、そしてそれ以降まで 埋め込み、アテンション、サンプリングについては、単なる理論的な知識ではありません。そして、これらを使用するための基礎 ツールを効果的かつ意識的に使用します。
トークン化はコストとコンテキストの制限に影響します。温度とサンプリング戦略 アウトプットの創造性を決定します。注意メカニズムはモデルが理解する理由を説明します 文脈を理解していない(または理解していない)。幻覚は建築の直接的な結果である 次のトークンの予測。
次の記事では、この知識を実践していきます。 高度なエンジニアリングプロンプト: ゼロショットから思考の連鎖まで、LLM を最大限に活用するための体系的なテクニック システムプロンプトから ReAct パターンまで。







