Bespoke Curator:バルク推論で合成データを作るPythonライブラリの実像
Synthetic data curation for post-training and structured data extraction
ひと目でわかる
- これは何?
- LLMへの大量リクエストを非同期・キャッシュ・バッチAPIで処理し、ポストトレーニング用データセットや構造化抽出データを作るためのライブラリ。向く用途と向かない用途の境界を、リポジトリの記述から整理する。
- 誰に向いている?
- 大量のプロンプトを投げてデータセットを作る用途、特にOpenAIやAnthropicのバッチAPIでコストを抑えたい場合には候補になる。逆に、単発のAPI呼び出しを数回しかしないスクリプトや、GPU上でモデルを直接制御したい推論サーバ用途には過剰な依存になる。
- 商用利用できる?
- できます。Apache-2.0 は寛容なライセンスで、著作権表示とライセンス表示を残せば、使用・改変・販売が可能です。
- 今もメンテナンスされている?
- されています。最後のコミットは 14 日前です。
- 何の言語で書かれている?
- 主に Python です(GitHub の言語統計による)。
回答はプロジェクトの GitHub データ(最終同期:2026年9月15日)と当サイトの分析に基づくもので、法的助言ではありません。
オープンソース詳細解説
Curatorが埋めようとしている穴はバッチ推論の配線である
LLMで合成データセットを作る作業は、モデル選びよりも配線でつまずく。数千件のプロンプトを並列に投げ、失敗を再試行し、同じ入力への再課金を避け、途中経過を眺め、最後にJSONLやParquetとして書き出す。この配線を毎回書き直すのが面倒だという問題設定が、READMEの「Bulk Inference and Scalable Data Curation for Post-Training」という副題に表れている。対象読者は、ポストトレーニング用の命令データや推論データを自作したい研究者と、製品レビューからの特徴抽出のような構造化抽出を回したい実務者である。READMEの例示を見る限り、対象は「少量のプロンプトを試す」段ではなく、データセット規模でAPIを叩く段階にいる人だ。
データフローはプロンプト関数とLLM抽象の分離にある
READMEとドキュメントの構成から読み取れる設計は、生成ロジックをPythonの関数として書き、推論の実行をCurator側の抽象に任せるという分担である。READMEは「Rich Python based library for generating and curating synthetic data」とうたっており、プロンプトの組み立てとデータの整形は利用者のコードに残る。一方で実行部分は「Support for a wide range of inference options via LiteLLM, vLLM, and popular batch APIs」とあり、LiteLLM経由のホスト型API、vLLM経由の自前サーバ、各社のバッチAPIが同じ呼び出し面の背後に置かれる。構造化出力は「First class support for structured outputs」と明記され、抽出タスクではスキーマを渡す形が想定されている。非同期処理、キャッシュ、障害復旧が「at every scale」と書かれている点は、並列度を上げたときに同じプロンプトを再実行しない仕組みが中核であることを示す。ただし、キャッシュのキーが何で決まるか、再試行の上限がいくつかといった具体値はREADMEには書かれていない。
導入はpip一発、設定はモデル名とバックエンドの選択から
インストールはREADMEに記載のとおり `pip install bespokelabs-curator` の一行で、PyPIのパッケージ名は bespokelabs-curator である。リポジトリ名が curator であるのに対しパッケージ名が bespokelabs-curator なので、requirements に書くときは後者を使う。APIキーはLiteLLMの慣習に従うため、OpenAIやAnthropicを使う場合は環境変数で渡す形になる。バッチAPIを使うとREADMEの表現では「Cut Token Costs in Half」、つまりトークン費用が半額になる経路が選べる。コード実行を伴うタスクでは CodeExecutor が用意され、READMEによれば local(multiprocessing)、Ray、Docker、e2b の4バックエンドに対応する。ファインチューニングまで一気通貫させたい場合は TinkerTrainer や FireworksTrainer が例として挙げられており、キュレーション済みデータのアップロードからLoRA学習までを同じトレーナーインターフェースで扱うと説明されている。ここで注意したいのは、これらトレーナーはあくまで例ディレクトリの統合であり、Curator本体のコア機能ではないという点だ。
Viewerとキャッシュは便利だが、生成中の可観測性には前提がある
READMEは「Viewer to monitor data while it is being generated」を特徴として挙げ、CLIの動作を示すGIFを添えている。生成が数時間に及ぶバッチでは、途中で壊れたサンプルに気づけるかどうかが手戻り量を左右するため、この機能の価値は大きい。ただし、Viewerが何を表示するのか、サンプルの選別やフィルタができるのかはREADMEからは分からない。同様に、キャッシュと障害復旧は「Built-in performance optimizations」として並記されるだけで、再開可能な単位がプロンプト単位なのかファイル単位なのかは記述がない。ここは導入判断の前にドキュメントのapi-referenceを確認すべき箇所である。推測で「壊れたら自動で直る」と期待して本番パイプラインに組み込むのは危険だ。
向かない場面:単発呼び出しと推論サーバの運用
Curatorは大量バルク推論の配線を引き受けるライブラリであり、その抽象は少数回の呼び出しではむしろ邪魔になる。プロンプトを数個試して挙動を見たいだけなら、各社のSDKを直接叩いたほうが短く済む。また、vLLMを推論基盤として運用したい場合、CuratorはvLLMを「推論オプションの一つ」として参照する立場であり、サーバの起動、GPUメモリ配分、モデルのロード戦略を管理するツールではない。この二つは層が違う。さらに、生成ロジックを独自のスケジューラや既存のAirflow DAGに厳密に組み込みたいチームにとっては、Curator内部の再試行とキャッシュが二重管理になりうる。READMEには再試行ポリシーを外部から差し替える方法についての記述がないため、この点は採用前に必ず確認したい。
代替としてのDSPy、そしてLiteLLM直叩きとの違い
近い問題領域にDSPyがある。DSPyはプロンプトをプログラムとして最適化することを主目的に据え、シグネチャとモジュールを定義してコンパイラにプロンプトやfew-shot例を探索させる。Curatorは最適化ではなく、大量実行の信頼性とコストに重心を置く。プロンプトを自動で改善したいのか、決めたプロンプトを大量に捌きたいのかで選ぶべきものが変わる。もう一つの現実的な代替はLiteLLMを直接使うことだ。Curator自身がLiteLLMを推論バックエンドとして参照しているため、LiteLLM単体でもモデル抽象は得られる。差分は、キャッシュ、再開、Viewer、構造化出力の扱いを自前で書くかどうかに集約される。つまりCuratorの実質的な価値はモデル抽象ではなく、その上に載った実行管理の層にある。
ライセンスとメンテナンスの見取り図
ライセンスはApache-2.0で、特許条項を含む寛容なライセンスである。商用製品に組み込む際の条件はこのライセンスに従うが、具体的な解釈は法務の領域なのでここでは踏み込まない。メンテナンス面では、リポジトリはアーカイブされておらず、最終プッシュは2026年9月2日、直近のリリースは v0.1.27(2026年3月15日)である。バージョン番号が0.1系に留まっている点は、APIの互換性が保証された段階ではないことを示す。実際、リリース一覧には v0.1.26 のタグが v1.0.26 という名前で記録されている箇所があり、タグ運用に揺れが見える。アップグレード時はタグ名ではなくPyPIのバージョンを基準に固定し、破壊的変更を前提にテストを回す姿勢が必要になる。
編集部の結論
大量のプロンプトを投げてデータセットを作る用途、特にOpenAIやAnthropicのバッチAPIでコストを抑えたい場合には候補になる。逆に、単発のAPI呼び出しを数回しかしないスクリプトや、GPU上でモデルを直接制御したい推論サーバ用途には過剰な依存になる。導入前に確認すべきは、自分の推論経路(LiteLLM経由かvLLMかバッチAPIか)が対応表に載っているか、そして生成途中のデータをViewerで見る必要があるかどうかである。
コミュニティノート