[{"data":1,"prerenderedAt":1853},["ShallowReactive",2],{"blog-article-/zh/blog/foxycape-pdf-obsidian":3,"blog-list-zh":262},{"id":4,"title":5,"body":6,"config":246,"date":247,"description":248,"draft":249,"extension":250,"image":246,"meta":251,"navigation":252,"path":253,"seo":254,"stem":255,"tags":256,"toolbar":246,"translationKey":260,"updated":247,"__hash__":261},"blog/zh/blog/foxycape-pdf-obsidian.md","Foxycape PDF — 面向 Obsidian、与笔记连在一起的 PDF 阅读器",{"type":7,"value":8,"toc":229},"minimark",[9,17,23,26,30,33,52,55,58,62,65,71,74,77,82,86,89,117,122,126,129,134,139,142,154,159,162,165,170,174,177,182,185,192,197,200,203,208,213,217,224],[10,11,12],"p",{},[13,14],"img",{"alt":15,"src":16},"Foxycape PDF","https://cdn.linghuxiong.com/resources/obsidian/introduce/logo-64x64.png",[18,19,20],"blockquote",{},[10,21,22],{},"面向 Obsidian 的 PDF 阅读器：划线、引用与深度链接都能回到原文，和笔记工作流连在一起。",[24,25],"hr",{},[27,28,29],"h2",{"id":29},"为什么需要它",[10,31,32],{},"在 Obsidian 里读 PDF，笔记链路经常断掉：",[34,35,36,40,43,46,49],"ul",{},[37,38,39],"li",{},"划线留在 PDF 里，vault 笔记在另一边。",[37,41,42],{},"要图时只能截图，糊且难管理。",[37,44,45],{},"粘贴的摘录和图片很少能指回具体页或区域。",[37,47,48],{},"深色主题下，浅色 PDF 页很刺眼。",[37,50,51],{},"换阅读器后，已有的页码/选区链接可能失效。",[10,53,54],{},"Foxycape PDF 在 Obsidian 内补上这些缺口。",[27,56,57],{"id":57},"功能特点",[59,60,61],"h3",{"id":61},"划线同步笔记",[10,63,64],{},"不必让划线只留在 PDF 里。新建划线时，可自动创建或更新与 PDF 同名的 Markdown 笔记，追加带回链的摘录，并可选分屏打开；不需要时可在设置中关闭。",[10,66,67],{},[13,68],{"alt":69,"src":70},"","https://cdn.linghuxiong.com/resources/obsidian/introduce/highlight-notes.gif",[59,72,73],{"id":73},"提取内嵌高清图",[10,75,76],{},"不用靠模糊截图凑合。悬停内嵌图片（移动端用触控控件）即可预览、复制或下载原图。",[10,78,79],{},[13,80],{"alt":69,"src":81},"https://cdn.linghuxiong.com/resources/obsidian/introduce/embed-images.gif",[59,83,85],{"id":84},"文本与图片引用一键回源","文本与图片引用，一键回源",[10,87,88],{},"引用带着出处，之后还能从笔记跳回 PDF：",[34,90,91,106,109],{},[37,92,93,94,98,99,98,102,105],{},"复制文本引用为带深度链接的 Markdown（",[95,96,97],"code",{},"#page="," / ",[95,100,101],{},"#selection=",[95,103,104],{},"#markId=","）。",[37,107,108],{},"复制图片引用；粘贴到 Markdown 时自动保存 PNG 到 PDF 旁，并插入可点击链接。",[37,110,111,112,116],{},"右键笔记中的图片 → ",[113,114,115],"strong",{},"在 Foxycape 中打开","，回到对应页并高亮原始区域。",[10,118,119],{},[13,120],{"alt":69,"src":121},"https://cdn.linghuxiong.com/resources/obsidian/introduce/cite-and-back.gif",[59,123,125],{"id":124},"适配-obsidian-主题","适配 Obsidian 主题",[10,127,128],{},"深色 vault 里浅色 PDF 页往往刺眼。可选将灰度矢量色映射到主题前景/背景（BETA），范围可选全部 / 仅深色 / 仅浅色；彩色图与彩色矢量保持原色。",[10,130,131],{},[13,132],{"alt":69,"src":133},"https://cdn.linghuxiong.com/resources/obsidian/introduce/theme-adapt.gif",[10,135,136],{},[13,137],{"alt":69,"src":138},"https://cdn.linghuxiong.com/resources/obsidian/introduce/theme-adapt-dark.gif",[59,140,141],{"id":141},"兼容内置阅读器的位置与链接",[10,143,144,145,147,148,150,151,153],{},"换阅读器不该弄坏已有链接。兼容 Obsidian 的 ",[95,146,97],{},"、",[95,149,101],{},"，可设为默认 PDF 阅读器，已打开时复用标签，并支持 ",[95,152,104],{}," 精确定位划线。",[10,155,156],{},[13,157],{"alt":69,"src":158},"https://cdn.linghuxiong.com/resources/obsidian/introduce/compat-links.gif",[59,160,161],{"id":161},"划线样式与划线列表",[10,163,164],{},"支持荧光笔、波浪线、直线下划线及自定义颜色。划线列表可筛选、排序、跳转与删除。",[10,166,167],{},[13,168],{"alt":69,"src":169},"https://cdn.linghuxiong.com/resources/obsidian/introduce/annotations.gif",[59,171,173],{"id":172},"智能拷贝-自动去掉软换行","智能拷贝 — 自动去掉软换行",[10,175,176],{},"PDF 排版常把句子拦腰截断，复制后满是多余换行。照常选中并复制即可：Foxycape 会去掉这些软换行，粘贴成连贯段落，真正的段落分隔仍会保留。",[10,178,179],{},[13,180],{"alt":69,"src":181},"https://cdn.linghuxiong.com/resources/obsidian/introduce/smart-copy.gif",[59,183,184],{"id":184},"导航与搜索",[10,186,187,188,191],{},"目录、缩略图、页码跳转，以及文档内搜索（",[95,189,190],{},"Mod+F","），支持区分大小写 / 变音符号 / 全字匹配。搜索基于 PDF 文本层（无 OCR）。",[10,193,194],{},[13,195],{"alt":69,"src":196},"https://cdn.linghuxiong.com/resources/obsidian/introduce/navigate-search.gif",[59,198,199],{"id":199},"阅读布局",[10,201,202],{},"缩放（自动 / 适合页宽 / 百分比）、纵向或横向滚动、单页 / 双页 / 书籍布局、页面旋转、密码 PDF。支持桌面与移动端。",[10,204,205],{},[13,206],{"alt":69,"src":207},"https://cdn.linghuxiong.com/resources/obsidian/introduce/layout.gif",[10,209,210],{},[13,211],{"alt":69,"src":212},"https://cdn.linghuxiong.com/resources/obsidian/introduce/layout-1.gif",[59,214,216],{"id":215},"设为默认-pdf-阅读器","设为默认 PDF 阅读器",[10,218,219,220,223],{},"建议在设置中开启 ",[113,221,222],{},"用作默认 PDF 查看器","，让 Obsidian 默认用 Foxycape 打开 PDF，深度链接、划线与主题适配等能力体验更完整。",[10,225,226],{},[13,227],{"alt":69,"src":228},"https://cdn.linghuxiong.com/resources/obsidian/introduce/set-default.gif",{"title":69,"searchDepth":230,"depth":230,"links":231},2,[232,233],{"id":29,"depth":230,"text":29},{"id":57,"depth":230,"text":57,"children":234},[235,237,238,239,240,241,242,243,244,245],{"id":61,"depth":236,"text":61},3,{"id":73,"depth":236,"text":73},{"id":84,"depth":236,"text":85},{"id":124,"depth":236,"text":125},{"id":141,"depth":236,"text":141},{"id":161,"depth":236,"text":161},{"id":172,"depth":236,"text":173},{"id":184,"depth":236,"text":184},{"id":199,"depth":236,"text":199},{"id":215,"depth":236,"text":216},null,"2026-08-11","划线、引用与深度链接都能回到原文——Foxycape PDF 让 Obsidian 里的阅读与笔记工作流连成一体。",false,"md",{},true,"/zh/blog/foxycape-pdf-obsidian",{"title":5,"description":248},"zh/blog/foxycape-pdf-obsidian",[257,258,259],"Obsidian","PDF","Foxycape","foxycape-pdf-obsidian","EPGy7l2TsOGF5kwaL5juDWPAxj_m6QIrsH879k4rxJw",[263,428],{"id":4,"title":5,"body":264,"config":246,"date":247,"description":248,"draft":249,"extension":250,"image":246,"meta":425,"navigation":252,"path":253,"seo":426,"stem":255,"tags":427,"toolbar":246,"translationKey":260,"updated":247,"__hash__":261},{"type":7,"value":265,"toc":410},[266,270,274,276,278,280,292,294,296,298,300,304,306,308,312,314,316,332,336,338,340,344,348,350,358,362,364,366,370,372,374,378,380,384,388,390,392,396,400,402,406],[10,267,268],{},[13,269],{"alt":15,"src":16},[18,271,272],{},[10,273,22],{},[24,275],{},[27,277,29],{"id":29},[10,279,32],{},[34,281,282,284,286,288,290],{},[37,283,39],{},[37,285,42],{},[37,287,45],{},[37,289,48],{},[37,291,51],{},[10,293,54],{},[27,295,57],{"id":57},[59,297,61],{"id":61},[10,299,64],{},[10,301,302],{},[13,303],{"alt":69,"src":70},[59,305,73],{"id":73},[10,307,76],{},[10,309,310],{},[13,311],{"alt":69,"src":81},[59,313,85],{"id":84},[10,315,88],{},[34,317,318,326,328],{},[37,319,93,320,98,322,98,324,105],{},[95,321,97],{},[95,323,101],{},[95,325,104],{},[37,327,108],{},[37,329,111,330,116],{},[113,331,115],{},[10,333,334],{},[13,335],{"alt":69,"src":121},[59,337,125],{"id":124},[10,339,128],{},[10,341,342],{},[13,343],{"alt":69,"src":133},[10,345,346],{},[13,347],{"alt":69,"src":138},[59,349,141],{"id":141},[10,351,144,352,147,354,150,356,153],{},[95,353,97],{},[95,355,101],{},[95,357,104],{},[10,359,360],{},[13,361],{"alt":69,"src":158},[59,363,161],{"id":161},[10,365,164],{},[10,367,368],{},[13,369],{"alt":69,"src":169},[59,371,173],{"id":172},[10,373,176],{},[10,375,376],{},[13,377],{"alt":69,"src":181},[59,379,184],{"id":184},[10,381,187,382,191],{},[95,383,190],{},[10,385,386],{},[13,387],{"alt":69,"src":196},[59,389,199],{"id":199},[10,391,202],{},[10,393,394],{},[13,395],{"alt":69,"src":207},[10,397,398],{},[13,399],{"alt":69,"src":212},[59,401,216],{"id":215},[10,403,219,404,223],{},[113,405,222],{},[10,407,408],{},[13,409],{"alt":69,"src":228},{"title":69,"searchDepth":230,"depth":230,"links":411},[412,413],{"id":29,"depth":230,"text":29},{"id":57,"depth":230,"text":57,"children":414},[415,416,417,418,419,420,421,422,423,424],{"id":61,"depth":236,"text":61},{"id":73,"depth":236,"text":73},{"id":84,"depth":236,"text":85},{"id":124,"depth":236,"text":125},{"id":141,"depth":236,"text":141},{"id":161,"depth":236,"text":161},{"id":172,"depth":236,"text":173},{"id":184,"depth":236,"text":184},{"id":199,"depth":236,"text":199},{"id":215,"depth":236,"text":216},{},{"title":5,"description":248},[257,258,259],{"id":429,"title":430,"body":431,"config":246,"date":1841,"description":1842,"draft":249,"extension":250,"image":246,"meta":1843,"navigation":252,"path":1844,"seo":1845,"stem":1846,"tags":1847,"toolbar":246,"translationKey":1851,"updated":1841,"__hash__":1852},"blog/zh/blog/zero-hallucination-qa.md","我是如何实现阅读器「零幻觉」问答的",{"type":7,"value":432,"toc":1807},[433,439,452,454,458,465,470,474,492,497,508,513,547,550,554,571,578,582,597,602,639,646,650,663,688,693,810,828,835,837,841,848,863,870,890,896,898,902,905,911,913,917,940,950,1010,1013,1024,1033,1040,1042,1046,1053,1059,1066,1070,1077,1085,1092,1096,1106,1149,1160,1166,1168,1172,1186,1194,1201,1204,1246,1256,1264,1270,1277,1281,1290,1296,1307,1309,1313,1319,1323,1330,1334,1357,1367,1369,1373,1379,1437,1443,1445,1449,1456,1479,1483,1503,1514,1516,1520,1531,1534,1557,1568,1574,1576,1580,1599,1610,1612,1616,1638,1649,1651,1655,1674,1680,1682,1686,1773,1780,1791],[10,434,435],{},[13,436],{"alt":437,"src":438},"封面：零幻觉问答","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[18,440,441],{},[10,442,443,444,447,448,451],{},"本文分享 AI 阅读器 ",[113,445,446],{},"零幻觉问答"," 的工程实现：回答严格基于当前书籍原文，关键论述可 ",[113,449,450],{},"一键溯源"," 到具体段落。如果你也在做 AI 阅读、文档 QA 或 RAG 类应用，希望三次迭代的经验与最终架构能有所参考。",[24,453],{},[27,455,457],{"id":456},"一实践历程三个阶段的演进","一、实践历程：三个阶段的演进",[10,459,460,461,464],{},"零幻觉问答并非一开始就设计完备，而是在 ",[113,462,463],{},"成本、延迟和准确率"," 的拉扯中逐步演进的。下面按时间顺序回顾三个阶段，便于理解当前架构为何长成这样。",[466,467],"mermaid",{":config":468,"code":469},"config","flowchart%20LR%0A%20%20%20%20P1%5B%E9%98%B6%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%98%B6%E6%AE%B5%E4%BA%8C%EF%BC%9ALLM%20%E6%8F%90%E5%8F%96%E5%85%B3%E9%94%AE%E5%8F%A5%5D%0A%20%20%20%20P2%20--%3E%20P3%5B%E9%98%B6%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%A3%80%E7%B4%A2%5D%0A%20%20%20%20P1%20-.-%3E%7C%E6%85%A2%E3%80%81%E8%B4%B5%E3%80%81%E9%95%BF%E4%B9%A6%E4%B8%8D%E5%87%86%7C%20X1%5B%E6%B7%98%E6%B1%B0%5D%0A%20%20%20%20P2%20-.-%3E%7C%E4%B8%A2%E7%BB%86%E8%8A%82%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%E5%BD%93%E5%89%8D%E6%96%B9%E6%A1%88%7C%20OK%5B%E9%9B%B6%E5%B9%BB%E8%A7%89%20%2B%20%E5%8F%AF%E6%BA%AF%E6%BA%90%5D",[59,471,473],{"id":472},"阶段一全文直塞-context最简单也最先暴露问题","阶段一：全文直塞 Context（最简单，也最先暴露问题）",[10,475,476,479,480,483,484,487,488,491],{},[113,477,478],{},"做法："," 用户打开一本书提问时，将提取出的 ",[113,481,482],{},"全部正文"," 放进 System Prompt 或 User 消息，交给对话模型作答。若全书超过约 ",[113,485,486],{},"40 万字符","，则 ",[113,489,490],{},"硬截断","——只保留前面一段，后续章节对模型不可见。",[10,493,494],{},[113,495,496],{},"优点：",[34,498,499,502,505],{},[37,500,501],{},"实现成本极低，几乎不需要预处理；",[37,503,504],{},"短书、结构简单的文档效果尚可——模型确实「看到了整本书」；",[37,506,507],{},"交互简单：问就能答，没有「请先等待分析」的等待态。",[10,509,510],{},[113,511,512],{},"缺点（很快变得不可接受）：",[34,514,515,521,527,537],{},[37,516,517,520],{},[113,518,519],{},"响应慢","：每次提问都要把海量文本送进模型，首 Token 延迟和总耗时随书长线性恶化；",[37,522,523,526],{},[113,524,525],{},"Token 成本高","：同一本书每问一次就重复付一遍全文的输入费用；",[37,528,529,532,533,536],{},[113,530,531],{},"长书严重失真","：超过 40 万字符后被截断，后半本、附录、结论章节等于不存在，且 UI 往往 ",[113,534,535],{},"没有明确告知"," 已截断；",[37,538,539,542,543,546],{},[113,540,541],{},"检索粒度为零","：模型要在几十万字里「大海捞针」，容易漏细节，也更容易产生 ",[113,544,545],{},"看似合理、实则无据"," 的概括——阅读场景最忌讳这类幻觉。",[10,548,549],{},"阶段一适合验证 MVP，不适合作为产品级方案。",[59,551,553],{"id":552},"阶段二用轻量-llm-提取关键句压缩-context但压缩得太狠","阶段二：用轻量 LLM 提取关键句（压缩 Context，但压缩得太狠）",[10,555,556,558,559,562,563,566,567,570],{},[113,557,478],{}," 在提问前（或首次打开书时），用 ",[113,560,561],{},"成本更低的模型"," 对正文做一轮预处理：按 Spine 分章（或整书分段），抽取 ",[113,564,565],{},"关键句","，输出时保留 ",[95,568,569],{},"[f文件-起始-结束]"," 形式的位置标记，再将摘录拼成较短文本，作为后续问答的 Context。",[10,572,573,574,577],{},"典型链路是 ",[113,575,576],{},"Extract → Cache → Chat","：先离线或按需跑一遍提取并落库，之后每次提问复用同一份「关键句合集」。这与很多文档 QA 原型里「先压缩文档、再拿压缩结果做 QA」的思路相同，也是我们在阶段二实际采用过的路线。",[10,579,580],{},[113,581,496],{},[34,583,584,591,594],{},[37,585,586,587,590],{},"每次提问送入模型的文本 ",[113,588,589],{},"明显缩短","，单次 Token 消耗较阶段一显著下降；",[37,592,593],{},"预处理结果可缓存，同一本书不必每次提问都重新提取；",[37,595,596],{},"已引入位置标记，为后续溯源打下基础。",[10,598,599],{},[113,600,601],{},"缺点（长书场景下依然扛不住）：",[34,603,604,610,620,629],{},[37,605,606,609],{},[113,607,608],{},"细节大量丢失","：「关键句」由模型主观筛选，论证链上的限定条件、反例等容易被丢掉，答案容易「正确但片面」；",[37,611,612,615,616,619],{},[113,613,614],{},"长书 Context 仍然偏大","：大部头作品即便只留关键句，拼接后的输入依然可观，",[113,617,618],{},"延迟和成本只是缓解，没有根治","；",[37,621,622,625,626,619],{},[113,623,624],{},"双重 LLM 误差","：提取阶段可能漏选，问答阶段又可能误读摘录，错误会 ",[113,627,628],{},"叠加",[37,630,631,634,635,638],{},[113,632,633],{},"静态 Context","：无论用户问的是某一章细节还是全书结构，送进模型的都是 ",[113,636,637],{},"同一份预提取文本","，无法按问题动态收窄范围。",[10,640,641,642,645],{},"这一阶段的教训很明确：",[113,643,644],{},"问题不在「有没有压缩」，而在「压缩是否按需、以及能否回到原文」","。",[59,647,649],{"id":648},"阶段三片段索引-tool-按需检索-原文回传当前方案","阶段三：片段索引 + Tool 按需检索 + 原文回传（当前方案）",[10,651,652,654,655,662],{},[113,653,478],{}," 基本思路参考了 ",[656,657,661],"a",{"href":658,"rel":659},"https://github.com/VectifyAI/PageIndex",[660],"nofollow","PageIndex","，相对阶段二，核心变化有三点：",[664,665,666,672,682],"ol",{},[37,667,668,671],{},[113,669,670],{},"预处理产物是结构化索引","（目录级摘要 + 精确字符 span），而不是把摘录直接当作问答 Context；",[37,673,674,677,678,681],{},[113,675,676],{},"每次提问由模型通过 Tool Calling 按需检索","，再 ",[113,679,680],{},"拉取带位置标记的原文"," 作答；",[37,683,684,687],{},[113,685,686],{},"System Prompt 与前端联动","，约束引用格式，并支持点击角标跳转、高亮原文。",[10,689,690],{},[113,691,692],{},"三阶段对比：",[694,695,696,715],"table",{},[697,698,699],"thead",{},[700,701,702,706,709,712],"tr",{},[703,704,705],"th",{},"维度",[703,707,708],{},"阶段一（全文直塞）",[703,710,711],{},"阶段二（关键句提取）",[703,713,714],{},"阶段三（当前）",[716,717,718,737,751,765,779,796],"tbody",{},[700,719,720,724,727,730],{},[721,722,723],"td",{},"单次提问 Context",[721,725,726],{},"全书（或截断后的前半本）",[721,728,729],{},"预提取关键句合集",[721,731,732,733,736],{},"仅与问题相关的少量 ",[113,734,735],{},"原文"," 片段",[700,738,739,742,745,748],{},[721,740,741],{},"长书准确性",[721,743,744],{},"超 40 万字符后严重下降",[721,746,747],{},"依赖提取质量，易丢细节",[721,749,750],{},"按目录/span 检索，不受全书长度硬截断",[700,752,753,756,759,762],{},[721,754,755],{},"响应速度",[721,757,758],{},"慢",[721,760,761],{},"略好，长书仍慢",[721,763,764],{},"检索 + 短 Context，明显更快",[700,766,767,770,773,776],{},[721,768,769],{},"Token 成本",[721,771,772],{},"极高",[721,774,775],{},"中等偏高",[721,777,778],{},"预处理摊销 + 按需付费",[700,780,781,784,787,790],{},[721,782,783],{},"溯源能力",[721,785,786],{},"弱（难标注出处）",[721,788,789],{},"有位置标记，但内容已是二次筛选",[721,791,792,793],{},"角标对应 ",[113,794,795],{},"真实原文 span",[700,797,798,801,804,807],{},[721,799,800],{},"工程复杂度",[721,802,803],{},"低",[721,805,806],{},"中",[721,808,809],{},"高",[10,811,812,815,816,819,820,823,824,827],{},[113,813,814],{},"为何停在阶段三："," 阅读场景的零幻觉，关键不是「让模型看过尽量多的字」，而是 ",[113,817,818],{},"「作答前必须拿到与问题相关的原文证据」","。阶段一、二都在 Context ",[113,821,822],{},"体积"," 上做文章；阶段三把链路拆成 ",[113,825,826],{},"「索引（预处理）→ 检索（Tool）→ 取证（原文）→ 作答（约束生成）」","，才同时兼顾准确率、成本与可溯源性。",[10,829,830,831,834],{},"下文展开 ",[113,832,833],{},"阶段三"," 的实现细节。",[24,836],{},[27,838,840],{"id":839},"二问题定义阅读场景下幻觉比普通-chat-更致命","二、问题定义：阅读场景下，幻觉比普通 Chat 更致命",[10,842,843,844,847],{},"普通 ChatBot 偶发错误，用户往往可以容忍。但在 ",[113,845,846],{},"书籍 QA"," 里，幻觉的代价更高：",[34,849,850,857,860],{},[37,851,852,853,856],{},"用户问的是 ",[113,854,855],{},"这本书"," 说了什么，不是问模型的 parametric memory；",[37,858,859],{},"一句似是而非的「书中观点」，可能误导笔记、引用甚至二次传播；",[37,861,862],{},"没有出处，用户无法核实，产品信任很难建立。",[10,864,865,866,869],{},"因此，「零幻觉」在工程上落地为三条 ",[113,867,868],{},"可执行"," 的规则：",[664,871,872,878,884],{},[37,873,874,877],{},[113,875,876],{},"书内问题必须先查书","：凡可能与当前书籍相关的问题，模型必须先走检索（Tool），再组织答案；",[37,879,880,883],{},[113,881,882],{},"答案必须可溯源","：关键结论附带原文位置标记，前端可解析并跳转高亮；",[37,885,886,889],{},[113,887,888],{},"查不到就说查不到","：书中没有的内容应明确告知，而不是用通用知识冒充「书中观点」。",[10,891,892,893,895],{},"下文按 ",[113,894,833],{}," 的数据流，说明上述规则如何落地。",[24,897],{},[27,899,901],{"id":900},"三整体架构预处理-工具检索-约束生成-可点击溯源","三、整体架构：预处理 → 工具检索 → 约束生成 → 可点击溯源",[466,903],{":config":468,"code":904},"flowchart%20TB%0A%20%20%20%20subgraph%20prep%20%5B%E7%A6%BB%E7%BA%BF%2F%E9%A6%96%E6%AC%A1%E9%A2%84%E5%A4%84%E7%90%86%5D%0A%20%20%20%20%20%20%20%20A%5B%E6%8C%89%E7%9B%AE%E5%BD%95%E6%88%96%E9%95%BF%E5%BA%A6%E5%88%87%E5%88%86%E5%85%A8%E4%B9%A6%5D%20--%3E%20B%5BLLM%20%E7%94%9F%E6%88%90%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%E5%9C%B0%E6%8C%81%E4%B9%85%E5%8C%96%20Segment%20%E7%BC%93%E5%AD%98%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20ask%20%5B%E7%94%A8%E6%88%B7%E6%8F%90%E9%97%AE%5D%0A%20%20%20%20%20%20%20%20D%5B%E7%94%A8%E6%88%B7%E8%BE%93%E5%85%A5%E9%97%AE%E9%A2%98%5D%20--%3E%20E%7B%E5%B7%B2%E6%9C%89%20Segment%20%E7%BC%93%E5%AD%98%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%AF%A2%E9%97%AE%E6%98%AF%E5%90%A6%E9%A2%84%E5%A4%84%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%E6%B3%A8%E5%86%8C%20Tool%20Calling%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20retrieve%20%5B%E5%B7%A5%E5%85%B7%E6%A3%80%E7%B4%A2%5D%0A%20%20%20%20%20%20%20%20G%20--%3E%20H%7B%E9%97%AE%E9%A2%98%E7%B1%BB%E5%9E%8B%7D%0A%20%20%20%20%20%20%20%20H%20--%3E%7C%E5%85%A8%E4%B9%A6%E6%A6%82%E8%A7%88%2F%E4%B9%A6%E8%AF%84%7C%20I%5Bget_full_book_segment_summaries%5D%0A%20%20%20%20%20%20%20%20H%20--%3E%7C%E5%85%B7%E4%BD%93%E4%BA%8B%E5%AE%9E%2F%E4%BA%BA%E7%89%A9%2F%E7%AB%A0%E8%8A%82%7C%20J%5Bget_related_segment_summaries%5D%0A%20%20%20%20%20%20%20%20J%20--%3E%20K%5BLLM%20%E4%BB%8E%E6%91%98%E8%A6%81%E7%9B%AE%E5%BD%95%E4%B8%AD%E9%80%89%E7%9B%B8%E5%85%B3%E7%89%87%E6%AE%B5%20ID%5D%0A%20%20%20%20%20%20%20%20K%20--%3E%20L%5B%E6%8C%89%20span%20%E6%8B%89%E5%8F%96%E5%8E%9F%E6%96%87%20%2B%20%E4%BD%8D%E7%BD%AE%E6%A0%87%E8%AE%B0%5D%0A%20%20%20%20%20%20%20%20I%20--%3E%20M%5B%E6%8B%BC%E6%8E%A5%E5%85%A8%E4%B9%A6%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%E4%B8%8E%E5%B1%95%E7%A4%BA%5D%0A%20%20%20%20%20%20%20%20L%20--%3E%20N%5BTool%20%E7%BB%93%E6%9E%9C%E5%9B%9E%E4%BC%A0%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%BA%A6%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%E6%B5%81%E5%BC%8F%E8%BE%93%E5%87%BA%E7%AD%94%E6%A1%88%20%2B%20%E4%BD%8D%E7%BD%AE%E8%A7%92%E6%A0%87%5D%0A%20%20%20%20%20%20%20%20P%20--%3E%20Q%5B%E6%B8%B2%E6%9F%93%E5%8F%AF%E7%82%B9%E5%87%BB%E5%BC%95%E7%94%A8%E8%A7%92%E6%A0%87%5D%0A%20%20%20%20%20%20%20%20Q%20--%3E%20R%5B%E7%82%B9%E5%87%BB%20%E2%86%92%20%E9%A2%84%E8%A7%88%E5%8E%9F%E6%96%87%20%E2%86%92%20%E8%B7%B3%E8%BD%AC%E9%AB%98%E4%BA%AE%5D%0A%20%20%20%20end",[10,906,907,908,645],{},"核心思路可以概括为：",[113,909,910],{},"不让模型「凭记忆答题」，而是让它「先取证、再作答、并标注出处」",[24,912],{},[27,914,916],{"id":915},"四预处理把整本书变成可检索的片段索引","四、预处理：把整本书变成可检索的「片段索引」",[10,918,919,920,923,924,927,928,931,932,935,936,939],{},"若每次提问仍采用 ",[113,921,922],{},"阶段一"," 的全文 Context，长书必然爆 Token，检索粒度也过粗。阶段三的解法是：用户首次对某本书发起 AI 对话时，后台异步跑 ",[113,925,926],{},"片段摘要任务","，按 ",[113,929,930],{},"目录结构"," 或 ",[113,933,934],{},"文本长度"," 将全书切成若干 ",[95,937,938],{},"Segment","，为每个片段生成摘要，并持久化到本地 IndexedDB。",[10,941,942,943,945,946,949],{},"每个 ",[95,944,938],{}," 在数据结构上包含摘要与 ",[113,947,948],{},"正文物理位置","：",[694,951,952,962],{},[697,953,954],{},[700,955,956,959],{},[703,957,958],{},"字段",[703,960,961],{},"含义",[716,963,964,977,990,1000],{},[700,965,966,974],{},[721,967,968,98,971],{},[95,969,970],{},"startFileIndex",[95,972,973],{},"endFileIndex",[721,975,976],{},"Spine 文件索引（PDF 则每页一个文件）",[700,978,979,987],{},[721,980,981,98,984],{},[95,982,983],{},"startOffset",[95,985,986],{},"endOffset",[721,988,989],{},"字符级起止偏移",[700,991,992,997],{},[721,993,994],{},[95,995,996],{},"sequence",[721,998,999],{},"线性阅读顺序",[700,1001,1002,1007],{},[721,1003,1004],{},[95,1005,1006],{},"title",[721,1008,1009],{},"对应目录标题",[10,1011,1012],{},"切分策略兼顾精度与成本：单目录正文不超过约 20KB 时只总结该节点；同级目录会合并成批（15KB～20KB）再调用 LLM；无目录的大块正文则按 3～4 万字符区间切段。",[10,1014,1015,1016,1019,1020,1023],{},"摘要生成时的 System Prompt 会要求 ",[113,1017,1018],{},"保留原文位置标记","（格式 ",[95,1021,1022],{},"[f数字-数字-数字]","），以便后续 Tool 回传原文时，位置信息与 spine 字符偏移一致。核心约束如下：",[1025,1026,1031],"pre",{"className":1027,"code":1029,"language":1030,"meta":69},[1028],"language-text","如果总结内容与原文某段相关，须保留段末位置信息，格式 [f数字-数字-数字]（如 [f1-90-109]）。\n位置标记是整体，禁止修改、合并或省略其中的任何字符或数值。\n","text",[95,1032,1029],{"__ignoreMap":69},[10,1034,1035,1036,1039],{},"预处理完成后，问答不再依赖「整书 Context」，而是依赖 ",[113,1037,1038],{},"结构化片段索引","——这是长书场景下零幻觉的工程前提。",[24,1041],{},[27,1043,1045],{"id":1044},"五位置标记体系把出处编码进文本","五、位置标记体系：把「出处」编码进文本",[10,1047,1048,1049,1052],{},"零幻觉不仅要求内容来自原文，还要求 ",[113,1050,1051],{},"出处可机器解析、可在 UI 中跳转","。我们采用内联位置标记：",[1025,1054,1057],{"className":1055,"code":1056,"language":1030},[1028],"[f{fileIndex}-{startChar}-{endChar}]\n",[95,1058,1056],{"__ignoreMap":69},[10,1060,1061,1062,1065],{},"例如 ",[95,1063,1064],{},"[f5-123-165]"," 表示：第 5 个 Spine 文件（从 0 起算）中，字符偏移 123～165 的文本区间。",[59,1067,1069],{"id":1068},"_51-标记如何写入正文","5.1 标记如何写入正文",[10,1071,1072,1073,1076],{},"正文提取层在输出片段时，为每个小段在段末写入 ",[95,1074,1075],{},"[f{fileIndex}-{start}-{end}]","。示意：",[1025,1078,1083],{"className":1079,"code":1081,"language":1082,"meta":69},[1080],"language-typescript","const position = `[f${fileIndex}-${absOffset}-${absOffset + segment.length}]`;\nfileLines.push(segment.text.trim() + position);\n","typescript",[95,1084,1081],{"__ignoreMap":69},[10,1086,1087,1088,1091],{},"无论是预处理摘要还是 Tool 回传的原文摘录，位置信息都与 ",[113,1089,1090],{},"Spine 字符偏移"," 对齐，而不是让模型「估算页码」。",[59,1093,1095],{"id":1094},"_52-对模型输出的约束","5.2 对模型输出的约束",[10,1097,1098,1099,1105],{},"在组装 System Prompt 时，我们单独约定了 ",[113,1100,1101],{},[1102,1103,1104],"span",{},"Position Citation Rules","，核心五条：",[664,1107,1108,1118,1128,1134,1143],{},[37,1109,1110,1113,1114,1117],{},[113,1111,1112],{},"标准格式","：必须使用 ",[95,1115,1116],{},"[f_fileIndex-startChar-endChar]","，三段数字缺一不可；",[37,1119,1120,1123,1124,1127],{},[113,1121,1122],{},"只引用当前来源","：角标须 ",[113,1125,1126],{},"原样复制"," 自本轮 System/User 消息或 Tool 返回文本中的标记；",[37,1129,1130,1133],{},[113,1131,1132],{},"禁止伪造","：不得自行计算、修改或编造位置；",[37,1135,1136,1139,1140,619],{},[113,1137,1138],{},"宁缺毋滥","：当前上下文没有合法标记时，正常作答即可，",[113,1141,1142],{},"不要输出任何位置标记",[37,1144,1145,1148],{},[113,1146,1147],{},"紧跟论述","：标记须紧跟相关句段，禁止在文末堆砌引用清单。",[10,1150,1151,1152,1155,1156,1159],{},"前端展示前还会过滤模型偶发输出的 ",[113,1153,1154],{},"两段位"," 非法标记（如 ",[95,1157,1158],{},"[f1-293]","），避免无效角标进入 UI。",[10,1161,1162],{},[13,1163],{"alt":1164,"src":1165},"引用溯源弹窗","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[24,1167],{},[27,1169,1171],{"id":1170},"六tool-calling先检索再回答","六、Tool Calling：先检索，再回答",[10,1173,1174,1175,1178,1179,1182,1183,645],{},"当对话绑定某本书（存在 ",[95,1176,1177],{},"resourceId","，且 ",[95,1180,1181],{},"chatType === 'chat'","）时，每次生成前会向模型注册两个 Tool，并挂载对应的 executor。整体遵循 OpenAI 兼容的 ",[113,1184,1185],{},"function calling 循环",[59,1187,1189,1190,1193],{"id":1188},"_61-get_related_segment_summaries-针对具体问题查片段","6.1 ",[95,1191,1192],{},"get_related_segment_summaries"," —— 针对具体问题查片段",[10,1195,1196,1197,1200],{},"适用于：概念、人物、情节、章节细节等 ",[113,1198,1199],{},"有明确检索意图"," 的问题。",[10,1202,1203],{},"流程简述：",[664,1205,1206,1213,1219,1226,1240],{},[37,1207,1208,1209,1212],{},"模型将用户口语 ",[113,1210,1211],{},"改写为书中可能出现的术语","（System Prompt 中的「Optimize Search Queries」）；",[37,1214,1215,1216,619],{},"调用 Tool，传入 ",[95,1217,1218],{},"question",[37,1220,1221,1222,1225],{},"将所有片段摘要按 Token 预算 ",[113,1223,1224],{},"分批","（单批约 3 万 Token，最多 5 批）；",[37,1227,1228,1229,1232,1233,1236,1237,619],{},"每批发起一次 ",[113,1230,1231],{},"独立的 LLM 请求","，从 ",[95,1234,1235],{},"{ id, title, summary }"," 列表中选出相关片段 ID（最多 5 个），返回 JSON，形如 ",[95,1238,1239],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[37,1241,1242,1243,1245],{},"根据选中 Segment 的 span，从 Spine ",[113,1244,680],{},"（不是摘要），作为 Tool 结果回传。",[10,1247,1248,1251,1252,1255],{},[113,1249,1250],{},"关键设计：Tool 回传原文，而非摘要。"," 模型作答时看到的是真实段落 + 内联 ",[95,1253,1254],{},"[f…]","，避免「摘要 → 再概括」带来的漂移。",[59,1257,1259,1260,1263],{"id":1258},"_62-get_full_book_segment_summaries-全书概览类问题","6.2 ",[95,1261,1262],{},"get_full_book_segment_summaries"," —— 全书概览类问题",[10,1265,1266,1267,1200],{},"适用于：「总结全书」「点评这本书」「整体结构/主题」等 ",[113,1268,1269],{},"需要全局视野",[10,1271,1272,1273,1276],{},"按阅读顺序拼接所有片段的 ",[95,1274,1275],{},"summary"," 回传，避免逐段相关度筛选遗漏关键章节。",[59,1278,1280],{"id":1279},"_63-system-prompt书优先工具优先","6.3 System Prompt：书优先、工具优先",[10,1282,1283,1284,1289],{},"绑定书籍时，System Prompt 注入 ",[113,1285,1286],{},[1102,1287,1288],{},"Core Principles for Reading Assistant","，核心三条：",[1025,1291,1294],{"className":1292,"code":1293,"language":1030},[1028],"1. Book First, Tool First\n   - 任何可能与书籍相关的问题，必须先调用工具检索；\n   - 答案必须主要依据检索结果，禁止不检索就编造「书中内容」。\n\n2. General Knowledge as Fallback Only\n   - 仅当：纯闲聊 / 用户明确要求不用书 / 工具无结果时，才可使用通用知识；\n   - 若书中没有，必须先声明「书中未提及此内容」，再补充通用知识。\n\n3. Direct Style\n   - 直入主题，禁止「根据提供的材料…」「综上所述…」等套话。\n",[95,1295,1293],{"__ignoreMap":69},[10,1297,1298,1299,1302,1303,1306],{},"生成层实现标准 Tool 循环：",[95,1300,1301],{},"tool_calls"," → 执行 executor → 追加 ",[95,1304,1305],{},"role: tool"," → 继续请求，直到输出最终文本。启用 tools 时关闭 thinking 通道，避免与 function call 协议冲突。",[24,1308],{},[27,1310,1312],{"id":1311},"七前端溯源从角标到原文高亮","七、前端溯源：从角标到原文高亮",[10,1314,1315,1316,1318],{},"模型输出的 ",[95,1317,1064],{}," 不会直接展示，在渲染层转为可点击引用。",[59,1320,1322],{"id":1321},"_71-角标渲染","7.1 角标渲染",[10,1324,1325,1326,1329],{},"展示前将位置标记规范化为 Markdown 链接，例如 ",[95,1327,1328],{},"[1]([f5-123-165])","，再渲染为序号角标；同一位置多次出现时可去重，避免 UI 堆叠。",[59,1331,1333],{"id":1332},"_72-点击交互","7.2 点击交互",[664,1335,1336,1345,1351],{},[37,1337,1338,1341,1342,1344],{},[113,1339,1340],{},"首次点击","：解析 ",[95,1343,1254],{}," → 取 fileIndex 与字符偏移 → 从 Spine 原文提取文本 → 弹出预览（可带目录标题）；",[37,1346,1347,1350],{},[113,1348,1349],{},"再次点击同一角标","：关闭弹窗；",[37,1352,1353,1356],{},[113,1354,1355],{},"确认跳转","：打开阅读视图，按字符区间高亮。",[10,1358,1359,1360,1363,1364,645],{},"从模型复制的标记到用户看到的原文，中间 ",[113,1361,1362],{},"不经 LLM 二次加工","，溯源链路全程 ",[113,1365,1366],{},"确定、可复现",[24,1368],{},[27,1370,1372],{"id":1371},"八边界情况与诚实降级","八、边界情况与诚实降级",[10,1374,1375,1376,949],{},"零幻觉不等于「永远有答案」，而是 ",[113,1377,1378],{},"没有证据时不瞎编",[694,1380,1381,1391],{},[697,1382,1383],{},[700,1384,1385,1388],{},[703,1386,1387],{},"场景",[703,1389,1390],{},"行为",[716,1392,1393,1401,1413,1421,1429],{},[700,1394,1395,1398],{},[721,1396,1397],{},"片段摘要尚未生成",[721,1399,1400],{},"先提取全文做摘要",[700,1402,1403,1406],{},[721,1404,1405],{},"Tool 检索无结果",[721,1407,1408,1409,1412],{},"返回 ",[95,1410,1411],{},"(No relevant segment excerpts found…)","，模型应声明书中未提及",[700,1414,1415,1418],{},[721,1416,1417],{},"模型输出了非法两段位标记",[721,1419,1420],{},"前端过滤，不展示无效角标",[700,1422,1423,1426],{},[721,1424,1425],{},"用户纯闲聊",[721,1427,1428],{},"System Prompt 允许脱离书籍，用通用知识回答",[700,1430,1431,1434],{},[721,1432,1433],{},"导出对话",[721,1435,1436],{},"可将角标转为阅读器深链接，便于分享或归档",[10,1438,1439],{},[13,1440],{"alt":1441,"src":1442},"对话导出","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[24,1444],{},[27,1446,1448],{"id":1447},"九设计取舍为什么不用向量-rag","九、设计取舍：为什么不用「向量 RAG」？",[10,1450,1451,1452,1455],{},"做文档 QA 的同行常会问：既然要做检索增强，为什么不走 ",[113,1453,1454],{},"Embedding + 向量库 Top-K"," 这条标准路线？",[10,1457,1458,1459,1462,1463,1466,1467,1470,1471,1474,1475,1478],{},"实际上 ",[113,1460,1461],{},"我们也在做 RAG","——每次回答前都会先查书、再生成。差别在于：社区语境里的 RAG 往往默认包含 ",[113,1464,1465],{},"向量化与相似度检索","；当前方案是 ",[113,1468,1469],{},"「片段索引 + Tool 按需拉原文」","（阶段三），",[113,1472,1473],{},"刻意不引入向量层","。下面从 ",[113,1476,1477],{},"架构约束"," 说明取舍，并非否定向量 RAG 的价值。",[59,1480,1482],{"id":1481},"界定范围不是不用检索而是不用向量检索","界定范围：不是不用检索，而是不用「向量检索」",[34,1484,1485,1494],{},[37,1486,1487,1490,1491,645],{},[113,1488,1489],{},"广义 RAG","：检索相关材料 → 再生成 → ",[113,1492,1493],{},"我们在做",[37,1495,1496,1499,1500,645],{},[113,1497,1498],{},"向量 RAG","：召回依赖 Embedding 相似度 → ",[113,1501,1502],{},"当前版本不做",[10,1504,1505,1506,1509,1510,1513],{},"全书预处理为 ",[113,1507,1508],{},"片段摘要索引","；提问时模型通过 Tool 选段，再 ",[113,1511,1512],{},"回传原文","。检索增强存在，但不依赖单独的 embedding 模型与向量索引维护。",[24,1515],{},[59,1517,1519],{"id":1518},"原因一支持自定义-llm-provider配置链路要尽量短","原因一：支持自定义 LLM Provider，配置链路要尽量短",[10,1521,1522,1523,1526,1527,1530],{},"产品允许用户自由接入 ",[113,1524,1525],{},"自有 API Key","、自定义 Base URL，或使用 ",[113,1528,1529],{},"本地 Ollama","——对话模型由用户自选，成本和数据路径可控。这对很多自托管、多模型对比的场景是硬需求。",[10,1532,1533],{},"叠加典型向量 RAG 后，集成面会明显变宽：",[34,1535,1536,1547,1550],{},[37,1537,1538,1539,1542,1543,1546],{},"除 ",[113,1540,1541],{},"Chat 模型"," 外，通常还需 ",[113,1544,1545],{},"Embedding 模型","（另一 model name，有时还是另一个 endpoint）；",[37,1548,1549],{},"Ollama 等本地部署还要单独拉 embedding 模型，并处理维度、接口兼容；",[37,1551,1552,1553,1556],{},"故障域变复杂：Chat 正常但 ",[113,1554,1555],{},"检索为空"," 时，可能是 embedding、索引或维度不一致，排查成本高于「单 Provider 全链路」。",[10,1558,1559,1560,1563,1564,1567],{},"当前方案里，",[113,1561,1562],{},"选段与作答共用同一套 Provider 配置","，避免「Chat 用 A、建索引用 B」。若你在做 ",[113,1565,1566],{},"可插拔 LLM"," 的应用，这往往比多几个点的召回率更重要。",[10,1569,1570],{},[13,1571],{"alt":1572,"src":1573},"自定义 AI 服务商","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[24,1575],{},[59,1577,1579],{"id":1578},"原因二embedding-与索引强绑定切换-provider-成本高","原因二：Embedding 与索引强绑定，切换 Provider 成本高",[10,1581,1582,1583,1586,1587,1590,1591,1594,1595,1598],{},"向量 RAG 里常被低估的一点：",[113,1584,1585],{},"向量不是通用中间格式，而是某个 embedding 模型下的坐标。"," 建库用模型 A、查询用模型 B 时，相似度通常 ",[113,1588,1589],{},"不可比","——换模型往往意味着 ",[113,1592,1593],{},"全书重新向量化","，且不同模型的 ",[113,1596,1597],{},"向量维度","（768 / 1024 / 1536 …）会绑死存储 schema。",[10,1600,1601,1602,1605,1606,1609],{},"阶段三持久化的是 ",[113,1603,1604],{},"结构化摘要 + 字符 span","，不存向量；切换 Chat 模型时 ",[113,1607,1608],{},"无需重建索引","，证据链（原文位置）不变。这与「用户随时对比不同 LLM」的目标更一致。",[24,1611],{},[59,1613,1615],{"id":1614},"原因三有目录的长文档结构化路由往往已够用","原因三：有目录的长文档，结构化路由往往已够用",[10,1617,1618,1619,1622,1623,1626,1627,1630,1631,1637],{},"电子书、PDF 通常有 ",[113,1620,1621],{},"章节结构","；预处理已产出 ",[113,1624,1625],{},"段标题 + 摘要","。对「某一章讲了什么」「书中如何定义某概念」类问题，在摘要目录上选段再 ",[113,1628,1629],{},"拉回原文","，实践中效果稳定；且 Tool 回传的是 ",[113,1632,1633,1634,1636],{},"带 ",[95,1635,1254],{}," 的原文","，零幻觉仍锚定在字符 span 上。",[10,1639,1640,1641,1644,1645,1648],{},"向量检索在语义模糊、跨语言、长段落字面匹配等场景仍有优势；在 ",[113,1642,1643],{},"有 TOC、可预处理、要强溯源"," 的阅读器里，优先把复杂度放在 ",[113,1646,1647],{},"Tool + 原文回传 + 引用约束"," 上，ROI 通常更高。",[24,1650],{},[59,1652,1654],{"id":1653},"后续方向混合召回而非推倒重来","后续方向：混合召回，而非推倒重来",[10,1656,1657,1658,1661,1662,1665,1666,1669,1670,1673],{},"不排除将来增加 ",[113,1659,1660],{},"向量粗召回","（例如 embedding 只筛 Top-N 候选章节），最终仍走 ",[113,1663,1664],{},"选段 → 原文回传 → 可点击溯源","，零幻觉规则不变。若引入，会尽量满足：Embedding ",[113,1667,1668],{},"可选","、换模型时 ",[113,1671,1672],{},"显式提示重建索引","，避免 silent wrong retrieval。",[10,1675,1676,1677,645],{},"在此之前，优先保证：",[113,1678,1679],{},"任意 OpenAI 兼容 Chat API 即可工作，换 Chat 模型不必重建本地索引",[24,1681],{},[27,1683,1685],{"id":1684},"十小结","十、小结",[694,1687,1688,1701],{},[697,1689,1690],{},[700,1691,1692,1695,1698],{},[703,1693,1694],{},"环节",[703,1696,1697],{},"手段",[703,1699,1700],{},"作用",[716,1702,1703,1714,1727,1740,1751,1762],{},[700,1704,1705,1708,1711],{},[721,1706,1707],{},"预处理",[721,1709,1710],{},"按目录/长度切分 + 片段摘要缓存",[721,1712,1713],{},"长书可检索、可定位",[700,1715,1716,1719,1724],{},[721,1717,1718],{},"位置标记",[721,1720,1721,1723],{},[95,1722,569],{}," 写入原文",[721,1725,1726],{},"出处可机器解析",[700,1728,1729,1732,1737],{},[721,1730,1731],{},"Tool 检索",[721,1733,1734,1735],{},"按问题查片段/全书摘要，回传 ",[113,1736,735],{},[721,1738,1739],{},"作答前强制取证",[700,1741,1742,1745,1748],{},[721,1743,1744],{},"System Prompt",[721,1746,1747],{},"书优先、禁止伪造角标、查不到要说",[721,1749,1750],{},"约束生成行为",[700,1752,1753,1756,1759],{},[721,1754,1755],{},"前端溯源",[721,1757,1758],{},"角标 → 预览 → 跳转高亮",[721,1760,1761],{},"用户可核验证据",[700,1763,1764,1767,1770],{},[721,1765,1766],{},"不用向量检索",[721,1768,1769],{},"单 Provider、换 Chat 模型无需重建索引",[721,1771,1772],{},"降低集成与迁移成本",[10,1774,1775,1776,1779],{},"「零幻觉」不是指望模型从不犯错，而是 ",[113,1777,1778],{},"用工程结构把输出锁在证据链上","：没有检索结果就不应冒充书中内容；有检索结果则应给出可核验的原文位置。",[10,1781,1782,1783,1786,1787,1790],{},"若你也在做 AI 阅读或文档 QA，希望 ",[113,1784,1785],{},"全文直塞 → 关键句提取 → Tool-First 按需检索"," 这条演进路径，以及 ",[113,1788,1789],{},"内联位置标记 + 原文回传"," 的做法，能作为可参考的一种实现。",[18,1792,1793],{},[10,1794,1795,1796,1801,1802,1806],{},"以上是我们在开发 ",[656,1797,1800],{"href":1798,"rel":1799},"https://reader.linghuxiong.com",[660],"令狐兄","（Foxycape）AI 阅读器实践心得，仅供参考。文末可前往 ",[656,1803,1805],{"href":1804},"/zh#download","下载页面"," 体验阅读器。",{"title":69,"searchDepth":230,"depth":230,"links":1808},[1809,1814,1815,1816,1817,1821,1828,1832,1833,1840],{"id":456,"depth":230,"text":457,"children":1810},[1811,1812,1813],{"id":472,"depth":236,"text":473},{"id":552,"depth":236,"text":553},{"id":648,"depth":236,"text":649},{"id":839,"depth":230,"text":840},{"id":900,"depth":230,"text":901},{"id":915,"depth":230,"text":916},{"id":1044,"depth":230,"text":1045,"children":1818},[1819,1820],{"id":1068,"depth":236,"text":1069},{"id":1094,"depth":236,"text":1095},{"id":1170,"depth":230,"text":1171,"children":1822},[1823,1825,1827],{"id":1188,"depth":236,"text":1824},"6.1 get_related_segment_summaries —— 针对具体问题查片段",{"id":1258,"depth":236,"text":1826},"6.2 get_full_book_segment_summaries —— 全书概览类问题",{"id":1279,"depth":236,"text":1280},{"id":1311,"depth":230,"text":1312,"children":1829},[1830,1831],{"id":1321,"depth":236,"text":1322},{"id":1332,"depth":236,"text":1333},{"id":1371,"depth":230,"text":1372},{"id":1447,"depth":230,"text":1448,"children":1834},[1835,1836,1837,1838,1839],{"id":1481,"depth":236,"text":1482},{"id":1518,"depth":236,"text":1519},{"id":1578,"depth":236,"text":1579},{"id":1614,"depth":236,"text":1615},{"id":1653,"depth":236,"text":1654},{"id":1684,"depth":230,"text":1685},"2026-06-03","分享 AI 阅读器零幻觉问答的工程实现：回答严格基于当前书籍原文，关键论述可一键溯源到具体段落。",{},"/zh/blog/zero-hallucination-qa",{"title":430,"description":1842},"zh/blog/zero-hallucination-qa",[1848,1849,1850],"阅读器","AI","技术","zero-hallucination-qa","eTMSHCpDay5ePBNbB3ZRWHkahVC0sdaI3zbi8opYj9E",1786513819709]