[{"data":1,"prerenderedAt":2350},["ShallowReactive",2],{"blog-article-/ru-ru/blog/zero-hallucination-qa":3,"blog-list-ru-ru":1435},{"id":4,"title":5,"body":6,"config":1419,"date":1420,"description":1421,"draft":1422,"extension":1423,"image":1419,"meta":1424,"navigation":1425,"path":1426,"seo":1427,"stem":1428,"tags":1429,"toolbar":1419,"translationKey":1433,"updated":1420,"__hash__":1434},"blog/ru-ru/blog/zero-hallucination-qa.md","Как я реализовал «нулевую галлюцинацию» в Q&A читалки",{"type":7,"value":8,"toc":1383},"minimark",[9,17,32,35,40,47,52,57,75,80,93,98,132,135,139,157,164,168,183,188,225,232,236,249,274,279,396,414,420,422,426,433,448,455,475,481,483,487,490,496,498,502,525,535,596,599,610,620,627,629,633,640,646,653,657,664,672,679,683,693,736,747,753,755,759,774,782,788,791,834,844,852,858,865,869,877,883,894,896,900,906,910,917,921,944,954,956,960,966,1024,1029,1031,1035,1042,1061,1065,1085,1096,1098,1102,1113,1116,1139,1150,1156,1158,1162,1177,1188,1190,1194,1215,1225,1227,1231,1250,1256,1258,1262,1350,1357,1368],[10,11,12],"p",{},[13,14],"img",{"alt":15,"src":16},"Обложка: Q&A без галлюцинаций","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[18,19,20],"blockquote",{},[10,21,22,23,27,28,31],{},"В этой статье рассказываю об инженерной реализации ",[24,25,26],"strong",{},"Q&A без галлюцинаций"," в AI-читалке: ответы строго опираются на текст открытой книги, а ключевые утверждения можно ",[24,29,30],{},"проследить в один клик"," до конкретного фрагмента. Если вы делаете AI-чтение, document QA или RAG-приложения, надеюсь, три итерации опыта и финальная архитектура будут полезны.",[33,34],"hr",{},[36,37,39],"h2",{"id":38},"i-практический-путь-эволюция-в-три-этапа","I. Практический путь: эволюция в три этапа",[10,41,42,43,46],{},"Q&A без галлюцинаций не был спроектирован идеально с первого дня — он эволюционировал под давлением ",[24,44,45],{},"стоимости, задержки и точности",". Ниже — хронологический обзор трёх этапов, чтобы понять, почему текущая архитектура выглядит именно так.",[48,49],"mermaid",{":config":50,"code":51},"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",[53,54,56],"h3",{"id":55},"этап-1-весь-текст-в-context-самый-простой-и-первый-кто-сломался","Этап 1: Весь текст в Context (самый простой — и первый, кто сломался)",[10,58,59,62,63,66,67,70,71,74],{},[24,60,61],{},"Подход:"," Когда пользователь открывает книгу и задаёт вопрос, ",[24,64,65],{},"весь извлечённый основной текст"," помещается в System Prompt или User-сообщение, и диалоговая модель отвечает. Если книга превышает примерно ",[24,68,69],{},"400 000 символов",", выполняется ",[24,72,73],{},"жёсткое обрезание"," — остаётся только начало, последующие главы для модели невидимы.",[10,76,77],{},[24,78,79],{},"Плюсы:",[81,82,83,87,90],"ul",{},[84,85,86],"li",{},"Очень низкая стоимость реализации, почти без предобработки;",[84,88,89],{},"На коротких книгах и простых документах работает неплохо — модель действительно «видела всю книгу»;",[84,91,92],{},"Простой UX: спросил — получил ответ, без состояния «подождите, пока мы анализируем».",[10,94,95],{},[24,96,97],{},"Минусы (быстро становятся неприемлемыми):",[81,99,100,106,112,122],{},[84,101,102,105],{},[24,103,104],{},"Медленные ответы:"," Каждый вопрос заново отправляет огромный объём текста; задержка до первого токена и общее время растут с длиной книги;",[84,107,108,111],{},[24,109,110],{},"Высокая стоимость токенов:"," За каждый вопрос вы платите за полный ввод текста книги;",[84,113,114,117,118,121],{},[24,115,116],{},"Длинные книги сильно искажаются:"," После 400 000 символов вторая половина, приложения и заключения для модели как бы не существуют — и UI часто ",[24,119,120],{},"не сообщает явно",", что произошло обрезание;",[84,123,124,127,128,131],{},[24,125,126],{},"Нулевая гранулярность поиска:"," Модель должна «найти иголку в стоге сена» среди сотен тысяч символов — легко упустить детали и проще получить ",[24,129,130],{},"правдоподобные обобщения без оснований"," — именно то, чего сценарий чтения должен избегать.",[10,133,134],{},"Этап 1 подходит для MVP, но не для продуктового решения.",[53,136,138],{"id":137},"этап-2-лёгкий-llm-извлекает-ключевые-предложения-сжатие-context-но-слишком-агрессивное","Этап 2: Лёгкий LLM извлекает ключевые предложения (сжатие Context — но слишком агрессивное)",[10,140,141,143,144,147,148,151,152,156],{},[24,142,61],{}," Перед Q&A (или при первом открытии книги) ",[24,145,146],{},"более дешёвая модель"," обрабатывает основной текст: разбивает по главам Spine (или сегментирует всю книгу), извлекает ",[24,149,150],{},"ключевые предложения",", сохраняет метки позиций вида ",[153,154,155],"code",{},"[fфайл-начало-конец]",", затем склеивает выдержки в более короткий Context для последующего Q&A.",[10,158,159,160,163],{},"Типичный пайплайн: ",[24,161,162],{},"Extract → Cache → Chat",". Сначала один раз (офлайн или по запросу) выполняется извлечение и сохранение «набора ключевых предложений», затем он переиспользуется при каждом вопросе — та же идея, что во многих прототипах document QA: сначала сжать документ, потом отвечать.",[10,165,166],{},[24,167,79],{},[81,169,170,177,180],{},[84,171,172,173,176],{},"При каждом вопросе в модель уходит ",[24,174,175],{},"значительно меньше текста","; расход токенов на запрос заметно ниже, чем на этапе 1;",[84,178,179],{},"Результат предобработки можно кэшировать — для одной книги не нужно извлекать заново при каждом вопросе;",[84,181,182],{},"Уже введены метки позиций — основа для последующей трассировки.",[10,184,185],{},[24,186,187],{},"Минусы (на длинных книгах всё ещё не выдерживает):",[81,189,190,196,206,215],{},[84,191,192,195],{},[24,193,194],{},"Массовая потеря деталей:"," «Ключевые предложения» отбирает модель субъективно — ограничения, контрпримеры и звенья аргументации легко теряются, ответы становятся «верными, но односторонними»;",[84,197,198,201,202,205],{},[24,199,200],{},"Context на длинных книгах всё ещё велик:"," Даже только ключевые предложения для крупных произведений дают заметный объём — ",[24,203,204],{},"задержка и стоимость снижаются, но не решаются",";",[84,207,208,211,212,205],{},[24,209,210],{},"Двойная ошибка LLM:"," На этапе извлечения что-то может быть пропущено, на этапе Q&A выдержки могут быть неверно прочитаны — ошибки ",[24,213,214],{},"накапливаются",[84,216,217,220,221,224],{},[24,218,219],{},"Статический Context:"," Независимо от того, спрашивает ли пользователь о деталях одной главы или о структуре всей книги, модель всегда получает ",[24,222,223],{},"один и тот же предварительно извлечённый текст"," — без динамического сужения по вопросу.",[10,226,227,228,231],{},"Урок этого этапа ясен: дело не в «сжимать или нет», а в том, ",[24,229,230],{},"сжимается ли контент по запросу и можно ли вернуться к исходному тексту",".",[53,233,235],{"id":234},"этап-3-индекс-сегментов-tool-поиск-по-запросу-возврат-исходного-текста-текущая-схема","Этап 3: Индекс сегментов + Tool-поиск по запросу + возврат исходного текста (текущая схема)",[10,237,238,240,241,248],{},[24,239,61],{}," Основная идея заимствована из ",[242,243,247],"a",{"href":244,"rel":245},"https://github.com/VectifyAI/PageIndex",[246],"nofollow","PageIndex",". По сравнению с этапом 2 три ключевых изменения:",[250,251,252,258,268],"ol",{},[84,253,254,257],{},[24,255,256],{},"Результат предобработки — структурированный индекс"," (краткие описания на уровне оглавления + точные символьные span), а не выдержки, используемые напрямую как Context для Q&A;",[84,259,260,263,264,267],{},[24,261,262],{},"При каждом вопросе модель через Tool Calling ищет по запросу",", затем ",[24,265,266],{},"подтягивает исходный текст с метками позиций"," для ответа;",[84,269,270,273],{},[24,271,272],{},"System Prompt и фронтенд"," совместно задают формат цитирования и поддерживают переход по сноскам с подсветкой исходного текста.",[10,275,276],{},[24,277,278],{},"Сравнение трёх этапов:",[280,281,282,301],"table",{},[283,284,285],"thead",{},[286,287,288,292,295,298],"tr",{},[289,290,291],"th",{},"Измерение",[289,293,294],{},"Этап 1 (весь текст)",[289,296,297],{},"Этап 2 (ключевые предложения)",[289,299,300],{},"Этап 3 (текущий)",[302,303,304,323,337,351,365,382],"tbody",{},[286,305,306,310,313,316],{},[307,308,309],"td",{},"Context на один вопрос",[307,311,312],{},"Вся книга (или обрезанная первая половина)",[307,314,315],{},"Предварительно извлечённые ключевые предложения",[307,317,318,319,322],{},"Только ",[24,320,321],{},"исходные"," фрагменты, релевантные вопросу",[286,324,325,328,331,334],{},[307,326,327],{},"Точность на длинных книгах",[307,329,330],{},"Резко падает после ~400k символов",[307,332,333],{},"Зависит от качества извлечения, теряются детали",[307,335,336],{},"Поиск по оглавлению/span, без жёсткого обрезания всей книги",[286,338,339,342,345,348],{},[307,340,341],{},"Скорость ответа",[307,343,344],{},"Медленно",[307,346,347],{},"Немного лучше; длинные книги всё ещё медленно",[307,349,350],{},"Поиск + короткий Context — заметно быстрее",[286,352,353,356,359,362],{},[307,354,355],{},"Стоимость токенов",[307,357,358],{},"Очень высокая",[307,360,361],{},"Средне-высокая",[307,363,364],{},"Амортизированная предобработка + оплата по запросу",[286,366,367,370,373,376],{},[307,368,369],{},"Трассируемость",[307,371,372],{},"Слабая (сложно указать источник)",[307,374,375],{},"Метки есть, но контент уже вторично отфильтрован",[307,377,378,379],{},"Сноски соответствуют ",[24,380,381],{},"реальным исходным span",[286,383,384,387,390,393],{},[307,385,386],{},"Инженерная сложность",[307,388,389],{},"Низкая",[307,391,392],{},"Средняя",[307,394,395],{},"Высокая",[10,397,398,401,402,405,406,409,410,413],{},[24,399,400],{},"Почему остановились на этапе 3:"," Для сценария чтения «нулевая галлюцинация» — это не «показать модели как можно больше текста», а ",[24,403,404],{},"«перед ответом получить исходные доказательства, релевантные вопросу»",". Этапы 1–2 боролись с ",[24,407,408],{},"объёмом Context","; этап 3 разбивает цепочку на ",[24,411,412],{},"«индекс (предобработка) → поиск (Tool) → доказательства (исходный текст) → ответ (ограниченная генерация)»"," — и одновременно балансирует точность, стоимость и трассируемость.",[10,415,416,417,231],{},"Ниже — детали реализации ",[24,418,419],{},"этапа 3",[33,421],{},[36,423,425],{"id":424},"ii-постановка-задачи-в-qa-по-книге-галлюцинации-опаснее-чем-в-обычном-chat","II. Постановка задачи: в Q&A по книге галлюцинации опаснее, чем в обычном Chat",[10,427,428,429,432],{},"В обычном ChatBot пользователи часто терпят случайные ошибки. В ",[24,430,431],{},"Q&A по книге"," цена выше:",[81,434,435,442,445],{},[84,436,437,438,441],{},"Пользователь спрашивает, что говорит ",[24,439,440],{},"эта книга",", а не что хранится в parametric memory модели;",[84,443,444],{},"Одно правдоподобное «мнение из книги» может ввести в заблуждение заметки, цитаты и повторные публикации;",[84,446,447],{},"Без указания источника пользователь не может проверить — доверие к продукту сложно построить.",[10,449,450,451,454],{},"Поэтому «нулевая галлюцинация» в инженерии сводится к трём ",[24,452,453],{},"исполнимым"," правилам:",[250,456,457,463,469],{},[84,458,459,462],{},[24,460,461],{},"Вопросы о книге сначала ищут в книге:"," Всё, что может относиться к открытой книге, модель должна сначала прогнать через поиск (Tool), затем формировать ответ;",[84,464,465,468],{},[24,466,467],{},"Ответы должны быть трассируемы:"," Ключевые выводы сопровождаются метками позиций в исходном тексте, которые фронтенд может разобрать и по которым можно перейти с подсветкой;",[84,470,471,474],{},[24,472,473],{},"Если не нашли — так и сказать:"," Если в книге этого нет, нужно явно сообщить, а не выдавать общие знания за «мнение из книги».",[10,476,477,478,480],{},"Далее — по потоку данных ",[24,479,419],{},", как эти правила реализуются.",[33,482],{},[36,484,486],{"id":485},"iii-общая-архитектура-предобработка-tool-поиск-ограниченная-генерация-кликабельная-трассировка","III. Общая архитектура: предобработка → Tool-поиск → ограниченная генерация → кликабельная трассировка",[48,488],{":config":50,"code":489},"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,491,492,493,231],{},"Ключевая идея: ",[24,494,495],{},"не давать модели «отвечать по памяти» — заставить её «сначала собрать доказательства, потом ответить и указать источники»",[33,497],{},[36,499,501],{"id":500},"iv-предобработка-превращаем-всю-книгу-в-индекс-сегментов-для-поиска","IV. Предобработка: превращаем всю книгу в «индекс сегментов» для поиска",[10,503,504,505,508,509,512,513,516,517,520,521,524],{},"Если при каждом вопросе использовать Context всей книги как на ",[24,506,507],{},"этапе 1",", длинные книги неизбежно переполнят бюджет токенов, а гранулярность поиска будет слишком грубой. Решение этапа 3: при первом AI-диалоге с книгой в фоне запускается ",[24,510,511],{},"задача кратких описаний сегментов"," — книга делится по ",[24,514,515],{},"структуре оглавления"," или ",[24,518,519],{},"длине текста"," на несколько ",[153,522,523],{},"Segment",", для каждого генерируется краткое описание, результат сохраняется локально в IndexedDB.",[10,526,527,528,530,531,534],{},"Каждый ",[153,529,523],{}," в структуре данных содержит краткое описание и ",[24,532,533],{},"физическую позицию в основном тексте",":",[280,536,537,547],{},[283,538,539],{},[286,540,541,544],{},[289,542,543],{},"Поле",[289,545,546],{},"Значение",[302,548,549,563,576,586],{},[286,550,551,560],{},[307,552,553,556,557],{},[153,554,555],{},"startFileIndex"," / ",[153,558,559],{},"endFileIndex",[307,561,562],{},"Индекс файла Spine (для PDF — один файл на страницу)",[286,564,565,573],{},[307,566,567,556,570],{},[153,568,569],{},"startOffset",[153,571,572],{},"endOffset",[307,574,575],{},"Символьные смещения начала и конца",[286,577,578,583],{},[307,579,580],{},[153,581,582],{},"sequence",[307,584,585],{},"Линейный порядок чтения",[286,587,588,593],{},[307,589,590],{},[153,591,592],{},"title",[307,594,595],{},"Заголовок из оглавления",[10,597,598],{},"Стратегия разбиения балансирует точность и стоимость: если основной текст одного узла оглавления не превышает ~20 KB, суммируется только этот узел; узлы одного уровня могут объединяться в пакеты (15–20 KB) перед вызовом LLM; крупные блоки без оглавления режутся интервалами ~30–40k символов.",[10,600,601,602,605,606,609],{},"System Prompt при генерации кратких описаний требует ",[24,603,604],{},"сохранять встроенные метки позиций"," (формат ",[153,607,608],{},"[fчисло-число-число]","), чтобы при возврате исходного текста через Tool информация о позиции совпадала со смещениями символов Spine. Основное ограничение:",[611,612,618],"pre",{"className":613,"code":615,"language":616,"meta":617},[614],"language-text","Если содержание краткого описания связано с фрагментом исходного текста, сохраните метку позиции в конце фрагмента в формате [fчисло-число-число] (например, [f1-90-109]).\nМетка позиции — единое целое; запрещено изменять, объединять или опускать любой символ или цифру.\n","text","",[153,619,615],{"__ignoreMap":617},[10,621,622,623,626],{},"После предобработки Q&A опирается не на «Context всей книги», а на ",[24,624,625],{},"структурированный индекс сегментов"," — инженерная предпосылка «нулевой галлюцинации» для длинных книг.",[33,628],{},[36,630,632],{"id":631},"v-система-меток-позиций-кодируем-источник-в-текст","V. Система меток позиций: кодируем «источник» в текст",[10,634,635,636,639],{},"«Нулевая галлюцинация» требует не только контент из исходного текста, но и ",[24,637,638],{},"машинно разбираемый, переходимый в UI источник",". Используем встроенные метки:",[611,641,644],{"className":642,"code":643,"language":616},[614],"[f{fileIndex}-{startChar}-{endChar}]\n",[153,645,643],{"__ignoreMap":617},[10,647,648,649,652],{},"Например, ",[153,650,651],{},"[f5-123-165]"," означает: в 5-м файле Spine (с нуля) символьный интервал 123–165.",[53,654,656],{"id":655},"_51-как-метки-записываются-в-основной-текст","5.1 Как метки записываются в основной текст",[10,658,659,660,663],{},"Слой извлечения текста при выводе фрагментов дописывает в конец каждого небольшого сегмента ",[153,661,662],{},"[f{fileIndex}-{start}-{end}]",". Схема:",[611,665,670],{"className":666,"code":668,"language":669,"meta":617},[667],"language-typescript","const position = `[f${fileIndex}-${absOffset}-${absOffset + segment.length}]`;\nfileLines.push(segment.text.trim() + position);\n","typescript",[153,671,668],{"__ignoreMap":617},[10,673,674,675,678],{},"И в кратких описаниях предобработки, и в выдержках исходного текста, возвращаемых Tool, позиции выровнены по ",[24,676,677],{},"символьным смещениям Spine",", а не по «оценочным номерам страниц» модели.",[53,680,682],{"id":681},"_52-ограничения-на-вывод-модели","5.2 Ограничения на вывод модели",[10,684,685,686,692],{},"При сборке System Prompt отдельно задаются ",[24,687,688],{},[689,690,691],"span",{},"Position Citation Rules"," — пять основных пунктов:",[250,694,695,705,715,721,730],{},[84,696,697,700,701,704],{},[24,698,699],{},"Стандартный формат:"," Обязательно ",[153,702,703],{},"[f_fileIndex-startChar-endChar]","; все три числовые части обязательны;",[84,706,707,710,711,714],{},[24,708,709],{},"Только из текущих источников:"," Сноски должны быть ",[24,712,713],{},"дословно скопированы"," из System/User-сообщений или возвратов Tool текущего хода;",[84,716,717,720],{},[24,718,719],{},"Запрет подделки:"," Не вычислять, не изменять и не выдумывать позиции;",[84,722,723,726,727,205],{},[24,724,725],{},"Лучше опустить:"," Если в контексте нет допустимой метки — отвечать нормально, ",[24,728,729],{},"не выводить метки позиций",[84,731,732,735],{},[24,733,734],{},"Сразу после утверждения:"," Метки следуют за соответствующим предложением; запрещены списки цитат в конце текста.",[10,737,738,739,742,743,746],{},"Перед отображением фронтенд также фильтрует случайные ",[24,740,741],{},"двухчастные"," недопустимые метки (например, ",[153,744,745],{},"[f1-293]","), чтобы в UI не попадали битые сноски.",[10,748,749],{},[13,750],{"alt":751,"src":752},"Всплывающее окно трассировки цитаты","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[33,754],{},[36,756,758],{"id":757},"vi-tool-calling-сначала-поиск-потом-ответ","VI. Tool Calling: сначала поиск, потом ответ",[10,760,761,762,765,766,769,770,773],{},"Когда диалог привязан к книге (есть ",[153,763,764],{},"resourceId",", ",[153,767,768],{},"chatType === 'chat'","), перед каждой генерацией регистрируются два Tool с соответствующими executor — стандартный цикл ",[24,771,772],{},"function calling"," в стиле OpenAI.",[53,775,777,778,781],{"id":776},"_61-get_related_segment_summaries-целевой-поиск-по-сегментам","6.1 ",[153,779,780],{},"get_related_segment_summaries"," — целевой поиск по сегментам",[10,783,784,785,231],{},"Для: концепций, персонажей, сюжета, деталей глав — ",[24,786,787],{},"явное намерение поиска",[10,789,790],{},"Краткий поток:",[250,792,793,800,806,813,827],{},[84,794,795,796,799],{},"Модель перефразирует разговорную формулировку пользователя в ",[24,797,798],{},"термины, вероятно встречающиеся в книге"," («Optimize Search Queries» в System Prompt);",[84,801,802,803,205],{},"Вызов Tool с параметром ",[153,804,805],{},"question",[84,807,808,809,812],{},"Все краткие описания сегментов ",[24,810,811],{},"батчами"," по бюджету токенов (~30k токенов на батч, максимум 5 батчей);",[84,814,815,816,819,820,823,824,205],{},"Каждый батч — ",[24,817,818],{},"отдельный LLM-запрос",": из списка ",[153,821,822],{},"{ id, title, summary }"," выбираются релевантные ID сегментов (максимум 5), возвращается JSON вида ",[153,825,826],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[84,828,829,830,833],{},"По span выбранных Segment из Spine ",[24,831,832],{},"подтягивается исходный текст с метками позиций"," (не краткое описание) как результат Tool.",[10,835,836,839,840,843],{},[24,837,838],{},"Ключевое проектное решение: Tool возвращает исходный текст, а не краткие описания."," Модель отвечает по реальным абзацам со встроенными ",[153,841,842],{},"[f…]",", избегая дрейфа «краткое описание → повторное обобщение».",[53,845,847,848,851],{"id":846},"_62-get_full_book_segment_summaries-вопросы-об-обзоре-всей-книги","6.2 ",[153,849,850],{},"get_full_book_segment_summaries"," — вопросы об обзоре всей книги",[10,853,854,855,231],{},"Для: «кратко перескажи книгу», «оцени эту книгу», «общая структура / темы» — ",[24,856,857],{},"глобальный обзор",[10,859,860,861,864],{},"Склеиваются поля ",[153,862,863],{},"summary"," всех сегментов в порядке чтения — чтобы не пропустить ключевые главы из-за отбора только по релевантности отдельных фрагментов.",[53,866,868],{"id":867},"_63-system-prompt-книга-в-приоритете-инструменты-в-приоритете","6.3 System Prompt: книга в приоритете, инструменты в приоритете",[10,870,871,872,534],{},"При привязанной книге применяется ",[24,873,874],{},[689,875,876],{},"Core Principles for Reading Assistant",[611,878,881],{"className":879,"code":880,"language":616},[614],"1. Book First, Tool First\n   - Любой вопрос, который может относиться к книге, сначала требует вызова Tool;\n   - Ответ должен опираться в основном на результаты поиска — запрещено выдумывать «содержание книги» без поиска.\n\n2. General Knowledge as Fallback Only\n   - Только для: свободной беседы / явного отказа пользователя от книги / пустого результата Tool;\n   - Если в книге этого нет — сначала заявить «в этой книге это не упоминается», затем при необходимости добавить общие знания.\n\n3. Direct Style\n   - Сразу к сути — без «на основе предоставленных материалов…», «в заключение…» и подобных шаблонов.\n",[153,882,880],{"__ignoreMap":617},[10,884,885,886,889,890,893],{},"Слой генерации реализует стандартный цикл Tool: ",[153,887,888],{},"tool_calls"," → выполнение executor → добавление ",[153,891,892],{},"role: tool"," → продолжение запроса до финального текста. При включённых tools канал thinking отключён, чтобы избежать конфликта с протоколом function call.",[33,895],{},[36,897,899],{"id":898},"vii-трассировка-на-фронтенде-от-сноски-к-подсветке-исходного-текста","VII. Трассировка на фронтенде: от сноски к подсветке исходного текста",[10,901,902,903,905],{},"Вывод модели ",[153,904,651],{}," не показывается как есть — слой рендеринга превращает его в кликабельные цитаты.",[53,907,909],{"id":908},"_71-отрисовка-сносок","7.1 Отрисовка сносок",[10,911,912,913,916],{},"Перед показом метки позиций нормализуются в Markdown-ссылки, например ",[153,914,915],{},"[1]([f5-123-165])",", затем отображаются как нумерованные сноски; при повторении одной позиции — дедупликация, чтобы не загромождать UI.",[53,918,920],{"id":919},"_72-клик","7.2 Клик",[250,922,923,932,938],{},[84,924,925,928,929,931],{},[24,926,927],{},"Первый клик:"," Разбор ",[153,930,842],{}," → fileIndex и смещения символов → извлечение текста из Spine → всплывающий предпросмотр (опционально с заголовком из оглавления);",[84,933,934,937],{},[24,935,936],{},"Повторный клик по той же сноске:"," Закрыть предпросмотр;",[84,939,940,943],{},[24,941,942],{},"Подтверждение перехода:"," Открыть вид чтения, подсветить символьный интервал.",[10,945,946,947,950,951,231],{},"От скопированной моделью метки до текста, который видит пользователь, цепочка ",[24,948,949],{},"не проходит через повторный вызов LLM"," — полностью ",[24,952,953],{},"детерминирована и воспроизводима",[33,955],{},[36,957,959],{"id":958},"viii-граничные-случаи-и-честная-деградация","VIII. Граничные случаи и честная деградация",[10,961,962,963,534],{},"«Нулевая галлюцинация» ≠ «всегда есть ответ» — это ",[24,964,965],{},"нет доказательств, нет выдумки",[280,967,968,978],{},[283,969,970],{},[286,971,972,975],{},[289,973,974],{},"Сценарий",[289,976,977],{},"Поведение",[302,979,980,988,1000,1008,1016],{},[286,981,982,985],{},[307,983,984],{},"Краткие описания сегментов ещё не готовы",[307,986,987],{},"Сначала извлечь полный текст и выполнить суммирование",[286,989,990,993],{},[307,991,992],{},"Tool ничего не нашёл",[307,994,995,996,999],{},"Вернуть ",[153,997,998],{},"(No relevant segment excerpts found…)","; модель должна заявить, что в книге не упоминается",[286,1001,1002,1005],{},[307,1003,1004],{},"Модель вывела недопустимую двухчастную метку",[307,1006,1007],{},"Фронтенд фильтрует; битые сноски не показываются",[286,1009,1010,1013],{},[307,1011,1012],{},"Свободная беседа пользователя",[307,1014,1015],{},"System Prompt разрешает общие знания вне книги",[286,1017,1018,1021],{},[307,1019,1020],{},"Экспорт диалога",[307,1022,1023],{},"Сноски можно превратить в deep link читалки для sharing или архива",[10,1025,1026],{},[13,1027],{"alt":1020,"src":1028},"https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[33,1030],{},[36,1032,1034],{"id":1033},"ix-компромисс-проектирования-почему-не-векторный-rag","IX. Компромисс проектирования: почему не «векторный RAG»?",[10,1036,1037,1038,1041],{},"Коллеги, делающие document QA, часто спрашивают: если вы делаете retrieval-augmented generation, почему не ",[24,1039,1040],{},"Embedding + векторная БД Top-K","?",[10,1043,1044,1045,1048,1049,1052,1053,1056,1057,1060],{},"На самом деле ",[24,1046,1047],{},"мы тоже делаем RAG"," — перед каждым ответом сначала ищем в книге, потом генерируем. Разница в том, что в сообществе «RAG» часто подразумевает ",[24,1050,1051],{},"векторизацию и поиск по сходству","; текущая схема — ",[24,1054,1055],{},"«индекс сегментов + Tool с подтягиванием исходного текста по запросу»"," (этап 3), ",[24,1058,1059],{},"намеренно без векторного слоя",". Ниже — архитектурные причины выбора, а не отрицание ценности векторного RAG.",[53,1062,1064],{"id":1063},"определение-границ-не-без-поиска-а-без-векторного-поиска","Определение границ: не «без поиска», а «без векторного поиска»",[81,1066,1067,1076],{},[84,1068,1069,1072,1073,231],{},[24,1070,1071],{},"Широкий RAG:"," найти материалы → сгенерировать → ",[24,1074,1075],{},"мы это делаем",[84,1077,1078,1081,1082,231],{},[24,1079,1080],{},"Векторный RAG:"," recall через сходство Embedding → ",[24,1083,1084],{},"в текущей версии не делаем",[10,1086,1087,1088,1091,1092,1095],{},"Предобработка всей книги даёт ",[24,1089,1090],{},"индекс кратких описаний сегментов","; при вопросе модель через Tool выбирает сегменты, затем ",[24,1093,1094],{},"получает исходный текст",". Retrieval-augmented generation есть, но без отдельной embedding-модели и поддержки векторного индекса.",[33,1097],{},[53,1099,1101],{"id":1100},"причина-1-поддержка-пользовательских-llm-provider-минимальная-цепочка-конфигурации","Причина 1: поддержка пользовательских LLM Provider — минимальная цепочка конфигурации",[10,1103,1104,1105,1108,1109,1112],{},"Продукт позволяет подключать ",[24,1106,1107],{},"собственный API Key",", custom Base URL или ",[24,1110,1111],{},"локальный Ollama"," — диалоговая модель на выбор пользователя, контроль стоимости и пути данных. Для многих self-hosted сценариев и сравнения моделей это жёсткое требование.",[10,1114,1115],{},"Типичный векторный RAG заметно расширяет поверхность интеграции:",[81,1117,1118,1129,1132],{},[84,1119,1120,1121,1124,1125,1128],{},"Помимо ",[24,1122,1123],{},"Chat-модели"," обычно нужна ",[24,1126,1127],{},"Embedding-модель"," (другое имя model, иногда другой endpoint);",[84,1130,1131],{},"Локальный Ollama требует отдельно подтянуть embedding-модель и решать вопросы размерности и совместимости API;",[84,1133,1134,1135,1138],{},"Расширяется область отказов: Chat работает, но ",[24,1136,1137],{},"поиск пуст"," — возможны проблемы embedding, индекса или несовпадения размерности; отладка сложнее, чем «один Provider на всю цепочку».",[10,1140,1141,1142,1145,1146,1149],{},"В текущей схеме ",[24,1143,1144],{},"выбор сегментов и ответ используют одну конфигурацию Provider"," — без «Chat на A, индекс на B». Для приложений с ",[24,1147,1148],{},"подключаемым LLM"," это часто важнее нескольких процентов recall.",[10,1151,1152],{},[13,1153],{"alt":1154,"src":1155},"Пользовательские AI-провайдеры","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[33,1157],{},[53,1159,1161],{"id":1160},"причина-2-embedding-жёстко-привязан-к-индексу-смена-provider-дорога","Причина 2: Embedding жёстко привязан к индексу — смена Provider дорога",[10,1163,1164,1165,1168,1169,1172,1173,1176],{},"В векторном RAG часто недооценивают: ",[24,1166,1167],{},"вектор — не универсальный промежуточный формат, а координаты в пространстве конкретной embedding-модели."," Индекс построен моделью A, запрос моделью B — сходство обычно ",[24,1170,1171],{},"несопоставимо","; смена модели часто означает ",[24,1174,1175],{},"полную повторную векторизацию книги",", а размерности (768 / 1024 / 1536 …) фиксируют схему хранения.",[10,1178,1179,1180,1183,1184,1187],{},"На этапе 3 сохраняются ",[24,1181,1182],{},"структурированные краткие описания + символьные span",", не векторы; при смене Chat-модели ",[24,1185,1186],{},"индекс перестраивать не нужно",", цепочка доказательств (позиции в исходном тексте) не меняется — это лучше согласуется с целью «в любой момент сравнивать разные LLM».",[33,1189],{},[53,1191,1193],{"id":1192},"причина-3-для-длинных-документов-с-оглавлением-структурированная-маршрутизация-часто-достаточна","Причина 3: для длинных документов с оглавлением структурированная маршрутизация часто достаточна",[10,1195,1196,1197,1200,1201,1204,1205,1208,1209,1214],{},"Электронные книги и PDF обычно имеют ",[24,1198,1199],{},"главную структуру","; предобработка даёт ",[24,1202,1203],{},"заголовки сегментов + краткие описания",". Для вопросов «что в главе X» или «как книга определяет Y» выбор сегментов из каталога и ",[24,1206,1207],{},"подтягивание исходного текста"," на практике работает стабильно; Tool возвращает ",[24,1210,1211,1212],{},"исходный текст с ",[153,1213,842],{},", и «нулевая галлюцинация» по-прежнему привязана к символьным span.",[10,1216,1217,1218,1221,1222,231],{},"Векторный поиск силён при семантической неоднозначности, кросс-языковых запросах, длинных абзацах без буквального совпадения; для читалки с ",[24,1219,1220],{},"оглавлением, предобработкой и сильной трассируемостью"," ROI выше, когда сложность вкладывается в ",[24,1223,1224],{},"Tool + возврат исходного текста + правила цитирования",[33,1226],{},[53,1228,1230],{"id":1229},"дальнейшее-направление-гибридный-recall-а-не-переписывание-с-нуля","Дальнейшее направление: гибридный recall, а не переписывание с нуля",[10,1232,1233,1234,1237,1238,1241,1242,1245,1246,1249],{},"Не исключаем в будущем ",[24,1235,1236],{},"грубый векторный recall"," (например, embedding только для Top-N кандидатов глав), с финалом всё равно в ",[24,1239,1240],{},"выбор сегмента → исходный текст → кликабельная трассировка"," — правила «нулевой галлюцинации» не меняются. При внедрении постараемся: Embedding ",[24,1243,1244],{},"опционален",", при смене модели — ",[24,1247,1248],{},"явное предупреждение о перестройке индекса",", без silent wrong retrieval.",[10,1251,1252,1253,231],{},"До тех пор приоритет: ",[24,1254,1255],{},"работает любой OpenAI-совместимый Chat API; смена Chat-модели не требует перестройки локального индекса",[33,1257],{},[36,1259,1261],{"id":1260},"x-итог","X. Итог",[280,1263,1264,1277],{},[283,1265,1266],{},[286,1267,1268,1271,1274],{},[289,1269,1270],{},"Этап",[289,1272,1273],{},"Средство",[289,1275,1276],{},"Роль",[302,1278,1279,1290,1303,1317,1328,1339],{},[286,1280,1281,1284,1287],{},[307,1282,1283],{},"Предобработка",[307,1285,1286],{},"Разбиение по оглавлению/длине + кэш кратких описаний сегментов",[307,1288,1289],{},"Длинные книги доступны для поиска и локализации",[286,1291,1292,1295,1300],{},[307,1293,1294],{},"Метки позиций",[307,1296,1297,1299],{},[153,1298,155],{}," в исходном тексте",[307,1301,1302],{},"Машинно разбираемый источник",[286,1304,1305,1308,1314],{},[307,1306,1307],{},"Tool-поиск",[307,1309,1310,1311],{},"По вопросу — сегменты / краткие описания всей книги, возврат ",[24,1312,1313],{},"исходного текста",[307,1315,1316],{},"Принудительный сбор доказательств перед ответом",[286,1318,1319,1322,1325],{},[307,1320,1321],{},"System Prompt",[307,1323,1324],{},"Книга в приоритете, запрет поддельных сносок, честность при отсутствии",[307,1326,1327],{},"Ограничение генерации",[286,1329,1330,1333,1336],{},[307,1331,1332],{},"Фронтенд",[307,1334,1335],{},"Сноска → предпросмотр → переход и подсветка",[307,1337,1338],{},"Пользователь проверяет доказательства",[286,1340,1341,1344,1347],{},[307,1342,1343],{},"Без векторного поиска",[307,1345,1346],{},"Один Provider; смена Chat-модели без перестройки индекса",[307,1348,1349],{},"Ниже стоимость интеграции и миграции",[10,1351,1352,1353,1356],{},"«Нулевая галлюцинация» — не надежда, что модель никогда не ошибается, а ",[24,1354,1355],{},"инженерная фиксация вывода на цепочке доказательств",": нет результата поиска — не выдавать себя за содержание книги; есть результат поиска — дать проверяемые позиции в исходном тексте.",[10,1358,1359,1360,1363,1364,1367],{},"Если вы делаете AI-чтение или document QA, надеюсь, путь ",[24,1361,1362],{},"полный текст → ключевые предложения → Tool-first поиск по запросу",", а также подход ",[24,1365,1366],{},"встроенные метки позиций + возврат исходного текста"," будет полезной реализацией для ориентира.",[18,1369,1370],{},[10,1371,1372,1373,1378,1379,231],{},"Это наш опыт разработки AI-читалки ",[242,1374,1377],{"href":1375,"rel":1376},"https://reader.linghuxiong.com",[246],"Foxycape"," — только для справки. Попробовать читалку можно на ",[242,1380,1382],{"href":1381},"/ru-ru#download","странице загрузки",{"title":617,"searchDepth":1384,"depth":1384,"links":1385},2,[1386,1392,1393,1394,1395,1399,1406,1410,1411,1418],{"id":38,"depth":1384,"text":39,"children":1387},[1388,1390,1391],{"id":55,"depth":1389,"text":56},3,{"id":137,"depth":1389,"text":138},{"id":234,"depth":1389,"text":235},{"id":424,"depth":1384,"text":425},{"id":485,"depth":1384,"text":486},{"id":500,"depth":1384,"text":501},{"id":631,"depth":1384,"text":632,"children":1396},[1397,1398],{"id":655,"depth":1389,"text":656},{"id":681,"depth":1389,"text":682},{"id":757,"depth":1384,"text":758,"children":1400},[1401,1403,1405],{"id":776,"depth":1389,"text":1402},"6.1 get_related_segment_summaries — целевой поиск по сегментам",{"id":846,"depth":1389,"text":1404},"6.2 get_full_book_segment_summaries — вопросы об обзоре всей книги",{"id":867,"depth":1389,"text":868},{"id":898,"depth":1384,"text":899,"children":1407},[1408,1409],{"id":908,"depth":1389,"text":909},{"id":919,"depth":1389,"text":920},{"id":958,"depth":1384,"text":959},{"id":1033,"depth":1384,"text":1034,"children":1412},[1413,1414,1415,1416,1417],{"id":1063,"depth":1389,"text":1064},{"id":1100,"depth":1389,"text":1101},{"id":1160,"depth":1389,"text":1161},{"id":1192,"depth":1389,"text":1193},{"id":1229,"depth":1389,"text":1230},{"id":1260,"depth":1384,"text":1261},null,"2026-06-03","Инженерные заметки о Q&A без галлюцинаций в AI-читалке — ответы строго на основе текста открытой книги, с переходом к точным фрагментам в один клик.",false,"md",{},true,"/ru-ru/blog/zero-hallucination-qa",{"title":5,"description":1421},"ru-ru/blog/zero-hallucination-qa",[1430,1431,1432],"ридер","AI","технологии","zero-hallucination-qa","SNpxVTfcwrYFFFalxPzfwYiyzj4FuugExLGWPSfI4Hc",[1436],{"id":4,"title":5,"body":1437,"config":1419,"date":1420,"description":1421,"draft":1422,"extension":1423,"image":1419,"meta":2347,"navigation":1425,"path":1426,"seo":2348,"stem":1428,"tags":2349,"toolbar":1419,"translationKey":1433,"updated":1420,"__hash__":1434},{"type":7,"value":1438,"toc":2315},[1439,1443,1451,1453,1455,1459,1461,1463,1473,1477,1485,1489,1511,1513,1515,1525,1529,1533,1543,1547,1571,1575,1577,1584,1600,1604,1684,1694,1698,1700,1702,1706,1716,1720,1734,1738,1740,1742,1744,1748,1750,1752,1764,1770,1818,1820,1826,1831,1835,1837,1839,1843,1848,1852,1854,1858,1863,1867,1869,1875,1903,1909,1913,1915,1917,1925,1929,1933,1935,1961,1967,1971,1975,1979,1981,1987,1992,1998,2000,2002,2006,2008,2012,2014,2030,2036,2038,2040,2044,2088,2092,2094,2096,2100,2110,2112,2126,2132,2134,2136,2142,2144,2158,2164,2168,2170,2172,2180,2186,2188,2190,2202,2208,2210,2212,2222,2226,2228,2230,2296,2300,2306],[10,1440,1441],{},[13,1442],{"alt":15,"src":16},[18,1444,1445],{},[10,1446,22,1447,27,1449,31],{},[24,1448,26],{},[24,1450,30],{},[33,1452],{},[36,1454,39],{"id":38},[10,1456,42,1457,46],{},[24,1458,45],{},[48,1460],{":config":50,"code":51},[53,1462,56],{"id":55},[10,1464,1465,62,1467,66,1469,70,1471,74],{},[24,1466,61],{},[24,1468,65],{},[24,1470,69],{},[24,1472,73],{},[10,1474,1475],{},[24,1476,79],{},[81,1478,1479,1481,1483],{},[84,1480,86],{},[84,1482,89],{},[84,1484,92],{},[10,1486,1487],{},[24,1488,97],{},[81,1490,1491,1495,1499,1505],{},[84,1492,1493,105],{},[24,1494,104],{},[84,1496,1497,111],{},[24,1498,110],{},[84,1500,1501,117,1503,121],{},[24,1502,116],{},[24,1504,120],{},[84,1506,1507,127,1509,131],{},[24,1508,126],{},[24,1510,130],{},[10,1512,134],{},[53,1514,138],{"id":137},[10,1516,1517,143,1519,147,1521,151,1523,156],{},[24,1518,61],{},[24,1520,146],{},[24,1522,150],{},[153,1524,155],{},[10,1526,159,1527,163],{},[24,1528,162],{},[10,1530,1531],{},[24,1532,79],{},[81,1534,1535,1539,1541],{},[84,1536,172,1537,176],{},[24,1538,175],{},[84,1540,179],{},[84,1542,182],{},[10,1544,1545],{},[24,1546,187],{},[81,1548,1549,1553,1559,1565],{},[84,1550,1551,195],{},[24,1552,194],{},[84,1554,1555,201,1557,205],{},[24,1556,200],{},[24,1558,204],{},[84,1560,1561,211,1563,205],{},[24,1562,210],{},[24,1564,214],{},[84,1566,1567,220,1569,224],{},[24,1568,219],{},[24,1570,223],{},[10,1572,227,1573,231],{},[24,1574,230],{},[53,1576,235],{"id":234},[10,1578,1579,240,1581,248],{},[24,1580,61],{},[242,1582,247],{"href":244,"rel":1583},[246],[250,1585,1586,1590,1596],{},[84,1587,1588,257],{},[24,1589,256],{},[84,1591,1592,263,1594,267],{},[24,1593,262],{},[24,1595,266],{},[84,1597,1598,273],{},[24,1599,272],{},[10,1601,1602],{},[24,1603,278],{},[280,1605,1606,1618],{},[283,1607,1608],{},[286,1609,1610,1612,1614,1616],{},[289,1611,291],{},[289,1613,294],{},[289,1615,297],{},[289,1617,300],{},[302,1619,1620,1632,1642,1652,1662,1674],{},[286,1621,1622,1624,1626,1628],{},[307,1623,309],{},[307,1625,312],{},[307,1627,315],{},[307,1629,318,1630,322],{},[24,1631,321],{},[286,1633,1634,1636,1638,1640],{},[307,1635,327],{},[307,1637,330],{},[307,1639,333],{},[307,1641,336],{},[286,1643,1644,1646,1648,1650],{},[307,1645,341],{},[307,1647,344],{},[307,1649,347],{},[307,1651,350],{},[286,1653,1654,1656,1658,1660],{},[307,1655,355],{},[307,1657,358],{},[307,1659,361],{},[307,1661,364],{},[286,1663,1664,1666,1668,1670],{},[307,1665,369],{},[307,1667,372],{},[307,1669,375],{},[307,1671,378,1672],{},[24,1673,381],{},[286,1675,1676,1678,1680,1682],{},[307,1677,386],{},[307,1679,389],{},[307,1681,392],{},[307,1683,395],{},[10,1685,1686,401,1688,405,1690,409,1692,413],{},[24,1687,400],{},[24,1689,404],{},[24,1691,408],{},[24,1693,412],{},[10,1695,416,1696,231],{},[24,1697,419],{},[33,1699],{},[36,1701,425],{"id":424},[10,1703,428,1704,432],{},[24,1705,431],{},[81,1707,1708,1712,1714],{},[84,1709,437,1710,441],{},[24,1711,440],{},[84,1713,444],{},[84,1715,447],{},[10,1717,450,1718,454],{},[24,1719,453],{},[250,1721,1722,1726,1730],{},[84,1723,1724,462],{},[24,1725,461],{},[84,1727,1728,468],{},[24,1729,467],{},[84,1731,1732,474],{},[24,1733,473],{},[10,1735,477,1736,480],{},[24,1737,419],{},[33,1739],{},[36,1741,486],{"id":485},[48,1743],{":config":50,"code":489},[10,1745,492,1746,231],{},[24,1747,495],{},[33,1749],{},[36,1751,501],{"id":500},[10,1753,504,1754,508,1756,512,1758,516,1760,520,1762,524],{},[24,1755,507],{},[24,1757,511],{},[24,1759,515],{},[24,1761,519],{},[153,1763,523],{},[10,1765,527,1766,530,1768,534],{},[153,1767,523],{},[24,1769,533],{},[280,1771,1772,1780],{},[283,1773,1774],{},[286,1775,1776,1778],{},[289,1777,543],{},[289,1779,546],{},[302,1781,1782,1792,1802,1810],{},[286,1783,1784,1790],{},[307,1785,1786,556,1788],{},[153,1787,555],{},[153,1789,559],{},[307,1791,562],{},[286,1793,1794,1800],{},[307,1795,1796,556,1798],{},[153,1797,569],{},[153,1799,572],{},[307,1801,575],{},[286,1803,1804,1808],{},[307,1805,1806],{},[153,1807,582],{},[307,1809,585],{},[286,1811,1812,1816],{},[307,1813,1814],{},[153,1815,592],{},[307,1817,595],{},[10,1819,598],{},[10,1821,601,1822,605,1824,609],{},[24,1823,604],{},[153,1825,608],{},[611,1827,1829],{"className":1828,"code":615,"language":616,"meta":617},[614],[153,1830,615],{"__ignoreMap":617},[10,1832,622,1833,626],{},[24,1834,625],{},[33,1836],{},[36,1838,632],{"id":631},[10,1840,635,1841,639],{},[24,1842,638],{},[611,1844,1846],{"className":1845,"code":643,"language":616},[614],[153,1847,643],{"__ignoreMap":617},[10,1849,648,1850,652],{},[153,1851,651],{},[53,1853,656],{"id":655},[10,1855,659,1856,663],{},[153,1857,662],{},[611,1859,1861],{"className":1860,"code":668,"language":669,"meta":617},[667],[153,1862,668],{"__ignoreMap":617},[10,1864,674,1865,678],{},[24,1866,677],{},[53,1868,682],{"id":681},[10,1870,685,1871,692],{},[24,1872,1873],{},[689,1874,691],{},[250,1876,1877,1883,1889,1893,1899],{},[84,1878,1879,700,1881,704],{},[24,1880,699],{},[153,1882,703],{},[84,1884,1885,710,1887,714],{},[24,1886,709],{},[24,1888,713],{},[84,1890,1891,720],{},[24,1892,719],{},[84,1894,1895,726,1897,205],{},[24,1896,725],{},[24,1898,729],{},[84,1900,1901,735],{},[24,1902,734],{},[10,1904,738,1905,742,1907,746],{},[24,1906,741],{},[153,1908,745],{},[10,1910,1911],{},[13,1912],{"alt":751,"src":752},[33,1914],{},[36,1916,758],{"id":757},[10,1918,761,1919,765,1921,769,1923,773],{},[153,1920,764],{},[153,1922,768],{},[24,1924,772],{},[53,1926,777,1927,781],{"id":776},[153,1928,780],{},[10,1930,784,1931,231],{},[24,1932,787],{},[10,1934,790],{},[250,1936,1937,1941,1945,1949,1957],{},[84,1938,795,1939,799],{},[24,1940,798],{},[84,1942,802,1943,205],{},[153,1944,805],{},[84,1946,808,1947,812],{},[24,1948,811],{},[84,1950,815,1951,819,1953,823,1955,205],{},[24,1952,818],{},[153,1954,822],{},[153,1956,826],{},[84,1958,829,1959,833],{},[24,1960,832],{},[10,1962,1963,839,1965,843],{},[24,1964,838],{},[153,1966,842],{},[53,1968,847,1969,851],{"id":846},[153,1970,850],{},[10,1972,854,1973,231],{},[24,1974,857],{},[10,1976,860,1977,864],{},[153,1978,863],{},[53,1980,868],{"id":867},[10,1982,871,1983,534],{},[24,1984,1985],{},[689,1986,876],{},[611,1988,1990],{"className":1989,"code":880,"language":616},[614],[153,1991,880],{"__ignoreMap":617},[10,1993,885,1994,889,1996,893],{},[153,1995,888],{},[153,1997,892],{},[33,1999],{},[36,2001,899],{"id":898},[10,2003,902,2004,905],{},[153,2005,651],{},[53,2007,909],{"id":908},[10,2009,912,2010,916],{},[153,2011,915],{},[53,2013,920],{"id":919},[250,2015,2016,2022,2026],{},[84,2017,2018,928,2020,931],{},[24,2019,927],{},[153,2021,842],{},[84,2023,2024,937],{},[24,2025,936],{},[84,2027,2028,943],{},[24,2029,942],{},[10,2031,946,2032,950,2034,231],{},[24,2033,949],{},[24,2035,953],{},[33,2037],{},[36,2039,959],{"id":958},[10,2041,962,2042,534],{},[24,2043,965],{},[280,2045,2046,2054],{},[283,2047,2048],{},[286,2049,2050,2052],{},[289,2051,974],{},[289,2053,977],{},[302,2055,2056,2062,2070,2076,2082],{},[286,2057,2058,2060],{},[307,2059,984],{},[307,2061,987],{},[286,2063,2064,2066],{},[307,2065,992],{},[307,2067,995,2068,999],{},[153,2069,998],{},[286,2071,2072,2074],{},[307,2073,1004],{},[307,2075,1007],{},[286,2077,2078,2080],{},[307,2079,1012],{},[307,2081,1015],{},[286,2083,2084,2086],{},[307,2085,1020],{},[307,2087,1023],{},[10,2089,2090],{},[13,2091],{"alt":1020,"src":1028},[33,2093],{},[36,2095,1034],{"id":1033},[10,2097,1037,2098,1041],{},[24,2099,1040],{},[10,2101,1044,2102,1048,2104,1052,2106,1056,2108,1060],{},[24,2103,1047],{},[24,2105,1051],{},[24,2107,1055],{},[24,2109,1059],{},[53,2111,1064],{"id":1063},[81,2113,2114,2120],{},[84,2115,2116,1072,2118,231],{},[24,2117,1071],{},[24,2119,1075],{},[84,2121,2122,1081,2124,231],{},[24,2123,1080],{},[24,2125,1084],{},[10,2127,1087,2128,1091,2130,1095],{},[24,2129,1090],{},[24,2131,1094],{},[33,2133],{},[53,2135,1101],{"id":1100},[10,2137,1104,2138,1108,2140,1112],{},[24,2139,1107],{},[24,2141,1111],{},[10,2143,1115],{},[81,2145,2146,2152,2154],{},[84,2147,1120,2148,1124,2150,1128],{},[24,2149,1123],{},[24,2151,1127],{},[84,2153,1131],{},[84,2155,1134,2156,1138],{},[24,2157,1137],{},[10,2159,1141,2160,1145,2162,1149],{},[24,2161,1144],{},[24,2163,1148],{},[10,2165,2166],{},[13,2167],{"alt":1154,"src":1155},[33,2169],{},[53,2171,1161],{"id":1160},[10,2173,1164,2174,1168,2176,1172,2178,1176],{},[24,2175,1167],{},[24,2177,1171],{},[24,2179,1175],{},[10,2181,1179,2182,1183,2184,1187],{},[24,2183,1182],{},[24,2185,1186],{},[33,2187],{},[53,2189,1193],{"id":1192},[10,2191,1196,2192,1200,2194,1204,2196,1208,2198,1214],{},[24,2193,1199],{},[24,2195,1203],{},[24,2197,1207],{},[24,2199,1211,2200],{},[153,2201,842],{},[10,2203,1217,2204,1221,2206,231],{},[24,2205,1220],{},[24,2207,1224],{},[33,2209],{},[53,2211,1230],{"id":1229},[10,2213,1233,2214,1237,2216,1241,2218,1245,2220,1249],{},[24,2215,1236],{},[24,2217,1240],{},[24,2219,1244],{},[24,2221,1248],{},[10,2223,1252,2224,231],{},[24,2225,1255],{},[33,2227],{},[36,2229,1261],{"id":1260},[280,2231,2232,2242],{},[283,2233,2234],{},[286,2235,2236,2238,2240],{},[289,2237,1270],{},[289,2239,1273],{},[289,2241,1276],{},[302,2243,2244,2252,2262,2272,2280,2288],{},[286,2245,2246,2248,2250],{},[307,2247,1283],{},[307,2249,1286],{},[307,2251,1289],{},[286,2253,2254,2256,2260],{},[307,2255,1294],{},[307,2257,2258,1299],{},[153,2259,155],{},[307,2261,1302],{},[286,2263,2264,2266,2270],{},[307,2265,1307],{},[307,2267,1310,2268],{},[24,2269,1313],{},[307,2271,1316],{},[286,2273,2274,2276,2278],{},[307,2275,1321],{},[307,2277,1324],{},[307,2279,1327],{},[286,2281,2282,2284,2286],{},[307,2283,1332],{},[307,2285,1335],{},[307,2287,1338],{},[286,2289,2290,2292,2294],{},[307,2291,1343],{},[307,2293,1346],{},[307,2295,1349],{},[10,2297,1352,2298,1356],{},[24,2299,1355],{},[10,2301,1359,2302,1363,2304,1367],{},[24,2303,1362],{},[24,2305,1366],{},[18,2307,2308],{},[10,2309,1372,2310,1378,2313,231],{},[242,2311,1377],{"href":1375,"rel":2312},[246],[242,2314,1382],{"href":1381},{"title":617,"searchDepth":1384,"depth":1384,"links":2316},[2317,2322,2323,2324,2325,2329,2334,2338,2339,2346],{"id":38,"depth":1384,"text":39,"children":2318},[2319,2320,2321],{"id":55,"depth":1389,"text":56},{"id":137,"depth":1389,"text":138},{"id":234,"depth":1389,"text":235},{"id":424,"depth":1384,"text":425},{"id":485,"depth":1384,"text":486},{"id":500,"depth":1384,"text":501},{"id":631,"depth":1384,"text":632,"children":2326},[2327,2328],{"id":655,"depth":1389,"text":656},{"id":681,"depth":1389,"text":682},{"id":757,"depth":1384,"text":758,"children":2330},[2331,2332,2333],{"id":776,"depth":1389,"text":1402},{"id":846,"depth":1389,"text":1404},{"id":867,"depth":1389,"text":868},{"id":898,"depth":1384,"text":899,"children":2335},[2336,2337],{"id":908,"depth":1389,"text":909},{"id":919,"depth":1389,"text":920},{"id":958,"depth":1384,"text":959},{"id":1033,"depth":1384,"text":1034,"children":2340},[2341,2342,2343,2344,2345],{"id":1063,"depth":1389,"text":1064},{"id":1100,"depth":1389,"text":1101},{"id":1160,"depth":1389,"text":1161},{"id":1192,"depth":1389,"text":1193},{"id":1229,"depth":1389,"text":1230},{"id":1260,"depth":1384,"text":1261},{},{"title":5,"description":1421},[1430,1431,1432],1780489852822]