Agent Memory

Модуль 04 · Урок 4.3

Урок 4.3. Скоупы памяти: пользователь, проект, агент, организация

На этой странице
  1. Цель лекции
  2. Ожидаемый результат
  3. Зачем это нужно
  4. Основная идея
  5. Ключевые термины
  6. Иерархия scopes
  7. User memory
  8. Session memory
  9. Project memory
  10. Agent memory
  11. Team memory
  12. Organization memory
  13. Public и private memory
  14. Multi-tenant isolation
  15. Cross-scope retrieval
  16. Приоритеты при конфликте
  17. Scope-aware retrieval pipeline
  18. Scope в MemoryRecord
  19. Мини-кейс: смешивание проектов
  20. Мини-кейс: customer support
  21. Scope и derived records
  22. Scope и deletion
  23. Когда scope должен быть узким
  24. Когда scope может быть широким
  25. Типичные ошибки
  26. Краткое резюме
  27. Вопросы для самопроверки
  28. Что дальше

Цель лекции

Показать, как область видимости памяти защищает систему от смешивания контекстов.

Ожидаемый результат

Читатель понимает, почему scope - обязательная часть memory design: каждая запись должна иметь область применимости, правила доступа и приоритет при конфликте с другими уровнями памяти.

Зачем это нужно

Memory system может хранить правильную информацию и все равно использовать ее неправильно.

Примеры:

  • preference одного пользователя применяется к другому;
  • правило одного репозитория используется в другом проекте;
  • временная инструкция текущей сессии становится долгосрочной памятью;
  • internal support note попадает в ответ внешнему клиенту;
  • agent-specific reflection начинает управлять всей командой агентов;
  • organization policy игнорируется из-за user preference;
  • данные одного tenant извлекаются в контекст другого tenant.

Все это ошибки scope.

Scope отвечает на вопрос:

text
Где, для кого и при каких условиях эта память применима?

Без scope агент будет вспоминать "правильные" данные в неправильном месте. Это особенно опасно в продуктах с несколькими пользователями, проектами, организациями и агентскими ролями.

Основная идея

Каждая запись памяти должна иметь область видимости и правила доступа.

Scope - это не просто metadata для фильтрации. Это safety boundary, retrieval constraint и часть semantics записи.

Запись:

text
User prefers concise final answers.

недостаточна.

Лучше:

text
User prefers concise final reports after file edits.
scope:
  user: user_123
  project: ai-agent-memory-guide
  task_type: file_edit_final_response
visibility:
  private_to_user: true

Теперь понятно:

  • кому принадлежит preference;
  • где оно применимо;
  • когда его извлекать;
  • кому его нельзя показывать;
  • с чем оно может конфликтовать.

Ключевые термины

Термин Короткое определение
Scope Область применимости записи памяти.
Visibility Кто может видеть запись.
Access control Правила чтения, записи, обновления и удаления памяти.
User memory Память, связанная с конкретным пользователем.
Session memory Временная память текущей беседы или задачи.
Project memory Память конкретного проекта, репозитория, курса или продукта.
Agent memory Опыт, навыки или состояние конкретного агента или роли.
Team memory Общие решения и состояние команды.
Organization memory Политики, стандарты, термины и процессы организации.
Public memory Данные, которые можно использовать или показывать публично.
Private memory Данные с ограниченной видимостью.
Multi-tenant isolation Изоляция памяти между клиентами, организациями или workspace.
Cross-scope retrieval Извлечение памяти из другого уровня scope при соблюдении правил.

Иерархия scopes

Упрощенно scopes можно представить так:

text
Organization Memory
  -> Team Memory
    -> Project Memory
      -> User Memory
        -> Session Memory
          -> Working Memory

Но это не всегда строгая вложенность. В реальных системах scopes пересекаются:

  • пользователь может работать в нескольких проектах;
  • проект может принадлежать команде;
  • агент может иметь роль в нескольких workflows;
  • organization policy действует на все проекты;
  • session может быть связана с конкретным account;
  • shared memory может быть доступна нескольким агентам.

Поэтому scope лучше моделировать как набор измерений:

text
scope:
  organization_id
  team_id
  project_id
  user_id
  session_id
  agent_id
  account_id
  task_id
  memory_type
  visibility

Не каждая запись должна иметь все поля. Но каждая должна иметь достаточно scope, чтобы не применяться случайно.

User memory

User memory хранит сведения о конкретном пользователе.

