Hinweis:

Programmgesteuerter Zugriff auf OCI Generative AI Service mit Ruby on Rails-Webanwendung

Einführung

Oracle Cloud Infrastructure Generative AI (OCI Generative AI) ist ein revolutionäres neues Tool für künstliche Intelligenz, das die Art und Weise, wie wir mit Technologie interagieren, verändern kann. Es ist ein großes Sprachmodell, das auf einer großen Menge an Textdaten trainiert wird und lernt, das nächste Wort in einer Sequenz basierend auf den Wörtern vorherzusagen, die vor ihm kamen. Dies ermöglicht es OCI Generative AI, menschenähnliche Antworten auf Texteingabeaufforderungen zu generieren, was es zu einem unglaublich leistungsstarken Tool für die Erstellung einer natürlich klingenden Sprache macht.

Eine der beeindruckendsten Funktionen von OCI Generative AI ist die Fähigkeit, komplexe Themen zu verstehen und ausführliche Erklärungen und Antworten bereitzustellen. Heutzutage möchte jedes Unternehmen die Leistungsfähigkeit generativer KI in seinen Anwendungen nutzen und ein innovatives Angebot für seine Kunden erstellen.

In diesem Tutorial werden wir besprechen und verstehen, wie OCI Unternehmen auf der ganzen Welt helfen kann, die Leistungsfähigkeit generativer KI mit OCI zu nutzen. In diesem Tutorial verwenden wir Ruby on Rails (RoR) als Entwicklungs-Framework und rufen OCI Generative AI-APIs auf, die auf der Ruby-Programmiersprache basieren.

Ziele

Voraussetzungen

Aufgabe 1: Oracle Cloud Infrastructure-API-Schlüssel einrichten

  1. Melden Sie sich beim OCI-Mandanten mit dem Serviceaccount oder dem Admin-Benutzer an, und gehen Sie zu den Benutzereinstellungen.

    Benutzereinstellungen öffnen

    Oder

    Gehen Sie über die OCI-IAM-Konsole zum Benutzer. Stellen Sie sicher, dass der Benutzer über den erforderlichen Zugriff zum Erstellen und Aktualisieren der Infrastruktur auf OCI verfügt.

  2. Gehen Sie zum Abschnitt Ressourcen für den Benutzer, und klicken Sie auf API-Schlüssel und API-Schlüssel hinzufügen. Wählen Sie diese Option aus, um den neuen Public Key und den neuen Private Key herunterzuladen, den Public Key hochzuladen oder den Public Key einzufügen.

    API-Schlüssel hinzufügen

  3. Speichern Sie die Schlüssel an einem geeigneten Speicherort, und speichern Sie die Konfigurationsdatei wie auf der folgenden Seite gezeigt. Sie benötigen diese Konfigurationsdatei und diesen Private Key, wenn Sie mit dem Ruby-SDK eine Verbindung zu Ihrem Mandanten herstellen.

    Konfigurationsdatei speichern

    Hinweis:

    • OCI unterstützt ab sofort den generativen KI-Service in der Region US-CHICAGO-1. Stellen Sie daher sicher, dass Sie diese Region in Ihrem Mandanten aktivieren und abonnieren.

    • Um OCI-Services von OCI Compute-Instanzen aufzurufen, bietet OCI eine sicherere Möglichkeit, Instanz-Principals zu verwenden. Verwenden Sie keine Benutzer-API-Schlüssel als Best Practices. Weitere Informationen finden Sie unter Services aus einer Instanz aufrufen.

