Память Open WebUI: как сохранять и менять предпочтения

Как работает память Open WebUI: сохраняем предпочтение, проверяем запись и ответ в новом чате, меняем или удаляем данные с учётом ограничений.

После урока вы сможете

  • Различать историю, текущий вход модели, Compaction, Memory и системную инструкцию
  • Сохранять несекретное предпочтение и проверять точную запись
  • Отделять наличие записи от фактической формы нового ответа
  • Менять или удалять свою запись и понимать пределы выключения памяти

Проверяемый результат: Сверяем свою запись, отдельно фиксируем фактический ответ нового чата и проверяем изменение или удаление записи.

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

Для таких устойчивых сведений в Open WebUI предусмотрена встроенная пользовательская память (Memory): она хранит отдельные записи вашего профиля (модель памяти) и управляется через настройки персонализации (раздел Personalization, окно записи). Но сам факт сохранения строки в списке ещё не означает, что она автоматически попадёт в следующий запрос (обработка памяти) и тем более что модель построит ответ по этому правилу.

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

Чем память отличается от истории чата и System Prompt

Когда прошлый разговор с удачным объяснением термина уже лежит в боковой панели, легко решить, что модель помнит ваши привычки благодаря сохранённой истории. На деле в Open WebUI рядом работают пять разных механизмов, и у каждого своя область ответственности. В справочных материалах слово «память» иногда используют для оперативной памяти сервера (RAM) или подключения внешних документов через RAG, но здесь речь идёт именно о встроенном хранилище пользовательских записей Memory.

Посмотрим, какую роль играет каждый из пяти механизмов в задаче с объяснением терминов:

  1. Сохранённая история чатов. В ней лежит переписка прошлых диалогов, которую можно открыть, перечитать или перенести в архив (документация по истории чатов). То, что старый чат сохранён на сервере, не означает, что вся история аккаунта автоматически подставляется в новую беседу. В системе существуют отдельные инструменты поиска по прошлым чатам, но они работают по своим правилам и выходят за рамки этого урока.
  2. Текущий контекст запроса. Это фактический набор данных, который сервер собирает прямо сейчас для одного конкретного ответа: сообщения текущей активной ветки, системные инструкции и подключённые к запросу дополнения (сборка контекста).
  3. Compaction (сжатие чата). Когда один диалог становится слишком длинным, этот механизм формирует краткую сводку старой части переписки и оставляет в активной ветке свежие реплики (логика сжатия контекста). Сжатие обслуживает только одну длинную беседу и не превращает пожелание о бытовом примере в отдельную запись для других новых чатов. Подробно мы разбирали контекст и сжатие длинного чата в предыдущем уроке.
  4. Пользовательская память (Memory). Это отдельный банк записей, привязанный к вашему профилю, а не к конкретному диалогу (хранение записей памяти). Записанное сюда предпочтение может учитываться в разных новых чатах того же аккаунта при соблюдении серверных условий.
  5. Постоянная системная инструкция (System Prompt). Правило ответа для аккаунта можно задать и в Settings → General → System Prompt, а также на уровне отдельного чата или карточки модели (документация по параметрам чата, общие настройки). По смыслу туда тоже можно вписать просьбу начинать объяснение с примера, но хранится это поле отдельно, включается другими настройками и не заменяет банк Memory автоматически. При этом ни для System Prompt, ни для записей памяти нельзя обещать универсального приоритета над собственными инструкциями модели или её поведением. Ранее мы уже рассматривали, как работают системная инструкция и параметры ответа.

У самого хранилища Memory тоже есть чёткие границы (маршруты памяти, обработка памяти). Все записи лежат в базе конкретного экземпляра Open WebUI и его векторном хранилище, закреплённом за вашим аккаунтом. Добавление строки не дообучает и не меняет веса языковой модели: система лишь сохраняет текст с векторным представлением и при подходящих условиях подставляет выбранные сведения в запрос. Этот встроенный банк привязан к пользователю текущего сервера и сам по себе не переносит записи в другой аккаунт, на другой экземпляр Open WebUI или во внешние сервисы вроде ChatGPT.

Разделив эти пять ролей, перейдём к списку предпочтений: посмотрим, где он находится в интерфейсе и как сохранить одну проверочную запись.

Как сохранить одно предпочтение и проверить Saved Memories

