Capacitação Microsoft AI — Aula 4: RAG com Azure AI Search

Este é o quarto 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 quarta aula junta as três anteriores — o modelo do Foundry e a abstração do Microsoft.Extensions.AI — com um índice vetorial no Azure AI Search. O corpus é um conjunto de políticas internas de uma empresa fictícia, escrito de propósito para que algumas perguntas só ele responda, e para que uma pergunta pareça estar nele e não esteja. É essa segunda situação que sustenta toda a discussão sobre groundedness: o modelo tem que saber admitir quando não sabe, mesmo com os documentos na mão.

Três ideias para levar

1. Chunking é um parâmetro, não um detalhe escondido

O projeto quebra o texto por parágrafo e junta vizinhos até ~800 caracteres — deliberadamente simples, e deliberadamente exposto como parâmetro. Mudar esse número e reindexar, ao vivo, é o experimento mais barato da aula: chunks pequenos demais perdem contexto, chunks grandes demais diluem o sinal na média.

// Chunking por parágrafo, até ~800 caracteres
var chunks = IndiceRag.Fatiar(\n texto,\n tamanhoAlvo: 800);

2. Keyword, vetorial e híbrida acertam coisas diferentes

A busca por palavra-chave (BM25) acerta códigos, siglas e nomes próprios, mas erra sinônimos. A busca vetorial acerta sentido e paráfrase, mas erra identificadores literais. A híbrida soma os dois com reranking semântico — acerta ambos os casos, ao custo de mais latência. Ver os três modos lado a lado, com os scores visíveis, é o que desfaz a ideia de que RAG é uma caixa-preta única.

3. RAG não é sempre a resposta certa

O roteiro de sala faz a mesma pergunta com e sem RAG, três vezes. A primeira mostra o modelo inventando um valor plausível sem os documentos, e citando a fonte certa com eles — o caso óbvio. A segunda mostra RAG atrapalhando: uma pergunta que o modelo já respondia bem ganha uma citação desnecessária, gastando tokens e latência à toa. A terceira é a que vale a aula: um assunto que está no corpus mas cuja resposta específica não está — e o comportamento certo é admitir a ausência, não inventar uma política inteira.

Antes de rodar

  • .NET SDK 10 e Azure CLI instalados, com az login feito no tenant certo.
  • Um recurso Foundry com dois deployments — um de chat e um de embeddings (text-embedding-3-small) — e um serviço Azure AI Search no SKU basic ou superior (o free não tem ranqueamento semântico).
  • Os papéis Search Service Contributor e Search Index Data Contributor no Search, concedidos tanto à sua conta quanto à identidade gerenciada do recurso Foundry — são identidades diferentes, e esquecer a segunda é a causa mais comum de 403 no playground.
  • Não altere as versões dos pacotes. O projeto converge para OpenAI 2.12.0; adicionar Azure.AI.Projects recria o conflito de pivô das aulas anteriores.

Se você está na trilha Python

A mesma aula existe em Python 3.12+, na pasta aula04-rag: chunking, embeddings e os três modos de busca — keyword, vetorial e híbrida com reranking — com o mesmo corpus e o mesmo roteiro de sala. A regra de fixar versões no requirements.txt continua valendo.

Próximo passo

Rode o console, indexe o corpus e compare os três modos de busca com uma pergunta que usa sinônimos — a diferença entre keyword e vetorial fica evidente em uma tela. Depois rode o roteiro de sala completo e observe a terceira pergunta: é o slide de groundedness. Na aula 5 entramos em RAG end-to-end com avaliação — groundedness, relevância e uma varredura de top-k.

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