Skip to content

【脱・魔法使い】AIは「意識」を持っているのか? いえ、ただの「確率ガチャ」です。エンジニアのためのLLM解剖学

| 📖 11分で読めます
【脱・魔法使い】AIは「意識」を持っているのか? いえ、ただの「確率ガチャ」です。エンジニアのためのLLM解剖学

前回のブロックチェーン解剖に続き、今回も「バズワードの解体ショー」を行います。今回のターゲットは、今まさに世界を席巻している**「生成AI(LLM)」**です。

ニュースを見れば「シンギュラリティ(技術的特異点)の到来」「AIが感情を持った」「人類の仕事が奪われる」といったセンセーショナルな見出しが踊っています。

しかし、我々エンジニアがAPI越しに対峙しているのは、神でも悪魔でもありません。

そこにいるのは、入力されたテキスト(Prompt)に対して、確率的に「それっぽい続き」を返してくるだけの、巨大な関数 f(x) です。

アーサー・C・クラークは「十分に発達した科学技術は、魔法と見分けがつかない」と言いましたが、エンジニアが技術を「魔法」として扱ってはいけません。

中身がブラックボックスのまま本番環境にデプロイするなんて、夜も眠れなくなりますよね?

今回は、LLM(大規模言語モデル)を**「超高性能なオートコンプリート」**として定義し直し、その裏側にある「ベクトル」と「確率」の正体をコードレベルで紐解きます。

1. 思考の正体:ただの「次に来る単語当てゲーム」

まず結論から言います。ChatGPTなどのLLMは、何も考えていません

彼らがやっていることは、スマホのフリック入力に出てくる「予測変換」と本質的に同じです。

  • スマホ: 「お疲れ」と打つ → 「様です」「さまです」「気味」を提案。
  • LLM: 「日本の首都は」と打つ → 「東京」「京都」「大阪」の確率を計算し、「東京」を選択。

このスケールが桁違いに巨大(数千億パラメータ)になり、参照できる文脈(Context)が長くなっただけです。

Pythonで書くとこうなる

LLMの挙動を極限まで単純化すると、以下のようなPythonコードで表現できます。

Python

import random

# 簡易的な確率辞書(モデルの重み)
# 実際はこれが数千億個ある
probability_model = {
    "昔々、あるところに": {
        "おじいさん": 0.45,
        "おばあさん": 0.40,
        "桃太郎": 0.10,
        "iPhone": 0.00001
    }
}

def generate_next_token(input_text):
    # 1. 入力テキスト(文脈)を受け取る
    context = analyze_context(input_text)
    
    # 2. 次に来る単語の確率分布を計算する(推論)
    candidates = probability_model.get(context, {})
    
    # 3. 確率に基づいてサイコロを振る(サンプリング)
    next_word = weighted_random_choice(candidates)
    
    return next_word

# 実行
print(generate_next_token("昔々、あるところに"))
# 出力: "おじいさん" (45%の確率で)

AIは「意味」を理解して「おじいさん」と答えたのではありません。

学習データ(過去の童話など)の中で、「昔々、あるところに」の後には「おじいさん」という文字列が来る確率が統計的に高かったから、それを出力したに過ぎません。

これが、AIが平気で嘘をつく(ハルシネーション)最大の理由です。

彼らにとって「真実かどうか」はどうでもよく、**「確率的にありそうかどうか(もっともらしさ)」**だけが正義なのです。

2. 意味の正体:言葉を「数字(ベクトル)」に変換する

「でも、AIは『リンゴ』と『ミカン』が似ていることを知っているよ?」

鋭い指摘です。しかし、AIは果物の味を知っているわけではありません。

彼らは単語を**「多次元のベクトル(数値の配列)」**として扱っています。

これを**「埋め込み表現(Embeddings)」**と呼びます。

単語の座標計算

コンピュータにとって「リンゴ」という文字データは意味を持ちませんが、これをベクトル空間上の「座標」に変換すると、計算が可能になります。

  • King(王): [0.9, 0.2, 0.5, ...]
  • Man(男): [0.8, 0.1, 0.4, ...]
  • Woman(女): [0.8, 0.9, 0.4, ...]

ここで、有名な演算があります。

「王様」 − 「男性」 + 「女性」 = 「女王」

「王様」の座標から「男」成分を引き、「女」成分を足すと、不思議なことに「女王」の座標の近くに着地するのです。

AIにとっての「理解」とは、この**「ベクトル空間内での距離(コサイン類似度)の近さ」**のことです。

「美味しい」と「不味い」は意味が逆ですが、使われる文脈が似ているため、ベクトル空間上では比較的近くに配置されます。

我々エンジニアがRAG(検索拡張生成)システムを作る際、Vector DBを使って「類似検索」を行うのはこのためです。

AIは意味を読んでいるのではなく、「座標の近さ」を検索しているだけなのです。

3. 記憶の正体:実は「記憶喪失」のREST API

エンジニアがアプリにAIを組み込む際、最も衝撃を受けるのがここです。

ユーザー:「昨日の話の続きだけどさ…」

AI:「はい、なんでしょう!(昨日のことなんて知らんけど)」

