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