Искусственные интеллект-агенты для будущих инженеров: память, инструменты и циклы управления
Практическая карта составляющих элементов агента — планирование, инструменты, память и оценка — без преувеличенной терминологии, заменяющей собой концепцию дизайна.
В этом руководстве воссоздаётся рабочий путь для книги «Всё, что будущим инженерам ИИ необходимо знать о агентах ИИ». Основное внимание уделяется контрактам, проверкам и коду, который можно добавить в репозиторий без необходимости угадывать его назначение. Для получения общего представления необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не пытаясь угадать скрытое состояние. Желательно использовать небольшие, тестируемые единицы вместо обширных скриптов. При сбое шага причина должна указывать на конкретную ответственность, а не на запутанную цепочку операций.
Как агенты принимают действия
Что касается способов действий агентов, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия элементам, определите критерии успеха и не допускайте молчаливого частичного выполнения задачи. Строго ограничьте схемы инструментов. Широкие параметры в виде свободного текста способствуют внедрению вредоносного кода и затрудняют аудит.
import requests
def search_web(query: str) -> list[dict]:
response = requests.get(
"https://serpapi.com/search",
params={"q": query, "api_key": "YOUR_API_KEY", "num": 5},
)
results = response.json()["organic_results"]
return [
{"title": r["title"], "url": r["link"], "snippet": r["snippet"]}
for r in results
]
results = search_web("best sourdough recipe")
for r in results:
print(r["title"], "-", r["url"])
import anthropic
client = anthropic.Anthropic()
# The menu of tools the model can choose from
tools = [
{
"name": "web_search",
"description": "Search the web for current information.",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "The search query"}
},
"required": ["query"],
},
}
]
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "What's the weather in Seattle right now?"}],
)
print(response.content)
# [ToolUseBlock(name='web_search', input={'query': 'Seattle weather today'})]
# 1. Parse the LLM response to find the tools it wants to run
tool_calls = [block for block in response.content if block.type == "tool_use"]
# 2. Run the functions directly, OUTSIDE of the LLM
# (this is our search_web function from earlier -- plain Python,
# the model never sees this code)
tool_results = []
for call in tool_calls:
if call.name == "web_search":
output = search_web(call.input["query"])
tool_results.append(
{
"type": "tool_result",
"tool_use_id": call.id,
"content": str(output),
}
)
# 3. Hand the results back -- from the model's perspective,
# the answer just shows up in the chat
final = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=[
{"role": "user", "content": "What's the weather in Seattle right now?"},
{"role": "assistant", "content": response.content},
{"role": "user", "content": tool_results},
],
)
print(final.content[0].text)
# "It's 62 and cloudy in Seattle."
Многошаговые задачи
Для многократных задач необходимо заранее определить входные данные, ответственного за выполнение этапа и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить этап с известной точки контроля, не догадываясь о скрытом состоянии. Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее видимость данных предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Жестко ограничьте схемы инструментов: широкие параметры в виде свободного текста способствуют внедрению угроз и делают аудиты дорогостоящими.
# The ReAct loop
while True:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=messages,
)
messages.append({"role": "assistant", "content": response.content})
# If the model didn't ask for any tools, it's done -- that's its final answer
if response.stop_reason != "tool_use":
break
# Otherwise: run the tools, append the results, and go around again
tool_results = []
for block in response.content:
if block.type == "tool_use":
output = run_tool(block.name, block.input)
tool_results.append(
{"type": "tool_result", "tool_use_id": block.id, "content": str(output)}
)
messages.append({"role": "user", "content": tool_results})
print(response.content[0].text)
# "Booked it into your calendar -- cheapest flight was the 9:15am Alaska
# departure Friday at $138. Event added from 9:15am to 11:30am."
Надежные результаты
Для получения надежных результатов необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь кодовый граф. Строго ограничьте схемы инструментов. Широкие параметры в виде свободного текста способствуют внедрению угроз и затрудняют аудит. Для получения надежных результатов необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Воздерживайтесь от использования обширных скриптов в пользу небольших, тестируемых единиц. При сбое шага он должен указывать на конкретную причину, а не на сложную структуру обработки данных.
system_prompt = """You have access to a web_search tool.
To use it, respond with JSON in this format:
{"name": "web_search", "input": {"query": "..."}}
CRITICAL: You MUST respond with ONLY valid JSON. NO other text.
NO markdown. NO code fences. NO explanations before or after.
Your ENTIRE response must be parseable by json.loads().
DO NOT FORGET THE COMMAS. CHECK YOUR BRACKETS.
If you output anything that is not valid JSON, the system WILL CRASH.
THIS IS EXTREMELY IMPORTANT. VALID JSON ONLY.
"""
Высококачественные входные данные
Для высококачественных входных данных необходимо заранее определить сами данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг, исходя из известной точки контроля, без необходимости угадывать скрытое состояние. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Укажите названия результатов работы, определите критерии успеха и не допускайте молчаливого частичного завершения задачи. Создавайте точки контроля после дорогостоящих вызовов модели, чтобы повторная попытка не влекла за собой повторной оплаты той же работы.
tools = [
{
"name": "web_search",
"description": "Search the web for current information.",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"],
},
},
{
"name": "add_calendar_event",
"description": "Add an event to the user's calendar.",
"input_schema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"start_time": {"type": "string"},
},
"required": ["title", "start_time"],
},
},
# ...plus read_email, send_email, get_flights, book_flight,
# read_file, write_file, run_code, and 20 more
]
Доверие к вашему агенту
Чтобы доверять своему агенту, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее отслеживание помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам. Устанавливайте точку контроля после дорогостоящих вызовов модели, чтобы повторные попытки не влекли за собой повторной оплаты той же работы.
Чек-лист операционной деятельности
Для чек-листа операционной деятельности также необходимо определить входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Документируйте как успешный, так и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
Пункт контроля после вызовов дорогостоящих моделей, чтобы повторная попытка не влекла за собой повторной оплаты за одну и ту же работу.
При наличии бюджета добавьте тест на работоспособность, который проверяет критический путь в процессе интеграционного тестирования с использованием фикстур.
Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое какого-либо шага он должен указывать на конкретную проблему, а не на сложную структуру всего процесса.
Пункт контроля после вызовов дорогостоящих моделей, чтобы повторная попытка не влекла за собой повторной оплаты за одну и ту же работу.
Перед внедрением новой стековой архитектуры заморозьте версии, сохраните эталонный вариант выполнения для критического пути и убедитесь в наличии шагов для возврата к предыдущему состоянию. В совместных средах необходимы ограничения на частоту запросов, проверки принадлежности ресурсов и четко определенный ответственный за обновление секретов. Лучше надежность без изысков, чем красивые, но единоразовые демонстрации.
Для замечания по укреплению безопасности №0 необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее отслеживание помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам.
Строго ограничьте структуру инструментов. Широкие параметры в виде свободного текста способствуют внедрению угроз и затрудняют аудит.
Для замечания по укреплению безопасности №1 также необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Документируйте одновременно «идеальный» сценарий работы и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
Точка контроля после дорогостоящих вызовов модели, чтобы повторная попытка не приводила к повторной оплате за одну и ту же работу.
Что касается замечания 2 по усилению безопасности, необходимо определить входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия результатам работы, определите критерии успеха и не допускайте безответственного частичного завершения задачи.
Разделяйте планирование и выполнение с помощью инструментов. Планировщик предлагает варианты; исполнитель вносит изменения; проверщик сравнивает результаты с поставленной целью.
Что касается замечания 3 по усилению безопасности, необходимо определить входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь кодовый граф.
Строго ограничьте схемы инструментов. Широкие параметры в формате свободного текста способствуют внедрению угроз и затрудняют аудит.
Что касается усиления безопасности по пункту 4, определите входные данные, ответственного за шаг и критерии завершения до изменения кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага он должен указывать на конкретную причину, а не на запутанную структуру обработки данных.
Создавайте точку контроля после дорогостоящих вызовов моделей, чтобы повторная попытка не влекла за собой повторной обработки тех же данных.
Что касается замечания по укреплению безопасности №5, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее отслеживание помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам.
Разделяйте планирование и выполнение с помощью инструментов. Планер предлагает решения; исполнитель вносит изменения; проверщик сравнивает результаты с поставленной целью.
Что касается замечания по укреплению безопасности №6, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Документируйте как успешный сценарий работы, так и сценарий восстановления одновременно. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
Шаблоны инструментов должны быть строго ограничены. Широкие параметры в виде свободного текста способствуют внедрению угроз и затрудняют аудиты.
Что касается рекомендации 7 по усилению безопасности, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия результатам работы, определите критерии успеха и не допускайте безответственного частичного выполнения задачи.
Создавайте точки контроля после дорогостоящих вызовов моделей, чтобы повторные попытки не влекли за собой повторной оплаты той же работы.
Что касается рекомендации 8 по усилению безопасности, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код.
Разделяйте планирование и выполнение инструментов. Планировщик предлагает действия; исполнитель их реализует; проверщик сравнивает результаты с поставленной целью.
Что касается усиления безопасности по пункту 9, определите входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Предпочитайте небольшие, тестируемые единицы кода большим скриптам. При сбое шага он должен указывать на конкретную причину, а не на запутанную структуру обработки данных.
Строго ограничьте схемы инструментов. Широкие параметры в виде свободного текста способствуют внедрению угроз и затрудняют аудит.
Для замечания по укреплению безопасности №10 необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее отслеживание помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам.
Создавайте точку контроля после дорогостоящих вызовов модели, чтобы повторная попытка не влекла за собой повторной оплаты той же работы.
Для замечания по укреплению безопасности №11 также необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Документируйте одновременно «идеальный» сценарий работы и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не элементами последующей доработки.
Разделяйте планирование и выполнение инструментом. Планировщик предлагает варианты; исполнитель вносит изменения; проверщик сравнивает результаты с поставленной целью.
Что касается рекомендации по усилению безопасности №12, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия создаваемым объектам, определите критерии успеха и не допускайте молчаливого частичного завершения работы.
Строго ограничьте схемы инструментов. Широкие параметры в виде свободного текста способствуют внедрению угроз и затрудняют аудит.
Что касается рекомендации по усилению безопасности №13, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код.
Создавайте точку контроля после дорогостоящих вызовов модели, чтобы повторная попытка не влекла за собой повторной обработки той же работы.
Согласно рекомендации по усилению безопасности №14, определите входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Предпочитайте небольшие, тестируемые единицы кода большим скриптам. При сбое шага он должен указывать на конкретную причину, а не на запутанную структуру обработки данных.
Разделяйте планирование и выполнение с помощью инструментов. Планировщик предлагает варианты; исполнитель их реализует; проверщик сравнивает результаты с поставленной целью.
Для пункта усиления безопасности №15 необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.
Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее отслеживание помогает избежать неожиданных счетов при переходе от демо-среды к общедоступным средам.
Строго ограничьте структуру инструментов. Широкие параметры в виде свободного текста способствуют внедрению угроз и затрудняют аудит.