[{"data":1,"prerenderedAt":1848},["ShallowReactive",2],{"blog-article-/ru-ru/blog/foxycape-pdf-obsidian":3,"blog-list-ru-ru":270},{"id":4,"title":5,"body":6,"config":254,"date":255,"description":256,"draft":257,"extension":258,"image":254,"meta":259,"navigation":260,"path":261,"seo":262,"stem":263,"tags":264,"toolbar":254,"translationKey":268,"updated":255,"__hash__":269},"blog/ru-ru/blog/foxycape-pdf-obsidian.md","Foxycape PDF — PDF-ридер для Obsidian, связанный с вашими заметками",{"type":7,"value":8,"toc":237},"minimark",[9,17,23,26,31,34,53,56,60,65,68,74,78,81,86,90,93,121,126,130,133,138,143,147,159,164,168,171,176,180,183,188,192,199,204,208,211,216,221,225,232],[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],{},"PDF-ридер для Obsidian, связанный с вашими заметками — выделения, цитаты и глубокие ссылки, возвращающие к источнику.",[24,25],"hr",{},[27,28,30],"h2",{"id":29},"зачем","Зачем",[10,32,33],{},"Чтение PDF в Obsidian часто разрывает цикл работы с заметками:",[35,36,37,41,44,47,50],"ul",{},[38,39,40],"li",{},"Выделения остаются в PDF, а заметки vault — где-то отдельно.",[38,42,43],{},"Чтобы захватить рисунок, обычно приходится делать размытый скриншот.",[38,45,46],{},"Вставленные цитаты и изображения редко указывают на точную страницу или область.",[38,48,49],{},"Светлые страницы PDF резко контрастируют с тёмной темой vault.",[38,51,52],{},"Смена ридера может сломать уже используемые ссылки на страницы и выделения.",[10,54,55],{},"Foxycape PDF закрывает эти пробелы, не заставляя покидать Obsidian.",[27,57,59],{"id":58},"возможности","Возможности",[61,62,64],"h3",{"id":63},"выделение-синхронизация-с-заметкой","Выделение → синхронизация с заметкой",[10,66,67],{},"Вместо того чтобы оставлять выделения только в PDF, каждое новое выделение может создавать или обновлять Markdown-заметку с тем же именем, добавлять фрагмент с обратной ссылкой и при необходимости открывать эту заметку в разделённой панели. Отключите в любой момент в настройках.",[10,69,70],{},[13,71],{"alt":72,"src":73},"","https://cdn.linghuxiong.com/resources/obsidian/introduce/highlight-notes.gif",[61,75,77],{"id":76},"извлечение-встроенных-изображений","Извлечение встроенных изображений",[10,79,80],{},"Забудьте о размытых скриншотах. Наведите курсор на встроенное изображение (или используйте сенсорное управление на мобильном), чтобы просмотреть, скопировать или скачать оригинал.",[10,82,83],{},[13,84],{"alt":72,"src":85},"https://cdn.linghuxiong.com/resources/obsidian/introduce/embed-images.gif",[61,87,89],{"id":88},"цитировать-текст-и-изображения-затем-вернуться","Цитировать текст и изображения, затем вернуться",[10,91,92],{},"Цитаты остаются привязанными к источнику, поэтому позже можно вернуться из заметки:",[35,94,95,110,113],{},[38,96,97,98,102,103,102,106,109],{},"Скопируйте текстовую цитату как Markdown с глубокой ссылкой (",[99,100,101],"code",{},"#page="," / ",[99,104,105],{},"#selection=",[99,107,108],{},"#markId=",").",[38,111,112],{},"Скопируйте цитату изображения; вставьте в Markdown, чтобы сохранить PNG рядом с PDF и вставить кликабельную ссылку.",[38,114,115,116,120],{},"Щёлкните правой кнопкой по изображению в заметке → ",[117,118,119],"strong",{},"Открыть в Foxycape",", чтобы вернуться на страницу и подсветить исходную область.",[10,122,123],{},[13,124],{"alt":72,"src":125},"https://cdn.linghuxiong.com/resources/obsidian/introduce/cite-and-back.gif",[61,127,129],{"id":128},"страницы-pdf-с-учётом-темы","Страницы PDF с учётом темы",[10,131,132],{},"Светлые страницы PDF могут конфликтовать с тёмным vault. При необходимости переназначьте векторные оттенки серого на цвета переднего плана и фона вашей темы (BETA) — для всех тем, только тёмных или только светлых. Цветные иллюстрации остаются без изменений.",[10,134,135],{},[13,136],{"alt":72,"src":137},"https://cdn.linghuxiong.com/resources/obsidian/introduce/theme-adapt.gif",[10,139,140],{},[13,141],{"alt":72,"src":142},"https://cdn.linghuxiong.com/resources/obsidian/introduce/theme-adapt-dark.gif",[61,144,146],{"id":145},"совместимость-со-встроенными-pdf-ссылками-obsidian","Совместимость со встроенными PDF-ссылками Obsidian",[10,148,149,150,152,153,155,156,158],{},"Смена ридера не должна ломать уже существующие ссылки. Foxycape понимает ",[99,151,101],{}," и ",[99,154,105],{}," в стиле Obsidian, может стать PDF-просмотрщиком по умолчанию, при возможности повторно использует открытую вкладку и добавляет ",[99,157,108],{}," для точного перехода к выделениям.",[10,160,161],{},[13,162],{"alt":72,"src":163},"https://cdn.linghuxiong.com/resources/obsidian/introduce/compat-links.gif",[61,165,167],{"id":166},"выделения-и-список-выделений","Выделения и список выделений",[10,169,170],{},"Маркер, волнистое и прямое подчёркивание с настраиваемыми цветами. Просматривайте выделения в списке — фильтруйте, сортируйте, переходите или удаляйте.",[10,172,173],{},[13,174],{"alt":72,"src":175},"https://cdn.linghuxiong.com/resources/obsidian/introduce/annotations.gif",[61,177,179],{"id":178},"умное-копирование-удаление-мягких-переносов-строк","Умное копирование — удаление мягких переносов строк",[10,181,182],{},"Строки PDF часто вставляют жёсткие разрывы посередине предложения. Выделите текст и скопируйте как обычно: Foxycape убирает эти мягкие переносы, чтобы вставленный текст читался как непрерывная проза, сохраняя настоящие разрывы абзацев.",[10,184,185],{},[13,186],{"alt":72,"src":187},"https://cdn.linghuxiong.com/resources/obsidian/introduce/smart-copy.gif",[61,189,191],{"id":190},"навигация-и-поиск","Навигация и поиск",[10,193,194,195,198],{},"Оглавление (TOC), миниатюры страниц, выбор страницы и поиск в документе (",[99,196,197],{},"Mod+F",") с опциями регистра / диакритики / целого слова. Поиск использует текстовый слой PDF (без OCR).",[10,200,201],{},[13,202],{"alt":72,"src":203},"https://cdn.linghuxiong.com/resources/obsidian/introduce/navigate-search.gif",[61,205,207],{"id":206},"макет-чтения","Макет чтения",[10,209,210],{},"Масштаб (авто / по ширине страницы / в процентах), вертикальная или горизонтальная прокрутка, одиночный / разворот / книжный макет, поворот страниц, PDF с паролем. Работает на десктопе и мобильных устройствах.",[10,212,213],{},[13,214],{"alt":72,"src":215},"https://cdn.linghuxiong.com/resources/obsidian/introduce/layout.gif",[10,217,218],{},[13,219],{"alt":72,"src":220},"https://cdn.linghuxiong.com/resources/obsidian/introduce/layout-1.gif",[61,222,224],{"id":223},"установить-pdf-ридером-по-умолчанию","Установить PDF-ридером по умолчанию",[10,226,227,228,231],{},"Для наилучшего опыта — глубокие ссылки, выделения и страницы с учётом темы — включите ",[117,229,230],{},"Использовать как PDF-просмотрщик по умолчанию"," в настройках Foxycape, чтобы Obsidian по умолчанию открывал PDF через Foxycape.",[10,233,234],{},[13,235],{"alt":72,"src":236},"https://cdn.linghuxiong.com/resources/obsidian/introduce/set-default.gif",{"title":72,"searchDepth":238,"depth":238,"links":239},2,[240,241],{"id":29,"depth":238,"text":30},{"id":58,"depth":238,"text":59,"children":242},[243,245,246,247,248,249,250,251,252,253],{"id":63,"depth":244,"text":64},3,{"id":76,"depth":244,"text":77},{"id":88,"depth":244,"text":89},{"id":128,"depth":244,"text":129},{"id":145,"depth":244,"text":146},{"id":166,"depth":244,"text":167},{"id":178,"depth":244,"text":179},{"id":190,"depth":244,"text":191},{"id":206,"depth":244,"text":207},{"id":223,"depth":244,"text":224},null,"2026-08-11","Выделения, цитаты и глубокие ссылки, возвращающие к источнику — Foxycape PDF объединяет чтение и ведение заметок в Obsidian в один цикл.",false,"md",{},true,"/ru-ru/blog/foxycape-pdf-obsidian",{"title":5,"description":256},"ru-ru/blog/foxycape-pdf-obsidian",[265,266,267],"Obsidian","PDF","Foxycape","foxycape-pdf-obsidian","CYsGB1T8SzwJkO1GFGxxODcZc_GQ51O49tiq5hectEE",[271,436],{"id":4,"title":5,"body":272,"config":254,"date":255,"description":256,"draft":257,"extension":258,"image":254,"meta":433,"navigation":260,"path":261,"seo":434,"stem":263,"tags":435,"toolbar":254,"translationKey":268,"updated":255,"__hash__":269},{"type":7,"value":273,"toc":418},[274,278,282,284,286,288,300,302,304,306,308,312,314,316,320,322,324,340,344,346,348,352,356,358,366,370,372,374,378,380,382,386,388,392,396,398,400,404,408,410,414],[10,275,276],{},[13,277],{"alt":15,"src":16},[18,279,280],{},[10,281,22],{},[24,283],{},[27,285,30],{"id":29},[10,287,33],{},[35,289,290,292,294,296,298],{},[38,291,40],{},[38,293,43],{},[38,295,46],{},[38,297,49],{},[38,299,52],{},[10,301,55],{},[27,303,59],{"id":58},[61,305,64],{"id":63},[10,307,67],{},[10,309,310],{},[13,311],{"alt":72,"src":73},[61,313,77],{"id":76},[10,315,80],{},[10,317,318],{},[13,319],{"alt":72,"src":85},[61,321,89],{"id":88},[10,323,92],{},[35,325,326,334,336],{},[38,327,97,328,102,330,102,332,109],{},[99,329,101],{},[99,331,105],{},[99,333,108],{},[38,335,112],{},[38,337,115,338,120],{},[117,339,119],{},[10,341,342],{},[13,343],{"alt":72,"src":125},[61,345,129],{"id":128},[10,347,132],{},[10,349,350],{},[13,351],{"alt":72,"src":137},[10,353,354],{},[13,355],{"alt":72,"src":142},[61,357,146],{"id":145},[10,359,149,360,152,362,155,364,158],{},[99,361,101],{},[99,363,105],{},[99,365,108],{},[10,367,368],{},[13,369],{"alt":72,"src":163},[61,371,167],{"id":166},[10,373,170],{},[10,375,376],{},[13,377],{"alt":72,"src":175},[61,379,179],{"id":178},[10,381,182],{},[10,383,384],{},[13,385],{"alt":72,"src":187},[61,387,191],{"id":190},[10,389,194,390,198],{},[99,391,197],{},[10,393,394],{},[13,395],{"alt":72,"src":203},[61,397,207],{"id":206},[10,399,210],{},[10,401,402],{},[13,403],{"alt":72,"src":215},[10,405,406],{},[13,407],{"alt":72,"src":220},[61,409,224],{"id":223},[10,411,227,412,231],{},[117,413,230],{},[10,415,416],{},[13,417],{"alt":72,"src":236},{"title":72,"searchDepth":238,"depth":238,"links":419},[420,421],{"id":29,"depth":238,"text":30},{"id":58,"depth":238,"text":59,"children":422},[423,424,425,426,427,428,429,430,431,432],{"id":63,"depth":244,"text":64},{"id":76,"depth":244,"text":77},{"id":88,"depth":244,"text":89},{"id":128,"depth":244,"text":129},{"id":145,"depth":244,"text":146},{"id":166,"depth":244,"text":167},{"id":178,"depth":244,"text":179},{"id":190,"depth":244,"text":191},{"id":206,"depth":244,"text":207},{"id":223,"depth":244,"text":224},{},{"title":5,"description":256},[265,266,267],{"id":437,"title":438,"body":439,"config":254,"date":1836,"description":1837,"draft":257,"extension":258,"image":254,"meta":1838,"navigation":260,"path":1839,"seo":1840,"stem":1841,"tags":1842,"toolbar":254,"translationKey":1846,"updated":1836,"__hash__":1847},"blog/ru-ru/blog/zero-hallucination-qa.md","Как я реализовал «нулевую галлюцинацию» в Q&A читалки",{"type":7,"value":440,"toc":1802},[441,447,460,462,466,473,478,482,500,505,516,521,555,558,562,579,586,590,605,610,647,654,658,671,696,701,818,836,842,844,848,855,870,877,897,903,905,909,912,918,920,924,947,957,1017,1020,1031,1040,1047,1049,1053,1060,1066,1073,1077,1084,1092,1099,1103,1113,1156,1167,1173,1175,1179,1194,1202,1208,1211,1254,1264,1272,1278,1285,1289,1297,1303,1314,1316,1320,1326,1330,1337,1341,1364,1374,1376,1380,1386,1444,1449,1451,1455,1462,1481,1485,1505,1516,1518,1522,1533,1536,1559,1570,1576,1578,1582,1597,1608,1610,1614,1635,1645,1647,1651,1670,1676,1678,1682,1770,1777,1788],[10,442,443],{},[13,444],{"alt":445,"src":446},"Обложка: Q&A без галлюцинаций","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[18,448,449],{},[10,450,451,452,455,456,459],{},"В этой статье рассказываю об инженерной реализации ",[117,453,454],{},"Q&A без галлюцинаций"," в AI-читалке: ответы строго опираются на текст открытой книги, а ключевые утверждения можно ",[117,457,458],{},"проследить в один клик"," до конкретного фрагмента. Если вы делаете AI-чтение, document QA или RAG-приложения, надеюсь, три итерации опыта и финальная архитектура будут полезны.",[24,461],{},[27,463,465],{"id":464},"i-практический-путь-эволюция-в-три-этапа","I. Практический путь: эволюция в три этапа",[10,467,468,469,472],{},"Q&A без галлюцинаций не был спроектирован идеально с первого дня — он эволюционировал под давлением ",[117,470,471],{},"стоимости, задержки и точности",". Ниже — хронологический обзор трёх этапов, чтобы понять, почему текущая архитектура выглядит именно так.",[474,475],"mermaid",{":config":476,"code":477},"config","flowchart%20LR%0A%20%20%20%20P1%5B%D0%AD%D1%82%D0%B0%D0%BF%201%3A%20%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D0%B2%20%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%5D%20--%3E%20P2%5B%D0%AD%D1%82%D0%B0%D0%BF%202%3A%20LLM%20%D0%B8%D0%B7%D0%B2%D0%BB%D0%B5%D0%BA%D0%B0%D0%B5%D1%82%20%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D1%8B%D0%B5%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%5D%0A%20%20%20%20P2%20--%3E%20P3%5B%D0%AD%D1%82%D0%B0%D0%BF%203%3A%20%D0%98%D0%BD%D0%B4%D0%B5%D0%BA%D1%81%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%2B%20Tool-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%5D%0A%20%20%20%20P1%20-.-%3E%7C%D0%9C%D0%B5%D0%B4%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%2C%20%D0%B4%D0%BE%D1%80%D0%BE%D0%B3%D0%BE%2C%20%D0%BD%D0%B5%D1%82%D0%BE%D1%87%D0%BD%D0%BE%20%D0%BD%D0%B0%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0%D1%85%7C%20X1%5B%D0%9E%D1%82%D0%BA%D0%B0%D0%B7%5D%0A%20%20%20%20P2%20-.-%3E%7C%D0%9F%D0%BE%D1%82%D0%B5%D1%80%D1%8F%20%D0%B4%D0%B5%D1%82%D0%B0%D0%BB%D0%B5%D0%B9%2C%20%D0%B2%D1%81%D1%91%20%D0%B5%D1%89%D1%91%20%D0%BC%D0%B5%D0%B4%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%7C%20X2%5B%D0%9E%D1%82%D0%BA%D0%B0%D0%B7%5D%0A%20%20%20%20P3%20--%3E%7C%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B0%D1%8F%20%D1%81%D1%85%D0%B5%D0%BC%D0%B0%7C%20OK%5B%D0%9D%D1%83%D0%BB%D0%B5%D0%B2%D0%B0%D1%8F%20%D0%B3%D0%B0%D0%BB%D0%BB%D1%8E%D1%86%D0%B8%D0%BD%D0%B0%D1%86%D0%B8%D1%8F%20%2B%20%D1%82%D1%80%D0%B0%D1%81%D1%81%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C%5D",[61,479,481],{"id":480},"этап-1-весь-текст-в-context-самый-простой-и-первый-кто-сломался","Этап 1: Весь текст в Context (самый простой — и первый, кто сломался)",[10,483,484,487,488,491,492,495,496,499],{},[117,485,486],{},"Подход:"," Когда пользователь открывает книгу и задаёт вопрос, ",[117,489,490],{},"весь извлечённый основной текст"," помещается в System Prompt или User-сообщение, и диалоговая модель отвечает. Если книга превышает примерно ",[117,493,494],{},"400 000 символов",", выполняется ",[117,497,498],{},"жёсткое обрезание"," — остаётся только начало, последующие главы для модели невидимы.",[10,501,502],{},[117,503,504],{},"Плюсы:",[35,506,507,510,513],{},[38,508,509],{},"Очень низкая стоимость реализации, почти без предобработки;",[38,511,512],{},"На коротких книгах и простых документах работает неплохо — модель действительно «видела всю книгу»;",[38,514,515],{},"Простой UX: спросил — получил ответ, без состояния «подождите, пока мы анализируем».",[10,517,518],{},[117,519,520],{},"Минусы (быстро становятся неприемлемыми):",[35,522,523,529,535,545],{},[38,524,525,528],{},[117,526,527],{},"Медленные ответы:"," Каждый вопрос заново отправляет огромный объём текста; задержка до первого токена и общее время растут с длиной книги;",[38,530,531,534],{},[117,532,533],{},"Высокая стоимость токенов:"," За каждый вопрос вы платите за полный ввод текста книги;",[38,536,537,540,541,544],{},[117,538,539],{},"Длинные книги сильно искажаются:"," После 400 000 символов вторая половина, приложения и заключения для модели как бы не существуют — и UI часто ",[117,542,543],{},"не сообщает явно",", что произошло обрезание;",[38,546,547,550,551,554],{},[117,548,549],{},"Нулевая гранулярность поиска:"," Модель должна «найти иголку в стоге сена» среди сотен тысяч символов — легко упустить детали и проще получить ",[117,552,553],{},"правдоподобные обобщения без оснований"," — именно то, чего сценарий чтения должен избегать.",[10,556,557],{},"Этап 1 подходит для MVP, но не для продуктового решения.",[61,559,561],{"id":560},"этап-2-лёгкий-llm-извлекает-ключевые-предложения-сжатие-context-но-слишком-агрессивное","Этап 2: Лёгкий LLM извлекает ключевые предложения (сжатие Context — но слишком агрессивное)",[10,563,564,566,567,570,571,574,575,578],{},[117,565,486],{}," Перед Q&A (или при первом открытии книги) ",[117,568,569],{},"более дешёвая модель"," обрабатывает основной текст: разбивает по главам Spine (или сегментирует всю книгу), извлекает ",[117,572,573],{},"ключевые предложения",", сохраняет метки позиций вида ",[99,576,577],{},"[fфайл-начало-конец]",", затем склеивает выдержки в более короткий Context для последующего Q&A.",[10,580,581,582,585],{},"Типичный пайплайн: ",[117,583,584],{},"Extract → Cache → Chat",". Сначала один раз (офлайн или по запросу) выполняется извлечение и сохранение «набора ключевых предложений», затем он переиспользуется при каждом вопросе — та же идея, что во многих прототипах document QA: сначала сжать документ, потом отвечать.",[10,587,588],{},[117,589,504],{},[35,591,592,599,602],{},[38,593,594,595,598],{},"При каждом вопросе в модель уходит ",[117,596,597],{},"значительно меньше текста","; расход токенов на запрос заметно ниже, чем на этапе 1;",[38,600,601],{},"Результат предобработки можно кэшировать — для одной книги не нужно извлекать заново при каждом вопросе;",[38,603,604],{},"Уже введены метки позиций — основа для последующей трассировки.",[10,606,607],{},[117,608,609],{},"Минусы (на длинных книгах всё ещё не выдерживает):",[35,611,612,618,628,637],{},[38,613,614,617],{},[117,615,616],{},"Массовая потеря деталей:"," «Ключевые предложения» отбирает модель субъективно — ограничения, контрпримеры и звенья аргументации легко теряются, ответы становятся «верными, но односторонними»;",[38,619,620,623,624,627],{},[117,621,622],{},"Context на длинных книгах всё ещё велик:"," Даже только ключевые предложения для крупных произведений дают заметный объём — ",[117,625,626],{},"задержка и стоимость снижаются, но не решаются",";",[38,629,630,633,634,627],{},[117,631,632],{},"Двойная ошибка LLM:"," На этапе извлечения что-то может быть пропущено, на этапе Q&A выдержки могут быть неверно прочитаны — ошибки ",[117,635,636],{},"накапливаются",[38,638,639,642,643,646],{},[117,640,641],{},"Статический Context:"," Независимо от того, спрашивает ли пользователь о деталях одной главы или о структуре всей книги, модель всегда получает ",[117,644,645],{},"один и тот же предварительно извлечённый текст"," — без динамического сужения по вопросу.",[10,648,649,650,653],{},"Урок этого этапа ясен: дело не в «сжимать или нет», а в том, ",[117,651,652],{},"сжимается ли контент по запросу и можно ли вернуться к исходному тексту",".",[61,655,657],{"id":656},"этап-3-индекс-сегментов-tool-поиск-по-запросу-возврат-исходного-текста-текущая-схема","Этап 3: Индекс сегментов + Tool-поиск по запросу + возврат исходного текста (текущая схема)",[10,659,660,662,663,670],{},[117,661,486],{}," Основная идея заимствована из ",[664,665,669],"a",{"href":666,"rel":667},"https://github.com/VectifyAI/PageIndex",[668],"nofollow","PageIndex",". По сравнению с этапом 2 три ключевых изменения:",[672,673,674,680,690],"ol",{},[38,675,676,679],{},[117,677,678],{},"Результат предобработки — структурированный индекс"," (краткие описания на уровне оглавления + точные символьные span), а не выдержки, используемые напрямую как Context для Q&A;",[38,681,682,685,686,689],{},[117,683,684],{},"При каждом вопросе модель через Tool Calling ищет по запросу",", затем ",[117,687,688],{},"подтягивает исходный текст с метками позиций"," для ответа;",[38,691,692,695],{},[117,693,694],{},"System Prompt и фронтенд"," совместно задают формат цитирования и поддерживают переход по сноскам с подсветкой исходного текста.",[10,697,698],{},[117,699,700],{},"Сравнение трёх этапов:",[702,703,704,723],"table",{},[705,706,707],"thead",{},[708,709,710,714,717,720],"tr",{},[711,712,713],"th",{},"Измерение",[711,715,716],{},"Этап 1 (весь текст)",[711,718,719],{},"Этап 2 (ключевые предложения)",[711,721,722],{},"Этап 3 (текущий)",[724,725,726,745,759,773,787,804],"tbody",{},[708,727,728,732,735,738],{},[729,730,731],"td",{},"Context на один вопрос",[729,733,734],{},"Вся книга (или обрезанная первая половина)",[729,736,737],{},"Предварительно извлечённые ключевые предложения",[729,739,740,741,744],{},"Только ",[117,742,743],{},"исходные"," фрагменты, релевантные вопросу",[708,746,747,750,753,756],{},[729,748,749],{},"Точность на длинных книгах",[729,751,752],{},"Резко падает после ~400k символов",[729,754,755],{},"Зависит от качества извлечения, теряются детали",[729,757,758],{},"Поиск по оглавлению/span, без жёсткого обрезания всей книги",[708,760,761,764,767,770],{},[729,762,763],{},"Скорость ответа",[729,765,766],{},"Медленно",[729,768,769],{},"Немного лучше; длинные книги всё ещё медленно",[729,771,772],{},"Поиск + короткий Context — заметно быстрее",[708,774,775,778,781,784],{},[729,776,777],{},"Стоимость токенов",[729,779,780],{},"Очень высокая",[729,782,783],{},"Средне-высокая",[729,785,786],{},"Амортизированная предобработка + оплата по запросу",[708,788,789,792,795,798],{},[729,790,791],{},"Трассируемость",[729,793,794],{},"Слабая (сложно указать источник)",[729,796,797],{},"Метки есть, но контент уже вторично отфильтрован",[729,799,800,801],{},"Сноски соответствуют ",[117,802,803],{},"реальным исходным span",[708,805,806,809,812,815],{},[729,807,808],{},"Инженерная сложность",[729,810,811],{},"Низкая",[729,813,814],{},"Средняя",[729,816,817],{},"Высокая",[10,819,820,823,824,827,828,831,832,835],{},[117,821,822],{},"Почему остановились на этапе 3:"," Для сценария чтения «нулевая галлюцинация» — это не «показать модели как можно больше текста», а ",[117,825,826],{},"«перед ответом получить исходные доказательства, релевантные вопросу»",". Этапы 1–2 боролись с ",[117,829,830],{},"объёмом Context","; этап 3 разбивает цепочку на ",[117,833,834],{},"«индекс (предобработка) → поиск (Tool) → доказательства (исходный текст) → ответ (ограниченная генерация)»"," — и одновременно балансирует точность, стоимость и трассируемость.",[10,837,838,839,653],{},"Ниже — детали реализации ",[117,840,841],{},"этапа 3",[24,843],{},[27,845,847],{"id":846},"ii-постановка-задачи-в-qa-по-книге-галлюцинации-опаснее-чем-в-обычном-chat","II. Постановка задачи: в Q&A по книге галлюцинации опаснее, чем в обычном Chat",[10,849,850,851,854],{},"В обычном ChatBot пользователи часто терпят случайные ошибки. В ",[117,852,853],{},"Q&A по книге"," цена выше:",[35,856,857,864,867],{},[38,858,859,860,863],{},"Пользователь спрашивает, что говорит ",[117,861,862],{},"эта книга",", а не что хранится в parametric memory модели;",[38,865,866],{},"Одно правдоподобное «мнение из книги» может ввести в заблуждение заметки, цитаты и повторные публикации;",[38,868,869],{},"Без указания источника пользователь не может проверить — доверие к продукту сложно построить.",[10,871,872,873,876],{},"Поэтому «нулевая галлюцинация» в инженерии сводится к трём ",[117,874,875],{},"исполнимым"," правилам:",[672,878,879,885,891],{},[38,880,881,884],{},[117,882,883],{},"Вопросы о книге сначала ищут в книге:"," Всё, что может относиться к открытой книге, модель должна сначала прогнать через поиск (Tool), затем формировать ответ;",[38,886,887,890],{},[117,888,889],{},"Ответы должны быть трассируемы:"," Ключевые выводы сопровождаются метками позиций в исходном тексте, которые фронтенд может разобрать и по которым можно перейти с подсветкой;",[38,892,893,896],{},[117,894,895],{},"Если не нашли — так и сказать:"," Если в книге этого нет, нужно явно сообщить, а не выдавать общие знания за «мнение из книги».",[10,898,899,900,902],{},"Далее — по потоку данных ",[117,901,841],{},", как эти правила реализуются.",[24,904],{},[27,906,908],{"id":907},"iii-общая-архитектура-предобработка-tool-поиск-ограниченная-генерация-кликабельная-трассировка","III. Общая архитектура: предобработка → Tool-поиск → ограниченная генерация → кликабельная трассировка",[474,910],{":config":476,"code":911},"flowchart%20TB%0A%20%20%20%20subgraph%20prep%20%5B%D0%9E%D1%84%D0%BB%D0%B0%D0%B9%D0%BD%20%2F%20%D0%BF%D0%B5%D1%80%D0%B2%D0%B0%D1%8F%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%5D%0A%20%20%20%20%20%20%20%20A%5B%D0%A0%D0%B0%D0%B7%D0%B1%D0%B8%D1%82%D1%8C%20%D0%BA%D0%BD%D0%B8%D0%B3%D1%83%20%D0%BF%D0%BE%20%D0%BE%D0%B3%D0%BB%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%B8%D0%BB%D0%B8%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%B5%5D%20--%3E%20B%5BLLM%20%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B8%D1%80%D1%83%D0%B5%D1%82%20%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B5%20%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%5D%0A%20%20%20%20%20%20%20%20B%20--%3E%20C%5B%D0%9B%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5%20%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BA%D1%8D%D1%88%D0%B0%20Segment%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20ask%20%5B%D0%92%D0%BE%D0%BF%D1%80%D0%BE%D1%81%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%5D%0A%20%20%20%20%20%20%20%20D%5B%D0%92%D0%B2%D0%BE%D0%B4%20%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%5D%20--%3E%20E%7B%D0%95%D1%81%D1%82%D1%8C%20%D0%BA%D1%8D%D1%88%20Segment%3F%7D%0A%20%20%20%20%20%20%20%20E%20--%3E%7C%D0%9D%D0%B5%D1%82%7C%20F%5B%D0%98%D0%B7%D0%B2%D0%BB%D0%B5%D1%87%D1%8C%20%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%2F%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BB%D0%BE%D0%B6%D0%B8%D1%82%D1%8C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D1%83%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%D0%94%D0%B0%7C%20G%5B%D0%97%D0%B0%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20Tool%20Calling%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20retrieve%20%5BTool-%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%5D%0A%20%20%20%20%20%20%20%20G%20--%3E%20H%7B%D0%A2%D0%B8%D0%BF%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D0%B0%7D%0A%20%20%20%20%20%20%20%20H%20--%3E%7C%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%2F%20%D1%80%D0%B5%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F%7C%20I%5Bget_full_book_segment_summaries%5D%0A%20%20%20%20%20%20%20%20H%20--%3E%7C%D0%A4%D0%B0%D0%BA%D1%82%D1%8B%20%2F%20%D0%BF%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0%D0%B6%D0%B8%20%2F%20%D0%B3%D0%BB%D0%B0%D0%B2%D0%B0%7C%20J%5Bget_related_segment_summaries%5D%0A%20%20%20%20%20%20%20%20J%20--%3E%20K%5BLLM%20%D0%B2%D1%8B%D0%B1%D0%B8%D1%80%D0%B0%D0%B5%D1%82%20ID%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%D0%B8%D0%B7%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%20%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D1%85%20%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B9%5D%0A%20%20%20%20%20%20%20%20K%20--%3E%20L%5B%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C%20%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D0%BF%D0%BE%20span%20%2B%20%D0%BC%D0%B5%D1%82%D0%BA%D0%B8%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%B9%5D%0A%20%20%20%20%20%20%20%20I%20--%3E%20M%5B%D0%A1%D0%BA%D0%BB%D0%B5%D0%B8%D1%82%D1%8C%20%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D0%B5%20%D0%BE%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%B2%D1%81%D0%B5%D1%85%20%D1%81%D0%B5%D0%B3%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%5D%0A%20%20%20%20end%0A%0A%20%20%20%20subgraph%20answer%20%5B%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B8%20%D0%BE%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%5D%0A%20%20%20%20%20%20%20%20L%20--%3E%20N%5B%D0%A0%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D1%8B%20Tool%20%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%BE%20%D0%B2%20%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C%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%3A%20%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0%20%D1%86%D0%B8%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%5D%0A%20%20%20%20%20%20%20%20O%20--%3E%20P%5B%D0%9F%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%B2%D1%8B%D0%B9%20%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%2B%20%D1%81%D0%BD%D0%BE%D1%81%D0%BA%D0%B8%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D0%B9%5D%0A%20%20%20%20%20%20%20%20P%20--%3E%20Q%5B%D0%9E%D1%82%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%BA%D0%BB%D0%B8%D0%BA%D0%B0%D0%B1%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D1%85%20%D1%81%D0%BD%D0%BE%D1%81%D0%BE%D0%BA%5D%0A%20%20%20%20%20%20%20%20Q%20--%3E%20R%5B%D0%9A%D0%BB%D0%B8%D0%BA%20%E2%86%92%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BF%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80%20%E2%86%92%20%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4%20%D0%B8%20%D0%BF%D0%BE%D0%B4%D1%81%D0%B2%D0%B5%D1%82%D0%BA%D0%B0%5D%0A%20%20%20%20end",[10,913,914,915,653],{},"Ключевая идея: ",[117,916,917],{},"не давать модели «отвечать по памяти» — заставить её «сначала собрать доказательства, потом ответить и указать источники»",[24,919],{},[27,921,923],{"id":922},"iv-предобработка-превращаем-всю-книгу-в-индекс-сегментов-для-поиска","IV. Предобработка: превращаем всю книгу в «индекс сегментов» для поиска",[10,925,926,927,930,931,934,935,938,939,942,943,946],{},"Если при каждом вопросе использовать Context всей книги как на ",[117,928,929],{},"этапе 1",", длинные книги неизбежно переполнят бюджет токенов, а гранулярность поиска будет слишком грубой. Решение этапа 3: при первом AI-диалоге с книгой в фоне запускается ",[117,932,933],{},"задача кратких описаний сегментов"," — книга делится по ",[117,936,937],{},"структуре оглавления"," или ",[117,940,941],{},"длине текста"," на несколько ",[99,944,945],{},"Segment",", для каждого генерируется краткое описание, результат сохраняется локально в IndexedDB.",[10,948,949,950,952,953,956],{},"Каждый ",[99,951,945],{}," в структуре данных содержит краткое описание и ",[117,954,955],{},"физическую позицию в основном тексте",":",[702,958,959,969],{},[705,960,961],{},[708,962,963,966],{},[711,964,965],{},"Поле",[711,967,968],{},"Значение",[724,970,971,984,997,1007],{},[708,972,973,981],{},[729,974,975,102,978],{},[99,976,977],{},"startFileIndex",[99,979,980],{},"endFileIndex",[729,982,983],{},"Индекс файла Spine (для PDF — один файл на страницу)",[708,985,986,994],{},[729,987,988,102,991],{},[99,989,990],{},"startOffset",[99,992,993],{},"endOffset",[729,995,996],{},"Символьные смещения начала и конца",[708,998,999,1004],{},[729,1000,1001],{},[99,1002,1003],{},"sequence",[729,1005,1006],{},"Линейный порядок чтения",[708,1008,1009,1014],{},[729,1010,1011],{},[99,1012,1013],{},"title",[729,1015,1016],{},"Заголовок из оглавления",[10,1018,1019],{},"Стратегия разбиения балансирует точность и стоимость: если основной текст одного узла оглавления не превышает ~20 KB, суммируется только этот узел; узлы одного уровня могут объединяться в пакеты (15–20 KB) перед вызовом LLM; крупные блоки без оглавления режутся интервалами ~30–40k символов.",[10,1021,1022,1023,1026,1027,1030],{},"System Prompt при генерации кратких описаний требует ",[117,1024,1025],{},"сохранять встроенные метки позиций"," (формат ",[99,1028,1029],{},"[fчисло-число-число]","), чтобы при возврате исходного текста через Tool информация о позиции совпадала со смещениями символов Spine. Основное ограничение:",[1032,1033,1038],"pre",{"className":1034,"code":1036,"language":1037,"meta":72},[1035],"language-text","Если содержание краткого описания связано с фрагментом исходного текста, сохраните метку позиции в конце фрагмента в формате [fчисло-число-число] (например, [f1-90-109]).\nМетка позиции — единое целое; запрещено изменять, объединять или опускать любой символ или цифру.\n","text",[99,1039,1036],{"__ignoreMap":72},[10,1041,1042,1043,1046],{},"После предобработки Q&A опирается не на «Context всей книги», а на ",[117,1044,1045],{},"структурированный индекс сегментов"," — инженерная предпосылка «нулевой галлюцинации» для длинных книг.",[24,1048],{},[27,1050,1052],{"id":1051},"v-система-меток-позиций-кодируем-источник-в-текст","V. Система меток позиций: кодируем «источник» в текст",[10,1054,1055,1056,1059],{},"«Нулевая галлюцинация» требует не только контент из исходного текста, но и ",[117,1057,1058],{},"машинно разбираемый, переходимый в UI источник",". Используем встроенные метки:",[1032,1061,1064],{"className":1062,"code":1063,"language":1037},[1035],"[f{fileIndex}-{startChar}-{endChar}]\n",[99,1065,1063],{"__ignoreMap":72},[10,1067,1068,1069,1072],{},"Например, ",[99,1070,1071],{},"[f5-123-165]"," означает: в 5-м файле Spine (с нуля) символьный интервал 123–165.",[61,1074,1076],{"id":1075},"_51-как-метки-записываются-в-основной-текст","5.1 Как метки записываются в основной текст",[10,1078,1079,1080,1083],{},"Слой извлечения текста при выводе фрагментов дописывает в конец каждого небольшого сегмента ",[99,1081,1082],{},"[f{fileIndex}-{start}-{end}]",". Схема:",[1032,1085,1090],{"className":1086,"code":1088,"language":1089,"meta":72},[1087],"language-typescript","const position = `[f${fileIndex}-${absOffset}-${absOffset + segment.length}]`;\nfileLines.push(segment.text.trim() + position);\n","typescript",[99,1091,1088],{"__ignoreMap":72},[10,1093,1094,1095,1098],{},"И в кратких описаниях предобработки, и в выдержках исходного текста, возвращаемых Tool, позиции выровнены по ",[117,1096,1097],{},"символьным смещениям Spine",", а не по «оценочным номерам страниц» модели.",[61,1100,1102],{"id":1101},"_52-ограничения-на-вывод-модели","5.2 Ограничения на вывод модели",[10,1104,1105,1106,1112],{},"При сборке System Prompt отдельно задаются ",[117,1107,1108],{},[1109,1110,1111],"span",{},"Position Citation Rules"," — пять основных пунктов:",[672,1114,1115,1125,1135,1141,1150],{},[38,1116,1117,1120,1121,1124],{},[117,1118,1119],{},"Стандартный формат:"," Обязательно ",[99,1122,1123],{},"[f_fileIndex-startChar-endChar]","; все три числовые части обязательны;",[38,1126,1127,1130,1131,1134],{},[117,1128,1129],{},"Только из текущих источников:"," Сноски должны быть ",[117,1132,1133],{},"дословно скопированы"," из System/User-сообщений или возвратов Tool текущего хода;",[38,1136,1137,1140],{},[117,1138,1139],{},"Запрет подделки:"," Не вычислять, не изменять и не выдумывать позиции;",[38,1142,1143,1146,1147,627],{},[117,1144,1145],{},"Лучше опустить:"," Если в контексте нет допустимой метки — отвечать нормально, ",[117,1148,1149],{},"не выводить метки позиций",[38,1151,1152,1155],{},[117,1153,1154],{},"Сразу после утверждения:"," Метки следуют за соответствующим предложением; запрещены списки цитат в конце текста.",[10,1157,1158,1159,1162,1163,1166],{},"Перед отображением фронтенд также фильтрует случайные ",[117,1160,1161],{},"двухчастные"," недопустимые метки (например, ",[99,1164,1165],{},"[f1-293]","), чтобы в UI не попадали битые сноски.",[10,1168,1169],{},[13,1170],{"alt":1171,"src":1172},"Всплывающее окно трассировки цитаты","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[24,1174],{},[27,1176,1178],{"id":1177},"vi-tool-calling-сначала-поиск-потом-ответ","VI. Tool Calling: сначала поиск, потом ответ",[10,1180,1181,1182,1185,1186,1189,1190,1193],{},"Когда диалог привязан к книге (есть ",[99,1183,1184],{},"resourceId",", ",[99,1187,1188],{},"chatType === 'chat'","), перед каждой генерацией регистрируются два Tool с соответствующими executor — стандартный цикл ",[117,1191,1192],{},"function calling"," в стиле OpenAI.",[61,1195,1197,1198,1201],{"id":1196},"_61-get_related_segment_summaries-целевой-поиск-по-сегментам","6.1 ",[99,1199,1200],{},"get_related_segment_summaries"," — целевой поиск по сегментам",[10,1203,1204,1205,653],{},"Для: концепций, персонажей, сюжета, деталей глав — ",[117,1206,1207],{},"явное намерение поиска",[10,1209,1210],{},"Краткий поток:",[672,1212,1213,1220,1226,1233,1247],{},[38,1214,1215,1216,1219],{},"Модель перефразирует разговорную формулировку пользователя в ",[117,1217,1218],{},"термины, вероятно встречающиеся в книге"," («Optimize Search Queries» в System Prompt);",[38,1221,1222,1223,627],{},"Вызов Tool с параметром ",[99,1224,1225],{},"question",[38,1227,1228,1229,1232],{},"Все краткие описания сегментов ",[117,1230,1231],{},"батчами"," по бюджету токенов (~30k токенов на батч, максимум 5 батчей);",[38,1234,1235,1236,1239,1240,1243,1244,627],{},"Каждый батч — ",[117,1237,1238],{},"отдельный LLM-запрос",": из списка ",[99,1241,1242],{},"{ id, title, summary }"," выбираются релевантные ID сегментов (максимум 5), возвращается JSON вида ",[99,1245,1246],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[38,1248,1249,1250,1253],{},"По span выбранных Segment из Spine ",[117,1251,1252],{},"подтягивается исходный текст с метками позиций"," (не краткое описание) как результат Tool.",[10,1255,1256,1259,1260,1263],{},[117,1257,1258],{},"Ключевое проектное решение: Tool возвращает исходный текст, а не краткие описания."," Модель отвечает по реальным абзацам со встроенными ",[99,1261,1262],{},"[f…]",", избегая дрейфа «краткое описание → повторное обобщение».",[61,1265,1267,1268,1271],{"id":1266},"_62-get_full_book_segment_summaries-вопросы-об-обзоре-всей-книги","6.2 ",[99,1269,1270],{},"get_full_book_segment_summaries"," — вопросы об обзоре всей книги",[10,1273,1274,1275,653],{},"Для: «кратко перескажи книгу», «оцени эту книгу», «общая структура / темы» — ",[117,1276,1277],{},"глобальный обзор",[10,1279,1280,1281,1284],{},"Склеиваются поля ",[99,1282,1283],{},"summary"," всех сегментов в порядке чтения — чтобы не пропустить ключевые главы из-за отбора только по релевантности отдельных фрагментов.",[61,1286,1288],{"id":1287},"_63-system-prompt-книга-в-приоритете-инструменты-в-приоритете","6.3 System Prompt: книга в приоритете, инструменты в приоритете",[10,1290,1291,1292,956],{},"При привязанной книге применяется ",[117,1293,1294],{},[1109,1295,1296],{},"Core Principles for Reading Assistant",[1032,1298,1301],{"className":1299,"code":1300,"language":1037},[1035],"1. Book First, Tool First\n   - Любой вопрос, который может относиться к книге, сначала требует вызова Tool;\n   - Ответ должен опираться в основном на результаты поиска — запрещено выдумывать «содержание книги» без поиска.\n\n2. General Knowledge as Fallback Only\n   - Только для: свободной беседы / явного отказа пользователя от книги / пустого результата Tool;\n   - Если в книге этого нет — сначала заявить «в этой книге это не упоминается», затем при необходимости добавить общие знания.\n\n3. Direct Style\n   - Сразу к сути — без «на основе предоставленных материалов…», «в заключение…» и подобных шаблонов.\n",[99,1302,1300],{"__ignoreMap":72},[10,1304,1305,1306,1309,1310,1313],{},"Слой генерации реализует стандартный цикл Tool: ",[99,1307,1308],{},"tool_calls"," → выполнение executor → добавление ",[99,1311,1312],{},"role: tool"," → продолжение запроса до финального текста. При включённых tools канал thinking отключён, чтобы избежать конфликта с протоколом function call.",[24,1315],{},[27,1317,1319],{"id":1318},"vii-трассировка-на-фронтенде-от-сноски-к-подсветке-исходного-текста","VII. Трассировка на фронтенде: от сноски к подсветке исходного текста",[10,1321,1322,1323,1325],{},"Вывод модели ",[99,1324,1071],{}," не показывается как есть — слой рендеринга превращает его в кликабельные цитаты.",[61,1327,1329],{"id":1328},"_71-отрисовка-сносок","7.1 Отрисовка сносок",[10,1331,1332,1333,1336],{},"Перед показом метки позиций нормализуются в Markdown-ссылки, например ",[99,1334,1335],{},"[1]([f5-123-165])",", затем отображаются как нумерованные сноски; при повторении одной позиции — дедупликация, чтобы не загромождать UI.",[61,1338,1340],{"id":1339},"_72-клик","7.2 Клик",[672,1342,1343,1352,1358],{},[38,1344,1345,1348,1349,1351],{},[117,1346,1347],{},"Первый клик:"," Разбор ",[99,1350,1262],{}," → fileIndex и смещения символов → извлечение текста из Spine → всплывающий предпросмотр (опционально с заголовком из оглавления);",[38,1353,1354,1357],{},[117,1355,1356],{},"Повторный клик по той же сноске:"," Закрыть предпросмотр;",[38,1359,1360,1363],{},[117,1361,1362],{},"Подтверждение перехода:"," Открыть вид чтения, подсветить символьный интервал.",[10,1365,1366,1367,1370,1371,653],{},"От скопированной моделью метки до текста, который видит пользователь, цепочка ",[117,1368,1369],{},"не проходит через повторный вызов LLM"," — полностью ",[117,1372,1373],{},"детерминирована и воспроизводима",[24,1375],{},[27,1377,1379],{"id":1378},"viii-граничные-случаи-и-честная-деградация","VIII. Граничные случаи и честная деградация",[10,1381,1382,1383,956],{},"«Нулевая галлюцинация» ≠ «всегда есть ответ» — это ",[117,1384,1385],{},"нет доказательств, нет выдумки",[702,1387,1388,1398],{},[705,1389,1390],{},[708,1391,1392,1395],{},[711,1393,1394],{},"Сценарий",[711,1396,1397],{},"Поведение",[724,1399,1400,1408,1420,1428,1436],{},[708,1401,1402,1405],{},[729,1403,1404],{},"Краткие описания сегментов ещё не готовы",[729,1406,1407],{},"Сначала извлечь полный текст и выполнить суммирование",[708,1409,1410,1413],{},[729,1411,1412],{},"Tool ничего не нашёл",[729,1414,1415,1416,1419],{},"Вернуть ",[99,1417,1418],{},"(No relevant segment excerpts found…)","; модель должна заявить, что в книге не упоминается",[708,1421,1422,1425],{},[729,1423,1424],{},"Модель вывела недопустимую двухчастную метку",[729,1426,1427],{},"Фронтенд фильтрует; битые сноски не показываются",[708,1429,1430,1433],{},[729,1431,1432],{},"Свободная беседа пользователя",[729,1434,1435],{},"System Prompt разрешает общие знания вне книги",[708,1437,1438,1441],{},[729,1439,1440],{},"Экспорт диалога",[729,1442,1443],{},"Сноски можно превратить в deep link читалки для sharing или архива",[10,1445,1446],{},[13,1447],{"alt":1440,"src":1448},"https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[24,1450],{},[27,1452,1454],{"id":1453},"ix-компромисс-проектирования-почему-не-векторный-rag","IX. Компромисс проектирования: почему не «векторный RAG»?",[10,1456,1457,1458,1461],{},"Коллеги, делающие document QA, часто спрашивают: если вы делаете retrieval-augmented generation, почему не ",[117,1459,1460],{},"Embedding + векторная БД Top-K","?",[10,1463,1464,1465,1468,1469,1472,1473,1476,1477,1480],{},"На самом деле ",[117,1466,1467],{},"мы тоже делаем RAG"," — перед каждым ответом сначала ищем в книге, потом генерируем. Разница в том, что в сообществе «RAG» часто подразумевает ",[117,1470,1471],{},"векторизацию и поиск по сходству","; текущая схема — ",[117,1474,1475],{},"«индекс сегментов + Tool с подтягиванием исходного текста по запросу»"," (этап 3), ",[117,1478,1479],{},"намеренно без векторного слоя",". Ниже — архитектурные причины выбора, а не отрицание ценности векторного RAG.",[61,1482,1484],{"id":1483},"определение-границ-не-без-поиска-а-без-векторного-поиска","Определение границ: не «без поиска», а «без векторного поиска»",[35,1486,1487,1496],{},[38,1488,1489,1492,1493,653],{},[117,1490,1491],{},"Широкий RAG:"," найти материалы → сгенерировать → ",[117,1494,1495],{},"мы это делаем",[38,1497,1498,1501,1502,653],{},[117,1499,1500],{},"Векторный RAG:"," recall через сходство Embedding → ",[117,1503,1504],{},"в текущей версии не делаем",[10,1506,1507,1508,1511,1512,1515],{},"Предобработка всей книги даёт ",[117,1509,1510],{},"индекс кратких описаний сегментов","; при вопросе модель через Tool выбирает сегменты, затем ",[117,1513,1514],{},"получает исходный текст",". Retrieval-augmented generation есть, но без отдельной embedding-модели и поддержки векторного индекса.",[24,1517],{},[61,1519,1521],{"id":1520},"причина-1-поддержка-пользовательских-llm-provider-минимальная-цепочка-конфигурации","Причина 1: поддержка пользовательских LLM Provider — минимальная цепочка конфигурации",[10,1523,1524,1525,1528,1529,1532],{},"Продукт позволяет подключать ",[117,1526,1527],{},"собственный API Key",", custom Base URL или ",[117,1530,1531],{},"локальный Ollama"," — диалоговая модель на выбор пользователя, контроль стоимости и пути данных. Для многих self-hosted сценариев и сравнения моделей это жёсткое требование.",[10,1534,1535],{},"Типичный векторный RAG заметно расширяет поверхность интеграции:",[35,1537,1538,1549,1552],{},[38,1539,1540,1541,1544,1545,1548],{},"Помимо ",[117,1542,1543],{},"Chat-модели"," обычно нужна ",[117,1546,1547],{},"Embedding-модель"," (другое имя model, иногда другой endpoint);",[38,1550,1551],{},"Локальный Ollama требует отдельно подтянуть embedding-модель и решать вопросы размерности и совместимости API;",[38,1553,1554,1555,1558],{},"Расширяется область отказов: Chat работает, но ",[117,1556,1557],{},"поиск пуст"," — возможны проблемы embedding, индекса или несовпадения размерности; отладка сложнее, чем «один Provider на всю цепочку».",[10,1560,1561,1562,1565,1566,1569],{},"В текущей схеме ",[117,1563,1564],{},"выбор сегментов и ответ используют одну конфигурацию Provider"," — без «Chat на A, индекс на B». Для приложений с ",[117,1567,1568],{},"подключаемым LLM"," это часто важнее нескольких процентов recall.",[10,1571,1572],{},[13,1573],{"alt":1574,"src":1575},"Пользовательские AI-провайдеры","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[24,1577],{},[61,1579,1581],{"id":1580},"причина-2-embedding-жёстко-привязан-к-индексу-смена-provider-дорога","Причина 2: Embedding жёстко привязан к индексу — смена Provider дорога",[10,1583,1584,1585,1588,1589,1592,1593,1596],{},"В векторном RAG часто недооценивают: ",[117,1586,1587],{},"вектор — не универсальный промежуточный формат, а координаты в пространстве конкретной embedding-модели."," Индекс построен моделью A, запрос моделью B — сходство обычно ",[117,1590,1591],{},"несопоставимо","; смена модели часто означает ",[117,1594,1595],{},"полную повторную векторизацию книги",", а размерности (768 / 1024 / 1536 …) фиксируют схему хранения.",[10,1598,1599,1600,1603,1604,1607],{},"На этапе 3 сохраняются ",[117,1601,1602],{},"структурированные краткие описания + символьные span",", не векторы; при смене Chat-модели ",[117,1605,1606],{},"индекс перестраивать не нужно",", цепочка доказательств (позиции в исходном тексте) не меняется — это лучше согласуется с целью «в любой момент сравнивать разные LLM».",[24,1609],{},[61,1611,1613],{"id":1612},"причина-3-для-длинных-документов-с-оглавлением-структурированная-маршрутизация-часто-достаточна","Причина 3: для длинных документов с оглавлением структурированная маршрутизация часто достаточна",[10,1615,1616,1617,1620,1621,1624,1625,1628,1629,1634],{},"Электронные книги и PDF обычно имеют ",[117,1618,1619],{},"главную структуру","; предобработка даёт ",[117,1622,1623],{},"заголовки сегментов + краткие описания",". Для вопросов «что в главе X» или «как книга определяет Y» выбор сегментов из каталога и ",[117,1626,1627],{},"подтягивание исходного текста"," на практике работает стабильно; Tool возвращает ",[117,1630,1631,1632],{},"исходный текст с ",[99,1633,1262],{},", и «нулевая галлюцинация» по-прежнему привязана к символьным span.",[10,1636,1637,1638,1641,1642,653],{},"Векторный поиск силён при семантической неоднозначности, кросс-языковых запросах, длинных абзацах без буквального совпадения; для читалки с ",[117,1639,1640],{},"оглавлением, предобработкой и сильной трассируемостью"," ROI выше, когда сложность вкладывается в ",[117,1643,1644],{},"Tool + возврат исходного текста + правила цитирования",[24,1646],{},[61,1648,1650],{"id":1649},"дальнейшее-направление-гибридный-recall-а-не-переписывание-с-нуля","Дальнейшее направление: гибридный recall, а не переписывание с нуля",[10,1652,1653,1654,1657,1658,1661,1662,1665,1666,1669],{},"Не исключаем в будущем ",[117,1655,1656],{},"грубый векторный recall"," (например, embedding только для Top-N кандидатов глав), с финалом всё равно в ",[117,1659,1660],{},"выбор сегмента → исходный текст → кликабельная трассировка"," — правила «нулевой галлюцинации» не меняются. При внедрении постараемся: Embedding ",[117,1663,1664],{},"опционален",", при смене модели — ",[117,1667,1668],{},"явное предупреждение о перестройке индекса",", без silent wrong retrieval.",[10,1671,1672,1673,653],{},"До тех пор приоритет: ",[117,1674,1675],{},"работает любой OpenAI-совместимый Chat API; смена Chat-модели не требует перестройки локального индекса",[24,1677],{},[27,1679,1681],{"id":1680},"x-итог","X. Итог",[702,1683,1684,1697],{},[705,1685,1686],{},[708,1687,1688,1691,1694],{},[711,1689,1690],{},"Этап",[711,1692,1693],{},"Средство",[711,1695,1696],{},"Роль",[724,1698,1699,1710,1723,1737,1748,1759],{},[708,1700,1701,1704,1707],{},[729,1702,1703],{},"Предобработка",[729,1705,1706],{},"Разбиение по оглавлению/длине + кэш кратких описаний сегментов",[729,1708,1709],{},"Длинные книги доступны для поиска и локализации",[708,1711,1712,1715,1720],{},[729,1713,1714],{},"Метки позиций",[729,1716,1717,1719],{},[99,1718,577],{}," в исходном тексте",[729,1721,1722],{},"Машинно разбираемый источник",[708,1724,1725,1728,1734],{},[729,1726,1727],{},"Tool-поиск",[729,1729,1730,1731],{},"По вопросу — сегменты / краткие описания всей книги, возврат ",[117,1732,1733],{},"исходного текста",[729,1735,1736],{},"Принудительный сбор доказательств перед ответом",[708,1738,1739,1742,1745],{},[729,1740,1741],{},"System Prompt",[729,1743,1744],{},"Книга в приоритете, запрет поддельных сносок, честность при отсутствии",[729,1746,1747],{},"Ограничение генерации",[708,1749,1750,1753,1756],{},[729,1751,1752],{},"Фронтенд",[729,1754,1755],{},"Сноска → предпросмотр → переход и подсветка",[729,1757,1758],{},"Пользователь проверяет доказательства",[708,1760,1761,1764,1767],{},[729,1762,1763],{},"Без векторного поиска",[729,1765,1766],{},"Один Provider; смена Chat-модели без перестройки индекса",[729,1768,1769],{},"Ниже стоимость интеграции и миграции",[10,1771,1772,1773,1776],{},"«Нулевая галлюцинация» — не надежда, что модель никогда не ошибается, а ",[117,1774,1775],{},"инженерная фиксация вывода на цепочке доказательств",": нет результата поиска — не выдавать себя за содержание книги; есть результат поиска — дать проверяемые позиции в исходном тексте.",[10,1778,1779,1780,1783,1784,1787],{},"Если вы делаете AI-чтение или document QA, надеюсь, путь ",[117,1781,1782],{},"полный текст → ключевые предложения → Tool-first поиск по запросу",", а также подход ",[117,1785,1786],{},"встроенные метки позиций + возврат исходного текста"," будет полезной реализацией для ориентира.",[18,1789,1790],{},[10,1791,1792,1793,1797,1798,653],{},"Это наш опыт разработки AI-читалки ",[664,1794,267],{"href":1795,"rel":1796},"https://reader.linghuxiong.com",[668]," — только для справки. Попробовать читалку можно на ",[664,1799,1801],{"href":1800},"/ru-ru#download","странице загрузки",{"title":72,"searchDepth":238,"depth":238,"links":1803},[1804,1809,1810,1811,1812,1816,1823,1827,1828,1835],{"id":464,"depth":238,"text":465,"children":1805},[1806,1807,1808],{"id":480,"depth":244,"text":481},{"id":560,"depth":244,"text":561},{"id":656,"depth":244,"text":657},{"id":846,"depth":238,"text":847},{"id":907,"depth":238,"text":908},{"id":922,"depth":238,"text":923},{"id":1051,"depth":238,"text":1052,"children":1813},[1814,1815],{"id":1075,"depth":244,"text":1076},{"id":1101,"depth":244,"text":1102},{"id":1177,"depth":238,"text":1178,"children":1817},[1818,1820,1822],{"id":1196,"depth":244,"text":1819},"6.1 get_related_segment_summaries — целевой поиск по сегментам",{"id":1266,"depth":244,"text":1821},"6.2 get_full_book_segment_summaries — вопросы об обзоре всей книги",{"id":1287,"depth":244,"text":1288},{"id":1318,"depth":238,"text":1319,"children":1824},[1825,1826],{"id":1328,"depth":244,"text":1329},{"id":1339,"depth":244,"text":1340},{"id":1378,"depth":238,"text":1379},{"id":1453,"depth":238,"text":1454,"children":1829},[1830,1831,1832,1833,1834],{"id":1483,"depth":244,"text":1484},{"id":1520,"depth":244,"text":1521},{"id":1580,"depth":244,"text":1581},{"id":1612,"depth":244,"text":1613},{"id":1649,"depth":244,"text":1650},{"id":1680,"depth":238,"text":1681},"2026-06-03","Инженерные заметки о Q&A без галлюцинаций в AI-читалке — ответы строго на основе текста открытой книги, с переходом к точным фрагментам в один клик.",{},"/ru-ru/blog/zero-hallucination-qa",{"title":438,"description":1837},"ru-ru/blog/zero-hallucination-qa",[1843,1844,1845],"ридер","AI","технологии","zero-hallucination-qa","SNpxVTfcwrYFFFalxPzfwYiyzj4FuugExLGWPSfI4Hc",1786513819797]