0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPT APIはなぜ「会話」ができるのか? エンジニアが知るべき「記憶」の正体

Posted at

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. 会話履歴を全部送る
  2. 過去の会話分も、毎回「新品の入力」として課金される
  3. 会話が続くほど、1回の発言にかかるコストが高くなる

これがAPI開発の落とし穴です。
無限に履歴を送ると、あっという間に「トークン上限エラー」になったり、請求額が跳ね上がったりします。

そのため、実務では「古い会話から削除する」や「過去の会話を要約して圧縮する」といった工夫が必要になるのです。

まとめと実践への誘導

ChatGPT APIが「会話」できる仕組み、謎が解けたでしょうか?

  1. AI自体は記憶を持っていない(ステートレス)。
  2. 私たちが「過去ログ」を毎回セットで送ってあげている。
  3. 会話履歴の管理(保存・追加・削除)こそが、チャットボット開発のキモ。

この概念さえ分かってしまえば、あとは「配列(List)」を操作するプログラムを書くだけです。

📢 実際に作ってみたい方へ

「理屈はわかった。じゃあ実際にPythonでどう書けばいいの?」
「履歴を保存するコードって、具体的にどうなるの?」

そんな方のために、実際に動くCLI(コマンドライン)チャットボットをPythonで作る完全ロードマップを個人のブログにまとめました。

APIキーの取得から、履歴を保持するループ処理の実装まで、環境構築から丁寧に解説しています。コピペで動くコードも用意しているので、手を動かして学びたい方はぜひ挑戦してみてください!

Pythonで「記憶を持った」CLIチャットボットを作るまでの1週間【GenAIOpsロードマップ Week 1】

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?