Compartir a través de


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

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.

  1. Cree un cuaderno nuevo en el área de trabajo donde quiera crear la habilidad de IA.

  2. 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.

  3. 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)
    
  4. Seleccione Run all (Ejecutar todas).

    Captura de pantalla que muestra un cuaderno con el código de carga de AdventureWorks.

Después de unos minutos, el lago de datos se completa con los datos necesarios.

Creación de una habilidad de IA

  1. Para crear una nueva capacidad de IA, vaya a la experiencia de Ciencia de datos y seleccione Habilidad de IA.

    Captura de pantalla que muestra dónde crear habilidades de IA.

  2. 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:

Captura de pantalla que muestra el primer ejemplo de pregunta de producto de ventas más altas con una habilidad de IA.

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 solo FactResellerSales 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:

Captura de pantalla que muestra el segundo ejemplo de pregunta de producto de ventas más altas con una habilidad de IA.

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 solo FactResellerSales 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 con DimProduct.
  • 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 con DimDate 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 con DimPromotion 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 en DimProduct es el precio de venta sugerido, mientras UnitPrice que en FactInternetSales y FactResellerSales 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:

Captura de pantalla que muestra el primer ejemplo de pregunta de recuento de clientes activos con una habilidad de IA.

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.

Captura de pantalla que muestra dónde puede editar los ejemplos que proporciona a la IA.

A continuación, puede cargar un ejemplo.

Captura de pantalla que muestra una consulta SQL con una habilidad de IA de ejemplo.

Una repetición de la pregunta devuelve una respuesta mejorada.

Captura de pantalla que muestra el segundo ejemplo de pregunta de recuento de clientes activos con una habilidad de IA.

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:

Captura de pantalla que muestra la selección de la configuración de habilidades de IA.

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:

Captura de pantalla que muestra que una habilidad de IA no tiene un valor de dirección URL publicado antes de la publicación.

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:

Captura de pantalla que muestra la selección de la opción Publicar.

Aparece la dirección URL publicada de la habilidad de IA, como se muestra en esta captura de pantalla:

Captura de pantalla que muestra la URL publicada.

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"])