Když chcete od AI použitelný výstup, pište zadání jako brief
Mechanismus rozhoduje víc než pot
Nakonec si vytvořte vlastní šablonu zadání: role, úkol, cílová skupina, rozsah, formát, omezení a příklad. Ukládejte si zadání, která vedla k dobrému výstupu, a upravujte je podle potřeby. Když se výsledek nedaří, neopakujte stejné zadání dokola — změňte jednu proměnnou, třeba úroveň detailu nebo formát, a sledujte, co se stalo. Tak se z psaní zadání stane řemeslo, ne hádání.
Většina lidí zklame u nástrojů s umělou inteligencí proto, že zadání napíše jako dotaz do vyhledávače. Několik slov, žádný kontext, žádný formát. Model pak nemá z čeho vycházet a dodá obecný text, který se musí přepisovat. Rozdíl mezi použitelným a nepoužitelným výstupem přitom není v délce zadání, ale v tom, jestli obsahuje rozhodující informace: kdo je cílová skupina, jaký je účel textu, co musí zaznít a co naopak ne.
Na závěr patří pravidelná kontrola, ne jednorázová oprava. Dotazy se mění spolu s klientem a nová pole přinášejí nové vazby. Zaveďte si přehled o počtu databázových dotazů na jeden GraphQL požadavek a sledujte ho v čase; náhlý nárůst obvykle znamená nový N+1 nebo chybějící index. Indexy v databázi kontrolujte u každého pole, které se používá ve filtru nebo v dávkovém dotazu. A pamatujte, že optimalizace bez měření je jen hádání: změřte, opravte, změřte znovu.
Poměr k místnosti ovlivňuje i výška. V podkroví nebo v pokoji se šikmým stropem volte nízkou pohovku bez mohutného opěradla, jinak bude tlačit na strop. Ve velkém pokoji naopak malá pohovka zanikne a vznikne dojem nedokončeného interiéru. Řešením není kupovat obří sestavu, ale doplnit menší pohovku křeslem nebo dvěma a vytvořit zónu sezení. Vždycky ale nechte mezi jednotlivými kusy alespoň půl metru na pohodlný průchod.
Řešením je dávkování a cacheování na úrovni resolverů. V praxi to znamená sesbírat všechny požadované identifikátory během jednoho cyklu vyhodnocení a poslat je databázi v jednom dotazu s klauzulí IN, případně v dávkách po rozumné velikosti. Knihovny pro dávkování to dělají za vás, ale musíte je správně zapojit do každého resolveru, který přistupuje k datům. Typická chyba je zajistit dávkování jen u jednoho pole a zapomenout na vnořené vazby, takže se problém vrátí o úroveň níž. Dávkování je potřeba ověřit stejným měřením jako předtím, ne jen podle toho, že kód vypadá elegantně.
Hloubka sedu a výška opěradla rozhodují víc než šíř
Praktické je zavést jednoduchý systém: každý týden projděte zásobu a zralé kusy přesuňte dopředu, kde je uvidíte. Ovoce, které už je měkké, nevyhazujte — rozmačkejte ho do jogurtu, upečte nebo zmrazte v kouscích na pečení. Zmrazování funguje nejlépe u bobulovin a nakrájeného ovoce, které před mražením rozložíte na plech, aby se kusy neslepily. Na co si dát pozor: mražení nezachrání plody, které už plesniví. Plíseň prorůstá hlouběji, než je vidět, a chuť i bezpečnost tím trpí.
Hloubka dotazu jako skrytá daň Druhou častou chybou je ignorování hloubky a složitosti dotazu. Klient může poslat dotaz, který rekurzivně prochází vazby do několika úrovní, a server to ochotně provede, protože schéma to dovoluje. Výsledkem je obrovské množství práce pro malý výstup. Zaveďte limit hloubky a limit celkového počtu polí, které se mají vyhodnotit, a vracejte chybu ještě před spuštěním resolverů. Limity nastavte podle reálného použití, ne podle nejhoršího teoretického případu, a při jejich překročení nabídněte klientovi srozumitelnou zprávu. Bez těchto limitů se každá optimalizace dříve či později rozpadne pod náporem jednoho neopatrného dotazu.
U dat, která se často čtou a málokdy mění, se vyplatí cache na úrovni resolveru nebo celé odpovědi. Pozor ale na kontext: cacheovaná odpověď nesmí obsahovat data závislá na oprávněních konkrétního uživatele. Nejbezpečnější je cachovat až výsledek resolveru pro veřejná data a autorizaci řešit před cache nebo v klíči cache. Zvažte také, zda klient skutečně potřebuje všechna pole, která posílá; v GraphQL je snadné poslat velký dotaz jen proto, že to schéma dovoluje. Podívejte se na reálné dotazy z produkce a najděte ta pole, která se načítají zbytečně.
Začněte tím, že popíšete roli a situaci. Místo „napiš článek o údržbě kola" zkuste „jsi zkušený mechanik, píšeš pro lidi, kteří jezdí do práce na kole a sami si ho servisují". Tím se zúží tón i slovní zásoba. Potom určete výstup: rozsah, počet odstavců, jestli jde o seznam kroků, tabulku nebo souvislý text. Bez toho model volí formát sám a často špatně.
Nejčastější příčina pomalého GraphQL není databáze ani síť, ale to, jak resolver vrací data pro seznam položek. Princip je jednoduchý: resolver pro pole seznamu načte rodičovské objekty jedním dotazem, ale každé pole uvnitř tohoto seznamu spustí vlastní dotaz. U stovky položek tak vznikne stovka dotazů, u tisíce tisíc. Tento problém se objevuje i v moderních frameworcích, protože optimalizace není automatická. Prvním krokem je měření: zapněte logování dotazů na úrovni databáze a spočítejte je pro jeden konkrétní dotaz z klienta. Pokud se počet dotazů škáluje s počtem vrácených položek, máte N+1 a další ladění výkonu je zbytečné.