Главная / Статьи / Практические заметки: что я узнал о доставке производственного ИИ-агента с помощью Google

Практические заметки: что я узнал о доставке производственного ИИ-агента с помощью Google

Пошаговое руководство по практическим советам: что я узнал о доставке производственного ИИ-агента с использованием сервисов Google, включая контракты, проверки и готовые блоки кода для команд, использующих эту модель.

1976 слов

Используйте это как переработанную версию идей из статьи «Чему я научился при разработке производственного ИИ-агента с использованием функций Gemini от Google» для операторов: четкие этапы, упорядоченные блоки кода и записи о восстановлении, которые сохраняются при передаче задач. Этап обзора работает лучше всего, если рассматривать его как измеримую основу. Соберите один идеальный пример работы, один случай сбоя и записи о возврате к предыдущему состоянию перед расширением объема работ. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия создаваемым элементам, определите критерии успеха и не соглашайтесь на молчаливое частичное выполнение задачи.

1. Объявления функций: рассматривайте их как API-контракт с моделью

На этапе разработки объявлений функций типа «1 Function Declarations Think» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения, прежде чем вносить изменения в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рядом с функциональными результатами следует записывать время выполнения и стоимость токенов или запросов. Отображение стоимости на раннем этапе предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Необходимо разделить процесс создания клиента от цикла обработки сообщений, чтобы можно было заменять поставщиков без переписывания машины состояний диалога.

// ❌ Vague — model won’t know when to use it
{ name: ‘get_data’, description: ‘Gets data about a location.’ }
// ✅ Trigger-specific — model knows exactly when this is relevant
{
 name: ‘find_backup_spots’,
 description: ‘Finds nearby indoor/covered alternatives within walking distance ‘
 + ‘if the venue is crowded or weather turns.’,
}
{
 name: ‘calculate_transit_route’,
 description: ‘Calculates precise walking/driving/transit travel times to the venue.’,
 parameters: {
 type: ‘OBJECT’,
 properties: {}, // No parameters — dispatcher injects from context
 },
}

2. Цикл инструмента с несколькими этапами: машина состояний, а не один вызов

Для этапа «The Multi-Turn Tool» необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Конфигурацию следует хранить отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь граф состояний. Необходимо разделить процесс создания клиента от цикла обработки сообщений, чтобы можно было заменять поставщиков без переписывания машины состояний диалога.

Turn 0: [user prompt + system instructions]
 → Model returns: functionCall { name: “tool_a”, args: {…} }
Turn 1: [user prompt, model’s functionCall, your functionResponse for tool_a]
 → Model returns: text response (synthesized from tool_a’s output)
Turn 0: [user prompt]
 → Model returns: functionCall { name: “tool_a”, args: {…} }
Turn 1: [user prompt, functionCall_a, functionResponse_a]
 → Model returns: functionCall { name: “tool_b”, args: {…} }
Turn 2: [user prompt, functionCall_a, functionResponse_a, functionCall_b, functionResponse_b]
 → Model returns: final text (synthesized from both tools)

3. Каскадирование моделей: не ограничивайтесь одной моделью

Для этапа 3 Model Cascading Don необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Необходимо одновременно задокументировать успешный сценарий выполнения и сценарий восстановления. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не этапом последующей доработки. Необходимо разделить процесс создания клиента от цикла обработки сообщений, чтобы можно было заменять поставщиков без переписывания машины состояний обмена сообщениями. Для этапа 3 Model Cascading Don необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед внесением изменений в код. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия соответствующим элементам, определите критерии успеха и не допускайте безответственного частичного завершения работы.

Primary: gemini-3.5-flash-lite (fastest, cheapest, zero-thinking overhead)
Secondary: gemini-3.1-flash-lite (slightly older, same tier)
Tertiary: gemini-2.5-flash (thinking-capable, higher quality)

4. Архитектура API-ключа: шаблон прокси

При работе над четырьмя этапами архитектуры API-ключа сначала запишите условия использования: необходимые параметры входных данных, сигнал о успешном выполнении и последствия частичной неудачи. Такой список помогает избегать ошибок при последующих изменениях кода. Рядом с функциональными результатами записывайте время выполнения операций, стоимость токена или запроса. Отслеживание затрат с самого начала предотвращает неожиданные счета при переходе с демо-среды в общедоступные среды. Ведите журнал запросов, включая идентификаторы запроса, модели и время задержки при каждом вызове. Без такой отчетности периодические ошибки поставщика могут быть приняты за баги приложения.

Решение: прокси с серверной стороны

При работе над этапом «The Solution A Server-Side» сначала запишите условия работы: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой список поможет избежать ошибок при последующих изменениях кода. Храните конфигурацию отдельно от кода приложения. Файлы с настройками окружения, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Фиксируйте ID запроса, ID модели и время задержки при каждом вызове. Без этих данных периодические ошибки поставщика могут показаться багами самого приложения.

const res = await Promise.race([
 proxyCallable({ model: modelName, body: requestBody }),
 new Promise((_, reject) =>
 setTimeout(() => reject(new Error(‘AI proxy timeout’)), 15000)
 ),
]);

5. Компрессия контекста: важнее то, что вы передаете модели, чем сама модель

При работе над этапами 5-й фазы «Компрессии контекста» сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Документируйте одновременно успешный и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработоспособных сообщений являются частью продукта, а не элементами последующей доработки. Ведите журнал записей с идентификатором запроса, идентификатором модели и временем задержки при каждом вызове. Без такой отчетности периодические ошибки поставщика будут выглядеть как баги приложения. При работе над этапами 5-й фазы «Компрессии контекста» сначала запишите условия взаимодействия: необходимые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист поможет сохранять честность при последующих изменениях кода. Рассматривайте этот этап как договор между входными данными и проверенными выходными результатами. Дайте названия соответствующим элементам, определите критерии успешности и не допускайте безусловного частичного завершения работы.

