[{"data":1,"prerenderedAt":1436},["ShallowReactive",2],{"blog-list-ru-ru":3},[4],{"id":5,"title":6,"body":7,"config":1420,"date":1421,"description":1422,"draft":1423,"extension":1424,"image":1420,"meta":1425,"navigation":1426,"path":1427,"seo":1428,"stem":1429,"tags":1430,"toolbar":1420,"translationKey":1434,"updated":1421,"__hash__":1435},"blog/ru-ru/blog/zero-hallucination-qa.md","Как я реализовал «нулевую галлюцинацию» в Q&A читалки",{"type":8,"value":9,"toc":1384},"minimark",[10,18,33,36,41,48,53,58,76,81,94,99,133,136,140,158,165,169,184,189,226,233,237,250,275,280,397,415,421,423,427,434,449,456,476,482,484,488,491,497,499,503,526,536,597,600,611,621,628,630,634,641,647,654,658,665,673,680,684,694,737,748,754,756,760,775,783,789,792,835,845,853,859,866,870,878,884,895,897,901,907,911,918,922,945,955,957,961,967,1025,1030,1032,1036,1043,1062,1066,1086,1097,1099,1103,1114,1117,1140,1151,1157,1159,1163,1178,1189,1191,1195,1216,1226,1228,1232,1251,1257,1259,1263,1351,1358,1369],[11,12,13],"p",{},[14,15],"img",{"alt":16,"src":17},"Обложка: Q&A без галлюцинаций","https://cdn.linghuxiong.com/resources/snapshots/ai-chat-cover.png",[19,20,21],"blockquote",{},[11,22,23,24,28,29,32],{},"В этой статье рассказываю об инженерной реализации ",[25,26,27],"strong",{},"Q&A без галлюцинаций"," в AI-читалке: ответы строго опираются на текст открытой книги, а ключевые утверждения можно ",[25,30,31],{},"проследить в один клик"," до конкретного фрагмента. Если вы делаете AI-чтение, document QA или RAG-приложения, надеюсь, три итерации опыта и финальная архитектура будут полезны.",[34,35],"hr",{},[37,38,40],"h2",{"id":39},"i-практический-путь-эволюция-в-три-этапа","I. Практический путь: эволюция в три этапа",[11,42,43,44,47],{},"Q&A без галлюцинаций не был спроектирован идеально с первого дня — он эволюционировал под давлением ",[25,45,46],{},"стоимости, задержки и точности",". Ниже — хронологический обзор трёх этапов, чтобы понять, почему текущая архитектура выглядит именно так.",[49,50],"mermaid",{":config":51,"code":52},"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",[54,55,57],"h3",{"id":56},"этап-1-весь-текст-в-context-самый-простой-и-первый-кто-сломался","Этап 1: Весь текст в Context (самый простой — и первый, кто сломался)",[11,59,60,63,64,67,68,71,72,75],{},[25,61,62],{},"Подход:"," Когда пользователь открывает книгу и задаёт вопрос, ",[25,65,66],{},"весь извлечённый основной текст"," помещается в System Prompt или User-сообщение, и диалоговая модель отвечает. Если книга превышает примерно ",[25,69,70],{},"400 000 символов",", выполняется ",[25,73,74],{},"жёсткое обрезание"," — остаётся только начало, последующие главы для модели невидимы.",[11,77,78],{},[25,79,80],{},"Плюсы:",[82,83,84,88,91],"ul",{},[85,86,87],"li",{},"Очень низкая стоимость реализации, почти без предобработки;",[85,89,90],{},"На коротких книгах и простых документах работает неплохо — модель действительно «видела всю книгу»;",[85,92,93],{},"Простой UX: спросил — получил ответ, без состояния «подождите, пока мы анализируем».",[11,95,96],{},[25,97,98],{},"Минусы (быстро становятся неприемлемыми):",[82,100,101,107,113,123],{},[85,102,103,106],{},[25,104,105],{},"Медленные ответы:"," Каждый вопрос заново отправляет огромный объём текста; задержка до первого токена и общее время растут с длиной книги;",[85,108,109,112],{},[25,110,111],{},"Высокая стоимость токенов:"," За каждый вопрос вы платите за полный ввод текста книги;",[85,114,115,118,119,122],{},[25,116,117],{},"Длинные книги сильно искажаются:"," После 400 000 символов вторая половина, приложения и заключения для модели как бы не существуют — и UI часто ",[25,120,121],{},"не сообщает явно",", что произошло обрезание;",[85,124,125,128,129,132],{},[25,126,127],{},"Нулевая гранулярность поиска:"," Модель должна «найти иголку в стоге сена» среди сотен тысяч символов — легко упустить детали и проще получить ",[25,130,131],{},"правдоподобные обобщения без оснований"," — именно то, чего сценарий чтения должен избегать.",[11,134,135],{},"Этап 1 подходит для MVP, но не для продуктового решения.",[54,137,139],{"id":138},"этап-2-лёгкий-llm-извлекает-ключевые-предложения-сжатие-context-но-слишком-агрессивное","Этап 2: Лёгкий LLM извлекает ключевые предложения (сжатие Context — но слишком агрессивное)",[11,141,142,144,145,148,149,152,153,157],{},[25,143,62],{}," Перед Q&A (или при первом открытии книги) ",[25,146,147],{},"более дешёвая модель"," обрабатывает основной текст: разбивает по главам Spine (или сегментирует всю книгу), извлекает ",[25,150,151],{},"ключевые предложения",", сохраняет метки позиций вида ",[154,155,156],"code",{},"[fфайл-начало-конец]",", затем склеивает выдержки в более короткий Context для последующего Q&A.",[11,159,160,161,164],{},"Типичный пайплайн: ",[25,162,163],{},"Extract → Cache → Chat",". Сначала один раз (офлайн или по запросу) выполняется извлечение и сохранение «набора ключевых предложений», затем он переиспользуется при каждом вопросе — та же идея, что во многих прототипах document QA: сначала сжать документ, потом отвечать.",[11,166,167],{},[25,168,80],{},[82,170,171,178,181],{},[85,172,173,174,177],{},"При каждом вопросе в модель уходит ",[25,175,176],{},"значительно меньше текста","; расход токенов на запрос заметно ниже, чем на этапе 1;",[85,179,180],{},"Результат предобработки можно кэшировать — для одной книги не нужно извлекать заново при каждом вопросе;",[85,182,183],{},"Уже введены метки позиций — основа для последующей трассировки.",[11,185,186],{},[25,187,188],{},"Минусы (на длинных книгах всё ещё не выдерживает):",[82,190,191,197,207,216],{},[85,192,193,196],{},[25,194,195],{},"Массовая потеря деталей:"," «Ключевые предложения» отбирает модель субъективно — ограничения, контрпримеры и звенья аргументации легко теряются, ответы становятся «верными, но односторонними»;",[85,198,199,202,203,206],{},[25,200,201],{},"Context на длинных книгах всё ещё велик:"," Даже только ключевые предложения для крупных произведений дают заметный объём — ",[25,204,205],{},"задержка и стоимость снижаются, но не решаются",";",[85,208,209,212,213,206],{},[25,210,211],{},"Двойная ошибка LLM:"," На этапе извлечения что-то может быть пропущено, на этапе Q&A выдержки могут быть неверно прочитаны — ошибки ",[25,214,215],{},"накапливаются",[85,217,218,221,222,225],{},[25,219,220],{},"Статический Context:"," Независимо от того, спрашивает ли пользователь о деталях одной главы или о структуре всей книги, модель всегда получает ",[25,223,224],{},"один и тот же предварительно извлечённый текст"," — без динамического сужения по вопросу.",[11,227,228,229,232],{},"Урок этого этапа ясен: дело не в «сжимать или нет», а в том, ",[25,230,231],{},"сжимается ли контент по запросу и можно ли вернуться к исходному тексту",".",[54,234,236],{"id":235},"этап-3-индекс-сегментов-tool-поиск-по-запросу-возврат-исходного-текста-текущая-схема","Этап 3: Индекс сегментов + Tool-поиск по запросу + возврат исходного текста (текущая схема)",[11,238,239,241,242,249],{},[25,240,62],{}," Основная идея заимствована из ",[243,244,248],"a",{"href":245,"rel":246},"https://github.com/VectifyAI/PageIndex",[247],"nofollow","PageIndex",". По сравнению с этапом 2 три ключевых изменения:",[251,252,253,259,269],"ol",{},[85,254,255,258],{},[25,256,257],{},"Результат предобработки — структурированный индекс"," (краткие описания на уровне оглавления + точные символьные span), а не выдержки, используемые напрямую как Context для Q&A;",[85,260,261,264,265,268],{},[25,262,263],{},"При каждом вопросе модель через Tool Calling ищет по запросу",", затем ",[25,266,267],{},"подтягивает исходный текст с метками позиций"," для ответа;",[85,270,271,274],{},[25,272,273],{},"System Prompt и фронтенд"," совместно задают формат цитирования и поддерживают переход по сноскам с подсветкой исходного текста.",[11,276,277],{},[25,278,279],{},"Сравнение трёх этапов:",[281,282,283,302],"table",{},[284,285,286],"thead",{},[287,288,289,293,296,299],"tr",{},[290,291,292],"th",{},"Измерение",[290,294,295],{},"Этап 1 (весь текст)",[290,297,298],{},"Этап 2 (ключевые предложения)",[290,300,301],{},"Этап 3 (текущий)",[303,304,305,324,338,352,366,383],"tbody",{},[287,306,307,311,314,317],{},[308,309,310],"td",{},"Context на один вопрос",[308,312,313],{},"Вся книга (или обрезанная первая половина)",[308,315,316],{},"Предварительно извлечённые ключевые предложения",[308,318,319,320,323],{},"Только ",[25,321,322],{},"исходные"," фрагменты, релевантные вопросу",[287,325,326,329,332,335],{},[308,327,328],{},"Точность на длинных книгах",[308,330,331],{},"Резко падает после ~400k символов",[308,333,334],{},"Зависит от качества извлечения, теряются детали",[308,336,337],{},"Поиск по оглавлению/span, без жёсткого обрезания всей книги",[287,339,340,343,346,349],{},[308,341,342],{},"Скорость ответа",[308,344,345],{},"Медленно",[308,347,348],{},"Немного лучше; длинные книги всё ещё медленно",[308,350,351],{},"Поиск + короткий Context — заметно быстрее",[287,353,354,357,360,363],{},[308,355,356],{},"Стоимость токенов",[308,358,359],{},"Очень высокая",[308,361,362],{},"Средне-высокая",[308,364,365],{},"Амортизированная предобработка + оплата по запросу",[287,367,368,371,374,377],{},[308,369,370],{},"Трассируемость",[308,372,373],{},"Слабая (сложно указать источник)",[308,375,376],{},"Метки есть, но контент уже вторично отфильтрован",[308,378,379,380],{},"Сноски соответствуют ",[25,381,382],{},"реальным исходным span",[287,384,385,388,391,394],{},[308,386,387],{},"Инженерная сложность",[308,389,390],{},"Низкая",[308,392,393],{},"Средняя",[308,395,396],{},"Высокая",[11,398,399,402,403,406,407,410,411,414],{},[25,400,401],{},"Почему остановились на этапе 3:"," Для сценария чтения «нулевая галлюцинация» — это не «показать модели как можно больше текста», а ",[25,404,405],{},"«перед ответом получить исходные доказательства, релевантные вопросу»",". Этапы 1–2 боролись с ",[25,408,409],{},"объёмом Context","; этап 3 разбивает цепочку на ",[25,412,413],{},"«индекс (предобработка) → поиск (Tool) → доказательства (исходный текст) → ответ (ограниченная генерация)»"," — и одновременно балансирует точность, стоимость и трассируемость.",[11,416,417,418,232],{},"Ниже — детали реализации ",[25,419,420],{},"этапа 3",[34,422],{},[37,424,426],{"id":425},"ii-постановка-задачи-в-qa-по-книге-галлюцинации-опаснее-чем-в-обычном-chat","II. Постановка задачи: в Q&A по книге галлюцинации опаснее, чем в обычном Chat",[11,428,429,430,433],{},"В обычном ChatBot пользователи часто терпят случайные ошибки. В ",[25,431,432],{},"Q&A по книге"," цена выше:",[82,435,436,443,446],{},[85,437,438,439,442],{},"Пользователь спрашивает, что говорит ",[25,440,441],{},"эта книга",", а не что хранится в parametric memory модели;",[85,444,445],{},"Одно правдоподобное «мнение из книги» может ввести в заблуждение заметки, цитаты и повторные публикации;",[85,447,448],{},"Без указания источника пользователь не может проверить — доверие к продукту сложно построить.",[11,450,451,452,455],{},"Поэтому «нулевая галлюцинация» в инженерии сводится к трём ",[25,453,454],{},"исполнимым"," правилам:",[251,457,458,464,470],{},[85,459,460,463],{},[25,461,462],{},"Вопросы о книге сначала ищут в книге:"," Всё, что может относиться к открытой книге, модель должна сначала прогнать через поиск (Tool), затем формировать ответ;",[85,465,466,469],{},[25,467,468],{},"Ответы должны быть трассируемы:"," Ключевые выводы сопровождаются метками позиций в исходном тексте, которые фронтенд может разобрать и по которым можно перейти с подсветкой;",[85,471,472,475],{},[25,473,474],{},"Если не нашли — так и сказать:"," Если в книге этого нет, нужно явно сообщить, а не выдавать общие знания за «мнение из книги».",[11,477,478,479,481],{},"Далее — по потоку данных ",[25,480,420],{},", как эти правила реализуются.",[34,483],{},[37,485,487],{"id":486},"iii-общая-архитектура-предобработка-tool-поиск-ограниченная-генерация-кликабельная-трассировка","III. Общая архитектура: предобработка → Tool-поиск → ограниченная генерация → кликабельная трассировка",[49,489],{":config":51,"code":490},"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",[11,492,493,494,232],{},"Ключевая идея: ",[25,495,496],{},"не давать модели «отвечать по памяти» — заставить её «сначала собрать доказательства, потом ответить и указать источники»",[34,498],{},[37,500,502],{"id":501},"iv-предобработка-превращаем-всю-книгу-в-индекс-сегментов-для-поиска","IV. Предобработка: превращаем всю книгу в «индекс сегментов» для поиска",[11,504,505,506,509,510,513,514,517,518,521,522,525],{},"Если при каждом вопросе использовать Context всей книги как на ",[25,507,508],{},"этапе 1",", длинные книги неизбежно переполнят бюджет токенов, а гранулярность поиска будет слишком грубой. Решение этапа 3: при первом AI-диалоге с книгой в фоне запускается ",[25,511,512],{},"задача кратких описаний сегментов"," — книга делится по ",[25,515,516],{},"структуре оглавления"," или ",[25,519,520],{},"длине текста"," на несколько ",[154,523,524],{},"Segment",", для каждого генерируется краткое описание, результат сохраняется локально в IndexedDB.",[11,527,528,529,531,532,535],{},"Каждый ",[154,530,524],{}," в структуре данных содержит краткое описание и ",[25,533,534],{},"физическую позицию в основном тексте",":",[281,537,538,548],{},[284,539,540],{},[287,541,542,545],{},[290,543,544],{},"Поле",[290,546,547],{},"Значение",[303,549,550,564,577,587],{},[287,551,552,561],{},[308,553,554,557,558],{},[154,555,556],{},"startFileIndex"," / ",[154,559,560],{},"endFileIndex",[308,562,563],{},"Индекс файла Spine (для PDF — один файл на страницу)",[287,565,566,574],{},[308,567,568,557,571],{},[154,569,570],{},"startOffset",[154,572,573],{},"endOffset",[308,575,576],{},"Символьные смещения начала и конца",[287,578,579,584],{},[308,580,581],{},[154,582,583],{},"sequence",[308,585,586],{},"Линейный порядок чтения",[287,588,589,594],{},[308,590,591],{},[154,592,593],{},"title",[308,595,596],{},"Заголовок из оглавления",[11,598,599],{},"Стратегия разбиения балансирует точность и стоимость: если основной текст одного узла оглавления не превышает ~20 KB, суммируется только этот узел; узлы одного уровня могут объединяться в пакеты (15–20 KB) перед вызовом LLM; крупные блоки без оглавления режутся интервалами ~30–40k символов.",[11,601,602,603,606,607,610],{},"System Prompt при генерации кратких описаний требует ",[25,604,605],{},"сохранять встроенные метки позиций"," (формат ",[154,608,609],{},"[fчисло-число-число]","), чтобы при возврате исходного текста через Tool информация о позиции совпадала со смещениями символов Spine. Основное ограничение:",[612,613,619],"pre",{"className":614,"code":616,"language":617,"meta":618},[615],"language-text","Если содержание краткого описания связано с фрагментом исходного текста, сохраните метку позиции в конце фрагмента в формате [fчисло-число-число] (например, [f1-90-109]).\nМетка позиции — единое целое; запрещено изменять, объединять или опускать любой символ или цифру.\n","text","",[154,620,616],{"__ignoreMap":618},[11,622,623,624,627],{},"После предобработки Q&A опирается не на «Context всей книги», а на ",[25,625,626],{},"структурированный индекс сегментов"," — инженерная предпосылка «нулевой галлюцинации» для длинных книг.",[34,629],{},[37,631,633],{"id":632},"v-система-меток-позиций-кодируем-источник-в-текст","V. Система меток позиций: кодируем «источник» в текст",[11,635,636,637,640],{},"«Нулевая галлюцинация» требует не только контент из исходного текста, но и ",[25,638,639],{},"машинно разбираемый, переходимый в UI источник",". Используем встроенные метки:",[612,642,645],{"className":643,"code":644,"language":617},[615],"[f{fileIndex}-{startChar}-{endChar}]\n",[154,646,644],{"__ignoreMap":618},[11,648,649,650,653],{},"Например, ",[154,651,652],{},"[f5-123-165]"," означает: в 5-м файле Spine (с нуля) символьный интервал 123–165.",[54,655,657],{"id":656},"_51-как-метки-записываются-в-основной-текст","5.1 Как метки записываются в основной текст",[11,659,660,661,664],{},"Слой извлечения текста при выводе фрагментов дописывает в конец каждого небольшого сегмента ",[154,662,663],{},"[f{fileIndex}-{start}-{end}]",". Схема:",[612,666,671],{"className":667,"code":669,"language":670,"meta":618},[668],"language-typescript","const position = `[f${fileIndex}-${absOffset}-${absOffset + segment.length}]`;\nfileLines.push(segment.text.trim() + position);\n","typescript",[154,672,669],{"__ignoreMap":618},[11,674,675,676,679],{},"И в кратких описаниях предобработки, и в выдержках исходного текста, возвращаемых Tool, позиции выровнены по ",[25,677,678],{},"символьным смещениям Spine",", а не по «оценочным номерам страниц» модели.",[54,681,683],{"id":682},"_52-ограничения-на-вывод-модели","5.2 Ограничения на вывод модели",[11,685,686,687,693],{},"При сборке System Prompt отдельно задаются ",[25,688,689],{},[690,691,692],"span",{},"Position Citation Rules"," — пять основных пунктов:",[251,695,696,706,716,722,731],{},[85,697,698,701,702,705],{},[25,699,700],{},"Стандартный формат:"," Обязательно ",[154,703,704],{},"[f_fileIndex-startChar-endChar]","; все три числовые части обязательны;",[85,707,708,711,712,715],{},[25,709,710],{},"Только из текущих источников:"," Сноски должны быть ",[25,713,714],{},"дословно скопированы"," из System/User-сообщений или возвратов Tool текущего хода;",[85,717,718,721],{},[25,719,720],{},"Запрет подделки:"," Не вычислять, не изменять и не выдумывать позиции;",[85,723,724,727,728,206],{},[25,725,726],{},"Лучше опустить:"," Если в контексте нет допустимой метки — отвечать нормально, ",[25,729,730],{},"не выводить метки позиций",[85,732,733,736],{},[25,734,735],{},"Сразу после утверждения:"," Метки следуют за соответствующим предложением; запрещены списки цитат в конце текста.",[11,738,739,740,743,744,747],{},"Перед отображением фронтенд также фильтрует случайные ",[25,741,742],{},"двухчастные"," недопустимые метки (например, ",[154,745,746],{},"[f1-293]","), чтобы в UI не попадали битые сноски.",[11,749,750],{},[14,751],{"alt":752,"src":753},"Всплывающее окно трассировки цитаты","https://cdn.linghuxiong.com/resources/snapshots/ai-chat.png",[34,755],{},[37,757,759],{"id":758},"vi-tool-calling-сначала-поиск-потом-ответ","VI. Tool Calling: сначала поиск, потом ответ",[11,761,762,763,766,767,770,771,774],{},"Когда диалог привязан к книге (есть ",[154,764,765],{},"resourceId",", ",[154,768,769],{},"chatType === 'chat'","), перед каждой генерацией регистрируются два Tool с соответствующими executor — стандартный цикл ",[25,772,773],{},"function calling"," в стиле OpenAI.",[54,776,778,779,782],{"id":777},"_61-get_related_segment_summaries-целевой-поиск-по-сегментам","6.1 ",[154,780,781],{},"get_related_segment_summaries"," — целевой поиск по сегментам",[11,784,785,786,232],{},"Для: концепций, персонажей, сюжета, деталей глав — ",[25,787,788],{},"явное намерение поиска",[11,790,791],{},"Краткий поток:",[251,793,794,801,807,814,828],{},[85,795,796,797,800],{},"Модель перефразирует разговорную формулировку пользователя в ",[25,798,799],{},"термины, вероятно встречающиеся в книге"," («Optimize Search Queries» в System Prompt);",[85,802,803,804,206],{},"Вызов Tool с параметром ",[154,805,806],{},"question",[85,808,809,810,813],{},"Все краткие описания сегментов ",[25,811,812],{},"батчами"," по бюджету токенов (~30k токенов на батч, максимум 5 батчей);",[85,815,816,817,820,821,824,825,206],{},"Каждый батч — ",[25,818,819],{},"отдельный LLM-запрос",": из списка ",[154,822,823],{},"{ id, title, summary }"," выбираются релевантные ID сегментов (максимум 5), возвращается JSON вида ",[154,826,827],{},"{\"Thinking\":\"...\",\"answer\":[\"1\",\"3\"]}",[85,829,830,831,834],{},"По span выбранных Segment из Spine ",[25,832,833],{},"подтягивается исходный текст с метками позиций"," (не краткое описание) как результат Tool.",[11,836,837,840,841,844],{},[25,838,839],{},"Ключевое проектное решение: Tool возвращает исходный текст, а не краткие описания."," Модель отвечает по реальным абзацам со встроенными ",[154,842,843],{},"[f…]",", избегая дрейфа «краткое описание → повторное обобщение».",[54,846,848,849,852],{"id":847},"_62-get_full_book_segment_summaries-вопросы-об-обзоре-всей-книги","6.2 ",[154,850,851],{},"get_full_book_segment_summaries"," — вопросы об обзоре всей книги",[11,854,855,856,232],{},"Для: «кратко перескажи книгу», «оцени эту книгу», «общая структура / темы» — ",[25,857,858],{},"глобальный обзор",[11,860,861,862,865],{},"Склеиваются поля ",[154,863,864],{},"summary"," всех сегментов в порядке чтения — чтобы не пропустить ключевые главы из-за отбора только по релевантности отдельных фрагментов.",[54,867,869],{"id":868},"_63-system-prompt-книга-в-приоритете-инструменты-в-приоритете","6.3 System Prompt: книга в приоритете, инструменты в приоритете",[11,871,872,873,535],{},"При привязанной книге применяется ",[25,874,875],{},[690,876,877],{},"Core Principles for Reading Assistant",[612,879,882],{"className":880,"code":881,"language":617},[615],"1. Book First, Tool First\n   - Любой вопрос, который может относиться к книге, сначала требует вызова Tool;\n   - Ответ должен опираться в основном на результаты поиска — запрещено выдумывать «содержание книги» без поиска.\n\n2. General Knowledge as Fallback Only\n   - Только для: свободной беседы / явного отказа пользователя от книги / пустого результата Tool;\n   - Если в книге этого нет — сначала заявить «в этой книге это не упоминается», затем при необходимости добавить общие знания.\n\n3. Direct Style\n   - Сразу к сути — без «на основе предоставленных материалов…», «в заключение…» и подобных шаблонов.\n",[154,883,881],{"__ignoreMap":618},[11,885,886,887,890,891,894],{},"Слой генерации реализует стандартный цикл Tool: ",[154,888,889],{},"tool_calls"," → выполнение executor → добавление ",[154,892,893],{},"role: tool"," → продолжение запроса до финального текста. При включённых tools канал thinking отключён, чтобы избежать конфликта с протоколом function call.",[34,896],{},[37,898,900],{"id":899},"vii-трассировка-на-фронтенде-от-сноски-к-подсветке-исходного-текста","VII. Трассировка на фронтенде: от сноски к подсветке исходного текста",[11,902,903,904,906],{},"Вывод модели ",[154,905,652],{}," не показывается как есть — слой рендеринга превращает его в кликабельные цитаты.",[54,908,910],{"id":909},"_71-отрисовка-сносок","7.1 Отрисовка сносок",[11,912,913,914,917],{},"Перед показом метки позиций нормализуются в Markdown-ссылки, например ",[154,915,916],{},"[1]([f5-123-165])",", затем отображаются как нумерованные сноски; при повторении одной позиции — дедупликация, чтобы не загромождать UI.",[54,919,921],{"id":920},"_72-клик","7.2 Клик",[251,923,924,933,939],{},[85,925,926,929,930,932],{},[25,927,928],{},"Первый клик:"," Разбор ",[154,931,843],{}," → fileIndex и смещения символов → извлечение текста из Spine → всплывающий предпросмотр (опционально с заголовком из оглавления);",[85,934,935,938],{},[25,936,937],{},"Повторный клик по той же сноске:"," Закрыть предпросмотр;",[85,940,941,944],{},[25,942,943],{},"Подтверждение перехода:"," Открыть вид чтения, подсветить символьный интервал.",[11,946,947,948,951,952,232],{},"От скопированной моделью метки до текста, который видит пользователь, цепочка ",[25,949,950],{},"не проходит через повторный вызов LLM"," — полностью ",[25,953,954],{},"детерминирована и воспроизводима",[34,956],{},[37,958,960],{"id":959},"viii-граничные-случаи-и-честная-деградация","VIII. Граничные случаи и честная деградация",[11,962,963,964,535],{},"«Нулевая галлюцинация» ≠ «всегда есть ответ» — это ",[25,965,966],{},"нет доказательств, нет выдумки",[281,968,969,979],{},[284,970,971],{},[287,972,973,976],{},[290,974,975],{},"Сценарий",[290,977,978],{},"Поведение",[303,980,981,989,1001,1009,1017],{},[287,982,983,986],{},[308,984,985],{},"Краткие описания сегментов ещё не готовы",[308,987,988],{},"Сначала извлечь полный текст и выполнить суммирование",[287,990,991,994],{},[308,992,993],{},"Tool ничего не нашёл",[308,995,996,997,1000],{},"Вернуть ",[154,998,999],{},"(No relevant segment excerpts found…)","; модель должна заявить, что в книге не упоминается",[287,1002,1003,1006],{},[308,1004,1005],{},"Модель вывела недопустимую двухчастную метку",[308,1007,1008],{},"Фронтенд фильтрует; битые сноски не показываются",[287,1010,1011,1014],{},[308,1012,1013],{},"Свободная беседа пользователя",[308,1015,1016],{},"System Prompt разрешает общие знания вне книги",[287,1018,1019,1022],{},[308,1020,1021],{},"Экспорт диалога",[308,1023,1024],{},"Сноски можно превратить в deep link читалки для sharing или архива",[11,1026,1027],{},[14,1028],{"alt":1021,"src":1029},"https://cdn.linghuxiong.com/resources/snapshots/ai-chat-export.png",[34,1031],{},[37,1033,1035],{"id":1034},"ix-компромисс-проектирования-почему-не-векторный-rag","IX. Компромисс проектирования: почему не «векторный RAG»?",[11,1037,1038,1039,1042],{},"Коллеги, делающие document QA, часто спрашивают: если вы делаете retrieval-augmented generation, почему не ",[25,1040,1041],{},"Embedding + векторная БД Top-K","?",[11,1044,1045,1046,1049,1050,1053,1054,1057,1058,1061],{},"На самом деле ",[25,1047,1048],{},"мы тоже делаем RAG"," — перед каждым ответом сначала ищем в книге, потом генерируем. Разница в том, что в сообществе «RAG» часто подразумевает ",[25,1051,1052],{},"векторизацию и поиск по сходству","; текущая схема — ",[25,1055,1056],{},"«индекс сегментов + Tool с подтягиванием исходного текста по запросу»"," (этап 3), ",[25,1059,1060],{},"намеренно без векторного слоя",". Ниже — архитектурные причины выбора, а не отрицание ценности векторного RAG.",[54,1063,1065],{"id":1064},"определение-границ-не-без-поиска-а-без-векторного-поиска","Определение границ: не «без поиска», а «без векторного поиска»",[82,1067,1068,1077],{},[85,1069,1070,1073,1074,232],{},[25,1071,1072],{},"Широкий RAG:"," найти материалы → сгенерировать → ",[25,1075,1076],{},"мы это делаем",[85,1078,1079,1082,1083,232],{},[25,1080,1081],{},"Векторный RAG:"," recall через сходство Embedding → ",[25,1084,1085],{},"в текущей версии не делаем",[11,1087,1088,1089,1092,1093,1096],{},"Предобработка всей книги даёт ",[25,1090,1091],{},"индекс кратких описаний сегментов","; при вопросе модель через Tool выбирает сегменты, затем ",[25,1094,1095],{},"получает исходный текст",". Retrieval-augmented generation есть, но без отдельной embedding-модели и поддержки векторного индекса.",[34,1098],{},[54,1100,1102],{"id":1101},"причина-1-поддержка-пользовательских-llm-provider-минимальная-цепочка-конфигурации","Причина 1: поддержка пользовательских LLM Provider — минимальная цепочка конфигурации",[11,1104,1105,1106,1109,1110,1113],{},"Продукт позволяет подключать ",[25,1107,1108],{},"собственный API Key",", custom Base URL или ",[25,1111,1112],{},"локальный Ollama"," — диалоговая модель на выбор пользователя, контроль стоимости и пути данных. Для многих self-hosted сценариев и сравнения моделей это жёсткое требование.",[11,1115,1116],{},"Типичный векторный RAG заметно расширяет поверхность интеграции:",[82,1118,1119,1130,1133],{},[85,1120,1121,1122,1125,1126,1129],{},"Помимо ",[25,1123,1124],{},"Chat-модели"," обычно нужна ",[25,1127,1128],{},"Embedding-модель"," (другое имя model, иногда другой endpoint);",[85,1131,1132],{},"Локальный Ollama требует отдельно подтянуть embedding-модель и решать вопросы размерности и совместимости API;",[85,1134,1135,1136,1139],{},"Расширяется область отказов: Chat работает, но ",[25,1137,1138],{},"поиск пуст"," — возможны проблемы embedding, индекса или несовпадения размерности; отладка сложнее, чем «один Provider на всю цепочку».",[11,1141,1142,1143,1146,1147,1150],{},"В текущей схеме ",[25,1144,1145],{},"выбор сегментов и ответ используют одну конфигурацию Provider"," — без «Chat на A, индекс на B». Для приложений с ",[25,1148,1149],{},"подключаемым LLM"," это часто важнее нескольких процентов recall.",[11,1152,1153],{},[14,1154],{"alt":1155,"src":1156},"Пользовательские AI-провайдеры","https://cdn.linghuxiong.com/resources/snapshots/ai-customize-providers.png",[34,1158],{},[54,1160,1162],{"id":1161},"причина-2-embedding-жёстко-привязан-к-индексу-смена-provider-дорога","Причина 2: Embedding жёстко привязан к индексу — смена Provider дорога",[11,1164,1165,1166,1169,1170,1173,1174,1177],{},"В векторном RAG часто недооценивают: ",[25,1167,1168],{},"вектор — не универсальный промежуточный формат, а координаты в пространстве конкретной embedding-модели."," Индекс построен моделью A, запрос моделью B — сходство обычно ",[25,1171,1172],{},"несопоставимо","; смена модели часто означает ",[25,1175,1176],{},"полную повторную векторизацию книги",", а размерности (768 / 1024 / 1536 …) фиксируют схему хранения.",[11,1179,1180,1181,1184,1185,1188],{},"На этапе 3 сохраняются ",[25,1182,1183],{},"структурированные краткие описания + символьные span",", не векторы; при смене Chat-модели ",[25,1186,1187],{},"индекс перестраивать не нужно",", цепочка доказательств (позиции в исходном тексте) не меняется — это лучше согласуется с целью «в любой момент сравнивать разные LLM».",[34,1190],{},[54,1192,1194],{"id":1193},"причина-3-для-длинных-документов-с-оглавлением-структурированная-маршрутизация-часто-достаточна","Причина 3: для длинных документов с оглавлением структурированная маршрутизация часто достаточна",[11,1196,1197,1198,1201,1202,1205,1206,1209,1210,1215],{},"Электронные книги и PDF обычно имеют ",[25,1199,1200],{},"главную структуру","; предобработка даёт ",[25,1203,1204],{},"заголовки сегментов + краткие описания",". Для вопросов «что в главе X» или «как книга определяет Y» выбор сегментов из каталога и ",[25,1207,1208],{},"подтягивание исходного текста"," на практике работает стабильно; Tool возвращает ",[25,1211,1212,1213],{},"исходный текст с ",[154,1214,843],{},", и «нулевая галлюцинация» по-прежнему привязана к символьным span.",[11,1217,1218,1219,1222,1223,232],{},"Векторный поиск силён при семантической неоднозначности, кросс-языковых запросах, длинных абзацах без буквального совпадения; для читалки с ",[25,1220,1221],{},"оглавлением, предобработкой и сильной трассируемостью"," ROI выше, когда сложность вкладывается в ",[25,1224,1225],{},"Tool + возврат исходного текста + правила цитирования",[34,1227],{},[54,1229,1231],{"id":1230},"дальнейшее-направление-гибридный-recall-а-не-переписывание-с-нуля","Дальнейшее направление: гибридный recall, а не переписывание с нуля",[11,1233,1234,1235,1238,1239,1242,1243,1246,1247,1250],{},"Не исключаем в будущем ",[25,1236,1237],{},"грубый векторный recall"," (например, embedding только для Top-N кандидатов глав), с финалом всё равно в ",[25,1240,1241],{},"выбор сегмента → исходный текст → кликабельная трассировка"," — правила «нулевой галлюцинации» не меняются. При внедрении постараемся: Embedding ",[25,1244,1245],{},"опционален",", при смене модели — ",[25,1248,1249],{},"явное предупреждение о перестройке индекса",", без silent wrong retrieval.",[11,1252,1253,1254,232],{},"До тех пор приоритет: ",[25,1255,1256],{},"работает любой OpenAI-совместимый Chat API; смена Chat-модели не требует перестройки локального индекса",[34,1258],{},[37,1260,1262],{"id":1261},"x-итог","X. Итог",[281,1264,1265,1278],{},[284,1266,1267],{},[287,1268,1269,1272,1275],{},[290,1270,1271],{},"Этап",[290,1273,1274],{},"Средство",[290,1276,1277],{},"Роль",[303,1279,1280,1291,1304,1318,1329,1340],{},[287,1281,1282,1285,1288],{},[308,1283,1284],{},"Предобработка",[308,1286,1287],{},"Разбиение по оглавлению/длине + кэш кратких описаний сегментов",[308,1289,1290],{},"Длинные книги доступны для поиска и локализации",[287,1292,1293,1296,1301],{},[308,1294,1295],{},"Метки позиций",[308,1297,1298,1300],{},[154,1299,156],{}," в исходном тексте",[308,1302,1303],{},"Машинно разбираемый источник",[287,1305,1306,1309,1315],{},[308,1307,1308],{},"Tool-поиск",[308,1310,1311,1312],{},"По вопросу — сегменты / краткие описания всей книги, возврат ",[25,1313,1314],{},"исходного текста",[308,1316,1317],{},"Принудительный сбор доказательств перед ответом",[287,1319,1320,1323,1326],{},[308,1321,1322],{},"System Prompt",[308,1324,1325],{},"Книга в приоритете, запрет поддельных сносок, честность при отсутствии",[308,1327,1328],{},"Ограничение генерации",[287,1330,1331,1334,1337],{},[308,1332,1333],{},"Фронтенд",[308,1335,1336],{},"Сноска → предпросмотр → переход и подсветка",[308,1338,1339],{},"Пользователь проверяет доказательства",[287,1341,1342,1345,1348],{},[308,1343,1344],{},"Без векторного поиска",[308,1346,1347],{},"Один Provider; смена Chat-модели без перестройки индекса",[308,1349,1350],{},"Ниже стоимость интеграции и миграции",[11,1352,1353,1354,1357],{},"«Нулевая галлюцинация» — не надежда, что модель никогда не ошибается, а ",[25,1355,1356],{},"инженерная фиксация вывода на цепочке доказательств",": нет результата поиска — не выдавать себя за содержание книги; есть результат поиска — дать проверяемые позиции в исходном тексте.",[11,1359,1360,1361,1364,1365,1368],{},"Если вы делаете AI-чтение или document QA, надеюсь, путь ",[25,1362,1363],{},"полный текст → ключевые предложения → Tool-first поиск по запросу",", а также подход ",[25,1366,1367],{},"встроенные метки позиций + возврат исходного текста"," будет полезной реализацией для ориентира.",[19,1370,1371],{},[11,1372,1373,1374,1379,1380,232],{},"Это наш опыт разработки AI-читалки ",[243,1375,1378],{"href":1376,"rel":1377},"https://reader.linghuxiong.com",[247],"Foxycape"," — только для справки. Попробовать читалку можно на ",[243,1381,1383],{"href":1382},"/ru-ru#download","странице загрузки",{"title":618,"searchDepth":1385,"depth":1385,"links":1386},2,[1387,1393,1394,1395,1396,1400,1407,1411,1412,1419],{"id":39,"depth":1385,"text":40,"children":1388},[1389,1391,1392],{"id":56,"depth":1390,"text":57},3,{"id":138,"depth":1390,"text":139},{"id":235,"depth":1390,"text":236},{"id":425,"depth":1385,"text":426},{"id":486,"depth":1385,"text":487},{"id":501,"depth":1385,"text":502},{"id":632,"depth":1385,"text":633,"children":1397},[1398,1399],{"id":656,"depth":1390,"text":657},{"id":682,"depth":1390,"text":683},{"id":758,"depth":1385,"text":759,"children":1401},[1402,1404,1406],{"id":777,"depth":1390,"text":1403},"6.1 get_related_segment_summaries — целевой поиск по сегментам",{"id":847,"depth":1390,"text":1405},"6.2 get_full_book_segment_summaries — вопросы об обзоре всей книги",{"id":868,"depth":1390,"text":869},{"id":899,"depth":1385,"text":900,"children":1408},[1409,1410],{"id":909,"depth":1390,"text":910},{"id":920,"depth":1390,"text":921},{"id":959,"depth":1385,"text":960},{"id":1034,"depth":1385,"text":1035,"children":1413},[1414,1415,1416,1417,1418],{"id":1064,"depth":1390,"text":1065},{"id":1101,"depth":1390,"text":1102},{"id":1161,"depth":1390,"text":1162},{"id":1193,"depth":1390,"text":1194},{"id":1230,"depth":1390,"text":1231},{"id":1261,"depth":1385,"text":1262},null,"2026-06-03","Инженерные заметки о Q&A без галлюцинаций в AI-читалке — ответы строго на основе текста открытой книги, с переходом к точным фрагментам в один клик.",false,"md",{},true,"/ru-ru/blog/zero-hallucination-qa",{"title":6,"description":1422},"ru-ru/blog/zero-hallucination-qa",[1431,1432,1433],"ридер","AI","технологии","zero-hallucination-qa","SNpxVTfcwrYFFFalxPzfwYiyzj4FuugExLGWPSfI4Hc",1780489852819]