- Pradžia
- Atvejų analizės
- Evoliucinis užklausų (prompt) optimizavimas
Evoliucinis užklausų (prompt) optimizavimas
Užklausų tobulinimo pavertimas išmatuojama paieškos problema: generuoti, vertinti, mutuoti ir atrinkti LLM užklausas vietoj derinimo iš nuojautos.
Paskelbta 2026-06-30Peržiūrėta 2026-07-02
Trumpai
- Problema
- Užklausų pakeitimai nenuspėjamai keitė rezultatų kokybę, o rankinis bandymas negalėjo patikimai ištirti pakankamai variantų.
- Apribojimas
- Paieškai reikėjo pakartojamo kokybės signalo neapsimetant, kad viena metrika visiškai atstoja žmogaus vertinimą.
- Sukurta sistema
- Genetinės paieškos ciklas su elitu, kryžminimu, adaptyviais mutacijų svoriais, įvairovės palaikymu ir daugiatiksliu vertinimu.
- Rezultatas
- Užklausų kandidatus galima lyginti su atidėtais pavyzdžiais, todėl tobulinimas tampa matuojamas, o ne anekdotinis.
- Kur tai pritaikoma
- Tinka LLM funkcijoms, kurių kokybė priklauso nuo užklausų, bet prieš gamybinį derinimą reikia vertinimo kilpos.
- Technologijos
- BLEURT · LLM APIs · evolutionary operators · NumPy
Kodėl tai svarbu
Jei jūsų komanda planuoja sistemą su tais pačiais gedimo scenarijais — būtent nuo tokio mąstymo prasideda pirmas pokalbis.
Apžvalga
Pirmiau aprašytas apribojimas — visa užduotis: užklausų paieškai reikia pakartojamo kokybės signalo, bet nė viena metrika pilnai neatstoja žmogaus sprendimo apie tai, kas LLM atsakymą daro geru. Žmogus, skaitydamas du kandidatinius atsakymus, vienu metu pasveria nuoseklumą, ištikimybę šaltiniui, toną ir naudingumą — taip, kaip joks skaitinis įvertis tiksliai neatkartoja. Atsisakyti šios problemos spręsti visai — laukti tobulos metrikos prieš automatizuojant bet ką — reiškia likti prie rankinių patikrinimų ir paieškos erdvės, per didelės, kad žmogus ją ištirtų rankomis. Toliau aprašyta sistema priima netobulą, bet pakartojamą signalą, aplink jį stato paieškos ciklą ir netobulumą traktuoja kaip žinomą ribotumą, kurį reikia valdyti, o ne kaip priežastį atsisakyti matavimo visai.
Užklausos kaip populiacija
Užklausų paieška čia suformuota taip, kaip genetinis algoritmas formuoja bet kurią paiešką: ne kaip vieno geriausio varianto rinkimasis iškart, o kaip kandidatinių užklausų populiacijos vystymas per kartas. Kiekvienas kandidatas — visa užklausa: rėmas, instrukcijos, pavyzdžiai, formatavimo apribojimai — traktuojamas kaip vienas genotipas, o ne kaip pluoštas nepriklausomų nustatymų, derinamų po vieną. Karta prasideda nuo kandidatų populiacijos, kiekvieno kandidato tinkamumas įvertinamas pagal atskirtą rinkinį, o kita karta sudaroma iš dabartinės kartos tinkamiausių narių: dalis perkeliama nepakeista, dalis rekombinuojama, dalis mutuojama. Per pakankamai kartų populiacijos vidutinis tinkamumas kyla, o pavieniai blogi kandidatai tiesiog išnyksta, nereikalaujant, kad juos kas nors pastebėtų ir atmestų rankomis.
Toks kadravimas svarbus dėl priežasties, kurią lengva praleisti: genetinis algoritmas niekada nestato visos paieškos ant vieno kandidato tuo pačiu metu — taip, kaip tai daro rankinė iteracija. Bet kuriuo momentu egzistuoja gyva kandidatų populiacija, kiekvienas jos narys — atskira hipotezė apie tai, kas šią užklausą daro veiksmingą: skirtinga instrukcijų formuluotė, skirtingas pavyzdžių skaičius, skirtingas eksplicitiškumo lygis. Kai kurios hipotezės pasirodo esančios aklavietė; populiacija šį praradimą sugeria, nepraradusi paieškos pagreičio, nes kita karta sudaroma iš tų hipotezių, kurios iš tikrųjų atsiperka.
Kodėl ne tinklelio paieška ar atsitiktinė atranka tarp užklausų variantų
Užklausų variantai neskyla į nedidelį skaičių nepriklausomų, ortogonalių parametrų taip, kaip to reikia tinklelio paieškai (grid search). Formuluotė, instrukcijų tvarka, pavyzdžių skaičius ir pasirinkimas, kiek eksplicitiškai išreikštas kiekvienas apribojimas — visa tai sąveikauja: pakeitus vieną ašį, pasikeičia, koks geriausias kitos ašies nustatymas. Tinklelis net per kelias tokias dimensijas, kiekvieną su keliomis reikšmėmis, sukuria kombinatorinį langelių sprogimą, kurių didžioji dalis niekada nenusipelno būti įvertinta, o tinklelio paieška neturi būdo jų praleisti — ji išvardija visą tinklelį, nepriklausomai nuo to, ką jau atskleidė ankstesni langeliai.
Atsitiktinė atranka išvengia šio kombinatorinio sprogimo nieko neišvardindama, bet už tai sumoka visiškai atsisakydama atminties: kandidatas, gerai įvertintas viename raunde, atsitiktinei atrankai nieko nepasako apie kito raundo kandidatus. Kiekvienas pavyzdys traukiamas aklai, nepriklausomai nuo to, kiek signalo paieška jau sukaupė. Žmogaus intuicija veikia šiek tiek geriau nei bet kuris kraštutinumas, nes žmogus pastebi, kad formuluotės pakeitimas nuolat padeda, ir tuo naudojasi pakartotinai — bet žmogus vienu metu gali laikyti galvoje tik saują variantų ir negali vykdyti tos pačios iteratyvios refinacijos populiacijos mastu, per dešimtis kandidatų ir kartų, taip, kaip tai gali paieškos ciklas.
Evoliucinis ciklas išlaiko tyrinėjimą, kurį turi atsitiktinė atranka, ir prideda atmintį, kurios neturi tinklelio paieška ir kurios negali pasiekti žmogus: didelio tinkamumo kandidatai išgyvena iki kitos kartos ir yra rekombinuojami bei mutuojami, todėl paieška sutelkia pastangas ties tomis užklausų erdvės sritimis, kurios jau parodė perspektyvą, o įvairovės palaikymas (žr. toliau) neleidžia jai per anksti susikoncentruoti tik vienoje iš tų sričių.
Elitizmas ir kryžminimas
Du mechanizmai perneša informaciją iš vienos kartos į kitą: elitizmas, kuris ją apsaugo, ir kryžminimas, kuris ją rekombinuoja.
Elitizmas reiškia, kad geriausiai pasirodę kartos kandidatai nepakeisti nukopijuojami į kitą kartą, visiškai apeinant mutaciją ir kryžminimą. Be jo genetinis algoritmas gali prarasti geriausią iki tol rastą sprendimą dėl nesėkmės — stiprus kandidatas sukryžmintas su silpnu, arba mutuotas taip, kad netyčia pablogėjo — ir nėra jokios garantijos, kad vėlesnė karta kada nors iš naujo atras tokį pat gerą sprendimą. Elitizmas paverčia tinkamumą praktiškai monotonišku per kartas: populiacijos geriausias kandidatas niekada nepablogėja, tik pakeičiamas bent tokiu pat geru.
Kryžminimas rekombinuoja du stiprius kandidatus į palikuonis, paveldinčius dalis iš abiejų. Praktiškai tai reiškia užklausos skaidymą į sekcijas — rėmą, instrukcijas, pavyzdžius, išvesties formato apribojimą — ir dalies sekcijų sukeitimą tarp dviejų aukšto tinkamumo tėvų, kitas paliekant nepakeistas. Tėvas, kurio instrukcijos vertinamos gerai, bet pavyzdžiai silpni, sukryžmintas su tėvu, kurio pavyzdžiai stiprūs, bet instrukcijos neaiškios, gali sukurti palikuonį, pranokstantį abu — kandidatą, kurio nei rankinis derinimas, nei vien mutacija greičiausiai nebūtų pasiekę, nes tam reikia atpažinti, kuri užklausos sekcija atsakinga už kurią tinkamumo balo dalį, ir sukeisti tik tą sekciją, kuri šiuo metu neveikia.
Adaptyvus mutacijų svorių pritaikymas
Mutacija — tai, kas paieškai leidžia toliau tyrinėti, o ne tik rekombinuoti tai, ką jau išsaugojo elitizmas, bet vienas fiksuotas mutacijos dažnis yra blogas kompromisas, kad ir kokia reikšmė jam būtų nustatyta. Nustatytas per aukštas — mutacija patikimai sugadina kitaip gerus kandidatus greičiau, nei kryžminimas sugeba sukurti naujus gerus; nustatytas per žemas — paieška sustoja, negalėdama ištrūkti iš kaimynystės, kurioje prasidėjo.
Šiame sprendime mutacijos žingsnis nenaudoja vieno dažnio — tai rinkinys atskirų operatorių (perfrazuoti sakinį, pertvarkyti instrukcijų tvarką, pridėti ar pašalinti pavyzdį, sugriežtinti ar sušvelninti apribojimą, pakeisti išvesties formato instrukciją), kiekvienas su savo svoriu, o svoriai pritaikomi per kartas pagal tai, kurie operatoriai pastaruoju metu iš tikrųjų davė tinkamumo prieaugį. Operatorius, nuolat duodantis pagerėjimų, imamas dažniau; operatorius, nuolat duodantis pablogėjimų, imamas rečiau. Tai atkartoja tai, ką rankomis užklausas derinantis žmogus jau daro instinktyviai — pastebi, kad instrukcijų trumpinimas nuolat padeda, ir tuo remiasi — tik čia taikoma nuosekliai visai populiacijai, o ne remiantis vieno žmogaus atmintimi apie tai, kas padėjo praeitą kartą.
def update_weights(weights, operator_deltas, learning_rate=0.1):
# operator_deltas: vidutinis tinkamumo pokytis,
# priskirtas kiekvienam mutacijos operatoriui
# per paskutinę kartą
for op, delta in operator_deltas.items():
weights[op] *= math.exp(learning_rate * delta)
total = sum(weights.values())
return {op: w / total for op, w in weights.items()}
Mutacijos operatorių svorių perskaičiavimas pagal jų duotą tinkamumo pokytį
Pritaikymas taip pat seka bendrą paieškos formą laike: ankstyvos kartos, toli nuo bet kokio lokalaus optimumo, naudingiau paremtos struktūrinėmis mutacijomis — pertvarkymu, ištisų sekcijų pridėjimu ar pašalinimu — galinčiomis peršokti į reikšmingai kitokį kandidatą. Vėlesnės kartos, populiacijai jau susikoncentravus stiprioje užklausų erdvės srityje, daugiau naudos gauna iš smulkių formuluotės mutacijų, kurios patobulina, o ne pertvarko iš naujo. Fiksuotas svoris šio poslinkio per visą vykdymą atsekti negali; adaptyvus — gali.
Įvairovės palaikymas
Palikus savieigai, paties genetinio algoritmo atrankos spaudimas veikia prieš jį patį: jei visada dauginami tinkamiausi kandidatai, o jų palikuonys į juos panašūs, populiacija per kelias kartas gali susitraukti iki beveik identiškų vieno ankstyvo nugalėtojo kopijų. Tokiu momentu paieška praktiškai nustoja ieškoti — ji perima tik nedidelius variantus aplink vieną tašką didelėje erdvėje, o bet kuri geresnė užklausa, esanti kitoje srityje, niekada neištiriama, nes populiacijoje nebelieka nieko pakankamai artimo, kad ją atrastų mutacija.
Šis sprendimas šį susitraukimą traktuoja kaip tinkamumo lubas, nuo kurių aktyviai saugomasi, o ne kaip simptomą, pastebimą tik jam jau įvykus. Atranka atsižvelgia į daugiau nei vien žalią tinkamumą: kandidatai, panašūs į kitus, jau gerai atstovaujamus populiacijoje, baudžiami santykinai su naujoviškais kandidatais, todėl dvi užklausos, surinkusios tą patį žalią tinkamumo balą, negauna vienodo svorio, jei viena perteklinė kelių kitų kandidatų atžvilgiu, o kita — vienintelė populiacijos atstovė savo požiūriui. Populiacija taip pat kas kartą papildoma naujais atsitiktiniais kandidatais, nesusijusiais su niekuo, kas jau yra baseine, todėl sritis, į kurią dabartinė populiacija niekada nenuklydo, vis tiek gauna galimybę būti ištirta.
Kompromisas realus ir jį verta įvardyti tiesiogiai: įvairovės apsauga reiškia, kad paieška kartais palieka gyvą mažesnio tinkamumo kandidatą vietoj didesnio tinkamumo beveik dublikato, o tai sulėtina, kaip greitai kyla populiacijos vidutinis tinkamumas. Tai sąmoningas mainas — trumpalaikį konvergencijos greitį iškeičiant į mažesnę tikimybę įstrigti lokaliame optimume, kuris nėra iš tikrųjų geriausia įmanoma užklausa.
Daugiatikslis tinkamumo vertinimas
Vienas skaičius, atsakantis „kiek gera ši užklausa", turi iš kažko atsirasti, o pasirinkus neteisingą vienintelį skaičių, paiešką galima greitai optimizuoti į kažką blogesnio, nei žmogus kada nors būtų išleidęs rankomis — atsakymas, kuris techniškai atitinka temą, bet paplūdęs, arba glaustas iki tiek, kad praranda turinį, vis tiek gali gerai vertintis metrikoje, kuri tikrina tik teminį atitikimą.
Tinkamumas čia daugiakriterė funkcija: ji balansuoja išmoktą semantinio panašumo balą su atskaitos atsakymu (BLEURT — metrika, treniruota prognozuoti žmogaus vertinimus apie teksto kokybę, o ne remtis paviršiniu n-gramų sutapimu, kaip senesnės metrikos, tokios kaip BLEU), išvesties ilgį pagrįsto tikslinio intervalo atžvilgiu ir žodyno savybes, pagaunančias degeneruotus atsakymus, kurių vien semantinio panašumo balas gali nepastebėti — pavyzdžiui, perteklinį kartojimąsi ar nukrypimą į registrą, neatitinkantį atskaitos pavyzdžių.
def fitness(output, reference, target_length):
semantic = bleurt_score(output, reference) # 0..1
length_penalty = length_deviation(output, target_length)
vocab_penalty = vocabulary_degeneracy(output)
return (
W_SEMANTIC * semantic
- W_LENGTH * length_penalty
- W_VOCAB * vocab_penalty
)
Tinkamumas kaip svertinis derinys, o ne vienas išmoktas balas
Kiekvienas kandidatas taip vertinamas pagal atskirtą pavyzdžių rinkinį, prie kurio jis niekada nebuvo tiesiogiai derintas, kartą po kartos, todėl pranešamas tinkamumas yra bent apytikslis įvertis, kaip užklausa veikia su įvestimis, kurių paieška dar nematė ir prie kurių nesiderino — o ne vien su sauja, prie kurios jau buvo derinama. Ši atskirto rinkinio disciplina ir paverčia ciklą iš paieškos, persiderinančios prie savo pačios vertinimo rinkinio, į paiešką, kurios nugalėtojai labiau linkę apibendrėti į iš tikrųjų naujas įvestis.
Kompromisai ir apribojimai
Nė vienas iš šių dalykų nepadaro užklausų paieškos objektyvios, o sąžiningumas dėl to, ko šis sprendimas neišsprendžia, yra projekto dalis:
- Bet kuri išmokta panašumo metrika, įskaitant BLEURT, pati yra žmogaus vertinimo aproksimacija, treniruota su ribota, galbūt šališka žmonių vertinimų imtimi — ne absoliuti tiesa, ir kandidatas, išnaudojantis jos aklas zonas, gali gerai vertintis, iš tikrųjų nebūdamas geresnis.
- Santykiniai svoriai daugiakriterėje tinkamumo funkcijoje yra sprendimo klausimas, o ne išvestas dydis — niekas matematikoje nesako, kad semantinė kokybė turėtų svertis daugiau ar mažiau nei ilgis ar žodynas, o prastai parinktas svoris nukreipia visą paiešką neteisinga kryptimi, nesukeldamas jokios klaidos.
- Genetinė paieška sąmoningai reikalauja daugiau skaičiavimų nei vienas rankomis derintas bandymas — daug kandidatų, daug kartų, kiekvienas kandidatas vertinamas pagal atskirtą rinkinį, reiškia daug daugiau LLM kvietimų ir vertinimo žingsnių, nei bandant saują užklausų rankomis.
- Įvairovės palaikymas sąmoningai iškeičia konvergencijos greitį į apsaugą nuo lokalių optimumų — populiacija be jo vidutiniškai konverguoja greičiau, tik su didesne tikimybe, kad tai, prie ko ji konverguoja, nėra geriausia įmanoma užklausa.
- Atskirtas rinkinys apibendrėja tik tiek, kiek jis atspindi realų naudojimą; siauras ar neatstovaujantis atskirtas rinkinys duoda nugalėtoją, kuris popieriuje atrodo stiprus, bet suprastėja, vos realus srautas ima skirtis nuo to, ką rinkinys apima.
- Kryžminimo ir mutacijos operatoriai įkūnija prielaidas apie tai, kaip atrodo prasmingas užklausos pakeitimas — perfrazuoti sakinį, sukeisti pavyzdžių bloką, sugriežtinti apribojimą — o paieška gali rasti tik tai, ką jos operatoriai geba sukurti; operatorių rinkinys, niekada nesvarstantis, tarkime, viso rėmo pertvarkymo iš naujo, tokio pertvarkymo niekada ir nesukurs, kad ir kiek kartų vykdomas.
Šaltiniai ir tolesnis skaitymas
Nė vienas iš čia aprašytų mechanizmų nėra naujas savaime — tai standartiniai evoliucinio skaičiavimo ir NLG vertinimo pagrindai, čia sujungti konkrečiai užklausų paieškai:
- Wikipedia — Genetic algorithm
- Sellam, Das, Parikh — BLEURT: Learning Robust Metrics for Text Generation (arXiv:2004.04696)
- google-research/bleurt — oficiali BLEURT realizacija
- Wikipedia — Multi-objective optimization
- Zhou et al. — Large Language Models Are Human-Level Prompt Engineers (arXiv:2211.01910)
Susijusios atvejų analizės
Sistemos, kurias su šia sieja bendras apribojimas — pakartojimai, izoliacija, kaina, atkūrimas.
Kelių tiekėjų DI vartai su integruota sąnaudų apskaita
Modelio pasirinkimas tapo konfigūracija, nauji tiekėjai paveldi bendras kontroles, o išlaidos matomos dar užklausoms vykstant.
Go adapters · gRPC / protobuf · persisted in-memory queuePirmiausia vietinė diktavimo sistema „macOS“
Kalba lieka vietoje, delsa maža, o įklijuojamas rezultatas gali atspindėti ekrano kontekstą nesugriūdamas pasikeitus vienai OS posistemei.
Swift / SwiftUI · whisper.cpp · Accessibility & CoreGraphics APIs