Moderação de conteúdo com a OpenAI em .NET

A moderação de conteúdo é uma parte crucial na gestão de plataformas online, garantindo que o conteúdo publicado esteja de acordo com as diretrizes da comunidade e evitando a disseminação de informações prejudiciais. A OpenAI oferece uma API de moderação que pode ser integrada em projetos .NET para analisar e moderar automaticamente o conteúdo. Modelo de moderação utilizado A API de moderação da OpenAI utiliza o modelo “text-moderation-007”, projetado para analisar textos e identificar categorias de conteúdo inadequado, como violência, assédio, discurso de ódio, entre outros. Este modelo funciona avaliando o conteúdo de entrada e retornando um conjunto de categorias com pontuações que indicam a probabilidade de cada categoria estar presente no texto. Aplicação em projetos reais A moderação automática de conteúdo pode ser aplicada em diversas áreas, como: Redes sociais: filtragem de postagens, comentários e mensagens privadas. Plataformas de e-commerce: moderação de avaliações e comentários de produtos. Fóruns e comunidades online: monitoramento de tópicos e respostas para garantir um ambiente saudável. Aplicativos de mensagens: prevenção de assédio e spam em conversas. Com isso, podemos perceber que a integração da API de moderação da OpenAI em um projeto .NET pode ajudar a manter a integridade e a segurança da plataforma, reduzindo a necessidade de intervenção manual. Implementação da API Indo para a nossa aplicação de exemplo, vamos utilizar um projeto de API construído em ASP.NET que será responsável por receber o conteúdo a ser moderado e fazer a integração com a API de moderação da OpenAI. Para nos comunicarmos com a API de moderação, precisaremos de uma chave de API. Caso você não tenha uma chave de API da OpenAI, você pode seguir nosso tutorial detalhado, que cobre desde a criação da conta na plataforma até a geração e configuração da chave de API necessária para utilizar os serviços de moderação. Após gerar o nosso projeto e criar a chave de API, devemos criar um controller chamado “ContentModerationController” e uma action do tipo POST chamada “ModerateContent”, recebendo um parâmetro do tipo string com o nome “content”, que será o texto que enviaremos para a API de moderação da OpenAI. Adicionamos também um bloco try-catch para lidar com eventuais erros que possam ocorrer durante o processo de moderação. using Microsoft.AspNetCore.Mvc; using System.Text.Json; using System.Text; using System.Net.Http; namespace ContentModerationApp.Controllers { [Route(“api/[controller]”)] [ApiController] public class ContentModerationController : ControllerBase { [HttpPost] public async Task ModerateContent(string content) { try { // Nosso código de interação para moderação de conteúdo. } catch (Exception ex) { return StatusCode(500, $”Erro ao moderar conteúdo: {ex.Message}”); } } } } Com a estrutura base do nosso projeto ASP.NET definida, o primeiro passo é armazenar a chave de API gerada no site da OpenAI em uma string dentro do bloco “try” para que possamos utilizá-la em nossas requisições. string openaiApiKey = “sua chave aqui”; Em seguida, vamos construir o corpo da requisição. Aqui, definimos a mensagem que desejamos moderar, que é passada através do parâmetro “content”. var requestBody = new { input = content }; Para enviar a requisição HTTP, precisamos serializar o objeto “requestBody” para o formato JSON. var requestBodyJson = JsonSerializer.Serialize(requestBody); Agora vamos criar um cliente HTTP utilizando “HttpClient” para enviar uma solicitação POST à API da OpenAI. using (var httpClient = new HttpClient()) { //Código da requisição. } Vamos também adicionar dentro do cliente HTTP a chave de autorização no cabeçalho da requisição para garantir que a solicitação seja autenticada corretamente. httpClient.DefaultRequestHeaders.Add(“Authorization”, $”Bearer {openaiApiKey}”); Depois de configurar o cliente HTTP com a chave de autorização, o próximo passo é enviar uma requisição POST para a API da OpenAI. O corpo da requisição contém os dados necessários para a moderação de conteúdo, que foram previamente serializados em JSON. var response = await httpClient.PostAsync(“https://api.openai.com/v1/moderations”, new StringContent(requestBodyJson, Encoding.UTF8, “application/json”)); Após enviar a requisição, precisamos processar a resposta recebida da API. O código a seguir verifica se a resposta foi bem-sucedida e lê o corpo da resposta como uma string. if (response.IsSuccessStatusCode) { string responseBody = await response.Content.ReadAsStringAsync(); return Ok(responseBody); } else { return BadRequest(response.StatusCode); } Analisando a resposta Ao executarmos nossa API e enviarmos uma requisição, receberemos uma resposta da API de moderação da OpenAI no formato JSON, contendo informações detalhadas sobre o conteúdo analisado. A seguir, apresentamos um exemplo de resposta juntamente com sua explicação. { “id”: “modr-9ijvCEVyMvw36jrtEhS0WlofXm9mt”, “model”: “text-moderation-007”, “results”: [ { “flagged”: false, “categories”: { “sexual”: false, “hate”: false, “harassment”: false, “self-harm”: false, “sexual/minors”: false, “hate/threatening”: false, “violence/graphic”: false, “self-harm/intent”: false, “self-harm/instructions”: false, “harassment/threatening”: false, “violence”: false }, “category_scores”: { “sexual”: 0.000013486678653862327, “hate”: 0.09813056141138077, “harassment”: 0.200340136885643, “self-harm”: 0.0008290316327475011, “sexual/minors”: 5.089680712444533e-7, “hate/threatening”: 0.044729895889759064, “violence/graphic”: 0.0017252579564228654, “self-harm/intent”: 0.000022909627659828402, “self-harm/instructions”: 0.000021325766283553094, “harassment/threatening”: 0.18670909106731415, “violence”: 0.000022909627659828402 } } ] } O campo “id” identifica exclusivamente a requisição de moderação de conteúdo dentro do sistema da OpenAI. Cada requisição feita à API recebe um ID único. O campo “model” indica o modelo utilizado para realizar a moderação de conteúdo. Neste caso, o modelo é o text-moderation-007, que citamos anteriormente. O campo “flagged” indica se o texto analisado foi marcado como problemático ou inapropriado pelo modelo. Neste exemplo, “flagged” está definido como false, indicando que o texto analisado não contém nenhum tipo de conteúdo que possa ser considerado inadequado. Este campo é especialmente útil em sistemas de moderação onde qualquer ocorrência de conteúdo inadequado, conforme as categorias avaliadas, deve ser rigorosamente bloqueada. Dentro de cada resultado, há informações detalhadas sobre as categorias de conteúdo analisadas e os scores associados a cada uma delas. Aqui estão as categorias e seus significados: sexual: conteúdo de natureza sexual explícita. hate: conteúdo que expressa ódio ou intolerância. harassment: conteúdo que constitui assédio ou intimidação. self-harm: conteúdo que promove ou encoraja danos a si mesmo. sexual/minors: conteúdo sexual envolvendo menores de idade. hate/threatening: conteúdo de ódio que inclui ameaças. violence/graphic: conteúdo violento ou gráfico. self-harm/intent: conteúdo que sugere intenção de se prejudicar. self-harm/instructions: conteúdo que fornece instruções sobre como se ferir. harassment/threatening: conteúdo de assédio que inclui ameaças. violence: conteúdo violento geral. Cada categoria possui um score que vai de 0 a 1, onde valores mais próximos de

Formatando números em C#

Formatando números em C#

A formatação de números é uma tarefa essencial para garantir que os dados sejam apresentados de forma clara e precisa. Em C#, a linguagem oferece diversas maneiras de formatar números, permitindo uma apresentação personalizada para atender a diferentes necessidades. Entre as opções disponíveis estão o uso de especificadores de formato padrão e personalizados. Neste artigo exploraremos essas abordagens com exemplos práticos. Especificadores de formato padrão Assim como falado no artigo sobre formatação de data e hora, o método “ToString” recebe especificadores que vão formatar a data e hora com base em um padrão, na formatação de números também utilizamos especificadores que vão definir como os números devem ser apresentados. Alguns dos especificadores mais comuns são “C” (moeda), “D” (decimal), “E” (científico), “F” (fixo), “N” (numérico) e “P” (percentual). Cada um deles permite formatar números de acordo com convenções específicas, como moeda localizada, notação científica, número fixo de casas decimais, entre outros, facilitando a apresentação precisa e legível dos dados numéricos em aplicações diversas. Especificador de formato “C” (moeda) O especificador de formato “C” é utilizado para formatar um número como valor monetário, de acordo com as configurações culturais do sistema. Isso inclui o símbolo da moeda, os separadores de milhar e os separadores decimais. decimal valor = 1234.56m; string valorFormatado = valor.ToString(“C”); Console.WriteLine(valorFormatado); // Saída: R$ 1.234,56 Neste exemplo, o valor “1234.56” é formatado como moeda, exibindo o símbolo da moeda e os separadores de milhar e decimal adequados ao formato brasileiro que é a cultura do sistema em que a aplicação foi executada. Especificador de formato “D” (decimal) O especificador de formato “D” é usado para formatar números inteiros com um número fixo de dígitos. Ele é especialmente útil quando você precisa garantir que os números tenham uma quantidade específica de dígitos, preenchendo com zeros à esquerda, se necessário. Por exemplo, em sistemas de inventário ou produção, números de lote podem ser formatados de maneira semelhante para garantir consistência. int numeroLote = 7; string codigoLote = numeroLote.ToString(“D5″); Console.WriteLine($”Número do Lote: {codigoLote}”); // Saída: Número do Lote: 00007 O “D” indica que o número deve ser formatado como um inteiro decimal, e o “5” especifica que a representação do número deve ter exatamente cinco dígitos. Se o número original tiver menos de cinco dígitos, zeros serão adicionados à esquerda para preencher a quantidade necessária de dígitos. Especificador de formato “E” (notação científica) O especificador “E” formata um número em notação científica. double numeroGrande = 12345.6789; string numeroFormatado = numeroGrande.ToString(“E2″); Console.WriteLine(numeroFormatado); // Saída: 1.23E+004 Ao usar o especificador “E” com duas casas decimais (“E2”), o valor é exibido como “1,23E+004”. Este formato é vantajoso para representar números muito grandes ou muito pequenos de maneira mais concisa e legível. Especificador de formato “F” (fixo) O especificador “F” formata um número com um número fixo de casas decimais. double numero = 123.456; string numeroFormatado = numero.ToString(“F2″); Console.WriteLine(numeroFormatado); // Saída: 123.46 Aqui, o valor “123.456” é formatado com duas casas decimais fixas. Usando o especificador “F2”, o número é arredondado para “123.46”. Esse formato é ideal quando se deseja uma precisão decimal específica. Especificador de formato “N” (numérico) O especificador N formata um número com separadores de milhar int numero = 123456789; string numeroFormatado = numero.ToString(“N0″); Console.WriteLine(numeroFormatado); //Saída: 123.456.789 Utilizando o especificador “N0”, o valor é exibido como “123.456.789”. O “0” indica que não é necessário adicionar nenhuma casa decimal. Esse formato é útil para melhorar a legibilidade de números grandes. Além disso, você pode adicionar outro número após o “N” para especificar a quantidade de casas decimais. Por exemplo, “numero.ToString(“N3”)” exibirá o valor com três casas decimais, resultando em “123.456.789,000”. Especificador de formato “P” (percentual) O especificador “P” converte o número em uma porcentagem, multiplicando-o por 100 e adicionando o símbolo de porcentagem. double taxa = 0.1234; string taxaFormatada = taxa.ToString(“P”); Console.WriteLine(taxaFormatada); // Saída: 12,34% Usando o especificador “P”, o valor é multiplicado por 100 e exibido como “12,34%”. Esse formato é adequado para representar frações como porcentagens Especificadores de formato personalizado Os especificadores de formato personalizado permitem um controle mais detalhado sobre a apresentação dos números. É possível especificar o número de casas decimais a serem exibidas utilizando 0 e # como placeholders. O placeholder “0” força a exibição de dígitos, mesmo que eles sejam zeros. Já o placeholder “#” exibe dígitos apenas se eles forem significativos. double numero = 1234.5; string numeroFormatadoComZeros = numero.ToString(“0.00”); string numeroFormatadoComSharp = numero.ToString(“0.##”); Console.WriteLine(numeroFormatadoComZeros); // Saída: 1234,50 Console.WriteLine(numeroFormatadoComSharp); // Saída: 1234,5 No caso do “0.00”, o número é exibido com duas casas decimais, mesmo que sejam zeros. No caso do “0.##”, as casas decimais só são exibidas se forem significativas. Máscaras personalizadas Usando o método ToString é possível aplicar formatações variadas a valores numéricos, exibindo-os, por exemplo, como números de telefone ou códigos específicos. O código abaixo mostra dois exemplos: long telefone = 1123456789; string telefoneFormatado = telefone.ToString(“(00) 00000-0000”); Console.WriteLine(telefoneFormatado); // Saída: (11) 2345-6789 int codigoProduto = 123; string codigoFormatado = codigoProduto.ToString(“PROD-0000”); Console.WriteLine(codigoFormatado); // Saída: PROD-0123 Apesar desse tipo de informação ser normalmente armazenada como texto, é importante conhecermos as possibilidades que a linguagem nos oferece. Acelere a sua carreira conosco! Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET Start: Clique aqui Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET Expert: Clique aqui Conclusão A formatação de números em C# é uma habilidade crucial para qualquer desenvolvedor que busca apresentar dados de forma clara e adequada. Utilizando especificadores de formato padrão e personalizado, é possível adaptar a apresentação de números às necessidades específicas de cada aplicação. Com a prática e a exploração dessas ferramentas, a formatação de números se tornará uma tarefa simples e eficiente.

Métodos de busca em strings em C#

No desenvolvimento de software, a manipulação de strings é uma tarefa comum e essencial. Em C#, a linguagem oferece uma série de métodos para realizar buscas em strings de maneira eficiente e intuitiva. Entre os métodos utilizados estão “StartsWith”, “EndsWith”, “Contains”, “IndexOf” e ”LastIndexOf”. Neste artigo, exploraremos esses métodos, fornecendo exemplos de situações do dia a dia. StartsWith O método StartsWith” é utilizado para verificar se uma string começa com um determinado prefixo, retornando um valor booleano: “true”, se encontrar uma correspondência e “false”, caso contrário. Este método é muito útil em diversas situações, como validação de entrada de dados ou filtragem de listas. Imagine um sistema de cadastro de usuários onde os números de telefone devem começar com o código do país. Podemos utilizar “StartsWith” para validar essa entrada: string telefone = “+5511999999999”; if (telefone.StartsWith(“+55”)) { Console.WriteLine(“Número de telefone brasileiro.”); } else { Console.WriteLine(“Número de telefone de outro país.”); } Se o telefone do usuário começa com “+55”, que é o DDI (Discagem Direta Internacional) do Brasil, informamos que o número de telefone é brasileiro. Caso contrário, informamos que é um telefone de outro país. Por padrão, o método “StartsWith” verifica a string considerando a caixa das letras. Se a string a ser comparada contiver letras maiúsculas e o parâmetro de verificação não, o resultado será falso: string exemplo = “NextWaveEducation”; bool resultado = exemplo.StartsWith(“nextwave”); Console.WriteLine(resultado); // False Para realizar uma comparação insensível à caixa das letras, é possível utilizar a sobrecarga do método “StartsWith” que aceita um parâmetro “StringComparison”. Utilize “StringComparison.OrdinalIgnoreCase” para ignorar as diferenças entre maiúsculas e minúsculas: string exemplo = “NextWaveEducation”; bool resultado = exemplo.StartsWith(“nextwave”, StringComparison.OrdinalIgnoreCase); Console.WriteLine(resultado); // True EndsWith O método “EndsWith” verifica se uma string termina com um determinado sufixo. Este método pode ser aplicado em várias situações, como verificar extensões de arquivos ou validar formatos específicos. Considere um aplicativo que só aceita uploads de imagens com extensões “jpg” e “png”. Podemos utilizar “EndsWith” para verificar se o arquivo é uma imagem válida: string imagem = “fotoUsuario.jpg”; if (imagem.EndsWith(“.jpg”) || imagem.EndsWith(“.png”)) { //Salvar a imagem do usuário. } else { Console.WriteLine(“Formato de arquivo inválido.”); } Se o nome do arquivo de imagem terminar com “.jpg” ou “.png”, ele será salvo. Caso contrário, será retornada uma mensagem informando que o formato da imagem é inválido. Contains O método “Contains”  verifica se uma determinada string contém outra substring específica dentro dela. É como se você estivesse procurando por uma palavra ou conjunto de caracteres dentro de um texto maior. Imagine um sistema de busca que precisa verificar se uma descrição de produto contém certas palavras-chave para classificação. Podemos utilizar o “Contains” para realizar essa verificação: string descricaoProduto = “Este é um smartphone de última geração com câmera de alta resolução.”; if (descricaoProduto.Contains(“smartphone”)) { Console.WriteLine(“O produto é um smartphone.”); } else { Console.WriteLine(“O produto não é um smartphone.”); } IndexOf O método “IndexOf” busca a primeira ocorrência de um caractere ou substring dentro de uma string, retornando o índice da posição encontrada. Esse método é útil para diversas tarefas, como localizar a posição de uma determinada palavra em um texto ou validar a presença de caracteres específicos. Imagine que você deseja encontrar a posição que uma palavra aparece em um texto: string texto = “Estudando sobre strings na Next Wave Education”; string palavraChave = “Next”; int indice = texto.IndexOf(palavraChave); Console.WriteLine($”A palavra ‘{palavraChave}’ aparece na posição {indice} do texto”); O método “IndexOf” é utilizado na string “texto” para buscar a palavra-chave “Next”. Quando encontrada, ele armazena a posição inicial dessa palavra na variável “indice”. No exemplo fornecido, o resultado impresso será: “A palavra ‘strings’ aparece na posição 16 do texto”. LastIndexOf O método “LastIndexOf” funciona de maneira semelhante ao “IndexOf”, mas busca a última ocorrência de um caractere ou substring na string. Esse método é útil quando você precisa localizar a posição final de um caractere ou palavra repetida em um texto. Suponha que você queira extrair o nome de um arquivo dentro de uma string que contém o caminho completo do arquivo: string caminhoCompleto = “C:\Users\Usuario\Documents\projeto\relatorio_final.pdf”; int indiceUltimaBarra = caminhoCompleto.LastIndexOf(‘\’); string nomeArquivoComExtensao = caminhoCompleto.Substring(indiceUltimaBarra + 1); Console.WriteLine(nomeArquivoComExtensao); O método “LastIndexOf” localiza a posição do último separador de diretório (), armazenando essa posição na variável “indiceUltimaBarra”. Utilizando o método “Substring”, o código extrai a parte do texto que começa logo após o último separador de diretório, resultando no nome do arquivo com sua extensão. Acelere a sua carreira conosco! Se você é Desenvolvedor .NET Júnior e quer acelerar sua carreira até nível Pleno com salário de R$7k+, ou mesmo busca a primeira vaga, conheça a Mentoria .NET Start: Clique aqui Se é Desenvolvedor .NET Pleno ou Sênior e quer virar referência técnica em sua equipe e mercado, com salário de R$10k+, conheça a Mentoria .NET Expert: Clique aqui Conclusão Os métodos de busca em strings são ferramentas poderosas no arsenal de um desenvolvedor C#. Eles permitem a realização de verificações, validações de forma simples e eficiente. Desde validações de entrada de dados até filtragens e buscas dentro de textos, esses métodos são aplicáveis em uma ampla variedade de cenários do dia a dia. Entender e saber utilizar esses métodos adequadamente pode aumentar significativamente a eficiência e a robustez de suas aplicações.

Métodos para recuperar um único registro no LINQ

Recuperando um único registro com LINQ

Neste artigo exploraremos os métodos do LINQ que retornam um único objeto, ideais para simplificar e melhorar a legibilidade de consultas que exigem a recuperação de um elemento específico de uma coleção.

Formatando datas e horas em C# com a classe DateTime

Neste artigo, exploraremos métodos como “ToShortDateString”, “ToShortTimeString”, “ToLongDateString”, “ToLongTimeString” e “ToString” com diferentes formatos. Além disso, discutiremos como a cultura (Culture) pode afetar essas formatações e como usar a formatação dentro de uma string interpolada.