Типичные записи:

  • язык общения;
  • стиль ответа;
  • preferred level of detail;
  • рабочие привычки;
  • устойчивые цели;
  • привычные tools;
  • ограничения;
  • accessibility preferences;
  • разрешенные или запрещенные способы персонализации.

Пример:

text
User memory:
- User prefers concise final edit reports.
scope:
  user: user_123
  task_type: file_edit_final_response

Риски:

  • превращать временные фразы в permanent profile;
  • сохранять sensitive data без необходимости;
  • использовать preference одного пользователя для другого;
  • делать скрытые выводы о пользователе;
  • применять user preference против policy.

User memory должна быть контролируемой пользователем: просмотр, correction, deletion, opt-out.

Session memory

Session memory - временное состояние текущего диалога или задачи.

Хранит:

  • текущую цель;
  • выбранный план;
  • последние решения;
  • temporary preferences;
  • open questions;
  • tool results;
  • current artifacts;
  • active constraints;
  • handoff state.

Пример:

text
Session memory:
- User asked to keep today's answers very short.
ttl: current_session

Это не должно автоматически стать user profile.

Session memory часто имеет TTL:

  • until response;
  • until task closed;
  • current conversation;
  • 24 hours;
  • until user changes mode.

Ошибка: session state без TTL становится ложной long-term memory.

Project memory

Project memory относится к конкретному проекту, репозиторию, курсу, продукту или workspace.

Хранит:

  • stack;
  • directory structure;
  • conventions;
  • source of truth documents;
  • coding style;
  • writing style;
  • test commands;
  • architectural decisions;
  • known risks;
  • project-specific workflows.

Пример:

text
Project memory:
- guide/content_plan.md is the source of truth for course structure.
scope:
  project: ai-agent-memory-guide
source:
  kind: project_instruction

Project memory не должна автоматически распространяться на другие проекты.

Правило:

text
Conventions are local unless explicitly organization-wide.

Если один репозиторий использует Vitest, это не значит, что все репозитории пользователя используют Vitest.

Agent memory

Agent memory относится к конкретному агенту, роли или capability.

Примеры:

  • reviewer agent помнит recurring review risks;
  • researcher agent помнит успешные search strategies;
  • coder agent помнит tool usage lessons;
  • memory manager помнит consolidation decisions;
  • supervisor помнит policy violations.

Agent memory полезна, когда разные агенты специализируются.

Но agent memory не всегда должна быть shared:

text
Research agent reflection:
- The previous query formulation was too broad.

Это может быть полезно researcher agent, но не обязательно coder agent.

Риск: agent-specific weakness или habit становится team-wide rule без проверки.

Team memory

Team memory хранит общие решения команды людей или агентов.

Примеры:

  • task status;
  • accepted assumptions;
  • design decisions;
  • shared risks;
  • handoff notes;
  • review outcomes;
  • team workflows;
  • incident postmortems;
  • shared definitions.

Team memory нужна для coordination.

Пример:

text
Team memory:
- For pricing changes, reviewer must check invoice totals before approval.
scope:
  team: pricing
  project: billing-service
status: verified

Team memory должна иметь ownership: кто может записывать, подтверждать и менять shared decisions.

Organization memory

Organization memory хранит широкие policies, стандарты и доменные знания.

Примеры:

  • security policies;
  • privacy rules;
  • brand voice;
  • product taxonomy;
  • internal terminology;
  • compliance requirements;
  • support escalation rules;
  • engineering standards;
  • data retention rules.

Organization memory часто имеет высокий приоритет, особенно если это policy.

Пример:

text
Organization policy:
- Never expose credentials or secrets in responses.
scope:
  organization: acme
  policy_domain: security
priority: critical

User preference не может отменить hard organization policy.

Но organization memory тоже должна иметь scope. Политика одной компании не должна применяться к другому tenant.

Public и private memory

Visibility не всегда совпадает с scope.

Запись может быть project-scoped, но private. Или organization-scoped, но public.

Примеры:

text
Public:
- Product documentation says API endpoint X supports batch updates.
text
Private:
- Customer account A has overdue invoice.
text
Internal:
- Support team suspects entitlement cache issue.
text
User-private:
- User prefers not to save personal reminders after completion.

Visibility должна влиять на:

  • retrieval;
  • context assembly;
  • sharing between agents;
  • citations;
  • final answer;
  • logs;
  • summaries;
  • derived records.

Нельзя считать, что если модель "не процитировала" private data, то утечки не было. Если private data попала в prompt без разрешения, boundary уже нарушен.

