Лучшие практики работы с памятью
Как структурировать воспоминания для эффективного отзыва — категории, ключи, теги, приоритеты.
Лучшие практики работы с памятью
То, как вы структурируете воспоминания, определяет их полезность. Это руководство описывает паттерны категоризации, тегирования и приоритизации, чтобы LLM мог отзывать нужную информацию в нужное время.
Категории: выбирайте наиболее конкретную
| Категория | Использовать для | Пример |
|---|---|---|
identity |
Имя пользователя, роль, контакты | "user_name": "Michael Schäfer" |
preference |
Симпатии, антипатии, стиль работы | "communication": "Prefers concise responses" |
fact |
Проверяемые факты | "office_location": "Berlin, Germany" |
project |
Статус проекта, решения | "project_synapse": "v1.5.0 deployed" |
skill |
Навыки пользователя | "skill_python": "Advanced, 10+ years" |
mistake |
Прошлые ошибки для избегания | "mistake_npm_version": "Always bump version" |
context |
Контекст сессии | "current_focus": "Working on docs system" |
note |
Прочие заметки | "note_idea": "Try Redis for caching" |
Ключи: значимые идентификаторы
Поле key — идентификатор воспоминания. Используйте значимые, стабильные ключи:
Хорошие ключи:
user_nameproject_synapse_statuspreference_communication_stylemistake_npm_version_bump
Плохие ключи:
mem_001(не значимый)temp(не описательный)2026-06-27-note(дата не помогает отзыву)
Соглашения по именованию ключей
snake_case(нижний регистр с подчёркиваниями)- Префикс с категорией:
preference_*,project_*,mistake_* - Используйте описательные существительные, не глаголы
- Длина до 50 символов
Теги: для поиска и фильтрации
Теги обеспечивают быструю фильтрацию и поиск. Добавляйте 2–5 тегов на воспоминание:
{
"category": "project",
"key": "project_synapse_status",
"content": "Synapse v1.5.0 deployed. Next: v1.6.0 with docs system.",
"tags": ["synapse", "deployment", "status", "v1.5.0"]
}Паттерны тегов
- Имена проектов:
synapse,synapse-mcp,synapse-chat - Темы:
deployment,ci,database,auth - Статус:
active,completed,blocked - Индикаторы приоритета:
urgent,long-term
Приоритеты: будьте реалистичны
| Приоритет | Использовать для | % воспоминаний |
|---|---|---|
critical |
Идентичность пользователя, юридическая информация, необратимые решения | ~5% |
high |
Активные проекты, важные предпочтения | ~20% |
normal |
Большинство фактов, заметок, контекста | ~65% |
low |
Эфемерное, желательно знать | ~10% |
Когда сохранять, а когда нет
Всегда сохранять
- Идентичность пользователя (имя, email, роль)
- Долгосрочные предпочтения
- Решения по проектам и их обоснование
- Прошлые ошибки и извлечённые уроки
- Обязательства перед пользователем
Не сохранять
- Переходящее состояние (используйте переменные)
- Дословную историю разговоров (это делает система чата)
- Чувствительные данные (пароли, API-ключи)
- Легко выводимые факты (текущая дата, содержимое файлов)
- Эфемерный контекст (используйте категорию
contextс низким приоритетом)
Обновление воспоминаний
POST /memory с теми же category + key обновляет существующее воспоминание:
# Initial store
store("project", "project_synapse_status", "v1.4.0 deployed", priority="high")
# Later: update with same key
store("project", "project_synapse_status", "v1.5.0 deployed. CI green.", priority="high")Жизненный цикл памяти
Create → Active → Stale → Archive → Delete- Create: POST /memory с полным контекстом
- Active: Частый отзыв, обновление по необходимости
- Stale: Ещё актуально, но не активно используется (понизить приоритет?)
- Archive: Установить приоритет
low, хранить для истории - Delete: DELETE /memory/:id, когда больше не актуально
Периодическая очистка
# Find memories not updated in 90 days
old_memories = requests.get(
f"{URL}/memory/search?q=*",
headers={"Authorization": f"Bearer {KEY}"}
)
for mem in old_memories["results"]:
if is_stale(mem, days=90):
# Either delete or lower priority
if is_obsolete(mem):
delete_memory(mem["id"])
else:
update_memory(mem["id"], priority="low")Паттерн: наследование памяти
Для иерархического контекста (проект → подпроект → задача):
# Parent project
store("project", "project_synapse", "Main Synapse project",
tags=["synapse", "parent"], priority="high")
# Sub-project (tags link to parent)
store("project", "project_synapse_docs", "Docs system for Synapse",
tags=["synapse", "docs", "synapse-parent"], priority="high")
# Specific task (tags link to sub-project)
store("project", "task_docs_loader", "Implement docs-loader.ts",
tags=["synapse", "docs", "task"], priority="normal")LLM затем может искать q=synapse+docs, чтобы найти все связанные воспоминания.
Паттерн: журнал решений
Сохраняйте решения с обоснованием, чтобы LLM не переоспаривал их:
store("fact", "decision_postgres_over_sqlite",
"Chose PostgreSQL over SQLite for production. Reason: concurrent writes, "
"FTS5 native support, better backup story. Date: 2026-06-15. Decided by: Michael.",
tags=["decision", "database", "postgres", "sqlite"],
priority="high")Паттерн: избегание ошибок
Сохраняйте ошибки с конкретными инструкциями по избеганию:
store("mistake", "mistake_forget_version_bump",
"Forgot to bump package.json version after changes. npm publish failed. "
"FIX: Always run `npm version patch` before pushing. "
"CI fails with 'version already exists' if you forget.",
tags=["npm", "ci", "publish", "version"],
priority="high")