Del via


Eksempel på kunstig intelligens med AdventureWorks-datasettet (forhåndsversjon)

Denne artikkelen viser hvordan du konfigurerer en ai-ferdighet på AdventureWorks-datasettet.

Viktig

Denne funksjonen er i forhåndsvisning.

Forutsetning

Opprett et lakehouse med AdventureWorksDW

Først oppretter du et lakehouse og fyller det ut med de nødvendige dataene.

Hvis du allerede har en forekomst av AdventureWorksDW i et lager eller lakehouse, kan du hoppe over dette trinnet. Hvis ikke, kan du opprette et lakehouse fra en notatblokk. Bruk notatblokken til å fylle ut lakehouse med dataene.

  1. Opprett en ny notatblokk i arbeidsområdet der du vil opprette ai-ferdighetene dine.

  2. Velg + Datakilder til venstre i Explorer-ruten. Dette alternativet legger til et eksisterende lakehouse eller oppretter et nytt lakehouse.

  3. Legg til følgende kodesnutt i den øverste cellen:

    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. Velg Kjør alle.

    Skjermbilde som viser en notatblokk med opplastingskoden AdventureWorks.

Etter noen minutter fylles lakehouse med de nødvendige dataene.

Opprett en AI-ferdighet

  1. Hvis du vil opprette en ny ai-ferdighet, kan du gå til Data Science-opplevelsen og velge AI Skill.

    Skjermbilde som viser hvor du kan opprette kunstig intelligens-ferdigheter.

  2. Skriv inn et navn for å opprette en ai-ferdighet.

Velg dataene

Velg lakehouse du opprettet, og velg Koble til. Deretter må du velge tabellene du vil at AI-ferdighetene skal ha tilgjengelig tilgang til.

Denne øvelsen bruker disse tabellene:

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

Gi instruksjoner

Når du først stiller ai-ferdighetsspørsmålene med de oppførte tabellene valgt, svarer AI-ferdigheten dem ganske bra. For spørsmålet Hva er for eksempel det mest solgte produktet? Ai-ferdigheten returnerer:

  • Long-Sleeve Logo Jersey, L

SQL-spørringen trenger imidlertid noen forbedringer. Først ser den FactResellerSales bare på tabellen. Den ignorerer tabellen FactInternetSales . For det andre, det bestiller produktene etter ordreantall, når totale salgsinntekter knyttet til produktet er det viktigste hensynet, som vist i dette skjermbildet:

Skjermbilde som viser det første eksemplet ai ferdighet høyeste salg produktspørsmål.

Hvis du vil forbedre spørringsgenereringen, kan du gi noen instruksjoner, som vist i disse eksemplene:

  • Når jeg spør om «de mest solgte» produktene eller varene, er måleverdien av renter totale salgsinntekter og ikke ordreantall.
  • Den primære tabellen som skal brukes, er FactInternetSales. FactResellerSales Bruk bare hvis du eksplisitt blir spurt om videresalg eller når du blir spurt om totalt salg.

Når du stiller spørsmålet på nytt, returneres et annet svar, Mountain-200 Black, 46som vist i dette skjermbildet:

Skjermbilde som viser det andre eksemplet ai ferdighet høyeste salg produktspørsmål.

Den tilsvarende SQL-en trekker fra FactInternetSales tabellen, og sorteres etter summen av salgsbeløpet. AI-en fulgte instruksjonene.

Etter hvert som du fortsetter å eksperimentere med spørringer, bør du legge til flere instruksjoner.

Dette scenarioet bruker følgende sett med instruksjoner:

  • Når jeg spør om «de mest solgte» produktene eller varene, er måleverdien av renter salgsinntekter og ikke ordreantall.
  • Den primære tabellen som skal brukes, er FactInternetSales. FactResellerSales Bruk bare hvis du eksplisitt blir spurt om videresalg eller når du blir spurt om totalt salg.
  • Når du blir spurt om virkningen av kampanjer, gjør du det på økningen i salgsinntektene, ikke bare antall solgte enheter.
  • Fokuser på det totale salgsbeløpet per kunde i stedet for antall ordrer for kundeinnsikt.
  • Brukes DimDate til å trekke ut bestemte tidsperioder (for eksempel år, måned) når du utfører tidsbasert analyse.
  • Når du analyserer geografiske data, prioriterer du totale salgsinntekter og gjennomsnittlig salg per ordre for hvert område.
  • Bruk alltid DimProductCategory til å gruppere produkter tilsvarende for produktkategoriinnsikt.
  • Når du sammenligner salg mellom områder, kan du bruke DimSalesTerritory for nøyaktige distriktsdetaljer.
  • Brukes DimCurrency til å normalisere salgsdata hvis du analyserer salg i ulike valutaer.
  • Hvis du vil ha detaljert produktinformasjon, må du alltid bli FactInternetSales med DimProduct.
  • Bruk DimPromotion denne til å analysere effektiviteten til ulike kampanjekampanjer.
  • For forhandlerytelse, fokuser på totalt salgsbeløp og ikke bare antall solgte produkter.
  • Når du analyserer trender over tid, kan du bruke FactInternetSales og bli med DimDate for å gruppere data etter måned, kvartal eller år.
  • Se alltid etter datakonsekvens ved å FactInternetSales bli med i de tilsvarende dimensjonstabellene.
  • Bruk SUMMER for å aggregere salgsdata for å sikre at du registrerer totalverdier nøyaktig.
  • Prioriter salgsinntektsdata over ordreantall for å måle den økonomiske innvirkningen nøyaktig.
  • Grupper alltid etter relevante dimensjoner (for eksempel produkt, kunde, dato) for å få detaljert innsikt.
  • Når du blir spurt om kundedemografi, kan du bli DimCustomer med i relevante faktatabeller.
  • For salg etter kampanje kan du bli FactInternetSales med DimPromotion og gruppere etter kampanjenavn.
  • Normaliser salgstall ved bruk av DimCurrency sammenligninger som involverer ulike valutaer.
  • Bruk ORDER BY setninger til å sortere resultatene etter måleverdien for renter (for eksempel salgsinntekter, totale ordrer).
  • ListPrice i DimProduct er den foreslåtte salgsprisen, mens UnitPrice i FactInternetSales og FactResellerSales er den faktiske prisen som hver enhet ble solgt. For de fleste brukstilfeller på omsetning bør enhetsprisen brukes.
  • Ranger toppforhandlere etter salgsbeløp.

