[{"data":1,"prerenderedAt":1428},["ShallowReactive",2],{"blog-list-it-it":3},[4],{"id":5,"title":6,"body":7,"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/it-it/blog/zero-hallucination-qa.md","Come ho implementato Q&A a zero allucinazioni nel nostro reader",{"type":8,"value":9,"toc":1376},"minimark",[10,18,33,36,41,48,53,58,76,81,94,99,133,136,140,158,165,169,184,189,226,233,237,250,275,280,397,415,421,423,427,434,449,456,476,482,484,488,491,497,499,503,526,535,596,599,610,620,627,629,633,644,650,657,661,668,676,683,687,697,740,751,757,759,763,778,786,792,795,830,840,848,854,861,865,873,879,890,892,896,902,906,913,917,940,947,949,953,959,1017,1023,1025,1029,1036,1054,1058,1078,1089,1091,1095,1106,1109,1132,1143,1149,1151,1155,1170,1181,1183,1187,1208,1219,1221,1225,1244,1250,1252,1256,1343,1350,1361],[11,12,13],"p",{},[14,15],"img",{"alt":16,"src":17},"Copertina: Q&A a zero allucinazioni","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[19,20,21],"blockquote",{},[11,22,23,24,28,29,32],{},"Questo articolo descrive l'implementazione tecnica del ",[25,26,27],"strong",{},"Q&A a zero allucinazioni"," nel nostro reader IA: le risposte si basano rigorosamente sul testo del libro aperto e le affermazioni chiave possono essere ",[25,30,31],{},"ricondotte con un clic"," al passaggio esatto. Se sviluppi lettura IA, Q&A documentale o app in stile RAG, speriamo che tre iterazioni e l'architettura finale possano essere utili.",[34,35],"hr",{},[37,38,40],"h2",{"id":39},"i-evoluzione-in-tre-fasi","I. Evoluzione in tre fasi",[11,42,43,44,47],{},"Il Q&A a zero allucinazioni non è stato progettato perfetto dal primo giorno. È evoluto sotto la tensione tra ",[25,45,46],{},"costo, latenza e accuratezza",". Di seguito le tre fasi in ordine cronologico—contesto per capire perché l'architettura attuale ha questa forma.",[49,50],"mermaid",{":config":51,"code":52},"config","flowchart%20LR%0A%20%20%20%20P1%5BFase%201%3A%20Testo%20integrale%5D%20--%3E%20P2%5BFase%202%3A%20LLM%20frasi%20chiave%5D%0A%20%20%20%20P2%20--%3E%20P3%5BFase%203%3A%20Indice%20segmenti%20%2B%20Tool%5D%0A%20%20%20%20P1%20-.-%3E%7CLento%2C%20costoso%2C%20impreciso%20su%20libri%20lunghi%7C%20X1%5BAbbandonato%5D%0A%20%20%20%20P2%20-.-%3E%7CPerdita%20di%20dettaglio%2C%20ancora%20lento%7C%20X2%5BAbbandonato%5D%0A%20%20%20%20P3%20--%3E%7CAttuale%7C%20OK%5BZero%20allucinazioni%20%2B%20tracciabile%5D",[54,55,57],"h3",{"id":56},"fase-1-inserire-tutto-il-libro-nel-context-la-più-semplicee-la-prima-a-cedere","Fase 1: Inserire tutto il libro nel context (la più semplice—e la prima a cedere)",[11,59,60,63,64,67,68,71,72,75],{},[25,61,62],{},"Approccio:"," Quando l'utente apre un libro e pone una domanda, mettere ",[25,65,66],{},"tutto il corpo di testo estratto"," nel system prompt o nel messaggio utente e lasciare rispondere il modello di chat. Se il libro supera circa ",[25,69,70],{},"400.000 caratteri",", ",[25,73,74],{},"troncamento rigido","—resta solo l'inizio; i capitoli successivi sono invisibili al modello.",[11,77,78],{},[25,79,80],{},"Vantaggi:",[82,83,84,88,91],"ul",{},[85,86,87],"li",{},"Costo di implementazione molto basso, quasi nessun pre-processing;",[85,89,90],{},"Funziona ragionevolmente su libri brevi e documenti semplici—il modello ha davvero «visto tutto il libro»;",[85,92,93],{},"UX semplice: chiedi e ottieni risposta, senza stato «attendere l'analisi».",[11,95,96],{},[25,97,98],{},"Svantaggi (presto inaccettabili):",[82,100,101,107,113,123],{},[85,102,103,106],{},[25,104,105],{},"Risposte lente:"," Ogni domanda reinvia un payload enorme; time-to-first-token e latenza totale crescono con la lunghezza del libro;",[85,108,109,112],{},[25,110,111],{},"Costo token elevato:"," Si paga l'input dell'intero libro a ogni domanda;",[85,114,115,118,119,122],{},[25,116,117],{},"Libri lunghi fortemente distorti:"," Oltre 400k caratteri, seconda metà, appendici e conclusioni praticamente non esistono—e l'UI ",[25,120,121],{},"spesso non segnala chiaramente"," il troncamento;",[85,124,125,128,129,132],{},[25,126,127],{},"Granularità di ricerca zero:"," Il modello deve «trovare un ago nel pagliaio» su centinaia di migliaia di caratteri—facile perdere dettagli e produrre ",[25,130,131],{},"riassunti plausibili senza fondamento","—esattamente ciò che le app di lettura devono evitare.",[11,134,135],{},"La fase 1 va bene per un MVP, non per una soluzione di prodotto.",[54,137,139],{"id":138},"fase-2-un-llm-leggero-estrae-frasi-chiave-comprimere-il-contexttroppo-aggressivamente","Fase 2: Un LLM leggero estrae frasi chiave (comprimere il context—troppo aggressivamente)",[11,141,142,144,145,148,149,152,153,157],{},[25,143,62],{}," Prima del Q&A (o al primo accesso), far girare un ",[25,146,147],{},"modello più economico"," sul corpo: suddivisione per capitolo spine (o chunk del libro), estrazione di ",[25,150,151],{},"frasi chiave",", conservazione di tag di posizione come ",[154,155,156],"code",{},"[fFile-inizio-fine]",", poi concatenazione in un context più corto per il Q&A successivo.",[11,159,160,161,164],{},"Pipeline tipica: ",[25,162,163],{},"Extract → Cache → Chat",". Estrarre una volta (offline o on demand), salvare un «pacchetto di frasi chiave», riutilizzarlo a ogni domanda—come molti prototipi document Q&A: comprimere prima, rispondere dopo.",[11,166,167],{},[25,168,80],{},[82,170,171,178,181],{},[85,172,173,174,177],{},"Ogni domanda invia ",[25,175,176],{},"molto meno testo","; il consumo di token per richiesta cala rispetto alla fase 1;",[85,179,180],{},"Il pre-processing può essere in cache; niente ri-estrazione per domanda sullo stesso libro;",[85,182,183],{},"I tag di posizione gettano le basi per le citazioni.",[11,185,186],{},[25,187,188],{},"Svantaggi (ancora insufficienti su libri lunghi):",[82,190,191,197,207,216],{},[85,192,193,196],{},[25,194,195],{},"Forte perdita di dettaglio:"," Le «frasi chiave» sono scelte dal modello; qualificatori, controesempi e catene argomentative spesso spariscono—risposte «corrette ma parziali»;",[85,198,199,202,203,206],{},[25,200,201],{},"Context ancora grande su opere lunghe:"," Anche i pacchetti di frasi chiave sono consistenti—latenza e costo ",[25,204,205],{},"si attenuano, non si risolvono",";",[85,208,209,212,213,206],{},[25,210,211],{},"Doppio errore LLM:"," L'estrazione può omettere; il Q&A può leggere male gli estratti—gli errori ",[25,214,215],{},"si accumulano",[85,217,218,221,222,225],{},[25,219,220],{},"Context statico:"," Che la domanda riguardi un capitolo o la struttura globale, il modello riceve sempre ",[25,223,224],{},"lo stesso blob pre-estratto","—nessun restringimento dinamico per domanda.",[11,227,228,229,232],{},"La lezione: il problema non è «se comprimiamo», ma ",[25,230,231],{},"«se la compressione è on demand e se possiamo tornare al testo sorgente»",".",[54,234,236],{"id":235},"fase-3-indice-segmenti-tool-on-demand-restituzione-testo-sorgente-attuale","Fase 3: Indice segmenti + Tool on demand + restituzione testo sorgente (attuale)",[11,238,239,241,242,249],{},[25,240,62],{}," Ispirato a ",[243,244,248],"a",{"href":245,"rel":246},"https://github.com/VectifyAI/PageIndex",[247],"nofollow","PageIndex",". Rispetto alla fase 2, tre cambiamenti centrali:",[251,252,253,259,269],"ol",{},[85,254,255,258],{},[25,256,257],{},"Il pre-processing produce un indice strutturato"," (riassunti a livello TOC + span di caratteri esatti), non estratti usati direttamente come context Q&A;",[85,260,261,264,265,268],{},[25,262,263],{},"Ogni domanda usa Tool Calling per cercare on demand",", poi ",[25,266,267],{},"recupera testo sorgente con tag di posizione"," per rispondere;",[85,270,271,274],{},[25,272,273],{},"System prompt + frontend"," impongono il formato di citazione e supportano clic → salto → evidenziazione nel reader.",[11,276,277],{},[25,278,279],{},"Confronto delle tre fasi:",[281,282,283,302],"table",{},[284,285,286],"thead",{},[287,288,289,293,296,299],"tr",{},[290,291,292],"th",{},"Dimensione",[290,294,295],{},"Fase 1 (testo integrale)",[290,297,298],{},"Fase 2 (frasi chiave)",[290,300,301],{},"Fase 3 (attuale)",[303,304,305,324,338,352,366,383],"tbody",{},[287,306,307,311,314,317],{},[308,309,310],"td",{},"Context per domanda",[308,312,313],{},"Libro intero (o prima metà troncata)",[308,315,316],{},"Frasi chiave pre-estratte",[308,318,319,320,323],{},"Solo frammenti di ",[25,321,322],{},"sorgente"," pertinenti",[287,325,326,329,332,335],{},[308,327,328],{},"Accuratezza su libri lunghi",[308,330,331],{},"Collasso oltre ~400k caratteri",[308,333,334],{},"Dipende dall'estrazione; perde dettaglio",[308,336,337],{},"Ricerca per TOC/span; niente troncamento rigido dell'intero libro",[287,339,340,343,346,349],{},[308,341,342],{},"Velocità di risposta",[308,344,345],{},"Lenta",[308,347,348],{},"Un po' meglio; libri lunghi ancora lenti",[308,350,351],{},"Ricerca + context breve—nettamente più veloce",[287,353,354,357,360,363],{},[308,355,356],{},"Costo token",[308,358,359],{},"Molto alto",[308,361,362],{},"Medio-alto",[308,364,365],{},"Pre-processing ammortizzato + pagamento on demand",[287,367,368,371,374,377],{},[308,369,370],{},"Tracciabilità",[308,372,373],{},"Debole (citazioni difficili)",[308,375,376],{},"Tag presenti ma contenuto filtrato",[308,378,379,380],{},"Note a piè di pagina → ",[25,381,382],{},"span sorgente reali",[287,384,385,388,391,394],{},[308,386,387],{},"Complessità ingegneristica",[308,389,390],{},"Bassa",[308,392,393],{},"Media",[308,395,396],{},"Alta",[11,398,399,402,403,406,407,410,411,414],{},[25,400,401],{},"Perché ci siamo fermati alla fase 3:"," In lettura, zero allucinazioni non significa «mostrare al modello il massimo testo», ma ",[25,404,405],{},"«prima di rispondere, ottenere prove sorgente per la domanda»",". Le fasi 1–2 combattevano la ",[25,408,409],{},"dimensione del context","; la fase 3 spezza la pipeline in ",[25,412,413],{},"indice (pre-processing) → ricerca (Tool) → prova (sorgente) → risposta (generazione vincolata)","—equilibrio tra accuratezza, costo e tracciabilità.",[11,416,417,418,232],{},"Di seguito il dettaglio della ",[25,419,420],{},"fase 3",[34,422],{},[37,424,426],{"id":425},"ii-definizione-del-problema-nel-qa-su-libri-lallucinazione-costa-più-che-in-una-chat-generica","II. Definizione del problema: Nel Q&A su libri, l'allucinazione costa più che in una chat generica",[11,428,429,430,433],{},"Gli utenti perdonano errori occasionali in un chatbot generale. Nel ",[25,431,432],{},"Q&A su libri",", il prezzo è più alto:",[82,435,436,443,446],{},[85,437,438,439,442],{},"Chiedono cosa dice ",[25,440,441],{},"questo libro","—non ciò che vive nella memoria parametrica del modello;",[85,444,445],{},"Un'«opinione del libro» plausibile può indurre in errore note, citazioni e condivisioni;",[85,447,448],{},"Senza fonti, niente verifica—la fiducia è difficile da costruire.",[11,450,451,452,455],{},"«Zero allucinazioni» diventa quindi tre regole ",[25,453,454],{},"applicabili",":",[251,457,458,464,470],{},[85,459,460,463],{},[25,461,462],{},"Le domande sul libro devono interrogare il libro prima:"," Tutto ciò che può riguardare il libro aperto passa per il retrieval (Tool) prima della risposta;",[85,465,466,469],{},[25,467,468],{},"Le risposte devono essere tracciabili:"," Le affermazioni chiave portano tag di posizione che l'UI può parsare e raggiungere;",[85,471,472,475],{},[25,473,474],{},"Dire quando non si trova:"," Se il libro non contiene l'informazione, dirlo—non mascherare conoscenza generale come «ciò che dice il libro».",[11,477,478,479,481],{},"Il resto segue il flusso dati della ",[25,480,420],{}," e l'implementazione di queste regole.",[34,483],{},[37,485,487],{"id":486},"iii-architettura-pre-processing-tool-generazione-vincolata-citazioni-cliccabili","III. Architettura: Pre-processing → Tool → Generazione vincolata → Citazioni cliccabili",[49,489],{":config":51,"code":490},"flowchart%20TB%0A%20%20%20%20subgraph%20prep%20%5BOffline%20%2F%20primo%20pre-processing%5D%0A%20%20%20%20%20%20%20%20A%5BDividere%20libro%20per%20TOC%20o%20lunghezza%5D%20--%3E%20B%5BRiassunti%20segmenti%20LLM%5D%0A%20%20%20%20%20%20%20%20B%20--%3E%20C%5BPersistere%20cache%20Segment%20in%20locale%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20ask%20%5BDomanda%20utente%5D%0A%20%20%20%20%20%20%20%20D%5BInput%20utente%5D%20--%3E%20E%7BCache%20Segment%20esistente%3F%7D%0A%20%20%20%20%20%20%20%20E%20--%3E%7CNo%7C%20F%5BEstrarre%20testo%20integrale%20%2F%20proporre%20pre-processing%5D%0A%20%20%20%20%20%20%20%20F%20--%3E%20prep%0A%20%20%20%20%20%20%20%20E%20--%3E%7CS%C3%AC%7C%20G%5BRegistrare%20Tool%20Calling%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20retrieve%20%5BRicerca%20Tool%5D%0A%20%20%20%20%20%20%20%20G%20--%3E%20H%7BTipo%20di%20domanda%7D%0A%20%20%20%20%20%20%20%20H%20--%3E%7CPanoramica%20%2F%20recensione%7C%20I%5Bget_full_book_segment_summaries%5D%0A%20%20%20%20%20%20%20%20H%20--%3E%7CFatti%20%2F%20persone%20%2F%20capitolo%7C%20J%5Bget_related_segment_summaries%5D%0A%20%20%20%20%20%20%20%20J%20--%3E%20K%5BLLM%20sceglie%20ID%20segmento%20dal%20catalogo%5D%0A%20%20%20%20%20%20%20%20K%20--%3E%20L%5BRecuperare%20sorgente%20per%20span%20%2B%20tag%20di%20posizione%5D%0A%20%20%20%20%20%20%20%20I%20--%3E%20M%5BConcatenare%20tutti%20i%20riassunti%20segmenti%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20answer%20%5BGenerare%20e%20mostrare%5D%0A%20%20%20%20%20%20%20%20L%20--%3E%20N%5BRisultati%20Tool%20al%20modello%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%5BRegole%20citazione%20system%20prompt%5D%0A%20%20%20%20%20%20%20%20O%20--%3E%20P%5BRisposta%20in%20streaming%20%2B%20note%20di%20posizione%5D%0A%20%20%20%20%20%20%20%20P%20--%3E%20Q%5BRenderizzare%20note%20cliccabili%5D%0A%20%20%20%20%20%20%20%20Q%20--%3E%20R%5BClic%20%E2%86%92%20anteprima%20%E2%86%92%20salto%20ed%20evidenziazione%5D%0A%20%20%20%20end",[11,492,493,494],{},"Idea centrale: ",[25,495,496],{},"non lasciare il modello «rispondere a memoria»—obbligarlo a «raccogliere prove, rispondere, segnare le fonti».",[34,498],{},[37,500,502],{"id":501},"iv-pre-processing-trasformare-il-libro-in-un-indice-di-segmenti-ricercabile","IV. Pre-processing: Trasformare il libro in un indice di segmenti ricercabile",[11,504,505,506,509,510,513,514,517,518,521,522,525],{},"Se ogni domanda usasse ancora il context ",[25,507,508],{},"fase 1"," dell'intero libro, i libri lunghi esplodono il budget token e la ricerca è troppo grossolana. Fase 3: al primo chat IA su un libro, eseguire in background un ",[25,511,512],{},"job di riassunto segmenti","—suddivisione per ",[25,515,516],{},"TOC"," o ",[25,519,520],{},"lunghezza testo"," in ",[154,523,524],{},"Segment",", riassunto di ciascuno, persistenza in IndexedDB locale.",[11,527,528,529,531,532,455],{},"Ogni ",[154,530,524],{}," contiene riassunto più ",[25,533,534],{},"posizione fisica nel corpo",[281,536,537,547],{},[284,538,539],{},[287,540,541,544],{},[290,542,543],{},"Campo",[290,545,546],{},"Significato",[303,548,549,563,576,586],{},[287,550,551,560],{},[308,552,553,556,557],{},[154,554,555],{},"startFileIndex"," / ",[154,558,559],{},"endFileIndex",[308,561,562],{},"Indice file spine (PDF: un file per pagina)",[287,564,565,573],{},[308,566,567,556,570],{},[154,568,569],{},"startOffset",[154,571,572],{},"endOffset",[308,574,575],{},"Inizio/fine in caratteri",[287,577,578,583],{},[308,579,580],{},[154,581,582],{},"sequence",[308,584,585],{},"Ordine di lettura lineare",[287,587,588,593],{},[308,589,590],{},[154,591,592],{},"title",[308,594,595],{},"Titolo TOC",[11,597,598],{},"La suddivisione bilancia precisione e costo: nodo TOC sotto ~20 KB → riassumere solo quel nodo; nodi fratelli fusi in batch (15–20 KB) prima della chiamata LLM; blocchi lunghi non strutturati in intervalli ~30–40k caratteri.",[11,600,601,602,605,606,609],{},"Il system prompt di riassunto richiede di ",[25,603,604],{},"conservare tag di posizione inline"," (",[154,607,608],{},"[fNumero-Numero-Numero]",") affinché la sorgente recuperata via Tool si allinei agli offset spine. Vincolo centrale:",[611,612,618],"pre",{"className":613,"code":615,"language":616,"meta":617},[614],"language-text","If summary content relates to a passage, keep the trailing position tag [fNumber-Number-Number] (e.g. [f1-90-109]).\nTags are atomic—do not alter, merge, or omit any character or digit.\n","text","",[154,619,615],{"__ignoreMap":617},[11,621,622,623,626],{},"Dopo il pre-processing, il Q&A dipende da un ",[25,624,625],{},"indice segmenti strutturato",", non dal context dell'intero libro—prerequisito tecnico dello zero allucinazioni su libri lunghi.",[34,628],{},[37,630,632],{"id":631},"v-sistema-di-tag-di-posizione-codificare-il-da-dove-nel-testo","V. Sistema di tag di posizione: Codificare il «da dove» nel testo",[11,634,635,636,639,640,643],{},"Zero allucinazioni richiede contenuto dalla sorgente ",[25,637,638],{},"e"," ",[25,641,642],{},"provenienza"," analizzabile dalla macchina e raggiungibile in UI. Usiamo tag inline:",[611,645,648],{"className":646,"code":647,"language":616},[614],"[f{fileIndex}-{startChar}-{endChar}]\n",[154,649,647],{"__ignoreMap":617},[11,651,652,653,656],{},"Esempio: ",[154,654,655],{},"[f5-123-165]"," = file spine 5 (base 0), caratteri 123–165.",[54,658,660],{"id":659},"_51-come-i-tag-sono-scritti-nel-corpo","5.1 Come i tag sono scritti nel corpo",[11,662,663,664,667],{},"Lo strato di estrazione aggiunge ",[154,665,666],{},"[f{fileIndex}-{start}-{end}]"," a fine segmento:",[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",[154,675,672],{"__ignoreMap":617},[11,677,678,679,682],{},"Riassunti di pre-processing o estratti Tool: le posizioni si allineano agli ",[25,680,681],{},"offset caratteri spine","—non numeri di pagina stimati dal modello.",[54,684,686],{"id":685},"_52-vincoli-sulloutput-del-modello","5.2 Vincoli sull'output del modello",[11,688,689,690,696],{},"Il system prompt include ",[25,691,692],{},[693,694,695],"span",{},"Position Citation Rules","—cinque punti essenziali:",[251,698,699,709,719,725,734],{},[85,700,701,704,705,708],{},[25,702,703],{},"Formato standard:"," Deve usare ",[154,706,707],{},"[f_fileIndex-startChar-endChar]","; tutte e tre le parti numeriche obbligatorie;",[85,710,711,714,715,718],{},[25,712,713],{},"Copiare solo dalle fonti attuali:"," Note ",[25,716,717],{},"verbatim"," da messaggi system/user o ritorni Tool di questo turno;",[85,720,721,724],{},[25,722,723],{},"Nessuna fabbricazione:"," Non calcolare, modificare o inventare posizioni;",[85,726,727,730,731,206],{},[25,728,729],{},"Preferire omissione:"," Nessun tag valido nel context → rispondere normalmente—",[25,732,733],{},"non emettere tag di posizione",[85,735,736,739],{},[25,737,738],{},"Inline con le affermazioni:"," Tag dopo la frase pertinente; niente elenchi di citazioni a fine risposta.",[11,741,742,743,746,747,750],{},"L'UI filtra anche tag ",[25,744,745],{},"bipartiti"," invalidi occasionali (es. ",[154,748,749],{},"[f1-293]",") prima del render.",[11,752,753],{},[14,754],{"alt":755,"src":756},"Popup tracciamento citazioni","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[34,758],{},[37,760,762],{"id":761},"vi-tool-calling-prima-cercare-poi-rispondere","VI. Tool Calling: Prima cercare, poi rispondere",[11,764,765,766,769,770,773,774,777],{},"Quando la chat è legata a un libro (",[154,767,768],{},"resourceId"," presente, ",[154,771,772],{},"chatType === 'chat'","), registriamo due Tool con executor prima di ogni generazione—ciclo ",[25,775,776],{},"function calling"," compatibile OpenAI.",[54,779,781,782,785],{"id":780},"_61-get_related_segment_summaries-ricerca-mirata-di-segmenti","6.1 ",[154,783,784],{},"get_related_segment_summaries"," — Ricerca mirata di segmenti",[11,787,788,789,232],{},"Per: concetti, personaggi, trama, dettagli di capitolo—",[25,790,791],{},"intento di ricerca chiaro",[11,793,794],{},"Flusso:",[251,796,797,804,810,813,823],{},[85,798,799,800,803],{},"Il modello riformula la domanda in ",[25,801,802],{},"termini probabili nel libro"," («Optimize Search Queries» nel system prompt);",[85,805,806,807,206],{},"Chiamata Tool con ",[154,808,809],{},"question",[85,811,812],{},"Raggruppare tutti i riassunti segmenti per budget token (~30k token per batch, max 5 batch);",[85,814,815,816,819,820,206],{},"Per batch: richiesta LLM separata sceglie ID pertinenti (max 5) da ",[154,817,818],{},"{ id, title, summary }",", JSON come ",[154,821,822],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[85,824,825,826,829],{},"Per i segmenti scelti, estrarre ",[25,827,828],{},"testo sorgente taggato"," dallo spine—not i riassunti—come risultato Tool.",[11,831,832,835,836,839],{},[25,833,834],{},"Design chiave: il Tool restituisce sorgente, non riassunti."," Il modello risponde da paragrafi reali con ",[154,837,838],{},"[f…]"," inline, evitando la deriva «riassunto → ri-riassunto».",[54,841,843,844,847],{"id":842},"_62-get_full_book_segment_summaries-panoramica-dellintero-libro","6.2 ",[154,845,846],{},"get_full_book_segment_summaries"," — Panoramica dell'intero libro",[11,849,850,851,232],{},"Per: «riassumi il libro», «recensisci questo libro», «struttura/temi globali»—",[25,852,853],{},"vista globale",[11,855,856,857,860],{},"Concatenare tutti i campi ",[154,858,859],{},"summary"," dei segmenti in ordine di lettura—evitare di perdere capitoli chiave solo per rilevanza per chunk.",[54,862,864],{"id":863},"_63-system-prompt-libro-prima-tool-prima","6.3 System prompt: Libro prima, tool prima",[11,866,867,868,455],{},"Con libro legato, si applica ",[25,869,870],{},[693,871,872],{},"Core Principles for Reading Assistant",[611,874,877],{"className":875,"code":876,"language":616},[614],"1. Book First, Tool First\n   - Any question possibly about the book must call tools first;\n   - Answers must rely mainly on retrieval—never invent “book content” without retrieval.\n\n2. General Knowledge as Fallback Only\n   - Only for: casual chat / user explicitly skips the book / tools return nothing;\n   - If the book lacks it, say “not mentioned in this book” before general knowledge.\n\n3. Direct Style\n   - Get to the point—avoid “based on the provided materials…” and similar filler.\n",[154,878,876],{"__ignoreMap":617},[11,880,881,882,885,886,889],{},"La generazione esegue il ciclo Tool: ",[154,883,884],{},"tool_calls"," → eseguire → append ",[154,887,888],{},"role: tool"," → continuare fino al testo finale. Con tools attivi, il canale thinking è spento per evitare conflitti di protocollo.",[34,891],{},[37,893,895],{"id":894},"vii-tracciabilità-frontend-dalla-nota-allevidenziazione","VII. Tracciabilità frontend: Dalla nota all'evidenziazione",[11,897,898,899,901],{},"L'output ",[154,900,655],{}," del modello non è mostrato grezzo; lo strato di render converte i tag in citazioni cliccabili.",[54,903,905],{"id":904},"_71-render-delle-note","7.1 Render delle note",[11,907,908,909,912],{},"Normalizzare i tag in link Markdown come ",[154,910,911],{},"[1]([f5-123-165])",", mostrare come note numerate; deduplicare la stessa posizione.",[54,914,916],{"id":915},"_72-interazione-al-clic","7.2 Interazione al clic",[251,918,919,928,934],{},[85,920,921,924,925,927],{},[25,922,923],{},"Primo clic:"," Parsare ",[154,926,838],{}," → fileIndex + offset → estrarre testo spine → anteprima (titolo TOC opzionale);",[85,929,930,933],{},[25,931,932],{},"Stessa nota di nuovo:"," Chiudere anteprima;",[85,935,936,939],{},[25,937,938],{},"Confermare salto:"," Aprire vista lettura, evidenziare intervallo caratteri.",[11,941,942,943,946],{},"Dal tag copiato dal modello al testo sorgente visibile all'utente, la catena ",[25,944,945],{},"non passa mai da un'altra chiamata LLM","—deterministica e riproducibile.",[34,948],{},[37,950,952],{"id":951},"viii-casi-limite-e-degradazione-onesta","VIII. Casi limite e degradazione onesta",[11,954,955,956,455],{},"Zero allucinazioni ≠ «c'è sempre una risposta»—è ",[25,957,958],{},"nessuna prova, nessuna invenzione",[281,960,961,971],{},[284,962,963],{},[287,964,965,968],{},[290,966,967],{},"Scenario",[290,969,970],{},"Comportamento",[303,972,973,981,993,1001,1009],{},[287,974,975,978],{},[308,976,977],{},"Riassunti segmenti non pronti",[308,979,980],{},"Estrarre prima testo integrale e riassumere",[287,982,983,986],{},[308,984,985],{},"Tool non trova nulla",[308,987,988,989,992],{},"Restituire ",[154,990,991],{},"(No relevant segment excerpts found…)","; il modello deve dire «non nel libro»",[287,994,995,998],{},[308,996,997],{},"Tag bipartiti invalidi dal modello",[308,999,1000],{},"Filtraggio frontend; niente note rotte",[287,1002,1003,1006],{},[308,1004,1005],{},"Chiacchierata informale",[308,1007,1008],{},"Il system prompt consente conoscenza generale fuori dal libro",[287,1010,1011,1014],{},[308,1012,1013],{},"Esportare chat",[308,1015,1016],{},"Le note possono diventare deep link del reader per condivisione/archivio",[11,1018,1019],{},[14,1020],{"alt":1021,"src":1022},"Esportazione chat","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[34,1024],{},[37,1026,1028],{"id":1027},"ix-compromesso-di-design-perché-non-il-rag-vettoriale","IX. Compromesso di design: Perché non il «RAG vettoriale»?",[11,1030,1031,1032,1035],{},"I colleghi nel Q&A documentale chiedono spesso: se fai retrieval-augmented generation, perché non ",[25,1033,1034],{},"Embedding + vector DB Top-K","?",[11,1037,1038,1041,1042,1045,1046,1049,1050,1053],{},[25,1039,1040],{},"Facciamo RAG","—cercare prima di generare. La differenza: «RAG» nel discorso comunitario implica spesso ",[25,1043,1044],{},"similarità vettoriale","; la nostra fase 3 è ",[25,1047,1048],{},"indice segmenti + Tool con sorgente on demand","—",[25,1051,1052],{},"nessuno strato vettoriale per scelta",". Sotto: ragioni architetturali, senza negare il valore del RAG vettoriale.",[54,1055,1057],{"id":1056},"ambito-non-nessuna-ricerca-ma-nessuna-ricerca-vettoriale","Ambito: non «nessuna ricerca», ma «nessuna ricerca vettoriale»",[82,1059,1060,1069],{},[85,1061,1062,1065,1066,206],{},[25,1063,1064],{},"RAG ampio:"," cercare → generare → ",[25,1067,1068],{},"lo facciamo",[85,1070,1071,1074,1075,232],{},[25,1072,1073],{},"RAG vettoriale:"," recall via similarità embedding → ",[25,1076,1077],{},"non in questa versione",[11,1079,1080,1081,1084,1085,1088],{},"Il pre-processing costruisce un ",[25,1082,1083],{},"indice di riassunti segmenti","; il modello sceglie segmenti via Tools e ottiene ",[25,1086,1087],{},"testo sorgente",". C'è ricerca senza modello embedding separato né manutenzione indice vettoriale.",[34,1090],{},[54,1092,1094],{"id":1093},"motivo-1-provider-llm-personalizzatisuperficie-di-integrazione-ridotta","Motivo 1: Provider LLM personalizzati—superficie di integrazione ridotta",[11,1096,1097,1098,1101,1102,1105],{},"Gli utenti possono collegare ",[25,1099,1100],{},"le proprie API key",", base URL personalizzate o ",[25,1103,1104],{},"Ollama locale","—il modello di chat è loro scelta; costo e percorso dati restano sotto controllo.",[11,1107,1108],{},"Il RAG vettoriale tipico allarga l'integrazione:",[82,1110,1111,1122,1125],{},[85,1112,1113,1114,1117,1118,1121],{},"Oltre al ",[25,1115,1116],{},"modello di chat",", serve di solito un ",[25,1119,1120],{},"modello di embedding"," (altro nome, a volte altro endpoint);",[85,1123,1124],{},"Ollama locale richiede modello embedding separato più compatibilità dimensione/API;",[85,1126,1127,1128,1131],{},"Più modi di guasto: chat OK ma ",[25,1129,1130],{},"ricerca vuota","—embedding, indice o dimensione; debug più difficile di un provider end-to-end.",[11,1133,1134,1135,1138,1139,1142],{},"Qui, ",[25,1136,1137],{},"scelta segmenti e risposta condividono una config provider","—niente «chat su A, indice su B». Per app ",[25,1140,1141],{},"LLM pluggabili",", spesso conta più di qualche punto di recall.",[11,1144,1145],{},[14,1146],{"alt":1147,"src":1148},"Provider IA personalizzati","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[34,1150],{},[54,1152,1154],{"id":1153},"motivo-2-gli-embedding-legano-lindicecambiare-provider-costa-caro","Motivo 2: Gli embedding legano l'indice—cambiare provider costa caro",[11,1156,1157,1158,1161,1162,1165,1166,1169],{},"Nel RAG vettoriale, ",[25,1159,1160],{},"i vettori non sono un formato intermedio universale","—sono coordinate sotto un modello di embedding. Indice con A, query con B: la similarità di solito ",[25,1163,1164],{},"non è comparabile","—spesso ",[25,1167,1168],{},"re-embedding completo",", e dimensioni (768 / 1024 / 1536 …) bloccano lo schema di storage.",[11,1171,1172,1173,1176,1177,1180],{},"La fase 3 persiste ",[25,1174,1175],{},"riassunti strutturati + span caratteri",", non vettori; cambiare modello chat ",[25,1178,1179],{},"non ricostruisce l'indice","; la catena di prova (posizioni sorgente) resta—allineato a «provare LLM diversi in qualsiasi momento».",[34,1182],{},[54,1184,1186],{"id":1185},"motivo-3-il-routing-strutturato-spesso-basta-per-documenti-lunghi-con-toc","Motivo 3: Il routing strutturato spesso basta per documenti lunghi con TOC",[11,1188,1189,1190,1193,1194,1197,1198,1201,1202,1207],{},"E-book e PDF hanno di solito ",[25,1191,1192],{},"struttura a capitoli","; il pre-processing fornisce ",[25,1195,1196],{},"titoli segmento + riassunti",". Per «cosa dice il capitolo X» o «come il libro definisce Y», scegliere segmenti dal catalogo e ",[25,1199,1200],{},"tirare la sorgente"," funziona bene in pratica; il Tool restituisce ",[25,1203,1204,1205],{},"sorgente con ",[154,1206,838],{},", lo zero allucinazioni resta ancorato agli span caratteri.",[11,1209,1210,1211,1214,1215,1218],{},"I vettori aiutano per semantica fuzzy, multilingue, match letterale lungo; per reader ",[25,1212,1213],{},"TOC + pre-processing + forte tracciabilità",", investire in ",[25,1216,1217],{},"Tool + restituzione sorgente + regole citazione"," ha spesso ROI migliore.",[34,1220],{},[54,1222,1224],{"id":1223},"futuro-recall-ibrido-non-riscrittura","Futuro: Recall ibrido, non riscrittura",[11,1226,1227,1228,1231,1232,1235,1236,1239,1240,1243],{},"Potremmo aggiungere ",[25,1229,1230],{},"recall vettoriale grossolano"," (embedding solo per Top-N capitoli candidati), terminando sempre in ",[25,1233,1234],{},"scegli segmento → sorgente → traccia cliccabile","—regole zero allucinazioni invariate. Se aggiunto: embedding ",[25,1237,1238],{},"opzionale",", prompt espliciti di ",[25,1241,1242],{},"re-indicizzazione"," al cambio modello—evitare silent wrong retrieval.",[11,1245,1246,1247],{},"Fino ad allora: ",[25,1248,1249],{},"qualsiasi API chat compatibile OpenAI funziona; cambiare modello chat non ricostruisce l'indice locale.",[34,1251],{},[37,1253,1255],{"id":1254},"x-sintesi","X. Sintesi",[281,1257,1258,1271],{},[284,1259,1260],{},[287,1261,1262,1265,1268],{},[290,1263,1264],{},"Passo",[290,1266,1267],{},"Metodo",[290,1269,1270],{},"Ruolo",[303,1272,1273,1284,1297,1310,1321,1332],{},[287,1274,1275,1278,1281],{},[308,1276,1277],{},"Pre-processing",[308,1279,1280],{},"Suddivisione TOC/lunghezza + cache segmenti",[308,1282,1283],{},"Libri lunghi ricercabili e localizzabili",[287,1285,1286,1289,1294],{},[308,1287,1288],{},"Tag di posizione",[308,1290,1291,1293],{},[154,1292,156],{}," nella sorgente",[308,1295,1296],{},"Provenienza analizzabile dalla macchina",[287,1298,1299,1302,1307],{},[308,1300,1301],{},"Tool",[308,1303,1304,1305],{},"Segmenti / riassunti libro per domanda, restituire ",[25,1306,322],{},[308,1308,1309],{},"Forzare prove prima della risposta",[287,1311,1312,1315,1318],{},[308,1313,1314],{},"System prompt",[308,1316,1317],{},"Libro prima, niente tag falsi, dire quando manca",[308,1319,1320],{},"Vincolare la generazione",[287,1322,1323,1326,1329],{},[308,1324,1325],{},"Frontend",[308,1327,1328],{},"Nota → anteprima → salto ed evidenziazione",[308,1330,1331],{},"L'utente verifica le prove",[287,1333,1334,1337,1340],{},[308,1335,1336],{},"Nessuna ricerca vettoriale",[308,1338,1339],{},"Un provider; cambiare modello chat senza re-indice",[308,1341,1342],{},"Costo integrazione e migrazione ridotto",[11,1344,1345,1346,1349],{},"«Zero allucinazioni» non significa che il modello non sbaglia mai—significa che ",[25,1347,1348],{},"l'ingegneria lega l'output a una catena di prove",": nessuna ricerca → non fingere contenuto del libro; con ricerca → posizioni sorgente verificabili.",[11,1351,1352,1353,1356,1357,1360],{},"Se sviluppi lettura IA o Q&A documentale, speriamo che il percorso ",[25,1354,1355],{},"testo integrale → frasi chiave → Tool-first on demand",", più ",[25,1358,1359],{},"tag di posizione inline + restituzione sorgente",", sia un'implementazione di riferimento utile.",[19,1362,1363],{},[11,1364,1365,1366,1371,1372,232],{},"Queste sono lezioni dal reader IA ",[243,1367,1370],{"href":1368,"rel":1369},"https://reader.linghuxiong.com",[247],"Foxycape","—solo a titolo di riferimento. Prova il reader nella ",[243,1373,1375],{"href":1374},"/it-it#download","pagina download",{"title":617,"searchDepth":1377,"depth":1377,"links":1378},2,[1379,1385,1386,1387,1388,1392,1399,1403,1404,1411],{"id":39,"depth":1377,"text":40,"children":1380},[1381,1383,1384],{"id":56,"depth":1382,"text":57},3,{"id":138,"depth":1382,"text":139},{"id":235,"depth":1382,"text":236},{"id":425,"depth":1377,"text":426},{"id":486,"depth":1377,"text":487},{"id":501,"depth":1377,"text":502},{"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":780,"depth":1382,"text":1395},"6.1 get_related_segment_summaries — Ricerca mirata di segmenti",{"id":842,"depth":1382,"text":1397},"6.2 get_full_book_segment_summaries — Panoramica dell'intero libro",{"id":863,"depth":1382,"text":864},{"id":894,"depth":1377,"text":895,"children":1400},[1401,1402],{"id":904,"depth":1382,"text":905},{"id":915,"depth":1382,"text":916},{"id":951,"depth":1377,"text":952},{"id":1027,"depth":1377,"text":1028,"children":1405},[1406,1407,1408,1409,1410],{"id":1056,"depth":1382,"text":1057},{"id":1093,"depth":1382,"text":1094},{"id":1153,"depth":1382,"text":1154},{"id":1185,"depth":1382,"text":1186},{"id":1223,"depth":1382,"text":1224},{"id":1254,"depth":1377,"text":1255},null,"2026-06-03","Note tecniche sul Q&A a zero allucinazioni in un reader IA—risposte ancorate al libro aperto, con citazioni in un clic al passaggio esatto.",false,"md",{},true,"/it-it/blog/zero-hallucination-qa",{"title":6,"description":1414},"it-it/blog/zero-hallucination-qa",[1423,1424,1425],"lettore","IA","ingegneria","zero-hallucination-qa","BdcEGBJmQs13oi-Il4fViNueRch1ksDhMYMtbkheQic",1780489852878]