Paměť konverzace

Historie, shrnování, dlouhodobá paměť.

Co se naučíš: Budeš umět udržet konverzaci v mezích okna pomocí shrnování a výběru historie.

5 min čtení + cvičeníNavazuje na:🪟 Kontextové okno

Model je bezstavový, „paměť“ je iluze, kterou vyrábí tvoje aplikace tím, že mu při každém volání pošle historii. Otázka tedy nezní jestli si pamatovat, ale co poslat a co zahodit, aby se to vešlo do okna a nestálo majlant.


Nejjednodušší varianta: posílej všechno

Funguje překvapivě dlouho, u krátkých konverzací je to správná volba. Rozbije se ve chvíli, kdy historie začne přetékat okno nebo když si všimneš, že desátá zpráva stojí desetkrát víc než první.

zpráva 1:  [system, u1]                       →  400 tokenů
zpráva 10: [system, u1,a1,…,u10]              →  6 000 tokenů

Klouzavé okno

Nech systémový prompt a posledních N zpráv, starší zahoď.

  • Plus: triviální, levné, předvídatelné.
  • Minus: model „zapomene“ začátek, třeba to, jak se uživatel jmenuje nebo co si na začátku vymínil.

💡 Systémový prompt posílej vždycky, i když ořezáváš. Právě jeho ztráta je nejčastější příčina toho, že chatbot po chvíli přestane dodržovat pravidla.


Cvičení

  1. Konverzace má 40 výměn a přestává se vejít do okna. Porovnej tři strategie: useknout začátek, shrnout starší část, hledat v historii podle relevance.
  2. Uživatel na začátku řekne „mluv se mnou anglicky“ a po třiceti zprávách model přejde do češtiny. Co se stalo?
Náčrt řešení: rozbal, až si cvičení zkusíš sám
  1. Useknutí je nejlevnější a nejhloupější, shrnutí je dobrý kompromis, retrieval nad historií je nejlepší a nejdražší. Useknutí začátku zahodí i trvale platné instrukce ze začátku konverzace. Shrnutí je udrží, ale ztrácí detaily a stojí volání navíc. Hledání v historii podle relevance přinese zpátky i starou zprávu, která je zrovna potřeba, ale je to celý další RAG se vším, co k tomu patří. Většině aplikací stačí: systémová zpráva a posledních N výměn doslova, starší část jako průběžně aktualizované shrnutí.
  2. Instrukce vypadla z okna nebo se utopila. Buď ji useklo zkracování historie, nebo je pořád v kontextu, ale třicet zpráv v češtině ji přehlasovalo. Trvale platné instrukce proto nepatří do první uživatelské zprávy, ale do systémové zprávy, která se posílá při každém volání. Viz zprávy a role.

Shrnutí staršího (rolling summary)

Když historie naroste, nech model shrnout starší část do několika vět a dál pracuj se shrnutím:

[system]
[shrnutí konverzace: Uživatel je Matěj, řeší reklamaci kola zn. X koupeného 3. 4.,
 už mu byl vystaven štítek, čeká na vyzvednutí.]
[posledních 6 zpráv v plném znění]

Ušetří to spoustu tokenů a zachová podstatu. Pozor na dvě věci: shrnutí ztrácí detaily (čísla, jména si nech vypsat explicitně) a shrnutí shrnutí se postupně rozpadá, takže si drž i strukturovaný záznam.


Fakta mimo konverzaci

Nejlepší paměť často není v kontextu, ale ve tvé databázi. Co si má aplikace pamatovat dlouhodobě (jméno, jazyk, tarif, otevřené objednávky), ulož jako data a vlož do systémového promptu jen relevantní výtah:

Uživatel: Matěj, tarif Premium, jazyk čeština.
Otevřené objednávky: 4821 (odeslána), 4902 (čeká na platbu).

Tohle je spolehlivější než doufat, že si to model odvodí z historie a levnější, protože posíláš pár desítek tokenů místo celé konverzace.


Dlouhodobá paměť přes vyhledávání

U asistentů, kteří běží měsíce, se používá kombinace: staré konverzace se uloží jako chunky do vektorové databáze a při nové zprávě se vyhledá jen to relevantní. Je to vlastně RAG nad vlastní historií.

⚠️ Tady pozor na soukromí: ukládat konverzace znamená ukládat osobní údaje. Musíš mít důvod, lhůtu a možnost smazání, viz bezpečnost dat.


Doporučená kombinace

Pro běžnou aplikaci se osvědčí tohle:

  1. systémový prompt (vždy),
  2. strukturovaná fakta o uživateli z databáze (pár řádků),
  3. shrnutí starší části konverzace,
  4. posledních 5–10 zpráv v plném znění.

Shrnutí

  • Paměť dělá tvoje aplikace, ne model. Rozhoduješ, co poslat.
  • Systémový prompt posílej vždy; ořezávej jen prostředek historie.
  • Dlouhé konverzace shrnuj, ale strukturovaná fakta drž v databázi.
  • Dlouhodobou paměť řeš vyhledáváním v uložených konverzacích, ne posíláním všeho.
Chatbot po půl hodině konverzace přestane oslovovat uživatele jménem a ignoruje pravidla. Proč?

Historie přerostla okno a ořezala se, spolu se začátkem konverzace zmizel i systémový prompt a úvodní informace. Systémový prompt patří do každého volání a důležitá fakta (jméno, tarif) se mají držet mimo konverzaci, ve strukturované podobě.

Jaká je nevýhoda shrnování starší části konverzace?

Shrnutí ztrácí detaily, čísla objednávek, přesné formulace, jména. A opakované shrnování shrnutí kvalitu dál degraduje. Proto se konkrétní údaje drží zvlášť jako strukturovaná data, ne jen ve volném textu shrnutí.

Asistent má fungovat měsíce a pamatovat si dřívější konverzace. Jak na to?

Uložit starší konverzace jako chunky do vektorové databáze a při každé nové zprávě vyhledat jen relevantní kousky, tedy RAG nad vlastní historií. Posílat všechno by nešlo kvůli oknu i ceně. Zároveň je potřeba ošetřit retenci a mazání osobních údajů.