Remarques :

Accéder au service OCI Generative AI par programmation à l'aide de Ruby on Rails Web Application

Introduction

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 grand modèle de langage, 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 à OCI Generative AI 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 à son naturel.

L'une des fonctionnalités les plus impressionnantes d'OCI Generative AI est sa capacité à comprendre des sujets complexes et à fournir des explications et des réponses approfondies. De nos jours, chaque entreprise veut 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 entreprises 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 nous appellerons les API OCI Generative AI basées sur le langage de programmation Ruby.

Objectifs

Prérequis

Tâche 1 : configuration des clés d'API Oracle Cloud Infrastructure

  1. Connectez-vous à la location OCI avec le compte de service ou l'administrateur et accédez aux paramètres utilisateur.

    Ouvrir les paramètres utilisateur

    Ou

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

  2. Accédez à la section Ressources de 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, télécharger votre clé publique ou coller votre clé publique.

    Ajouter une clé d'API

  3. Enregistrez les clés à un emplacement approprié 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 du kit SDK Ruby.

    Enregistrer le fichier de configuration

    Remarque :

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

    • Pour appeler des services OCI à partir d'instances OCI Compute, OCI offre un moyen plus sécurisé d'utiliser des principaux d'instance. Evitez d'utiliser des clés d'API utilisateur comme meilleures pratiques. Pour plus d'informations, reportez-vous à 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. Accédez à 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 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 faire fonctionner 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, à savoir c:/users/opc, et créez le fichier config pour le kit SDK Ruby. Configurez le fichier de configuration comme vous l'avez téléchargé dans la tâche 1.3, puis placez également le fichier de clé privée téléchargé. Pour plus d'informations, reportez-vous à SDK Ruby Oracle Cloud Infrastructure.

    Remarque :

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

    • Pour accéder à votre application Rails à partir de l'extérieur 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 OCI Generative AI

  1. Une fois que vous êtes en mesure d'exécuter votre application Rails et d'y accéder localement et à partir du réseau requis, notre première étape consiste à configurer les pierres précieuses requises pour l'application. Ouvrez votre fichier Gemfile et mettez à jour son contenu comme indiqué dans le fragment 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 packages.

    bundle install
    

    L'installation du bundle doit afficher la sortie comme indiqué dans l'image suivante.

    Installation du bundle

  3. Une fois l'installation du bundle terminée, ajoutez des routes au fichier routes.rb. Cela fournira les API exposées sur votre application et l'action doit être effectuée lorsqu'elle est appelée.

    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 s'exécutera lorsque vous appellerez les API OCI Generative AI à 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. Elle sera utilisée pour afficher l'interface utilisateur et appeler les appels d'API Obtenir et Publier 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>
    

    Une fois toutes ces modifications effectuées, vous devriez être en mesure de voir l'application mise à jour et également d'appeler OCI Generative AI en posant des questions à l'invite.

    Interface utilisateur de l'application OCI GenAI RoR

    Remarque :

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

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

Remerciements

Ressources de formation supplémentaires

Parcourez d'autres ateliers sur docs.oracle.com/learn ou accédez à davantage de contenus de formation gratuits sur le canal Oracle Learning YouTube. De plus, rendez-vous sur education.oracle.com/learning-explorer pour devenir un explorateur Oracle Learning.

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