2024.02.26

Ruby on RailsでOpenAIのAPIを利用してみる

Ruby on Rails

はじめに

TOGATTA株式会社の東です。
今回が初めてのブログ投稿となります。

当社は札幌でWebシステムの開発をしており、その中でもRuby on Railsを使った開発も多くなってきております。

アイデア出しやプログラミングの補助など、今では当たり前に使われるようになったChatGPTは、アイデア次第で様々な使い道が考えられます。そのため、ChatGPTの機能をWebアプリに組み込んだり、チャットボットを作成したりといった様々な活用方法が可能です。今回は、その第一歩として、基本的なRailsでのOpenAI APIの呼び出しの実装に挑戦します。

OpenAIのAPI Keyを取得する

OpenAIのAPI keysのページからAPI Keyを作成して使用する。

https://platform.openai.com/api-keys

少し詰まったポイントとしては料金の支払い設定をする前にAPIキーを作成してしまった場合

以下のようなエラーメッセージがでてきてしまいました。

You exceeded your current quota, please check your plan and billing details

APIキーを作成→上記エラー発生→支払い設定

だとエラーになり続けるので、設定後に再度APIキーを作り直す必要がありました。

実装方法について

Endpointを直接叩いて実行することも可能であるが

https://platform.openai.com/docs/api-reference/chat/create

RubyでOpenAI APIを使うためのruby-openaiと言うgemがあり、それを使うのが割と良さそうなので今回はそちらを使用していきます。

gem "ruby-openai"

基本的な使用の仕方は以下のような形となる

client = OpenAI::Client.new(access_token: "アクセスキー")
response = client.chat(
    parameters: {
        model: "gpt-3.5-turbo", # 使用するモデル
        messages: [{ role: "user", content: "Hello!"}], # メッセージ
        temperature: 0.7, # 回答のランダム性
    })
puts response.dig("choices", 0, "message", "content")
  • model

使用するモデルによって回答の精度やコストが変わる。

GPT3.5よりもGPT4の方が当然回答は良くなるがコストがあがるので使用用途やテストでの回答の精度を比較してどちらを選ぶか検討する。

料金の計算方法は入力、出力で1000トークンあたりでの利用料金となるが、GPT3.5と比較するとGPT4ではおおよそ10倍~20倍ぐらい高くなる。

詳細な料金については以下の公式から

https://openai.com/pricing

  • messages

基礎的な部分で使用するであろうと思うroleは以下の3つ

system:役割、設定、前提などの入力に使用

user:ユーザの入力

assistant:AIからの出力

単純に使用したい場合にはroleをuserにしてcontentを設定して使えば良いです。

最初のサンプル実装はそれになっています。

systemに関してはAIからの返答方法に対して何かしらの前提を加えたい場合などにroleをsystemとして情報を与えてあげるなどします。(例えばよくあるのは、あなたは~の専門家です。とか)

response = client.chat(
    parameters: {
        model: "gpt-3.5-turbo",
        messages: [
						{ role: "system", content: "関西弁で返答してください"},
						{ role: "user", content: "こんにちは!"}
				],
        temperature: 0.7,
    })

assistantに関しては例えば2回目以降にそれまでに得られた結果をmessagesに履歴として入れていくと会話を踏まえたうえでの返信が得ることができます。 (もちろん前提としてuser、assistantを使うこともできるかと思います)


response = client.chat(
    parameters: {
        model: "gpt-3.5-turbo",
        messages: [
						{ role: "system", content: "関西弁で返答してください"},
						{ role: "user", content: "こんにちは!"},
						{ role: "assistant", content: "おおきに、こんにちは!なんやてえ、お呼びやす。なんかようか?"},
						{ role: "user", content: "関西の方ですか?"}
				],
        temperature: 0.7,
    })
  • temperature

0~2の範囲で設定できる。値が低いほど回答のランダム性が減る。

特定の用途に使いたい場合などは0に近づけて、会話などのランダム性を楽しみたい場合には2に近づけていくのが良さそう。

  • max_tokens

サンプルには記載していないパラメータであるが、返答の最大トークン数を設定できる。

無駄に長い返答がきたりすることもあるので料金面などを気にする場合はきちんと設定してあげた方が良いでしょう。

他にも色々とパラメータはあるようだが基本的な使い方を学ぶだけなので今回は使用しない。

詳細については公式documentを参照

https://platform.openai.com/docs/api-reference/chat/create

  • レスポンスサンプル

{
  "id": "chatcmpl-123",
  "object": "chat.completion",
  "created": 1677652288,
  "model": "gpt-3.5-turbo-0613",
  "system_fingerprint": "fp_44709d6fcb",
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "\\n\\nHello there, how may I assist you today?",
    },
    "logprobs": null,
    "finish_reason": "stop"
  }],
  "usage": {
    "prompt_tokens": 9,
    "completion_tokens": 12,
    "total_tokens": 21
  }
}

メッセージはchoicesの中のmessageの中のcontetに入っているのでそれを取りだして使用します。

実装サンプル

RailsにてInputで入力を受け付けて返ってきた値を画面に表示してみました

(systemに関西弁を入れたもの)

レスポンス


{
 "id"=>"chatcmpl-8s6788xPUbK0xa7sXQhW09YPG1cHm", 
 "object"=>"chat.completion", 
 "created"=>1707903906, 
 "model"=>"gpt-3.5-turbo-0613", 
 "choices"=>[{
		"index"=>0, 
		"message"=>{
				"role"=>"assistant", 
				"content"=>"おおきに、元気やで!お前さんはどうや?"
		}, 
		"logprobs"=>nil, 
		"finish_reason"=>"stop"
	}], 
	"usage"=>{
			"prompt_tokens"=>29, 
			"completion_tokens"=>18, 
			"total_tokens"=>47
	}, 
	"system_fingerprint"=>nil
}

画面だけだとわかりづらいですがきちんとAIから返信がくることを確認しました。

さいごに

今の状態ではWebアプリ内でChatGPTが利用できるだけですが メッセージで前提をつけることで特徴を持たせたり、EmbeddingsやFine-tuningを利用して独自のChatBOTの作成などもできたりと、より効果的な使い方や機能を探りながら、アプリやサービスにおいての活用方法を見つけて面白いものが作れたらと思います。

最後までご覧いただき、ありがとうございました!

戻る