AI-schemageneratie - Entity Enricher-documentatie

AI-schemageneratie

Genereer gestructureerde JSON-schema's uit voorbeelddata met AI, inclusief automatische zelfcorrectie en intelligente nabewerking.

Hoe het werkt

Schemageneratie zet ruwe entiteitgegevens om in een getypeerd, geannoteerd JSON-schema dat precies bepaalt welke informatie er tijdens de verrijking wordt geëxtraheerd. In plaats van schema's handmatig te schrijven, plak je voorbeeld-JSON en laat je AI de structuur analyseren, types afleiden, expertisedomeinen toewijzen en verbeteringen voorstellen.

De generatiepijplijn

Generatie is niet één grote prompt. Het is een reeks kleine aanroepen die elk één ding doen en grotendeels tegelijk draaien — precies daardoor kunnen kleine, goedkope modellen een bruikbaar schema opleveren, want elke aanroep beantwoordt één afgebakende vraag over materiaal dat het in één keer kan overzien.

  1. Canoniseer de sample (geen LLM) — een waarde die zijn eigen eenheid meedraagt wordt een getal met de eenheid in de naam ("8.275 h" wordt half_life_seconds: 29790), en een datum die geen enkel native type aankan wordt een geheel jaartal. Elke waargenomen waarde moet de aanname waarmaken, anders blijft de eigenschap tekst. De herschreven sample is wat wordt opgeslagen.
  2. Identiteitsafbakening — één aanroep, die vóór alle andere draait omdat het de laatste is die je sample nog mag wijzigen. Waar een item in een gerelateerde array feiten over die entiteit vermengt met feiten over de koppeling aan de parent, wordt het item geherstructureerd: koppelingsfeiten blijven staan, de eigen feiten van de entiteit komen genest onder een benoemd subobject. Zonder dit delen beide soorten feiten één identiteit.
  3. Leid het skelet af (geen LLM) — de eigenschappenboom, JSON-types en nullability komen rechtstreeks uit de sample(s); herhaalde structuren en entiteitachtige array-items worden herbruikbare definities. Gelokaliseerde objecten (zoals {"en": "...", "fr": "..."}) worden samengevouwen tot één meertalige waarde.
  4. Stel de parallelle vragen — losse gelijktijdige calls bepalen de identiteit en naamgeving van de entiteit, de gedragsvlaggen (key, preserve, multilingual, nullable, plus formaatvoorstellen), of velden met gehele getallen echt discreet zijn, welke strings uit een gesloten vocabulaire komen, en hoe properties naar expertisedomeinen worden gerouteerd.
  5. Schrijf de documentatie — één aanroep per expertisedomein, in de persona van dat domein, die per eigenschap de beschrijving en voorbeelden oplevert — plus een eigen second opinion over de vraag of de waarde echt afwezig kan zijn.
  6. Samenstellen, valideren, opslaan (geen LLM) — de fragmenten worden samengevoegd, de 8 validatieregels draaien als vangnet, deterministische nabewerking lost conflicten tussen vlaggen op, en het schema wordt opgeslagen — ontdubbeld op contenthash, zodat identieke schema's niet dubbel worden bewaard.

Elke stap probeert het zelf opnieuw (3 pogingen) en de antwoorden stapelen zich op over de pogingen heen, zodat een model dat in fragmenten antwoordt toch convergeert. Daarna accepteert de stap wat hij heeft gekregen en worden de gaten deterministisch opgevuld — een zwak model verslechtert de beschrijvingen in plaats van de generatie te laten mislukken. Alleen identiteit en domeinroutering mogen de hele run laten mislukken. Elke call wordt als een eigen prompt gefactureerd en gelogd, zodat het record precies laat zien waar wat is uitgegeven.

Je kunt meerdere samples van hetzelfde entity-type doorgeven in plaats van één — het schema dekt dan de vereniging van hun velden, alles wat in een sample ontbreekt wordt nullable, en de waarden die je erin ziet worden echte voorbeelden. Veldnamen moeten overeenkomen: samples die verschillende entity-types beschrijven worden geweigerd, net als objecten binnen een array die geen enkel veld delen, want dan blijft er niets over om hun rijen te identificeren. De sample-editor markeert elk zo'n verschil voordat je een generatie besteedt.

