Evaluations:モデル品質のためのXCTest(iOS 27)
通常のユニットテストは add(2, 2) が 4 を返すことをアサートし、そうでなければビルドは赤くなります。ところがAI機能は、最初の一行でその契約を破ってしまうのです。同じプロンプトでも実行のたびに異なる文章が生成され、しかも「違う」ことは「間違い」を意味しないからです。モデルに対して #expect(summary == "the expected summary") と書くことはできません。期待される文字列がただ一つに定まらないためです。測定できるのは、自分で定義した基準に照らして、出力が十分に良いか、そしてそれが十分な頻度で起きているか、という点です。Appleの新しい Evaluations フレームワークは、開発ワークフローの一部として実行できる型安全なSwift APIを備えた、その測定ハーネスを提供します1。27リリースで新登場し、Appleの全プラットフォーム(iOS、iPadOS、macOS、visionOS、watchOS)で利用できます。アプリ内に組み込んで出荷するランタイム機能ではなく、テスト時に、通常はMac上で実行する開発ツールです1。
テストを書いたことがあれば、その形には馴染みを感じるでしょう。データセットを定義し、モデルの応答を生成し、メトリクスを適用し、結果を集計します。そして、どのアプローチが最も良い成績だったか、個々の応答がどこで基準に届かなかったかを読み取ります1。メンタルモデルとしては、モデル品質のためのXCTestです。ループは同じ(ケースを用意し、実行し、何かをアサートする)でありながら、アサーションが異なります(等価判定ではなく、採点されたメトリクス)。
セッション298でAppleは、この中核となる問題をこう位置づけています。生成AI機能は、ソフトウェアテストにとって根本的な契約を破ってしまう。同じ入力が異なる出力を生み出しうるため、ユニットテストでは不十分なのだ、と25。
TL;DR / 要点
Evaluationsフレームワークは27リリースでAppleの全プラットフォーム(iOS、iPadOS、macOS、visionOS、watchOS)に新登場した、インテリジェンスを活用した機能を測定するための開発ツール層であり、テストワークフローの一部として(通常はMac上で)実行します1。Evaluatorはインラインで書けるクロージャベースの評価器です。Evaluationプロトコルは、テスト対象システムをデータセットに対して実行し、評価器を適用するために実装する型です23。Metricは名前付きの結果をファクトリメソッド(passing、failing、scoring、ignore)を通じて運び、ScoreDimensionはモデルを審査員とする評価器のために採点軸に名前を付けます45。ModelSampleは汎用の評価サンプルです。SampleGeneratorは言語モデルから非同期ストリームとしてサンプルを生成するアクターで、結果はresponseColumnを含む型付きカラムを備えた DataFrame に格納されます678。ToolCallEvaluatorはエージェント的なツール呼び出しをTrajectoryExpectationに照らして検証し、ArgumentMatcherが各引数の検証方法を定義します91011。EvaluationTraitはテストの内部で評価を実行し、その結果をアタッチメントとして記録します。これが Swift Testing の実行へとつながる橋渡しとなります12。
本稿ではAPIの全体像をたどり、各要素がなぜ存在するのかを説明し、それが採点対象とする Foundation Models のツール呼び出しの仕事へと結びつけていきます。Appleが正確なシグネチャを公開していない呼び出しを示す箇所では、説明のための例であると明記し、ドキュメントで確認するよう注記します。
評価器のモデル
このフレームワークの中核となる問いは「この出力はどれだけ良かったか」であり、それに小さな語彙で答えます。評価器が判断し、メトリクスが記録し、スコアディメンションが採点し、結果が集計するのです。
Evaluation プロトコルは、評価を定義するために実装する型です。これはテスト対象システムをデータセットに対して実行し、評価器を適用してパフォーマンスを測定します3。宣言は最小限です。
// 27.0 beta (all Apple platforms)
protocol Evaluation : Sendable
このプロトコルが Sendable なのは、評価が並行処理だからです。多数のサンプルを並列で実行します。Swift Testing がデフォルトでテストケースを並列実行するのと同じやり方です13。再利用可能で名前の付いた評価が欲しいときには、このプロトコルを実装します。手早く済ませたいときには、代わりに Evaluator に手を伸ばします。Appleはこれを、カスタム型を定義せずインラインで使えるクロージャベースの評価器と説明しています2。
// 27.0 beta (all Apple platforms)
struct Evaluator<Input> where Input : SampleProtocol,
Input.ExpectedValue : Decodable,
Input.ExpectedValue : Encodable,
Input.ExpectedValue : Sendable
Appleの解説によれば、クロージャは入力サンプルと応答を受け取り、.value と .transcript の両方にアクセスできます2。.value はモデルの型付き出力であり、.transcript はそこに至るまでの記録です。インライン評価器は、モデル品質のための一行の #expect ブロックのようなものです。サブクラスは不要で、判断そのものをクロージャとして書くだけです。次の呼び出しの形は説明のための例です。イニシャライザはAppleのドキュメントで確認してください。
import Evaluations
// Illustrative call shape — confirm against Apple's docs.
let nonEmpty = Evaluator<ModelSample<String>> { input, response in
response.value.isEmpty ? .failing("empty output") : .passing()
}
クロージャが返すのは Metric です。Appleは Metric を、結果値を運ぶ名前付きメトリクスと説明し、ファクトリメソッドを明示しています。passing、failing、scoring、ignore はそれぞれ、結果を内部に保持した新しい Metric を返します4。
// 27.0 beta (all Apple platforms)
struct Metric
4つのファクトリは、AI機能が必要とする判断の種類に対応します。要約器は必須の事実を含めるか含めないかのどちらかなので、passing か failing を得ます。トーンを採点するルーブリックは1から5まであるので、scoring を得ます。集計から外したいサンプル(不正な入力や、既知の不良フィクスチャ)には ignore を与えます。これは行をデータセットに残しつつ、統計を汚さずに済ませてくれます。passing から採点される scoring までの幅こそ、このフレームワークが約束するものです。すなわち、単純な合否チェックから、モデルを審査員とするパターンによる詳細な採点までです1。
その幅の採点側で ScoreDimension がその真価を発揮します。Appleはこれを、モデル審査員の評価器のための名前付き採点ディメンションと定義しています。各ディメンションは、名前(DataFrameのカラムとして使われます)、任意の説明、そして各スコアが何を意味するかの定義を持ちます5。
// 27.0 beta (all Apple platforms)
struct ScoreDimension
一つの出力が、ある軸では良くても別の軸では悪いということがあります。下書きのメールが、事実としては正しくてもトーンとしては誤っていることもあります。ScoreDimension はそうした軸(正確さ、トーン、簡潔さ)を別々に採点させてくれるので、集計は単に全体の品質が下がったことだけでなく、どのディメンションが下がったかまで教えてくれます。ディメンション名はカラムになります。つまりスコアは、延々と続く散文の壁ではなく、並べ替えて比較できる構造化されたテーブルに格納されるのです。
そのテーブルが EvaluationResult です。Appleはこれを、モデル評価の実行結果と説明しています。評価実行のサマリーと詳細な結果を含む構造体です14。
// 27.0 beta (all Apple platforms)
struct EvaluationResult
サマリーと詳細という二層構造こそ、評価を実行可能なものにしてくれます。サマリーは「このプロンプトは前のものより良かったか」に答えます。詳細は「どのサンプルが基準に届かなかったか」に答え、最も悪い行を開いてモデルが何を生成したかを読み取れるようにします1。
サンプルと生成
評価には実行対象となるケースが必要で、フレームワークにおけるケースの単位がサンプルです。ModelSample はその汎用版です。Appleはこれを、文字列ベースのプロンプトと指示を受け付ける汎用の言語モデル評価サンプルと説明しています6。
// 27.0 beta (all Apple platforms)
struct ModelSample<ExpectedValue> where ExpectedValue : Decodable,
ExpectedValue : Encodable,
ExpectedValue : Sendable
ジェネリックな ExpectedValue は型付きの期待値です。自由記述のタスクなら文字列、既知の答えがあるタスクなら構造化された Codable 型になります。Codable と Sendable の制約は Evaluator の Input.ExpectedValue と一致します。期待値が結果テーブルへとシリアライズされ、並列実行中に並行処理の境界を越えなければならないためです。マルチモーダルなプロンプトについては、カスタムの準拠を作るか、あらかじめ構築されたプロンプトを使うイニシャライザを用いる、とAppleは注記しています6。
すべてのサンプルを手書きするのはスケールしません。だからこそ SampleGenerator が存在します。言語モデルを使って評価サンプルを生成するアクターです7。
// 27.0 beta (all Apple platforms)
actor SampleGenerator<SampleType> where SampleType : ModelSampleProtocol
これが actor なのは、変更可能な生成状態(受理されたサンプルと拒否されたサンプル)を所有し、非同期イテレーションがその状態を変更するからです。アクターの隔離は、その状態に対するデータ競合を防ぐSwiftの安全装置です。Appleのワークフローはこうです。ジェネレーターを作り、そのプロパティを設定し、それを呼び出して新しいサンプルを非同期ストリームとして生成する。イテレーションの後で、生成されたすべてのサンプル、あるいはバリデーターが拒否したものにアクセスできます7。立ち止まる価値があるのは、拒否されたサンプルの方です。不良サンプルを黙って捨ててしまうジェネレーターは、自身の失敗率を隠してしまうでしょう。拒否されたものを露わにすることで、手書きのフィクスチャを監査するのと同じようにデータセットを監査できます。
サンプルを実行すると、応答は型付きのカラム記述子を備えた DataFrame に格納されるので、文字列頼みの検索なしにテーブルを読み取れます。Appleは応答カラムをまさにこう名付けています。responseColumn、詳細な DataFrame におけるモデル応答のための型付きカラム記述子です8。
// 27.0 beta (all Apple platforms)
var responseColumn: ResultColumn<Self.Subject> { get }
カラムを型付きにしているのは ResultColumn<Value> というジェネリックです。これは DataFrame のカラムの記述子で、保持する値によってパラメータ化されています15。responseColumn と並んで、フレームワークは入力サンプルのための inputColumn と、期待値のための expectedColumn を公開しており、それぞれが型付きの ResultColumn です1617。型付きのカラムは、Swift Testing の式キャプチャと同じ発想です。型のない袋から値を取り出してキャストが通ることを祈るのではなく、自分の型を知っている記述子を通じて読み取るのです。平均、中央値、標準偏差を求めるために結果を MetricsAggregator に渡すとき、このカラムこそが、キーを推測せずにデータを指し示す手段となります18。
ツールと軌跡のチェック
テストが最も難しいAI機能は、エージェント的なものです。正しさが文字列ではなく、一連のアクションだからです。Foundation Models のセッションが OCRTool、次に BarcodeReaderTool、そして自前のカタログ検索を呼び出すとき、問われるのは「最終的な文が一致したか」ではなく「モデルは正しい経路をたどったか」です19。ToolCallEvaluator はその経路を直接採点します。Appleはこれを、エージェント的なツール呼び出しを期待される軌跡に照らして検証する評価器と説明しています9。
// 27.0 beta (all Apple platforms)
struct ToolCallEvaluator<Input> where Input : ModelSampleProtocol,
Input.Expectation == TrajectoryExpectation
where 句が肝心の部分です。入力の期待値は TrajectoryExpectation でなければなりません。Appleはこの型を、評価における期待されるツール呼び出しのパターンと説明しており、3つの軸にわたって指定されます10。
// 27.0 beta (all Apple platforms)
struct TrajectoryExpectation
Appleによれば、ToolCallEvaluator は順序付きシーケンス、順序を問わない期待、禁止ツールのチェック、そしてグループステップをサポートし、単一の評価パスから厳密な結果と部分的な結果の両方を生み出します9。それぞれが現実のエージェントの失敗に対応します。順序付きシーケンスは、正しいツールを誤った順序で呼び出すモデルを捕らえます。順序を問わない期待は「これらの呼び出しは、順序はともかく必ず起きなければならない」と言います。禁止ツールのチェックは、決して触れてはならないツールに手を伸ばすモデルを捕らえます(安全性の事例として、読み取り専用にとどまるべきエージェントが破壊的なツールを呼び出す場合などです)。グループステップは「これらのうちのいずれか一つ」を表現し、複数の経路が許容される分岐に対応します。
厳密と部分という対は、エージェント的な品質が実際に劣化していく様子に合致します。新しいプロンプトが機能を完璧から完全な破綻へと一気に変えることはまれです。むしろ「毎回正しい軌跡」から「ほとんどの場合は正しい軌跡だが、一つの呼び出しだけ順序が狂う」へと変えるのです。厳密な結果だけを返すと、それを一律の失敗として報告し、モデルがどれだけ惜しかったかについては何も教えてくれません。部分的な結果はその惜しい失敗を定量化します。これこそチューニングの拠り所となるシグナルです。
呼び出しごとの正しさは、もう一段下の引数に宿ります。モデルは正しいツールを誤った値で呼び出すこともあり、ArgumentMatcher が各引数の検証方法を定義します。Appleはこれを、ツール呼び出しの引数をどう検証するかを定義する値と説明しています11。
// 27.0 beta (all Apple platforms)
enum ArgumentMatcher
Appleの解説は検証ルールを列挙しています。厳密な値を要求する、キーの存在を検証する、範囲をチェックする、パターンに照合する、あるいは意味的な照合のために言語モデルを使う、というものです11。意味的な照合の事例こそ、単純な等価アサーションでは表現できないものです。ツール引数が自由記述のクエリであれば、二つの異なる文字列が等しく正しいということがあり、通常の == なら申し分ない呼び出しを不合格にしてしまうでしょう。その引数をモデルを審査員とする照合に委ねることは、ScoreDimension が出力レベルで提供するのと同じ逃げ道を、引数レベルに適用したものです。ケースの綴りはAppleの列挙に由来します。次は説明のための例なので、ドキュメントで確認してください。
import Evaluations
// Illustrative — confirm shapes against Apple's docs.
let expectation = TrajectoryExpectation(/* ordered / unordered / disallowed steps */)
let evaluator = ToolCallEvaluator<ModelSample<String>>(/* expectation */)
ここでのエージェント的なループは、Foundation Models のツール呼び出しに関する記事がランタイム側から説明しているものと同じです。そちらでは GenerationOptions.ToolCallingMode が、オンデバイスモデルがどれだけ積極的にツールに手を伸ばすかを左右し、フレームワークは最初の呼び出しの後にモードを切り替えて、リクエストのツール活動を抑制できます19。ToolCallEvaluator はその同じ振る舞いの測定側です。ランタイムで呼び出しの姿勢を設定し、その後テスト時に軌跡を採点して、その姿勢が意図した経路を生み出したことを確認します。ランタイムのつまみとテスト時の評価器は、一つの機能の両端なのです。
ワークフローへの組み込み方
評価は、四半期に一度実行する別個の儀式ではありません。テストの隣、同じループの中、同じMac上に居場所があります。フレームワークがそのループへとつなぐ橋が EvaluationTrait です。Appleはこれを、評価を実行し、その結果をアタッチメントとして記録するテストトレイトと説明しています12。
// 27.0 beta (all Apple platforms)
struct EvaluationTrait
「トレイト」という言葉は意図的なものです。Swift Testing の設定モデルそのものが、@Test や @Suite の宣言に適用されるトレイトです。.enabled(if:)、.disabled(_:)、.tags(...) などです13。EvaluationTrait は評価をその語彙へと組み込むので、評価はテストと同じように、同じ swift test の呼び出しのもとで、同じ並列性で実行されます。結果をアタッチメントとして記録することは、Swift Testing がすでに持つカスタムアタッチメントの仕組みを再利用するので、評価の詳細な結果が、収集するテストレポートやCIアーティファクトに付随して運ばれます13。フレームワークはさらに EvaluationContext を公開しており、テストスコープ内のコードが評価完了後に結果を読み取れるようにしています20。
そのトレイトが「評価はどこに居るのか」に答えてくれます。評価はテストターゲットの中、ユニットテストの隣に居て、同じトレイトでゲートされます。.tags(.evals) というアノテーションは、.tags(.regression) がリグレッション実行の範囲を限定するのと同じやり方で、プロンプト変更の後にモデル品質チェックだけを実行します13。速いユニットスタイルのテストは編集のたびにグリーンを保ち、より遅いモデル駆動の評価は、モデルに触れるプロンプトやツール定義に対して実行されます。
評価とテストの分担は、エージェント的ワークフローの記事が描くランタイムとツールの分担を映し出しています。そこではアプリが出荷するオンデバイスモデルと、開発者がアプリを書くために実行するツールモデルとの間に線が引かれています21。Evaluations はその線のビルド側に位置します。反復作業の最中に実行する27サイクルの開発ツールであり、出荷するランタイム機能が十分に良いかどうかを測定します1。XCTest を出荷しないのと同じく、Evaluations フレームワークをユーザーに出荷することはありません。出荷するのは、それが生み出す確信です。
フレームワークはまた、どのモデルを採点するかについて開かれたままです。Appleは、コードから利用できるあらゆるモデルで動作すると注記しており、データセット側は Loader を通じて供給されます。これはデータセットを供給する型のためのプロトコルで、組み込みの具象型を使うか、自前のソースのためにカスタムの準拠を実装します122。モデルを審査員とする採点では、ModelJudgeEvaluator がクエリ、応答、そして任意の参照データを審査員モデルに送り、それが一つ以上のディメンションのスコアを返します23。審査員のプロンプトは ModelJudgePrompt を通じて設定でき、これは指示、応答の提示方法、参照データの注入を一つの合成可能な値にまとめます24。スタックがすでに信頼しているモデルがそれであれば、自前のコードパスを通じて Claude を審査員に使ってください。フレームワークは一つのモデルに縛りつけることはありません。
FAQ
Evaluations フレームワークとは何で、どのプラットフォームで動作しますか?
Evaluations フレームワークは、開発ワークフローに統合される型安全なSwift APIを使って、アプリのインテリジェンスを活用した機能の品質を測定します1。27リリースでiOS、iPadOS、macOS、visionOS、watchOS にわたって新登場した、テスト時に(通常はMac上で)実行する開発ツールのフレームワークであり、アプリ内に組み込んで出荷するランタイム機能ではありません1。データセットを定義し、モデルの応答を生成し、メトリクスを適用し、結果を集計します。そして、どのアプローチが最も良い成績だったか、個々の応答がどこで基準に届かなかったかを読み取ります1。
なぜAI機能にXCTestやSwift Testingの等価アサーションを使えないのですか?
等価アサーションには期待される値が一つ必要ですが、非決定的なモデルにはそれがありません。同じプロンプトが実行のたびに異なる妥当な出力を生み出しうるからです。Evaluations は等価判定を採点された判断で置き換えます。Metric は passing、failing、scoring、ignore の結果を記録し、ScoreDimension は名前付きの軸で出力を採点します45。評価は依然としてテストの中で、EvaluationTrait を通じて実行するので、他のテストと同じターゲット、同じ swift test のループの中に居ます12。
フレームワークはエージェント的なツール呼び出しの振る舞いをどう評価しますか?
ToolCallEvaluator を通じてです。これはエージェント的なツール呼び出しを期待される軌跡に照らして検証します9。経路を3つの軸にわたる TrajectoryExpectation として記述します。評価器は順序付きシーケンス、順序を問わない期待、禁止ツールのチェック、グループステップをサポートし、一つのパスから厳密な結果と部分的な結果の両方を生み出します910。引数ごとの検証には ArgumentMatcher を使います(厳密な値、キーの存在、範囲、パターン、あるいはモデルベースの意味的照合)11。
Evaluator と Evaluation プロトコルの違いは何ですか?
Evaluator は、カスタム型を定義せずインラインで使えるクロージャベースの評価器です。そのクロージャは入力サンプルと応答を受け取り、.value と .transcript にアクセスできます2。Evaluation プロトコルは、テスト対象システムをデータセットに対して実行し、評価器を適用する、再利用可能で名前の付いた評価を定義するために実装する型です3。手早いインラインのチェックには Evaluator を、構造化された反復可能なものには Evaluation プロトコルに手を伸ばしてください。
生成されたサンプルと結果はどこに居ますか?
SampleGenerator は、言語モデルから非同期ストリームとしてサンプルを生成するアクターです。イテレーションの後、受理されたサンプル、あるいはバリデーターが拒否したものを読み取れます7。結果は型付きの ResultColumn 記述子を備えた DataFrame に格納されます。responseColumn、inputColumn、expectedColumn です8161715。MetricsAggregator がそのデータについて平均、中央値、標準偏差を計算します18。
Apple Ecosystem クラスター全体はこちらです。Foundation Models フレームワークの解説、ランタイムとツールのLLMの区別、このフレームワークが採点するiOS 27 のツール呼び出し制御、そして EvaluationTrait が組み込まれるトレイトモデルを持つSwift Testing と XCTest。ハブはApple Ecosystem シリーズにあります。AIエージェントを伴うiOSのより広い文脈については、iOS Agent Development ガイドをご覧ください。
-
Apple Developer, “Evaluations” framework overview. Available iOS 27.0, iPadOS 27.0, Mac Catalyst 27.0, macOS 27.0, visionOS 27.0, watchOS 27.0 (all beta). Abstracted as “measure the quality of your app’s intelligence-powered features.” Apple’s discussion states you define datasets, generate model responses, apply metrics, and aggregate results with type-safe Swift APIs that integrate into your development workflow; the framework evaluates features against metrics from simple pass or fail checks to detailed scoring with model-as-judge patterns, aggregates results into summaries that show which approach performs best and where individual responses fall short, and works with any model available to your code. (iOS 27.0+ beta, all Apple platforms) ↩↩↩↩↩↩↩↩↩↩↩
-
Apple Developer, “Evaluator”. A structure (
struct Evaluator<Input>withInput : SampleProtocolandInput.ExpectedValueconforming toDecodable,Encodable,Sendable) abstracted as a closure-based evaluator; Apple’s discussion states the closure receives the input sample and the response, providing access to.valueand.transcript. (iOS 27.0+ beta, all Apple platforms) ↩↩↩↩ -
Apple Developer, “Evaluation”. A protocol (
protocol Evaluation : Sendable) abstracted as a type that defines an evaluation; Apple’s discussion states the evaluation runs your system under test against a dataset and applies evaluators to measure performance. (iOS 27.0+ beta, all Apple platforms) ↩↩↩ -
Apple Developer, “Metric”. A structure (
struct Metric) abstracted as a named metric that carries a result value; Apple’s discussion states the factory methodspassing,failing,scoring, andignorereturn a newMetricwith the result stored inside. (iOS 27.0+ beta, all Apple platforms) ↩↩↩ -
Apple Developer, “ScoreDimension”. A structure (
struct ScoreDimension) abstracted as a named scoring dimension for a model judge evaluator; Apple’s discussion states each dimension defines a name (used as the DataFrame column), an optional description, and a definition of what each score means. (iOS 27.0+ beta, all Apple platforms) ↩↩↩ -
Apple Developer, “ModelSample”. A structure (
struct ModelSample<ExpectedValue>withExpectedValueconforming toDecodable,Encodable,Sendable) abstracted as a general-purpose language model evaluation sample; Apple’s discussion states it accepts string-based prompts and instructions, and that multimodal prompts use a custom conformance or an initializer with a prebuilt prompt. (iOS 27.0+ beta, all Apple platforms) ↩↩↩ -
Apple Developer, “SampleGenerator”. Declared
actor SampleGenerator<SampleType>withSampleType : ModelSampleProtocol, abstracted as an actor that generates evaluation samples using a language model; Apple’s discussion states you create a generator, configure its properties, then call it to produce new samples as an async stream, after which you access all generated samples or any the validator rejected. (iOS 27.0+ beta, all Apple platforms) ↩↩↩↩ -
Apple Developer, “responseColumn”. An instance property (
var responseColumn: ResultColumn<Self.Subject> { get }) abstracted as a typed column descriptor for the model responses in the detailed DataFrame. (iOS 27.0+ beta, all Apple platforms) ↩↩↩ -
Apple Developer, “ToolCallEvaluator”. A structure (
struct ToolCallEvaluator<Input>withInput : ModelSampleProtocolandInput.Expectation == TrajectoryExpectation) abstracted as an evaluator that verifies agentic tool calls against an expected trajectory; Apple’s discussion states it produces both a strict and partial result from a single evaluation pass and supports ordered sequences, unordered expectations, disallowed tool checks, and group steps. (iOS 27.0+ beta, all Apple platforms) ↩↩↩↩↩ -
Apple Developer, “TrajectoryExpectation”. A structure (
struct TrajectoryExpectation) abstracted as the expected pattern of tool calls for an evaluation; Apple’s discussion states it specifies expected tool-calling behavior across three axes. (iOS 27.0+ beta, all Apple platforms) ↩↩↩ -
Apple Developer, “ArgumentMatcher”. An enumeration (
enum ArgumentMatcher) abstracted as the values that define how to validate a tool-call argument; Apple’s discussion states you can require exact values, verify key presence, check ranges, match patterns, or use a language model for semantic matching. (iOS 27.0+ beta, all Apple platforms) ↩↩↩↩ -
Apple Developer, “EvaluationTrait”. A structure (
struct EvaluationTrait) abstracted as a test trait that runs an evaluation and records the result as attachments. (iOS 27.0+ beta, all Apple platforms) ↩↩↩ -
Author’s analysis in Swift Testing: The Framework Replacing XCTest, May 2, 2026, covering
@Test,@Suite,#expect,#require, parallel-by-default execution, custom attachments, and the trait vocabulary (.enabled(if:),.disabled(_:),.serialized,.timeLimit(...),.tags(...),.bug(...)) thatEvaluationTraitextends, with citations to Apple’s Swift Testing and Trait references. ↩↩↩↩ -
Apple Developer, “EvaluationResult”. A structure (
struct EvaluationResult) abstracted as the results of running a model evaluation; Apple’s discussion states it contains the summary and detailed results from an evaluation run. (iOS 27.0+ beta, all Apple platforms) ↩ -
Apple Developer, “ResultColumn”. A structure (
struct ResultColumn<Value>) abstracted as a typed descriptor for a column in an evaluation result DataFrame. (iOS 27.0+ beta, all Apple platforms) ↩↩ -
Apple Developer, “inputColumn”. An instance property (
var inputColumn: ResultColumn<Self.Sample> { get }) abstracted as a typed column descriptor for the input samples in the detailed DataFrame. (iOS 27.0+ beta, all Apple platforms) ↩↩ -
Apple Developer, “expectedColumn”. An instance property (
var expectedColumn: ResultColumn<Self.Sample.ExpectedValue> { get }) abstracted as a typed column descriptor for the expected values in the detailed DataFrame. (iOS 27.0+ beta, all Apple platforms) ↩↩ -
Apple Developer, “MetricsAggregator”. A structure (
struct MetricsAggregator) abstracted as a utility for computing aggregate statistics from evaluation metrics; Apple’s discussion states it calculates summary statistics like mean, median, and standard deviation, processing metric data from a DataFrame to produce aggregated results. (iOS 27.0+ beta, all Apple platforms) ↩↩ -
Author’s analysis in Foundation Models in iOS 27: Tool-Calling Control, June 8, 2026, covering
GenerationOptions.ToolCallingMode, the framework’s after-first-call mode shift, and the built-in Vision toolsOCRToolandBarcodeReaderTool. ↩↩ -
Apple Developer, “EvaluationContext”. A structure (
struct EvaluationContext) abstracted as a context that provides the evaluation result within a test scope; Apple’s discussion states you access the result after the evaluation completes. (iOS 27.0+ beta, all Apple platforms) ↩ -
Author’s analysis in Foundation Models Agentic Workflow: In-App vs Tooling LLM, May 1, 2026, on the runtime/tooling LLM distinction and the trust boundary between the shipped on-device model and the developer’s tooling model. ↩
-
Apple Developer, “Loader”. A protocol (
protocol Loader<Sample> : Sendable) abstracted as a protocol for types that supply a dataset for evaluation; Apple’s discussion states you use one of the built-in concrete types or implement the protocol directly for custom data sources. (iOS 27.0+ beta, all Apple platforms) ↩ -
Apple Developer, “ModelJudgeEvaluator”. A structure (
struct ModelJudgeEvaluator<Input>withInput : ModelSampleProtocol) abstracted as an evaluator that uses a language model as a judge to score responses; Apple’s discussion states it sends the query, response, and optional reference data to a judge model that returns scores for one or more dimensions. (iOS 27.0+ beta, all Apple platforms) ↩ -
Apple Developer, “ModelJudgePrompt”. A structure (
struct ModelJudgePrompt<Input>withInput : ModelSampleProtocol) abstracted as a configuration for how a model-as-judge evaluator constructs its prompt; Apple’s discussion states it bundles the instructions, response presentation, and reference-data injection into a single composable value. (iOS 27.0+ beta, all Apple platforms) ↩ -
Apple, WWDC26 session 298, Meet the Evaluations framework. Apple states generative-AI features “break a contract that is fundamental to software testing” because “the same input can produce different outputs,” and concludes that “unit tests are insufficient.” ↩