ตัวอย่างทักษะ AI ที่มีชุดข้อมูล AdventureWorks (ตัวอย่าง)
บทความนี้แสดงวิธีการกําหนดค่าทักษะ AI บนชุดข้อมูล AdventureWorks
สำคัญ
คุณลักษณะนี้อยู่ในตัวอย่าง
ข้อกำหนดเบื้องต้น
- ความจุ F64 Microsoft Fabric หรือสูงกว่า
- เปิดใช้งานสวิตช์ ผู้เช่า Copilot
- เปิดใช้งานการแบ่งปันข้อมูลข้ามภูมิศาสตร์สําหรับ AI หากมีความเกี่ยวข้อง
สร้างเลคเฮ้าส์ด้วย AdventureWorksDW
ก่อนอื่นสร้างเลคเฮ้าส์และกรอกข้อมูลที่จําเป็น
ถ้าคุณมีอินสแตนซ์ของ AdventureWorksDW อยู่แล้วในคลังหรือเลคเฮ้าส์ คุณสามารถข้ามขั้นตอนนี้ได้ ถ้าไม่เป็นเช่นนั้น สร้างเลคเฮาส์จากสมุดบันทึก ใช้สมุดบันทึกเพื่อเติมข้อมูลในเลคเฮ้าส์
สร้างสมุดบันทึกใหม่ในพื้นที่ทํางานที่คุณต้องการสร้างทักษะ AI ของคุณ
ทางด้านซ้ายของบานหน้าต่าง Explorer ให้เลือก + แหล่งข้อมูล ตัวเลือกนี้เพิ่มเลคเฮ้าส์ที่มีอยู่แล้วหรือสร้างเลคเฮ้าส์ใหม่
ในเซลล์ด้านบนสุด ให้เพิ่มส่วนย่อยของโค้ดต่อไปนี้:
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)
เลือกเรียกใช้ทั้งหมด
หลังจากนั้นไม่กี่นาทีเลคเฮ้าส์จะมีข้อมูลที่จําเป็น
สร้างทักษะ AI
หากต้องการสร้างทักษะ AI ใหม่ ให้ไปที่ ประสบการณ์ด้านวิทยาศาสตร์ ข้อมูล และเลือก ทักษะ AI
ป้อนชื่อเพื่อสร้างทักษะ AI
เลือกข้อมูล
เลือกเลคเฮ้าส์ที่คุณสร้างขึ้น และเลือกเชื่อมต่อ จากนั้นคุณต้องเลือกตารางที่คุณต้องการให้ทักษะ AI มีการเข้าถึงที่พร้อมใช้งาน
แบบฝึกหัดนี้ใช้ตารางเหล่านี้:
DimCustomer
DimDate
DimGeography
DimProduct
DimProductCategory
DimPromotion
DimReseller
DimSalesTerritory
FactInternetSales
FactResellerSales
ให้คําแนะนํา
เมื่อคุณถามคําถามเกี่ยวกับทักษะ AI ด้วยตารางที่ระบุไว้ครั้งแรก ทักษะของ AI จะตอบคําถามเหล่านั้นได้อย่างเป็นธรรม ตัวอย่างเช่น สําหรับคําถาม ผลิตภัณฑ์ที่ขายได้มากที่สุดคืออะไร ทักษะ AI จะส่งกลับ:
Long-Sleeve Logo Jersey, L
อย่างไรก็ตาม คิวรี SQL ต้องการการปรับปรุงบางอย่าง ก่อนอื่น จะดู FactResellerSales
ที่ตารางเท่านั้น ซึ่งจะ FactInternetSales
ละเว้นตาราง ประการที่สอง จะสั่งซื้อผลิตภัณฑ์ตามปริมาณคําสั่งซื้อ เมื่อรายได้ยอดขายทั้งหมดที่เกี่ยวข้องกับผลิตภัณฑ์เป็นการพิจารณาที่สําคัญที่สุด ดังที่แสดงในภาพหน้าจอนี้:
เพื่อปรับปรุงการสร้างคิวรี ให้ระบุคําแนะนําบางอย่างดังที่แสดงในตัวอย่างเหล่านี้:
- เมื่อใดก็ตามที่ฉันถามเกี่ยวกับผลิตภัณฑ์หรือรายการ "ที่ขายมากที่สุด" เมตริกของดอกเบี้ยคือรายได้ยอดขายรวมและไม่ใช่ปริมาณการสั่งซื้อ
- ตารางหลักที่จะใช้คือ
FactInternetSales
ใช้FactResellerSales
เฉพาะในกรณีที่ถูกถามอย่างชัดเจนเกี่ยวกับการขายต่อ หรือเมื่อถูกถามเกี่ยวกับยอดขายทั้งหมด
การถามคําถามอีกครั้งจะส่งกลับคําตอบที่แตกต่างกัน ดัง Mountain-200 Black, 46
ที่แสดงในภาพหน้าจอนี้:
SQL ที่สอดคล้องกันดึงมาจาก FactInternetSales
ตาราง และเรียงลําดับตามผลรวมของยอดขาย AI ทําตามคําแนะนํา
เมื่อคุณดําเนินต่อเพื่อทดลองกับคิวรี คุณควรเพิ่มคําแนะนําเพิ่มเติม
สถานการณ์นี้ใช้ชุดคําแนะนําต่อไปนี้:
- เมื่อใดก็ตามที่ฉันถามเกี่ยวกับผลิตภัณฑ์หรือรายการ "ที่ขายมากที่สุด" เมตริกของดอกเบี้ยคือรายได้จากการขายและไม่ใช่ปริมาณการสั่งซื้อ
- ตารางหลักที่จะใช้คือ
FactInternetSales
ใช้FactResellerSales
เฉพาะในกรณีที่ถูกถามอย่างชัดเจนเกี่ยวกับการขายต่อ หรือเมื่อถูกถามเกี่ยวกับยอดขายทั้งหมด - เมื่อถามเกี่ยวกับผลกระทบของการส่งเสริมการขาย ให้ทําเช่นนั้นกับการเพิ่มรายได้จากการขาย ไม่ใช่แค่จํานวนหน่วยที่ขายเท่านั้น
- สําหรับข้อมูลเชิงลึกของลูกค้า ให้มุ่งเน้นไปที่ยอดขายทั้งหมดต่อลูกค้าแทนที่จะเป็นจํานวนคําสั่งซื้อ
- ใช้
DimDate
เพื่อแยกช่วงเวลาเฉพาะ (ตัวอย่างเช่น ปี เดือน) เมื่อดําเนินการวิเคราะห์ตามเวลา - เมื่อวิเคราะห์ข้อมูลทางภูมิศาสตร์ ให้จัดลําดับความสําคัญของรายได้การขายทั้งหมดและยอดขายเฉลี่ยต่อคําสั่งซื้อสําหรับแต่ละภูมิภาค
- สําหรับข้อมูลเชิงลึกประเภทผลิตภัณฑ์ ใช้
DimProductCategory
เพื่อจัดกลุ่มผลิตภัณฑ์ตามนั้นเสมอ - เมื่อเปรียบเทียบยอดขายระหว่างภูมิภาค ใช้
DimSalesTerritory
เพื่อรายละเอียดดินแดนที่ถูกต้อง - ใช้
DimCurrency
เพื่อทําให้ข้อมูลการขายเป็นมาตรฐานหากวิเคราะห์ยอดขายในสกุลเงินที่แตกต่างกัน - สําหรับข้อมูลผลิตภัณฑ์โดยละเอียด ให้เข้าร่วม
FactInternetSales
กับDimProduct
เสมอ - ใช้
DimPromotion
เพื่อวิเคราะห์ประสิทธิภาพของแคมเปญส่งเสริมการขายที่แตกต่างกัน - เพื่อประสิทธิภาพของผู้จําหน่าย ให้มุ่งเน้นไปที่ยอดขายรวม ไม่ใช่แค่จํานวนผลิตภัณฑ์ที่ขายเท่านั้น
- เมื่อวิเคราะห์แนวโน้มเมื่อเวลาผ่านไป ใช้
FactInternetSales
และรวมกับDimDate
การจัดกลุ่มข้อมูลตามเดือน ไตรมาส หรือปี - ตรวจสอบความสอดคล้องของข้อมูลโดยการ
FactInternetSales
เชื่อมกับตารางมิติที่เกี่ยวข้องเสมอ - ใช้ SUM เพื่อรวมข้อมูลยอดขายเพื่อให้แน่ใจว่าคุณกําลังจัดเก็บค่าทั้งหมดอย่างถูกต้อง
- จัดลําดับความสําคัญของเมตริกรายได้การขายเทียบกับปริมาณการสั่งซื้อเพื่อวัดผลกระทบทางการเงินได้อย่างถูกต้อง
- จัดกลุ่มตามมิติที่เกี่ยวข้องเสมอ (ตัวอย่างเช่น ผลิตภัณฑ์ ลูกค้า วันที่) เพื่อรับข้อมูลเชิงลึกโดยละเอียด
- เมื่อถามเกี่ยวกับข้อมูลประชากรของลูกค้า ให้รวม
DimCustomer
กับตารางข้อเท็จจริงที่เกี่ยวข้อง - สําหรับยอดขายตามการส่งเสริมการขาย ให้เข้าร่วม
FactInternetSales
และDimPromotion
จัดกลุ่มตามชื่อโปรโมชัน - ปรับตัวเลขการขายให้เป็นมาตรฐานสําหรับการ
DimCurrency
เปรียบเทียบที่เกี่ยวข้องกับสกุลเงินที่แตกต่างกัน - ใช้
ORDER BY
คําสั่งย่อยเพื่อเรียงลําดับผลลัพธ์ตามเมตริกความสนใจ (ตัวอย่างเช่น รายได้จากการขาย คําสั่งซื้อทั้งหมด) ListPrice
ในDimProduct
คือราคาขายที่แนะนํา ในขณะที่UnitPrice
ในFactInternetSales
และFactResellerSales
เป็นราคาจริงที่ขายแต่ละหน่วย สําหรับกรณีการใช้ส่วนใหญ่ในรายได้ ควรใช้ราคาต่อหน่วย- จัดอันดับตัวแทนจําหน่ายอันดับสูงสุดตามปริมาณยอดขาย
หากคุณคัดลอกข้อความนี้ลงในบันทึกย่อสําหรับกล่องข้อความแบบจําลอง AI จะอ้างอิงถึงคําแนะนําเหล่านี้เมื่อสร้างคิวรี SQL
แสดงตัวอย่าง
นอกเหนือจากคําแนะนําแล้ว ตัวอย่างยังทําหน้าที่เป็นอีกวิธีหนึ่งที่มีประสิทธิภาพในการแนะนํา AI หากคุณมีคําถามว่าทักษะ AI ของคุณมักจะได้รับหรือคําถามที่จําเป็นต้องมีการเข้าร่วมที่ซับซ้อนให้พิจารณาเพิ่มตัวอย่างสําหรับพวกเขา
ตัวอย่างเช่น คําถาม จํานวนลูกค้าที่ใช้งานอยู่เรามีวันที่ 1 มิถุนายน 2013 สร้าง SQL ที่ถูกต้องบางตัวดังที่แสดงในภาพหน้าจอนี้:
อย่างไรก็ตามมันไม่ใช่คําตอบที่ดี
ส่วนหนึ่งของปัญหาคือ "ลูกค้าที่ใช้งานอยู่" ไม่มีข้อกําหนดทางการ คําแนะนําเพิ่มเติมในบันทึกย่อถึงกล่องข้อความแบบจําลองอาจช่วยได้ แต่ผู้ใช้อาจถามคําถามนี้บ่อย คุณจําเป็นต้องตรวจสอบให้แน่ใจว่า 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, -1, 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 จะไม่มีค่า URL ที่เผยแพร่ตามที่แสดงในภาพหน้าจอนี้:
หลังจากที่คุณตรวจสอบประสิทธิภาพของทักษะ AI คุณอาจตัดสินใจที่จะเผยแพร่ ในกรณีนี้ เลือก เผยแพร่ ดังที่แสดงในภาพหน้าจอนี้:
URL ที่เผยแพร่สําหรับทักษะ AI จะปรากฏขึ้น ดังที่แสดงในภาพหน้าจอนี้:
จากนั้นคุณสามารถคัดลอก 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"])