Rails

【Rails】ChatGPT APIライブラリの「ruby-openai」をサンプルアプリを作成しながら試してみる

Rails

 

今回はChatGPT APIライブラリである「ruby-openai」をサンプルアプリの作成を通して触ってみたので紹介したいと思います。このライブラリを使用することで、ChatGPTのような対話機能を持つアプリケーションを迅速かつ簡単に構築することができます。

OpenAI Logo
コード不要でOpenAIを試すことができるPlaygroundを触ってみたコード不要でOpenAIを試すことができるPlaygroundを触ってみたので紹介しています。どのようなオプションがあるか、どのような出力結果になるかを手軽に試すことができるので、実際にコードを書く前の確認に良さそうです。...

ruby-openaiとは

ruby-openaiは、Rubyプログラミング言語向けのOpenAI APIライブラリです。

ruby-openaiを使用することで、OpenAIの機械学習モデルを利用してテキスト生成、文章の要約、文章の翻訳、文章の感情分析などのタスクを実行することができます。例えば、GPT-3モデルを使用して文章の生成を行ったり、DavinciやCurieといったモデルを利用して高度な自然言語処理タスクを実行したりすることが可能です。

参考: Github ruby-openai

チャット機能の作成手順

ここからはサンプルアプリの作成を通してruby-openaiを試していきます。

OpenAIを使用するには、OpenAIのAPIキーが必要になります。未取得の場合はこちらから新規登録と取得を行ってください。

完成形

Image from Gyazo

新規アプリケーションの作成

% rails new chatgpt-demo -d mysql
% cd chatgpt-demo
% rails db:create
  • Ruby: 3.2.2
  • Rails: 7.0.4
  • DB: MySQL

Gemの追加

# Gemfile

gem "ruby-openai"
% bundle install

chatsコントローラの作成

% rails g controller chats
# app/controllers/chats_controller.rb

class ChatsController < ApplicationController
  def index; end
end

ルーティングの設定

# config/routes.rb

Rails.application.routes.draw do
  root to: 'chats#index'
  get 'search', to: 'chats#search'
end
searchメソッドはこの後定義します。

ルートページの作成

% touch app/views/chats/index.html.erb
# app/views/chats/index.html.erb

<h3>質問を入力してください</h3>
<%= form_with(url: search_path, method: :get) do |form| %>
  <%= form.text_field :text, size: 75 %>
  <%= form.submit "回答" %>
<% end %>

searchアクションの定義

# app/controllers/chats_controller.rb

class ChatsController < ApplicationController
  before_action :set_token, only: :search

  def index; end
  
  def search
    @client = OpenAI::Client.new(access_token: @api_key)
    response = @client.chat(
      parameters: {
          model: "gpt-3.5-turbo",
          messages: [{ role: "user", content: @query }],
      })

    @chats = response.dig("choices", 0, "message", "content")
  end

  private

  def text_params
    @query = params[:text]
  end

  def set_token
    @api_key = Rails.application.credentials.dig(:openai, :api_key)
  end
end

responseは以下のようなハッシュ構造になっているため、digメソッドを使用して回答のみ取得しています。

{"id"=>"chatcmpl-7ctNbFscpFdtLgubBUP0ii4ju6wjj",
 "object"=>"chat.completion",
 "created"=>1689503699,
 "model"=>"gpt-3.5-turbo-0613",
 "choices"=>[{"index"=>0, "message"=>{"role"=>"assistant", "content"=>"平成3年は西暦1991年です。"}, "finish_reason"=>"stop"}],
 "usage"=>{"prompt_tokens"=>20, "completion_tokens"=>13, "total_tokens"=>33}}
Rails
【Rails】配列・ハッシュから安全に値を取り出すことができるdigメソッドについて配列とハッシュから安全に値を取り出すことができるdigメソッドについて紹介しています。配列では「Arrayオブジェクト[index]」のように、ハッシュからは「ハッシュオブジェクト[キー]」のようにも値を取得することができますが、digメソッドで取得する際の違いはあるのでしょうか。...

OpenAI APIキーの設定

% EDITOR=vi rails credentials:edit --environment development
openai:
  api_key: <OpenAI APIキー>
今回はdevelopment環境にのみキーを設定しています。
Rails
【Rails】秘匿情報を環境毎に管理することができるMulti Environment Credentialsについて初心者向けにまとめてみた今回は秘匿情報を環境毎に管理することができるMulti Environment Credentialsについて簡単にまとめたので紹介しています。付与されている権限によって閲覧できる情報を管理することができるため、権限の異なる複数人で開発する際にはもってこいの機能になります。...

回答結果の表示

% touch app/views/chats/search.html.erb
# app/views/chats/search.html.erb

<h3>回答</h3>
<p><%= @chats %></p>
<%= link_to '入力ページに戻る', root_path %>

動作確認

Image from Gyazo

どの程度表示に時間がかかるのか検証するため、ベンチマークを取得し、解答ページに表示してみます。

# app/controllers/chats_controller.rb

class ChatsController < ApplicationController
  before_action :set_token, only: :search

  def index; end

  def search
    result = Benchmark.measure do
      @client = OpenAI::Client.new(access_token: @api_key)
      response = @client.chat(
        parameters: {
          model: 'gpt-3.5-turbo',
          messages: [{ role: 'user', content: params[:text] }]
        }
      )

      @chats = response.dig('choices', 0, 'message', 'content')
    end

    @result = result.real
  end

  private

  def set_token
    @api_key = Rails.application.credentials.dig(:openai, :api_key)
  end
end
# app/views/chats/index.html.erb

<h3>回答</h3>
<p><%= @chats %></p>
<p>実行時間: <%= @result %> 秒</p>
<%= link_to '入力ページに戻る', root_path %>

 

手元では1秒強の時間がかかることが分かりました。

Image from Gyazo

参考

 

今回はChatGPT APIライブラリである「ruby-openai」をサンプルアプリの作成を通して紹介しました。「ruby-openai」を使用することでAIベースの対話機能を持つアプリケーションを迅速かつ簡単に構築することができるため、このライブラリを活用して、より魅力的なアプリケーションを開発してみてください。