AI serijos interviu klausimai 11: Kaip optimizuoti RAG?
RAG optimizavimas nėra vieno etapo reguliavimas, o visos grandinės optimizavimo procesas. Žemiau pateikiu sistemingas optimizavimo strategijas iš duomenų indeksavimo, paieškos, generavimo ir vertinimo dimensijų, kartu su praktine patirtimi, kurią galima paminėti interviu.
1. Duomenų indeksavimo optimizavimas (gerinti „žinių bazės“ kokybę)
Tai dažniausiai nepastebima, bet greičiausiai duoda rezultatų.
| Optimizavimo taškas | Problemos požymis | Konkretūs veiksmai | Efektyvumo rodiklis |
|---|---|---|---|
| Dokumentų analizė | Lentelės, diagramos PDF faile ignoruojamos, tekstas sugadintas arba tvarka neteisinga. | Naudoti geresnę analizės biblioteką (pvz., unstructured, pypdf su išdėstymo išsaugojimu); lenteles išgauti naudojant pandas ir konvertuoti į Markdown. |
Atšaukimas +5–15 % |
| Teksto bloko dydis | Per mažas chunk praranda kontekstą (pvz., „Šių metų pajamos“ – „šių“ nuorodos praradimas); per didelis chunk sukelia triukšmą. | Eksperimentuoti su skirtingu bloko dydžiu (256/512/768 tokenai), perdengimą nustatyti 10–20 %; ilgiems dokumentams skaidyti pagal semantines ribas (pastraipas/antraštes), o ne fiksuotu ilgiu. | Pataikymo rodiklis / ištikimybė |
| Metaduomenų pridėjimas | Rastas atitinkamas fragmentas, bet negalima nustatyti šaltinio ar laiko, arba reikia filtruoti pagal sritį. | Kiekvienam blokui pridėti metaduomenis: source (failo vardas/URL), timestamp, page_num, doc_type. Paieškos metu naudoti filtrus (pvz., doc_type == 'teisinis'). |
Filtravimo tikslumas |
| Įterpimo modelio pasirinkimas | Bendrinis embedding prastai veikia specifinėse srityse (medicina, kodas, teisė). | Naudoti srities suderintą modelį (BGE‑large‑zh, GTE‑Qwen2‑7B‑instruct) arba suderinti savo embedding modelį (naudojant triplet loss). | Paieškos MRR@10 +10–20 % |
2. Paieškos optimizavimas (kad „vartymas“ būtų tikslesnis)
Paieška lemia LLM pateikiamos „informacinės medžiagos“ kokybę.
| Optimizavimo taškas | Problemos požymis | Konkretūs veiksmai | Efektyvumas |
|---|---|---|---|
| Mišri paieška | Vektorinė paieška negali rasti tikslių terminų (pvz., gaminio modelis ABC-123), raktinių žodžių paieška nesupranta sinonimų. |
Vienu metu naudoti vektorinę paiešką (semantinę) ir BM25 (raktinius žodžius), sujungti per svorius (pvz., 0,7 * vektoriai + 0,3 * BM25) arba per rerank. | Atšaukimas +10–25 % |
| Perrikiavimas (Rerank) | Pirmi vektorinės paieškos rezultatai nėra patys aktualiausi, geriausias gali būti dešimtas. | Naudoti cross‑encoder modelį (pvz., BGE‑reranker-v2, Cohere Rerank) kandidatų rinkiniui (pvz., pirmi 20) iš naujo įvertinti, pasirinkti top‑K. |
Pataikymas žymiai pagerėja (ypač top‑1) |
| Užklausos perrašymas | Vartotojo klausimas neaiškus ar kelių posūkių dialoge yra neišsami nuoroda („Kokia jo kaina?“). | Naudoti LLM, kad pakeistų klausimą į paieškai tinkamesnę formą (pvz., „Kokia iPhone 15 kaina?“); arba papildyti naudojant dialogo istoriją. | Atšaukimas +5–15 % |
| HyDE | Vartotojo klausimas per trumpas arba abstraktus (pvz., „Papasakok apie fotosintezę“), tiesioginė paieška prasta. | Pirmiausia leisti LLM sugeneruoti hipotetinį atsakymą, tada naudoti šį atsakymą dokumentų paieškai. | Tinka atviriems domenams, bet ne faktiniam tiksliam atsakymui |
| Paieškos kiekio Top‑K reguliavimas | Per mažas K gali praleisti svarbią informaciją; per didelis K padidina tokenų suvartojimą ir triukšmą. | Eksperimentuoti su K=3/5/10, stebėti atšaukimo ir atsakymo ištikimybės balansą. | Efektyvumo ir rezultatų kompromisas |
3. Generavimo optimizavimas (kad LLM gerai išnaudotų informacinę medžiagą)
Net ir gera paieška, jei nurodymai prasti ar modelis silpnas, rezultatas nebus geras.
| Optimizavimo taškas | Problemos požymis | Konkretūs veiksmai | Efektyvumas |
|---|---|---|---|
| Nurodymų inžinerija | LLM ignoruoja rastą informaciją arba kuria melagingus faktus. | Aiškiai nurodyti: „Atsakykite tik remdamiesi pateikta informacija. Jeigu informacijos nepakanka arba ji nesusijusi, atsakykite „Nėra pakankamai informacijos“.“ Pridėti few‑shot pavyzdžius, rodančius, kaip cituoti šaltinius. | Ištikimybė +20–40 % |
| Konteksto suspaudimas | Rasta informacija per ilga (viršija modelio konteksto langą) arba daug triukšmo. | Naudoti LLMLingua arba selektyvų kontekstą, suspausti, palikti tik aktualiausius sakinius, tada siųsti LLM. |
Sumažina informacijos praradimo riziką |
| LLM modelio naujinimas | Mažas modelis (7B) negali atlikti sudėtingo samprotavimo arba neišlaiko ilgo konteksto. | Naudoti galingesnį modelį (GPT‑4o, Claude 3.5 Sonnet, Qwen2.5‑72B). | Samprotavimo tikslumas žymiai padidėja |
| Srautinis atsakymas ir citavimas | Vartotojas negali patikrinti atsakymo patikimumo. | Generavimo metu leisti LLM išvesti [citation:1], atitinkantį paieškos dokumento numerį. Gale pridėti originalo nuorodą. |
Vartotojų pasitikėjimas + galimybė derinti |
| Atsisakymo kalibravimas | Modelis atsako, kai neturėtų, arba sako „nežinau“, kai turėtų atsakyti. | Nustatyti panašumo slenkstį: jei rasto top‑1 bloko kosinuso panašumas su klausimu mažesnis nei 0,7, nurodyti LLM „Medžiaga nesusijusi“. | Sumažina haliucinacijų dažnį |
4. Vertinimo ir iteracijos pusė (žinoti, kur koreguoti)
Be matavimo nėra optimizavimo.
| Optimizavimo taškas | Veiksmai | Rodikliai |
|---|---|---|
| Vertinimo rinkinio sudarymas | Paruošti 100–300 tikrų vartotojų klausimų + standartiniai atsakymai + teisingi paieškos dokumentų ID. | Apimti skirtingą sudėtingumą, skirtingus tikslus. |
| Automatinis vertinimas | Naudoti RAGAS (Ištikimybė, Atsakymo aktualumas, Konteksto atšaukimas) arba TruLens. | Trys pagrindiniai rodikliai: ištikimybė, atsakymo aktualumas, konteksto atšaukimas. |
| Žmogaus vertinimas | Kiekvieną savaitę atrinkti 20 blogų atvejų, analizuoti klaidų tipus (paieškos nesėkmė / generavimo klaida / žinių bazės trūkumas). | Prioritetų nustatymas tobulinimui. |
| A/B testavimas | Gamybinėje aplinkoje segmentuoti skirtingas paieškos strategijas (pvz., BM25 prieš mišrią paiešką). | Tinklo rodikliai: vartotojų pasitenkinimas, atsakymo nebuvimo dažnis. |
5. Interviu galima paminėti „praktinę patirtį“ (pliusiniai taškai)
„Mano atsakingame RAG projekte pradinis pataikymo rodiklis buvo tik 67%. Aš padariau tris dalykus:
1. Bloko dydį pakeičiau iš fiksuoto 1024 į dinaminį semantinį skaidymą (pagal antraštes + pastraipas), pataikymo rodiklis pakilo iki 74%;
2. Pridėjau mišrią paiešką (vektoriai + BM25) ir nedidelį rerank modelį, pataikymo rodiklis išaugo iki 83%;
3. Optimizavau nurodymus ir priverčiau atsakymą pradėti nuo[Nerasta informacijos], haliucinacijų dažnis sumažėjo nuo 22% iki mažiau nei 5%.Be to, sukūrėme nuolatinio vertinimo grandinę: prieš kiekvieną pakeitimą paleisdavome 200 klausimų RAGAS balus, užtikrindami, kad nėra regresijos.“
Galutinė santrauka: pilnas RAG optimizavimo maršrutas
Duomenų sluoksnis ─→ Dokumentų valymas, blokų optimizavimas, metaduomenų stiprinimas, srities embedding
Paieškos sluoksnis ─→ Mišri paieška, rerank, užklausos perrašymas, HyDE, Top-K optimizavimas
Generavimo sluoksnis ─→ Nurodymų stiprinimas, instrukcijų reikalavimai, suspaudimas, citavimas, atsisakymo slenkstis
Vertinimo sluoksnis ─→ Vertinimo rinkinys, RAGAS, žmogaus analizė, A/B eksperimentai
评论
暂无已展示的评论。
发表评论(匿名)