Что такое AI-агент
Чат-бот отвечает и замолкает. AI-агент — система, которая сама решает, что делать дальше: вызвать инструмент, подождать результата, изменить план и повторить цикл, пока задача не выполнена.
Ключевое отличие: агент работает в цикле, а не за один проход.
Цикл агента
Каждая итерация состоит из четырёх шагов:
Perception → Reasoning → Action → Observation
↑ │
└─────────────────────────────────────────┘
| Шаг | Что происходит |
|-----|----------------|
| Perception | Агент получает входные данные: запрос пользователя, результаты предыдущих вызовов, содержимое памяти |
| Reasoning | LLM решает: ответить текстом, вызвать инструмент или завершить работу |
| Action | Инструмент выполняется (ваш код), API вызывается, файл записывается |
| Observation | Результат действия добавляется в контекст — и цикл начинается снова |
Как LLM принимает решения
Модель не «думает» в привычном смысле. Она генерирует следующий токен, опираясь на весь контекст — системный промпт, историю диалога, описания инструментов и результаты предыдущих вызовов.
Три возможных исхода на каждой итерации:
- Финальный ответ — модель считает задачу решённой.
- Вызов инструмента — модель генерирует JSON-запрос вместо текста.
- Промежуточное рассуждение — модель «думает вслух» (chain-of-thought), прежде чем решить.
import anthropic
client = anthropic.Anthropic()
tools = [
{
"name": "search_web",
"description": "Search the web for current information. Use when the user asks about recent events or facts you may not know.",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"}
},
"required": ["query"]
}
}
]
def run_agent(user_message: str) -> str:
messages = [{"role": "user", "content": user_message}]
while True:
response = client.messages.create(
model="claude-opus-4-5",
max_tokens=1024,
tools=tools,
messages=messages,
)
# Финальный ответ
if response.stop_reason == "end_turn":
return response.content[0].text
# Вызов инструмента
if response.stop_reason == "tool_use":
messages.append({"role": "assistant", "content": response.content})
tool_results = []
for block in response.content:
if block.type == "tool_use":
result = execute_tool(block.name, block.input)
tool_results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
})
messages.append({"role": "user", "content": tool_results})
# Продолжаем цикл
def execute_tool(name: str, input: dict) -> str:
if name == "search_web":
return f"[Search results for '{input['query']}': ...]"
return "Tool not found"
Чем агент отличается от чат-бота
| Признак | Чат-бот | AI-агент |
|---------|---------|----------|
| Количество проходов | Один | Много (цикл) |
| Доступ к инструментам | Нет | Да |
| Способность планировать | Нет | Да |
| Изменение плана по ходу | Нет | Да |
| Автономность | Низкая | Высокая |
Когда цикл останавливается
Агент завершает работу, когда:
- LLM вернула
stop_reason: "end_turn" без вызовов инструментов.
- Достигнут лимит итераций (защита от бесконечного цикла).
- Инструмент вернул специальный сигнал остановки.
Всегда устанавливайте максимальное число итераций — агент может зациклиться, если инструмент постоянно возвращает ошибку.