Wanneer je dezelfde verrijking over meerdere AI-modellen uitvoert, kan Entity Enricher de resultaten fuseren tot één output met hoge betrouwbaarheid. Fusie detecteert conflicten tussen model-outputs en lost ze op met deterministische regels of LLM-gestuurde arbitrage.
De conflictdetector vergelijkt elk veld over alle modeluitvoer. Velden waarover alle modellen het eens zijn, gaan ongewijzigd door. Velden waarover de modellen het oneens zijn, worden gemarkeerd als conflicten die opgelost moeten worden.
| Type | Hoe vergeleken | Overeenstemming betekent |
|---|---|---|
| Scalair | Genormaliseerde exacte overeenkomst (getrimd, kleine letters, afgerond) | Alle waarden gelijk na normalisatie |
| Meertalig | De primaire taal van de run beslist; vertaalverschillen activeren alleen een samenvoeging per taal | Dezelfde tekst in de primaire taal — formuleringsvarianten van een vertaling zijn geen tegenstrijdigheden |
| Array | Setvergelijking (volgorde-onafhankelijk) op de weergave van items in de primaire taal | Dezelfde items, ongeacht volgorde of vertaalformulering |
| Object | Per eigenschap zolang de identiteitsvelden aantonen dat beide modellen hetzelfde beschrijven — anders vormt het hele object één conflict | Alle geneste eigenschappen komen overeen |
| Null / leeg | Een waarde die null, een lege string of een lege array is, is een onthouding, geen bewering | De ingevulde waarde wint zonder dat er een conflict wordt geteld |
Conflicten worden opgelost met een van twee methoden, afhankelijk van of je een arbitragemodel in de zijbalk hebt geselecteerd.
Deterministische regels worden toegepast op basis van het gegevenstype van elk veld. Bijna altijd is daar helemaal geen LLM-call voor nodig — de resolutie is direct en gratis. De enige uitzondering zijn getallen waarover de modellen het sterk oneens zijn en die geen enkele regel eerlijk kan beslechten; zie hieronder.
| Veldtype | Regel | Onderbouwing |
|---|---|---|
| String | Meerderheidsstem; bij gelijke stand wint de langste waarde | Meer detail is meestal beter |
| Getal | Modelwaarde die het dichtst bij de mediaan ligt | Bestand tegen uitschieters, nooit een verzonnen gemiddelde |
| Boolean | Meerderheid; true wint bij gelijke stand | Voorzichtige standaard |
| Meertalig | Meerderheidsstem per taal, unie van talen | Elke taal afzonderlijk verwerkt |
| Array | Sleutelbewuste unie: items worden gegroepeerd op hun sleutelvelden, spellingvarianten worden samengevoegd en overeenkomende items worden per veld samengevoegd | Eén rij per logische entity, niets gaat verloren |
| Object | Per veld wanneer de identiteit overeenkomt; anders wordt het object van één model in zijn geheel overgenomen | Twee objecten samenvoegen die verschillende entiteiten beschrijven zou een derde verzinnen die geen van beide modellen heeft teruggegeven |
| Null vs. waarde | Geef de voorkeur aan de ingevulde waarde | Ontbrekende data is erger dan welke waarde dan ook |
Doorslaggevende regel: Bij een gelijke stemming wint de waarde van het duurdere model (als indicatie van capaciteit), gevolgd door de alfabetische volgorde van de modelnaam. Voor een heel object dat atomair wordt genomen komt volledigheid — het aantal gevulde bladeren — daartussen: als niets bewijst welke entiteit de echte is, kies dan het sterkere model en vervolgens het antwoord dat meer informatie bevat.
Een genest object veld voor veld samenvoegen is alleen veilig zolang beide modellen hetzelfde beschrijven. Als de identiteitsvelden dat niet aantonen — andere sleutels, of helemaal geen sleutels met daaronder een echt meningsverschil — wordt het object één enkel conflict en wordt de versie van één model letterlijk overgenomen. Anders zou fusion een chimaera in elkaar zetten: het adres van het ene model op het bedrijf van het andere. Eén gevolg is bewust gekozen, maar goed om te weten: de winnaar wordt inclusief zijn lege plekken overgenomen, dus een veld dat de winnaar leeg liet blijft leeg — waardoor de entity kan blijven steken bij de toelatingscontrole van de database. De reden wordt meegegeven in de validatiewaarschuwingen van de run.
„Dichtst bij de mediaan” is juist voor modellen die verschillend afronden en verkeerd voor modellen die elkaar tegenspreken — 0 tegenover 1854 is geen afrondingsverschil. Zodra de relatieve spreiding van de waarden 20% bereikt, wordt dat veld geëscaleerd naar een LLM-arbiter die automatisch wordt gekozen via de gebruikelijke modelselectie van je organisatie, en de aanroep wordt net als elke andere gefactureerd. Die velden worden in de fusie-audittrail gemarkeerd als automatisch geëscaleerd, zodat een samenvoeging die tokens heeft gekost altijd vermeldt welke velden dat veroorzaakten.
Wanneer je in de zijbalk een arbitragemodel selecteert, worden conflicten naar een LLM gestuurd voor intelligente oplossing. De arbiter ontvangt de entiteitscontext, de beschrijvingen van de schemavelden en alle conflicterende waarden en neemt vervolgens onderbouwde beslissingen.
Fallback: Als het arbitragemodel faalt (timeout, fout), valt het systeem automatisch terug op een regelgebaseerde samenvoeging zodat je altijd een resultaat krijgt.
Na conflictoplossing bouwt het systeem één samengevoegd resultaat op en slaat dit op als een “arbitrage”-record in de database. Elk samengevoegd resultaat bevat een audittrail zodat je kunt nagaan hoe elk conflict is opgelost.
Elk samengevoegd resultaat bevat metadata die het fusieproces documenteert:
Hetzelfde audittraject wordt getoond voor elk samengevoegd record op de History-pagina, op het tabblad Overzicht. Een samengevoegd record vermeldt de modellen die het heeft samengevoegd in plaats van een eigen model — en als het samenvoegen op regels gebaseerd was, is er helemaal geen LLM-aanroep gedaan, dus het bevat geen prompt, geen tokens en geen kosten.
Nadat de fusie is voltooid, toont het tabblad “Samengevoegd” in het resultatenpaneel:
Bij batchverrijking gebeurt fusie automatisch zodra je twee of meer modellen selecteert. Je hoeft niet handmatig op “Resultaten samenvoegen” te klikken — zodra elk model voor een entiteit is geslaagd, draait de fusie en verschijnt het samengevoegde resultaat naast de uitvoer van de afzonderlijke modellen. Een run waarin één model is mislukt, wordt bewust niet gefuseerd: de rest samenvoegen zou stilletjes een gedeeltelijk antwoord publiceren alsof het het overeengekomen antwoord was. Herstel eerst het ontbrekende model — als je de mislukte expertises opnieuw uitvoert, wordt de run automatisch gefuseerd zodra hij weer compleet is.
fusion_started, conflicts_detected en fusion_completed in real-time.