РозробкаSenior

RAG-архітектура

Retrieval-augmented generation (RAG) — це відповіді на питання про дані, на яких модель не навчали: спершу знайти доречні фрагменти, тоді покласти їх у промпт. Вимога, щоб відповідь походила саме з них, робить RAG пошуковою системою з мовною моделлю на кінці, — і тому майже кожна хибна відповідь є збоєм пошуку, а не генерації. Сторінка починається з чеклиста побудови на двадцять чотири рядки, далі — девʼять симптомів і де кожен справді лікується, два конвеєри, як вимірювати пошук окремо, проблема прав доступу, що перетворює демо на інцидент, альтернативи і пʼять задокументованих провалів.

Два конвеєри
Індексація і запит
Більшість збоїв
Пошук, а не генерація
Контроль доступу
Належить індексу

Чеклист побудови RAG

Спершу весь чеклист, бо саме його варто мати перед очима на проєктному рев’ю, а не після інциденту. Він пронумерований, щоб на рядок можна було послатися: «ми не зробили 4.1» — це те, що хтось може запланувати, на відміну від «над правами доступу треба подумати». Більшість прототипів RAG доходять до демо, зробивши групи 2 і 5 і не зробивши нічого з 1, 4.1, 6 чи 7, — і кожен із цих пропусків виринає згодом як клас збоїв, а не як окремий баг.

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

    1. Корпус — це явний список джерел, а не «все, до чого дотягнувся краулер».
    2. Кожне джерело має названого власника, у якого можна спитати, чи має документ там бути.
    3. Права доступу кожного джерела можна виразити на рівні документа. Джерело, де цього не можна, лишається поза межами.
  2. 2.Фрагментація

    1. Ріжте за структурою документа: заголовок і його розділ, таблиця з підписом, функція з описом.
    2. Кожен фрагмент несе назву документа й шлях розділу, щоб уривок і далі казав, про що він.
    3. Кожен фрагмент має стабільний ідентифікатор, що переживає переіндексацію: відповідь може на нього послатися, а лог — назвати.
    4. Таблиці, блоки коду й списки не розрізаються навпіл.
  3. 3.Ембединги й індекс

    1. Одна модель ембедингів для документів і питань, і її назву записано разом з індексом.
    2. Зміна моделі ембедингів означає повну перебудову, і для цього є записана процедура.
    3. Індекс зберігає правила доступу й метадані свіжості поруч із кожним фрагментом, а не в окремій системі.
  4. 4.Пошук

    1. Фільтрація за правами працює до пошуку за схожістю, тож заборонений документ ніколи не стає кандидатом.
    2. Пошук за ключовими словами працює поруч із векторним, і два списки результатів обʼєднуються.
    3. Шукайте широко, переранжуйте кандидатів і передавайте в промпт лише кілька найкращих.
    4. Повноту на розміченому наборі питань вимірюють і ведуть як число, що рухається.
  5. 5.Генерація

    1. Промпт каже відповідати лише з наданого контексту — і що казати, коли відповіді в ньому немає.
    2. Відповідь повертає ідентифікатори використаних фрагментів — як дані, а не як прозу.
    3. Відповідь, що не посилається ні на що або посилається на фрагмент, чий текст її не підтверджує, відхиляють, а не публікують.
  6. 6.Свіжість і видалення

    1. Оновлення інкрементні й ключовані за ідентифікатором документа: правка заміняє фрагмент, а не дублює його.
    2. Видалення обробляються явно, і відкликаний документ залишає індекс того самого дня.
    3. Є сформульована свідома відповідь на питання «наскільки застарілим це може бути?», і хтось із нею погодився.
    4. Переіндексація джерела, чиї права змінилися, — це планова рутинна задача, а не реагування на інцидент.
  7. 7.Експлуатація

    1. Версія індексу є частиною того, що розгортається, — поруч із версією промпту й версією моделі.
    2. Знайдене логується з кожною відповіддю, щоб скаргу з минулого тижня можна було відтворити.
    3. Повна перебудова ідемпотентна і запускається на вимогу без відновлення з бекапу.

Девʼять симптомів і де кожен лікується

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

