O blog da AWS

Integrando Amazon Bedrock nas suas aplicações .NET

Por Jagadeesh Chitikesi, arquiteto sênior de soluções especialista em Microsoft na AWS e Ashish Bhatia, arquiteto sênior de soluções na AWS.

Desenvolvimentos recentes em Inteligência Artificial generativa (IA generativa / Generative AI) tornaram mais fácil e acessível criar aplicações e experiências que melhoram a maneira como vivemos e trabalhamos. A IA generativa está ajudando as empresas a melhorar as experiências dos clientes por meio de assistentes e análises conversacionais e a aumentar a produtividade dos funcionários por meio da geração automatizada de conteúdo, relatórios e código.

Neste blog post, apresentaremos o Amazon Bedrock e mostraremos como você pode criar aplicações .NET com IA generativa usando foundation models (FMs) suportados pelo Amazon Bedrock. Este post também serve como uma publicação introdutória à uma série de posts que visa aprofundar diferentes casos de uso e explorar conceitos como o padrão Retrieval-Augmented Generation (RAG), bases de conhecimento e agentes no Amazon Bedrock para criar aplicações personalizadas de IA generativa para sua empresa. Você pode usar esta publicação como referência para criar aplicações corporativas .NET no domínio Gen AI usando os serviços da AWS.

Usando Amazon Bedrock a partir de código .NET

Há duas maneiras de consumir a funcionalidade do Amazon Bedrock a partir do seu código .NET: Amazon Bedrock API ou AWS SDK for .NET. Sempre que possível, é altamente recomendável que você use os SDKs da AWS enquanto interage com os serviços AWS a partir do seu código. Além de fornecer uma forma simples, consistente e idiomática para os desenvolvedores .NET consumirem os serviços da AWS, os SDKs abstraem coisas como request authentication, retries e timeouts.

Os pacotes NuGet a seguir capturam todas as principais funcionalidades de que você precisa para começar a criar aplicações .NET com Gen IA usando o Amazon Bedrock.

  • AWSSDK.Bedrock — Contém control plane APIs para gerenciar, treinar e implantar o modelo. Como listar todos os FMs, obter detalhes sobre um FM específico ou criar trabalhos de personalização de modelos.
  • AWSSDK.BedrockRuntime — Contém data plane APIs para fazer solicitações de inferência para modelos hospedados no Amazon Bedrock.
  • AWSSDK.BedrockAgent — Contém control plane APIs para criar e gerenciar Agents e Knowledge Bases para o Amazon Bedrock.
  • AWSSDK.BedrockAgentRuntime — contém data plane APIs para invocar agents e consultar knowledge bases.

Mais informações sobre as ações que são suportadas em cada uma das APIs podem ser encontradas na Amazon Bedrock API Reference.

Vamos guiá-lo pelas etapas necessárias para criar uma aplicação .NET usando o Amazon Bedrock. Mas antes de começarmos, recomendamos acessar a página de preços do Amazon Bedrock para garantir que você esteja confortável com o custo associado a esse simples exercício de aprendizado. Alguns exemplos de análise de custos para casos de uso de IA generativa estão documentados no Generative AI Application Builder on AWS Implementation Guide e também há exemplos de preços na página de preços do Amazon Bedrock.

Pré-requisitos

Para o propósito deste blog post, presumimos que você já tenha a seguinte configuração:

Etapa 1: Configurar o acesso ao modelo no Amazon Bedrock

Neste passo a passo, usaremos o modelo Anthropic Claude 3.0 no Amazon Bedrock. Esse modelo é um dos principais large language models (LLM) da Anthropic que permite uma ampla gama de tarefas, desde diálogos sofisticados e geração de conteúdo criativo até instruções detalhadas. Primeiro, vamos garantir que esse modelo esteja habilitado para você usar. No console do Amazon Bedrock, conforme mostrado na Figura 1, escolha Model Access no painel de navegação esquerdo.

Console Amazon Bedrock

Figura 1: Console Amazon Bedrock

