![]()
Até este ponto do curso, você construiu agentes que rodam no seu laptop, dentro de um notebook, acionados pelo az login e algumas variáveis de ambiente. Essa é exatamente a maneira certa de aprender. Não é a maneira certa de executar um agente do qual milhares de clientes dependem às 3 da manhã.
Esta lição trata da lacuna entre “funciona na minha máquina” e “funciona, de forma confiável e acessível, em produção.” Fechamos essa lacuna usando o Microsoft Foundry e o Microsoft Foundry Agent Service, e fazemos isso construindo um agente real de suporte ao cliente que possui ferramentas, recuperação, memória, avaliação e monitoramento.
Esta lição irá cobrir:
Após completar esta lição, você saberá como:
Esta lição assume que você completou as lições anteriores e está confortável com:
Você também precisará de:
az login).requirements.txt.Um agente protótipo e um agente de produção compartilham o mesmo loop principal — raciocinar, chamar ferramentas, responder. O que muda é tudo que envolve esse loop. O modelo é talvez 20% de um agente de produção; os outros 80% são o esqueleto operacional.
| Preocupação | Protótipo | Produção |
|---|---|---|
| Hospedagem | Roda no seu notebook | Roda como serviço hospedado, versionado e lançado gradualmente |
| Identidade | Seu token az login |
Identidade gerenciada com RBAC escopado |
| Estado | Na memória, perdido na reinicialização | Externalizado (armazenamento de threads, serviço de memória) |
| Falhas | Você vê o traceback | Retentativas, fallback, dead-letter, alertas |
| Custo | “São alguns centavos” | Monitorado por requisição, roteado, cacheado, orçado |
| Qualidade | Você verifica visualmente a saída | Avaliado automaticamente antes de cada lançamento |
| Confiança | Você aprova cada ação | Política + humano no loop para ações de risco |
Mantenha esta tabela em mente. Cada seção abaixo corresponde a uma dessas linhas.
Existem três padrões que você usará, frequentemente em combinação.
O objeto agente vive dentro do processo da sua aplicação. Seu código chama o provedor do modelo diretamente; o loop de raciocínio roda no seu serviço. É isso que todas as lições anteriores fizeram.
O agente é registrado como um recurso no Microsoft Foundry. O Foundry hospeda o loop de raciocínio, armazena threads, aplica segurança de conteúdo e RBAC, e torna o agente visível no portal Foundry. Seu app vira um cliente leve que cria threads e lê respostas.
Múltiplos agentes (e ferramentas) são compostos em um grafo com fluxo de controle explícito — etapas sequenciais, ramificações, nós de aprovação humana, e checkpoints duráveis que podem pausar e retomar. Esta é a capacidade Workflows do Microsoft Agent Framework aplicada em escala de implantação.
flowchart TB
subgraph P1[Hospedado pelo Cliente]
A1[Processo do Seu App] --> M1[Provedor do Modelo]
end
subgraph P2[Agente Hospedado]
A2[Cliente Leve] --> F2[Serviço de Agente Foundry]
F2 --> M2[Modelo + Ferramentas + Armazenamento de Threads]
end
subgraph P3[Fluxo de Trabalho do Agente]
A3[Orquestrador] --> S1[Agente de Triagem]
S1 --> S2[Agente Resolvedor]
S2 --> H[Nó de Aprovação Humana]
H --> S3[Agente de Ação]
end
Implantar um agente não é um simples push. É um ciclo que se parece muito com um ciclo de lançamento de software porque é exatamente isso que é.
flowchart LR
Create[Criar / Autor] --> Version[Versão]
Version --> Evaluate[Avaliar offline]
Evaluate -->|passa no gate| Deploy[Implantar hospedado]
Evaluate -->|falha no gate| Create
Deploy --> Observe[Observar online]
Observe --> Improve[Coletar falhas]
Improve --> Create
Deploy --> Retire[Aposentar versão antiga]
A ideia-chave, trazida da Lição 10: a avaliação offline é um portão, não um pensamento posterior. Uma nova versão do agente não é lançada a menos que ultrapasse seus critérios de avaliação. A observabilidade online então alimenta falhas do mundo real de volta ao seu conjunto de testes offline. Esse é o ciclo completo.
Escalonar um agente é diferente de escalar uma API web sem estado, porque cada requisição pode disparar múltiplas chamadas caras a modelos e ferramentas. Quatro técnicas carregam a maior parte da carga.
Manipulação de requisições sem estado. Não mantenha estado por usuário na memória do processo. Persista conversas no armazenador de threads do Foundry ou em um serviço de memória para que qualquer instância possa atender qualquer requisição. Isso permite escalar horizontalmente — adicione instâncias, sem sessões grudadas.
Roteamento de modelo. Nem toda requisição precisa do seu modelo mais capaz (e mais caro). Direcione requisições simples — classificação de intenção, respostas factuais curtas — para um modelo pequeno e rápido, e reserve o modelo grande para raciocínio genuíno. O Model Router do Foundry pode fazer isso por você, ou você pode implementar um classificador leve. Você construirá a versão DIY no laboratório.
Cache de respostas. Muitas consultas de suporte são quase duplicatas (“como redefino minha senha?”). Armazene respostas para perguntas comuns e entregue-as sem atingir o modelo. Mesmo uma taxa modesta de acertos no cache reduz significativamente custo e latência.
Concorrência e retropressão. Os provedores de modelos têm limites de taxa. Limite sua concorrência, use retentativas com backoff exponencial e falhe com graça (uma resposta enfileirada “estamos cuidando disso” é melhor que um erro 500).
flowchart LR
Q[Consulta do usuário] --> C{Acerto no cache?}
C -->|sim| R[Retornar resposta em cache]
C -->|não| Router{Complexidade?}
Router -->|simples| SLM[Modelo pequeno]
Router -->|complexo| LLM[Modelo grande]
SLM --> Out[Resposta]
LLM --> Out
Out --> Store[Cache + rastreamento]
Você não pode operar o que não pode ver. Como abordado na Lição 10, o Microsoft Agent Framework emite rastreamentos OpenTelemetry nativamente — cada chamada ao modelo, invocação de ferramenta e etapa da orquestração vira um span. Em produção, você exporta esses spans para o Microsoft Foundry (ou qualquer backend compatível com OTel) para que possa:
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")
# a execução do agente é rastreada automaticamente dentro deste intervalo
Atributos como customer.tier e routed.model são o que transformam um muro de rastreamentos em perguntas respondíveis (“clientes empresariais estão sendo roteados para o modelo pequeno com muita frequência?”).
O custo em agentes de produção é dominado por tokens. Três alavancas, em ordem de impacto:
Portões de avaliação e controle de custos são a mesma disciplina vista de dois ângulos: avaliação indica o piso de qualidade, roteamento e cache mantêm você tão próximo quanto possível do custo desse piso.
Governança. Agentes Hospedados herdam o RBAC, segurança de conteúdo e registro de auditoria do Foundry. Dê a cada agente uma identidade gerenciada com o mínimo privilégio necessário — acesso somente leitura à base de conhecimento, acesso escopado à API de tickets, nada mais.
Humano no loop. Algumas ações são muito importantes para automatizar totalmente — emitir um reembolso, deletar uma conta, escalar para o time jurídico. O Microsoft Agent Framework suporta ferramentas com aprovação necessária: o agente propõe a ação, a execução pausa, um humano aprova ou rejeita, e o fluxo de trabalho retoma. Você viu o primitivo na Lição 6; aqui você o implanta.
MCP em produção. O MCP permite que seu agente consuma ferramentas externas através de uma interface padrão. Em produção, trate cada servidor MCP como uma fronteira não confiável: fixe a versão do servidor, rode com uma identidade escopada, valide suas saídas, e nunca exponha segredos a ele. Um servidor MCP é uma dependência, e dependências são corrigidas, auditadas e limitadas por taxa.
flowchart TB
subgraph Dev[Arquitetura de Desenvolvimento]
D1[Caderno] --> D2[Framework do Agente]
D2 --> D3[Provedor de Modelo]
D2 --> D4[Ferramentas locais]
end
subgraph Deploy[Arquitetura de Implantação]
E1[pipeline de CI] --> E2[portão de avaliação]
E2 -->|aprovar| E3[Serviço de Agente Foundry]
E3 --> E4[agente hospedado versionado]
end
subgraph Run[Arquitetura de Tempo de Execução]
F1[aplicativo cliente] --> F2[agente hospedado]
F2 --> F3[Roteador de Modelo]
F2 --> F4[Azure AI Search RAG]
F2 --> F5[serviço de memória]
F2 --> F6[ferramentas MCP]
F2 --> F7[OTel -> rastreamento Foundry]
F2 --> F8[aprovação humana]
end
Esses três diagramas — desenvolvimento, implantação, tempo de execução — são o mesmo agente em três estágios de vida. O laboratório a seguir guia você na construção dele.
Abra code_samples/16-python-agent-framework.ipynb e siga-o do começo ao fim. Você montará um agente de suporte ao cliente Contoso com todas as preocupações de produção conectadas:
O notebook está organizado para que cada preocupação de produção seja uma seção autônoma e executável. O coração disso é o manipulador de requisições combinando roteamento e cache:
async def handle_support_request(query: str, customer_id: str) -> str:
# 1. Servir do cache quando possível.
cached = response_cache.get(normalize(query))
if cached:
return cached
# 2. Roteie por complexidade para controlar o custo.
model = "gpt-5-nano" if is_simple(query) else "gpt-5-mini"
# 3. Execute o agente dentro de um span de rastreamento para observabilidade.
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. Armazene em cache e retorne.
response_cache.set(normalize(query), response.text)
return response.text
O portão de avaliação que protege um lançamento se parece com isto:
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 # implantar apenas se o gate passar
Leia cada linha — o notebook mantém os primitivos deliberadamente pequenos para que nada fique escondido atrás de uma chamada de framework.
O portão de avaliação acima roda offline contra seu objeto agente. Uma vez que o agente é implantado como um Agente Hospedado, você precisa de mais uma verificação, ainda mais barata: o endpoint implantado está realmente respondendo?
Implantar “com sucesso” apenas prova que o plano de controle aceitou a definição — não prova que o agente responde. Uma dependência ausente, um roteamento de modelo errado, ou uma conexão expirada pode deixar uma implantação verde que não retorna nada. Um teste de fumaça detecta isso em segundos, a cada implantação, sem o custo de uma avaliação completa.
Este repositório inclui um pipeline de teste de fumaça pronto para uso, construído com a GitHub Action AI Smoke Test:
tests/lesson-16-smoke-tests.json contém prompts e afirmações para o agente de suporte Contoso (respostas políticas fundamentadas, consulta de pedidos, manter o tema, e continuidade multi-turno). Catálogos para os agentes de outras lições ficam junto — veja tests/README.md..github/workflows/smoke-test.yml faz login com Azure OIDC e POSTa cada prompt no endpoint Responses do agente, falhando o trabalho em qualquer afirmação não confirmada.- name: Smoke-test hosted agent
uses: JFolberth/ai-smoketest@v1
with:
project_endpoint: $
agent_name: ContosoSupportAgent
tests_file: tests/lesson-16-smoke-tests.json
Execute a partir da guia Ações assim que seu agente for implantado, fornecendo o endpoint do projeto Foundry e o nome do agente. A identidade federada precisa da função Azure AI User no escopo do projeto Foundry. Pense nas camadas como uma pirâmide: testes de fumaça (alcançável e respondendo?) executam em toda implantação, avaliação offline (bom o suficiente para liberar?) executa antes da promoção, e avaliação online (como está se saindo em produção?) executa continuamente.
Teste seu entendimento antes de passar para a tarefa.
1. Mais ou menos quanto do agente em produção é “o modelo” e o que é o resto?
2. Quando você escolheria um Agente Hospedado em vez de um agente hospedado no cliente?
3. Por que um agente escalável deve ser sem estado na memória do seu próprio processo?
4. Qual problema o roteamento de modelo resolve e como ele se relaciona com a avaliação?
5. O que é um “portão de avaliação” e onde ele se situa no ciclo de vida?
6. Por que um servidor MCP deve ser tratado como um limite não confiável em produção?
7. Qual única mudança geralmente tem o maior impacto no custo do agente em produção, e por quê?
8. Que papel os atributos de span como customer.tier e routed.model desempenham na observabilidade?
Pegue o agente de suporte ao cliente do laboratório e fortaleça-o para um cenário específico: um agente de suporte de faturamento de assinaturas para uma empresa SaaS.
Sua submissão deve:
get_subscription_status, get_invoice e issue_credit (créditos acima de $50 requerem aprovação humana).Escreva um parágrafo curto (em uma célula markdown) explicando qual regra de roteamento de modelo você escolheu e como a validaria com tráfego real. Não há uma única resposta correta — você será avaliado sobre se as preocupações de produção estão conectadas coerentemente.
Nesta lição, você levou um agente de protótipo a produção com Microsoft Foundry:
A próxima lição faz a jornada inversa: em vez de escalar agentes para a nuvem, você os trará para baixo para uma única máquina de desenvolvedor e os executará inteiramente localmente.
Construindo Agentes de Uso de Computador (CUA)
Aviso Legal: Este documento foi traduzido usando o serviço de tradução por IA Co-op Translator. Embora nos esforcemos pela precisão, por favor, esteja ciente de que traduções automatizadas podem conter erros ou imprecisões. O documento original em seu idioma nativo deve ser considerado a fonte autorizada. Para informações críticas, recomenda-se tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas decorrentes do uso desta tradução.