СимптомЗвичайна причинаДе лагодити
Упевнена відповідь із вигаданою деталлюФрагмент не знайшовся, а промпт не дав способу про це сказати.Пошук — плюс 5.1: явне «відповідай лише з контексту, інакше скажи, що не знаєш».
Той документ, не те реченняФрагменти завеликі, тож потрібний рядок похований серед абзаців шуму.Менші структурні фрагменти (2.1) і етап переранжування кандидатів (4.3).
Точні ідентифікатори не знаходятьсяВекторна схожість розмиває коди, артикули й імена в їхніх сусідів.Гібридний пошук (4.2): паралельно запустити пошук за словами й обʼєднати два списки.
Фрагмент читається так, ніби він про щось іншеФрагмент утратив заголовок, що давав йому предмет, тож «це» вже ні на що не вказує.Перенесіть назву й шлях розділу в текст фрагмента (2.2). Це найдешевший рядок у списку.
Цитується застарілий або відкликаний вмістІндекс збудували один раз і ніколи не звіряли з правками й видаленнями.Конвеєр індексації: інкрементні оновлення за ідентифікатором документа (6.1), разом із видаленнями (6.2).
Добрі відповіді, непридатна затримкаЗнайдено забагато фрагментів, і всі вони надіслані моделі.Шукати широко, переранжувати, а в промпт передавати лише кілька найкращих (4.3).
Правильна відповідь із документа, який цьому користувачу відкривати не можнаПрава застосували до результатів, а не до запиту.Фільтруйте до пошуку за схожістю (4.1). Це єдиний рядок, який є інцидентом, а не дефектом.
Якість обвалилася після зміни в інфраструктуріМодель ембедингів змінилася, а індекс не перебудували — лишилися два непорівнянні векторні простори.Повна перебудова (3.2) і запис моделі ембедингів разом з індексом, щоб це не сталося тихо (3.1).
Ніхто не може відтворити скаргу з минулого тижняЗнайдений набір не логували, тож лишилася сама відповідь, яка нічого не пояснює.Логуйте ідентифікатори фрагментів із кожною відповіддю (7.2). Без цього будь-яка розмова про якість — це думка.

Два конвеєри, а не одна функція

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

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

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

Фрагментація — рішення з найбільшими наслідками й найменшою увагою, і діаграма вище є повним аргументом на користь групи 2 чеклиста. Завеликі фрагменти тягнуть із відповіддю недоречний текст і розріджують те, що читає модель; замалі виграють збіг за схожістю, а тоді виявляється, що в них бракує речення, яке робило їх осмисленими. Краще за будь-який фіксований розмір працює поділ за структурою документа — заголовок і розділ під ним, таблиця з підписом, функція з описом — плюс перенесення назви документа й шляху розділу в кожен фрагмент, щоб уривок, який починається зі слів «це не стосується пробних акаунтів», досі казав, чим було «це».

Виміряйте пошук, перш ніж судити відповідь

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

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

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

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

Правильна відповідь, яка є інцидентом

Збій, що коштує карʼєри, — не хибна відповідь, а правильна. Індекс RAG, зібраний обходом усього, до чого дотягнувся краулер, радо відповість фрагментом із перегляду зарплат, юридичної чернетки чи заявки іншого клієнта: пошук спрацював рівно так, як його спроєктували, ранжування було добрим, і відповідь точна. Жодна метрика якості на цій сторінці цього не спіймала б — і саме тому права доступу є проєктним рішенням, ухваленим до завантаження першого документа, а не фільтром, доданим, коли хтось помітив.

Індекс RAG, зібраний обходом усього, до чого дотягнувся краулер, радо відповість фрагментом із перегляду зарплат чи заявки іншого клієнта — і пошук спрацює рівно так, як його спроєктували. Фільтрація результатів постфактум — це те розташування, яке виглядає правильним на рев’ю і все одно протікає: закритий документ оцінили, порахували й витратили на нього час, і все це видно ззовні. Зберігати правила доступу разом із кожним фрагментом і фільтрувати до пошуку за схожістю — єдина версія, що є межею, а не завісою: документ ніколи не стає кандидатом, тож нема чого прибирати й нема з чого робити висновки. Тоді повторне індексування джерела, чиї права змінилися, стає рутинною експлуатаційною задачею, а не запізнілою думкою.

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

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

