Observação:

Acesse o Serviço de IA Generativa do OCI de Forma Programática usando o Aplicativo Web Ruby on Rails

Introdução

A Oracle Cloud Infrastructure Generative AI (OCI Generative AI) é uma nova ferramenta revolucionária de inteligência artificial que tem o potencial de transformar a maneira como interagimos com a tecnologia. É um modelo de linguagem grande, que é treinado em uma enorme quantidade de dados de texto e aprende a prever a próxima palavra em uma sequência com base nas palavras que vieram antes dela. Isso permite que a IA generativa da OCI gere respostas semelhantes às humanas a prompts de texto, tornando-a uma ferramenta incrivelmente poderosa para criar linguagem de som natural.

Um dos recursos mais impressionantes da IA generativa da OCI é sua capacidade de compreender tópicos complexos e fornecer explicações e respostas detalhadas. Hoje em dia, todas as organizações querem aproveitar o poder da IA generativa em seus aplicativos e criar uma oferta inovadora para seus clientes.

Neste tutorial, discutiremos e entenderemos como a OCI pode ajudar as organizações em todo o mundo a aproveitar o poder da IA generativa com a OCI. Neste tutorial, usaremos o Ruby on Rails (RoR) como nossa estrutura de desenvolvimento e chamaremos APIs de IA Generativa da OCI com base na linguagem de programação Ruby.

Objetivos

Pré-requisitos

Tarefa 1: Configurar Chaves de API do Oracle Cloud Infrastructure

  1. Faça log-in na tenancy do OCI com a conta de serviço ou o usuário administrador e vá para as Definições do usuário.

    Abrir Definições do Usuário

    Ou

    Vá para o usuário na console do OCI IAM. Certifique-se de que o usuário tenha todo o acesso necessário para criar e atualizar a infraestrutura no OCI.

  2. Vá para a seção Recursos do usuário, clique em Chaves de API e Adicionar Chave de API. Selecione para fazer download das novas chaves pública e privada, fazer upload da chave pública ou colar a chave pública.

    Adicionar Chave de API

  3. Salve as chaves em um local conveniente e salve o arquivo de configuração conforme mostrado na página a seguir. Você precisará desse arquivo de configuração e da chave privada ao estabelecer conexão com sua tenancy usando o Ruby SDK.

    Salvar Arquivo de Configuração

    Observação:

    • O OCI suporta o serviço de IA Generativa na região US-CHICAGO-1 a partir de agora. Portanto, certifique-se de ativar e assinar esta região em sua tenancy.

    • Para chamar serviços do OCI por meio de instâncias do OCI Compute, o OCI fornece uma maneira mais segura de usar controladores de instâncias. Evite usar chaves de API do usuário como melhores práticas. Para obter mais informações, consulte Chamando os Serviços em uma Instância.

Tarefa 2: Criar e Configurar uma Instância do OCI Compute a ser usada para o Desenvolvimento RoR

  1. Vá para Iniciando uma Instância do Windows no OCI para criar sua instância de computação do Windows no OCI.

  2. Depois que sua instância do Windows for criada, faça log-in usando sua senha inicial, conforme mostrado na captura de tela a seguir.

    Instância de Computação do Windows

  3. Depois de fazer log-in na sua instância de computação do Windows, instale e configure o Ruby, o Ruby on Rails e crie um novo aplicativo usando o comando rails.

    rails new GenAIApp
    

    Vá para o diretório do aplicativo e execute o comando a seguir para ativar e executar o servidor de aplicativos de trilhos. Você deve ser capaz de acessar seu aplicativo Rails padrão em http://127.0.0.1:3000.

    cd GenAIApp
    rails server -b 0.0.0.0
    
  4. Vá para o diretório home dos usuários, que é c:/users/opc, e crie o arquivo config para o Ruby SDK. Configure o arquivo de configuração conforme o download foi feito na Tarefa 1.3. Coloque também o arquivo de chave privada baixado. Para obter mais informações, consulte Oracle Cloud Infrastructure Ruby SDK.

    Observação:

    • Você precisa redefinir a senha do Windows no primeiro log-in na instância de computação do OCI. Lembre-se da nova senha, pois você precisará dela para fazer login na próxima vez.

    • Para acessar seu aplicativo Rails de fora da rede, abra a porta 3000 e também desative o firewall do Windows da instância de computação criada.

