calomil
LLMによる大規模データ分類パイプライン
プロジェクト概要
数十万件の日本語テキスト、具体的には食品のメニュー名を、Gemini APIで規定の分類基準に従って自動分類するバッチ処理パイプラインです。ある大学の研究機関からの依頼で開発しました。並列化とコスト管理を徹底して実データの処理を完走させ、別案件では医療分野のICD-10分類にも同一の仕組みを応用しています。
依頼の内容
今回の依頼では、大学の研究機関に提供された、数十MBのCSVに格納された数十万件の食品メニュー名を、研究用の独自規定に従って分類しました。メニューごとに炭水化物や野菜がどの程度使用されているかを定量化した指標、と解釈して差し支えありません。
数十万件という規模は、人手による分類が現実的ではありません。他方、ルールベースの処理では、「唐揚げ」「からあげ」「竜田揚げ」のような表記ゆれや意味の近さに対応できません。意味を解釈して分類するにはLLMが必要ですが、単純にAPIを数十万回呼び出せば費用も実行時間も増大し、途中で失敗すれば処理を最初から再実行することになります。calomilは、この規模の分類を安定して完走させるための処理基盤全体を設計したものです。分類の仕組みだけでなく、それを支える運用基盤までを含めて構築する必要がありました。
構築した基盤
設計では、並列実行の制御と、コストの最適化と、障害からの回復を重点的に実装しました。
並列化では、APIの流量制限に合わせて同時実行数を制御し、数十万件を実用的な時間内に処理できるスループットを確保しました。コスト面では、モデルの選定からプロンプトの構造まで、呼び出し単価を削減する設計を徹底しました。プロンプトはキャッシュが有効に作用する形式に固定し、出力はスキーマで構造化して、分類の揺らぎと冗長な再試行を抑制しました。処理単位ごとの費用は常時追跡可能にし、総額を見積の範囲内に維持しながら運用しました。
長時間のバッチ処理では、途中で必ず問題が発生します。そこで全体を中断可能・再開可能な設計にして、深夜にジョブが停止しても、翌朝にはその地点から処理を再開できる構成としました。実データ数十万件の処理は、この構成で完走させました。
その後
このパイプラインは、分類の規定と入力を置換すれば別の領域にもそのまま転用できます。実際に別案件では、医療分野の診断分類であるICD-10への応用も実施しました。LLMを1回呼び出すデモと、数十万回呼び出し続ける研究のデータ基盤との間には、外見以上の隔たりが存在します。その隔たりを解消する運用設計を単独で構築し切ったことが、この案件における最大の収穫です。