Экспресс-курс · No. 12

RAG — это как ты вручаешь языковой модели факты, чтобы отвечать по ним, вместо того чтобы доверять её размытой памяти. Это самый важный паттерн в серьёзных LLM-приложениях — и когда он ломается, модель почти никогда не виновата. Работа и качество живут в извлечении: как ты режешь, индексируешь, ищешь и ранжируешь текст, что кладёшь перед моделью.

Только суть · Один образ на идею · Извлечение — это работа

§ 01

Модель не знает твоих данных и ничего после своей даты обучения. RAG — это как ты даёшь ей факты, чтобы отвечать по ним, — так что пойми задачу, что он решает, до механики.

Память модели — неверное место для твоих фактов

Блестящий выпускник, что прочёл всю библиотеку годы назад, — но не файлы твоей компании и ничего, напечатанного с его выпуска.

LLM знает только то, что было в её обучающих данных, замороженных на дате отсечки. Она не знает твоих документов, твоего продукта, записи твоего клиента или вчерашних новостей. Спроси всё равно — и она ответит из размытой памяти или выдумает что-то правдоподобное. RAG существует, чтобы починить ровно это: перестань полагаться на то, что модель запомнила, и вручи ей нужные факты в момент вопроса.

Сначала извлеки, потом отвечай

Экзамен с открытой книгой — вместо того чтобы доверять памяти, ты сначала смотришь нужные страницы, а потом пишешь ответ по тому, что перед тобой.

Retrieval-Augmented Generation — это три шага: взять вопрос пользователя, достать самые релевантные чанки твоих документов, положить их в контекст и попросить модель ответить по ним. Теперь ответ идёт из твоих настоящих данных, а не из воспоминаний модели. Так ассистент отвечает про твою документацию, твои политики, твою базу знаний — точно и актуально.

Заземление — вот настоящий приз

Журналист, что обязан цитировать источник на каждое утверждение, выдумывает куда меньше, чем тот, кто пишет по памяти.

Глубокая причина, почему RAG важен, — заземление: поскольку ответ взят из извлечённого текста, ты можешь требовать цитаты и проверять, что каждое утверждение реально подкреплено источником. Это не стирает галлюцинацию целиком, но режет её и делает то, что проскользнуло, ловимым. Ответ, что ты можешь проследить до документа, — это ответ, которому можно доверять и который можно защитить.

Это система извлечения с моделью на конце

Научный ассистент хорош ровно настолько, насколько картотека, в которой он ищет, — дай ему отличную библиотеку и плохой индекс, и он всё равно вручит не ту папку.

Ментальная модель, что сэкономит тебе месяцы: RAG — это в основном задача поиска, с языковой моделью на конце, чтобы сформулировать ответ. Модель — лёгкая, в основном решённая часть. Тяжёлая, определяющая качество часть — всё, что решает, какой текст доходит до модели, — и это остаток курса.

Не спрашивай модель, что она знает. Извлеки нужные факты и попроси ответить по ним — заземлённо, актуально и с цитатами.

§ 02

Прежде чем извлекать, ты режешь документы на куски. Как ты их режешь, тихо решает качество извлечения — это наименее гламурный шаг и один из самых важных.

Ты извлекаешь чанки, так что чанк — это единица качества

Справочник полезен, только разрезанный на находимые статьи, — один гигантский неиндексированный свиток или тысяча рваных клочков одинаково бесполезны для поиска.

Ты извлекаешь не целые документы, а чанки — пассажи в несколько сотен слов. Этот чанк — единица, что видит поиск и читает модель, так что его границы важны колоссально. Хорошие чанки самодостаточны и на одну тему. Сделай чанкинг неверно — и никакой хитрый поиск или умная модель этого не спасут.

Слишком большой хоронит ответ; слишком маленький теряет контекст

Вручи кому-то целую главу, чтобы ответить на однострочный вопрос, и он бредёт сквозь шум; вручи одно предложение без окружения, и он не поймёт, что оно значит.

