[{"data":1,"prerenderedAt":2339},["ShallowReactive",2],{"blog-article-/nl-nl/blog/zero-hallucination-qa":3,"blog-list-nl-nl":1428},{"id":4,"title":5,"body":6,"config":1412,"date":1413,"description":1414,"draft":1415,"extension":1416,"image":1412,"meta":1417,"navigation":1418,"path":1419,"seo":1420,"stem":1421,"tags":1422,"toolbar":1412,"translationKey":1426,"updated":1413,"__hash__":1427},"blog/nl-nl/blog/zero-hallucination-qa.md","Hoe ik nul-hallucinatie Q&A in onze reader heb gebouwd",{"type":7,"value":8,"toc":1376},"minimark",[9,17,32,35,40,47,52,57,75,80,93,98,132,135,139,157,164,168,183,188,225,232,236,249,274,279,396,414,420,422,426,433,448,455,475,481,483,487,490,496,498,502,525,535,596,599,610,620,627,629,633,644,650,657,661,668,676,683,687,697,740,751,757,759,763,777,785,791,794,829,839,847,853,860,864,872,878,889,891,895,901,905,912,916,939,946,948,952,958,1016,1021,1023,1027,1034,1053,1057,1077,1088,1090,1094,1105,1108,1131,1142,1148,1150,1154,1169,1180,1182,1186,1207,1218,1220,1224,1243,1249,1251,1255,1343,1350,1361],[10,11,12],"p",{},[13,14],"img",{"alt":15,"src":16},"Omslag: nul-hallucinatie Q&A","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[18,19,20],"blockquote",{},[10,21,22,23,27,28,31],{},"Dit artikel beschrijft hoe we ",[24,25,26],"strong",{},"nul-hallucinatie Q&A"," in onze AI-reader hebben geïmplementeerd: antwoorden zijn strikt gebaseerd op de brontekst van het geopende boek, en belangrijke uitspraken zijn ",[24,29,30],{},"met één klik te traceren"," naar de exacte passage. Als je AI-lezen, document-Q&A of RAG-achtige apps bouwt, hopen we dat drie iteraties aan lessen en de uiteindelijke architectuur nuttig zijn.",[33,34],"hr",{},[36,37,39],"h2",{"id":38},"i-evolutie-in-drie-fasen","I. Evolutie in drie fasen",[10,41,42,43,46],{},"Nul-hallucinatie Q&A was niet vanaf dag één perfect ontworpen. Het evolueerde onder spanning tussen ",[24,44,45],{},"kosten, latentie en nauwkeurigheid",". Hieronder een chronologisch overzicht van drie fasen—nuttige context om te begrijpen waarom de huidige architectuur er zo uitziet.",[48,49],"mermaid",{":config":50,"code":51},"config","flowchart%20LR%0A%20%20%20%20P1%5BFase%201%3A%20volledige%20tekst%20dumpen%5D%20--%3E%20P2%5BFase%202%3A%20LLM%20sleutelzinnen%20extraheren%5D%0A%20%20%20%20P2%20--%3E%20P3%5BFase%203%3A%20segmentindex%20%2B%20Tool-retrieval%5D%0A%20%20%20%20P1%20-.-%3E%7CTraag%2C%20duur%2C%20onnauwkeurig%20bij%20lange%20boeken%7C%20X1%5BAfgeschaft%5D%0A%20%20%20%20P2%20-.-%3E%7CDetailverlies%2C%20nog%20traag%7C%20X2%5BAfgeschaft%5D%0A%20%20%20%20P3%20--%3E%7CHuidig%7C%20OK%5BNul%20hallucinatie%20%2B%20traceerbaar%5D",[53,54,56],"h3",{"id":55},"fase-1-de-volledige-boektekst-in-de-context-dumpen-eenvoudigsten-als-eerste-problematisch","Fase 1: de volledige boektekst in de context dumpen (eenvoudigst—en als eerste problematisch)",[10,58,59,62,63,66,67,70,71,74],{},[24,60,61],{},"Aanpak:"," Wanneer een gebruiker een boek opent en een vraag stelt, plaats je ",[24,64,65],{},"alle geëxtraheerde hoofdtekst"," in de system prompt of het user-bericht en laat je het chatmodel antwoorden. Overschrijdt het boek ongeveer ",[24,68,69],{},"400.000 tekens",", dan volgt ",[24,72,73],{},"harde truncatie","—alleen het begin blijft behouden; latere hoofdstukken zijn onzichtbaar voor het model.",[10,76,77],{},[24,78,79],{},"Voordelen:",[81,82,83,87,90],"ul",{},[84,85,86],"li",{},"Zeer lage implementatiekosten; vrijwel geen preprocessing;",[84,88,89],{},"Werkt redelijk op korte boeken en eenvoudige documenten—het model heeft het boek echt «gezien»;",[84,91,92],{},"Eenvoudige UX: vragen en antwoord krijgen, geen «even wachten terwijl we analyseren»-status.",[10,94,95],{},[24,96,97],{},"Nadelen (snel onacceptabel):",[81,99,100,106,112,122],{},[84,101,102,105],{},[24,103,104],{},"Trage reacties:"," Bij elke vraag gaat een enorme payload mee; time-to-first-token en totale latentie groeien met de boeklengte;",[84,107,108,111],{},[24,109,110],{},"Hoge tokenkosten:"," Je betaalt bij elke vraag opnieuw voor de volledige boekinput;",[84,113,114,117,118,121],{},[24,115,116],{},"Lange boeken vervormen sterk:"," Na 400.000 tekens bestaan het tweede deel, bijlagen en conclusies feitelijk niet meer—en de UI geeft vaak ",[24,119,120],{},"niet duidelijk aan"," dat er is afgekapt;",[84,123,124,127,128,131],{},[24,125,126],{},"Nul retrieval-granulariteit:"," Het model moet «naar een speld in een hooiberg zoeken» over honderdduizenden tekens—gemakkelijk details missen en makkelijker ",[24,129,130],{},"plausibel klinkende samenvattingen zonder basis"," produceren—precies wat leesapps moeten vermijden.",[10,133,134],{},"Fase 1 is prima voor een MVP, niet voor een productwaardige oplossing.",[53,136,138],{"id":137},"fase-2-een-lichter-llm-gebruiken-om-sleutelzinnen-te-extraheren-context-comprimerenmaar-te-agressief","Fase 2: een lichter LLM gebruiken om sleutelzinnen te extraheren (context comprimeren—maar te agressief)",[10,140,141,143,144,147,148,151,152,156],{},[24,142,61],{}," Vóór Q&A (of bij eerste openen) draait een ",[24,145,146],{},"goedkoper model"," over de hoofdtekst: splitsen per spine-hoofdstuk (of het hele boek in stukken), ",[24,149,150],{},"sleutelzinnen"," extraheren, positietags zoals ",[153,154,155],"code",{},"[fBestand-start-einde]"," behouden, en de fragmenten samenvoegen tot kortere context voor latere Q&A.",[10,158,159,160,163],{},"Typische pipeline: ",[24,161,162],{},"Extract → Cache → Chat",". Eén keer extraheren (offline of on demand), een «sleutelzinnenbundel» opslaan, hergebruiken bij elke vraag—dezelfde gedachte als veel document-Q&A-prototypes die eerst comprimeren en dan antwoorden.",[10,165,166],{},[24,167,79],{},[81,169,170,177,180],{},[84,171,172,173,176],{},"Elke vraag stuurt ",[24,174,175],{},"veel minder tekst","; tokenverbruik per request daalt t.o.v. fase 1;",[84,178,179],{},"Preprocessing kan worden gecached; geen her-extractie per vraag voor hetzelfde boek;",[84,181,182],{},"Positietags leggen de basis voor bronverwijzingen.",[10,184,185],{},[24,186,187],{},"Nadelen (blijft falen bij lange boeken):",[81,189,190,196,206,215],{},[84,191,192,195],{},[24,193,194],{},"Zwaar detailverlies:"," «Sleutelzinnen» worden door het model gekozen; beperkingen, tegenargumenten en argumentatieketens vallen vaak weg—antwoorden worden «correct maar eenzijdig»;",[84,197,198,201,202,205],{},[24,199,200],{},"Context nog groot bij lange boeken:"," Zelfs sleutelzinnenbundels voor grote werken zijn aanzienlijk—latentie en kosten zijn ",[24,203,204],{},"verlicht, niet opgelost",";",[84,207,208,211,212,205],{},[24,209,210],{},"Dubbele LLM-fout:"," Extractie kan missen; Q&A kan fragmenten verkeerd lezen—fouten ",[24,213,214],{},"stapelen",[84,216,217,220,221,224],{},[24,218,219],{},"Statische context:"," Of de gebruiker naar één hoofdstuk of de hele boekstructuur vraagt, het model krijgt altijd ",[24,222,223],{},"dezelfde vooraf geëxtraheerde blob","—geen dynamische vernauwing per vraag.",[10,226,227,228,231],{},"Les: het probleem is niet «of we comprimeren», maar ",[24,229,230],{},"of compressie on demand is en of we terug kunnen naar brontekst",".",[53,233,235],{"id":234},"fase-3-segmentindex-tool-retrieval-on-demand-brontekst-terug-huidig","Fase 3: segmentindex + Tool-retrieval on demand + brontekst terug (huidig)",[10,237,238,240,241,248],{},[24,239,61],{}," Geïnspireerd door ",[242,243,247],"a",{"href":244,"rel":245},"https://github.com/VectifyAI/PageIndex",[246],"nofollow","PageIndex",". T.o.v. fase 2 drie kernverschuivingen:",[250,251,252,258,268],"ol",{},[84,253,254,257],{},[24,255,256],{},"Preprocessing levert een gestructureerde index"," (inhoudsopgave-samenvattingen + exacte character spans), geen fragmenten die direct als Q&A-context dienen;",[84,259,260,263,264,267],{},[24,261,262],{},"Bij elke vraag gebruikt het model Tool Calling om on demand te retrieven",", en ",[24,265,266],{},"haalt brontekst met positietags"," op om te antwoorden;",[84,269,270,273],{},[24,271,272],{},"System prompt + frontend"," dwingen het citatieformaat af en ondersteunen klik-naar-springen met markering in de reader.",[10,275,276],{},[24,277,278],{},"Vergelijking drie fasen:",[280,281,282,301],"table",{},[283,284,285],"thead",{},[286,287,288,292,295,298],"tr",{},[289,290,291],"th",{},"Dimensie",[289,293,294],{},"Fase 1 (volledige dump)",[289,296,297],{},"Fase 2 (sleutelzinnen)",[289,299,300],{},"Fase 3 (huidig)",[302,303,304,323,337,351,365,382],"tbody",{},[286,305,306,310,313,316],{},[307,308,309],"td",{},"Context per vraag",[307,311,312],{},"Heel boek (of afgekapt eerste deel)",[307,314,315],{},"Vooraf geëxtraheerde sleutelzinnen",[307,317,318,319,322],{},"Alleen ",[24,320,321],{},"bron","fragmenten relevant voor de vraag",[286,324,325,328,331,334],{},[307,326,327],{},"Nauwkeurigheid lange boeken",[307,329,330],{},"Ineenstorting na ~400k tekens",[307,332,333],{},"Hangt af van extractie; verliest detail",[307,335,336],{},"Opzoeken via TOC/span; geen harde truncatie van heel boek",[286,338,339,342,345,348],{},[307,340,341],{},"Reactiesnelheid",[307,343,344],{},"Traag",[307,346,347],{},"Iets beter; lange boeken nog traag",[307,349,350],{},"Retrieval + korte context—merkbaar sneller",[286,352,353,356,359,362],{},[307,354,355],{},"Tokenkosten",[307,357,358],{},"Zeer hoog",[307,360,361],{},"Middelhoog",[307,363,364],{},"Gespreid preprocess + betalen naar behoefte",[286,366,367,370,373,376],{},[307,368,369],{},"Traceerbaarheid",[307,371,372],{},"Zwak (moeilijk te citeren)",[307,374,375],{},"Tags bestaan maar inhoud is tweemaal gefilterd",[307,377,378,379],{},"Voetnoten verwijzen naar ",[24,380,381],{},"echte bronspans",[286,383,384,387,390,393],{},[307,385,386],{},"Engineeringcomplexiteit",[307,388,389],{},"Laag",[307,391,392],{},"Middel",[307,394,395],{},"Hoog",[10,397,398,401,402,405,406,409,410,413],{},[24,399,400],{},"Waarom we stopten bij fase 3:"," Voor lezen is nul hallucinatie niet «laat het model zoveel mogelijk tekst zien», maar ",[24,403,404],{},"«haal vóór het antwoorden bronbewijs op voor de vraag»",". Fase 1–2 vochten ",[24,407,408],{},"contextgrootte","; fase 3 splitst de pipeline in ",[24,411,412],{},"index (preprocess) → retrieve (Tool) → bewijs (bron) → antwoord (beperkte generatie)","—nauwkeurigheid, kosten en traceerbaarheid in balans.",[10,415,416,417,231],{},"Hieronder details van ",[24,418,419],{},"fase 3",[33,421],{},[36,423,425],{"id":424},"ii-probleemstelling-bij-boek-qa-is-hallucinatie-erger-dan-in-generieke-chat","II. Probleemstelling: bij boek-Q&A is hallucinatie erger dan in generieke chat",[10,427,428,429,432],{},"Gebruikers vergeven af en toe fouten in een algemene chatbot. Bij ",[24,430,431],{},"boek-Q&A"," is de prijs hoger:",[81,434,435,442,445],{},[84,436,437,438,441],{},"Gebruikers vragen wat ",[24,439,440],{},"dit boek"," zegt—niet wat in het parametrische geheugen van het model zit;",[84,443,444],{},"Een plausibel klinkende «mening uit het boek» kan notities, citaten en herdelingen misleiden;",[84,446,447],{},"Zonder bronnen kan de gebruiker niet verifiëren—vertrouwen is moeilijk op te bouwen.",[10,449,450,451,454],{},"«Nul hallucinatie» wordt daarom drie ",[24,452,453],{},"afdwingbare"," regels:",[250,456,457,463,469],{},[84,458,459,462],{},[24,460,461],{},"Boekvragen moeten eerst het boek raadplegen:"," Alles wat plausibel over het geopende boek gaat, moet via retrieval (Tool) vóór het antwoord;",[84,464,465,468],{},[24,466,467],{},"Antwoorden moeten traceerbaar zijn:"," Belangrijke conclusies dragen positietags die de UI kan parsen en naar kan springen;",[84,470,471,474],{},[24,472,473],{},"Zeg het wanneer je het niet vindt:"," Staat het niet in het boek, zeg dat—verkleed geen algemene kennis als «wat het boek zegt».",[10,476,477,478,480],{},"Het vervolg volgt de ",[24,479,419],{},"-datastroom en hoe deze regels worden geïmplementeerd.",[33,482],{},[36,484,486],{"id":485},"iii-architectuur-preprocess-tool-retrieval-beperkte-generatie-klikbare-bronverwijzingen","III. Architectuur: Preprocess → Tool-retrieval → Beperkte generatie → Klikbare bronverwijzingen",[48,488],{":config":50,"code":489},"flowchart%20TB%0A%20%20%20%20subgraph%20prep%20%5BOffline%20%2F%20eerste%20preprocess%5D%0A%20%20%20%20%20%20%20%20A%5BBoek%20splitsen%20op%20TOC%20of%20lengte%5D%20--%3E%20B%5BLLM%20segment-samenvattingen%5D%0A%20%20%20%20%20%20%20%20B%20--%3E%20C%5BSegment-cache%20lokaal%20persistent%20maken%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20ask%20%5BGebruikersvraag%5D%0A%20%20%20%20%20%20%20%20D%5BGebruikersinvoer%5D%20--%3E%20E%7BSegment-cache%20bestaat%3F%7D%0A%20%20%20%20%20%20%20%20E%20--%3E%7CNee%7C%20F%5BVolledige%20tekst%20extraheren%20%2F%20vragen%20om%20preprocess%5D%0A%20%20%20%20%20%20%20%20F%20--%3E%20prep%0A%20%20%20%20%20%20%20%20E%20--%3E%7CJa%7C%20G%5BTool%20Calling%20registreren%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20retrieve%20%5BTool-retrieval%5D%0A%20%20%20%20%20%20%20%20G%20--%3E%20H%7BVraagtype%7D%0A%20%20%20%20%20%20%20%20H%20--%3E%7COverzicht%20%2F%20recensie%7C%20I%5Bget_full_book_segment_summaries%5D%0A%20%20%20%20%20%20%20%20H%20--%3E%7CFeiten%20%2F%20personen%20%2F%20hoofdstuk%7C%20J%5Bget_related_segment_summaries%5D%0A%20%20%20%20%20%20%20%20J%20--%3E%20K%5BLLM%20kiest%20segment-ID's%20uit%20samenvattingscatalogus%5D%0A%20%20%20%20%20%20%20%20K%20--%3E%20L%5BBron%20ophalen%20per%20span%20%2B%20positietags%5D%0A%20%20%20%20%20%20%20%20I%20--%3E%20M%5BAlle%20segment-samenvattingen%20samenvoegen%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20answer%20%5BGenereren%20%26%20tonen%5D%0A%20%20%20%20%20%20%20%20L%20--%3E%20N%5BTool-resultaten%20terug%20naar%20model%5D%0A%20%20%20%20%20%20%20%20M%20--%3E%20N%0A%20%20%20%20%20%20%20%20N%20--%3E%20O%5BSystem%20prompt%20citatieregels%5D%0A%20%20%20%20%20%20%20%20O%20--%3E%20P%5BAntwoord%20streamen%20%2B%20positie-voetnoten%5D%0A%20%20%20%20%20%20%20%20P%20--%3E%20Q%5BKlikbare%20voetnoten%20renderen%5D%0A%20%20%20%20%20%20%20%20Q%20--%3E%20R%5BKlik%20%E2%86%92%20preview%20%E2%86%92%20spring%20%26%20markeer%5D%0A%20%20%20%20end",[10,491,492,493],{},"Kernidee: ",[24,494,495],{},"laat het model niet «uit het geheugen antwoorden»—laat het «bewijs verzamelen, dan antwoorden, en bronnen markeren».",[33,497],{},[36,499,501],{"id":500},"iv-preprocessing-het-hele-boek-omzetten-in-een-doorzoekbare-segmentindex","IV. Preprocessing: het hele boek omzetten in een doorzoekbare segmentindex",[10,503,504,505,508,509,512,513,516,517,520,521,524],{},"Als elke vraag nog ",[24,506,507],{},"fase 1"," volledige boekcontext gebruikte, exploderen tokenbudgetten bij lange boeken en is retrieval te grof. Fase 3: bij de eerste AI-chat voor een boek draait op de achtergrond een ",[24,510,511],{},"segment-samenvattingstaak","—splitsen op ",[24,514,515],{},"TOC"," of ",[24,518,519],{},"tekstlengte"," in ",[153,522,523],{},"Segment","s, elk samenvatten, persistent in lokale IndexedDB.",[10,526,527,528,530,531,534],{},"Elk ",[153,529,523],{}," bevat samenvatting plus ",[24,532,533],{},"fysieke positie in de hoofdtekst",":",[280,536,537,547],{},[283,538,539],{},[286,540,541,544],{},[289,542,543],{},"Veld",[289,545,546],{},"Betekenis",[302,548,549,563,576,586],{},[286,550,551,560],{},[307,552,553,556,557],{},[153,554,555],{},"startFileIndex"," / ",[153,558,559],{},"endFileIndex",[307,561,562],{},"Spine-bestandsindex (PDF: één bestand per pagina)",[286,564,565,573],{},[307,566,567,556,570],{},[153,568,569],{},"startOffset",[153,571,572],{},"endOffset",[307,574,575],{},"Teken begin/einde",[286,577,578,583],{},[307,579,580],{},[153,581,582],{},"sequence",[307,584,585],{},"Lineaire leesvolgorde",[286,587,588,593],{},[307,589,590],{},[153,591,592],{},"title",[307,594,595],{},"TOC-titel",[10,597,598],{},"Splitsen balanceert precisie en kosten: is de hoofdtekst van een TOC-node onder ~20KB, alleen die node samenvatten; sibling-nodes kunnen in batches (15–20KB) vóór LLM-aanroepen; ongestructureerde lange blokken splitsen in ~30–40k tekens.",[10,600,601,602,605,606,609],{},"De samenvattingssystem prompt vereist ",[24,603,604],{},"behoud van inline positietags"," (",[153,607,608],{},"[fNummer-Nummer-Nummer]",") zodat door Tool opgehaalde bron overeenkomt met spine-offsets. Kernbeperking:",[611,612,618],"pre",{"className":613,"code":615,"language":616,"meta":617},[614],"language-text","Als samenvattingsinhoud betrekking heeft op een passage, behoud de positietag aan het einde [fNummer-Nummer-Nummer] (bijv. [f1-90-109]).\nTags zijn atomair—wijzig, voeg samen of laat geen enkel teken of cijfer weg.\n","text","",[153,619,615],{"__ignoreMap":617},[10,621,622,623,626],{},"Na preprocessing hangt Q&A af van een ",[24,624,625],{},"gestructureerde segmentindex",", niet van hele-boek-context—de engineeringvoorwaarde voor nul hallucinatie bij lange boeken.",[33,628],{},[36,630,632],{"id":631},"v-positietagsysteem-waar-in-tekst-coderen","V. Positietagsysteem: «waar» in tekst coderen",[10,634,635,636,639,640,643],{},"Nul hallucinatie vereist inhoud uit de bron ",[24,637,638],{},"én"," machine-parseerbare, in de UI springbare ",[24,641,642],{},"herkomst",". We gebruiken inline tags:",[611,645,648],{"className":646,"code":647,"language":616},[614],"[f{fileIndex}-{startChar}-{endChar}]\n",[153,649,647],{"__ignoreMap":617},[10,651,652,653,656],{},"Voorbeeld: ",[153,654,655],{},"[f5-123-165]"," = spine-bestand 5 (0-based), tekens 123–165.",[53,658,660],{"id":659},"_51-hoe-tags-in-de-hoofdtekst-worden-geschreven","5.1 Hoe tags in de hoofdtekst worden geschreven",[10,662,663,664,667],{},"De extractielaag voegt aan segmenteinden ",[153,665,666],{},"[f{fileIndex}-{start}-{end}]"," toe:",[611,669,674],{"className":670,"code":672,"language":673,"meta":617},[671],"language-typescript","const position = `[f${fileIndex}-${absOffset}-${absOffset + segment.length}]`;\nfileLines.push(segment.text.trim() + position);\n","typescript",[153,675,672],{"__ignoreMap":617},[10,677,678,679,682],{},"Of het nu preprocess-samenvattingen of Tool-fragmenten zijn: posities sluiten aan op ",[24,680,681],{},"spine-tekenoffsets","—geen door het model geschatte paginanummers.",[53,684,686],{"id":685},"_52-beperkingen-op-modeloutput","5.2 Beperkingen op modeloutput",[10,688,689,690,696],{},"De system prompt bevat ",[24,691,692],{},[693,694,695],"span",{},"Position Citation Rules","—vijf kernpunten:",[250,698,699,709,719,725,734],{},[84,700,701,704,705,708],{},[24,702,703],{},"Standaardformaat:"," Moet ",[153,706,707],{},"[f_fileIndex-startChar-endChar]"," gebruiken; alle drie numerieke delen verplicht;",[84,710,711,714,715,718],{},[24,712,713],{},"Alleen kopiëren uit huidige bronnen:"," Voetnoten moeten ",[24,716,717],{},"letterlijk"," uit system/user-berichten of Tool-returns van deze beurt komen;",[84,720,721,724],{},[24,722,723],{},"Geen verzinsels:"," Bereken, bewerk of verzin geen posities;",[84,726,727,730,731,205],{},[24,728,729],{},"Liever weglaten:"," Geen geldige tag in context—antwoord normaal—",[24,732,733],{},"geen positietags outputten",[84,735,736,739],{},[24,737,738],{},"Inline bij uitspraken:"," Tags volgen de relevante zin; geen citatielijsten aan het einde.",[10,741,742,743,746,747,750],{},"De UI filtert ook incidentele ",[24,744,745],{},"tweedelige"," ongeldige tags (bijv. ",[153,748,749],{},"[f1-293]",") vóór render.",[10,752,753],{},[13,754],{"alt":755,"src":756},"Popup bronverwijzing","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[33,758],{},[36,760,762],{"id":761},"vi-tool-calling-eerst-retrieven-dan-antwoorden","VI. Tool Calling: eerst retrieven, dan antwoorden",[10,764,765,766,769,770,773,774,231],{},"Wanneer chat aan een boek is gekoppeld (",[153,767,768],{},"resourceId"," aanwezig, ",[153,771,772],{},"chatType === 'chat'","), registreren we vóór elke generatie twee Tools met executors—standaard OpenAI-achtige ",[24,775,776],{},"function calling loop",[53,778,780,781,784],{"id":779},"_61-get_related_segment_summaries-gerichte-segmentlookup","6.1 ",[153,782,783],{},"get_related_segment_summaries"," — gerichte segmentlookup",[10,786,787,788,231],{},"Voor: concepten, personages, plot, hoofdstukdetails—",[24,789,790],{},"duidelijke retrieval-intentie",[10,792,793],{},"Flow:",[250,795,796,803,809,812,822],{},[84,797,798,799,802],{},"Model herschrijft gebruikersformulering naar ",[24,800,801],{},"termen die waarschijnlijk in het boek voorkomen"," («Optimize Search Queries» in system prompt);",[84,804,805,806,205],{},"Tool aanroepen met ",[153,807,808],{},"question",[84,810,811],{},"Alle segment-samenvattingen batchen op tokenbudget (~30k tokens per batch, max 5 batches);",[84,813,814,815,818,819,205],{},"Per batch: apart LLM-verzoek kiest relevante segment-ID's (max 5) uit ",[153,816,817],{},"{ id, title, summary }",", JSON zoals ",[153,820,821],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[84,823,824,825,828],{},"Voor geselecteerde segmenten ",[24,826,827],{},"getagde brontekst"," uit spine ophalen—geen samenvattingen—als Tool-resultaat.",[10,830,831,834,835,838],{},[24,832,833],{},"Kernontwerp: Tool retourneert bron, geen samenvattingen."," Het model antwoordt van echte alinea's met inline ",[153,836,837],{},"[f…]",", vermijdt «samenvatting → hersamenvatting»-drift.",[53,840,842,843,846],{"id":841},"_62-get_full_book_segment_summaries-heel-boek-overzicht","6.2 ",[153,844,845],{},"get_full_book_segment_summaries"," — heel-boek-overzicht",[10,848,849,850,231],{},"Voor: «vat het boek samen», «recenseer dit boek», «algemene structuur/thema's»—",[24,851,852],{},"globaal beeld",[10,854,855,856,859],{},"Alle segment-",[153,857,858],{},"summary","-velden in leesvolgorde samenvoegen—voorkomt missen van sleutelhoofdstukken via alleen per-chunk relevantie.",[53,861,863],{"id":862},"_63-system-prompt-book-first-tools-first","6.3 System prompt: Book first, tools first",[10,865,866,867,534],{},"Met gekoppeld boek geldt ",[24,868,869],{},[693,870,871],{},"Core Principles for Reading Assistant",[611,873,876],{"className":874,"code":875,"language":616},[614],"1. Book First, Tool First\n   - Elke vraag die mogelijk over het boek gaat, moet eerst tools aanroepen;\n   - Antwoorden moeten vooral op retrieval steunen—nooit «boekinhoud» verzinnen zonder retrieval.\n\n2. General Knowledge as Fallback Only\n   - Alleen voor: informele chat / gebruiker slaat boek expliciet over / tools geven niets;\n   - Staat het niet in het boek, zeg «niet vermeld in dit boek» vóór algemene kennis.\n\n3. Direct Style\n   - Ga direct ter zake—vermijd «op basis van de aangeleverde materialen…» en vergelijkbare opvulling.\n",[153,877,875],{"__ignoreMap":617},[10,879,880,881,884,885,888],{},"Generatie draait de tool-loop: ",[153,882,883],{},"tool_calls"," → uitvoeren → ",[153,886,887],{},"role: tool"," toevoegen → doorgaan tot definitieve tekst. Met tools aan staat het thinking-kanaal uit om protocolconflicten te vermijden.",[33,890],{},[36,892,894],{"id":893},"vii-frontend-traceerbaarheid-van-voetnoot-naar-markering","VII. Frontend-traceerbaarheid: van voetnoot naar markering",[10,896,897,898,900],{},"Modeloutput ",[153,899,655],{}," wordt niet rauw getoond; de renderlaag maakt er klikbare citaten van.",[53,902,904],{"id":903},"_71-voetnoten-renderen","7.1 Voetnoten renderen",[10,906,907,908,911],{},"Tags normaliseren naar Markdown-links zoals ",[153,909,910],{},"[1]([f5-123-165])",", renderen als genummerde voetnoten; deduplicatie van dezelfde positie tegen UI-rommel.",[53,913,915],{"id":914},"_72-klikinteractie","7.2 Klikinteractie",[250,917,918,927,933],{},[84,919,920,923,924,926],{},[24,921,922],{},"Eerste klik:"," Parse ",[153,925,837],{}," → fileIndex + offsets → spine-tekst extraheren → preview (optioneel TOC-titel);",[84,928,929,932],{},[24,930,931],{},"Zelfde voetnoot opnieuw:"," Preview sluiten;",[84,934,935,938],{},[24,936,937],{},"Spring bevestigen:"," Leesweergave openen, tekenbereik markeren.",[10,940,941,942,945],{},"Van gekopieerde modeltag tot zichtbare bron voor de gebruiker: de keten ",[24,943,944],{},"gaat nooit door een tweede LLM-aanroep","—deterministisch en reproduceerbaar.",[33,947],{},[36,949,951],{"id":950},"viii-randgevallen-en-eerlijke-degradatie","VIII. Randgevallen en eerlijke degradatie",[10,953,954,955,534],{},"Nul hallucinatie ≠ «altijd een antwoord»—het betekent ",[24,956,957],{},"geen bewijs, geen verzinsels",[280,959,960,970],{},[283,961,962],{},[286,963,964,967],{},[289,965,966],{},"Scenario",[289,968,969],{},"Gedrag",[302,971,972,980,992,1000,1008],{},[286,973,974,977],{},[307,975,976],{},"Segment-samenvattingen nog niet klaar",[307,978,979],{},"Eerst volledige tekst extraheren en samenvatten",[286,981,982,985],{},[307,983,984],{},"Tool vindt niets",[307,986,987,988,991],{},"Retourneer ",[153,989,990],{},"(No relevant segment excerpts found…)","; model moet zeggen dat het niet in het boek staat",[286,993,994,997],{},[307,995,996],{},"Ongeldige tweedelige tags van model",[307,998,999],{},"Frontend filtert; geen kapotte voetnoten",[286,1001,1002,1005],{},[307,1003,1004],{},"Informele chat",[307,1006,1007],{},"System prompt staat algemene kennis buiten het boek toe",[286,1009,1010,1013],{},[307,1011,1012],{},"Chat exporteren",[307,1014,1015],{},"Voetnoten kunnen reader-deeplinks worden voor delen/archiveren",[10,1017,1018],{},[13,1019],{"alt":1012,"src":1020},"https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[33,1022],{},[36,1024,1026],{"id":1025},"ix-ontwerpafweging-waarom-geen-vector-rag","IX. Ontwerpafweging: waarom geen «vector RAG»?",[10,1028,1029,1030,1033],{},"Peers die document-Q&A bouwen vragen vaak: als je retrieval-augmented generation doet, waarom geen ",[24,1031,1032],{},"Embedding + vector DB Top-K","?",[10,1035,1036,1037,1040,1041,1044,1045,1048,1049,1052],{},"We ",[24,1038,1039],{},"doen RAG","—retrieven vóór genereren. Het verschil: «RAG» in communitytaal impliceert vaak ",[24,1042,1043],{},"vector-gelijkenis","; onze fase 3 is ",[24,1046,1047],{},"segmentindex + Tool on-demand bronpull","—",[24,1050,1051],{},"bewust geen vectorlaag",". Hieronder architecturale redenen, geen ontkenning van de waarde van vector RAG.",[53,1054,1056],{"id":1055},"scope-niet-geen-retrieval-maar-geen-vector-retrieval","Scope: niet «geen retrieval», maar «geen vector-retrieval»",[81,1058,1059,1068],{},[84,1060,1061,1064,1065,205],{},[24,1062,1063],{},"Brede RAG:"," ophalen → genereren → ",[24,1066,1067],{},"dat doen we",[84,1069,1070,1073,1074,231],{},[24,1071,1072],{},"Vector RAG:"," recall via embedding-gelijkenis → ",[24,1075,1076],{},"niet in deze versie",[10,1078,1079,1080,1083,1084,1087],{},"Preprocessing bouwt een ",[24,1081,1082],{},"segment-samenvattingsindex","; het model kiest segmenten via Tools en krijgt ",[24,1085,1086],{},"brontekst",". Retrieval bestaat zonder apart embedding-model en vectorindex-onderhoud.",[33,1089],{},[53,1091,1093],{"id":1092},"reden-1-aangepaste-llm-providershoud-het-integratieoppervlak-klein","Reden 1: aangepaste LLM-providers—houd het integratieoppervlak klein",[10,1095,1096,1097,1100,1101,1104],{},"Gebruikers kunnen ",[24,1098,1099],{},"eigen API-keys",", custom base URL's of ",[24,1102,1103],{},"lokale Ollama"," koppelen—chatmodel is hun keuze; kosten en datapad blijven onder controle.",[10,1106,1107],{},"Typische vector RAG verbreedt integratie:",[81,1109,1110,1121,1124],{},[84,1111,1112,1113,1116,1117,1120],{},"Naast ",[24,1114,1115],{},"chatmodel"," meestal een ",[24,1118,1119],{},"embeddingmodel"," (andere naam, soms ander endpoint);",[84,1122,1123],{},"Lokale Ollama heeft apart embeddingmodel plus dimensie/API-compatibiliteit;",[84,1125,1126,1127,1130],{},"Meer faalmodi: chat werkt maar ",[24,1128,1129],{},"lege retrieval","—embedding, index of dimensiemismatch; moeilijker te debuggen dan één provider end-to-end.",[10,1132,1133,1134,1137,1138,1141],{},"Hier delen ",[24,1135,1136],{},"segmentkeuze en antwoorden één providerconfig","—geen «chat op A, index op B». Voor ",[24,1139,1140],{},"plug-in LLM","-apps weegt dat vaak zwaarder dan enkele recallpunten.",[10,1143,1144],{},[13,1145],{"alt":1146,"src":1147},"Aangepaste AI-providers","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[33,1149],{},[53,1151,1153],{"id":1152},"reden-2-embeddings-binden-aan-de-indexproviderwissels-zijn-duur","Reden 2: embeddings binden aan de index—providerwissels zijn duur",[10,1155,1156,1157,1160,1161,1164,1165,1168],{},"In vector RAG zijn ",[24,1158,1159],{},"vectoren geen universeel tussenformaat","—het zijn coördinaten onder één embeddingmodel. Index met A, query met B: gelijkenis is meestal ",[24,1162,1163],{},"niet vergelijkbaar","—vaak ",[24,1166,1167],{},"volledige her-embedding",", en dimensies (768 / 1024 / 1536 …) vergrendelen het opslagschema.",[10,1170,1171,1172,1175,1176,1179],{},"Fase 3 persist ",[24,1173,1174],{},"gestructureerde samenvattingen + character spans",", geen vectoren; chatmodel wisselen ",[24,1177,1178],{},"bouwt de index niet opnieuw","; bewijsketen (bronposities) blijft gelijk—in lijn met «probeer anytime verschillende LLM's».",[33,1181],{},[53,1183,1185],{"id":1184},"reden-3-gestructureerde-routing-is-vaak-genoeg-voor-toc-zware-lange-docs","Reden 3: gestructureerde routing is vaak genoeg voor TOC-zware lange docs",[10,1187,1188,1189,1192,1193,1196,1197,1200,1201,1206],{},"E-boeken en PDF's hebben meestal ",[24,1190,1191],{},"hoofdstukstructuur","; preprocessing levert ",[24,1194,1195],{},"segmenttitels + samenvattingen",". Voor «wat zegt hoofdstuk X» of «hoe definieert het boek Y» werkt segmentkeuze uit de catalogus en dan ",[24,1198,1199],{},"bron ophalen"," stabiel in de praktijk; Tool retourneert ",[24,1202,1203,1204],{},"bron met ",[153,1205,837],{},", dus nul hallucinatie blijft verankerd op character spans.",[10,1208,1209,1210,1213,1214,1217],{},"Vectoren helpen bij vage semantiek, meertaligheid, lange letterlijke mismatch; voor readers met ",[24,1211,1212],{},"TOC + preprocess + sterke traceerbaarheid"," is investeren in ",[24,1215,1216],{},"Tool + bronreturn + citatieregels"," vaak betere ROI.",[33,1219],{},[53,1221,1223],{"id":1222},"toekomst-hybride-recall-geen-herschrijving","Toekomst: hybride recall, geen herschrijving",[10,1225,1226,1227,1230,1231,1234,1235,1238,1239,1242],{},"We kunnen ",[24,1228,1229],{},"vector grove recall"," toevoegen (embedding alleen voor Top-N hoofdstukkandidaten), nog steeds eindigend in ",[24,1232,1233],{},"segment kiezen → bron → klikbare trace","—nul-hallucinatieregels ongewijzigd. Indien toegevoegd: embedding ",[24,1236,1237],{},"optioneel",", expliciete ",[24,1240,1241],{},"her-index","-meldingen bij modelwissel—vermijd stille verkeerde retrieval.",[10,1244,1245,1246],{},"Tot dan: ",[24,1247,1248],{},"elke OpenAI-compatibele chat-API werkt; chatmodel wisselen herbouwt de lokale index niet.",[33,1250],{},[36,1252,1254],{"id":1253},"x-samenvatting","X. Samenvatting",[280,1256,1257,1270],{},[283,1258,1259],{},[286,1260,1261,1264,1267],{},[289,1262,1263],{},"Stap",[289,1265,1266],{},"Methode",[289,1268,1269],{},"Rol",[302,1271,1272,1283,1296,1310,1321,1332],{},[286,1273,1274,1277,1280],{},[307,1275,1276],{},"Preprocess",[307,1278,1279],{},"Splitsen op TOC/lengte + segment-samenvattingcache",[307,1281,1282],{},"Lange boeken doorzoekbaar & lokaliseerbaar",[286,1284,1285,1288,1293],{},[307,1286,1287],{},"Positietags",[307,1289,1290,1292],{},[153,1291,155],{}," in bron",[307,1294,1295],{},"Machine-parseerbare herkomst",[286,1297,1298,1301,1307],{},[307,1299,1300],{},"Tool-retrieval",[307,1302,1303,1304,1306],{},"Per vraag segmenten / heel-boek-samenvattingen, ",[24,1305,321],{}," terug",[307,1308,1309],{},"Bewijs afdwingen vóór antwoord",[286,1311,1312,1315,1318],{},[307,1313,1314],{},"System prompt",[307,1316,1317],{},"Book first, geen valse tags, zeg wanneer ontbreekt",[307,1319,1320],{},"Generatie beperken",[286,1322,1323,1326,1329],{},[307,1324,1325],{},"Frontend",[307,1327,1328],{},"Voetnoot → preview → spring & markeer",[307,1330,1331],{},"Gebruiker verifieert bewijs",[286,1333,1334,1337,1340],{},[307,1335,1336],{},"Geen vector-retrieval",[307,1338,1339],{},"Eén provider; chatmodel wisselen zonder re-index",[307,1341,1342],{},"Lagere integratie- & migratiekosten",[10,1344,1345,1346,1349],{},"«Nul hallucinatie» betekent niet dat het model nooit fout gaat—het betekent ",[24,1347,1348],{},"engineering die output aan een bewijsketen koppelt",": geen retrieval → niet doen alsof het boekinhoud is; met retrieval → verifieerbare bronposities geven.",[10,1351,1352,1353,1356,1357,1360],{},"Als je AI-lezen of document-Q&A bouwt, hopen we dat het pad ",[24,1354,1355],{},"volledige dump → sleutelzinnen → Tool-first on demand retrieval",", plus ",[24,1358,1359],{},"inline positietags + bronreturn",", een nuttige referentie-implementatie is.",[18,1362,1363],{},[10,1364,1365,1366,1371,1372,231],{},"Dit zijn lessen uit het bouwen van de ",[242,1367,1370],{"href":1368,"rel":1369},"https://reader.linghuxiong.com",[246],"Foxycape"," AI-reader—alleen ter referentie. Probeer de reader op de ",[242,1373,1375],{"href":1374},"/nl-nl#download","downloadpagina",{"title":617,"searchDepth":1377,"depth":1377,"links":1378},2,[1379,1385,1386,1387,1388,1392,1399,1403,1404,1411],{"id":38,"depth":1377,"text":39,"children":1380},[1381,1383,1384],{"id":55,"depth":1382,"text":56},3,{"id":137,"depth":1382,"text":138},{"id":234,"depth":1382,"text":235},{"id":424,"depth":1377,"text":425},{"id":485,"depth":1377,"text":486},{"id":500,"depth":1377,"text":501},{"id":631,"depth":1377,"text":632,"children":1389},[1390,1391],{"id":659,"depth":1382,"text":660},{"id":685,"depth":1382,"text":686},{"id":761,"depth":1377,"text":762,"children":1393},[1394,1396,1398],{"id":779,"depth":1382,"text":1395},"6.1 get_related_segment_summaries — gerichte segmentlookup",{"id":841,"depth":1382,"text":1397},"6.2 get_full_book_segment_summaries — heel-boek-overzicht",{"id":862,"depth":1382,"text":863},{"id":893,"depth":1377,"text":894,"children":1400},[1401,1402],{"id":903,"depth":1382,"text":904},{"id":914,"depth":1382,"text":915},{"id":950,"depth":1377,"text":951},{"id":1025,"depth":1377,"text":1026,"children":1405},[1406,1407,1408,1409,1410],{"id":1055,"depth":1382,"text":1056},{"id":1092,"depth":1382,"text":1093},{"id":1152,"depth":1382,"text":1153},{"id":1184,"depth":1382,"text":1185},{"id":1222,"depth":1382,"text":1223},{"id":1253,"depth":1377,"text":1254},null,"2026-06-03","Technische notities over nul-hallucinatie Q&A in een AI-reader—antwoorden gebaseerd op de huidige boektekst, met bronverwijzingen in één klik naar exacte passages.",false,"md",{},true,"/nl-nl/blog/zero-hallucination-qa",{"title":5,"description":1414},"nl-nl/blog/zero-hallucination-qa",[1423,1424,1425],"reader","AI","techniek","zero-hallucination-qa","gxMYlJfB8eAB7BakuNSIisf_FYey7WhkraYR1nVl0LQ",[1429],{"id":4,"title":5,"body":1430,"config":1412,"date":1413,"description":1414,"draft":1415,"extension":1416,"image":1412,"meta":2336,"navigation":1418,"path":1419,"seo":2337,"stem":1421,"tags":2338,"toolbar":1412,"translationKey":1426,"updated":1413,"__hash__":1427},{"type":7,"value":1431,"toc":2304},[1432,1436,1444,1446,1448,1452,1454,1456,1466,1470,1478,1482,1504,1506,1508,1518,1522,1526,1536,1540,1564,1568,1570,1577,1593,1597,1677,1687,1691,1693,1695,1699,1709,1713,1727,1731,1733,1735,1737,1741,1743,1745,1757,1763,1811,1813,1819,1824,1828,1830,1832,1838,1843,1847,1849,1853,1858,1862,1864,1870,1898,1904,1908,1910,1912,1920,1924,1928,1930,1952,1958,1962,1966,1970,1972,1978,1983,1989,1991,1993,1997,1999,2003,2005,2021,2025,2027,2029,2033,2077,2081,2083,2085,2089,2099,2101,2115,2121,2123,2125,2131,2133,2147,2153,2157,2159,2161,2169,2175,2177,2179,2191,2197,2199,2201,2211,2215,2217,2219,2285,2289,2295],[10,1433,1434],{},[13,1435],{"alt":15,"src":16},[18,1437,1438],{},[10,1439,22,1440,27,1442,31],{},[24,1441,26],{},[24,1443,30],{},[33,1445],{},[36,1447,39],{"id":38},[10,1449,42,1450,46],{},[24,1451,45],{},[48,1453],{":config":50,"code":51},[53,1455,56],{"id":55},[10,1457,1458,62,1460,66,1462,70,1464,74],{},[24,1459,61],{},[24,1461,65],{},[24,1463,69],{},[24,1465,73],{},[10,1467,1468],{},[24,1469,79],{},[81,1471,1472,1474,1476],{},[84,1473,86],{},[84,1475,89],{},[84,1477,92],{},[10,1479,1480],{},[24,1481,97],{},[81,1483,1484,1488,1492,1498],{},[84,1485,1486,105],{},[24,1487,104],{},[84,1489,1490,111],{},[24,1491,110],{},[84,1493,1494,117,1496,121],{},[24,1495,116],{},[24,1497,120],{},[84,1499,1500,127,1502,131],{},[24,1501,126],{},[24,1503,130],{},[10,1505,134],{},[53,1507,138],{"id":137},[10,1509,1510,143,1512,147,1514,151,1516,156],{},[24,1511,61],{},[24,1513,146],{},[24,1515,150],{},[153,1517,155],{},[10,1519,159,1520,163],{},[24,1521,162],{},[10,1523,1524],{},[24,1525,79],{},[81,1527,1528,1532,1534],{},[84,1529,172,1530,176],{},[24,1531,175],{},[84,1533,179],{},[84,1535,182],{},[10,1537,1538],{},[24,1539,187],{},[81,1541,1542,1546,1552,1558],{},[84,1543,1544,195],{},[24,1545,194],{},[84,1547,1548,201,1550,205],{},[24,1549,200],{},[24,1551,204],{},[84,1553,1554,211,1556,205],{},[24,1555,210],{},[24,1557,214],{},[84,1559,1560,220,1562,224],{},[24,1561,219],{},[24,1563,223],{},[10,1565,227,1566,231],{},[24,1567,230],{},[53,1569,235],{"id":234},[10,1571,1572,240,1574,248],{},[24,1573,61],{},[242,1575,247],{"href":244,"rel":1576},[246],[250,1578,1579,1583,1589],{},[84,1580,1581,257],{},[24,1582,256],{},[84,1584,1585,263,1587,267],{},[24,1586,262],{},[24,1588,266],{},[84,1590,1591,273],{},[24,1592,272],{},[10,1594,1595],{},[24,1596,278],{},[280,1598,1599,1611],{},[283,1600,1601],{},[286,1602,1603,1605,1607,1609],{},[289,1604,291],{},[289,1606,294],{},[289,1608,297],{},[289,1610,300],{},[302,1612,1613,1625,1635,1645,1655,1667],{},[286,1614,1615,1617,1619,1621],{},[307,1616,309],{},[307,1618,312],{},[307,1620,315],{},[307,1622,318,1623,322],{},[24,1624,321],{},[286,1626,1627,1629,1631,1633],{},[307,1628,327],{},[307,1630,330],{},[307,1632,333],{},[307,1634,336],{},[286,1636,1637,1639,1641,1643],{},[307,1638,341],{},[307,1640,344],{},[307,1642,347],{},[307,1644,350],{},[286,1646,1647,1649,1651,1653],{},[307,1648,355],{},[307,1650,358],{},[307,1652,361],{},[307,1654,364],{},[286,1656,1657,1659,1661,1663],{},[307,1658,369],{},[307,1660,372],{},[307,1662,375],{},[307,1664,378,1665],{},[24,1666,381],{},[286,1668,1669,1671,1673,1675],{},[307,1670,386],{},[307,1672,389],{},[307,1674,392],{},[307,1676,395],{},[10,1678,1679,401,1681,405,1683,409,1685,413],{},[24,1680,400],{},[24,1682,404],{},[24,1684,408],{},[24,1686,412],{},[10,1688,416,1689,231],{},[24,1690,419],{},[33,1692],{},[36,1694,425],{"id":424},[10,1696,428,1697,432],{},[24,1698,431],{},[81,1700,1701,1705,1707],{},[84,1702,437,1703,441],{},[24,1704,440],{},[84,1706,444],{},[84,1708,447],{},[10,1710,450,1711,454],{},[24,1712,453],{},[250,1714,1715,1719,1723],{},[84,1716,1717,462],{},[24,1718,461],{},[84,1720,1721,468],{},[24,1722,467],{},[84,1724,1725,474],{},[24,1726,473],{},[10,1728,477,1729,480],{},[24,1730,419],{},[33,1732],{},[36,1734,486],{"id":485},[48,1736],{":config":50,"code":489},[10,1738,492,1739],{},[24,1740,495],{},[33,1742],{},[36,1744,501],{"id":500},[10,1746,504,1747,508,1749,512,1751,516,1753,520,1755,524],{},[24,1748,507],{},[24,1750,511],{},[24,1752,515],{},[24,1754,519],{},[153,1756,523],{},[10,1758,527,1759,530,1761,534],{},[153,1760,523],{},[24,1762,533],{},[280,1764,1765,1773],{},[283,1766,1767],{},[286,1768,1769,1771],{},[289,1770,543],{},[289,1772,546],{},[302,1774,1775,1785,1795,1803],{},[286,1776,1777,1783],{},[307,1778,1779,556,1781],{},[153,1780,555],{},[153,1782,559],{},[307,1784,562],{},[286,1786,1787,1793],{},[307,1788,1789,556,1791],{},[153,1790,569],{},[153,1792,572],{},[307,1794,575],{},[286,1796,1797,1801],{},[307,1798,1799],{},[153,1800,582],{},[307,1802,585],{},[286,1804,1805,1809],{},[307,1806,1807],{},[153,1808,592],{},[307,1810,595],{},[10,1812,598],{},[10,1814,601,1815,605,1817,609],{},[24,1816,604],{},[153,1818,608],{},[611,1820,1822],{"className":1821,"code":615,"language":616,"meta":617},[614],[153,1823,615],{"__ignoreMap":617},[10,1825,622,1826,626],{},[24,1827,625],{},[33,1829],{},[36,1831,632],{"id":631},[10,1833,635,1834,639,1836,643],{},[24,1835,638],{},[24,1837,642],{},[611,1839,1841],{"className":1840,"code":647,"language":616},[614],[153,1842,647],{"__ignoreMap":617},[10,1844,652,1845,656],{},[153,1846,655],{},[53,1848,660],{"id":659},[10,1850,663,1851,667],{},[153,1852,666],{},[611,1854,1856],{"className":1855,"code":672,"language":673,"meta":617},[671],[153,1857,672],{"__ignoreMap":617},[10,1859,678,1860,682],{},[24,1861,681],{},[53,1863,686],{"id":685},[10,1865,689,1866,696],{},[24,1867,1868],{},[693,1869,695],{},[250,1871,1872,1878,1884,1888,1894],{},[84,1873,1874,704,1876,708],{},[24,1875,703],{},[153,1877,707],{},[84,1879,1880,714,1882,718],{},[24,1881,713],{},[24,1883,717],{},[84,1885,1886,724],{},[24,1887,723],{},[84,1889,1890,730,1892,205],{},[24,1891,729],{},[24,1893,733],{},[84,1895,1896,739],{},[24,1897,738],{},[10,1899,742,1900,746,1902,750],{},[24,1901,745],{},[153,1903,749],{},[10,1905,1906],{},[13,1907],{"alt":755,"src":756},[33,1909],{},[36,1911,762],{"id":761},[10,1913,765,1914,769,1916,773,1918,231],{},[153,1915,768],{},[153,1917,772],{},[24,1919,776],{},[53,1921,780,1922,784],{"id":779},[153,1923,783],{},[10,1925,787,1926,231],{},[24,1927,790],{},[10,1929,793],{},[250,1931,1932,1936,1940,1942,1948],{},[84,1933,798,1934,802],{},[24,1935,801],{},[84,1937,805,1938,205],{},[153,1939,808],{},[84,1941,811],{},[84,1943,814,1944,818,1946,205],{},[153,1945,817],{},[153,1947,821],{},[84,1949,824,1950,828],{},[24,1951,827],{},[10,1953,1954,834,1956,838],{},[24,1955,833],{},[153,1957,837],{},[53,1959,842,1960,846],{"id":841},[153,1961,845],{},[10,1963,849,1964,231],{},[24,1965,852],{},[10,1967,855,1968,859],{},[153,1969,858],{},[53,1971,863],{"id":862},[10,1973,866,1974,534],{},[24,1975,1976],{},[693,1977,871],{},[611,1979,1981],{"className":1980,"code":875,"language":616},[614],[153,1982,875],{"__ignoreMap":617},[10,1984,880,1985,884,1987,888],{},[153,1986,883],{},[153,1988,887],{},[33,1990],{},[36,1992,894],{"id":893},[10,1994,897,1995,900],{},[153,1996,655],{},[53,1998,904],{"id":903},[10,2000,907,2001,911],{},[153,2002,910],{},[53,2004,915],{"id":914},[250,2006,2007,2013,2017],{},[84,2008,2009,923,2011,926],{},[24,2010,922],{},[153,2012,837],{},[84,2014,2015,932],{},[24,2016,931],{},[84,2018,2019,938],{},[24,2020,937],{},[10,2022,941,2023,945],{},[24,2024,944],{},[33,2026],{},[36,2028,951],{"id":950},[10,2030,954,2031,534],{},[24,2032,957],{},[280,2034,2035,2043],{},[283,2036,2037],{},[286,2038,2039,2041],{},[289,2040,966],{},[289,2042,969],{},[302,2044,2045,2051,2059,2065,2071],{},[286,2046,2047,2049],{},[307,2048,976],{},[307,2050,979],{},[286,2052,2053,2055],{},[307,2054,984],{},[307,2056,987,2057,991],{},[153,2058,990],{},[286,2060,2061,2063],{},[307,2062,996],{},[307,2064,999],{},[286,2066,2067,2069],{},[307,2068,1004],{},[307,2070,1007],{},[286,2072,2073,2075],{},[307,2074,1012],{},[307,2076,1015],{},[10,2078,2079],{},[13,2080],{"alt":1012,"src":1020},[33,2082],{},[36,2084,1026],{"id":1025},[10,2086,1029,2087,1033],{},[24,2088,1032],{},[10,2090,1036,2091,1040,2093,1044,2095,1048,2097,1052],{},[24,2092,1039],{},[24,2094,1043],{},[24,2096,1047],{},[24,2098,1051],{},[53,2100,1056],{"id":1055},[81,2102,2103,2109],{},[84,2104,2105,1064,2107,205],{},[24,2106,1063],{},[24,2108,1067],{},[84,2110,2111,1073,2113,231],{},[24,2112,1072],{},[24,2114,1076],{},[10,2116,1079,2117,1083,2119,1087],{},[24,2118,1082],{},[24,2120,1086],{},[33,2122],{},[53,2124,1093],{"id":1092},[10,2126,1096,2127,1100,2129,1104],{},[24,2128,1099],{},[24,2130,1103],{},[10,2132,1107],{},[81,2134,2135,2141,2143],{},[84,2136,1112,2137,1116,2139,1120],{},[24,2138,1115],{},[24,2140,1119],{},[84,2142,1123],{},[84,2144,1126,2145,1130],{},[24,2146,1129],{},[10,2148,1133,2149,1137,2151,1141],{},[24,2150,1136],{},[24,2152,1140],{},[10,2154,2155],{},[13,2156],{"alt":1146,"src":1147},[33,2158],{},[53,2160,1153],{"id":1152},[10,2162,1156,2163,1160,2165,1164,2167,1168],{},[24,2164,1159],{},[24,2166,1163],{},[24,2168,1167],{},[10,2170,1171,2171,1175,2173,1179],{},[24,2172,1174],{},[24,2174,1178],{},[33,2176],{},[53,2178,1185],{"id":1184},[10,2180,1188,2181,1192,2183,1196,2185,1200,2187,1206],{},[24,2182,1191],{},[24,2184,1195],{},[24,2186,1199],{},[24,2188,1203,2189],{},[153,2190,837],{},[10,2192,1209,2193,1213,2195,1217],{},[24,2194,1212],{},[24,2196,1216],{},[33,2198],{},[53,2200,1223],{"id":1222},[10,2202,1226,2203,1230,2205,1234,2207,1238,2209,1242],{},[24,2204,1229],{},[24,2206,1233],{},[24,2208,1237],{},[24,2210,1241],{},[10,2212,1245,2213],{},[24,2214,1248],{},[33,2216],{},[36,2218,1254],{"id":1253},[280,2220,2221,2231],{},[283,2222,2223],{},[286,2224,2225,2227,2229],{},[289,2226,1263],{},[289,2228,1266],{},[289,2230,1269],{},[302,2232,2233,2241,2251,2261,2269,2277],{},[286,2234,2235,2237,2239],{},[307,2236,1276],{},[307,2238,1279],{},[307,2240,1282],{},[286,2242,2243,2245,2249],{},[307,2244,1287],{},[307,2246,2247,1292],{},[153,2248,155],{},[307,2250,1295],{},[286,2252,2253,2255,2259],{},[307,2254,1300],{},[307,2256,1303,2257,1306],{},[24,2258,321],{},[307,2260,1309],{},[286,2262,2263,2265,2267],{},[307,2264,1314],{},[307,2266,1317],{},[307,2268,1320],{},[286,2270,2271,2273,2275],{},[307,2272,1325],{},[307,2274,1328],{},[307,2276,1331],{},[286,2278,2279,2281,2283],{},[307,2280,1336],{},[307,2282,1339],{},[307,2284,1342],{},[10,2286,1345,2287,1349],{},[24,2288,1348],{},[10,2290,1352,2291,1356,2293,1360],{},[24,2292,1355],{},[24,2294,1359],{},[18,2296,2297],{},[10,2298,1365,2299,1371,2302,231],{},[242,2300,1370],{"href":1368,"rel":2301},[246],[242,2303,1375],{"href":1374},{"title":617,"searchDepth":1377,"depth":1377,"links":2305},[2306,2311,2312,2313,2314,2318,2323,2327,2328,2335],{"id":38,"depth":1377,"text":39,"children":2307},[2308,2309,2310],{"id":55,"depth":1382,"text":56},{"id":137,"depth":1382,"text":138},{"id":234,"depth":1382,"text":235},{"id":424,"depth":1377,"text":425},{"id":485,"depth":1377,"text":486},{"id":500,"depth":1377,"text":501},{"id":631,"depth":1377,"text":632,"children":2315},[2316,2317],{"id":659,"depth":1382,"text":660},{"id":685,"depth":1382,"text":686},{"id":761,"depth":1377,"text":762,"children":2319},[2320,2321,2322],{"id":779,"depth":1382,"text":1395},{"id":841,"depth":1382,"text":1397},{"id":862,"depth":1382,"text":863},{"id":893,"depth":1377,"text":894,"children":2324},[2325,2326],{"id":903,"depth":1382,"text":904},{"id":914,"depth":1382,"text":915},{"id":950,"depth":1377,"text":951},{"id":1025,"depth":1377,"text":1026,"children":2329},[2330,2331,2332,2333,2334],{"id":1055,"depth":1382,"text":1056},{"id":1092,"depth":1382,"text":1093},{"id":1152,"depth":1382,"text":1153},{"id":1184,"depth":1382,"text":1185},{"id":1222,"depth":1382,"text":1223},{"id":1253,"depth":1377,"text":1254},{},{"title":5,"description":1414},[1423,1424,1425],1780489852842]