Nota

Accedi al servizio OCI Generative AI a livello di programmazione utilizzando l'applicazione Web Ruby on Rails

Introduzione

Oracle Cloud Infrastructure Generative AI (OCI Generative AI) è un nuovo e rivoluzionario strumento di intelligenza artificiale che ha il potenziale per trasformare il modo in cui interagiamo con la tecnologia. Si tratta di un modello di linguaggio di grandi dimensioni, che viene addestrato su una grande quantità di dati di testo e impara a prevedere la parola successiva in una sequenza basata sulle parole che sono venute prima. Ciò consente all'AI generativa OCI di generare risposte simili a quelle umane ai prompt di testo, rendendolo uno strumento incredibilmente potente per creare un linguaggio dal suono naturale.

Una delle caratteristiche più straordinarie dell'AI generativa OCI è la sua capacità di comprendere argomenti complessi e fornire spiegazioni e risposte approfondite. Oggi, ogni organizzazione vuole sfruttare la potenza dell'AI generativa nelle proprie applicazioni e creare un'offerta innovativa per i propri clienti.

In questo tutorial, discuteremo e capiremo come OCI può aiutare le organizzazioni di tutto il mondo a sfruttare la potenza dell'AI generativa con OCI. In questo tutorial, utilizzeremo Ruby on Rails (RoR) come framework di sviluppo e chiameremo le API OCI Generative AI basate sul linguaggio di programmazione Ruby.

Obiettivi

Prerequisiti

Task 1: impostare le chiavi API di Oracle Cloud Infrastructure

  1. Eseguire il login alla tenancy OCI con l'account di servizio o l'utente amministratore e andare alle impostazioni utente.

    Apri impostazioni utente

    Oppure

    Andare all'utente dalla console IAM OCI. Assicurarsi che l'utente disponga di tutti gli accessi necessari per creare e aggiornare l'infrastruttura su OCI.

  2. Passare alla sezione Risorse per l'utente, fare clic su Chiavi API e su Aggiungi chiave API. Selezionare questa opzione per scaricare le nuove chiavi pubbliche e private, caricare la chiave pubblica o incollare la chiave pubblica.

    Aggiungi chiave API

  3. Salvare le chiavi in una posizione comoda e salvare il file di configurazione come mostrato nella pagina seguente. Durante la connessione alla tenancy mediante l'SDK Ruby, saranno necessari questo file di configurazione e questa chiave privata.

    Salva file di configurazione

    Nota:

    • OCI supporta il servizio AI generativa nell'area US-CHICAGO-1 al momento. Pertanto, assicurati di abilitare e sottoscrivere quest'area nella tua tenancy.

    • Per chiamare i servizi OCI dalle istanze di OCI Compute, OCI offre un modo più sicuro utilizzando i principal delle istanze. Evita di utilizzare le chiavi API degli utenti come best practice. Per ulteriori informazioni, vedere Chiamata di servizi da un'istanza.

Task 2: creare e configurare un'istanza di OCI Compute da utilizzare per lo sviluppo RoR

  1. Andare a Avvio di un'istanza di Windows su OCI per creare l'istanza di computazione Windows su OCI.

  2. Una volta creata l'istanza di Windows, eseguire il login utilizzando la password iniziale come mostrato nella schermata seguente.

    Istanza di computazione Windows

  3. Dopo aver eseguito il login all'istanza di computazione Windows, installare e configurare Ruby, Ruby on Rails e creare una nuova applicazione utilizzando il comando rail.

    rails new GenAIApp
    

    Accedere alla directory dell'applicazione ed eseguire il comando seguente per attivare e attivare il server dell'applicazione dei binari. Dovresti essere in grado di accedere all'app Rails predefinita su http://127.0.0.1:3000.

    cd GenAIApp
    rails server -b 0.0.0.0
    
  4. Andare alla directory home degli utenti, ovvero c:/users/opc, e creare il file config per l'SDK Ruby. Configurare il file di configurazione così come è stato scaricato nel task 1.3. Posizionare anche il file della chiave privata scaricato. Per ulteriori informazioni, consulta Oracle Cloud Infrastructure Ruby SDK.

    Nota:

    • È necessario reimpostare la password Windows al primo login all'istanza di computazione OCI. Ricordare la nuova password, in quanto sarà necessario eseguire il login dalla prossima volta.

    • Per accedere all'applicazione Rails dall'esterno della rete, è necessario aprire la porta 3000 e anche disattivare il firewall Windows dall'istanza di computazione creata.

Task 3: impostare un'applicazione RoR, scrivere il codice appropriato per chiamare e visualizzare il servizio AI generativa OCI

  1. Dopo essere stato in grado di eseguire l'app Rails e accedervi localmente e dalla rete richiesta, il nostro primo passo è quello di impostare le gemme richieste per l'applicazione. Aprire il file Gemfile e aggiornarne il contenuto come mostrato nel seguente frammento di codice.

    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. Eseguire il comando bundle install per installare tutti i pacchetti.

    bundle install
    

    L'installazione del bundle dovrebbe mostrare l'output come mostrato nella seguente immagine.

    Installazione bundle

  3. Al termine dell'installazione del bundle, aggiungere gli instradamenti al file routes.rb. Ciò fornirà le API esposte nell'applicazione e l'azione deve essere eseguita quando viene richiamata.

    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. Dobbiamo sviluppare il codice per il file app controller come mostrato di seguito. Si tratta del codice principale che verrà eseguito quando si chiamano le API AI generative OCI utilizzando l'applicazione.

    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. Aggiorna il contenuto del file di visualizzazione. Verrà utilizzata per visualizzare l'interfaccia utente e chiamare le chiamate API Ottieni e Invia nelle applicazioni. Questa pagina dell'interfaccia utente verrà utilizzata dall'utente per interagire con l'applicazione.

    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>
    

    Dopo aver apportato tutte queste modifiche, dovresti essere in grado di visualizzare l'applicazione aggiornata e anche di richiamare l'AI generativa OCI ponendo domande al prompt.

    Interfaccia utente applicazione GenAI RoR OCI

    Nota:

    • È necessario prendersi cura di tutte le gemme e delle loro versioni, in quanto potrebbero esserci casi in cui è necessario aggiornare le versioni in Gemfile in base alla configurazione.

    • Prenditi cura della rete, in modo che Ruby possa connettersi al provider gem richiesto dalla tua istanza per scaricare le gemme richieste.

Conferme

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti gratuiti sulla formazione su Oracle Learning YouTube channel. Inoltre, visita education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.

Per la documentazione del prodotto, visita l'Oracle Help Center.