Architektura Memory OS: od paradoksów reasoning do hierarchicznego grafu pamięci
Potężne modele takie jak o4-mini z wysokim reasoning_effort naruszają ścisłość schematów na etapie ekstrakcji strukturalnych obiektów. Zamiast precyzyjnego przestrzegania schematów Pydantic, model zaczyna 'ulepszać' strukturę: łączy obiekty, zmienia pola JSON, wygładza typy konceptów. Testowanie 300+ promptów wykazało odwrotną zależność: wzrost reasoning prowadzi do utraty determinizmu.
SGR (Schema-Guided Reasoning) z response_format i ścisłym StrictBase (extra='forbid', bez Optional/default) rozwiązuje problem częściowo, ale model walczy z ograniczeniami. Wprowadzenie Semantic Mapper obniżyło reasoning_effort, przenosząc dyscyplinę na data contract, walidację i postprocessing.
Wyniki:
- Obniżenie kosztu tokenów o 48%;
- Jakość extraction wzrosło z 5.2 do 7.11;
- Pełna traceability po message_id.
Walidator rekurencyjnie sprawdza schemat JSON: additionalProperties: false, wszystkie pola w required. To podstawowy sygnał dla agent memory: w extraction inteligencja LLM — narzędzie wykonania schematu, a nie kreatywności.
Porażka flat RAG na dużych korpusach i przejście do zarządzanej pamięci
Flat RAG działa na demo, ale załamuje się na korpusach jak Jocker (3253 konwersacje, 24 639 wiadomości): brak lineage, temporal semantics, reguł aktualizacji. Retrieval zwraca podobne fragmenty bez przywiązania do źródeł, co prowadzi do Graph Sludge – tysięcy węzłów bez granularności (26 000+ w Jocker przed refaktoryzacją).
Podział warstw jest konieczny:
- Retrieval: top-k podobnych fragmentów;
- Memory: obiekty wiedzy, połączenia, zmiany czasowe, rewizje, degradacja.
Bez tego system degraduje się w indeks chunków z halucynacjami na złożonych zapytaniach.
Podstawowa ontologia: ConceptHypothesis jako obiekt first-class
Start – podstawowa ontologia z typizowanymi obiektami i relacjami. Rezygnacja z loose entities/summaries na rzecz ConceptHypothesis:
from pydantic import BaseModel, ConfigDict, Field
from typing import List, Literal, Optional
from datetime import datetime
class StrictBase(BaseModel):
model_config = ConfigDict(extra="forbid")
class EvidenceSpan(StrictBase):
source_id: str
message_id: str
text: str
confidence: float
class ConceptRelation(StrictBase):
target_id: str
relation: Literal["causes", "conflicts_with", "supports", "instance_of", "enables"]
confidence: float
class ConceptHypothesis(StrictBase):
concept_id: str
title: str
type: Literal["behavioral_pattern", "project", "event", "tension", "goal", "belief", "entity"]
description: str
state: Literal["active", "weak", "merged", "split", "archived"]
confidence: float
aliases: List[str]
evidence_spans: List[EvidenceSpan]
relations: List[ConceptRelation]
revision_count: int
first_seen: Optional[datetime]
last_seen: Optional[datetime]
Obiekt niesie evidence spans, relations, confidence, revision_count. Temporal reasoning (events, contradictions) – first-class, nie uboczne właściwości chunków.
Data contract i staging: SQLite jako source of truth
Data contract ustala strukturę na granicach pipeline'u. SQLite – source of truth dla messages (UUID, text, role, parent_id, timestamp, conversation_id). Graf Neo4j: węzły Conversation/Message/Segment/Concept/Topic, krawędzie HAS_MESSAGE/NEXT/CONTAINS_MESSAGE/EVIDENCE_FOR/BELONGS_TO.
Klucz – EVIDENCE_FOR: koncept przywiązany do message-level evidence. Chronologiczny szkielet NEXT/PREVIOUS przyspiesza inferencję bez sortowania bazy.
Staging database (oddzielny SQLite) przechowuje pośrednie stany pipeline'u, zapewniając dowodliwość.
Concept Memory Loop i klasteryzacja tematyczna
Concept Memory Loop: create/attach/refine/reject – cykl zarządzania hipotezami. Klasteryzacja tematyczna przez UMAP + HDBSCAN + Optuna dla weighted links zapobiega over-compression/concept explosion.
LongMemEval i stateful multi-agent inference
LongMemEval (100+ mln tokenów): 4 fazy debugowania, Exploration vs Execution. Stateful multi-agent: Planner/Scout/Synthesizer dla hierarchicznego retrieval.
Agentic Gardener, invalidation i MCP
Agentic Gardener – oddzielny pipeline obsługi grafu. Invalidation/repair dla bi-temporal facts. MCP – suwerenny interfejs pamięci.
Skala: 106.7 mln tokenów, 632 868 jednostek semantycznych, 2.4 mln krawędzi.
Co ważne:
- Wysoki reasoning łamie SGR; używaj Semantic Mapper i niski effort;
- Flat RAG → Graph Sludge; wymagaj evidence spans i temporal ontology;
- ConceptHypothesis z Pydantic StrictBase – podstawa zarządzanej kompresji;
- SQLite source of truth + Neo4j dla lineage i chronologii;
- Multi-agent + Gardener dla skali 100+ mln tokenów.
— Editorial Team
Brak komentarzy.