Compartilhar via


Exemplo de habilidade de IA com o conjunto de dados AdventureWorks (preview)

Este artigo mostra como configurar uma habilidade de IA no conjunto de dados AdventureWorks.

Importante

Esse recurso está em preview.

Pré-requisitos

Crie um lakehouse com AdventureWorksDW

Primeiro, crie um lakehouse e preencha-o com os dados necessários.

Se você já tiver uma instância de AdventureWorksDW em um depósito ou lakehouse, poderá ignorar esta etapa. Caso contrário, crie um lakehouse a partir de um notebook. Use o notebook para preencher o lakehouse com os dados.

  1. Crie um novo notebook no espaço de trabalho em que deseja criar sua habilidade de IA.

  2. No lado esquerdo do painel Explorer, selecione + Fontes de dados. Essa opção adiciona um lakehouse existente ou cria um novo.

  3. Na célula superior, adicione o seguinte snippet 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. Selecione Executar tudo.

    Captura de tela mostrando um Notebook com o código de upload do AdventureWorks.

Após alguns minutos, o lakehouse é preenchido com os dados necessários.

Criar uma habilidade de IA

  1. Para criar uma nova habilidade de IA, navegue até a experiência de Ciência de Dados e selecione o item Habilidade de IA.

    Captura de tela que mostra o local em que uma habilidade de IA pode ser criada.

  2. Forneça um nome para criar uma habilidade de IA.

Selecione os dados

Selecione o lakehouse que você criou e, em seguida, Conectar. Em seguida, você deverá selecionar as tabelas para as quais deseja que a habilidade de IA tenha acesso disponível.

Este exercício usa estas tabelas:

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

Fornecer instruções

Quando você faz perguntas sobre a habilidade de IA pela primeira vez com as tabelas listadas selecionadas, a habilidade de IA responde muito bem. Por exemplo, para a pergunta Qual é o produto mais vendido, a habilidade de IA responde:

  • Long-Sleeve Logo Jersey, L

No entanto, a consulta SQL precisa de algumas melhorias. Primeiro, ela só olha para a tabela FactResellerSales. Ela ignora a tabela FactInternetSales. Em segundo lugar, ela ordena os produtos por quantidade do pedido, quando a receita total de vendas associada ao produto é a consideração mais importante, conforme mostrado nesta captura de tela:

Captura de tela mostrando o primeiro exemplo de pergunta de produto de vendas mais alta da habilidade de IA.

Para melhorar a geração de consultas, forneça algumas instruções, conforme mostrado nestes exemplos:

  • Sempre que pergunto sobre os produtos ou itens "mais vendidos", a métrica de interesse é a receita total de vendas, e não a quantidade do pedido.
  • A chave primária da tabela a ser usada é FactInternetSales. Use FactResellerSales somente se a pergunta for explicitamente sobre revendas ou quando perguntado sobre o total de vendas.

Fazer a pergunta novamente retorna uma resposta diferente, Mountain-200 Black, 46, conforme mostrado nesta captura de tela:

Captura de tela mostrando o segundo exemplo de pergunta de produto de vendas mais alta da habilidade de IA.

O SQL correspondente se baseia na tabela FactInternetSales e a classifica pela soma do valor das vendas. A IA seguiu as instruções.

À medida que você continua a experimentar consultas, você deve adicionar mais instruções.

Este cenário usa o seguinte conjunto de instruções:

  • Sempre que pergunto sobre os produtos ou itens "mais vendidos", a métrica de interesse é a receita de vendas, e não a quantidade do pedido.
  • A chave primária da tabela a ser usada é FactInternetSales. Use FactResellerSales somente se a pergunta for explicitamente sobre revendas ou quando perguntado sobre o total de vendas.
  • Quando questionado sobre o impacto das promoções, faça a comparação no aumento da receita de vendas, não apenas no número de unidades vendidas.
  • Para obter insights do cliente, concentre-se no valor total de vendas por cliente, e não no número de pedidos.
  • Use DimDate para extrair períodos de tempo específicos (por exemplo, ano, mês) ao executar a análise baseada em tempo.
  • Ao analisar dados geográficos, priorize a receita total de vendas e a média de vendas por pedido para cada região.
  • Para obter insights de categoria de produto, sempre use DimProductCategory para agrupar produtos adequadamente.
  • Ao comparar as vendas entre regiões, use DimSalesTerritory para obter detalhes precisos do território.
  • Use DimCurrency para normalizar os dados de vendas se estiver analisando vendas em moedas diferentes.
  • Para obter informações detalhadas sobre o produto, sempre junte FactInternetSales com DimProduct.
  • Use DimPromotion para analisar a eficácia de diferentes campanhas promocionais.
  • Para o desempenho do revendedor, concentre-se no valor total das vendas e não apenas no número de produtos vendidos.
  • Ao analisar tendências ao longo do tempo, use FactInternetSales junto com DimDate para agrupar dados por mês, trimestre ou ano.
  • Sempre verifique a consistência dos dados unindo FactInternetSales às tabelas de dimensões correspondentes.
  • Use SUM para agregar dados de vendas para garantir que você esteja capturando os valores totais com precisão.
  • Priorize as métricas de receita de vendas sobre a quantidade do pedido para avaliar o impacto financeiro com precisão.
  • Sempre agrupe por dimensões relevantes (por exemplo, produto, cliente, data) para obter insights detalhados.
  • Quando questionado sobre dados demográficos do cliente, junte DimCustomer com tabelas de fatos relevantes.
  • Para vendas por promoção, junte FactInternetSales com DimPromotion e agrupe por nome de promoção.
  • Normalize os números de vendas usando DimCurrency para comparações envolvendo diferentes moedas.
  • Use cláusulas ORDER BY para classificar os resultados pela métrica de interesse (por exemplo, receita de vendas, total de pedidos).
  • ListPrice em DimProduct é o preço de venda sugerido, enquanto UnitPrice em FactInternetSales e FactResellerSales é o preço real pelo qual cada unidade foi vendida. Para a maioria dos casos de uso de receita, deve-se usar o preço unitário.
  • Classifique os principais revendedores por valor de vendas.

