Skip to main content

Лучшие практики работы с памятью

Как структурировать воспоминания для эффективного отзыва — категории, ключи, теги, приоритеты.


Лучшие практики работы с памятью

То, как вы структурируете воспоминания, определяет их полезность. Это руководство описывает паттерны категоризации, тегирования и приоритизации, чтобы 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"
При сомнениях используйте `fact` для проверяемой информации и `note` для всего остального. Не перегружайте категориями — лучше иметь чёткий `fact`, чем запутанный `context`.

Ключи: значимые идентификаторы

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

Хорошие ключи:

  • user_name
  • project_synapse_status
  • preference_communication_style
  • mistake_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%
Не помечайте всё как `critical`. Если всё критично — ничего не критично. Резервируйте `critical` для того, что нанесёт реальный вред при забывании.

Когда сохранять, а когда нет

Всегда сохранять

  • Идентичность пользователя (имя, 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")
Используйте стабильные ключи, чтобы обновлять без создания дубликатов. LLM должен повторно POST с тем же ключом при изменении информации, а не создавать новые воспоминания.

Жизненный цикл памяти

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")

Антипаттерны, которых стоит избегать

Следующие шаги