[{"data":1,"prerenderedAt":1424},["ShallowReactive",2],{"blog-list-pt-br":3},[4],{"id":5,"title":6,"body":7,"config":1408,"date":1409,"description":1410,"draft":1411,"extension":1412,"image":1408,"meta":1413,"navigation":1414,"path":1415,"seo":1416,"stem":1417,"tags":1418,"toolbar":1408,"translationKey":1422,"updated":1409,"__hash__":1423},"blog/pt-br/blog/zero-hallucination-qa.md","Como implementei Q&A «zero alucinação» no leitor",{"type":8,"value":9,"toc":1372},"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,640,646,653,657,664,672,679,683,693,736,747,753,755,759,774,782,788,791,826,836,844,850,857,861,869,875,886,888,892,898,902,909,913,936,943,945,949,955,1013,1019,1021,1025,1032,1050,1054,1074,1084,1086,1090,1101,1104,1127,1138,1144,1146,1150,1165,1176,1178,1182,1203,1214,1216,1220,1239,1245,1247,1251,1339,1346,1357],[11,12,13],"p",{},[14,15],"img",{"alt":16,"src":17},"Capa: Q&A zero alucinação","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[19,20,21],"blockquote",{},[11,22,23,24,28,29,32],{},"Este artigo compartilha a implementação de engenharia de ",[25,26,27],"strong",{},"Q&A zero alucinação"," no nosso leitor com IA: as respostas se baseiam estritamente no texto do livro aberto e as afirmações-chave podem ser ",[25,30,31],{},"rastreadas em um clique"," até a passagem exata. Se você está desenvolvendo leitura com IA, Q&A de documentos ou apps no estilo RAG, esperamos que três iterações de lições e a arquitetura final sejam úteis.",[34,35],"hr",{},[37,38,40],"h2",{"id":39},"i-evolução-em-três-estágios","I. Evolução em três estágios",[11,42,43,44,47],{},"O Q&A zero alucinação não foi projetado de forma perfeita no primeiro dia. Evoluiu sob tensão entre ",[25,45,46],{},"custo, latência e precisão",". Abaixo está uma visão cronológica dos três estágios—contexto útil para entender por que a arquitetura atual tem esta forma.",[49,50],"mermaid",{":config":51,"code":52},"config","flowchart%20LR%0A%20%20%20%20P1%5BEst%C3%A1gio%201%3A%20Texto%20integral%20no%20contexto%5D%20--%3E%20P2%5BEst%C3%A1gio%202%3A%20LLM%20extrai%20frases-chave%5D%0A%20%20%20%20P2%20--%3E%20P3%5BEst%C3%A1gio%203%3A%20%C3%8Dndice%20de%20segmentos%20%2B%20Tool%20retrieval%5D%0A%20%20%20%20P1%20-.-%3E%7CLento%2C%20caro%2C%20impreciso%20em%20livros%20longos%7C%20X1%5BDescontinuado%5D%0A%20%20%20%20P2%20-.-%3E%7CPerde%20detalhe%2C%20ainda%20lento%7C%20X2%5BDescontinuado%5D%0A%20%20%20%20P3%20--%3E%7CAtual%7C%20OK%5BZero%20alucina%C3%A7%C3%A3o%20%2B%20rastre%C3%A1vel%5D",[54,55,57],"h3",{"id":56},"estágio-1-inserir-o-livro-inteiro-no-contexto-o-mais-simplese-o-primeiro-a-falhar","Estágio 1: Inserir o livro inteiro no contexto (o mais simples—e o primeiro a falhar)",[11,59,60,63,64,67,68,71,72,75],{},[25,61,62],{},"Abordagem:"," Quando o usuário abre um livro e faz uma pergunta, colocar ",[25,65,66],{},"todo o texto extraído"," no System Prompt ou na mensagem do usuário e deixar o modelo de conversa responder. Se o livro exceder cerca de ",[25,69,70],{},"400 mil caracteres",", aplicar ",[25,73,74],{},"truncamento rígido","—só se mantém o início; os capítulos posteriores ficam invisíveis para o modelo.",[11,77,78],{},[25,79,80],{},"Vantagens:",[82,83,84,88,91],"ul",{},[85,86,87],"li",{},"Custo de implementação muito baixo; quase sem pré-processamento;",[85,89,90],{},"Funciona razoavelmente em livros curtos e documentos simples—o modelo realmente «viu o livro inteiro»;",[85,92,93],{},"UX simples: pergunta e resposta, sem estado «aguarde enquanto analisamos».",[11,95,96],{},[25,97,98],{},"Desvantagens (rapidamente inaceitáveis):",[82,100,101,107,113,123],{},[85,102,103,106],{},[25,104,105],{},"Respostas lentas:"," Cada pergunta reenvia um payload enorme; o tempo até o primeiro token e a latência total crescem com o tamanho do livro;",[85,108,109,112],{},[25,110,111],{},"Custo alto de tokens:"," Você paga o input do livro inteiro em cada pergunta;",[85,114,115,118,119,122],{},[25,116,117],{},"Livros longos distorcem muito:"," Após 400 mil caracteres, a segunda metade, apêndices e conclusões podem não existir para o modelo—e a UI muitas vezes ",[25,120,121],{},"não indica claramente"," que houve truncamento;",[85,124,125,128,129,132],{},[25,126,127],{},"Granularidade de recuperação zero:"," O modelo precisa «procurar uma agulha no palheiro» em centenas de milhares de caracteres—fácil perder detalhes e mais fácil produzir ",[25,130,131],{},"resumos plausíveis sem base","—exatamente o que apps de leitura devem evitar.",[11,134,135],{},"O estágio 1 serve para um MVP, não para um produto de qualidade.",[54,137,139],{"id":138},"estágio-2-llm-mais-leve-para-extrair-frases-chave-comprimir-contextomas-demais","Estágio 2: LLM mais leve para extrair frases-chave (comprimir contexto—mas demais)",[11,141,142,144,145,148,149,152,153,157],{},[25,143,62],{}," Antes do Q&A (ou na primeira abertura do livro), usar um ",[25,146,147],{},"modelo mais barato"," sobre o corpo: dividir por capítulo do Spine (ou segmentar o livro), extrair ",[25,150,151],{},"frases-chave",", manter marcas de posição como ",[154,155,156],"code",{},"[fArquivo-início-fim]",", depois concatenar trechos em um contexto mais curto para o Q&A posterior.",[11,159,160,161,164],{},"Pipeline típico: ",[25,162,163],{},"Extract → Cache → Chat",". Extrair uma vez (offline ou sob demanda), guardar um «conjunto de frases-chave», reutilizar em cada pergunta—a mesma ideia de muitos protótipos de Q&A de documentos que comprimem primeiro e depois respondem.",[11,166,167],{},[25,168,80],{},[82,170,171,178,181],{},[85,172,173,174,177],{},"Cada pergunta envia ",[25,175,176],{},"muito menos texto","; o consumo de tokens por requisição cai em relação ao estágio 1;",[85,179,180],{},"O pré-processamento pode ser em cache; sem re-extrair por pergunta no mesmo livro;",[85,182,183],{},"As marcas de posição lançam bases para citações.",[11,185,186],{},[25,187,188],{},"Desvantagens (ainda falha em livros longos):",[82,190,191,197,207,216],{},[85,192,193,196],{},[25,194,195],{},"Perda massiva de detalhe:"," As «frases-chave» são selecionadas pelo modelo; qualificadores, contraexemplos e cadeias argumentativas são frequentemente descartados—as respostas ficam «corretas mas parciais»;",[85,198,199,202,203,206],{},[25,200,201],{},"Contexto ainda grande em livros longos:"," Mesmo bundles de frases-chave em obras grandes são consideráveis—latência e custo são ",[25,204,205],{},"aliviados, não resolvidos",";",[85,208,209,212,213,206],{},[25,210,211],{},"Erro duplo de LLM:"," A extração pode falhar; o Q&A pode interpretar mal trechos—os erros ",[25,214,215],{},"se acumulam",[85,217,218,221,222,225],{},[25,219,220],{},"Contexto estático:"," Quer o usuário pergunte sobre um capítulo ou sobre a estrutura do livro, o modelo sempre recebe o ",[25,223,224],{},"mesmo blob pré-extraído","—sem estreitamento dinâmico pela pergunta.",[11,227,228,229,232],{},"Lição: o problema não é «se comprimimos», mas ",[25,230,231],{},"se a compressão é sob demanda e se podemos voltar ao texto fonte",".",[54,234,236],{"id":235},"estágio-3-índice-de-segmentos-tool-retrieval-sob-demanda-texto-fonte-de-volta-atual","Estágio 3: Índice de segmentos + Tool retrieval sob demanda + texto fonte de volta (atual)",[11,238,239,241,242,249],{},[25,240,62],{}," Inspirado em ",[243,244,248],"a",{"href":245,"rel":246},"https://github.com/VectifyAI/PageIndex",[247],"nofollow","PageIndex",". Em relação ao estágio 2, três mudanças centrais:",[251,252,253,259,269],"ol",{},[85,254,255,258],{},[25,256,257],{},"O pré-processamento produz um índice estruturado"," (resumos no nível do índice + spans exatos de caracteres), não trechos usados diretamente como contexto de Q&A;",[85,260,261,264,265,268],{},[25,262,263],{},"Cada pergunta usa Tool Calling para recuperar sob demanda",", depois ",[25,266,267],{},"puxa texto fonte com marcas de posição"," para responder;",[85,270,271,274],{},[25,272,273],{},"System Prompt + frontend"," impõem formato de citação e suportam saltos com clique e destaque no leitor.",[11,276,277],{},[25,278,279],{},"Comparação dos três estágios:",[281,282,283,302],"table",{},[284,285,286],"thead",{},[287,288,289,293,296,299],"tr",{},[290,291,292],"th",{},"Dimensão",[290,294,295],{},"Estágio 1 (texto integral)",[290,297,298],{},"Estágio 2 (frases-chave)",[290,300,301],{},"Estágio 3 (atual)",[303,304,305,324,338,352,366,383],"tbody",{},[287,306,307,311,314,317],{},[308,309,310],"td",{},"Contexto por pergunta",[308,312,313],{},"Livro inteiro (ou metade frontal truncada)",[308,315,316],{},"Frases-chave pré-extraídas",[308,318,319,320,323],{},"Apenas trechos de ",[25,321,322],{},"texto fonte"," relevantes para a pergunta",[287,325,326,329,332,335],{},[308,327,328],{},"Precisão em livros longos",[308,330,331],{},"Colapsa após ~400k chars",[308,333,334],{},"Depende da extração; perde detalhe",[308,336,337],{},"Recuperação por TOC/span; sem truncamento rígido do livro inteiro",[287,339,340,343,346,349],{},[308,341,342],{},"Velocidade de resposta",[308,344,345],{},"Lenta",[308,347,348],{},"Um pouco melhor; livros longos ainda lentos",[308,350,351],{},"Recuperação + contexto curto—visivelmente mais rápido",[287,353,354,357,360,363],{},[308,355,356],{},"Custo de tokens",[308,358,359],{},"Muito alto",[308,361,362],{},"Médio-alto",[308,364,365],{},"Pré-processamento amortizado + pagar sob necessidade",[287,367,368,371,374,377],{},[308,369,370],{},"Rastreabilidade",[308,372,373],{},"Fraca (difícil citar)",[308,375,376],{},"Tags existem mas conteúdo já filtrado",[308,378,379,380],{},"Notas de rodapé mapeiam ",[25,381,382],{},"spans reais de fonte",[287,384,385,388,391,394],{},[308,386,387],{},"Complexidade de engenharia",[308,389,390],{},"Baixa",[308,392,393],{},"Média",[308,395,396],{},"Alta",[11,398,399,402,403,406,407,410,411,414],{},[25,400,401],{},"Por que paramos no estágio 3:"," Para leitura, zero alucinação não é «mostrar ao modelo o máximo de texto possível», mas ",[25,404,405],{},"«antes de responder, obter evidência fonte para a pergunta»",". Os estágios 1–2 lutaram o ",[25,408,409],{},"tamanho do contexto","; o estágio 3 divide o pipeline em ",[25,412,413],{},"índice (pré-processar) → recuperar (Tool) → evidência (fonte) → responder (geração restrita)","—equilibrando precisão, custo e rastreabilidade.",[11,416,417,418,232],{},"A seguir o detalhe do ",[25,419,420],{},"estágio 3",[34,422],{},[37,424,426],{"id":425},"ii-definição-do-problema-em-qa-de-livros-alucinação-dói-mais-que-no-chat-genérico","II. Definição do problema: Em Q&A de livros, alucinação dói mais que no chat genérico",[11,428,429,430,433],{},"Os usuários perdoam erros ocasionais em um chatbot geral. Em ",[25,431,432],{},"Q&A de livros",", o custo é maior:",[82,435,436,443,446],{},[85,437,438,439,442],{},"Perguntam o que ",[25,440,441],{},"este livro"," diz—não o que vive na memória paramétrica do modelo;",[85,444,445],{},"Uma «opinião do livro» plausível pode enganar notas, citações e compartilhamentos;",[85,447,448],{},"Sem fontes, não podem verificar—a confiança é difícil de construir.",[11,450,451,452,455],{},"Assim, «zero alucinação» torna-se três regras ",[25,453,454],{},"executáveis",":",[251,457,458,464,470],{},[85,459,460,463],{},[25,461,462],{},"Perguntas sobre o livro devem consultar o livro primeiro:"," Tudo o que possa ser sobre o livro aberto deve passar por recuperação (Tool) antes da resposta;",[85,465,466,469],{},[25,467,468],{},"Respostas devem ser rastreáveis:"," Afirmações-chave com marcas de posição que a UI possa analisar e saltar;",[85,471,472,475],{},[25,473,474],{},"Dizer quando não encontrar:"," Se o livro não contém, dizer—não disfarçar conhecimento geral como «o que o livro diz».",[11,477,478,479,481],{},"O resto segue o fluxo de dados do ",[25,480,420],{}," e como essas regras se implementam.",[34,483],{},[37,485,487],{"id":486},"iii-arquitetura-pré-processar-tool-retrieval-geração-restrita-citações-clicáveis","III. Arquitetura: Pré-processar → Tool retrieval → Geração restrita → Citações clicáveis",[49,489],{":config":51,"code":490},"flowchart%20TB%0A%20%20%20%20subgraph%20prep%20%5BPr%C3%A9-processamento%20offline%20%2F%20primeira%20vez%5D%0A%20%20%20%20%20%20%20%20A%5BDividir%20livro%20por%20TOC%20ou%20comprimento%5D%20--%3E%20B%5BResumos%20de%20segmentos%20com%20LLM%5D%0A%20%20%20%20%20%20%20%20B%20--%3E%20C%5BPersistir%20cache%20Segment%20localmente%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20ask%20%5BPergunta%20do%20usu%C3%A1rio%5D%0A%20%20%20%20%20%20%20%20D%5BInput%20do%20usu%C3%A1rio%5D%20--%3E%20E%7BExiste%20cache%20Segment%3F%7D%0A%20%20%20%20%20%20%20%20E%20--%3E%7CN%C3%A3o%7C%20F%5BExtrair%20texto%20integral%20%2F%20pedir%20pr%C3%A9-processamento%5D%0A%20%20%20%20%20%20%20%20F%20--%3E%20prep%0A%20%20%20%20%20%20%20%20E%20--%3E%7CSim%7C%20G%5BRegistrar%20Tool%20Calling%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20retrieve%20%5BRecupera%C3%A7%C3%A3o%20por%20Tool%5D%0A%20%20%20%20%20%20%20%20G%20--%3E%20H%7BTipo%20de%20pergunta%7D%0A%20%20%20%20%20%20%20%20H%20--%3E%7CVis%C3%A3o%20geral%20%2F%20cr%C3%ADtica%7C%20I%5Bget_full_book_segment_summaries%5D%0A%20%20%20%20%20%20%20%20H%20--%3E%7CFatos%20%2F%20pessoas%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%20escolhe%20IDs%20de%20segmentos%20do%20cat%C3%A1logo%20de%20resumos%5D%0A%20%20%20%20%20%20%20%20K%20--%3E%20L%5BObter%20fonte%20por%20span%20%2B%20marcas%20de%20posi%C3%A7%C3%A3o%5D%0A%20%20%20%20%20%20%20%20I%20--%3E%20M%5BConcatenar%20todos%20os%20resumos%20de%20segmentos%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20answer%20%5BGerar%20e%20exibir%5D%0A%20%20%20%20%20%20%20%20L%20--%3E%20N%5BResultados%20Tool%20de%20volta%20ao%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%5BRegras%20de%20cita%C3%A7%C3%A3o%20no%20System%20Prompt%5D%0A%20%20%20%20%20%20%20%20O%20--%3E%20P%5BResposta%20em%20streaming%20%2B%20notas%20de%20posi%C3%A7%C3%A3o%5D%0A%20%20%20%20%20%20%20%20P%20--%3E%20Q%5BRenderizar%20notas%20clic%C3%A1veis%5D%0A%20%20%20%20%20%20%20%20Q%20--%3E%20R%5BClique%20%E2%86%92%20pr%C3%A9-visualiza%C3%A7%C3%A3o%20%E2%86%92%20saltar%20e%20destacar%5D%0A%20%20%20%20end",[11,492,493,494],{},"Ideia central: ",[25,495,496],{},"não deixar o modelo «responder de memória»—obrigá-lo a «reunir evidência, responder e marcar fontes».",[34,498],{},[37,500,502],{"id":501},"iv-pré-processamento-transformar-o-livro-inteiro-em-um-índice-de-segmentos-pesquisável","IV. Pré-processamento: Transformar o livro inteiro em um índice de segmentos pesquisável",[11,504,505,506,509,510,513,514,517,518,521,522,525],{},"Se cada pergunta ainda usasse contexto de livro integral do ",[25,507,508],{},"estágio 1",", livros longos estouram o orçamento de tokens e a recuperação é grossa demais. Estágio 3: no primeiro chat de IA para um livro, rodar em segundo plano uma ",[25,511,512],{},"tarefa de resumo de segmentos","—dividir por ",[25,515,516],{},"TOC"," ou ",[25,519,520],{},"comprimento de texto"," em ",[154,523,524],{},"Segment","s, resumir cada um, persistir em IndexedDB local.",[11,527,528,529,531,532,455],{},"Cada ",[154,530,524],{}," contém resumo mais ",[25,533,534],{},"posição física no corpo",[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 arquivo Spine (PDF: um arquivo por página)",[287,564,565,573],{},[308,566,567,556,570],{},[154,568,569],{},"startOffset",[154,571,572],{},"endOffset",[308,574,575],{},"Início/fim em caracteres",[287,577,578,583],{},[308,579,580],{},[154,581,582],{},"sequence",[308,584,585],{},"Ordem linear de leitura",[287,587,588,593],{},[308,589,590],{},[154,591,592],{},"title",[308,594,595],{},"Título do TOC",[11,597,598],{},"A divisão equilibra precisão e custo: se o corpo de um nó TOC tiver menos de ~20KB, resumir só esse nó; nós irmãos podem fundir-se em lotes (15–20KB) antes de chamadas LLM; blocos longos sem estrutura dividem-se em intervalos de ~30–40 mil caracteres.",[11,600,601,602,605,606,609],{},"O System Prompt de resumo exige ",[25,603,604],{},"manter marcas de posição inline"," (",[154,607,608],{},"[fNúmero-Número-Número]",") para o texto fonte obtido por Tool alinhar com offsets do Spine. Restrição central:",[611,612,618],"pre",{"className":613,"code":615,"language":616,"meta":617},[614],"language-text","Se o conteúdo do resumo se relacionar com uma passagem, manter a marca de posição no final [fNúmero-Número-Número] (ex. [f1-90-109]).\nAs marcas são atômicas—não alterar, fundir ou omitir qualquer caractere ou dígito.\n","text","",[154,619,615],{"__ignoreMap":617},[11,621,622,623,626],{},"Após o pré-processamento, o Q&A depende de um ",[25,624,625],{},"índice estruturado de segmentos",", não do contexto do livro inteiro—pré-requisito de engenharia para zero alucinação em livros longos.",[34,628],{},[37,630,632],{"id":631},"v-sistema-de-marcas-de-posição-codificar-onde-no-texto","V. Sistema de marcas de posição: Codificar «onde» no texto",[11,634,635,636,639],{},"Zero alucinação exige conteúdo da fonte ",[25,637,638],{},"e"," proveniência analisável por máquina e saltável na UI. Usamos marcas inline:",[611,641,644],{"className":642,"code":643,"language":616},[614],"[f{fileIndex}-{startChar}-{endChar}]\n",[154,645,643],{"__ignoreMap":617},[11,647,648,649,652],{},"Exemplo: ",[154,650,651],{},"[f5-123-165]"," = arquivo Spine 5 (base 0), caracteres 123–165.",[54,654,656],{"id":655},"_51-como-as-marcas-entram-no-corpo-do-texto","5.1 Como as marcas entram no corpo do texto",[11,658,659,660,663],{},"A camada de extração acrescenta ",[154,661,662],{},"[f{fileIndex}-{start}-{end}]"," no fim dos segmentos:",[611,665,670],{"className":666,"code":668,"language":669,"meta":617},[667],"language-typescript","const position = `[f${fileIndex}-${absOffset}-${absOffset + segment.length}]`;\nfileLines.push(segment.text.trim() + position);\n","typescript",[154,671,668],{"__ignoreMap":617},[11,673,674,675,678],{},"Quer resumos de pré-processamento quer trechos de Tool, as posições alinham com ",[25,676,677],{},"offsets de caracteres do Spine","—não números de página estimados pelo modelo.",[54,680,682],{"id":681},"_52-restrições-na-saída-do-modelo","5.2 Restrições na saída do modelo",[11,684,685,686,692],{},"O System Prompt inclui ",[25,687,688],{},[689,690,691],"span",{},"Position Citation Rules","—cinco pontos centrais:",[251,694,695,705,715,721,730],{},[85,696,697,700,701,704],{},[25,698,699],{},"Formato padrão:"," Deve usar ",[154,702,703],{},"[f_fileIndex-startChar-endChar]","; as três partes numéricas são obrigatórias;",[85,706,707,710,711,714],{},[25,708,709],{},"Copiar só das fontes atuais:"," Notas de rodapé ",[25,712,713],{},"verbatim"," das mensagens system/user ou retornos Tool deste turno;",[85,716,717,720],{},[25,718,719],{},"Sem fabricação:"," Não calcular, editar ou inventar posições;",[85,722,723,726,727,206],{},[25,724,725],{},"Preferir omissão:"," Se não houver marca válida no contexto, responder normalmente—",[25,728,729],{},"não emitir marcas de posição",[85,731,732,735],{},[25,733,734],{},"Inline com afirmações:"," Marcas seguem a frase relevante; sem listas de citações no final.",[11,737,738,739,742,743,746],{},"A UI também filtra marcas inválidas ",[25,740,741],{},"de duas partes"," ocasionais (ex. ",[154,744,745],{},"[f1-293]",") antes de renderizar.",[11,748,749],{},[14,750],{"alt":751,"src":752},"Popup de rastreio de citação","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[34,754],{},[37,756,758],{"id":757},"vi-tool-calling-recuperar-primeiro-responder-depois","VI. Tool Calling: Recuperar primeiro, responder depois",[11,760,761,762,765,766,769,770,773],{},"Quando o chat está ligado a um livro (",[154,763,764],{},"resourceId"," presente, ",[154,767,768],{},"chatType === 'chat'","), registramos duas Tools com executors antes de cada geração—ciclo ",[25,771,772],{},"function calling"," compatível com OpenAI.",[54,775,777,778,781],{"id":776},"_61-get_related_segment_summaries-busca-segmentada-direcionada","6.1 ",[154,779,780],{},"get_related_segment_summaries"," — Busca segmentada direcionada",[11,783,784,785,232],{},"Para: conceitos, personagens, enredo, detalhes de capítulo—",[25,786,787],{},"intenção clara de recuperação",[11,789,790],{},"Fluxo:",[251,792,793,800,806,809,819],{},[85,794,795,796,799],{},"O modelo reescreve a formulação do usuário em ",[25,797,798],{},"termos prováveis no livro"," («Optimize Search Queries» no System Prompt);",[85,801,802,803,206],{},"Chamar Tool com ",[154,804,805],{},"question",[85,807,808],{},"Agrupar todos os resumos de segmentos por orçamento de tokens (~30k tokens por lote, máx. 5 lotes);",[85,810,811,812,815,816,206],{},"Cada lote: requisição LLM separada escolhe IDs de segmentos relevantes (máx. 5) de ",[154,813,814],{},"{ id, title, summary }",", JSON como ",[154,817,818],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[85,820,821,822,825],{},"Para segmentos selecionados, puxar ",[25,823,824],{},"texto fonte com marcas"," do Spine—não resumos—como resultado Tool.",[11,827,828,831,832,835],{},[25,829,830],{},"Design-chave: Tool devolve fonte, não resumos."," O modelo responde a partir de parágrafos reais com ",[154,833,834],{},"[f…]"," inline, evitando deriva «resumo → re-resumo».",[54,837,839,840,843],{"id":838},"_62-get_full_book_segment_summaries-visão-geral-do-livro","6.2 ",[154,841,842],{},"get_full_book_segment_summaries"," — Visão geral do livro",[11,845,846,847,232],{},"Para: «resumir o livro», «avaliar este livro», «estrutura/temas globais»—",[25,848,849],{},"visão global",[11,851,852,853,856],{},"Concatenar todos os campos ",[154,854,855],{},"summary"," dos segmentos por ordem de leitura—evitar perder capítulos-chave só com relevância por bloco.",[54,858,860],{"id":859},"_63-system-prompt-livro-primeiro-tools-primeiro","6.3 System Prompt: Livro primeiro, tools primeiro",[11,862,863,864,455],{},"Com livro ligado, aplica-se ",[25,865,866],{},[689,867,868],{},"Core Principles for Reading Assistant",[611,870,873],{"className":871,"code":872,"language":616},[614],"1. Book First, Tool First\n   - Qualquer pergunta possivelmente sobre o livro deve chamar tools primeiro;\n   - Respostas devem basear-se sobretudo na recuperação—nunca inventar «conteúdo do livro» sem recuperação.\n\n2. General Knowledge as Fallback Only\n   - Só para: conversa casual / usuário pede explicitamente ignorar o livro / tools sem resultado;\n   - Se o livro não tem, dizer «não mencionado neste livro» antes de conhecimento geral.\n\n3. Direct Style\n   - Ir ao assunto—evitar «com base nos materiais fornecidos…» e frases vazias semelhantes.\n",[154,874,872],{"__ignoreMap":617},[11,876,877,878,881,882,885],{},"A geração roda o ciclo de tools: ",[154,879,880],{},"tool_calls"," → executar → acrescentar ",[154,883,884],{},"role: tool"," → continuar até texto final. Com tools ativas, o canal thinking desliga-se para evitar conflitos de protocolo.",[34,887],{},[37,889,891],{"id":890},"vii-rastreabilidade-no-frontend-da-nota-de-rodapé-ao-destaque","VII. Rastreabilidade no frontend: Da nota de rodapé ao destaque",[11,893,894,895,897],{},"A saída ",[154,896,651],{}," do modelo não se mostra em bruto; a camada de render transforma em citações clicáveis.",[54,899,901],{"id":900},"_71-renderização-de-notas","7.1 Renderização de notas",[11,903,904,905,908],{},"Normalizar marcas para links Markdown como ",[154,906,907],{},"[1]([f5-123-165])",", renderizar como notas numeradas; deduplicar a mesma posição para evitar sobrecarga na UI.",[54,910,912],{"id":911},"_72-interação-por-clique","7.2 Interação por clique",[251,914,915,924,930],{},[85,916,917,920,921,923],{},[25,918,919],{},"Primeiro clique:"," Analisar ",[154,922,834],{}," → fileIndex + offsets → extrair texto do Spine → pré-visualização (título TOC opcional);",[85,925,926,929],{},[25,927,928],{},"Mesma nota de novo:"," Fechar pré-visualização;",[85,931,932,935],{},[25,933,934],{},"Confirmar salto:"," Abrir vista de leitura, destacar intervalo de caracteres.",[11,937,938,939,942],{},"Da marca copiada do modelo ao texto visível pelo usuário, a cadeia ",[25,940,941],{},"nunca passa por outra chamada LLM","—determinística e reproduzível.",[34,944],{},[37,946,948],{"id":947},"viii-casos-limite-e-degradação-honesta","VIII. Casos limite e degradação honesta",[11,950,951,952,455],{},"Zero alucinação ≠ «sempre há resposta»—significa ",[25,953,954],{},"sem evidência, sem fabricação",[281,956,957,967],{},[284,958,959],{},[287,960,961,964],{},[290,962,963],{},"Cenário",[290,965,966],{},"Comportamento",[303,968,969,977,989,997,1005],{},[287,970,971,974],{},[308,972,973],{},"Resumos de segmentos ainda não prontos",[308,975,976],{},"Extrair texto integral e resumir primeiro",[287,978,979,982],{},[308,980,981],{},"Tool não encontra nada",[308,983,984,985,988],{},"Devolver ",[154,986,987],{},"(No relevant segment excerpts found…)","; o modelo deve dizer que não está no livro",[287,990,991,994],{},[308,992,993],{},"Marcas inválidas de duas partes do modelo",[308,995,996],{},"Frontend filtra; sem notas quebradas",[287,998,999,1002],{},[308,1000,1001],{},"Conversa casual",[308,1003,1004],{},"System Prompt permite conhecimento geral fora do livro",[287,1006,1007,1010],{},[308,1008,1009],{},"Exportar conversa",[308,1011,1012],{},"Notas podem virar deep links do leitor para compartilhar/arquivar",[11,1014,1015],{},[14,1016],{"alt":1017,"src":1018},"Exportação de conversa","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[34,1020],{},[37,1022,1024],{"id":1023},"ix-compromisso-de-design-por-que-não-vector-rag","IX. Compromisso de design: Por que não «vector RAG»?",[11,1026,1027,1028,1031],{},"Colegas em Q&A de documentos perguntam com frequência: se fazem retrieval-augmented generation, por que não ",[25,1029,1030],{},"Embedding + vector DB Top-K","?",[11,1033,1034,1037,1038,1041,1042,1045,1046,1049],{},[25,1035,1036],{},"Estamos fazendo RAG","—recuperar antes de gerar. A diferença: «RAG» na comunidade implica muitas vezes ",[25,1039,1040],{},"similaridade vetorial","; nosso estágio 3 é ",[25,1043,1044],{},"índice de segmentos + Tool com pull de fonte sob demanda","—",[25,1047,1048],{},"sem camada vetorial por design",". Seguem razões arquiteturais, sem negar o valor do vector RAG.",[54,1051,1053],{"id":1052},"escopo-não-sem-recuperação-mas-sem-recuperação-vetorial","Escopo: não «sem recuperação», mas «sem recuperação vetorial»",[82,1055,1056,1065],{},[85,1057,1058,1061,1062,206],{},[25,1059,1060],{},"RAG amplo:"," recuperar → gerar → ",[25,1063,1064],{},"fazemos isso",[85,1066,1067,1070,1071,232],{},[25,1068,1069],{},"Vector RAG:"," recall via similaridade de embedding → ",[25,1072,1073],{},"não nesta versão",[11,1075,1076,1077,1080,1081,1083],{},"O pré-processamento constrói um ",[25,1078,1079],{},"índice de resumos de segmentos","; o modelo escolhe segmentos via Tools e obtém ",[25,1082,322],{},". A recuperação existe sem modelo de embedding separado nem manutenção de índice vetorial.",[34,1085],{},[54,1087,1089],{"id":1088},"razão-1-providers-llm-personalizadosmanter-a-superfície-de-integração-pequena","Razão 1: Providers LLM personalizados—manter a superfície de integração pequena",[11,1091,1092,1093,1096,1097,1100],{},"Os usuários podem usar ",[25,1094,1095],{},"suas API keys",", URLs base personalizadas ou ",[25,1098,1099],{},"Ollama local","—o modelo de chat é escolha deles; custo e caminho de dados sob controle.",[11,1102,1103],{},"O vector RAG típico alarga a integração:",[82,1105,1106,1117,1120],{},[85,1107,1108,1109,1112,1113,1116],{},"Além do ",[25,1110,1111],{},"modelo de chat",", costuma precisar de ",[25,1114,1115],{},"modelo de embedding"," (outro nome, às vezes outro endpoint);",[85,1118,1119],{},"Ollama local precisa de modelo de embedding à parte e compatibilidade de dimensão/API;",[85,1121,1122,1123,1126],{},"Mais modos de falha: chat OK mas ",[25,1124,1125],{},"recuperação vazia","—embedding, índice ou dimensão inconsistentes; mais difícil depurar que um provider de ponta a ponta.",[11,1128,1129,1130,1133,1134,1137],{},"Aqui, ",[25,1131,1132],{},"seleção de segmentos e resposta compartilham a mesma configuração de provider","—sem «chat em A, índice em B». Para apps com ",[25,1135,1136],{},"LLM plugável",", isso muitas vezes supera alguns pontos de recall.",[11,1139,1140],{},[14,1141],{"alt":1142,"src":1143},"Providers de IA personalizados","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[34,1145],{},[54,1147,1149],{"id":1148},"razão-2-embeddings-ligam-se-ao-índicetrocar-de-provider-é-caro","Razão 2: Embeddings ligam-se ao índice—trocar de provider é caro",[11,1151,1152,1153,1156,1157,1160,1161,1164],{},"Em vector RAG, ",[25,1154,1155],{},"vetores não são formato intermediário universal","—são coordenadas sob um modelo de embedding. Índice com A, consulta com B: similaridade normalmente ",[25,1158,1159],{},"incomparável","—muitas vezes ",[25,1162,1163],{},"re-embedding completo",", e dimensões (768 / 1024 / 1536 …) fixam o schema de armazenamento.",[11,1166,1167,1168,1171,1172,1175],{},"O estágio 3 persiste ",[25,1169,1170],{},"resumos estruturados + spans de caracteres",", não vetores; trocar modelo de chat ",[25,1173,1174],{},"não reconstrói o índice","; a cadeia de evidência (posições fonte) se mantém—alinhado com «experimentar LLMs diferentes a qualquer momento».",[34,1177],{},[54,1179,1181],{"id":1180},"razão-3-roteamento-estruturado-costuma-bastar-para-documentos-longos-com-toc","Razão 3: Roteamento estruturado costuma bastar para documentos longos com TOC",[11,1183,1184,1185,1188,1189,1192,1193,1196,1197,1202],{},"E-books e PDF têm normalmente ",[25,1186,1187],{},"estrutura de capítulos","; o pré-processamento produz ",[25,1190,1191],{},"títulos + resumos de segmentos",". Para «o que diz o capítulo X» ou «como o livro define Y», escolher segmentos no catálogo e ",[25,1194,1195],{},"puxar fonte"," funciona bem na prática; a Tool devolve ",[25,1198,1199,1200],{},"fonte com ",[154,1201,834],{},", zero alucinação ancora-se em spans de caracteres.",[11,1204,1205,1206,1209,1210,1213],{},"Vetores ajudam em semântica difusa, multilíngue, desajuste literal em passagens longas; para leitores com ",[25,1207,1208],{},"TOC + pré-processamento + rastreabilidade forte",", investir em ",[25,1211,1212],{},"Tool + devolução de fonte + regras de citação"," costuma ter melhor ROI.",[34,1215],{},[54,1217,1219],{"id":1218},"futuro-recall-híbrido-não-reescrita","Futuro: Recall híbrido, não reescrita",[11,1221,1222,1223,1226,1227,1230,1231,1234,1235,1238],{},"Podemos acrescentar ",[25,1224,1225],{},"recall grosso vetorial"," (embedding só para Top-N capítulos candidatos), terminando sempre em ",[25,1228,1229],{},"escolher segmento → fonte → rastreio clicável","—regras zero alucinação inalteradas. Se adicionado: embedding ",[25,1232,1233],{},"opcional",", avisos explícitos de ",[25,1236,1237],{},"re-indexar"," ao mudar modelos—evitar recuperação errada silenciosa.",[11,1240,1241,1242],{},"Até lá: ",[25,1243,1244],{},"qualquer API de chat compatível com OpenAI funciona; trocar modelo de chat não reconstrói o índice local.",[34,1246],{},[37,1248,1250],{"id":1249},"x-resumo","X. Resumo",[281,1252,1253,1266],{},[284,1254,1255],{},[287,1256,1257,1260,1263],{},[290,1258,1259],{},"Etapa",[290,1261,1262],{},"Método",[290,1264,1265],{},"Papel",[303,1267,1268,1279,1292,1306,1317,1328],{},[287,1269,1270,1273,1276],{},[308,1271,1272],{},"Pré-processar",[308,1274,1275],{},"Dividir por TOC/comprimento + cache de resumos",[308,1277,1278],{},"Livros longos pesquisáveis e localizáveis",[287,1280,1281,1284,1289],{},[308,1282,1283],{},"Marcas de posição",[308,1285,1286,1288],{},[154,1287,156],{}," na fonte",[308,1290,1291],{},"Proveniência analisável",[287,1293,1294,1297,1303],{},[308,1295,1296],{},"Tool retrieval",[308,1298,1299,1300],{},"Segmentos por pergunta / resumos do livro, devolver ",[25,1301,1302],{},"fonte",[308,1304,1305],{},"Forçar evidência antes de responder",[287,1307,1308,1311,1314],{},[308,1309,1310],{},"System Prompt",[308,1312,1313],{},"Livro primeiro, sem marcas falsas, dizer quando falta",[308,1315,1316],{},"Restringir geração",[287,1318,1319,1322,1325],{},[308,1320,1321],{},"Frontend",[308,1323,1324],{},"Nota → pré-visualização → saltar e destacar",[308,1326,1327],{},"Usuário verifica evidência",[287,1329,1330,1333,1336],{},[308,1331,1332],{},"Sem recuperação vetorial",[308,1334,1335],{},"Provider único; trocar modelo de chat sem re-indexar",[308,1337,1338],{},"Menor custo de integração e migração",[11,1340,1341,1342,1345],{},"«Zero alucinação» não significa que o modelo nunca erra—significa ",[25,1343,1344],{},"engenharia que prende a saída a uma cadeia de evidência",": sem recuperação → não fingir conteúdo do livro; com recuperação → dar posições fonte verificáveis.",[11,1347,1348,1349,1352,1353,1356],{},"Se você desenvolve leitura com IA ou Q&A de documentos, esperamos que o caminho ",[25,1350,1351],{},"texto integral → frases-chave → Tool-first sob demanda",", mais ",[25,1354,1355],{},"marcas inline + devolução de fonte",", seja uma implementação de referência útil.",[19,1358,1359],{},[11,1360,1361,1362,1367,1368,232],{},"Estas são lições do desenvolvimento do leitor com IA ",[243,1363,1366],{"href":1364,"rel":1365},"https://reader.linghuxiong.com",[247],"Foxycape","—apenas para referência. Experimente o leitor na ",[243,1369,1371],{"href":1370},"/pt-br#download","página de download",{"title":617,"searchDepth":1373,"depth":1373,"links":1374},2,[1375,1381,1382,1383,1384,1388,1395,1399,1400,1407],{"id":39,"depth":1373,"text":40,"children":1376},[1377,1379,1380],{"id":56,"depth":1378,"text":57},3,{"id":138,"depth":1378,"text":139},{"id":235,"depth":1378,"text":236},{"id":425,"depth":1373,"text":426},{"id":486,"depth":1373,"text":487},{"id":501,"depth":1373,"text":502},{"id":631,"depth":1373,"text":632,"children":1385},[1386,1387],{"id":655,"depth":1378,"text":656},{"id":681,"depth":1378,"text":682},{"id":757,"depth":1373,"text":758,"children":1389},[1390,1392,1394],{"id":776,"depth":1378,"text":1391},"6.1 get_related_segment_summaries — Busca segmentada direcionada",{"id":838,"depth":1378,"text":1393},"6.2 get_full_book_segment_summaries — Visão geral do livro",{"id":859,"depth":1378,"text":860},{"id":890,"depth":1373,"text":891,"children":1396},[1397,1398],{"id":900,"depth":1378,"text":901},{"id":911,"depth":1378,"text":912},{"id":947,"depth":1373,"text":948},{"id":1023,"depth":1373,"text":1024,"children":1401},[1402,1403,1404,1405,1406],{"id":1052,"depth":1378,"text":1053},{"id":1088,"depth":1378,"text":1089},{"id":1148,"depth":1378,"text":1149},{"id":1180,"depth":1378,"text":1181},{"id":1218,"depth":1378,"text":1219},{"id":1249,"depth":1373,"text":1250},null,"2026-06-03","Notas de engenharia sobre Q&A zero alucinação em um leitor com IA—respostas baseadas no livro aberto, com citações em um clique até o trecho exato.",false,"md",{},true,"/pt-br/blog/zero-hallucination-qa",{"title":6,"description":1410},"pt-br/blog/zero-hallucination-qa",[1419,1420,1421],"leitor","AI","engenharia","zero-hallucination-qa","HqreQtoYQB04cgdCfwJ13S_juhaEOfZ9iMbDiXlsWDU",1780489852851]