実は、OpenAIのAPIなどのLLMは**「ステートレス(Stateless)」**です。

HTTPプロトコルと同様、過去の状態(記憶)を一切保持していません。

毎回「全ログ」を送信している

では、なぜChatGPTは会話が成立するのか?

それは、クライアント(アプリ側)が**「過去の会話履歴を全部くっつけて、毎回POSTしているから」**です。

JavaScript

// 実際のAPIリクエストのイメージ
const response = await openai.chat.completions.create({
  model: "gpt-4",
  messages: [
    { role: "user", content: "こんにちは" },
    { role: "assistant", content: "こんにちは!何かお手伝いしましょうか?" },
    { role: "user", content: "カレーの作り方を教えて" },
    { role: "assistant", content: "まずは玉ねぎを..." },
    // ... 延々と続く過去ログ ...
    { role: "user", content: "じゃあ、隠し味は何がいい?" } // ← 今回の質問
  ]
});

現場のリアル:コンテキストウィンドウとの戦い

ここで発生するのが、エンジニア泣かせの**「トークン制限」「コスト」**の問題です。

  • 課金地獄: 「隠し味は何?」という短い質問をするだけでも、過去の数千文字分の会話履歴も送信するため、その分も毎回課金されます。
  • メモリ溢れ: 送れる量(Context Window)には限界があります(GPT-4で128kトークンなど)。会話が長くなると、古い記憶から物理的に削除(array.shift())してAPIに投げざるを得ません。

「AIが昔のことを忘れた」と感じるのは、AIが馬鹿になったのではなく、システム設計上、古いログを切り捨てたからです。

AIに「記憶」があるわけではなく、我々が「記憶」を毎回注入しているだけなのです。

4. 創造性の正体:もう「サイコロ」は振らせてもらえない

最後に、AIの「創造性」をコントロールするパラメータについて。 かつてGPT-4の時代には、Temperature(温度)というパラメータで「0.0〜2.0」の数値をいじれば、回答のランダム性を調整できました。

しかし、最新のReasoningモデル(oシリーズ以降)では、このパラメータは事実上「廃止(固定)」されました。

なぜ Temperature は消えたのか?

それは、AIが**「思考(Chain of Thought)」**を行うようになったからです。

今のAIは、回答を出力する前に内部で「うーん、これはAかな?いや待てよ、Bの可能性もあるな…」という膨大な独り言(推論トークン)を生成しています。 この繊細な論理の積み上げプロセスにおいて、外部から Temperature で無理やりランダムなノイズを混ぜると、推論が破綻して計算がクラッシュしてしまうのです。

新しいパラメータ reasoning_effort

その代わりに我々に渡されたのは、**reasoning_effort(推論の深さ)**という新しいハンドルです。

Python

# 2026年のAPIリクエスト(イメージ)
response = await client.chat.completions.create({
  model: "o3-high-reasoning",
  messages: [...],
  # temperature: 1.0,  <-- もはや変更不可(エラーになる)
  reasoning_effort: "high" # low / medium / high
});
  • Low: 直感で即答させる(従来のLLMに近い)。
  • High: 徹底的に悩み抜かせる(課金と時間は増えるが、精度は上がる)。

かつて我々は「AIのご機嫌(ランダム性)」を調整していましたが、今は**「AIに与える計算リソース(思考時間)」を管理しています。 「創造性」だと思っていたものは、結局のところ「どれだけ計算コストを支払ったか」**という、極めてドライな資本主義的パラメータに置き換わったのです。


Next Action修正案: OpenAIのAPIで、reasoning_effortlowhigh に変えて同じ難問(フェルミ推定など)を投げてみてください。 「答え」は変わらなくても、そこに至るまでの「待ち時間(思考の深さ)」が劇的に変わる様子を見て、**「知能とは、計算量のことである」**という事実を体感しましょう。

まとめ:AIは「神」ではなく「道具」である

いかがでしたか?

中身を開けてみれば、AI(LLM)は決して魔法のような存在ではありません。

  1. 実体: 巨大な確率統計オートコンプリート。
  2. 理解: 単語をベクトルの座標として計算しているだけ。
  3. 記憶: なし。毎回ログを全送信しているステートレス設計。
  4. 創造: サイコロを振って、たまにレアな単語を選んでいるだけ。

こう理解すると、恐怖心は消え、代わりにエンジニアとしての**「ハック心」**が芽生えてきませんか?

「どうやってコンテキストウィンドウを節約しようか?」

「RAGのベクトル検索の精度をどう上げようか?」

「プロンプトエンジニアリングで確率分布をどう誘導しようか?」

これらはすべて、我々エンジニアの得意分野です。

AIは意思を持った支配者などではなく、**我々が使いこなすべき、ただの「新しい計算機」**に過ぎません。

Studio Puffでは、今後も「AI」を魔法として崇めるのではなく、「技術」として使い倒すための実践的なノウハウを発信していきます。

デジタル体験を、
もっと美しく、機能的に。

Studio Puff では、デザインと技術を融合させた Webサイト制作・システム開発を行っています。
新規プロジェクトのご相談や、技術的な課題解決など お気軽にお問い合わせください。