Анатомия агента: мозг, инструменты, память, цикл

Разбираем агента на четыре части и показываем, как они соединяются в одну систему.

Цикл управления (agent loop) — повторяющийся процесс, в котором «мозг»-LLM на основе памяти решает следующее действие, инструмент его выполняет, а результат снова попадает в память.

Четыре компонента

Любой агент, от учебного до промышленного, можно описать четырьмя частями. Если убрать любую — это уже не агент.

1. Модель — «мозг»

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

2. Инструменты — «руки»

Инструмент — это функция, которую агент может вызвать: калькулятор, поиск, запрос к базе, отправка письма, выполнение кода. Инструменты выводят агента за пределы текста — позволяют считать точно, получать свежие данные и менять внешний мир. Им посвящён весь раздел 2.

3. Память — «контекст»

Память хранит то, что агент уже сделал и узнал. Краткосрочная память — это история текущего диалога (она помещается в контекстное окно модели). Долгосрочная — внешнее хранилище (часто векторная база), куда складывают факты, чтобы доставать их позже. Памяти посвящён раздел 4.

4. Цикл управления — «нервная система»

Цикл связывает всё: берёт текущую память, спрашивает модель о следующем шаге, выполняет инструмент, кладёт результат обратно в память — и повторяет, пока модель не скажет «готово» (или не сработает лимит шагов).

Как это соединяется

Опишем компоненты как Python-объекты и прогоним один полный оборот цикла. Модель — заглушка, инструменты — словарь функций, память — список.

# Память
memory = []

# Инструменты («руки»)
def calc(expr):
    return str(eval(expr))
TOOLS = {"calc": calc}

# Модель («мозг») — заглушка: решает шаг по памяти
def brain(memory):
    if not any("12" in m for m in memory):
        return ("action", "calc", "3 * 4")
    return ("finish", "Ответ: 12", None)

# Цикл управления
goal = "посчитать 3 * 4"
memory.append(f"GOAL: {goal}")
for step in range(1, 5):
    kind, a, b = brain(memory)
    if kind == "finish":
        print("ФИНАЛ:", a)
        break
    result = TOOLS[a](b)
    memory.append(f"{a}({b}) -> {result}")
    print(f"шаг {step}: вызвал {a}({b}) = {result}")

print("Память в конце:", memory)

Вывод:

шаг 1: вызвал calc(3 * 4) = 12
ФИНАЛ: Ответ: 12
Память в конце: ['GOAL: посчитать 3 * 4', 'calc(3 * 4) -> 12']

Видно, как четыре части работают вместе: brain (мозг) принял решение, TOOLS (руки) выполнили, memory (память) накопила результат, цикл (нервная система) всё повторял до финала.

Где обычно ломается

  • Мозг плохо рассуждает — модель выбирает не тот инструмент или путает аргументы. Лечится лучшей моделью, примерами в промпте, более чётким форматом.
  • Инструмент ненадёжен — упал API, вернулась ошибка. Нужна обработка ошибок (раздел 2).
  • Память переполнилась — история не влезает в контекст. Нужны обрезка, суммаризация, долгосрочная память (раздел 4).
  • Цикл не останавливается — агент зациклился. Нужен лимит шагов (раздел 3).

Итог

  • Агент = модель (мозг) + инструменты (руки) + память (контекст) + цикл (нервная система).
  • Модель только решает, действия выполняют инструменты, результаты копит память, всё связывает цикл.
  • Каждый компонент — потенциальная точка отказа; следующие разделы разбирают их по очереди.
Проверьте себя
1. За что в агенте отвечает LLM («мозг»)?
AВыполняет вызовы API и считает
BРешает, какое действие сделать дальше, и формулирует это текстом
CХранит долгосрочные факты
DОстанавливает цикл по таймеру
2. Чем краткосрочная память агента отличается от долгосрочной?
AКраткосрочная быстрее работает
BКраткосрочная — это история диалога в контексте модели, долгосрочная — внешнее хранилище (часто векторная база)
CДолгосрочная хранится в самой LLM
DРазличий нет, это синонимы
3. Что произойдёт, если из агента убрать цикл управления?
AАгент станет быстрее
BПолучится обычный одношаговый вызов модели, а не агент
CАгент потеряет доступ к инструментам
DНичего не изменится
Поддержать проект