Embedding コストを 1/70 にした 3 つの工夫

なぜコストが膨らむか

OpenAI の text-embedding-3-small は 1M トークンで $0.02。安いように見えるが、検索インデックスを毎晩 全件再計算 する設計だと 無駄な再計算が累積 して気づくと月 $50〜200 になる。

私は手元のサイドプロジェクトでこれをやって痛い目を見た。3 つの工夫 で 1/10 にした実話を書く。

工夫 1: text の hash で再計算をスキップ

embedding する元 text に変化が無ければ、embedding も変化しない。当たり前だが、これを hash で機械的に検出 する仕組みが要る。

これだけで 更新があった記事だけ embedding が走る。50 記事のサイトで月 1 回更新が 5 件なら、コストは 1/10 になる。

工夫 2: dim を 1536 → 768 / 256 に絞る

text-embedding-3-small は dim を任意に指定 できる（OpenAI の Matryoshka Embeddings 機能）。

dim を半分にすると、ストレージも検索コストも半分になる。精度の劣化は 5% 未満（OpenAI の論文値）で、検索体感はほぼ変わらない。

私は最初 1536 で運用していたが、768 に下げて検索品質が変わらなかったので 256 まで下げた。これで 1536 → 256 で 6 分の 1。

工夫 3: バッチング

OpenAI の embeddings API は 入力配列で複数同時 に投げられる。

50 件を 1 リクエストで処理できる。リクエスト数で課金されるサービス（embeddings は基本トークン課金だが、レート制限はリクエスト数）では、バッチで rate limit を回避 できる。…