Matching van opiniegevers
Wanneer een maker een Vraag plaatst, ontstaan er zoveel slots (Opdracht-en) als het vaste aantal beoordelingen (aantalBeoordelingen — de bij het stellen bevroren instelling aantalOpiniegevers), en moet het systeem daar geschikte opiniegevers voor vinden. Dit scenario beschrijft hoe de kandidatenpool wordt samengesteld: filteren op de SelectieCriteria, online gebruikers voorrang geven, de maker uitsluiten, en de Open slots pull-gewijs laten oppakken.
Situatie
Section titled “Situatie”- Een maker plaatst een nieuwe
Vraag(video of foto). De vraag draagt een ProfielSnapshot van de maker en een set SelectieCriteria die de gewenste doelgroep van opiniegevers beschrijft. - Het systeem bouwt een kandidatenlijst van alle Gebruikers en filtert op de
SelectieCriteria:gender,regio(Regio, per2026-07-10d— bv. een NL-provincie),achtergronden de leeftijdsrange (minLeeftijd–maxLeeftijd). Het regio-criterium verbreedt niet. - Online gebruikers krijgen voorrang. Een gebruiker geldt als online wanneer
laatsteBezoekbinnen het online-venster valt (onlineVensterMin, een via Beheer instelbaar aantal minuten). Online-zijn is geen filter en geen keuze van de vrager; het bepaalt alleen de volgorde waarin kandidaten worden aangesproken, zodat een opinie zo snel mogelijk binnenkomt. - De maker zelf wordt uitgesloten uit de kandidatenlijst: niemand geeft een opinie over zijn eigen vraag. Ook geldt (expliciet per
2026-07-10b): maximaal één opinie per gebruiker per vraag — een vraag die de opiniegever al beoordeelde (of waarvan hij op dit moment een slot vasthoudt) komt niet nogmaals in zijn Keuzeset, en het opinie-endpoint weigert een tweede opinie van dezelfde persoon als vangnet. - De overgebleven kandidaten vormen de pool waaruit slots worden opgepakt; online kandidaten krijgen voorrang en de volgorde wordt gespreid, zodat niet steeds dezelfde gebruikers worden aangesproken. Er zijn
aantalBeoordelingenslots te vergeven. - Bij het stellen ontstaan er zoveel slots (
Opdracht-en) als het vaste aantal beoordelingen (aantalBeoordelingen, de bij het stellen bevroren instellingaantalOpiniegevers), elk met statusOpen. (Per2026-07-10h) Elk slot krijgt daarbij eenminimumNiveau: zonder betaald advies worden maximaalmaxVrijeReactiesZonderBetaald(standaard 3) vrije-reactie-slots opNiveau1gezet (exclusief voor beoordelaars met adviesniveau ≥ 1, verplichte tekstreactie); mét betaald advies bepalen deniveaueisende niveau-slots. De keuzeset biedt een niveau-slot alleen aan beoordelaars met minstens dat niveau aan; gewone slots staan voor iedereen open. De slots worden niet naar een vaste reviewer geduwd: de matching bepaalt slechts wie kandidaat is en wie voorrang krijgt. Een opiniegever pakt een slot pull-gewijs op via een Keuzeset; pas bij het kiezen legt deOpdrachteenProfielSnapshotvan de opiniegever én een snapshot van de gebruikteSelectieCriteriavast (criteriaSnapshot) en start de antwoordtermijn. - Resultaat:
aantalBeoordelingenOpdracht-records die naar dezelfdevraagIdverwijzen. Gekwalificeerde opiniegevers kunnen ze vervolgens oppakken en een opinie geven. - Antwoordtermijn & recycling: kiest of beoordeelt een opiniegever niet binnen zijn termijn, dan keert het slot terug naar
Openen komt het opnieuw beschikbaar voor andere kandidaten (met een korte anti-thrash-uitsluiting voor wie het liet verlopen). - AI-persona-vangnet bij te weinig of geen kandidaten: is er geen mens beschikbaar (te weinig online, of niemand pakt het slot op tijd op), dan levert een AI-persona de ontbrekende opinie (
Opinie.bron = AI) voor de resterendeOpenslots. De generatie is vision-gebaseerd (OpenAIgpt-4o-mini): het model “ziet” de opname — de foto rechtstreeks, of ~4 met FFmpeg uit de video gehaalde frames — en scoort, gestuurd door de persona-instructie, alleen de door de maker gekozen secties. Zonder OpenAI-sleutel/chat-permissie of bij een fout valt het fail-graceful terug op deterministische scores. Zo krijgt elke vraag een volledige beoordeling, ook bij weinig actieve gebruikers. Naast dit automatische vangnet kan de beheerder ook handmatig een AI-opinie op een open slot laten genereren (met een gekozen persona) — zie Systeembeheer. Na afronding waardeert de maker elke ontvangen beoordeling met 0–5 (alleen een waardering op een menselijke opinie werkt door in het reviewer-profiel).
Genomen beslissingen
Section titled “Genomen beslissingen”| # | Beslissing | Motivatie |
|---|---|---|
| 1 | De maker wordt altijd uitgesloten van de kandidatenlijst. | Een opinie over je eigen vraag heeft geen waarde en zou de anonimiteit en eerlijkheid ondermijnen. |
| 1b | Max. 1 opinie per gebruiker per vraag (per 2026-07-10b): al-beoordeelde vragen en vragen met een door de actor vastgehouden slot zijn uitgesloten van zijn keuzeset; het opinie-endpoint weigert een tweede opinie (vangnet). | De 10 opinies moeten van 10 verschillende mensen komen (testbevinding: één gebruiker kon dezelfde vraag herhaaldelijk beoordelen en zo de uitslag domineren en credits farmen). |
| 2 | Online gebruikers krijgen voorrang (laatsteBezoek binnen het online-venster); online-zijn is geen filter of keuze. | Wie nú actief is, geeft het snelst een opinie, zodat de beoordeling vlot rond is. Maar offline-zijn sluit een kandidaat niet uit — het bepaalt alleen de volgorde. |
| 3 | De volgorde waarin kandidaten slots opgepakt krijgen, wordt gespreid. | Spreidt opinieverzoeken eerlijk over de gebruikers en voorkomt dat dezelfde mensen telkens worden belast. |
| 4 | Het aantal beoordelingen per vraag is een vaste beheerinstelling (aantalOpiniegevers uit de Systeeminstellingen, standaard 10), bij het stellen op de vraag bevroren als aantalBeoordelingen. | Eén uniforme, via Beheer af te stemmen waarde (afgestemd op de actieve gebruikersbasis) houdt het stellen eenvoudig en de creditkosten voorspelbaar; de eerdere keuze door de maker is per 2026-07-04 vervallen. |
| 5 | (vervallen per 2026-07-11m — ADR-037) Bij te weinig kandidaten in exact hetzelfde land verbreedde de matching via de afgeleide UN M49-regio: land → subregio → werelddeel. | I See You wordt per land als aparte site gehost (NL eerst); een Land-veld en de bijbehorende verbreding waren overbodig. Te weinig kandidaten worden nu direct door het AI-persona-vangnet opgevangen. |
| 6 | Elk slot (Opdracht) ontstaat Open en legt bij het kiezen snapshots vast (reviewer + criteria) plus een antwoordtermijn. | Houdt de toewijzing herleidbaar, ook als profielen of criteria later wijzigen — conform de snapshot-beslissing uit het domeinmodel. Wie niet op tijd kiest of beoordeelt, laat het slot terugvallen naar Open zodat een ander het oppakt. |
| 6b | Niveau-slots (per 2026-07-10h): een slot met minimumNiveau ≥ Niveau1 komt alleen in de keuzeset van beoordelaars met minstens dat adviesniveau; zonder betaald advies max. maxVrijeReactiesZonderBetaald van zulke vrije-reactie-slots, mét betaald advies zijn de niveaueisen leidend. | Vrije (tekst)reacties komen zo alleen van ervaren beoordelaars (niveau 1–4/Expert), met een hard, instelbaar maximum per gratis vraag (testfeedback Han, issue #17). |
| 7 | Blijft het panel onvolledig (te weinig mensen, of niemand reageert), dan vult een AI-persona de ontbrekende opinies aan. | De cyclus mag niet blokkeren bij een kleine of weinig actieve doelgroep; zo krijgt elke vraag een volledige beoordeling in plaats van minder of geen opinies. |
| 8 | De AI-invulling is vision-gebaseerd (OpenAI gpt-4o-mini; foto rechtstreeks, video via FFmpeg-frames), fail-graceful met een deterministische terugval, en kan naast het automatische vangnet ook handmatig door de beheerder op een open slot worden gestart. | Een echte beoordeling van de opname is geloofwaardiger dan een blinde score; het goedkope mini-model (< $0,01 per opinie) en de deterministische terugval houden het betaalbaar en robuust; de handmatige actie laat de beheerder trage vragen direct afvullen. |
flowchart TD
A["Vraag geplaatst met SelectieCriteria<br/>aantalBeoordelingen slots (Open)"] --> B["Verzamel gebruikers en filter op SelectieCriteria<br/>gender, regio, achtergrond,<br/>leeftijdsrange"]
B --> D["Sluit de maker uit"]
D --> P["Geef online kandidaten voorrang"]
P --> E{"Genoeg kandidaten?"}
E -->|Ja| H["Opiniegever pakt een slot pull-gewijs op<br/>(Keuzeset), online eerst"]
E -->|Te weinig of geen| M["Vul resterende Open slots met AI-persona<br/>Opinie.bron = AI"]
H --> I["Slot Open -> Gekozen: antwoordtermijn start,<br/>reviewer- en criteria-snapshot vastgelegd"]
I --> Q{"Kiest en beoordeelt binnen termijn?"}
Q -->|Ja| J["Opinie binnen, Opdracht Voltooid"]
Q -->|Nee| R["Slot terug naar Open, anti-thrash-uitsluiting"]
R --> M
M --> J
J --> N["Resultaat: panel van aantalBeoordelingen opinies<br/>naar dezelfde vraagId; maker waardeert 0-5"]
Hoe het model dit ondersteunt
Section titled “Hoe het model dit ondersteunt”| Stap | Modelondersteuning |
|---|---|
| 1. Vraag met doelgroep | Vraag (aggregate root) draagt de SelectieCriteria (minLeeftijd, maxLeeftijd, gender, regio, achtergrond) en een ProfielSnapshot van de maker. Online-zijn is geen criterium meer. |
| 2. Filteren op criteria | De velden van SelectieCriteria worden vergeleken met het Profiel van elke kandidaat-Gebruiker; regio komt uit een vlakke keuzelijst (geen Land meer sinds 2026-07-11m). |
| 3. Online-voorrang | Gebruiker.isOnline(vensterMin) toetst laatsteBezoek tegen het online-venster (onlineVensterMin uit de Systeeminstellingen); online kandidaten worden bij de matching vooraan gezet, maar niet weggefilterd. |
| 4. Maker uitsluiten | De Vraag.makerId (en makerIsGeregistreerd) identificeren de maker, die uit de kandidatenlijst wordt verwijderd. |
| 5. Slots voor de beoordelingen | Er ontstaan aantalBeoordelingen Opdracht-aggregates (de bij het stellen bevroren instelling aantalOpiniegevers uit de Systeeminstellingen), elk Open (zie het klassendiagram in het domeinmodel). |
| 6. Slot pull-gewijs opgepakt | Bij het kiezen krijgt de Opdracht vraagId, een reviewer, een reviewerSnapshot (ProfielSnapshot), een criteriaSnapshot (SelectieCriteria), status OpdrachtStatus.Gekozen, assignedAt en verlooptOp (de antwoordtermijn). |
| 7. Recycling | Verstrijkt de keuze- of antwoordtermijn zonder opinie, dan keert de Opdracht terug naar OpdrachtStatus.Open en komt het slot opnieuw beschikbaar voor een andere kandidaat. |
| 8. AI-persona-vangnet | Is er geen mens beschikbaar, dan levert een AI-persona de opinie (Opinie.bron = AI, sinds 2026-07-04g mét scores én een korte reactie — consistent met het domeinmodel) voor de resterende Open slots, zodat het panel volledig wordt. De generatie loopt via IAiPersonaService (vision op gpt-4o-mini, deterministische terugval); een AI-opinie kan ook handmatig door de beheerder worden toegevoegd (POST /api/beheer/vragen/{id}/ai-opinie). |
| 9. Resultaat = panel | De aangemaakte Opdracht-records vormen het panel; elke opdracht leidt tot één Opinie (Opdracht "1" --> "0..1" Opinie). Na afronding geeft de maker elke ontvangen opinie een waardering (0–5); alleen bij een menselijke opinie werkt die door in het reviewer-profiel. |
Zie ook: domeinmodel, termen en het vervolgscenario Opinie geven & waarderen.