Руководства

Память ИИ-агента: четыре вида и как их хранить

Память ИИ-агента - это больше, чем длинное контекстное окно. Четыре вида памяти, нужные агенту, как хранить каждый и что в неё не класть, с командами HotKV.

Память ИИ-агента в виде агента с четырьмя хранилищами вокруг: диалоговое, семантическое, рабочее и эпизодическое.

Память ИИ-агента - это то, что позволяет агенту перенести что-то с одного шага или сеанса на следующий. Языковая модель сама по себе ничего не помнит между вызовами. Всё, что кажется ей запомненным, вернул в промпт ваш код. От того, как вы храните и извлекаете этот материал, зависит, что агент может вспомнить, как быстро и какой ценой на каждый ход.

Коротко. Агентам нужны четыре вида памяти: короткое окно диалога, долговременные факты, находимые по смыслу, черновик для текущей задачи и журнал произошедшего. У каждого своя форма, срок жизни и способ поиска, поэтому одна таблица памяти не подходит ни одному из них. HotKV хранит все четыре в одном движке в памяти с помощью команд AMEM.*. Мы измеряли кеширование и векторный поиск HotKV, но не память агентов, поэтому эта статья объясняет устройство и не заявляет об ускорении.

Почему контекстное окно - это не память

Контекстное окно - это текст, который вы отправляете с каждым запросом. У него есть предел размера, вы платите за входные токены всего, что в нём находится, на каждом ходу, и оно исчезает с концом сеанса. В нём также нельзя искать. Если агенту нужен один факт трёхнедельной давности, вставлять всю историю - не ответ.

Память - это слой, который решает, что попадёт в окно следующим. Он хранит последние реплики и находит немногие старые факты, которые важны. Он держит состояние текущей задачи и записывает, что сделал агент. Исследователи описывают агентов похожим образом. Фреймворк CoALA авторов Sumers, Yao, Narasimhan и Griffiths отделяет рабочую память от долговременной эпизодической, семантической и процедурной.

Четыре вида памяти ИИ-агента

Четыре хранилища HotKV охватывают почти то же поле, приспособленное к тому, что приходится строить приложению. Процедурная память, то есть знания о том, как делать, заключённые в коде и промптах агента, обычно живёт в вашем репозитории или реестре промптов и отдельным хранилищем не является.

Диалоговая память

Это краткосрочная запись одного сеанса. Сообщения несут роль (system, user, assistant или tool). Они лежат в ограниченном скользящем окне, поэтому самые старые реплики выпадают, когда лимит достигнут. Она отвечает на один вопрос: что говорилось недавно? В HotKV это AMEM.CONV.CREATE, AMEM.CONV.APPEND и AMEM.CONV.WINDOW.

Семантическая память

Семантическая память - это долговременные знания, хранимые как факты с вектором эмбеддинга. Агент вспоминает их по смыслу, а не по ключу. Её основа - векторный индекс HNSW, тот же, что обеспечивает векторный поиск. AMEM.SEM.STORE сохраняет факт, а AMEM.SEM.RECALL возвращает лучшие совпадения с оценкой сходства. Здесь место документам, предпочтениям пользователей и усвоенным поправкам.

Рабочая память

Рабочая память - это черновик для задачи в процессе: плоский набор ключей и значений в рамках сеанса. Она хранит текущий шаг, обрабатываемое обращение или промежуточный результат. Она должна исчезать, когда задача заканчивается. AMEM.WORK.SET принимает время жизни именно по этой причине.

Эпизодическая память

Эпизодическая память - это журнал событий с отметками времени, в который только добавляют: совершённое действие, сделанное наблюдение или принятое решение. Она позволяет агенту или проверяющему человеку спросить, что произошло и когда. AMEM.EPIS.LOG записывает событие, а AMEM.EPIS.QUERY читает их обратно по типу и диапазону времени.

Память ИИ-агента на практике

На практике важны две вещи: как вы записываете в память и что читаете обратно на каждом ходу.

Сохранение памяти командами

