Tvorba webového obsahu pomocí AI

Jak napojit umělou inteligenci přímo do redakčního systému?

Pomocí vlastního .NET modulu, který se napojí na API umělé inteligence (např. Google Gemini). Modul komunikuje s databází CMS, získá si strukturu polí a vygenerovaná data do nich přímo rozřadí.

Jak jsem naučil redakční systém tvořit články, SEO i grafiku na jedno kliknutí

Propojil jsem jádro redakčního systému Orchard Core přímo s API umělé inteligence. Majitelům webů teď stačí zadat téma a můj kód se postará o vygenerování, naformátování a roztřídění obsahu přímo do databáze.

Rychlý přehled: Naprogramoval jsem rozšiřující modul pro systém Orchard Core. Ten pomocí modelů Google Gemini automaticky píše texty, doplňuje SEO parametry a generuje ilustrační grafiku. Vygenerovaná data systém nenechá ležet ladem, ale inteligentně je spáruje se strukturou webu a bezpečně uloží jako koncept připravený k finálnímu schválení.

Co bylo cílem a s čím jsem bojoval

Psaní firemního obsahu nebo plnění e-shopu produkty je pro provozovatele webů extrémně zdlouhavé. I když dnes lidé běžně používají umělou inteligenci, v praxi to znamená mít otevřených několik různých oken. V jednom okně si necháte napsat text, ve druhém složitě ladíte prompty pro obrázek, vše pak ručně kopírujete zpět do svého redakčního systému, formátujete nadpisy a doplňujete štítky pro vyhledávače.

Chtěl jsem tento "kopírovací" proces kompletně zrušit. Cílem bylo vytvořit nástroj zabudovaný přímo v srdci webu. Nástroj, který bude znát vaše rubriky, vaše interní pravidla a technickou strukturu stránek, a podle toho připraví kompletní výstup.

Jaké technologie a přístupy dostaly hlavní roli

Architekturu jsem postavil na platformě .NET 10 a redakčním systému Orchard Core. Napsal jsem vlastní modul nazvaný PV.ContentAIGenerator, který v pozadí řídí takzvané "agenty" (digitální persony s konkrétním úkolem) a zajišťuje, že se výsledná data nerozsypou, ale přesně zapadnou do připravených chlívečků v databázi.

Automatická analýza struktury

Aplikace si přes rozhraní redakčního systému sama přečte, jaká pole web používá (např. hlavní text, perex, SEO titulek, náhledový obrázek). Z toho vytvoří striktní šablonu, kterou pošle umělé inteligenci, a donutí ji tak vrátit data v přesně požadovaném formátu.

Grafika přímo do knihovny médií na jedno kliknutí

Umělá inteligence zvládne na základě textu rovnou vytvořit i obrázky. Modul tato obrazová data (Base64) automaticky chytí na pozadí, převede je na fyzické soubory a bezpečně je zapíše do mediální knihovny webu. Redaktorovi pak už jen podstrčí správnou URL adresu.

Šablonovací engine Liquid

Aby výsledek nebyl jen holý text, zapojil jsem do procesu vestavěný šablonovací systém Liquid. Vygenerovaná data od AI se před uložením proženou šablonou, která jim dodá perfektní HTML strukturu (včetně CSS tříd pro váš konkrétní web).

Nahlédnutí pod kapotu: Jak modul funguje v kódu

Abychom zajistili, že AI nebude generovat "omáčku", ale strukturovaná data, napsal jsem službu ContentSchemaAnalyzer. Ta prozkoumá definici obsahu v Orchard Core a vytvoří systémový prompt. Donutíme tak model vrátit čistý JSON.

public async Task<string> GenerateSchemaPromptAsync(string contentTypeName)
{
    var typeDef = await _contentDefinitionManager.GetTypeDefinitionAsync(contentTypeName);
    if (typeDef == null) return string.Empty;

    var sb = new StringBuilder();
    sb.AppendLine("Tvá odpověď MUSÍ být striktní JSON objekt bez markdown značek, odpovídající této struktuře:");
    sb.AppendLine("{");
    sb.AppendLine("  \"DisplayText\": \"<Generovaný hlavní název>\",");
    
    foreach (var part in typeDef.Parts)
    {
        if (part.PartDefinition.Name == "HtmlBodyPart") 
            sb.AppendLine($"  \"{part.PartDefinition.Name}\": {{ \"Html\": \"<Generovaný HTML obsah>\" }},");
        // ... (dynamické mapování dalších polí)
    }
    sb.AppendLine("}");
    return sb.ToString();
}

Jakmile máme hotový text, nastupuje agent pro generování obrázků. Vygenerovaný obrázek přijde z API jako textový řetězec. Můj kontroler ho vezme a fyzicky ho propíše přímo do souborového systému (Media Library) vašeho webu.

