Live checks¶
Een live check houdt elke echte beurt van een agent aan een regel, terwijl de beurt plaatsvindt. Hij leest de vraag die iemand echt stelde, of het antwoord dat het model echt gaf, en beslist ter plekke of die beurt verder mag. Drie voorbeelden:
- "het antwoord bevat nooit een rekeningnummer" — een patroon op het antwoord;
- "de vraag gaat over onze producten" — een beoordelingsmodel op de vraag;
- "het antwoord blijft beleefd" — een beoordelingsmodel op het antwoord, achteraf, op een steekproef van beurten.
Je schrijft live checks op een versie van een agent, naast het model en de instructies. Elke aanroep die de agent noemt, wordt eraan gehouden, wie hem ook aanroept.
Live checks en evaluaties¶
Een evaluatie en een live check gebruiken dezelfde soorten checks, zodat een regel in allebei hetzelfde betekent. Ze verschillen in wanneer de regel wordt toegepast en in wat er gebeurt als hij niet klopt.
| Evaluatie | Live check | |
|---|---|---|
| Wat hij leest | gesprekken die je zelf hebt geschreven | de gesprekken die je bellers echt voeren |
| Wanneer hij draait | als je een run start, of op een planning | bij elke beurt van de agent |
| Wat een mislukking doet | verlaagt de score van de run | houdt de beurt tegen, of wordt vastgelegd en geteld |
| Waar hij antwoord op geeft | "is deze versie goed genoeg?" | "hield deze beurt zich aan de regel?" |
Gebruik een evaluatie om te beslissen of je een versie publiceert. Gebruik een live check om af te dwingen wat bij elke beurt moet kloppen, en om te zien hoe vaak een regel in de praktijk wordt gebroken.
Invoer of uitvoer¶
Een check kijkt naar een van twee plekken, zijn stage:
input— wat de beller in dit verzoek schreef, voordat er een model wordt aangeroepen: de berichten van de gebruiker en de ontwikkelaar, het transcript van een opname, en de waarden die het verzoek invult in de prompt van de agent. Bijgevoegde bestanden, afbeeldingen en tooluitvoer die je terugstuurt, worden niet gelezen. Op een thread wordt alleen het nieuwe verzoek gelezen; de berichten die er al staan, worden niet opnieuw gecontroleerd.output— het antwoord van het model, als een ronde eindigt zonder om een tool te vragen. Twee soorten, "bevat geen tekst" en een patroon, lezen ook de tekst die een model naast een toolaanroep schrijft, zodat verboden tekst ook nooit bij een tool aankomt.
Blokkeren of achteraf beoordelen¶
Een check heeft ook een mode: wat er gebeurt als hij faalt.
- Blokkeren. De check beslist over de beurt zelf. Faalt een check op de invoer, dan krijgt de beller het standaardantwoord van de agent en wordt er geen model aangeroepen. Faalt een check op de uitvoer, dan wordt het antwoord achtergehouden. Een regelcheck kost microseconden; een beoordeelde check voegt één modelaanroep aan de beurt toe.
- Achteraf beoordelen. De check raakt de beurt nooit aan. Nadat de beurt is opgeslagen, geeft een beoordelingsmodel het antwoord een score, op een steekproef van beurten — één op de tien, tenzij je iets anders kiest — en de uitkomst wordt vastgelegd. Gebruik dit voor een kwaliteit die je wilt volgen in plaats van afdwingen, zoals de toon. Alleen een beoordeelde check op de uitvoer kan achteraf draaien, en alleen een beurt die op een thread is opgeslagen, wordt beoordeeld.
Een check die niet kan beslissen — het beoordelingsmodel antwoordde bijvoorbeeld niet op tijd — is
errored. Een blokkerende check die niet kan beslissen, houdt de beurt tegen zoals een gefaalde
check dat doet, tenzij je op die beoordeelde check on_error: "pass" zet: dan gaat de beurt door
alsof de check slaagde, en de uitkomst wordt toch als errored vastgelegd en telt mee voor zijn
melding. Daarmee ruil je veiligheid in voor beschikbaarheid; het past bij een check zoals de toon,
nooit bij een check die vertrouwelijke gegevens bewaakt. Zonder die instelling laat een check een
beurt nooit door omdat hij niet kon worden uitgevoerd.
Wat de beller ziet¶
Het antwoord houdt de vorm van de API van de leverancier die je aanroept, zodat een client die al
omgaat met een weigering van een model of een afgekapt antwoord, ook met een live check omgaat. De
antwoordheader X-Core-Check zegt welke check de beurt tegenhield, met een vaste code, en nooit het
patroon, de verwachte tekst of de redenering van een beoordelaar.
| De beurt | Het antwoord | X-Core-Check |
|---|---|---|
| slaagde voor elke check | het antwoord, zoals altijd | afwezig |
| een check op de invoer weigerde hem | completed, met één bericht waarvan het enige deel een refusal met het standaardantwoord is |
code=input_check_failed |
| een check op de uitvoer hield het antwoord achter | incomplete, met incomplete_details.reason: "content_filter" |
code=output_check_failed |
| het model werd opnieuw gevraagd en het nieuwe antwoord slaagde | het nieuwe antwoord, als gewoon antwoord | afwezig |
| het model werd opnieuw gevraagd en het laatste antwoord faalde nog steeds | incomplete, content_filter |
code=recovery_exhausted |
| een blokkerende check kon niet beslissen | geweigerd of achtergehouden zoals hierboven | code=check_errored |
| het model weigerde zelf | completed, een refusal in de woorden van het model |
afwezig |
Op POST /messages zijn een geweigerde vraag en een achtergehouden antwoord allebei
stop_reason: "refusal". De naam van de check staat in de header, dus een naam bevat nooit iets
geheims.
Streamen¶
Een blokkerende check op de uitvoer moet het antwoord lezen voordat de beller dat doet, en verandert daarom hoe een gestreamd antwoord binnenkomt:
- Alleen patrooncontroles. Het antwoord streamt zoals gewoonlijk, een paar tekens achter het
model aan: Core houdt zoveel tekens achter als de langste treffer die een patroon toestaat
(hooguit 200). Bij een treffer stopt het antwoord waar de treffer begint. Wat ervoor stond, is
verstuurd, de treffer nooit, en de beurt eindigt
incompletemetcontent_filter. - Een andere blokkerende check op de uitvoer. Het antwoord komt in één keer binnen zodra elke check is geslaagd. De stream brengt intussen de samenvattingen van het redeneren en de toolaanroepen wel gewoon wanneer ze gebeuren, tenzij een check het antwoord opnieuw vraagt: dan wordt er niets van een ronde getoond, ook het redeneren niet, tot het antwoord is geslaagd.
- Checks op de invoer draaien voordat de stream begint; een beoordeelde vertraagt het eerste token met één aanroep van de beoordelaar.
Opnieuw vragen¶
Een blokkerende check op de uitvoer kan om herstel vragen: faalt het antwoord, dan vraagt Core het model opnieuw, hooguit het aantal pogingen van de agentversie (twee, tenzij je één tot drie kiest), en de beller krijgt het antwoord dat slaagde. Een voorbeeld: iemand vraagt de agent om te vloeken, het antwoord bevat een verboden woord, en de persoon ziet alleen "Dat mag ik niet doen."
- Het model ziet het afgewezen antwoord nooit. Core vertelt het de regel die het antwoord brak — de omschrijving van de check, of de verwachte tekst, of de naam — en dat het geen correctie mag noemen.
- Een nieuwe poging mag geen tools aanroepen, zodat een poging nooit een handeling herhaalt.
- Elke poging is een modelaanroep die telt op de sleutel waarmee de beurt draaide.
- Herstel werkt waar de beller nog niets van het antwoord heeft gezien: een beurt die niet streamt, een achtergrondrun, en een gestreamde beurt waarvan het antwoord in één keer komt. Streamde het antwoord al, dan kapt een gefaalde check het af.
- Een antwoord wordt alleen opnieuw gevraagd als elke blokkerende check waarvoor het faalde om
herstel vraagt. Een check zonder herstel, of een die niet kon beslissen, houdt het antwoord meteen
achter; een die niet kon beslissen met
on_error: "pass"houdt niets achter en vraagt niets opnieuw.
De beoordelaar¶
Een beoordeelde check — juist formaat, beleefde toon, geen verzinsels of je eigen regel — wordt beslist door een model, dezelfde beoordelaar die een evaluatie gebruikt. Op de invoer leest hij de tekst van de beller en jouw regel; op de uitvoer leest hij het laatste bericht van de gebruiker, het antwoord en jouw regel. Hij leest nooit de instructies van de agent, zijn tools of de rest van het gesprek.
De console noemt de beoordelaar de rechter. De beoordelaar is het eigen beoordelingsmodel van de
check, of anders het model waarop de beurt
draaide. Een agent met een router als model moet bij elke beoordeelde check een beoordelingsmodel
noemen, omdat een router per beurt een ander model kiest. Dat geldt ook voor een agent zonder eigen
model die een beller met een router als model aanroept: een beoordeelde check zonder
beoordelingsmodel kan dan niet beslissen, en een blokkerende houdt de beurt tegen, tenzij hij
on_error: "pass" zegt. De tokens van de beoordelaar tellen op de
sleutel waarmee de beurt draaide, net als de beurt zelf. Een sleutel die aan bepaalde regio's is
gebonden, bereikt alleen een beoordelingsmodel in die regio's; daarbuiten kan de check niet
beslissen, en bepaalt zijn on_error wat er gebeurt, zoals bij elke andere fout.
Wat er wordt vastgelegd¶
Elke check geeft per beurt één uitkomst: passed, failed of errored, met een score bij een
beoordeelde check en een reden. De reden van een regel is een vaste zin; die van een beoordelaar
is zijn eigen zin. De uitkomsten worden bij de beurt bewaard, verlopen met de beurt onder je
bewaartermijn, en worden gewist met de persoon bij wie de beurt hoort.
- Per beurt. De uitkomsten van één beurt lees je terug via de API en op de pagina van het gesprek in de console.
- Slagingspercentages. Per check hoeveel uitkomsten slaagden, faalden of niet konden beslissen over een periode.
- Meldingen. Een check kan een melding geven als te veel van zijn laatste uitkomsten niet slaagden: hooguit één per check per dag, per mail of Slack, aan de beheerders van de organisatie.
- Events. Elke uitkomst die niet slaagde, is een event
response.check_failedop je eventfeed en webhooks, met de naam van de check en nooit met tekst.
Waar checks gelden¶
Live checks horen bij de agentversie. Een wijziging eraan is een nieuwe versie, die je als concept kunt opslaan, met een evaluatie kunt meten en daarna publiceert, net als elke andere wijziging aan de agent.
- Elke beurt die de agent draait, past zijn checks toe: een aanroep die hem noemt, een agent die door een andere agent als tool wordt aangeroepen, een achtergrondrun, en een stap van een evaluatierun. Een evaluatierun past de blokkerende checks toe, herstel inbegrepen, zodat een suite meet wat een beller krijgt; de checks die achteraf beoordelen, slaat hij over.
- Een beurt die Core zelf start, waar niemand op een antwoord wacht — een workflowstap, een taak die op de achtergrond start — krijgt geen standaardantwoord als een check op de invoer faalt: de stap eindigt geweigerd en de taak start niet.
- Prompts en modelrouters hebben geen eigen checks.
Verder¶
| API | Console | |
|---|---|---|
| Live checks | Live checks via de API | Live checks in de console |
| Agents | Agents via de API | Agents in de console |
| Evaluaties | Evaluaties via de API | Evaluaties in de console |
De melding die een falende check geeft, stel je in bij Meldingen.