妙高市の方言チャットボットVerUp:実装スタート!フェーズ1 ── 実験コードを作るまで
実装スタート!フェーズ1 ── 実験コードを作るまで
前回の記事では、Claude Code のプランモードを使ってバージョンアップ計画を立てました。
今回は、いよいよ実装へ。計画の フェーズ1「実験準備」 を進めていきます。コードリポジトリのセットアップから、辞書比較実験スクリプトの作成まで、一歩ずつ見ていきましょう。
なお、この実装については、テスト用フレーズの作成以外は Claude Code が行っています。
フェーズ1 でやること
改修計画のフェーズ1 は「実験準備」です。辞書を書き換える前に、現在の辞書(旧辞書)でどれだけの精度・トークン数になるか記録しておく——その土台を整える段階です。
具体的には以下の 4 ステップです。
`requirements.txt` を更新(Responses API 対応バージョンへ)
テスト用フレーズを用意する(`plans/experiment_phrases.txt`)
実験スクリプトを作る(`experiment/experiment.py`)
旧辞書のまま実験を実行し、結果を記録する
今回は 1〜3 まで進め、次回実験結果を確認します。
ブランチを切って作業開始
まず作業用のブランチを作りました。
git checkout -b feature/responses-api-refactor本流(`main`)には完成したコードだけをマージするようにして、実験中の変更はこのブランチで管理します。
環境まわりを整える
`.gitignore` を更新
仮想環境や API キー、ローカル用のメモフォルダを Git 管理外にしました。
.venv/
.env
__pycache__/
*.pyc
_memo/`.env` に API キーを書く運用なので、絶対に Git にコミットしないよう `.gitignore` に加えておくのは必須です。
`requirements.txt` を更新
OpenAI の Responses API は SDK 1.66.0 以降で使えます。それ以前のバージョンでは `client.responses.create` が存在しないため、バージョンを明示しています。
openai>=1.66.0
streamlit
python-dotenv`python-dotenv` は `.env` ファイルから API キーを読み込むためのライブラリです。
仮想環境を作ってパッケージをインストール
python3 -m venv .venv
.venv/bin/pip install -r requirements.txtインストールされたバージョンは、openai 2.31.0、streamlit 1.56.0、python-dotenv 1.2.2 でした。
`.env.example` を作成
API キーのテンプレートとして、中身を空にしたファイルをリポジトリにコミットします。
OPENAI_API_KEY=your_api_key_here実際に使うときは、このファイルをコピーして `.env` にリネームし、API キーを書き入れます。
テスト用フレーズを用意する
辞書の比較実験に使う標準語フレーズのリストを `plans/experiment_phrases.txt` に作りました。
日常の挨拶・体調・季節・山菜・温泉など、旧新井市の生活感が出やすいフレーズを 10 文選んでいます。
- こんにちは。今日はいい天気ですね。
- そうですね。だいぶ暖かくなってきました。
- 体調はどうですか?しばらく顔を見ませんでしたが。
- 気温が上がったり下がったりしたせいか、風邪をひいて寝込んでいました。だいぶ元気になりました。
- そうですか。それは大変でしたね。
- 元気になったんで山菜を取りにでも行こうかと思っています。
- いいですね。山菜といえば、先日温泉宿で美味しい山菜料理をいただきました。ごちそうでした。
- それは良かったですね。温泉はしばらく行ってないので、私も行ってみたいです。
- 温泉に入って、ゆったりするのが大好きなんですよ。
- 温かいお湯に浸かって、美味しいごちそうを食べるのは天国みたいですね。方言らしさが出やすい表現(山菜、温泉、ごちそう)を意図的に入れています。旧辞書と新辞書でどれくらい変わるか、読み比べるのが楽しみです。
実験スクリプトを作る
`experiment/experiment.py` を Claude Code に書いてもらいました。
スクリプトの動作は 2 モードに分かれています。
フェーズ1(今回):`dialect_dict.txt` だけがある状態 → 現在の辞書を「旧辞書」として翻訳・記録する
フェーズ2(次回以降):`dialect_dict_old.txt`(旧辞書バックアップ)と `dialect_dict.txt`(新辞書)が両方ある状態 → 旧・新を比較してサマリーまで自動出力する
フェーズ1 では現在の辞書をそのまま使い、旧辞書の結果として記録します。フェーズ2 で辞書を書き直したあと、同じスクリプトを再実行すれば比較まで自動でやってくれる設計です。
スクリプトの主な仕様:
API: Responses API(`client.responses.create`)
各フレーズは独立リクエスト(会話履歴なし)
トークン数(入力・出力・合計・キャッシュヒット)を記録
結果を `plans/experiment_result.md` にマークダウン形式で保存
コードの核になる部分はこんな感じです。
response = client.responses.create(
model=MODEL,
instructions=system_prompt,
input=phrase,
max_output_tokens=200,
)
result = {
"translation": response.output_text.strip(),
"input_tokens": response.usage.input_tokens,
"output_tokens": response.usage.output_tokens,
"total_tokens": response.usage.total_tokens,
"cached_tokens": response.usage.input_tokens_details.cached_tokens,
}旧仕様の `response.choices[0].message.content` ではなく、Responses API の `response.output_text` でテキストを取得しています。トークン数は `response.usage` から拾えます。
またも「古いモデル名」でやってきた Claude
スクリプトが出来上がったとき、モデル名を確認してみたら……
MODEL = "gpt-4o-mini"前回と同じことが起きました。
前回の記事では、Claude Code が最初に旧仕様の Assistants API を提案してきて、最新の Responses API に修正した、というエピソードをご紹介しました。今回はそれに加えて、モデル名まで古いままだったのです。
ChatGPT-4 系のモデルは一世代前。現在の最新モデルは GPT-5.4 です
「これ、前も同じことあったよね?」と思いながら修正しました。
# 修正前
MODEL = "gpt-4o-mini"
# 修正後
MODEL = "gpt-5.4-mini"おそらく、既存の `app.py` で使っていたモデル名 `gpt-4o-mini` を Claude Code が参照して、そのまま実験スクリプトにも踏襲してしまったのだと思います。実装プランには `gpt-5.4-mini` と明記してあったのですが、既存コードの記述の方が「引っ張り」として強かったようです。
AI はコンテキストにある既存コードを手がかりにして書くので、古いコードがあると意図せずそれを引き継いでしまうことがある。プランに書いてあっても、実際のコードで確認する、という一手間はやはり必要だと感じました。
ここまでのまとめ
フェーズ1 の「実験コード作成まで」が完了しました。
✅ ブランチ作成
✅ `.gitignore` 更新
✅ `requirements.txt` 更新
✅ 仮想環境構築・パッケージインストール
✅ `.env.example` 作成
✅ テスト用フレーズ作成
✅ 実験スクリプト作成
⬜ 旧辞書で実験を実行(次回)
次回は、実際に実験スクリプトを動かして、旧辞書の翻訳結果とトークン数を確認します。「どんな方言訳になるのか」「辞書なしとどう違うのか」——実験結果が楽しみです。
参考に、今回実装範囲(GitHubコミット)のリンクを貼っておきます。
続く
書いている人について
最後まで読んでいただき、ありがとうございます。
私のnoteの紹介記事です。
よろしければ、お読みいただければと思います。
この記事の連載マガジンです。
私の生まれ故郷の歴史
最後に
この記事が気に入ったら、スキをいただけると励みになります。
