Κοινή χρήση μέσω


Παράδειγμα δεξιοτήτων AI με το σύνολο δεδομένων AdventureWorks (προεπισκόπηση)

Αυτό το άρθρο εξηγεί πώς μπορείτε να ρυθμίσετε τις παραμέτρους μιας δεξιότητας AI στο σύνολο δεδομένων AdventureWorks.

Σημαντικό

Αυτή η δυνατότητα είναι σε προεπισκόπηση.

Προαπαιτούμενα στοιχεία

  • Ένας πόρος εκχωρημένων πόρων F64 ή νεότερης έκδοσης Fabric.
  • Η αλλαγή μισθωτή δεξιοτήτων AI είναι ενεργοποιημένη.
  • Ο διακόπτης μισθωτή Copilot είναι ενεργοποιημένος.
  • Η κοινή χρήση cross-geo για AI είναι ενεργοποιημένη, εάν είναι σχετική.

Δημιουργία μιας λίμνης με το AdventureWorksDW

Πρώτα, δημιουργήστε ένα lakehouse και συμπληρώστε το με τα απαραίτητα δεδομένα.

Εάν έχετε ήδη μια παρουσία της AdventureWorksDW σε μια αποθήκη ή ένα lakehouse, μπορείτε να παραλείψετε αυτό το βήμα. Εάν όχι, δημιουργήστε μια λίμνη από ένα σημειωματάριο. Χρησιμοποιήστε το σημειωματάριο για να συμπληρώσετε τη λίμνη με τα δεδομένα.

  1. Δημιουργήστε ένα νέο σημειωματάριο στον χώρο εργασίας όπου θέλετε να δημιουργήσετε τις δεξιότητα AI.

  2. Στην αριστερή πλευρά του παραθύρου Εξερεύνηση , επιλέξτε + Προελεύσεις δεδομένων. Αυτή η επιλογή προσθέτει ένα υπάρχον lakehouse ή δημιουργεί ένα νέο lakehouse.

  3. Στο επάνω κελί, προσθέστε το ακόλουθο τμήμα κώδικα:

    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. Επιλέξτε Εκτέλεση όλων.

    Στιγμιότυπο οθόνης που εμφανίζει ένα σημειωματάριο με τον κώδικα αποστολής του AdventureWorks.

Μετά από λίγα λεπτά, το lakehouse συμπληρώνεται με τα απαραίτητα δεδομένα.

Δημιουργία δεξιότητας AI

  1. Για να δημιουργήσετε μια νέα δεξιότητα AI, μεταβείτε στην εμπειρία επιστήμης δεδομένων και επιλέξτε AI Skill.

    Στιγμιότυπο οθόνης που δείχνει πού μπορείτε να δημιουργήσετε δεξιότητες AI.

  2. Εισαγάγετε ένα όνομα για να δημιουργήσετε μια δεξιότητα AI.

Επιλογή των δεδομένων

Επιλέξτε τη λίμνη που δημιουργήσατε και επιλέξτε Σύνδεση. Στη συνέχεια, πρέπει να επιλέξετε τους πίνακες για τους οποίους θέλετε η δεξιότητα AI να έχει διαθέσιμη πρόσβαση.

Αυτή η άσκηση χρησιμοποιεί αυτούς τους πίνακες:

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

Παροχή οδηγιών

Όταν υποβάλλετε για πρώτη φορά ερωτήσεις δεξιοτήτων AI με επιλεγμένους τους πίνακες που παρατίθενται, η δεξιότητα AI τις απαντά αρκετά καλά. Για παράδειγμα, για την ερώτηση Ποιο είναι το προϊόν με τις περισσότερες πωλήσεις;, η δεξιότητα AI επιστρέφει:

  • Long-Sleeve Logo Jersey, L

Ωστόσο, το ερώτημα SQL χρειάζεται κάποια βελτίωση. Πρώτα, εξετάζει μόνο τον FactResellerSales πίνακα. Αγνοεί τον FactInternetSales πίνακα. Δεύτερον, παραγγέλνει τα προϊόντα κατά ποσότητα παραγγελίας, όταν τα συνολικά έσοδα πωλήσεων που σχετίζονται με το προϊόν είναι το πιο σημαντικό στοιχείο, όπως φαίνεται σε αυτό το στιγμιότυπο οθόνης:

