NGT Memory: Trvalá paměť pro LLM s asociativním grafem a profilem
NGT Memory implementuje trvalou paměť pro velké jazykové modely bez externích úložišť. Modul ukládá fakta o uživateli mezi relacemi, vyhledává relevantní kontext a vkládá jej do promptu. Tři mechanismy vyhledávání zajišťují přesnost: kosínusová podobnost embeddingů, hebbovský asociativní graf a hierarchická konsolidace.
Kosínusová podobnost porovnává embedding dotazu s uloženými fakty. Graf propojuje koncepty, které se aktivují společně: zmínka o dietě s dotazem na restaurace přitáhne odpovídající fakt. Konsolidace přesouvá často používaná fakta do dlouhodobé paměti a vytlačuje zřídka dotazovaná.
Doba vyhledávání je 2–3 ms na CPU. Hlavní zpoždění pocházejí z OpenAI API: embeddingy ~700 ms, generování ~800–1500 ms.
Spuštění a API
Modul se spouští přes Docker:
git clone https://github.com/ngt-memory/ngt-memory
cd ngt-memory
cp .env.example .env # OPENAI_API_KEY
docker-compose up -d
Klientský kód:
import httpx
client = httpx.Client(base_url="http://localhost:9190")
# Ukládání faktů
client.post("/chat", json={
"message": "Jsem vegetarián a bydlím v Praze.",
"session_id": "user_42"
})
# Vyhledávání přes relaci
r = client.post("/chat", json={
"message": "Co si mám dát k jídlu?",
"session_id": "user_42"
})
print(r.json()["response"]) # Vegetariánské restaurace v Praze
print(r.json()["memories_count"]) # 2
Endpointy: /chat, /store, /retrieve, /session/reset, /health.
Strukturovaný profil uživatele
Systém extrahuje sloty ze zpráv: věk, město, dieta, alergie. Data se vkládají do system promptu s prioritou:
[USER PROFILE — structured facts, highest priority]
- age: 30
- city: "Praha"
- diet: "vegetarián"
[END USER PROFILE]
[MEMORY CONTEXT — verified facts about this user]
1. [0.91] Jsem vegetarián a bydlím v Praze.
[END MEMORY CONTEXT]
Spojování fragmentů: "mně" + "30" + "let" → "mně 30 let" → age=30 (jistota 0.6).
Řešení konfliktů: Blokování snížení věku bez fráze "spletl jsem se". Režim opravy — 60 s.
Filtr kvality a architektura
Filtr odstraňuje šum:
- Čistá čísla, speciální znaky, jedno slovo
- Méně než 6 písmen
- Odpovědi asistenta na uživatelský šum
Architektura:
- POST /chat
- OpenAI text-embedding-3-small (~700 ms)
- Extrakce profilu (regex)
- NGT Memory retrieve (kosínus + graf, 2–3 ms)
- OpenAI gpt-4.1-nano (~800–1500 ms)
- Filtr → store
Zásobník: FastAPI, AsyncOpenAI, Pydantic. Ukládání v RAM jednoho procesu.
Výsledky experimentů
Exp 44: Faktická přesnost s pamětí 2.44/3 (+100 % oproti bezpaměťovému 1.22/3).
Exp 48: A/B test, 94 % vítězství paměti (17/18), průměrné hodnocení 0.889 vs 0.056.
Exp 49: 51/54 (94 %) na hraničních případech: cross-jazykové, spojování, konflikty.
Výkonnost (5000 faktů):
| Operace | Propustnost | p50 |
|----------|------------|-----|
| store() | 3450/s | 0.29 ms |
| retrieve()| 150/s | 6.3 ms |
End-to-end: paměť 2.5 ms, embeddingy 764 ms.
Problémy škálování
- Multi-worker: každý worker má vlastní SessionStore. Řešení:
--workers 1nebo Redis. - Měkký prompt: model ignoroval fakta. Posíleno: "Treat every fact as absolute truth".
- Regex chyby:
I'm allergic→name= allergic. Blacklist 25+ slov.
Co je důležité
- Kombinace kosínus + graf + konsolidace dává 94 % na hraničních testech.
- Strukturovaný profil s prioritou v promptu zdvojnásobuje přesnost.
- Filtr kvality zabraňuje degradaci vyhledávání od šumu.
- Zpoždění paměti 2–3 ms, není bottleneck.
- Otevřený kód, BSL 1.1, připraveno pro Docker.
— Editorial Team
Zatím žádné komentáře.