Вот агент поддержки, ведущий один разговор. Вымышленный текст правил и векторы из трёх чисел служат только для иллюстрации. Настоящая модель эмбеддингов создаёт векторы из 768 или 1 536 чисел, и вы создаёте пространство имён с этой размерностью.

AMEM.CONV.CREATE session-42 WINDOW 50 TTL 86400
AMEM.CONV.APPEND session-42 user "My invoice shows the wrong VAT number."
AMEM.WORK.SET session-42 ticket "INV-1932" TTL 3600
AMEM.EPIS.LOG agent-support action "Looked up invoice INV-1932"

AMEM.SEM.CREATE support-kb 3
AMEM.SEM.STORE support-kb vat-policy "VAT details can be corrected within 30 days." 0.1 0.2 0.3
AMEM.SEM.RECALL support-kb 3 0.1 0.2 0.3
AMEM.CONV.WINDOW session-42 10

На каждом ходу агент читает последнее окно и вспоминает немногие факты, подходящие к вопросу. Он проверяет рабочую заметку и собирает промпт из этих частей. Совершив действие, он записывает событие. Ничто в этом цикле не требует всей истории.

Чтение памяти на каждом ходу

Один ход памяти агента. Перед промптом агент читает окно диалога, извлечённые факты и рабочую заметку. После ответа он добавляет реплику, записывает событие и обновляет заметку.
Один ход памяти агента. Прочитайте немногое перед промптом и запишите обратно после ответа.

Сохранять память - лёгкая половина. Мастерство в том, чтобы решить, что читать обратно, потому что всё прочитанное попадает в промпт и стоит входных токенов. Разумный цикл читает несколько вещей в фиксированном порядке. Сначала последние реплики, затем немногие факты, подходящие к вопросу, затем состояние задачи. Вот он с официальным клиентом Python, с вашей собственной функцией эмбеддинга и шаблоном промпта.

import hotkv

r = hotkv.from_url("hotkv://localhost:6379")
MIN_SIMILARITY = 0.8          # настройте на своих данных

def start_session(session: str) -> None:
    r.amem_conv_create(session, window=50, ttl=86400)   # создать один раз, до первого добавления

def build_context(session: str, question: str) -> str:
    r.amem_conv_append(session, "user", question)
    turns = r.amem_conv_window(session, 10)
    facts = r.amem_sem_recall("support-kb", 3, embed(question))
    facts = [f for f in facts if f["similarity"] >= MIN_SIMILARITY]
    ticket = r.amem_work_get(session, "ticket")
    return render(turns, facts, ticket)      # ваш шаблон промпта

def finish_turn(session: str, agent: str, reply: str) -> None:
    r.amem_conv_append(session, "assistant", reply)
    r.amem_epis_log(agent, "action", "Answered a billing question")
    r.amem_work_set(session, "last_step", "answered")

Порог сходства вы настраиваете сами. Значение, подходящее одной модели эмбеддингов и одному набору фактов, будет неверным для другого, поэтому проверяйте полноту на вопросах, ответы на которые вы знаете. Отбрасывать слабые совпадения важнее, чем кажется, потому что плохой факт в промпте хуже, чем отсутствие факта.

Стабильные части этого промпта, например системные инструкции, - это как раз то, что кеширование промптов у провайдера делает дешевле. Помещайте читаемую память в конец, после стабильного текста, чтобы её изменение не сбрасывало этот кеш.

Сводки вместо всё более длинных окон

Окно полностью отбрасывает старые реплики. Для болтовни это нормально, а для долгой задачи плохо, где реплика 3 может быть важна и на реплике 300. Обычный ответ - скользящая сводка. После каждого отрезка диалога агент или более дешёвая модель записывает выученное, а сводка заменяет в промпте старые реплики.

HotKV хранит по одной сводке на агента с помощью AMEM.SUMMARY.SET, AMEM.SUMMARY.APPEND и AMEM.SUMMARY.GET. SET заменяет текст, а APPEND добавляет строку. Каждое обновление увеличивает номер версии, поэтому другой компонент может дёшево узнать, что сводка изменилась и когда.

