Розробка пайплайну ембедингів для індексації даних

Індексація даних ламається непомітно: видача втрачає точність, а оновлення відстають від реальності. Ми проєктуємо та впроваджуємо конвеєри ембедингів під ключ — від аудиту даних до регламентів супроводу. Точність пошуку зростає, а перезбирання індексу займає в рази менше часу.
Часті запитання

Пайплайн ембеддингів: де ламається індексація даних

Відставання індексу від джерела — найчастіша відмова на старті. Документ оновлюється в базі знань, а пошук за змістом ще віддає попередню редакцію або не знаходить запису взагалі: індексатор запускається за розкладом і не знає, що з’явилося нове.

Користувач отримує відповідь за застарілим фрагментом і втрачає довіру до системи раніше, ніж ми встигаємо випустити другу ітерацію.

Друге вузьке місце пошуку за змістом — неузгоджені вектори.

Якщо частину корпусу проіндексовано однією моделлю, а нову порцію — іншою, або чанки нарізано за іншими правилами, близькість у векторному просторі перестає відображати зміст: релевантний документ у базі є, але у видачу не потрапляє.

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

Далі втручається обсяг. Повний перерахунок векторів у разі зміни моделі або схеми чанків розтягується на години, черга на індексацію зростає швидше, ніж її встигають розбирати.

Індексація даних перетворюється на окремий нічний процес, від якого залежить свіжість усього пошуку, і будь-яка затримка джерела тягне її за собою.

Усе це лікується не «потужнішою моделлю», а складанням пайплайну ембеддингів як окремого інженерного контуру: хто і коли запускає перерахунок векторів, як версіонуються чанки й модель, чим підтверджується, що індекс наздогнав джерело. Розбираємо, як це закривається.

Що змінюється після впровадження: точність видачі та швидкість оновлення

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

Після налаштування пайплайну ембеддингів запит і документи порівнюються за змістом, тому частка релевантних відповідей у верхній частині видачі зростає вимірювано: її рахують на розміченому контрольному наборі запитів, а не оцінюють на око.

Друга зміна — час оновлення індексу. Раніше правки в каталозі або базі знань ставали знаходимими лише після повного перезбирання, тобто із затримкою до доби; тепер перераховуються лише змінені фрагменти, і новий запис потрапляє у видачу за хвилини.

Для команд, які редагують контент щодня, це знімає цілий клас звернень «пошук нічого не знайшов, хоча стаття давно є».

Окремо закривається набір відмов, який зазвичай списують на «дивний пошук»: дублікати в топі, застарілі версії документів, провали на довгих перефразованих запитах.

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

У разі зростання обсягу даних видача не починає деградувати: індекс масштабується блоками, а вектори рахуються один раз і перевикористовуються під час переіндексації.

Додавання нових джерел і мов не змінює поведінку пошуку — якість і швидкість залишаються такими самими, як і на стартовому обсязі.

Пайплайн ембеддингів: порівняння режимів індексації

Режим індексації вибирають не за розміром корпусу, а за частотою змін і вимогою до свіжості видачі. Повне перезбирання дає узгоджений знімок, але його вартість зростає лінійно від обсягу, а вікно застарівання дорівнює інтервалу між запусками.

Інкрементальне оновлення перераховує лише змінені документи, зате цілком залежить від надійності визначення змін на боці джерела.

Потокова індексація прибирає затримку, але ускладнює контроль якості: частково оновлений документ потрапляє в індекс раніше, ніж закрився запис у джерелі. Гібридна схема розводить шари — «гарячі» дані йдуть потоком, довідкові перезбираються пакетно.

Галузеві вимірювання Анотований огляд підходів до векторного пошуку показують, що гібридні конфігурації стійкіші там, де за добу змінюється від 1 до 10% документів.

Варіант Коли підходить Обмеження
Повне перезбирання індексу Стабільний корпус, оновлення раз на добу й рідше, потрібна узгодженість знімка Розрахунковий час зростає лінійно від обсягу, вікно застарівання дорівнює інтервалу між запусками
Інкрементальне оновлення Регулярні точкові правки, важливий облік кожної зміни Потребує версіонування документів і надійних міток змін, індекс поступово фрагментується
Потокова індексація Свіжість критична, події надходять безперервно Складніший відкат і контроль якості, частково записані документи дають шум у видачі
Гібридна схема Різнорідні дані: «гарячий» потік і об’ємний довідковий шар Вища складність експлуатації, потрібні окремі контури спостереження та власні правила відкату

Критерій вибору — частка оновлюваних записів за цикл і допустиме вікно застарівання. Поки змінюється менше відсотка корпусу, достатньо пакетного перезбирання; за безперервного потоку подій режими комбінують, а не вибирають один.

Етапи впровадження: від аудиту даних до передачі в підтримку

