Cena za AI automatizaci popisků
Šest tisíc produktů, 752 dolarů za tokeny a čtyři týdny nervů. Co doopravdy stojí nechat popisky napsat model - a co všechno se pokazilo.
Úmornou práci bychom měli zautomatizovat
Jeden z prvních projektů mé kariéry měl motto: “Úmornou práci bychom měli zautomatizovat”. Myšlenka to byla chvályhodná, a projekt byl zajímavý - tedy alespoň z technického hlediska. Nicméně to nebyl projekt, o kterém by bylo zábavné hovořit na večírku u sklenice Prosecca, jednalo se totiž o počítání červů v obsahu žaludku ovcí. Zadavatel (a můj tehdejší zaměstnavatel) byla nadnárodní farmaceutická firma a sčítání živých parazitů byl nejspolehlivější způsob jak vyhodnotit efekt jednoho z léčivých přípravků, které společnost vyvíjela.
Technicky se projekt dal rozdělit na tři části:
- Snímání obsahu žaludku dostatečně stabilním způsobem
- Zpracování videa pomocí technik strojového učení
- Statistický výpočet, který zjišťoval, kolik červů přežilo dávku našeho dryáku
Každý z těchto bodů by vydal na samostatný článek. Pro tuto chvíli postačí říct, že jsme na projektu pracovali tři, strávili jsme na něm několik měsíců a výsledkem byl prototyp, který skoro fungoval. Potom byl projekt ukončen, protože jsme mimo jiné spočítali, že náklady na jeho dokončení bohužel převyšují náklady na laboranta s pipetou a mikroskopem. Toť úskalí automatizace v kostce.
Zadání: šest tisíc produktů a texty, které má i konkurence
Situace se změnila. Jiný čas, jiné zadání. Pro klienta, který prodává ryby a další produkty s nimi spojené, nyní spravuji eshop. V nabídce se vyskytuje cca 6 000 produktů od desítky dodavatelů, což s sebou nese dvě komplikace:
- Každý dodavatel poskytuje produktová data v jiném formátu (pokud je poskytuje)
- Všechny ostatní eshopy mají ty samé texty
Co s tím? Standardní postup, který si mohou dovolit velcí hráči, je zaplatit copy-writera, který za cca 750 Kč / hod projde jednotlivé produkty a texty k nim sepíše. Řekneme-li, že sepsat text k jednomu produktu je práce na deset minut (ono to možná bude i více), zvládneme za hodinu zpracovat šest produktů - a investice na opopiskování celého eshopu by tak byla bratru tři čtvrtě milionu. To je pro malý eshop těžko ospravedlnitelná částka.
První pokus: Opus, 830 dolarů a geniální plán s předplatným
Co s tím? Pojďme to zkusit zautomatizovat pomocí AI. Na první pohled se jedná o jednoduchou práci:
- Z feedu dodavatele AI přečte současný text
- Na jeho základě sepíše strukturovaný popisek, SEO popisek a SEO titulek.
- A to je vlastně vše.
Demo jsem seběhl na modelu Claude Opus. Fungovalo to dobře, data nebyla soukromá (tedy jsem je mohl v klidu ládovat do modelu), výstup dával smysl. Domluvili jsme se na ceně a já se pustil do generování.
V průměru, neboť po bitvě je každý generálem, stála tvorba popisku cca 2.9K tokenů na vstupu a vygenerováno bylo 2.7K tokenů na výstupu. SEO popisky a titulky byly kratší: 2.2K vstup, 1.8K výstup.
Claude Opus stojí $5/1M tokenů vstup a $25/1M tokenů výstup. Sečteno a podtrženo by to vycházelo na cca 830 USD za kompletní generování přes API, respektive polovinu při využití dávkového zpracování. Tato varianta by spolkla poměrně značnou část dohodnuté sumy, ale to mi nevadilo, protože jsem měl geniální plán - nechat Anthropic zadotovat mé pokusy skrze předplatné. Můj optimismus mě přešel hned poté, co na mě poprvé zablikalo červených 100% a já tak musel čekat na konec pětihodinové rotace, horečnatě přemýšleje, kde nechal tesař díru.
Když si model vymýšlí
Aby nebyl mým trablem konec, prošel jsem si v mezičase kvalitu generovaných popisků - a nestačil se divit. I při tak jednoduché činnosti, jako je přepis existujících zdrojových materiálů si model začal bohapustě vymýšlet. Navíc jsem zjistil, že u nemalého procenta produktů zdrojové materiály prostě chybí, což ovšem modelu nevadilo a zdroje si jednoduše domyslel.
Kontrola proti zdrojům a kontrola příčetnosti
Učinil jsem tedy dvě úpravy: Zaprvé jsem přešel na Sonnet ($2/1M tok. vstup, $10/1M tok. výstup) - což naštěstí fungovalo. Kvalita byla pro tento typ výsledku srovnatelná a cenovka mnohem příznivější. Zadruhé jsem musel zařadit výstupní kontrolu proti zdrojům “pokud text neodpovídá zdroji, vrať ke kontrole”. Samotná kontrola by nestačila - modely by si ji šmahem vymyslely, takže jsem nasadil kontroly tři a vyžadoval hlasování. Byť to fungovalo hezky, přišel jsem o značnou část úspor, kterých jsem dosáhl nasazením Sonnetu. Každá kontrola totiž spotřebovala cca 2K vstupních a 0.3K výstupních tokenů - krát tři kontroly plus nutnost zachycené chyby opravit.
Byl jsem ve stavu, kdy model konečně nevyráběl nesmysly a cena byla pořád hratelná. Zbytek tedy byl už procházkou růžovým sadem. Načasovat generování tak, aby mi z kvóty zbylo dost pro moji další práci, během pár týdnů dogenerovat chybějící popisky, odevzdat, zkasírovat. Život je krásný.
Tedy, byl by krásný, kdybych si nepřečetl další popisek, který sice byl technicky správný - čímž myslím, že odpovídal zdrojům, ale který neměl takříkajíc hlavu ani patu. Jedna věta skončila a to, co následovalo nemělo naprosto žádnou souvislost s předchozím textem. I musel jsem přidat “kontrolu příčetnosti” - tedy příkaz ve významu “projdi text větu po větě, a zkontroluj, že to celé dává smysl a věty navazují”. Tahle kontrola taky něco stála, ve výsledku cca 2.5K vstupních a 0.8K výstupních tokenů. Běžela dvakrát, protože jednou to nestačilo.
Kontrola stojí násobně víc než generování
Když to celé počítáme:
Tabulka: popisek produktu, na jeden produkt
| krok | vstup | výstup | Sonnet (USD) | Opus (USD) |
|---|---|---|---|---|
| generování | 2 941 | 2 708 | 0,033 | 0,082 |
| kontrola proti zdrojům (3 hlasy) | 5 946 | 993 | 0,022 | 0,055 |
| kontrola příčetnosti (2 hlasy) | 4 914 | 1 522 | 0,025 | 0,063 |
| jeden čistý průchod | 13 801 | 5 223 | 0,080 | 0,200 |
| při 20 % přepisů (1,25 průchodu) | 17 251 | 6 529 | 0,100 | 0,249 |
| podle měření (1,9 průchodu) | 26 222 | 9 924 | 0,152 | 0,379 |
Tabulka: SEO titulek a popisek, na jeden produkt
| krok | vstup | výstup | Sonnet (USD) | Opus (USD) |
|---|---|---|---|---|
| generování | 2 213 | 1 832 | 0,023 | 0,057 |
| kontrola proti zdrojům (3 hlasy) | 5 946 | 993 | 0,022 | 0,055 |
| kontrola příčetnosti (2 hlasy) | 4 914 | 1 522 | 0,025 | 0,063 |
| jeden čistý průchod | 13 073 | 4 347 | 0,070 | 0,174 |
| při 10 % přepisů (1,1 průchodu) | 14 380 | 4 782 | 0,077 | 0,191 |
| podle měření (1,42 průchodu) | 18 564 | 6 173 | 0,099 | 0,247 |
No a když to spočítáme, pokud uvažujeme Sonnet + dávkové zpracování:
| položka | na produkt | 6 000 produktů |
|---|---|---|
| popisek, jen generování | 0,016 | 99 |
| obě větve, jen generování | 0,028 | 167 |
| obě větve, jeden čistý průchod | 0,075 | 448 |
| obě větve, 20 % / 10 % přepisů | 0,088 | 529 |
| obě větve, podle měření | 0,125 | 752 |
Jak si můžeme všimnout, kontrola správnosti stojí násobně více, než samotné generování. Tedy - můj původní odhad předpokládal, že budu přepisovat cca 20% popisků. Z tabulky můžete vidět, že v součtu jsem přepsal skoro každý, byť je to trochu zavádějící informace: Platí staré známé pravidlo, že 20% popisků sežralo 80% pokusů - typicky kvůli nedostatečným podkladům, či jiným chybám.
Navíc ani teď si nemůžu být jistý, že je vše dokonale správně - což mi u popisků na eshopu až tolik nevadí, protože se nejedná o kritický systém. Výsledná cena je sice pořád levnější, než Opus (který by vyšel na cca $1900), ale 752 dolarů je už docela nepříjemná částka na zakázce s vcelku malým rozpočtem. A to jsem ještě nezačal počítat vlastní strávený čas…
Past předplatného: systémový prompt u každého volání
Naštěstí jsem tuto částku neplatil, protože jsem generování řešil skrze své předplatné. To bylo sice levnější (protože kvóta je dotovaná), ale zase s sebou přitáhlo kompletní systémový prompt včetně celé mé historie (tedy poznámky v memory.md), dovedností a seznamu MCP serverů. To je žádoucí pro moji každodenní práci. Pro generování popisků, kde počítám každý token, již o něco méně. Čímž jsem chtěl říct: ten zatracený prompt měl dohromady více vstupních tokenů než stovka popisků. A volal se pro. každý. popisek.
Inu, odepsal jsem další mikrokvótu a zasílání systémového promptu zakázal. CLI na tohle není stavěné a dávalo mi to docela důrazně najevo. A to je zjednodušení, protože popisovat těch patnáct iterací, kdy jsem postupně zjišťoval, co kde je ještě špatně, by trvalo příliš dlouho.
Šest věcí, které se pokazily
Letem světem, ty nejhorší:
- Nebyl jsem dostatečně specifický ve svém požadavku, že když chci Sonnet, tak má běžet všude. Takže jsem v půlce běhu zjistil, že se celý red team provádí přes “základní nastavení” - kterým je Opus.
- Přišel jsem o půlku dílčího běhu kvůli pádu počítače, protože mě nenapadlo zdůraznit, že chci někam ukládat mezivýsledky.
- Snaha o paralelizaci mi několikrát zmrazila počítač, protože model vzal příkaz “vezmi to zeširoka” příliš doslovně. V jednom případě i navzdory snaze ho nejprve donutit spočítat, kolik procesů si může dovolit nastartovat.
- Tabulku strukturovaných dat pro filtry model sice vytvořil, ale nikoho už nenapadlo ji nasadit na eshop, protože nespadala do kategorie vygenerovaný text. Takže ji model prostě odignoroval. Všiml jsem si toho až při ruční kontrole.
- Při paralelizaci (když jsem před koncem týdne “dojížděl kvótu”) se mi modely potloukly a začaly si vzájemně přepisovat výstupy. Protože … mě nenapadlo jim to výslovně zakázat.
Vyplatilo se to?
Kolem a kolem se mi nakonec celou dávku podařilo dokončit - vyjma asi stovky produktů u kterých podklady nebyly dohledatelné a vyjma kontrolní skupiny, na které měříme, jestli (a jaký) má nasazení těchto generovaných popisků nějaký dopad na návštěvnost stránek. Stálo mě to jenom asi čtyři týdny hrkání, spoustu spálených tokenů - tedy kvóty, několik telefonátů s klientem, a hodně, hodně nervů.
Výsledná cenovka pro klienta? Zlomek toho, co by musel nasypat copywriterům.
Vyplatilo se mi to? Finančně ano (předplatné si platím tak jako tak). Časově skoro, protože většina experimentů běžela na pozadí, takže skutečně stráveného času zase tolik nebylo. Byť na hodinovku asi ve výsledku nic moc. Co se týče nervů - v žádném případě. Routování přes lokální konzoli sice fungovalo, ale konzole na to není stavěná - což mi v prvotním záchvatu nadšení nedošlo. Příště bych volil cestu placeného API s nutností napočítat cenu klientovi. Což mě možná bude stát nějakou tu zakázku, ale zase ušetřím nervy, protože ač jsem programátor a s agenty se potýkám již nějaký ten pátek, tohle bylo silné kafe. Na druhou stranu to byla dobrá škola a tedy, nechcete někdo nějaké popisky?