API .NET que implementa um sistema de RAG (Retrieval-Augmented Generation) utilizando Azure AI Search, Azure AI Foundry e Azure Service Bus. O sistema indexa documentos de knowledge bases armazenados no Azure Blob Storage, gera embeddings vetoriais e responde perguntas por meio de agentes de IA com busca semântica e vetorial.
O projeto segue Clean Architecture com as seguintes camadas:
Api/
├── Domain/ # Interfaces, contratos e comandos
├── Application/ # Handlers de comandos e queries
├── Infra/ # Integrações com serviços Azure
│ ├── Rag/ # Agente RAG via Azure AI Projects
│ ├── VectorSearch/ # Indexação e busca vetorial no Azure AI Search
│ └── MessageBus/ # Consumo e publicação via Azure Service Bus
└── Presentation/ # Workers de inicialização e consumo de mensagens
- Indexação: ao iniciar, workers criam índices vetoriais no Azure AI Search a partir de containers no Azure Blob Storage (
articlesefaq). - Atualização assíncrona: eventos de criação/remoção de blobs são publicados no Azure Service Bus e processados pelo
MessageBusWorker, que atualiza os índices dinamicamente. - Consulta: a API expõe um endpoint de chat que recebe uma pergunta, busca nos índices vetoriais e encaminha o contexto ao agente de IA no Azure AI Foundry, retornando a resposta em streaming.
| Tecnologia | Versão | Uso |
|---|---|---|
| .NET | 10.0 | Runtime da API |
| Azure AI Search | SDK 11.8 | Indexação e busca vetorial / semântica |
| Azure AI Projects | SDK 2.0 | Agentes RAG no Azure AI Foundry |
| Azure OpenAI | SDK 2.1 | Embeddings (text-embedding-3-small) |
| Azure Service Bus | SDK 7.20 | Mensageria para atualização de índices |
Indexers article-indexer e faq-indexer executados com sucesso, indexando documentos dos respectivos containers no Blob Storage.
Dois agentes criados no Azure AI Foundry — articles e faq — configurados como agentes do tipo prompt com integração à ferramenta Pesquisa de IA do Azure.
O agente faq configurado com instrução de RAG: responde somente com base na knowledge base disponibilizada, sem buscar informações em fontes externas.
Endpoint de chat respondendo perguntas via GET. Quando a pergunta está fora do escopo da knowledge base, o agente responde de forma controlada.
GET /chat:{context}?question={pergunta}
| Parâmetro | Descrição | Exemplo |
|---|---|---|
context |
Nome do agente/índice | faq, articles |
question |
Pergunta a ser respondida | O que é RAG? |
Exemplo de requisição:
GET /chat:faq?question=Como funciona o processo de reembolso?
A resposta é retornada em streaming via Server-Sent Events (SSE).
Preencha o appsettings.json com as credenciais dos serviços Azure:
{
"AzureSearchIA": {
"ApiKey": "<chave-do-azure-ai-search>",
"KnowledgeName": "<nome-do-servico-de-busca>",
"Endpoint": "<endpoint-do-azure-ai-search>"
},
"VectorSearchSettings": {
"Endpoint": "<endpoint-do-azure-ai-search>",
"ApiKey": "<chave-do-azure-ai-search>",
"EmbeddingAiEndpoint": "<endpoint-do-azure-openai>",
"EmbeddingAiKey": "<chave-do-azure-openai>",
"StorageAccounts": {
"articles": "<connection-string-do-blob-storage>",
"faq": "<connection-string-do-blob-storage>"
}
},
"ConnectionStrings": {
"ServiceBus": "<connection-string-do-service-bus>"
},
"RagAgentSettings": {
"Endpoint": "<endpoint-do-azure-ai-foundry>",
"TenentId": "<tenant-id>",
"ClientId": "<client-id>",
"SecretKey": "<client-secret>",
"Agents": {
"articles": { "Version": "<id-do-agente-articles>" },
"faq": { "Version": "<id-do-agente-faq>" }
}
}
}- Azure AI Search: serviço criado com suporte a vetores e semântica habilitado.
- Azure OpenAI: implantação do modelo
text-embedding-3-smalldisponível. - Azure Blob Storage: containers
ai-search/articleseai-search/faqcom documentos. - Azure Service Bus: tópico
articlecriado para receber eventos de blob. - Azure AI Foundry: agentes
articlesefaqcriados com a ferramenta Azure AI Search conectada aos respectivos índices. - Microsoft Entra ID: Service Principal com permissões para acessar o Azure AI Foundry.
# Restaurar dependências
dotnet restore
# Executar a API (porta 5221)
dotnet run --project Api/Api.csprojA API estará disponível em http://localhost:5221.
Ao iniciar, a aplicação executa automaticamente:
InitializeArticleSourceWorker: cria o índice vetorialarticlesa partir do containerai-search/articlesno Blob Storage.InitializeFaqSourceWorker: cria o índice vetorialfaqa partir do containerai-search/faqno Blob Storage.MessageBusWorker: inicia o consumo do tópicoarticleno Service Bus para processar atualizações de documentos em tempo real.
Se os índices já existirem, a criação é ignorada e os indexers são executados para manter os dados atualizados.