Режь слишком крупно — и каждый чанк мешает нужный факт с абзацами не относящегося текста: поиск становится размытым, а внимание модели разбавляется. Режь слишком мелко — и ты обрубаешь контекст, что делал факт осмысленным. Золотая середина держит одну связную идею с достаточным окружением, чтобы стоять самой по себе. Универсального числа нет; оно зависит от твоих документов, и ты его настраиваешь измерением.

Режь по смыслу, а не по числу символов

Деление книги подсчётом символов может разрезать предложение — или рецепт — ровно пополам. Деление по главам и разделам держит каждый кусок целым.

Наивный подход рубит каждые N символов, что разрезает предложения, таблицы и идеи. Лучше резать по естественной структуре документа — заголовкам, разделам, абзацам, — чтобы каждый чанк был законченной мыслью. Немного перекрытия между соседними чанками не даёт факту провалиться в щель между двумя. Уважай форму документа — и извлечение становится легче само собой.

Прикрепляй метаданные к каждому чанку

Библиотечная карточка держит не только текст — она записывает автора, дату и раздел, чтобы ты мог отфильтровать ровно нужную полку ещё до поиска.

Храни каждый чанк с метаданными: исходный документ, заголовок, дата, раздел, права. Это позволяет фильтровать до или вместе с семантическим поиском — только документы этого продукта, только текущие политики, только то, что этому пользователю позволено видеть, — и даёт источник для цитат. Метаданные дёшево хранить, и они превращают плоскую груду текста в то, что можно нацеливать.

Ты извлекаешь чанки, а не документы. Режь по смыслу, держи каждый самодостаточным и тегируй — качество чанкинга ограничивает всё ниже по течению.

§ 03

Чтобы найти чанки, что совпадают с вопросом, ты ищешь по смыслу, а не по совпадению слов. Эмбеддинги — это трюк, что делает «найди мне похожее на это» возможным.

Эмбеддинги превращают смысл в координаты

Карта, где у каждой идеи есть место, и вещи, что значат схожее, сидят рядом, — «собака» близко к «щенку», обе далеко от «налоговой декларации».

Эмбеддинг — это список чисел, что представляет смысл куска текста, помещённый в многомерное пространство так, что схожие смыслы оказываются рядом. Ты эмбеддишь каждый чанк один раз и хранишь векторы. Теперь у «смысла» есть координаты, и «найди связанный текст» становится «найди ближайшие точки» — задача, что компьютер решает быстро.

Векторный поиск находит по сходству, а не по ключевым словам

Библиотекарь, что находит книги по тому, о чём они, — «похожее на это», — а не только по точному совпадению названия, что ты сказал.

В момент вопроса ты эмбеддишь вопрос тем же способом, потом ищешь в хранилище чанки, чьи векторы ближе всего к нему. Это семантический поиск: он находит чанк про «политику возврата», даже когда пользователь спросил про «вернуть свои деньги», потому что смыслы сидят рядом. Поиск по ключевым словам это упустил бы; векторный поиск для этого и создан.

Векторная база — это движок

Склад, устроенный так, что по любому предмету он мгновенно вручит тебе сотню самых похожих, — не читая каждую полку, а благодаря тому, как он организован.

Векторная база данных хранит твои эмбеддинги и отвечает на запросы «ближайшее к этому» за миллисекунды, даже по миллионам чанков, используя приближённый индекс вместо сканирования всего. Это движок извлечения под RAG. Строить его не надо — но надо знать, что именно там живут твои чанки и насколько быстр и точен его поиск.

Сходство — не то же, что релевантность

Два пассажа могут быть на одну тему и при этом отвечать на разные вопросы — «как отменить» и «почему отменяют» сидят рядом, но только один — то, что спросили.

Векторный поиск возвращает то, что семантически близко, что обычно релевантно, но не всегда. Чанк может быть про нужный предмет и при этом не содержать ответа. Этот разрыв — близко по смыслу против реально полезно — вот почему сырой векторный поиск это сильный первый проход, но не финальное слово, и почему существует следующий раздел.

Эмбеддинги дают смыслу координаты; векторный поиск находит чанки по сходству. Это мощно — и «близко по смыслу» это не совсем «отвечает на вопрос».

§ 04

