Sdílet prostřednictvím


Příklad dovednosti AI s datovou sadou AdventureWorks (Preview)

Tento článek ukazuje, jak nakonfigurovat dovednost AI u datové sady AdventureWorks.

Důležité

Tato funkce je ve verzi Preview.

Požadavky

Vytvoření jezerahouse pomocí AdventureWorksDW

Nejprve vytvořte jezerní dům a naplňte ho potřebnými daty.

Pokud už máte instanci AdventureWorksDW ve skladu nebo jezeře, můžete tento krok přeskočit. Pokud ne, vytvořte z poznámkového bloku lakehouse. Použijte poznámkový blok k naplnění jezera daty.

  1. Vytvořte nový poznámkový blok v pracovním prostoru, ve kterém chcete vytvořit dovednosti umělé inteligence.

  2. Na levé straně podokna Průzkumník vyberte + Zdroje dat. Tato možnost přidá existující jezerní dům nebo vytvoří nový jezerní dům.

  3. Do horní buňky přidejte následující fragment kódu:

    import pandas as pd
    from tqdm.auto import tqdm
    base = "https://synapseaisolutionsa.blob.core.windows.net/public/AdventureWorks"
    
    # load list of tables
    df_tables = pd.read_csv(f"{base}/adventureworks.csv", names=["table"])
    
    for table in (pbar := tqdm(df_tables['table'].values)):
        pbar.set_description(f"Uploading {table} to lakehouse")
    
        # download
        df = pd.read_parquet(f"{base}/{table}.parquet")
    
        # save as lakehouse table
        spark.createDataFrame(df).write.mode('overwrite').saveAsTable(table)
    
  4. Vyberte Spustit vše.

    Snímek obrazovky s poznámkovým blokem s kódem pro nahrání AdventureWorks

Po několika minutách se jezero naplní potřebnými daty.

Vytvoření dovednosti umělé inteligence

  1. Pokud chcete vytvořit novou dovednost umělé inteligence, přejděte do Datová Věda prostředí a vyberte dovednost AI.

    Snímek obrazovky znázorňující, kde vytvořit dovednosti umělé inteligence

  2. Zadejte název pro vytvoření dovednosti umělé inteligence.

Výběr dat

Vyberte lakehouse, který jste vytvořili, a vyberte Připojit. Pak musíte vybrat tabulky, pro které má dovednost umělé inteligence přístup k dispozici.

V tomto cvičení se používají tyto tabulky:

  • DimCustomer
  • DimDate
  • DimGeography
  • DimProduct
  • DimProductCategory
  • DimPromotion
  • DimReseller
  • DimSalesTerritory
  • FactInternetSales
  • FactResellerSales

Uveďte pokyny

Když se poprvé zeptáte na dovednosti AI s vybranými tabulkami, dovednosti AI na ně poměrně dobře odpoví. Například pro otázku Co je nejprodádanější produkt?, vrátí dovednost AI:

  • Long-Sleeve Logo Jersey, L

Dotaz SQL ale potřebuje nějaké vylepšení. Nejprve se podívá jenom na FactResellerSales tabulku. Tabulka se FactInternetSales ignoruje. Za druhé, objednává produkty podle množství objednávek, když celkové tržby z prodeje spojené s produktem jsou nejdůležitějším aspektem, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky znázorňující první příklad otázky týkající se nejvyššího prodeje dovedností umělé inteligence

Pokud chcete vylepšovat generování dotazů, zadejte několik pokynů, jak je znázorněno v těchto příkladech:

  • Kdykoli se ptám na "nejprodávanější" produkty nebo položky, metrika zájmu je celkové tržby z prodeje, a ne množství objednávek.
  • Primární tabulka, která se má použít, je FactInternetSales. Použijte FactResellerSales pouze v případě, že se explicitně zobrazí výzva k opětovnému prodeji nebo když se zobrazí dotaz na celkové prodeje.

Pokládání otázky znovu vrátí jinou odpověď, Mountain-200 Black, 46jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky znázorňující druhou ukázkovou otázku týkající se nejvyšších prodejních produktů dovedností AI

Odpovídající SQL načte z FactInternetSales tabulky a seřadí se podle součtu částky prodeje. AI postupoval podle pokynů.

