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
- Uma capacidade F64 Microsoft Fabric ou superior.
- A opção de locatário do copiloto está habilitada.
- O compartilhamento entre geos para IA está habilitado, se relevante.
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.
Crie um novo bloco de anotações no espaço de trabalho onde você deseja criar sua habilidade de IA.
No lado esquerdo do painel Explorer , selecione + Fontes de dados. Esta opção adiciona uma lakehouse existente ou cria uma nova lakehouse.
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)
Selecione Executar tudo.
Depois de alguns minutos, a casa do lago é preenchida com os dados necessários.
Crie uma habilidade de IA
Para criar uma nova habilidade de IA, vá para a experiência de Ciência de Dados e selecione Habilidade de IA.
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:
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, 46
como mostrado nesta captura de tela:
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 aoDimProduct
. - 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 paraDimDate
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
eDimPromotion
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
inDimProduct
é o preço de venda sugerido, enquantoUnitPrice
emFactInternetSales
eFactResellerSales
é 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:
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.
Em seguida, você pode carregar um exemplo.
Uma repetição da pergunta devolve uma resposta melhorada.
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:
Antes de publicar a habilidade de IA, ela não tem um valor de URL publicado, como mostra esta captura de tela:
Depois de validar o desempenho da habilidade de IA, você pode decidir publicá-la. Nesse caso, selecione Publicar, conforme mostrado nesta captura de tela:
O URL publicado para a habilidade de IA aparece, como mostrado nesta captura de tela:
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"])