Встроенная память не требует установки сторонних плагинов (конфигурация сервера, документация Memory). Все названия разделов и кнопок ниже приведены по коду стабильного на момент проверки релиза Open WebUI v0.12.3 (страница релиза v0.12.3, коммит тега v0.12.3). Это описание по документации и статическому исходному коду, а не отчёт о выполненных автором кликах; в более старых сборках или при русской локализации подписи элементов могут отличаться.

В исходном коде v0.12.3 глобальная функция памяти, пользовательское разрешение на неё и автоматическая системная подстановка включены по умолчанию, тогда как фоновый обзор переписки по умолчанию выключен. Однако базовые значения в коде не показывают, какие именно настройки действуют на вашем сервере. Обычный пользователь видит вкладку Settings → Personalization только тогда, когда на экземпляре включена глобальная память и группе пользователя выдано соответствующее разрешение, причём учётная запись администратора от этой групповой проверки освобождена (условие показа вкладки, проверка доступа в роутере).

До сохранения любой строки учтите, куда направляются данные. Когда вы добавляете запись, меняете её текст или путь либо когда сервер выполняет векторный запрос к памяти, текст передаётся механизму построения векторных представлений (embedding). При автоматической подстановке отобранные записи включаются в системный контекст языковой модели, а если на сервере отдельно включён фоновый обзор, модели в дополнительном запросе отправляются недавняя переписка и доступные сведения памяти; сокращённый фрагмент текста также может попадать во внутренние события и серверные журналы (подстановка и обзор). Как распределяются путь сообщения и хранение данных между компонентами, мы разбирали в начале курса: и embedding-механизм, и сама модель могут работать как локально на сервере, так и через внешнего провайдера. Конкретная конфигурация вашего экземпляра, его тарификация и правила хранения данных у провайдера в рамках этого урока не установлены, поэтому хранение банка в локальной базе Open WebUI не гарантирует отсутствия внешней обработки. Для практики используйте только нейтральное несекретное предпочтение.

Если вы решили пройти практику на своём аккаунте, выполните сохранение по шагам (интерфейс персонализации, форма добавления и правки, передача флага памяти из чата):

  1. Откройте Settings → Personalization и проверьте, доступна ли вкладка и в каком положении находится личный переключатель Memory. Запишите его исходное состояние. Этот переключатель сохраняет личную настройку аккаунта, по которой обычный веб-интерфейс решает, включать ли память в запросах чата; он не удаляет записи и не служит отдельным серверным списком контроля доступа (ACL) для произвольных API-клиентов.
  2. Если переключатель Memory выключен, а вы хотите выполнить упражнение, включите его — после этого в разделе станет доступен список Saved Memories. Если вкладка Personalization отсутствует, доступ ограничен правами или вы не хотите менять свои настройки, не пытайтесь обходить ограничения и не запрашивайте административные права ради урока: просто разберите дальнейшие шаги с отметкой «не выполнялось».
  3. Откройте окно Saved Memories и проверьте, нет ли у вас уже такой же собственной записи. Если аналогичное правило уже сохранено для вашей работы, не создавайте дубль и не меняйте существующую рабочую строку — в этом случае дальнейшее учебное сохранение и откат пропустите, оставив отметку «не выполнялось».
  4. Нажмите Actions → Add Memory. В открывшемся окне проверьте тип записи User: в веб-интерфейсе он выбран по умолчанию и подходит именно для устойчивых предпочтений пользователя, тогда как соседний тип Context предназначен для контекстных заметок в том же личном банке пользователя, а не для общей памяти всех аккаунтов. Необязательное поле Path оставьте пустым.
  5. Вставьте в текстовое поле ровно одну учебную строку и нажмите Add:

Когда объясняешь новый для меня термин, сначала приводи один бытовой пример, затем краткое определение.

  1. После сохранения не ограничивайтесь всплывающим уведомлением: найдите новую запись в списке Saved Memories и сверьте её полный точный текст. Если при сохранении возникла ошибка или строка в списке не появилась, зафиксируйте это и не считайте запись сохранённой.

Запишите для себя результат этого этапа: точный текст вашей собственной учебной строки и итог её сверки в Saved Memories (совпала полностью, не найдена, возникла ошибка или «не выполнялось»; другие записи из вашего списка переписывать не нужно).

После проверки списка (или её разбора без сохранения) посмотрим, каким образом сервер Open WebUI отбирает записи из банка и добавляет их к новому сообщению.

