Beispiel für KI-Fähigkeiten mit dem AdventureWorks-Dataset (Vorschau)
In diesem Artikel wird gezeigt, wie Sie eine KI-Fähigkeit im AdventureWorks-Dataset konfigurieren.
Wichtig
Dieses Feature befindet sich in der Vorschau.
Voraussetzungen
- Eine kostenpflichtige F64- oder höhere Fabric-Kapazitätsressource.
- Der Mandantenwechsel mit KI-Skill ist aktiviert.
- Der Copilot-Mandantenwechsel ist aktiviert.
- Die geoübergreifende Freigabe für KI ist ggf. aktiviert.
Erstellen eines Lakehouse mit AdventureWorksDW
Erstellen Sie zuerst ein Lakehouse und füllen Sie es mit den erforderlichen Daten auf.
Wenn Sie bereits über eine Instanz von AdventureWorksDW in einem Warehouse oder Lakehouse verfügen, können Sie diesen Schritt überspringen. Wenn nicht, erstellen Sie ein Lakehouse aus einem Notebook. Füllen Sie das Lakehouse über das Notebook mit den Daten auf.
Erstellen Sie ein neues Notebook im Arbeitsbereich, in dem Sie Ihre KI-Fähigkeit erstellen möchten.
Wählen Sie auf der linken Seite des Explorer-Bereichs + Datenquellen aus. Mit dieser Option wird ein bestehendes Lakehouse hinzugefügt oder ein neues Lakehouse erstellt.
Fügen Sie in der obersten Zelle den folgenden Codeschnipsel hinzu:
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)
Wählen Sie Alle ausführen aus.
Nach ein paar Minuten wird das Lakehouse mit den erforderlichen Daten aufgefüllt.
Erstellen einer KI-Fähigkeit
Um eine neue KI-Fähigkeit zu erstellen, gehen Sie zur Data Science-Experience, und wählen Sie KI-Fähigkeit aus.
Geben Sie zum Erstellen einer KI-Fähigkeit einen Namen ein.
Wählen Sie die Daten aus
Wählen Sie das erstellte Lakehouse und dann Verbinden aus. Anschließend müssen Sie die Tabellen auswählen, auf die die KI-Fähigkeit Zugriff haben soll.
In dieser Übung werden die folgenden Tabellen verwendet:
DimCustomer
DimDate
DimGeography
DimProduct
DimProductCategory
DimPromotion
DimReseller
DimSalesTerritory
FactInternetSales
FactResellerSales
Bereitstellen von Anweisungen
Wenn Sie die Fragen zur KI-Fähigkeit zuerst mit den ausgewählten aufgelisteten Tabellen stellen, beantwortet die KI-Fähigkeit sie ziemlich gut. Auf die Frage Welches ist das meistverkaufte Produkt? gibt die KI-Fähigkeit beispielsweise folgende Antwort:
Long-Sleeve Logo Jersey, L
Die SQL-Abfrage benötigt jedoch einige Verbesserungen. Zunächst wird nur die Tabelle FactResellerSales
betrachtet. Die Tabelle FactInternetSales
wird ignoriert. Zweitens werden die Produkte nach Auftragsmenge bestellt, wenn der Gesamtumsatz, der mit dem Produkt verknüpft ist, die wichtigste Überlegung ist, wie in diesem Screenshot gezeigt:
Um die Abfragegenerierung zu verbessern, geben Sie einige Anweisungen an, wie in den folgenden Beispielen gezeigt:
- Immer wenn ich nach "den meisten verkauften" Produkten oder Artikeln frage, ist der relevante Faktor der Gesamtumsatz und nicht die Bestellmenge.
- Der zu verwendende Primärschlüssel ist
FactInternetSales
. Verwenden SieFactResellerSales
nur, wenn explizit nach Wiederverkäufen gefragt wird oder wenn nach dem Gesamtumsatz gefragt wird.
Wenn Sie die Frage erneut stellen, wird eine andere Antwort zurückgegeben: Mountain-200 Black, 46
, wie in diesem Screenshot gezeigt:
Die entsprechende SQL bezieht sich auf die Tabelle FactInternetSales
und sortiert sie nach der Summe des Umsatzbetrags. Die KI hat die Anweisungen befolgt.
Wenn Sie weiterhin mit Abfragen experimentieren, sollten Sie weitere Anweisungen hinzufügen.
In diesem Szenario werden die folgenden Anweisungen verwendet:
- Immer wenn ich nach "den meisten verkauften" Produkten oder Artikeln frage, ist der relevante Faktor der Umsatz und nicht die Bestellmenge.
- Der zu verwendende Primärschlüssel ist
FactInternetSales
. Verwenden SieFactResellerSales
nur, wenn explizit nach Wiederverkäufen gefragt wird oder wenn nach dem Gesamtumsatz gefragt wird. - Wenn Sie über die Auswirkungen von Werbeaktionen gefragt werden, tun Sie dies bei der Erhöhung des Umsatzes, nicht nur auf die Anzahl der verkauften Einheiten.
- Konzentrieren Sie sich bei Kundenerkenntnissen auf den Gesamtumsatz pro Kunde und nicht auf die Anzahl der Bestellungen.
- Verwenden Sie
DimDate
, um bestimmte Zeiträume (z. B. Jahr, Monat) zu extrahieren, wenn eine zeitbasierte Analyse durchgeführt wird. - Priorisieren Sie bei der Analyse geografischer Daten den Gesamtumsatz und den durchschnittlichen Umsatz pro Bestellung für jede Region.
- Verwenden Sie für Produktkategorienerkenntnisse immer
DimProductCategory
, um Produkte entsprechend zu gruppieren. - Verwenden Sie beim Vergleichen der Umsätze zwischen Regionen
DimSalesTerritory
für genaue Gebietsdetails. - Verwenden Sie
DimCurrency
, um Umsatzdaten zu normalisieren, wenn die Umsätze in verschiedenen Währungen analysiert werden. - Verknüpfen Sie für detaillierte Produktinformationen immer
FactInternetSales
mitDimProduct
. - Verwenden Sie
DimPromotion
, um die Effektivität verschiedener Werbekampagnen zu analysieren. - Konzentrieren Sie sich bei der Händlerleistung auf den Gesamtumsatz und nicht nur auf die Anzahl der verkauften Produkte.
- Wenn Sie Trends im Laufe der Zeit analysieren, verwenden Sie
FactInternetSales
und verknüpfen Sie mitDimDate
, um Daten nach Monat, Quartal oder Jahr zu gruppieren. - Überprüfen Sie immer auf Datenkonsistenz, indem Sie
FactInternetSales
mit den entsprechenden Dimensionstabellen verknüpfen. - Verwenden Sie SUMME zum Aggregieren von Umsatzdaten, um sicherzustellen, dass Sie die Gesamtwerte genau erfassen.
- Priorisieren Sie Umsatzmetriken über die Bestellmenge, um die finanziellen Auswirkungen genau zu messen.
- Gruppieren Sie immer nach relevanten Dimensionen (z. B. Produkt, Kunde, Datum), um detaillierte Einblicke zu erhalten.
- Wenn Sie nach Kundendemografien gefragt werden, verknüpfen Sie
DimCustomer
mit relevanten Faktentabellen. - Für Verkäufe nach Werbung können Sie
FactInternetSales
mitDimPromotion
und Gruppennamen beitreten. - Normalisieren Sie Verkaufszahlen mithilfe von
DimCurrency
für Vergleiche mit unterschiedlichen Währungen. - Verwenden Sie
ORDER BY
-Klauseln, um Ergebnisse nach der gewünschten Metrik (z. B. Umsatz, Gesamtbestellungen) zu sortieren. ListPrice
inDimProduct
ist der vorgeschlagene Verkaufspreis, währendUnitPrice
inFactInternetSales
undFactResellerSales
der tatsächliche Preis ist, zu dem jede Einheit verkauft wurde. Für die meisten Anwendungsfälle bei Einnahmen sollte der Einzelpreis verwendet werden.- Rangieren Sie top Reseller nach Umsatzbetrag.
Wenn Sie diesen Text in die Notizen für das Modelltextfeld kopieren, bezieht sich die KI auf diese Anweisungen, wenn sie ihre SQL-Abfragen generiert.
Bereitstellen von Beispielen
Neben Anweisungen dienen Beispiele als eine weitere effektive Möglichkeit, die KI zu leiten. Wenn Sie Fragen haben, die Ihre KI-Fähigkeit häufig erhält, oder Fragen, die komplexe Verknüpfungen erfordern, sollten Sie Beispiele für sie hinzufügen.
Die Frage: Wie viele aktive Kunden hatten wir am 1. Juni 2013 generiert einige gültige SQL, wie in diesem Screenshot gezeigt:
Es ist jedoch keine gute Antwort.
Ein Teil des Problems ist, dass "aktiver Kunde" keine formale Definition hat. Weitere Anweisungen im Textfeld "Notizen" zum Modell können hilfreich sein, aber Benutzer stellen diese Frage häufig. Stellen Sie sicher, dass die KI die Frage richtig behandelt. Die relevante Abfrage ist moderat komplex. Geben Sie daher ein Beispiel an, indem Sie die Schaltfläche "Bearbeiten" auswählen.
Anschließend können Sie ein Beispiel hochladen.
Eine Wiederholung der Frage gibt eine verbesserte Antwort zurück.
Sie können Beispiele manuell hinzufügen, aber Sie können sie auch aus einer JSON-Datei hochladen. Das Bereitstellen von Beispielen aus einer Datei ist hilfreich, wenn Sie über viele SQL-Abfragen verfügen, die Sie alle gleichzeitig hochladen möchten, anstatt die Abfragen einzeln manuell hochzuladen. Verwenden Sie für diese Übung die folgenden Beispiele:
{
"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;"
}
Testen und Überarbeiten der KI-Fähigkeiten
Sowohl Anweisungen als auch Beispiele wurden der KI-Fähigkeit hinzugefügt. Im Zuge des Testvorgangs können weitere Beispiele und Anweisungen die KI-Fähigkeit noch weiter verbessern. Arbeiten Sie mit Ihren Kollegen zusammen, um zu sehen, ob Sie Beispiele und Anweisungen bereitgestellt haben, die die Arten von Fragen abdecken, die sie stellen möchten.
Programmgesteuertes Verwenden der KI-Fähigkeit
Sie können die KI-Fähigkeit programmgesteuert in einem Fabric-Notebook verwenden. Um festzustellen, ob die KI-Fähigkeit einen veröffentlichten URL-Wert aufweist, wählen Sie Einstellungen aus, wie in diesem Screenshot gezeigt:
Bevor Sie die KI-Fähigkeit veröffentlichen, hat sie keinen veröffentlichten URL-Wert, wie in diesem Screenshot gezeigt:
Wenn Sie die Leistung der KI-Fähigkeit überprüft haben, können Sie sie veröffentlichen. Wählen Sie in diesem Fall Veröffentlichen aus, wie in diesem Screenshot gezeigt:
Die veröffentlichte URL für die KI-Fähigkeit wird angezeigt, wie in diesem Screenshot gezeigt:
Anschließend können Sie die veröffentlichte URL kopieren und im Fabric-Notebook verwenden. Auf diese Weise können Sie die KI-Fähigkeit abfragen, indem Sie Aufrufe der KI-Fähigkeits-API in einem Fabric-Notebook durchführen. Fügen Sie die kopierte URL in diesen Codeschnipsel ein. Ersetzen Sie dann die Frage durch eine für Ihre KI-Fähigkeit relevante Abfrage. In diesem Beispiel wird \<generic published URL value\>
als URL verwendet.
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"])