WWDC26:Create robust evaluations for agentic apps

非決定的出力を評価するためのデータセットを大量生成する方法。とにかく数打ちながら期待値を満たすデータをふるいにかけながら集めると言う泥臭い方法だが、Evaluation フレームワークの機能として提供されているのがありがたい。

中でも、データセットにとどまらずツール呼び出しの検証が含まれているのは興味深かった。Foundation Models を使って開発する中でも、特に tool calling には泣かされた。以下の記事のようにツール呼び出しがされているかをログベースで検証したりしていたが、バージョンがあがると期待通りに呼び出されなくなり、プロンプトをどう工夫してもこの問題はついに解決されなかった。

今年こそは検証に足る挙動が実現していると期待しつつ、こうした評価のしがいがある高度な実装に挑戦してみたい。

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

  • makeSamples API でデータセットを合成拡張
    • プロンプト・データセット(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 にツールを渡し、構造化されたトランスクリプトをキャプチャ
    • allPasspercentagePass の 2 つのメトリクスを自動計算

22:02 – Synthetic data for tool evaluations

  • ModelSampleTrajectoryExpectation はいずれも @Generable のため SampleGenerator を用いて合成生成が可能
  • 合成プロンプトの設計ポイント
    • 利用可能なツールの説明(名前・引数)
    • 順序要件(ordered vs unordered の使い分け)
    • 使用すべき引数マッチャーの説明
  • バリデーターで品質を担保
    • expectations が定義されているか
    • 少なくとも 1 つのツール期待が含まれているか
    • すべてのツール名が有効なセットに含まれているか

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です