Как запись памяти попадает во вход нового ответа

Языковая модель сама по себе не подключается к базе данных Open WebUI и не листает окно Saved Memories. Между сохранённой строкой и ответом модели стоит серверная сборка запроса (проверка условий в middleware.py, отбор и формирование контекста в memory.py).

Роли здесь распределяются так: человек отправляет в чате новый вопрос о незнакомом термине; сервер Open WebUI проверяет разрешения и настройки, при их соблюдении собирает подходящие сведения из банка пользователя и дописывает сформированный блок памяти к системному сообщению (system message); только после этого модель получает собранный вход и генерирует ответ. Для этого автоматического пути включать режим Native (нативный вызов инструментов) не требуется.

Автоматическая подстановка срабатывает, когда одновременно выполняются пять условий:

  • на сервере включена глобальная функция памяти;
  • включена настройка автоматической подстановки в системный контекст (Memory System Context);
  • сам запрос пришёл с включённым признаком памяти, который в обычном чате следует за вашим личным переключателем Memory;
  • у пользователя есть разрешение на работу с памятью (или роль администратора);
  • у выбранной в чате модели включена поддержка возможности памяти (memory capability).

Даже когда все эти условия соблюдены, сервер не обещает безусловную доставку каждой записи в каждый ответ. Общая документация говорит о подстановке памяти на каждом шаге диалога, но в коде v0.12.3 разные типы записей собираются и ограничиваются по отдельным правилам (бюджеты символов в config.py):

  • Сначала сервер проверяет, есть ли в текущем разговоре непустые сообщения пользователя: по последним таким репликам в пределах установленного лимита строится запрос для векторного поиска.
  • Записи типа User загружаются из банка пользователя отдельным списком, независимо от результатов векторного поиска. Векторный запрос и связанные пути (Path) используются для отбора контекстных записей; при этом если векторный запрос завершится ошибкой, сервер перехватит её и всё равно сможет сформировать блок из пользовательских записей User.
  • Для блока пользовательских записей (User) и блока остальных контекстных сведений действуют отдельные символьные бюджеты: внутри каждого блока строки сортируются, а текст сверх лимита обрезается перед добавлением в system message. Эти ограничения измеряются в символах, а не в токенах модели, и не устанавливают фиксированного предела на количество строк в вашем списке Saved Memories.

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

Мы увидели, как сервер читает уже сохранённую строку. Но в Open WebUI есть и встроенные механизмы, которые могут сами создавать или менять записи во время переписки — кратко отделим их от нашей ручной практики.

Что происходит после просьбы «запомни» и при фоновом обзоре

Пользователи часто пишут прямо в диалоге: «Запомни, что мне нужен сначала бытовой пример, а потом определение». В Open WebUI такая реплика не сохраняет запись сама по себе. Ниже мы рассмотрим два встроенных в систему механизма, которые позволяют менять банк памяти из разговора; ни один из них не нужен для нашего упражнения.

Первый механизм — встроенные инструменты памяти, которые модель может вызвать во время ответа (условия подключения в middleware.py, проверка категорий в tools.py, реализация инструментов в builtin.py). Чтобы сервер выдал эти инструменты в обычном чате веб-интерфейса, должны сойтись условия на трёх уровнях: на сервере включена память, она активна в текущем запросе и у пользователя есть право работы с ней; у самой выбранной модели разрешены встроенные инструменты в целом, а также включены поддержка памяти (memory capability) и категория встроенных инструментов memory; наконец, чат работает в нелегаси-режиме вызова функций (Native), а модель и её точка подключения реально поддерживают нативный tool calling.

Эти инструменты позволяют модели добавлять, обновлять, заменять и удалять записи текущего пользователя, просматривать полный список и пути, а также искать записи по вхождению подстроки в текст или путь и по полям (маршруты поиска в memories.py, фильтрация строк в memory.py). Такой текстовый поиск инструмента работает по уже загруженным строкам пользователя и не использует embedding-механизм, в отличие от векторного отбора при автоматической подстановке. При этом решение, вызывать ли инструмент и с какими аргументами, принимает сама модель, а её размер или известность бренда не гарантируют безошибочного вызова. Если модель просто ответила в чате «Хорошо, я запомнил», но не выполнила операцию сохранения, в Saved Memories ничего не появится.

