![]()
До этого момента в курсе вы создавали агентов, которые работают на вашем ноутбуке, внутри блокнота, управляемые az login и несколькими переменными окружения. Это именно правильный способ обучения. Но это не правильный способ запуска агента, от которого зависят тысячи клиентов в 3 часа ночи.
Этот урок посвящён разрыву между “работает на моей машине” и “работает надёжно и экономично в продакшене”. Мы закрываем этот разрыв с помощью Microsoft Foundry и Microsoft Foundry Agent Service, создавая реального агента поддержки клиентов с инструментами, поиском, памятью, оценкой и мониторингом.
В этом уроке рассматриваются:
После завершения урока вы сможете:
Этот урок предполагает, что вы прошли предыдущие уроки и уверенно работаете с:
Вам также понадобится:
az login).requirements.txt.Прототипный агент и продакшен-агент имеют одинаковый основной цикл — рассуждать, вызывать инструменты, отвечать. Меняется всё, что оборачивает этот цикл. Модель — возможно 20% продакшен-агента; остальные 80% — это операционный каркас.
| Аспект | Прототип | Продакшен |
|---|---|---|
| Размещение | Работает в вашем блокноте | Работает как размещённый сервис с версиями и поэтапным выпуском |
| Идентичность | Ваш токен az login |
Управляемая идентичность с ограниченным RBAC |
| Состояние | В памяти процесса, теряется при рестарте | Внешнее хранение (хранилище потоков, сервис памяти) |
| Сбои | Вы видите стек вызовов | Повторные попытки, резервы, очередь dead-letter, оповещения |
| Стоимость | «Это несколько центов» | Отслеживается по запросам, маршрутизируется, кешируется, планируется бюджет |
| Качество | Вы оцениваете вывод визуально | Автоматическая оценка перед каждым релизом |
| Доверие | Вы подтверждаете каждое действие | Политика + человек в цикле для рискованных действий |
Запомните эту таблицу. Каждый следующий раздел соотносится с одной из этих строк.
Существуют три паттерна, которые вы будете использовать, часто в сочетании.
Объект агента живёт внутри вашего процесса приложения. Ваш код вызывает провайдера моделей напрямую; цикл рассуждения запускается в вашем сервисе. Так делались все предыдущие уроки.
Агент регистрируется как ресурс в Microsoft Foundry. Foundry хостит цикл рассуждений, хранит потоки, обеспечивает безопасность контента и RBAC, делает агента видимым в портале Foundry. Ваше приложение становится тонким клиентом, создающим потоки и читающим ответы.
Несколько агентов (и инструментов) объединены в граф с явным потоком управления — последовательные шаги, ветвления, узлы с утверждением человеком и долговечные контрольные точки, которые могут приостанавливать и возобновлять выполнение. Это возможность Microsoft Agent Framework Workflows, применённая на масштабе развертывания.
flowchart TB
subgraph P1[Клиентский хостинг]
A1[Процесс вашего приложения] --> M1[Поставщик модели]
end
subgraph P2[Хостинг-агент]
A2[Тонкий клиент] --> F2[Служба агента Foundry]
F2 --> M2[Модель + Инструменты + Хранилище веток]
end
subgraph P3[Рабочий процесс агента]
A3[Оркестратор] --> S1[Агент сортировки]
S1 --> S2[Агент разрешения]
S2 --> H[Узел одобрения человеком]
H --> S3[Агент действий]
end
Развёртывание агента — это не однократный push. Это цикл, очень похожий на цикл выпуска программного обеспечения, потому что это именно так.
flowchart LR
Create[Создать / Автор] --> Version[Версия]
Version --> Evaluate[Оценить офлайн]
Evaluate -->|проходит проверку| Deploy[Развернуть в облаке]
Evaluate -->|не проходит проверку| Create
Deploy --> Observe[Наблюдать онлайн]
Observe --> Improve[Собирать сбои]
Improve --> Create
Deploy --> Retire[Снять со службы старую версию]
Ключевая идея, перенесённая из Урока 10: оценка офлайн — это ворота, а не второстепенный шаг. Новая версия агента не выпускается, пока не пройдёт ваши пороги оценки. Онлайн-наблюдаемость затем возвращает реальные сбои обратно в офлайн-набор тестов. Вот весь цикл.
Масштабирование агента отличается от масштабирования бесcостояного веб-API, потому что каждый запрос может инициировать несколько дорогостоящих вызовов моделей и инструментов. Четыре техники берут на себя основную нагрузку.
Обработка запросов без состояния. Не храните состояние пользователя в памяти процесса. Сохраняйте разговоры в хранилище потоков Foundry или в сервисе памяти, чтобы любой экземпляр мог обработать любой запрос. Это позволяет масштабироваться горизонтально — добавляйте экземпляры без привязки к сессиям.
Маршрутизация моделей. Не каждый запрос нуждается в вашей самой мощной (и самой дорогостоящей) модели. Маршрутируйте простые запросы — классификацию намерений, короткие фактические ответы — к маленькой, быстрой модели, а большую модель зарезервируйте для настоящего рассуждения. Foundry Model Router может делать это за вас, или вы можете реализовать лёгкий классификатор самостоятельно. Вы создадите собственную версию в лабораторной работе.
Кеширование ответов. Многие запросы поддержки почти идентичны («как сбросить пароль?»). Кешируйте ответы на часто задаваемые вопросы и выдавайте их без обращения к модели. Даже скромный процент попадания в кеш существенно снижает стоимость и задержку.
Параллельность и обратное давление. Провайдеры моделей имеют ограничения по частоте. Ограничивайте параллельность, используйте повторные попытки с экспоненциальной задержкой и обрабатывайте ошибки плавно (ответ «мы работаем над этим» в очереди лучше ошибки 500).
flowchart LR
Q[Запрос пользователя] --> C{Попадание в кэш?}
C -->|да| R[Вернуть кэшированный ответ]
C -->|нет| Router{Сложность?}
Router -->|простая| SLM[Маленькая модель]
Router -->|сложная| LLM[Большая модель]
SLM --> Out[Ответ]
LLM --> Out
Out --> Store[Кэш + трассировка]
Вы не можете управлять тем, чего не видите. Как обсуждалось в Уроке 10, Microsoft Agent Framework нативно генерирует трассировки OpenTelemetry — каждый вызов модели, инструмент, шаг оркестрации становится спаном. В продакшене вы экспортируете эти спаны в Microsoft Foundry (или любой совместимый с OTel бэкенд), чтобы:
from agent_framework.observability import get_tracer
tracer = get_tracer()
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("customer.tier", "enterprise")
span.set_attribute("routed.model", "gpt-5-nano")
# выполнение агента автоматически отслеживается внутри этого промежутка
Атрибуты, такие как customer.tier и routed.model, превращают множество трассировок в отвечаемые вопросы («часто ли корпоративные клиенты направляются к маленькой модели?»).
Стоимость в продакшен-агентах в основном определяется токенами. Три рычага, по степени влияния:
Ворота оценки и контроль стоимости — это одна дисциплина, рассмотренная с двух сторон: оценка определяет пол качества, маршрутизация и кеширование держат вас как можно ближе к стоимости этого пола.
Управление. Hosted Agents наследуют RBAC, безопасность контента и аудит Foundry. Назначьте каждому агенту управляемую идентичность с минимально необходимыми правами — только чтение базы знаний, ограниченный доступ к API тикетов, и ничего лишнего.
Человек в цикле. Некоторые действия слишком критичны для полной автоматизации — возврат денег, удаление аккаунта, эскалация в юридическую команду. Microsoft Agent Framework поддерживает инструменты с требованием утверждения: агент предлагает действие, выполнение приостанавливается, человек подтверждает или отвергает, и рабочий процесс продолжается. Вы видели примитив в Уроке 6; здесь вы это развёртываете.
MCP в продакшене. MCP позволяет агенту использовать внешние инструменты через стандартный интерфейс. В продакшене рассматривайте каждый MCP сервер как недоверенную границу: фиксируйте версию сервера, запускайте его с ограниченной идентичностью, проверяйте его выводы и никогда не раскрывайте ему секреты. MCP сервер — это зависимость, а зависимости нужно патчить, аудитить и ограничивать по частоте.
flowchart TB
subgraph Dev[Архитектура разработки]
D1[Блокнот] --> D2[Фреймворк агента]
D2 --> D3[Поставщик модели]
D2 --> D4[Локальные инструменты]
end
subgraph Deploy[Архитектура развертывания]
E1[CI конвейер] --> E2[Контроль оценки]
E2 -->|пройти| E3[Сервис агента Foundry]
E3 --> E4[Версионированный хостинг агента]
end
subgraph Run[Архитектура выполнения]
F1[Клиентское приложение] --> F2[Хостинг агента]
F2 --> F3[Маршрутизатор модели]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[Сервис памяти]
F2 --> F6[Инструменты MCP]
F2 --> F7[OTel -> трассировка Foundry]
F2 --> F8[Человеческое одобрение]
end
Эти три диаграммы — разработка, развертывание, время выполнения — это один и тот же агент в трёх фазах жизни. Следующая лабораторная работа проведёт вас по процессу создания.
Откройте code_samples/16-python-agent-framework.ipynb и пройдите его полностью. Вы соберёте агента поддержки клиентов Contoso со всеми производственными аспектами:
Блокнот организован так, что каждый производственный аспект — это отдельный, запускаемый раздел. Сердце его — обработчик запросов с маршрутизацией и кешированием:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Обслуживать из кеша, когда это возможно.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Маршрутизировать по сложности для контроля затрат.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Запускать агент внутри временного интервала трассировки для наблюдаемости.
with tracer.start_as_current_span("support_request") as span:
span.set_attribute("routed.model", model)
span.set_attribute("customer.id", customer_id)
response = await support_agent.run(query, model=model)
# 4. Кешировать и возвращать.
response_cache.set(normalize(query), response.text)
return response.text
Ворота оценки, охраняющие выпуск, выглядят так:
async def evaluation_gate(agent, test_cases, threshold: float = 0.8) -> bool:
passed = 0
for case in test_cases:
result = await agent.run(case["input"])
if score_response(result.text, case["expected"]) >= 0.8:
passed += 1
pass_rate = passed / len(test_cases)
print(f"Evaluation pass rate: {pass_rate:.0%} (gate: {threshold:.0%})")
return pass_rate >= threshold # разворачивать только если ворота пройдут проверку
Читайте каждую строку — блокнот держит примитивы сознательно маленькими, чтобы ничего не скрывалось за вызовом фреймворка.
Вышеупомянутые ворота оценки работают офлайн с вашим объектом агента. После развертывания агента как Hosted Agent нужен ещё один, ещё дешевле тест: реально ли конечная точка отвечает?
Успешное развертывание доказывает только, что контрольная плоскость приняла определение — оно не гарантирует ответ агента. Отсутствующая зависимость, неправильная маршрутизация модели или истёкшее соединение могут оставить зелёное развертывание без ответа. Smoke тест ловит это за секунды, при каждом развертывании, без затрат полной оценки.
В этом репозитории есть готовый pipeline для smoke тестов на базе GitHub Action AI Smoke Test:
tests/lesson-16-smoke-tests.json содержит подсказки и утверждения для агента поддержки Contoso (ответы с опорой на политику, проверка заказа, соблюдение темы и многоповоротная связность). Каталоги для агентов других уроков находятся рядом — смотрите tests/README.md..github/workflows/smoke-test.yml выполняет вход через Azure OIDC и отправляет каждый запрос на endpoint Responses агента, прерывая задачу при любом несоответствии утверждения.- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
Запустите это во вкладке Actions после развертывания вашего агента, указав конечную точку проекта Foundry и имя агента. Федеративная идентичность должна иметь роль Azure AI User в области проекта Foundry. Представьте слои как пирамиду: дымовые тесты (доступен и отвечает?) запускаются при каждом развертывании, офлайн-оценка (достаточно хорош, чтобы выпускать?) выполняется перед продвижением, а онлайн-оценка (как он работает в реальных условиях?) выполняется постоянно.
Проверьте свои знания перед переходом к заданию.
1. Примерно какая часть производственного агента — это “модель”, а что составляет остальное?
2. Когда вы бы выбрали Hosted Agent вместо агента, размещённого на клиенте?
3. Почему масштабируемый агент должен быть безсостоянием в своей собственной памяти процесса?
4. Какую проблему решает маршрутизация модели и как это связано с оценкой?
5. Что такое “оценочный шлюз” и где он располагается в жизненном цикле?
6. Почему MCP сервер в производстве следует рассматривать как ненадёжную границу?
7. Какое одно изменение обычно оказывает наибольшее влияние на стоимость производственного агента и почему?
8. Какую роль играют атрибуты спанов, такие как customer.tier и routed.model, в наблюдаемости?
Возьмите агента поддержки клиентов из лабораторной работы и адаптируйте его для конкретного сценария: агента поддержки по вопросам выставления счетов по подписке для SaaS-компании.
Ваша работа должна:
get_subscription_status, get_invoice и issue_credit (кредиты выше $50 требуют одобрения человеком).Напишите короткий абзац (в markdown ячейке), объясняя, какое правило маршрутизации модели вы выбрали и как бы его валидировали на реальном трафике. Единственно правильного ответа нет — вас оценивают по связности производственных соображений.
В этом уроке вы перевели агента из прототипа в производство с Microsoft Foundry:
Следующий урок — обратный путь: вместо масштабирования агентов в облако вы опустите их на одну машину разработчика и запустите полностью локально.
Создание агентов по использованию компьютера (CUA)
Отказ от ответственности: Этот документ был переведен с использованием сервиса машинного перевода Co-op Translator. Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.