Multi-tenant isolation

Multi-tenant isolation - критичное требование для продуктов с несколькими клиентами, workspace или организациями.

Ошибка:

text
Query:
"export feature issue"

Retrieval returns:
- Ticket from customer A
- CRM note from customer B
- Internal escalation for customer C

Даже если все записи релевантны по смыслу, они недопустимы для текущего tenant.

Надежный retrieval должен включать filters:

text
organization_id = current_org
workspace_id = current_workspace
account_id = current_account
user_has_access = true
status != deleted

Multi-tenant isolation должна быть встроена в storage, indexes, cache keys, retrieval и logs.

Опасная ошибка: фильтровать результаты только после vector search, если сам vector index возвращает private snippets в общий candidate pool. Лучше либо физически разделять indexes, либо применять permission-aware retrieval до context assembly.

Cross-scope retrieval

Иногда агенту нужно использовать память из разных scopes.

Пример:

text
User asks coding agent to fix a bug in project P.

Полезные scopes:

  • session: текущая задача;
  • user: стиль финального ответа;
  • project: stack, tests, conventions;
  • team: review workflow;
  • organization: security policy;
  • agent: debugging lessons;
  • world memory: docs и codebase.

Cross-scope retrieval не означает "достать все". Нужно выбрать релевантные записи с учетом приоритета и permissions.

Пример context assembly:

text
Active task:
- Fix discount calculation bug.

Project memory:
- Project uses Vitest.
- Pricing changes require invoice total tests.

User memory:
- User wants concise final edit reports.

Organization policy:
- Do not expose secrets.

Каждый scope играет свою роль.

Приоритеты при конфликте

Конфликты между scopes неизбежны.

Пример:

text
Session:
- "Не запускай тесты сейчас."

Project:
- "Always run tests before final response."

User request:
- "Просто исправь опечатку в Markdown."

Здесь можно не запускать тесты, если это Markdown-only правка и project rule относится к code changes. Нужно учитывать scope и task type.

Другой пример:

text
User:
- "Покажи мне этот API key."

Organization policy:
- "Never expose secrets."

Organization security policy сильнее user request.

Примерная иерархия:

text
Safety / legal / security policy
  > explicit current user request
  > session constraints
  > project rules
  > user long-term preferences
  > team conventions
  > organization defaults
  > agent learned habits

Но это не жесткая универсальная формула. В некоторых системах organization policy выше всего; в других project-specific instruction может уточнять organization default. Важно, чтобы приоритеты были явно определены.

Scope-aware retrieval pipeline

flowchart TD T[Current task] --> S[Identify active scopes] S --> P[Permission filters] P --> Q[Build scoped queries] Q --> U[User memory] Q --> SE[Session memory] Q --> PR[Project memory] Q --> AG[Agent memory] Q --> TM[Team memory] Q --> ORG[Organization memory] U --> C[Candidate memories] SE --> C PR --> C AG --> C TM --> C ORG --> C C --> R[Rank by relevance, priority, freshness] R --> K[Conflict checks] K --> I[Inject scoped context]

Scope-aware retrieval сначала определяет активные scopes и permissions, а уже потом ищет память. Это снижает риск утечек и retrieval noise.

Scope в MemoryRecord

Пример записи:

text
id: mem_lecture_style_001
type: semantic_fact
summary: Full lectures should be detailed, but final edit reports should be concise.
scope:
  user_id: user_123
  project_id: ai-agent-memory-guide
  task_type:
    - lecture_writing
    - file_edit_final_response
visibility:
  read:
    - user_123
    - writing_agent
  share_with_team: false
source:
  kind: user_instruction
confidence: high
status: active

Поля scope и visibility отвечают на разные вопросы:

  • scope: когда запись применима;
  • visibility: кто может ее видеть.

Обе части нужны.

Мини-кейс: смешивание проектов

У пользователя есть два проекта.

Project A:

text
- Documentation-only repo.
- No build step.
- Lectures are written in Russian.

Project B:

text
- Next.js app.
- Must run npm test and Playwright checks.
- UI text is English.

Если memory records не имеют project scope, агент может:

  • не запустить тесты в Project B, потому что "в проекте нет build step";
  • писать русские тексты в English UI;
  • искать lecture template в app repo;
  • применять frontend visual QA к Markdown-only лекции.

Правильное поведение:

text
Retrieve only memories where project_id matches current project,
plus allowed user/org memories.

Мини-кейс: customer support

Support agent работает с account A.

User asks:

