Príklad zručností umelej inteligencie s množinou údajov AdventureWorks (ukážka)
Tento článok popisuje, ako nakonfigurovať zručnosti AI pre množinu údajov AdventureWorks.
Dôležité
Táto funkcia je vo verzii Preview.
Požiadavky
- Platený zdroj kapacity služby F64 alebo vyššia verzia služby Fabric.
- Prepínač nájomníka zručností umelej inteligencie je povolený.
- Prepínač nájomníka kopilotu je povolený.
- Zdieľanie krížovej geografickej polohy pre umelú inteligenciu je v prípade potreby povolené.
Vytvorenie služby Lakehouse pomocou databázy AdventureWorksDW
Najskôr vytvorte jazero a osídľujte ho potrebnými údajmi.
Ak už máte inštanciu AdventureWorksDW v sklade alebo v službe Lakehouse, môžete tento krok preskočiť. Ak nie, vytvorte lakehouse z notebooku. Poznámkový blok použite na naplnenie jazera údajmi.
Vytvorte nový poznámkový blok v pracovnom priestore, v ktorom chcete vytvoriť zručnosti umelej inteligencie.
Na ľavej strane tably Prieskumník vyberte položku + Zdroje údajov. Táto možnosť pridá existujúci lakehouse alebo vytvorí nový lakehouse.
Do hornej bunky pridajte nasledujúci úryvok 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)
Vyberte položku Spustiť všetko.
Po niekoľkých minútach sa v komplexe lakehouse vyplnia potrebné údaje.
Vytvorenie zručností umelej inteligencie
Ak chcete vytvoriť novú odbornosť umelej inteligencie, najskôr vyberte položku Nová položka, ako je to znázornené na tejto snímke obrazovky:
Na ďalšej obrazovke zadajte
AI skill do pravého horného textového poľa a vyberteAI Skill (ukážka) vľavo, ako je to znázornené na tejto snímke obrazovky: Zadajte názov na vytvorenie zručností umelej inteligencie a vyberte položku Create.
Výber údajov
Vyberte objekt lakehouse, ktorý ste vytvorili, a vyberte položku Pripojiť. Potom musíte vybrať tabuľky, pre ktoré chcete mať zručnosti umelej inteligencie k dispozícii.
V tomto cvičení sa používajú tieto tabuľky:
DimCustomer
DimDate
DimGeography
DimProduct
DimProductCategory
DimPromotion
DimReseller
DimSalesTerritory
FactInternetSales
FactResellerSales
Zadanie pokynov
Keď najprv položíte otázky týkajúce sa zručností umelej inteligencie s vybratými uvedenými tabuľkami, odbornosť umelej inteligencie na ne odpovedá pomerne dobre. Napríklad na otázku What is the most sold product? (Ktorý je najpredávanejší produkt?), funkcia zručností umelej inteligencie vráti:
Long-Sleeve Logo Jersey, L
Dotaz SQL však vyžaduje určité zlepšenie. Najprv sa pozrie len na tabuľku FactResellerSales
. Ignoruje tabuľku FactInternetSales
. Po druhé, produkty sa zoradia podľa množstva objednávok, keď sú k produktu najdôležitejšie celkové výnosy z predaja, ako môžete vidieť na tejto snímke obrazovky:
Ak chcete zlepšiť generovanie dotazu, zadajte niekoľko pokynov, ako je znázornené v týchto príkladoch:
- Vždy, keď sa spýtam na "najpredávanejšie" produkty alebo položky, metrika úrokov je celkový výnos z predaja a nie množstvo objednávok.
- Primárna tabuľka, ktorá sa má použiť, je
FactInternetSales
. PoužívajteFactResellerSales
iba v prípade, že sa explicitne pýtali na predaj, alebo keď sa ho pýtali na celkový predaj.
Položenie otázky opäť vráti inú odpoveď, Mountain-200 Black, 46
ako je to znázornené na tejto snímke obrazovky:
Príslušný SQL čerpá z FactInternetSales
tabuľky a zoradí ho podľa súčtu objemov predaja. Umelá inteligencia postupovali podľa pokynov.
Ak budete naďalej experimentovať s dotazmi, mali by ste pridať ďalšie pokyny.
V tomto scenári sa používa nasledujúca množina pokynov:
- Vždy, keď sa spýtam na "najpredávanejšie" produkty alebo položky, metrika úrokov je výnos z predaja a nie množstvo objednávok.
- Primárna tabuľka, ktorá sa má použiť, je
FactInternetSales
. PoužívajteFactResellerSales
iba v prípade, že sa explicitne pýtali na predaj, alebo keď sa ho pýtali na celkový predaj. - Na otázku o vplyve propagácie tak urobte na zvýšenie výnosov z predaja, nielen na počet predaných jednotiek.
- V prípade prehľadov zákazníkov sa zamerajte na celkovú čiastku predaja na zákazníka a nie na počet objednávok.
- Pomocou môžete
DimDate
extrahovať konkrétne časové obdobia (napríklad rok, mesiac) pri vykonávaní analýzy založenej na čase. - Pri analýze geografických údajov uprednostnite celkové výnosy z predaja a priemerný predaj na objednávku pre každú oblasť.
- V prípade prehľadov kategórií produktov sa vždy používa
DimProductCategory
na zodpovedajúcim zoskupovanie produktov. - Pri porovnávaní predaja medzi oblasťami použite
DimSalesTerritory
presnú podrobnosti územia. - Používa
DimCurrency
sa na normalizáciu údajov o predaji, ak analyzujete predaj v rôznych menách. - Podrobné informácie o produkte získate vždy po pripojení k
FactInternetSales
.DimProduct
- Používa
DimPromotion
sa na analýzu účinnosti rôznych propagačných kampaní. - V prípade výkonu predajcu sa zamerajte na celkovú čiastku predaja a nielen na počet predaných produktov.
- Pri analýze trendov v priebehu času použite
FactInternetSales
a spojte sa soDimDate
skupinou údajov podľa mesiacov, štvrťrokov alebo rokov. - Vždy skontrolujte konzistenciu údajov spojením
FactInternetSales
so zodpovedajúcimi tabuľkami dimenzií. - Na presné zaznamenávanie celkových hodnôt použite funkciu SUM na agregovanie údajov o predaji.
- Stanoviť priority metriky výnosov z predaja pred množstvom objednávok, aby ste presne zhodnotili finančný vplyv.
- Ak chcete získať podrobné prehľady, vždy ich môžete zoskupiť podľa relevantných dimenzií (napríklad produkt, zákazník, dátum).
- Na otázku o demografii zákazníkov sa pripojte k
DimCustomer
relevantným tabuľkám faktov. - Pre predaj podľa propagácie, spojte sa a
FactInternetSales
zoskupteDimPromotion
podľa názvu propagácie. - Normalizujte údaje o predaji pomocou
DimCurrency
porovnaní zahŕňajúcich rôzne meny. - Použite
ORDER BY
klauzuly na zoradenie výsledkov podľa metriky úroku (napríklad výnosy z predaja, celkový počet objednávok). -
ListPrice
vDimProduct
predstavuje navrhovanú predajnú cenu aUnitPrice
FactInternetSales
FactResellerSales
predstavuje skutočnú cenu, za ktorú bola každá jednotka predávaná. V prípadoch použitia výnosov vo väčšine prípadov by sa mala použiť jednotková cena. - Poradie najpredávaných predajcov podľa čiastky predaja.
Ak skopírujete tento text do poznámok textového poľa modelu, umelá inteligencia pri generovaní svojich dotazov SQL odkazuje na tieto pokyny.
Uveďte príklady
Okrem pokynov slúžia príklady ako ďalší účinný spôsob, ako riadiť umelú inteligenciu. Ak máte otázky, ktoré zručnosti umelej inteligencie často dostávajú alebo otázky, ktoré vyžadujú zložité spojenia, zvážte pridanie príkladov.
Napríklad otázka Koľko aktívnych zákazníkov sme mali 1. júna 2013 , vygeneruje platný SQL, ako je to znázornené na tejto snímke obrazovky:
Nie je to však dobrá odpoveď.
Časť problému spočíva v tom, že "aktívny zákazník" nemá formálnu definíciu. Ďalšie pokyny v poznámkach k textovému poľu modelu môžu pomôcť, ale používatelia môžu často klásť túto otázku. Musíte zabezpečiť, aby AI spracovala otázku správne. Relevantný dotaz je mierne zložitý, takže môžete uviesť príklad výberom tlačidla Upraviť.
Potom môžete nahrať príklad.
Opakovaním otázky sa vráti vylepšená odpoveď.
Príklady môžete pridať manuálne, ale môžete ich tiež nahrať zo súboru JSON. Poskytnutie príkladov zo súboru je užitočné, ak máte veľa dotazov SQL, ktoré chcete nahrať všetky naraz, namiesto manuálneho nahrávania dotazov po jednom. V tomto cvičení použite tieto prí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;"
}
Testovanie a revízia zručností umelej inteligencie
Do zručností umelej inteligencie boli pridané pokyny aj príklady. S postupným testovaním môže rozvoj zručností umelej inteligencie ešte viac zlepšiť ďalšie príklady a pokyny. Spolupracujte s kolegami a zistite, či ste poskytli príklady a pokyny, ktoré sa týkajú typov otázok, ktoré chcú položiť.
Používanie zručností umelej inteligencie pomocou programovania
Zručnosti umelej inteligencie môžete využiť pomocou programovania v poznámkovom bloku služby Fabric. Ak chcete zistiť, či zručnosť umelej inteligencie má publikovanú hodnotu URL adresy, vyberte položku Nastavenia, ako je znázornené na tejto snímke obrazovky:
Pred publikovaním zručnosti umelej inteligencie nemá publikovanú hodnotu URL adresy, ako je to znázornené na tejto snímke obrazovky:
Po overení výkonu zručností AI sa môžete rozhodnúť, že ju publikujete. V tomto prípade vyberte možnosť Publikovať, ako je to znázornené na tejto snímke obrazovky:
Zobrazí sa publikovaná URL adresa zručností umelej inteligencie, ako je znázornené na tejto snímke obrazovky:
Potom môžete publikovanú URL adresu skopírovať a použiť ju v poznámkovom bloku služby Fabric. Týmto spôsobom môžete získavať dotazy na zručnosti umelej inteligencie prostredníctvom volaní rozhrania API zručností umelej inteligencie v notebooku služby Fabric. Prilepte skopírovanú URL adresu do tohto úryvku kódu. Potom nahraďte otázku ľubovoľným dotazom relevantným pre vašu odbornosť ai. Tento príklad sa používa \<generic published URL value\>
ako URL adresa.
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"])