{"id":514,"date":"2024-06-28T20:52:58","date_gmt":"2024-06-28T20:52:58","guid":{"rendered":"https:\/\/mikulalajos.hu\/?p=514"},"modified":"2024-06-29T10:12:12","modified_gmt":"2024-06-29T10:12:12","slug":"szellem-a-gepben-adatfeldolgozas-ai-jal","status":"publish","type":"post","link":"https:\/\/mikulalajos.hu\/index.php\/2024\/06\/28\/szellem-a-gepben-adatfeldolgozas-ai-jal\/","title":{"rendered":"Szellem a g\u00e9pben &#8211; Adatfeldolgoz\u00e1s AI-jal"},"content":{"rendered":"\n<p>Amikor blogbejegyz\u00e9st \u00edrok, szinte mindig olyan projektekr\u0151l vagy szoftverekr\u0151l \u00edrok, amik m\u00e1r lez\u00e1rultak vagy fejleszt\u00e9s\u00fck v\u00e9get \u00e9rt, &#8220;kiforrott&#8221; szoftvernek lehet nevezni \u0151ket.<\/p>\n\n\n\n<p>R\u00e9szben kedvtel\u00e9sb\u0151l, r\u00e9szben pedig munk\u00e1mhoz kapcsol\u00f3d\u00f3an kellett elm\u00e9ly\u00fcln\u00f6m egy picit az AI \u00e1ltal seg\u00edtett adatfeldolgoz\u00e1sban \u00e9s a piacon el\u00e9rhet\u0151, integr\u00e1lhat\u00f3 AI-modellekkel.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">A probl\u00e9ma<\/h2>\n\n\n\n<p>El\u0151sz\u00f6r is, a legnagyobb gond az volt, hogy b\u0151d\u00fcletes mennyis\u00e9g\u0171 adatot kellett feldolgozni, m\u00e1sodszor pedig ezek az adatok speci\u00e1lisak voltak: t\u00f6bb mint 40 \u00f3r\u00e1nyi hanganyagr\u00f3l van sz\u00f3. Ezeket a hanganyagokat egy szak\u00e9rt\u0151i csoport fogja ki\u00e9rt\u00e9kelni, akik viszont nem tartanak ig\u00e9nyt a hangokra, csak az ezekb\u0151l gener\u00e1lt \u00e1tiratokra.<\/p>\n\n\n\n<p>Fontos az is, hogy az \u00e1tiratokat nem csak el\u0151\u00e1ll\u00edtani kell tudni, hanem a t\u00e1rol\u00e1sukat is meg kellene oldani valamilyen m\u00f3don.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Megold\u00e1si k\u00eds\u00e9rlet<\/h2>\n\n\n\n<p>Most ezen a ponton \u00e9rdemes lenne elmondani, hogy a &#8220;megold\u00e1som&#8221; az\u00e9rt nem annyira komoly, mivel maga az AI-r\u00e9sz m\u00e1r k\u00e9szen, API-n kereszt\u00fcl j\u00f6n be hozz\u00e1m, a szoftver feladata az API h\u00edv\u00e1sok koordin\u00e1l\u00e1sa, a modellek megfelel\u0151 promptol\u00e1sa \u00e9s a vissza\u00e9rkez\u0151 anyagok gy\u0171jt\u00e9se \u00e9s aggreg\u00e1l\u00e1sa. Teh\u00e1t l\u00e9nyeg\u00e9ben \u00edrtam egy nagyon speci\u00e1lis dashboardot egy speci\u00e1lis feladathoz. De az\u00e9rt vannak benne csavarok.<\/p>\n\n\n\n<p>A munka nagy r\u00e9sz\u00e9t az OpenAI modelljei v\u00e9gezt\u00e9k, n\u00e9v szerint a Whisper (Speech to text) \u00e9s a GPT-csal\u00e1d tagjai (err\u0151l k\u00e9s\u0151bb lesz sz\u00f3).<\/p>\n\n\n\n<p>A szoftver a k\u00f6vetkez\u0151 dolgokat teszi lehet\u0151v\u00e9, ezeket r\u00e9szletezem a tov\u00e1bbiakban:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Hanganyagok felt\u00f6lt\u00e9se Drag n&#8217; Drop jelleggel, ezek automatikus felv\u00e9tele<\/li>\n\n\n\n<li>A hanganyagok kezdetleges sz\u00f6vegg\u00e9 alak\u00edt\u00e1sa (nyers \u00e1tirat)<\/li>\n\n\n\n<li>A nyers \u00e1tiratokon bel\u00fcl a besz\u00e9l\u0151k (interj\u00faalany \u00e9s interj\u00fat k\u00e9sz\u00edt\u0151) elk\u00fcl\u00f6n\u00edt\u00e9se (angolul diarisation)<\/li>\n\n\n\n<li>Minden r\u00e9szfolyamat ut\u00e1n automatikus ellen\u0151rz\u00e9s<\/li>\n\n\n\n<li>K\u00f6lts\u00e9gbecsl\u00e9sek a modellhaszn\u00e1latra<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Munka a hanggal &#8211; Whisper<\/h2>\n\n\n\n<p>Az\u00e9rt d\u00f6nt\u00f6ttem a Whisper mellett, mivel el\u00e9g olcs\u00f3 (olyan 0.01$ percenk\u00e9nt), \u00edgy egy interj\u00fa (\u00e1tlagban 60 perc) olyan 0.6 doll\u00e1rb\u00f3l (jobb napokon 220 forint) kij\u00f6n. Ez emberi munka\u00f3r\u00e1ban \u00e9s b\u00e9rben is t\u00f6bb lenne, teh\u00e1t itt m\u00e1r nyert\u00fcnk egy picit (de err\u0151l k\u00e9s\u0151bb).<\/p>\n\n\n\n<p>A modellel val\u00f3 k\u00eds\u00e9rletez\u00e9s sor\u00e1n t\u00f6bb dolgot is megtanultam:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Van f\u00e1jlm\u00e9ret limit (25 MB), \u00edgy fel lehet t\u00f6lteni mindent ak\u00e1r egyben, de nem \u00e9rdemes \u00edgy haszn\u00e1lni, mert a k\u00e9s\u0151bbiekben megint sz\u00e9t kell szedni t\u00f6bb r\u00e9szre az anyagot. Az \u00e9n szoftverem t\u00edz perces s\u00e1vokkal dolgozik, amelyeket egy gy\u00f6ny\u00f6r\u0171 egysoros FFMPEG-parancs \u00e1ll\u00edt el\u0151.<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">            exec('ffmpeg -i ' + 'largeFiles\/' + req.files[i].originalname + ' -f segment -segment_time 10:00 -c copy ' + 'largeFiles\/' + req.files[i].filename.split(\".\")[0] +  '_%03d.' + req.files[i].filename.split(\".\")[1], (err, stdout, stderr) => {\n                if (err) {\n                    console.log(err);\n                    res.status(500).send('Error uploading file');\n                    return;\n                }<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>B\u00e1r a modell \u00e9rt magyarul, az\u00e9rt a t\u00e1jsz\u00f3l\u00e1sokkal gondja akad, szinte mindig. Itt ennek \u00e9kes p\u00e9ld\u00e1ja az egyik interj\u00faban a &#8220;p\u00f3tkocsi&#8221; sz\u00f3. Le\u00edrva p\u00f3tkocsi, de kimondva vagy p[au]tkocsi vagy vagy p\u00f3[t]kocsi. Erre megold\u00e1st \u00fagy lehet tal\u00e1lni (esetleg), hogyha a Whisper system promptj\u00e1ba be\u00edrjuk a probl\u00e9m\u00e1sabb szavakat el\u0151re (de ehhez persze ismerni kell az anyagot)<\/li>\n\n\n\n<li>A rendszer ink\u00e1bb sz\u00f3tagokat ismer fel, mint szavakat, teh\u00e1t a nyakatekertebb \u00f6sszetett szavakba sajnos gyakran belet\u00f6rik a bicsk\u00e1ja (de kinek nem?). Itt is system prompt marad vagy a manu\u00e1lis jav\u00edt\u00e1s (sz\u00f3t\u00e1rral k\u00eds\u00e9rleteztem, t\u00f6bb-kevesebb sikerrel).<\/li>\n\n\n\n<li>El\u0151fordul, hogy a felv\u00e9telen egym\u00e1s szav\u00e1ba v\u00e1gnak az emberek, ilyenkor teljesen es\u00e9lytelen, hogy b\u00e1rmit is kih\u00e1mozzon az automata, mivel m\u00e9g embernek sem olyan egyszer\u0171 kital\u00e1lni, hogy mi t\u00f6rt\u00e9nik.<\/li>\n<\/ul>\n\n\n\n<p>A felv\u00e9tel hangereje teljesen mindegy, a suttog\u00e1st \u00e9s a kiab\u00e1l\u00e1st is \u00e9rti, ak\u00e1r k\u00f6zvetlen egym\u00e1s ut\u00e1n is. Ez hasznos, mert nem kell el\u0151feldolgozni mag\u00e1t a hangot.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1387\" height=\"717\" src=\"https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/Jegyzet-2024-06-28-223110-edited.png\" alt=\"\" class=\"wp-image-517\" srcset=\"https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/Jegyzet-2024-06-28-223110-edited.png 1387w, https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/Jegyzet-2024-06-28-223110-edited-300x155.png 300w, https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/Jegyzet-2024-06-28-223110-edited-1024x529.png 1024w, https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/Jegyzet-2024-06-28-223110-edited-768x397.png 768w\" sizes=\"auto, (max-width: 1387px) 100vw, 1387px\" \/><figcaption class=\"wp-element-caption\">Whisper feldolgoz\u00e1si men\u00fcje. A sz\u00e1m az els\u0151 bejegyz\u00e9s mellet a karaktersz\u00e1mot mutatja.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Sz\u00f6veges feladat &#8211; Ut\u00f3feldolgoz\u00e1s<\/h2>\n\n\n\n<p>Itt bajban voltunk, mivel a Whisper az csak foly\u00f3sz\u00f6veget k\u00e9pes el\u0151\u00e1ll\u00edtani (megb\u00edzhat\u00f3an), sz\u00f3val ut\u00f3lag kellett elv\u00e9gezni a besz\u00e9l\u0151kre bont\u00e1st. Erre speci\u00e1lis modellek \u00e9s megold\u00e1sok vannak (\u00e9rdekes, mert nincsen ehhez npm library), de itt nem volt id\u0151 ezek implement\u00e1ci\u00f3j\u00e1ra, \u00edgy ink\u00e1bb fejjel mentem a falnak: az API-n kereszt\u00fcl megh\u00edvtam egy GPT-modellt.<\/p>\n\n\n\n<p>El\u0151sz\u00f6r a GPT-4 volt a tervezett modell, de gyorsan r\u00e1 kellett j\u00f6nn\u00f6m, hogy itt el\u00e9g nagy gond az \u00e1r (30$ \/ 1 milli\u00f3 token). Ez\u00e9rt v\u00e9g\u00fcl (egy kis gpt-3.5-turbo-s b\u00e9n\u00e1z\u00e1s ut\u00e1n) a leg\u00fajabb modellre, a GPT-4o-ra esett a meglehet\u0151en szakmai \u00e9s megalapozott (nem) d\u00f6nt\u00e9sem. Itt f\u0151leg az vez\u00e9relt val\u00f3j\u00e1ban, hogy a 4o \u00e1ra a GPT-4 modell \u00e1r\u00e1nak egyhatoda (5$ \/ 1 milli\u00f3 token).<\/p>\n\n\n\n<p>Itt \u00edrtam egy gyors system promptot, ami arra utas\u00edtja a modellt, hogy k\u00fcl\u00f6n\u00edtse el a besz\u00e9l\u0151ket \u00e9s minden blokk elej\u00e9re tegyen egy k\u00f6t\u0151jelet, a blokkokat pedig egy sort\u00f6r\u00e9ssel (n\u00e9ha kett\u0151vel siker\u00fclt) z\u00e1rja le. A tiszt\u00e1nl\u00e1t\u00e1s v\u00e9gett a webalkalmaz\u00e1s ilyenkor helyileg tokenekre bontja a sz\u00f6veget \u00e9s k\u00f6lts\u00e9gbecsl\u00e9st is ad.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"531\" src=\"https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/image-1024x531.png\" alt=\"\" class=\"wp-image-518\" srcset=\"https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/image-1024x531.png 1024w, https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/image-300x155.png 300w, https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/image-768x398.png 768w, https:\/\/mikulalajos.hu\/wp-content\/uploads\/2024\/06\/image.png 1239w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">A &#8220;Labor&#8221; f\u00fcl teljes kontrollt ad a modell felett, a tokeniz\u00e1l\u00e1st a tiktoken nev\u0171 library v\u00e9gzi, helyileg, az eszk\u00f6z\u00f6n.<\/figcaption><\/figure>\n\n\n\n<p>P\u00e1r \u00e9szrev\u00e9tel:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00c9rdemes a tokenlimitet betartani, mert ha t\u00fall\u00e9pj\u00fck a kontextust, akkor k\u00f6nnyen butas\u00e1gokat k\u00fcldhet vissza a modell.<\/li>\n\n\n\n<li>El\u0151fordul, hogy a modell megkeveredik \u00e9s kihagy r\u00e9szeket. Ezt a system prompt m\u00f3dos\u00edt\u00e1s\u00e1val lehet megg\u00e1tolni. \u00cdgy viszont feldolgozatlanul hagyhat r\u00e9szeket a g\u00e9p.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Z\u00e1rsz\u00f3 &#8211; Kinek j\u00f3 ez?<\/h2>\n\n\n\n<p>R\u00f6viden: nagyon sok mindenkinek. Ebben az esetben (\u00e9s m\u00e9g sz\u00e1mos ter\u00fcleten) az AI egy gyors \u00e9s viszonylag pontos megold\u00e1st ad egy emberrel szemben, gyakran az eredeti \u00e1r t\u00f6red\u00e9k\u00e9\u00e9rt. Ez az\u00e9rt j\u00f3, mert \u00edgy le lehet venni az emberek v\u00e1ll\u00e1r\u00f3l a felesleges munka terh\u00e9t.<\/p>\n\n\n\n<p>Azonban azt is szem el\u0151tt kell tartani, hogy szinte minden esetben fontos az, hogy mit ad ki az AI, mivel f\u00fcgghet t\u0151le az, hogy siker\u00fcl-e elv\u00e9gezni a feladatot, s\u0151t ak\u00e1r enn\u00e9l fontosabb, ember\u00e9leteket vesz\u00e9lyeztet\u0151 helyzetek is kialakulhatnak, ha az AI nincsen megfelel\u0151en fel\u00fcgyelve. Enn\u00e9l a szoftvern\u00e9l a fel\u00fcgyeletet k\u00e9t r\u00e9szre lehet tagolni: a labor f\u00fcl\u00f6n pontosan l\u00e1tjuk azt, hogy az AI mit l\u00e1t (tokenek), illetve azt, hogy mit ad ki, ezeken m\u00f3dos\u00edthatunk is. Az egyetlen v\u00e1ltozatlan dolog itt a system prompt. Ezen k\u00edv\u00fcl az AI &#8220;hallucin\u00e1lhat&#8221; is, \u00edgy nem l\u00e9tez\u0151 r\u00e9szeket beillesztve vagy val\u00f3di r\u00e9szeket kihagyva. Nagyon kell figyelni a bemenet \u00e9s a kimenet hossza k\u00f6zti kapcsolatra (a kimenet szinte mindig hosszabb, mint a bemenet, \u00e1ltal\u00e1ban a bemenet hossz\u00e1nak kb. 120%-a).<\/p>\n\n\n\n<p>Itt az AI nagyon sok munka\u00f3r\u00e1t megsp\u00f3rolt, illetve megk\u00f6nny\u00edtette egy emberfeletti feladat elv\u00e9gz\u00e9s\u00e9t, de \u00e9n m\u00e9g mindig azt gondolom, hogy az AI-technol\u00f3gi\u00e1ra vakon hagyatkozni nem lehet, csakis kiz\u00e1r\u00f3lag megfelel\u0151 kontroll mellett lehet ezeket a megold\u00e1sokat alkalmazni.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Amikor blogbejegyz\u00e9st \u00edrok, szinte mindig olyan projektekr\u0151l vagy szoftverekr\u0151l \u00edrok, amik m\u00e1r lez\u00e1rultak vagy fejleszt\u00e9s\u00fck v\u00e9get \u00e9rt, &#8220;kiforrott&#8221; szoftvernek lehet nevezni \u0151ket. R\u00e9szben kedvtel\u00e9sb\u0151l, r\u00e9szben pedig munk\u00e1mhoz kapcsol\u00f3d\u00f3an kellett elm\u00e9ly\u00fcln\u00f6m egy picit az AI \u00e1ltal seg\u00edtett adatfeldolgoz\u00e1sban \u00e9s a piacon el\u00e9rhet\u0151, integr\u00e1lhat\u00f3 AI-modellekkel. A probl\u00e9ma El\u0151sz\u00f6r is, a legnagyobb gond az volt, hogy b\u0151d\u00fcletes mennyis\u00e9g\u0171 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,3],"tags":[],"class_list":["post-514","post","type-post","status-publish","format-standard","hentry","category-fejtagitas","category-projektek"],"_links":{"self":[{"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/posts\/514","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/comments?post=514"}],"version-history":[{"count":4,"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/posts\/514\/revisions"}],"predecessor-version":[{"id":522,"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/posts\/514\/revisions\/522"}],"wp:attachment":[{"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/media?parent=514"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/categories?post=514"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikulalajos.hu\/index.php\/wp-json\/wp\/v2\/tags?post=514"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}