Zpět na domů

Perzistentní paměť NGT Memory pro LLM

NGT Memory — otevřený modul perzistentní paměti pro LLM se třemi mechanismy vyhledávání: kosinus, Hebbův graf, konsolidace. Strukturovaný profil, filtr kvality, 94 % v testech. Docker spuštění, REST API bez externích DB.

NGT Memory: paměť LLM s Hebbovým grafem
Advertisement 728x90

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.

Google AdInline article slot

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.

Google AdInline article slot

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.

Google AdInline article slot

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 1 nebo Redis.
  • Měkký prompt: model ignoroval fakta. Posíleno: "Treat every fact as absolute truth".
  • Regex chyby: I'm allergicname= 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

Advertisement 728x90

Číst dál