はじめに
Kaggleの作業でJupyterノートブックを書きながら、Claude CodeやCodex CLIにレビューや相談をしています。ところが、ノートブックを丸ごとLLMに渡すと1本で約3万トークンになり、何度も相談しているとすぐにコストがかさみました。
この記事では、トークンを節約するためにやった工夫と、Windows PowerShellからCLIを呼ぶときにハマったポイントをまとめます。
1. ノートブックは「コードセルの差分」だけを渡す
.ipynbファイルの中身はJSONで、セルの出力(ログや画像)やメタデータがたくさん入っています。LLMに見てほしいのはほとんどの場合コードだけなので、次のような処理をするスクリプトを作りました。
- 出力とメタデータを捨てて、コードセルだけを取り出す
- 前の版との差分だけを出す
- 300字を超える長い行は「長さ」と「ハッシュ」に置き換える(中身が変わったかどうかだけ分かればいいので)
これで、版の比較が**約1〜1.6kトークン(95%以上減)**に収まりました。
また、ノートブックの中に長いプロンプト文字列があると読みにくいので、それを別の.txtに切り出した「読む用ビュー」を作っています。実行用のノートブックは1つのファイルのまま保ち、LLMやレビューには読む用ビューを渡す、という使い分けです。
2. Claude Code / Codex CLIを別のプログラムからコマンドで呼ぶ
Claude Code
claude -p を使うと、対話画面を開かずに1回だけ質問して答えを受け取れます。
claude -p --max-turns 1 --disallowedTools "Bash,Read,..."
ポイントは、ファイルを読む道具などを禁止して、こちらで用意した要約だけを渡すことです。勝手にリポジトリ中のファイルを読みに行かないので、トークンが安く済みます。
Codex CLI
インストールはnpmで入れました。
npm i -g @openai/codex
ブラウザでのログインが失敗したときは、URLとコードで認証する方法で通りました。
codex login --device-auth
質問は標準入力で渡します。
echo "質問内容" | codex exec --skip-git-repo-check -
3. Windows PowerShellで日本語が文字化けする
PowerShellから日本語のプロンプトをCLIにパイプで渡すと、文字化けしました。次の3つをUTF-8にすると直ります。
[Console]::InputEncoding = [System.Text.Encoding]::UTF8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
また、PowerShellではcmdのような & によるコマンドの連結が使えず、AmpersandNotAllowed というエラーになります。cmdの感覚で書くとハマるので注意です。
まとめ
- ノートブックを丸ごと渡さず、コードセルの差分だけにすると、トークンが95%以上減った
-
claude -pでは道具を禁止して要約だけ渡すと安く済む - Codex CLIのログインに失敗したら
codex login --device-auth - PowerShellで日本語を渡すときは3つのエンコーディングをUTF-8に
同じようにLLMとノートブックを行き来している人の参考になればうれしいです。