🗿

入力した値からchatGPTの返信が返ってくるアプリの作成

2023/03/11に公開

背景

今話題のChatGPT APIライブラリがrubyにあり、どのような感じで使用することができるのか気になったので、入力フォームに入力した内容からChatGPTの返信が返ってくる簡単なアプリを作成してみました。

これからrubyの ChatGPTAPI ライブラリを用いたアプリを作成することを検討している方の参考になれば幸いです。

完成動画

参考

chatGPT ruby ライブラリ
https://github.com/alexrudall/ruby-openai

digメソッド
https://techtechmedia.com/dig/

コード

app/controllers/application_controller.rb (APIキーを変数へ)

class ApplicationController < ActionController::Base
require "openai"
require 'dotenv'
Dotenv.load

  before_action :set_common_variable

  private

  # APIキーを設定
  def set_common_variable
    @client = OpenAI::Client.new(access_token: ENV["CHATGPT_API_KEY"])
  end
end

app/controllers/chats_controller.rb (入力した値に対してchatGPTの返信を返す)

class ChatsController < ApplicationController

  def index
  end

  # 入力したテキストに対して返答
  def search
    @query = params[:query]

    response = @client.chat(
      parameters: {
          model: "gpt-3.5-turbo",
          messages: [{ role: "user", content: @query }],
      })

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

app/views/chats/index.html.erb (トップページ)

<div class="top">
  <h3>ChatGPTに聞きたいことを入力してください。</h3>
  <%= render 'shared/form' %>
</div>

app/views/shared/_form.html.erb (入力フォーム)

<%= form_with(url: search_path, method: :get) do |form| %>
  <%= form.text_field :query, size: 50 %>
  <%= form.submit "検索" %>
<% end %>

app/views/chats/search.html.erb (ChatGPTの検索結果表示ページ)

<div class="top">
  <h3>ChatGPTからの返信結果</h3>
  <br>
  <%= @chats %>
  <br>
  <h3>さらにChatGPTに聞いてみましょう。</h3>
  <%= render 'shared/form' %>
  <br>
  <%= link_to 'TOPページ', root_path %>
</div>

config/routes.rb(ルーティング)

Rails.application.routes.draw do
  root to: 'chats#index'
  resources :chats
  get 'search', to: 'chats#search'
end

コードの解説

今回注目していただきたいのは、chats_controller.rbの下記の部分です。

# 入力したテキストに対して返答
  def search
    @query = params[:query]

    response = @client.chat(
      parameters: {
          model: "gpt-3.5-turbo",
          messages: [{ role: "user", content: @query }],
      })

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

入力フォームの値をparamsで受け取り、その値を@queryとして変数にし、content:の中に設定することで、入力した値によるresponse を取得できるようにしました。

また、responseの中身を確認すると、下記のようなhashと配列の構成になっていました。

[1] pry(#<ChatsController>)> response
=> {"id"=>"chatcmpl-vnajksdnkjandkjankdamkmvlakmlka",
 "object"=>"chat.completion",
 "created"=>1278324515,
 "model"=>"gpt-3.5-turbo-0301",
 "usage"=>{"prompt_tokens"=>19, "completion_tokens"=>201, "total_tokens"=>193},
 "choices"=>
  [{"message"=>
     {"role"=>"assistant",
      "content"=>
       "\n\n大谷翔平は、日本のプロ野球選手で、現在はロサンゼルス・エンゼルスに所属しています。ポジションは投手兼打者で、世界的にも珍しい「二刀流」として注目を集めています。2018年には、アメリカメジャーリーグベースボール(MLB)で史上初となる20本塁打以上を記録する投手になるなど、圧倒的な実力で活躍しています。また、社会貢献活動にも熱心に取り組み、幅広い年代から支持されています。"},
    "finish_reason"=>"stop",
    "index"=>0}]}

今回取得したい値は、choicesというkey→配列→messageというkey→contentというkeyの中のvalueです。

ドキュメントでdigメソッドを使用していましたが、digメソッドを使用しなくても、response["choices"][0]["message"]["content"] でcontentのvalueを取得することもできるのではないかと思いましたが、digメソッドは取得したいデータがなくても nil を返してくれるので、エラーを回避することができます。

なので、エラー回避のためにここではdigメソッドを使用することでresposneのcontentを取得したと考えられます。

まとめ

今回初めてruby のchatGPT APIライブラリを使用した簡単なアプリを作成してみました。

また調べてみると、chatGPTには音声認識APIの「Whisper」というライブラリがあったので、今後は音声ファイルからテキストへ文字起こしすることができるアプリをrailsで作成できたらいいなと思いました。

Discussion