Note :

Accéder au service d'IA générative OCI par programmation à l'aide de l'application Web Ruby on Rails

Présentation

Oracle Cloud Infrastructure Generative AI (OCI Generative AI) est un nouvel outil d'intelligence artificielle révolutionnaire qui a le potentiel de transformer la façon dont nous interagissons avec la technologie. Il s'agit d'un modèle de langage volumineux, qui est entraîné sur une quantité massive de données textuelles et apprend à prédire le mot suivant dans une séquence basée sur les mots qui l'ont précédé. Cela permet à l'intelligence artificielle générative d'OCI de générer des réponses de type humain aux invites de texte, ce qui en fait un outil incroyablement puissant pour créer un langage à sons naturels.

L'une des caractéristiques les plus impressionnantes de l'IA générative d'OCI est sa capacité à comprendre des sujets complexes et à fournir des explications et des réponses approfondies. De nos jours, chaque organisation souhaite tirer parti de la puissance de l'IA générative dans ses applications et créer une offre innovante pour ses clients.

Dans ce tutoriel, nous allons discuter et comprendre comment OCI peut aider les organisations du monde entier à tirer parti de la puissance de l'IA générative avec OCI. Dans ce tutoriel, nous utiliserons Ruby on Rails (RoR) comme cadre de développement et appellerons des API d'IA générative OCI basées sur le langage de programmation Ruby.

Objectifs

Préalables

Tâche 1 : Configurer les clés d'API Oracle Cloud Infrastructure

  1. Connectez-vous à la location OCI avec le compte de service ou l'utilisateur administrateur et allez à Paramètres de l'utilisateur.

    Ouvrir les paramètres de l'utilisateur

    Ou

    Accédez à l'utilisateur à partir de la console IAM OCI. Assurez-vous que l'utilisateur dispose de tous les accès requis pour créer et mettre à jour l'infrastructure sur OCI.

  2. Allez à la section Ressources pour l'utilisateur, cliquez sur Clés d'API et sur Ajouter une clé d'API. Sélectionnez cette option pour télécharger les nouvelles clés publiques et privées, charger votre clé publique ou coller votre clé publique.

    Ajouter une clé d'API

  3. Enregistrez les clés à un emplacement pratique et enregistrez le fichier de configuration comme indiqué dans la page suivante. Vous aurez besoin de ce fichier de configuration et de cette clé privée lors de la connexion à votre location à l'aide de la trousse SDK Ruby.

    Enregistrer le fichier de configuration

    Note :

    • OCI prend en charge le service d'IA générative dans la région US-CHICAGO-1 à ce jour. Veillez donc à activer cette région de votre location et à vous y abonner.

    • Pour appeler des services OCI à partir d'instances de calcul OCI, OCI fournit un moyen plus sécurisé à l'aide des principaux d'instance. Évitez d'utiliser des clés d'API d'utilisateur comme meilleures pratiques. Pour plus d'informations, voir Appel de services à partir d'une instance.

Tâche 2 : Créer et configurer une instance de calcul OCI à utiliser pour le développement RoR

  1. Allez à Lancement d'une instance Windows sur OCI pour créer votre instance de calcul Windows sur OCI.

  2. Une fois votre instance Windows créée, connectez-vous à l'aide de votre mot de passe initial, comme indiqué dans la capture d'écran suivante.

    Instance de calcul Windows

  3. Après vous être connecté à votre instance de calcul Windows, installez et configurez Ruby, Ruby on Rails et créez une nouvelle application à l'aide de la commande rails.

    rails new GenAIApp
    

    Accédez au répertoire de votre application et exécutez la commande suivante pour mettre en service votre serveur d'applications Rails. Vous devriez pouvoir accéder à votre application Rails par défaut sur http://127.0.0.1:3000.

    cd GenAIApp
    rails server -b 0.0.0.0
    
  4. Accédez au répertoire de base de vos utilisateurs, qui est c:/users/opc, et créez le fichier config pour la trousse SDK Ruby. Configurez le fichier de configuration tel que vous l'avez téléchargé dans la tâche 1.3. Placez également le fichier de clé privée téléchargé. Pour plus d'informations, voir Oracle Cloud Infrastructure Ruby SDK.

    Note :

    • Vous devez réinitialiser le mot de passe Windows lors de la première connexion à l'instance de calcul OCI. Rappelez-vous le nouveau mot de passe, car vous en aurez besoin pour vous connecter à partir de la prochaine fois.

    • Pour accéder à votre application Rails en dehors du réseau, vous devez ouvrir le port 3000 et désactiver le pare-feu Windows à partir de l'instance de calcul créée.

Tâche 3 : Configurer une application RoR, écrire le code approprié pour appeler et afficher le service d'IA générative OCI

  1. Après avoir pu exécuter votre application Rails et y accéder localement et à partir du réseau requis, notre toute première étape consiste à configurer les joyaux requis pour l'application. Ouvrez votre Gemfile et mettez à jour son contenu comme indiqué dans l'extrait de code suivant.

    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. Exécutez la commande bundle install pour installer tous les ensembles.

    bundle install
    

    L'installation de l'offre groupée doit afficher la sortie comme indiqué dans l'image suivante.

    Installation de l'offre groupée

  3. Une fois l'installation de l'ensemble terminée, ajoutez des routes au fichier routes.rb. Cela fournira les API exposées dans votre application et l'action doit être effectuée lors de l'appel.

    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. Nous devons développer le code pour le fichier app controller comme indiqué ci-dessous. Il s'agit du code principal qui sera exécuté lorsque vous appellerez les API d'IA générative OCI à l'aide de l'application.

    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. Mettez à jour le contenu de notre fichier d'affichage. Cette option sera utilisée pour afficher l'interface utilisateur et appeler les appels d'API Obtenir et Post sur vos applications. Cette page d'interface utilisateur sera utilisée par l'utilisateur pour interagir avec votre application.

    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>
    

    Après avoir effectué toutes ces modifications, vous devriez être en mesure de voir l'application mise à jour et de pouvoir appeler l'IA générative OCI en posant des questions à l'invite.

    Interface utilisateur de l'application OCI GenAI RoR

    Note :

    • Vous devez prendre soin de tous les gemmes et de leurs versions, car il peut y avoir des cas où vous devez mettre à jour les versions dans Gemfile selon votre configuration.

    • Prenez soin du réseau, afin que Ruby puisse se connecter au fournisseur de gemmes requis à partir de votre instance pour télécharger les gemmes requises.

Confirmation

Autres ressources d'apprentissage

Explorez d'autres laboratoires sur la page docs.oracle.com/learn ou accédez à plus de contenu d'apprentissage gratuit sur le canal YouTube d'Oracle Learning. De plus, visitez education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

Pour obtenir de la documentation sur le produit, visitez Oracle Help Center.