Aufgabe 2: OCI Compute-Instanz für die RoR-Entwicklung erstellen und konfigurieren

  1. Gehen Sie zu Windows-Instanz auf OCI starten, um Ihre Windows-Compute-Instanz auf OCI zu erstellen.

  2. Nachdem die Windows-Instanz erstellt wurde, melden Sie sich mit Ihrem anfänglichen Kennwort an, wie im folgenden Screenshot gezeigt.

    Windows-Compute-Instanz

  3. Nachdem Sie sich bei Ihrer Windows-Compute-Instanz angemeldet haben, installieren und konfigurieren Sie Ruby, Ruby on Rails, und erstellen Sie eine neue Anwendung mit dem Schienenbefehl.

    rails new GenAIApp
    

    Gehen Sie zu Ihrem App-Verzeichnis, und führen Sie den folgenden Befehl aus, um den Schienen-App-Server hochzufahren und auszuführen. Sie sollten auf Ihre Standard-Rails-App unter http://127.0.0.1:3000 zugreifen können.

    cd GenAIApp
    rails server -b 0.0.0.0
    
  4. Gehen Sie zum Home-Verzeichnis der Benutzer (c:/users/opc), und erstellen Sie die Datei config für das Ruby-SDK. Konfigurieren Sie die Konfigurationsdatei wie in Aufgabe 1.3 heruntergeladen, und speichern Sie die heruntergeladene Private-Key-Datei. Weitere Informationen finden Sie unter Oracle Cloud Infrastructure-Ruby-SDK.

    Hinweis:

    • Sie müssen das Windows-Kennwort bei der ersten Anmeldung bei der OCI-Compute-Instanz zurücksetzen. Merken Sie sich das neue Passwort, da Sie dieses benötigen, um sich beim nächsten Mal anzumelden.

    • Um von außerhalb des Netzwerks auf Ihre Rails-App zuzugreifen, müssen Sie Port 3000 öffnen und außerdem die Windows-Firewall von der erstellten Compute-Instanz ausschalten.

Aufgabe 3: RoR-Anwendung einrichten, entsprechenden Code zum Aufrufen und Anzeigen des OCI Generative AI-Service schreiben

  1. Nachdem Sie Ihre Rails-App ausführen und lokal und über das erforderliche Netzwerk darauf zugreifen können, ist es unser erster Schritt, die erforderlichen Edelsteine für die Anwendung einzurichten. Öffnen Sie die Gemfile, und aktualisieren Sie den Inhalt wie im folgenden Code-Snippet dargestellt.

    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. Führen Sie den Befehl bundle install aus, um alle Packages zu installieren.

    bundle install
    

    Die Bundle-Installation sollte die Ausgabe wie in der folgenden Abbildung dargestellt anzeigen.

    Bundle-Installation

  3. Nachdem die Bundle-Installation abgeschlossen ist, fügen Sie der Datei routes.rb Routen hinzu. Dadurch werden die in Ihrer Anwendung angegebenen APIs bereitgestellt, und beim Aufruf müssen Aktionen ausgeführt werden.

    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. Wir müssen den Code für die App controller-Datei wie unten gezeigt entwickeln. Dies ist der Hauptcode, der ausgeführt wird, wenn Sie die OCI Generative AI-APIs mit der App aufrufen.

    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. Aktualisieren Sie den Inhalt für unsere Ansichtsdatei. Dadurch wird die UI angezeigt und die API-Aufrufe Abrufen und Posten für Ihre Anwendungen aufgerufen. Diese UI-Seite wird vom Benutzer für die Interaktion mit Ihrer App verwendet.

    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>
    

    Nachdem Sie alle diese Änderungen vorgenommen haben, sollten Sie die aktualisierte Anwendung anzeigen können und außerdem OCI Generative AI aufrufen können, indem Sie dem Prompt Fragen stellen.

    OCI GenAI RoR Anwendungs-UI

    Hinweis:

    • Sie müssen sich um alle Edelsteine und deren Versionen kümmern, da es Fälle geben kann, in denen Sie die Versionen in Gemfile entsprechend Ihrer Konfiguration aktualisieren müssen.

    • Achten Sie auf das Networking, damit Ruby von Ihrer Instanz eine Verbindung zum erforderlichen Edelsteinprovider herstellen kann, um die erforderlichen Edelsteine herunterzuladen.

Danksagungen

Weitere Lernressourcen

Lernen Sie andere Übungen auf docs.oracle.com/learn kennen, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube Channel zu. Außerdem können Sie education.oracle.com/learning-explorer besuchen, um Oracle Learning Explorer zu werden.

Die Produktdokumentation finden Sie im Oracle Help Center.