Až budete dál experimentovat s dotazy, měli byste přidat další pokyny.

Tento scénář používá následující sadu pokynů:

  • Kdykoli se zeptám na "nejprodálejší" produkty nebo položky, metrika zájmu je tržby z prodeje a nikoli množství objednávek.
  • Primární tabulka, která se má použít, je FactInternetSales. Použijte FactResellerSales pouze v případě, že se explicitně zobrazí výzva k opětovnému prodeji nebo když se zobrazí dotaz na celkové prodeje.
  • Když se zeptáte na dopad propagačních akcí, udělejte to na zvýšení tržeb z prodeje, nejen počet prodaných jednotek.
  • V případě přehledů zákazníků se místo počtu objednávek zaměřte na celkovou částku prodeje na zákazníka.
  • Slouží DimDate k extrakci konkrétních časových období (například rok, měsíc) při provádění časově založených analýz.
  • Při analýze geografických dat určete prioritu celkových výnosů z prodeje a průměrného prodeje na objednávku pro každou oblast.
  • V případě přehledů kategorií produktů vždy používejte DimProductCategory k seskupení produktů odpovídajícím způsobem.
  • Při porovnávání prodejů mezi oblastmi použijte DimSalesTerritory přesné podrobnosti o území.
  • Slouží DimCurrency k normalizaci prodejních dat při analýze prodeje v různých měnách.
  • Podrobné informace o produktu potřebujete vždy spojit FactInternetSales s DimProduct.
  • Umožňuje DimPromotion analyzovat efektivitu různých propagačních kampaní.
  • V případě výkonu prodejce se zaměřte na celkovou částku prodeje a ne jenom na počet prodaných produktů.
  • Při analýze trendů v průběhu času použijte FactInternetSales a připojte se DimDate k seskupení dat podle měsíců, čtvrtletí nebo roku.
  • Vždy zkontrolujte konzistenci dat spojením FactInternetSales s odpovídajícími tabulkami dimenzí.
  • K agregaci prodejních dat použijte sumu, abyste měli jistotu, že přesně zachytáváte celkové hodnoty.
  • Určete prioritu metrik výnosů z prodeje oproti množství objednávek, abyste mohli přesně posoudit finanční dopad.
  • Pokud chcete získat podrobné přehledy, vždy seskupte podle relevantních dimenzí (například podle produktu, zákazníka, data).
  • Když se zobrazí dotaz na demografické údaje zákazníků, připojte se DimCustomer k relevantním tabulkám faktů.
  • V případě prodeje po povýšení se připojte ke DimPromotion skupině a seskupte FactInternetSales podle názvu povýšení.
  • Normalizuje údaje o prodeji pomocí DimCurrency porovnání s různými měnami.
  • Pomocí ORDER BY klauzulí můžete výsledky seřadit podle metriky zájmu (například výnosy z prodeje, celkové objednávky).
  • ListPrice v DimProduct je navržená prodejní cena, zatímco UnitPrice in FactInternetSales a FactResellerSales je skutečná cena, za kterou byla každá jednotka prodána. Pro většinu případů použití výnosů by se měla použít jednotková cena.
  • Rank top resellers by sales amount.Rank top resellers by sales amount.

Pokud tento text zkopírujete do poznámek pro textové pole modelu, AI při vygenerování dotazů SQL odkazuje na tyto pokyny.

Uveďte příklady

Kromě pokynů slouží příklady jako další efektivní způsob, jak řídit AI. Pokud máte otázky, které vaše dovednost AI často dostává nebo otázky, které vyžadují složité spojení, zvažte přidání příkladů pro ně.

Například otázka , kolik aktivních zákazníků má 1. června 2013 vygeneruje platný SQL, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky znázorňující první příklad aktivní otázky týkající se počtu zákazníků a umělé inteligence

Není to ale dobrá odpověď.

Součástí problému je, že aktivní zákazník nemá formální definici. Další pokyny v poznámkách k textovému poli modelu můžou pomoct, ale uživatelé můžou tuto otázku často klást. Musíte se ujistit, že AI tuto otázku zpracovává správně. Relevantní dotaz je středně složitý, takže zadejte příklad výběrem tlačítka pro úpravy.

