Ejemplo de una habilidad de IA con el conjunto de datos AdventureWorks (versión preliminar)
En este artículo se muestra como configurar una habilidad de IA en el conjunto de datos AdventureWorks.
Importante
Esta característica se encuentra en versión preliminar.
Requisitos previos
- Una capacidad F64 Microsoft Fabric o superior.
- El conmutador de suscriptor de Copilot está habilitado.
- El uso compartido entre regiones geográficas para la IA está habilitado, si es pertinente.
Creación de un lago de datos con AdventureWorksDW
En primer lugar, cree un lago de datos y complételo con los datos necesarios.
Si ya tiene una instancia de AdventureWorksDW en un almacén o lago de datos, puede omitir este paso. Si no es así, cree una instancia de lago de datos a partir de un cuaderno. Use el cuaderno para rellenar el lago con los datos.
Cree un cuaderno nuevo en el área de trabajo donde quiera crear la habilidad de IA.
En el lado izquierdo del panel Explorador, seleccione + Orígenes de datos. Esta opción añade un lago de datos existente o crea uno nuevo.
En la celda superior, añada el siguiente fragmento de código:
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)
Seleccione Run all (Ejecutar todas).
Después de unos minutos, el lago de datos se completa con los datos necesarios.
Creación de una habilidad de IA
Para crear una nueva capacidad de IA, vaya a la experiencia de Ciencia de datos y seleccione Habilidad de IA.
Introduzca un nombre para crear una habilidad de IA.
Selección de los datos:
Seleccione el lago de datos que ha creado y seleccione Conectar. A continuación, debe seleccionar las tablas para las que desea que la habilidad de IA tenga acceso disponible.
En este ejercicio se usan estas tablas:
DimCustomer
DimDate
DimGeography
DimProduct
DimProductCategory
DimPromotion
DimReseller
DimSalesTerritory
FactInternetSales
FactResellerSales
Especificación de instrucciones
Cuando se formulan por primera vez las preguntas sobre las habilidades de IA con las tablas enumeradas seleccionadas, la habilidad de IA las responde bastante bien. Por ejemplo, para la pregunta ¿Cuál es el producto más vendido?, la habilidad de IA responde:
Long-Sleeve Logo Jersey, L
Sin embargo, la consulta SQL necesita alguna mejora. En primer lugar, solo examina la tabla FactResellerSales
. Omite la tabla FactInternetSales
. En segundo lugar, ordena los productos por cantidad de pedidos, cuando los ingresos totales de ventas asociados al producto son la consideración más importante, como se muestra en esta captura de pantalla:
Para mejorar la generación de consultas, proporcione instrucciones, como se muestra en estos ejemplos:
- Siempre que pregunte sobre los productos o artículos más vendidos, la métrica de interés es el total de ingresos de ventas y no la cantidad de pedidos.
- La tabla principal que debe utilizarse es
FactInternetSales
. Use soloFactResellerSales
si se le pregunta explícitamente sobre las reventas o cuando se le pregunte sobre las ventas totales.
Si vuelve a hacer la pregunta, obtendrá una respuesta diferente, como se muestra en esta captura de pantalla:
El SQL correspondiente se basa en la tabla FactInternetSales
y se ordena por la suma de la cantidad de ventas. La IA ha seguido las instrucciones.
A medida que continúa experimentando con las consultas, debe agregar más instrucciones.
Este escenario utiliza el siguiente conjunto de instrucciones:
- Siempre que pregunte sobre los productos o artículos más vendidos, la métrica de interés son los ingresos de ventas y no la cantidad de pedidos.
- La tabla principal que debe utilizarse es
FactInternetSales
. Use soloFactResellerSales
si se le pregunta explícitamente sobre las reventas o cuando se le pregunte sobre las ventas totales. - Cuando se pregunte sobre el impacto de las promociones, hágalo sobre el aumento de los ingresos de ventas, no solo sobre el número de unidades vendidas.
- Para obtener información sobre los clientes, céntrese en la cantidad total de ventas por cliente en lugar del número de pedidos.
- Utilice
DimDate
para extraer períodos de tiempo específicos (por ejemplo, año, mes) al realizar análisis basados en el tiempo. - Al analizar datos geográficos, priorice los ingresos totales de ventas y las ventas medias por pedido para cada región.
- Para obtener información sobre las categorías de productos, utilice siempre
DimProductCategory
para agrupar los productos en consecuencia. - Al comparar las ventas entre regiones, utilice
DimSalesTerritory
para obtener detalles precisos del territorio. - Utilice
DimCurrency
para normalizar los datos de ventas si analiza las ventas en distintas monedas. - Para obtener información detallada del producto, únase siempre a
FactInternetSales
conDimProduct
. - Utilice
DimPromotion
para analizar la eficacia de diferentes campañas promocionales. - Para el rendimiento de los revendedores, céntrese en la cantidad total de ventas y no solo en el número de productos vendidos.
- Al analizar tendencias a lo largo del tiempo, utilice
FactInternetSales
y combínelo conDimDate
para agrupar los datos por mes, trimestre o año. - Compruebe siempre la coherencia de los datos mediante la combinación de
FactInternetSales
con las tablas de dimensiones correspondientes. - Utilice SUM para agregar datos de ventas para asegurarse de que captura los valores totales con precisión.
- Dé prioridad a las métricas de ingresos de ventas sobre la cantidad de pedidos para medir el impacto financiero con precisión.
- Agrupe siempre por dimensiones relevantes (por ejemplo, producto, cliente, fecha) para obtener información detallada.
- Cuando se le pregunte sobre los datos demográficos de los clientes, combínelo con
DimCustomer
con las tablas de hechos pertinentes. - Para ventas por promoción, combine
FactInternetSales
conDimPromotion
y agrupe por nombre de promoción. - Normalice las cifras de ventas con
DimCurrency
para comparaciones que implican diferentes monedas. - Use cláusulas
ORDER BY
para ordenar los resultados por la métrica de interés (por ejemplo, ingresos de ventas, pedidos totales). ListPrice
enDimProduct
es el precio de venta sugerido, mientrasUnitPrice
que enFactInternetSales
yFactResellerSales
es el precio real al que se vendió cada unidad. Para la mayoría de los casos de uso de los ingresos, se debe usar el precio unitario.- Clasificación de los principales revendedores por cantidad de ventas.
Si copia este texto en el cuadro de texto Notas del modelo, la IA hace referencia a estas instrucciones cuando genera sus consultas SQL.
Provisión de ejemplos
Además de las instrucciones, los ejemplos sirven como otra manera eficaz de guiar la IA. Si tiene preguntas que recibe a menudo la habilidad de IA o preguntas que requieren combinaciones complejas, considere la posibilidad de agregar ejemplos para ellas.
Por ejemplo, la pregunta: ¿Cuántos clientes activos teníamos el 1 de junio de 2013? genera una SQL válida, como se muestra en esta captura de pantalla:
Sin embargo, no es una buena respuesta.
Parte del problema es que "cliente activo" no tiene una definición formal. Puede ayudar disponer de más instrucciones en el cuadro de texto Notas para el modelo, pero los usuarios pueden formular con frecuencia esta pregunta. Asegúrese de que la IA responde a la pregunta correctamente. La consulta pertinente es moderadamente compleja, por lo que debe proporcionar un ejemplo seleccionando el botón Editar.
A continuación, puede cargar un ejemplo.
Una repetición de la pregunta devuelve una respuesta mejorada.
Puede agregar ejemplos manualmente, pero también puede cargarlos desde un archivo JSON. Proporcionar ejemplos de un archivo es útil cuando tiene muchas consultas SQL que desea cargar a la vez, en lugar de cargar manualmente las consultas una por una. Para este ejercicio, utilice estos ejemplos:
{
"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;",
}
Prueba y revisión de la habilidad de IA
Tanto las instrucciones como los ejemplos se agregaron a la habilidad de IA. A medida que continúan las pruebas, más ejemplos e instrucciones pueden mejorar aún más la habilidad de IA. Trabaje con sus compañeros para ver si ha proporcionado ejemplos e instrucciones que cubran el tipo de preguntas que quieren hacer.
Uso de la habilidad de IA mediante programación
Puede usar la habilidad de IA mediante programación en un cuaderno de Fabric. Para determinar si la habilidad de IA tiene o no un valor de dirección URL publicada, seleccione Configuración, como se muestra en esta captura de pantalla:
Antes de publicar la habilidad de IA, esta no tiene un valor de dirección URL publicada, como se muestra en la siguiente captura de pantalla:
Cuando valide el rendimiento de la habilidad de IA, puede decidir publicarlo. En este caso, seleccione Publicar, como se muestra en esta captura de pantalla:
Aparece la dirección URL publicada de la habilidad de IA, como se muestra en esta captura de pantalla:
A continuación, puede copiar la dirección URL publicada y utilizarla en el cuaderno de Fabric. De este modo, puede consultar la habilidad de IA realizando llamadas a la API de la habilidad de IA en un cuaderno de Fabric. Pegue la dirección URL copiada en este fragmento de código. A continuación, reemplace la pregunta por cualquier consulta relevante para la habilidad de IA. Este ejemplo utiliza \<generic published URL value\>
como dirección 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"])