Второй механизм — фоновый обзор переписки (background review), который по умолчанию в коде выключен (настройка в config.py, описание в документации Memory). Если он включён на сервере и соблюдены условия глобальной памяти, флага запроса, права пользователя и поддержки memory у модели, то после непустого ответа ассистента на заданном интервале пользовательских ходов сервер отправляет той же модели дополнительный фоновый запрос. Режим Native и категория встроенных инструментов для этого обзора не требуются: модель получает недавнюю переписку вместе с доступными сведениями памяти и может сама добавить, заменить, переместить или удалить записи обоих типов (User и Context). Текстовое указание внутри системного промпта обзора не сохранять секреты не является жёстким техническим фильтром, поэтому включать фоновый обзор или переключать режим инструментов ради нашей практики не нужно.

Теперь вернёмся к ручному маршруту и посмотрим, что именно можно проверить в новом разговоре.

Что проверить в ответе нового чата

После того как вы сверили свою новую учебную строку в Saved Memories (или разобрали этот шаг без выполнения), следующим действием мы отдельно наблюдаем поведение модели в новом диалоге (передача флага памяти в Chat.svelte, хранение чатов и истории, параметры и системные инструкции). Менять текущую модель, числовые параметры генерации или уже настроенный рабочий System Prompt ради этого шага не нужно.

Если вы действительно создали свою новую учебную запись, увидели её в списке на предыдущем шаге и правила вашего подключения позволяют отправить один тестовый запрос, выполните проверку:

  1. Откройте новый обычный чат под тем же пользователем и на том же экземпляре Open WebUI.
  2. Не прикрепляйте к нему старый разговор, не добавляйте правило про бытовой пример в System Prompt чата или аккаунта и не повторяйте само предпочтение в тексте вопроса (если похожее правило уже было прописано в ваших постоянных инструкциях до урока, не стирайте его, но учитывайте, что оно тоже влияет на ответ).
  3. Отправьте только один вопрос:

Что такое резервная копия?

Если на предыдущем шаге запись не создавалась, сохранить её не удалось, она не появилась в Saved Memories или вы проходите урок без выполнения запросов, не отправляйте проверочный вопрос и оставьте здесь отметку «не выполнялось». Мы также не приводим готовый пример ответа модели о резервной копии, поскольку реальный запрос в рамках урока не запускался.

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

На этом шаге важно разделить три разных явления: сохранённую запись в Saved Memories, её возможную передачу во вход модели и наблюдаемую форму ответа. Даже если модель в новом чате начала ответ с бытового примера и продолжила кратким определением, само по себе это совпадение не доказывает, что сервер извлёк именно вашу строку из памяти и что именно она определила структуру текста: модель могла построить объяснение популярного термина в таком порядке по своему обычному стилю или под влиянием других действующих инструкций. Верно и обратное: если ответ начался сразу с определения без примера, это не доказывает, что ваш банк Saved Memories пуст — запись может лежать в списке, но не попасть во вход из-за настроек и лимитов либо быть проигнорированной самой моделью.

Зафиксируйте для себя результат этого наблюдения: фактически увиденный вами ответ в новом чате и его форму (пример перед определением либо иное построение) или честную отметку «не выполнялось».

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

Как изменить или удалить запись и что даёт выключение Memory

Управлять сохранённым предпочтением нужно в том же окне Settings → Personalization → Saved Memories, где вы его создавали (действия со списком, окно редактирования). Работать следует строго со своей новой учебной строкой, которую вы добавили на шаге практики: не затрагивайте прежние рабочие записи и не нажимайте общую очистку Clear Memory / Clear All ради отката одного правила. Если на первом шаге вы не создавали новую запись, пропустите эти действия и оставьте для третьего шага отметку «не выполнялось».

Для созданной учебной строки выберите один из двух вариантов:

  • Если правило оказалось полезным и вы хотите уточнить формулировку, откройте меню своей учебной записи, выберите Edit, внесите изменение, нажмите Update и заново сверьте обновлённый полный текст в списке Saved Memories. Обновлённая запись остаётся в вашем банке с новым текстом; если при обновлении возникла ошибка или текст в списке не изменился, не считайте обновление подтверждённым.
  • Если строка создавалась только на время упражнения, выберите у этой конкретной записи действие Remove, подтвердите удаление и повторно проверьте список Saved Memories. Перед сверкой убедитесь, что в поле поиска по списку не остался фильтр, который мог просто скрыть строку с экрана. Если при удалении возникла ошибка или запись осталась в списке, откат не считается подтверждённым. Когда в начале практики вы включали личный переключатель Memory специально ради упражнения, после проверки удаления верните его в исходное положение.

