Инструменты памяти
PRX предоставляет пять инструментов памяти, которые дают агентам возможность сохранять знания между разговорами, вспоминать релевантный контекст и управлять хранилищем долговременной памяти. Эти инструменты заполняют пробел между эфемерными контекстными окнами LLM и постоянными знаниями агента.
Система памяти поддерживает три встроенные категории -- core (постоянные факты), daily (заметки в рамках сессии) и conversation (контекст чата) -- плюс пользовательские категории. Каждый инструмент учитывает ACL: при включённом контроле доступа к памяти операции ограничиваются на основе правил доступа для каждого принципала.
Инструменты памяти зарегистрированы в реестре all_tools() и всегда доступны при запуске агента с полным набором инструментов. Они работают с любым из пяти бэкендов хранения памяти (Markdown, SQLite, PostgreSQL, Embeddings или in-memory).
Конфигурация
Инструменты памяти настраиваются через секцию [memory]:
[memory]
backend = "sqlite" # "markdown" | "sqlite" | "postgres" | "embeddings" | "memory"
auto_save = true # Автосохранение ввода разговора в память
acl_enabled = false # Включить списки контроля доступа
max_recall_items = 20 # Максимум элементов, возвращаемых recall/search
recall_relevance_threshold = 0.3 # Минимальный порог релевантности для recall
# Опционально: семантический поиск на основе эмбеддингов
embedding_provider = "openai"
embedding_model = "text-embedding-3-small"
embedding_dimensions = 1536
vector_weight = 0.7 # Вес векторного сходства в гибридном поиске
keyword_weight = 0.3 # Вес полнотекстового BM25-поиска
min_relevance_score = 0.4 # Минимальный порог для включения в результаты
# Гигиена памяти (автоматическая очистка)
hygiene_enabled = true
archive_after_days = 7
purge_after_days = 30
conversation_retention_days = 3
daily_retention_days = 7Справочник инструментов
memory_store
Сохраняет факт, предпочтение, заметку или фрагмент знаний в долговременной памяти.
{
"name": "memory_store",
"arguments": {
"key": "user_timezone",
"value": "The user is located in UTC+8 (Asia/Shanghai)",
"category": "core"
}
}| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
key | string | Да | -- | Уникальный идентификатор записи памяти |
value | string | Да | -- | Содержимое для сохранения |
category | string | Нет | "core" | Категория: "core", "daily", "conversation" или пользовательская |
Категории:
| Категория | Хранение | Назначение |
|---|---|---|
core | Постоянное (до явного удаления) | Фундаментальные факты, предпочтения пользователя, конфигурация системы |
daily | В рамках сессии, архивируется после archive_after_days | Задачи на сегодня, контекст, заметки сессии |
conversation | Кратковременное, очищается после conversation_retention_days | Текущий контекст чата, ссылки |
| Пользовательская | Следует правилам хранения daily | Пользовательские категории для доменно-специфичных знаний |
memory_forget
Удаляет конкретную запись из долговременной памяти по ключу.
{
"name": "memory_forget",
"arguments": {
"key": "user_timezone"
}
}| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
key | string | Да | -- | Ключ удаляемой записи памяти |
memory_get
Извлекает конкретную запись памяти по точному ключу. Учитывает ACL при его включении.
{
"name": "memory_get",
"arguments": {
"key": "user_timezone"
}
}| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
key | string | Да | -- | Точный ключ для поиска |
Возвращает сохранённое значение при наличии или ошибку, если ключ не существует или доступ запрещён ACL.
memory_recall
Вспоминает записи памяти по ключевым словам или семантическому сходству. Возвращает наиболее релевантные записи, соответствующие запросу. Этот инструмент полностью отключается при memory.acl_enabled = true -- он удаляется из реестра инструментов.
{
"name": "memory_recall",
"arguments": {
"query": "user preferences about coding style"
}
}| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
query | string | Да | -- | Поисковый запрос (ключевые слова или естественный язык) |
max_results | integer | Нет | 20 | Максимальное количество возвращаемых записей |
memory_search
Полнотекстовый и векторный поиск по всем записям памяти. В отличие от memory_recall, этот инструмент остаётся доступным при включённом ACL, но применяет ограничения доступа для каждого принципала к результатам.
{
"name": "memory_search",
"arguments": {
"query": "project deadlines",
"category": "daily",
"max_results": 10
}
}| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
query | string | Да | -- | Поисковый запрос |
category | string | Нет | -- | Фильтр результатов по конкретной категории |
max_results | integer | Нет | 20 | Максимальное количество возвращаемых записей |
При настроенном поиске по эмбеддингам memory_search выполняет гибридный поиск, комбинируя:
- Векторное сходство (с весом
vector_weight) -- семантическое сопоставление через эмбеддинги - BM25-поиск по ключевым словам (с весом
keyword_weight) -- традиционное полнотекстовое сопоставление
Результаты ниже min_relevance_score фильтруются.
Использование
Типичный сценарий работы с памятью
Во время разговора агент использует инструменты памяти в естественном цикле:
- Вспоминание при старте: Перед ответом система вспоминает релевантные воспоминания для внедрения контекста
- Сохранение во время разговора: Когда пользователь делится важной информацией, агент её сохраняет
- Поиск по запросу: Когда агенту нужны конкретные прошлые знания, он ищет в памяти
- Забывание по запросу: Когда пользователь просит удалить информацию, агент забывает её
Взаимодействие через CLI
Состояние памяти можно проверить из командной строки:
# Просмотр статистики памяти
prx memory stats
# Список всех записей памяти в категории
prx memory list --category core
# Поиск в памяти из CLI
prx memory search "project deadlines"
# Экспорт памяти в файл
prx memory export --format json > memories.jsonПример использования агентом
В многоходовом разговоре:
Пользователь: I prefer 4-space indentation in all my code.
Агент: [вызывает memory_store с key="code_style_indent", value="User prefers 4-space indentation", category="core"]
Понял, запомню, что вы предпочитаете отступы в 4 пробела.
Пользователь: What are my coding preferences?
Агент: [вызывает memory_search с query="coding preferences"]
Исходя из того, что я помню, вы предпочитаете отступы в 4 пробела во всём вашем коде.Безопасность
Применение ACL
При memory.acl_enabled = true система памяти применяет контроль доступа:
| Инструмент | Поведение ACL |
|---|---|
memory_store | Сохраняет записи с привязкой к текущему принципалу |
memory_forget | Позволяет забывать только записи, принадлежащие текущему принципалу |
memory_get | Возвращает только записи, к которым текущий принципал имеет доступ |
memory_recall | Полностью отключён (удалён из реестра инструментов) |
memory_search | Возвращает только записи, к которым текущий принципал имеет доступ |
Инструмент memory_recall отключается при ACL, потому что его широкое сопоставление по ключевым словам может привести к утечке информации между границами принципалов. Более целевые инструменты memory_get и memory_search выполняют проверки доступа для каждой записи.
Взаимодействие с file_read
При включённом ACL инструмент file_read также блокирует доступ к файлам хранилища памяти (markdown-файлам в каталоге памяти). Это предотвращает обход ACL через чтение необработанных файлов памяти с диска.
Обработка конфиденциальных данных
Записи памяти могут содержать конфиденциальную информацию пользователя. Учитывайте следующие практики:
- Используйте категорию
coreэкономно для действительно постоянных знаний - Включите
hygiene_enabledдля автоматической очистки старых записей - Включите
acl_enabledв многопользовательских развёртываниях - Периодически проверяйте содержимое памяти через
prx memory list - Используйте
memory_forgetдля удаления конфиденциальных записей, когда они больше не нужны
Журнал аудита
Все операции с памятью записываются в журнал аудита при security.audit.enabled = true, включая имя инструмента, ключ, категорию и статус успешности/неудачи.
Связанные разделы
- Система памяти -- архитектура и бэкенды хранения
- Бэкенд Markdown -- файловое хранилище памяти
- Бэкенд SQLite -- локальное хранилище в базе данных
- Бэкенд PostgreSQL -- удалённое хранилище в базе данных
- Эмбеддинги -- настройка векторного поиска
- Гигиена памяти -- автоматическая очистка и архивация
- Файловые операции -- взаимодействие ACL с file_read
- Обзор инструментов -- все инструменты и система реестра