
Kodėl AI transkripcija iškraipo techninius terminus (ir kaip mes tai sutvarkėme)
Gyva sesija „what is the pointer in C++" išgirdo kaip „what is the point in life". Štai teismo ekspertizės vertas pėdsakas nuo to transkripto iki GeekBye v2.0.11 — keyterm biasing, ryšį nutraukdavusios laiko lenktynės ir diena, kai mūsų pačių pataisa atsisuko prieš mus.
Liepos 2 d. paleidome testinę sesiją ir garsiai uždavėme GeekBye paprastą klausimą: „What is the pointer in C++?" (kas yra rodyklė C++ kalboje).
Gyvas transkriptas atsakė poezija:
[23:16:37] You: Tell me, what is the point in life? [23:16:52] You: Handy Plus. [23:17:02] You: What the pointer in Plus Plus? [23:17:09] You: C.
Vietoj „pointer in C++" (rodyklė C++ kalboje) modelis išgirdo „point in life" (gyvenimo prasmė). Likusią tos pačios sesijos dalį papasakojo būklės metrikos: 3 nutrūkę transkripcijos ryšiai per 163 sekundes ir 51 sekundės skylė transkripte. Ir dar viena užuomina, kuri galiausiai pasirodė svarbiausia: mūsų atkūrimo mechanizmas po sesijos — jis iš naujo transkribuoja lokaliai išsaugotą garsą, kad užpildytų spragas — sakinį atkūrė beveik teisingai: „a pointer in plus, plus? What the pointer in plus, plus C++."
Garsas buvo geras. Gyvai veikiantis modelis tiesiog neturėjo jokios priežasties tikėtis C++.
Tai GeekBye v2.0.11 leidimo istorija, papasakota pagal tikrus transkriptus ir produkcijos žurnalus.
Kodėl kalbos modeliai iškraipo jūsų žodyną
Kalbos atpažinimas — tai prognozavimo uždavinys. Gavęs dviprasmį garsą, modelis renkasi labiausiai tikėtinus žodžius — o bendrosios paskirties modeliui „point in life" yra gerokai tikėtinesnė frazė nei „pointer in C++". Kiekvienas inžinierius, matęs, kaip susitikimo transkriptas Kubernetes paverčia „cube and eddies", šią nesėkmę pažįsta iš arti.
Vaistas — ne geresnis mikrofonas, o keyterm biasing: dar prieš sesijos pradžią pasakyti modeliui, kurie mažai tikėtini žodžiai jums yra tikėtini. Mūsų kalbos tiekėjas palaiko iki 50 pakreipimo terminų per sesiją. O dabar gėdinga dalis: visa šių terminų infrastruktūra mūsų steke egzistavo nuo galo iki galo — klientas, backend, tiekėjas — ir niekas jos niekada neužpildė. Kiekviena sesija veikė be jokios srities pagalbos.
1 pataisa: jūsų profilis tampa modelio žodynu
GeekBye jau žino jūsų sritį — ji įrašyta jūsų aktyviame profilyje. v2.0.11 pakreipimo keytermus išveda iš profilio pavadinimo ir aprašymo: terminai su simboliais (C++, Node.js), akronimai (SQL, AWS), camel case pavadinimai (TypeScript, PostgreSQL) ir tikriniai vardai. Profilis, kuriame paminėtas jūsų stekas, dabar padaro tą steką laukiamu, o ne egzotišku.
Diena, kai pataisa viską pablogino
Pirmoji mūsų versija kiekvieną žodį iš didžiosios raidės laikė tikriniu vardu. Vidiniame testiniame builde (tai niekada nepasiekė klientų) proza parašytas profilis modeliui išsiuntė tokį pakreipimo sąrašą:
Senior, Writing, Direct, For, Includes, Write, Role, Intent…
Kreipti kalbos modelį link žodžio „For" yra blogiau, nei nekreipti jo visai. Jau kitoje testinėje sesijoje žodis „speak" — ištartas aiškiai, kelis kartus — grįžo kaip „Clicky", „Hey, Vicky" ir „Peter Paderty". Pamoka kainavo mums vieną popietę: kreipkite tik išskirtiniais terminais. Žodžiai iš didžiosios raidės dabar skaičiuojami tik tada, kai stovi sakinio viduryje (tikras tikrinio vardo signalas); markdown antraštės, kuriose kiekvienas žodis prasideda didžiąja raide, neprisideda niekada. Tas pats profilis dabar išveda lygiai LinkedIn, AI, CEO, MCP — o validavimo sesija teisingai transkribavo daugiakalbį, greitai besikaitaliojantį garsą 199 sekundes iš eilės: 189 transkripto segmentai, nulis klaidų.
2 pataisa: lenktynės, kurios nutraukdavo ryšį
Keytermai paaiškino iškraipytus žodžius. Trijų nutrūkusių ryšių jie nepaaiškino.
Šis pėdsakas vedė į subtilesnę vietą. Mūsų tiekėjas commitina (finalizuoja) transkripciją pagal savo paties balso aktyvumo aptikimą — maždaug po sekundės tylos. Mūsų klientas taip pat siunčia apsauginį commitą praėjus 250 milisekundžių tylos, kad išstumtų galimai pakibusį nebaigtą sakinį. Tiekėjo patvirtinimas, kad jis jau commitino, atgal keliauja nuo vienos iki trijų sekundžių. Sudėkite šiuos tris skaičius: kaskart, kai tiekėjas commitindavo pirmas, mūsų apsauginis commitas pataikydavo į beveik tuščią buferį — ir tiekėjo atsakas nebūdavo tik mandagus atmetimas. Jis nutraukdavo ryšį. Kiekviena kalbos pauzė buvo monetos metimas.
v2.0.11 prieš tai pateikia du sluoksnius:
- Programoje: kai atkeliauja commitintas transkriptas, klientas dabar žino, kad tiekėjo buferis ką tik buvo ištuštintas, ir perteklinį apsauginį commitą praleidžia.
- Mūsų backende, tą pačią dieną: proxy, stovintis tarp programos ir tiekėjo, tiksliai atspindi tiekėjo garso apskaitą — jis mato kiekvieną garso kadrą ir kiekvieną commito patvirtinimą su nuline delsa — ir tiesiog atsisako persiųsti bet kokį commitą, kurį tiekėjas atmestų. Šis sluoksnis apsaugo visas kliento versijas iš karto, įskaitant naudotojus, kurie dar neatsinaujino.
Kaip tai veikia produkcijoje, pamatėme per valandą. Apsauga perėmė pasmerktus commitus su 178 ms ir 256 ms buferizuoto garso — kiekvienas jų iki tos dienos reiškė garantuotai nutrūkusį ryšį ir skylę kieno nors susitikimo užrašuose. Tą popietę 60 minučių nepertraukiama sesija užfiksavo penkis perėmimus ir nulį nutrūkimų. Prieš pataisą, tą patį rytą, tikras naudotojas per šešias minutes penkis kartus iš naujo paleido įrašymą, kovodamas būtent su šia klaida.
Dvi mažesnės pataisos tame pačiame leidime
AI įžvalgos dabar laukia turinio. Tie iškraipyti ankstyvi fragmentai anksčiau maitindavo GeekBye gyvus pasiūlymų burbuliukus, kurie iš blogai išgirsto klausimo apie C++ užtikrintai gamindavo temas kaip „Defining Life's Ultimate Purpose". Pasiūlymai dabar laukia, kol sesijoje susikaups tikra pokalbio masė.
Atkurtas tekstas gauna teisingą kalbėtoją. Atkūrimo mechanizmas, teisingai transkribavęs mūsų klausimą apie C++, jį buvo priskyręs „Them" (pašnekovui). Lokaliai saugoma garso laiko juosta dabar fiksuoja, kas kalbėjo, todėl atkurti segmentai teisingai priskiriami jums arba pašnekovui.
Rezultatų lenta
| Metrika (išmatuota, ne apytikslė) | Prieš | Po v2.0.11 + backend apsaugos |
|---|---|---|
| Ryšio nutrūkimai testinėje sesijoje | 3 per 163 s | 0 |
| Ilgiausia skylė transkripte | 51 s | ~6 s blogiausia spraga validuojant |
| „pointer in C++" | „point in life" | teisingai, su pakreiptu žodynu |
| Pasmerkti commitai, pasiekę tiekėją | visi | 0 (perimti backende) |
Jei kuriate ant realaus laiko kalbos API
Trys perkeliamos pamokos iš šio leidimo:
- Maitinkite pakreipimo funkciją. Jei jūsų STT tiekėjas palaiko keytermus / frazių užuominas, užpildyti juos mažu, išskirtiniu žodynu — pigiausias prieinamas tikslumo laimėjimas, o užpildyti juos įprastais žodžiais — tikslumo praradimas.
- Niekada nesivaržykite su tiekėjo būsenų mašina iš neteisingos tinklo round-trip pusės. Mūsų klientas negalėjo laimėti 250 ms prieš 3 s informacijos lenktynių. Apsaugai vieta ten, kur susilieja abu signalai — pas mus tai backend proxy.
- Prieš publikuodami validuokite gyvame builde. Keytermų regresiją pagavome todėl, kad kiekvienas GeekBye leidimas prieš išleidimą testuojamas kaip pasirašytas, notarizuotas buildas prieš produkciją. Bloga versija kelias valandas egzistavo viename vidiniame kompiuteryje, o ne jūsų Mac.
GeekBye v2.0.11 jau pasiekiamas — jei naudojate v2, jį jau turite per automatinį atnaujinimą. Apie patikimumo pamatus, ant kurių statomas šis leidimas, skaitykite kodėl jūsų AI užrašinė sustoja esant blogam Wi-Fi ir kas pasikeitė GeekBye v2. O apie tai, kaip gyva transkripcija veikia kasdien, pradėkite nuo transkripcijos realiuoju laiku GeekBye.

