Долгосрочная память чата — как агент помнит контекст
Для кого: инженеры лаборатории. Что узнаете: как AI запоминает ваши факты, события и стиль — и почему это бесплатно для вас.
Инженерный тон в ответах
Раньше: «Я понял, вы хотите рассчитать прочность куба B25...». Сейчас: факт — норма — следующий шаг.
Результат: R = 24.8 МПа
Норма ГОСТ 22690-2015 п.5.3: ≥ 25 МПа для B25 → НЕ соответствует
Следующий шаг: переотобрать 3 образца / снизить класс до B22.5
Без воды: «отлично», «сейчас сделаю», «я понял», «конечно». Просто работа.
3 уровня памяти
Агент помнит вас на трёх уровнях — как реальный коллега:
1. Семантическая память — ФАКТЫ
Что AI знает о вашей работе:
- «Основная лаборатория: Krasnodar-1»
- «Специализация: бетон B25-B40»
- «Формат протокола: PDF с подписями»
Извлекается асинхронно после сессии (Haiku, ~$0.001). Хранится годами, обновляется EMA-алгоритмом (новый факт = 30% веса, старый = 70%).
2. Эпизодическая память — СОБЫТИЯ
Что произошло в чате последние 30 дней:
- «2 дня назад · 🧮 Расчёт прочности B25 для СтройГарант → 24.8 МПа»
- «вчера · ✅ Подтвердил протокол ПР-2026-042»
- «4 дня назад · 📋 Создал заказ ORD-2026-027»
Извлекается асинхронно после сессии (~$0.001). Auto-expire через 90 дней. Топ-5 важных всегда в контексте.
3. Процедурная память — СТИЛЬ
Как именно вам отвечать:
- Язык (русский / смешанный)
- Длина (концисная / нормальная / детальная)
- Markdown vs plain text
- Технический уровень (basic / standard / expert)
- Обращение (на «Вы» / на «ты»)
- Предпочитаемые форматы (PDF, XLSX)
Один документ на юзера, обновляется AI каждые N сессий.
+ Open Tasks Tracker — ОБЕЩАНИЯ АГЕНТА
Если AI сказал «посчитаю к вечеру», «пришлю PDF», «напомню завтра» — это записывается.
При новом сообщении агент ВИДИТ незакрытые обещания и:
- ✅ Если новый запрос совпал — закрывает задачу автоматически
- 🔔 Если не совпал — упоминает ОДНУ ближайшую в конце ответа
Анти-спам: максимум 3 напоминания на одну задачу с интервалом 24 часа.
Как это влияет на ваш опыт
Без памяти (старый агент):
Юзер: посчитай прочность куба
AI: По какому ГОСТу? Какой класс бетона? Сколько образцов?
Юзер: 22690, B25, 5 штук
AI: Какая ваша лаборатория? Куда отправить результат?
Юзер: 🤬
С памятью (новый агент):
Юзер: посчитай прочность куба
AI: Результат: R = 24.8 МПа
Норма ГОСТ 22690-2015: ≥ 25 МПа → НЕ соответствует
Следующий шаг: повторить отбор 3 образцов
(агент знает: ваша лаборатория Krasnodar-1, обычно B25-B40,
только что вы прислали 5 образцов в чате)
Стоимость для вас: ₽0
| Слой | Когда работает | Цена |
|---|---|---|
| Semantic extractor | Раз в день (cron) | ~$0.001/сессия → ~$0.30/месяц на тенант |
| Episodic extractor | После каждой сессии | ~$0.001/сессия |
| Procedural updater | Каждые 5 сессий | ~$0.0005 |
| Open tasks extractor | После каждой репли | ~$0.0005 |
| Итого | <$2/месяц на активный тенант |
Платит лаборатория из общего AI-бюджета. Юзер не видит счетов.
Контроль и приватность
GDPR: право на забвение
В настройках профиля (TODO) — кнопка «Удалить мою память». Удалит всё: UserMemory + EpisodicMemory + ProceduralMemory + OpenTask.
Tenant isolation
Никогда: данные одной лаборатории НЕ попадают к другой.
В Postgres все таблицы имеют tenantId + строгая фильтрация.
Whitelisted keys
Semantic memory не позволяет AI выдумывать произвольные ключи. Только из заранее одобренного списка (8 ключей сейчас, расширяется по запросу).
Confidence threshold
Факты с уверенностью < 0.5 не попадают в промпт. Эпизоды с importance < 0.6 — игнорируются (не захламляют контекст).
Что AI получает в начале каждой реплики
Всё это собирается параллельно за <100ms (с warm cache):
<memory_context>
<user_memory>
- Основная лаборатория: Krasnodar-1
- Специализация: бетон B25-B40
- Формат протокола: PDF с подписями
</user_memory>
<recent_episodes>
Недавние события чата:
- 2 дня назад · 🧮 Расчёт: Прочность B25 для СтройГарант → 24.8 МПа
- вчера · ✅ Подтвердил протокол ПР-2026-042
- 4 дня назад · 📋 Создал заказ ORD-2026-027
</recent_episodes>
<user_style>
- Язык: русский
- Длина: концисная (1-3 предложения)
- Технический уровень: эксперт
- Формат: plain text (без markdown)
- Обращение: на «Вы»
- Документы: PDF, XLSX
</user_style>
<open_tasks>
ВАЖНО: незакрытые задачи:
- 🧮 Посчитать морозостойкость F150 (обещано вчера, срок: завтра)
- 📄 Прислать ZIP протоколов СтройГарант (обещано 2 дня назад)
</open_tasks>
</memory_context>
~1000 токенов памяти vs тысячи токенов истории = 90% экономии токенов, но качество диалога выше.
Multi-provider — память не теряется
У нас 5 LLM-провайдеров (Anthropic, OpenAI-compat, Yandex, GigaChat, Claude SDK).
Если один отвалился — авто-переключение через LLMRouter.
Память НЕ зависит от провайдера — это унифицированный блок в system prompt. Yandex/GigaChat не имеют prompt-caching (как Anthropic), но получают тот же контекст памяти.
Все сообщения нормализуются в NormalizedMessage → каждый провайдер рендерит в свой формат.
Технический стек (для команды)
- Postgres — хранилище всех 3 слоёв + Open Tasks (модели в
prisma/schema.prisma) - L1 cache — in-memory Map per-process, 5-10 мин TTL
- Haiku 4.5 — extractor для semantic / episodic / open-tasks (~$0.001/сессия)
- Async extraction — BullMQ jobs ИЛИ nightly cron (без блокировки UX)
- MemoryAssembler — параллельная сборка 3 слоёв за ~50ms (cold)
- EMA confidence — устойчивость к шуму (new = old0.7 + extracted0.3)
- GDPR —
delete*ForUser()функции в каждом store
RAG: BGE-reranker для лучшего поиска
Дополнительно: для семантического поиска по ГОСТам и файлам подключён BGE-reranker-v2-m3:
- Multilingual (включая русский), 50-100ms на GPU
- Запускается в Docker (опционально, через
BGE_RERANKER_URL) - Если контейнер недоступен → graceful fallback на наш intent-rerank
Pipeline RAG:
1. Semantic search (pgvector) → 30 кандидатов
2. Dedup + per-source limits → 20 кандидатов
3. BGE rerank (если доступен) → переупорядочивание по релевантности
4. Intent rerank → буст под намерение (формулы для расчётов и т.д.)
5. → Top-N в контекст
Без BGE: 50ms (только наш intent-rerank). С BGE: 150-250ms (но точность +15-25% по нашим внутренним тестам).
Когда обращаться
- 🐛 AI забыл что-то важное → проверить факт через
prisma studio→ таблицуUserMemory - 🔄 AI вспоминает старое решение → чек таблица
EpisodicMemory→ можно удалить конкретный эпизод - 📋 AI напоминает о задаче что уже сделана → закрыть в
OpenTask(status=done) - 🛡️ GDPR-запрос юзера →
deleteAllEpisodesForUser(userId)+deleteUserMemory(userId)+deleteProceduralProfile(userId)+deleteAllOpenTasksForUser(userId)
By Alex Pashkin — CTO LABGO.AI