Snímek obrazovky znázorňující, kde můžete upravit příklady, které zadáte umělé inteligenci

Pak můžete nahrát příklad.

Snímek obrazovky znázorňující příklad dotazu SQL dovednosti AI

Opakování otázky vrátí vylepšenou odpověď.

Snímek obrazovky znázorňující druhou ukázkovou otázku týkající se aktivního počtu zákazníků v umělé inteligenci

Příklady můžete přidat ručně, ale můžete je také nahrát ze souboru JSON. Poskytnutí příkladů ze souboru je užitečné, když máte mnoho dotazů SQL, které chcete nahrát najednou, místo ručního nahrání dotazů po jednom. V tomto cvičení použijte tyto příklady:

{
    "how many active customers did we have June 1st, 2010?": "SELECT COUNT(DISTINCT fis.CustomerKey) AS ActiveCustomerCount FROM factinternetsales fis JOIN dimdate dd ON fis.OrderDateKey = dd.DateKey WHERE dd.FullDateAlternateKey BETWEEN DATEADD(MONTH, -6, '2010-06-01') AND '2010-06-01' GROUP BY fis.CustomerKey HAVING COUNT(fis.SalesOrderNumber) >= 2;",
    "which promotion was the most impactful?": "SELECT dp.EnglishPromotionName, SUM(fis.SalesAmount) AS PromotionRevenue FROM factinternetsales fis JOIN dimpromotion dp ON fis.PromotionKey = dp.PromotionKey GROUP BY dp.EnglishPromotionName ORDER BY PromotionRevenue DESC;",
    "who are the top 5 customers by total sales amount?": "SELECT TOP 5 CONCAT(dc.FirstName, ' ', dc.LastName) AS CustomerName, SUM(fis.SalesAmount) AS TotalSpent FROM factinternetsales fis JOIN dimcustomer dc ON fis.CustomerKey = dc.CustomerKey GROUP BY CONCAT(dc.FirstName, ' ', dc.LastName) ORDER BY TotalSpent DESC;",
    "what is the total sales amount by year?": "SELECT dd.CalendarYear, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimdate dd ON fis.OrderDateKey = dd.DateKey GROUP BY dd.CalendarYear ORDER BY dd.CalendarYear;",
    "which product category generated the highest revenue?": "SELECT dpc.EnglishProductCategoryName, SUM(fis.SalesAmount) AS CategoryRevenue FROM factinternetsales fis JOIN dimproduct dp ON fis.ProductKey = dp.ProductKey JOIN dimproductcategory dpc ON dp.ProductSubcategoryKey = dpc.ProductCategoryKey GROUP BY dpc.EnglishProductCategoryName ORDER BY CategoryRevenue DESC;",
    "what is the average sales amount per order by territory?": "SELECT dst.SalesTerritoryRegion, AVG(fis.SalesAmount) AS AvgOrderValue FROM factinternetsales fis JOIN dimsalesterritory dst ON fis.SalesTerritoryKey = dst.SalesTerritoryKey GROUP BY dst.SalesTerritoryRegion ORDER BY AvgOrderValue DESC;",
    "what is the total sales amount by currency?": "SELECT dc.CurrencyName, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimcurrency dc ON fis.CurrencyKey = dc.CurrencyKey GROUP BY dc.CurrencyName ORDER BY TotalSales DESC;",
    "which product had the highest sales revenue last year?": "SELECT dp.EnglishProductName, SUM(fis.SalesAmount) AS TotalRevenue FROM factinternetsales fis JOIN dimproduct dp ON fis.ProductKey = dp.ProductKey JOIN dimdate dd ON fis.ShipDateKey = dd.DateKey WHERE dd.CalendarYear = YEAR(GETDATE()) - 1 GROUP BY dp.EnglishProductName ORDER BY TotalRevenue DESC;",
    "what are the monthly sales trends for the last year?": "SELECT dd.CalendarYear, dd.MonthNumberOfYear, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimdate dd ON fis.ShipDateKey = dd.DateKey WHERE dd.CalendarYear = YEAR(GETDATE()) - 1 GROUP BY dd.CalendarYear, dd.MonthNumberOfYear ORDER BY dd.CalendarYear, dd.MonthNumberOfYear;",
    "how did the latest promotion affect sales revenue?": "SELECT dp.EnglishPromotionName, SUM(fis.SalesAmount) AS PromotionRevenue FROM factinternetsales fis JOIN dimpromotion dp ON fis.PromotionKey = dp.PromotionKey WHERE dp.StartDate >= DATEADD(MONTH, 0, GETDATE()) GROUP BY dp.EnglishPromotionName ORDER BY PromotionRevenue DESC;",
    "which territory had the highest sales revenue?": "SELECT dst.SalesTerritoryRegion, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimsalesterritory dst ON fis.SalesTerritoryKey = dst.SalesTerritoryKey GROUP BY dst.SalesTerritoryRegion ORDER BY TotalSales DESC;",
    "who are the top 5 resellers by total sales amount?": "SELECT TOP 5 dr.ResellerName, SUM(frs.SalesAmount) AS TotalSales FROM factresellersales frs JOIN dimreseller dr ON frs.ResellerKey = dr.ResellerKey GROUP BY dr.ResellerName ORDER BY TotalSales DESC;",
    "what is the total sales amount by customer region?": "SELECT dg.EnglishCountryRegionName, SUM(fis.SalesAmount) AS TotalSales FROM factinternetsales fis JOIN dimcustomer dc ON fis.CustomerKey = dc.CustomerKey JOIN dimgeography dg ON dc.GeographyKey = dg.GeographyKey GROUP BY dg.EnglishCountryRegionName ORDER BY TotalSales DESC;",
    "which product category had the highest average sales price?": "SELECT dpc.EnglishProductCategoryName, AVG(fis.UnitPrice) AS AvgPrice FROM factinternetsales fis JOIN dimproduct dp ON fis.ProductKey = dp.ProductKey JOIN dimproductcategory dpc ON dp.ProductSubcategoryKey = dpc.ProductCategoryKey GROUP BY dpc.EnglishProductCategoryName ORDER BY AvgPrice DESC;"
}