[CONTEXT]
Category: Coffee
Date: Saturday, Aug 30, 2026
Time: 10:00 AM — 11:30 AM (90 mins)
Group Size: 4/8 participants
User Role: Attendee
Country: AU
Currency: AUD
[END CONTEXT]

6. Проектирование агента с упором на работу в офлайн-режиме: детерминистический метод возврата к работоспособному состоянию

Этот этап проектирования агента с упором на работу в офлайн-режиме работает наилучшим образом, если рассматривать его как измеримую основу. Сначала необходимо зафиксировать один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию, прежде чем расширять объем работ. Рядом с функциональными результатами следует записывать время выполнения операций, а также стоимость использования токенов или запросов. Отображение затрат с самого начала помогает избежать неожиданных расходов при переходе от демо-версии к общедоступным средам. Перед обучением алгоритму циклических операций необходимо зафиксировать версию интерпретатора и файлы с информацией о зависимостях. Различия в версиях программного обеспечения между ноутбуком и средами CI являются наиболее частой причиной скрытых сбоев в демонстрациях API.

7. Настройка параметра generationConfig

Этап настройки конфигурации 7-го поколения работает наилучшим образом, если рассматривать его как измеримую поверхность. Соберите один идеальный пример работы, один случай сбоя и записку о возврате к предыдущему состоянию перед расширением объема работ. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь код. Закрепите интерпретатор и файл с информацией о зависимостях до того, как начнете использовать циклы. Различия между ноутбуком и средой CI являются наиболее распространенной причиной скрытых сбоев в демонстрациях API.

{
 “responseMimeType”: “application/json”,
 “temperature”: 0.4,
 “maxOutputTokens”: 600
}
{
 “temperature”: 0.7,
 “maxOutputTokens”: 700
}

8. Инжиниринг системных промптов для использования инструментов

8 этапов инжиниринга системных промптов работают наилучшим образом, когда их рассматривают как измеримую основу. Соберите один идеальный пример взаимодействия, один случай сбоя и записку о откате перед расширением объема работ. Задокументируйте как успешный, так и восстановительный сценарии работы. Повторные попытки, проверки человеком и обработка неработающих сообщений являются частью продукта, а не этапом последующей доработки. Заблокируйте интерпретатор и файлы зависимостей перед тем, как научить алгоритм работе в циклах. Различия между лаптопом и средой CI являются наиболее распространенной причиной скрытых сбоев в демонстрациях API. 8 этапов инжиниринга системных промптов работают наилучшим образом, когда их рассматривают как измеримую основу. Соберите один идеальный пример взаимодействия, один случай сбоя и записку о откате перед расширением объема работ. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия всем элементам, определите критерии успеха и не допускайте скрытого частичного выполнения задач.

You have access to autonomous action tools. When users ask for rides,
ALWAYS call request_rideshare. When users ask to book a table,
ALWAYS call reserve_table. When users ask about cultural norms,
ALWAYS call get_cultural_etiquette.
NO RAW MARKDOWN HEADINGS: Never use ‘#’. Use **Bold Text** for headers.
NO ASTERISKS FOR BULLETS: Use clean unicode bullet points (• ).
CONCISE: Jump straight to the answer. No filler introductions.

9. Извлеченные уроки

На этапе «9 уроков, извлеченных из опыта» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рядом с функциональными результатами следует записывать время выполнения и стоимость токенов или запросов. Отображение затрат с самого начала предотвращает неожиданные счета при переходе от демо-среды к общедоступным средам. Необходимо разделить процесс создания клиента от цикла обработки сообщений, чтобы можно было заменять поставщиков без переписывания машины состояний диалога.

Чек-лист операционной деятельности

При работе над этапом чек-листа операционной деятельности сначала необходимо зафиксировать условия работы: требуемые входные данные, сигнал о успешном выполнении и действия при частичной неудаче. Такой чек-лист обеспечивает прозрачность последующих изменений в коде.

Лучше использовать небольшие, тестируемые единицы вместо обширных скриптов. Когда какой-то шаг терпит неудачу, ошибка должна указывать на конкретную ответственность, а не на запутанную цепочку операций.

Записывайте идентификатор запроса, идентификатор модели и время задержки при каждом вызове. Без такой отслеживающей информации периодические ошибки поставщика кажутся багами приложения.

Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных маскируют информацию о том, какой узел заполнил какое поле, и мешают возобновлению работы после прерываний.

При наличии бюджета добавляйте тесты для проверки критического пути в процессе интеграционного тестирования с использованием фикстур, а не реальных платных API.

Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, чтобы операторы могли их проверять, не читая весь граф структур.

Перед внедрением данной стек-технологии необходимо заморозить версии, сохранить эталонный отчет для критической цепочки операций и уточнить шаги возврата к предыдущему состоянию. В совместных средах требуются ограничения на частоту запросов, проверки принадлежности пользователя и четко определенный ответственный за обновление секретов. Лучше выбирать надежность, даже если она кажется менее привлекательной, чем красивые одноразовые демонстрации.

Примечание для задачи 0ead08720324: не храните ключи поставщика в репозитории, установите лимит токенов на одну сессию и сохраняйте отчеты рядом с фикстчерами для оценки, чтобы последующие замены моделей оставались сопоставимыми.