feat(site): добавлен раздел «Разработка с ИИ» с двумя статьями-переводами
- Зачем: - расширить роадмап практическим разделом о работе с ИИ-ассистентами. - Что: - добавлена вводная страница ai-dev/README.md. - добавлен перевод «Лучшие практики работы с coding agents» (ai-dev/best-practice.md). - добавлен перевод «Механизм памяти coding agents» (ai-dev/memory-mechanism.md). - добавлен раздел «Разработка с ИИ» в навигацию mkdocs.yml. - Проверка: - mkdocs build --strict проходит без ошибок. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,362 @@
|
||||
# Механизм памяти coding agents
|
||||
|
||||
> По мотивам [Memory Mechanism](https://docs.z.ai/devpack/resources/memory-mechanism) (Z.AI DevPack)
|
||||
|
||||
Память позволяет coding agent сохранять контекст между задачами и сессиями, сокращая повторный ввод и повышая эффективность выполнения. С хорошо продуманной системой памяти агент может постоянно учитывать структуру проекта, инженерные конвенции и предпочтения пользователя, автоматически переиспользуя эту информацию в будущей работе.
|
||||
|
||||
В системах coding agents память обычно организована в несколько слоёв: **автоматическая память, проектная память** и **сессионная память**.
|
||||
|
||||
## Зачем coding agents нужна память?
|
||||
|
||||
Традиционные большие языковые модели не сохраняют состояние между вызовами. Они не могут запомнить контекст проекта между сессиями, накапливать опыт решения проблем или последовательно адаптироваться к предпочтениям пользователя.
|
||||
|
||||
Агентные системы решают это ограничение через **внешнюю память**.
|
||||
|
||||
Типичная архитектура выглядит так:
|
||||
|
||||
```
|
||||
Ввод пользователя
|
||||
↓
|
||||
Извлечение памяти
|
||||
↓
|
||||
Сборка контекста
|
||||
↓
|
||||
Рассуждение LLM
|
||||
↓
|
||||
Действие / вызов инструмента
|
||||
↓
|
||||
Обновление памяти
|
||||
```
|
||||
|
||||
Агент извлекает релевантную память перед началом задачи и обновляет память после завершения.
|
||||
|
||||
Эта архитектура является общим паттерном в современных агентных системах, таких как LangGraph, AutoGPT и Devin.
|
||||
|
||||
## Полная архитектура памяти
|
||||
|
||||
На высоком уровне полная архитектура памяти агента выглядит так:
|
||||
|
||||
```
|
||||
Краткосрочная память
|
||||
↓
|
||||
Контекст сессии
|
||||
|
||||
Долгосрочная память
|
||||
├ семантическая память
|
||||
├ эпизодическая память
|
||||
└ процедурная память
|
||||
```
|
||||
|
||||
## Основные типы памяти
|
||||
|
||||
### Сессионная память
|
||||
|
||||
Сессионная память — это контекстная информация текущей задачи. Включает текущую историю разговора, последние результаты инструментов, текущий план выполнения и содержимое файлов в области видимости. Эта информация обычно находится в контекстном окне модели.
|
||||
|
||||
Пример:
|
||||
|
||||
```
|
||||
Пользователь: Исправь этот баг в Python
|
||||
Агент: Анализирует ошибку
|
||||
Агент: Модифицирует код
|
||||
Агент: Запускает тесты
|
||||
```
|
||||
|
||||
Все эти шаги выполнения относятся к сессионной памяти.
|
||||
|
||||
### Проектная память
|
||||
|
||||
Проектная память хранит **долгоживущую информацию о всей кодовой базе**: архитектуру проекта, стандарты кодирования, процессы сборки, часто используемые команды. Такая память обычно записывается в `.md`-файлы и загружается в начале сессии.
|
||||
|
||||
Пример структуры:
|
||||
|
||||
```
|
||||
your-project/
|
||||
├── .claude/
|
||||
│ ├── CLAUDE.md # Основные инструкции проекта
|
||||
│ └── rules/
|
||||
│ ├── code-style.md # Стиль кода
|
||||
│ ├── testing.md # Конвенции тестирования
|
||||
│ └── security.md # Требования безопасности
|
||||
```
|
||||
|
||||
При такой структуре агент автоматически следует этим правилам при модификации кода.
|
||||
|
||||
### Семантическая память
|
||||
|
||||
Семантическая память хранит фактические знания и справочную информацию: документацию API, правила языков программирования, базы знаний проекта. На практике часто реализуется через RAG (Retrieval-Augmented Generation).
|
||||
|
||||
Типичный поток:
|
||||
|
||||
```
|
||||
запрос
|
||||
↓
|
||||
эмбеддинг
|
||||
↓
|
||||
векторный поиск
|
||||
↓
|
||||
извлечение документов
|
||||
↓
|
||||
рассуждение LLM
|
||||
```
|
||||
|
||||
Это один из наиболее распространённых методов запоминания в coding agents.
|
||||
|
||||
### Эпизодическая память
|
||||
|
||||
Эпизодическая память записывает прошлый опыт агента: шаги исправления предыдущего бага, корневую причину прошлого сбоя сборки, стратегию отладки, которая сработала. Этот тип памяти помогает агенту учиться на предыдущем опыте.
|
||||
|
||||
Пример:
|
||||
|
||||
```
|
||||
Эпизод:
|
||||
Сбой CI из-за отсутствующей зависимости
|
||||
Решение: обновить pip-пакет
|
||||
```
|
||||
|
||||
### Процедурная память
|
||||
|
||||
Процедурная память хранит стратегии или пошаговые процессы выполнения задач.
|
||||
|
||||
Пример:
|
||||
|
||||
```
|
||||
Debug_Workflow.md
|
||||
1. прочитать лог ошибок
|
||||
2. найти файл
|
||||
3. написать патч
|
||||
4. запустить тесты
|
||||
```
|
||||
|
||||
Такая память обычно используется в системных промптах, шаблонах рабочих процессов и политиках агента.
|
||||
|
||||
## Стандартный паттерн использования памяти
|
||||
|
||||
В реальных системах агенты обычно следуют единообразному процессу работы с памятью.
|
||||
|
||||
**Шаг 1: Извлечение памяти**
|
||||
|
||||
Перед началом задачи агент извлекает релевантную проектную память, записи из базы знаний и предыдущий опыт, затем внедряет их в рабочий контекст.
|
||||
|
||||
**Шаг 2: Сборка контекста**
|
||||
|
||||
Извлечённые воспоминания собираются в полный контекст и передаются модели.
|
||||
|
||||
**Шаг 3: Обновление памяти**
|
||||
|
||||
После завершения задачи агент решает, нужно ли записать новые воспоминания: обнаруженные проектные правила, опыт отладки или предпочтения пользователя.
|
||||
|
||||
## Как правильно использовать память
|
||||
|
||||
В основных агентных системах память проектируется как **многослойная, управляемая, извлекаемая и обновляемая**.
|
||||
|
||||
Обычно память делится на **краткосрочную** и **долгосрочную**. Краткосрочная используется для сохранения состояния в текущем потоке или сессии. Долгосрочная поддерживается через явные файлы, конфигурации правил, векторное извлечение или другие механизмы постоянного хранения.
|
||||
|
||||
Например, в **Claude Code** каждая сессия начинается с чистого контекстного окна. Знания переносятся между сессиями через файлы инструкций (CLAUDE.md) и **автоматическую память**. В **LangChain / LangGraph** память также делится на **краткосрочную в рамках потока** и **долгосрочную между сессиями**.
|
||||
|
||||
На практике наиболее эффективный подход: не полагаться на модель в автоматическом «запоминании всего», а установить чёткий паттерн управления памятью. Определить: что записывать в проектные файлы памяти, что извлекать из базы знаний или векторного хранилища, что оставить только в текущей сессии, а что продвинуть в долгосрочную память после завершения задачи.
|
||||
|
||||
### Разделяйте инструкционную и обучающую память
|
||||
|
||||
Один из наиболее практичных принципов: различать два фундаментально разных вида памяти.
|
||||
|
||||
- **Инструкционная память**: написана людьми, чтобы указать агенту, как он должен работать. Обычно включает стандарты кодирования, конвенции директорий, команды сборки, процедуры тестирования, требования к именованию, правила коммитов и правила безопасности на уровне команды. В Claude Code это файлы инструкций вроде `CLAUDE.md`
|
||||
|
||||
- **Обучающая память**: не определена заранее, а накоплена агентом из ваших поправок, предпочтений, неудачных попыток, частых команд и привычек проекта. В Claude Code это называется автоматическая память (auto memory)
|
||||
|
||||
Если эти два типа памяти смешиваются, поведение системы со временем дрейфует. Лучший подход: чётко разделить их роли.
|
||||
|
||||
- **Правила, политики и поведенческие ограничения** записывайте в **инструкционную память**, чтобы поведение агента оставалось стабильным и предсказуемым
|
||||
- **Опыт, предпочтения пользователя, временные открытия и ретроспективные выводы** записывайте в **обучающую память**, чтобы решения улучшались в будущих задачах
|
||||
|
||||
Это разделение предотвращает постепенное загрязнение основных правил системы заметками из опыта.
|
||||
|
||||
### Многоуровневое управление памятью
|
||||
|
||||
#### Уровень организации
|
||||
|
||||
Правила, определённые и распространяемые на уровне команды или компании, применимые ко всем разработчикам и проектам:
|
||||
|
||||
- требования безопасности и соответствия
|
||||
- базовые стандарты код-ревью
|
||||
- запрещённые директории для чтения/записи
|
||||
- ограничения зависимостей и лицензий
|
||||
- инженерные стандарты организации
|
||||
|
||||
На организационном уровне общий файл правил развёртывается по системному пути и не должен легко отключаться пользователями. **Организационная память — это высокоприоритетный управленческий слой, который не должен обходиться.**
|
||||
|
||||
#### Уровень проекта
|
||||
|
||||
Командный контекст проекта, версионируемый и общий для всех участников. **Это самый важный слой памяти для coding agent.**
|
||||
|
||||
- документация архитектуры проекта
|
||||
- конвенции структуры директорий
|
||||
- команды сборки и тестирования
|
||||
- где должны располагаться API
|
||||
- конвенции именования
|
||||
- типовые процессы разработки
|
||||
|
||||
Claude Code рекомендует хранить эту информацию в проектном файле, а команда `/init` может автоматически сгенерировать первоначальный черновик. Ключевое свойство этого слоя: **общий для проекта, под контролем версий, стабильный во времени**.
|
||||
|
||||
#### Уровень пользователя
|
||||
|
||||
Персональные предпочтения разработчика, применимые ко всем проектам. Лучше хранить в домашней директории пользователя как переиспользуемый личный контекст для всех рабочих пространств:
|
||||
|
||||
- предпочитаемый стиль кодирования
|
||||
- привычная последовательность отладки
|
||||
- предпочитаемый формат вывода
|
||||
- персональные быстрые команды
|
||||
|
||||
Должен дополнять проектные конвенции, а не переопределять их.
|
||||
|
||||
#### Локальный уровень
|
||||
|
||||
Специфичен для вашей локальной копии проекта, **не должен попадать в Git**:
|
||||
|
||||
- персональные тестовые аккаунты
|
||||
- локальные порты разработки
|
||||
- временные адреса тестовых заглушек
|
||||
- заметки по среде выполнения на конкретной машине
|
||||
- экспериментальные рабочие процессы, не готовые к распространению
|
||||
|
||||
Ценность этого слоя: **позволяет индивидуальную эффективную работу без загрязнения общей памяти**.
|
||||
|
||||
#### Уровень субагента / роли
|
||||
|
||||
Разные субагенты могут поддерживать собственные области памяти вместо использования единой глобальной. Это особенно важно в многоагентных системах, где одна из самых частых проблем: загрязнение контекста между ролями.
|
||||
|
||||
Лучший паттерн: каждый субагент хранит только память, релевантную его роли:
|
||||
|
||||
- **агент тестирования** помнит команды тестирования, поведение CI, стиль утверждений
|
||||
- **агент рефакторинга** помнит границы модулей, запрещённые зависимости, стратегии миграции
|
||||
- **агент документации** помнит глоссарий терминов, шаблоны документации, стиль для целевой аудитории
|
||||
|
||||
Это делает память короче, точнее и стабильнее.
|
||||
|
||||
### Загрузка `.md`-файлов по пути
|
||||
|
||||
Для крупных репозиториев рекомендуется разделять инструкции на несколько Markdown-файлов в `.claude/rules/`, каждый посвящён одной теме: `testing.md`, `api-design.md`, `security.md`.
|
||||
|
||||
Claude Code также поддерживает **привязку правил к определённым поддиректориям или типам файлов**: правила загружаются только когда агент работает с подходящими файлами. Это снижает шум и экономит контекстное окно.
|
||||
|
||||
Три принципа организации:
|
||||
|
||||
- **Основной файл памяти ограничен глобальным общим контекстом**: фон проекта, высокоуровневая архитектура, кросс-проектные конвенции
|
||||
- **Специализированные правила модульны**: один файл правил на тему
|
||||
- **Если правило можно загрузить по пути, не загружайте его глобально**: включайте в контекст только при необходимости
|
||||
|
||||
Пример структуры:
|
||||
|
||||
```
|
||||
agent-memory/
|
||||
├── project.md # Обзор проекта
|
||||
├── rules/
|
||||
│ ├── code-style.md # Стиль кода
|
||||
│ ├── testing.md # Конвенции тестирования
|
||||
│ ├── api-design.md # Правила дизайна API
|
||||
│ ├── security.md # Требования безопасности
|
||||
│ └── frontend/
|
||||
│ └── react.md # Правила фронтенда
|
||||
└── local/
|
||||
└── developer.local.md
|
||||
```
|
||||
|
||||
Три преимущества такой структуры:
|
||||
|
||||
1. **Проще поддерживать.** Каждый файл правил фокусируется на одной теме, набор правил менее склонен к разрастанию
|
||||
2. **Проще загружать по запросу.** Когда агент работает над тестами, ему не нужно загружать конвенции фронтенда или правила баз данных
|
||||
3. **Лучше для командной работы.** Разные команды могут поддерживать собственные директории правил вместо редактирования единого монолитного файла
|
||||
|
||||
### Пишите правила памяти как конкретные инструкции
|
||||
|
||||
При написании памяти агента используйте **конкретные, проверяемые правила**, а не абстрактные принципы. Чем яснее инструкции, тем стабильнее поведение агента.
|
||||
|
||||
Общие рекомендации:
|
||||
|
||||
- инструкции должны быть **лаконичными и явными**
|
||||
- правила должны быть **согласованы** друг с другом
|
||||
- основной файл памяти **не более 200 строк** по возможности
|
||||
- используйте **Markdown-заголовки и списки** для читаемости
|
||||
- формулируйте требования как правила, которые можно **проверить и выполнить**
|
||||
|
||||
Избегайте расплывчатых формулировок:
|
||||
|
||||
- ~~Держите код чистым~~
|
||||
- ~~Пишите хорошие тесты~~
|
||||
- ~~Следите за дизайном API~~
|
||||
- ~~Разделяйте модули при необходимости~~
|
||||
|
||||
Предпочитайте конкретные правила:
|
||||
|
||||
- Используйте **2-пробельный отступ** во всех новых TypeScript-файлах
|
||||
- **Запускайте `pnpm test`** после модификации бизнес-логики
|
||||
- Размещайте **все обработчики API в `src/api/handlers/`**
|
||||
- Держите React-компоненты страниц **менее 300 строк**; разбивайте большие на хуки или дочерние компоненты
|
||||
|
||||
Конкретные правила значительно сокращают пространство для интерпретации агентом, что повышает стабильность поведения.
|
||||
|
||||
### Переиспользование памяти через импорт
|
||||
|
||||
В реальных проектах многие правила — это **общие инженерные конвенции между репозиториями**. Переписывание их в каждом репозитории увеличивает накладные расходы на поддержку и повышает вероятность рассогласования.
|
||||
|
||||
В Claude Code:
|
||||
|
||||
- `CLAUDE.md` может импортировать другие файлы правил через `@path/to/import`
|
||||
- `.claude/rules/` может делить правила через **символические ссылки** (symlinks)
|
||||
- импортируемый контент раскрывается **рекурсивно**, символические ссылки разрешаются нормально
|
||||
|
||||
Это позволяет командам создавать **переиспользуемые пакеты правил**:
|
||||
|
||||
- `company-security-rules`
|
||||
- `frontend-react-rules`
|
||||
- `backend-api-rules`
|
||||
- `python-testing-rules`
|
||||
|
||||
Каждый проект ссылается только на нужные модули правил, а не поддерживает полную копию всего набора.
|
||||
|
||||
Два прямых преимущества:
|
||||
|
||||
1. **Правила поддерживаются централизованно и обновляются единообразно**
|
||||
2. **Разные проекты разделяют один инженерный язык**, делая поведение агента согласованным между репозиториями
|
||||
|
||||
## Устранение проблем с памятью
|
||||
|
||||
### Агент не следует `.md`-файлам памяти
|
||||
|
||||
`.md`-файлы памяти предоставляются агенту как контекстные инструкции, а не как принудительная конфигурация. Агент прочитает их и попытается следовать, но не гарантирует строгое соблюдение при расплывчатых, неясных или конфликтующих правилах.
|
||||
|
||||
Если агент не следует правилам, проверьте:
|
||||
|
||||
- Подтвердите загрузку `.md`-файлов памяти (команда `/memory` или аналог)
|
||||
- Проверьте, находятся ли файлы в пути, разрешённом для загрузки в текущей сессии
|
||||
- Проверьте конфликты правил между файлами. Если разные файлы дают разные инструкции для одного поведения, агент может выбрать произвольно
|
||||
|
||||
### Непонятно, что сохранила автоматическая память
|
||||
|
||||
Большинство coding agents поддерживают авто-память в фоне для захвата контекста проекта, предпочтений пользователя или частых действий.
|
||||
|
||||
Способы проверки:
|
||||
|
||||
- Выполните `/memory` (или аналогичную команду) для просмотра текущей директории авто-памяти
|
||||
- Авто-память обычно хранится в Markdown-файлах, которые можно читать, редактировать или удалять напрямую
|
||||
|
||||
### Файлы памяти слишком большие
|
||||
|
||||
Раздутые файлы памяти потребляют больше контекстного окна, снижают следование инструкциям и увеличивают вероятность конфликтов.
|
||||
|
||||
Рекомендуется:
|
||||
|
||||
- разделить детальный контент на несколько Markdown-файлов
|
||||
- использовать ссылки на файлы или импорты (`@path/to/file`)
|
||||
- перенести правила в выделенную директорию правил (`rules/`)
|
||||
|
||||
### Инструкции исчезают после сжатия контекста
|
||||
|
||||
Многие coding agents **сжимают или резюмируют контекст** в длинных разговорах для уменьшения длины контекста.
|
||||
|
||||
В большинстве случаев файлы памяти **перезагружаются с диска** после сжатия, поэтому сохраняется только контент, записанный в файлы памяти. Если правила исчезают после сжатия, значит они **существовали только в разговоре** и не были записаны в файл.
|
||||
|
||||
Решение:
|
||||
|
||||
- записывайте долгосрочные инструкции в `.md`-файлы памяти
|
||||
- не полагайтесь только на разговор для сохранения правил
|
||||
Reference in New Issue
Block a user