Se o modelo que você deseja acessar estiver habilitado, você verá a coluna Access status definida como Access granted para o modelo. Se você ver o Access status como Available to request, escolha Manage model access e selecione Anthropic, Claude. Clique em Save. O acesso geralmente é concedido instantaneamente. Verifique se o valor da coluna de Access status está como Access granted, conforme mostrado na Figura 2.

Acesso ao modelo Amazon Bedrock

Figura 2: Acesso ao modelo Amazon Bedrock

Etapa 2: Configurar as permissões no AWS Identity and Access Management (IAM)

Para poder usar o Amazon Bedrock, você precisa de um usuário ou uma role com as permissões apropriadas no IAM. Para conceder ao Amazon Bedrock acesso à sua identidade de usuário:

  1. Abra o console do IAM.
  2. Selecione Policies e, em seguida, pesquise a policy AmazonBedrockFullAccess e anexe-a ao usuário, conforme mostrado na Figura 3.

Embora estejamos usando a política AmazonBedrockFullAccess gerenciada pela AWS em nossa solução, é importante que você implemente as melhores práticas de segurança em seus projetos aplicando permissões de privilégios mínimos. A documentação do Amazon Bedrock fornece exemplos de políticas de IAM para vários casos de uso.

Configurando as permissões no IAM

Figura 3: Configurando as permissões no IAM

Etapa 3: Implementando a solução

Para começar a usar o Amazon Bedrock em suas aplicações .NET, instale os pacotes NuGet relacionados do AWS SDK for .NET. Isso pode ser feito facilmente por meio do gerenciador de pacotes NuGet no Visual Studio. Primeiro, crie uma aplicação console ou ASP.NET usando o Visual Studio. Em seguida, clique com o botão direito do mouse no projeto no Solution Explorer e selecione “Manage NuGet Packages”. Procure por “AWSSDK.Bedrock”.

Você receberá dois pacotes como resultado dessa pesquisa:

AWSSDK.Bedrock
AWSSDK.BedrockRuntime

Como alternativa, você pode executar os seguintes comandos usando a .NET Command Line Internface (CLI) para adicionar esses pacotes ao seu projeto.

dotnet add package AWSSDK.Bedrock
dotnet add package AWSSDK.BedrockRuntime

O primeiro pacote, AWSSDK.Bedrock, oferece um objeto cliente para chamar ações da API de gerenciamento do Amazon Bedrock, como ListFoundationModels. Você pode encontrar a lista completa de ações de API suportadas na documentação de referência da API AWS SDK for .NET. O segundo pacote, AWSSDK.BedrockRuntime, oferece um objeto cliente para chamar ações da API de invocação do modelo Amazon Bedrock.

O código a seguir cria uma instância da classe AmazonBedrockClient do pacote NuGet AWSSDK.Bedrock e chama o método ListFoundationModelsAsync para listar todos os foundation models do Amazon Bedrock disponíveis. Para obter detalhes da API, consulte ListFoundationModels no AWS SDK for .NET API Reference.

if (chain.TryGetAWSCredentials("Bedrock", out awsCredentials))
{
    AmazonBedrockClient client = new AmazonBedrockClient(awsCredentials);
    _foundationModels = (await client.ListFoundationModelsAsync(new ListFoundationModelsRequest())).ModelSummaries.OrderBy(x => x.ProviderName);
}

Estrutura de Request da Amazon Bedrock API

Com os pacotes NuGet instalados, inicialize um objeto AmazonBedrockRuntimeClient. Esse objeto fornece métodos para invocar modelos do Amazon Bedrock para executar inferências e gerar respostas. O código a seguir invoca o large language model Claude v3 usando o objeto cliente.

Em seguida, instancie um objeto InvokeRequest, defina suas propriedades que incluam o ID do modelo e o prompt e passe-o para a chamada do método AmazonBedrockRuntimeClient.InvokeModelAsync para executar a inferência do modelo. A estrutura das solicitações desempenha um grande papel em orientar os FMs no sentido de fornecer as respostas corretas. Para obter informações sobre como escrever solicitações, consulte Prompt engineering guidelines.