text
"Почему export недоступен?"

Memory/RAG contains:

  • account A entitlement;
  • account B incident;
  • public docs;
  • internal support note;
  • organization escalation policy.

Scope-aware retrieval:

text
Allowed:
- account A entitlement
- public docs
- org escalation policy
- internal note only if support role has access

Not allowed:
- account B incident details

Даже если account B incident очень похож, его нельзя вставлять в context, если нет права доступа или anonymized shared incident summary.

Scope и derived records

Derived records должны наследовать или ужесточать scope.

Пример:

text
Raw private note:
- Customer A has unpaid invoice.
scope: account A, private support

Плохой derived summary:

text
- Some customers lose export due to billing.
scope: public

Если summary выводит sensitive information из private records, scope нельзя расширять автоматически.

Правило:

text
Derived memory cannot be less restrictive than its sensitive sources without review.

Это важно для summaries, reflections, reports, embeddings and shared memory.

Scope и deletion

Deletion тоже scope-aware.

Если пользователь просит:

text
"Удалить мои сохраненные предпочтения."

Нужно удалить или деактивировать records, где:

text
scope.user_id = current_user
type in user_preferences

Но не обязательно удалять organization policy или project docs.

Если клиент просит удалить account data, нужно найти:

  • direct account records;
  • derived summaries;
  • embeddings;
  • cache;
  • shared memory references;
  • archived records;
  • object storage artifacts;
  • audit data, если policy допускает retention.

Scope помогает понять, что именно относится к субъекту deletion request.

Когда scope должен быть узким

Узкий scope нужен, если запись:

  • появилась из одной сессии;
  • относится к одному проекту;
  • содержит user preference;
  • касается customer/account data;
  • основана на временной инструкции;
  • является hypothesis;
  • содержит sensitive context;
  • описывает agent-specific lesson;
  • связана с конкретной задачей.

Пример:

text
"Сегодня не запускай тесты."
scope: current_session / current_task
ttl: until_task_closed

Не:

text
"User does not want tests."
scope: all future coding tasks

Когда scope может быть широким

Широкий scope возможен, если запись:

  • является organization policy;
  • явно задана как global preference;
  • подтверждена пользователем для всех задач;
  • относится к публичному знанию;
  • является reusable skill с понятными constraints;
  • прошла review;
  • не содержит private/sensitive data.

Пример:

text
Organization policy:
- Never store secrets in memory.
scope: organization
priority: critical

Но даже широкая запись должна иметь owner, source и update policy.

Типичные ошибки

Ошибка 1: хранить память без scope.

Такая запись будет вспоминаться в неправильных контекстах.

Ошибка 2: путать scope и visibility.

Запись может быть применима к проекту, но видима только определенной роли.

Ошибка 3: считать session instruction долгосрочной preference.

Временные инструкции требуют TTL.

Ошибка 4: смешивать tenants.

Semantic similarity не отменяет boundaries между customers, workspaces и organizations.

Ошибка 5: расширять scope derived records.

Summary из private sources не должен становиться public без review.

Ошибка 6: не задавать conflict priority.

При конфликте user preference, project rule и organization policy агент начнет импровизировать.

Ошибка 7: использовать agent memory как team policy.

Опыт одного агента не обязан становиться правилом для всех.

Ошибка 8: не учитывать scope при deletion.

Удаление должно находить direct и derived records в нужной области.

Краткое резюме

Scope определяет, где и для кого применима запись памяти. Без scope агент может использовать правильную информацию в неправильном контексте.

Memory systems должны различать user, session, project, agent, team, organization, public и private memory. Для multi-tenant продуктов scope и access control являются safety boundary, а не просто удобными filters.

Хорошая memory architecture поддерживает scope-aware retrieval, conflict priorities, derived-record constraints, TTL для временной памяти и deletion, привязанный к области данных.

Вопросы для самопроверки

  1. Почему запись памяти без scope опасна?
  2. Чем scope отличается от visibility?
  3. Какие данные должны оставаться в session memory, а не переходить в user memory?
  4. Почему multi-tenant isolation нельзя заменять semantic reranking?
  5. Что означает правило: derived memory cannot be less restrictive than its sources?

Что дальше

Module 04 завершает базу о хранении и представлении памяти: мы разобрали storage classes, структуру memory records и scopes. В следующем модуле мы перейдем к архитектурным паттернам: простым memory designs, tiered memory, memory-as-an-OS, hybrid vector-graph memory и event-sourced agents.

Обновлено 08.08.2026