Skip to content

AI AI Učitel Španělštiny s možností prodeje lekcí formou NFT

Štefan Prokop edited this page Apr 11, 2023 · 4 revisions

AI Učitel španělštiny s možností prodeje lekcí formou NFT

V tomto článku najdete popis jednoduché Blazor Server aplikace, která využívá ChatGPT k vytváření lekcí španělštiny z různých jazyků. Tyto lekce ukládá v podobě NFT na blockchain. Lekce jsou k dispozici zdarma, avšak kdokoliv si může koupit i kopie lekcí, které mu přijdou na jeho adresu v rámci účtu na VENFT App, kde si může lekce kdykoliv v budoucnu jednoduše najít.

Demo Aplikace

obrazek

Celá demo aplikace je k dispozici zde.

Aplikace je k dispozici i Online zde na https://learnlanguagewithai.azurewebsites.net/

Flow aplikace

Flow aplikace je jednoduché:

sequenceDiagram
    participant Student
    participant LearnLanguageWithAI
    participant Blockchain
    participant VENFTApp
    Student->>LearnLanguageWithAI: navštíví aplikaci a zadá téma lekce
    LearnLanguageWithAI->>LearnLanguageWithAI: vygeneruje pomocí AI novou lekci
    LearnLanguageWithAI->>Blockchain: uloží lekci zdarma na blockchain
    Note over Blockchain: lekce přidána do seznamu historie lekcí
    loop Každá lekce
        OtherStudents->>Blockchain: najít lekci v seznamu historie lekcí
        OtherStudents->>VENFTApp: kopit lekci z VENFT Aplikace
    end
    OtherStudents->>LearnLanguageWithAI: platba za verifikaci transakce
    LearnLanguageWithAI->>VENFTApp: odešle kopii lekce po verifikaci transakce s platbou
    OtherStudents->>VENFTApp: najde a přečte si lekci ve své VENFT App kdykoliv potřebuje

Loading

Nyní ke kódu aplikace. Obecně vychází z apliakce MintFreeForAI, ke které je k dispozici článek zde. Než budete pokračovat, doporučuji si tento článek přečíst.

Jádro aplikace je v podstatě stejné. Jedná se o Blazor Server App s API kontrolerem. Aplikace načítá i Neblio blockchain účet, přes který se mintují NFT, a ten také zpracovává příchozí platby za články a mintuje kopie článků zákazníkům, kteří si kopii koupí.

Pro provoz takové aplikace potřebujete také OpenAI API klíč. Pro jeho získání je potřeba mít účet na OpenAI.com a vytvořit si nový klíč v nastavení účtu.

Hlavní odlišnost oproti aplikaci MintFreeForAI je hlavně ve zjednodušení všech formulářů. Vyplňuje se v podstatě jen:

  • téma lekce
  • komentář studenta
  • přezdívka

Téma lekce může být například:

  • "hotel"
  • "návštěva lékaře"
  • "nakupování automobilu"
  • "pracovní pohovor"

apod.

Komentář studenta se připojuje na konec textu lekce jako feedback pro budoucí zlepšování (jeho zadání je volitelné).

Generování textu pomoci ChatGPT

Text generuje ChatGPT pomocí wrapovací třídy VirtualAssistant.cs. Konkrétně k tomu dochází v komponentě GetText.razor. Zde je postup jednoduchý. Podle typu jazyka (ty jsou definovány v rámci tohoto enumu) se sestaví request pro ChatGPT.

Narozdíl od MintFreeForAI se zde nezadává název článku ani tagy. Ty jsou vygenerovány automaticky během mintování. Proto bylo potřeba rozšířit funkci v rámci HomeController.cs.

Pro vytvoření Name, Tags a Descriptions bylo potřeba přidat následující část:

var tx = nft.Text;
if (tx.Length > 500)
    tx = tx.Substring(0, 500);

var txt = await MainDataContext.Assistant.GetNewDataForNFT(tx);
if (txt.Item1)
{
    nft.Name = txt.Item2.Name;
    nft.Tags = txt.Item2.Tags.Replace("#", string.Empty);
    nft.Description = txt.Item2.Description;
}

var lang = Enum.GetName(typeof(Languages), data.language);
if (!nft.Tags.Contains(lang))
     nft.Tags += $" {lang}";

Nejdřív se upraví Text na maximální délku 500 znaků (předpokládá se, že v rámci toho už bude moct ChatGPT rozpoznat hlavní téma lekce). Poté se zavolá funkce GetNewDataForNFT v rámci instance VirtualAssistenta.

Do tagů se ještě přidá typ jazyka, například "cz2es" nebo "en2es", apod.

