Přejít na obsah
6. března 2026|~30 min čtení

Jak dát AI dlouhodobou paměť

Kompletní architektura hierarchické paměti pro AI chat a agent systémy. Vše s reálným kódem — Firebase, TypeScript, Claude API, Gemini API.

AIArchitekturaFirebaseTypeScriptRAG

01Proč hierarchická paměť

Velké jazykové modely mají omezené context window. Jakmile konverzace překročí limit, starší zprávy vypadnou z promptu.

  • Model zapomíná kontext
  • Uživatel musí opakovat informace
  • Konverzace se stávají nekonzistentní
  • Náklady na tokeny rostou exponenciálně

Řešení není větší context window. Efektivnější přístup je hierarchická paměť — ukládá dlouhodobé informace, komprimuje historii, zachovává aktuální kontext. Výsledek: prakticky nekonečná konverzace bez nekonečných tokenů.

02Princip — analogie s počítačem

Hierarchická paměť funguje stejně jako paměť v počítači. Každá vrstva má jinou rychlost, kapacitu a účel.

memory-layers
CPU Cache → Message Buffer (overlap + nové zprávy)
RAM → Chat Summary (komprimovaná historie)
Disk → Cross-Chat Memory (dlouhodobá znalostní báze)

03Celková architektura systému

Po každé zprávě:

  • Context Builder sestaví prompt ze všech paměťových vrstev
  • Model Router vybere optimální model
  • LLM generuje odpověď
  • Na trigger zprávě (např. každých 100 zpráv) se na pozadí spustí sumarizace
MEMORY LAYERSMessage BufferL1 Cacheoverlap + new messagesChat SummaryRAMrecursive compressionCross-Chat MemoryDiskimportance scoringstackprefsdecisionsPROCESSINGContext Builder1. system_prompt2. user_memory3. chat_summary4. buffer (overlap+new)5. current_msgModel Routerfast | reasoningOUTPUTLLMClaude Sonnet 4.6Gemini FlashResponse→ delivered to userBACKGROUNDsummarizer → memory firewall → db update

04Context Builder

Context Builder sestavuje prompt. Pořadí je důležité — model ignoruje informace uprostřed dlouhého promptu (recency bias). Proto je struktura striktně definovaná.

context-example.txt
// System prompt po sestavení Context Builderem:

Jsi AI asistent...

## User Memory (cross-chat)
"[{\"fact\":\"Projekt e-shop, stack: Next.js + Firebase\",\"category\":\"projects\"},{\"fact\":\"TypeScript strict, minimální závislosti\",\"category\":\"preferences\"}]"

## Chat Summary
"{\"topics\":[\"Optimalizace Firestore reads\",\"Composite indexy\"],\"decisions\":[\"Composite index pro multi-field queries\"],\"userContext\":\"Uživatel optimalizuje e-shop s 1000+ DAU\"}"

// ↑ JSON.stringify obalí data do stringu s escaped uvozovkami
// Model jasně vidí: toto jsou DATA, ne instrukce

// Messages (overlap + nové):
// [0-9] overlap — zprávy 90-99 (surový most přes sumarizaci)
// [10] assistant: "Composite index vytvoříš..."  ← zpráva 100
// [11] user: "Jak nastavit composite index?"     ← zpráva 101 (aktuální)

05Cross-Chat Memory

Ukládá dlouhodobé informace o uživateli: projekty, technologie, preference, rozhodnutí. Sdílené napříč všemi chaty.

Batch zpracování (cron job)

Paměť se neaktualizuje po každé zprávě. Cron job (např. jednou denně) analyzuje chaty s 10+ zprávami a extrahuje klíčové informace:

Importance Scoring

Každý fakt má prioritu. Při nárůstu databáze se promazávají fakta s nízkým score:

User-editovatelná paměť

Protože paměť je uložená jako strukturovaný JSON v databázi, uživatel ji může přímo editovat v UI. V nastavení aplikace přidáte sekci kde user vidí své uložené fakty a může je upravit, smazat, nebo přidat nové. Model při dalším batch update respektuje manuální úpravy — nekopíruje smazané fakty zpět.

user-memory-settings
$ Nastavení → Moje paměť
[projects] Projekt e-shop běží na Next.js 16 + Firebase
importance: high • ověřeno: 6. 3. 2026
[upravit] [smazat]
[preferences] TypeScript strict, minimální závislosti
importance: high • ověřeno: 5. 3. 2026
[upravit] [smazat]
[decisions] Firestore composite index pro queries
importance: medium • ověřeno: 4. 3. 2026
[upravit] [smazat]
[+ Přidat fakt manuálně]

06Chat Summary a trigger logika

Komprimuje historii konverzace. Klíčový detail je kdy a jak se sumarizace spouští.

Trigger musí být vždy na user zprávě

Sumarizace běží paralelně — uživatel dostane odpověď a na pozadí se komprimuje historie. Trigger se musí spouštět na user zprávě, ne na odpovědi modelu. Proč? Sumarizace potřebuje kompletní pár (user + assistant) a nesmí blokovat odpověď.