Чтобы не путать редактирование и удаление записи с переключением тумблеров или чисткой диалогов, сопоставим, к чему приводит каждое действие в коде v0.12.3 (операции в роутере памяти, методы модели памяти, передача флага в Chat.svelte, модель чатов, роутер чатов и сжатие контекста):

Действие пользователя или администратораЧто меняется для ваших записей и запросовЧего это действие не делает
Edit → Update одной записиПроверяет владельца, сохраняет новый текст или путь в вашей записи и при их изменении пересчитывает векторное представление (embedding)Не удаляет запись из банка и не переписывает ответы в прошлых чатах или ранее отправленные запросы
Remove одной записиУдаляет выбранную строку из базы пользователя, а затем удаляет её запись из векторного хранилищаНе затрагивает остальные записи банка и не отзывает уже переданные внешним сервисам сведения
Clear MemoryУдаляет все записи памяти текущего пользователя в базе и пытается удалить его векторную коллекцию целикомНе подходит для отката одной учебной строки; если при удалении векторной коллекции возникнет сбой, ошибка записывается в журнал сервера без отмены успешного ответа API
Личный переключатель MemoryМеняет личную настройку аккаунта и передачу признака памяти в обычных запросах веб-интерфейсаНе удаляет сохранённые строки из базы и не закрывает доступ к серверным маршрутам для прямых вызовов API
Архивация, удаление чата или CompactionПереносит диалог в архив, удаляет выбранную переписку или сохраняет сводку внутри конкретного чатаНе очищает банк Memory: сохранённые предпочтения пользователя остаются на месте

Раздельно работают и серверные переключатели, которыми управляет администратор (проверки в middleware.py, выдача инструментов в tools.py, условия в memory.py): глобальное отключение памяти или снятие права работы с ней закрывает текущие серверные пути памяти, но само по себе не стирает ранее созданные строки в базе; выключение Memory System Context останавливает только автоматическую подстановку в системное сообщение, оставляя доступными встроенные инструменты при соблюдении их условий; отключение категории встроенных инструментов Memory у модели прекращает выдачу этих инструментов в чат, но само по себе не выключает автоматическую подстановку или фоновый обзор.

Наконец, учитывайте реальные границы любого изменения и удаления. Успешное обновление через Edit оставляет запись в банке с новым содержимым, а успешное удаление через Remove убирает выбранную строку из базы и векторного хранилища, при этом сверка в Saved Memories подтверждает лишь то состояние списка, которое вы видите в интерфейсе. Ни исправление, ни удаление записи не переписывают уже сохранённые сообщения в истории чатов, сводки Compaction, ранее отправленные в модель или embedding-сервис запросы, серверные журналы, возможные копии на стороне провайдера и резервные копии базы данных. Полное физическое уничтожение всех копий и сроки их хранения у внешних провайдеров этим действием не подтверждаются, как не гарантируется и то, что модель в будущих диалогах никогда сама не выберет похожую форму ответа. Если вам интересно сравнить этот прикладной механизм с общими подходами в индустрии, посмотрите дополнительный материал о том, как устроена память LLM и ИИ-агентов.

В результате разобранной практики у вас остаются три отдельные отметки, которые не подменяют друг друга:

  1. Собственная запись и сверка списка: сохранённая учебная строка типа User и проверенный результат в Saved Memories — текст совпал, запись не появилась, возникла ошибка или «не выполнялось».
  2. Наблюдение ответа в новом чате: фактически полученное объяснение термина и его форма (бытовой пример перед кратким определением или другое построение) либо отметка «не выполнялось», без вывода о доказанной причинной связи со списком памяти.
  3. Изменение или удаление своей учебной строки: итог Edit / Update (с обновлённым текстом в банке) или Remove (с подтверждённым отсутствием строки в Saved Memories без поискового фильтра), зафиксированная ошибка операции либо «не выполнялось».

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

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

Материалы урока

Отметить прохождение

Отметьте урок после того, как получили проверяемый результат из практической части.

бутерброда.