EXEMPEL på AI-kunskaper med AdventureWorks-datamängden (förhandsversion)
Den här artikeln visar hur du konfigurerar en AI-kompetens på AdventureWorks-datauppsättningen.
Viktigt!
Den här funktionen är i förhandsversion.
Förutsättningar
- En betald F64- eller högre infrastrukturkapacitetsresurs.
- Växling av AI-kompetensklient är aktiverad.
- Copilot-klientväxeln är aktiverad.
- Delning mellan geografiska områden för AI är aktiverat, om det är relevant.
Skapa ett sjöhus med AdventureWorksDW
Först skapar du ett sjöhus och fyller det med nödvändiga data.
Om du redan har en instans av AdventureWorksDW i ett lager eller lakehouse kan du hoppa över det här steget. Om inte skapar du ett sjöhus från en notebook-fil. Använd notebook-filen för att fylla lakehouse med data.
Skapa en ny notebook-fil på arbetsytan där du vill skapa din AI-kompetens.
Till vänster i fönstret Utforskaren väljer du + Datakällor. Det här alternativet lägger till ett befintligt sjöhus eller skapar ett nytt sjöhus.
Lägg till följande kodfragment i den översta 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)
Välj Kör alla.
Efter några minuter fylls lakehouse med nödvändiga data.
Skapa en AI-färdighet
Om du vill skapa en ny AI-färdighet går du till Datavetenskap och väljer AI-kompetens.
Ange ett namn för att skapa en AI-färdighet.
Välj data
Välj det sjöhus som du skapade och välj Anslut. Du måste sedan välja de tabeller som du vill att AI-kompetensen ska ha tillgänglig åtkomst för.
I den här övningen används följande tabeller:
DimCustomer
DimDate
DimGeography
DimProduct
DimProductCategory
DimPromotion
DimReseller
DimSalesTerritory
FactInternetSales
FactResellerSales
Ge instruktioner
När du först ställer frågor om AI-kunskaper med de valda tabellerna svarar AI-färdigheten dem ganska bra. Till exempel, för frågan Vad är den mest sålda produkten?, returnerar AI-färdigheten:
Long-Sleeve Logo Jersey, L
SQL-frågan behöver dock förbättras. Först tittar den bara på FactResellerSales
tabellen. Tabellen ignoreras FactInternetSales
. För det andra beställer den produkterna efter orderkvantitet, när de totala försäljningsintäkterna som är associerade med produkten är det viktigaste övervägandet, som visas i den här skärmbilden:
För att förbättra frågegenereringen anger du några instruktioner, som du ser i följande exempel:
- När jag frågar om "de mest sålda" produkterna eller objekten är måttet av intresse totala försäljningsintäkter och inte orderkvantitet.
- Den primära tabellen som ska användas är
FactInternetSales
. AnvändFactResellerSales
endast om du uttryckligen tillfrågas om återförsäljningar eller när du tillfrågas om total försäljning.
Om du ställer frågan igen returneras ett annat svar, Mountain-200 Black, 46
, som du ser i den här skärmbilden:
Motsvarande SQL hämtas från FactInternetSales
tabellen och sorteras efter summan av försäljningsbeloppet. AI:n följde anvisningarna.
När du fortsätter att experimentera med frågor bör du lägga till fler instruktioner.
I det här scenariot används följande uppsättning instruktioner:
- När jag frågar om "de mest sålda" produkterna eller objekten är måttet av intresse försäljningsintäkter och inte orderkvantitet.
- Den primära tabellen som ska användas är
FactInternetSales
. AnvändFactResellerSales
endast om du uttryckligen tillfrågas om återförsäljningar eller när du tillfrågas om total försäljning. - När du tillfrågas om effekten av kampanjer gör du det på ökningen av försäljningsintäkterna, inte bara antalet sålda enheter.
- För kundinsikter fokuserar du på det totala försäljningsbeloppet per kund i stället för antalet beställningar.
- Använd
DimDate
för att extrahera specifika tidsperioder (till exempel år, månad) när du utför tidsbaserad analys. - När du analyserar geografiska data prioriterar du totala försäljningsintäkter och genomsnittlig försäljning per beställning för varje region.
- För produktkategoriinsikter ska du alltid använda
DimProductCategory
för att gruppera produkter i enlighet med detta. - När du jämför försäljning mellan regioner kan du använda
DimSalesTerritory
för korrekt områdesinformation. - Använd
DimCurrency
för att normalisera försäljningsdata om du analyserar försäljning i olika valutor. - För detaljerad produktinformation, anslut alltid med
FactInternetSales
DimProduct
. - Använd
DimPromotion
för att analysera effektiviteten i olika kampanjkampanjer. - För återförsäljares prestanda fokuserar du på det totala försäljningsbeloppet och inte bara antalet sålda produkter.
- När du analyserar trender över tid kan du använda
FactInternetSales
och anslutaDimDate
till för att gruppera data efter månad, kvartal eller år. - Kontrollera alltid datakonsekvensen genom att ansluta till
FactInternetSales
motsvarande dimensionstabeller. - Använd SUM för att aggregera försäljningsdata för att säkerställa att du samlar in totala värden korrekt.
- Prioritera försäljningsintäktsmått framför orderkvantitet för att mäta den ekonomiska effekten korrekt.
- Gruppera alltid efter relevanta dimensioner (till exempel produkt, kund, datum) för att få detaljerade insikter.
- När du tillfrågas om kunddemografi kan du ansluta till
DimCustomer
relevanta faktatabeller. - För försäljning efter kampanj ansluter du till
FactInternetSales
och grupperar efterDimPromotion
kampanjnamn. - Normalisera försäljningssiffror med hjälp av
DimCurrency
för jämförelser med olika valutor. - Använd
ORDER BY
satser för att sortera resultat efter måttet av intresse (till exempel försäljningsintäkter, totala beställningar). ListPrice
iDimProduct
är det föreslagna försäljningspriset, medanUnitPrice
iFactInternetSales
ochFactResellerSales
är det faktiska pris till vilket varje enhet såldes. För de flesta användningsfall för intäkter bör enhetspriset användas.- Rangordna de främsta återförsäljarna efter försäljningsbelopp.
Om du kopierar den här texten till anteckningarna för modelltextrutan refererar AI:n till dessa instruktioner när den genererar sina SQL-frågor.
Ange exempel
Förutom instruktioner fungerar exempel som ett annat effektivt sätt att vägleda AI:n. Om du har frågor som din AI-kompetens ofta får, eller frågor som kräver komplexa kopplingar, kan du överväga att lägga till exempel för dem.
Frågan Hur många aktiva kunder vi hade den 1 juni 2013 genererar till exempel en giltig SQL, som du ser i den här skärmbilden:
Men det är inte ett bra svar.
En del av problemet är att "aktiv kund" inte har någon formell definition. Fler instruktioner i anteckningarna i modelltextrutan kan vara till hjälp, men användarna kan ofta ställa den här frågan. Du måste se till att AI:n hanterar frågan korrekt. Den relevanta frågan är måttligt komplex, så ge ett exempel genom att välja redigeringsknappen.
Sedan kan du ladda upp ett exempel.
En upprepning av frågan returnerar ett förbättrat svar.
Du kan lägga till exempel manuellt, men du kan också ladda upp dem från en JSON-fil. Att tillhandahålla exempel från en fil är användbart när du har många SQL-frågor som du vill ladda upp på en gång, i stället för att ladda upp frågorna manuellt en i taget. I den här övningen använder du följande exempel:
{
"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;"
}
Testa och revidera AI-kompetensen
Både instruktioner och exempel har lagts till i AI-kompetensen. Allt eftersom testningen fortsätter kan fler exempel och instruktioner förbättra AI-kompetensen ytterligare. Samarbeta med dina kollegor för att se om du har angett exempel och instruktioner som beskriver vilka typer av frågor de vill ställa.
Använda AI-färdigheten programmatiskt
Du kan använda AI-färdigheten programmatiskt i en Fabric-notebook-fil. Om du vill avgöra om AI-färdigheten har ett publicerat URL-värde eller inte väljer du Inställningar, som du ser i den här skärmbilden:
Innan du publicerar AI-färdigheten har den inget publicerat URL-värde, som du ser i den här skärmbilden:
När du har verifierat AI-kompetensens prestanda kan du välja att publicera den. I det här fallet väljer du Publicera, som du ser i den här skärmbilden:
Den publicerade URL:en för AI-färdigheten visas, som du ser i den här skärmbilden:
Du kan sedan kopiera den publicerade URL:en och använda den i notebook-filen Infrastruktur. På så sätt kan du fråga AI-färdigheten genom att göra anrop till AI-kunskaps-API:et i en Fabric-notebook-fil. Klistra in den kopierade URL:en i det här kodfragmentet. Ersätt sedan frågan med frågor som är relevanta för din AI-kompetens. Det här exemplet används \<generic published URL value\>
som 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"])