trigger-logic
Trigger musí být vždy na user zprávě
Systém indexuje od 1 (zpráva 1 = user):
trigger: 99, 199, 299, ...
Systém indexuje od 0 (zpráva 0 = user):
trigger: 100, 200, 300, ...
Přizpůsob podle svého systému. Vždy user zpráva.
Interval je nastavitelný — SUMMARY_INTERVAL = 100, 50, nebo
jiná hodnota. Menší interval = častější sumarizace, méně
zpráv v kontextu. Větší = víc raw zpráv, méně API volání.
Pozor: příliš častá sumarizace (interval 30–50) může
způsobit ztrátu dat. Model při každé sumarizaci vyhodnotí
některé informace jako nerelevantní a zahodí je. Čím
častěji, tím víc se ztrácí. V praxi funguje 100–300
podle účelu — záleží co chcete zachovat.

Implementace: trigger + summarizer

Anchor systém

Každá sumarizace vytvoří referenční bod — lastMessageIndex. Další sumarizace čte pouze zprávy od tohoto bodu. Žádné duplicitní zpracování:

Proč ukládat sumarizaci jako JSON

Plain text sumarizace se může smíchat s prompt instrukcemi. Pokud prompt používá XML tagy nebo markdown headings, model nerozliší kde končí system prompt a začíná sumarizace. Strukturovaný JSON formát jasně odděluje data od instrukcí — model ví, že obsah uvnitř JSON stringu jsou data k přečtení, ne instrukce k následování.

Bonus: v databázi je strukturovaný JSON snazší debugovat, filtrovat a editovat než blob textu.

07Message Buffer

Buffer má dvě části: overlap (posledních ~10 zpráv před sumarizací) a nové zprávy (od sumarizace po aktuální). Overlap funguje jako most — sumarizace může vyhladit detaily z posledních zpráv a bot by pak nevěděl na co přesně navazuje. S overlapem má vždy surový kontext kolem bodu kde sumarizace skončila.

Nové zprávy přibývají postupně — hned po sumarizaci jich je pár, na konci cyklu (před dalším triggerem) jich může být i 100.

08Model Router

Router vybírá model podle složitosti dotazu. Sám router je malý, rychlý model — nesmí přidávat latenci.

09RAG a dokumentová paměť

AI může pracovat s externími dokumenty — PDF, Markdown, API docs. Firestore má nativní vector search, takže nepotřebuješ externí vector DB.

Embedding a uložení do Firestore

Vector search při dotazu

10Bezpečnost a fail-safe

Memory Firewall

Summarizer filtruje prompt injection a jailbreak pokusy. Nebezpečný obsah se neuloží do dlouhodobé paměti.

Fail-safe

Při selhání (timeout, API error) systém přepne do fallback — posledních 50 raw zpráv jako kontext.

Anchor

lastMessageIndex zabraňuje duplicitnímu zpracování. Každý cyklus čte jen nové zprávy.

11Databáze a implementace

Firestore schema

firestore-schema
users/
{userId}/
memories/ ← cross-chat fakta s importance
chats/
{chatId}/
messages/ ← raw zprávy s messageIndex
meta/
summary ← JSON data + lastMessageIndex
knowledge/
{chunkId} ← RAG: text + embedding vector

Kompletní message handler

Všechno dohromady — od přijetí zprávy po odpověď:

12Cost optimalizace a monitoring

Každá vrstva používá jiný model — jiný poměr cena/kvalita:

model-allocation
router: Gemini Flash — nejlevnější, jen klasifikace
fast: Gemini Flash — odpovědi na jednoduché dotazy
reasoning: Claude Sonnet 4.6 — složitá logika, architektura
summarizer: Claude Sonnet 4.6 — sémantická integrita
batch: Claude Haiku 4.5 — offline memory extraction

Monitoring

Latency

Čas sestavení promptu v Context Builderu. Čas odpovědi modelu. Cíl: pod 2s celkově.

Token usage

Spotřeba per relace. Compression ratio (raw vs summary). Cíl: 10:1 a více.

Model cost

Náklady per model per vrstva. Track router accuracy — kolik % dotazů jde na fast vs reasoning.

Error rate

Selhání sumarizace, fallback frekvence, firewall blocked rate.

13Multi-agent rozšíření

Systém lze rozšířit o agenty. Každý agent má vlastní kontext a vlastní roli:

multi-agent-workflow
User request
1. Planner agent — rozkládá dotaz na kroky
2. Tool agents — API calls, DB queries, file ops
3. Memory agent — aktualizuje cross-chat paměť
Final response

Memory agent rozhoduje, které informace z úkolů dostanou vysoký importance score pro trvalé uložení.

Shrnutí

Hierarchická paměť umožňuje AI aplikaci pracovat s dlouhodobým kontextem bez překročení limitů modelu. Všechen kód v tomto článku je implementovatelný — Firebase Cloud Functions, Firestore, Claude API, Gemini API.

Cross-Chat Memory
Chat Summary
Message Buffer
Model Router