Создание работающего AI-агента: практический глоссарий
Что такое AI-агент на самом деле, чем он отличается от чатбота и какие компоненты нужны, чтобы его построить.
AI-агент — это программа, которая получает цель, определяет последовательность действий и выполняет эти действия с помощью инструментов до достижения цели или отказа. Это отличается от чатбота, который просто отвечает на сообщения. Агент планирует, вызывает функции, проверяет результаты и корректирует действия. Если вы использовали ChatGPT только в браузере, создание первого агента — это момент, когда модель перестаёт быть просто генератором текста и становится компонентом в большей системе.
Основной цикл
Каждый агент, независимо от того, как его позиционируют, выполняет один и тот же цикл: наблюдай, думай, действуй, повтори. Конкретно:
- Агент получает задачу ("найти самый дешевый рейс в Лиссабон в следующем месяце и составить краткое резюме по электронной почте").
- Он вызывает LLM с описанием задачи и доступных инструментов.
- Модель возвращает либо окончательный ответ, либо вызов инструмента, например
search_flights(destination="Lisbon", month="2025-06"). - Ваш код выполняет эту функцию, получает реальный результат и передаёт его обратно в контекст модели.
- Модель решает, что делать дальше: вызвать другой инструмент, запросить уточнение или завершить работу.
Этот паттерн часто называют ReAct-циклом (reason plus act), и он лежит в основе фреймворков, таких как LangChain, LlamaIndex и функции вызова OpenAI. Вы можете реализовать всё это самостоятельно менее чем в 100 строках Python, используя просто LLM API и цикл while — фреймворки добавляют удобство, а не магию.
Инструменты делают это агентом
Модель без инструментов может только говорить. Дайте ей функции — и она может действовать. Инструменты — это обычно функции Python с описанием в виде схемы, которая указывает их имя, параметры и назначение, чтобы модель знала, когда и как их вызывать. Пример:
def get_weather(city: str) -> str:
"""Return current weather for a given city."""
resp = requests.get(f"https://api.weather.example/v1/{city}")
return resp.json()["summary"]
С функцией вызова OpenAI вы передаёте JSON-схему вместе с этой функцией, и модель выдаёт структурированный вызов вроде {"name": "get_weather", "arguments": {"city": "Lisbon"}} вместо свободного текста. Ваш код парсит это, запускает реальную функцию и возвращает результат как новое сообщение в беседе. Повторяйте, пока модель не получит достаточно информации для ответа.
Память и состояние
Один вызов API не помнит ничего за пределами своего контекстного окна. Агентам нужно явное состояние: список сообщений (история беседы) и часто отдельное хранилище для долгосрочных фактов. Для коротких задач достаточно Python-списка словарей, представляющих беседу. Для агентов, которым нужно запоминать информацию между сессиями, пригодится векторная база данных (Chroma, Pinecone, Qdrant) для хранения и поиска релевантной информации из прошлого через эмбеддинги.
Не переусложняйте это на начальном этапе. Удивительно много проектов с "агентами" падают не потому, что LLM слабая, а потому что управление состоянием неряшливо: дублирующиеся сообщения, неограниченный рост контекста или потеря связи между вызовом инструмента и результатом.
Минимальный рабочий пример
Вот структура базового агента, использующего OpenAI API без фреймворка:
messages = [{"role": "user", "content": "What's the weather in Lisbon?"}]
while True:
response = client.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=[weather_tool_schema],
)
msg = response.choices[0].message
if msg.tool_calls:
for call in msg.tool_calls:
result = get_weather(**json.loads(call.function.arguments))
messages.append(msg)
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result,
})
else:
print(msg.content)
break
Это реальный, работающий агент. Всё остальное — стратегии планирования, координация между несколькими агентами, конвейеры поиска — строится на этом цикле.
Где он ломается
Агенты падают предсказуемо: бесконечные циклы вызовов инструментов, когда модель не понимает, что успела, галлюцинации в аргументах функций и неконтролируемые затраты на повторные вызовы дорогих инструментов. Защититесь от циклов жёсткой лимитом итераций (скажем, 10 шагов) и логируйте каждый вызов инструмента во время разработки. Проверяйте аргументы перед выполнением чего-либо, что трогает реальную систему — агент, который может отправлять письма или запускать shell-команды, нуждается в такой же обработке входных данных, как пользовательский код, потому что LLM в эффекте — это ненадёжный пользователь, генерирующий этот ввод.
Что дальше
Когда цикл работает, начинаются интересные задачи: выбор между одноагентными и многоагентными архитектурами, решение вопроса о степени автономии и надёжное тестирование агентов, когда их вывод недетерминирован. Курсы AI и Python в Korra Studio подробнее рассматривают retrieval-augmented generation, дизайн промптов и паттерны работы с инструментами, если вы хотите продолжить разработку отсюда.
Написано с помощью ИИ, проверено и опубликовано Михалом Пильхом (CISSP), Korra Studio.
Это одна заметка из базы знаний Korra Studio — платформа сочетает каждую тему с наставничеством один на один.
Начать бесплатноarrow_forward