![]()
До этого момента в курсе вы создавали агентов, работающих на вашем ноутбуке, внутри блокнота, управляемых az login и несколькими переменными окружения. Это именно правильный способ обучения. Но такой способ не подходит для работы агента, от которого зависят тысячи клиентов в 3 часа ночи.
Этот урок посвящён разрыву между “работает на моей машине” и “работает стабильно и экономично в продакшене”. Мы закрываем этот разрыв с помощью Microsoft Foundry и Microsoft Foundry Agent Service, создавая настоящего агента поддержки клиентов с инструментами, поиском, памятью, оценкой и мониторингом.
В этом уроке рассматриваются:
После прохождения урока вы узнаете, как:
Для прохождения урока предполагается, что вы завершили предыдущие уроки и уверенно работаете с:
Также вам понадобится:
az login).requirements.txt.Прототип агента и продакшен агент разделяют один и тот же основной цикл — рассуждение, вызов инструментов, ответ. Меняется всё, что оборачивает этот цикл. Модель — это примерно 20% продакшен-агента; остальные 80% — это его операционный каркас.
| Аспект | Прототип | Продакшен |
|---|---|---|
| Хостинг | Работает в вашем блокноте | Работает как сервис с версионированием и развёртыванием |
| Идентичность | Ваш токен az login |
Управляемая идентичность с ограниченным RBAC |
| Состояние | В памяти, теряется при перезапуске | Внешнее хранение (thread store, memory service) |
| Ошибки | Вы видите трассировку стека | Повторы, обходы, dead-letter, оповещения |
| Стоимость | “Пара центов” | Отслеживается на запрос, маршрутизируется, кэшируется, планируется бюджет |
| Качество | Вы оцениваете визуально | Автоматическая оценка перед каждым релизом |
| Доверие | Вы одобряете каждое действие | Политика + человек в цикле для рискованных действий |
Запомните эту таблицу. Каждый следующий раздел связан с одной из этих строк.
Существует три паттерна, которые вы часто будете комбинировать.
Объект агента живёт внутри вашего процесса приложения. Ваш код напрямую вызывает провайдера модели; цикл рассуждений работает в вашем сервисе. Это то, что было во всех предыдущих уроках.
Агент регистрируется как ресурс в Microsoft Foundry. Foundry запускает цикл рассуждений, хранит потоки, обеспечивает безопасность контента и RBAC, делает агента видимым в портале Foundry. Ваше приложение становится тонким клиентом, создающим потоки и читающим ответы.
Несколько агентов (и инструментов) объединяются в граф с явным потоком управления — последовательными шагами, ветвлениями, узлами одобрения человеком и надёжными контрольными точками, которые могут ставить на паузу и возобновлять работу. Это возможность Workflows Microsoft Agent Framework, применённая в масштабе развёртывания.
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: оценка офлайн — это ворота, а не после мысли. Новая версия агента не выпускается, пока не пройдёт ваши пороги оценки. Онлайн-наблюдаемость потом подаёт реальные сбои обратно в ваш офлайн-набор тестов. Вот весь цикл.
Масштабирование агента отличается от масштабирования безсостоятийного веб API, потому что каждый запрос может запустить множество дорогостоящих вызовов моделей и инструментов. Четыре техники несут основную нагрузку.
Обработка безсостоятийных запросов. Не храните состояние пользователя в памяти процесса. Сохраняйте потоки разговора в Foundry thread store или memory service, чтобы любой экземпляр мог обработать любой запрос. Это позволяет масштабироваться горизонтально — добавлять экземпляры без привязки сессий.
Маршрутизация моделей. Не каждый запрос нуждается в самой мощной (и самой дорогой) модели. Маршрутизируйте простые запросы — классификация намерений, короткие фактические ответы — на небольшую быструю модель, а большую модель оставляйте для настоящих рассуждений. 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, нужен ещё более дешёвый тест: отвечает ли развёрнутый эндпоинт вообще?
Развёртывание “успешно” доказывает лишь, что управляющая плоскость приняла определение — оно не доказывает, что агент отвечает. Отсутствие зависимости, неправильная маршрутизация модели или просроченное соединение могут оставить зелёное развёртывание, которое ничего не возвращает. Smoketest выявит это за секунды, при каждом развёртывании, без затрат полной оценки.
В репозитории есть готовый smoketest pipeline на базе GitHub Action AI Smoke Test:
tests/lesson-16-smoke-tests.json содержит подсказки и утверждения для агента поддержки Contoso (ответы на вопросы политики, поиск заказа, соблюдение темы разговора и многотуровая связность потока). Каталоги для агентов других уроков расположены рядом — смотрите tests/README.md..github/workflows/smoke-test.yml входит в Azure OIDC и посылает каждый запрос на эндпоинт 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. Что такое «evaluation gate» (шлюз оценки) и где он находится в жизненном цикле?
6. Почему MCP-сервер следует рассматривать как ненадёжную границу в продакшне?
7. Какое единственное изменение обычно имеет наибольшее влияние на стоимость производства агента и почему?
8. Какую роль играют атрибуты спанов, такие как customer.tier и routed.model, в наблюдаемости?
Возьмите агента поддержки клиентов из лаборатории и подготовьте его для конкретного сценария: агент поддержки биллинга подписки для SaaS-компании.
Ваше задание должно:
get_subscription_status, get_invoice, и issue_credit (кредиты свыше $50 требуют одобрения человека).Напишите короткий абзац (в markdown ячейке), объясняющий, какое правило маршрутизации модели вы выбрали и как бы вы его проверили на реальном трафике. Правильного единственного ответа нет — вас оценивают по тому, насколько согласованно учитываются производственные вопросы.
В этом уроке вы перевели агента из прототипа в продуктив с помощью Microsoft Foundry:
Следующий урок — обратное путешествие: вместо масштабирования агентам в облако вы спустите их на одну машину разработчика и запустите полностью локально.
Создание агентов для использования компьютера (CUA)
Отказ от ответственности: Этот документ был переведен с использованием сервиса машинного перевода Co-op Translator. Несмотря на наши усилия по обеспечению точности, имейте в виду, что автоматический перевод может содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обратиться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования этого перевода.