Capacitação Microsoft AI — Aula 5: RAG end-to-end com avaliação

Este é o quinto de oito artigos que acompanham as aulas da Capacitação Microsoft AI 2026, que Otávio Lourenço da Silva e eu ministramos ao vivo entre agosto e setembro. As gravações continuam no ar; os artigos existem para quem prefere ler, revisar ou copiar o código com calma.

O que a aula cobriu

A quinta aula pega o RAG da aula 4, que já funcionava, e faz a pergunta que a aula 4 não conseguia responder: funcionava bem? O corpus e o índice são os mesmos. O que entra é medição: um pipeline que devolve objeto em vez de texto, quatro métricas de qualidade calculadas por um modelo juiz, um conjunto de seis perguntas com gabarito e dois experimentos — a varredura de top-k e a comparação com e sem ranqueamento semântico — que terminam num relatório em Markdown. A ideia que sustenta a aula: RAG não termina quando a resposta aparece na tela; termina quando você consegue dizer, com número, se ela ficou melhor ou pior que ontem, e qual etapa mudou.

Três ideias para levar

1. Um pipeline que só imprime texto não pode ser avaliado

A mudança de arquitetura da aula cabe num tipo de retorno. PipelineRag.ResponderAsync devolve a resposta junto com os trechos recuperados, o contexto exato que foi para o modelo, o modo de busca, o top-k e a latência. Sem esses dados, não há o que comparar — e qualquer “acho que melhorou” vira opinião.

public sealed record RespostaRag(
    string Pergunta,
    string Texto,
    ChatResponse Bruta,
    IReadOnlyList<TrechoCitado> Trechos,
    string Contexto,
    IndiceRag.Modo Modo,
    int TopK,
    TimeSpan Latencia);

2. Groundedness e retrieval são separadas de propósito

As quatro métricas do Microsoft.Extensions.AI.Evaluation.Quality parecem medir a mesma coisa com nomes diferentes, mas cada uma compara um par distinto. Groundedness compara a resposta com o contexto recuperado; relevance, a resposta com a pergunta; retrieval, os trechos com a pergunta; correctness, a resposta com o gabarito. As três primeiras olham para a resposta, e retrieval olha para o que veio antes dela. Se a resposta piorou e o retrieval continua bom, o problema está no prompt ou na geração; se os dois caíram, está no chunking, no embedding ou no índice. O caso perigoso é relevance alta com groundedness baixa: a resposta parece ótima e é inventada.

Ao lado do juiz rodam duas conferências determinísticas, que não custam chamada de modelo: recuperou os documentos esperados? Recusou exatamente quando devia? Quando discordam do juiz, costumam estar certas. Metade de um diagnóstico de queda é um Contains.

3. Meça antes de acreditar — inclusive no slide

Na varredura de top-k (3, 5 e 10), quase todo mundo aposta que 10 é melhor. Com o corpus da aula, a curva sai plana: cinco documentos viram doze chunks, então top-k 10 traz quase tudo e só o custo em tokens sobe. Esse é o resultado certo, e ensina a ler a tabela — retrieval igual com mais tokens quer dizer que você está pagando por nada. Para ver a curva aparecer, basta reindexar com chunks menores. O mesmo vale para o ranqueador semântico: o ganho prometido nos slides vem de corpora grandes e heterogêneos, e num corpus de cinco documentos ele é pequeno, às vezes nulo. O juiz, por sua vez, também é um LLM — erra, é sensível ao próprio prompt e responde em inglês. Não é a verdade; é um instrumento barato o bastante para rodar a cada mudança.

Antes de rodar

  • Os mesmos pré-requisitos da aula 4: .NET SDK 10, Azure CLI com az login no tenant certo, um recurso Foundry com deployments de chat e de embeddings e um Azure AI Search no SKU basic ou superior. Se a aula 4 já indexou, o índice desta aula já existe.
  • O modelo juiz é, por padrão, o mesmo deployment de chat. A variável FOUNDRY_JUDGE_MODEL existe para usar outro modelo e reduzir o viés de um modelo se avaliar bem.
  • O endpoint continua sendo o /openai/v1, como na aula 4, e as versões dos pacotes não devem ser alteradas. Os dois pacotes de avaliação entram sem mudar o pivô OpenAI 2.12.0, porque falam com o modelo por IChatClient — o argumento mais prático a favor da abstração.
  • As opções que avaliam o conjunto inteiro fazem dezenas de chamadas ao juiz. Se aparecer 429, é cota do deployment: o código já limita a três perguntas simultâneas, e dá para baixar para uma.

Se você está na trilha Python

A mesma aula existe em Python 3.12+, na pasta aula05-rag-avancado, com o pacote azure-ai-evaluation fazendo o papel de juiz — groundedness, relevance, retrieval e similarity com o gabarito — e a mesma varredura de top-k e o mesmo relatório. Em Python não existe o problema de pivô: a versão Python usa o mesmo AIProjectClient e o mesmo endpoint de projeto das aulas anteriores. Fixar versões no requirements.txt continua valendo.

Próximo passo

Comece avaliando uma única pergunta: a sexta do conjunto, cujo assunto está no corpus mas cuja resposta não está. O sistema recusa, groundedness e correctness tiram nota máxima e retrieval tira nota baixa — porque os trechos, de fato, não respondem à pergunta. Métrica não é nota de prova; é instrumento, e quem interpreta é você. Depois rode a varredura de top-k, anote seu palpite antes e grave o relatório: é ele que você compara na semana seguinte. Na aula 6 saímos do RAG e construímos o primeiro agente com o Microsoft Agent Framework.

Dúvidas ou algo que não funcionou? Deixe nos comentários ou abra uma issue no repositório.

Comentários

Deixe um comentário