Вот урок, что чинит большинство сломанных RAG-систем: когда ответы плохи, причина обычно в извлечении. Заведи нужные чанки внутрь — и приличная модель сделает остальное.

Мусор на входе — уверенный мусор на выходе

Вручи кому-то не тот файл и попроси его суммировать — он даст безупречную сводку совершенно не той вещи, звуча полностью уверенно.

RAG-ответ хорош ровно настолько, насколько чанки, что ему дали. Извлеки не те пассажи — и модель добросовестно ответит из неверного контекста, со всей своей обычной уверенностью. Баг выглядит как «модель неправа», но настоящий сбой случился выше по течению, в извлечении. Так что когда ответы плохи, осмотри, что извлеклось, прежде чем трогать промпт или модель.

Сочетай поиск по ключевым словам и семантический

Один искатель, что точно знает, что слова значат, и другой, что совпадает по точным именам и кодам, — вместе они ловят то, что каждый по отдельности упустил бы.

Векторный поиск понимает смысл, но может промахиваться по точным терминам — кодам продуктов, именам, редкому жаргону. Поиск по ключевым словам бьёт по ним, но упускает перефразировки. Гибридный поиск гоняет оба и сливает результаты, прикрывая слепые зоны друг друга. Для большинства реальных корпусов гибрид бьёт любой по отдельности, потому что реальные вопросы мешают понятия с конкретными именами.

Переранжируй короткий список

Процесс найма: дешёвый первый проход вытягивает пятьдесят правдоподобных резюме, потом внимательный ревьюер читает их вблизи и ранжирует настоящую топ-пятёрку.

Поиск первого прохода быстр, но груб. Реранкер берёт топ, скажем, пятьдесят кандидатов и оценивает каждого против вопроса аккуратнее, выталкивая по-настоящему релевантные чанки наверх. Извлекай широко, потом переранжируй до точных немногих. Эта двухэтапная форма — широкий дешёвый отзыв, потом острое ранжирование — один из самых рычажных апгрейдов посредственной RAG-системы.

Точность и полнота тянут друг против друга

Сеть с широкими ячейками ловит только крупную рыбу, но многое пропускает; мелкая сеть ловит всё, включая водоросли. Ты настраиваешь ячею под нужный улов.

Извлеки слишком мало чанков — и можешь упустить тот, что с ответом (низкая полнота); извлеки слишком много — и хоронишь ответ в нерелевантном тексте, что разбавляет модель и стоит токенов (низкая точность). Верное число чанков балансирует эти двое, и оно специфично для твоих данных и типа вопроса. Ты его не угадываешь — ты его меряешь, а это следующий раздел.

Большинство плохих RAG-ответов — это плохое извлечение. Сочетай ключевые слова и семантику, переранжируй короткий список и проверь чанки, прежде чем винить модель.

§ 05

Как только нужные чанки в контексте, работа — заставить модель отвечать строго по ним и доказать, что она это сделала. Это и превращает извлечение в ответ, которому можно доверять.

Отвечай только из извлечённого текста

Свидетель, которому велено показывать только то, что он лично видел, — не то, что предполагает, смутно помнит или слышал из вторых рук.

Укажи модели отвечать только из предоставленных чанков и говорить, что не знает, когда ответа там нет. Это ядро заземления: извлечённый текст — это разрешённый источник истины, а собственная память модели снята со стола. Идеально не будет — модель всё ещё может дрейфовать, — но инструкция плюс нужный контекст делают бо́льшую часть работы.

Цитаты делают утверждения проверяемыми

Научная статья со сносками позволяет любому читателю проследить утверждение до источника и проверить его — или поймать, где оно не держится.

Пусть модель цитирует, из какого чанка пришла каждая часть её ответа. Цитаты делают две вещи: позволяют пользователю (и тебе) сверить утверждение с источником, и сам акт заземления каждого высказывания в извлечённом пассаже отбивает у модели охоту уходить от фактов. Ответ с прослеживаемыми источниками можно проаудитировать; ответ без источников — лишь уверенная догадка.

Научи её говорить «я не знаю»

Эксперт, которому ты доверяешь больше всего, — тот, кто говорит «этого нет в том, что у меня есть», вместо того чтобы уверенно заполнить пробел догадкой.

