システムリリース前のrequirements.txtのバージョン指定について
開発において必ず直面するであろう「requirements.txt」の扱い。特に、システムをリリースする前にパッケージのバージョンをどのように指定するかについて、以下に備忘録として整理します。
開発初期:バージョン指定なしで進める
開発初期段階では、最新バージョンを使用するのが一般的?です。そのため、requirements.txt
にはバージョン指定をしない形で記載します。私が今回経験した小規模な開発(開発メンバー二人のRAGシステム)の場合だと、以下のように記述して進めました。(大規模な開発な場合はどうするか知らないので教えて下さい)
fastapi
uvicorn
この段階では、開発環境で以下のコマンドを使って必要なパッケージをインストールします。
pip install -r requirements.txt
その後、一連の動作確認を行います。開発が進むにつれてここにはどんどん追記していきます。バージョンしてはしない。
リリース準備段階:バージョン固定
リリース段階に入ると、バージョンの自動更新によるバグ発生を避けるために、パッケージのバージョン固定が必要になります。
- まず、既存の
requirements.txt
にバージョン指定が含まれている場合は、一度バージョン指定を取り除きます。他の開発メンバーが以下のように追加したと仮定しましょう。
変更前
langchain-core==0.3.11 ←これと
langchain-openai==0.1.12 ←これが最新版ではないとする
変更後
langchain-core
langchain-openai
- その上で、再度以下のコマンドを実行し、動作確認を行います。バージョン指定をしないでpip install -r requirements.txtをすると最新バージョンがインストールされるため。
pip install -r requirements.txt
- 動作確認で問題がなければ、以下のコマンドを使用して、バージョンを固定した
requirements.txt
を生成します。(pip freezeは現在使用しているバージョンを出力するコマンド。ここではrequirements.txtに書き加える処理を加えている。)
pip freeze > requirements.txt
※確認だけしたい場合は、pip freeze
コマンドのみを実行して出力結果を確認するのが良いです。
この手順により、最新版での動作確認とバージョン固定を完了させることができます。
例:上記手順に従うと0.3.11→0.3.22の最新版に切り替わります
langchain-core==0.3.22 ←両方とも
langchain-openai==0.2.12 ←最新に変わる!
先輩談:バージョン固定は必須か?
以下は、先輩エンジニアとのやり取りを基にした知見です。
私の質問
- お客さんに提供するシステムでは、パッケージのバージョンを指定するのが一般的でしょうか?
- バージョン指定がない場合、最新バージョンがインストールされて急にバグが発生する可能性があるでしょうか?
- 開発初期はバージョンを指定せず、運用に向けて途中から固定するケースもあるのでしょうか?
約10年目の先輩の回答
- 基本的にはバージョンを固定化するのが一般的。
→クラウド環境では勝手にバージョンが上がることがあるため、依存関係によるエラー発生の可能性がある。固定できるところは固定しよう。 - 日本企業では、バージョン固定を運用方針に含めている事もある。
(運用方針で定期的に見直すとか記載しますけど、あんまり弄らない。弄りたくない)
以下、先輩の経験談
携わった案件だとAzureのkubetainesが固定運用でスタートと半年一回のリリース(1年程度でそのバージョンは廃止。画面から消える。その中の変更もできなくなる。アップデートもサポート対象外)なので運用チームが更新に頻度に耐えれないとなったケースもあるので固定が正解ではないと考えてます。
以下、年次の近い別の先輩の経験談
バージョン固定せずにリリースをしてしまい、リリース後に大変なことになりました。。。
結論
・開発初期: 最新バージョンで進め、柔軟性を重視。
・リリース前: pip freezeでバージョンを固定し、安定性を確保。
・運用: 脆弱性チェックを定期的に実施しつつ、必要最低限の変更で対応。