[HttpPost("save-media")]
public async Task<IActionResult> SaveMedia([FromBody] SaveMediaPayload payload)
{
    // Převod z Base64 textu na skutečná data obrazu
    byte[] imageBytes = Convert.FromBase64String(CleanBase64String(payload.ImageData));
    
    // Vygenerování unikátního názvu a cesty v CMS
    string fileName = $"{payload.ImageKey}_{Guid.NewGuid().ToString().Substring(0, 8)}.jpg";
    string mediaPath = _mediaFileStore.Combine("ai-generated-content", fileName);

    // Fyzické uložení streamu do úložiště webu
    using (var stream = new MemoryStream(imageBytes))
    {
        await _mediaFileStore.CreateFileFromStreamAsync(mediaPath, stream, overwrite: true);
    }

    // Vrácení veřejné URL pro vložení do článku
    return Ok(new { success = true, mediaPath = mediaPath, publicUrl = _mediaFileStore.MapPathToPublicUrl(mediaPath) });
}

Ve finále všechny tyto dílky – text, SEO pole a cesty k uloženým obrázkům – vezmu a založím z nich v redakčním systému zbrusu nový koncept (Draft).

// Vytvoření nové položky obsahu v paměti
var contentItem = await _contentManager.NewAsync(targetContentType);

// Sloučení vygenerovaného JSONu s vnitřní strukturou systému
contentItem.Merge(jsonNode);

// Renderování obsahu přes Liquid šablonu pro dokonalý design
string finalHtml = await _liquidTemplateManager.RenderStringAsync(pipelineTemplate, HtmlEncoder.Default, null, properties);
contentItem.Content["HtmlBodyPart"] = new { Html = finalHtml };

// Bezpečné uložení do databáze jako koncept (Draft)
await _contentManager.CreateAsync(contentItem, VersionOptions.Draft);

Porovnání: Starý přístup vs. Nové řešení

Podívejte se, jak integrace přímo do jádra systému šetří reálný čas a eliminuje lidské chyby.

Vlastnost / Metrika Původní stav Nové řešení
Časová náročnost na 1 položku Desítky minut přepínání oken a kopírování z ChatGPT/Midjourney. 2–3 minuty na zpracování na pozadí, kontrola a jedno kliknutí na uložení.
Kvalita zdrojového kódu (HTML) Často rozbité styly a skryté znaky po vložení přes schránku (Ctrl+V). Čistý a validní HTML kód generovaný přes nativní šablonovací engine Liquid.
Vyplňování skrytých parametrů (SEO/OpenGraph) Ruční vypisování, na které se často v rychlosti zapomnělo. Modul sám navrhne a vloží Google Schema, popisky i štítky.

Jak celý systém funguje v praxi pro běžného uživatele

Administrační rozhraní jsem postavil nad komponentami Syncfusion (konkrétně ej.navigations.Stepper a DropDownList). Uživatel si prostě vybere předpřipravený proces (tzv. Pipeline) a zadá téma, o kterém chce psát. Odklikne start a na obrazovce vidí, jak systém postupně volá jednotlivé modely z rodiny Google Gemini.

Když je hotovo, redaktor se neocitne před hromadou textu, kterou by musel někam vkládat. Připravil jsem chytrou tabulku. V levém sloupci svítí políčka z vašeho webu (např. "Titulek stránky", "Perex", "Obsah článku") a vpravo roletky s tím, co AI vymyslela. Pokud jste spokojeni, kliknete na tlačítko "Vytvořit článek". Systém na pozadí sestaví finální JSON objekt, přes API založí obsah a přesměruje vás do klasického editoru, kde už všechno leží úhledně poskládané a uložené v režimu konceptu.

Časté otázky a odpovědi

Proč jsem to nepostavil jako běžnou webovou aplikaci stojící mimo web?

Protože největší brzda v produktivitě je samotný přenos dat. Tím, že je modul pevnou součástí Orchard Core, má přístup k databázi (YesSql) a knihovně médií. Dokáže si sám přečíst nastavení webu a vkládat soubory přímo na server. Navenek tak celý systém funguje jako jeden obrovský mozek, který plní web za vás.

Co se stane, když umělá inteligence vygeneruje úplný nesmysl?

Ošetřil jsem to na úrovni kódu. Veškerý obsah, který modul založí, se do redakčního systému ukládá striktně přes volání CreateAsync(contentItem, VersionOptions.Draft). To znamená, že nikdy nedojde k automatickému publikování na živý web. Článek čeká v sekci konceptů, dokud ho člověk nepřečte a neschválí.

Chcete pro svůj projekt podobně stabilní a bezúdržbové řešení? Ozvěte se mi, probereme to u kávy.

Doporučené příspěvky