/
Вопросы и ответы
/
AI-агенты
/

Что такое память агента и как её реализовать

Что такое память агента и как её реализовать

12 часов назад

Никита Вихров

Ответы

0

Что такое память агента и как её реализовать

Агент без памяти — амнезик. Каждый новый диалог начинается с нуля: он не помнит, что делал вчера, какие файлы трогал, какие решения принимал. Для одноразовых задач это нормально. Для агента, который работает с проектом неделями — проблема.

Память бывает трёх типов: короткая, длинная и семантическая.


Короткая память — история сообщений

Самое простое. Всё, что произошло в текущей сессии, живёт в массиве messages. Модель видит всю историю при каждом вызове.

messages = []

def chat(user_input: str) -> str:
    messages.append({"role": "user", "content": user_input})

    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=2048,
        system="Ты — агент-ассистент разработчика.",
        messages=messages
    )

    reply = response.content[0].text
    messages.append({"role": "assistant", "content": reply})
    return reply

chat("Я работаю над проектом на FastAPI")
chat("Помоги написать эндпоинт для регистрации")
# Агент помнит, что проект на FastAPI — это в messages

Проблема: контекстное окно конечно. При длинных сессиях история раздувается и либо обрезается, либо стоит много токенов.

Решение — скользящее окно или сжатие:

MAX_MESSAGES = 20

def trim_messages(messages: list) -> list:
    if len(messages) <= MAX_MESSAGES:
        return messages

    # Оставляем системный контекст и последние N сообщений
    summary_prompt = f"Сожми эту историю диалога в 3-4 предложения:\n{messages[:-10]}"
    summary = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=512,
        messages=[{"role": "user", "content": summary_prompt}]
    ).content[0].text

    # Первым сообщением добавляем сжатый контекст
    trimmed = [{"role": "user", "content": f"Контекст предыдущего диалога: {summary}"},
               {"role": "assistant", "content": "Понял, продолжаем."}]
    return trimmed + messages[-10:]

Длинная память — база данных

Между сессиями messages не сохраняется. Чтобы агент помнил прошлые разговоры — сохраняй ключевые факты в базу.

import json
from pathlib import Path

MEMORY_FILE = Path("agent_memory.json")

def load_memory() -> dict:
    if MEMORY_FILE.exists():
        return json.loads(MEMORY_FILE.read_text())
    return {"facts": [], "decisions": []}

def save_memory(memory: dict):
    MEMORY_FILE.write_text(json.dumps(memory, ensure_ascii=False, indent=2))

def extract_facts(conversation: str) -> list:
    """Просим модель выделить факты из разговора"""
    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=512,
        messages=[{
            "role": "user",
            "content": f"""Выдели ключевые факты из этого разговора, которые стоит запомнить.
Только конкретные факты о проекте, технологиях, решениях.
Отвечай JSON-списком строк.

Разговор:
{conversation}"""
        }]
    )
    return json.loads(response.content[0].text)

# В начале сессии загружаем память
memory = load_memory()
system_prompt = f"""Ты — агент-ассистент разработчика.

Что ты помнишь о проекте:
{chr(10).join(memory['facts'])}"""

# В конце сессии сохраняем новые факты
new_facts = extract_facts(str(messages))
memory["facts"].extend(new_facts)
save_memory(memory)

Семантическая память — поиск по смыслу

Когда фактов много, искать нужный по смыслу, а не перебором. Для этого используют векторные базы данных — но это уже тема RAG, которая заслуживает отдельного разбора.

Для большинства агентов хватает комбинации из короткой памяти (история сессии) и длинной (JSON-файл или простая БД с ключевыми фактами). Семантический поиск нужен, когда фактов тысячи.

12 часов назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845