Самый опасный сбой RAG — отвечать всё равно, когда извлечение вернулось пустым или мимо. Так что сделай отказ валидным, ожидаемым выводом: если чанки не содержат ответа, модель должна так и сказать, а не импровизировать из памяти. Система, что признаёт пробел, куда надёжнее той, что его замазывает, — и она вскрывает, где твоё извлечение нуждается в работе.

Заземление снижает галлюцинацию — не кончает её

Ремни безопасности резко снижают смертность, но ты всё равно едешь осторожно. Сильная мера защиты — не повод перестать смотреть на дорогу.

Даже с идеальными чанками модель может неверно прочесть, переобобщить или смешать извлечённый факт с собственной памятью. Заземление режет галлюцинацию и делает её ловимой; оно её не убирает. Так что ты всё равно проверяешь — цитатами, что пользователь может сверить, и эвалами, что меряют верность. Относись к заземлению как к мощному контролю, а не как к гарантии.

Заземление значит, что ответ идёт только из извлечённого текста, с цитатами в доказательство, — и честным «я не знаю», когда фактов там нет.

§ 06

У RAG два этапа, что сбоят по-разному, так что ты меряешь их отдельно. Свали их вместе — и будешь неделями настраивать не ту половину. (Курс об эвалах копает глубже; здесь — RAG-специфичная форма.)

Меряй извлечение и генерацию по отдельности

У ресторана с плохим блюдом два возможных виновника — доставленные ингредиенты или повар. Сначала пробуешь ингредиенты, иначе переучишь не того.

RAG-ответ может сбоить, потому что извлечение принесло не те чанки, или потому что генерация плохо ответила из верных чанков. Им нужны разные починки, так что меряй их отдельно: вернулись ли нужные чанки? и, при этих чанках, был ли ответ верным и полным? Большинство команд, что «не могут улучшить свой RAG», оценивают только финальный ответ и гадают, какую половину винить.

Извлечение: вернулись ли нужные чанки?

Прежде чем судить эссе, проверь, что студенту вообще вручили нужные справочные страницы, — если нет, ничто из написанного не могло быть верным.

Оценивай извлечение само по себе: для набора вопросов с известными релевантными документами вернул ли поиск их в топе результатов? Это ловит плохой чанкинг, слабый поиск и отсутствие реранкинга напрямую — выше-по-течению причины большинства плохих ответов. Чини извлечение первым, потому что никакое улучшение промпта или модели не спасёт ответ, построенный из неверных чанков.

Генерация: был ли ответ верен чанкам?

Фактчекер читает ответ против цитируемых источников и помечает любое предложение, что источники на деле не подкрепляют.

Когда извлечение хорошо, оценивай ответ на верность: подкреплено ли каждое утверждение извлечёнными чанками, без выдумок и без противоречий? Также проверь, что он реально использовал извлечённое и ответил на вопрос. Здесь ты ловишь дрейф модели прочь от твёрдого контекста — и это измеримо, часто с другой моделью в роли оценщика.

Строй эвал из реальных вопросов

Ты тестируешь мост грузовиками, что реально по нему поедут, а не весами, что нашёл удобными.

Твой эвал-набор должен быть реальными вопросами, что задают пользователи, включая грязные и вне-области, каждый в паре с чанками, что должны извлечься, и известным хорошим ответом. Гоняй его на каждом изменении, чтобы видеть, реально ли новая стратегия чанкинга или реранкер помогли. Без этого ты настраиваешь RAG по анекдотам — а анекдоты врут.

RAG сбоит в двух местах. Меряй извлечение и генерацию отдельно, чини извлечение первым и строй эвал из реальных вопросов.

§ 07

RAG мощен и к нему часто тянутся зря. Навык — применять его, когда он отрабатывает своё место, держать данные свежими и не платить за машинерию, что более простой подход пропустил бы.

Не RAG-ай то, что мог бы просто вставить

Ты не строишь библиотечный каталог для трёх книг на своём столе — ты просто их открываешь.

