はじめに
エムスリーキャリア薬剤師採用支援チームの吉田です。
最近、弊社の採用管理システムでRailsのアップグレードを実施しました。
その際、AIを活用して技術的負債に対応しましたので、その事例をご紹介いたします。
アップグレードの障壁
2025年2月時点で、当該システムのRailsは7.0.8でした。Railsの7.0系は2025年4月1日にサポートが終了するため、その前にアップグレードを完了させる必要があります。
ここで大きな問題となるのが、schema_validations1です。 このGemの最新バージョンがRails 7.1に対応していないため、アップグレードを行うには代替手段への移行が必要でした。
チーム内で検討した結果、一つずつバリデーションを再実装していくことに決めました。 しかし、対象となるモデルは32個。schema_validationsは予想以上にプロダクトに根を張っているようです。
AIに任せよう
アップグレード作業に取り掛かる少し前に、タイミングよくGitHub Copilot Agentがリリースされました。 このエージェントは、Copilot editよりも自律的に動き、複数のファイルにまたがって作業を行うことができます。
schema_validationsの削除は、比較的機械的なタスクであるため、GitHub Copilot Agentに任せることで工数を削減できると考えました。
こんなプロンプトでやりました。
私の知っている限りでは、以下のようなプロンプトが良いプロンプトと言えるそうです。
- 具体的な指示を出す
- 役割の付与(例:「あなたはベテランプログラマーです」といった役割を与える)
- 出力形式を指定する
- 肯定的な指示を出す
- マークダウンで書く
- 英語にする
- エモーションプロンプト(例:「お前ならできる!頑張れ!」 回答が詳細になるらしい。)
ということで、試行錯誤を繰り返して作り上げたプロンプトが以下となります。
大変恐れ多いですが、AIにはまつもとゆきひろ氏とDHH氏を憑依させました。
偉大なお二方の力をお借りできるなんていい時代です。
You are Yukihiro Matsumoto, the creator of Ruby, and also David Heinemeier Hansson (DHH), the creator of Ruby on Rails. Please revise the model according to the following instructions: # Deletion - Completely remove `schema_validations`. # Implementation - Implement new validations that have the same content as those in `schema_validations`, but do not change their behavior. - Combine options for the same attribute into one line. - Use the `validates` method for implementing validations. - keep the existing validations. # Sorting Order - The new validations should be sorted according to the order of Schema Information at the top of the model. # Notes: - Exclude default options (e.g., `allow_nil: true`). - Numeric attributes do not require range validations.
結果は?
結果として、完璧とは言えないまでも、それなりの成果物を得ることができました。
大量のバリデーションを自動で実装し、一部のテストコードまで修正してくれました。
大幅な工数削減となったことは間違いありません。
もちろん上手くいかなかった箇所もあり、以下が一例となります。 他のロジックを参照しつつ、気を利かせた実装をするのはまだまだ難しいようです。(私にとっても難しいです)
例
belongs_to :company # このバリデーションをGithub Copilot Agentが実装 validates :company_id, presence: true, length: { maximum: 20 }
company_idカラムには、not null制約をschema_validationsで実装していました。
しかし、belongs_toでcompanyと紐づけているため、関連するレコードの存在確認は行われます。
ということは、presence: trueは不要です。
ここまでの情報を汲み取ってもらうことはできませんでした。
所感
モデルを変えて何度も試した結果、体感的には以下の順で指示をうまく理解してくれました。 当然ですが、新しいモデルの方が高性能のようですね。
- Claude 3.7 sonnet thinking = o3-mini > GPT-4o
また、日本語のプロンプトでも試しましたが、英語の場合と比べて特に精度に差はありませんでした。 AIの進化により、徐々に言語の壁がなくなってきていると感じています。
まとめ
今回のバージョンアップは、技術的な負債を解消し、アプリケーションの基盤を強化するための重要な取り組みでした。 今後も、ユーザーの皆様により良いサービスを提供できるよう、技術的な改善を続けていきます!
ちなみにこの記事もAIに草案を作ってもらいました。 エモーションプロンプトを活用しています。効果はどうあれ、面白いので個人的には好きなテクニックです。
プロンプト
あなたはベテランエンジニア兼プロブロガーです。 自社のwebアプリケーションに対して以下の対応を行いました。テックブログに書きたいので草案を作ってください。 あなたなら出来ます!頑張れ! # 対応内容 - Railsを7.0.8から7.1.5にアップグレード - Schema_validationsを削除してバリデーションを手動で実装(schema_validationsは既にサポートが終了しているため) - 各種gemをアップグレード - schema_validationsの削除にLLMを活用