Агенты на Claude: системный промпт, инструменты, память
Продвинутый18 мин
Как строить автономных агентов на Claude API. Разбираем системный промпт, tool use, управление контекстом и паттерны для production-агентов.
Что такое агент
Агент — это языковая модель + инструменты + цикл исполнения. Модель решает, какой инструмент вызвать, получает результат и продолжает до завершения задачи.
[задача] → модель → [выбор инструмента] → [исполнение] → [результат] → модель → …Системный промпт агента
Хороший системный промпт для агента содержит:
1. Роль и цель
# Роль
Ты — автономный агент «Исследователь».
Твоя задача: находить и структурировать информацию по запросу пользователя.2. Инструменты
# Доступные инструменты
- web_search(query) — поиск в интернете
- read_url(url) — чтение страницы по URL
- save_note(title, content) — сохранение заметки3. Правила исполнения
# Правила
- Докладывай каждый шаг в формате: [ШАГ N] Действие
- Не придумывай данные — только из источников
- Завершай явным выводом: РЕЗУЛЬТАТ: ...
- Максимум 10 шаговTool Use в Claude API
import anthropic
client = anthropic.Anthropic()
tools = [
{
"name": "web_search",
"description": "Search the web for information",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"}
},
"required": ["query"]
}
}
]
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
tools=tools,
messages=[{"role": "user", "content": "Find top AI news today"}]
)Управление контекстом
У агентов есть проблема: контекст конечен, а задача может быть длинной.
Паттерн «внешняя память»
Сохраняйте промежуточные результаты вне контекста (в файл, БД), и подгружайте только нужное:
[Агент] → [save_note()] → [БД заметок]
[Агент] → [list_notes()] → [загрузить нужные]Паттерн «сжатие истории»
Раз в N шагов просите модель сжать историю работы:
«Summarize what you've done so far in 200 words»
И заменяйте историю этим резюме.
Production-паттерны
Retry с backoff
Инструменты могут падать. Всегда оборачивайте вызовы:
import time
def call_with_retry(fn, max_retries=3):
for i in range(max_retries):
try:
return fn()
except Exception as e:
if i == max_retries - 1:
raise
time.sleep(2 ** i)Ограничение шагов
Агент без ограничений может зациклиться. Добавьте счётчик:
MAX_STEPS = 15
steps = 0
while not done and steps < MAX_STEPS:
response = call_claude(...)
steps += 1