Порядок робіт вибудувано так, щоб якість видачі була перевірюваною на кожному кроці, а не з’ясовувалася після запуску. Спочатку фіксуємо, що взагалі є в джерелах, потім збираємо конвеєр індексації і лише після вимірювань передаємо рішення в експлуатацію.

  1. Аудит джерел даних. Проходимо по всіх системах-донорах: документи, бази, файлові сховища. Дивимося обсяг, дублі, кодування, биті записи — на виході карта джерел із переліком того, що потрібно почистити до індексації.
  2. Схема оновлення. Визначаємо, що і як часто змінюється: повна переіндексація за розкладом або точкова за подією. Тут же фіксуємо правила видалення — застарілі фрагменти не повинні залишатися в індексі.
  3. Складання конвеєра. Реалізуємо розбір документів, розбиття на фрагменти, розрахунок ембеддингів і запис в індекс. Розмір фрагмента й перекриття підбираємо під характер текстів: від цього залежить, чи потрапляє потрібна відповідь у контекст цілком.
  4. Перевірка на контрольній вибірці. Збираємо набір реальних питань з еталонними відповідями та фрагментами, які обов’язково мають знаходитися. Прогін показує, де втрачається релевантність — розбиття, нормалізація або фільтри на видачі.
  5. Вимірювання якості видачі. Рахуємо частку запитів, де потрібний фрагмент потрапив у перші результати, і частку відповідей з опорою на джерело. Метрики фіксуємо до і після кожної правки, щоб бачити її внесок окремо.
  6. Приймання рішення. Передаємо конфігурації, схему оновлення, набір контрольних питань і регламент перезбирання індексу. Домовляємося про поріг якості, у разі падіння нижче якого запускається розбір причин.

Що залишається у вас: конфігурації, схеми індексації, регламенти

Передаємо рішення не як «працюючий сервіс на нашій стороні», а як комплект, за яким ваша команда сама змінює джерела, переіндексовує корпус і піднімає конвеєр після збою. Усе лежить у вашому репозиторії та системі контролю версій — з історією правок, а не архівом у листуванні.

  • Конфігурації конвеєра: декларативні файли за етапами — розбір джерел, нарізка на фрагменти, розрахунок ембеддингів, запис в індекс; підключення нового джерела або зміна моделі — правка параметра, а не переписування коду.
  • Схема потоків даних: звідки надходять документи, де зберігаються проміжні артефакти, як обробляються дельти, які поля обов’язкові — за нею за хвилини знаходиться крок, на якому губляться записи.
  • Регламент оновлення індексу: переіндексація за розкладом і за подією зміни документа, вікно запуску, порядок обробки видалених записів, щоб індекс не розходився з джерелом.
  • Опис полів і метаданих: що потрапляє у вектор, що залишається у фільтрах (дати, розділ, власник), які поля беруть участь у відборі з урахуванням прав доступу.
  • Інструкція з перезапуску: точки відновлення, повторюваність кроків, як перезапустити один етап без повного проходу корпусу — збій на середині не коштує доби простою.
  • Чек-лист розбору збоїв: типові причини порожньої видачі, застарілого фрагмента, розбіжності розмірності вектора — і в яких журналах дивитися для кожного випадку.
  • Приймальні сценарії та метрики: еталонний набір запитів, повнота і точність видачі, порівняння до і після правок.

Перед передачею ваші інженери проганяють ці сценарії самі: оновлюють індекс, відкочують конфігурацію, відновлюють конвеєр після змодельованого збою.

Кейс: точність пошуку зросла після перезбирання індексу

Клієнт — сервіс технічної підтримки з базою документації на кілька тисяч файлів. До переробки індекс перезбирався цілком: конвеєр ембеддингів заново проганяв усі документи, хоча правка стосувалася пари абзаців в одному файлі.

Оновлення займало години, а пошук за свіжими правками віддавав застарілі редакції — фахівці перестали довіряти видачі й поверталися до ручного пошуку за файлами.

Ми змінили схему індексації: розбили документи на фрагменти з перетином, закріпили за ними стабільні ідентифікатори й почали перераховувати вектори лише для заторкнутих фрагментів, решту перевикористовуючи.

Для контролю якості заздалегідь зібрали фіксований набір запитів з еталонними відповідями — за ним рахували частку влучень у очікуваний результат, а не оцінювали видачу на око.

Метрики до і після

  • Частка влучень у очікуваний результат у першій п’ятірці видачі: 0,41 → 0,86.
  • Час оновлення індексу після правок: 6 годин → 12 хвилин.
  • Обсяг повторної обробки за типової правки: 100% → 7%.

Окремо переконалися, що зростання точності не досягнуто за рахунок повноти: на запитах поза розміткою частка релевантних відповідей теж зросла, а порожніх видач стало майже втричі менше. Орієнтиром під час налаштування слугували відкриті набори для оцінювання пошуку, зокрема MS MARCO.

