Ga naar inhoud

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.

  1. 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.
  2. Het systeem bouwt een kandidatenlijst van alle Gebruikers en filtert op de SelectieCriteria: gender, regio (Regio, per 2026-07-10d — bv. een NL-provincie), achtergrond en de leeftijdsrange (minLeeftijdmaxLeeftijd). Het regio-criterium verbreedt niet.
  3. Online gebruikers krijgen voorrang. Een gebruiker geldt als online wanneer laatsteBezoek binnen 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.
  4. 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.
  5. 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 aantalBeoordelingen slots te vergeven.
  6. Bij het stellen ontstaan er zoveel slots (Opdracht-en) als het vaste aantal beoordelingen (aantalBeoordelingen, de bij het stellen bevroren instelling aantalOpiniegevers), elk met status Open. (Per 2026-07-10h) Elk slot krijgt daarbij een minimumNiveau: zonder betaald advies worden maximaal maxVrijeReactiesZonderBetaald (standaard 3) vrije-reactie-slots op Niveau1 gezet (exclusief voor beoordelaars met adviesniveau ≥ 1, verplichte tekstreactie); mét betaald advies bepalen de niveaueisen de 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 de Opdracht een ProfielSnapshot van de opiniegever én een snapshot van de gebruikte SelectieCriteria vast (criteriaSnapshot) en start de antwoordtermijn.
  7. Resultaat: aantalBeoordelingen Opdracht-records die naar dezelfde vraagId verwijzen. Gekwalificeerde opiniegevers kunnen ze vervolgens oppakken en een opinie geven.
  8. Antwoordtermijn & recycling: kiest of beoordeelt een opiniegever niet binnen zijn termijn, dan keert het slot terug naar Open en komt het opnieuw beschikbaar voor andere kandidaten (met een korte anti-thrash-uitsluiting voor wie het liet verlopen).
  9. 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 resterende Open slots. De generatie is vision-gebaseerd (OpenAI gpt-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).

#BeslissingMotivatie
1De maker wordt altijd uitgesloten van de kandidatenlijst.Een opinie over je eigen vraag heeft geen waarde en zou de anonimiteit en eerlijkheid ondermijnen.
1bMax. 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).
2Online 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.
3De volgorde waarin kandidaten slots opgepakt krijgen, wordt gespreid.Spreidt opinieverzoeken eerlijk over de gebruikers en voorkomt dat dezelfde mensen telkens worden belast.
4Het 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-11mADR-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.
6Elk 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.
6bNiveau-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).
7Blijft 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.
8De 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"]

StapModelondersteuning
1. Vraag met doelgroepVraag (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 criteriaDe 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-voorrangGebruiker.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 uitsluitenDe Vraag.makerId (en makerIsGeregistreerd) identificeren de maker, die uit de kandidatenlijst wordt verwijderd.
5. Slots voor de beoordelingenEr 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 opgepaktBij het kiezen krijgt de Opdracht vraagId, een reviewer, een reviewerSnapshot (ProfielSnapshot), een criteriaSnapshot (SelectieCriteria), status OpdrachtStatus.Gekozen, assignedAt en verlooptOp (de antwoordtermijn).
7. RecyclingVerstrijkt 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-vangnetIs 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 = panelDe 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.