Восем лепшых практык RAG, правераных на 746 старонках інструкцый
Якія папулярныя аптымізацыі RAG вытрымалі вымярэнне на трох інструкцыях да прадуктаў: ачыстка мяккіх пераносаў, памер фрагментаў, маршрутызацыя, парогі эскалацыі і пераранжаванне.
Крыніцы: I Measured Every RAG “Best Practice” on 746 Pages of Product Manuals. Only Four Survived.
Бот для падчырбы, створаны на адзіннцы трох рэальных PDF-файлаў — 408-стороннім інструкцыі для власнікаў электракаляраў, 329-стороннім практычным кярэсніку для тэлевізораў і 9-стороннім ліставцы з беспаўерным мышым — стаў прабным полем для вісьмі популярных оптымізацый тыпу RAG. Правіла былі строгія: нічога не прыймалася, як толькі прамеры на гэтым корпусе дадзеных, апранутыя па стандартнай кнізе адпаведзяў, не паказвалі ўспэшнасці. Літаратура і прыzwычкі не лічыліся.
Рэзультатам было падышча точнасці з 72% да 89%, тады колькісць токенав запыткаў на запыт зменілася з 14 да 57%. Гэта было досягнуто за дапамогою чатырох змян, а не восьмі. Две з адмовленых ідэй нават нашкодзілі, а адна з апрынятых оптымізацый так і не была выканана. Усе гэтае даследжэнне коштаў прыблізна 0,015 долара за выклікі API.
Ёсць канкрэтныя рэзультаты кожнай ідэі. Найценнейшы элемент у спіску ўзагалі не ўжо тэхніка RAG.
Баг, большы за будзь-які гіперпараметр
Перад налаштаваннем процэсу адзыскання, пераканацеся, што насправды прайшло да індэкса. Усі падтверджаюць, што PDF быў распакаваны. Лепшы вопыт — у якім стане знаходзіцца тэкст.
Бесплатны цыкл дае на ўсе адказ:
SOFT = "" # U+00AD, the soft hyphen
for manual in manuals:
print(manual.name, extract(manual).count(SOFT))
У інструкцыі да автомабіля было знайдзена 2,272 слова.
Мягкія гільдзіны — гэта інструкцыя верстальніка для працоўніка, які фарматуе тэкст: разлучыць слова тут, калі лінія заканчываецца. Чытальнік PDF яе выпалняе і хавае яе, таму вочы яе не бачаць, але прыстрой для выкарыстоўвання тэкста перадае яе у первасным варыянцы. На старонцы паказваецца чыстае слова, тады як у індэксе падаюць такія строкі, як ve, мягкія гільдзіны, новы радок, hicle.
У той інструкцыі 999 разных слоў было разлучана на два часткі, у тым чыслі, разам і з найважлівейшым іменнікам у будзь-яй інструкцыі да автомабіля. Слова Vehicle з’явілася 1,486 разоў як цэлыя слова, хоць ягоў мяло бы быць 1,580 разоў. 94 прыклады не маглі быць знайдзеныя праз пошук.
Гэта адмініструецька шкода для кожнага падчыннага шляху адзынчасна. Пошук па ключавых словах падходзіць толькі да буквальных строк, і слова на кшталт “hicle” не ўважаюцца “vehicle”, без жадных частковых балоў. Пошук па векторах працюе горш, чым спадзявалася, таму што мадэлі эмбедынгу разбіваюць тэкст на часткі падслова, і фрагмент на кшталт “hicle” рассыпаецца на беззначныя часткі. Нават удачны рэзультат прыкладзеў спутаны кантэкст у запіт.
Рэшэнне — адна лінія, але ў яе ёсць падступ. Тэкст у фармаце “justified” таксама розбіваецца на справжніх хіліцах. Слова на кшталт “cus-tomer” трэба знову з’едыніць у “customer”, але выразы на кшталт “toll-free” павінны застацца з хіліцамі, і ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо ўжо
Большыя фрагменты маюць большэй кантэкст і таму падходзяць да большай колькасці запытанняў, але яны таксама прыносяць з сабой дапаможны, нерэлевантны тэкст у кожны запыт, і гэта назаўсёды. Існуе перакрыцце, каб адпаведзь, якая знаходзіцца на межы, не была разламаная на два часты.
Было працавана дзевяць конфігурацыяў на адпаведнасць з кантрольным спіскам адпаведзяў. Точнасць можна вымерыць без жадных затрат, тады калі за ёё атрыманне плацяць певныя расходы.
Перакрыцце ніколі не здобыла сваё месца, хоць не так, як можа падсказваць першы аналіз. Пры 700 сімволах адсутнасць перакрыцця дала +11 балоў, што выглядае крытычна, але калі пераглядаць іншыя варыянты: пры 1800 сімволах перакрыцце 0, 100 і 200 даўалі адпаведна 89% балоў. Адна паравана кажа, што перакрыцце ёсць дорогай, а іншая — што яна нічога не робіць.
Прычыной абох рэзультатаў ёсць статыстыка, якая практычна не павінна была з’явіцца на сторанцы. У кожной конфігурацыі, нават у самай маленькай, кожны адказ цэлы заходзіў у адну частку, і ніхто з іх не быў адсечаны на межы. Надакладанне было способам запобежэння проблеме, якой бярэць не мае, таму яго змераная вялічына колісцілася межа нуля і ад’ёмных значэнняў. Перад тым, як плаціць гэты прэміум, трэба пераканацца, насколькі часта адказы на самай працоўцы межы.
Потым выйшла пастка. Найлепшыя 89% былі атрыманы для 1400 сімвоў з 200% надакладання. Якшто выбраць гэты варыянт, то для кожнага запіту будзе адправляцца 1,283 токенаў уместо 750, тое ў 71% больш за весь час выкарыстоўвання продукту. З 18 запытаннямі ў тэсце 89% значыць 16 правільных адказоў, а 83% — 15. Найкрашчая конфігурацыя перамагае найдэшавейшую роўна аднае запытаннем.
Таму победзіцеля не трэба выбіраць за звычай. Выберыце найдэшавшуюся конфігурацыю, чыя оцэнка не можа адрозніцца ад оцэнкі победзіцеля, што ў гэтым случае значыла будзь-што ў межах 8 пунктав. За гэтым правілам шасць з дзевяці конфігурацыяў зрэванаваліся, і выграўаў найдэшавшы з іх. Точнасць вырасла з 72% да 83%, праз што такса знакоў таксавання таксама зменшылася — гэта быў першы «бесплатны обед» праекту, адзержаны за рахунак адмовы ад оптымізаціі метрыкі, якая вылічвалася.
Фільтр, які коштаў 22 пункты
Корпус абучальных матэрыялаў абходзіць тры продукты. У пытанні пра мыш не ёсць прычыны шукаць у 408-стороннім інструкцыіі да автомабіля, адколі два іншыя дакументы даўаюць толькі можлівасці зрабіць помылку. План быў выкрыць продукт і обмежыць пошук толькі тымі інструкцыямі.
Гэта зрабіў класыфікатор. Ён правільна выбіраў у 78% случаў за менш чым 4 мс без жадных затрат, што ў значным ступені перавышае рэзультаты пошуку сярод у тры разы большага об’ёму тэксту. Аднак точнасць знізілася на 22 пункты.
Механізм працы быў спостатку дужа повольны. Неправільны фільтр не прыводзіць да таго, што правадзенне будзе пасунута на ніжшую пазіцыю — ён проста ўдаляе яго. Без фільтравання пашук у всіх трох працэводах заўсёды дае правадзенне, можа, на 4-й пазіцыі замест 1-й, і прылад для перэранківага можа яго адзначыць. З фільтраванням неправільна запітанне шукае ў неправым дасягу, і правадзенне не падваігаецца ў ранкінгу, таму што яго няма ў скупцы кандыдатаў.
Класіфікатор, які правільна адпавядае 78% часу, таму не коштуе незначных втычак у якасць. Ён встановляе жорсткі ліміт у 78% для всіх наступных этапаў, незалежна ад таго, насколькі хорашы ўсе іншы элементы працэсу.
Рашчын не ў тым, каб быць болей точным класыфікаторам, а ў можлівасці утрымацца ад дзеяння: застаўляйце фільтр толькі тады, калі ўпэўнены, а шукайце усё, калі рэйтынгі двух лепшых продуктав знаходзяцца маўчыма. У пытанні на кшталт «Як я можу супрацаваць з ім праз Bluetooth?» слова «як» і «супрацаваць» маюць вялікую значымасць, і класыфікатор не ўпэўнены больш, чым хто-небудзь іншы.
Альбо воўсе адмовіцца ад аналізу
Найдэшавшы роутэр — гэта выпадаючы спіс. Для такога інструмента запытанне пра тое, пра які продукт ідзе мова, выконваецца простым натыканнем, што ўжо часта робіць сам корыстнік, адкрываючы чат з сторонніцы дапамогі продукту. Гэта мгновенна рашылае неяснасці, якія класыфікатор можа толькі здагадвацца, а фільтр завжды будзе правы.
Цыфры ўсё правільныя. Класыфікатор неправямым чынам адпрацаваў 4 з 18 запытанняў. Пошук без фільтра знайшоў 15 адпаведзей, а з фільтрам — 11; кожны неправямы распад запытання ператвараў успех у невыпадак. Калі усунуць такія неправямыя распады, точнасць застаецца той самым, а такса точнасці, якую обяцваў фільтр, таксама будзе досягнута.
Оптымізацыя, якая так і не была выканана
З метай стварэння прыемнага візуальнага абразу можна было б прагнуць выдаліць эту частку.
План заключаўся у тым, каб у разе вялікай впэўненасці у рэзультатах пошуку відпавядаць за дапамогою дашчавага модэлю на 20 мільярдаў параметраў, а калі впэўненасць была нізкаю — перэйсці на модэль на 120 мільярдаў параметраў. Неправільныя адпаведзі часта збіраюцца там, дзе рэзультаты пошуку ўскладненыя, а прыстрой для перэранків ужо выдае оцэнку впэўненасці, таму додатковыя зусілля не трэбаюць.
Прагматы быў заданы на роўні 0.0, што здавалася прыемным з пункту гляду прынцыпаў: крос-кодэр выдае лагіт, а sigmoid(0) доравнае 0.5, і калі значэнне падыходзіць ніжэй за ноль, гэта спрыяе аднаковаму рангаванню, калі верхні фрагмент больш схожы на несутэйсны, чым на сутэйсны. Адпрацоўка рэальнага распаду паказала іншую картыну: спазірваныя максымальныя балы мялі мінімум 3.24, медыяну 8.29 і максымум 10.00.
Прагматы знаходзіліся ніжэй за найніжэйшы калікульваны бал, таму ён ніколі не быў актывацыраны, нават аднаго разу. Палітыка аднаковага рангавання была абсалютна тая ж, як і вечнае выкарыстоўванне дышэўкага модэлю, плюс дадатковыі накладкі — рэчка ў таблыцы рэзультатаў, якая нічога не паказвала, але выглядала як нараджэнне. Нулявы прагматы не ёсць нейтральным стандартам. Гэта тэза пра распад, які ніхто не аналізав, і кожны абсалютны прагматы лагіта мае такія недагоды, адтуды што распад змініцца, калі змяніцца рэранкер або корпус.
Рашэннем было вылучыць гэты номер. Неабяжна было запускаць толькі два канцэнтры — для рэальных, якія завжды ўяўляюць ся дышэўнымі, і для тых, якія завжды ўяўляюць ся дорогімі, фіксуючы бал, правільнасць і косць кожнага запытання. Кожны прыгранак межы ў такім случае ўключае перагляд рэкордаў, якія вучынены ў памяці, без жадных дадаўных вызоў API, пры чым выконваецца ўсесторонній аналіз усіх рэкордаў, а не толькі выбраных.
Рэзультаты тэста прынеслі неспадак: кожны прагатак толькі змініў вартасць, а точнасць не змянілася. Дыягназы паказвае прычыну. З дванаццаць запытанняў удалося адпаведаць толькі на адна, што значыць, што дэшавы модэль зазнаў неудачы, а дорогі — успеху. Гэта запытанне павысілася на 10,00, што ўскладнілае максімум у дыяпазоне, тады як запытання, на якія дэшавы модэль ужо адпаведаў правільна, мелі медыяну 8,29. Џедыная неудача, якая заслуговала на прыняцце заходаў, была тая, ў якой модэль быў наіболей впэўнены, таму жадныя правілы, заснованыя на прыняцці заходаў у разы неяснасці, не моглі яе выявіць ні на якім прагатку. Сігнал направлення не можа працаваць правільна, прычыму ён быў створаны для працы самэлька.
З’явіўся таксама побачны эфект. Рэальны запуск паказаў 92%, але перэгляд ужэ оплацаваных радоў прыпускаў 83%. Разлік не становіць наследку дзеяння певнага порога. Ён вынікае з таго, што суддзя LLM оцінюе ідэнтычныя адпаведзі разна апошнім разам і спрыяе таму, што не агласоўваецца 9-пунктавая перадача, якая ўсё роўна ёсць толькі шумам.
Змена, якая прынесла двойную выгоду
Пераранжаванне было найчыстэйшым спосабам паводжэння, і прычына гэтага заслуговае на розумеў і застосавання.
Вектарны пошук укладае запіт і кожны фрагмент окрэма, за дапамогою модэлю, які ніколі не спрыймае іх як пару. Крос-кодэр берае пару як адзін вхід і оцінюе яго безпосерэдна, што ў дзесяткі разоў точней, але занадта сповольна для обработкі цэлаг корпусу. Таму праграма дэшава запрашае 25 кандыдатаў, перэранжавае іх і залішае 4 найлепшыя.
Рэкаліі вырослі з 83% да 89%. Яшчэ значным паказатэлем ёсць тое, дзе апавесцела адпаведна адказа. Да пераранжавання правы фрагмент зазвычай займаў другое чы трэцяе месца, таму для безпекі выдавалі пяць фрагментаў. Пасля пераранжавання ён зазвычай стаў першым, і чатыры фрагментаў было достатнька. Калі задовольняцца базовай точнасцю, можна зменшыць колькасць фрагментаў да двух, чыяму спадае колькісць токэнаў на 57%.
Паколькі парадак павышаецца, менш фрагментаў досягае той самой точнасці, а саме токэны запрошэння ўрахоўваюцца па калькуляцыі. Гэя змяна даўае вышэю точнасць і ў той жытак дазволяе атрымаць зніжку. Яе цена — 73 мс працы местнага CPU, у працоўнасці LLM — 1,252 мс, чыяе разлікі ніхто не зазначае.
Што застаецца без змян
- Абавязкова перагляньце вхідны тэкст прычымоўваючыся да прыстрою для пошуку. Одна дэшавая петля можа абкрасіць проблемы, такія як проблема з дашчокамі, чы ўтварыць паведамленне пра тое, што няма перакананняў, што робіць пазнейшыя дзеянні болей безпечнымі.
- Стандартныя настройкі прызначаны іншым людзям, або ўзагалі нікому. Значэнне 100 ніколі не дапамагало, а порог 0,0 ніколі не спрацьвоўваў, і ў рэальных умовах ні адно з іх не будзе выказвацца. Џедыным сімптамам будзе вышэйшы рахунак без жадных пояснэнняў.
- Зважыце, як паводзіцца аптымізацыя у тых случаях, калі яна робіць помылкі, а не толькі як часта яны трапляюцца. Фільтр, які 22% часоў працюе некорэктна, але проста пераранжуе рэзультаты, можна прыйняць. Такі ж фільтр, які 22% часоў працюе некорэктна і робіць так, што адпаведны адпаведны рэзультат стае недоступным, — нельга прыйняць.
- Адхілена ідэя — гэта таксама рэзультат. Чатыры ідэі, якія не былі рэалізаваны, — гэта ўсё тыя ж чатыры рэчы без адпаведнага адтрымання, манітарынгу, версіявання чы ўпавядомленняў у паўнай ночы.
Існуе адзін застэрэжны момент. Ключ адказоў містыць 18 паўнастаўленых пар пытання-адказ, таму адна пытанне коштае 5,6 балоў. Занепад у распадзе на 22 балы стосуецца чатырох пытанняў, што ўжо дастатнька для дальнейшых дзеянняў. Рэзультат перакрыцця на 11 балоў стосуецца двух пытанняў, таму ён ў лепшым случае мае напрамнавы характэр. Ключ адказоў, створаны на базе сэрвэта самай команды, павінен канчаткова заменіць давер'е да чужых цыфраў. Працэс вычыслення заўсёды займае або-бо пяць сэкунд на процэсары ноутбука, пры чым існуе жорсткі ліміт бюджэту, які стварае адзін выключэнне з правілаў, замест таго каб показаць гэтыя цыфры на рахунку-фактурэ.
Супаўзеўныя матэрыялы
- Сэм архітэктураў RAG, якія выходзяць за межы простага пайплайна, і калі кожная з іх падходзіць — простыя архітэктуры RAG выконваюць паўтарныя помылкі. Сэм архітэктураў, ад кантэкстуальных нотатак да багата-агентных сістэм і сістэм адзысквання памяці, з іх перавагамі і сцэнарамі выкарыстоўвання.