0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ruby-openaiを使ってBTSの心に残る言葉を和訳してみた

Last updated at Posted at 2024-08-07

OpenAIのAPIをRubyで使用してみたかったので、ruby-openaiを使用して翻訳処理を作ってみました。
Ruby単体で実現可能ですが、Webアプリケーションに組み込むことを想定して今回はRuby on Railsで作っていきます。
以下を事前に済ませています。

  • Railsアプリケーションの立ち上げ
  • /lib配下のクラス読み込みを可能にする

作業手順

  1. OpenAIの公式ページからAPIキーを発行する
  2. Gemfileruby-openaiを追加する
  3. /lib配下にクラスを作成する

1. OpenAIの公式ページからAPIキーを発行する

以下よりアカウントを作成した後にAPIキーを確認することができます。現在は無料のクレジットは廃止されているため、利用開始に伴ってクレジットの購入が必要です。
https://platform.openai.com/account/api-keys

↓アカウント作成およびクレジットの購入が完了後、以下の手順よりAPIキーを発行します。
API_keys_-_OpenAI_API_🔊.png

API_keys_-_OpenAI_API_🔊.png

API_keys_-_OpenAI_API_🔊.png

2. Gemfileruby-openaiを追加する

Gemfileに以下を追記して、bundle installを実行してください。

Gemfile
gem "ruby-openai"

3. /lib配下にクラスを作成する

今回は/lib配下を選択していますが、ご自身の運用ルール等に沿ってお好みのフォルダ配下で作成してください。

touch lib/chat_gpt.rb
lib/chat_gpt.rb
class ChatGpt
  API_KEY = Rails.application.credentials.dig(:open_ai, :api_key) # OpenAIのAPIキー
  OPEN_AI_MODEL = "gpt-3.5-turbo" # GPTモデル(LLM)を指定

  def initialize
    @client = OpenAI::Client.new(access_token: API_KEY)
  end

  def translate_ja(text)
    # APIレスポンスを取得
    response = @client.chat(
      parameters: {
        model: OPEN_AI_MODEL,
        messages: [{role: "user", content: create_prompt(text)}]
      }
    )

    # レスポンス内容から返答テキストを抽出して返す
    response["choices"][0]["message"]["content"]
  end

  private

  # 指示するテキストを生成
  def create_prompt(text)
    <<~TEXT
      以下の韓国語を和訳してください。

      #{text}
    TEXT
  end
end

Railsコンソール上でクラスを実行してみます。

quote = "아미들이 보고 싶을 때 언제든 와도 되고. 또 가야 될 때, 혹은 가고 싶을 때, 언제든 떠나도 괜찮아요. 그런데 이것만은 기억해 주세요. 저는 항상 이 자리에 있다는 걸요"
ChatGpt.new.translate_ja(quote)

=> "ARMYが会いたいときはいつでも来てもいいです。また、行かなければならないとき、または行きたいとき、いつでも去っても大丈夫です。しかし、これだけは覚えてください。私はいつもここにいます。"

これで和訳ができました🎉

コードの説明

API_KEY = Rails.application.credentials.dig(:open_ai, :api_key)
OPEN_AI_MODEL = "gpt-3.5-turbo"
API_KEY

OpenAIの管理画面で発行したAPIキーを定義しています。シークレット情報であるため、.envまたはCredentialで管理するようにしましょう。

OPEN_AI_MODEL

使用するGPTモデルを定義しています。今回はgpt-3.5-turbo系を使用していますが、gpt-4系など他のモデルを使用する場合は、以下のモデル一覧のサイトを参考に適宜変更してください。

example
"gpt-4o"
"gpt-4-turbo"
"gpt-3.5-turbo-1106"

def create_prompt(text)
  <<~TEXT
    以下の韓国語を和訳してください。

    #{text}
  TEXT
end

指示するテキストを生成する処理です。基本的にどんな文字列を指定しても差し支えございませんが、ヒアドキュメントを使用して改行を含む文字列が比較的正確な回答を取得できました。

OpenAIレスポンスの中身の説明

個人的に重要な項目を抜粋してそれぞれ解説

{
 "id"=>"chatcmpl-xxxxxxxxxxxxxxxxxxxxxx",
 "object"=>"chat.completion",
 "created"=>1722936388,
 "model"=>"gpt-3.5-turbo-0125",
 "choices"=>
  [{"index"=>0,
    "message"=>{"role"=>"assistant", "content"=>"ARMYが会いたいときはいつでも来てもいいです。また、行かなければならないとき、または行きたいとき、いつでも去っても大丈夫です。しかし、これだけは覚えてください。私はいつもここにいます。"},
    "logprobs"=>nil,
    "finish_reason"=>"stop"}],
 "usage"=>{"prompt_tokens"=>111, "completion_tokens"=>85, "total_tokens"=>196},
 "system_fingerprint"=>nil
 }
  • id
    • リクエストに固有の識別子
  • created
    • レスポンスが生成されたUNIXタイムスタンプ
      • Unixエポック時間が返されるため、以下で日本時間のDateTimeに変換できます
        DateTime.strptime(response["created"], "%s").new_offset(Rational(9, 24))
        
  • model
    • 使用したGPTモデル名
  • choices
    • message
      • content
        • 生成されたテキスト
  • usage
    • prompt_tokens
      • 入力トークン数
    • completion_tokens
      • 出力トークン数
    • total_tokens
      • 合計トークン数

おわりに

個人情報などをプロンプトに含めると情報漏洩等に繋がる可能性が高いため、使い方は気をつける方が良さそうです。
OpenAIの活用により、あなたのアプリケーションにAI機能を簡単に追加することができますので、参考にいただけますと幸いです。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?