コンテキストウィンドウとは?ChatGPTが前の会話を忘れる理由
画像出典: パブリックドメイン(Wikimedia Commons)
ChatGPTなどのAIは会話を記憶しているのではなく、毎回それまでのやり取り全体を読み直して次の言葉を予測しています。一度に読める量には「コンテキストウィンドウ」という上限があり、会話が長くなると古い部分から順にその枠の外へ押し出され、参照できなくなります。重要な指示は定期的に再掲するか、要点を要約して新しいチャットへ移すのが確実な対処です。
長い相談をしていると、ほぼ必ずこれが起きます。指示の出し方が悪かったのかと思って、もっと強い言い方で書き直してみる。それでもまた戻る。正直なところ、ここでAIを見限ってしまう人はけっこう多いはずです。
でもこれは、AIがあなたの指示を軽んじているわけでも、性能が落ちたわけでもありません。AIには「前の会話を覚えておく」という機能が、そもそも付いていないからです。覚えていないものを思い出させようとしても、うまくいきません。仕組みがわかると、対処のしかたは驚くほど単純になります。
AIは会話を覚えていない。毎回読み直している
まず前提を合わせておきます。私たちが「チャット」と呼んでいる画面は、人と人とのLINEのやり取りに見えます。過去の発言が上に積み上がっていて、相手はそれを踏まえて返事をしている。そう見えるので、AIも同じように「話した内容を覚えている」と考えるのが自然です。
ここが実際とは違います。AIの側には、会話を保存しておく記憶装置がありません。あなたが新しいメッセージを送るたびに、サービスはその会話の最初からのやり取り全部を、一つの長い文章としてAIに丸ごと渡し直しています。AIはそれを毎回まっさらな状態で読み、続きにふさわしい言葉を予測して返す。次のメッセージでも、また最初から読み直す。この繰り返しです。
会議のたびに記憶を失う相談相手に、毎回これまでの議事録を全部渡して読んでもらっている、と考えるとイメージが近くなります。相手は議事録に書いてあることなら何でも答えられますが、議事録に載っていないことは知りようがありません。
コンテキストウィンドウとは何か
ここで問題になるのが、その「毎回渡す議事録」の分量です。AIが一度に読める文章の量には上限があります。これをコンテキストウィンドウ(文脈の窓)と呼びます。応答を作るときに一度に考慮できる、入力と出力を合わせた最大量のことです。
単位は文字数ではなくトークン(AIが文章を処理するときの細かい単位。日本語だと1文字がおよそ1〜3トークンに分かれます)で数えます。たとえばGPT-4は公開当初8,192トークンでしたが、その後拡張され、GPT-4 TurboとGPT-4oでは128,000トークンになりました(GPT-4oの最大出力は16,384トークン)。世代ごとに数値は変わるので、正確な値はOpenAIの公式モデル一覧で確認してください。
枠としては大きいのですが、注意したいのは日本語がこの枠を消費しやすいという点です。英語はおおむね1単語が1トークンに近い形で収まる一方、日本語はひらがなで1文字あたり1〜2トークン、漢字では1文字あたり最大3トークンに分かれることがあります。同じ「1万文字」でも、日本語のほうが枠を多く食う。長い資料を貼り付けながら相談していると、体感より早く上限に近づきます。
なぜ古い指示から消えるのか
会話が進むと、毎回渡される議事録はどんどん長くなります。そして合計トークン数がコンテキストウィンドウの上限を超えると、古いやり取りから順に枠の外へ押し出され、AIから参照できなくなります。これが「前の指示を忘れる」現象の正体です。
大事なのは、押し出された内容が「うろ覚えになる」のではないということです。AIはその時点で枠に入っているテキストだけを見て次の言葉を予測しているので、枠から外れた部分は最初から存在しなかったのと同じ扱いになります。だから「さっき言ったよね?」が通じません。AIから見れば、その発言はどこにも書かれていないのです。
そして厄介なのが、会話の冒頭こそ最初に押し出されるという点です。「敬語は使わないで」「前提はこの条件で」といった全体に効かせたいルールほど、会話の最初に書く。つまり、いちばん長く効いてほしい指示が、いちばん先に消えていく構造になっています。
ChatGPTなどには、会話をまたいでユーザーの情報を覚えておく機能が別途用意されています。ただしそれは、あらかじめ保存された要点を次の会話の頭に差し込む仕組みであって、進行中の長い会話の中身が丸ごと保持されるわけではありません。ひとつのチャットが長くなったときの押し出しは、メモリ機能があっても起こります。
忘れさせない会話の組み立て方
仕組みがこうである以上、対処の方針はひとつに絞られます。大事な情報を、常に枠の中に残しておくこと。具体的には次の手順になります。
- ルールは短く、箇条書きで冒頭に置く「敬語なし」「専門用語には一言補足」のように、守ってほしい条件を長文の説明ではなく短い箇条書きにします。短いほど、あとで再掲するコストが下がります。
- 10〜20往復を目安に、ルールだけ再掲する「(再掲)敬語なし・箇条書きは3項目まで」のように一行貼るだけで十分です。再掲した瞬間、そのルールは枠のいちばん新しい場所に入り直します。
- おかしくなったら、まずAIに要約させる「ここまでの決定事項と前提を、箇条書きで10行以内にまとめて」と頼みます。まだ枠に残っている情報のうち、必要な部分だけを圧縮して取り出す作業です。
- 要約を持って新しいチャットへ移る取り出した要約を新しいチャットの冒頭に貼り、そこから続けます。枠がリセットされ、要点だけが最初に入った状態から再スタートできます。
4番目が、いちばん効きます。長くなった会話を粘って立て直すより、要点だけ持って引っ越すほうが速く、結果も安定します。会話を捨てているように感じるかもしれませんが、AIにとっての会話は元から「毎回渡される議事録」なので、議事録を作り直しているだけです。
逆に、やっても効果が薄いこと
- 「さっきの指示を思い出して」と頼む — 枠の外にあるものは思い出せません。もう一度書くほうが確実です
- 強い言い方に変える(「絶対に」「必ず」) — 押し出されてしまえば、強さは関係なくなります
- 長い前提説明を毎回そのまま貼り直す — 枠を大きく消費し、押し出しを早めます。圧縮した箇条書きにします
- 関係のない長文資料を会話に貼りっぱなしにする — 使い終わった資料は、新しいチャットに移るときに持ち込まない
長い資料を扱うときの考え方
報告書や議事録など、そもそも長いものを読ませたい場合は、会話の作り方を変えたほうがうまくいきます。
ひとつの会話で「資料を貼る→質問→追加で別の資料を貼る→また質問」と積み上げていくと、枠はあっという間に埋まります。そうではなく、資料1本につき会話1本に分け、それぞれで要点を出させる。最後に、出てきた要点だけを新しい会話にまとめて貼り、そこで統合の作業をさせます。渡す量が減るぶん、精度も落ちにくくなります。
どのくらいの量なのかを事前に知りたいときは、OpenAIが公開しているTokenizer(platform.openai.com/tokenizer)にテキストを貼り付けると、そのままトークン数を確認できます。文字数の感覚とどれくらいズレるかを一度見ておくと、以降の見積もりが安定します。
結局のところ、AIとの長い会話は「記憶力を期待する相手」ではなく「毎回きちんと資料を渡す相手」として扱うと安定します。覚えていてほしいことは、覚えさせるのではなく、置いておく。これだけで、長い会話の途中で崩れることはかなり減ります。
よくある質問
コンテキストウィンドウとは何ですか?
AIが応答を作るときに一度に考慮できる、入力と出力を合わせたテキストの最大量のことです。トークンという単位で数え、GPT-4 TurboとGPT-4oでは128,000トークンです(GPT-4oの最大出力は16,384トークン)。この上限を超えると、古いやり取りから順に参照できなくなります。
ChatGPTが前の会話を忘れるのはバグですか?
バグではなく仕様です。AIは会話を記憶しているのではなく、毎回それまでのやり取り全体を読み直して次の言葉を予測しています。合計のトークン数がコンテキストウィンドウの上限を超えると、古い部分が枠の外へ押し出され、参照できなくなります。
日本語は英語よりコンテキストウィンドウを消費しますか?
はい、消費しやすい傾向があります。英語はおおむね1単語が1トークンに近い形で収まる一方、日本語はひらがなが1文字あたり1〜2トークン、漢字が1文字あたり最大3トークンに分かれることがあります。同じ文字数でも日本語のほうがトークン数が多くなります。
長い会話で指示を守らせるにはどうすればいいですか?
守ってほしいルールを短い箇条書きにして、10〜20往復ごとに一行で再掲するのが有効です。それでも崩れる場合は、AIに「ここまでの決定事項と前提を10行以内で」と要約させ、その要約を新しいチャットの冒頭に貼って続けると安定します。
※記事で使用した内容・数値は変更される場合があります。最新情報は公式サイトをご確認ください。