Στιγμιότυπο οθόνης που εμφανίζει το πρώτο παράδειγμα ερώτησης προϊόντος με τις υψηλότερες πωλήσεις AI.

Για να βελτιώσετε τη δημιουργία ερωτημάτων, δώστε ορισμένες οδηγίες, όπως φαίνεται στα παρακάτω παραδείγματα:

  • Κάθε φορά που ρωτώ για τα προϊόντα ή τα είδη με τις περισσότερες πωλήσεις, το μετρικό ενδιαφέροντος είναι τα συνολικά έσοδα πωλήσεων και όχι η ποσότητα παραγγελίας.
  • Ο πρωτεύων πίνακας που θα χρησιμοποιηθεί είναι FactInternetSales. Χρησιμοποιήστε FactResellerSales μόνο εάν έχετε ρωτήσει ρητά σχετικά με τις μεταπωλήσεις ή όταν ερωτηθείτε σχετικά με τις συνολικές πωλήσεις.

Η υποβολή της ερώτησης ξανά επιστρέφει μια διαφορετική απάντηση, Mountain-200 Black, 46, όπως φαίνεται σε αυτό το στιγμιότυπο οθόνης:

Στιγμιότυπο οθόνης που εμφανίζει το δεύτερο παράδειγμα ερώτησης προϊόντος με τις υψηλότερες πωλήσεις AI.

Η αντίστοιχη SQL αντλεί από τον FactInternetSales πίνακα και ταξινομεί κατά το άθροισμα του ποσού πωλήσεων. Η τεχνητή νοημοσύνη ακολούθησε τις οδηγίες.

Καθώς συνεχίζετε να πειραματίζεστε με ερωτήματα, θα πρέπει να προσθέσετε περισσότερες οδηγίες.

Αυτό το σενάριο χρησιμοποιεί το ακόλουθο σύνολο οδηγιών:

  • Κάθε φορά που ρωτώ για τα προϊόντα ή τα είδη με τις περισσότερες πωλήσεις, το μετρικό ενδιαφέροντος είναι τα έσοδα πωλήσεων και όχι η ποσότητα παραγγελίας.
  • Ο πρωτεύων πίνακας που θα χρησιμοποιηθεί είναι FactInternetSales. Χρησιμοποιήστε FactResellerSales μόνο εάν έχετε ρωτήσει ρητά σχετικά με τις μεταπωλήσεις ή όταν ερωτηθείτε σχετικά με τις συνολικές πωλήσεις.
  • Όταν ρωτήθηκε για την επίδραση των προσφορών, αυτό συμβαίνει στην αύξηση των εσόδων από τις πωλήσεις, όχι μόνο στον αριθμό των μονάδων που πωλήθηκαν.
  • Για πληροφορίες πελατών, εστιάστε στο συνολικό ποσό πωλήσεων ανά πελάτη και όχι στον αριθμό παραγγελιών.
  • Χρησιμοποιείται DimDate για την εξαγωγή συγκεκριμένων χρονικών περιόδων (για παράδειγμα, έτος, μήνας) κατά την εκτέλεση ανάλυσης βάσει χρόνου.
  • Κατά την ανάλυση γεωγραφικών δεδομένων, δώστε προτεραιότητα στα συνολικά έσοδα πωλήσεων και στις μέσες πωλήσεις ανά παραγγελία για κάθε περιοχή.
  • Για πληροφορίες κατηγορίας προϊόντων, να χρησιμοποιείτε DimProductCategory πάντα την ανάλογη ομάδα προϊόντων.
  • Κατά τη σύγκριση πωλήσεων μεταξύ περιοχών, χρησιμοποιήστε DimSalesTerritory το για ακριβείς λεπτομέρειες περιφέρειας.
  • Χρησιμοποιήστε DimCurrency την για την κανονικοποίηση των δεδομένων πωλήσεων εάν αναλύετε πωλήσεις σε διαφορετικά νομίσματα.
  • Για λεπτομερείς πληροφορίες προϊόντος, να συμμετέχετε πάντα στο FactInternetSales DimProduct.
  • Χρησιμοποιήστε DimPromotion το για να αναλύσετε την αποτελεσματικότητα των διαφορετικών διαφημιστικών εκστρατειών.
  • Για την απόδοση μεταπωλητή, εστιάστε στο συνολικό ποσό πωλήσεων και όχι μόνο στον αριθμό των προϊόντων που πωλήθηκαν.
  • Κατά την ανάλυση τάσεων σε βάθος χρόνου, χρησιμοποιήστε και συνενωθείτε FactInternetSales με DimDate για να ομαδοποιήσετε δεδομένα κατά μήνα, τρίμηνο ή έτος.
  • Να ελέγχετε πάντα για συνέπεια δεδομένων ενώνοντάς FactInternetSales την με τους αντίστοιχους πίνακες διαστάσεων.
  • Χρησιμοποιήστε τη συνάρτηση SUM για τη συνάθροιση δεδομένων πωλήσεων για να εξασφαλίσετε με ακρίβεια την καταγραφή των συνολικών τιμών.
  • Δώστε προτεραιότητα στα μετρικά εσόδων πωλήσεων σε σχέση με την ποσότητα παραγγελίας για να μετρήσετε με ακρίβεια την οικονομική επίδραση.
  • Να ομαδοποιείτε πάντα σύμφωνα με σχετικές διαστάσεις (για παράδειγμα, προϊόν, πελάτης, ημερομηνία) για να λαμβάνετε λεπτομερείς δεδομενικές πληροφορίες.
  • Όταν ερωτηθείτε σχετικά με τα δημογραφικά στοιχεία πελατών, συνδεθείτε DimCustomer με σχετικούς πίνακες δεδομένων.
  • Για πωλήσεις κατά προώθηση, συμμετάσχετε και ομαδοποιήστε FactInternetSales κατά DimPromotion όνομα προβιβασμού.
  • Κανονικοποιήστε τα στοιχεία πωλήσεων χρησιμοποιώντας DimCurrency το για συγκρίσεις που αφορούν διαφορετικά νομίσματα.
  • Χρησιμοποιήστε ORDER BY όρους για την ταξινόμηση αποτελεσμάτων με βάση το μετρικό ενδιαφέροντος (για παράδειγμα, έσοδα πωλήσεων, συνολικές παραγγελίες).
  • ListPrice in DimProduct είναι η προτεινόμενη τιμή πώλησης, ενώ UnitPrice στο FactInternetSales και FactResellerSales είναι η πραγματική τιμή στην οποία πωλήθηκε κάθε μονάδα. Για τις περισσότερες περιπτώσεις χρήσης στα έσοδα, θα πρέπει να χρησιμοποιηθεί η τιμή μονάδας.
  • Κατάταξη κορυφαίων μεταπωλητών κατά ποσό πωλήσεων.

