非決定的出力を評価するためのデータセットを大量生成する方法。とにかく数打ちながら期待値を満たすデータをふるいにかけながら集めると言う泥臭い方法だが、Evaluation フレームワークの機能として提供されているのがありがたい。
中でも、データセットにとどまらずツール呼び出しの検証が含まれているのは興味深かった。Foundation Models を使って開発する中でも、特に tool calling には泣かされた。以下の記事のようにツール呼び出しがされているかをログベースで検証したりしていたが、バージョンがあがると期待通りに呼び出されなくなり、プロンプトをどう工夫してもこの問題はついに解決されなかった。
- Foundation Models:Tool calling の複数同時呼び出しができればいいのに
- Foundation Models:ツール呼び出しを並列/直列に反復させる
- Foundation Models:同じツールの呼び出しを反復させる
今年こそは検証に足る挙動が実現していると期待しつつ、こうした評価のしがいがある高度な実装に挑戦してみたい。
Create robust evaluations for agentic apps
0:00 – Introduction
- Evaluations フレームワーク(Xcode 27 新機能)の高度な機能を紹介
- 合成データでデータセットを拡張する
- ツールコーリングを伴うエージェンティックなワークフローの堅牢な評価構築
- Hill-climbing プロセスにおける、”Develop” と “Evaluate” ステップに着目
2:21 – The dataset problem in BookTracker
- Book Tracker のタグ自動生成機能が抱えるデータセット問題
- 実際のレビューは書籍・ジャンル・長さ・文体で無限に多様
- 手作業で書いた 13 サンプルではすべてを捉えられない
3:46 – Generating synthetic data with makeSamples
makeSamplesAPI でデータセットを合成拡張- プロンプト・データセット(
ModelSampleの配列)・targetCount(シード含む合計サイズ、e.g. 100)を渡す - 合成データの生成は反復的なプロセスの中で行われる(データが代表的か確証が得られるまで検証される)
- 妥当なサンプル数はケースバイケース:量より網羅性
- プロンプト・データセット(
6:27 – Customizing generation with SampleGenerator
SampleGeneratorで、prompt,dataset,targetCountを超えたより細かい設定sessionProviderクロージャでモデルを選択(例:Private Cloud Compute)sessionProviderは実行開始時1度実行され、バッチ間で再利用されるが、コンテキストウィンドウを使い切ると再度呼び出される- コンテクストは共有されないので、サンプル生成の期待を指示する
sessionProviderへのカスタムインストラクションは、自己完結型にする(前のバッチの状態に依存させない)
- コンテクストは共有されないので、サンプル生成の期待を指示する
8:38 – Sampling strategies
samplingStrategyでシードサンプルの提示方法を制御.random(デフォルト):ランダムなサブセット。多様性重視のデータセットに適する.slidingWindow:連続したシードを提示。順序に意味があるデータセットに適する
10:11 – Validating synthetic samples
validatorクロージャで各サンプルを個別に検証- レビュー長 ≥ 100 文字
- タグ数 3〜8 個
- タグはすべて小文字
- 有効なサンプルは
samples、不合格はinvalidSamplesに分類
13:04 – Comparing evaluation results
- Xcode 27 の Evaluations Report で 2 つの実行結果を比較
- 13 サンプルと 100 サンプルの結果を比較
- サンプルが増えたことで、品質スコアが低下し、小さなデータセットではよく見えていた機能の限界が露呈
- プロンプトやインストラクションによって改善しうる
- 評価を調整し、実際に何が評価されているかを理解できる
- データセットがまだ代表的でないかもしれない(増やしたり、エッジケースを網羅)
15:09 – Tool calling and tool evaluations
- ツール評価は「何が返ってきたか」ではなく「どうやって取得したか」を検証
- 正しいツールを、正しい引数で、正しい順序で呼んでいるか
- 想定外のツール呼び出しがないか
- デモアプリのツール例
- searchBooks・getBookDetails・findSimilarBooks
18:54 – Trajectory expectations
TrajectoryExpectationでセッションのトランスクリプト上のツール呼び出しの種類と順序を検証- 引数マッチャーの種類
.exact:厳密な値の一致.naturalLanguage:意図ベースのファジーマッチング(基準を自然言語で記述).contains・.hasPrefix・.hasSuffix:部分文字列マッチング.oneOf・.pattern:列挙値・正規表現マッチング.range:数値の範囲チェック.keyOnly:キー名だけ確認(値は問わない)
- 順序付き期待(
ordered)と順不同期待(unordered)を組み合わせ可能 disallowedで呼び出してはいけないツールを指定
21:26 – Building a tool call evaluation
- データセットをそれぞれに対するプロンプト、インストラクション、
TrajectoryExpectationをもって、ToolCallEvaluatorでスコア付けをするLanguageModelSessionにツールを渡し、構造化されたトランスクリプトをキャプチャallPassとpercentagePassの 2 つのメトリクスを自動計算
22:02 – Synthetic data for tool evaluations
ModelSampleとTrajectoryExpectationはいずれも@GenerableのためSampleGeneratorを用いて合成生成が可能- 合成プロンプトの設計ポイント
- 利用可能なツールの説明(名前・引数)
- 順序要件(
orderedvsunorderedの使い分け) - 使用すべき引数マッチャーの説明
- バリデーターで品質を担保
expectationsが定義されているか- 少なくとも 1 つのツール期待が含まれているか
- すべてのツール名が有効なセットに含まれているか