Waarden met een eigen eenheid worden omgezet naar getallen voordat het schema wordt afgeleid, omdat een kolom met "8.275 h" en "85 ms" niet gesorteerd, op bereik gefilterd of geaggregeerd kan worden. De eenheid verhuist naar de propertynaam (half_life_seconds), een niet-numerieke vervanger zoals "stable" wordt null, en datums van vóór jaar 1 worden een geheel jaartal (negatief voor v.Chr.), wat geen enkel datumtype kan opslaan en wat als tekst verkeerd sorteert. Je voorbeeldpaneel wordt hierop aangepast, zodat het altijd het voorbeeld toont dat het schema beschrijft. Alles wat de conversie niet met zekerheid kan lezen, blijft precies zoals je het hebt geschreven.

Zelfcorrectie, stap voor stap

Omdat elke stap één afgebakende vraag beantwoordt, kan de correctie net zo afgebakend zijn: de validator van een stap behoudt alles wat bruikbaar terugkwam en vraagt alleen opnieuw om wat ontbreekt. Er wordt niets vanaf nul opnieuw gegenereerd, dus een gedeeltelijk correct antwoord is vooruitgang in plaats van een verspilde poging.

Voorbeeld: de vlaggenstap bij 30 eigenschappen

Poging 1Het model antwoordt voor 22 daarvan en verdeelt zijn antwoord over meerdere tool calls — een veelvoorkomend probleem bij kleine modellen. Alle 22 worden bewaard.
Opnieuw proberenDe vervolgvraag vraagt alleen om de 8 resterende properties — een kortere vraag, die eerder volledig wordt beantwoord.
Poging 2Er komen er nog 6 binnen. De laatste 2 vallen terug op deterministische standaardwaarden, en het tekort wordt vastgelegd op het generatierecord in plaats van het te laten mislukken.

De acht validatieregels lopen nog steeds als eindcontrole over het samengestelde schema — typecorrectheid, toewijzing van expertisedomeinen, referentie-integriteit, volledigheid. Op dat moment zijn ze een vangnet en niet het correctiemechanisme. Lees meer over elke regel in de gids Validatieregels.

Wat het schema bevat

Een gegenereerd schema is meer dan een eenvoudige typedefinitie. Elke eigenschap bevat metadata die het verrijkingsproces stuurt:

Type

JSON Schema-type (string, number, integer, boolean, array, object)

Beschrijving

Contextuele beschrijving die de AI vertelt welke informatie te vinden

Expertise

Welk expertisedomein (financieel, regelgevend, enz.) deze waarde levert

Sleutel

Of dit veld deel uitmaakt van wat de instantie identificeert. Sleutels doen twee dingen tegelijk: ze richten de verrijkingsprompt op de juiste entiteit, en fusie matcht array-items erop. Een sleutel mag toch nullable zijn — een kenmerk dat op elkaar lijkende broertjes onderscheidt, blijft identificerend, ook als hele families het echt niet hebben

Gesloten vocabulaire

Waar de waarden van een string uit een kleine, volledig opsombare verzameling komen (statussen, beoordelingen, classificatiecodes), stelt de generatie de leden voor — geschreven zoals jouw voorbeelden ze schrijven — zodat de verrijking niet naar een synoniem kan afdwalen

Nullable

Of het veld null mag zijn — niet-nullable velden zijn vereist voor toelating tot de database

Meertalig

Of het veld in meerdere talen moet worden verrijkt

Behouden

Of de oorspronkelijke waarde ongewijzigd moet blijven tijdens verrijking

Voorbeelden

Realistische voorbeeldwaarden die de AI naar het juiste formaat leiden

Formaat / Patroon

Machinaal controleerbare vorm voor stringwaarden: onjuist opgemaakte antwoorden worden afgewezen en opnieuw geprobeerd, en opgeslagen waarden behouden de canonieke vorm. Generatie claimt alleen een benoemd formaat (date, time, date-time, uuid, email, uri, ipv4, ipv6) dat door de voorbeelden wordt aangetoond — een regex-patroon is een voorspelling over waarden die nog niemand heeft gezien, en een verkeerd patroon laat elke verrijking van het veld mislukken, dus dat voeg je zelf toe in de editor

