.NET com um Modelo de GenAI (LLM)
Danilo O. Pinheiro, dopme.io

Danilo O. Pinheiro, dopme.io @daniloopinheiro

About: Inicie em tecnologia por volta de 2017. Neste percurso, com experiencia em desenvolvimento web em .NET e outras tecnologias. Com algumas certificações, e fundador da DevsFree.

Location:
Brasil
Joined:
Jul 22, 2020

.NET com um Modelo de GenAI (LLM)

Publish Date: Jun 24
0 0

O uso de modelos de linguagem generativos (LLMs) tem crescido em aplicações web modernas, desde geração de texto até automação de tarefas. Neste artigo, vamos criar uma Web API simples em .NET 8 que se conecta a um endpoint de IA (como OpenAI ou Hugging Face) para gerar respostas com base em um prompt.


📦 Tecnologias Utilizadas

  • .NET 8 Web API (Minimal API ou tradicional)
  • HttpClient para requisição HTTP
  • Modelo de IA: OpenAI (ChatGPT), Hugging Face ou outro
  • JSON (serialização com System.Text.Json)
  • Opcional: Docker, Swagger

🧠 Exemplo de Caso de Uso

Criar uma Web API que recebe um prompt do usuário e retorna a resposta gerada pela IA:

POST /api/genai
{
  "prompt": "Explique o que é DDD em 2 parágrafos."
}
Enter fullscreen mode Exit fullscreen mode

Resposta:

{
  "resultado": "Domain-Driven Design (DDD) é uma abordagem..."
}
Enter fullscreen mode Exit fullscreen mode

⚙️ Estrutura do Projeto

dotnet new webapi -n GenAI.WebAPI
cd GenAI.WebAPI
Enter fullscreen mode Exit fullscreen mode

Adicione o HttpClient (opcional, mas geralmente já incluso):

dotnet add package Microsoft.Extensions.Http
Enter fullscreen mode Exit fullscreen mode

📄 Modelo de Requisição e Resposta

Models/GenAIRequest.cs

public class GenAIRequest
{
    public string Prompt { get; set; } = string.Empty;
}
Enter fullscreen mode Exit fullscreen mode

Models/GenAIResponse.cs

public class GenAIResponse
{
    public string Resultado { get; set; } = string.Empty;
}
Enter fullscreen mode Exit fullscreen mode

🔌 Serviço de Integração com GenIA

Services/IGenAIService.cs

public interface IGenAIService
{
    Task<string> ObterRespostaAsync(string prompt);
}
Enter fullscreen mode Exit fullscreen mode

Services/OpenAIService.cs (exemplo usando OpenAI via REST)

public class OpenAIService : IGenAIService
{
    private readonly HttpClient _httpClient;
    private readonly IConfiguration _config;

    public OpenAIService(HttpClient httpClient, IConfiguration config)
    {
        _httpClient = httpClient;
        _config = config;
    }

    public async Task<string> ObterRespostaAsync(string prompt)
    {
        var body = new
        {
            model = "gpt-3.5-turbo",
            messages = new[]
            {
                new { role = "user", content = prompt }
            }
        };

        var request = new HttpRequestMessage(HttpMethod.Post, "https://api.openai.com/v1/chat/completions")
        {
            Content = new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json")
        };

        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _config["OpenAI:ApiKey"]);

        var response = await _httpClient.SendAsync(request);
        var json = await response.Content.ReadAsStringAsync();

        using var doc = JsonDocument.Parse(json);
        return doc.RootElement.GetProperty("choices")[0].GetProperty("message").GetProperty("content").GetString() ?? "";
    }
}
Enter fullscreen mode Exit fullscreen mode

🧱 Registrando o Serviço no Program.cs

builder.Services.AddHttpClient<IGenAIService, OpenAIService>();
Enter fullscreen mode Exit fullscreen mode

🔀 Controlador de Endpoint

Controllers/GenAIController.cs

[ApiController]
[Route("api/[controller]")]
public class GenAIController : ControllerBase
{
    private readonly IGenAIService _genAI;

    public GenAIController(IGenAIService genAI)
    {
        _genAI = genAI;
    }

    [HttpPost]
    public async Task<ActionResult<GenAIResponse>> Post([FromBody] GenAIRequest req)
    {
        if (string.IsNullOrWhiteSpace(req.Prompt))
            return BadRequest("Prompt é obrigatório.");

        var resultado = await _genAI.ObterRespostaAsync(req.Prompt);
        return Ok(new GenAIResponse { Resultado = resultado });
    }
}
Enter fullscreen mode Exit fullscreen mode

🛡️ Configuração do appsettings.json

{
  "OpenAI": {
    "ApiKey": "SUA_CHAVE_SECRETA"
  }
}
Enter fullscreen mode Exit fullscreen mode

✅ Testando com Swagger

Execute o projeto:

dotnet run
Enter fullscreen mode Exit fullscreen mode

Acesse:

https://localhost:5001/swagger
Enter fullscreen mode Exit fullscreen mode

Teste a rota POST /api/genai com:

{
  "prompt": "Resuma os princípios do SOLID."
}
Enter fullscreen mode Exit fullscreen mode

📦 Adicionais e Alternativas

  • Para Hugging Face: mude o endpoint e a autenticação (bearer)
  • Para Azure OpenAI: use https://{resource}.openai.azure.com/...
  • Para Open Source (como Ollama ou LM Studio): use localhost:11434/api/generate
  • Para streaming: use HttpCompletionOption.ResponseHeadersRead

🤖 Outras Aplicações Possíveis

  • Chatbots corporativos (FAQ interno)
  • Geração automática de conteúdo
  • Correção ou refatoração de código
  • Integração com painéis de BI (via Azure Functions + LLM)

🤝 Conecte-se Comigo

Se você está explorando GenIA com .NET, quero trocar experiências com você:

Comments 0 total

    Add comment