Note:

Acceso al servicio OCI Generative AI mediante programación mediante la aplicación web Ruby on Rails

Introducción

Oracle Cloud Infrastructure Generative AI (OCI Generative AI) es una nueva y revolucionaria herramienta de inteligencia artificial que tiene el potencial de transformar la forma en que interactuamos con la tecnología. Es un modelo de lenguaje grande, que se entrena en una gran cantidad de datos de texto y aprende a predecir la siguiente palabra en una secuencia basada en las palabras que le precedieron. Esto permite a OCI Generative AI generar respuestas similares a las de los humanos a las peticiones de datos de texto, lo que lo convierte en una herramienta increíblemente poderosa para crear un lenguaje que suene natural.

Una de las funciones más impresionantes de OCI Generative AI es su capacidad para comprender temas complejos y proporcionar explicaciones y respuestas detalladas. Hoy en día, todas las organizaciones quieren aprovechar el poder de la IA generativa en sus aplicaciones y crear una oferta innovadora para sus clientes.

En este tutorial, analizaremos y comprenderemos cómo OCI puede ayudar a las organizaciones de todo el mundo a aprovechar el poder de la IA generativa con OCI. En este tutorial, utilizaremos Ruby on Rails (RoR) como nuestro marco de desarrollo y llamaremos a las API de IA generativa de OCI basadas en el lenguaje de programación Ruby.

Objetivos

Requisitos

Tarea 1: Configuración de claves de API de Oracle Cloud Infrastructure

  1. Conéctese al arrendamiento de OCI con la cuenta de servicio o el usuario administrador y vaya a la configuración de usuario.

    Abrir configuración de usuario

    O bien:

    Vaya al usuario desde la consola de OCI IAM. Asegúrese de que el usuario tiene todo el acceso necesario para crear y actualizar la infraestructura en OCI.

  2. Vaya a la sección Recursos del usuario, haga clic en Claves de API y Agregar clave de API. Seleccione esta opción para descargar las nuevas claves públicas y privadas, cargar la clave pública o pegar la clave pública.

    Agregar clave de API

  3. Guarde las claves en una ubicación conveniente y guarde el archivo de configuración como se muestra en la siguiente página. Necesitará este archivo de configuración y esta clave privada al conectarse a su arrendamiento mediante el SDK de Ruby.

    Guardar archivo de configuración

    Nota:

    • OCI soporta el servicio de IA generativa en la región US-CHICAGO-1 a partir de ahora. Por lo tanto, asegúrese de activar y suscribirse a esta región de su arrendamiento.

    • Para llamar a los servicios de OCI desde instancias de OCI Compute, OCI proporciona una forma más segura mediante principales de instancia. Evite utilizar claves de API de usuario como mejores prácticas. Para obtener más información, consulte Llamada a servicios desde una instancia.

Tarea 2: Creación y configuración de una instancia informática de OCI que se utilizará para el desarrollo de RoR

  1. Vaya a Inicio de una instancia de Windows en OCI para crear su instancia informática de Windows en OCI.

  2. Una vez creada la instancia de Windows, conéctese con la contraseña inicial, como se muestra en la siguiente captura de pantalla.

    Instancia informática de Windows

  3. Después de conectarse a la instancia informática de Windows, instale y configure Ruby, Ruby on Rails y cree una nueva aplicación mediante el comando rails.

    rails new GenAIApp
    

    Vaya al directorio de aplicaciones y ejecute el siguiente comando para activar y ejecutar el servidor de aplicaciones de guías. Debe poder acceder a la aplicación Rails por defecto en http://127.0.0.1:3000.

    cd GenAIApp
    rails server -b 0.0.0.0
    
  4. Vaya al directorio raíz de los usuarios, que es c:/users/opc, y cree el archivo config para el SDK de Ruby. Configure el archivo de configuración como lo ha descargado en la tarea 1.3 y coloque también el archivo de clave privada descargado. Para obtener más información, consulte SDK de Oracle Cloud Infrastructure Ruby.

    Nota:

    • Debe restablecer la contraseña de Windows en la primera conexión a la instancia informática de OCI. Recuerde la nueva contraseña, ya que la necesitará para iniciar sesión la próxima vez.

    • Para acceder a la aplicación Rails desde fuera de la red, debe abrir el puerto 3000 y también desactivar el firewall de Windows desde la instancia informática creada.

Tarea 3: Configuración de una aplicación RoR, escritura del código adecuado para llamar y mostrar el servicio OCI Generative AI

  1. Después de que pueda ejecutar su aplicación Rails y acceder a ella localmente y desde la red requerida, nuestro primer paso es configurar las gemas necesarias para la aplicación. Abra Gemfile y actualice su contenido como se muestra en el siguiente fragmento de código.

    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. Ejecute el comando bundle install para instalar todos los paquetes.

    bundle install
    

    La instalación del paquete debe mostrar la salida como se muestra en la siguiente imagen.

    Instalación del paquete

  3. Una vez realizada la instalación del paquete, agregue rutas al archivo routes.rb. Esto proporcionará las API expuestas en la aplicación y la acción se debe realizar cuando se llame.

    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. Tenemos que desarrollar el código para el archivo controller de la aplicación como se muestra a continuación. Este es el código principal que se ejecutará cuando llame a las API de IA generativa de OCI mediante la aplicación.

    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. Actualice el contenido de nuestro archivo de vista. Se utilizará para mostrar la interfaz de usuario y llamar a las llamadas de API Obtener y Publicar en las aplicaciones. El usuario utilizará esta página de interfaz de usuario para interactuar con la aplicación.

    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>
    

    Después de realizar todos estos cambios, debería poder ver la aplicación actualizada y también llamar a OCI Generative AI haciendo preguntas a la petición de datos.

    Interfaz de usuario de la aplicación OCI GenAI RoR

    Nota:

    • Tienes que cuidar todas las gemas y sus versiones, ya que puede haber casos en los que necesites actualizar las versiones en Gemfile de acuerdo a tu configuración.

    • Cuida las redes, para que Ruby pueda conectarse al proveedor de gemas necesario desde tu instancia para descargar las gemas necesarias.

Agradecimientos

Más recursos de aprendizaje

Explore otros laboratorios en docs.oracle.com/learn o acceda a más contenido de aprendizaje gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en Oracle Learning Explorer.

Para obtener documentación sobre el producto, visite Oracle Help Center.