// Instantiate the request object
 InvokeModelRequest request = new InvokeModelRequest()
 {
    // Set ContentType property to indicate we are sending inference parameters as a Json object. For Stable Diffusion model, it could be 'img/png'
    ContentType = "application/json",
    
    // Set Accept property to indicate we are expecting result as Json object. Again, for Stable Diffusion model, it could also be 'img/png'
    Accept = "application/json",
    
    // Set ModelId property which foundation model you cant to invoke. You can find the list of Model Ids you can use at https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids-arns.html
    ModelId = "anthropic.claude-v32",
    
    // Serialize to a MemoryStream the Json object containing the inference parameters expected by the model. Each foundation model expects a different set of inference parameters in different formats (application/json for most of them). It is up to you to know what you need to provide in this property and the appropriate format.
    Body = new MemoryStream(
        Encoding.UTF8.GetBytes(
            JsonSerializer.Serialize(new
            {
                prompt = "\n\nHuman:Explain how async/await work in .NET and provide a code example\n\nAssistant:",
                max_tokens_to_sample = 2000
            })
        )
    )
 };

Invoque o Anthropic Claude 3.x no Amazon Bedrock

O código de exemplo a seguir invoca o modelo Anthropic Claude v3 para gerar uma resposta de texto para nossa request. O exemplo a seguir mostra como usar a API InvokeModelWithResponse para gerar streaming de texto com C# usando o prompt “Explain how async/await work in .NET and provide a code sample”.

Cada foundation model suportado no Amazon Bedrock tem diferentes requisitos de formato de request e formatos diferentes para as respostas que o modelo retorna. Consulte exemplos do Amazon Bedrock Runtime usando o AWS SDK for .NET para ver exemplos de solicitações para FMs suportadas pelo Amazon Bedrock. Além disso, o SDK é compatível com uma API de streaming que retorna dados em um formato de streaming.

Isso permite que você acesse as respostas em partes sem esperar pelo resultado completo. Isso pode proporcionar uma melhor experiência ao usuário exibindo as respostas do LLM à medida que elas são geradas (o que às vezes pode ser longo), em vez de depender da solicitação síncrona da API InvokeModel.

Chamando Amazon Bedrock quando o usuário insere uma pergunta e envia para resposta:

    // Call the InvokeModelAsync method. It actually calls the InvokeModel action from the Amazon Bedrock API
    InvokeModelResponse response = await client.InvokeModelAsync(request);

    // Check the HttpStatusCode to ensure successful completion of the request
    if (response.HttpStatusCode == System.Net.HttpStatusCode.OK)
    {
        // Deserialize the Json object returned in a plain old C# object (POCO). Here, we use the ClaudeBodyResponse internal class defined bellow
        ClaudeBodyResponse? body = await JsonSerializer.DeserializeAsync<ClaudeBodyResponse>(
        response.Body,
        new JsonSerializerOptions() {
        PropertyNameCaseInsensitive = true
        });
        // Write the completion string to the console
        Console.WriteLine(body?.Completion);
    }
    else
    {
        Console.WriteLine("Something wrong happened");
    }
 }

Neste exemplo, escrevemos a resposta na janela do console.

Apresentando Sample App

Todo o código deste blog post e muito mais podem ser encontrados no repositório dotnet-genai-samples do GitHub. Usaremos esse exemplo de aplicação .NET em toda esta série de blogs. A aplicação mostra como executar inferências em diferentes foundation models por meio de playgrounds. Esses playgrounds são modelados para serem um pouco semelhantes aos playgrounds do Amazon Bedrock que você encontrará no console de gerenciamento da AWS, mas são criados usando código .NET. Siga as etapas no arquivo README para configurar a aplicação.

