[{"data":1,"prerenderedAt":2340},["ShallowReactive",2],{"blog-article-/en/blog/zero-hallucination-qa":3,"blog-list-en":1429},{"id":4,"title":5,"body":6,"config":1413,"date":1414,"description":1415,"draft":1416,"extension":1417,"image":1413,"meta":1418,"navigation":1419,"path":1420,"seo":1421,"stem":1422,"tags":1423,"toolbar":1413,"translationKey":1427,"updated":1414,"__hash__":1428},"blog/en/blog/zero-hallucination-qa.md","How I Built Zero-Hallucination Q&A in Our Reader",{"type":7,"value":8,"toc":1377},"minimark",[9,17,32,35,40,47,52,57,75,80,93,98,132,135,139,157,164,168,183,188,225,232,236,249,274,279,396,414,420,422,426,433,448,455,475,481,483,487,490,496,498,502,525,535,596,599,610,620,627,629,633,644,650,657,661,668,676,683,687,697,740,751,757,759,763,777,785,791,794,829,839,847,853,860,864,873,879,890,892,896,902,906,913,917,940,947,949,953,959,1017,1023,1025,1029,1036,1055,1059,1079,1090,1092,1096,1107,1110,1133,1144,1150,1152,1156,1171,1182,1184,1188,1209,1220,1222,1226,1245,1251,1253,1257,1344,1351,1362],[10,11,12],"p",{},[13,14],"img",{"alt":15,"src":16},"Cover: Zero-hallucination Q&A","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[18,19,20],"blockquote",{},[10,21,22,23,27,28,31],{},"This post shares how we implemented ",[24,25,26],"strong",{},"zero-hallucination Q&A"," in our AI reader: answers are strictly grounded in the text of the book you have open, and key claims can be ",[24,29,30],{},"traced in one click"," to the exact passage. If you are building AI reading, document Q&A, or RAG-style apps, we hope three iterations of lessons and the final architecture are useful.",[33,34],"hr",{},[36,37,39],"h2",{"id":38},"i-evolution-in-three-stages","I. Evolution in three stages",[10,41,42,43,46],{},"Zero-hallucination Q&A was not designed perfectly on day one. It evolved under tension between ",[24,44,45],{},"cost, latency, and accuracy",". Below is a chronological view of three stages—useful context for why the current architecture looks the way it does.",[48,49],"mermaid",{":config":50,"code":51},"config","flowchart%20LR%0A%20%20%20%20P1%5BStage%201%3A%20Full-text%20dump%5D%20--%3E%20P2%5BStage%202%3A%20LLM%20key-sentence%20extract%5D%0A%20%20%20%20P2%20--%3E%20P3%5BStage%203%3A%20Segment%20index%20%2B%20Tool%20retrieval%5D%0A%20%20%20%20P1%20-.-%3E%7CSlow%2C%20costly%2C%20inaccurate%20on%20long%20books%7C%20X1%5BRetired%5D%0A%20%20%20%20P2%20-.-%3E%7CLost%20detail%2C%20still%20slow%7C%20X2%5BRetired%5D%0A%20%20%20%20P3%20--%3E%7CCurrent%7C%20OK%5BZero%20hallucination%20%2B%20traceable%5D",[53,54,56],"h3",{"id":55},"stage-1-dump-the-full-book-into-context-simplestand-first-to-break","Stage 1: Dump the full book into context (simplest—and first to break)",[10,58,59,62,63,66,67,70,71,74],{},[24,60,61],{},"Approach:"," When a user opens a book and asks a question, put ",[24,64,65],{},"all extracted body text"," into the system prompt or user message and let the chat model answer. If the book exceeds about ",[24,68,69],{},"400k characters",", ",[24,72,73],{},"hard-truncate","—only the beginning is kept; later chapters are invisible to the model.",[10,76,77],{},[24,78,79],{},"Pros:",[81,82,83,87,90],"ul",{},[84,85,86],"li",{},"Very low implementation cost; almost no preprocessing;",[84,88,89],{},"Works reasonably on short books and simple documents—the model really “saw the whole book”;",[84,91,92],{},"Simple UX: ask and get an answer, no “please wait while we analyze” state.",[10,94,95],{},[24,96,97],{},"Cons (quickly unacceptable):",[81,99,100,106,112,122],{},[84,101,102,105],{},[24,103,104],{},"Slow responses:"," Every question resends a huge payload; time-to-first-token and total latency grow with book length;",[84,107,108,111],{},[24,109,110],{},"High token cost:"," You pay for the full book input on every question;",[84,113,114,117,118,121],{},[24,115,116],{},"Long books distort badly:"," After 400k characters, the second half, appendices, and conclusions may as well not exist—and the UI often ",[24,119,120],{},"does not clearly say"," truncation happened;",[84,123,124,127,128,131],{},[24,125,126],{},"Zero retrieval granularity:"," The model must “find a needle in a haystack” across hundreds of thousands of characters—easy to miss details and easier to produce ",[24,129,130],{},"plausible-sounding summaries with no basis","—exactly what reading apps must avoid.",[10,133,134],{},"Stage 1 is fine for an MVP, not for a product-grade solution.",[53,136,138],{"id":137},"stage-2-use-a-lighter-llm-to-extract-key-sentences-compress-contextbut-too-aggressively","Stage 2: Use a lighter LLM to extract key sentences (compress context—but too aggressively)",[10,140,141,143,144,147,148,151,152,156],{},[24,142,61],{}," Before Q&A (or on first open), run a ",[24,145,146],{},"cheaper model"," over the body: split by spine chapter (or chunk the whole book), extract ",[24,149,150],{},"key sentences",", keep position tags like ",[153,154,155],"code",{},"[fFile-start-end]",", then concatenate excerpts into a shorter context for later Q&A.",[10,158,159,160,163],{},"Typical pipeline: ",[24,161,162],{},"Extract → Cache → Chat",". Extract once (offline or on demand), store a “key sentence bundle,” reuse it for every question—same idea as many document-QA prototypes that compress first, then answer.",[10,165,166],{},[24,167,79],{},[81,169,170,177,180],{},[84,171,172,173,176],{},"Each question sends ",[24,174,175],{},"much less text","; per-request token use drops vs. stage 1;",[84,178,179],{},"Preprocessing can be cached; no re-extract per question on the same book;",[84,181,182],{},"Position tags lay groundwork for citations.",[10,184,185],{},[24,186,187],{},"Cons (still fails on long books):",[81,189,190,196,206,215],{},[84,191,192,195],{},[24,193,194],{},"Heavy detail loss:"," “Key sentences” are model-selected; qualifiers, counterexamples, and argument chains are often dropped—answers become “correct but one-sided”;",[84,197,198,201,202,205],{},[24,199,200],{},"Context still large on long books:"," Even key-sentence bundles for big works are sizable—latency and cost are ",[24,203,204],{},"eased, not solved",";",[84,207,208,211,212,205],{},[24,209,210],{},"Double LLM error:"," Extraction may miss; Q&A may misread excerpts—errors ",[24,213,214],{},"stack",[84,216,217,220,221,224],{},[24,218,219],{},"Static context:"," Whether the user asks about one chapter or whole-book structure, the model always gets the ",[24,222,223],{},"same pre-extracted blob","—no dynamic narrowing by question.",[10,226,227,228,231],{},"Lesson: the issue is not “whether we compress,” but ",[24,229,230],{},"whether compression is on-demand and whether we can return to source text",".",[53,233,235],{"id":234},"stage-3-segment-index-tool-retrieval-on-demand-source-text-back-current","Stage 3: Segment index + Tool retrieval on demand + source text back (current)",[10,237,238,240,241,248],{},[24,239,61],{}," Inspired by ",[242,243,247],"a",{"href":244,"rel":245},"https://github.com/VectifyAI/PageIndex",[246],"nofollow","PageIndex",". Vs. stage 2, three core shifts:",[250,251,252,258,268],"ol",{},[84,253,254,257],{},[24,255,256],{},"Preprocessing produces a structured index"," (TOC-level summaries + exact character spans), not excerpts used directly as Q&A context;",[84,259,260,263,264,267],{},[24,261,262],{},"Each question uses Tool Calling to retrieve on demand",", then ",[24,265,266],{},"pulls source text with position tags"," to answer;",[84,269,270,273],{},[24,271,272],{},"System prompt + frontend"," enforce citation format and support click-to-jump highlights in the reader.",[10,275,276],{},[24,277,278],{},"Three-stage comparison:",[280,281,282,301],"table",{},[283,284,285],"thead",{},[286,287,288,292,295,298],"tr",{},[289,290,291],"th",{},"Dimension",[289,293,294],{},"Stage 1 (full dump)",[289,296,297],{},"Stage 2 (key sentences)",[289,299,300],{},"Stage 3 (current)",[302,303,304,323,337,351,365,382],"tbody",{},[286,305,306,310,313,316],{},[307,308,309],"td",{},"Context per question",[307,311,312],{},"Whole book (or truncated front half)",[307,314,315],{},"Pre-extracted key sentences",[307,317,318,319,322],{},"Only ",[24,320,321],{},"source"," snippets relevant to the question",[286,324,325,328,331,334],{},[307,326,327],{},"Long-book accuracy",[307,329,330],{},"Collapses past ~400k chars",[307,332,333],{},"Depends on extraction; loses detail",[307,335,336],{},"Retrieve by TOC/span; no hard full-book truncate",[286,338,339,342,345,348],{},[307,340,341],{},"Response speed",[307,343,344],{},"Slow",[307,346,347],{},"Somewhat better; long books still slow",[307,349,350],{},"Retrieve + short context—noticeably faster",[286,352,353,356,359,362],{},[307,354,355],{},"Token cost",[307,357,358],{},"Very high",[307,360,361],{},"Medium-high",[307,363,364],{},"Amortized preprocess + pay per need",[286,366,367,370,373,376],{},[307,368,369],{},"Traceability",[307,371,372],{},"Weak (hard to cite)",[307,374,375],{},"Tags exist but content is secondarily filtered",[307,377,378,379],{},"Footnotes map to ",[24,380,381],{},"real source spans",[286,383,384,387,390,393],{},[307,385,386],{},"Engineering complexity",[307,388,389],{},"Low",[307,391,392],{},"Medium",[307,394,395],{},"High",[10,397,398,401,402,405,406,409,410,413],{},[24,399,400],{},"Why we stopped at stage 3:"," For reading, zero hallucination is not “show the model as much text as possible,” but ",[24,403,404],{},"“before answering, fetch source evidence for the question.”"," Stages 1–2 fought ",[24,407,408],{},"context size","; stage 3 splits the pipeline into ",[24,411,412],{},"index (preprocess) → retrieve (Tool) → evidence (source) → answer (constrained generation)","—balancing accuracy, cost, and traceability.",[10,415,416,417,231],{},"Below we detail ",[24,418,419],{},"stage 3",[33,421],{},[36,423,425],{"id":424},"ii-problem-statement-in-book-qa-hallucination-hurts-more-than-in-generic-chat","II. Problem statement: In book Q&A, hallucination hurts more than in generic chat",[10,427,428,429,432],{},"Users forgive occasional errors in a general chatbot. In ",[24,430,431],{},"book Q&A",", the cost is higher:",[81,434,435,442,445],{},[84,436,437,438,441],{},"Users ask what ",[24,439,440],{},"this book"," says—not what lives in the model’s parametric memory;",[84,443,444],{},"A plausible-sounding “view from the book” can mislead notes, citations, and reshares;",[84,446,447],{},"Without sources, users cannot verify—trust is hard to build.",[10,449,450,451,454],{},"So “zero hallucination” becomes three ",[24,452,453],{},"enforceable"," rules:",[250,456,457,463,469],{},[84,458,459,462],{},[24,460,461],{},"Book questions must query the book first:"," Anything plausibly about the open book must go through retrieval (Tool) before an answer;",[84,464,465,468],{},[24,466,467],{},"Answers must be traceable:"," Key claims carry position tags the UI can parse and jump to;",[84,470,471,474],{},[24,472,473],{},"Say when you cannot find it:"," If the book does not contain it, say so—do not dress up general knowledge as “what the book says.”",[10,476,477,478,480],{},"The rest follows ",[24,479,419],{}," data flow and how these rules are implemented.",[33,482],{},[36,484,486],{"id":485},"iii-architecture-preprocess-tool-retrieval-constrained-generation-clickable-citations","III. Architecture: Preprocess → Tool retrieval → Constrained generation → Clickable citations",[48,488],{":config":50,"code":489},"flowchart%20TB%0A%20%20%20%20subgraph%20prep%20%5BOffline%20%2F%20first-time%20preprocess%5D%0A%20%20%20%20%20%20%20%20A%5BSplit%20book%20by%20TOC%20or%20length%5D%20--%3E%20B%5BLLM%20segment%20summaries%5D%0A%20%20%20%20%20%20%20%20B%20--%3E%20C%5BPersist%20Segment%20cache%20locally%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20ask%20%5BUser%20question%5D%0A%20%20%20%20%20%20%20%20D%5BUser%20input%5D%20--%3E%20E%7BSegment%20cache%20exists%3F%7D%0A%20%20%20%20%20%20%20%20E%20--%3E%7CNo%7C%20F%5BExtract%20full%20text%20%2F%20ask%20to%20preprocess%5D%0A%20%20%20%20%20%20%20%20F%20--%3E%20prep%0A%20%20%20%20%20%20%20%20E%20--%3E%7CYes%7C%20G%5BRegister%20Tool%20Calling%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20retrieve%20%5BTool%20retrieval%5D%0A%20%20%20%20%20%20%20%20G%20--%3E%20H%7BQuestion%20type%7D%0A%20%20%20%20%20%20%20%20H%20--%3E%7COverview%20%2F%20review%7C%20I%5Bget_full_book_segment_summaries%5D%0A%20%20%20%20%20%20%20%20H%20--%3E%7CFacts%20%2F%20people%20%2F%20chapter%7C%20J%5Bget_related_segment_summaries%5D%0A%20%20%20%20%20%20%20%20J%20--%3E%20K%5BLLM%20picks%20segment%20IDs%20from%20summary%20catalog%5D%0A%20%20%20%20%20%20%20%20K%20--%3E%20L%5BFetch%20source%20by%20span%20%2B%20position%20tags%5D%0A%20%20%20%20%20%20%20%20I%20--%3E%20M%5BConcatenate%20all%20segment%20summaries%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20answer%20%5BGenerate%20%26%20display%5D%0A%20%20%20%20%20%20%20%20L%20--%3E%20N%5BTool%20results%20back%20to%20model%5D%0A%20%20%20%20%20%20%20%20M%20--%3E%20N%0A%20%20%20%20%20%20%20%20N%20--%3E%20O%5BSystem%20prompt%20citation%20rules%5D%0A%20%20%20%20%20%20%20%20O%20--%3E%20P%5BStream%20answer%20%2B%20position%20footnotes%5D%0A%20%20%20%20%20%20%20%20P%20--%3E%20Q%5BRender%20clickable%20footnotes%5D%0A%20%20%20%20%20%20%20%20Q%20--%3E%20R%5BClick%20%E2%86%92%20preview%20%E2%86%92%20jump%20%26%20highlight%5D%0A%20%20%20%20end",[10,491,492,493],{},"Core idea: ",[24,494,495],{},"do not let the model “answer from memory”—make it “gather evidence, then answer, and mark sources.”",[33,497],{},[36,499,501],{"id":500},"iv-preprocessing-turn-the-whole-book-into-a-searchable-segment-index","IV. Preprocessing: Turn the whole book into a searchable segment index",[10,503,504,505,508,509,512,513,516,517,520,521,524],{},"If every question still used ",[24,506,507],{},"stage 1"," full-book context, long books blow token budgets and retrieval is too coarse. Stage 3: on first AI chat for a book, run a ",[24,510,511],{},"segment summary job"," in the background—split by ",[24,514,515],{},"TOC"," or ",[24,518,519],{},"text length"," into ",[153,522,523],{},"Segment","s, summarize each, persist in local IndexedDB.",[10,526,527,528,530,531,534],{},"Each ",[153,529,523],{}," holds summary plus ",[24,532,533],{},"physical position in the body",":",[280,536,537,547],{},[283,538,539],{},[286,540,541,544],{},[289,542,543],{},"Field",[289,545,546],{},"Meaning",[302,548,549,563,576,586],{},[286,550,551,560],{},[307,552,553,556,557],{},[153,554,555],{},"startFileIndex"," / ",[153,558,559],{},"endFileIndex",[307,561,562],{},"Spine file index (PDF: one file per page)",[286,564,565,573],{},[307,566,567,556,570],{},[153,568,569],{},"startOffset",[153,571,572],{},"endOffset",[307,574,575],{},"Character start/end",[286,577,578,583],{},[307,579,580],{},[153,581,582],{},"sequence",[307,584,585],{},"Linear reading order",[286,587,588,593],{},[307,589,590],{},[153,591,592],{},"title",[307,594,595],{},"TOC title",[10,597,598],{},"Splitting balances precision and cost: if a TOC node’s body is under ~20KB, summarize that node only; sibling nodes may merge into batches (15–20KB) before LLM calls; unstructured long blocks split in ~30–40k character ranges.",[10,600,601,602,605,606,609],{},"The summary system prompt requires ",[24,603,604],{},"keeping inline position tags"," (",[153,607,608],{},"[fNumber-Number-Number]",") so Tool-fetched source aligns with spine offsets. Core constraint:",[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","",[153,619,615],{"__ignoreMap":617},[10,621,622,623,626],{},"After preprocessing, Q&A depends on a ",[24,624,625],{},"structured segment index",", not whole-book context—the engineering prerequisite for zero hallucination on long books.",[33,628],{},[36,630,632],{"id":631},"v-position-tag-system-encode-where-into-text","V. Position tag system: Encode “where” into text",[10,634,635,636,639,640,643],{},"Zero hallucination requires content from source ",[24,637,638],{},"and"," machine-parseable, UI-jumpable ",[24,641,642],{},"provenance",". We use inline tags:",[611,645,648],{"className":646,"code":647,"language":616},[614],"[f{fileIndex}-{startChar}-{endChar}]\n",[153,649,647],{"__ignoreMap":617},[10,651,652,653,656],{},"Example: ",[153,654,655],{},"[f5-123-165]"," = spine file 5 (0-based), characters 123–165.",[53,658,660],{"id":659},"_51-how-tags-are-written-into-body-text","5.1 How tags are written into body text",[10,662,663,664,667],{},"The extraction layer appends ",[153,665,666],{},"[f{fileIndex}-{start}-{end}]"," at segment ends:",[611,669,674],{"className":670,"code":672,"language":673,"meta":617},[671],"language-typescript","const position = `[f${fileIndex}-${absOffset}-${absOffset + segment.length}]`;\nfileLines.push(segment.text.trim() + position);\n","typescript",[153,675,672],{"__ignoreMap":617},[10,677,678,679,682],{},"Whether preprocessing summaries or Tool excerpts, positions align with ",[24,680,681],{},"spine character offsets","—not model-guessed page numbers.",[53,684,686],{"id":685},"_52-constraints-on-model-output","5.2 Constraints on model output",[10,688,689,690,696],{},"The system prompt includes ",[24,691,692],{},[693,694,695],"span",{},"Position Citation Rules","—five core points:",[250,698,699,709,719,725,734],{},[84,700,701,704,705,708],{},[24,702,703],{},"Standard format:"," Must use ",[153,706,707],{},"[f_fileIndex-startChar-endChar]","; all three numeric parts required;",[84,710,711,714,715,718],{},[24,712,713],{},"Copy only from current sources:"," Footnotes must be ",[24,716,717],{},"verbatim"," from this turn’s system/user messages or Tool returns;",[84,720,721,724],{},[24,722,723],{},"No fabrication:"," Do not compute, edit, or invent positions;",[84,726,727,730,731,205],{},[24,728,729],{},"Prefer omission:"," If no valid tag exists in context, answer normally—",[24,732,733],{},"output no position tags",[84,735,736,739],{},[24,737,738],{},"Inline with claims:"," Tags follow the relevant sentence; no citation dumps at the end.",[10,741,742,743,746,747,750],{},"The UI also filters occasional ",[24,744,745],{},"two-part"," invalid tags (e.g. ",[153,748,749],{},"[f1-293]",") before render.",[10,752,753],{},[13,754],{"alt":755,"src":756},"Citation trace popup","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[33,758],{},[36,760,762],{"id":761},"vi-tool-calling-retrieve-first-answer-second","VI. Tool Calling: Retrieve first, answer second",[10,764,765,766,769,770,773,774,231],{},"When chat is bound to a book (",[153,767,768],{},"resourceId"," present, ",[153,771,772],{},"chatType === 'chat'","), we register two Tools with executors before each generation—standard OpenAI-style ",[24,775,776],{},"function calling loop",[53,778,780,781,784],{"id":779},"_61-get_related_segment_summaries-targeted-segment-lookup","6.1 ",[153,782,783],{},"get_related_segment_summaries"," — Targeted segment lookup",[10,786,787,788,231],{},"For: concepts, characters, plot, chapter details—",[24,789,790],{},"clear retrieval intent",[10,792,793],{},"Flow:",[250,795,796,803,809,812,822],{},[84,797,798,799,802],{},"Model rewrites user wording into ",[24,800,801],{},"terms likely to appear in the book"," (“Optimize Search Queries” in system prompt);",[84,804,805,806,205],{},"Call Tool with ",[153,807,808],{},"question",[84,810,811],{},"Batch all segment summaries by token budget (~30k tokens per batch, max 5 batches);",[84,813,814,815,818,819,205],{},"Each batch: separate LLM request picks relevant segment IDs (max 5) from ",[153,816,817],{},"{ id, title, summary }",", JSON like ",[153,820,821],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[84,823,824,825,828],{},"For selected segments, pull ",[24,826,827],{},"tagged source text"," from spine—not summaries—as Tool result.",[10,830,831,834,835,838],{},[24,832,833],{},"Key design: Tool returns source, not summaries."," The model answers from real paragraphs with inline ",[153,836,837],{},"[f…]",", avoiding “summary → re-summary” drift.",[53,840,842,843,846],{"id":841},"_62-get_full_book_segment_summaries-whole-book-overview","6.2 ",[153,844,845],{},"get_full_book_segment_summaries"," — Whole-book overview",[10,848,849,850,231],{},"For: “summarize the book,” “review this book,” “overall structure/themes”—",[24,851,852],{},"global view",[10,854,855,856,859],{},"Concatenate all segment ",[153,857,858],{},"summary"," fields in reading order—avoid missing key chapters via per-chunk relevance only.",[53,861,863],{"id":862},"_63-system-prompt-book-first-tools-first","6.3 System prompt: Book first, tools first",[10,865,866,867,872],{},"With a bound book, ",[24,868,869],{},[693,870,871],{},"Core Principles for Reading Assistant"," applies:",[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",[153,878,876],{"__ignoreMap":617},[10,880,881,882,885,886,889],{},"Generation runs the tool loop: ",[153,883,884],{},"tool_calls"," → execute → append ",[153,887,888],{},"role: tool"," → continue until final text. With tools enabled, thinking channel is off to avoid protocol conflicts.",[33,891],{},[36,893,895],{"id":894},"vii-frontend-traceability-from-footnote-to-highlight","VII. Frontend traceability: From footnote to highlight",[10,897,898,899,901],{},"Model output ",[153,900,655],{}," is not shown raw; render layer turns it into clickable citations.",[53,903,905],{"id":904},"_71-footnote-rendering","7.1 Footnote rendering",[10,907,908,909,912],{},"Normalize tags to Markdown links like ",[153,910,911],{},"[1]([f5-123-165])",", render as numbered footnotes; dedupe same position to avoid UI clutter.",[53,914,916],{"id":915},"_72-click-interaction","7.2 Click interaction",[250,918,919,928,934],{},[84,920,921,924,925,927],{},[24,922,923],{},"First click:"," Parse ",[153,926,837],{}," → fileIndex + offsets → extract spine text → preview (optional TOC title);",[84,929,930,933],{},[24,931,932],{},"Same footnote again:"," Close preview;",[84,935,936,939],{},[24,937,938],{},"Confirm jump:"," Open reader view, highlight character range.",[10,941,942,943,946],{},"From copied model tag to user-visible source, the chain ",[24,944,945],{},"never passes through another LLM call","—deterministic and reproducible.",[33,948],{},[36,950,952],{"id":951},"viii-edge-cases-and-honest-degradation","VIII. Edge cases and honest degradation",[10,954,955,956,534],{},"Zero hallucination ≠ “always has an answer”—it means ",[24,957,958],{},"no evidence, no fabrication",[280,960,961,971],{},[283,962,963],{},[286,964,965,968],{},[289,966,967],{},"Scenario",[289,969,970],{},"Behavior",[302,972,973,981,993,1001,1009],{},[286,974,975,978],{},[307,976,977],{},"Segment summaries not ready",[307,979,980],{},"Extract full text and summarize first",[286,982,983,986],{},[307,984,985],{},"Tool finds nothing",[307,987,988,989,992],{},"Return ",[153,990,991],{},"(No relevant segment excerpts found…)","; model should say not in book",[286,994,995,998],{},[307,996,997],{},"Invalid two-part tags from model",[307,999,1000],{},"Frontend filters; no broken footnotes",[286,1002,1003,1006],{},[307,1004,1005],{},"Casual chat",[307,1007,1008],{},"System prompt allows general knowledge off-book",[286,1010,1011,1014],{},[307,1012,1013],{},"Export chat",[307,1015,1016],{},"Footnotes can become reader deep links for sharing/archiving",[10,1018,1019],{},[13,1020],{"alt":1021,"src":1022},"Chat export","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[33,1024],{},[36,1026,1028],{"id":1027},"ix-design-trade-off-why-not-vector-rag","IX. Design trade-off: Why not “vector RAG”?",[10,1030,1031,1032,1035],{},"Peers building document Q&A often ask: if you do retrieval-augmented generation, why not ",[24,1033,1034],{},"Embedding + vector DB Top-K","?",[10,1037,1038,1039,1042,1043,1046,1047,1050,1051,1054],{},"We ",[24,1040,1041],{},"are doing RAG","—retrieve before generate. The difference: “RAG” in community speech often implies ",[24,1044,1045],{},"vector similarity","; our stage 3 is ",[24,1048,1049],{},"segment index + Tool on-demand source pull","—",[24,1052,1053],{},"no vector layer by design",". Below: architectural reasons, not denying vector RAG’s value.",[53,1056,1058],{"id":1057},"scope-not-no-retrieval-but-no-vector-retrieval","Scope: not “no retrieval,” but “no vector retrieval”",[81,1060,1061,1070],{},[84,1062,1063,1066,1067,205],{},[24,1064,1065],{},"Broad RAG:"," retrieve → generate → ",[24,1068,1069],{},"we do this",[84,1071,1072,1075,1076,231],{},[24,1073,1074],{},"Vector RAG:"," recall via embedding similarity → ",[24,1077,1078],{},"not in this version",[10,1080,1081,1082,1085,1086,1089],{},"Preprocessing builds a ",[24,1083,1084],{},"segment summary index","; the model picks segments via Tools and gets ",[24,1087,1088],{},"source text",". Retrieval exists without a separate embedding model and vector index upkeep.",[33,1091],{},[53,1093,1095],{"id":1094},"reason-1-custom-llm-providerskeep-the-integration-surface-small","Reason 1: Custom LLM providers—keep the integration surface small",[10,1097,1098,1099,1102,1103,1106],{},"Users can plug ",[24,1100,1101],{},"their own API keys",", custom base URLs, or ",[24,1104,1105],{},"local Ollama","—chat model is their choice; cost and data path stay under control.",[10,1108,1109],{},"Typical vector RAG widens integration:",[81,1111,1112,1123,1126],{},[84,1113,1114,1115,1118,1119,1122],{},"Besides ",[24,1116,1117],{},"chat model",", you usually need an ",[24,1120,1121],{},"embedding model"," (another name, sometimes another endpoint);",[84,1124,1125],{},"Local Ollama needs a separate embedding model plus dimension/API compatibility;",[84,1127,1128,1129,1132],{},"More failure modes: chat works but ",[24,1130,1131],{},"empty retrieval","—embedding, index, or dimension mismatch; harder to debug than one provider end-to-end.",[10,1134,1135,1136,1139,1140,1143],{},"Here, ",[24,1137,1138],{},"segment picking and answering share one provider config","—no “chat on A, index on B.” For ",[24,1141,1142],{},"pluggable LLM"," apps, that often beats a few points of recall.",[10,1145,1146],{},[13,1147],{"alt":1148,"src":1149},"Custom AI providers","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[33,1151],{},[53,1153,1155],{"id":1154},"reason-2-embeddings-bind-to-the-indexprovider-switches-are-expensive","Reason 2: Embeddings bind to the index—provider switches are expensive",[10,1157,1158,1159,1162,1163,1166,1167,1170],{},"In vector RAG, ",[24,1160,1161],{},"vectors are not a universal intermediate format","—they are coordinates under one embedding model. Index with A, query with B: similarity is usually ",[24,1164,1165],{},"not comparable","—often ",[24,1168,1169],{},"full re-embedding",", and dimensions (768 / 1024 / 1536 …) lock storage schema.",[10,1172,1173,1174,1177,1178,1181],{},"Stage 3 persists ",[24,1175,1176],{},"structured summaries + character spans",", not vectors; switching chat models ",[24,1179,1180],{},"does not rebuild the index","; evidence chain (source positions) stays the same—aligned with “try different LLMs anytime.”",[33,1183],{},[53,1185,1187],{"id":1186},"reason-3-structured-routing-is-often-enough-for-toc-heavy-long-docs","Reason 3: Structured routing is often enough for TOC-heavy long docs",[10,1189,1190,1191,1194,1195,1198,1199,1202,1203,1208],{},"E-books and PDFs usually have ",[24,1192,1193],{},"chapter structure","; preprocessing yields ",[24,1196,1197],{},"segment titles + summaries",". For “what does chapter X say” or “how does the book define Y,” pick segments from the catalog then ",[24,1200,1201],{},"pull source"," works well in practice; Tool returns ",[24,1204,1205,1206],{},"source with ",[153,1207,837],{},", so zero hallucination stays anchored on character spans.",[10,1210,1211,1212,1215,1216,1219],{},"Vectors help fuzzy semantics, cross-language, long-span literal mismatch; for ",[24,1213,1214],{},"TOC + preprocess + strong traceability"," readers, investing in ",[24,1217,1218],{},"Tool + source return + citation rules"," often has better ROI.",[33,1221],{},[53,1223,1225],{"id":1224},"future-hybrid-recall-not-a-rewrite","Future: Hybrid recall, not a rewrite",[10,1227,1228,1229,1232,1233,1236,1237,1240,1241,1244],{},"We may add ",[24,1230,1231],{},"vector coarse recall"," (embedding only for Top-N chapter candidates), still ending in ",[24,1234,1235],{},"pick segment → source → clickable trace","—zero-hallucination rules unchanged. If added: embedding ",[24,1238,1239],{},"optional",", explicit ",[24,1242,1243],{},"re-index"," prompts when models change—avoid silent wrong retrieval.",[10,1246,1247,1248],{},"Until then: ",[24,1249,1250],{},"any OpenAI-compatible chat API works; changing chat model does not rebuild local index.",[33,1252],{},[36,1254,1256],{"id":1255},"x-summary","X. Summary",[280,1258,1259,1272],{},[283,1260,1261],{},[286,1262,1263,1266,1269],{},[289,1264,1265],{},"Step",[289,1267,1268],{},"Method",[289,1270,1271],{},"Role",[302,1273,1274,1285,1298,1311,1322,1333],{},[286,1275,1276,1279,1282],{},[307,1277,1278],{},"Preprocess",[307,1280,1281],{},"Split by TOC/length + segment summary cache",[307,1283,1284],{},"Long books searchable & locatable",[286,1286,1287,1290,1295],{},[307,1288,1289],{},"Position tags",[307,1291,1292,1294],{},[153,1293,155],{}," in source",[307,1296,1297],{},"Machine-parseable provenance",[286,1299,1300,1303,1308],{},[307,1301,1302],{},"Tool retrieval",[307,1304,1305,1306],{},"Per-question segments / full-book summaries, return ",[24,1307,321],{},[307,1309,1310],{},"Force evidence before answer",[286,1312,1313,1316,1319],{},[307,1314,1315],{},"System prompt",[307,1317,1318],{},"Book first, no fake tags, say when missing",[307,1320,1321],{},"Constrain generation",[286,1323,1324,1327,1330],{},[307,1325,1326],{},"Frontend",[307,1328,1329],{},"Footnote → preview → jump & highlight",[307,1331,1332],{},"User verifies evidence",[286,1334,1335,1338,1341],{},[307,1336,1337],{},"No vector retrieval",[307,1339,1340],{},"Single provider; swap chat model without re-index",[307,1342,1343],{},"Lower integration & migration cost",[10,1345,1346,1347,1350],{},"“Zero hallucination” does not mean the model never errs—it means ",[24,1348,1349],{},"engineering locks output to an evidence chain",": no retrieval → do not pose as book content; with retrieval → give verifiable source positions.",[10,1352,1353,1354,1357,1358,1361],{},"If you build AI reading or document Q&A, we hope the path ",[24,1355,1356],{},"full dump → key sentences → Tool-first on-demand retrieval",", plus ",[24,1359,1360],{},"inline position tags + source return",", is a useful reference implementation.",[18,1363,1364],{},[10,1365,1366,1367,1372,1373,231],{},"These are lessons from building ",[242,1368,1371],{"href":1369,"rel":1370},"https://reader.linghuxiong.com",[246],"Foxycape"," AI reader—for reference only. Try the reader on the ",[242,1374,1376],{"href":1375},"/en#download","download page",{"title":617,"searchDepth":1378,"depth":1378,"links":1379},2,[1380,1386,1387,1388,1389,1393,1400,1404,1405,1412],{"id":38,"depth":1378,"text":39,"children":1381},[1382,1384,1385],{"id":55,"depth":1383,"text":56},3,{"id":137,"depth":1383,"text":138},{"id":234,"depth":1383,"text":235},{"id":424,"depth":1378,"text":425},{"id":485,"depth":1378,"text":486},{"id":500,"depth":1378,"text":501},{"id":631,"depth":1378,"text":632,"children":1390},[1391,1392],{"id":659,"depth":1383,"text":660},{"id":685,"depth":1383,"text":686},{"id":761,"depth":1378,"text":762,"children":1394},[1395,1397,1399],{"id":779,"depth":1383,"text":1396},"6.1 get_related_segment_summaries — Targeted segment lookup",{"id":841,"depth":1383,"text":1398},"6.2 get_full_book_segment_summaries — Whole-book overview",{"id":862,"depth":1383,"text":863},{"id":894,"depth":1378,"text":895,"children":1401},[1402,1403],{"id":904,"depth":1383,"text":905},{"id":915,"depth":1383,"text":916},{"id":951,"depth":1378,"text":952},{"id":1027,"depth":1378,"text":1028,"children":1406},[1407,1408,1409,1410,1411],{"id":1057,"depth":1383,"text":1058},{"id":1094,"depth":1383,"text":1095},{"id":1154,"depth":1383,"text":1155},{"id":1186,"depth":1383,"text":1187},{"id":1224,"depth":1383,"text":1225},{"id":1255,"depth":1378,"text":1256},null,"2026-06-03","Engineering notes on zero-hallucination Q&A in an AI reader—answers grounded in the current book, with one-click citations back to exact passages.",false,"md",{},true,"/en/blog/zero-hallucination-qa",{"title":5,"description":1415},"en/blog/zero-hallucination-qa",[1424,1425,1426],"reader","AI","engineering","zero-hallucination-qa","uvw654rlcM4E60wP4tYzIynEFr2kFaRn6sdNW-J_HhI",[1430],{"id":4,"title":5,"body":1431,"config":1413,"date":1414,"description":1415,"draft":1416,"extension":1417,"image":1413,"meta":2337,"navigation":1419,"path":1420,"seo":2338,"stem":1422,"tags":2339,"toolbar":1413,"translationKey":1427,"updated":1414,"__hash__":1428},{"type":7,"value":1432,"toc":2305},[1433,1437,1445,1447,1449,1453,1455,1457,1467,1471,1479,1483,1505,1507,1509,1519,1523,1527,1537,1541,1565,1569,1571,1578,1594,1598,1678,1688,1692,1694,1696,1700,1710,1714,1728,1732,1734,1736,1738,1742,1744,1746,1758,1764,1812,1814,1820,1825,1829,1831,1833,1839,1844,1848,1850,1854,1859,1863,1865,1871,1899,1905,1909,1911,1913,1921,1925,1929,1931,1953,1959,1963,1967,1971,1973,1979,1984,1990,1992,1994,1998,2000,2004,2006,2022,2026,2028,2030,2034,2078,2082,2084,2086,2090,2100,2102,2116,2122,2124,2126,2132,2134,2148,2154,2158,2160,2162,2170,2176,2178,2180,2192,2198,2200,2202,2212,2216,2218,2220,2286,2290,2296],[10,1434,1435],{},[13,1436],{"alt":15,"src":16},[18,1438,1439],{},[10,1440,22,1441,27,1443,31],{},[24,1442,26],{},[24,1444,30],{},[33,1446],{},[36,1448,39],{"id":38},[10,1450,42,1451,46],{},[24,1452,45],{},[48,1454],{":config":50,"code":51},[53,1456,56],{"id":55},[10,1458,1459,62,1461,66,1463,70,1465,74],{},[24,1460,61],{},[24,1462,65],{},[24,1464,69],{},[24,1466,73],{},[10,1468,1469],{},[24,1470,79],{},[81,1472,1473,1475,1477],{},[84,1474,86],{},[84,1476,89],{},[84,1478,92],{},[10,1480,1481],{},[24,1482,97],{},[81,1484,1485,1489,1493,1499],{},[84,1486,1487,105],{},[24,1488,104],{},[84,1490,1491,111],{},[24,1492,110],{},[84,1494,1495,117,1497,121],{},[24,1496,116],{},[24,1498,120],{},[84,1500,1501,127,1503,131],{},[24,1502,126],{},[24,1504,130],{},[10,1506,134],{},[53,1508,138],{"id":137},[10,1510,1511,143,1513,147,1515,151,1517,156],{},[24,1512,61],{},[24,1514,146],{},[24,1516,150],{},[153,1518,155],{},[10,1520,159,1521,163],{},[24,1522,162],{},[10,1524,1525],{},[24,1526,79],{},[81,1528,1529,1533,1535],{},[84,1530,172,1531,176],{},[24,1532,175],{},[84,1534,179],{},[84,1536,182],{},[10,1538,1539],{},[24,1540,187],{},[81,1542,1543,1547,1553,1559],{},[84,1544,1545,195],{},[24,1546,194],{},[84,1548,1549,201,1551,205],{},[24,1550,200],{},[24,1552,204],{},[84,1554,1555,211,1557,205],{},[24,1556,210],{},[24,1558,214],{},[84,1560,1561,220,1563,224],{},[24,1562,219],{},[24,1564,223],{},[10,1566,227,1567,231],{},[24,1568,230],{},[53,1570,235],{"id":234},[10,1572,1573,240,1575,248],{},[24,1574,61],{},[242,1576,247],{"href":244,"rel":1577},[246],[250,1579,1580,1584,1590],{},[84,1581,1582,257],{},[24,1583,256],{},[84,1585,1586,263,1588,267],{},[24,1587,262],{},[24,1589,266],{},[84,1591,1592,273],{},[24,1593,272],{},[10,1595,1596],{},[24,1597,278],{},[280,1599,1600,1612],{},[283,1601,1602],{},[286,1603,1604,1606,1608,1610],{},[289,1605,291],{},[289,1607,294],{},[289,1609,297],{},[289,1611,300],{},[302,1613,1614,1626,1636,1646,1656,1668],{},[286,1615,1616,1618,1620,1622],{},[307,1617,309],{},[307,1619,312],{},[307,1621,315],{},[307,1623,318,1624,322],{},[24,1625,321],{},[286,1627,1628,1630,1632,1634],{},[307,1629,327],{},[307,1631,330],{},[307,1633,333],{},[307,1635,336],{},[286,1637,1638,1640,1642,1644],{},[307,1639,341],{},[307,1641,344],{},[307,1643,347],{},[307,1645,350],{},[286,1647,1648,1650,1652,1654],{},[307,1649,355],{},[307,1651,358],{},[307,1653,361],{},[307,1655,364],{},[286,1657,1658,1660,1662,1664],{},[307,1659,369],{},[307,1661,372],{},[307,1663,375],{},[307,1665,378,1666],{},[24,1667,381],{},[286,1669,1670,1672,1674,1676],{},[307,1671,386],{},[307,1673,389],{},[307,1675,392],{},[307,1677,395],{},[10,1679,1680,401,1682,405,1684,409,1686,413],{},[24,1681,400],{},[24,1683,404],{},[24,1685,408],{},[24,1687,412],{},[10,1689,416,1690,231],{},[24,1691,419],{},[33,1693],{},[36,1695,425],{"id":424},[10,1697,428,1698,432],{},[24,1699,431],{},[81,1701,1702,1706,1708],{},[84,1703,437,1704,441],{},[24,1705,440],{},[84,1707,444],{},[84,1709,447],{},[10,1711,450,1712,454],{},[24,1713,453],{},[250,1715,1716,1720,1724],{},[84,1717,1718,462],{},[24,1719,461],{},[84,1721,1722,468],{},[24,1723,467],{},[84,1725,1726,474],{},[24,1727,473],{},[10,1729,477,1730,480],{},[24,1731,419],{},[33,1733],{},[36,1735,486],{"id":485},[48,1737],{":config":50,"code":489},[10,1739,492,1740],{},[24,1741,495],{},[33,1743],{},[36,1745,501],{"id":500},[10,1747,504,1748,508,1750,512,1752,516,1754,520,1756,524],{},[24,1749,507],{},[24,1751,511],{},[24,1753,515],{},[24,1755,519],{},[153,1757,523],{},[10,1759,527,1760,530,1762,534],{},[153,1761,523],{},[24,1763,533],{},[280,1765,1766,1774],{},[283,1767,1768],{},[286,1769,1770,1772],{},[289,1771,543],{},[289,1773,546],{},[302,1775,1776,1786,1796,1804],{},[286,1777,1778,1784],{},[307,1779,1780,556,1782],{},[153,1781,555],{},[153,1783,559],{},[307,1785,562],{},[286,1787,1788,1794],{},[307,1789,1790,556,1792],{},[153,1791,569],{},[153,1793,572],{},[307,1795,575],{},[286,1797,1798,1802],{},[307,1799,1800],{},[153,1801,582],{},[307,1803,585],{},[286,1805,1806,1810],{},[307,1807,1808],{},[153,1809,592],{},[307,1811,595],{},[10,1813,598],{},[10,1815,601,1816,605,1818,609],{},[24,1817,604],{},[153,1819,608],{},[611,1821,1823],{"className":1822,"code":615,"language":616,"meta":617},[614],[153,1824,615],{"__ignoreMap":617},[10,1826,622,1827,626],{},[24,1828,625],{},[33,1830],{},[36,1832,632],{"id":631},[10,1834,635,1835,639,1837,643],{},[24,1836,638],{},[24,1838,642],{},[611,1840,1842],{"className":1841,"code":647,"language":616},[614],[153,1843,647],{"__ignoreMap":617},[10,1845,652,1846,656],{},[153,1847,655],{},[53,1849,660],{"id":659},[10,1851,663,1852,667],{},[153,1853,666],{},[611,1855,1857],{"className":1856,"code":672,"language":673,"meta":617},[671],[153,1858,672],{"__ignoreMap":617},[10,1860,678,1861,682],{},[24,1862,681],{},[53,1864,686],{"id":685},[10,1866,689,1867,696],{},[24,1868,1869],{},[693,1870,695],{},[250,1872,1873,1879,1885,1889,1895],{},[84,1874,1875,704,1877,708],{},[24,1876,703],{},[153,1878,707],{},[84,1880,1881,714,1883,718],{},[24,1882,713],{},[24,1884,717],{},[84,1886,1887,724],{},[24,1888,723],{},[84,1890,1891,730,1893,205],{},[24,1892,729],{},[24,1894,733],{},[84,1896,1897,739],{},[24,1898,738],{},[10,1900,742,1901,746,1903,750],{},[24,1902,745],{},[153,1904,749],{},[10,1906,1907],{},[13,1908],{"alt":755,"src":756},[33,1910],{},[36,1912,762],{"id":761},[10,1914,765,1915,769,1917,773,1919,231],{},[153,1916,768],{},[153,1918,772],{},[24,1920,776],{},[53,1922,780,1923,784],{"id":779},[153,1924,783],{},[10,1926,787,1927,231],{},[24,1928,790],{},[10,1930,793],{},[250,1932,1933,1937,1941,1943,1949],{},[84,1934,798,1935,802],{},[24,1936,801],{},[84,1938,805,1939,205],{},[153,1940,808],{},[84,1942,811],{},[84,1944,814,1945,818,1947,205],{},[153,1946,817],{},[153,1948,821],{},[84,1950,824,1951,828],{},[24,1952,827],{},[10,1954,1955,834,1957,838],{},[24,1956,833],{},[153,1958,837],{},[53,1960,842,1961,846],{"id":841},[153,1962,845],{},[10,1964,849,1965,231],{},[24,1966,852],{},[10,1968,855,1969,859],{},[153,1970,858],{},[53,1972,863],{"id":862},[10,1974,866,1975,872],{},[24,1976,1977],{},[693,1978,871],{},[611,1980,1982],{"className":1981,"code":876,"language":616},[614],[153,1983,876],{"__ignoreMap":617},[10,1985,881,1986,885,1988,889],{},[153,1987,884],{},[153,1989,888],{},[33,1991],{},[36,1993,895],{"id":894},[10,1995,898,1996,901],{},[153,1997,655],{},[53,1999,905],{"id":904},[10,2001,908,2002,912],{},[153,2003,911],{},[53,2005,916],{"id":915},[250,2007,2008,2014,2018],{},[84,2009,2010,924,2012,927],{},[24,2011,923],{},[153,2013,837],{},[84,2015,2016,933],{},[24,2017,932],{},[84,2019,2020,939],{},[24,2021,938],{},[10,2023,942,2024,946],{},[24,2025,945],{},[33,2027],{},[36,2029,952],{"id":951},[10,2031,955,2032,534],{},[24,2033,958],{},[280,2035,2036,2044],{},[283,2037,2038],{},[286,2039,2040,2042],{},[289,2041,967],{},[289,2043,970],{},[302,2045,2046,2052,2060,2066,2072],{},[286,2047,2048,2050],{},[307,2049,977],{},[307,2051,980],{},[286,2053,2054,2056],{},[307,2055,985],{},[307,2057,988,2058,992],{},[153,2059,991],{},[286,2061,2062,2064],{},[307,2063,997],{},[307,2065,1000],{},[286,2067,2068,2070],{},[307,2069,1005],{},[307,2071,1008],{},[286,2073,2074,2076],{},[307,2075,1013],{},[307,2077,1016],{},[10,2079,2080],{},[13,2081],{"alt":1021,"src":1022},[33,2083],{},[36,2085,1028],{"id":1027},[10,2087,1031,2088,1035],{},[24,2089,1034],{},[10,2091,1038,2092,1042,2094,1046,2096,1050,2098,1054],{},[24,2093,1041],{},[24,2095,1045],{},[24,2097,1049],{},[24,2099,1053],{},[53,2101,1058],{"id":1057},[81,2103,2104,2110],{},[84,2105,2106,1066,2108,205],{},[24,2107,1065],{},[24,2109,1069],{},[84,2111,2112,1075,2114,231],{},[24,2113,1074],{},[24,2115,1078],{},[10,2117,1081,2118,1085,2120,1089],{},[24,2119,1084],{},[24,2121,1088],{},[33,2123],{},[53,2125,1095],{"id":1094},[10,2127,1098,2128,1102,2130,1106],{},[24,2129,1101],{},[24,2131,1105],{},[10,2133,1109],{},[81,2135,2136,2142,2144],{},[84,2137,1114,2138,1118,2140,1122],{},[24,2139,1117],{},[24,2141,1121],{},[84,2143,1125],{},[84,2145,1128,2146,1132],{},[24,2147,1131],{},[10,2149,1135,2150,1139,2152,1143],{},[24,2151,1138],{},[24,2153,1142],{},[10,2155,2156],{},[13,2157],{"alt":1148,"src":1149},[33,2159],{},[53,2161,1155],{"id":1154},[10,2163,1158,2164,1162,2166,1166,2168,1170],{},[24,2165,1161],{},[24,2167,1165],{},[24,2169,1169],{},[10,2171,1173,2172,1177,2174,1181],{},[24,2173,1176],{},[24,2175,1180],{},[33,2177],{},[53,2179,1187],{"id":1186},[10,2181,1190,2182,1194,2184,1198,2186,1202,2188,1208],{},[24,2183,1193],{},[24,2185,1197],{},[24,2187,1201],{},[24,2189,1205,2190],{},[153,2191,837],{},[10,2193,1211,2194,1215,2196,1219],{},[24,2195,1214],{},[24,2197,1218],{},[33,2199],{},[53,2201,1225],{"id":1224},[10,2203,1228,2204,1232,2206,1236,2208,1240,2210,1244],{},[24,2205,1231],{},[24,2207,1235],{},[24,2209,1239],{},[24,2211,1243],{},[10,2213,1247,2214],{},[24,2215,1250],{},[33,2217],{},[36,2219,1256],{"id":1255},[280,2221,2222,2232],{},[283,2223,2224],{},[286,2225,2226,2228,2230],{},[289,2227,1265],{},[289,2229,1268],{},[289,2231,1271],{},[302,2233,2234,2242,2252,2262,2270,2278],{},[286,2235,2236,2238,2240],{},[307,2237,1278],{},[307,2239,1281],{},[307,2241,1284],{},[286,2243,2244,2246,2250],{},[307,2245,1289],{},[307,2247,2248,1294],{},[153,2249,155],{},[307,2251,1297],{},[286,2253,2254,2256,2260],{},[307,2255,1302],{},[307,2257,1305,2258],{},[24,2259,321],{},[307,2261,1310],{},[286,2263,2264,2266,2268],{},[307,2265,1315],{},[307,2267,1318],{},[307,2269,1321],{},[286,2271,2272,2274,2276],{},[307,2273,1326],{},[307,2275,1329],{},[307,2277,1332],{},[286,2279,2280,2282,2284],{},[307,2281,1337],{},[307,2283,1340],{},[307,2285,1343],{},[10,2287,1346,2288,1350],{},[24,2289,1349],{},[10,2291,1353,2292,1357,2294,1361],{},[24,2293,1356],{},[24,2295,1360],{},[18,2297,2298],{},[10,2299,1366,2300,1372,2303,231],{},[242,2301,1371],{"href":1369,"rel":2302},[246],[242,2304,1376],{"href":1375},{"title":617,"searchDepth":1378,"depth":1378,"links":2306},[2307,2312,2313,2314,2315,2319,2324,2328,2329,2336],{"id":38,"depth":1378,"text":39,"children":2308},[2309,2310,2311],{"id":55,"depth":1383,"text":56},{"id":137,"depth":1383,"text":138},{"id":234,"depth":1383,"text":235},{"id":424,"depth":1378,"text":425},{"id":485,"depth":1378,"text":486},{"id":500,"depth":1378,"text":501},{"id":631,"depth":1378,"text":632,"children":2316},[2317,2318],{"id":659,"depth":1383,"text":660},{"id":685,"depth":1383,"text":686},{"id":761,"depth":1378,"text":762,"children":2320},[2321,2322,2323],{"id":779,"depth":1383,"text":1396},{"id":841,"depth":1383,"text":1398},{"id":862,"depth":1383,"text":863},{"id":894,"depth":1378,"text":895,"children":2325},[2326,2327],{"id":904,"depth":1383,"text":905},{"id":915,"depth":1383,"text":916},{"id":951,"depth":1378,"text":952},{"id":1027,"depth":1378,"text":1028,"children":2330},[2331,2332,2333,2334,2335],{"id":1057,"depth":1383,"text":1058},{"id":1094,"depth":1383,"text":1095},{"id":1154,"depth":1383,"text":1155},{"id":1186,"depth":1383,"text":1187},{"id":1224,"depth":1383,"text":1225},{"id":1255,"depth":1378,"text":1256},{},{"title":5,"description":1415},[1424,1425,1426],1780489852809]