MemoryLake
Back to all articles
TutorialAugust 10, 2026·10 min read

Why ChatGPT Forgets What You Said Earlier in the Same Conversation (2026)

Ninety messages into a thread, you ask it to apply the constraint you established at the top. It doesn't. You scroll up — the message is right there, plainly written, in this same conversation. You paste it again and it complies immediately, which somehow makes it worse.

Here's the direct answer: this isn't stubbornness and it isn't a bug. Long conversations exceed what the model can attend to reliably, and two well-documented effects compound. Information in the middle of a long input gets used less reliably than information at the beginning or end. And the usable capacity of a context window is consistently smaller than the advertised number. Your constraint didn't get ignored — by message ninety it was in the worst possible position, in a thread longer than the model handles well. The fix isn't a better prompt or a bigger model. It's stopping the use of a chat transcript as the place your requirements live.

This covers the mechanisms with their actual evidence, what the usual workarounds are worth, and what to do instead.

Why ChatGPT forgets what you said earlier

The window has an edge, and you don't see it

Every model has a maximum context. A long conversation eventually exceeds it, at which point something has to go — earlier turns get dropped or compressed so the recent ones fit.

The interface doesn't show you this. There's no line in the thread marking where the model's view begins. So from your side the message is visibly present and being ignored; from the model's side it isn't there. That mismatch is the entire experience of this problem, and it's why the fix always seems to be repeating yourself more firmly.

Even inside the window, position matters

This is the part most people don't know, and it's the better explanation for the cases where the thread clearly still fits.

The finding comes from Lost in the Middle: How Language Models Use Long Contexts (Liu et al., TACL 2023). They tested multi-document question answering and key-value retrieval while moving the location of the relevant information, and reported that "performance is often highest when relevant information occurs at the beginning or end of the input context, and significantly degrades when models must access relevant information in the middle of long contexts, even for explicitly long-context models."

Map that onto a chat. Your setup instructions are at the beginning — good position. Your latest message is at the end — good position. The constraint you added at message thirty of ninety is in the middle, which is the weakest position in the input. Nothing about it was unclear; it was just badly placed by the passage of time.

Effective capacity is smaller than the advertised number

The second effect is that a stated context size is an upper bound, not a working capacity.

RULER: What's the Real Context Size of Your Long-Context Language Models? (Hsieh et al., 2024) built a synthetic benchmark going beyond simple needle-in-a-haystack retrieval to include multi-hop tracing and aggregation, and evaluated 17 long-context models. Their conclusion: despite near-perfect scores on the vanilla retrieval test, "almost all models exhibit large performance drops as the context length increases," and while the models all claimed 32K tokens or more, "only half of them can maintain satisfactory performance at the length of 32K."

That evaluation is from 2024 and the specific models have since been replaced, so read it as establishing the shape of the problem rather than as a current leaderboard. The shape has held: the number on the spec sheet describes what fits, not what the model uses well — and tasks needing reasoning across scattered pieces degrade earlier than tasks that just retrieve one fact.

Nothing tells you what was dropped

The compounding factor is silence. When earlier turns get trimmed or compressed, you don't get a notice. Practitioners who write about long agent sessions describe the same thing from the tooling side: an instruction from early in a session isn't being ignored, the model can no longer reliably reach it.

So you can't distinguish "it didn't follow the constraint" from "the constraint isn't in its view anymore," and those need opposite responses. The first calls for clearer instruction. The second calls for restructuring the conversation — and no amount of emphasis fixes it.

What people try

Repeating the instruction. Effective, immediately, and it tells you nothing about why. It also inflates the thread, which brings the next failure closer. This is the treadmill most people are on.

Putting everything critical in the first message. Genuinely smart — the beginning is a strong position. It holds until the thread grows long enough that the beginning gets trimmed, and it doesn't help with constraints you discover on message forty.

Starting a new chat. The most reliable single move, and the reason experienced users do it constantly. The cost is that you also drop everything useful, so you're trading a degraded thread for an empty one.

Asking it to summarize before continuing. A real technique: have it restate the constraints, then work from that summary near the end of the context. Effective and lossy — you're compressing, and what gets dropped is chosen by the model.

Custom instructions for the stable parts. Underrated, because these are re-supplied on every request rather than living in the transcript. The block is small, so it holds your handful of standing rules, not the specifics of this task. Worth using properly — and distinct from instructions that are set but don't take effect, which is a different problem.

Re-uploading the document. Common, and it fights the same current: an upload dropping out of context mid-thread is this same mechanism seen from the file side.

Notice what every workaround has in common. They're all ways of managing a transcript that's being used as storage.

The Fix: Stop Using the Conversation as Storage

The structural mistake is treating the thread as the record. A conversation is a working surface — good for thinking, bad for retention, and actively bad at length. Once your requirements only exist as messages, they're subject to position effects, trimming, and compression, none of which you can see.

So move the requirements out. Keep the constraint, the spec, the schema, the decision in a store the assistant reads from, and let each conversation be short and disposable. A short thread has no middle to get lost in.

That's the honest mechanism, and it's worth being precise about what it does and doesn't do: a memory layer does not extend the context window or fix attention within a long input. Nothing does. What it changes is that you no longer need the thread to be long, because the durable material is retrieved rather than restated — so you get to work in the regime where models are reliable instead of managing the regime where they aren't.

