経緯
会社の研修で Rails Tutorial をやっているのですが、余った時間でサンプルアプリこと Microblog service を拡張して遊んで勉強していました
個人的にダミーデータを生成できる Faker がツボだったので、これを拡張し、さらに Chat GPT の恩恵を受けることによって、サンプルアプリを忍者系 SNS に拡張しました
完成したもの
特徴としては
- Faker による NARUTO のキャラクターの名前・セリフの搭載
- Open AI API による投稿の自動変換機能(NARUTOっぽいセリフに変換してくれます)
- アイコンを忍者にする(いらすとや)
の3点です
1の過程で Faker を拡張したので、拡張後の gem を以下に置いておきます
変更点としてはNARUTOっぽいセリフを生成できるように quote method を naruto.rb に追加したところです
元となるセリフは Chat GPT に以下のプロンプトで NARUTO っぽいセリフを考えてもらうことで数を増やしました
UI としてペパボの ai-assistant を活用させてもらっています
投稿の自動変換の部分については ruby-openai gem を使って以下のように実装しています
def create
prompt = "あなたはNARUTOが大好きなオタクです。以下の文章をNARUTOのセリフ風に変換してください。文章:#{micropost_params["content"]}"
client = OpenAI::Client.new(access_token: ENV['OPENAI_API_KEY'])
response = client.chat(
parameters: {
model: "gpt-3.5-turbo",
messages: [{ role: "user", content: prompt}],
temperature: 0.7,
}
)
revised_content = response.dig("choices", 0, "message", "content")
revised_content = revised_content.delete('「」”')
@micropost = current_user.microposts.build(content: revised_content[0..139])
@micropost.image.attach(params[:micropost][:image])
これによって一見当たり障りのない投稿が NARUTO っぽいセリフに変換されて投稿されます
アイコンの変更部分については users_helper.rb
の gravatar method を以下で置き換えることで実現しました
def ninja_icon(user, size: 80)
icon_no = (user.id % 8) + 1
image_tag(image_path("ninja/ninja#{icon_no}.png"), alt: user.name, size: "#{size}x#{size}", class: "gravatar")
end
いらすとやの忍者のイラストが8体あったので、ユーザーIDに合わせてバリエーションをつけるようにしています
あとがき
二週間の Ruby Tutorial 研修の集大成がこれってどうなの?という気もしますが、かなり楽しめたので OK かなと思っています
(matzさんも ruby はプログラミングを楽しむための言語だと言っている……ボソッ)
またNARUTOっぽいセリフへの変換の部分はプロンプトを改良すればもっとクオリティが上がりそうです
それではよき Ruby Life を!!
2023/06/07追記
なんとRails チュートリアル本家の @yasulab さんに取り上げていただきました
チュートリアル本体にも組み込んでいただいて嬉しいです!
@khiroyuki1993 さんが公開してくれたSample Appの忍者系 SNS 拡張、とても面白い実装例だなと思ったので #Railsチュートリアル 完走者向け「読み物ガイド」の拡張例として紹介してみました! 🆕
— 安川要平/Yohei Yasukawa (@yasulab) June 6, 2023
他の学習者にとっても AI 機能を実装するキッカケになれば嬉しいです...!!🎓✨https://t.co/u2iPBtWLCm pic.twitter.com/cpOnmagj66