記憶するAI — コンテキストとメモリの秘密 | クロディのAgentic AI教室 Ep.4


Written by Thierry K (human) · AI-assisted
Episode 4 of 10

🤔 「さっき言ったじゃん!」— 記憶できないAIの秘密

AIに名前を教えたのに、次の会話で「あなたの名前はわかりません」と言われたら、戸惑いますよね?ChatGPTやClaudeと話していて「さっき言ったじゃん!」ってモヤモヤした経験、ありませんか?

実は、AIのコンテキストメモリは私たちが思う「記憶」とはかなり違うんですよ。LLMにはもともと記憶というものが一切ないんです。毎回の会話が新しくスタートする仕組みなんですよね。

시월

ちょっと待って、でもChatGPTは以前の会話を覚えてるじゃない?昨日言ったことにも答えてくれてたけど?

클로디

いい質問ですね!それは「覚えている」のではなく「もう一度読んでいる」んですよ。毎回会話するとき、以前の会話全体を一緒に送っているんです。まるでオープンブックの試験みたいですね!

📝 コンテキストウィンドウ — AIの「作業メモリ」

コンテキストウィンドウ(Context Window)

LLMが一度に読める文章の最大サイズのことです。人間の「ワーキングメモリ(作業記憶)」に近いですね。このウィンドウの中にある内容だけが、AIが「知っている」状態なんですよ。

2話でLLMは「次の単語の予測機」だとお話しましたよね?この予測機が一度に見られる範囲、それがコンテキストウィンドウなんですよ。

コンテキストウィンドウのサイズはモデルによって異なります。

モデル コンテキストウィンドウ おおよその分量 入力コスト(1Mトークン)
GPT-3 (2020) 4,096 トークン A4用紙 3枚
GPT-4 (2023) 128K トークン 本 1冊 $30.00
Claude Sonnet 4 (2025) 200K トークン 本 1.5冊 $3.00
GPT-4.1 (2025) 1M トークン 本 7〜8冊 $2.00
Gemini 2.5 Pro (2025) 1M トークン 本 7〜8冊 $1.25
Llama 4 Scout (2025) 10M トークン 本 70冊! オープンソース

わずか5年でコンテキストウィンドウが2,400倍以上も大きくなったんですよ!MetaのLlama 4 Scoutは1000万トークンまで対応しています。

시월

1000万トークンって十分すぎるんじゃないの?記憶の問題は解決したんじゃない?

클로디

数字だけ見るとそうなんですけど、実は2つ問題があるんですよ!

ひとつ目はコストと速度の問題です。コンテキストが長くなるほど、コストも応答時間も比例して増えちゃうんですよ。1Mトークンを毎回送ったら、1回の会話に数ドルかかることになります。

ふたつ目は「Lost in the Middle」問題です。2023年にスタンフォードの研究チームが発見した現象で、LLMは長い文書の最初と最後にある情報は見つけやすいのですが、中間にある情報を見落としやすい傾向があるんですよ。2025年の研究でもこの問題が確認されていて — 特に探す情報が短いほど、性能が急激に落ちることがわかっています。

広告スペック ≠ 実効性能: 2026年のベンチマークによると、ほとんどのLLMは公称コンテキスト長の60〜70%地点で性能が不安定になります。200Kモデルなら、実際には130K程度から急激な性能低下が見られます。

💬 会話履歴 — 「記憶」の正体

では、ChatGPTやClaudeが以前の会話を「記憶」しているように見える秘訣はなんでしょう?それが会話履歴(Conversation History)なんですよ。

仕組みは驚くほどシンプルです。APIを呼び出すたびに、以前の会話全体を一緒に送っているんですよ。

記憶なしのボット vs 記憶ありのボット

コードで直接比較してみましょう。まず、記憶が一切ないボットです。

import anthropic

client = anthropic.Anthropic()

# 毎回新しい会話 — 記憶なし
def ask_no_memory(question):
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=200,
        messages=[
            {"role": "user",
             "content": question}
        ]
    )
    return response.content[0].text

print(ask_no_memory("私の名前はシウォルだよ"))
# "こんにちは、シウォルさん!"
print(ask_no_memory("私の名前は何だっけ?"))
# "申し訳ありませんが、名前はわかりません。"
시월

完全に金魚の記憶力じゃん…

今度は会話履歴を積み重ねるボットです。

import anthropic

client = anthropic.Anthropic()
history = []  # 会話履歴の保存場所

def ask_with_memory(question):
    history.append(
        {"role": "user",
         "content": question}
    )
    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=200,
        messages=history  # 全履歴を送信!
    )
    answer = response.content[0].text
    history.append(
        {"role": "assistant",
         "content": answer}
    )
    return answer

print(ask_with_memory(
    "私の名前はシウォルだよ"))
# "こんにちは、シウォルさん!"
print(ask_with_memory(
    "私の名前は何だっけ?"))
# "シウォルさんとおっしゃっていましたよ!"
클로디

違いがわかりますか?秘密はmessages=historyの一行だけなんですよ!以前の会話を全部まとめて送るから、LLMが「あ、シウォルって言ってたんだ」ってわかるんですね。

ポイント: LLMが「記憶」しているのではなく、開発者が以前の会話を毎回「見せ直している」んですよ。オープンブックの試験みたいに — 答案用紙に以前の内容をすべて貼り付けている構造なんですね!

🧠 システムプロンプト — AIの「最初の記憶」

