Eksempel på AI-færdigheder med datasættet AdventureWorks (prøveversion)
I denne artikel kan du se, hvordan du konfigurerer en AI-færdighed i datasættet AdventureWorks.
Vigtigt
Denne funktion er en prøveversion.
Forudsætninger
- En betalt F64-ressource eller en højere Fabric-kapacitetsressource.
- Lejerkontakt for AI-færdigheder er aktiveret.
- Skift af copilotlejer er aktiveret.
- Deling på tværs af geografiske områder for kunstig intelligens er aktiveret, hvis det er relevant.
Opret et lakehouse med AdventureWorksDW
Først skal du oprette et lakehouse og udfylde det med de nødvendige data.
Hvis du allerede har en forekomst af AdventureWorksDW i et lager eller lakehouse, kan du springe dette trin over. Hvis ikke, skal du oprette et lakehouse ud fra en notesbog. Brug notesbogen til at udfylde lakehouse med dataene.
Opret en ny notesbog i arbejdsområdet, hvor du vil oprette dine AI-færdigheder.
Vælg + Datakilder i venstre side af ruden Stifinder. Denne indstilling tilføjer et eksisterende lakehouse eller opretter et nyt lakehouse.
Tilføj følgende kodestykke i den øverste celle:
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)
Vælg Kør alle.
Efter et par minutter udfyldes lakehouse med de nødvendige data.
Opret en AI-færdighed
Hvis du vil oprette en ny AI-færdighed, skal du gå til datavidenskabsoplevelsen og vælge AI-færdigheder.
Angiv et navn for at oprette en AI-færdighed.
Vælg dataene
Vælg det lakehouse, du har oprettet, og vælg Opret forbindelse. Du skal derefter vælge de tabeller, som ai-færdighederne skal have adgang til.
I denne øvelse bruges følgende tabeller:
DimCustomer
DimDate
DimGeography
DimProduct
DimProductCategory
DimPromotion
DimReseller
DimSalesTerritory
FactInternetSales
FactResellerSales
Angiv instruktioner
Når du først stiller spørgsmål om AI-færdigheder med de viste tabeller valgt, svarer AI-dygtigheden dem temmelig godt. For spørgsmålet Hvad er det mest solgte produkt?, returnerer AI-færdighederne:
Long-Sleeve Logo Jersey, L
SQL-forespørgslen skal dog forbedres. Først kigger den kun på tabellen FactResellerSales
. Tabellen ignoreres FactInternetSales
. For det andet sorteres produkterne efter ordreantal, når den samlede salgsindtægt, der er knyttet til produktet, er den vigtigste overvejelse, som vist på dette skærmbillede:
Hvis du vil forbedre oprettelsen af forespørgslen, skal du angive nogle instruktioner, som vist i disse eksempler:
- Når jeg spørger om "de mest solgte" produkter eller varer, er metrikværdien af interesse den samlede salgsindtægt og ikke ordreantal.
- Den primære tabel, der skal bruges, er
FactInternetSales
.FactResellerSales
Brug kun, hvis du udtrykkeligt bliver spurgt om videresalg, eller når du bliver spurgt om det samlede salg.
Hvis du stiller spørgsmålet igen, returneres et andet svar, Mountain-200 Black, 46
som vist på dette skærmbillede:
Den tilsvarende SQL henter tabellen FactInternetSales
og sorterer efter summen af salgsbeløbet. Ai'en fulgte instruktionerne.
Når du fortsætter med at eksperimentere med forespørgsler, skal du tilføje flere instruktioner.
I dette scenarie bruges følgende sæt instruktioner:
- Når jeg spørger om "de mest solgte" produkter eller varer, er metrikværdien af interesse salgsindtægter og ikke ordreantal.
- Den primære tabel, der skal bruges, er
FactInternetSales
.FactResellerSales
Brug kun, hvis du udtrykkeligt bliver spurgt om videresalg, eller når du bliver spurgt om det samlede salg. - Når du bliver spurgt om virkningen af kampagner, skal du gøre det på stigningen i salgsindtægterne og ikke kun antallet af solgte enheder.
- For kundeindsigt skal du fokusere på det samlede salgsbeløb pr. kunde i stedet for antallet af ordrer.
- Bruges
DimDate
til at udtrække bestemte tidsperioder (f.eks. år, måned), når der udføres tidsbaserede analyser. - Når du analyserer geografiske data, skal du prioritere den samlede salgsindtægt og det gennemsnitlige salg pr. ordre for hvert område.
- Hvis du vil have indsigt i produktkategorier, skal du altid bruge
DimProductCategory
til at gruppere produkter i overensstemmelse hermed. - Når du sammenligner salg mellem områder, skal du bruge
DimSalesTerritory
for at få nøjagtige områdeoplysninger. - Bruges
DimCurrency
til at normalisere salgsdata, hvis du analyserer salg i forskellige valutaer. - Hvis du vil have detaljerede produktoplysninger, skal du altid deltage i
FactInternetSales
DimProduct
. - Bruges
DimPromotion
til at analysere effektiviteten af forskellige kampagnekampagner. - For forhandlerens ydeevne skal du fokusere på det samlede salgsbeløb og ikke kun antallet af solgte produkter.
- Når du analyserer tendenser over tid, kan du bruge
FactInternetSales
og deltage iDimDate
gruppering af data efter måned, kvartal eller år. - Kontrollér altid, om dataene er ensartede, ved at forbinde
FactInternetSales
dem med de tilsvarende dimensionstabeller. - Brug SUM til at aggregere salgsdata for at sikre, at du registrerer de samlede værdier nøjagtigt.
- Prioriter metrikværdier for salgsindtægter i forhold til ordreantal for at måle den økonomiske indvirkning nøjagtigt.
- Gruppér altid efter relevante dimensioner (f.eks. produkt, kunde, dato) for at få detaljeret indsigt.
- Når du bliver spurgt om kundedemografi, kan du deltage i
DimCustomer
relevante faktatabeller. - I forbindelse med
DimPromotion
salg efter kampagne skal du deltage i og gruppereFactInternetSales
efter kampagnenavn. - Normaliser salgstal ved hjælp af
DimCurrency
sammenligninger, der involverer forskellige valutaer. - Brug
ORDER BY
delsætninger til at sortere resultater efter metrikværdien af interesse (f.eks. salgsindtægter, samlede ordrer). ListPrice
iDimProduct
er den foreslåede salgspris, mensUnitPrice
FactInternetSales
i ogFactResellerSales
er den faktiske pris, som hver enhed blev solgt til. I de fleste use cases om indtægt skal enhedsprisen bruges.- Ranger topforhandlere efter salgsbeløb.
Hvis du kopierer denne tekst til noterne til tekstfeltet model, henviser AI'en til disse instruktioner, når den genererer dens SQL-forespørgsler.
Angiv eksempler
Ud over instruktioner fungerer eksempler som en anden effektiv måde at vejlede AI på. Hvis du har spørgsmål, som dine AI-færdigheder ofte modtager, eller spørgsmål, der kræver komplekse joinforbindelser, kan du overveje at tilføje eksempler til dem.
Spørgsmålet Hvor mange aktive kunder har vi f.eks. den 1. juni 2013 , genererer nogle gyldige SQL-værdier, som vist på dette skærmbillede:
Men det er ikke et godt svar.
En del af problemet er, at "aktiv kunde" ikke har en formel definition. Flere instruktioner i noterne til tekstfeltet model kan måske hjælpe, men brugerne kan ofte stille dette spørgsmål. Du skal sikre dig, at AI'en håndterer spørgsmålet korrekt. Den relevante forespørgsel er moderat kompleks, så angiv et eksempel ved at vælge redigeringsknappen.
Derefter kan du uploade et eksempel.
En gentagelse af spørgsmålet returnerer et forbedret svar.
Du kan tilføje eksempler manuelt, men du kan også uploade dem fra en JSON-fil. Det er nyttigt at angive eksempler fra en fil, når du har mange SQL-forespørgsler, som du vil overføre på én gang, i stedet for manuelt at uploade forespørgslerne én efter én. I denne øvelse skal du bruge følgende eksempler:
{
"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;"
}
Test og rediger AI-færdigheden
Både instruktioner og eksempler blev føjet til AI-færdigheden. Efterhånden som testen fortsætter, kan flere eksempler og instruktioner forbedre AI-færdighederne yderligere. Arbejd sammen med dine kolleger for at se, om du har angivet eksempler og instruktioner, der dækker den type spørgsmål, de vil stille.
Brug AI-færdighederne programmeringsmæssigt
Du kan bruge AI-færdighederne programmeringsmæssigt i en Fabric-notesbog. Hvis du vil finde ud af, om AI-færdigheden har en publiceret URL-værdi eller ej, skal du vælge Indstillinger som vist på dette skærmbillede:
Før du publicerer AI-færdigheden, har den ikke en publiceret URL-værdi, som vist på dette skærmbillede:
Når du har valideret ydeevnen for AI-færdighederne, kan du vælge at publicere den. I dette tilfælde skal du vælge Publicer som vist på dette skærmbillede:
Den publicerede URL-adresse til AI-færdigheden vises som vist på dette skærmbillede:
Du kan derefter kopiere den publicerede URL-adresse og bruge den i Fabric-notesbogen. På denne måde kan du forespørge ai-færdighederne ved at foretage kald til AI-færdigheds-API'en i en Fabric-notesbog. Indsæt den kopierede URL-adresse i dette kodestykke. Erstat derefter spørgsmålet med en hvilken som helst forespørgsel, der er relevant for dine AI-færdigheder. Dette eksempel bruger \<generic published URL value\>
som URL-adresse.
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"])