Hebbs — элегантный слой памяти для агентов. Наткнулся на него абсолютно случайно, рыская по GitHub. У проекта на момент написания 20 с небольшим звезд. Но после всего, что я прочитал и изучил на тему памяти, реализовал бы я её именно так.
базовая единица — эпизод ⭐️
Один и тот же эпизод живёт сразу в нескольких представлениях:
• как обычный текстовый memory item
• как вектор в HNSW embedding index
• как узел в графе связей
• как событие во времени
• как часть более поздних инсайтов и ревизий
То есть эпизод один, а способов вспомнить его — несколько.
Помимо этого: продуманная модель данных, минимум абстракций, MCP с 9 понятными инструментами, один ~25Mb бинарник, векторные модельки в ONNX, поддержка основных LLM API, клиентский API на Python, Typescript, Rust или C/C++ (через FFI).
Но главное — реализованы все ключевые паттерны, которые мы разобрали в PART 2 и PART 3.
4 способа вспомнить 🤨
/// hebbs-core/src/recall.rs
pub enum RecallStrategy {
Similarity,
Temporal,
Causal,
Analogical,
}
Хочешь хронологию по проекту —
Temporal. Причинную цепочку от конкретного бага — Causal. Нечто похожее, но из другого домена — Analogical. Тупо семантический поиск — Similarity. Конечно же, можно все и сразу и параллельно. К слову, связи в графе здесь предопределены:
CausedBy, FollowedBy, RelatedTo, RevisedFrom, Contradicts, InsightFrom — LLM не сможет бесконтрольно плодить новые, как это часто бывает в подобных системах.скоринг знаний
Независимо от стратегии, чтобы попасть в поисковую выдачу агента, все эпизоды проходят фильтр по следующему скору:
S = w_r×R + w_t×T + w_i×I + w_c×CR = relevance — семантическая близость к запросу:
(1 − hnsw_distance)T = recency — свежесть:
(1 − age / 30 days)I = importance — значимость, задаётся агентом при вызове remember()C = reinforcement — частота вспоминания:
log₂(1 + access_count) / log₂(1 + 101)w — вес при каждой компоненте, соответственноДефолтные веса
0.5 : 0.2 : 0.2 : 0.1 ; можно задать вручную, можно юзать пресеты. Свежий эпизод, стандартная важность, ни разу не вспоминали:
0.5×1.0 + 0.2×1.0 + 0.2×0.5 + 0.1×0.0 = 0.80через месяц без обращений
→ T = 0, C = 0 → 0.10, почти забыт. Но если его регулярно вспоминали — C растёт логарифмически и тянет скор обратно вверх.С позиции LLM агента всё тоже предельно просто: выбери 1 или несколько из 4 способов поиска, если надо, подкрути 4 ручки, чтобы настроить какие сигналы для тебя важнее в этом запросе.
reflect = daydreaming
Режим переоценки знаний происходит так:
(1) Cluster → группировка похожих эпизодов (embedding + temporal proximity)
(2) Propose → LLM генерирует кандидат-инсайты из кластера
(3) Validate → второй LLM-pass проверяет точность и полезность
(4) Consolidate → валидные инсайты →
Insight сущности + InsightFrom связиКаждый инсайт хранит confidence и lineage к исходным эпизодам. Обновили эпизод через
revise() или удалили через forget() — зависимые инсайты автоматически помечаются как stale и перевалидируются в фоне. Можно включать автоматически: по количеству новых эпизодов, по расписанию, по накоплению записей высоким importance.Вот основная разница между «хранить данные» и «накапливать опыт».
Итого
Для долгоживущего автономного LLM агента, особенно в режиме embedded типа умной колонки, Hebbs попадает в sweet spot: forgetting, reinforcement, reflection, lineage, conflict detection — при этом я понимаю, как работает каждый компонент и как его подкрутить.
Для бытовых задач и совместного наполнения некоторой базы знаний, думаю, достаточно инструментов типа QMD или LightRAG.
Из минусов отметил бы для себя малопопулярную RocksDB в качестве БД и отсутствие нативной поддержки мультимодальности. Но это скорее придирки.
Быстрые ссылки
• Hebbs — GitHub
• Hebbs Docs
• Recall Strategies
• Reflection / Background Learning
• API Overview