Se você copiar esse texto para a caixa de texto de notas para o modelo, a IA consultará essas instruções ao gerar suas consultas SQL.

Forneça exemplos

Além das instruções, os exemplos servem como outra maneira eficaz de orientar a IA. Se você tiver perguntas que sua habilidade de IA recebe com frequência ou perguntas que exigem junções complexas, considere adicionar exemplos a elas.

Por exemplo, a pergunta: Quantos clientes ativos tínhamos em 1º de junho de 2013 gera algum SQL válido, conforme mostrado nesta captura de tela:

Captura de tela mostrando o primeiro exemplo de pergunta de contagem de clientes ativos de habilidade de IA.

No entanto, essa não é uma boa resposta.

Parte do problema é que "cliente ativo" não tem uma definição formal. Mais instruções na caixa de texto de notas para o modelo podem ajudar, mas os usuários podem fazer essa pergunta com frequência. Você deve garantir que a IA lide com a pergunta corretamente. A consulta relevante é moderadamente complexa, portanto, forneça um exemplo selecionando o botão de edição.

Captura de tela mostrando onde você pode editar os exemplos que você fornece à IA.

Então você pode fazer upload de um exemplo.

Captura de tela mostrando um exemplo de consulta SQL de habilidade de IA.

Uma repetição da pergunta cria uma resposta melhor.

Captura de tela mostrando o segundo exemplo de pergunta de contagem de clientes ativos de habilidade de IA.

Você pode adicionar exemplos manualmente, mas também pode fazer upload de um arquivo JSON. Fornecer exemplos de um arquivo é útil quando você tem muitas consultas SQL que deseja fazer upload de uma só vez, em vez de fazer upload manualmente das consultas uma a uma. Para este exercício, use estes exemplos:

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

Testar e revisar a habilidade de IA

Instruções e exemplos foram adicionados à habilidade de IA. À medida que os testes avançam, mais exemplos e instruções podem melhorar ainda mais a habilidade de IA. Trabalhe com seus colegas, para ver se você forneceu exemplos e instruções que cubram os tipos de perguntas que eles gostariam de fazer.

Use a habilidade de IA programaticamente

Você pode usar a habilidade de IA programaticamente em um notebook do Fabric. Para determinar se a habilidade de IA tem ou não um valor de URL publicada, selecione Configurações, conforme mostrado nesta captura de tela:

Captura de tela mostrando a seleção de configurações de habilidades de IA.

Antes de publicar a habilidade de IA, ela não tem um valor de URL publicada, conforme mostrado nesta captura de tela:

Captura de tela mostrando que uma habilidade de IA não tem um valor de URL publicado antes da publicação.

Após validar o desempenho da habilidade de IA, você pode decidir publicá-la. Nesse caso, selecione Publicar conforme mostrado nesta captura de tela:

Captura de tela mostrando a seleção da opção Publicar.

A URL publicada para a habilidade de IA é exibida, conforme mostrado nesta captura de tela:

Captura de tela mostrando a URL publicada.

Em seguida, você pode copiar a URL publicada e usá-la no notebook do Fabric. Dessa forma, você pode consultar a habilidade de IA fazendo chamadas para a API de habilidade de IA em um notebook do Fabric. Cole a URL copiada neste snippet de código. Em seguida, substitua a pergunta por qualquer consulta relevante para sua habilidade de IA. Este exemplo usa \<generic published URL value\> como a 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"])