Evaluations: XCTest dla jakości modeli (iOS 27)
Zwykły test jednostkowy stwierdza, że add(2, 2) zwraca 4, a jeśli tak nie jest, kompilacja świeci się na czerwono. Funkcja AI łamie ten kontrakt już w pierwszej linijce, ponieważ ten sam prompt może przy każdym uruchomieniu wytworzyć inne zdanie, a „inne” nie znaczy „błędne”. Wobec modelu nie da się napisać #expect(summary == "the expected summary"), bo nie istnieje jeden oczekiwany ciąg znaków. Zmierzyć można natomiast to, czy wynik jest wystarczająco dobry, wystarczająco często, względem kryteriów, które sami zdefiniujemy. Nowy framework Evaluations od Apple daje właśnie takie narzędzie pomiarowe, z bezpiecznymi typowo interfejsami API w języku Swift, które działają jako część procesu programistycznego1. Jest nowością w wydaniu 27 i dostępny na wszystkich platformach Apple (iOS, iPadOS, macOS, visionOS oraz watchOS): to narzędzie deweloperskie uruchamiane na etapie testów, zazwyczaj na Macu, a nie funkcja działająca w czasie wykonania, dostarczana wewnątrz aplikacji1.
Jeśli pisało się już testy, ta struktura wyda się znajoma. Definiuje się zbiór danych, generuje odpowiedzi modelu, stosuje metryki i agreguje wyniki, a następnie odczytuje, które podejście wypadło najlepiej i gdzie poszczególne odpowiedzi nie spełniły oczekiwań1. Modelem mentalnym jest tu XCTest dla jakości modeli: ta sama pętla (przygotować przypadek, uruchomić go, coś stwierdzić), tylko inna asercja (oceniana metryka zamiast równości).
W sesji 298 Apple ujmuje główny problem tak: funkcje generatywnej AI łamią kontrakt fundamentalny dla testowania oprogramowania, ponieważ to samo wejście może wytworzyć różne wyjścia, co sprawia, że testy jednostkowe są niewystarczające25.
TL;DR / Najważniejsze wnioski
- Framework
Evaluationsto nowość w wydaniu 27 na wszystkich platformach Apple (iOS, iPadOS, macOS, visionOS, watchOS) — warstwa narzędzi deweloperskich do mierzenia funkcji wykorzystujących inteligencję, uruchamiana jako część procesu testowania (zazwyczaj na Macu)1. Evaluatorto oparty na domknięciu ewaluator, który pisze się w linii; protokółEvaluationto typ, który implementuje się, aby uruchomić testowany system na zbiorze danych i zastosować ewaluatory23.Metricprzenosi nazwany wynik za pośrednictwem metod fabrycznych (passing,failing,scoring,ignore), aScoreDimensionnadaje nazwę ocenianej osi dla ewaluatora typu model-sędzia45.ModelSampleto próbka ewaluacyjna ogólnego przeznaczenia;SampleGeneratorto aktor, który generuje próbki z modelu językowego w postaci strumienia asynchronicznego; wyniki trafiają do struktury DataFrame z typowanymi kolumnami, w tymresponseColumn678.ToolCallEvaluatorweryfikuje agentowe wywołania narzędzi względemTrajectoryExpectation, aArgumentMatcherdefiniuje sposób walidacji każdego argumentu91011.EvaluationTraituruchamia ewaluację wewnątrz testu i zapisuje wynik jako załączniki, co stanowi pomost do uruchomienia w Swift Testing12.
Artykuł przechodzi przez powierzchnię API, wyjaśnia, dlaczego istnieje każdy z elementów, i wiąże to z pracą nad tool-callingiem w Foundation Models, którą framework ocenia. Tam, gdzie pokazuję wywołanie, którego dokładnej sygnatury Apple nie opublikowało, oznaczam je jako poglądowe i zachęcam do potwierdzenia w dokumentacji.
Model ewaluatora
Głównym pytaniem frameworka jest „jak dobre było to wyjście”, a odpowiada na nie niewielkim słownictwem: ewaluator rozstrzyga, metryka zapisuje, wymiar oceny ocenia, a wynik agreguje.
Protokół Evaluation to typ, który implementuje się, aby zdefiniować ewaluację uruchamiającą testowany system na zbiorze danych i stosującą ewaluatory do pomiaru wydajności3. Deklaracja jest minimalna:
// 27.0 beta (all Apple platforms)
protocol Evaluation : Sendable
Protokół jest Sendable, ponieważ ewaluacja to praca współbieżna: wiele próbek uruchamianych równolegle, tak samo jak Swift Testing domyślnie uruchamia przypadki testowe równolegle13. Protokół implementuje się wtedy, gdy potrzebna jest ewaluacja wielokrotnego użytku, opatrzona nazwą. Gdy potrzeba czegoś szybkiego, sięga się zamiast tego po Evaluator, który Apple opisuje jako oparty na domknięciu ewaluator do użytku w linii, bez definiowania własnego typu2:
// 27.0 beta (all Apple platforms)
struct Evaluator<Input> where Input : SampleProtocol,
Input.ExpectedValue : Decodable,
Input.ExpectedValue : Encodable,
Input.ExpectedValue : Sendable
Omówienie Apple precyzuje, że domknięcie otrzymuje próbkę wejściową oraz odpowiedź, z dostępem zarówno do .value, jak i do .transcript2. .value to typowane wyjście modelu; .transcript to zapis tego, jak do niego doszło. Ewaluator w linii jest jak jednowierszowy blok #expect dla jakości modelu: bez podklasy, sam osąd zapisany jako domknięcie. Poniższa postać wywołania jest poglądowa; inicjalizator należy potwierdzić w dokumentacji 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()
}
To, co zwraca domknięcie, jest typu Metric. Apple opisuje Metric jako nazwaną metrykę, która przenosi wartość wyniku, i wprost wymienia metody fabryczne: passing, failing, scoring oraz ignore zwracają nowy Metric z wynikiem zapisanym wewnątrz4:
// 27.0 beta (all Apple platforms)
struct Metric
Cztery fabryki odpowiadają rodzajom osądu, których potrzebuje funkcja AI. Streszczacz albo zawiera wymagany fakt, albo nie, więc otrzymuje passing lub failing. Rubryka oceniająca ton biegnie od 1 do 5, więc otrzymuje scoring. Próbka, którą chce się wyłączyć z agregatu (zniekształcone wejście, znana wadliwa fikstura), otrzymuje ignore, co pozostawia wiersz w zbiorze danych, nie zanieczyszczając statystyk. Rozpiętość od passing po oceniane scoring to dokładnie to, co framework obiecuje: od prostych sprawdzeń typu zdał/nie zdał aż po szczegółowe ocenianie ze wzorcami typu model-sędzia1.
Oceniany kraniec tej rozpiętości to miejsce, w którym ScoreDimension zdobywa swoją rację bytu. Apple definiuje go jako nazwany wymiar oceny dla ewaluatora typu model-sędzia, gdzie każdy wymiar definiuje nazwę (używaną jako kolumna DataFrame), opcjonalny opis oraz określenie, co oznacza każda ocena5:
// 27.0 beta (all Apple platforms)
struct ScoreDimension
Pojedyncze wyjście może być dobre na jednej osi, a złe na innej. Sporządzony e-mail może być poprawny faktograficznie, a błędny pod względem tonu. ScoreDimension pozwala oceniać te osie osobno (poprawność, ton, zwięzłość), tak by agregat mówił, który wymiar spadł, a nie tylko że spadła jakość ogólna. Nazwa wymiaru staje się kolumną, co oznacza, że oceny trafiają do uporządkowanej tabeli, którą można sortować i porównywać, a nie do ściany prozy.
Tą tabelą jest EvaluationResult. Apple opisuje go jako wyniki uruchomienia ewaluacji modelu, czyli strukturę zawierającą podsumowanie oraz szczegółowe wyniki przebiegu ewaluacji14:
// 27.0 beta (all Apple platforms)
struct EvaluationResult
To właśnie dwupoziomowa postać (podsumowanie plus szczegóły) sprawia, że ewaluacje nadają się do działania. Podsumowanie odpowiada na pytanie „czy ten prompt wypadł lepiej od poprzedniego”. Szczegóły odpowiadają na pytanie „które próbki nie spełniły oczekiwań”, abyś mógł otworzyć najgorsze wiersze i odczytać, co wytworzył model1.
Próbki i generowanie
Ewaluacja potrzebuje przypadków, na których się uruchomi, a jednostką przypadku we frameworku jest próbka. ModelSample to ta ogólnego przeznaczenia. Apple opisuje ją jako próbkę ewaluacyjną modelu językowego ogólnego przeznaczenia, która przyjmuje prompty i instrukcje oparte na ciągach znaków6:
// 27.0 beta (all Apple platforms)
struct ModelSample<ExpectedValue> where ExpectedValue : Decodable,
ExpectedValue : Encodable,
ExpectedValue : Sendable
Generyczny ExpectedValue to typowane oczekiwanie: ciąg znaków dla zadania z tekstem swobodnym, ustrukturyzowany typ Codable dla zadania ze znaną odpowiedzią. Ograniczenia Codable oraz Sendable odpowiadają Input.ExpectedValue z Evaluator, ponieważ oczekiwanie musi zostać zserializowane do tabeli wyników i przekroczyć granice współbieżności podczas przebiegu równoległego. W przypadku promptów multimodalnych Apple zaznacza, że tworzy się własną zgodność lub korzysta z inicjalizatora z gotowym promptem6.
Ręczne pisanie każdej próbki nie skaluje się, dlatego istnieje SampleGenerator — aktor, który generuje próbki ewaluacyjne przy użyciu modelu językowego7:
// 27.0 beta (all Apple platforms)
actor SampleGenerator<SampleType> where SampleType : ModelSampleProtocol
Jest to actor, ponieważ posiada zmienny stan generowania (próbki przyjęte i odrzucone), który modyfikuje asynchroniczna iteracja, a izolacja aktora to zabezpieczenie Swifta przed wyścigami danych na tym stanie. Przebieg pracy według Apple: utworzyć generator, skonfigurować jego właściwości, a następnie wywołać go, aby wytworzył nowe próbki w postaci strumienia asynchronicznego; po iteracji uzyskuje się dostęp do wszystkich wygenerowanych próbek lub do tych, które walidator odrzucił7. Wart zatrzymania się jest właśnie zbiór odrzuconych. Generator, który po cichu odrzucałby wadliwe próbki, ukryłby własny współczynnik niepowodzeń; ujawnienie odrzutów pozwala audytować zbiór danych tak, jak audytuje się fikstury pisane ręcznie.
Po uruchomieniu próbek odpowiedzi trafiają do struktury DataFrame z typowanymi deskryptorami kolumn, więc tabelę odczytuje się bez wyszukiwań opartych na ciągach znaków. Apple nazywa kolumnę odpowiedzi dokładnie: responseColumn, czyli typowany deskryptor kolumny dla odpowiedzi modelu w szczegółowej strukturze DataFrame8:
// 27.0 beta (all Apple platforms)
var responseColumn: ResultColumn<Self.Subject> { get }
To generyczny ResultColumn<Value> sprawia, że kolumna jest typowana: deskryptor kolumny DataFrame, sparametryzowany wartością, którą przechowuje15. Obok responseColumn framework udostępnia inputColumn dla próbek wejściowych oraz expectedColumn dla wartości oczekiwanych, każda jako typowany ResultColumn1617. Typowane kolumny to ten sam odruch co przechwytywanie wyrażeń w Swift Testing: zamiast wyciągać wartość z nietypowanego worka i liczyć, że rzutowanie się powiedzie, odczytuje się ją przez deskryptor, który zna swój typ. Gdy podaje się wyniki do MetricsAggregator w celu wyliczenia średniej, mediany i odchylenia standardowego, to właśnie kolumny są sposobem na adresowanie danych bez zgadywania kluczy18.
Sprawdzanie narzędzi i trajektorii
Najtrudniejszą do przetestowania funkcją AI jest funkcja agentowa, ponieważ poprawność nie jest ciągiem znaków, lecz sekwencją działań. Gdy sesja Foundation Models wywołuje OCRTool, następnie BarcodeReaderTool, a potem twoje własne wyszukiwanie w katalogu, pytanie nie brzmi „czy zdanie końcowe się zgadzało”, lecz „czy model obrał właściwą ścieżkę”19. ToolCallEvaluator ocenia tę ścieżkę bezpośrednio. Apple opisuje go jako ewaluator, który weryfikuje agentowe wywołania narzędzi względem oczekiwanej trajektorii9:
// 27.0 beta (all Apple platforms)
struct ToolCallEvaluator<Input> where Input : ModelSampleProtocol,
Input.Expectation == TrajectoryExpectation
Klauzula where jest częścią nośną: oczekiwanie wejścia musi być typu TrajectoryExpectation. Apple opisuje ten typ jako oczekiwany wzorzec wywołań narzędzi dla ewaluacji, określany wzdłuż trzech osi10:
// 27.0 beta (all Apple platforms)
struct TrajectoryExpectation
Apple podaje, że ToolCallEvaluator obsługuje sekwencje uporządkowane, oczekiwania nieuporządkowane, sprawdzenia narzędzi zabronionych oraz kroki grupowe i z jednego przebiegu ewaluacji wytwarza zarówno wynik ścisły, jak i częściowy9. Każde z nich odpowiada rzeczywistej porażce agenta. Sekwencje uporządkowane wychwytują model, który wywołuje właściwe narzędzia w niewłaściwej kolejności. Oczekiwania nieuporządkowane mówią „te wywołania muszą nastąpić, niezależnie od kolejności”. Sprawdzenia narzędzi zabronionych wychwytują model, który sięga po narzędzie, którego nigdy nie powinien dotykać (przypadek bezpieczeństwa: agent wywołujący narzędzie destrukcyjne, gdy powinien pozostać tylko do odczytu). Kroki grupowe wyrażają „dowolne jedno z tych”, dla rozgałęzień, w których dopuszczalna jest więcej niż jedna ścieżka.
Para ścisły-plus-częściowy pasuje do tego, jak jakość agentowa faktycznie się degraduje. Nowy prompt rzadko przeprowadza funkcję od doskonałej do zepsutej; przeprowadza ją od „właściwej trajektorii za każdym razem” do „właściwej trajektorii przez większość czasu, z jednym wywołaniem poza kolejnością”. Wynik wyłącznie ścisły zgłasza to jako jednolitą porażkę i nie mówi nic o tym, jak blisko był model. Wynik częściowy kwantyfikuje te niemal-trafienia, czyli sygnał, względem którego się stroi.
Poprawność każdego wywołania mieści się o poziom niżej, w argumentach. Model może wywołać właściwe narzędzie z niewłaściwymi wartościami, a ArgumentMatcher definiuje sposób walidacji każdego argumentu. Apple opisuje go jako wartości, które definiują, jak walidować argument wywołania narzędzia11:
// 27.0 beta (all Apple platforms)
enum ArgumentMatcher
Omówienie Apple wymienia reguły walidacji: wymagać dokładnych wartości, weryfikować obecność klucza, sprawdzać zakresy, dopasowywać wzorce lub użyć modelu językowego do dopasowania semantycznego11. Przypadek dopasowania semantycznego to ten, którego zwykła asercja równości nie potrafi wyrazić. Jeśli argument narzędzia jest zapytaniem w tekście swobodnym, dwa różne ciągi znaków mogą być jednakowo poprawne, a zwykłe == odrzuciłoby całkowicie dobre wywołanie. Oddanie tego argumentu dopasowaniu typu model-sędzia to ta sama furtka, którą ScoreDimension zapewnia na poziomie wyjścia, zastosowana na poziomie argumentu. Pisownia przypadków pochodzi z wyliczenia Apple; poniższe jest poglądowe, więc należy potwierdzić je w dokumentacji:
import Evaluations
// Illustrative — confirm shapes against Apple's docs.
let expectation = TrajectoryExpectation(/* ordered / unordered / disallowed steps */)
let evaluator = ToolCallEvaluator<ModelSample<String>>(/* expectation */)
Pętla agentowa, o której tu mowa, to ta sama, którą artykuł o tool-callingu w Foundation Models opisuje od strony czasu wykonania. Tam GenerationOptions.ToolCallingMode rządzi tym, jak agresywnie model działający na urządzeniu sięga po narzędzia, a framework może przełączyć tryb po pierwszym wywołaniu, by ograniczyć aktywność narzędziową żądania19. ToolCallEvaluator to pomiarowa strona tego samego zachowania: ustawia się postawę wywoływania w czasie wykonania, a następnie ocenia trajektorię na etapie testów, by potwierdzić, że ta postawa wytworzyła zamierzoną ścieżkę. Pokrętło czasu wykonania i ewaluator etapu testów to dwa końce jednej funkcji.
Jak to wpasowuje się w proces pracy
Ewaluacje nie są osobnym rytuałem przeprowadzanym co kwartał. Ich miejsce jest obok testów, w tej samej pętli, uruchamiane na tym samym Macu. Pomostem frameworka do tej pętli jest EvaluationTrait. Apple opisuje go jako trait testowy, który uruchamia ewaluację i zapisuje wynik jako załączniki12:
// 27.0 beta (all Apple platforms)
struct EvaluationTrait
Słowo „trait” jest celowe. Cały model konfiguracji Swift Testing opiera się na traitach stosowanych do deklaracji @Test i @Suite: .enabled(if:), .disabled(_:), .tags(...) i pozostałych13. EvaluationTrait wpasowuje ewaluację w to słownictwo, więc ewaluacja działa tak, jak działa test, w ramach tego samego wywołania swift test, z tą samą równoległością. Zapisanie wyniku jako załączników ponownie wykorzystuje mechanizm, który Swift Testing ma już do załączników niestandardowych, dzięki czemu szczegółowy wynik ewaluacji wędruje wraz z raportem testów i artefaktami CI, które zbierasz13. Framework udostępnia też EvaluationContext, aby kod w zasięgu testu mógł odczytać wynik po zakończeniu ewaluacji20.
Ten trait odpowiada na pytanie „gdzie żyją ewaluacje”. Żyją w twoim celu testowym, obok testów jednostkowych, bramkowane przez te same traity. Adnotacja .tags(.evals) uruchamia wyłącznie sprawdzenia jakości modelu po zmianie promptu, tak jak .tags(.regression) zawęża przebieg regresji13. Szybkie testy w stylu jednostkowym pozostają zielone przy każdej edycji; wolniejsze ewaluacje sterowane modelem uruchamiają się na promptach i definicjach narzędzi, które dotykają modelu.
Podział na ewaluacje i testy odzwierciedla podział na czas wykonania i narzędzia z artykułu o procesie agentowym, który kreśli granicę między modelem na urządzeniu, dostarczanym przez aplikację, a modelem narzędziowym, który deweloper uruchamia, by napisać aplikację21. Evaluations sytuuje się po stronie kompilacji tej granicy: narzędzie deweloperskie cyklu 27, uruchamiane podczas iteracji, które mierzy, czy dostarczana funkcja czasu wykonania jest wystarczająco dobra1. Frameworka Evaluations nie dostarcza się użytkownikom, tak samo jak nie dostarcza się XCTest. Dostarcza się pewność, którą on wytwarza.
Framework pozostaje też otwarty co do tego, który model się ocenia. Apple zaznacza, że działa on z dowolnym modelem dostępnym dla twojego kodu, a strona zbioru danych zasilana jest przez Loader — protokół dla typów, które dostarczają zbiór danych, z wbudowanymi typami konkretnymi lub własną zgodnością dla twoich źródeł122. Przy ocenianiu typu model-sędzia ModelJudgeEvaluator wysyła zapytanie, odpowiedź oraz opcjonalne dane referencyjne do modelu sędziego, który zwraca oceny dla jednego lub wielu wymiarów23, przy czym prompt sędziego konfiguruje się przez ModelJudgePrompt, który łączy instrukcje, sposób prezentacji odpowiedzi oraz wstrzykiwanie danych referencyjnych w jedną komponowalną wartość24. Użyj Claude przez własną ścieżkę kodu jako sędziego, jeśli to model, któremu twój stos już ufa; framework nie przywiązuje cię do jednego.
FAQ
Czym jest framework Evaluations i na jakiej platformie działa?
Framework Evaluations mierzy jakość funkcji twojej aplikacji wykorzystujących inteligencję za pomocą bezpiecznych typowo interfejsów API w języku Swift, które integrują się z twoim procesem programistycznym1. Jest nowością w wydaniu 27 na iOS, iPadOS, macOS, visionOS i watchOS: to framework narzędzi deweloperskich uruchamiany na etapie testów (zazwyczaj na Macu), a nie funkcja czasu wykonania dostarczana wewnątrz aplikacji1. Definiuje się zbiory danych, generuje odpowiedzi modelu, stosuje metryki i agreguje wyniki, a następnie odczytuje, które podejście wypadło najlepiej i gdzie poszczególne odpowiedzi nie spełniły oczekiwań1.
Dlaczego nie mogę użyć asercji równości z XCTest lub Swift Testing dla funkcji AI?
Asercja równości potrzebuje jednej oczekiwanej wartości, a niedeterministyczny model jej nie ma: ten sam prompt może przy każdym uruchomieniu wytworzyć inne poprawne wyjście. Evaluations zastępuje równość ocenianym osądem. Metric zapisuje wynik passing, failing, scoring lub ignore, a ScoreDimension ocenia wyjście na nazwanej osi45. Ewaluacje wciąż uruchamia się wewnątrz testu, przez EvaluationTrait, więc żyją w tym samym celu i tej samej pętli swift test co pozostałe testy12.
Jak framework ocenia agentowe zachowanie tool-callingu?
Za pośrednictwem ToolCallEvaluator, który weryfikuje agentowe wywołania narzędzi względem oczekiwanej trajektorii9. Ścieżkę opisuje się jako TrajectoryExpectation wzdłuż trzech osi; ewaluator obsługuje sekwencje uporządkowane, oczekiwania nieuporządkowane, sprawdzenia narzędzi zabronionych oraz kroki grupowe, wytwarzając z jednego przebiegu wyniki ścisłe i częściowe910. Walidacja poszczególnych argumentów korzysta z ArgumentMatcher (dokładne wartości, obecność klucza, zakresy, wzorce lub dopasowanie semantyczne oparte na modelu)11.
Jaka jest różnica między Evaluator a protokołem Evaluation?
Evaluator to oparty na domknięciu ewaluator do użytku w linii, bez definiowania własnego typu; jego domknięcie otrzymuje próbkę wejściową oraz odpowiedź, z dostępem do .value i .transcript2. Protokół Evaluation to typ, który implementuje się, aby zdefiniować ewaluację wielokrotnego użytku, opatrzoną nazwą, uruchamiającą testowany system na zbiorze danych i stosującą ewaluatory3. Po Evaluator sięga się dla szybkiego sprawdzenia w linii, a po protokół Evaluation dla sprawdzenia ustrukturyzowanego i powtarzalnego.
Gdzie żyją wygenerowane próbki i wyniki?
SampleGenerator to aktor, który wytwarza próbki z modelu językowego w postaci strumienia asynchronicznego; po iteracji odczytuje się próbki przyjęte lub te, które walidator odrzucił7. Wyniki trafiają do struktury DataFrame z typowanymi deskryptorami ResultColumn: responseColumn, inputColumn oraz expectedColumn8161715. MetricsAggregator wylicza dla tych danych średnią, medianę i odchylenie standardowe18.
Pełny klaster Apple Ecosystem: objaśnienie frameworka Foundation Models; rozróżnienie między LLM czasu wykonania a LLM narzędziowym; kontrola tool-callingu w iOS 27, którą ten framework ocenia; oraz Swift Testing kontra XCTest, do którego modelu traitów wpina się EvaluationTrait. Centrum znajduje się w serii Apple Ecosystem. Szerszy kontekst iOS z agentami AI znajdziesz w przewodniku 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.” ↩