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

コード不要でOpenAIを試すことができるPlaygroundを触ってみたコード不要でOpenAIを試すことができるPlaygroundを触ってみたので紹介しています。どのようなオプションがあるか、どのような出力結果になるかを手軽に試すことができるので、実際にコードを書く前の確認に良さそうです。...
この記事の内容
ruby-openaiとは
ruby-openaiは、Rubyプログラミング言語向けのOpenAI APIライブラリです。
ruby-openaiを使用することで、OpenAIの機械学習モデルを利用してテキスト生成、文章の要約、文章の翻訳、文章の感情分析などのタスクを実行することができます。例えば、GPT-3モデルを使用して文章の生成を行ったり、DavinciやCurieといったモデルを利用して高度な自然言語処理タスクを実行したりすることが可能です。
チャット機能の作成手順
ここからはサンプルアプリの作成を通してruby-openaiを試していきます。
完成形
新規アプリケーションの作成
% 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
ルートページの作成
% 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】配列・ハッシュから安全に値を取り出すことができるdigメソッドについて配列とハッシュから安全に値を取り出すことができるdigメソッドについて紹介しています。配列では「Arrayオブジェクト[index]」のように、ハッシュからは「ハッシュオブジェクト[キー]」のようにも値を取得することができますが、digメソッドで取得する際の違いはあるのでしょうか。...
OpenAI APIキーの設定
% EDITOR=vi rails credentials:edit --environment development
openai:
api_key: <OpenAI APIキー>

【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 %>
動作確認
どの程度表示に時間がかかるのか検証するため、ベンチマークを取得し、解答ページに表示してみます。
# 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秒強の時間がかかることが分かりました。
参考
今回はChatGPT APIライブラリである「ruby-openai」をサンプルアプリの作成を通して紹介しました。「ruby-openai」を使用することでAIベースの対話機能を持つアプリケーションを迅速かつ簡単に構築することができるため、このライブラリを活用して、より魅力的なアプリケーションを開発してみてください。