Mintování NFT

Aby bylo možné koupit NFT, je potřeba mu nastavit cenu a také příkaz, aby se prodávaly pouze kopie NFT:

nft.Price = 0.5;
nft.SellJustCopy = true;

Poté už je možné vymintovat NFT:

(bool, string) res = (false, string.Empty);
if (VEDLDataContext.Accounts.TryGetValue(MainDataContext.MainAccount, out var account))
{
    var rcv = NeblioTransactionHelpers.ValidateNeblioAddress(data.receiver);

    res = await account.MintNFT(nft, rcv);
    await Task.Delay(500);
    var tnft = await NFTFactory.GetNFT(NFTHelpers.TokenId, res.Item2, 0, 0, true);
    if (tnft != null)
        MainDataContext.MintedNFTs.TryAdd(tnft.Utxo, tnft);
}
else
    res.Item2 = "Cannot find MainAccount.";

return res.Item2;

obrazek

Seznam lekcí

Lekci budete moct najít v seznamu posledních lekcí:

obrazek

Případně si můžete otevřít celé znění lekce:

obrazek

Seznam se získává z API. Konkrétně se jedná o funkci GetLastLessons.

V rámci této funkce se nejdřív zjistí jazyk, který se zadává jako parametr GET requestu:

try
{
    var l = (Languages)Enum.Parse(typeof(Languages), language);
    if (l != null)
        lang = l;
}
catch (Exception ex)
{
    throw new HttpResponseException((HttpStatusCode)501, $"Wrong language input!");
}

Podle jazyka se provede filtrace NFT, které obsahují tag daného jazyka. Ten se přidává před mintováním, jak bylo popsáno výše.

if (VEDLDataContext.Accounts.TryGetValue(MainDataContext.MainAccount, out var account))
{
    if (lang == Languages.cz2es)
    {
        var nfts = account.NFTs.Where(n => n.Type == NFTTypes.Post && (n.Tags.Contains(language) || (n.Tags.Contains("lekce") && n.Tags.Contains("španělština") && n.Tags.Contains("čeština")))).ToList();
        if (nfts != null && nfts.Count > 0)
            return nfts;
    }
    else if (lang == Languages.en2es)
    {
        var nfts = account.NFTs.Where(n => n.Type == NFTTypes.Post && (n.Tags.Contains(language) || (n.Tags.Contains("lesson") && n.Tags.Contains("spanish") && n.Tags.Contains("english")))).ToList();
        if (nfts != null && nfts.Count > 0)
            return nfts;
    }
    else
    {
        var nfts = account.NFTs.Where(n => n.Type == NFTTypes.Post && n.Tags.Contains(language)).ToList();
        if (nfts != null && nfts.Count > 0)
            return nfts;
    }
}

Protože v mém případě bylo první zkušební NFT vymintováno bez názvu jazyka, bylo nutné přidat dva custom filtry pro češtinu a angličtinu. Ty zohledňují i případnou kombinaci několika tagů, které způsobují, že když se vyskytují v NFT, jedná se také o lekci. Pokud se vychází pouze z tagu názvu jazyka, stačí jen poslední filtr:

var nfts = account.NFTs.Where(n => n.Type == NFTTypes.Post && n.Tags.Contains(language)).ToList();
if (nfts != null && nfts.Count > 0)
    return nfts;

V UI se volá tento API příkaz následovně:

private async Task LoadNFT()
{
    await LoadingStatus(true);

    var result = await Http.GetAsync($"/api/GetLastLessons/{Enum.GetName(typeof(Languages),Language)}");
    if (result.StatusCode == System.Net.HttpStatusCode.OK)
    {
        var returnStr = await result.Content.ReadAsStringAsync();

        try
        {
            var nfts = JsonConvert.DeserializeObject<List<PostNFT>>(returnStr);
            if (nfts != null)
                NFTs = nfts;
        }
        catch (Exception ex)
        {
            Console.WriteLine("Cannot deserialize the NFT list: " + ex.Message);
        }
    }

    await LoadingStatus(false);
}

Nákup NFT

Pokud chcete v UI zobrazit link na koupi NFT, nejjednodušší varianta je následující:

@if (NFT.PriceActive)
{
    <Row Margin="Margin.Is2.FromTop">
        <Column Flex="Flex.JustifyContent.Center">
            <Button Color="Color.Secondary" 
                    Block 
                    Type="ButtonType.Link" 
                    To="@("https://apptest.ve-nft.com/buynft?utxo=" + NFT.Utxo + "&index=0")" 
                    Target="Target.Blank">
                        @BuyLesson
                    </Button>
        </Column>
    </Row>
}