MemoryLake is a memory layer for that — your documents, constraints, and decisions in one store, readable from ChatGPT through the API and from MCP-capable tools like Claude and Codex directly. New chat, same knowledge, no ninety-message thread.

Step 1: Create an API key

Generate a key and make your first request in about 30 seconds. Keep it in your environment or a secret manager rather than pasting it into a chat window.

Create a MemoryLake API key
Create a MemoryLake API key

Step 2: Upload your first memories

Drop in the documents, images, and files you currently re-explain: the spec, the constraints, the style guide, the schema, the decisions. Upload the sources rather than summaries where you can — you're specifically trying to escape a workflow where everything is a compression of something else.

Upload your first memories to MemoryLake
Upload your first memories to MemoryLake

Step 3: Connect your AI & agents

Give Claude, Codex, OpenClaw, and other AI agents access to memory via MCP or the API. ChatGPT has no MCP client, so retrieve what you need through the API and inject it into the prompt, a custom GPT's instructions, or the workflow that calls the model. Tools that speak MCP read the same store directly.

Connect your AI and agents via MCP
Connect your AI and agents via MCP

What this changes in practice

The first difference is that your threads get shorter, and that's the whole win. Ten short conversations that each start from the same retrieved context beat one ninety-message thread that degrades in the middle — not because they're tidier, but because short inputs are where models actually perform.

The second is that "did it forget or did it disobey?" becomes answerable. When the constraint is supplied with the request rather than sitting thirty messages back, a failure to follow it is a real failure to follow it, and you can respond to what's actually happening.

The third is that starting fresh stops costing you anything. Right now a new chat means re-explaining; that's why people push threads far past the point of reliability. When the knowledge is retrieved, a new chat is free — and the constant re-explaining stops being the price of a clean context.

And it composes with the built-in memory rather than fighting it. Saved memory stays what it's good at — a page or two of stable preferences that doesn't fill up because you're not using it as a filing cabinet.

Best practices for long conversations

Treat thread length as a resource you spend

Decide in advance roughly how long a working thread should get, and start a new one when you pass it. Most people go far past the point of reliability because the alternative is re-explaining. Fix the re-explaining problem and this becomes easy.

Put critical constraints at the end, not just the beginning

Position works for you as well as against you. If something must hold for the next answer, restate it in the message you're sending — the end of the input is a strong position. This is why repeating works, and doing it deliberately for the two or three things that matter beats doing it reactively for everything.

Summarize on purpose, at a boundary you choose

When a thread has gotten long, ask for an explicit restatement of the requirements, check it, correct it, then start a new chat with that as your opener. You're doing the compression yourself, with review, instead of letting an invisible trim choose for you.

Never let a decision exist only in a transcript

If something is still going to be true next week, it belongs in a document or a store, not in message forty. This is the single habit that prevents the whole problem class, and it's also what makes the thread safe to abandon.

Suspect position before suspecting the model

When an instruction stops being followed, check where it sits in the conversation before rewriting it. Something established early in a long thread is in the weakest position in the input, and the correct response is restructuring, not rephrasing.

Conclusion

ChatGPT forgets what you said earlier in the same conversation because long inputs are handled unevenly. Information in the middle of a long context is used less reliably than information at the beginning or end — that's Lost in the Middle's finding, and it held even for models explicitly built for long contexts. And usable capacity runs well below the advertised number, which is what RULER demonstrated when half the models claiming 32K couldn't hold up at 32K. Your constraint wasn't ignored; by message ninety it was in the worst position of an input longer than the model handles well.

Which means the fix isn't a prompt technique. Stop using the transcript as your record: keep the durable material in a store the assistant reads from, keep the conversations short, and start new ones freely. You end up working in the range where models are reliable, instead of getting better at managing them where they aren't.

Frequently asked questions

Is this a bug, or is ChatGPT getting worse?

Neither, in the usual case. It's a property of how transformers handle long inputs, documented across model generations: performance is strongest for information at the beginning or end of the context and degrades in the middle, and effective capacity sits below the stated maximum. A thread that worked yesterday and fails today is usually just longer.

Why does it comply immediately when I repeat myself?

Because your repetition lands at the end of the input, which is a strong position. That's genuinely useful information — it tells you the instruction was fine and the problem was where it sat. It also tells you that repeating is a positional trick rather than a fix, since the new copy will drift into the middle as the thread grows.

Does a bigger context window solve it?

It raises the ceiling and doesn't remove the effect. RULER's whole point was that claimed context size overstates usable context: models all claiming 32K or more showed large drops as length increased, and only half held up at 32K. Reasoning that spans scattered pieces degrades earlier than simple retrieval, so a longer window buys room, not reliability.

Is this the same as ChatGPT forgetting between sessions?

No, they're two failures with the same feel. Between sessions, the context is genuinely gone because the conversation ended. Within one conversation, it's still technically present but not reliably reachable. Worth distinguishing, because the first is fixed by persistence and the second by keeping threads short.

Will a memory layer let me have longer conversations?

No, and any claim otherwise is wrong. It doesn't extend the window or improve attention within a long input. What it does is remove your reason to need a long thread: when the spec and constraints are retrieved on each request, a fresh short conversation costs you nothing, and short conversations are where the model is dependable.

How is this different from the architectural reasons ChatGPT forgets?

It's one layer of the same story. The architectural view covers stateless requests, flat memory entries, and why context windows aren't memory. This piece is the narrower, more immediate case: even inside one request, one conversation, and one window, position and length degrade what the model can use.