Een leerling praat maandenlang met één vak: duizenden berichten, tientallen bestanden, honderden kleine checks. Meer daarvan in de prompt stoppen schaalt niet en maakt de tutor niet eerlijker. Dit is hoe we elk vak een geheugen gaven dat het verleden op relevantie rangschikt, een conceptkaart van de leerstof, en beliefs over de leerling die hun eigen bewijs meedragen, en wat echte geschiedenissen ons leerden toen we ze afspeelden. Er worden bewust geen leveranciers genoemd; de methode is er niet van afhankelijk. Elk getal hier is gemeten, niet geschat.
Wat "onthouden" moet betekenen
Het naïeve antwoord op "de tutor vergeet" is een groter venster: houd meer van het gesprek in de prompt, vat de rest samen. Het faalt op drie afzonderlijke manieren, en elke is een productprobleem voordat het een technisch probleem is.
- Tijd. Een leerling die in september vraagt naar iets dat in juli behandeld is, heeft de julisessie nodig, niet de laatste veertig berichten. Een samenvatting van "wat er tot nu toe gebeurd is" wordt vager naarmate hij groeit; precies het relevante detail is wat een samenvatting laat vallen.
- Bestanden. Een vak bevat tientallen documenten. Retrieval haalt de acht passages op die het dichtst bij de vraag liggen, wat prima is voor feiten en nutteloos voor "hoe verhoudt dit hoofdstuk zich tot dat andere", de structuur van de leerstof staat nooit in één enkele passage.
- Eerlijkheid. Een tutor die rapporteert "je begrijpt osmose" moet kunnen zeggen waarom: welke check, op welke dag, wat de leerling antwoordde. Een getal zonder bewijs is een gok met een komma.
Dus stelden we drie beloftes voordat we een regel code schreven: elke beurt wordt een duurzame episode en recall rangschikt de hele geschiedenis op relevantie, niet op datum; concepten worden één keer per bestand geëxtraheerd en samengevoegd tot één kaart per vak; en beheersing wordt alleen gevoed door bewijs, een beantwoorde check, een gemaakte quiz, een gespeelde ronde, waarbij elke belief zijn bewijs en zijn geschiedenis bewaart. En een vierde, stillere belofte: wanneer de tutor zich niets herinnert, zegt hij dat gewoon.
De vorm van het systeem
Drie stores, één gebudgetteerde read per beurt, één lus per nacht. Bestanden voeden de kaart; het gesprek voedt de episodelog; checks voeden beliefs. Elke chatbeurt leest een kleine, gerangschikte plak van alle drie en zet die in de prompt binnen een vast tokenbudget. Niets in het leespad roept een generatief model aan. Het enige model dat het wel aanroept is de embedding, één keer per beurt, gedeeld door routering en recall; de enige generatieve aanroep buiten de chat is degene die een nieuw bestand in de kaart leest.
Episodes: een append-only · hashketene log
Elk event wordt een episode: een vraag, een antwoord, een check met zijn verdict, een quizresultaat, een aankomend bestand, iets wat de leerling de tutor expliciet leerde. Een episode draagt een samenvatting van één regel, de volledige tekst, de concepten die het raakte, een belangscore die bij het schrijven wordt vastgesteld, en zijn bewijs: voor een antwoord, het bestand en de pagina die het citeerde, gestempeld met de vingerafdruk van het bestand op dat moment. Episodes worden nooit bewerkt. Elke episode bewaart de hash van de vorige in dezelfde keten, zodat de log herberekenbaar is en elke manipulatie, of elke stille herschrijving door een goedbedoelde migratie, zichtbaar wordt als een breuk. Dat is bewijs van manipulatie, geen bescherming tegen manipulatie: een herschrijving wordt gedetecteerd, nooit voorkomen, en dat geldt alleen zolang de keten of een checkpoint daarvan bewaard blijft.
Belang wordt bepaald door wat een episode is, niet door een stemming: een gemiste check (0.7) telt zwaarder dan een geslaagde (0.6), en iets wat de leerling de tutor leerde (0.85) telt het zwaarst, omdat het de ene herinnering is die een persoon expliciet heeft gevraagd te bewaren. Een vraag krijgt een bescheiden 0.35, de eigen vraag van een leerling is een correcte recall en een nutteloze herinnering, wat later blijkt mee te tellen voor het pad "waar doet dit me aan denken".
Recall: relevantie moet het winnen van recentheid
Recall is associatief, niet chronologisch. Kandidaten worden verzameld uit verschillende pools, die elk de hele geschiedenis bereiken, en pas daarna gescoord: de meest recente vijfhonderd, elke episode met een onderscheidend woord uit de vraag, elke episode die de concepten raakt waarnaar de vraag is gerouteerd, en de semantische buren uit een vector-index. Eerst verbreden en dan pas snijden is de belangrijkste ontwerpbeslissing in de module, het eerste ontwerp snee eerst ("de nieuwste 500") en kon een perfect relevante herinnering uit maart bij geen enkele relevantie terugvinden, omdat die al was weggesneden voordat hij werd gescoord.
Gewichten alleen zijn niet genoeg. Wanneer de vraag over iets specifieks gaat en er iets matcht, worden episodes die niets matchen verwijderd in plaats van laag gerangschikt, een verse irrelevante notitie scoort 0.15 × 1.0 op recentheid alleen, terwijl een 200 dagen oude exacte match 0.55 × 0.156 scoort, en geen enkele weging die een non-match laat winnen van een match is ooit juist, bij welke instelling dan ook. Recentheid is een tiebreaker, geen rangschikker. Twee vragen die een lezer zou moeten stellen over die getallen: waar ze vandaan kwamen, en of we ze hebben gefit. Ze zijn met de hand vastgesteld, overgenomen uit een eerder geheugensysteem van ons dat voor een ander product is gebouwd, en ze zijn niet afgesteld op enige data uit dit artikel. Niets hieronder is doorzocht of gefit; de enige aanpassing die we aan de scoring hebben gedaan, kwam voort uit een fout die we konden benoemen, niet uit een zoektocht, en die betrof de poort, niet een gewicht. De poort heeft twee uitzonderingen: helemaal geen zoekopdracht (dan is recentheid het enige wat er is), en niets gematcht (dan is het recente verleden het eerlijkste beste aanbod).
Twee dingen die echte geschiedenissen toevoegden
Herhalingen vallen samen. In één echt vak waren 161 leerlingvragen 56 verschillende zinnen, "wat is een cel" negen keer gevraagd over drie maanden. Negen kopieën zijn één herinnering, negen keer herinnerd, dus recall voegt identieke episodes samen en rapporteert voor hoeveel de overlevende staat. Tijd is een filter, geen hint. "Wat hebben we in juli behandeld?" wordt geparsed tot een venster en recall zoekt daar eerst binnen; als het venster leeg is, zegt het blok dat expliciet (zie § eerlijkheid). Maandnamen werken in de talen waarin onze leerlingen schrijven, net als "vorige week" en "gisteren".
De conceptkaart
Passages beantwoorden "wat zegt het bestand hier"; een kaart beantwoordt "waaruit bestaat dit vak, en wat bouwt op wat". Elk bestand wordt één keer gelezen door een modelaanroep die een begrensde lijst concepten teruggeeft, naam, samenvatting in één zin, een korte definitie, de concepten waarop het voortbouwt uit zijn eigen lijst, de pagina's waar het bestand het uitlegt. Sectietitels ("Inleiding", "Veelvoorkomende misvattingen") worden door een validator afgewezen; een naam die eigenlijk een hoofdstuktitel is, is het meubilair van het bestand, niet een idee van het vak.
Concepten worden over bestanden heen samengevoegd via een canonieke key (een genormaliseerde naam, schriftbewust) en via embedding-gelijkenis boven 0.86. Herkomst hoopt zich op: een hoofdstuk dat osmose opnieuw uitlegt, voegt zichzelf toe aan één node in plaats van een tweede te maken, en elk bestand dat heeft bijgedragen blijft vermeld met zijn pagina's. Een randvoorwaarde die het bestand aanneemt maar nooit uitlegt, wordt alleen een node wanneer twee concepten die aannemen, dan is de leemte echt en het tonen waard; een eenmalig geval wordt op het concept genoteerd als "aanname" en nergens getekend. Het eerste beleidsdocument dat we lazen, maakte van 11 concepten 34 nodes voordat die regel bestond.
Drie afgeleide getallen komen uit de kaart. Centraliteit is een gewogen PageRank over de randen (een randvoorwaarde waarop alles voortbouwt, is een hub). Gereedheid per concept volgt vier banden, 0.35 alleen genoemd, 0.60 uitgelegd door een bestand, 0.85 bevestigd door een geslaagde check, 1.0 onderwezen door een persoon, en de gereedheid van het vak is het centraliteit-gewogen gemiddelde, zodat een hub die de bestanden niet uitleggen meer kost dan een blad. Onderwijsvolgorde is een topologische laagindeling: randvoorwaarden eerst, hubs eerst binnen een laag; dit verving een modelaanroep die vroeger "wat te onderwijzen" schetste uit veertien passages.
SUBJECT MAP (16 concepts; the files explain 79% of it, this is about the material, NOT the student's mastery):
- Mitochondria: Mitochondria release energy from glucose. [taught: in our class we call the mitochondria the powerhouse of the cell] (builds on: Cytoplasm)
- Cytoplasm: Cytoplasm is the gel-like substance inside the cell membrane. (builds on: Cell Membrane)
- Chloroplasts: Chloroplasts are involved in photosynthesis. (builds on: Cell Wall)
- Endosymbiosis: Endosymbiosis explains the origin of mitochondria and chloroplasts. (builds on: Mitochondria, Chloroplasts)
…
Die kopregel was zelf al een les. De eerste versie zei "79% begrepen", en een model dat dit las, vertelde een leerling vrolijk "gezien je huidige begrip van 79%…". Een gereedheidsgetal dat gelezen kan worden als de beheersing van de leerling, zal zo gelezen worden; de regel zegt nu waar hij over gaat.
Het vak onderwijzen
Een persoon kan de kaart aanvullen door ermee te praten. "Onthoud dat we in de klas de mitochondriën de krachtcentrale van de cel noemen" hangt een taught-notitie aan het concept dat het noemt (routering op naam; alleen een exacte match), zet de gereedheid van dat concept op 1.0, schrijft een taught-episode, en plaatst de notitie in de briefing. Wanneer de zin geen bestaand concept noemt, wordt een nieuwe node aangemaakt op de taught-laag met een korte naam, nooit de hele zin. Vragen onderwijzen nooit; alleen een expliciete "onthoud dat", "behandel X als", of het equivalent daarvan in de taal van de leerling doet dat.
Beliefs die hun geschiedenis bewaren
Een belief is wat de tutor momenteel denkt over deze leerling op dit concept, "worstelt met osmose", "begrijpt cytoplasma", met een vertrouwen en de episodes daarachter. De regel die telt: rijen worden nooit bijgewerkt tot een andere claim. Wanneer de tutor van gedachten verandert, blijft de oude rij precies zoals hij was, wordt een nieuwe rij ingevoegd, en verwijst de oude naar de nieuwe. Recall leest alleen rijen die door niets worden vervangen; een rapport kan de keten aflopen wanneer iemand vraagt wat er veranderde en waarom. Behoud en actualiteit zijn verschillende eigenschappen, en een geheugen dat beide bewaart, is een geheugen waarop een rapport gebouwd kan worden.
Beliefs zijn goedkoop waar het telt: ongeveer twintig tokens elk, en één staat voor tientallen episodes. Die verhouding, niet een groter venster, is wat "meer onthouden dan in de context past" werkelijk betekent. Episodes worden niet weggegooid, ze zijn waar een belief tegen wordt getoetst, maar ze komen op de tweede plaats en de aanroeper besteedt zijn resterende budget aan hen.
Waarover gaat een belief?
Dit was het deel dat echte data het eerst brak. In teach-modus was het "topic" van een check de eigen woorden van de leerling geweest, dus afgespeelde checks leverden beliefs op als begrijpt stel me de vragen (ask me the questions) en worstelt met bueno ahora explícame todos los pasos. Nu wordt het topic van een check op naam naar een concept gerouteerd, en wanneer de topic-string een zin is, via de eigen evaluatietekst van de tutor (die meestal het concept noemt) op alleen een exacte naammatch. Een topic dat naar niets verwijst en klinkt als een uiting, vraagwoorden, werkwoorden van vragen, voornaamwoorden, stopwoordjes, in de talen die onze leerlingen gebruiken, wordt bewaard als bewijs maar wordt nooit een belief. Zo'n regelwijziging vraagt om een manier om opnieuw af te leiden: de huidige beliefs worden ingetrokken (nooit verwijderd), de checks op record worden afgespeeld onder de regels van vandaag, zonder enige episode aan te raken.
Één beurt, binnen een budget
Elke chatbeurt vraagt het brein om één blok, opgebouwd buiten het requestpad met een harde tijdslimiet. Over 155 beurten duurde het blok 295 ms bij de mediaan, 403 ms bij het 90e percentiel en 445 ms bij het 95e, met één opbouw van meer dan een seconde en geen enkele boven de cap van 2.5 s, waarna de bundel vervalt in plaats van afgewacht te worden, zodat een traag geheugen nooit voor het eerste token gaat staan. Eén embedding van de vraag bedient zowel routering als recall. Het blok gaat in de bestaande geheugenslot van de prompt, vóór de materiaalpassages, en niets anders aan de prompt verandert.
===== YOUR MEMORY OF THIS STUDENT AND SUBJECT ===== THE STUDENT IS ASKING ABOUT THEIR OWN RECORD. Answer from the beliefs and the earlier work listed here … WHAT YOU CURRENTLY BELIEVE ABOUT THIS STUDENT (from their checks; confidence 0–1): - understands cytoplasm (0.72) - understands eukaryotic cells (0.72) EARLIER WORK WITH THIS STUDENT (oldest first): - 12 Jul · you were asked: Can we go over Eukaryotic Cells today? I keep mixing it up. - 12 Jul · you answered: Of course. Eukaryotic Cells: Eukaryotic cells contain a nucleus and organelles. We worked through two examples and you got the second one right. - 18 Sep · the student taught you: Taught: in our class we call the mitochondria the powerhouse of the cell - 18 Sep · check: Check on cytoplasm: right (and 3 more times like it) SUBJECT MAP (16 concepts; the files explain 79% of it, …) … HOW TO USE THIS: it is your own memory of past work with this student, not their material. When you rely on it, say when it happened ("in July we…"). Never claim a memory that is not listed here. … ===== END OF MEMORY =====
De volgorde binnen het blok bleek net zo belangrijk als de inhoud. Bij een gewone vraag komt de kaart eerst. Bij een verledenvraag: "wat heb ik tot nu toe fout gedaan", "wat hebben we bestudeerd", "ماذا أخطأت", komen de beliefs en het eerdere werk eerst en de kaart laatst, met een expliciete eerste regel die zegt dat de leerling naar zijn eigen record vraagt. Dit leerden we van een mislukking: de prompt bevatte ook een legacy "beoordelingsresultaten"-sectie die begint met "NO QUIZ ATTEMPTS recorded", en het model antwoordde een leerling die achtentwintig checks in het gesprek had beantwoord met "je hebt nog geen quizzen gemaakt". Een model leest de eerste gezaghebbende uitspraak over een record en stopt daar. Het geheugenblok gaat nu aan die sectie vooraf, een overbruggende notitie verbindt de twee, en een beoordelingssectie die alleen "niets geregistreerd" zegt, wordt weggelaten wanneer het geheugenblok bestaat.
Leerling: Wat heb ik tot nu toe fout gedaan op de checks, en wat moet ik herhalen?
Tutor: Wat je fout deed op de checks: 1. Check over wat een cel is: deels juist, je beschreef het als "it's like a tiny thing?", wat onvolledig is. Foute antwoorden: je antwoordde op verschillende momenten "yes" en "watter", die als fout werden gemarkeerd. 2. Check over enzymen: je stelde terecht dat enzymen "proteins that break down food for easier digestion" zijn. Voorgestelde herhaling: gezien je moeite met wat een cel is: celstructuur (prokaryoot versus eukaryoot)… onderdelen van een cel… bijvoorbeeld, mitochondriën geven energie vrij uit glucose, wat je in de klas hebt geleerd.
Zeggen: "ik heb geen record"
De meest leerzame mislukking van het hele project was een scenario dat we schreven om te slagen: zaai een julisgesprek, vraag "wat hebben we in juli over X behandeld", controleer het antwoord. Het antwoord begon met "In juli behandelden we X…" en was vloeiend, onderbouwd in het bestand, en volledig verzonnen, het julgeheugen had de prompt niet bereikt, en het model vertelde juli na vanuit de framing van de vraag. Twee oorzaken. De verledenvraag-modus had alleen checks en quizzen bewaard en het gesprek laten vallen dat het eigenlijke record was; en de eigen eerdere narraties van de tutor ("In juli behandelden we…", opgeslagen als antwoord-episodes) werden opgehaald alsof het herinneringen aan juli waren, het brein dat zich herinnerde dat het zich herinnerde.
voor "In juni behandelden we het onderwerp van het celmembraan, dat als volgt wordt beschreven: het celmembraan is een dubbele laag fosfolipiden…"
na "Ik heb geen record van wat we specifiek in juni over het celmembraan behandeld hebben. Ik kan je wel informatie over het celmembraan geven uit het materiaal dat we hebben…"
Beide gevallen zijn nu scenario's in een herhaalbare runner: het juli-scenario slaagt alleen als de julgeheugens in de prompt staan (gecontroleerd op de opgeslagen geheugen-ids van het bericht, niet op de formulering van het antwoord), en het lege-maand-scenario slaagt alleen als het antwoord zegt geen record te hebben en geen sessie beschrijft.
Geheugen als bronvermelding
Onze chat had al een herkomstpaneel: elke claim in een antwoord wordt herleid tot een regel in de bestanden van de leerling, en een antwoord met te weinig herleide claims wordt gemarkeerd als grotendeels niet onderbouwd. Die tracer kende alleen bestanden. Een correcte "in juli behandelden we X, en je had het tweede voorbeeld goed" zou daardoor gelezen worden als niet in je aantekeningen: de functie die een ware uitspraak vals noemt. Dus worden de herinneringen waaraan de tutor werd herinnerd, opgeslagen bij het antwoord, en behandelt de tracer elke opgehaalde episode als nóg een bron, gelabeld met wanneer het gebeurde.
Datzelfde onderbouwingsresultaat geeft elke antwoord-episode een positie: beantwoord, deels, of niet mogelijk, achteraf opgeslagen. Zo leert het rapport welke vragen de bestanden niet konden beantwoorden, zonder een tweede modelaanroep en zonder een verborgen "frame"-regel in de stream, wat we hebben geprobeerd en verworpen: in de gewone antwoordmodus filtert niets de stream, dus een verborgen regel zou de leerling hebben bereikt.
Een geheugen dat zichzelf controleert
Een geheugen dat zichzelf niet kan controleren, wordt met de jaren zelfverzekerder en minder juist. Omdat het bewijs van een antwoord de vingerafdruk van het bestand op dat moment vastlegt, is verificatie een lookup, geen modelaanroep: klopt: het geciteerde bestand is er nog, ongewijzigd; anders: het is vervangen of verwijderd, en de notitie zegt welke; oncheckbaar: de herinnering citeert geen bestand (een gesprek, een check). Dat derde antwoord is een volwaardig resultaat, geen fout; een gespreksherinnering rapporteren als "klopt" zou pas echt een fout zijn. Een opgehaalde episode komt al gelabeld in de prompt aan: "[note: the file this cited has been replaced or removed since]".
De nachtelijke cyclus
Eenmaal per nacht, voor elk leerling-vakpaar dat de afgelopen dag actief was, draait een deterministische cyclus zonder modelaanroepen: comprimeer de dag tot één consolidatie-episode (aantallen per type, de checktelling, de topics, de vijf meest saillante krantenkoppen; een rustige dag schrijft niets, en de notitie vat nooit haar eigen soort opnieuw samen); laat elke belief die 45 dagen onaangeraakt is met 15 % vervallen en markeer hem zodat de volgende check dit bevestigt; calibreer de beheersing die de tutor vóór elke check voorspelde tegen het verdict; verifieer een begrensde batch citaties, nooit-gecheckte eerst; herbouw de kleine working set; stel het zelfmodel opnieuw samen.
Calibratie is de eerlijkheidscheck op het vertrouwen van de tutor: vóór elke check weten we welke beheersing hij voorspelde; erna weten we het verdict. In buckets levert dat een betrouwbaarheidscurve en een verwachte calibratiefout op, en het zelfmodel rapporteert "gecalibreerd" alleen vanaf vijf checks met een voorspelling. Tot dan zeggen de grenzen dat expliciet, behandel vertrouwen als een rangschikking, niet als een kans.
Wat echte geschiedenissen ons leerden
Scenario's bewijzen mechanismen; ze bewijzen niet dat het werkt op de manier waarop mensen echt praten. Daarom bouwden we een replay: neem de rijkste echte leerling-vakgeschiedenissen, alleen-lezen, bouw elk opnieuw op in een geïsoleerde kopie van het platform, bouw het brein ervoor op, en stel drie echt-vormige vragen via het echte chat-endpoint als die gebruiker. Zes paren, 65–142 berichten elk, 13–32 teach-mode-verdicts elk, één in het Spaans. Ze vormen geen aselecte steekproef en moeten ook niet als zodanig gelezen worden. We namen geschiedenissen van minstens veertig berichten, maximaal twee per leerling, test- en interne accounts uitgesloten, met voorkeur voor de geschiedenissen met de meeste beoordeelde antwoorden, omdat een geschiedenis waar niets in staat niets op de proef stelt. Dat vertekent elk getal hier in het voordeel van zware gebruikers. Het vak van een lichte gebruiker zou het geheugen minder te herinneren geven, en minder kans om iets fout te doen.
Het leverde ook de drie hierboven beschreven fixes op: beliefs op leerlingzinnen, het record dat vanuit de kaart werd beantwoord in plaats van vanuit het record zelf, de legacy "geen quizpogingen"-regel die antwoorden aanstuurde, en één bevestiging die we graag zagen: een consolidatie markeerde elf herinneringen waarvan het geciteerde bestand niet meer bestond. De verifier die zijn werk deed.
| Vak (echt, afgespeeld) | Berichten | Checks | Concepten | Beliefs na herderivatie | Kaartgereedheid |
|---|---|---|---|---|---|
| Algebramodule | 142 | 32 | 16 | 0, elk check-topic was een zin en geen evaluatie noemde een concept; de checks blijven op het record staan en het rapport zegt dit | 0.60 |
| Literatuureenheid | 97 | 14 | 10 | 3, allemaal concept-gekoppeld | 0.68 |
| Informatica & probleemoplossing | 91 | 29 | 7 | 4, allemaal concept-gekoppeld | 0.60 → 0.81 |
| Biología (Spaans) | 88 | 31 | 15 | 6 (5 concept-gekoppeld), vooral "worstelt met…" na een reeks foute antwoorden | 0.62 |
| Triple science | 75 | 13 | 16 | 2, allebei concept-gekoppeld | 0.64 |
| Godsdienstwerkboek | 65 | 18 | 12 | 6 (5 concept-gekoppeld) | 0.72 |
De algebrarij is de eerlijke. Tweeëndertig checks en geen belief, omdat geen enkele aan een concept gekoppeld kon worden: de leerling beantwoordde rekenkunde, de antwoorden van de tutor noemden nooit de concepten van het hoofdstuk, en een uiting is geen topic. Het rapport voor die leerling zegt "32 checks staan op het record, maar geen enkele kon nog aan een concept in de kaart gekoppeld worden" in plaats van "nog geen checks". Niets verzonnen, inclusief de beheersing.
Een benchmark, geen demo
Alles hierboven is een meting of een voorbeeld: hoe lang dingen duren, wat de replay opleverde, antwoorden die we goed vonden. Niets daarvan toont aan dat het geheugen zijn plaats verdient, want er is nooit vergeleken met dezelfde tutor zonder geheugen. Dus hebben we die vergelijking gemaakt. Één vooraf geregistreerde vragenset, vier designs van dezelfde tutor die alleen verschillen in wat de prompt bereikt, en scorers die string- en id-vergelijkingen zijn in plaats van meningen, zodat hetzelfde antwoord altijd op dezelfde manier scoort.
De vragen worden per vak gegenereerd uit de eigen vastgelegde gegevens van dat vak, en dat is wat ze scorebaar maakt: een vraag over wat de leerling fout had, wordt getoetst aan de checks die daadwerkelijk zijn vastgelegd, een vraag over een vereiste aan een echte verbinding in de kaart, een vraag over een maand aan de maanden waarin dat vak daadwerkelijk actief was. Waar een vak er meer dan één ondersteunt, krijgt het er meer dan één, dus drie concepten en drie lege maanden in plaats van telkens één. Zes categorieën, 420 gescoorde vragen per design, over 45 echte leerlinggeschiedenissen die zijn afgespeeld in een geïsoleerde kopie van het platform en gesteld via het gewone chat-endpoint, als die leerling.
De vier designs
Alle vier draaien dezelfde retrieval over dezelfde bestanden. Kale retrieval is de tutor zonder enig geheugen. Venster is het antwoord waar de meeste mensen als eerste naar grijpen: de laatste twintig gespreksbeurten, ongerangschikt toegevoegd. Episodes is gerankte recall van alleen de episodelog, zonder conceptkaart, zonder beliefs en zonder speciale afhandeling van vragen over het verleden. Volgeheugen is alles wat dit artikel beschrijft.
Wat de tabel zegt
Al met al gaat de tutor van 168 van de 420 naar 383, dat is 40 procent tegenover 91. Het gemiddelde is hier het minst interessante cijfer; de vorm van het verschil is de bevinding.
Groter venster is niet het antwoord. Als je de laatste twintig beurten zomaar in de prompt zet, ga je van 40 procent naar 65, en dat is alles wat het oplevert. Het beantwoordt 5 van de 32 vragen over wat de leerling fout had, omdat twintig beurten chat niet is waar dat leeft, en het zit nog steeds vaker fout dan goed over een lege maand. Dit is het antwoord van "stop er gewoon meer van het gesprek in", gemeten in plaats van beweerd.
Gerankte recall doet het meeste werk. De episodelog alleen al komt tot 83 procent. Als je één ding bouwt, bouw dat: een append-only log, gescoord op relevantie, is het grootste deel van de waarde in dit artikel.
De kaart en de beliefs zijn de overige 33 vragen waard, en ze verdienen die op twee specifieke plekken in plaats van overal. Gevraagd wat te herhalen vóór een onderwerp, antwoorden de designs zonder conceptkaart ongeveer 55 procent van de tijd juist en het volgeheugen 96, omdat vereisten verbindingen zijn, iets wat een episodelog niet heeft. Gevraagd wat de leerling fout had, brengen beliefs en de verledentak het van 24 van de 32 naar 30. Gevraagd om een concept uit te leggen, voegt de kaart helemaal niets toe: 100 in beide gevallen.
kale retrieval, een maand zonder activiteit 1 van de 132 goed. Gevraagd wat er behandeld werd in een maand waarin de leerling nooit actief was, beschrijft het de stof en koppelt het die aan de maand, bijna elke keer.
volgeheugen, dezelfde vraag 128 van de 132. Het zegt dat het niets heeft vastgelegd over die periode en biedt aan wat het wel heeft.
Wat het kostte
Wat deze benchmark niet laat zien
Het laatste van die cijfers is degene om in gedachten te houden bij het lezen van de rest. We hebben het volgeheugen dezelfde 420 vragen een tweede keer gesteld, en 44 daarvan scoorden anders. De ruis van run tot run is dus ongeveer een tiende, het verschil van 33 vragen tussen de beste twee designs zit daar ruim buiten, en het verschil van 2 vragen tussen hen op de lege maand niet: op die categorie staan ze gelijk en dat zullen we niet anders beweren.
Eén categorie bleek waardeloos en we laten hem in de grafiek staan in plaats van hem er stilletjes uit te halen. Een maand waarin de leerling was actief scoort 44 van de 44 voor elk design, inclusief het design zonder enig geheugen. Het kan onderbouwde recall niet onderscheiden van een aannemelijke beschrijving die toevallig de juiste maand noemt, wat precies het falen is dat de zustercategorie opvangt. Een test die iedereen haalt, meet niets.
De scorers zijn stringvergelijkingen, geschreven door dezelfde mensen die de feature bouwden. Ze belonen een antwoord dat de vastgelegde woorden hergebruikt en kunnen een juist antwoord dat helemaal anders is geformuleerd niet herkennen, en dat heeft ons één keer flink pijn gedaan: de vragen over vereisten werden gegenereerd met de richting van de verbinding omgekeerd, waardoor deze categorie lange tijd gold als de zwakste van het geheugen, terwijl de tutor het eigen antwoord van de kaart gaf en daarvoor fout werd gerekend. Het is juist de sterkste categorie van de kaart. We hebben dat ontdekt door de mislukkingen te lezen in plaats van de totalen, wat de enige manier is waarop dit soort fouten aan het licht komt.
En de populatie is niet willekeurig. Dit zijn 45 echte geschiedenissen die gekozen zijn omdat er iets in zit: minstens vijftien berichten, bijgevoegde bestanden, en voor de categorieën die beoordeelde antwoorden nodig hebben, minstens vijf daarvan. Een leerling die net is begonnen, zou hier veel minder van gebruikmaken en zou veel minder van het verschil merken.
Wat dit niet is
Vier dingen waarvoor het wordt aangezien, en wat het in plaats daarvan is.
- Geen groter contextvenster. De kosten per beurt zijn begrensd en groeien niet mee met de geschiedenis. De benchmark zet een cijfer op het verschil: het naïeve venster beantwoordde 65 procent van de 420 vragen goed, waar het geheugen op 91 uitkwam.
- Geen samenvatting. Niets wordt herschreven. Episodes zijn onveranderlijk, een correctie is een nieuwe rij die naar de oude verwijst, en de belief van maart is nog altijd leesbaar nadat augustus die heeft vervangen.
- Geen vectorzoekopdracht over de chatlog. De vectorindex is een van vier pools, en de rangschikking filtert eerst op relevantie, voordat recentheid, saillantie of frequentie nog een stem krijgen.
- Geen door een model geschreven profiel van de leerling. Geen enkele doorloop van de geschiedenis levert een beschrijving van de leerling op. Elke belief is een band, berekend uit beoordeelde antwoorden, met de bewijs-ids eraan gekoppeld en een vervangingsketen erachter.
Wat het wel is: een begrensde read over een onveranderlijk log, een graaf van het materiaal die één keer per bestand wordt geëxtraheerd, en beliefs die hun eigen bewijs met zich meedragen.
Principes die we vasthielden
- Niets verzonnen. Beheersing komt alleen uit checks, quizzen en rondes; een concept bestaat alleen omdat een bestand het uitlegde of een persoon het onderwees; een lege periode zegt dat.
- Bewijs, of het is niet gebeurd. Elke belief, elke rapportrij, elke leemte draagt de id's van waarop hij rust, en het citatiepaneel toont herinneringen naast pagina's.
- Behoud is geen actualiteit. Bewaar de maartbelief voor altijd; grond er nooit meer op zodra augustus hem vervangen heeft. Een correctie is een nieuwe rij met een link, nooit een bewerking.
- Relevantie wint van recentheid. Verbreed voordat je snijdt; gebruik een poort, weeg niet alleen.
- De eigen narratie van de tutor is geen geheugen. Een antwoord dat het record navertelt, wordt bij het schrijven gemarkeerd en nooit opgehaald als een herinnering aan het vak.
- Volgorde is inhoud. Een model leest de eerste gezaghebbende uitspraak over een record en stopt; zet het record vóór alles wat ervoor verward zou kunnen worden.
- Een uiting is bewijs, nooit een topic. "Ask me the questions" kan goed of fout zijn; niemand begrijpt het.
- Een geheugen moet zichzelf kunnen controleren. Leg de vingerafdruk vast op het moment zelf; verifieer via lookup; behandel "oncheckbaar" als een antwoord.
Het geheel is een paar duizend regels, het meeste ervan gewoon: een ledger, een graaf, een scoringsfunctie, een renderer met een budget, en een nachtelijke job. Het moeilijke deel was niet de code, maar telkens wanneer het model iets vloeiend en verkeerd zei, beslissen dat de fix in het geheugen thuishoorde, niet in de toon van de prompt.