Мне удалось создать плагин и пользовательский инструмент, обеспечивающие персистентную память для персонажей ИИ в Discourse. По результатам моих ограниченных тестов система работает хорошо, и я хотел поделиться этим, возможно, кому-то это пригодится.
Что это делает
Это решение позволяет персонажам ИИ запоминать информацию, специфичную для пользователя, между диалогами.
Пример: пользователь может сказать: «Запомни, что я предпочитаю темную тему», и ИИ сохранит и будет вспоминать это предпочтение в будущих взаимодействиях.
Компоненты
Эта система состоит из трех частей:
- Плагин (
discourse-ai-persistent-memory)
Обеспечивает бэкенд-хранилище и интерфейс настроек пользователя, где можно просматривать, добавлять или удалять свои воспоминания.
- Пользовательский инструмент ИИ
Инструмент на JavaScript, предоставляющий персонажам доступ к функциям памяти:
memory.set, memory.get, memory.list, memory.delete.
- Системный промпт персонажа
Инструкции, указывающие ИИ, когда и как использовать инструмент памяти.
Как это работает
- Воспоминания хранятся в виде пар ключ/значение в
PluginStore, с пространством имен для каждого пользователя.
- Плагин внедряет функции памяти в
ToolRunner с помощью prepend-модуля.
- Пользователи могут управлять своими воспоминаниями по адресу:
/u/{username}/preferences/interface.
- ИИ загружает все воспоминания в контекст (без выборочного извлечения).
Репозиторий на GitHub
https://github.com/BrianCraword/discourse-ai-persistent-memory
Ищу обратную связь
Буду признателен за отзывы по следующим вопросам:
- Подход с использованием prepend для внедрения в
ToolRunner.
- Имеет ли смысл загрузка всех воспоминаний вместо выборочного извлечения.
- Любые вопросы безопасности, которые я мог упустить.
- Возможные улучшения качества кода.
Отказ от ответственности
Я не программист — это решение было создано с помощью ИИ. Я не могу оказывать поддержку, но любой желающий может использовать, форкнуть или доработать этот проект. Используйте на свой страх и риск.
ПРОМПТ:
## Система памяти
У вас есть система персистентной памяти через инструмент user_memory. Используйте её для запоминания важных фактов о каждом пользователе.
### Когда СОХРАНЯТЬ воспоминания:
* Пользователь упоминает предпочтения (стиль общения, темы интересов, предпочтения по формату)
* Пользователь делится личными деталями (профессия, местоположение, хобби)
* Пользователь упоминает текущие проекты или цели
* Пользователь явно просит вас что-то запомнить
### Когда ВОСПОМИНАТЬ воспоминания:
* В начале нового диалога вызовите user_memory с действием "list", чтобы узнать, что вам известно
* При обсуждении тем, которые могут быть связаны с предыдущими разговорами
### Конвенции ключей памяти:
* preference_style, preference_topics, preference_format
* personal_profession, personal_location, personal_interests
* project_YYYY_MM (например, project_2026_01)
* goal_[topic] (например, goal_learning_python)
### Примеры использования:
* Для сохранения: `{ action: "save", key: "preference_style", value: "краткие ответы" }`
* Для извлечения: `{ action: "recall", key: "personal_profession" }`
* Для списка всех: `{ action: "list" }`
* Для удаления: `{ action: "forget", key: "old_key" }`
Всегда приветствуйте возвращающихся пользователей, предварительно проверяя их воспоминания.
---
Само определение инструмента менять не нужно, так как оно уже универсально — просто обновите пример в параметре описания, если хотите:
**Описание параметра (key):** Ключ памяти (например, preference_style, current_project)
Хотите, чтобы я изменил тон или добавил/убрал какие-то конкретные варианты использования?
ИНСТРУМЕНТ:
Имя: User Memory
Имя инструмента: user_memory
Описание:
Система памяти, позволяющая ИИ сохранять, извлекать, перечислять и забывать факты о пользователях.
Воспоминания сохраняются между диалогами.
Краткое описание:
Хранение и извлечение постоянных фактов о пользователе
Параметры:
- action (string) [ОБЯЗАТЕЛЬНО]
Действие для выполнения: save, recall, list или forget
- key (string) [необязательно]
Ключ памяти (например, preference_style, current_project)
- value (string) [необязательно]
Значение для сохранения (требуется только для действия save)