Detectie van expertisedomein

De AI groepeert schema-eigenschappen in expertisedomeinen op basis van hun semantische betekenis. Zo kan een schema voor een farmaceutisch bedrijf domeinen bevatten als “Financieel analist,” “Regelgevingsexpert” en “Bedrijfsinformatie.” Deze domeinen worden gebruikt door de multi-expertisestrategie om parallelle, gespecialiseerde LLM-aanroepen uit te voeren voor diepere resultaten.

Limieten voor aantal domeinen

Het aantal expertisedomeinen wordt automatisch beperkt op basis van het aantal eigenschappen van je gegevens om overfragmentatie te voorkomen:

5 eigenschappen
1 domein
12 eigenschappen
2 domeinen
30 eigenschappen
5 domeinen
60 eigenschappen
10 domeinen

Naverwerking

Zodra de fragmenten zijn samengevoegd, regelen deterministische stappen alles wat niet aan een model overgelaten mag worden — met je werkelijke invoerdata als bewijs:

Verbreding naar nullable

Een veld dat in een van de voorbeelden ontbreekt of null is, wordt nullable, wat het model ook antwoordde, zodat een onbekende waarde een geaccepteerd antwoord is in plaats van een datakwaliteitsfout. Voorbeelden kunnen alleen verruimen: een handvol voorbeelden bewijst aanwezigheid voor die instanties, nooit voor elke instantie van het type — daarom krijgt het model ook een stem, en worden de twee met OR gecombineerd.

Conflictoplossing tussen vlaggen

Attributen die niet samen kunnen bestaan, worden via een regel verzoend in plaats van opnieuw uitgevraagd: preserve wint van multilingual en nullable, een overgebleven gesloten vocabulaire wist multilingual, en een sleuteleigenschap houdt nooit een enum.

Sleutelherstel voor array-items

Elk object binnen een array heeft gegarandeerd minstens één sleuteleigenschap — dat is de eenheid waarop fusie dedupliceert, dus een array-item zonder sleutel zou het samenvoegen van de antwoorden van twee modellen onmogelijk maken.

Expertiseverzameling

Alle unieke expertise domains worden uit het schema verzameld voor metrics en strategieconfiguratie.

De taal waarin een schema is geschreven

Een schema beschrijft zichzelf in een taal — de typenamen, eigenschapsbeschrijvingen, expertiselabels en suggesties. Dat is iets anders dan de talen waarin je verrijkt. Noem er een bij het genereren, of laat het weg en dan bepaalt de taal van de eigenschapsnamen in je voorbeeld: een Frans voorbeeld levert niet langer een Engels schema op. De keuze wordt bewaard, zodat latere AI-bewerkingen in dezelfde taal blijven schrijven in plaats van terug te vallen op Engels.

De samples zelf genereren

Je hebt geen voorbeeldgegevens nodig om te beginnen. Beschrijf het entiteitstype — eventueel met documenten als basis, of met een webzoekopdracht om het aan de werkelijkheid te toetsen — en het platform schrijft de voorbeelden voor je. Vraag je om meerdere, dan krijg je meerdere verschillende exemplaren, niet één exemplaar in andere bewoordingen.

Alle instanties worden in één keer gekozen

Het eerste sample bepaalt in dezelfde aanroep ook waar de andere over gaan. Als je N keer los om “een voorbeeld” vraagt, krijg je steevast N keer hetzelfde beroemde exemplaar; door de hele cast vooraf te benoemen worden ze onderling verschillend.

Het eerste sample legt de vorm vast

De overige samples worden parallel gegenereerd tegen de structuur van sample 1 als contract, en niet alleen met het verzoek om die te volgen — zo kan een variant geen veld hernoemen, toevoegen of weglaten. Samples die alsnog dubbel of misvormd terugkomen, worden opnieuw opgevraagd in een begrensde retry-ronde, en als het volledige aantal niet wordt gehaald, krijg je dat te horen in plaats van stilzwijgend minder samples.

Taal en je eigen instructies