A aplicação fornece as seguintes funcionalidades:

  • Lista e exibe todos os foundation models aos quais você tem acesso, conforme mostrado na Figura 4, junto com suas características.
  • Text Playground – Permite que você experimente modelos de texto compatíveis com o Amazon Bedrock e também permite que você exercite suas habilidades de prompt engineering.
Lista Foundation Models

Figura 4: Lista Foundation Models

Preços

Antes de começar a criar aplicações prontas para produção no Amazon Bedrock, recomendamos consultar a página de preços do serviço para entender como funcionam os preços do Amazon Bedrock. Você observará que o Amazon Bedrock oferece opções flexíveis de preços. Se você planeja usar o Amazon Bedrock para inferência, você tem duas opções para os planos de preços: 1. Sob demanda e em lote — os preços são baseados nos tamanhos dos tokens de entrada e saída, na região da AWS e no modelo que está sendo usado. 2. Taxa de transferência provisionada — você será cobrado pelo número de unidades modelo reservadas que atenderão aos requisitos de desempenho da sua aplicação. Para personalização do modelo, avaliação do modelo e preços de Guardrails for Amazon Bedrock, consulte a página de preços.

Limpeza

Se você acompanhou e testou nossa aplicação de exemplo em sua própria conta da AWS, é importante limpar os recursos que você criou para parar de incorrer em cobranças.

Se você não precisar mais usar um foundation model, siga as etapas de remoção do acesso ao modelo do guia do usuário do Amazon Bedrock para remover o acesso a ele.

Conclusão

Neste post, aprendemos sobre a integração da IA generativa em seus aplicações .NET com o Amazon Bedrock. A aplicação de exemplo que usamos está no GitHub e mostra o poder da IA generativa. Como desenvolvedor .NET trabalhando na AWS, a clonagem desse repositório e a experimentação com o Amazon Bedrock proporcionarão aprendizado prático. Mergulhar em exemplos do mundo real é a melhor maneira de entender como você pode aproveitar essas tecnologias transformadoras para resolver problemas e criar soluções inovadoras. Também incentivamos você a aprender e experimentar o Amazon Bedrock e todos os outros serviços de IA da AWS que você pode usar em seu código .NET.

Esse artigo foi originalmente publicado em inglês no AWS Blog (link aqui).

Autores

Jagadeesh Chitikesi é arquiteto sênior de soluções especialista em Microsoft na AWS. Ele trabalhou como desenvolvedor e arquiteto em empresas de todos os tamanhos nos setores de saúde, finanças, varejo, serviços públicos e governo nos últimos 20 anos. Ele é apaixonado pela nuvem e por toda a inovação que acontece na AWS.
Ashish Bhatia é arquiteto sênior de soluções na AWS com foco especial em tecnologias da Microsoft, como .NET e SQL Server na AWS. Ele é apaixonado por ajudar os clientes a criar soluções de software modernas usando os serviços nativos da nuvem da AWS. Em sua carreira profissional de 20 anos, ele trabalhou com grandes empresas e criou produtos de software. NET, C#, SQL Server e plataformas de nuvem, como Azure e AWS.

Tradutores e Revisores

Luciano Bernardes trabalha atualmente como Sr Solutions Architect na AWS, especializado em workloads Microsoft. Com 17 anos de experiência no mercado, trabalhou a maior parte em consultoria técnica especializada em Microsoft, em clientes de várias verticais, com demandas voltadas para infraestrutura on-premises e em nuvem. Como SA, trabalha próximo a clientes e parceiros de consultoria em U.S. e LATAM, para apoiá-los em tomadas de decisão e revisão de arquitetura de workoads Microsoft na nuvem AWS.
Bruno Lopes é Senior Solutions Architect no time da AWS LATAM. Trabalha com soluções de TI há mais de 15 anos, tendo em seu portfólio inúmeras experiências em workloads Microsoft, ambientes híbridos e capacitação técnica de clientes como Technical Trainer e Evangelista. Agora atua como um Arquiteto de Soluções, unindo todas as capacidades para desburocratizar a adoção das melhores tecnologias afim de ajudar os clientes em seus desafios diários.