RAG, довгий контекст чи fine-tuning

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

Беріть RAG

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

Беріть fine-tuning

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

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

Пʼять систем, які знайшли рівно те, що їм звеліли

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

ВипадокЩо сталосяКонтроль, якого бракувало
Google AI Overviews, травень 2024Відповіді пошуку, зібрані зі знайдених сторінок, радили, зокрема, додати нетоксичний клей у соус для піци — джерелом виявився жартівливий пост на форумі. І пошук, і опертя на джерело спрацювали; жартом було саме джерело.Ніщо не ранжувало авторитетність джерела. Опертя робить відповідь простежуваною, а не правдивою — чеклист 1.1 і 1.2.
Чатбот NYC MyCity, березень 2024Муніципальний асистент для бізнесу, що відповідав із міських матеріалів, казав власникам, що вони можуть забирати частину чайових працівників і відмовляти орендарям за джерелом доходу. Він лишився онлайн із доданим застереженням.Немає брами цитування (5.3). Відповідь, яка не може показати рядок, що її підтверджує, не має показуватися взагалі.
Slack AI, серпень 2024Оприлюднена техніка, у якій текст, розміщений у публічному каналі, потрапляв у пошук асистента й використовувався, щоб витягти вміст із приватних каналів, де зловмисника не було. Виправлено після розкриття.Корпус містив вміст, доступний зловмисникові на запис. Якщо будь-хто може дописати до джерела, це джерело — недовірений ввід.
Microsoft 365 Copilot, 2024Пошук виносив нагору файли, які користувачі формально мали право відкрити, але яких ніхто не мав знаходити, — у масштабі, що зробив роки недбалих прав видимими одразу. Microsoft випустила режим обмеженого пошуку як тимчасове рішення.Індекс успадкував права такими, якими вони були насправді, а не такими, якими їх хтось уявляв.
Air Canada, лютий 2024Протилежний збій — і причина існування цієї сторінки: чатбот вигадав політику повернення, тоді як правильна лежала на власному сайті авіакомпанії. Трибунал зобовʼязав компанію заплатити.Пошуку не було взагалі. Найдешевша RAG-система з цієї таблиці цьому запобігла б.

Де це вироджується

Чесне обмеження RAG у тому, що він може бути лише настільки добрим, наскільки добрий пошук по корпусу, який хтось упорядкував, — і він успадковує всі проблеми цього корпусу. Він не відрізнить жарту від політики, старої чернетки від затвердженої версії чи документа, який просто точний, від точного й конфіденційного. Якість пошуку — це задача пошуку, а ризик, що лишається, — редакційний; тому пункти нижче переважно організаційні, а не технічні.

  • Налагодження промпту, коли потрібний фрагмент до нього не дійшов, — а так буває здебільшого.
  • Фрагментація фіксованого розміру, що ріже таблиці, код і речення й нищить той зміст, який індексувала.
  • Індекс, зібраний руками один раз: без інкрементного оновлення й без відповіді на питання видалень.
  • Контроль доступу, застосований до результатів, а не до запиту: він протікає через оцінки, лічильники й час.
  • Корпус, до якого будь-хто може дописати, вважається довіреним лише тому, що він внутрішній.
  • Зміна моделі ембедингів без перебудови індексу: у сховищі лишаються два непорівнянні векторні простори.
  • Лише векторний пошук на корпусі з кодів, ідентифікаторів та імен, які пошук за словами знайшов би точно.
  • Відсутність посилань: жоден користувач не перевірить відповідь, а жоден інженер не відтворить скаргу.
  • Демонстраційний корпус, що став бойовим, бо ніхто заново не вирішив, що в ньому є.

Коли це застосовувати

Застосовуйте, коли

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

Уникайте, коли

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

Джерела й метод

На чому стоїть ця стаття

  • 5 джерел
  • 4 задокументовані збої
  • Перевірено 13 жовтня 2026 р.

Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.

Було корисно?

Поділіться з тим, хто працює над тією ж задачею.