ChatGPT APIはなぜ「会話」ができるのか? エンジニアが知るべき「記憶」の正体
はじめに:AIは3秒前のことを忘れる
ChatGPTのウェブサイト(ブラウザ版)を使っていると、当たり前のように会話が続きますよね。
「カレーの作り方を教えて」と聞いた後に、「じゃあ、隠し味は何がいい?」と聞けば、当然「カレーの隠し味」を教えてくれます。
しかし、いざエンジニアとして OpenAI API (GPT-4 / GPT-3.5) を使い始めると、衝撃の事実に直面します。
APIは、記憶喪失なのです。
あなた(User): 「私の名前は田中です」
AI(Assistant): 「こんにちは、田中さん!」
(3秒後、次のリクエスト)
あなた(User): 「私の名前は何ですか?」
AI(Assistant): 「申し訳ありませんが、あなたの名前を知りません。」
「えっ、さっき教えたじゃん!」
多くの初学者がここで躓きます。なぜAPI経由だと、AIは一瞬で記憶を失うのでしょうか?
今日はこの「記憶の仕組み」について、エンジニア視点で解き明かします。
原因:HTTPと完全ステートレス
Web開発をしている方なら、**「HTTPはステートレス(Stateless)である」**という言葉を聞いたことがあるでしょう。
OpenAI APIも、まさにこれです。
APIサーバー側(OpenAI側)は、あなたの過去のリクエストを一切保存していません。
ブラウザ版のChatGPTが記憶しているように見えるのは、ブラウザ上のアプリが裏側でよしなにやってくれているだけで、APIという「生の通信」レベルでは、毎回「はじめまして、私はAIです」という状態からスタートしているのです。
これは、50回目のデートだろうが、1000回目のリクエストだろうが変わりません。毎回が初対面です。これが「会話が噛み合わない」原因の正体です。
解決策:「履歴」を毎回すべて送りつける
では、どうすれば「会話」が成立するのでしょうか?
答えは非常にシンプル、かつ**力技(パワープレイ)**です。
「これまでの会話履歴を、全てのリクエストで毎回送りつける」
これしかありません。
API側が覚えてくれないなら、クライアント側(つまり、アプリを作っている私たち)が履歴をデータベースやメモリに保存し、リクエストのたびに「これまでの経緯」をセットにして渡すのです。
具体的なデータの流れ
1ターン目(初対面)
「私は田中」だけを送ります。
// 送信データ
messages = [
{"role": "user", "content": "私の名前は田中です"}
]
2ターン目(名前を聞く)
ここが重要です。「名前は?」だけを送るのではありません。1ターン目の会話も含めて送ります。
// 送信データ(履歴+新規質問)
messages = [
{"role": "user", "content": "私の名前は田中です"}, // ← 過去の記憶
{"role": "assistant", "content": "こんにちは、田中さん!"}, // ← AIの返答履歴
{"role": "user", "content": "私の名前は何ですか?"} // ← 今聞きたいこと
]
こうして初めて、AIは送られてきたリストを見て、
「ふむふむ、過去に『田中』と名乗っていて、AIも挨拶しているな。で、今の質問は名前か。よし、『田中さんです』と答えよう」
と推論できるのです。
これをエンジニア界隈では**「コンテキスト(文脈)の注入」**と呼びます。
落とし穴:雪だるま式に増えるコスト
この仕組みを理解すると、ある「恐ろしい事実」に気づくはずです。
「会話が長くなればなるほど、送信データ量が雪だるま式に増える」
APIの利用料金は、従量課金(トークン課金)です。
「あ」とか「い」とか、文字数(厳密にはトークン数)に応じて課金されます。
つまり、
- 会話履歴を全部送る
- 過去の会話分も、毎回「新品の入力」として課金される
- 会話が続くほど、1回の発言にかかるコストが高くなる
これがAPI開発の落とし穴です。
無限に履歴を送ると、あっという間に「トークン上限エラー」になったり、請求額が跳ね上がったりします。
そのため、実務では「古い会話から削除する」や「過去の会話を要約して圧縮する」といった工夫が必要になるのです。
まとめと実践への誘導
ChatGPT APIが「会話」できる仕組み、謎が解けたでしょうか?
- AI自体は記憶を持っていない(ステートレス)。
- 私たちが「過去ログ」を毎回セットで送ってあげている。
- 会話履歴の管理(保存・追加・削除)こそが、チャットボット開発のキモ。
この概念さえ分かってしまえば、あとは「配列(List)」を操作するプログラムを書くだけです。
📢 実際に作ってみたい方へ
「理屈はわかった。じゃあ実際にPythonでどう書けばいいの?」
「履歴を保存するコードって、具体的にどうなるの?」
そんな方のために、実際に動くCLI(コマンドライン)チャットボットをPythonで作る完全ロードマップを個人のブログにまとめました。
APIキーの取得から、履歴を保持するループ処理の実装まで、環境構築から丁寧に解説しています。コピペで動くコードも用意しているので、手を動かして学びたい方はぜひ挑戦してみてください!