レッスン 1 / 6
LLMとは?しくみをざっくりつかむ
学ぶコト
- LLMが「次に来る言葉」を予測して文章を作るしくみ
- 事前学習・指示チューニング・人のフィードバックという作られ方
- ハルシネーションが起きる理由
- 推論モデル・マルチモーダル・長いコンテキストという最近の変化
このコースでは、ChatGPT・Claude・Gemini の中で動いている大規模言語モデル(LLM)のしくみを知り、Python から API で呼び出せるようになるところまで進みます。
最初のレッスンでは、LLMが何をしているのかを「ざっくり」つかみます。数式はほとんど使いません。代わりに、ほんの数行で作れる小さな言語モデルを動かして、LLMと同じ考え方を手で確かめます。
このページの Python のコードは「▶ 実行」を押すと、ブラウザの中で動かせます。上から順に実行してください。
LLMは「次に来る言葉」を予測している
LLM(Large Language Model)がしていることは、一言でいうと**「ここまでの文章の次に来そうな言葉を予測する」**ことです。
たとえば「今日はとても」と渡されたら、次に来そうな言葉の候補と、その確からしさ(確率)を計算します。
| 次の言葉の候補 | 確率(例) |
|---|---|
| 暑い | 0.32 |
| いい | 0.21 |
| 寒い | 0.18 |
| 眠い | 0.05 |
| …… | …… |
この中から1つを選んで文章の後ろにつなげ、「今日はとても暑い」になったら、また次の言葉を予測します。これをくり返すと、長い文章ができあがります。チャットの画面で答えが少しずつ表示されるのは、このように1つずつ言葉を作っているからです。
小さな言語モデルを作ってみよう
本物のLLMは、数十億から数千億、あるいはそれ以上の数の値(パラメータ)を持つ大きなモデルですが、考え方は小さなモデルでも確かめられます。ここでは、直前の1語だけを見て、次の1語を予測するいちばん簡単な言語モデルを作ります。
まず、学習に使う文章(コーパス)を用意して、「ある言葉の次に、どの言葉が何回来たか」を数えます。日本語は単語の区切りが見えないので、ここではあらかじめスペースで区切っておきます。<s> は文の始まり、</s> は文の終わりの印です。
from collections import Counter, defaultdict
corpus = [
"今日 は 天気 が いい",
"今日 は 雨 が 降る",
"明日 は 天気 が 悪い",
"明日 は 晴れ です",
"東京 は 日本 の 首都 です",
"大阪 は 日本 の 大きな 都市 です",
"京都 は 日本 の 古い 都市 です",
"日本 の 首都 は 東京 です",
]
counts = defaultdict(Counter)
for sentence in corpus:
words = ["<s>"] + sentence.split() + ["</s>"]
for prev, nxt in zip(words, words[1:]):
counts[prev][nxt] += 1
counts["は"]
「は」の次には「日本」が3回、「天気」が2回、「雨」「晴れ」「東京」が1回ずつ来ていました。回数を合計で割ると、次の言葉の確率になります。
def next_word_probs(word):
c = counts[word]
total = sum(c.values())
return {w: n / total for w, n in c.items()}
next_word_probs("は")
「は」の次が「日本」になる確率は 0.375(8回中3回)です。これで、小さな言語モデルができました。
文章を作らせてみる
文の始まり <s> から、確率に従って次の言葉を1つずつ選び、</s> が出たら止めます。確率の高い言葉ほど選ばれやすいように、くじ引きで選ぶのがポイントです。
import random
rng = random.Random(0)
def generate(max_words=10):
word = "<s>"
out = []
for _ in range(max_words):
probs = next_word_probs(word)
word = rng.choices(list(probs), weights=list(probs.values()))[0]
if word == "</s>":
break
out.append(word)
return "".join(out)
for _ in range(5):
print(generate())
「明日は雨が降る」のように自然な文もあれば、「東京は日本の首都は東京です」「明日は東京です」のように、おかしな文もできました。このモデルは直前の1語しか見ていないので、文全体として意味が通るかは分からないのです。
本物のLLMとの違い
小さなモデルと本物のLLMは、「次の言葉の確率を出して、1つ選んでつなげる」という点では同じです。違うのは、次の3つです。
| 小さなモデル | 本物のLLM | |
|---|---|---|
| 見ている範囲 | 直前の1語だけ | ここまでの文章ぜんぶ(数十万〜100万トークン) |
| 言葉の単位 | 人が区切った単語 | トークン(単語より細かい単位。次のレッスンで扱います) |
| 確率の求め方 | 回数を数えるだけ | 膨大な数のパラメータを持つニューラルネットワーク |
今のLLMのほとんどは、2017年に発表された Transformer という仕組みを土台にしています。Transformer の中心にあるのは Attention(注意機構) で、文章の中のどの言葉とどの言葉が関係しているかを、すべての組み合わせについて計算します。
たとえば「彼女は駅でスマホを落とした。それを拾ってくれたのは…」という文では、「それ」が「スマホ」を指していると分からないと、続きをうまく予測できません。Attention は、こうした離れた言葉どうしの関係をとらえるための仕組みです。
LLMができるまでの3つの段階
ChatGPT のような「質問に答えてくれるAI」は、大きく次の3つの段階で作られます。
事前学習
Webのページ・本・論文・プログラムなど、とても大量の文章を読ませて、「次のトークンを予測する」練習をひたすら行います。上の小さなモデルで回数を数えたのと同じことを、ずっと大きな規模で行うイメージです。ここで、言葉の使い方や世の中の知識を幅広く身につけます。ただし、この段階のモデルは「文章の続きを書く」だけで、質問に答えるのは得意ではありません。
指示チューニング
「質問」と「よい答え」の組をたくさん用意して、指示に従って答える練習をさせます。これで、「要約して」「表にして」と頼まれたときに、その通りに答えられるようになります。
人のフィードバックによる調整
同じ質問へのいくつかの答えを人が見比べて、どれがよいかを評価し、評価の高い答えを出しやすくなるように調整します(RLHF:人のフィードバックによる強化学習、と呼ばれる方法が代表的です)。役に立つか、正直か、危険なことを手伝わないか、といった点もここで整えます。最近は、数学の問題やプログラムのように答えが正しいか機械で確かめられる課題で、強化学習を重ねる方法も広く使われています。
なぜハルシネーションが起きるのか
LLMは、事実と違うことをもっともらしく書くことがあります。これをハルシネーションと呼びます。原因は、ここまで見てきた仕組みそのものにあります。小さなモデルで確かめてみましょう。
次のコードは、ある文をモデルが作る確率を計算します。コーパスにある正しい文「東京は日本の首都です」と、コーパスにない間違った文「大阪は日本の首都です」を比べます。
def sentence_prob(sentence):
words = ["<s>"] + sentence.split() + ["</s>"]
p = 1.0
for prev, nxt in zip(words, words[1:]):
p *= next_word_probs(prev).get(nxt, 0.0)
return p
for s in ["東京 は 日本 の 首都 です", "大阪 は 日本 の 首都 です"]:
print(s.replace(" ", ""), round(sentence_prob(s), 4))
間違った文の確率(0.0117)が、正しい文の確率(0.0059)の2倍になりました。コーパスには「大阪は日本の首都です」という文は一度も出てこないのに、です。
モデルは「大阪 → は」「は → 日本」「日本 → の」「の → 首都」という、どれもコーパスによく出てくるつながりを組み合わせただけです。一つひとつのつながりは自然なので、文としてもそれらしく見えます。でも、その文が事実かどうかは、モデルの計算のどこにも入っていません。
本物のLLMはずっと賢いので、こんな単純な間違いはしません。それでも、根本は同じです。
- LLMは「それらしい続き」を作る仕組みで、データベースのように事実を引いてくるわけではない
- 学習データにあまり出てこない事柄(細かい数字、マイナーな人や会社、社内の情報)ほど、それらしい作り話になりやすい
- 学習したのはある時点までのデータなので、それより後のことは知らない
- 「分かりません」と答えるより、何か答えるほうが評価されやすい学習のされ方をしてきた面もある
temperature:選び方のランダムさを変える
API で LLM を使うと、temperature(温度) という設定が出てきます。これは、次の言葉を選ぶときのランダムさを調整する値です。
temperature を小さくすると、確率の高い言葉がより選ばれやすくなり、答えが安定します。大きくすると、確率の低い言葉も選ばれやすくなり、答えにばらつきが出ます。確率を temperature 分の1乗してから、合計が1になるように割り直す、という計算です。
import pandas as pd
def apply_temperature(probs, temperature):
weights = {w: p ** (1 / temperature) for w, p in probs.items()}
total = sum(weights.values())
return {w: v / total for w, v in weights.items()}
probs = next_word_probs("は")
pd.DataFrame({f"T={t}": apply_temperature(probs, t) for t in [0.3, 1.0, 2.0]}).round(3)
T=1.0 は元の確率のままです。T=0.3 では「日本」の確率が 0.75 まで上がり、T=2.0 ではどの候補も 0.16〜0.28 くらいの、均等に近い確率になりました。実際に文章を作らせて比べてみましょう。
rng = random.Random(1)
def generate_with_temperature(temperature, max_words=10):
word = "<s>"
out = []
for _ in range(max_words):
probs = apply_temperature(next_word_probs(word), temperature)
word = rng.choices(list(probs), weights=list(probs.values()))[0]
if word == "</s>":
break
out.append(word)
return "".join(out)
for t in [0.3, 2.0]:
print("T =", t)
for _ in range(5):
print(" ", generate_with_temperature(t))
T=0.3 では「日本の首都です」「日本の古い都市です」のような、よく出てくるつながりの文が多くなります。T=2.0 では「今日は日本の首都は東京は雨が」のような、まとまりのない文が増えます。
仕事で使うときは、分類やデータの取り出しのように決まった答えがほしい作業は低め、キャッチコピーの案出しのようにいろいろな案がほしい作業は高め、が目安です。ただし、最近の推論モデルでは temperature を使える条件が決まっています。くわしくは「APIを使ってみる」のレッスンで扱います。
最近のLLMで変わったこと
ここ数年で、LLMは「次の言葉を予測する」という基本はそのままに、できることが大きく広がりました。2026年10月時点で押さえておきたい変化は、次の4つです。
| 変化 | どういうことか |
|---|---|
| 推論モデル | 答える前に、見えないところで考える(推論する)モデル。考える量を API で調整でき、難しい問題ほど正確になる。考えた分のトークンも料金に入る |
| マルチモーダル | 文章だけでなく、画像を読み取れるのが当たり前になった。音声の書き起こしや画像の生成も、専用のモデルを API で呼べる |
| 長いコンテキスト | 一度に渡せる文章の量が増え、主なモデルでは約100万トークンまで扱える。長い資料をまるごと渡せる |
| ツールを使う | Web検索・プログラムの実行・社内システムの呼び出しなどを、モデルが自分で判断して使う。AIエージェントの土台になっている |
どれも、このコースの後半や、この先のコースで実際に使っていきます。
ウマたんLLMは「とても物知りで文章がうまい予測マシン」だと思っておくと、得意なことと苦手なことの見当がつきやすくなります。仕組みが分かると、どう頼めばいいか、どこを確かめればいいかも見えてきますよ。
演習
まとめ
- LLMは「ここまでの文章の次に来そうな言葉」の確率を計算し、1つ選んでつなげることをくり返して文章を作る
- 今のLLMは Transformer を土台に、事前学習・指示チューニング・人のフィードバックによる調整を経て作られる
- ハルシネーションは「それらしい続きを作る」仕組みから自然に起きる。根拠の情報を渡し、数字や固有名詞は確かめる
- temperature は選び方のランダムさを決める値。最近は推論モデル・マルチモーダル・長いコンテキスト・ツールの利用が当たり前になった
次のレッスンでは、LLMが文章を読むときの単位「トークン」と、一度に扱える量「コンテキスト」を見ていきます。料金や速さがどう決まるかも、ここで分かります。
分からないところがあればこのレッスンについて質問するこのコースの Q&A を見る
