Exemplo de habilidade de IA com o conjunto de dados AdventureWorks (visualização)

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

Importante

Este recurso está em pré-visualização.

Pré-requisitos

Crie uma casa no lago com o AdventureWorksDW

Primeiro, crie uma casa de lago e preencha-a com os dados necessários.

Se você já tiver uma instância do AdventureWorksDW em um armazém ou lakehouse, ignore esta etapa. Caso contrário, crie uma casa de lago a partir de um caderno. Use o bloco de anotações para preencher a casa do lago com os dados.

  1. Crie um novo bloco de anotações no espaço de trabalho onde você deseja criar sua habilidade de IA.

  2. No lado esquerdo do painel Explorer , selecione + Fontes de dados. Esta opção adiciona uma lakehouse existente ou cria uma nova lakehouse.

  3. Na célula superior, adicione o seguinte trecho 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 bloco de anotações com o código de carregamento do AdventureWorks.

Depois de alguns minutos, a casa do lago é preenchida com os dados necessários.

Crie uma habilidade de IA

  1. Para criar uma nova habilidade de IA, vá para a experiência de Ciência de Dados e selecione Habilidade de IA.

    Captura de tela mostrando onde criar habilidades de IA.

  2. Insira um nome para criar uma habilidade de IA.

Selecione os dados

Selecione a casa do lago que você criou e selecione Conectar. Em seguida, você deve selecionar as tabelas para as quais deseja que a habilidade de IA tenha acesso disponível.

Este exercício utiliza estas tabelas:

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

Fornecer instruções

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

  • Long-Sleeve Logo Jersey, L

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

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

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 de pedidos.
  • A tabela primária a ser usada é FactInternetSales. FactResellerSales Use apenas se for explicitamente perguntado sobre revendas ou quando perguntado sobre vendas totais.

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

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

O SQL correspondente extrai da FactInternetSales tabela e 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 de pedidos.
  • A tabela primária a ser usada é FactInternetSales. FactResellerSales Use apenas se for explicitamente perguntado sobre revendas ou quando perguntado sobre vendas totais.
  • Quando questionado sobre o impacto das promoções, faça-o no aumento da receita de vendas, não apenas no número de unidades vendidas.
  • Para obter informações sobre o cliente, concentre-se no valor total de vendas por cliente em vez do 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 informações sobre a categoria de produto, use DimProductCategory sempre para agrupar produtos de acordo.
  • Ao comparar as vendas entre regiões, use DimSalesTerritory para obter detalhes precisos do território.
  • Use DimCurrency para normalizar dados de vendas se analisar vendas em moedas diferentes.
  • Para obter informações detalhadas sobre o produto, junte-se FactInternetSales sempre ao 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 e junte-se para DimDate agrupar dados por mês, trimestre ou ano.
  • Verifique sempre a consistência dos dados juntando-se FactInternetSales às tabelas de dimensões correspondentes.
  • Use SOMA para agregar dados de vendas para garantir que você esteja capturando valores totais com precisão.
  • Priorize as métricas de receita de vendas sobre a quantidade de pedidos para avaliar o impacto financeiro com precisão.
  • Sempre agrupe por dimensões relevantes (por exemplo, produto, cliente, data) para obter informações detalhadas.
  • Quando perguntado sobre dados demográficos de clientes, junte-se DimCustomer a tabelas de fatos relevantes.
  • Para vendas por promoção, junte-se FactInternetSales e DimPromotion agrupe por nome da promoção.
  • Normalize os números de vendas usando DimCurrency para comparações envolvendo moedas diferentes.
  • Use ORDER BY cláusulas para classificar os resultados pela métrica de interesse (por exemplo, receita de vendas, total de pedidos).
  • ListPrice in 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 em receita, o preço unitário deve ser usado.
  • Classifique os principais revendedores por valor de vendas.

Se você copiar esse texto para as anotações da caixa de texto do modelo, a IA se referirá a essas instruções quando gerar suas consultas SQL.

Forneça exemplos

Além das instruções, os exemplos servem como outra maneira eficaz de guiar a IA. Se você tiver perguntas que sua habilidade de IA costuma receber, ou perguntas que exijam junções complexas, considere adicionar exemplos para 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 habilidade de IA pergunta de contagem de clientes ativos.

No entanto, não é uma boa resposta.

Parte do problema é que "cliente ativo" não tem uma definição formal. Mais instruções nas anotações para a caixa de texto do modelo podem ajudar, mas os usuários podem fazer essa pergunta com frequência. Você precisa ter certeza de que a IA lida 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 fornecidos à IA.

Em seguida, você pode carregar um exemplo.

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

Uma repetição da pergunta devolve uma resposta melhorada.

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

Você pode adicionar exemplos manualmente, mas também pode carregá-los de um arquivo JSON. Fornecer exemplos de um arquivo é útil quando você tem muitas consultas SQL que deseja carregar todas de uma vez, em vez de carregar manualmente as 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, -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;",
}

Teste e revise a habilidade de IA

Instruções e exemplos foram adicionados à habilidade de IA. À medida que os testes prosseguem, 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 abrangem os tipos de perguntas que eles querem fazer.

Use a habilidade de IA programaticamente

Você pode usar a habilidade de IA programaticamente em um bloco de anotações Fabric. Para determinar se a habilidade de IA tem ou não um valor de URL publicado, 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 publicado, como mostra esta captura de tela:

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

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

Captura de ecrã a mostrar a seleção da opção Publicar.

O URL publicado para a habilidade de IA aparece, como mostrado nesta captura de tela:

Captura de ecrã a mostrar o URL publicado.

Em seguida, você pode copiar a URL publicada e usá-la no bloco de anotações de malha. Dessa forma, você pode consultar a habilidade de IA fazendo chamadas para a API de habilidade de IA em um bloco de anotações do Fabric. Cole o URL copiado neste trecho 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 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"])