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
- Um recurso de capacidade do Fabric F64 ou superior pago.
- Alternância de locatário de habilidade de IA está habilitada.
- O parâmetro de locatário do Copilot está habilitado.
- O compartilhamento entre áreas geográficas para IA está habilitado, se relevante.
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.
Crie um novo notebook no espaço de trabalho em que deseja criar sua habilidade de IA.
No lado esquerdo do painel Explorer, selecione + Fontes de dados. Essa opção adiciona um lakehouse existente ou cria um novo.
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)
Selecione Executar tudo.
Após alguns minutos, o lakehouse é preenchido com os dados necessários.
Criar uma habilidade de IA
Para criar uma nova habilidade de IA, navegue até a experiência de Ciência de Dados e selecione o item Habilidade de IA.
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:
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
. UseFactResellerSales
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:
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
. UseFactResellerSales
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
comDimProduct
. - 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 comDimDate
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
comDimPromotion
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
emDimProduct
é 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 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:
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.
Então você pode fazer upload de um exemplo.
Uma repetição da pergunta cria uma resposta melhor.
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:
Antes de publicar a habilidade de IA, ela não tem um valor de URL publicada, conforme mostrado nesta captura de tela:
Após validar o desempenho da habilidade de IA, você pode decidir publicá-la. Nesse caso, selecione Publicar conforme mostrado nesta captura de tela:
A URL publicada para a habilidade de IA é exibida, conforme mostrado nesta captura de tela:
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"])