Сводка теряет информацию, а сводка сводки теряет каждый раз всё больше. Точные значения, такие как идентификаторы, суммы и даты, держите вне прозы, в рабочей памяти или семантических фактах, где они сохраняются. Сводку используйте для общей картины работы: предпочтений, принятых решений и того, что осталось.

Правила проектирования и хранение

Память неограниченно растёт, если её не остановить, поэтому задайте лимиты до первой записи.

Правила, сохраняющие память полезной

  • Ограничивайте всё. Задавайте WINDOW для диалогов и TTL для сеансов и рабочих значений. Для диалогов, рабочих значений и фактов HotKV записывает время истечения для файла только для добавления и реплик, поэтому истёкшая запись не возвращается, когда файл воспроизводится после перезапуска.
  • Храните факты, а не стенограммы. Делайте сводку, прежде чем писать в семантическую память. Факт вспомнить легче, чем страницу диалога.
  • Разделяйте агентов. Используйте отдельный идентификатор или пространство имён на каждого агента и арендатора, чтобы память одного клиента никогда не вспоминалась для другого.
  • Вспоминайте немногое. Берите три-пять лучших совпадений и отбрасывайте слабые по оценке сходства, прежде чем они попадут в промпт.
  • Не храните секреты. Память читается обратно в промпты, поэтому никогда не сохраняйте пароли, ключи и данные, которые вы не показали бы модели.

Как долго хранить каждый вид

Эти сроки - наши рекомендации, а не значения по умолчанию. Выбирайте свои исходя из того, как быстро меняются исходные факты и что вам разрешено хранить.

Вид памятиРекомендуемый срокУправление в HotKV
ДиалоговаяСеанс или фиксированный период, например суткиWINDOW и TTL в AMEM.CONV.CREATE
РабочаяЗадача, затем очисткаTTL в AMEM.WORK.SET и AMEM.WORK.CLEAR
СемантическаяПока факт остаётся истиннымTTL в AMEM.SEM.STORE и AMEM.SEM.FORGET
ЭпизодическаяСтолько, сколько требуют ваши потребности аудита или поддержкиAMEM.EPIS.QUERY по диапазону времени и AMEM.EPIS.CLEAR (у событий нет времени жизни)

Хранение - это ещё и вопрос конфиденциальности. Если память содержит что-либо о человеке, выбранный вами срок является частью того, что вы ему обещаете, поэтому запишите его.

Как ломается память агента

Большинство ошибок памяти медленные. Агент неделю работает хорошо, а потом начинает ухудшаться. Вот сбои, от которых нужно проектировать защиту.

Типичные сбои

  • Устаревшие факты. Факт, верный в марте, вспоминается в октябре. Задавайте фактам время жизни или храните их под ключом на каждую сущность, чтобы новое значение перезаписывало старое.
  • Противоречия. Два сохранённых факта не согласуются, и агент выбирает один наугад. Предпочитайте один факт на ключ добавлению новых заметок рядом со старыми.
  • Избыточное извлечение. Слишком много совпадений заполняют промпт слабо связанным текстом. Вспоминайте немного и отбрасывайте слабые совпадения.
  • Утечки между пользователями. Память одного клиента вспоминается для другого. Используйте раздельные идентификаторы или пространства имён для каждого арендатора и проверяйте их в коде перед каждым чтением.
  • Неограниченный рост. Ничто не истекает, поэтому поиск замедляется, а затраты ползут вверх. У каждого вида должен быть срок жизни. Там, где в HotKV нет времени жизни, как у эпизодического журнала, запланируйте очистку или экспорт самостоятельно.
  • Дрейф сводки. Сводка сводки постепенно перестаёт соответствовать произошедшему. Держите журнал событий как источник истины и пересоздавайте сводки из него.

Считайте сохранённый текст недоверенным

Последний пункт заслуживает большего внимания. Всё, что агент записывает в память, позже может быть прочитано в промпт. Это включает текст, пришедший с веб-страницы, из письма или от пользователя. Это непрямая форма внедрения в промпт, которую OWASP относит к LLM01. Сохраняйте источник вместе с каждым фактом. Меньше доверяйте памяти, записанной из внешнего содержимого, и никогда не позволяйте вспомненной заметке перекрыть ваш системный промпт.

