[{"data":1,"prerenderedAt":1430},["ShallowReactive",2],{"blog-list-es-es":3},[4],{"id":5,"title":6,"body":7,"config":1412,"date":1412,"description":1413,"draft":1414,"extension":1415,"image":1412,"meta":1416,"navigation":1417,"path":1418,"seo":1419,"stem":1428,"tags":1412,"toolbar":1412,"translationKey":1412,"updated":1412,"__hash__":1429},"blog/es-es/blog/zero-hallucination-qa.md","Cómo implementé preguntas y respuestas sin alucinaciones en nuestro lector",{"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},"Portada: Q&A sin alucinaciones","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[19,20,21],"blockquote",{},[11,22,23,24,28,29,32],{},"Este artículo comparte la implementación técnica de ",[25,26,27],"strong",{},"Q&A sin alucinaciones"," en nuestro lector con IA: las respuestas se basan estrictamente en el texto del libro abierto y las afirmaciones clave pueden ",[25,30,31],{},"rastrearse con un clic"," hasta el pasaje exacto. Si desarrollas lectura con IA, Q&A documental o aplicaciones tipo RAG, esperamos que tres iteraciones y la arquitectura final te resulten útiles.",[34,35],"hr",{},[37,38,40],"h2",{"id":39},"i-evolución-en-tres-etapas","I. Evolución en tres etapas",[11,42,43,44,47],{},"El Q&A sin alucinaciones no se diseñó perfecto desde el primer día. Evolucionó bajo la tensión entre ",[25,45,46],{},"coste, latencia y precisión",". A continuación, las tres etapas en orden cronológico—contexto para entender por qué la arquitectura actual tiene esta forma.",[49,50],"mermaid",{":config":51,"code":52},"config","flowchart%20LR%0A%20%20%20%20P1%5BEtapa%201%3A%20Texto%20completo%5D%20--%3E%20P2%5BEtapa%202%3A%20LLM%20frases%20clave%5D%0A%20%20%20%20P2%20--%3E%20P3%5BEtapa%203%3A%20%C3%8Dndice%20segmentos%20%2B%20Tool%5D%0A%20%20%20%20P1%20-.-%3E%7CLento%2C%20caro%2C%20impreciso%20en%20libros%20largos%7C%20X1%5BDescartado%5D%0A%20%20%20%20P2%20-.-%3E%7CP%C3%A9rdida%20de%20detalle%2C%20a%C3%BAn%20lento%7C%20X2%5BDescartado%5D%0A%20%20%20%20P3%20--%3E%7CActual%7C%20OK%5BCero%20alucinaciones%20%2B%20trazable%5D",[54,55,57],"h3",{"id":56},"etapa-1-volcar-todo-el-libro-en-el-contexto-lo-más-simpley-lo-primero-que-falla","Etapa 1: Volcar todo el libro en el contexto (lo más simple—y lo primero que falla)",[11,59,60,63,64,67,68,71,72,75],{},[25,61,62],{},"Enfoque:"," Cuando el usuario abre un libro y pregunta, meter ",[25,65,66],{},"todo el cuerpo de texto extraído"," en el system prompt o el mensaje de usuario y dejar que el modelo de chat responda. Si el libro supera unos ",[25,69,70],{},"400.000 caracteres",", ",[25,73,74],{},"truncado duro","—solo queda el inicio; los capítulos posteriores son invisibles para el modelo.",[11,77,78],{},[25,79,80],{},"Ventajas:",[82,83,84,88,91],"ul",{},[85,86,87],"li",{},"Coste de implementación muy bajo, casi sin preprocesado;",[85,89,90],{},"Funciona razonablemente en libros cortos y documentos simples—el modelo realmente «vio todo el libro»;",[85,92,93],{},"UX simple: preguntar y obtener respuesta, sin estado «espere mientras analizamos».",[11,95,96],{},[25,97,98],{},"Inconvenientes (pronto inaceptables):",[82,100,101,107,113,123],{},[85,102,103,106],{},[25,104,105],{},"Respuestas lentas:"," Cada pregunta reenvía una carga enorme; el tiempo hasta el primer token y la latencia total crecen con la longitud del libro;",[85,108,109,112],{},[25,110,111],{},"Coste de tokens alto:"," Se paga la entrada del libro completo en cada pregunta;",[85,114,115,118,119,122],{},[25,116,117],{},"Libros largos muy distorsionados:"," Tras 400k caracteres, la segunda mitad, anexos y conclusiones casi no existen—y la UI ",[25,120,121],{},"no suele indicar claramente"," el truncado;",[85,124,125,128,129,132],{},[25,126,127],{},"Granularidad de búsqueda cero:"," El modelo debe «encontrar una aguja en un pajar» entre cientos de miles de caracteres—fácil omitir detalles y producir ",[25,130,131],{},"resúmenes plausibles sin base","—exactamente lo que las apps de lectura deben evitar.",[11,134,135],{},"La etapa 1 sirve para un MVP, no para una solución de producto.",[54,137,139],{"id":138},"etapa-2-un-llm-ligero-extrae-frases-clave-comprimir-contextodemasiado-agresivo","Etapa 2: Un LLM ligero extrae frases clave (comprimir contexto—demasiado agresivo)",[11,141,142,144,145,148,149,152,153,157],{},[25,143,62],{}," Antes del Q&A (o al abrir por primera vez), ejecutar un ",[25,146,147],{},"modelo más barato"," sobre el cuerpo: dividir por capítulo spine (o trocear el libro), extraer ",[25,150,151],{},"frases clave",", conservar etiquetas de posición como ",[154,155,156],"code",{},"[fArchivo-inicio-fin]",", luego concatenar extractos en un contexto más corto para el Q&A posterior.",[11,159,160,161,164],{},"Pipeline típico: ",[25,162,163],{},"Extract → Cache → Chat",". Extraer una vez (offline o bajo demanda), guardar un «paquete de frases clave», reutilizarlo en cada pregunta—como muchos prototipos de Q&A documental: comprimir primero, responder después.",[11,166,167],{},[25,168,80],{},[82,170,171,178,181],{},[85,172,173,174,177],{},"Cada pregunta envía ",[25,175,176],{},"mucho menos texto","; el consumo de tokens por petición baja respecto a la etapa 1;",[85,179,180],{},"El preprocesado puede cachearse; sin reextracción por pregunta en el mismo libro;",[85,182,183],{},"Las etiquetas de posición sientan las bases de las citas.",[11,185,186],{},[25,187,188],{},"Inconvenientes (siguen fallando en libros largos):",[82,190,191,197,207,216],{},[85,192,193,196],{},[25,194,195],{},"Pérdida fuerte de detalle:"," Las «frases clave» las elige el modelo; calificadores, contraejemplos y cadenas argumentales se pierden a menudo—respuestas «correctas pero parciales»;",[85,198,199,202,203,206],{},[25,200,201],{},"Contexto aún grande en obras largas:"," Incluso los paquetes de frases clave son considerables—latencia y coste ",[25,204,205],{},"se alivian, no se resuelven",";",[85,208,209,212,213,206],{},[25,210,211],{},"Doble error de LLM:"," La extracción puede omitir; el Q&A puede leer mal los extractos—los errores ",[25,214,215],{},"se acumulan",[85,217,218,221,222,225],{},[25,219,220],{},"Contexto estático:"," Pregunte el usuario por un capítulo o la estructura global, el modelo recibe siempre ",[25,223,224],{},"el mismo blob preextraído","—sin estrechamiento dinámico según la pregunta.",[11,227,228,229,232],{},"La lección: el problema no es «si comprimimos», sino ",[25,230,231],{},"«si la compresión es bajo demanda y si podemos volver al texto fuente»",".",[54,234,236],{"id":235},"etapa-3-índice-de-segmentos-tool-bajo-demanda-devolución-del-texto-fuente-actual","Etapa 3: Índice de segmentos + Tool bajo demanda + devolución del texto fuente (actual)",[11,238,239,241,242,249],{},[25,240,62],{}," Inspirado en ",[243,244,248],"a",{"href":245,"rel":246},"https://github.com/VectifyAI/PageIndex",[247],"nofollow","PageIndex",". Frente a la etapa 2, tres cambios centrales:",[251,252,253,259,269],"ol",{},[85,254,255,258],{},[25,256,257],{},"El preprocesado produce un índice estructurado"," (resúmenes a nivel TOC + spans de caracteres exactos), no extractos usados directamente como contexto Q&A;",[85,260,261,264,265,268],{},[25,262,263],{},"Cada pregunta usa Tool Calling para buscar bajo demanda",", luego ",[25,266,267],{},"obtiene texto fuente con etiquetas de posición"," para responder;",[85,270,271,274],{},[25,272,273],{},"System prompt + frontend"," imponen el formato de cita y permiten clic → salto → resaltado en el lector.",[11,276,277],{},[25,278,279],{},"Comparación de las tres etapas:",[281,282,283,302],"table",{},[284,285,286],"thead",{},[287,288,289,293,296,299],"tr",{},[290,291,292],"th",{},"Dimensión",[290,294,295],{},"Etapa 1 (texto completo)",[290,297,298],{},"Etapa 2 (frases clave)",[290,300,301],{},"Etapa 3 (actual)",[303,304,305,324,338,352,366,383],"tbody",{},[287,306,307,311,314,317],{},[308,309,310],"td",{},"Contexto por pregunta",[308,312,313],{},"Libro entero (o primera mitad truncada)",[308,315,316],{},"Frases clave preextraídas",[308,318,319,320,323],{},"Solo fragmentos de ",[25,321,322],{},"fuente"," relevantes",[287,325,326,329,332,335],{},[308,327,328],{},"Precisión en libros largos",[308,330,331],{},"Colapso tras ~400k caracteres",[308,333,334],{},"Depende de la extracción; pierde detalle",[308,336,337],{},"Búsqueda por TOC/span; sin truncado duro del libro entero",[287,339,340,343,346,349],{},[308,341,342],{},"Velocidad de respuesta",[308,344,345],{},"Lenta",[308,347,348],{},"Algo mejor; libros largos aún lentos",[308,350,351],{},"Búsqueda + contexto corto—notablemente más rápido",[287,353,354,357,360,363],{},[308,355,356],{},"Coste de tokens",[308,358,359],{},"Muy alto",[308,361,362],{},"Medio-alto",[308,364,365],{},"Preprocesado amortizado + pago bajo demanda",[287,367,368,371,374,377],{},[308,369,370],{},"Trazabilidad",[308,372,373],{},"Débil (citas difíciles)",[308,375,376],{},"Hay etiquetas pero contenido filtrado",[308,378,379,380],{},"Notas al pie → ",[25,381,382],{},"spans fuente reales",[287,384,385,388,391,394],{},[308,386,387],{},"Complejidad técnica",[308,389,390],{},"Baja",[308,392,393],{},"Media",[308,395,396],{},"Alta",[11,398,399,402,403,406,407,410,411,414],{},[25,400,401],{},"Por qué nos quedamos en la etapa 3:"," En lectura, cero alucinaciones no es «mostrar al modelo el máximo texto», sino ",[25,404,405],{},"«antes de responder, obtener pruebas fuente para la pregunta»",". Las etapas 1–2 luchaban con el ",[25,408,409],{},"tamaño del contexto","; la etapa 3 divide el pipeline en ",[25,412,413],{},"índice (preprocesado) → búsqueda (Tool) → prueba (fuente) → respuesta (generación restringida)","—equilibrio entre precisión, coste y trazabilidad.",[11,416,417,418,232],{},"A continuación el detalle de ",[25,419,420],{},"la etapa 3",[34,422],{},[37,424,426],{"id":425},"ii-definición-del-problema-en-qa-de-libros-la-alucinación-duele-más-que-en-un-chat-genérico","II. Definición del problema: En Q&A de libros, la alucinación duele más que en un chat genérico",[11,428,429,430,433],{},"Los usuarios perdonan errores ocasionales en un chatbot general. En ",[25,431,432],{},"Q&A de libros",", el coste es mayor:",[82,435,436,443,446],{},[85,437,438,439,442],{},"Preguntan qué dice ",[25,440,441],{},"este libro","—no lo que vive en la memoria paramétrica del modelo;",[85,444,445],{},"Una «opinión del libro» plausible puede inducir a error en notas, citas y reenvíos;",[85,447,448],{},"Sin fuentes, no hay verificación—la confianza cuesta de construir.",[11,450,451,452,455],{},"«Cero alucinaciones» se traduce en tres reglas ",[25,453,454],{},"exigibles",":",[251,457,458,464,470],{},[85,459,460,463],{},[25,461,462],{},"Las preguntas sobre el libro deben consultar el libro primero:"," Todo lo que pueda concernir al libro abierto pasa por la búsqueda (Tool) antes de responder;",[85,465,466,469],{},[25,467,468],{},"Las respuestas deben ser trazables:"," Las afirmaciones clave llevan etiquetas de posición que la UI puede parsear y saltar;",[85,471,472,475],{},[25,473,474],{},"Decir cuando no se encuentra:"," Si el libro no lo contiene, decirlo—no disfrazar conocimiento general como «lo que dice el libro».",[11,477,478,479,481],{},"El resto sigue el flujo de datos de ",[25,480,420],{}," y cómo se aplican estas reglas.",[34,483],{},[37,485,487],{"id":486},"iii-arquitectura-preprocesado-tool-generación-restringida-citas-clicables","III. Arquitectura: Preprocesado → Tool → Generación restringida → Citas clicables",[49,489],{":config":51,"code":490},"flowchart%20TB%0A%20%20%20%20subgraph%20prep%20%5BOffline%20%2F%20primer%20preprocesado%5D%0A%20%20%20%20%20%20%20%20A%5BDividir%20libro%20por%20TOC%20o%20longitud%5D%20--%3E%20B%5BRes%C3%BAmenes%20de%20segmentos%20LLM%5D%0A%20%20%20%20%20%20%20%20B%20--%3E%20C%5BPersistir%20cach%C3%A9%20Segment%20localmente%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20ask%20%5BPregunta%20del%20usuario%5D%0A%20%20%20%20%20%20%20%20D%5BEntrada%20del%20usuario%5D%20--%3E%20E%7B%C2%BFExiste%20cach%C3%A9%20Segment%3F%7D%0A%20%20%20%20%20%20%20%20E%20--%3E%7CNo%7C%20F%5BExtraer%20texto%20completo%20%2F%20ofrecer%20preprocesado%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%AD%7C%20G%5BRegistrar%20Tool%20Calling%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20retrieve%20%5BB%C3%BAsqueda%20Tool%5D%0A%20%20%20%20%20%20%20%20G%20--%3E%20H%7BTipo%20de%20pregunta%7D%0A%20%20%20%20%20%20%20%20H%20--%3E%7CVisi%C3%B3n%20global%20%2F%20rese%C3%B1a%7C%20I%5Bget_full_book_segment_summaries%5D%0A%20%20%20%20%20%20%20%20H%20--%3E%7CHechos%20%2F%20personas%20%2F%20cap%C3%ADtulo%7C%20J%5Bget_related_segment_summaries%5D%0A%20%20%20%20%20%20%20%20J%20--%3E%20K%5BLLM%20elige%20IDs%20de%20segmento%20del%20cat%C3%A1logo%5D%0A%20%20%20%20%20%20%20%20K%20--%3E%20L%5BObtener%20fuente%20por%20span%20%2B%20etiquetas%20de%20posici%C3%B3n%5D%0A%20%20%20%20%20%20%20%20I%20--%3E%20M%5BConcatenar%20todos%20los%20res%C3%BAmenes%20de%20segmentos%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20answer%20%5BGenerar%20y%20mostrar%5D%0A%20%20%20%20%20%20%20%20L%20--%3E%20N%5BResultados%20Tool%20al%20modelo%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%5BReglas%20de%20cita%20del%20system%20prompt%5D%0A%20%20%20%20%20%20%20%20O%20--%3E%20P%5BRespuesta%20en%20streaming%20%2B%20notas%20de%20posici%C3%B3n%5D%0A%20%20%20%20%20%20%20%20P%20--%3E%20Q%5BRenderizar%20notas%20clicables%5D%0A%20%20%20%20%20%20%20%20Q%20--%3E%20R%5BClic%20%E2%86%92%20vista%20previa%20%E2%86%92%20salto%20y%20resaltado%5D%0A%20%20%20%20end",[11,492,493,494],{},"Idea central: ",[25,495,496],{},"no dejar que el modelo «responda de memoria»—obligarlo a «reunir pruebas, responder y marcar fuentes».",[34,498],{},[37,500,502],{"id":501},"iv-preprocesado-convertir-el-libro-en-un-índice-de-segmentos-buscable","IV. Preprocesado: Convertir el libro en un índice de segmentos buscable",[11,504,505,506,509,510,513,514,517,518,521,522,525],{},"Si cada pregunta siguiera usando el contexto ",[25,507,508],{},"etapa 1"," del libro entero, los libros largos revientan el presupuesto de tokens y la búsqueda es demasiado gruesa. Etapa 3: en el primer chat IA de un libro, ejecutar en segundo plano un ",[25,511,512],{},"job de resumen de segmentos","—división por ",[25,515,516],{},"TOC"," o ",[25,519,520],{},"longitud de texto"," en ",[154,523,524],{},"Segment","s, resumir cada uno, persistir en IndexedDB local.",[11,527,528,529,531,532,455],{},"Cada ",[154,530,524],{}," contiene resumen más ",[25,533,534],{},"posición física en el cuerpo",[281,536,537,547],{},[284,538,539],{},[287,540,541,544],{},[290,542,543],{},"Campo",[290,545,546],{},"Significado",[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],{},"Índice de archivo spine (PDF: un archivo por página)",[287,564,565,573],{},[308,566,567,556,570],{},[154,568,569],{},"startOffset",[154,571,572],{},"endOffset",[308,574,575],{},"Inicio/fin en caracteres",[287,577,578,583],{},[308,579,580],{},[154,581,582],{},"sequence",[308,584,585],{},"Orden de lectura lineal",[287,587,588,593],{},[308,589,590],{},[154,591,592],{},"title",[308,594,595],{},"Título TOC",[11,597,598],{},"La división equilibra precisión y coste: nodo TOC bajo ~20 KB → resumir solo ese nodo; nodos hermanos fusionados en lotes (15–20 KB) antes del LLM; bloques largos no estructurados en rangos ~30–40k caracteres.",[11,600,601,602,605,606,609],{},"El system prompt de resumen exige ",[25,603,604],{},"conservar etiquetas de posición inline"," (",[154,607,608],{},"[fNúmero-Número-Número]",") para que la fuente obtenida por Tool se alinee con offsets spine. Restricción central:",[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],{},"Tras el preprocesado, el Q&A depende de un ",[25,624,625],{},"índice de segmentos estructurado",", no del contexto del libro entero—requisito técnico del cero alucinaciones en libros largos.",[34,628],{},[37,630,632],{"id":631},"v-sistema-de-etiquetas-de-posición-codificar-el-de-dónde-en-el-texto","V. Sistema de etiquetas de posición: Codificar el «de dónde» en el texto",[11,634,635,636,639,640,643],{},"Cero alucinaciones exige contenido de la fuente ",[25,637,638],{},"y"," ",[25,641,642],{},"procedencia"," analizable por máquina y alcanzable en la UI. Usamos etiquetas 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],{},"Ejemplo: ",[154,654,655],{},"[f5-123-165]"," = archivo spine 5 (base 0), caracteres 123–165.",[54,658,660],{"id":659},"_51-cómo-se-escriben-las-etiquetas-en-el-cuerpo","5.1 Cómo se escriben las etiquetas en el cuerpo",[11,662,663,664,667],{},"La capa de extracción añade ",[154,665,666],{},"[f{fileIndex}-{start}-{end}]"," al final de cada 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],{},"Resúmenes de preprocesado o extractos Tool: las posiciones se alinean con ",[25,680,681],{},"offsets de caracteres spine","—no números de página estimados por el modelo.",[54,684,686],{"id":685},"_52-restricciones-sobre-la-salida-del-modelo","5.2 Restricciones sobre la salida del modelo",[11,688,689,690,696],{},"El system prompt incluye ",[25,691,692],{},[693,694,695],"span",{},"Position Citation Rules","—cinco puntos esenciales:",[251,698,699,709,719,725,734],{},[85,700,701,704,705,708],{},[25,702,703],{},"Formato estándar:"," Debe usar ",[154,706,707],{},"[f_fileIndex-startChar-endChar]","; las tres partes numéricas obligatorias;",[85,710,711,714,715,718],{},[25,712,713],{},"Copiar solo de fuentes actuales:"," Notas ",[25,716,717],{},"verbatim"," de mensajes system/user o retornos Tool de esta ronda;",[85,720,721,724],{},[25,722,723],{},"Sin fabricación:"," No calcular, editar ni inventar posiciones;",[85,726,727,730,731,206],{},[25,728,729],{},"Preferir omisión:"," Sin etiqueta válida en el contexto → responder con normalidad—",[25,732,733],{},"no emitir etiquetas de posición",[85,735,736,739],{},[25,737,738],{},"Inline con las afirmaciones:"," Etiquetas tras la frase relevante; sin listas de citas al final.",[11,741,742,743,746,747,750],{},"La UI también filtra etiquetas ",[25,744,745],{},"bipartitas"," inválidas ocasionales (p. ej. ",[154,748,749],{},"[f1-293]",") antes del render.",[11,752,753],{},[14,754],{"alt":755,"src":756},"Ventana de trazado de citas","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[34,758],{},[37,760,762],{"id":761},"vi-tool-calling-primero-buscar-luego-responder","VI. Tool Calling: Primero buscar, luego responder",[11,764,765,766,769,770,773,774,777],{},"Cuando el chat está vinculado a un libro (",[154,767,768],{},"resourceId"," presente, ",[154,771,772],{},"chatType === 'chat'","), registramos dos Tools con executors antes de cada generación—bucle ",[25,775,776],{},"function calling"," compatible con OpenAI.",[54,779,781,782,785],{"id":780},"_61-get_related_segment_summaries-búsqueda-dirigida-de-segmentos","6.1 ",[154,783,784],{},"get_related_segment_summaries"," — Búsqueda dirigida de segmentos",[11,787,788,789,232],{},"Para: conceptos, personajes, trama, detalles de capítulo—",[25,790,791],{},"intención de búsqueda clara",[11,793,794],{},"Flujo:",[251,796,797,804,810,813,823],{},[85,798,799,800,803],{},"El modelo reformula la pregunta en ",[25,801,802],{},"términos probables en el libro"," («Optimize Search Queries» en el system prompt);",[85,805,806,807,206],{},"Llamada Tool con ",[154,808,809],{},"question",[85,811,812],{},"Agrupar todos los resúmenes de segmentos por presupuesto de tokens (~30k tokens por lote, máx. 5 lotes);",[85,814,815,816,819,820,206],{},"Por lote: petición LLM separada elige IDs relevantes (máx. 5) de ",[154,817,818],{},"{ id, title, summary }",", JSON como ",[154,821,822],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[85,824,825,826,829],{},"Para segmentos elegidos, extraer ",[25,827,828],{},"texto fuente etiquetado"," del spine—not resúmenes—como resultado Tool.",[11,831,832,835,836,839],{},[25,833,834],{},"Diseño clave: el Tool devuelve fuente, no resúmenes."," El modelo responde desde párrafos reales con ",[154,837,838],{},"[f…]"," inline, evitando la deriva «resumen → re-resumen».",[54,841,843,844,847],{"id":842},"_62-get_full_book_segment_summaries-visión-global-del-libro","6.2 ",[154,845,846],{},"get_full_book_segment_summaries"," — Visión global del libro",[11,849,850,851,232],{},"Para: «resumir el libro», «reseñar este libro», «estructura/temas globales»—",[25,852,853],{},"vista global",[11,855,856,857,860],{},"Concatenar todos los campos ",[154,858,859],{},"summary"," de segmentos en orden de lectura—evitar perder capítulos clave solo por relevancia por trozo.",[54,862,864],{"id":863},"_63-system-prompt-libro-primero-herramientas-primero","6.3 System prompt: Libro primero, herramientas primero",[11,866,867,868,455],{},"Con libro vinculado, aplica ",[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 generación ejecuta el bucle Tool: ",[154,883,884],{},"tool_calls"," → ejecutar → añadir ",[154,887,888],{},"role: tool"," → continuar hasta el texto final. Con tools activos, el canal thinking está desactivado para evitar conflictos de protocolo.",[34,891],{},[37,893,895],{"id":894},"vii-trazabilidad-en-frontend-de-la-nota-al-resaltado","VII. Trazabilidad en frontend: De la nota al resaltado",[11,897,898,899,901],{},"La salida ",[154,900,655],{}," del modelo no se muestra en bruto; la capa de render convierte etiquetas en citas clicables.",[54,903,905],{"id":904},"_71-render-de-notas","7.1 Render de notas",[11,907,908,909,912],{},"Normalizar etiquetas a enlaces Markdown como ",[154,910,911],{},"[1]([f5-123-165])",", mostrar como notas numeradas; deduplicar la misma posición.",[54,914,916],{"id":915},"_72-interacción-al-clic","7.2 Interacción al clic",[251,918,919,928,934],{},[85,920,921,924,925,927],{},[25,922,923],{},"Primer clic:"," Parsear ",[154,926,838],{}," → fileIndex + offsets → extraer texto spine → vista previa (título TOC opcional);",[85,929,930,933],{},[25,931,932],{},"Misma nota otra vez:"," Cerrar vista previa;",[85,935,936,939],{},[25,937,938],{},"Confirmar salto:"," Abrir vista de lectura, resaltar rango de caracteres.",[11,941,942,943,946],{},"Del etiqueta copiada del modelo al texto fuente visible para el usuario, la cadena ",[25,944,945],{},"nunca pasa por otra llamada LLM","—determinista y reproducible.",[34,948],{},[37,950,952],{"id":951},"viii-casos-límite-y-degradación-honesta","VIII. Casos límite y degradación honesta",[11,954,955,956,455],{},"Cero alucinaciones ≠ «siempre hay respuesta»—es ",[25,957,958],{},"sin prueba, sin invención",[281,960,961,971],{},[284,962,963],{},[287,964,965,968],{},[290,966,967],{},"Escenario",[290,969,970],{},"Comportamiento",[303,972,973,981,993,1001,1009],{},[287,974,975,978],{},[308,976,977],{},"Resúmenes de segmentos no listos",[308,979,980],{},"Extraer primero texto completo y resumir",[287,982,983,986],{},[308,984,985],{},"Tool no encuentra nada",[308,987,988,989,992],{},"Devolver ",[154,990,991],{},"(No relevant segment excerpts found…)","; el modelo debe decir «no está en el libro»",[287,994,995,998],{},[308,996,997],{},"Etiquetas bipartitas inválidas del modelo",[308,999,1000],{},"Filtrado en frontend; sin notas rotas",[287,1002,1003,1006],{},[308,1004,1005],{},"Charla informal",[308,1007,1008],{},"El system prompt permite conocimiento general fuera del libro",[287,1010,1011,1014],{},[308,1012,1013],{},"Exportar chat",[308,1015,1016],{},"Las notas pueden ser deep links del lector para compartir/archivar",[11,1018,1019],{},[14,1020],{"alt":1021,"src":1022},"Exportación de chat","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[34,1024],{},[37,1026,1028],{"id":1027},"ix-compromiso-de-diseño-por-qué-no-rag-vectorial","IX. Compromiso de diseño: ¿Por qué no «RAG vectorial»?",[11,1030,1031,1032,1035],{},"Colegas en Q&A documental suelen preguntar: si haces generación aumentada por recuperación, ¿por qué no ",[25,1033,1034],{},"Embedding + base vectorial Top-K","?",[11,1037,1038,1041,1042,1045,1046,1049,1050,1053],{},[25,1039,1040],{},"Sí hacemos RAG","—buscar antes de generar. La diferencia: «RAG» en el discurso comunitario suele implicar ",[25,1043,1044],{},"similaridad vectorial","; nuestra etapa 3 es ",[25,1047,1048],{},"índice de segmentos + Tool con fuente bajo demanda","—",[25,1051,1052],{},"sin capa vectorial por diseño",". Abajo: razones arquitectónicas, sin negar el valor del RAG vectorial.",[54,1055,1057],{"id":1056},"alcance-no-sin-búsqueda-sino-sin-búsqueda-vectorial","Alcance: no «sin búsqueda», sino «sin búsqueda vectorial»",[82,1059,1060,1069],{},[85,1061,1062,1065,1066,206],{},[25,1063,1064],{},"RAG amplio:"," buscar → generar → ",[25,1067,1068],{},"lo hacemos",[85,1070,1071,1074,1075,232],{},[25,1072,1073],{},"RAG vectorial:"," recuperación por similitud de embedding → ",[25,1076,1077],{},"no en esta versión",[11,1079,1080,1081,1084,1085,1088],{},"El preprocesado construye un ",[25,1082,1083],{},"índice de resúmenes de segmentos","; el modelo elige segmentos vía Tools y obtiene ",[25,1086,1087],{},"texto fuente",". Hay búsqueda sin modelo de embedding separado ni mantenimiento de índice vectorial.",[34,1090],{},[54,1092,1094],{"id":1093},"razón-1-proveedores-llm-personalizadossuperficie-de-integración-pequeña","Razón 1: Proveedores LLM personalizados—superficie de integración pequeña",[11,1096,1097,1098,1101,1102,1105],{},"Los usuarios pueden conectar ",[25,1099,1100],{},"sus propias API keys",", base URL personalizadas u ",[25,1103,1104],{},"Ollama local","—el modelo de chat es su elección; coste y ruta de datos bajo control.",[11,1107,1108],{},"El RAG vectorial típico amplía la integración:",[82,1110,1111,1122,1125],{},[85,1112,1113,1114,1117,1118,1121],{},"Además del ",[25,1115,1116],{},"modelo de chat",", suele hacer falta un ",[25,1119,1120],{},"modelo de embedding"," (otro nombre, a veces otro endpoint);",[85,1123,1124],{},"Ollama local necesita modelo de embedding aparte más compatibilidad de dimensión/API;",[85,1126,1127,1128,1131],{},"Más modos de fallo: chat OK pero ",[25,1129,1130],{},"búsqueda vacía","—embedding, índice o dimensión; más difícil depurar que un proveedor de extremo a extremo.",[11,1133,1134,1135,1138,1139,1142],{},"Aquí, ",[25,1136,1137],{},"elección de segmentos y respuesta comparten una config de proveedor","—no «chat en A, índice en B». Para apps ",[25,1140,1141],{},"LLM enchufables",", eso suele pesar más que unos puntos de recall.",[11,1144,1145],{},[14,1146],{"alt":1147,"src":1148},"Proveedores de IA personalizados","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[34,1150],{},[54,1152,1154],{"id":1153},"razón-2-los-embeddings-atan-el-índicecambiar-de-proveedor-cuesta-caro","Razón 2: Los embeddings atan el índice—cambiar de proveedor cuesta caro",[11,1156,1157,1158,1161,1162,1165,1166,1169],{},"En RAG vectorial, ",[25,1159,1160],{},"los vectores no son un formato intermedio universal","—son coordenadas bajo un modelo de embedding. Índice con A, consulta con B: la similitud suele ser ",[25,1163,1164],{},"incomparable","—a menudo ",[25,1167,1168],{},"re-embedding completo",", y dimensiones (768 / 1024 / 1536 …) fijan el esquema de almacenamiento.",[11,1171,1172,1173,1176,1177,1180],{},"La etapa 3 persiste ",[25,1174,1175],{},"resúmenes estructurados + spans de caracteres",", no vectores; cambiar modelo de chat ",[25,1178,1179],{},"no reconstruye el índice","; la cadena de prueba (posiciones fuente) se mantiene—alineado con «probar distintos LLM en cualquier momento».",[34,1182],{},[54,1184,1186],{"id":1185},"razón-3-el-enrutamiento-estructurado-suele-bastar-en-documentos-largos-con-toc","Razón 3: El enrutamiento estructurado suele bastar en documentos largos con TOC",[11,1188,1189,1190,1193,1194,1197,1198,1201,1202,1207],{},"E-books y PDF suelen tener ",[25,1191,1192],{},"estructura de capítulos","; el preprocesado da ",[25,1195,1196],{},"títulos de segmento + resúmenes",". Para «qué dice el capítulo X» o «cómo define el libro Y», elegir segmentos del catálogo y ",[25,1199,1200],{},"tirar de la fuente"," funciona bien en la práctica; el Tool devuelve ",[25,1203,1204,1205],{},"fuente con ",[154,1206,838],{},", el cero alucinaciones sigue anclado en spans de caracteres.",[11,1209,1210,1211,1214,1215,1218],{},"Los vectores ayudan en semántica difusa, multilingüe, coincidencia literal larga; en lectores ",[25,1212,1213],{},"TOC + preprocesado + trazabilidad fuerte",", invertir en ",[25,1216,1217],{},"Tool + devolución de fuente + reglas de cita"," suele tener mejor ROI.",[34,1220],{},[54,1222,1224],{"id":1223},"futuro-recuperación-híbrida-no-reescritura","Futuro: Recuperación híbrida, no reescritura",[11,1226,1227,1228,1231,1232,1235,1236,1239,1240,1243],{},"Podríamos añadir ",[25,1229,1230],{},"recuperación vectorial gruesa"," (embedding solo para Top-N capítulos candidatos), terminando siempre en ",[25,1233,1234],{},"elegir segmento → fuente → traza clicable","—reglas de cero alucinaciones sin cambio. Si se añade: embedding ",[25,1237,1238],{},"opcional",", avisos explícitos de ",[25,1241,1242],{},"reindexar"," al cambiar modelo—evitar recuperación errónea silenciosa.",[11,1245,1246,1247],{},"Hasta entonces: ",[25,1248,1249],{},"cualquier API chat compatible OpenAI funciona; cambiar modelo de chat no reconstruye el índice local.",[34,1251],{},[37,1253,1255],{"id":1254},"x-resumen","X. Resumen",[281,1257,1258,1271],{},[284,1259,1260],{},[287,1261,1262,1265,1268],{},[290,1263,1264],{},"Paso",[290,1266,1267],{},"Método",[290,1269,1270],{},"Rol",[303,1272,1273,1284,1297,1310,1321,1332],{},[287,1274,1275,1278,1281],{},[308,1276,1277],{},"Preprocesado",[308,1279,1280],{},"División TOC/longitud + caché de segmentos",[308,1282,1283],{},"Libros largos buscables y localizables",[287,1285,1286,1289,1294],{},[308,1287,1288],{},"Etiquetas de posición",[308,1290,1291,1293],{},[154,1292,156],{}," en la fuente",[308,1295,1296],{},"Procedencia analizable por máquina",[287,1298,1299,1302,1307],{},[308,1300,1301],{},"Tool",[308,1303,1304,1305],{},"Segmentos / resúmenes de libro por pregunta, devolver ",[25,1306,322],{},[308,1308,1309],{},"Forzar pruebas antes de responder",[287,1311,1312,1315,1318],{},[308,1313,1314],{},"System prompt",[308,1316,1317],{},"Libro primero, sin etiquetas falsas, decir cuando falta",[308,1319,1320],{},"Restringir generación",[287,1322,1323,1326,1329],{},[308,1324,1325],{},"Frontend",[308,1327,1328],{},"Nota → vista previa → salto y resaltado",[308,1330,1331],{},"El usuario verifica pruebas",[287,1333,1334,1337,1340],{},[308,1335,1336],{},"Sin búsqueda vectorial",[308,1338,1339],{},"Un proveedor; cambiar modelo chat sin reindexar",[308,1341,1342],{},"Menor coste de integración y migración",[11,1344,1345,1346,1349],{},"«Cero alucinaciones» no significa que el modelo nunca se equivoque—significa que ",[25,1347,1348],{},"la ingeniería ata la salida a una cadena de pruebas",": sin búsqueda → no fingir contenido del libro; con búsqueda → posiciones fuente verificables.",[11,1351,1352,1353,1356,1357,1360],{},"Si desarrollas lectura con IA o Q&A documental, esperamos que el camino ",[25,1354,1355],{},"texto completo → frases clave → Tool-first bajo demanda",", más ",[25,1358,1359],{},"etiquetas de posición inline + devolución de fuente",", sea una implementación de referencia útil.",[19,1362,1363],{},[11,1364,1365,1366,1371,1372,232],{},"Estas son lecciones del lector IA ",[243,1367,1370],{"href":1368,"rel":1369},"https://reader.linghuxiong.com",[247],"Foxycape","—solo como referencia. Prueba el lector en la ",[243,1373,1375],{"href":1374},"/es-es#download","página de descarga",{"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 — Búsqueda dirigida de segmentos",{"id":842,"depth":1382,"text":1397},"6.2 get_full_book_segment_summaries — Visión global del 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,"[object Object]",false,"md",{},true,"/es-es/blog/zero-hallucination-qa",{"title":6,"description":1420},{"Notas de ingeniería sobre Q&A sin alucinaciones en un lector con IA":1421,"date":1422,"updated":1422,"translationKey":1423,"tags":1424,"draft":1414},"respuestas ancladas en el libro abierto, con citas en un clic al pasaje exacto.","2026-06-03","zero-hallucination-qa",[1425,1426,1427],"lector","IA","ingeniería","es-es/blog/zero-hallucination-qa","-XkeW6Vl93GVQKL7wH7-be5dAy1leU1SJApBgfNxkEQ",1780489852870]