Hvis du kopierer denne teksten til notatene for modelltekstboksen, refererer AI-en til disse instruksjonene når den genererer SQL-spørringene.

Gi eksempler

I tillegg til instruksjoner fungerer eksempler som en annen effektiv måte å veilede AI på. Hvis du har spørsmål som ai-ferdigheten ofte mottar, eller spørsmål som krever komplekse sammenføyninger, kan du vurdere å legge til eksempler for dem.

Spørsmålet hvor mange aktive kunder hadde vi 1. juni 2013 genererer for eksempel en gyldig SQL, som vist i dette skjermbildet:

Skjermbilde som viser det første eksemplet spørsmål om ai-kompetanse som er aktiv kundeantall.

Det er imidlertid ikke et godt svar.

En del av problemet er at «aktiv kunde» ikke har en formell definisjon. Flere instruksjoner i tekstboksen notater til modellen kan hjelpe, men brukere kan ofte stille dette spørsmålet. Du må sørge for at AI-en håndterer spørsmålet riktig. Den relevante spørringen er moderat kompleks, så gi et eksempel ved å velge rediger-knappen.

Skjermbilde som viser hvor du kan redigere eksemplene du gir ai.

Deretter kan du laste opp et eksempel.

Skjermbilde som viser et eksempel på SQL-spørring for AI-ferdigheter.

En gjentakelse av spørsmålet returnerer et forbedret svar.

Skjermbilde som viser det andre eksemplet ai ferdighet aktiv kundeantall spørsmål.

Du kan legge til eksempler manuelt, men du kan også laste dem opp fra en JSON-fil. Det er nyttig å gi eksempler fra en fil når du har mange SQL-spørringer som du vil laste opp samtidig, i stedet for å laste opp spørringene manuelt én etter én. Bruk disse eksemplene for denne øvelsen:

{
    "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;"
}

Teste og revidere AI-ferdigheten

Både instruksjoner og eksempler ble lagt til ai-ferdigheten. Etter hvert som testingen fortsetter, kan flere eksempler og instruksjoner forbedre AI-ferdighetene ytterligere. Samarbeid med kollegene dine for å se om du har gitt eksempler og instruksjoner som dekker hva slags spørsmål de vil stille.

Bruke AI-ferdigheter programmatisk

Du kan bruke kunstig intelligens programmatisk i en Fabric-notatblokk. Hvis du vil finne ut om AI-ferdigheten har en publisert nettadresseverdi, velger du Innstillinger, som vist i dette skjermbildet:

Skjermbilde som viser utvalg av ferdighetsinnstillinger for kunstig intelligens.

Før du publiserer AI-ferdigheten, har den ikke en publisert nettadresseverdi, som vist i dette skjermbildet:

Skjermbilde som viser at en AI-ferdighet ikke har en publisert nettadresseverdi før publisering.

Når du har validert ytelsen til AI-ferdigheten, kan det hende du bestemmer deg for å publisere den. I dette tilfellet velger du Publiser, som vist i dette skjermbildet:

Skjermbilde som viser valg av alternativet Publiser.

Den publiserte nettadressen for AI-ferdigheten vises, som vist i dette skjermbildet:

Skjermbilde som viser den publiserte URL-adressen.

Deretter kan du kopiere den publiserte nettadressen og bruke den i Fabric-notatblokken. På denne måten kan du spørre ai-ferdigheten ved å ringe til AI-kompetanse-API-en i en Fabric-notatblokk. Lim inn den kopierte URL-adressen i kodesnutten. Deretter erstatter du spørsmålet med alle spørringer som er relevante for ai-ferdighetene dine. Dette eksemplet brukes \<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"])