Documentation Index
Fetch the complete documentation index at: https://arkor-92aeef0e-eng-736.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
学習中の評価
TypeScript でファインチューニングする最大の理由は、学習がまだ進行中の状態で、自分のコードから半学習済みモデルを呼べる点です。フックはonCheckpoint です。バックエンドがチェックポイントをアップロードするたびに、SDK が登録された関数を呼び出し、そのチェックポイントアダプターに紐づいた infer を渡してくれます。
このレシピは固定プロンプトに対してそれを組み込み、Loss(モデルの誤差を表す指標)の曲線が異常を示すよりずっと前にリグレッションを検知できるようにします。
パターン
- チェックポイントごとに短い生成サンプルを stdout に書き出し、Loss の数字と並べて見られる。
- 新しいアダプターに対して推論自体が動くことの確認(つまり推論側で気付かないうちに発生したリグレッションを学習時に捕まえられる)。
- 後で比較やアサーションを足す自然な場所。
なぜ他の場所では難しいのか
infer は 直前に保存されたチェックポイントに紐づいています({ kind: "checkpoint", jobId, step })。Studio の Playground から中間チェックポイントには到達できず、専用の CLI コマンドもありません。現状の唯一の方法は onCheckpoint の中から呼ぶことです。そのためこのレシピは事後ではなく、この場で実行する必要があります。
関数はクラウド API からの生の Response を返すので、ストリーミングやデコードの方法は自由です。上のスニペットは stream: false を渡してボディを単一の JSON ドキュメントとして受け取っています。本格的なストリーミングは SDK § infer を参照してください。
バリエーション
同じプロンプトでベースモデルと比較。 Studio の Playground はすでに Base / Adapter のモード切替を持っていますが、目視ではなく自動でスコアを付けたいなら、同じことをonCheckpoint から行えます。
responseFormat: { type: "json_schema", json_schema: { name, schema, strict: true } } に置き換えると、data.choices[0].message.content がスキーマを満たす JSON 文字列で返ってくるので、JSON.parse 一発で型付きオブジェクトとしてそのまま分岐できます(parsed.urgency === "high"、parsed.category in VALID_LABELS など)。型付きフィールドを Early Stopping に繋ぐ完全パターンは 構造化出力と Function Calling レシピ を参照。
サンプルから Early Stopping をトリガー。 Early Stopping レシピ と組み合わせる: チェックポイント出力が参照テキストから許容を超えてドリフトしたら controller を Abort。次のチェックポイントは発火しません。
チェックポイントを Slack チャネルにレビュー用で送る。 通知レシピ と組み合わせる。各ステップのサンプルを Slack メッセージとして投稿し、学習が続いている間にレビュアーがリアクションで投票できます。
心に留めておくこと
try / catchで囲む。onCheckpointから throw すると SSE 再接続ループに catch されてリトライされ得ます(SDK § ライフサイクルコールバック 参照)。決定的な振る舞いが必要ならコールバック内でエラーを処理してどうするか決める。- 推論は実際の呼び出しコストがかかる。 バックエンドはライブの学習クラスタからリクエストを返します。毎チェックポイントを叩くなら
maxTokensは控えめに。 inferは呼び出しごと、メモ化されない。 同じonCheckpoint内で 2 回呼ぶとバックエンドリクエストも 2 つ。可能なら 1 回の呼び出しでプロンプトをまとめて。