Taal staat standaard op auto en wordt afgeleid uit de woorden van je eigen verzoek en vervolgens uit een eventueel bijgevoegd document. Extra instructies die je toevoegt zijn bindend: ze worden opgevolgd, of het antwoord vertelt je wat niet kon worden opgevolgd en waarom — ze worden nooit stilzwijgend genegeerd.

Ambiguïteitscontrole

Lees een eigenschapsnaam in de context van het bovenliggende object en tel hoeveel verschillende dingen ze kan vragen. Eén is duidelijk. Bij twee of meer kiest elk model een andere, en dan mengt de kolom antwoorden op verschillende vragen — annual_revenue bij een bedrijf kan de groep of de entiteit betreffen, bruto of netto, in een van meerdere valuta's. Helemaal geen — een naam voor iets wat deze ouder simpelweg niet heeft — is erger: met niets om op te zoeken verzint het model een waarde.

Generatie bestrijdt dit twee keer: de prompt zelf eist namen die maar één lezing toelaten, en een nabewerking van het voltooide schema markeert de namen die dat alsnog niet doen. In dit stadium is de oplossing een hernoeming — de beschrijvingen zijn uit de namen gegenereerd, dus een beschrijving kan de naam waaruit ze voortkomt niet verduidelijken, en er hangt nog niets van het schema af. Samplegeneratie voert dezelfde controle uit op de sample en past de hernoemingen toe voordat je die ooit ziet. Vrije tekst — een beschrijving, een samenvatting, notities — wordt nooit gemarkeerd: de formulering varieert, maar de gestelde vraag is duidelijk.

Gemarkeerde eigenschappen tonen een badge “ambigu” in de Workflow Editor, met daarin de lezingen die de naam toelaat. Zodra het schema live is, verschuift de oplossing naar een herschreven beschrijving, die één betekenis vastlegt zonder het datacontract te breken. Zie de handleiding Ambiguïteitscontrole voor het volledige beoordelingskader en de bijbehorende oplossingen.

Bij het genereren van een voorbeeldentiteit uit een beschrijving kun je “Webzoekopdracht gebruiken” inschakelen om het model actuele feiten op het web te laten opzoeken in plaats van alleen op zijn trainingsdata te vertrouwen. Dit levert versere, nauwkeurigere voorbeeldwaarden op — vooral voor snel veranderende feiten zoals prijzen, personeelsaantallen of recente releases. De optie verschijnt alleen voor modellen waarvan de provider ingebouwde webzoekopdrachten ondersteunt, en zoekopdrachten worden door de provider in rekening gebracht net als elk ander modelgebruik.

AI-schemabewerking

Na de generatie kun je schema's aanpassen met instructies in natuurlijke taal. Typ een opdracht en de AI voert de wijziging door met behoud van je bestaande schemastructuur. Elke bewerking levert ook 5 suggesties voor verdere verbeteringen op.

Voorbeelden van bewerkingscommando's

Voeg een employee_count integer-veld toe
Maak een genest adresobject met stad en land
Voeg Franse beschrijvingen toe aan alle tekstvelden
Definieer een verwijzing naar een moederbedrijf met $defs
Markeer het website-veld als nullable

AI-bewerkingen worden gevalideerd met een subset van de generatieregels (typecontrole, referentie-integriteit, expertiseconsistentie) zonder vergelijking met invoergegevens, omdat je mogelijk opzettelijk velden toevoegt of verwijdert.

AI-suggesties

Zowel schemageneratie als AI-bewerking leveren 5 gerichte suggesties die verschillende verbetercategorieën bestrijken:

Volledigheid van dataOntbrekende velden die je entity kunnen verrijken
DatakwaliteitGesloten vocabulaires, nullability, typecorrecties
RelatiesGeneste structuren, entity-verwijzingen via $defs
InternationalisatieMeertalige vertalingen, ondersteuning voor landinstellingen
BedrijfscontextDomeinspecifieke velden en expertisegroeperingen

Suggesties verschijnen als klikbare chips in de Workflow Editor — klik op een suggestie om het AI-bewerkingsveld automatisch in te vullen en toe te passen.

Volgende stappen