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.
- ▶️ Gravação da aula e playlist completa no YouTube
- 💻 Código da aula (.NET) · versão Python
- 📑 Slides em PDF
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 caracteresvar 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 loginfeito 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 SKUbasicou superior (ofreenã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
403no playground. - Não altere as versões dos pacotes. O projeto converge para
OpenAI 2.12.0; adicionarAzure.AI.Projectsrecria 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.
Deixe um comentário