Калі бот RAG цитуе некалькуючы суму страховага выкарыстання
Канчер фіксаванага габарата дзеліў суму ў долерах на роўні; паўтарна перабудова апрацоўкі і падых на чатыры рэвэлюцыі канчаравання — ад рекурзіўных базовых пунктав да выявлення галоўнага дакумента — перш чым можна было паверыць у адпаведныя адказы.
Усё, што напісана нижэй, — це складаная наратыва для навчання. Назвы компаній, імены людзей та сумы ў долерах є вымышленымі; спосабы парадків ўзгадваюцься як тые, з якімі на практыцы сталкаюцца системы RAG у сферах регулюемага страхавання та іншых сферах з высокім рызыкам.
У пазнюю частку вівторка керавучы аддзёнам заяваў пра проблему інжынерам: асістент паведаміў кліента, што сума страховага выключэння за повеню станавіць 500 долераў, хаця у полісе было зазначана 5 000 долераў. Бот, распрацоўваючы інформацыю з дапамогою тэхналогій адзысквання дадзеных — „Atlas“ — працаваў вясьмі дзён, располагаючы базай вектароў, модэлем укладання дадзеных, супэрна скарым LLM та прыемным інтерфейсам. Аднак у яго не было эфектывай стратэгіі часткавання дадзеных.
Адзысканы фрагмент выглядаў так:
...applies to all covered perils. Deductible: $5
00 for flood events in Zone A, $500 for wind events, and $1,0
Пракцэс выкарыстоўвання PDF спыніў розбіўку цифры на разныя лініі. Пасля таго часткавач фіксаванага размеру роздзяліў тэкст на часткі по 500 симвалаў па самой гэтай межы. Модуль укладання дадзеных створыў індэкс фрагмента, у якім было зазначана „5 долераў“ та „500 долераў“. Модэль з упэўненасцю, але неправа, дала адпаведь.
Наступна часть паказвае, як была перабудована система обробкі: адна стадія парсінгу, яка встановляе максымальны ліміт, а потым чатыры рэвеню фрагментавання, якія падыходзяць да гэтага ліміту з растучымі витрамі.
Адна модэль структуравання дапамагае застаць чыстасць эконамічных расчыткаў: па-большайшай часткі вартасць фрагментавання — цэ хутчысінькі вычысленны індекс. Ён запускаецца офлайн, да таго часу, калі не прыйшла жаданне ад корыстніка. Џедыныя виткі, якія паўтараюцца ў показніку query p95 і якія стосуюцца фрагментавання, — цэ сама модэль імбеддынгу. Тое, што называецца «дорогім» для вышэйшых рэвеню, означае дорогі вычысленні адна раз на дакумент, а не за кожны запит.
Стадія 0: Вы не можете фрагментаваць структуру, якую знішчылі пад час парсінгу
Першым інстынктам ёсць викорыстанне болей розумнага інструмента для разбівання на часткі. Кращы першы вопыт: паказваць тэкст, які разбіваецца, а не PDF-файл. У пачатковым варыянті Atlas тэкст складаўся з масы симвалоў; заголовкі ператварыліся на звычны тэкст, а табелі — у сплетаны текст, у яком значэння з розных рядоў стаялі ўзаўсёды адночасна. Тэкст на сторанцы (“Policy Form HO-3 — Page 14 of 62”) павтарыўся кожныя калькі симвалоў.
Жаданы інструмент для разбівання не можа вярнуць межы, якія ўжо былі знишчаны парсерам. Якщо заголовкі зниклі, інструмент для роздзелення заголовкаў у формате Markdown не мае чаго роздзеляць. Якщо табелі растаялі, нічога не захоўвае ряды ў цэласці.
Падберыце кожны тип вхідных даных пад парсер, які генеруе структуру, яку можа викорыстаць інструмент для разбівання:
Аўтэнтныя PDF-файлы і DOCX (формы для заповнення, падтверджэнні, кераванні). Лепш выбіраць парсэры, якія разумеюць макет — LlamaParse, Unstructured.io, Docling, Azure Document Intelligence — замест простых выкарыстоўванняя тексту. Неабходнае ўжыццё markdown з апісаннем типаў элементаў (загалоўкі, таблыцы, спісы), а не простаў шматка тексту.
Сканаваныя PDF-файлы, з’еўрэбнікі і факсы. Неабходнае выкарыстоўвання тэхналогій OCR (Tesseract ёсць найслабейшы; PaddleOCR, Textract, Document AI, Azure — аднаковае кращыя). Неабходны текст, блокі макету і ранг паверыльнасці для кожнага блаку. Ранг паверыльнасці пазней дапамагае визначыць, чы “гэтае значэнне є неняснае — не трэба на яго адпаведзаць ў чысцэнні дэдактыў”.
HTML і внутранія вікі. Неабходнае адзьмянэнне непатрэбных элементаў і выдача чыстага markdown з сохраненымі загалоўкамі.
Презентацыі і табліцы. Неабходнае сохранэнне меж слайдоў чы сярожкі, каб жаданы фрагмент ніколі не супакоўваў несвязаныя слайды.
Аудыё і відэа (тэлефанныя размовы, вебінары). Сервісы Whisper, Deepgram чыста AssemblyAI должны ствараць транскрыпцію, у якой будуць пазначены тыя, хто гаворыў, і калі. Якщо спікеры не аддзельваны, протыярысныя заявы ад рэгулятора і кліента могу злучыцца ў аднаго вводзячага ў глухое цікавасць параграфа.
Пасля перапарсавання з урахоўваннем структуры, раздзіл з паказванням сумы, якая можа быць выключена з выплат, выглядаў так:
## Section 4 — Deductibles
### 4.2 Peril-specific deductibles
| Peril | Zone A | Zone B |
|----------------|---------|---------|
| Flood | $5,000 | $2,500 |
| Wind / hail | $500 | $500 |
| Named storm | $1,000 | $1,000 |
Табліца была вярнутая. Дрэво заголовкаў таксама было вярнутая. “$5,000” знову стала адным токенам. Код для разбівання на часткі яшчэ не змяніўся, і процес выкарыстоўвання дадзеных стаў болей безпечным.
Рэжым 1: Синтаксічнае разбівання — дышэўка, шырока, і тут вам трэба пачаць
Фіксаваныя размеры: пратотып, які выйшаў праз адпадковасць
Раздзеляйце кожныя N симвалоў або токенаў (CharacterTextSplitter, tiktoken). Кост ад індэксавання ўжо близу нуля. Годна для тымчасовых ситуацый; катастрофічна ў прыменэнні у рэальных умовах. Це спрычынае перерывы серед рэчэнняў, табелей, цифр — адносна точна такія ж ситуацыі, якія выкалучаюць можлівасць аналізу. Правіла пасля той ночы: формат з фіксаваным размахам ніколі не можа выкарыстоўваться ў дзяржавым рэестре.
Команды знову і знову адкрываюць той самы патэран: корпус дамаў з короткімі пасоўкамі на блогах вытрымае раздзелэнне на симвалы, але як толькі з’являецца першы PDF у калькулярнай форматазе або документ, перакананы OCR, якасць адпаведзей рэзкаа падупала. Спрыяйце фіксаваным окнам як каркасу для локальных эксперыментаў, пры чым неабходна ўключыць явны пункт у чартку контролю для іх замены пры першай жа можлівасці, перад тым як пачнёцца робота з зовнішнімі корыстувальнікамі.
Перакрыцча: регулятор, а не стратэгія
chunk_overlap павтарае заканчэнне чака N у пачатку чака N+1. Часта значэньне — 10–15 процэнтаў (на прыклад, 50 з 500 токэнаў у чаке). Адзінакаванне ёсць недорогы спосаб захоплення для рангаў 1–2; ён не выправляе паслабленых граней — ён іх толькі павтарае. Калі адпаведнае рашэнне знаходзится ў зоне адзінакавання, колькасць вектараў і падобных рашэнняў у методе top-k зростае прыблізна на 10%.
Калі ў спісе суседніх рашэнняў домінуюць павтарэння, інструменты переранжавання і большыя мовныя модулі витрачаюць ресурсы контэкстнага вікна на адной і той жа рэчы два разы. Адзінакаванне па ідэнтыфікаторы або па хеш-значэннях тэксту, якія ў большай меры ідэнтычны, пасля абрання даных, ёсць недорогым спосабам смягчэння проблемы, якщо з іншых прычынаў адзінакаванне павінна застацца высокай.
Рэчы/парараграфы: сягледзяць граматыку, ігнораваць дакумент
Збір цэлых рэчэнакоў у адзин бюджет (NLTK, spaCy, LlamaIndex SentenceSplitter). Ніколі не розрывае рэчэнак усередзіне — іначы бы гэта завадзіла розбівцы на новыя лініі — але ён не ведае пра загалоўкі, табелі чыстыя списакі выключэння. Чудова працюе з транскрыпціямі калі ўсё праходзіць па плану; сяродняя — з структураванымі формамі політык.
Рэкурсыўны симвал: стандартны варыянт, які вы выкарыстоўвайце першы
RecursiveCharacterTextSplitter пробуе разлініювачы па прыоритэце — порожняя лінія, новая лінія, рэчэнак, слова — і пераходзіць да іншага варыянта толькі тады, калі фрагмент заўсёды занадта вялік, пасля чаго з’еднае маленькія фрагменты да значэння chunk_size. Частае базовае значэнне — 500 токенав з 50% перакрыццю:
from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", ". ", " ", ""],
)
chunks = splitter.split_text(policy_markdown)
У перапрацаванай частцы з пунктамі, якія можна выключыць з расчыткаў, было залучана ўсё з 4.2 — укладзеныя там таблицы таксама, адтакуль што порожнія лініі стварылі сама сабою адзиную елементацыйную единіцу, якая не перакрочвала 500 токенав. Баг знік. Неабяжна выдаты recursive-500/50 як базовую памерную базу, а не як готавы дизайн.
Запісаце гэты базовы рэйтынг на дошку і адмовіцеся ад прыемаў «болей розумных» средстваў для раздзелення тэксту, якія не можаць пераканаць яго ў тых сабе ж праблемных запытаннях. Багато дорогіх ідэй здаюцца чароўнымі, пакуль іх не пораўняюць з простым рекурсывным средствам для раздзелення тэксту ў чыстым формате Markdown.
Рэгіон 2: Раздзеленне тэксту з урахоўваннем структуры — раздзеляйце там, дзе ў дакументе вялікі ўжо пунктыр
За дапамогою набору з ~80 рэальных запытанняў recursive-500/50 даў рэзультат ~71%. Неудачы выклікаліся у дужа дзяўгіх частках тэксту, а таксама у адпаведзеннях, дзе модэль не могаў визначыць, канкрэтна якая політыка чы ўражок выйшла з каго.
Раздзеленне загалоўкаў у форматах Markdown / HTML
MarkdownHeaderTextSplitter / HTMLHeaderTextSplitter дзеляць тэкст на часты па іерархіі загалоў і перадае шлях загалау ў метаданы:
from langchain_text_splitters import MarkdownHeaderTextSplitter
header_splitter = MarkdownHeaderTextSplitter(
headers_to_split_on=[("#", "h1"), ("##", "h2"), ("###", "h3")]
)
sections = header_splitter.split_text(policy_markdown)
# then apply the recursive splitter inside each section
Кожны фрагмент, вырваны з падраздела 4.2, должен мець „сюдзінную нітку“, напрыклад: форма HO-3 → ставки → таблыця, прызначаная для конкрэтнага рызыку. Штоў такую „сюдзінную нітку“ да тексту пры ўключэнні, каб вектар кодаваў не толькі цыфры, але і месца. З-за проблем з пытанням „Калькі раздел?“ такія варыянты адхоўляюцца; у цітатах можна напісаць „згодна з разделам 4.2“. Кост застаецца майже нульовым — але толькі якшо на стадіі 0 быў выданы справжні маркдаун. Разгледзены тэкст бесшумна стае адным вялікім фрагментам. Лепшае выкарыстоўванне на вікі, тэхнічных дакументах і документах з загаламі.
Поле метаданых таксама должна перавозіцца разам з вектаром: ідэнтыфікатор аднойчынага дакумента, шлях разделу, дата набрання чыннасці і юрисдыкцыя, якшо правілы разніцаюцца па штатах. Гэтыя поля дазволяюць викорыстоўваць фільтры („толькі HO-3, чынны пасля 2024-01-01“), якія чыстая пошук за сэмантычнаю схожасцю не можа реалізаваць.
Урахоўвае макет / by_title
Неструктураваны метод chunk_by_title (і аналогічныя у LlamaParse/Docling) прыменяе граніцы элементаў парсера: таблі застаюцца цэлымі, загалоўкі пачынаюць часткі, спісы зберагаюць свое вступнае рэченне. Ідеальны інструмент для дагавораў та складных PDF-файлаў. API для парсавання коштаюць грошы толькі праз раз, пад час стварэння індексу. Дышучы парсер знижвае цэну — не купуйце розкішную калектры для автомабіля без двагуна.
Урахоўвае код (AST)
Нерэлевантны для корпусаў правіла, абавязковы для Terraform/Python RAG. Разлікванне лінак паводзіцца да аддзелення падпісаў ад тэлу. tree-sitter чы ўрахоўваючы мову рекурзівныя супарцелювальнікі адбываюць розлікванне на вузлах функцый/класаў. Яе выбіраюць, калі корпус складаецца з репозытарыяў чы IaC-коду.
Спалучэнне правіл прозы і кансультацыйкага коду ў аднам індэксе без разлічэння сапраўдзачых элементаў зазвычай дае найгоршыя наследкі: функцыі перерываюцца ў середзіне, а табелі правіл руйнуюцца пад вплывам гэўрістык, спрямаваных на складкі.
Рэгламент 3: Фрагментаванне на аднойчыні — плата за прыняттыя рашэнні толькі тады, калі структура зникла
У 84% прыкладаў з «золатага» набору з’явілася новая категорыя абэранцэй: неструктураваныя транскрыпты калёсаў без заголовкаў. Рекурсывныя блакі з 500 токэнаў паводзіліся на пераходы між тэмамі — спачатку заява пра компенсацыю, потым адреса для падачы — таму эмбеддінгі выказвалі две тэмы і не падходзілі ні да одной з яых.
Семантычнае фрагментаванне
Умяшчайце тэкст па абзацах; здыяўляйце перерыв таму, дзе спад косінай падобнасці паспелі за паказаныя значэння (SemanticChunker, будзь-які адпаведны інструмент для умяшчэння). Адзін процес умяшчэння за час аналізу індэкса. Метод прымае учынак на мову; паказаныя значэння залежнаць ад конкретнага корпусу. Паказаны порог для тэлефонных размов ператворыў ўжо складны тэкст правілаў на маленькія фрагменты — таму выкарыстоўвайце семантычнае раздзелэнне толькі для неструктураванай мовы, а правілы залучайце да другага рэвю.
Распад па класах дакументаў — мова, формы, вікі — ёсць кращым рашэнням, чым пошук аднаўсенага універсальнага інструмента для раздзелэння. Косць арганізацыі — це класыфікатор чы простая змяна типу файла пад час запрацоўкі; выгода — меншяй кантэнт з нечыстымі даннымі.
Раздзелэнне на прыказы / атамарныя факты
Маленькі LLM перапісваюць абзацы у самастоятельныя тэксты («Сума за страхаванне ад паводка для зоны А па полісе HO-3 становіць 5 000 долераў»). Точнасць вырастае, таму што кожны элемент — это адна фактаза з контекстам, які ўключаны безпосередна. Кошт складаецца з адной выкліканні LLM на абзац — што ўсуне проблемы для невялікіх, але высокаточных корпусаў дакументаў, такіх як 40-сторонній FAQ. Аднак існуе рызык: тэксты можаць адхіляцца ад первіснага формулювання. Калі кляўцы спрачоўваюць адпаведзі, болей правільна будзе вжыванне точнага цитатавання, а не парафраз. Тэксты трэба выкарыстоўваць толькі як дапамогу для пошуку, а для цитатавання неабходна вярнуць самы адначасовы абзац.
Організацыі, якія займаюцца супакоўкамі та прыемамі кляўчых заяваў, зрэшты патрабаваць буду картінку сторонікі або PDF-файл з выдзеламі частак пад кожной адпаведзю. З самага пачатку трэба стварыць ідэнтыфікаторы для цитатаў, каб індексы тэкстаў заставаліся толькі інструментам прышвартавання, а не основай для зберагаўання дакументаў.
Агентны чанкінг
Практычна ўстановка — даць цэлы дакумент флагманскаму моделю для выбору меж. Аднак ёё працэздатнась і масштабаванне ўжо з самага пачатку слабкія: выкалыкі расту лінейна заўсёды, калі росте размер корпусу дакументаў, тады калі ж значэнне не расте. Годная для каля колькісці некалькох сотэй важлівых дакументаў; не падходзіць для мільйонаў.
Ранг 4: Разбівка на часткі пад час пошуку — шуканне малых елементаў, вярненне большых
У рангах 1–3 прыпускаецца, што елемент, які індексуецца, ёсць тым самым елементам, які вяртаецца. Гэта вымушвае робіць неправильны компроміс: малыя часткі дазволяюць чыстае стварэнне эмбеддінгаў, але не даюць LLM достатнько контексту; большыя часткі даюць контекст, але паслабляюць якасць эмбеддінгаў. Настоўкі параметра chunk_size ніколі не дазволяюць знайсці універсальнае оптимальнае рашэння.
У рангу 4 ролі раздзеляюцца: элемент для пошуку, які падбіраецца па параметрам да стварэння эмбеддінгаў, і элемент для вярнення, які падбіраецца па параметрамам LLM. Критэрыя для адгукнення: якщо вам патрэбна другая база дакументаў (docstore, карта-родзіч, дрэва), значыць вы знаходзіцеся у рангу 4.
Родзічны дакумент / ад малага да большага
Індэкс маленьких дзецей (150–200 токенав). Пры падборе неабяжна вярнуць большыя элементы-родзічы (весь раздзел 4.2 або падраздзел дыяв ~1,500 токенав):
from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=1500)
child_splitter = RecursiveCharacterTextSplitter(chunk_size=200)
retriever = ParentDocumentRetriever(
vectorstore=vectorstore,
docstore=InMemoryStore(), # the "second store"
child_splitter=child_splitter,
parent_splitter=parent_splitter,
)
retriever.add_documents(policy_docs)
LlamaIndex AutoMergingRetriever працуе за аднаковай іерархіяй. Дапаможныя затраты на індэксаванне практычна равны нулю — тыя ж тексты размешчаюцца ў меншых частках. У „золатай” калекцыі сама гэта змяна падняла рэзультат Atlas з ~84% да ~91%; запит „what’s my flood deductible“ падаў на точную строчку табелі, тады калі LLM яшчэ бачыў суседзяючыя прыміткі (вакол таго, як вядома зона A). Аперацыйныя затраты: сховішча дакументаў, ключаваная па ID родзіча, якая залишаецца сінхронай праз апдэйты.
Тут важнае значэнне мае выдаленне і версіяванне: калі пераглядаецца раздзел 4.2, дзеці і родзічы павінны апдэйтавацца разам, іначы система будзе выкарыстоўваць точны дзецінскі элемент, які адкрывае застарэлы родзіч. Процес уваходжэння дакументаў трэба спрыятаць як транзакцыйную публікацыю родзіча, дзецей і ўсіх асоцыяваных дадзенняў — а не як тры незалежныя задачы.
Контэкстуальнае выкарыстоўванне дадзенняў
Перад умяшчэнням запытайце міні-LLM пра адзін чырво сэнтэнцы, якія будуць паводлай ситуацыі, і дадзіце іх на пачатак; адушыце іх з BM25. Фрагменты на кшталт “Зона А: $5,000 / Зона Б: $2,500” стануць доступнымі для адзыскання. Коштавасць — адна вызова LLM на кожны чанк; без кэшавання праграматы вылічэння ўжо, а з кэшаванням прыфікс дакумента застаецца “тэплым”, і вызовы на кожны чанк застаюцца дешавымі.
Пазнелейкое чанкуванне
Умяшціце весь дакумент за дапамою інструмента для умяшчэння з дзяўным контекстам, а пасля вырахавайце сярэдніе векторы токенав у межах кожнага чанка. Векторы чанкаў несу контекст дакумента без неабходнасці вызова LLM на кожны чанк. Гэта конкуруець з методамі адзыскання на адваротнае падставе контексту, але прымушвае вас выкарыстоўваць моделі умяшчэння з дзяўным контекстам.
Хіерархічнае чанкуванне / RAPTOR
Аграгуець фрагментаў, стварае падсумкі, занова аграгуець гэтыя падсумкі ў дрэво; стварае індекс для кожнага рэвэру. Шырокія запиты атрымваюць адпаведныя падсумкі; конкрэтныя запиты атрымваюць адпаведныя рэзультаты на найнижшых рэвэрах. Высокія виткі на 4-му рэвэре ўскладнююць працę, калі змянююцца дакументы — перзбудова ў такіх случаях є дужа дорогай. Квартальныя апдэйты правіл зробілі RAPTOR падходячым выборам для Atlas.
Статычныя базы знанняў — внутрашні энцыклапедыі, якія зміняюцца ў кожны год — можу прымкнуць перзбудову дрэва. Аднак жывыя формы страхавання гэтага не можу. Выбірайце іерархічныя методы толькі тады, калі шточна заданыя рэт кароткага змены і бюджет на перзбудову.
Што гаворыць перзбудованы план дзеяння
Чырвоў што пасля трэнінгу з адпаведнасці Slack, Atlas пасягнуў майже 93% у тэставанні з аптавам наборам запытаў, які налічваў або-такі 300 запытаў. Короткая версія плану дзеяння:
Пачніце з рекурзыўнага раздзелення симвалоў плюс рэзакоў, якія уважна ставяцца да структуры, пры аб’ёме прыблізна 500 токенаў і 50% перакрыцця — гэта практычна нічога не коштуе і дае можлівасць абліковаць базовы показнік. Спачатку апградуйце систему да выкарыстоўвання галоўнага дакумента, каб размеры паспадобленаў і выданых дакументаў моглі разніцявацца. Лиш тады інвестуйце ў контекстуальнае выкарыстоўвання дакументаў, якщо ў наборы для ацэнкі все ўсё ж такі проблемы з вярнамасцю дакументаў.
Нічыя з вышэйзгаданых мераў не можа вярнуць правільную структуру дакумента. Спачатку паспрабуйце выправіць процес выкарыстоўвання дакументаў, перш чым налаштовваць прыборы для ўскладнення структуры.
Версія на адной сторонцы
Этап 0 — Аналіз структуры. Падберыце прыборы для аналізу структуры па типу вхідных дакументаў: структураваны markdown для натывных докумэнтаў; текст + макет + ранг надзеі OCR для сканаваных дакументаў; чысты markdown з заголовкамі для HTML-дакумэнтаў; межы слайдоў/аркушаў для презентацый; транскрыпціі аудыядакументаў. Гэта встановлівае верхнюю межу для налаштавання.
У рангу 1 — сынтаксічны. Фіксаваныя размеры толькі для пратэтынаў. Надакладанне — це дыялектар (10–15%), які калічыць дублікаты па прынцыпе top-k. Раздзеленыя рэчы паследаваюць граматыку, ігнаруючы логіку дакумента. Рэкурсыўны падход 500/50 ёсць стандартным базовым параметрам, а не канечной метай.
У рангу 2 — з урахоўваннем структуры. Раздзелы загалоўкаў несу шляхі разделаў; ўсё залежыць ад якосці парсера. Распаўненне by_title заходзіць на цэлыя табелі; дешавыя парсеры губяць гэты эфект. Раздзелы у формате AST выкарыстоўваюцца для хранення коду.
У рангу 3 — на адной з модэляў. Семантычныя раздзелы залежнаць ад ступеня сэмантычнай падобнасці; налажванне ведзецца па кожнам корпусе. Прыпоزыціі падвышаюць точнасць у малых корпусах, але выклікаюць адхыленні ў формулюваннях. Агентныя методы рэдка калі єсць эфектывнымі у масштабных задачах.
У рангу 4 — часы выкарыстоўвання. Падход за дапамой малых елементаў; доставка большых. Гэты варыянт ёсць найболей эфективным з точкі зору адзычных вялікасцей. Для контекстуальнага выкарыстоўвання неабходна кэшаванне. Разбіўка на часткі пазней ёсць дышэўней, але мае обмежэнняя з боку прыстрою для вбудоввання. RAPTOR стае застарэлым пасля апдэйтаў. Якщо трэба другі істочнік дадзеных, то гэта ў рангу 4.
Проблема, якая выклікала споры, на самай працоўнай час не стосавалася выбору між LangChain і LlamaIndex. Йа стосавалася неабходнасці адзначэння структуры дакумента раней за вырахункі, апранавання інструментаў для разбівкі на часткі на рэальныя запытанні клёўянтаў, а таксама вадзібнасці не даваць модэлю фрагменты, якія немаглі бы зместіць цэлы числовы факт.
Ствараць «золаты» набор на адказах, які вже спантавалі продукт — некоректныя сумы страховых выкарыстанняў, нехватка абставінаў, плутаныя рэкамендаціі — а не на синтэтычных фактах. Адзельна оценяць правільнасць адказаў і адпаведнасць цітатаў, каб некоректны адказ ніколі не выглядаў як паводзінне. Калі з’являецца новы элемент, трэба, каб ён перавыпануў базовы показнік па обох метрыках, прычаму ён толькі пачне працаваць з реальным трафікам.
На заканчыце, трэба застаўляць механізм абароны: якщо рэверенція OCR для числовага фрагмента низкая, або якщо версіі-роды і-дзеці не згаджаюцца, асистэнт должен адмовіць у адпаведзе на пытанне пра страховыя выкарыстанняў і перадаць яго вышэй, а не выдумваць рэверенцію. Карыстувальнікі набагато шчыльнае прыменяюць адмову «не можна паўнаста пераканацца на адваротнае на падставе заполненага формуляра», чым випадкова некоректны адказ на суму пяцісот долераў. Такі шлях адмовы павінен быць частью тэхнічных вакуфнаў продукту, а не толькі частью прэzentацыі пасля аналізу наследкав.