Что мы измеряли и что нет

Опубликованные бенчмарки HotKV охватывают пропускную способность команд, векторный поиск и экономию токенов при кешировании ответов. У памяти агентов собственного бенчмарка пока нет. Мы не делаем заявлений о её задержке или о том, насколько она улучшает качество агента. Можно сказать лишь об архитектуре. Четыре хранилища работают в том же процессе, что и кеш и векторный индекс. Поиск в памяти - это один вызов системы, которую вы уже эксплуатируете.

Бенчмарк экономии токенов и сравнение кеширования промптов и семантического кеширования показывают измеренную сторону. Сценарий использования памяти агентов показывает команды в полном сценарии.

Использование памяти агентов из Claude Code или Cursor

Ассистент с поддержкой Model Context Protocol может использовать часть этой памяти без собственного кода. Сервер hotkv-mcp с открытым исходным кодом предоставляет диалоговую память, рабочие заметки, журнал событий и скользящую сводку как инструменты. У него есть режим «только чтение» и пространство имён, ограничивающее агента. Он не предоставляет семантическую память, а его инструменты не могут задать окно или время жизни, поэтому для этого используйте клиентскую библиотеку. Следующая статья, сервер MCP для памяти агентов, показывает, как его подключить и что охватывают его меры защиты.

Часто задаваемые вопросы

Что такое память ИИ-агента?

Память ИИ-агента - это слой хранения и извлечения, позволяющий агенту сохранять информацию между шагами и сеансами. Обычно он сочетает недавнее окно диалога, долговременные факты, находимые по смыслу, черновик для текущей задачи и журнал событий.

В чём разница между краткосрочной и долговременной памятью агента?

Краткосрочная память хранит то, что происходит сейчас, например последние реплики и состояние задачи, и она ограничена и временна. Долговременная память хранит знания, которые должны пережить сеанс, например факты, предпочтения и прошлые события, и в ней ищут по мере необходимости.

Что такое скользящая сводка в памяти агента?

Скользящая сводка - это короткое текущее описание того, что агент узнал или решил к данному моменту, обновляемое по мере работы. Она заменяет в промпте старые реплики, чтобы промпт не рос бесконечно. HotKV хранит по одной на агента и увеличивает номер версии при каждом обновлении.

Нужна ли векторная база данных для памяти агента?

Только для семантической памяти, где факты находятся по смыслу. Окнам диалога, рабочему состоянию и журналам событий векторы не нужны. HotKV держит все четыре в одном движке, поэтому векторный индекс и другие хранилища не являются отдельными системами.

Как долго хранить память агента?

Это зависит от вида. Рабочая память должна истекать по окончании задачи, диалоги - после сеанса или заданного периода, а эпизодические журналы - столько, сколько требуют ваши потребности аудита. Факты в семантической памяти нужно пересматривать и удалять, когда они перестают быть верными.

Можно ли атаковать память агента?

Да. Текст, записанный в память, позже читается в промпты, поэтому отравленная заметка может управлять агентом. Записывайте, откуда взят каждый факт, меньше доверяйте внешнему содержимому и ставьте вспомненную память ниже системного промпта по авторитету.

Хранит ли HotKV память агента в ОЗУ?

HotKV - это движок в памяти, поэтому чтения обслуживаются из памяти. Записи в четыре хранилища фиксируются для файла только для добавления и для реплик, с передачей времени истечения, согласно документации продукта.

Было полезно?

Поделитесь статьёй

Продолжите разговор

Комментарии

Есть вопросы о методике? Получили другой результат на своём оборудовании? Поделитесь находками. Комментарии проверяются перед публикацией.

Оставить комментарий

Ваше отображаемое имя и комментарий станут публичными после одобрения. Ваш адрес электронной почты используется только для перечисленных выше уведомлений и никогда не показывается. Cloudflare Turnstile проверяет на спам, как только вы начинаете писать. Подробнее о конфиденциальности.