Εάν αντιγράψετε αυτό το κείμενο στις σημειώσεις για το πλαίσιο κειμένου μοντέλου, το AI αναφέρεται σε αυτές τις οδηγίες όταν δημιουργεί τα ερωτήματά του SQL.

Παροχή παραδειγμάτων

Εκτός από τις οδηγίες, τα παραδείγματα χρησιμεύουν ως ένας άλλος αποτελεσματικός τρόπος για την καθοδήγηση της τεχνητής νοημοσύνης. Εάν έχετε ερωτήσεις που συχνά λαμβάνουν οι δεξιότητα AI ή ερωτήσεις που απαιτούν σύνθετους συνδέσμους, εξετάστε το ενδεχόμενο να προσθέσετε παραδείγματα για αυτές.

Για παράδειγμα, η ερώτηση Πόσοι ενεργοί πελάτες είχαμε την 1η Ιουνίου 2013 δημιουργεί κάποιο έγκυρο SQL, όπως φαίνεται σε αυτό το στιγμιότυπο οθόνης:

Στιγμιότυπο οθόνης που εμφανίζει το πρώτο παράδειγμα ερώτησης πλήθους ενεργών πελατών δεξιότητας AI.

Ωστόσο, δεν είναι μια καλή απάντηση.

Μέρος του προβλήματος είναι ότι ο "ενεργός πελάτης" δεν έχει επίσημο ορισμό. Μπορεί να βοηθήσουν περισσότερες οδηγίες στις σημειώσεις για το πλαίσιο κειμένου μοντέλου, αλλά οι χρήστες ενδέχεται να κάνουν συχνά αυτή την ερώτηση. Πρέπει να βεβαιωθείτε ότι το AI χειρίζεται σωστά την ερώτηση. Το σχετικό ερώτημα είναι μετρίως σύνθετο, επομένως, δώστε ένα παράδειγμα επιλέγοντας το κουμπί επεξεργασίας.

