💸

【Claude Code】プロンプトの工夫で、実際にどのくらい料金が変わるのか検証してみた

に公開

はじめに

株式会社Sally 所属エンジニアの @wellPicker です。
弊社では、スマホやパソコンでマーダーミステリーを遊べるアプリであるウズや、マダミス情報・予約管理サイトマダミス.jp、マダミス開発ツールウズスタジオを開発しています。
そもそもマダミスとは何か? については、ぜひこちらもご確認ください。

最近、弊社では試験的に社全体を挙げてClaude Codeの利用を推進しており、私も日々の開発業務の中でガンガン Claude Code を使用しています。
Claude Code を使い続けるためにも、料金(トークン使用量)はなるべく節約したいですよね。
私はまだ Claude Code を使い始めてから特に日が浅いので、正直効率的な節約方法についてそこまで詳しくはありません。正確な情報を知りたい方は他の記事を読んだ方が良いと思います。
そこで、それらの記事とは少し違うアプローチで、「プロンプトの書き方が実際にどのくらいトークン使用量に影響するのか」を具体例を交えて分かりやすく説明したいと思います。

結論だけ言うと、やはりプロンプトはなるべく具体的に書いた方が良いです。

Claude Code とは?

Claude Codeは、Anthropicが提供するターミナルベースのコーディング用のAIエージェントです。
ターミナルベースという点は少し特徴的ですが、VSCodeの拡張機能も用意されているので個人的にはそこまで他のAIエージェントと使用感は変わらないと思います。
逆に、ターミナルベースであることで自力でファイルを検索したりすることが得意な点が他のAIエージェントにはないメリットだと感じています。
そして、これも個人の感想ですが他のAIエージェントと比べて仕事が正確であるという印象を受けます。もちろんそのためにはCLAUDE.mdをしっかりメンテナンスしたり、下準備は必要なわけですが、Cursorのチャットなどと比べてもかなり仕事がやりやすくなったと感じています。

Claude Code における料金とトークン使用量

Claude Codeは7月1日現在、従量課金制のAPIキー方式の他に、Pro/Maxという2種類のプランを提供しています。
APIキー方式では使用した「トークン」の量に応じてそのまま請求額が加算され、Pro/Maxのプランでもトークン使用量に応じた制限があります。
したがって、Claude Codeをより快適に使おうと思うと、必然的にトークン使用量をなるべく節約する必要があるわけです。
そこで今回は、実際にウズのリポジトリを使用して、同じタスクでもプロンプトの違いによってどのくらいトークン消費量に差が生じるのかを検証してみました。

検証

今回は、ウズのアプリで「マイページ」に表示されている「興味ありシナリオ」と「履歴」のボタンの位置を逆にするタスクをClaude Codeにやってもらおうと思います(実際には逆にする予定はありません)。
該当箇所の実装は、ざっくりとこんな感じになっています。

GridView.count(
...
 children: [
  _MenuButton(
   icon: AppAssets.icons.favoriteFill,
   text: "興味ありシナリオ",
   onPressed: () =>
    FavoriteScenariosScreen(user.id).route(context),
  ),
  _MenuButton(
   icon: AppAssets.icons.book,
   text: "履歴",
   onPressed: () =>
    const HistoryScenariosScreen().route(context),
  ),
  _MenuButton(
   icon: AppAssets.icons.additionalContentChecked,
  text: "追加コンテンツ",
  onPressed: () =>
   const AdditionalContentListScreen().route(context),
  ),
  _MenuButton(
   icon: AppAssets.icons.users,
   text: "フレンドリスト",
   onPressed: () => const MyFriendsScreen().route(context),
    showBadge: user.friendRequestSenders.isNotEmpty,
  ),
 ],
),
...

Case 1 : 「マイページの『興味ありシナリオ』と『履歴』の位置を逆にして」と指示を出した

Claude Codeのタスクが完了した後、トークン使用量などを確認すると下記のようになりました。

Total cost:            $0.4017
Total duration (API):  1m 54.9s
Total duration (wall): 3m 33.8s
Total code changes:    6 lines added, 6 lines removed
Usage by model:
    claude-3-5-haiku:  3.4k input, 87 output, 0 cache read, 0 cache write
       claude-sonnet:  242 input, 4.0k output, 314.4k cache read, 64.7k cache write

最初に「マイページ」が示す実装箇所を探すために、時間とトークンをかなり消費してしまったようです。たった数行の編集に2分近くかかってしまいました。また、より大規模・複雑な変更の場合、今回のような曖昧な指示では精度が下がるというデメリットもあります。
ただ、逆に言えばこれだけ漠然とした指示でもタスクを遂行してくれるのは、非エンジニアでも直感的にバイブコーディングができるというClaude Codeの強みでもあります。

Case 2 : 「lib/views/pages/users/my_page/my_page_screen_container.dart の GridView で、1番目と2番目の要素を交換して」と指示を出した

一回 /clear で履歴を削除した上で、今度はより具体的な指示を出すと下記のような結果になりました。

Total cost:            $0.0659
Total duration (API):  18.6s
Total duration (wall): 1m 10.9s
Total code changes:    6 lines added, 6 lines removed
Usage by model:
    claude-3-5-haiku:  125 input, 28 output, 0 cache read, 0 cache write
       claude-sonnet:  18 input, 575 output, 54.1k cache read, 10.9k cache write

「マイページ」の実装箇所が最初からわかっていたおかげで、先ほどよりも高速にタスクを完了することができました。また、トークン使用量・料金も大幅に節約できたことがわかります。
これらの結果から、可能であればプロンプトはなるべく具体的に書いたほうが良いと言えます。

まとめ

Cursor Chatを使用するときにContextとなるファイルを渡すように、Claude Codeを使用する場合も作業すべきファイルはなるべく具体的に渡してあげたほうが圧倒的に効率が良くなることが判明しました。ファイルパスを直接口頭で渡さなくても、@コマンドで渡すことも可能です。
AIエージェントを使用したコーディングが主流になりつつありますが、何も考えずにAIに丸投げするというよりは、必要性や状況、自身のスキルレベルに応じてよりAIのパフォーマンスを引き出せるプロンプトを考えることが重要だと感じました。

UZU テックブログ

Discussion