[МСК]

Контекстное обогащение чанков — что это простыми словами

Зачем это знать

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

Что такое контекстное обогащение чанков простыми словами

Представьте картотеку, из которой вырвали страницы и сложили в общую стопку. На странице написано: «Выручка в этом квартале выросла на 3%. Североамериканский регион показал рост 12%, европейский снизился на 5%». Чей отчёт, за какой квартал, какое подразделение — на странице этого нет.

Библиотекарь, которому дали такую стопку, находит нужную страницу только случайно. На вопрос «как шли дела в Европе во втором квартале» он вытащит десяток похожих страниц. Все — про рост и падение процентов. Нужной среди них может не оказаться.

Обогащение — это надпись сверху страницы, сделанная до того, как её кладут в картотеку. Выглядит она так: «Квартальный финансовый отчёт ACME за второй квартал 2024 года, раздел про региональную выручку». Дальше страница ищется по этой надписи наравне с текстом.

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

Шаг 1
Режут на куски
Документ делят по абзацам, разделам или смыслу. Кусок обычно в несколько абзацев.
Шаг 2
Пишут приписку
Модель читает документ целиком и к каждому куску пишет 50–100 токенов: чей документ, за какой период, какой раздел.
Шаг 3
Считают эмбеддинг
Приписка встаёт перед текстом куска, и вектор считается уже от объединённого текста.
Шаг 4
Кладут в два индекса
Обогащённый кусок идёт и в векторный поиск, и в обычный поиск по словам.
Шаг 5
Отвечают на вопрос
На запрос достают несколько кусков и передают их модели вместе с вопросом.
Что происходит с документом до того, как по нему начнут искать

Как это работает

  1. Документ читают целиком. Модели дают весь исходный файл и один кусок из него. Задача — описать место куска в документе, а не пересказать его.
  2. Приписка получается короткой. 50–100 токенов: название документа, период, раздел, о ком речь. Длиннее делать незачем — приписка начнёт перевешивать сам текст.
  3. Платят один раз. Обогащение идёт при загрузке документа, а не при каждом вопросе. Исходный документ кэшируют, чтобы не отправлять его заново для каждого куска той же папки.
  4. Индекс строится по обогащённому тексту. И вектор, и поиск по точным словам видят приписку. Дата и название компании из приписки вытаскивают кусок по запросам, где раньше совпадений не было вовсе.
  5. Модели отдают исходный кусок. В ответ подают либо обогащённый текст, либо чистый. Приписка нужна для попадания в выдачу, а не для чтения.

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

Пример из практики

Производственная компания собрала базу знаний из регламентов, приказов и протоколов за пять лет. Вышло около 4 000 документов, после разбиения — порядка 60 000 кусков. Вопросы сотрудников звучали так: «когда меняли норматив по приёмке на втором участке». Ни даты, ни подразделения внутри куска не было.

Расчётный порядок для такой базы: около 50 центов на тысячу кусков. Считано для недорогой модели с кэшированием исходного документа. На весь архив выходит порядка 30 долларов разово. Текущая доплата считается по числу новых документов в месяц и на таком объёме идёт десятками рублей.

Проверяют результат не на ощущениях. Собирают 50–100 реальных вопросов с заранее известным правильным куском. Меряют долю запросов, где нужный кусок попал в первую пятёрку выдачи. Замер делают дважды на одной и той же выборке: до обогащения и после. Разница между двумя числами и есть весь эффект.

50–100
токенов в приписке к одному куску
$0.5
порядок расходов на тысячу кусков при кэшировании документа
50–100
вопросов в выборке, на которой сверяют попадания до и после
Источник: Habr, разбор Contextual Retrieval, otus

Что это даёт бизнесу

  • Меньше ответов «не нашёл». Часть вопросов сотрудников содержит дату, название подразделения или номер приказа. Без приписки такие слова не встречаются в куске вовсе, и поиск их не ловит.
  • Расход разовый и считается заранее. Порядок в 50 центов на тысячу кусков умножается на размер архива, и сумма известна до начала работ. Месячный счёт за сами ответы это не меняет — прикинуть его можно калькулятором бюджета.
  • Улучшение не требует менять систему. Куски, модель, интерфейс остаются прежними — меняется только то, что попадает в индекс. Откатить можно перезаливкой базы.
  • Появляется проверяемая метрика. Доля запросов с нужным куском в первой пятёрке измеряется на одной выборке до и после. Разговор с подрядчиком переходит с «стало лучше» на два числа.
Обычный чанк
Обогащённый чанк
Название документа
внутри текста отсутствует
в приписке
Период
отсутствует
в приписке
Раздел документа
отсутствует
в приписке
Длина
исходная
плюс 50–100 токенов
Когда платят
не платят
один раз при загрузке
Что меняется в куске документа · Источник: Habr, разбор Contextual Retrieval, otus

Когда без этого можно обойтись

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

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

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

Что важно проверить

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

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

Третье: у подрядчика запрашивают долю попаданий до и после на одной выборке вопросов. Рядом — размер выборки и дата замера. Замер после обогащения без замера до него не значит ничего.

Частые вопросы

Контекстное обогащение чанков простыми словами — это что?

Документ перед загрузкой в базу знаний режут на куски по несколько абзацев. Кусок вырывается из документа и теряет привязку. Непонятно, чей это отчёт, за какой период и о каком разделе речь. Обогащение добавляет к куску приписку в 50–100 токенов с этой привязкой. Приписка попадает в индекс, и поиск начинает находить кусок по вопросам, где раньше промахивался.

Чем это отличается от простого разбиения на куски

Разбиение решает, где провести границу: по абзацам, по разделам, по смыслу. Обогащение работает после границы и отвечает на другой вопрос — что кусок теряет, когда его отрывают от документа. Одно другое не заменяет. Плохие границы приписка не чинит. А хорошие границы без приписки оставляют куски без даты, названия компании и номера раздела.

Сколько стоит обогатить базу знаний

Приписку к каждому куску пишет модель, и платят за это один раз при загрузке документа. Порядок расходов — около 50 центов на тысячу кусков при использовании недорогой модели и кэширования исходного документа. База на 20 тысяч кусков обходится примерно в тысячу рублей разово. Точную цифру даёт замер на сотне кусков своей базы с пересчётом на полный объём.

Обогащение нужно пересчитывать при каждом обновлении документа

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

Когда обогащение не даёт прироста

Прироста не будет там, где куски и так самодостаточны. Это карточки товаров, статьи регламента с заголовком внутри текста, короткие ответы поддержки. Не поможет оно и при плохом исходном тексте — распознанные с ошибками сканы приписка не исправит. Проверяется это на выборке из 50–100 реальных вопросов до полной заливки.