Στιγμιότυπο οθόνης που εμφανίζει πού μπορείτε να επεξεργαστείτε τα παραδείγματα που παρέχετε στο AI.

Στη συνέχεια, μπορείτε να αποστείλετε ένα παράδειγμα.

Στιγμιότυπο οθόνης που εμφανίζει ένα παράδειγμα ερωτήματος SQL δεξιοτήτων AI.

Μια επανάληψη της ερώτησης επιστρέφει μια βελτιωμένη απάντηση.

Στιγμιότυπο οθόνης που εμφανίζει το δεύτερο παράδειγμα ερώτησης πλήθους ενεργών πελατών δεξιότητας AI.

Μπορείτε να προσθέσετε παραδείγματα με μη αυτόματο τρόπο, αλλά μπορείτε επίσης να τα αποστείλετε από ένα αρχείο JSON. Η παροχή παραδειγμάτων από ένα αρχείο είναι χρήσιμη όταν έχετε πολλά ερωτήματα SQL που θέλετε να αποστείλετε όλα ταυτόχρονα, αντί να στείλετε τα ερωτήματα με μη αυτόματο τρόπο ένα προς ένα. Για αυτήν την άσκηση, χρησιμοποιήστε αυτά τα παραδείγματα:

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

Δοκιμή και αναθεώρηση της δεξιότητας AI

Τόσο οι οδηγίες όσο και τα παραδείγματα προστέθηκαν στην ικανότητα AI. Καθώς προχωρά η δοκιμή, περισσότερα παραδείγματα και οδηγίες μπορούν να βελτιώσουν ακόμη περισσότερο τις δεξιότητες AI. Συνεργαστείτε με τους συναδέλφους σας για να δείτε εάν δώσατε παραδείγματα και οδηγίες που καλύπτουν τα είδη των ερωτήσεων που θέλουν να κάνουν.

Χρήση της δεξιότητας AI μέσω προγραμματισμού

Μπορείτε να χρησιμοποιήσετε την δεξιότητα AI μέσω προγραμματισμού μέσα σε ένα σημειωματάριο Fabric. Για να προσδιορίσετε αν η δεξιότητα AI διαθέτει μια δημοσιευμένη τιμή διεύθυνσης URL, επιλέξτε Ρυθμίσεις, όπως φαίνεται σε αυτό το στιγμιότυπο οθόνης:

Στιγμιότυπο οθόνης που εμφανίζει την επιλογή ρυθμίσεων δεξιοτήτων AI.

Πριν δημοσιεύσετε την δεξιότητα AI, δεν διαθέτει δημοσιευμένη τιμή διεύθυνσης URL, όπως φαίνεται σε αυτό το στιγμιότυπο οθόνης:

Στιγμιότυπο οθόνης που δείχνει ότι μια δεξιότητα AI δεν έχει δημοσιευμένη τιμή διεύθυνσης URL πριν από τη δημοσίευση.

Αφού επικυρώσετε τις επιδόσεις της δεξιότητας AI, μπορεί να αποφασίσετε να τη δημοσιεύσετε. Σε αυτή την περίπτωση, επιλέξτε Δημοσίευση, όπως φαίνεται σε αυτό το στιγμιότυπο οθόνης:

Στιγμιότυπο οθόνης που εμφανίζει την επιλογή δημοσίευσης.

Εμφανίζεται η δημοσιευμένη διεύθυνση URL για την δεξιότητα AI, όπως φαίνεται σε αυτό το στιγμιότυπο οθόνης:

Στιγμιότυπο οθόνης που εμφανίζει τη δημοσιευμένη διεύθυνση URL.

Στη συνέχεια, μπορείτε να αντιγράψετε τη δημοσιευμένη διεύθυνση URL και να τη χρησιμοποιήσετε στο σημειωματάριο Fabric. Με αυτόν τον τρόπο, μπορείτε να υποβάλετε ερωτήματα για την δεξιότητα AI πραγματοποιώντας κλήσεις στο API δεξιοτήτων AI σε ένα σημειωματάριο Fabric. Επικολλήστε τη διεύθυνση URL που αντιγράψατε σε αυτό το τμήμα κώδικα. Στη συνέχεια, αντικαταστήστε την ερώτηση με οποιοδήποτε ερώτημα σχετίζεται με την δεξιότητα AI. Αυτό το παράδειγμα χρησιμοποιείται \<generic published URL value\> ως διεύθυνση 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"])