Если нужные факты малы и фиксированы — пара документов, короткая политика, — просто положи их в промпт. RAG отрабатывает свою сложность, когда знание слишком велико для контекста, часто меняется или должно фильтроваться по пользователю. Строить конвейер извлечения над тремя страницами — это эквивалент перебора в виде цикла агента ради одного вызова. Тянись к нему, когда данные вынуждают.

Устаревшие данные — это неверные данные

Телефонная книга полезна, только если её переиздают, — номера прошлого десятилетия уверенно и бесполезно неверны.

Обещание RAG — актуальные факты, а значит, твой индекс обязан оставаться актуальным. Когда исходные документы меняются, чанки и эмбеддинги надо обновить, иначе модель заземлит свои ответы в уверенном, устаревшем тексте. Планируй переиндексацию как часть системы, а не как мысль вдогонку, — свежесть это фича, что надо поддерживать, а не свойство, что получаешь раз.

Следи за стоимостью и задержкой

Каждый лишний шаг в конвейере — эмбеддинг, поиск, реранк, набивка контекста, генерация — добавляет немного времени и немного денег к каждому вопросу.

RAG добавляет этапы, и каждый стоит задержки и токенов. Извлечение большего числа чанков, реранкинг, больший контекст — всё улучшает качество до некоторого предела и поднимает счёт всю дорогу. Так что настраивай на наименьшее число чанков, что отвечает хорошо, кэшируй где можешь и помни, что отличный ответ, что слишком медленный или дорогой, — не отличный ответ в проде.

RAG — одна ступень; модель остаётся компонентом

У хорошей кухни есть кладовая, но кладовая — не повар: это один хорошо организованный вход для того, кто всё ещё должен приготовить блюдо.

RAG сидит на лестнице выше обычного промпта и ниже инструментов и агентов: тянись к нему, когда модели нужны твои факты, и держи его за чистым интерфейсом, как любую зависимость. Извлечение кормит модель; оно не заменяет суждение вокруг модели. Та же дисциплина, что везде, — используй простейшую ступень, что работает, и держи модель заменяемой.

Прежде чем выкатывать RAG-фичу
  • Нужен ли RAG вообще — или факты малы и стабильны достаточно, чтобы вставить в промпт? - Как чанкятся документы — по смыслу, самодостаточно, с метаданными и небольшим перекрытием? - Гибридное ли извлечение и переранжировано, или сырой векторный поиск, что ты не мерил? - Отвечает ли модель только из извлечённого текста, цитирует источники и говорит «я не знаю»? - Какой эвал для извлечения, отдельный от генерации? - Как индекс остаётся свежим, и сколько запрос стоит во времени и токенах?
Признаки, что проблема в извлечении
  • Ответы уверенно неверны, а ты ни разу не посмотрел на извлечённые чанки. - Только сырой векторный поиск — без запасного по ключевым словам, без реранкинга. - Чанки нарезаны по числу символов, разрезая предложения и таблицы. - Ты крутишь промпт и модель, чтобы починить то, что на деле промах извлечения. - Индекс не пересобирали с тех пор, как исходные документы изменились.
Признаки, что ты построил хорошо
  • Чанки семантичны и самодостаточны, помечены метаданными для фильтрации и цитат. - Извлечение гибридное + переранжировано, настроено на наименьшее число чанков, что отвечает хорошо. - Ответы заземлены и процитированы, с честным отказом, когда факты не извлеклись. - Ты меряешь извлечение и генерацию отдельно и починил извлечение первым. - У индекса есть план свежести, а RAG сидит за интерфейсом, что можно заменить.

RAG — это система поиска с моделью на конце. Сделай чанки правильно — и ответ последует; модель редко была проблемой.

Конец экспресс-курса · 7 глав · извлечение — это работа

Дальше — практика: построй самый маленький настоящий RAG над горсткой своих документов — режь по структуре, эмбедди, ищи и пусть модель отвечает с цитатами и честным «я не знаю». Потом, прежде чем что-то настраивать, напиши десять реальных вопросов и проверь, что извлекается. Но держи одну мысль выше прочих: когда ответ неверен, смотри сначала на чанки. В RAG модель редко проблема — твоё извлечение да, и это та половина, что ты контролируешь.