Құжаттар бойынша гибридті іздеу: BM25 және эмбеддингтер
Құжаттар бойынша гибридті іздеу бұйрықтарды, келісімшарттарды және тикеттерді дәлірек табуға көмектеседі. BM25 мен эмбеддингтер схемасын, баптауды және жиі жіберілетін қателерді талдаймыз.

Неге бір ғана іздеу тәсілі керек құжаттарды жоғалтады
Мәселе көбіне индексте емес, құжаттардың өз тілінде жатады. Бірдей мағына компания ішінде әртүрлі жазылады. Қызметкер «өз есебінен демалыс» деп іздейді, бұйрықта «жалақы сақталмайтын» деген тұжырым тұрады, келісімшартта бұл ұзақ шарттың ішінде жасырынған, ал тикетте біреу жай ғана «unpaid leave» немесе «БС» деп жазады.
Бұйрықтарда бәрі құрғақ тілге тіреледі. Мәтін қысқа, шаблонға ұқсас, күндер, нөмірлер және ішкі ережелерге сілтемелер көп. Дәл тіркес арқылы мұндай құжат тез табылады. Бірақ адам сұрауды өз сөзімен құраса, сөз сәйкестігіне негізделген іздеу жиі айналып өтеді.
Келісімшарттарда мәселе басқа. Ондағы мағына сирек ашық жатады. Қарапайым ой он жолдық абзацтың ішіне оңай жасырынуы мүмкін: алдымен ерекшеліктер, кейін шарттар, содан соң қосымшаға сілтеме. Іздеу тек сөздерге қараса, ол жиі қайталанатын заңдық тіркестерге ілініп, дұрыс емес үзінділерді жоғары шығарады. Тек мағынаға қараса, кейде тақырып бойынша мәтінді табады, бірақ керек мерзім, айыппұл немесе міндет көрсетілген тармақты жіберіп алады.
Тикеттерде шу одан да көп. Адамдар тез жазады, жаргон қолданады, қысқартады және қате жазады. Бір қызметкер «CRM ашылмай тұр» десе, екіншісі — «crm лаг жасап тұр», үшіншісі — «клиент карточкасында 503» дейді. Кәдімгі іздеу үшін бұл дерлік бөлек әлемдер. Семантикалық іздеу үшін де бәрі оңай емес: ол ұқсас шағымды табуы мүмкін, бірақ инцидентті багпен, сұрақты қолжеткізу сұрауымен, жергілікті ақауды жаппай мәселемен шатастырып алуы ықтимал.
Сондықтан бір ғана әдіс дерлік әрдайым бір нәрсені жоғалтады:
- дәл сөзбен іздеу қайта айтылған ойды, жаргонды және қысқартуларды өткізіп жібереді;
- семантикалық іздеу формулировканы жұмсартады, бірақ кейде маңызды бөлшектерді жоғалтады;
- қысқа құжаттарға контекст жетпейді;
- ұзын құжаттарға артық шу кедергі жасайды.
Шынайы жұмыста сұрау дерекқордағы мәтінмен сирек дәл сәйкеседі. Әсіресе бір корпус ішінде бұйрықтар, келісімшарттар және тикеттер әртүрлі стильде жатса. Сондықтан құжаттар бойынша гибридті іздеу көбіне жақсырақ жұмыс істейді: BM25 терминдерде, нөмірлерде және тұжырымдарда дәлдікті ұстап тұрады, ал эмбеддингтер адамдар басқа сөздермен сөйлегенде көмектеседі.
Қашан BM25 жақсырақ, ал қашан эмбеддинг керек
BM25 бір белгі мағынаны өзгертіп жіберетін жерде пайдалы. Егер қызметкер №47 бұйрықты, 12.3-бапты, E102 қате кодын немесе «қызметтік іссапар» сияқты дәл тұжырымды іздесе, мұндай іздеу дерлік әрдайым таза мағыналық іздеуден сенімдірек.
Себебі қарапайым: BM25 нақты сөздерге және олардың корпуста қаншалықты сирек екеніне қарайды. Сұрау мәтінмен неғұрлым дәл сәйкессе, керек құжаттың жоғары шығу ықтималдығы соғұрлым артады. Бұйрықтарда бұл әсіресе байқалады, өйткені онда нөмірлер, күндер, лауазымдар, бөлім атаулары және орнықты тіркестер көп.
Эмбеддингтер басқа жағдайда пайдалы. Олар адам құжатта жоқ сөздермен сұрау құрастырғанда көмектеседі. Тикеттерде бұл үнемі болады: бір қызметкер «касса қатып қалды» дейді, екіншісі — «терминал ұзақ жауап береді», үшіншісі — «сатылым өтпей жатыр». Мағына ұқсас, сөздері бөлек. BM25 мұндай байланысты жиі жіберіп алады, ал эмбеддингтер оны ұстап қалады.
Келісімшарттарда көбіне аралас тәсіл керек. Онда әрі нақты сөздер, әрі жақын мағына маңызды. Заңгер «айыппұл кешігу үшін» деп іздеуі мүмкін, ал мәтінде «мерзімді бұзған кездегі өсімпұл» деп жазылған болады. Сонымен бірге келісімшарт нөмірін, 5.4-тармақты және контрагент атауын жоғалтуға болмайды. Мұнда бір ғана сигнал жеткіліксіз.
Бағдармы мынадай. Бұйрықтар көбіне дәл сөз, нөмір және бап бойынша іздеуден ұтады. Тикеттер көбіне мағына арқылы іздеуден ұтады. Келісімшарттарды екі сигналмен бірге ранжирлеген дұрыс. Анықтамалар мен регламенттерде бәрі компанияда қалай іздейтініне байланысты.
Жақсы тексеріс — бір сұрауды алып, екі әдістің не шығаратынын қарау. «2 күнге қашықтан жұмысты қалай рәсімдеу керек» деген сұрау мәтінде «уақытша қашықтан жұмыс режимі» деп жазылған бұйрықпен дәл сәйкес келмеуі мүмкін. Мұны эмбеддингтер ұстайды. Ал «15 наурыздағы 184-бұйрық» деген сұрауды көбіне BM25-ге беру дұрыс.
Тәжірибеде біреуін ғана таңдау сирек дұрыс. Егер корпуста әртүрлі стильдегі бұйрықтар, келісімшарттар және тикеттер аралас болса, BM25 тұжырымдардағы дәлдікті ұстайды, ал эмбеддингтер қайта айту мен сөйлеу тілін жабады. Екеуі бірге әлдеқайда тең нәтиже береді.
Корпусты индекстеуге қалай дайындау керек
Нашар іздеу көбіне модельден емес, корпустан басталады. Егер бір индексте бұйрықтар, келісімшарттар және тикеттер құрылымсыз жатса, жүйе қысқа қызметтік тіркестерді келісімшарттың маңызды шарттарымен шатастырып, нөмірі немесе күні бойынша керек құжатты жоғалтады.
Алдымен құжаттарды түріне қарай бөліңіз. Бұйрықтың құрылымы әдетте қатаң болады, келісімшартта қайталанатын формулировкалар көп, ал тикет тірі тілде, қателермен, қысқартулармен және хат алмасудың бөліктерімен жазылады. Осы бір қадамның өзі-ақ алғашқы іріктеу кезеңінде нәтижені жиі жақсартады.
Әр құжат үшін тек мәтінді емес, түсінікті өрістерді де сақтаңыз: нөмір, күн, автор немесе орындаушы, бөлім, мәртебе. Бұл өрістер BM25-ге де, сүзгілерге де көмектеседі. Пайдаланушы жиі мағына бойынша емес, тірек бойынша іздейді: «наурыздағы 154-келісімшарт», «IT-бөлімінен келген тикет», «филиал бойынша бұйрық». Мұндай деректер жалпы мәтіннің ішінде жасырын тұрса, іздеу тез шуылға айналады.
Қызметтік қоқысты бөлек алып тастаңыз. Колонтитулдар, қайталанатын қолтаңбалар, келісу мөрлері, ұзақ дисклеймерлер және беттердің көшірмелері индексті ісіндіріп жібереді. Соның салдарынан бір шаблонның өзі нақты мазмұннан ауыр болып кетеді. Келісімшарттарда бұл әсіресе анық көрінеді: типтік блоктар жүздеген файлда қайталанып, бір құжатты екіншісінен ажыратуға кедергі жасайды.
Қысқартуларды индекстеуге дейін бір қалыпқа келтірген жақсы. Егер бір жерде «кел.», басқа жерде «келісімшарт», ал тикеттерде «к-ш» кездессе, іздеу сәйкестіктерді бөле бастайды. Бір стандарт таңдаңыз да, оны барлық жерде қолданыңыз. Бұл бөлім атауларына, лауазымдарға және жиі қолданылатын ішкі аббревиатураларға да қатысты.
Негізгі мәтін мен қосымшаларды араластырмаған дұрыс. Хат, қосымша сканы, тикеттегі комментарий және келісімшарттың өз мәтіні әртүрлі міндетті шешеді. Егер бәрін бір өріске қоссаңыз, қысқа сұрау құжатты тек керекті сөз қосымшада кездескені үшін ғана қайтаруы мүмкін, ал негізгі мазмұнына емес. Сондықтан body_text, attachment_text, comments сияқты бөлек өрістер ұстау оңай.
Қарапайым мысал: келісімшартта нөмір, күн, контрагент және құжаттың негізгі бөлігі бар, ал қосымшаның өз мәтіні мен өз түрі бар. Сонда нөмір бойынша іздеу тікелей келісімшарттың өзін табады, ал актідегі тіркес бойынша іздеу қосымшаны бөлек көтереді. Кейін салмақты баптау да жеңілдейді.
Құжаттарды фрагменттерге қалай бөлу керек
Тым үлкен фрагменттер жауапты артық мәтіннің ішіне жасырып тастайды. Тым кішісі мағынаны бұзады. Көрші беттің көмегінсіз түсінілетін бөлік керек.
Келісімшарттарда шекаралар әдетте құрылымның өзінде бар. Оларды тең символ саны бойынша емес, бөлімдерге, тармақтарға және қосымшаларға бөліңіз. Айыппұл туралы тармақты төлем шарттарынан бөлек сақтау жақсы, екеуі де қысқа болса да. Сонда BM25 нақты сөздерді табады, ал эмбеддингтер ұқсас тұжырымдарды тартып әкеледі.
Бұйрықтарда схема басқаша. Бір бұйрықта жиі тақырып, мерзімдер, жауапты адамдар және қосымшалар араласып кетеді. Негізгі мәтінді мағыналық блоктарға бөлу, ал әр қосымшаны бөлек фрагмент ретінде сақтау ыңғайлы. Егер қосымша кестеден тұрса, қысқа контекст қосыңыз: бұйрық нөмірі, тақырыбы және бұл қандай қосымша екені.
Тикеттер формалды құжаттарға ұқсамайды, сондықтан оларды басқаша бөлу керек. Хат алмасуды әңгіме барысына қарай бөліңіз: мәселені сипаттау, нақтылау, тексеру, қорытынды шешім. Соңғы жауап сирек жеке өмір сүреді. Егер инженер «себебі қолжеткізу құқықтарында» деп жазса, жанында кемінде қандай ақауға қатысты екенін қысқаша түйіндеген жөн.
Әр фрагментті жай ғана мәтін ретінде емес, метадеректермен бірге сақтаған дұрыс: құжат тақырыбы, түрі, нөмірі мен күні, бөлімше немесе автор, бөлімнің, тармақтың немесе қосымшаның идентификаторы. Бұл әрі іздеуге, әрі сүзгілерге көмектеседі. Корпоративтік іздеуде адамдар жиі жай ғана «төлем шарттарын» емес, «2024 жылғы жеткізу келісіміндегі төлем шарттарын» іздейді. Метадеректерсіз мұндай сұраулар оңай шатасады.
Пайдалы тексеріс өте қарапайым: фрагментті әріптеске көрші мәтінсіз беріп, ол типтік сұрауға жауап бере ала ма деп сұраңыз. Егер жауап түсінікті болса, өлшемі дұрыс. Егер адамға алдындағы немесе кейінгі абзац жетпесе, сіз тым қатты бөліп тастадыңыз.
Жақсы бағдар — символ саны емес, аяқталған ой. Бір бүтін блок дерлік әрқашан кездейсоқ 800 таңбалық екі бөліктен жақсырақ жұмыс істейді.
Гибридті іздеуді қалай құру керек
Гибридті іздеуді күрделі ережелер жиыны ретінде емес, қарапайым тізбек ретінде құрған дұрыс. Бір сұраудың ішінде әрі дәл тіректер, әрі мағыналық ишаралар болуы мүмкін. Сондықтан BM25 мен эмбеддингтерді бірге іске қосқан жөн.
Алдымен сұрауды дәл сәйкестікті бұзбайтындай қалыпқа келтіріңіз. Күндерді, құжат нөмірлерін және жиі қысқартуларды бір түрге түсіріңіз. Мысалы, «келісімшарт 15/24, 3 наурыз» мен «№15-24 келісімшарт, 03.03.2024» бір формаға келтірілгені жақсы. Бұл «ТЗ», «техтапсырма», «SLA», «қызмет көрсету деңгейі» сөздеріне де қатысты. Әйтпесе BM25 шу көреді, ал векторлық іздеу артық екіұштылық алады.
Одан кейін схема әдетте мынадай болады:
- Қалыпқа келтірілген сұрауды бірден екі индекске жіберіңіз: BM25 — дәл сөз формалары үшін, векторлық іздеу — мағыналық жақындық үшін.
- Әр тізімнен top-N алыңыз. Бастапқыда екі жақтан 30-50 фрагмент жеткілікті.
- Нәтижелерді фрагменттің id бойынша біріктіріңіз, сонда бір мәтін бірден екі рет шықпайды.
- Балдарды ортақ шкалаға келтіріңіз. BM25 мен векторлардың бастапқы score-лары салыстырылмайды, сондықтан оларды нормализациялау керек.
- Қарапайым салмақпен жалпы балл есептеңіз. Келісімшарттарда BM25 салмағы жиі жоғары болады, тикеттерде эмбеддингтерге көбірек сүйенуге болады.
Бірінші іске қосуда формуланы күрделендірмеңіз. Көбіне мына ереже жеткілікті:
общий_балл = 0.6 * bm25_norm + 0.4 * vector_norm
Бұл әмбебап қатынас емес, бірақ аралас корпус үшін түсінікті бастапқы нүкте береді. Егер адамдар көбіне бұйрық нөмірі, күн, клиент аты немесе тармақтың дәл тұжырымымен іздесе, BM25 үлесін көбейтіңіз. Егер сұраулар бұлыңғыр шықса, мысалы «ұзақ жеткізілім туралы шағымдар» немесе «айыппұлсыз бұзылу шарттары», векторлық бөлікті күшейтіңіз.
Бір мысалда бұл бірден байқалады. «Алматы филиалына арналған SLA келісімшарты» деген сұрау мәтінде SLA аббревиатурасы болмағанның өзінде дұрыс фрагментті табуы мүмкін, егер онда «жауап беру уақыты» және «қызмет көрсету деңгейі» деп жазылса. Векторлық іздеу мұндай бөлікті мағынасы бойынша тартып әкеледі, ал BM25 филиалдың нақты атауы немесе қосымша нөмірі бар фрагментті жоғалтпауға көмектеседі.
Пайдаланушыға әдетте ұзын тізім керек емес. 5-10 мықты фрагмент көрсеткен жақсы, толық құжаттардың өзін емес. Сонда адам релевантты абзацты, күнді, нөмірді және контекстті тез көреді. Корпоративтік іздеу үшін бұл ондаған ұзын PDF-ке қарағанда көбіне ыңғайлырақ.
Бір сұрауға мысал
Қызметкердің сұрауы былай естіледі: жұмыстан шыққаннан кейінгі артық жұмыс үшін өтемақы. Тек дәл сөздер бойынша іздесеңіз, жауаптың бір бөлігі тез табылады, бірақ бір бөлігі төменірек қалып қояды. Дәл осындай сұрауларда аралас тәсіл әсіресе жақсы көрінеді.
BM25 әдетте бірден «артық жұмыс», «өтемақы» және «жұмыстан шығу» сөздері қатар кездесетін бұйрықты көтереді. Жанынан еңбек шарты немесе қосымша келісім де шығуы мүмкін, егер онда компания артық жұмысты қалай есептейтіні, қашан төлейтіні және шарт бұзылғаннан кейін шектеулер бар-жоғы тікелей жазылса. Заңгер немесе HR үшін бұл жақсы негіз, өйткені дәл сәйкестіктер көбіне ресми норманы көрсетеді.
Бірақ шынайы архивте керек ақпараттың бір бөлігі бұйрықтарда емес, хат алмасу мен ішкі тикеттерде жатады. Онда адамдар басқаша жазады: «артық сағат», «қосымша есептеу», «соңғы есепке кірмеді», «жұмыстан кейін сағат төленбеді». Эмбеддингтер әдетте мұндай жазбаларды табады, тіпті сұраудағы сөздер дәл сәйкес келмесе де. Олар осындай жағдай бұрын талқыланған және қалай есептеу керегі түсіндірілген тірі мысалдарды тартып шығарады.
Жақсы нәтиже мұндайда байланысқан күйде көрінеді: ең үстінде — артық жұмыс үшін төлем нормасы бар бұйрық, жанында — есептеу шарттары жазылған келісімшарт немесе қосымша, одан кейін — ұқсас кейсі бар бухгалтерия тикеті және егер сағаттардың бір бөлігі алдын ала келіспесе, ерекшелік туралы HR жауабы.
Пайдаланушы бір құжатты емес, байланысқан жиынды көреді. Алдымен — ереже, кейін — шарттар, сосын — нақты жағдай. Бұл адамның бұйрықтағы әдемі формулировканы алып, келісімшарттағы ескертуді немесе тикеттердегі есептеу тәжірибесін ескерусіз қалдыру қаупін азайтады.
Іздеу ұқыпты құрылған болса, қызметкер қалталар мен жүйелер арасында секірмейді. Ол 3-4 нәтижені ашады да, құжат бойынша не тиесілі екенін, қай жерде ерекшелік болатынын және мұндай жағдайды компания ішінде бұрын қалай шешкенін тез түсінеді.
Салмақты қалай баптап, нәтижені қалай тексеру керек
Салмақты бір сәтті мысал бойынша емес, тірі сұраулар арқылы таңдаған дұрыс. Бұйрықтар, келісімшарттар және тикеттер үшін кемінде 30-50 сұрау жинаңыз. Әр сұрау үшін бірден қай фрагментті дұрыс жауап деп санайтыныңызды белгілеңіз.
Бұл іздеуді бірден «сиқыр» сияқты көрінуден шығарады. Сіз жүйенің қай жерде дәл сөздерді ұстайтынын, ал қай жерде сұраудың мағынасы маңызды екенін бірден көресіз.
Бұйрықтар үшін әдетте BM25-ге көбірек салмақ берген пайдалы. Мұндай мәтіндерде нөмірлер, күндер, бөлім атаулары және «күшіне енгізу» немесе «кестені бекіту» сияқты нақты тұжырымдар көп. Жақсы бастапқы нүкте — BM25 үшін 0.7 және эмбеддингтер үшін 0.3.
Тикеттерде сурет жиі керісінше болады. Адамдар қысқа жазады, қате жазады, сленг қолданады және бір мәселені әртүрлі сипаттайды. Мұнда 0.4-ті BM25-ге, 0.6-ны эмбеддингтерге беріп бастауға болады, кейін нәтижені қараңыз.
Келісімшарттар әдетте осы екі шектің ортасында жатады. Онда әрі нақты терминдер, әрі ұзақ қайта жазылған бөліктер бар. Сондықтан теңге жуық баланстан бастаған орынды, кейін қай жақта қате көп болса, сол жаққа ығыстырған дұрыс.
Назарды абстрактылы «сапаға» емес, бірнеше қарапайым белгіге аударыңыз:
- керек фрагмент алғашқы 3 нәтижеге кірді ме;
- кемінде алғашқы 10-ға кірді ме;
- үстіне басқа типтегі құжаттар шығып кетпей ме;
- бір мәтіннің шамалас бөліктері қайталанбай ма.
Алғашқы 3 нәтиже адамдарға іздеумен жұмыс істеу ыңғайлы ма, соны көрсетеді. Ал алғашқы 10 — ранжирлеу әлі әлсіз болса да, жүйе дұрыс материалды мүлде таба ала ма, соны көрсетеді.
Бір уақытта бір ғана параметрді өзгертіңіз. Егер эмбеддинг салмағын өсіріп, фрагмент өлшемін ауыстырып, жаңа score нормализациясын қоссаңыз, нақты қай өзгеріс көмектескенін түсінбей қаласыз. Қарапайым кесте жеткілікті: баптау нұсқасы, топ-3-ке түсу үлесі, топ-10-ға түсу үлесі, қателер туралы қысқаша белгі.
Жақсы бапталған жүйенің белгісі мынадай: «мамырға ауысқан сменалар туралы бұйрық» сұрауында үстінде дәл тұжырымы бар керек бұйрық тұрады, ал «касса қайтарудан кейін тұрып қалады» дегенде іздеу мағынасы ұқсас тикеттерді көтереді, тіпті олардағы сөздер бірдей болмаса да.
Жиі жіберілетін қателер
Гибридті іздеудегі мәселелер көбіне модельден емес, команданың корпусты қалай дайындап, сигналдарды қалай араластырғанынан шығады. Демо кезінде бәрі сенімді көрінеді, ал нақты жұмыста жүйе керек тармақтарды, нөмірлерді және мағынасы ұқсас жауаптарды жоғалтады.
Ең жиі қателік — бүкіл келісімшартты немесе ұзын бұйрықты бір бөлік ретінде сақтау. Онда BM25 құжатты сирек сөз арқылы табады, бірақ керек фрагментті жоғары шығара алмайды. Эмбеддингтер де әлсірейді: бір үлкен блок келісімшарттың тақырыбын, айыппұлды, мерзімдерді және қосымшаларды араластырып жібереді. Пайдаланушы «төлем мерзімін өзгерту» деп іздейді де, 40 беттік құжаттың басын алады.
Шикі OCR мәтіні де нәтижені қатты бұзады. Егер сканда «келісімшарт» орнына «келсімшарт» шықса, іздеу бірден екі жерде бұзылады. Дәл іздеу терминді көрмейді, ал мағыналық іздеу шуылға толы мәтін алып, әлсіз векторлар құрады. Индекстеуге дейін мұндай мәтінді тазалау керек: бос сызықтарды, сынған таңбаларды, қайталанатын колонтитулдар мен бет нөмірлерін алып тастаңыз.
Тағы бір қателік — әртүрлі типтегі сұрауларды бірдей ранжирлеу. Келісімшарт нөмірі, ЖСН, өтінім коды және «неге клиентке акт келмеді» деген тіркес бір схема бойынша жүрмеуі керек. Әйтпесе дәл сәйкестік кейде тек тақырып жағынан ұқсас құжаттан жеңіліп қалады.
Көп адам синонимдер мен компанияның ішкі тілін ұмытып кетеді. Бір бөлім «заң бөлімі» десе, екіншісі — «құқықтық департамент», үшіншісі «ДП-07» сияқты код қолданады. Адамдар үшін бұл бір нәрсе. Сәйкестік сөздігі жоқ индекстің көзінде — үш бөлек нысан.
Сапаны тексеру де жиі алдайды. Команда он ұқыпты сұрауды алып, бәрі дұрыс жазылғандықтан, іздеу енді жақсы деп ойлайды. Шынайы өмірде қызметкерлер басқаша іздейді: бөлім атауларын қысқартады, бұйрық нөмірлерін шатастырады, сұрауға хаттың бір бөлігін қосады, тикеттегі ауызекі формулировканы қолданады. Егер тек «әдемі» сұрауларды тексерсеңіз, нағыз сәтсіздіктер көзге түспей қалады. Сондықтан нақты өтініштердің логтарын алып, бөлек дәл, мағыналық және аралас сұрауларды қараған дұрыс. Сонда қай жерде басқа салмақ керек, қай жерде сөздік жетіспейді, қай жерде нашар OCR индексті бұзып тұрғаны тез көрінеді.
Іске қосар алдындағы қысқа чек-лист
Іске қосар алдында бір әдемі демо-жауапты емес, күнделікті жұмыс сұрауларын тексерген пайдалы. Бұйрықтар, келісімшарттар және тикеттер әртүрлі тілде сөйлейді: келісімшартта нөмір мен күн маңызды, тикетте адам өз сөзімен жазады, ал бұйрықта шаблондық формулировкалар жиі қайталанады.
- Құжаттарды түріне қарай бөліңіз. Кейде бөлек өрістер жеткілікті, ал кейде келісімшарттар, бұйрықтар және тикеттер үшін бөлек индекстер жасаған жақсы.
- Мәтіннің жанында метадеректерді сақтаңыз. Күн, нөмір, мәртебе және бөлімше көбіне мәтіннің өзінен де маңызды.
- Кемінде 30 тірі сұрау жинаңыз. «45/23-келісімшарт», «наурыздағы демалыс бұйрығы», «төлем ақауы бойынша тикет» сияқты шынайы фразалар керек.
- Сұраулар мен кликтердің логын қосыңыз. Онсыз іздеуді жақсарту қиын.
- Жауап форматын алдын ала шешіп қойыңыз. Бір сценарийде фрагментті көрсету жақсы, басқа жерде толық құжат керек, ал кейде екеуі де қажет.
Ақылға қонымды қарапайым тест те бар. Егер қызметкер «қойма жалдау шарты, көктемде қол қойылған» деп іздесе, жүйе жай ғана ұқсас мәтінді емес, күн, мәртебе және нөмір бойынша тез тексеруге болатын құжатты қайтаруы керек. Егер бұл өрістер нәтижеде жоқ болса, адам бәрібір қолмен іздеуге қайта оралады.
Алғашқы релиз үшін мінсіз схема қажет емес. Қажеттісі — қателерді өлшеп, BM25 мен эмбеддингтердің салмағын пайдаланушылардың нақты әрекеттеріне қарай біртіндеп түзете алатын түсінікті база.
Іске қосқаннан кейін не істеу керек
Индексті іске қосу ештеңені аяқтамайды. Жақсы іздеу де адамдар күткендей емес, үйреншікті тілмен жаза бастағанда қате жібере бастайды. Нақты жұмыста тез арада «қосымша келісім», «қызметтік жазба», бос орынсыз жазылған келісімшарт нөмірі немесе жартылай сленгтен тұрған тикет шығып кетеді.
Адам бірде-бір құжатты ашпаған немесе бірден іздеуге қайтқан сұрауларды сақтаңыз. Бұл — ең шынайы белгі. Аптасына бір рет осындай кемінде 20-30 мысалды қолмен талдап отырған пайдалы, орташа метрикаларға ғана қарамаңыз.
Әдетте қателер бірнеше жерде көрінеді: адамдар сөздікте жоқ қысқартуды қолданады; керек құжат тым майда немесе тым ұзын фрагменттерге бөлінген; BM25 басқа типтегі құжаттан дәл сөздерді тым қатты тартады; эмбеддингтер мағынасы ұқсас мәтінді табады, бірақ керек бұйрықты, келісімшартты немесе тикетті емес.
Қысқартулар мен типтік тұжырымдар сөздігін үнемі толықтырып отырған дұрыс. Компанияларда бірдей жазу сирек кездеседі: «қосымша келісім», «қосымша келісімшарт» және «ҚК» бір мағынаны беруі мүмкін, ал «тикет жабылмай тұр» және «өтінім тұрып қалды» жиі бір санаттағы өтініштерге жатады. Осындай жұптарды ескермесеңіз, іздеу тілді ғана емес, жақсы құжаттарды да жоғалтады.
Тоқсан сайын фрагмент өлшемдерін және BM25 мен эмбеддингтер арасындағы салмақтарды қайта қарап шыққан пайдалы. Корпус өзгереді. Бүгін сізде қысқа бұйрықтар көп болса, үш айдан кейін тикет жүйесінен келген ұзын хат алмасулар қосылады да, бұрынғы баптаулар шу шығара бастайды. Бұл үлкен қайта құру емес, іздеудің қалыпты гигиенасы.
Егер іздеудің үстінде LLM жұмыс істесе, модель маршрутизациясы мен аудитті бір қабатта ұстау ыңғайлы. Мысалы, AI Router on airouter.kz бір OpenAI-үйлесімді эндпоинт, аудит журналдары, rate-limits және PII маскалауын береді, ал командаға модель ауысқанда интеграцияны қайта жазудың қажеті жоқ.
Іздеуді тым ерте чатқа айналдырмаңыз. Чат қателерді әдемі жасыра алады: жауап сенімді естіледі, бірақ жүйе дұрыс фрагментті емес, басқа бөлікті көтерген болады. Алдымен жиі қолданылатын сұраулар бойынша алғашқы нәтижелерде тұрақты дәлдікке қол жеткізіңіз, содан кейін ғана оның үстіне жауап генерациясын қосыңыз.
Жиі қойылатын сұрақтар
Неге бір ғана BM25 жиі жеткіліксіз?
Өйткені адамдар мен құжаттар бірдей тілде сөйлемейді. BM25 нақты сөздерді, сандарды, күндерді және баптарды жақсы ұстайды, бірақ жиі қайта айтылған ойды, жаргонды және қысқартуларды өткізіп жібереді.
Эмбеддингтер осы олқылықты жабады, бірақ кейде нақты тармақты, қате кодын немесе бұйрық нөмірін жоғалтып алады. Жұмыс корпусында бұл екі сигнал бірін-бірі толықтырады.
BM25 қай кезде жақсырақ жұмыс істейді?
BM25-ді алдымен, сұрау нақты сәйкестікке сүйенген кезде қолданған дұрыс. Бұл — бұйрық нөмірі, бап, қате коды, ЖСН, күн немесе «қызметтік іссапар» сияқты тұрақты тіркес.
Мұндай жағдайда бір әріптің өзі мағынаны өзгерте алады, сондықтан сөз бойынша іздеу көбіне тек мағынаға сүйенген іздеуден жақсырақ жұмыс істейді.
Қашан эмбеддингтерге көбірек сүйену керек?
Эмбеддингтер қызметкерлер өз сөздерімен жазған кезде пайдалы. Бір адам «касса тұрып қалды» дейді, екіншісі — «терминал баяу жауап береді», үшіншісі — «сатылым өтпей тұр».
Мағына ұқсас, сөздері бөлек болса, векторлық іздеу көбіне керек тикеттер мен фрагменттерді кәдімгі сөз сәйкестігінен жылдамырақ табады.
Бұйрықтарды, келісімшарттарды және тикеттерді түрі бойынша бөлу керек пе?
Иә, бұл көбіне бастапқы кезеңнің өзінде көмектеседі. Бұйрықтардың, келісімшарттардың және тикеттердің тілі, ұзындығы және шуы әртүрлі, сондықтан бір ортақ индекс шаблондық фразаларды пайдалы мәтінмен шатастыра бастайды.
Ең аз дегенде құжат түрін бөлек өрісте сақтаңыз. Егер корпус үлкен әрі біркелкі емес болса, түрлерді бөлек индекстерге немесе кемінде бөлек ранжирлеу схемаларына бөлген дұрыс.
Мәтіннің жанында қандай өрістер мен метадеректерді сақтау жақсы?
Барлығын бір ортақ мәтінге жасырып қоймаңыз. Нөмірді, күнді, мәртебені, авторды, бөлімді, контрагентті және құжат түрін бөлек өрістерде сақтаңыз.
Сонда сіз нәтижені сүзгілеп, нақтырақ ранжирлей аласыз. «Март айындағы 154-келісімшарт» сияқты сұрауды жүйе нөмір мен күн негізгі мәтіннен бөлек тұрған кезде әлдеқайда жақсы өңдейді.
Құжаттарды фрагменттерге қалай дұрыс бөлуге болады?
Символ санына емес, аяқталған ойға қарап бөлу керек. Келісімшарттар үшін әдетте бөлімдер, тармақтар және қосымшалар ыңғайлы. Бұйрықтар үшін — мағыналық блоктар мен бөлек қосымшалар. Тикеттер үшін — әңгіменің кезеңдері: мәселені сипаттау, нақтылау, шешім.
Қарапайым сынақ мынадай: фрагментті әріптеске жанындағы мәтінсіз беріңіз. Егер ол не туралы екенін түсінсе, өлшемі дұрыс. Егер түсінбесе, фрагмент тым қысқа.
Гибридті іздеуді іс жүзінде қалай құруға болады?
Әдетте қарапайым схема жеткілікті. Сұрауды қалыпқа келтіріп, оны әрі BM25-ге, әрі векторлық индекске жіберіңіз, екі тізімнен де top-N алыңыз, id бойынша біріктіріп, кейін ортақ балл есептеңіз.
Бастапқыда қарапайым формуланы қолданыңыз, мысалы 0.6 — BM25 үшін, 0.4 — векторлар үшін. Кейін салмақтарды құжат түрі мен нақты сұрауларға қарай өзгертіңіз, бір әдемі мысалға емес.
BM25 мен эмбеддингтердің арасына бастапқыда қандай салмақ алған дұрыс?
Бұйрықтар үшін BM25-ге басымдық беруден бастаған дұрыс, мысалы 0.7 қарсы 0.3. Тикеттерде көбіне керісінше жұмыс істейді, өйткені онда сөйлесу тілі, қателер және қысқартулар көп.
Келісімшарттар үшін теңге жуық баланс орынды. Кейін жүйе қай жерде қателесетінін қараңыз: егер нөмірлер мен тармақтарды жоғалтса, BM25 салмағын арттырыңыз; егер қайта айтылған ойды ұстай алмаса, векторлық бөлікті күшейтіңіз.
Іздеудің дұрыс бапталғанын қалай түсінуге болады?
Нақты жұмыс істейтін сұраулар жинағын құрып, дұрыс фрагменттерді бірден белгілеп қойыңыз. Әр құжат түріне 30–50 сұрау-ақ пайдалы көрініс береді.
Қажетті фрагменттің топ-3-ке, кемінде топ-10-ға кіретінін тексеріңіз. Сонымен қатар басқа типтегі құжаттар жоғарғы орындарға шығып кетпей ме және бір мәтіннің шамалас бөліктері қайталанбай ма — соны қараңыз.
Іске қосқаннан кейін нәтижені көбіне не бұзады?
Көбіне іздеуді модельдер емес, корпус бұзады. Ұзын құжаттар бір бүтін болып индекстеледі, OCR бұзылған символдар қалдырады, қайталанатын колонтитулдар шаблондардың салмағын өсіреді, ал қысқартулар сөздігі ешкімде жоқ.
Іске қосқаннан кейін кликсіз қалған сұрауларды және адам бірден іздеуге қайта оралған жағдайларды сақтаңыз. Солар бойынша қай жерде сөздік жетіспейтінін, қай жерде фрагмент тым қысқа не тым ұзын екенін және қай жерде ранжирлеу құжат түрлерін шатастыратынын тез байқайсыз.