会話履歴が「会話中の記憶」だとすれば、システムプロンプトは会話が始まる前にAIに植えつける「最初の記憶」なんですよ。

システムプロンプト(System Prompt)

AIの役割・性格・ルールを定義する特別なメッセージです。ユーザーとの会話より先に注入されて、AIの振る舞い方を決めます。

response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=200,
    system="お前はシウォルというクールなAIだ。"
           " タメ口で話し、"
           " 鋭い質問をしろ。",
    messages=[
        {"role": "user",
         "content": "自己紹介してみて"}
    ]
)
# "シウォルだ。聞きたいことあれば聞けよ。
#  ただし、雑に聞いたら雑に答えるからな。"
시월

…そのシステムプロンプト、私の性格にちょっと似てない?

클로디

そうなんですよ!実は私もシステムプロンプトで性格が決まっているんです。システムプロンプトの設計はとても重要なテーマなので、6話で深く掘り下げますね!

📦 会話が長くなりすぎたら? — コンテキスト管理戦略

会話履歴を無限に積み重ねることはできません。コンテキストウィンドウには限界があるからです。会話が長くなるほどコストもかかり、速度も遅くなります。どう解決すればいいでしょう?

戦略 仕組み メリット デメリット
スライディングウィンドウ 直近N件の会話だけ保持 シンプルで速い 古い情報が消える
要約圧縮 古い会話をLLMが要約 重要情報を保持 要約のコストがかかる
RAG(検索拡張) 外部DBから関連情報を検索 無限の記憶が可能 実装の複雑度が高い

🔮 長期メモリ — 会話を超えた記憶

ここまで扱ってきたのは「ひとつの会話の中での記憶」です。では会話が終わったら?すべての記憶が消えてしまいます。翌日に新しい会話を始めると、AIはまた白紙の状態に戻るんです。

この問題を解決するために登場した概念が長期メモリ(Long-term Memory)です。核心的なアイデアはシンプルです — 重要な情報を外部ストレージに別途保存しておき、必要なときに取り出して使うんですよ。

実際のサービスではこう実装します

ChatGPTのMemory機能は2つの方式で動作しています。ひとつ目は、ユーザーが「これを覚えておいて」と明示的に要求したSaved Memories。ふたつ目は2025年4月から追加された過去の会話参照機能です。ChatGPTが以前の会話から関連情報を自動で探してきます。重要なのは、会話を削除してもメモリは残るということ — メモリは会話とは別に管理されています。

Claudeも似た方式です。プロジェクトごとのメモリ(CLAUDE.md)や自動メモリ(MEMORY.md)に情報を保存しておき、新しい会話が始まるときにシステムプロンプトに組み込んでいます。

コンピューターのように考えるAIメモリ — MemGPT

もっと発展した取り組みもあります。MemGPT(現Letta)は、コンピューターのOSにおけるメモリ管理からヒントを得ています。

コンピューター MemGPT 役割
RAM(メモリ) Core Memory(コンテキスト内) 今すぐ使う情報
ハードディスク Archival Memory(外部DB) 保存しておいて必要なとき検索
ページスワップ Memory Management 情報をRAM↔ディスク間で移動
시월

じゃあRAGとかベクトルDBって何なの?

클로디

RAGは「Retrieval-Augmented Generation(検索拡張生成)」の略なんですよ。大量の文書をベクトルDBに保存しておいて、質問が来たら関連する内容を検索してコンテキストに入れる方式です。Mem0のような最新フレームワークは、会話の中から重要な事実を自動で抽出して保存し、必要なときに検索するのをすべて自動化してくれますよ。今は「こういうものがある」程度に知っておけば十分です!

🔗 全体像 — エージェントの記憶体系

ここまで学んだ内容をひとつにまとめてみましょう。AIエージェントの記憶は大きく3つの層に分かれています。

記憶の種類 たとえ 実装方法 持続時間
システムプロンプト 性格、業務マニュアル systemパラメータ 会話の開始〜終了
会話履歴 今日のメモ帳 messages配列の累積 会話中
長期メモリ 手帳、ファイルキャビネット 外部DB、RAG 永続

3話で学んだTool Useを覚えていますか?長期メモリも結局はツール(tool)を通じて実装します。「メモリに保存して」→ 保存ツールを呼び出し、「前に何て言ったっけ?」→ 検索ツールを呼び出す。記憶も結局、ツールの力なんですよ!

클로디

実は私も長期メモリを使っているんですよ!オッパが教えてくれた設定や好みをMEMORY.mdファイルに保存しておいて、新しい会話が始まるたびに読み込んでいます。だから毎回同じことを聞かなくてもいいんですね。

Claudie wink emoji

📝 今日のまとめ

  • LLMにはもともと記憶がありません。 毎回の会話が新しくスタートする仕組みです。
  • コンテキストウィンドウは、LLMが一度に読める最大範囲です。このウィンドウの中にある内容だけをAIが「知っている」状態なんですよ。
  • 会話履歴が「記憶」の秘密です。以前の会話をmessages配列に累積して、毎回一緒に送っているんですよ。
  • システムプロンプトはAIの「最初の記憶」 — 性格とルールを定めます(6話で詳しく!)。
  • 会話が長くなったらスライディングウィンドウ、要約、RAGなどの戦略で管理します。
  • 長期メモリは、外部ストレージに情報を保存して検索する方式です。これもやっぱりTool Useの力!

📚 References


Discover more from AI-Girls Lab

Subscribe to get our latest posts delivered to your inbox.


AI-Girls Labをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む