Voorbeeld van AI-vaardigheden met de AdventureWorks-gegevensset (preview)
In dit artikel wordt beschreven hoe u een AI-vaardigheid configureert voor de AdventureWorks-gegevensset.
Belangrijk
Deze functie is beschikbaar als preview-versie.
Vereisten
- Een betaalde F64- of hogere Infrastructuurcapaciteitsresource.
- Tenantswitch voor AI-vaardigheden is ingeschakeld.
- Copilot-tenantswitch is ingeschakeld.
- Cross-geo sharing voor AI is ingeschakeld, indien relevant.
Een lakehouse maken met AdventureWorksDW
Maak eerst een lakehouse en vul deze met de benodigde gegevens.
Als u al een exemplaar van AdventureWorksDW in een magazijn of lakehouse hebt, kunt u deze stap overslaan. Als dat niet het is, maakt u een lakehouse op basis van een notitieblok. Gebruik het notebook om het lakehouse te vullen met de gegevens.
Maak een nieuw notitieblok in de werkruimte waar u uw AI-vaardigheid wilt maken.
Selecteer + gegevensbronnen aan de linkerkant van het deelvenster Explorer. Met deze optie voegt u een bestaand lakehouse toe of maakt u een nieuw lakehouse.
Voeg in de bovenste cel het volgende codefragment toe:
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)
Selecteer Alles uitvoeren.
Na een paar minuten wordt het lakehouse gevuld met de benodigde gegevens.
Een AI-vaardigheid maken
Als u een nieuwe AI-vaardigheid wilt maken, gaat u naar de Datawetenschap-ervaring en selecteert u AI-vaardigheid.
Voer een naam in om een AI-vaardigheid te maken.
Selecteer de gegevens
Selecteer het lakehouse dat u hebt gemaakt en selecteer Verbinding maken. Vervolgens moet u de tabellen selecteren waarvoor de AI-vaardigheid toegang heeft.
In deze oefening worden deze tabellen gebruikt:
DimCustomer
DimDate
DimGeography
DimProduct
DimProductCategory
DimPromotion
DimReseller
DimSalesTerritory
FactInternetSales
FactResellerSales
Instructies opgeven
Wanneer u de ai-vaardigheidsvragen voor het eerst stelt met de vermelde tabellen die zijn geselecteerd, beantwoordt de AI-vaardigheid deze redelijk goed. Voor de vraag Wat is bijvoorbeeld het meest verkochte product? retourneert de AI-vaardigheid:
Long-Sleeve Logo Jersey, L
De SQL-query heeft echter enige verbetering nodig. Eerst kijkt het alleen naar de FactResellerSales
tabel. De tabel wordt FactInternetSales
genegeerd. Ten tweede worden de producten per orderhoeveelheid besteld, wanneer de totale omzet die aan het product is gekoppeld, de belangrijkste overweging is, zoals wordt weergegeven in deze schermopname:
Als u het genereren van query's wilt verbeteren, geeft u enkele instructies op, zoals wordt weergegeven in deze voorbeelden:
- Wanneer ik vraag naar 'de meest verkochte' producten of artikelen, is de metrische waarde van rente de totale omzet en niet de orderhoeveelheid.
- De primaire tabel die moet worden gebruikt, is
FactInternetSales
.FactResellerSales
Gebruik alleen indien expliciet gevraagd over wederverkoop of wanneer u wordt gevraagd over de totale verkoop.
Als u de vraag opnieuw stelt, wordt een ander antwoord geretourneerd, Mountain-200 Black, 46
zoals wordt weergegeven in deze schermopname:
De bijbehorende SQL tekent uit de FactInternetSales
tabel en sorteert op de som van het verkoopbedrag. De AI heeft de instructies gevolgd.
Wanneer u blijft experimenteren met query's, moet u meer instructies toevoegen.
In dit scenario wordt de volgende set instructies gebruikt:
- Wanneer ik vraag naar 'de meest verkochte' producten of artikelen, is de metrische waarde van de interesse omzet en niet de orderhoeveelheid.
- De primaire tabel die moet worden gebruikt, is
FactInternetSales
.FactResellerSales
Gebruik alleen indien expliciet gevraagd over wederverkoop of wanneer u wordt gevraagd over de totale verkoop. - Wanneer u wordt gevraagd over de impact van promoties, doet u dit op de toename van de verkoopopbrengst, niet alleen het aantal verkochte eenheden.
- Voor klantinzichten richt u zich op het totale verkoopbedrag per klant in plaats van het aantal orders.
- Gebruik
DimDate
dit diagram om specifieke perioden (bijvoorbeeld jaar, maand) te extraheren bij het uitvoeren van een op tijd gebaseerde analyse. - Bij het analyseren van geografische gegevens geeft u prioriteit aan de totale verkoopopbrengst en de gemiddelde verkoop per order voor elke regio.
- Gebruik voor inzichten in productcategorie altijd
DimProductCategory
om producten dienovereenkomstig te groeperen. - Wanneer u de verkoop tussen regio's vergelijkt, gebruikt
DimSalesTerritory
u deze voor nauwkeurige gebiedsgegevens. - Gebruik
DimCurrency
dit om verkoopgegevens te normaliseren als u de verkoop in verschillende valuta's analyseert. - Voor gedetailleerde productinformatie kunt u altijd deelnemen
FactInternetSales
aanDimProduct
. - Gebruik
DimPromotion
dit om de effectiviteit van verschillende promotiecampagnes te analyseren. - Voor de prestaties van resellers richt u zich op het totale verkoopbedrag en niet alleen op het aantal verkochte producten.
- Wanneer u trends in de loop van de tijd analyseert, gebruikt
FactInternetSales
en voegt u eraan toeDimDate
om gegevens te groeperen op maand, kwartaal of jaar. - Controleer altijd op gegevensconsistentie door samen te voegen
FactInternetSales
met de bijbehorende dimensietabellen. - Gebruik SUM voor het samenvoegen van verkoopgegevens om ervoor te zorgen dat u de totale waarden nauwkeurig vastlegt.
- Geef prioriteit aan metrische gegevens voor verkoopopbrengsten over orderhoeveelheid om de financiële impact nauwkeurig te meten.
- Groepeer altijd op relevante dimensies (bijvoorbeeld product, klant, datum) om gedetailleerde inzichten te verkrijgen.
- Wanneer u wordt gevraagd naar demografische gegevens van klanten, kunt u deelnemen aan
DimCustomer
relevante feitentabellen. - Voor verkoop per promotie kunt u deelnemen aan
DimPromotion
en groeperenFactInternetSales
op promotienaam. - Normaliseer verkoopcijfers voor
DimCurrency
vergelijkingen waarbij verschillende valuta's betrokken zijn. - Gebruik
ORDER BY
componenten om resultaten te sorteren op de metrische waarde (bijvoorbeeld omzet, totale orders). ListPrice
inDimProduct
is de voorgestelde verkoopprijs, terwijlUnitPrice
inFactInternetSales
enFactResellerSales
de werkelijke prijs is waarvoor elke eenheid is verkocht. Voor de meeste gebruiksscenario's voor inkomsten moet de eenheidsprijs worden gebruikt.- Rangschik de beste resellers op verkoopbedrag.
Als u deze tekst naar de notities voor het tekstvak van het model kopieert, verwijst de AI naar deze instructies wanneer de SQL-query's worden gegenereerd.
Voorbeelden opgeven
Naast instructies fungeren voorbeelden als een andere effectieve manier om de AI te begeleiden. Als u vragen hebt die uw AI-vaardigheid vaak ontvangt of vragen waarvoor complexe joins nodig zijn, kunt u voorbeelden voor hen toevoegen.
De vraag Hoeveel actieve klanten hebben we bijvoorbeeld op 1 juni 2013 hebben, genereert een geldige SQL, zoals wordt weergegeven in deze schermafbeelding:
Het is echter geen goed antwoord.
Een deel van het probleem is dat 'actieve klant' geen formele definitie heeft. Meer instructies in de notities in het tekstvak model kunnen helpen, maar gebruikers kunnen deze vraag vaak stellen. U moet ervoor zorgen dat de AI de vraag correct afhandelt. De relevante query is redelijk complex, dus geef een voorbeeld door de knop Bewerken te selecteren.
Vervolgens kunt u een voorbeeld uploaden.
Een herhaling van de vraag retourneert een verbeterd antwoord.
U kunt handmatig voorbeelden toevoegen, maar u kunt ze ook uploaden vanuit een JSON-bestand. Het bieden van voorbeelden van een bestand is handig wanneer u veel SQL-query's hebt die u allemaal tegelijk wilt uploaden, in plaats van de query's één voor één handmatig te uploaden. Gebruik voor deze oefening de volgende voorbeelden:
{
"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;"
}
De AI-vaardigheid testen en herzien
Zowel instructies als voorbeelden zijn toegevoegd aan de AI-vaardigheid. Naarmate het testen vordert, kunnen meer voorbeelden en instructies de AI-vaardigheid nog verder verbeteren. Werk samen met uw collega's om te zien of u voorbeelden en instructies hebt gegeven die betrekking hebben op de soorten vragen die ze willen stellen.
De AI-vaardigheid programmatisch gebruiken
U kunt de AI-vaardigheid programmatisch gebruiken in een Fabric-notebook. Als u wilt bepalen of de AI-vaardigheid een gepubliceerde URL-waarde heeft, selecteert u Instellingen, zoals wordt weergegeven in deze schermopname:
Voordat u de AI-vaardigheid publiceert, heeft deze geen gepubliceerde URL-waarde, zoals wordt weergegeven in deze schermopname:
Nadat u de prestaties van de AI-vaardigheid hebt gevalideerd, kunt u besluiten deze te publiceren. In dit geval selecteert u Publiceren, zoals wordt weergegeven in deze schermopname:
De gepubliceerde URL voor de AI-vaardigheid wordt weergegeven, zoals wordt weergegeven in deze schermopname:
Vervolgens kunt u de gepubliceerde URL kopiëren en gebruiken in het Fabric-notebook. Op deze manier kunt u een query uitvoeren op de AI-vaardigheid door aanroepen uit te voeren naar de API voor AI-vaardigheden in een Fabric-notebook. Plak de gekopieerde URL in dit codefragment. Vervang vervolgens de vraag door een query die relevant is voor uw AI-vaardigheid. In dit voorbeeld wordt de URL gebruikt \<generic published URL value\>
.
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"])