Я создал agent-memory-state — open-source Python библиотеку для управления персистентной памятью AI агентов. Реализует паттерн state-based memory из OpenAI Cookbook: профиль пользователя, разделение session/global памяти, LLM-консолидация и защитные механизмы.
Каждый раз, начиная новый разговор с AI-ассистентом, он забывает всё. Ваши диетические предпочтения, привычки в путешествиях, рабочий контекст — стёрты. Приходится объяснять одно и то же снова и снова.
Это не просто раздражает — это фундаментальное ограничение. Переход от «отвечать» к «помнить» определяет новый рубеж AI-агентов. Агент, который помнит, становится коллаборатором, а не просто инструментом.
Изучив паттерн персонализации контекста из OpenAI Cookbook, я создал библиотеку, реализующую эту архитектуру:
┌─────────────────────────────────────────────┐ │ MemoryState │ ├─────────────────────────────────────────────┤ │ profile: {name, email, loyalty_status} │ │ global_memory: [персистентные заметки] │ │ session_memory: [заметки текущей сессии] │ └─────────────────────────────────────────────┘ ↓ to_system_prompt() ┌─────────────────────────────────────────────┐ │ --- │ │ name: Alice │ │ loyalty_status: gold │ │ --- │ │ │ │ ## User Memory │ │ - [dietary] Предпочитает вегетарианское │ │ - [travel] Обычно бронирует место у прохода│ └─────────────────────────────────────────────┘
from agent_memory import MemoryState state = MemoryState(user_id="user_123") state.profile["name"] = "Alice" state.profile["loyalty_status"] = "gold"
State содержит:
Profile: Жёсткие факты (имя, email, уровень членства)
Global Memory: Персистентные предпочтения между сессиями
Session Memory: Временные заметки текущего разговора
# Генерируем системный промпт с памятью system_prompt = state.to_system_prompt() # Или с защитными разделителями system_prompt = state.to_memory_block() # Оборачивает в <memory>...</memory>
Формат вывода:
Профиль как YAML frontmatter
Заметки как Markdown список с датами
Сессионные заметки с префиксом [SESSION]
Во время разговора агент захватывает устойчивые предпочтения:
state.add_session_note( text="Пользователь предпочитает вегетарианскую еду в поездках", keywords=["dietary"], confidence=0.9 )
Или используйте как инструмент агента:
from agent_memory import create_save_memory_tool, SAVE_MEMORY_TOOL_SCHEMA save_memory = create_save_memory_tool(state) tools = [SAVE_MEMORY_TOOL_SCHEMA] # Для OpenAI function calling
После сессии объединяем session notes в global memory:
from openai import AsyncOpenAI client = AsyncOpenAI() await manager.consolidate(state, client)
LLM выполняет:
Дедупликацию: Слияние семантически похожих заметок
Разрешение конфликтов: Новая информация побеждает
Фильтрацию: Отбрасывает сессионные заметки («только для этой поездки»)
Реальный вывод (Travel Agent Demo):
Пользователь во время разговора:
Агент сохраняет обе заметки в session memory. После разговора:
До консолидации (5 заметок): - [baggage, short_trip] Для коротких поездок предпочитает без багажа - [seat_preference, flight] Обычно предпочитает место у прохода - [neighborhood, hotel] Любит центральные районы - [dietary] Вегетарианец ← SESSION - [seat, flight] Только для этой поездки: хочет окно для Фудзи ← SESSION [Consolidation] LLM merge: {'merged': 2, 'discarded': 2, 'total': 3} После консолидации (3 заметки): - [dietary] Предпочитает вегетарианскую еду в поездках ✅ СОХРАНЕНО - [travel, flight] Обычно предпочитает место у прохода ✅ ОБЪЕДИНЕНО - [neighborhood, hotel] Любит центральные районы ✅ СОХРАНЕНО ❌ "окно только для этой поездки" — корректно отброшено (session-specific)
from agent_memory.guardrails import GuardedMemoryState, GuardrailConfig config = GuardrailConfig( max_note_length=500, max_notes_per_user=100, block_ssn=True, block_credit_card=True, block_instructions=True, ) guarded = GuardedMemoryState(state, config) guarded.add_session_note("Мой SSN 123-45-6789") # Вызывает ValueError
Блокирует:
PII паттерны (SSN, кредитные карты, телефоны)
Инъекцию инструкций («игнорируй предыдущие инструкции...»)
Превышение лимитов
from agent_memory.storage import InMemoryStorage manager = MemoryManager(storage=InMemoryStorage())
from agent_memory.storage import SQLiteStorage manager = MemoryManager(storage=SQLiteStorage("./memory.db"))
from agent_memory import MemoryManager from agent_memory.storage import SQLiteStorage from openai import AsyncOpenAI # Инициализация manager = MemoryManager(storage=SQLiteStorage("./memory.db")) state = manager.load_user("alice_123") # Настройка профиля state.profile["name"] = "Alice" state.profile["loyalty_status"] = "gold" # Формируем системный промпт base_prompt = "Ты — туристический консьерж." memory_block = state.to_memory_block() system_prompt = f"{base_prompt}\n\n{memory_block}" # Во время разговора — агент вызывает save_memory tool state.add_session_note( text="Вегетарианец — предпочитает вегетарианские блюда", keywords=["dietary"], confidence=1.0 ) # После разговора — консолидация client = AsyncOpenAI() await manager.consolidate(state, client) # Сохраняем для следующей сессии manager.save(state)
Не каждому агенту нужна долгосрочная память. Простой тест:
Пропустите память для:
Разовых задач (генерация кода, перевод)
Stateless утилит (калькуляторы, конвертеры)
Высоконагруженных API, где важна латентность
Используйте память для:
Персональных ассистентов
Агентов службы поддержки
Систем обучения/коучинга
Любых агентов с повторяющимися пользователями
pip install agent-memory-state # С поддержкой OpenAI (для консолидации) pip install "agent-memory-state[openai]"
Это v0.1.0 — фундамент. Планируемые фичи:
Vector-based retrieval для больших хранилищ памяти
Decay памяти с деградацией confidence со временем
Мульти-агентный шаринг памяти
Аналитика памяти (что запоминается, как часто используется)
Системы памяти улучшаются через итерации с измерениями, а не через изначальную сложность. Начните просто, оценивайте строго, развивайте осознанно.
Ссылки:
GitHub: https://github.com/molchanovartem/agent-memory
OpenAI Cookbook: Context Personalization
Источник


![[Перевод] Ретроспектива 2025: год LLM — практика, иллюзия и реальные сдвиги](https://mexc-rainbown-activityimages.s3.ap-northeast-1.amazonaws.com/banner/F20250611171322199PEfklzSxumEfrP.png)