Del via


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

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.

  1. Opret en ny notesbog i arbejdsområdet, hvor du vil oprette dine AI-færdigheder.

  2. Vælg + Datakilder i venstre side af ruden Stifinder. Denne indstilling tilføjer et eksisterende lakehouse eller opretter et nyt lakehouse.

  3. 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)
    
  4. Vælg Kør alle.

    Skærmbillede, der viser en notesbog med uploadkoden til AdventureWorks.

Efter et par minutter udfyldes lakehouse med de nødvendige data.

Opret en AI-færdighed

  1. Hvis du vil oprette en ny AI-færdighed, skal du gå til datavidenskabsoplevelsen og vælge AI-færdigheder.

    Skærmbillede, der viser, hvor du kan oprette AI-færdigheder.

  2. 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:

Skærmbillede, der viser det første eksempel på ai-færdighed med det højeste salgsproduktspørgsmål.

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, 46som vist på dette skærmbillede:

Skærmbillede, der viser det andet eksempel på ai-færdighed med det højeste salgsproduktspørgsmål.

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 i DimDate 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 gruppere FactInternetSales 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 i DimProduct er den foreslåede salgspris, mens UnitPrice FactInternetSales i og FactResellerSales 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:

Skærmbillede, der viser det første eksempel på et aktivt spørgsmål om kundeoptælling af AI-færdigheder.

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.

Skærmbillede, der viser, hvor du kan redigere de eksempler, du angiver til AI.

Derefter kan du uploade et eksempel.

Skærmbillede, der viser et eksempel på SQL-forespørgsel om AI-færdigheder.

En gentagelse af spørgsmålet returnerer et forbedret svar.

Skærmbillede, der viser det andet eksempel på et aktivt spørgsmål om ai-færdighedsantal for kunder.

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:

Skærmbillede, der viser valg af ai-kompetenceindstillinger.

Før du publicerer AI-færdigheden, har den ikke en publiceret URL-værdi, som vist på dette skærmbillede:

Skærmbillede, der viser, at en AI-færdighed ikke har en publiceret URL-værdi før publicering.

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:

Skærmbillede, der viser valg af indstillingen Publicer.

Den publicerede URL-adresse til AI-færdigheden vises som vist på dette skærmbillede:

Skærmbillede, der viser den publicerede URL-adresse.

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"])