Pokud je cena NFT aktivní (větší než 0), zobrazí se tlačítko s odkazem na VENFT App, ve které je integrovaná logika pro platební bránu a nákup NFT. Příklad odkazu na nákup článku je zde:

https://apptest.ve-nft.com/buynft?utxo=97dea20c7704fa5dd1f04f45831c1eba8144d4d5208bff87e0967b8cf789dd9b&index=0

Pokud již máte vytvořený účet ve VENFT App, pak se po otevření odkazu načte tento screen:

obrazek

Tam je potřeba vyplnit své heslo pro odemknutí VENFT App účtu, aby se mohla provést platba. Po odemčení se zobrazí i stav účtu, aby se ověřilo, jestli je k dispozici na adrese dostatečná částka pro nákup NFT.

obrazek

Kromě 0.5 NEBL je potřeba mít také alespoň 10 VENFT tokenů, aby bylo možné poslat tzv. NFT Payment, která obsahuje informace pro zprocesování odeslání NFT. Na blockchainu je totiž možné zkombinovat do jedné transakce platbu i datovou část. Nositelem datové části jsou právě tokeny (v tomto případě VENFT tokeny).

Po odeslání transakce vypadá screen následovně:

obrazek

Pod tlačítkem je možné najít odkaz na Neblio explorer, kde se cca do 30-60 sekund objeví záznam o provedené transakci. Vzorová transakce je zde.

Pro zjednodušení si můžete v tomto případě představit NFT Payment jako prázdný formulář pro objednávku, který má "vodoznak" VENFT a je na něm rovnou přidělaná bankovka s hodnotou přesně odpovídající výši platby za to, co kupujete.

NFT Payment obsahuje následující informace:

Key Value
NFT true
Type NFT Payment
Price 0.500000
Sender Nh7712QcTBT49NA7f9sB3WqX5WjbGLUmo8
NFTUtxoTxId 97dea20c7704fa5dd1f04f45831c1eba8144d4d5208bff87e0967b8cf789dd9b
NFTUtxoIndex 0

Zde je hlavní Price (Cena) a NFTUtxoTxId a NFTUtxoIndex - ty identifikují konkrétní NFT, které se kupuje.

Na detailu částek v transakci můžete vidět, že na adresu účtu, který vlastní NFT, bylo posláno opravdu 0.5 NEBL a 1 VENFT Token:

obrazek

O zpracování odbavení NFT se stará logika NeblioAccountBase.cs.

Po zpracování transakce přijde do VENFT App článek. Viz následující pohled do Galerie NFT:

obrazek

Transakce odbavení NFT je zde:

https://explorer.nebl.io/tx/48b9e8268f36bbb0193768745f338792bc5b8a8c458131938da24dc8f01f4890

V rámci této transakce probíhá opět několik kroků současně. Pro pochopení je potřeba se podívat na detaily transakce ve formě JSON. Tu je možné najít zde v rámci Nebio exploreru.

Na transakci je vidět, že má celkem 3 vstupy:

  • První vstup č.0 je zdroj pro mintování nového NFT, v tomto případě lot s 487 VENFT tokeny.
  • Druhý vstup č.1 je Neblio pro zaplacení poplatku za provedení transakce.
  • Třetí vstup č.2 je původní token získaný v rámci transakce NFT Payment.

obrazek

Výstupy jsou:

  • První výstup č.0 je NFT Post, který směřuje k tomu kdo si koupil NFT.
  • Druhý výstup č.1 je NFT Receipt, který směřuje k tomu, kdo NFT prodával.
  • Třetí výstup č.2 je zbytek Neblio po zaplacení poplatku za transakci.
  • Čtvrtý výstup č.3 je zbytek VENFT tokenů pro mintování (původně vstup č.0).

Zde jsou první dva výstupy:

obrazek

Druhé dva výstupy:

obrazek

Pro platbu poplatku je použita přijatá platba 0.5 NEBL. Díky tomu se tyto platby propojí v rámci jedné transakce s NFT Receipt.

Tímto způsobem je možné prodat v podstatě jakékoliv NFT. Jedná se tedy o univerzální postup, jehož logika je již vyřešena v rámci knihovny VEDriversLite.

NFT Receipts je možné vidět ve VENFT App pod účtem prodejce:

obrazek

V tom spočívá výhoda kombinace VENFT App a serverové nebo konzolové aplikace. Můžou totiž používat stejnou adresu. Vytvoří se například VENFT App účet, provede se backup a backup file se použije jako zdroj pro serverovou aplikaci. Díky tomu je pak ve VENFT App vidět, co se děje na "serverovém" účtu.

Clone this wiki locally