Testování a revize dovednosti AI

Do dovednosti AI byly přidány pokyny i příklady. Při dalším testování mohou další příklady a pokyny ještě více zlepšit dovednosti AI. Spolupracujte se svými kolegy a zjistěte, jestli jste zadali příklady a pokyny, které se týkají typů otázek, které se mají zeptat.

Použití dovednosti AI prostřednictvím kódu programu

Dovednosti AI můžete použít programově v poznámkovém bloku Fabric. Pokud chcete zjistit, jestli má dovednost AI publikovanou hodnotu adresy URL, vyberte Nastavení, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky s výběrem nastavení dovedností AI

Před publikováním dovednosti AI nemá publikovanou hodnotu adresy URL, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky znázorňující, že dovednost AI nemá před publikováním publikovanou hodnotu adresy URL

Po ověření výkonu dovednosti AI se můžete rozhodnout, že ji publikujete. V tomto případě vyberte Publikovat, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky znázorňující výběr možnosti Publikovat

Zobrazí se publikovaná adresa URL dovednosti AI, jak je znázorněno na tomto snímku obrazovky:

Snímek obrazovky zobrazující publikovanou adresu URL

Pak můžete zkopírovat publikovanou adresu URL a použít ji v poznámkovém bloku Infrastruktury. Tímto způsobem můžete dotazovat dovednosti AI voláním rozhraní API pro dovednosti AI v poznámkovém bloku Fabric. Vložte zkopírovanou adresu URL do tohoto fragmentu kódu. Pak nahraďte otázku libovolným dotazem, který je relevantní pro vaši dovednost umělé inteligence. Tento příklad se používá \<generic published URL value\> jako adresa URL.

import requests
import json
import pprint
from synapse.ml.mlflow import get_mlflow_env_config


# the URL could change if the workspace is assigned to a different capacity
url = "https://<generic published URL value>"

configs = get_mlflow_env_config()

headers = {
    "Authorization": f"Bearer {configs.driver_aad_token}",
    "Content-Type": "application/json; charset=utf-8"
}

question = "{userQuestion: \"what is an example product?\"}"

response = requests.post(url, headers=headers, data = question)

print("RESPONSE: ", response)

print("")

response = json.loads(response.content)

print(response["result"])