⚙️

テンプレートファイルとモデル指定機能の実装とテスト(開発日記 No.093)

に公開

関連リンク

はじめに

昨日は、ドキュメントと実装の間に生じていた差異を解消するため、CLI引数や環境変数名、デフォルトモデルの修正に取り組みました。今日はその続きとして、残っていた高優先度の機能実装と、テストカバレッジの向上を目指しました。具体的には、テンプレートファイル機能とモデル指定機能の実装、そしてそれらのテスト追加が今日の主なテーマです。

背景と目的

開発中のCLIツールは、ユーザーが指定した入力(ファイルや標準入力)をLLMに渡し、変換結果を得るものです。このツールをより柔軟に、そしてユーザーの多様なニーズに応えられるようにするためには、以下の機能が不可欠でした。

  1. テンプレートファイル機能 (--template): ユーザーが独自のテンプレートファイルを用意し、プロンプトの一部として利用できるようにする。これにより、定型的な指示やフォーマットを簡単に再利用できます。
  2. モデル指定機能 (--model): 使用するLLMモデルをユーザーが明示的に指定できるようにする。これにより、特定のモデルの特性を活かしたり、コストや性能に応じてモデルを切り替えたりすることが可能になります。

これらの機能はドキュメントには記載されていたものの、まだ実装が追いついていない状態でした。ドキュメントと実装の整合性を完全に取るためにも、これらの機能を早期に実装する必要がありました。また、機能追加と並行してテストを拡充し、コードの品質と信頼性を高めることも重要な目的です。

検討内容

テンプレートファイル機能については、CLIオプションでファイルパスを受け取り、そのファイルの内容を読み込んでプロンプト内の特定のプレースホルダ(例えば {{template}})に展開する、という基本的な流れを考えました。

モデル指定機能については、CLIオプションでモデル名を受け取り、それをLLMプロバイダー(GeminiやOpenRouterなど)に渡す方法を検討しました。各プロバイダーのAPI呼び出し時に、受け取ったモデル名をパラメータとして設定できるように修正が必要です。

これらの機能追加が既存の機能に影響を与えないよう、変更範囲を最小限に抑えつつ、単体テストをしっかりと記述して動作を確認する方針で進めることにしました。

実装内容

LLMとの対話を通じて、以下のステップで実装を進めました。

まず、テンプレートファイル機能の実装から着手しました。

  1. CLIオプションの追加: cli.py--template オプションを追加しました。
  2. コンバーターロジックの実装: converter.py に、指定されたテンプレートファイルを読み込み、プロンプト内の {{template}} プレースホルダをファイル内容で置換するロジックを追加しました。
  3. テスト用ファイルの作成: テストのために、ダミーのテンプレートファイル (tests/fixtures/templates/test_template.md) とプロンプトファイル (tests/fixtures/prompts/test_prompt.txt) を作成しました。
  4. テストケースの追加: test_converter.py に、テンプレート機能が正しく動作することを確認するテストケースを追加しました。
  5. テスト実行: 追加したテストを実行し、すべてパスすることを確認しました。

次に、モデル指定機能の実装に取り組みました。

  1. CLIオプションの追加: cli.py--model オプションをパースし、LLM呼び出し時に渡すための llm_options ディクショナリに追加しました。
  2. プロバイダーの更新: gemini.pyopenrouter.py の両方で、LLM呼び出し時に model パラメータを受け取り、APIリクエストに含めるように修正しました。
  3. テストケースの追加: test_converter.py に、モデル指定機能が正しく動作することを確認するテストケースを追加しました。
  4. テスト実行: 追加したテストを実行し、すべてパスすることを確認しました。

最後に、これらの変更をコミットし、リモートリポジトリにプッシュしました。

git add .
git commit -m "feat: Add support for --model option and template file"
git push origin main # または適切なブランチ

また、関連するGitHub Issue #8 を作成し、今回の作業内容を記録しました。

技術的なポイント

今回の実装における技術的なポイントは以下の通りです。

  • テンプレートのプレースホルダ置換: シンプルな文字列置換によって、テンプレートファイルの内容をプロンプトに組み込みました。より複雑なテンプレート構造が必要になった場合は、Jinja2のようなテンプレートエンジン導入も検討できますが、今回は必要十分な機能としてシンプルな実装を選択しました。
  • 動的なモデル指定: CLIで受け取ったモデル名を、LLMプロバイダーのクラスや関数にパラメータとして渡すことで、実行時に使用するモデルを切り替えられるようにしました。これにより、ユーザーは設定ファイルなどを変更することなく、コマンドライン引数一つでモデルを選択できます。
  • テストカバレッジの向上: 新機能ごとにテストケースを追加することで、converter.py のテストカバレッジを70%まで向上させることができました。これにより、これらの機能が意図通りに動作することを自動的に検証できるようになりました。

所感

LLMとの対話を通じて開発を進めるのは、まるでペアプログラミングをしているようで非常に効率的だと感じています。特に、コードの修正やテストコードの生成など、定型的でありながら正確性が求められる作業において、その威力を発揮してくれました。

今回のテンプレートファイル機能とモデル指定機能は、ツールの柔軟性を大きく向上させる重要な機能だったので、無事に実装できてホッとしています。テストが一度でパスしたときは、思わずガッツポーズが出そうになりました(心の中で)。機能追加と同時にテストを書く習慣がついてきたことも、大きな進歩だと感じています。

一方で、まだテストカバレッジが十分でない部分(特にCLIの引数パース部分など)があること、そして何よりもドキュメントの更新が追いついていないことが気になっています。実装した機能をユーザーに使ってもらうためには、正確で分かりやすいドキュメントが不可欠です。

今後の課題

  • 他のLLMプロバイダー対応: 現在はGeminiとOpenRouterのみモデル指定をサポートしていますが、今後他のプロバイダーを追加した場合にも同様の機能を提供する必要があります。
  • CLIのテストカバレッジ向上: CLI引数のパースやエラーハンドリングに関するテストがまだ不足しています。この部分のテストを拡充し、より堅牢なツールにする必要があります。
  • ドキュメントの更新: 今回実装したテンプレートファイル機能とモデル指定機能、そして前日に行った修正内容を、公式ドキュメントに反映させる作業が残っています。使用方法の例なども含め、分かりやすいドキュメントを作成します。

まとめ

本日の開発では、CLIツールにテンプレートファイル機能とモデル指定機能を追加し、それぞれの単体テストを作成・実行しました。これにより、ツールのカスタマイズ性と柔軟性が向上し、converter.py のテストカバレッジも70%に達しました。機能実装は順調に進みましたが、CLI部分のテスト拡充やドキュメント更新など、まだ取り組むべき課題が残っています。引き続き、ツールの完成度を高めていきます。

GitHubで編集を提案

Discussion