Чим повний перерахунок векторів відрізняється від інкрементального?

Повний перерахунок проганяє весь корпус через модель і атомарно замінює векторний індекс. Результат детермінований: в індексі немає розбіжностей із джерелом, а якість видачі не залежить від історії минулих запусків. Плата — час, пропорційний обсягу даних, і пікове навантаження на джерела.

Інкрементальний перерахунок рухає лише змінені фрагменти: конвеєр порівнює хеш вмісту або мітку оновлення, перераховує заторкнуті чанки й точково править індекс. Свіжість видачі вимірюється хвилинами, а читання з джерела обмежується дельтою.

Видалення й перенесення потрібно обробляти явно, інакше індекс накопичує записи, яких у джерелі вже немає.

Часткові зміни — типовий режим живого контенту: правки абзаців, нові документи, зміна статусів. Інкрементальний перерахунок тут передбачуваний, поки не змінюється сама модель ембеддингів або спосіб нарізки на чанки.

Тоді старі й нові вектори потрапляють у різні простори, видача стає незіставною — і потрібен повний перерахунок.

Навантаження на джерела — другий обмежувач. Повний перерахунок читає корпус цілком і зачіпає робочу базу або зовнішні сервіси; інкрементальний читає лише дельту й укладається у вікно низької активності.

На практиці ставлять гібрид: регулярний інкремент для свіжості плюс періодичний повний перерахунок як звірка, яка ловить пропущені події.

Режим вибирають за частотою правок, стабільністю моделі та допустимим відставанням видачі — і фіксують у конфігурації, щоб поведінка була відтворюваною, а не залежала від ручних запусків.

Технічні питання: дрейф даних, дублікати, застарівання

Дрейф даних проявляється без жодної помилки в логах: запити, які місяць тому влучали в ціль, починають витягувати сусідні за змістом матеріали, а частка релевантних відповідей тихо просідає.

Причина в тому, що словник користувачів зсунувся, а векторний індекс залишився на попередньому зрізі. Тому супровід індексу ми будуємо як регулярний цикл перезбирання, а не разове налаштування після запуску.

Що робити, якщо структура даних зміниться після запуску?

Схема версіонується: у кожного складання є маніфест зі складом полів і правилами приведення їх до вектора. Нове поле або зміна типу не ламає поточну видачу — перезбирання йде в окремий індекс, перемикання відбувається лише після прогону на контрольній вибірці запитів.

Як ви відсікаєте дублікати в індексі?

Дублікати ловимо у два проходи: на вході — за нормалізованим ключем і відбитком вмісту, на виході — за близькістю векторів вище порога. Схожі записи не видаляємо мовчки, а зв’язуємо в групу: у видачі залишається одна, решта доступні як джерело.

Що відбувається із застарілими записами?

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

Як ви контролюєте якість видачі?

На контрольній вибірці рахуємо частку влучень у цільовий документ і позицію першого релевантного результату. Метрики знімаються до і після кожного перезбирання — у разі просідання вище порога нова версія індексу не випускається і йде на розбір.

Ці перевірки закривають дрейф даних, дублікати й застарівання в одному циклі: пайплайн індексації регулярно проходить по корпусу, а зміни потрапляють у видачу лише через контрольоване перемикання.

Обговоримо задачу: зберемо схему індексації та оцінимо обсяг робіт

На першу розмову не потрібне готове технічне завдання — достатньо чернетки.

Корисно побачити вивантаження з джерела, приклади реальних запитів користувачів і те, як зараз влаштований пошук: за цими даними вже видно, де втрачається релевантність і на якому обсязі конвеєр почне деградувати. Далі розбір даних іде за чек-листом:

  • Джерела й формати: що індексуємо — тексти, документи, каталог, історію звернень — і як часто вони оновлюються.
  • Обмеження: мови, довжина запису, поля, які не можна віддавати в індекс — персональні дані, закриті матеріали.
  • Поточний пошук: ключові слова, зовнішній сервіс або ручна розмітка — і чим він не влаштовує за фактом.
  • Очікувана поведінка: що має знаходити пошук, за якими запитами і наскільки точним бути.
  • Обсяг і динаміка: скільки документів зараз, скільки з’явиться найближчими місяцями, як швидко надходять нові.
  • Контрольні приклади: кілька десятків запитів з очікуваними результатами, за якими видно, чи стало краще.

Після розбору даних повертаємося зі схемою індексації, оцінкою обсягу робіт і планом робіт за етапами — підготовка даних, генерація ембеддингів, зберігання векторів, шар пошуку та метрики якості.

Оцінку рахуємо за блоками окремо, щоб старт проєкту починався з тієї частини, яка швидше дає результат. Опишіть задачу — повернемося з оцінкою та планом.

Напрямки AI-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1140