[{"data":1,"prerenderedAt":2366},["ShallowReactive",2],{"blog-article-/zh-tw/blog/zero-hallucination-qa":3,"blog-list-zh-tw":1447},{"id":4,"title":5,"body":6,"config":1431,"date":1432,"description":1433,"draft":1434,"extension":1435,"image":1431,"meta":1436,"navigation":1437,"path":1438,"seo":1439,"stem":1440,"tags":1441,"toolbar":1431,"translationKey":1445,"updated":1432,"__hash__":1446},"blog/zh-tw/blog/zero-hallucination-qa.md","我是如何實現閱讀器「零幻覺」問答的",{"type":7,"value":8,"toc":1395},"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,421,423,427,434,449,456,476,482,484,488,491,497,499,503,526,536,597,600,611,621,628,630,634,641,647,654,658,665,673,680,684,694,737,748,754,756,760,774,782,789,792,834,844,852,858,865,869,878,884,895,897,901,907,911,918,922,945,955,957,961,967,1025,1031,1033,1037,1044,1067,1071,1091,1102,1104,1108,1119,1122,1145,1156,1162,1164,1168,1187,1198,1200,1204,1226,1237,1239,1243,1262,1268,1270,1274,1361,1368,1379],[10,11,12],"p",{},[13,14],"img",{"alt":15,"src":16},"封面：零幻覺問答","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[18,19,20],"blockquote",{},[10,21,22,23,27,28,31],{},"本文分享 AI 閱讀器 ",[24,25,26],"strong",{},"零幻覺問答"," 的工程實作：回答嚴格基於當前書籍原文，關鍵論述可 ",[24,29,30],{},"一鍵溯源"," 到具體段落。若你也在做 AI 閱讀、文件 QA 或 RAG 類應用，希望三次迭代的經驗與最終架構能有所參考。",[33,34],"hr",{},[36,37,39],"h2",{"id":38},"一實踐歷程三個階段的演進","一、實踐歷程：三個階段的演進",[10,41,42,43,46],{},"零幻覺問答並非一開始就設計完備，而是在 ",[24,44,45],{},"成本、延遲和準確率"," 的拉扯中逐步演進。以下依時間順序回顧三個階段，便於理解當前架構為何長成這樣。",[48,49],"mermaid",{":config":50,"code":51},"config","flowchart%20LR%0A%20%20%20%20P1%5B%E9%9A%8E%E6%AE%B5%E4%B8%80%EF%BC%9A%E5%85%A8%E6%96%87%E7%9B%B4%E5%A1%9E%5D%20--%3E%20P2%5B%E9%9A%8E%E6%AE%B5%E4%BA%8C%EF%BC%9ALLM%20%E6%8F%90%E5%8F%96%E9%97%9C%E9%8D%B5%E5%8F%A5%5D%0A%20%20%20%20P2%20--%3E%20P3%5B%E9%9A%8E%E6%AE%B5%E4%B8%89%EF%BC%9A%E7%89%87%E6%AE%B5%E7%B4%A2%E5%BC%95%20%2B%20Tool%20%E6%AA%A2%E7%B4%A2%5D%0A%20%20%20%20P1%20-.-%3E%7C%E6%85%A2%E3%80%81%E8%B2%B4%E3%80%81%E9%95%B7%E6%9B%B8%E4%B8%8D%E6%BA%96%7C%20X1%5B%E6%B7%98%E6%B1%B0%5D%0A%20%20%20%20P2%20-.-%3E%7C%E4%B8%9F%E7%B4%B0%E7%AF%80%E3%80%81%E4%BB%8D%E5%81%8F%E6%85%A2%7C%20X2%5B%E6%B7%98%E6%B1%B0%5D%0A%20%20%20%20P3%20--%3E%7C%E7%95%B6%E5%89%8D%E6%96%B9%E6%A1%88%7C%20OK%5B%E9%9B%B6%E5%B9%BB%E8%A6%BA%20%2B%20%E5%8F%AF%E6%BA%AF%E6%BA%90%5D",[53,54,56],"h3",{"id":55},"階段一全文直塞-context最簡單也最先暴露問題","階段一：全文直塞 Context（最簡單，也最先暴露問題）",[10,58,59,62,63,66,67,70,71,74],{},[24,60,61],{},"做法："," 使用者開啟一本書提問時，將提取出的 ",[24,64,65],{},"全部正文"," 放進 System Prompt 或 User 訊息，交給對話模型作答。若全書超過約 ",[24,68,69],{},"40 萬字元","，則 ",[24,72,73],{},"硬截斷","——只保留前面一段，後續章節對模型不可見。",[10,76,77],{},[24,78,79],{},"優點：",[81,82,83,87,90],"ul",{},[84,85,86],"li",{},"實作成本極低，幾乎不需要預處理；",[84,88,89],{},"短書、結構簡單的文件效果尚可——模型確實「看到了整本書」；",[84,91,92],{},"互動簡單：問就能答，沒有「請先等待分析」的等待狀態。",[10,94,95],{},[24,96,97],{},"缺點（很快變得不可接受）：",[81,99,100,106,112,122],{},[84,101,102,105],{},[24,103,104],{},"回應慢","：每次提問都要把海量文字送進模型，首 Token 延遲和總耗時隨書長線性惡化；",[84,107,108,111],{},[24,109,110],{},"Token 成本高","：同一本書每問一次就重複付一遍全文的輸入費用；",[84,113,114,117,118,121],{},[24,115,116],{},"長書嚴重失真","：超過 40 萬字元後被截斷，後半本、附錄、結論章節等於不存在，且 UI 往往 ",[24,119,120],{},"沒有明確告知"," 已截斷；",[84,123,124,127,128,131],{},[24,125,126],{},"檢索粒度為零","：模型要在幾十萬字裡「大海撈針」，容易漏細節，也更容易產生 ",[24,129,130],{},"看似合理、實則無據"," 的概括——閱讀場景最忌諱這類幻覺。",[10,133,134],{},"階段一適合驗證 MVP，不適合作為產品級方案。",[53,136,138],{"id":137},"階段二用輕量-llm-提取關鍵句壓縮-context但壓得太狠","階段二：用輕量 LLM 提取關鍵句（壓縮 Context，但壓得太狠）",[10,140,141,143,144,147,148,151,152,156],{},[24,142,61],{}," 在提問前（或首次開啟書時），用 ",[24,145,146],{},"成本更低的模型"," 對正文做一輪預處理：依 Spine 分章（或整書分段），抽取 ",[24,149,150],{},"關鍵句","，輸出時保留 ",[153,154,155],"code",{},"[f檔案-起始-結束]"," 形式的位置標記，再將摘錄拼成較短文字，作為後續問答的 Context。",[10,158,159,160,163],{},"典型鏈路是 ",[24,161,162],{},"Extract → Cache → Chat","：先離線或按需跑一遍提取並落庫，之後每次提問複用同一份「關鍵句合集」。這與許多文件 QA 原型裡「先壓縮文件、再拿壓縮結果做 QA」的思路相同，也是我們在階段二實際採用過的路線。",[10,165,166],{},[24,167,79],{},[81,169,170,177,180],{},[84,171,172,173,176],{},"每次提問送入模型的文字 ",[24,174,175],{},"明顯縮短","，單次 Token 消耗較階段一顯著下降；",[84,178,179],{},"預處理結果可快取，同一本書不必每次提問都重新提取；",[84,181,182],{},"已引入位置標記，為後續溯源打下基礎。",[10,184,185],{},[24,186,187],{},"缺點（長書場景下依然扛不住）：",[81,189,190,196,206,215],{},[84,191,192,195],{},[24,193,194],{},"細節大量丟失","：「關鍵句」由模型主觀篩選，論證鏈上的限定條件、反例等容易被丟掉，答案容易「正確但片面」；",[84,197,198,201,202,205],{},[24,199,200],{},"長書 Context 仍然偏大","：大部頭作品即便只留關鍵句，拼接後的輸入依然可觀，",[24,203,204],{},"延遲和成本只是緩解，沒有根治","；",[84,207,208,211,212,205],{},[24,209,210],{},"雙重 LLM 誤差","：提取階段可能漏選，問答階段又可能誤讀摘錄，錯誤會 ",[24,213,214],{},"疊加",[84,216,217,220,221,224],{},[24,218,219],{},"靜態 Context","：無論使用者問的是某一章細節還是全書結構，送進模型的都是 ",[24,222,223],{},"同一份預提取文字","，無法依問題動態收窄範圍。",[10,226,227,228,231],{},"這一階段的教訓很明確：",[24,229,230],{},"問題不在「有沒有壓縮」，而在「壓縮是否按需、以及能否回到原文」","。",[53,233,235],{"id":234},"階段三片段索引-tool-按需檢索-原文回傳當前方案","階段三：片段索引 + Tool 按需檢索 + 原文回傳（當前方案）",[10,237,238,240,241,248],{},[24,239,61],{}," 基本思路參考了 ",[242,243,247],"a",{"href":244,"rel":245},"https://github.com/VectifyAI/PageIndex",[246],"nofollow","PageIndex","，相對階段二，核心變化有三點：",[250,251,252,258,268],"ol",{},[84,253,254,257],{},[24,255,256],{},"預處理產物是結構化索引","（目錄級摘要 + 精確字元 span），而不是把摘錄直接當作問答 Context；",[84,259,260,263,264,267],{},[24,261,262],{},"每次提問由模型透過 Tool Calling 按需檢索","，再 ",[24,265,266],{},"拉取帶位置標記的原文"," 作答；",[84,269,270,273],{},[24,271,272],{},"System Prompt 與前端聯動","，約束引用格式，並支援點擊角標跳轉、高亮原文。",[10,275,276],{},[24,277,278],{},"三階段對比：",[280,281,282,301],"table",{},[283,284,285],"thead",{},[286,287,288,292,295,298],"tr",{},[289,290,291],"th",{},"維度",[289,293,294],{},"階段一（全文直塞）",[289,296,297],{},"階段二（關鍵句提取）",[289,299,300],{},"階段三（當前）",[302,303,304,323,337,351,365,382],"tbody",{},[286,305,306,310,313,316],{},[307,308,309],"td",{},"單次提問 Context",[307,311,312],{},"全書（或截斷後的前半本）",[307,314,315],{},"預提取關鍵句合集",[307,317,318,319,322],{},"僅與問題相關的少量 ",[24,320,321],{},"原文"," 片段",[286,324,325,328,331,334],{},[307,326,327],{},"長書準確性",[307,329,330],{},"超 40 萬字元後嚴重下降",[307,332,333],{},"依賴提取品質，易丟細節",[307,335,336],{},"依目錄/span 檢索，不受全書長度硬截斷",[286,338,339,342,345,348],{},[307,340,341],{},"回應速度",[307,343,344],{},"慢",[307,346,347],{},"略好，長書仍慢",[307,349,350],{},"檢索 + 短 Context，明顯更快",[286,352,353,356,359,362],{},[307,354,355],{},"Token 成本",[307,357,358],{},"極高",[307,360,361],{},"中等偏高",[307,363,364],{},"預處理攤銷 + 按需付費",[286,366,367,370,373,376],{},[307,368,369],{},"溯源能力",[307,371,372],{},"弱（難標註出處）",[307,374,375],{},"有位置標記，但內容已是二次篩選",[307,377,378,379],{},"角標對應 ",[24,380,381],{},"真實原文 span",[286,383,384,387,390,393],{},[307,385,386],{},"工程複雜度",[307,388,389],{},"低",[307,391,392],{},"中",[307,394,395],{},"高",[10,397,398,401,402,405,406,409,410,413],{},[24,399,400],{},"為何停在階段三："," 閱讀場景的零幻覺，關鍵不是「讓模型看過盡量多的字」，而是 ",[24,403,404],{},"「作答前必須拿到與問題相關的原文證據」","。階段一、二都在 Context ",[24,407,408],{},"體積"," 上做文章；階段三把鏈路拆成 ",[24,411,412],{},"「索引（預處理）→ 檢索（Tool）→ 取證（原文）→ 作答（約束生成）」","，才同時兼顧準確率、成本與可溯源性。",[10,415,416,417,420],{},"下文展開 ",[24,418,419],{},"階段三"," 的實作細節。",[33,422],{},[36,424,426],{"id":425},"二問題定義閱讀場景下幻覺比普通-chat-更致命","二、問題定義：閱讀場景下，幻覺比普通 Chat 更致命",[10,428,429,430,433],{},"普通 ChatBot 偶發錯誤，使用者往往可以容忍。但在 ",[24,431,432],{},"書籍 QA"," 裡，幻覺的代價更高：",[81,435,436,443,446],{},[84,437,438,439,442],{},"使用者問的是 ",[24,440,441],{},"這本書"," 說了什麼，不是問模型的 parametric memory；",[84,444,445],{},"一句似是而非的「書中觀點」，可能誤導筆記、引用甚至二次傳播；",[84,447,448],{},"沒有出處，使用者無法核實，產品信任很難建立。",[10,450,451,452,455],{},"因此，「零幻覺」在工程上落地為三條 ",[24,453,454],{},"可執行"," 的規則：",[250,457,458,464,470],{},[84,459,460,463],{},[24,461,462],{},"書內問題必須先查書","：凡可能與當前書籍相關的問題，模型必須先走檢索（Tool），再組織答案；",[84,465,466,469],{},[24,467,468],{},"答案必須可溯源","：關鍵結論附帶原文位置標記，前端可解析並跳轉高亮；",[84,471,472,475],{},[24,473,474],{},"查不到就說查不到","：書中沒有的內容應明確告知，而不是用通用知識冒充「書中觀點」。",[10,477,478,479,481],{},"下文依 ",[24,480,419],{}," 的資料流，說明上述規則如何落地。",[33,483],{},[36,485,487],{"id":486},"三整體架構預處理-工具檢索-約束生成-可點擊溯源","三、整體架構：預處理 → 工具檢索 → 約束生成 → 可點擊溯源",[48,489],{":config":50,"code":490},"flowchart%20TB%0A%20%20%20%20subgraph%20prep%20%5B%E9%9B%A2%E7%B7%9A%2F%E9%A6%96%E6%AC%A1%E9%A0%90%E8%99%95%E7%90%86%5D%0A%20%20%20%20%20%20%20%20A%5B%E4%BE%9D%E7%9B%AE%E9%8C%84%E6%88%96%E9%95%B7%E5%BA%A6%E5%88%87%E5%88%86%E5%85%A8%E6%9B%B8%5D%20--%3E%20B%5BLLM%20%E7%94%A2%E7%94%9F%E7%89%87%E6%AE%B5%E6%91%98%E8%A6%81%5D%0A%20%20%20%20%20%20%20%20B%20--%3E%20C%5B%E6%9C%AC%E6%A9%9F%E6%8C%81%E4%B9%85%E5%8C%96%20Segment%20%E5%BF%AB%E5%8F%96%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20ask%20%5B%E4%BD%BF%E7%94%A8%E8%80%85%E6%8F%90%E5%95%8F%5D%0A%20%20%20%20%20%20%20%20D%5B%E4%BD%BF%E7%94%A8%E8%80%85%E8%BC%B8%E5%85%A5%E5%95%8F%E9%A1%8C%5D%20--%3E%20E%7B%E5%B7%B2%E6%9C%89%20Segment%20%E5%BF%AB%E5%8F%96%3F%7D%0A%20%20%20%20%20%20%20%20E%20--%3E%7C%E5%90%A6%7C%20F%5B%E6%8F%90%E5%8F%96%E5%85%A8%E6%96%87%20%2F%20%E8%A9%A2%E5%95%8F%E6%98%AF%E5%90%A6%E9%A0%90%E8%99%95%E7%90%86%5D%0A%20%20%20%20%20%20%20%20F%20--%3E%20prep%0A%20%20%20%20%20%20%20%20E%20--%3E%7C%E6%98%AF%7C%20G%5B%E8%A8%BB%E5%86%8A%20Tool%20Calling%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20retrieve%20%5B%E5%B7%A5%E5%85%B7%E6%AA%A2%E7%B4%A2%5D%0A%20%20%20%20%20%20%20%20G%20--%3E%20H%7B%E5%95%8F%E9%A1%8C%E9%A1%9E%E5%9E%8B%7D%0A%20%20%20%20%20%20%20%20H%20--%3E%7C%E5%85%A8%E6%9B%B8%E6%A6%82%E8%A6%BD%2F%E6%9B%B8%E8%A9%95%7C%20I%5Bget_full_book_segment_summaries%5D%0A%20%20%20%20%20%20%20%20H%20--%3E%7C%E5%85%B7%E9%AB%94%E4%BA%8B%E5%AF%A6%2F%E4%BA%BA%E7%89%A9%2F%E7%AB%A0%E7%AF%80%7C%20J%5Bget_related_segment_summaries%5D%0A%20%20%20%20%20%20%20%20J%20--%3E%20K%5BLLM%20%E5%BE%9E%E6%91%98%E8%A6%81%E7%9B%AE%E9%8C%84%E4%B8%AD%E9%81%B8%E7%9B%B8%E9%97%9C%E7%89%87%E6%AE%B5%20ID%5D%0A%20%20%20%20%20%20%20%20K%20--%3E%20L%5B%E4%BE%9D%20span%20%E6%8B%89%E5%8F%96%E5%8E%9F%E6%96%87%20%2B%20%E4%BD%8D%E7%BD%AE%E6%A8%99%E8%A8%98%5D%0A%20%20%20%20%20%20%20%20I%20--%3E%20M%5B%E6%8B%BC%E6%8E%A5%E5%85%A8%E6%9B%B8%E7%89%87%E6%AE%B5%E6%91%98%E8%A6%81%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20answer%20%5B%E7%94%9F%E6%88%90%E8%88%87%E5%B1%95%E7%A4%BA%5D%0A%20%20%20%20%20%20%20%20L%20--%3E%20N%5BTool%20%E7%B5%90%E6%9E%9C%E5%9B%9E%E5%82%B3%E6%A8%A1%E5%9E%8B%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%20%E7%B4%84%E6%9D%9F%E5%BC%95%E7%94%A8%E6%A0%BC%E5%BC%8F%5D%0A%20%20%20%20%20%20%20%20O%20--%3E%20P%5B%E4%B8%B2%E6%B5%81%E8%BC%B8%E5%87%BA%E7%AD%94%E6%A1%88%20%2B%20%E4%BD%8D%E7%BD%AE%E8%A7%92%E6%A8%99%5D%0A%20%20%20%20%20%20%20%20P%20--%3E%20Q%5B%E6%B8%B2%E6%9F%93%E5%8F%AF%E9%BB%9E%E6%93%8A%E5%BC%95%E7%94%A8%E8%A7%92%E6%A8%99%5D%0A%20%20%20%20%20%20%20%20Q%20--%3E%20R%5B%E9%BB%9E%E6%93%8A%20%E2%86%92%20%E9%A0%90%E8%A6%BD%E5%8E%9F%E6%96%87%20%E2%86%92%20%E8%B7%B3%E8%BD%89%E9%AB%98%E4%BA%AE%5D%0A%20%20%20%20end",[10,492,493,494,231],{},"核心思路可概括為：",[24,495,496],{},"不讓模型「憑記憶答題」，而是讓它「先取證、再作答、並標註出處」",[33,498],{},[36,500,502],{"id":501},"四預處理把整本書變成可檢索的片段索引","四、預處理：把整本書變成可檢索的「片段索引」",[10,504,505,506,509,510,513,514,517,518,521,522,525],{},"若每次提問仍採用 ",[24,507,508],{},"階段一"," 的全文 Context，長書必然爆 Token，檢索粒度也過粗。階段三的解法是：使用者首次對某本書發起 AI 對話時，背景非同步跑 ",[24,511,512],{},"片段摘要任務","，依 ",[24,515,516],{},"目錄結構"," 或 ",[24,519,520],{},"文字長度"," 將全書切成若干 ",[153,523,524],{},"Segment","，為每個片段產生摘要，並持久化到本機 IndexedDB。",[10,527,528,529,531,532,535],{},"每個 ",[153,530,524],{}," 在資料結構上包含摘要與 ",[24,533,534],{},"正文物理位置","：",[280,537,538,548],{},[283,539,540],{},[286,541,542,545],{},[289,543,544],{},"欄位",[289,546,547],{},"含義",[302,549,550,564,577,587],{},[286,551,552,561],{},[307,553,554,557,558],{},[153,555,556],{},"startFileIndex"," / ",[153,559,560],{},"endFileIndex",[307,562,563],{},"Spine 檔案索引（PDF 則每頁一個檔案）",[286,565,566,574],{},[307,567,568,557,571],{},[153,569,570],{},"startOffset",[153,572,573],{},"endOffset",[307,575,576],{},"字元級起迄偏移",[286,578,579,584],{},[307,580,581],{},[153,582,583],{},"sequence",[307,585,586],{},"線性閱讀順序",[286,588,589,594],{},[307,590,591],{},[153,592,593],{},"title",[307,595,596],{},"對應目錄標題",[10,598,599],{},"切分策略兼顧精度與成本：單一目錄正文不超過約 20KB 時只摘要該節點；同級目錄會合併成批（15KB～20KB）再呼叫 LLM；無目錄的大塊正文則依 3～4 萬字元區間切段。",[10,601,602,603,606,607,610],{},"摘要生成時的 System Prompt 會要求 ",[24,604,605],{},"保留原文位置標記","（格式 ",[153,608,609],{},"[f數字-數字-數字]","），以便後續 Tool 回傳原文時，位置資訊與 spine 字元偏移一致。核心約束如下：",[612,613,619],"pre",{"className":614,"code":616,"language":617,"meta":618},[615],"language-text","若摘要內容與原文某段相關，須保留段末位置資訊，格式 [f數字-數字-數字]（如 [f1-90-109]）。\n位置標記是整體，禁止修改、合併或省略其中的任何字元或數值。\n","text","",[153,620,616],{"__ignoreMap":618},[10,622,623,624,627],{},"預處理完成後，問答不再依賴「整書 Context」，而是依賴 ",[24,625,626],{},"結構化片段索引","——這是長書場景下零幻覺的工程前提。",[33,629],{},[36,631,633],{"id":632},"五位置標記體系把出處編碼進文字","五、位置標記體系：把「出處」編碼進文字",[10,635,636,637,640],{},"零幻覺不僅要求內容來自原文，還要求 ",[24,638,639],{},"出處可機器解析、可在 UI 中跳轉","。我們採用內嵌位置標記：",[612,642,645],{"className":643,"code":644,"language":617},[615],"[f{fileIndex}-{startChar}-{endChar}]\n",[153,646,644],{"__ignoreMap":618},[10,648,649,650,653],{},"例如 ",[153,651,652],{},"[f5-123-165]"," 表示：第 5 個 Spine 檔案（從 0 起算）中，字元偏移 123～165 的文字區間。",[53,655,657],{"id":656},"_51-標記如何寫入正文","5.1 標記如何寫入正文",[10,659,660,661,664],{},"正文提取層在輸出片段時，為每個小段在段末寫入 ",[153,662,663],{},"[f{fileIndex}-{start}-{end}]","。示意：",[612,666,671],{"className":667,"code":669,"language":670,"meta":618},[668],"language-typescript","const position = `[f${fileIndex}-${absOffset}-${absOffset + segment.length}]`;\nfileLines.push(segment.text.trim() + position);\n","typescript",[153,672,669],{"__ignoreMap":618},[10,674,675,676,679],{},"無論是預處理摘要還是 Tool 回傳的原文摘錄，位置資訊都與 ",[24,677,678],{},"Spine 字元偏移"," 對齊，而不是讓模型「估算頁碼」。",[53,681,683],{"id":682},"_52-對模型輸出的約束","5.2 對模型輸出的約束",[10,685,686,687,693],{},"組裝 System Prompt 時，我們單獨約定了 ",[24,688,689],{},[690,691,692],"span",{},"Position Citation Rules","，核心五條：",[250,695,696,706,716,722,731],{},[84,697,698,701,702,705],{},[24,699,700],{},"標準格式","：必須使用 ",[153,703,704],{},"[f_fileIndex-startChar-endChar]","，三段數字缺一不可；",[84,707,708,711,712,715],{},[24,709,710],{},"只引用當前來源","：角標須 ",[24,713,714],{},"原樣複製"," 自本輪 System/User 訊息或 Tool 回傳文字中的標記；",[84,717,718,721],{},[24,719,720],{},"禁止偽造","：不得自行計算、修改或編造位置；",[84,723,724,727,728,205],{},[24,725,726],{},"寧缺毋濫","：當前上下文沒有合法標記時，正常作答即可，",[24,729,730],{},"不要輸出任何位置標記",[84,732,733,736],{},[24,734,735],{},"緊跟論述","：標記須緊跟相關句段，禁止在文末堆砌引用清單。",[10,738,739,740,743,744,747],{},"前端展示前還會過濾模型偶發輸出的 ",[24,741,742],{},"兩段位"," 非法標記（如 ",[153,745,746],{},"[f1-293]","），避免無效角標進入 UI。",[10,749,750],{},[13,751],{"alt":752,"src":753},"引用溯源彈窗","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[33,755],{},[36,757,759],{"id":758},"六tool-calling先檢索再回答","六、Tool Calling：先檢索，再回答",[10,761,762,763,766,767,770,771,231],{},"當對話綁定某本書（存在 ",[153,764,765],{},"resourceId","，且 ",[153,768,769],{},"chatType === 'chat'","）時，每次生成前會向模型註冊兩個 Tool，並掛載對應的 executor。整體遵循 OpenAI 相容的 ",[24,772,773],{},"function calling 迴圈",[53,775,777,778,781],{"id":776},"_61-get_related_segment_summaries-針對具體問題查片段","6.1 ",[153,779,780],{},"get_related_segment_summaries"," —— 針對具體問題查片段",[10,783,784,785,788],{},"適用於：概念、人物、情節、章節細節等 ",[24,786,787],{},"有明確檢索意圖"," 的問題。",[10,790,791],{},"流程簡述：",[250,793,794,801,807,814,828],{},[84,795,796,797,800],{},"模型將使用者口語 ",[24,798,799],{},"改寫為書中可能出現的術語","（System Prompt 中的「Optimize Search Queries」）；",[84,802,803,804,205],{},"呼叫 Tool，傳入 ",[153,805,806],{},"question",[84,808,809,810,813],{},"將所有片段摘要依 Token 預算 ",[24,811,812],{},"分批","（單批約 3 萬 Token，最多 5 批）；",[84,815,816,817,820,821,824,825,205],{},"每批發起一次 ",[24,818,819],{},"獨立的 LLM 請求","，從 ",[153,822,823],{},"{ id, title, summary }"," 清單中選出相關片段 ID（最多 5 個），回傳 JSON，形如 ",[153,826,827],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[84,829,830,831,833],{},"依選中 Segment 的 span，從 Spine ",[24,832,266],{},"（不是摘要），作為 Tool 結果回傳。",[10,835,836,839,840,843],{},[24,837,838],{},"關鍵設計：Tool 回傳原文，而非摘要。"," 模型作答時看到的是真實段落 + 內嵌 ",[153,841,842],{},"[f…]","，避免「摘要 → 再概括」帶來的漂移。",[53,845,847,848,851],{"id":846},"_62-get_full_book_segment_summaries-全書概覽類問題","6.2 ",[153,849,850],{},"get_full_book_segment_summaries"," —— 全書概覽類問題",[10,853,854,855,788],{},"適用於：「總結全書」「點評這本書」「整體結構/主題」等 ",[24,856,857],{},"需要全局視野",[10,859,860,861,864],{},"依閱讀順序拼接所有片段的 ",[153,862,863],{},"summary"," 回傳，避免逐段相關度篩選遺漏關鍵章節。",[53,866,868],{"id":867},"_63-system-prompt書優先工具優先","6.3 System Prompt：書優先、工具優先",[10,870,871,872,877],{},"綁定書籍時，System Prompt 注入 ",[24,873,874],{},[690,875,876],{},"Core Principles for Reading Assistant","，核心三條：",[612,879,882],{"className":880,"code":881,"language":617},[615],"1. Book First, Tool First\n   - 任何可能與書籍相關的問題，必須先呼叫工具檢索；\n   - 答案必須主要依據檢索結果，禁止不檢索就編造「書中內容」。\n\n2. General Knowledge as Fallback Only\n   - 僅當：純閒聊 / 使用者明確要求不用書 / 工具無結果時，才可使用通用知識；\n   - 若書中沒有，必須先聲明「書中未提及此內容」，再補充通用知識。\n\n3. Direct Style\n   - 直入主題，禁止「根據提供的材料…」「綜上所述…」等套話。\n",[153,883,881],{"__ignoreMap":618},[10,885,886,887,890,891,894],{},"生成層實作標準 Tool 迴圈：",[153,888,889],{},"tool_calls"," → 執行 executor → 追加 ",[153,892,893],{},"role: tool"," → 繼續請求，直到輸出最終文字。啟用 tools 時關閉 thinking 通道，避免與 function call 協定衝突。",[33,896],{},[36,898,900],{"id":899},"七前端溯源從角標到原文高亮","七、前端溯源：從角標到原文高亮",[10,902,903,904,906],{},"模型輸出的 ",[153,905,652],{}," 不會直接展示，在渲染層轉為可點擊引用。",[53,908,910],{"id":909},"_71-角標渲染","7.1 角標渲染",[10,912,913,914,917],{},"展示前將位置標記規範化為 Markdown 連結，例如 ",[153,915,916],{},"[1]([f5-123-165])","，再渲染為序號角標；同一位置多次出現時可去重，避免 UI 堆疊。",[53,919,921],{"id":920},"_72-點擊互動","7.2 點擊互動",[250,923,924,933,939],{},[84,925,926,929,930,932],{},[24,927,928],{},"首次點擊","：解析 ",[153,931,842],{}," → 取 fileIndex 與字元偏移 → 從 Spine 原文提取文字 → 彈出預覽（可帶目錄標題）；",[84,934,935,938],{},[24,936,937],{},"再次點擊同一角標","：關閉彈窗；",[84,940,941,944],{},[24,942,943],{},"確認跳轉","：開啟閱讀視圖，依字元區間高亮。",[10,946,947,948,951,952,231],{},"從模型複製的標記到使用者看到的原文，中間 ",[24,949,950],{},"不經 LLM 二次加工","，溯源鏈路全程 ",[24,953,954],{},"確定、可重現",[33,956],{},[36,958,960],{"id":959},"八邊界情況與誠實降級","八、邊界情況與誠實降級",[10,962,963,964,535],{},"零幻覺不等於「永遠有答案」，而是 ",[24,965,966],{},"沒有證據時不瞎編",[280,968,969,979],{},[283,970,971],{},[286,972,973,976],{},[289,974,975],{},"場景",[289,977,978],{},"行為",[302,980,981,989,1001,1009,1017],{},[286,982,983,986],{},[307,984,985],{},"片段摘要尚未產生",[307,987,988],{},"先提取全文做摘要",[286,990,991,994],{},[307,992,993],{},"Tool 檢索無結果",[307,995,996,997,1000],{},"回傳 ",[153,998,999],{},"(No relevant segment excerpts found…)","，模型應聲明書中未提及",[286,1002,1003,1006],{},[307,1004,1005],{},"模型輸出了非法兩段位標記",[307,1007,1008],{},"前端過濾，不展示無效角標",[286,1010,1011,1014],{},[307,1012,1013],{},"使用者純閒聊",[307,1015,1016],{},"System Prompt 允許脫離書籍，用通用知識回答",[286,1018,1019,1022],{},[307,1020,1021],{},"匯出對話",[307,1023,1024],{},"可將角標轉為閱讀器深連結，便於分享或歸檔",[10,1026,1027],{},[13,1028],{"alt":1029,"src":1030},"對話匯出","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[33,1032],{},[36,1034,1036],{"id":1035},"九設計取捨為什麼不用向量-rag","九、設計取捨：為什麼不用「向量 RAG」？",[10,1038,1039,1040,1043],{},"做文件 QA 的同行常會問：既然要做檢索增強，為什麼不走 ",[24,1041,1042],{},"Embedding + 向量庫 Top-K"," 這條標準路線？",[10,1045,1046,1047,1050,1051,1054,1055,1058,1059,1062,1063,1066],{},"實際上 ",[24,1048,1049],{},"我們也在做 RAG","——每次回答前都會先查書、再生成。差別在於：社群語境裡的 RAG 往往預設包含 ",[24,1052,1053],{},"向量化與相似度檢索","；當前方案是 ",[24,1056,1057],{},"「片段索引 + Tool 按需拉原文」","（階段三），",[24,1060,1061],{},"刻意不引入向量層","。以下從 ",[24,1064,1065],{},"架構約束"," 說明取捨，並非否定向量 RAG 的價值。",[53,1068,1070],{"id":1069},"界定範圍不是不用檢索而是不用向量檢索","界定範圍：不是不用檢索，而是不用「向量檢索」",[81,1072,1073,1082],{},[84,1074,1075,1078,1079,231],{},[24,1076,1077],{},"廣義 RAG","：檢索相關材料 → 再生成 → ",[24,1080,1081],{},"我們在做",[84,1083,1084,1087,1088,231],{},[24,1085,1086],{},"向量 RAG","：召回依賴 Embedding 相似度 → ",[24,1089,1090],{},"當前版本不做",[10,1092,1093,1094,1097,1098,1101],{},"全書預處理為 ",[24,1095,1096],{},"片段摘要索引","；提問時模型透過 Tool 選段，再 ",[24,1099,1100],{},"回傳原文","。檢索增強存在，但不依賴單獨的 embedding 模型與向量索引維護。",[33,1103],{},[53,1105,1107],{"id":1106},"原因一支援自訂-llm-provider設定鏈路要盡量短","原因一：支援自訂 LLM Provider，設定鏈路要盡量短",[10,1109,1110,1111,1114,1115,1118],{},"產品允許使用者自由接入 ",[24,1112,1113],{},"自有 API Key","、自訂 Base URL，或使用 ",[24,1116,1117],{},"本機 Ollama","——對話模型由使用者自選，成本和資料路徑可控。這對許多自託管、多模型對比的場景是硬需求。",[10,1120,1121],{},"疊加典型向量 RAG 後，整合面會明顯變寬：",[81,1123,1124,1135,1138],{},[84,1125,1126,1127,1130,1131,1134],{},"除 ",[24,1128,1129],{},"Chat 模型"," 外，通常還需 ",[24,1132,1133],{},"Embedding 模型","（另一個 model name，有時還是另一個 endpoint）；",[84,1136,1137],{},"Ollama 等本機部署還要單獨拉 embedding 模型，並處理維度、介面相容；",[84,1139,1140,1141,1144],{},"故障域變複雜：Chat 正常但 ",[24,1142,1143],{},"檢索為空"," 時，可能是 embedding、索引或維度不一致，排查成本高於「單 Provider 全鏈路」。",[10,1146,1147,1148,1151,1152,1155],{},"當前方案裡，",[24,1149,1150],{},"選段與作答共用同一套 Provider 設定","，避免「Chat 用 A、建索引用 B」。若你在做 ",[24,1153,1154],{},"可插拔 LLM"," 的應用，這往往比多幾個點的召回率更重要。",[10,1157,1158],{},[13,1159],{"alt":1160,"src":1161},"自訂 AI 服務商","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[33,1163],{},[53,1165,1167],{"id":1166},"原因二embedding-與索引強綁定切換-provider-成本高","原因二：Embedding 與索引強綁定，切換 Provider 成本高",[10,1169,1170,1171,1174,1175,1178,1179,1182,1183,1186],{},"向量 RAG 裡常被低估的一點：",[24,1172,1173],{},"向量不是通用中間格式，而是某個 embedding 模型下的座標。"," 建庫用模型 A、查詢用模型 B 時，相似度通常 ",[24,1176,1177],{},"不可比","——換模型往往意味著 ",[24,1180,1181],{},"全書重新向量化","，且不同模型的 ",[24,1184,1185],{},"向量維度","（768 / 1024 / 1536 …）會綁死儲存 schema。",[10,1188,1189,1190,1193,1194,1197],{},"階段三持久化的是 ",[24,1191,1192],{},"結構化摘要 + 字元 span","，不存向量；切換 Chat 模型時 ",[24,1195,1196],{},"無需重建索引","，證據鏈（原文位置）不變。這與「使用者隨時對比不同 LLM」的目標更一致。",[33,1199],{},[53,1201,1203],{"id":1202},"原因三有目錄的長文件結構化路由往往已夠用","原因三：有目錄的長文件，結構化路由往往已夠用",[10,1205,1206,1207,1210,1211,1214,1215,1218,1219,1225],{},"電子書、PDF 通常有 ",[24,1208,1209],{},"章節結構","；預處理已產出 ",[24,1212,1213],{},"段標題 + 摘要","。對「某一章講了什麼」「書中如何定義某概念」類問題，在摘要目錄上選段再 ",[24,1216,1217],{},"拉回原文","，實務中效果穩定；且 Tool 回傳的是 ",[24,1220,1221,1222,1224],{},"帶 ",[153,1223,842],{}," 的原文","，零幻覺仍錨定在字元 span 上。",[10,1227,1228,1229,1232,1233,1236],{},"向量檢索在語意模糊、跨語言、長段落字面匹配等場景仍有優勢；在 ",[24,1230,1231],{},"有 TOC、可預處理、要強溯源"," 的閱讀器裡，優先把複雜度放在 ",[24,1234,1235],{},"Tool + 原文回傳 + 引用約束"," 上，ROI 通常更高。",[33,1238],{},[53,1240,1242],{"id":1241},"後續方向混合召回而非推倒重來","後續方向：混合召回，而非推倒重來",[10,1244,1245,1246,1249,1250,1253,1254,1257,1258,1261],{},"不排除將來增加 ",[24,1247,1248],{},"向量粗召回","（例如 embedding 只篩 Top-N 候選章節），最終仍走 ",[24,1251,1252],{},"選段 → 原文回傳 → 可點擊溯源","，零幻覺規則不變。若引入，會盡量滿足：Embedding ",[24,1255,1256],{},"可選","、換模型時 ",[24,1259,1260],{},"顯式提示重建索引","，避免 silent wrong retrieval。",[10,1263,1264,1265,231],{},"在此之前，優先保證：",[24,1266,1267],{},"任意 OpenAI 相容 Chat API 即可工作，換 Chat 模型不必重建本機索引",[33,1269],{},[36,1271,1273],{"id":1272},"十小結","十、小結",[280,1275,1276,1289],{},[283,1277,1278],{},[286,1279,1280,1283,1286],{},[289,1281,1282],{},"環節",[289,1284,1285],{},"手段",[289,1287,1288],{},"作用",[302,1290,1291,1302,1315,1328,1339,1350],{},[286,1292,1293,1296,1299],{},[307,1294,1295],{},"預處理",[307,1297,1298],{},"依目錄/長度切分 + 片段摘要快取",[307,1300,1301],{},"長書可檢索、可定位",[286,1303,1304,1307,1312],{},[307,1305,1306],{},"位置標記",[307,1308,1309,1311],{},[153,1310,155],{}," 寫入原文",[307,1313,1314],{},"出處可機器解析",[286,1316,1317,1320,1325],{},[307,1318,1319],{},"Tool 檢索",[307,1321,1322,1323],{},"依問題查片段/全書摘要，回傳 ",[24,1324,321],{},[307,1326,1327],{},"作答前強制取證",[286,1329,1330,1333,1336],{},[307,1331,1332],{},"System Prompt",[307,1334,1335],{},"書優先、禁止偽造角標、查不到要說",[307,1337,1338],{},"約束生成行為",[286,1340,1341,1344,1347],{},[307,1342,1343],{},"前端溯源",[307,1345,1346],{},"角標 → 預覽 → 跳轉高亮",[307,1348,1349],{},"使用者可核驗證據",[286,1351,1352,1355,1358],{},[307,1353,1354],{},"不用向量檢索",[307,1356,1357],{},"單 Provider、換 Chat 模型無需重建索引",[307,1359,1360],{},"降低整合與遷移成本",[10,1362,1363,1364,1367],{},"「零幻覺」不是指望模型從不犯錯，而是 ",[24,1365,1366],{},"用工程結構把輸出鎖在證據鏈上","：沒有檢索結果就不應冒充書中內容；有檢索結果則應給出可核驗的原文位置。",[10,1369,1370,1371,1374,1375,1378],{},"若你也在做 AI 閱讀或文件 QA，希望 ",[24,1372,1373],{},"全文直塞 → 關鍵句提取 → Tool-First 按需檢索"," 這條演進路徑，以及 ",[24,1376,1377],{},"內嵌位置標記 + 原文回傳"," 的做法，能作為可參考的一種實作。",[18,1380,1381],{},[10,1382,1383,1384,1389,1390,1394],{},"以上是我們在開發 ",[242,1385,1388],{"href":1386,"rel":1387},"https://reader.linghuxiong.com",[246],"令狐兄","（Foxycape）AI 閱讀器實踐心得，僅供參考。文末可前往 ",[242,1391,1393],{"href":1392},"/zh-tw#download","下載頁面"," 體驗閱讀器。",{"title":618,"searchDepth":1396,"depth":1396,"links":1397},2,[1398,1404,1405,1406,1407,1411,1418,1422,1423,1430],{"id":38,"depth":1396,"text":39,"children":1399},[1400,1402,1403],{"id":55,"depth":1401,"text":56},3,{"id":137,"depth":1401,"text":138},{"id":234,"depth":1401,"text":235},{"id":425,"depth":1396,"text":426},{"id":486,"depth":1396,"text":487},{"id":501,"depth":1396,"text":502},{"id":632,"depth":1396,"text":633,"children":1408},[1409,1410],{"id":656,"depth":1401,"text":657},{"id":682,"depth":1401,"text":683},{"id":758,"depth":1396,"text":759,"children":1412},[1413,1415,1417],{"id":776,"depth":1401,"text":1414},"6.1 get_related_segment_summaries —— 針對具體問題查片段",{"id":846,"depth":1401,"text":1416},"6.2 get_full_book_segment_summaries —— 全書概覽類問題",{"id":867,"depth":1401,"text":868},{"id":899,"depth":1396,"text":900,"children":1419},[1420,1421],{"id":909,"depth":1401,"text":910},{"id":920,"depth":1401,"text":921},{"id":959,"depth":1396,"text":960},{"id":1035,"depth":1396,"text":1036,"children":1424},[1425,1426,1427,1428,1429],{"id":1069,"depth":1401,"text":1070},{"id":1106,"depth":1401,"text":1107},{"id":1166,"depth":1401,"text":1167},{"id":1202,"depth":1401,"text":1203},{"id":1241,"depth":1401,"text":1242},{"id":1272,"depth":1396,"text":1273},null,"2026-06-03","分享 AI 閱讀器零幻覺問答的工程實作：回答嚴格基於當前書籍原文，關鍵論述可一鍵溯源到具體段落。",false,"md",{},true,"/zh-tw/blog/zero-hallucination-qa",{"title":5,"description":1433},"zh-tw/blog/zero-hallucination-qa",[1442,1443,1444],"閱讀器","AI","技術","zero-hallucination-qa","FAS1XA39T3l_OReLlkcSgPiyXgco_dsQVTaKMAAL-oU",[1448],{"id":4,"title":5,"body":1449,"config":1431,"date":1432,"description":1433,"draft":1434,"extension":1435,"image":1431,"meta":2363,"navigation":1437,"path":1438,"seo":2364,"stem":1440,"tags":2365,"toolbar":1431,"translationKey":1445,"updated":1432,"__hash__":1446},{"type":7,"value":1450,"toc":2331},[1451,1455,1463,1465,1467,1471,1473,1475,1485,1489,1497,1501,1523,1525,1527,1537,1541,1545,1555,1559,1583,1587,1589,1596,1612,1616,1696,1706,1710,1712,1714,1718,1728,1732,1746,1750,1752,1754,1756,1760,1762,1764,1776,1782,1830,1832,1838,1843,1847,1849,1851,1855,1860,1864,1866,1870,1875,1879,1881,1887,1915,1921,1925,1927,1929,1937,1941,1945,1947,1973,1979,1983,1987,1991,1993,1999,2004,2010,2012,2014,2018,2020,2024,2026,2042,2048,2050,2052,2056,2100,2104,2106,2108,2112,2124,2126,2140,2146,2148,2150,2156,2158,2172,2178,2182,2184,2186,2196,2202,2204,2206,2218,2224,2226,2228,2238,2242,2244,2246,2312,2316,2322],[10,1452,1453],{},[13,1454],{"alt":15,"src":16},[18,1456,1457],{},[10,1458,22,1459,27,1461,31],{},[24,1460,26],{},[24,1462,30],{},[33,1464],{},[36,1466,39],{"id":38},[10,1468,42,1469,46],{},[24,1470,45],{},[48,1472],{":config":50,"code":51},[53,1474,56],{"id":55},[10,1476,1477,62,1479,66,1481,70,1483,74],{},[24,1478,61],{},[24,1480,65],{},[24,1482,69],{},[24,1484,73],{},[10,1486,1487],{},[24,1488,79],{},[81,1490,1491,1493,1495],{},[84,1492,86],{},[84,1494,89],{},[84,1496,92],{},[10,1498,1499],{},[24,1500,97],{},[81,1502,1503,1507,1511,1517],{},[84,1504,1505,105],{},[24,1506,104],{},[84,1508,1509,111],{},[24,1510,110],{},[84,1512,1513,117,1515,121],{},[24,1514,116],{},[24,1516,120],{},[84,1518,1519,127,1521,131],{},[24,1520,126],{},[24,1522,130],{},[10,1524,134],{},[53,1526,138],{"id":137},[10,1528,1529,143,1531,147,1533,151,1535,156],{},[24,1530,61],{},[24,1532,146],{},[24,1534,150],{},[153,1536,155],{},[10,1538,159,1539,163],{},[24,1540,162],{},[10,1542,1543],{},[24,1544,79],{},[81,1546,1547,1551,1553],{},[84,1548,172,1549,176],{},[24,1550,175],{},[84,1552,179],{},[84,1554,182],{},[10,1556,1557],{},[24,1558,187],{},[81,1560,1561,1565,1571,1577],{},[84,1562,1563,195],{},[24,1564,194],{},[84,1566,1567,201,1569,205],{},[24,1568,200],{},[24,1570,204],{},[84,1572,1573,211,1575,205],{},[24,1574,210],{},[24,1576,214],{},[84,1578,1579,220,1581,224],{},[24,1580,219],{},[24,1582,223],{},[10,1584,227,1585,231],{},[24,1586,230],{},[53,1588,235],{"id":234},[10,1590,1591,240,1593,248],{},[24,1592,61],{},[242,1594,247],{"href":244,"rel":1595},[246],[250,1597,1598,1602,1608],{},[84,1599,1600,257],{},[24,1601,256],{},[84,1603,1604,263,1606,267],{},[24,1605,262],{},[24,1607,266],{},[84,1609,1610,273],{},[24,1611,272],{},[10,1613,1614],{},[24,1615,278],{},[280,1617,1618,1630],{},[283,1619,1620],{},[286,1621,1622,1624,1626,1628],{},[289,1623,291],{},[289,1625,294],{},[289,1627,297],{},[289,1629,300],{},[302,1631,1632,1644,1654,1664,1674,1686],{},[286,1633,1634,1636,1638,1640],{},[307,1635,309],{},[307,1637,312],{},[307,1639,315],{},[307,1641,318,1642,322],{},[24,1643,321],{},[286,1645,1646,1648,1650,1652],{},[307,1647,327],{},[307,1649,330],{},[307,1651,333],{},[307,1653,336],{},[286,1655,1656,1658,1660,1662],{},[307,1657,341],{},[307,1659,344],{},[307,1661,347],{},[307,1663,350],{},[286,1665,1666,1668,1670,1672],{},[307,1667,355],{},[307,1669,358],{},[307,1671,361],{},[307,1673,364],{},[286,1675,1676,1678,1680,1682],{},[307,1677,369],{},[307,1679,372],{},[307,1681,375],{},[307,1683,378,1684],{},[24,1685,381],{},[286,1687,1688,1690,1692,1694],{},[307,1689,386],{},[307,1691,389],{},[307,1693,392],{},[307,1695,395],{},[10,1697,1698,401,1700,405,1702,409,1704,413],{},[24,1699,400],{},[24,1701,404],{},[24,1703,408],{},[24,1705,412],{},[10,1707,416,1708,420],{},[24,1709,419],{},[33,1711],{},[36,1713,426],{"id":425},[10,1715,429,1716,433],{},[24,1717,432],{},[81,1719,1720,1724,1726],{},[84,1721,438,1722,442],{},[24,1723,441],{},[84,1725,445],{},[84,1727,448],{},[10,1729,451,1730,455],{},[24,1731,454],{},[250,1733,1734,1738,1742],{},[84,1735,1736,463],{},[24,1737,462],{},[84,1739,1740,469],{},[24,1741,468],{},[84,1743,1744,475],{},[24,1745,474],{},[10,1747,478,1748,481],{},[24,1749,419],{},[33,1751],{},[36,1753,487],{"id":486},[48,1755],{":config":50,"code":490},[10,1757,493,1758,231],{},[24,1759,496],{},[33,1761],{},[36,1763,502],{"id":501},[10,1765,505,1766,509,1768,513,1770,517,1772,521,1774,525],{},[24,1767,508],{},[24,1769,512],{},[24,1771,516],{},[24,1773,520],{},[153,1775,524],{},[10,1777,528,1778,531,1780,535],{},[153,1779,524],{},[24,1781,534],{},[280,1783,1784,1792],{},[283,1785,1786],{},[286,1787,1788,1790],{},[289,1789,544],{},[289,1791,547],{},[302,1793,1794,1804,1814,1822],{},[286,1795,1796,1802],{},[307,1797,1798,557,1800],{},[153,1799,556],{},[153,1801,560],{},[307,1803,563],{},[286,1805,1806,1812],{},[307,1807,1808,557,1810],{},[153,1809,570],{},[153,1811,573],{},[307,1813,576],{},[286,1815,1816,1820],{},[307,1817,1818],{},[153,1819,583],{},[307,1821,586],{},[286,1823,1824,1828],{},[307,1825,1826],{},[153,1827,593],{},[307,1829,596],{},[10,1831,599],{},[10,1833,602,1834,606,1836,610],{},[24,1835,605],{},[153,1837,609],{},[612,1839,1841],{"className":1840,"code":616,"language":617,"meta":618},[615],[153,1842,616],{"__ignoreMap":618},[10,1844,623,1845,627],{},[24,1846,626],{},[33,1848],{},[36,1850,633],{"id":632},[10,1852,636,1853,640],{},[24,1854,639],{},[612,1856,1858],{"className":1857,"code":644,"language":617},[615],[153,1859,644],{"__ignoreMap":618},[10,1861,649,1862,653],{},[153,1863,652],{},[53,1865,657],{"id":656},[10,1867,660,1868,664],{},[153,1869,663],{},[612,1871,1873],{"className":1872,"code":669,"language":670,"meta":618},[668],[153,1874,669],{"__ignoreMap":618},[10,1876,675,1877,679],{},[24,1878,678],{},[53,1880,683],{"id":682},[10,1882,686,1883,693],{},[24,1884,1885],{},[690,1886,692],{},[250,1888,1889,1895,1901,1905,1911],{},[84,1890,1891,701,1893,705],{},[24,1892,700],{},[153,1894,704],{},[84,1896,1897,711,1899,715],{},[24,1898,710],{},[24,1900,714],{},[84,1902,1903,721],{},[24,1904,720],{},[84,1906,1907,727,1909,205],{},[24,1908,726],{},[24,1910,730],{},[84,1912,1913,736],{},[24,1914,735],{},[10,1916,739,1917,743,1919,747],{},[24,1918,742],{},[153,1920,746],{},[10,1922,1923],{},[13,1924],{"alt":752,"src":753},[33,1926],{},[36,1928,759],{"id":758},[10,1930,762,1931,766,1933,770,1935,231],{},[153,1932,765],{},[153,1934,769],{},[24,1936,773],{},[53,1938,777,1939,781],{"id":776},[153,1940,780],{},[10,1942,784,1943,788],{},[24,1944,787],{},[10,1946,791],{},[250,1948,1949,1953,1957,1961,1969],{},[84,1950,796,1951,800],{},[24,1952,799],{},[84,1954,803,1955,205],{},[153,1956,806],{},[84,1958,809,1959,813],{},[24,1960,812],{},[84,1962,816,1963,820,1965,824,1967,205],{},[24,1964,819],{},[153,1966,823],{},[153,1968,827],{},[84,1970,830,1971,833],{},[24,1972,266],{},[10,1974,1975,839,1977,843],{},[24,1976,838],{},[153,1978,842],{},[53,1980,847,1981,851],{"id":846},[153,1982,850],{},[10,1984,854,1985,788],{},[24,1986,857],{},[10,1988,860,1989,864],{},[153,1990,863],{},[53,1992,868],{"id":867},[10,1994,871,1995,877],{},[24,1996,1997],{},[690,1998,876],{},[612,2000,2002],{"className":2001,"code":881,"language":617},[615],[153,2003,881],{"__ignoreMap":618},[10,2005,886,2006,890,2008,894],{},[153,2007,889],{},[153,2009,893],{},[33,2011],{},[36,2013,900],{"id":899},[10,2015,903,2016,906],{},[153,2017,652],{},[53,2019,910],{"id":909},[10,2021,913,2022,917],{},[153,2023,916],{},[53,2025,921],{"id":920},[250,2027,2028,2034,2038],{},[84,2029,2030,929,2032,932],{},[24,2031,928],{},[153,2033,842],{},[84,2035,2036,938],{},[24,2037,937],{},[84,2039,2040,944],{},[24,2041,943],{},[10,2043,947,2044,951,2046,231],{},[24,2045,950],{},[24,2047,954],{},[33,2049],{},[36,2051,960],{"id":959},[10,2053,963,2054,535],{},[24,2055,966],{},[280,2057,2058,2066],{},[283,2059,2060],{},[286,2061,2062,2064],{},[289,2063,975],{},[289,2065,978],{},[302,2067,2068,2074,2082,2088,2094],{},[286,2069,2070,2072],{},[307,2071,985],{},[307,2073,988],{},[286,2075,2076,2078],{},[307,2077,993],{},[307,2079,996,2080,1000],{},[153,2081,999],{},[286,2083,2084,2086],{},[307,2085,1005],{},[307,2087,1008],{},[286,2089,2090,2092],{},[307,2091,1013],{},[307,2093,1016],{},[286,2095,2096,2098],{},[307,2097,1021],{},[307,2099,1024],{},[10,2101,2102],{},[13,2103],{"alt":1029,"src":1030},[33,2105],{},[36,2107,1036],{"id":1035},[10,2109,1039,2110,1043],{},[24,2111,1042],{},[10,2113,1046,2114,1050,2116,1054,2118,1058,2120,1062,2122,1066],{},[24,2115,1049],{},[24,2117,1053],{},[24,2119,1057],{},[24,2121,1061],{},[24,2123,1065],{},[53,2125,1070],{"id":1069},[81,2127,2128,2134],{},[84,2129,2130,1078,2132,231],{},[24,2131,1077],{},[24,2133,1081],{},[84,2135,2136,1087,2138,231],{},[24,2137,1086],{},[24,2139,1090],{},[10,2141,1093,2142,1097,2144,1101],{},[24,2143,1096],{},[24,2145,1100],{},[33,2147],{},[53,2149,1107],{"id":1106},[10,2151,1110,2152,1114,2154,1118],{},[24,2153,1113],{},[24,2155,1117],{},[10,2157,1121],{},[81,2159,2160,2166,2168],{},[84,2161,1126,2162,1130,2164,1134],{},[24,2163,1129],{},[24,2165,1133],{},[84,2167,1137],{},[84,2169,1140,2170,1144],{},[24,2171,1143],{},[10,2173,1147,2174,1151,2176,1155],{},[24,2175,1150],{},[24,2177,1154],{},[10,2179,2180],{},[13,2181],{"alt":1160,"src":1161},[33,2183],{},[53,2185,1167],{"id":1166},[10,2187,1170,2188,1174,2190,1178,2192,1182,2194,1186],{},[24,2189,1173],{},[24,2191,1177],{},[24,2193,1181],{},[24,2195,1185],{},[10,2197,1189,2198,1193,2200,1197],{},[24,2199,1192],{},[24,2201,1196],{},[33,2203],{},[53,2205,1203],{"id":1202},[10,2207,1206,2208,1210,2210,1214,2212,1218,2214,1225],{},[24,2209,1209],{},[24,2211,1213],{},[24,2213,1217],{},[24,2215,1221,2216,1224],{},[153,2217,842],{},[10,2219,1228,2220,1232,2222,1236],{},[24,2221,1231],{},[24,2223,1235],{},[33,2225],{},[53,2227,1242],{"id":1241},[10,2229,1245,2230,1249,2232,1253,2234,1257,2236,1261],{},[24,2231,1248],{},[24,2233,1252],{},[24,2235,1256],{},[24,2237,1260],{},[10,2239,1264,2240,231],{},[24,2241,1267],{},[33,2243],{},[36,2245,1273],{"id":1272},[280,2247,2248,2258],{},[283,2249,2250],{},[286,2251,2252,2254,2256],{},[289,2253,1282],{},[289,2255,1285],{},[289,2257,1288],{},[302,2259,2260,2268,2278,2288,2296,2304],{},[286,2261,2262,2264,2266],{},[307,2263,1295],{},[307,2265,1298],{},[307,2267,1301],{},[286,2269,2270,2272,2276],{},[307,2271,1306],{},[307,2273,2274,1311],{},[153,2275,155],{},[307,2277,1314],{},[286,2279,2280,2282,2286],{},[307,2281,1319],{},[307,2283,1322,2284],{},[24,2285,321],{},[307,2287,1327],{},[286,2289,2290,2292,2294],{},[307,2291,1332],{},[307,2293,1335],{},[307,2295,1338],{},[286,2297,2298,2300,2302],{},[307,2299,1343],{},[307,2301,1346],{},[307,2303,1349],{},[286,2305,2306,2308,2310],{},[307,2307,1354],{},[307,2309,1357],{},[307,2311,1360],{},[10,2313,1363,2314,1367],{},[24,2315,1366],{},[10,2317,1370,2318,1374,2320,1378],{},[24,2319,1373],{},[24,2321,1377],{},[18,2323,2324],{},[10,2325,1383,2326,1389,2329,1394],{},[242,2327,1388],{"href":1386,"rel":2328},[246],[242,2330,1393],{"href":1392},{"title":618,"searchDepth":1396,"depth":1396,"links":2332},[2333,2338,2339,2340,2341,2345,2350,2354,2355,2362],{"id":38,"depth":1396,"text":39,"children":2334},[2335,2336,2337],{"id":55,"depth":1401,"text":56},{"id":137,"depth":1401,"text":138},{"id":234,"depth":1401,"text":235},{"id":425,"depth":1396,"text":426},{"id":486,"depth":1396,"text":487},{"id":501,"depth":1396,"text":502},{"id":632,"depth":1396,"text":633,"children":2342},[2343,2344],{"id":656,"depth":1401,"text":657},{"id":682,"depth":1401,"text":683},{"id":758,"depth":1396,"text":759,"children":2346},[2347,2348,2349],{"id":776,"depth":1401,"text":1414},{"id":846,"depth":1401,"text":1416},{"id":867,"depth":1401,"text":868},{"id":899,"depth":1396,"text":900,"children":2351},[2352,2353],{"id":909,"depth":1401,"text":910},{"id":920,"depth":1401,"text":921},{"id":959,"depth":1396,"text":960},{"id":1035,"depth":1396,"text":1036,"children":2356},[2357,2358,2359,2360,2361],{"id":1069,"depth":1401,"text":1070},{"id":1106,"depth":1401,"text":1107},{"id":1166,"depth":1401,"text":1167},{"id":1202,"depth":1401,"text":1203},{"id":1241,"depth":1401,"text":1242},{"id":1272,"depth":1396,"text":1273},{},{"title":5,"description":1433},[1442,1443,1444],1780489852795]