API ASP.NET Core para funcionalidades de IA com foco em RAG (Retrieval-Augmented Generation):
- upload e indexação de documentos (
.mde.pdf), - busca semântica de chunks no Elasticsearch,
- perguntas com contexto (RAG) usando OpenAI,
Principais capacidades:
- Gerenciamento de documentos por tema
- upload síncrono e em fila,
- listagem e remoção de documentos,
- separação por tema (índices temáticos no Elasticsearch).
- RAG para perguntas
- gera embedding da pergunta,
- recupera chunks relevantes,
- expande contexto com vizinhos de chunk,
- monta resposta com citações.
- Observabilidade e saúde
- logs com Serilog,
- endpoint de health check.
- .NET / ASP.NET Core:
net10.0 - OpenAI API: geração de embeddings e respostas
- Elasticsearch: armazenamento e busca vetorial/textual dos documentos/chunks
- Parsers de documento:
- Markdig (Markdown)
- UglyToad.PdfPig (PDF)
- Tokenização: SharpToken
- Documentação de API:
- Microsoft.AspNetCore.OpenApi
- Scalar.AspNetCore (
/doc)
- Logging: Serilog
API/Controllers: endpoints HTTPAPI/Application: casos de uso (upload, perguntas, busca de chunks)API/Infrastructure: integrações (OpenAI, Elasticsearch, parsers, chunking)API/Domain/Entities: contratos e modelosAPI/Program.cs: composição da aplicação e DI
Base local padrão: http://localhost:6080
POST /assistent/documents: Faz o upload de um documento e processa o conteúdo imediatamente para indexação no tema informado.POST /assistent/documents/queue: Enfileira um documento para processamento assíncrono, evitando duplicidade na fila por tema.GET /assistent/documents: Lista os documentos indexados, com opção de filtrar por tema.GET /assistent/documents/{id}: Lista os itens de upload que ainda estão pendentes na fila de processamento.DELETE /assistent/documents/{id}?theme={theme}: Remove um documento de um tema específico.GET /assistent/documents/queue/pending: Lista os itens de upload que ainda estão pendentes na fila de processamento.POST /assistent/questions: Processa uma pergunta no contexto RAG e retorna a resposta gerada pela IA.POST /assistent/questions/chunks: Busca os chunks mais relevantes para uma pergunta sem gerar resposta final.GET /assistent/themes: Lista os temas cadastrados para organização e consulta dos documentos.GET /healthGET /doc(documentação interativa)
Defina variáveis para facilitar:
BASE_URL="http://localhost:6080"
API_KEY="seu_token_aqui"
THEME="juridico"curl -X GET "$BASE_URL/health"curl -X GET "$BASE_URL/assistent/themes" \
-H "Authorization: Bearer $API_KEY"curl -X POST "$BASE_URL/assistent/documents" \
-H "Authorization: Bearer $API_KEY" \
-F "theme=$THEME" \
-F "file=@./arquivo.md"curl -X POST "$BASE_URL/assistent/documents/queue" \
-H "Authorization: Bearer $API_KEY" \
-F "theme=$THEME" \
-F "file=@./arquivo.pdf"curl -X GET "$BASE_URL/assistent/documents?theme=$THEME" \
-H "Authorization: Bearer $API_KEY"DOCUMENT_ID="id_do_documento"
curl -X GET "$BASE_URL/assistent/documents/$DOCUMENT_ID" \
-H "Authorization: Bearer $API_KEY"DOCUMENT_ID="id_do_documento"
curl -X DELETE "$BASE_URL/assistent/documents/$DOCUMENT_ID?theme=$THEME" \
-H "Authorization: Bearer $API_KEY"curl -X POST "$BASE_URL/assistent/questions" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"question": "Quais cláusulas tratam de multa?",
"theme": "juridico",
"topK": 5
}'curl -X POST "$BASE_URL/assistent/questions/chunks" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"question": "Quais cláusulas tratam de multa?",
"theme": "juridico",
"topK": 5
}'É possível integrar o endpoint POST /assistent/questions/chunks ao OpenWebUI (https://openwebui.com/) para usar esta API como camada de recuperação (RAG) da aplicação.
Fluxo sugerido:
- o OpenWebUI envia a pergunta e o tema para
POST /assistent/questions/chunks; - a API retorna os chunks relevantes (conteúdo e metadados);
- o OpenWebUI injeta esse contexto no prompt final do modelo configurado nele.
Exemplo de chamada do endpoint de chunks:
curl -X POST "$BASE_URL/assistent/questions/chunks" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"question": "Explique os principais pontos do documento.",
"theme": "juridico",
"topK": 5
}'Com isso, você pode manter indexação/recuperação nesta API e usar o OpenWebUI como interface de chat. A integração pode ocorrer via Tools ou Filters disponíveis pelo OpenWebUI:
- SDK .NET 10
- Acesso a um Elasticsearch
- Chave da OpenAI válida
Configure API/appsettings.Development.json (ou variáveis de ambiente) com:
OpenAI:ApiKeyOpenAI:BaseUrlOpenAI:ChatModelOpenAI:EmbeddingModelElasticsearch:UrlElasticsearch:ApiKey(ou usuário/senha)KestrelUrl(padrão:http://localhost:6080)
Recomendado: não versionar segredos em arquivo. Use User Secrets ou variáveis de ambiente.
dotnet restore API/IA.API.csprojdotnet run --project API/IA.API.csproj- Documentação:
http://localhost:6080/doc - Health:
http://localhost:6080/health
- O projeto registra
DocumentUploadQueueHostedServicepara processar uploads em fila. - Em ambiente de desenvolvimento, a validação de API key no atributo customizado é relaxada para alguns cenários.
- O limite de upload foi configurado para até 500MB no servidor; as regras funcionais de upload também dependem de
Uploadnas configurações. - Há um arquivo
API/rag-feature.httpcom exemplos adicionais para testes locais via cliente HTTP.