Tarefa 3: Configurar um Aplicativo RoR, Escrever Código Apropriado para Chamar e Exibir o serviço de IA Generativa do OCI

  1. Depois de poder executar seu aplicativo Rails e acessá-lo localmente e a partir da rede necessária, nosso primeiro passo é configurar as gemas necessárias para o aplicativo. Abra seu Gemfile e atualize seu conteúdo conforme mostrado no trecho de código a seguir.

    Gemfile:

    source 'https://rubygems.org'
    git_source(:github) { |repo| "https://github.com/#{repo}.git" }
    
    ruby '3.2.3'
    
    # Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main'
    gem 'rails', '~> 6.1.4', '>= 6.1.4.1'
    
    # Gem for OCI SDK
    gem 'oci'
    
    # Use sqlite3 as the database for Active Record
    gem 'sqlite3', '~> 1.4'
    # Use Puma as the app server
    gem 'puma', '~> 5.0'
    # Use SCSS for stylesheets
    gem 'sass-rails', '>= 6'
    # Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
    gem 'webpacker', '~> 5.0'
    # Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
    gem 'turbolinks', '~> 5'
    # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
    gem 'jbuilder', '~> 2.7'
    # Use Redis adapter to run Action Cable in production
    # gem 'redis', '~> 4.0'
    # Use Active Model has_secure_password
    # gem 'bcrypt', '~> 3.1.7'
    
    gem 'tzinfo-data'
    
    # Use Active Storage variant
    # gem 'image_processing', '~> 1.2'
    
    # Reduces boot times through caching; required in config/boot.rb
    gem 'bootsnap', '>= 1.4.4', require: false
    
    group :development, :test do
      # Call 'byebug' anywhere in the code to stop execution and get a debugger console
      gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
    end
    
    group :development do
      # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
      gem 'web-console', '>= 4.1.0'
      # Display performance information such as SQL time and flame graphs for each request in your browser.
      # Can be configured to work on production as well see: https://github.com/MiniProfiler/rack-mini-profiler/blob/master/README.md
      gem 'rack-mini-profiler', '~> 2.0'
    end
    
    group :test do
      # Adds support for Capybara system testing and selenium driver
      gem 'capybara', '>= 3.26'
      gem 'selenium-webdriver'
      # Easy installation and use of web drivers to run system tests with browsers
      gem 'webdrivers'
    end
    
    # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
    gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
    
  2. Execute o comando bundle install para instalar todos os pacotes.

    bundle install
    

    A instalação do seu bundle deve mostrar a saída conforme mostrado na imagem a seguir.

    Instalação de bundle

  3. Depois que a instalação do bundle for concluída, adicione rotas ao arquivo routes.rb. Isso fornecerá as APIs expostas em seu aplicativo e a ação precisa ser executada quando chamada.

    config/routes.rb:

    Rails.application.routes.draw do
      root "genai_app#checkin"
      get "/checkin", to: "genai_app#checkin"
      post "/checkin", to: "genai_app#checkinpost"
    end
    
  4. Temos que desenvolver o código para o arquivo controller do aplicativo, conforme mostrado abaixo. Este é o código principal que será executado quando você chamar as APIs de IA Generativa do OCI usando o aplicativo.

    app/controller/genai_app_controller.rb:

    require 'oci'
    
    class GenAIAppController < ApplicationController
    
      def checkin
        lines = File.readlines("C:/Users/opc/GenAIApp/app/controllers/chatlog.txt")
        @chatLines = lines
      end
    
      def checkinpost
        File.open("C:/Users/opc/GenAIApp/app/controllers/chatlog.txt", "a") { |f| f.write "\nusr::#{params[:message]}" }
        if params[:message].include? "AskAI:"
          fullMessage = params[:message].split("AskAI:")[1].strip()
          region = 'us-chicago-1'
          gen_ai_inference_client = OCI::GenerativeAiInference::GenerativeAiInferenceClient.new(region: region)
          compartment_id = 'ocid1.compartment.oc1..aaaaaaaasdk6oyucuqzcaixwxtnxzlt6xxxxxxxxxxuzrm6vmdqgh6wipa' # compartmentId that has policies grant permissions for using Generative AI Service
          model_id = 'cohere.command'
          prompt = params[:message].split("AskAI:")[1].strip()
          max_tokens = 500
          temperature = 0.75
          frequency_penalty = 1.0
          top_p = 0.7
    
          details = OCI::GenerativeAiInference::Models::GenerateTextDetails.new('compartment_id': compartment_id,
                                                                                'serving_mode': OCI::GenerativeAiInference::Models::OnDemandServingMode.new(
                                                                                  'model_id': model_id
                                                                                ),
                                                                                'inference_request': OCI::GenerativeAiInference::Models::
                                                                                    CohereLlmInferenceRequest.new(
                                                                                      'prompt': prompt,
                                                                                      'is_stream': false,
                                                                                      'max_tokens': max_tokens,
                                                                                      'temperature': temperature,
                                                                                      'top_p': top_p,
                                                                                      'frequency_penalty': frequency_penalty
                                                                                    ))
    
          response = gen_ai_inference_client.generate_text(details)
          text_response = response.data.to_s[170...-150]
          File.open("C:/Users/opc/GenAIApp/app/controllers/chatlog.txt", "a") { |f| f.write "\nnex::#{text_response}" }
          print(text_response)
        end
    
      redirect_to("/checkin")
      end
    
    end
    
  5. Atualize o conteúdo do nosso arquivo de visualização. Isso será usado para exibir a interface do usuário e chamar as chamadas de API Get e Post em seus aplicativos. Esta página da interface do usuário será usada pelo usuário para interagir com seu aplicativo.

    app/view/checkin.html.erb:

    <style>
    
      .greenB {
        background-color: white;
        color: black;
        font-size: 16px;
        border-bottom: 5px solid darkgreen;
        text-decoration: none;
        font-family:verdana;
        font-weight:bold;
        width: 100%;
        height: 50px;
        display: inline-block;
        display:flex;/*CSS3*/
        align-items:center;/*Vertical align*/
        justify-content:center;/*horizontal align*/
      }
    
      .blueB {
        background-color: white;
        color: black;
        font-size: 16px;
        border-bottom: 5px solid #2E86C1;
        text-decoration: none;
        font-family:verdana;
        font-weight:bold;
        width: 100%;
        height: 50px;
        display: inline-block;
        display:flex;/*CSS3*/
        align-items:center;/*Vertical align*/
        justify-content:center;/*horizontal align*/
      }
    
      .greenB:hover {background-color: darkgreen; color: white}
      .blueB:hover {background-color: #2E86C1; color: white}
    </style>
    
    </br>
    <table width=100%>
      <tr>
        <td width=2%>
        </td>
        <td width=98%>
          <div style="color:black;font-family:verdana;font-size:25px;">
            <b>Hey, welcome to Nex!</b>
          </div>
          </br>
          <div style="color:black;font-family:verdana;font-size:17px;">
            <b>New Checking/Chat</b>
          </div>
          </br>
          <div style="color:darkgreen;font-family:verdana;font-size:14px;padding-bottom:20px;">
            <b> Start a new chat with Nex </b>
          </div>
          </br>
          <div style="font-family:verdana;font-size:15px;display:block;height:450px;overflow:auto;">
            <% for line in @chatLines do %>
              <% if line.include? "nex::" %>
                <table width=90%>
                  <tr>
                    <td width=70% style="color:white;background-color:#2E86C1;padding:10px;">
                      <%= line.split("nex::")[1] %>
                    </td>
                    <td width=30%>
                    </td>
                  </tr><tr height=2px></tr>
                </table>
              <% end %>
              <% if line.include? "usr::" %>
                <table width=97%>
                  <tr>
                    <td width=30%>
                    </td>
                    <td width=70% style="color:white;background-color:darkgreen;padding:10px;">
                      <%= line.split("usr::")[1] %>
                    </td>
                  </tr><tr height=2px></tr>
                </table>
              <% end %>
            <% end %>
    
            <table width=90%>
              <tr>
                <td width=70%>
                  <%= submit_tag 'Track it!', name: nil, class: "greenB", :style => "width: 200px;" %>
                </td>
                <td width=30%>
                </td>
              </tr><tr height=5px></tr>
            </table>
          </div>
    
          <%= form_tag({:controller=>"genai_app", :action=>"checkinpost"}, method: :post) do %>
            <table width=100%>
                <tr>
                  <td width=80%>
                    <%= text_field_tag :message, "", :placeholder => "Enter your message", :style => "width: 100%; font-size:17px; padding:15px;" %>
                  </td>
                  <td width=3%>
                  </td>
                  <td width=15%>
                    <%= submit_tag 'Send Message', name: nil, class: "blueB" %>
                  </td>
                  <td width=3%>
                  </td>
                </tr>
            </table>
          <% end %>
        </td>
      </tr>
    </table>
    

    Depois de fazer todas essas alterações, você poderá ver o aplicativo atualizado e também chamar a IA Generativa do OCI fazendo perguntas ao prompt.

    IU do Aplicativo OCI GenAI RoR

    Observação:

    • Você tem que cuidar de todas as gemas e suas versões, pois pode haver casos em que você precisa atualizar as versões em Gemfile de acordo com sua configuração.

    • Cuide da rede, para que o Ruby possa se conectar ao provedor de gemas necessário da sua instância para fazer download das gemas necessárias.

Confirmação

Mais Recursos de Aprendizagem

Explore outros laboratórios em docs.oracle.com/learn ou acesse mais conteúdo de aprendizado gratuito no canal Oracle Learning YouTube. Além disso, visite education.oracle.com/learning-explorer para se tornar um Oracle Learning Explorer.

Para obter a documentação do produto, visite o Oracle Help Center.