Пример навыка ИИ с набором данных AdventureWorks (предварительная версия)
В этой статье показано, как настроить навык ИИ в наборе данных AdventureWorks.
Внимание
Эта функция доступна в предварительной версии.
Необходимые компоненты
- Емкость Microsoft Fabric F64 или выше.
- Включен коммутатор клиента Copilot.
- Межрегиоционный общий доступ для ИИ включен, если это необходимо.
Создание озера с помощью AdventureWorksDW
Сначала создайте озеро и заполните его необходимыми данными.
Если у вас уже есть экземпляр AdventureWorksDW в складе или озерном доме, этот шаг можно пропустить. Если нет, создайте lakehouse из записной книжки. Используйте записную книжку для заполнения lakehouse данными.
Создайте записную книжку в рабочей области, в которой вы хотите создать навык искусственного интеллекта.
В левой части области обозревателя выберите +Источники данных. Этот параметр добавляет существующий lakehouse или создает новый лейкхаус.
В верхней ячейке добавьте следующий фрагмент кода:
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)
Выберите элемент Запустить все.
Через несколько минут озеро заполняется необходимыми данными.
Создание навыка искусственного интеллекта
Чтобы создать новый навык ИИ, перейдите к интерфейсу Обработка и анализ данных и выберите навык ИИ.
Введите имя для создания навыка искусственного интеллекта.
Выбор данных
Выберите созданное озеро и нажмите кнопку "Подключиться". Затем необходимо выбрать таблицы, для которых должен быть доступен навык искусственного интеллекта.
В этом упражнении используются следующие таблицы:
DimCustomer
DimDate
DimGeography
DimProduct
DimProductCategory
DimPromotion
DimReseller
DimSalesTerritory
FactInternetSales
FactResellerSales
Укажите инструкции
Когда вы сначала задаете вопросы о навыке ИИ с выбранными таблицами, навык искусственного интеллекта отвечает на них довольно хорошо. Например, для вопроса , что является наиболее продаваемым продуктом?, навык ИИ возвращает:
Long-Sleeve Logo Jersey, L
Однако sql-запросу требуется некоторое улучшение. Во-первых, он смотрит только на таблицу FactResellerSales
. Она игнорирует таблицу FactInternetSales
. Во-вторых, он заказывает продукты по количеству заказов, когда общий доход от продаж, связанный с продуктом, является наиболее важным фактором, как показано на этом снимке экрана:
Чтобы улучшить создание запросов, укажите некоторые инструкции, как показано в следующих примерах:
- Всякий раз, когда я спрашиваю о "наиболее проданных" продуктах или товарах, метрика интереса является общим доходом от продаж, а не количеством заказов.
- Основная таблица, используемая, —
FactInternetSales
это . ИспользуетсяFactResellerSales
только в том случае, если явно спросили о перепродаже или когда его спросили об общем объеме продаж.
Запрос вопроса снова возвращает другой ответ, Mountain-200 Black, 46
как показано на снимке экрана:
Соответствующий SQL извлекает из FactInternetSales
таблицы и сортирует по сумме суммы продаж. ИИ последовал за инструкциями.
Продолжая экспериментировать с запросами, необходимо добавить дополнительные инструкции.
В этом сценарии используется следующий набор инструкций:
- Всякий раз, когда я спрашиваю о "наиболее проданных" продуктах или товарах, метрика интереса — выручка от продаж, а не количество заказов.
- Основная таблица, используемая, —
FactInternetSales
это . ИспользуетсяFactResellerSales
только в том случае, если явно спросили о перепродаже или когда его спросили об общем объеме продаж. - Отвечая на вопрос о влиянии рекламных акций, сделайте это на увеличение доходов от продаж, а не только количество проданных единиц.
- Для аналитики клиентов сосредоточьтесь на общем объеме продаж на каждого клиента, а не на количестве заказов.
- Используется
DimDate
для извлечения определенных периодов времени (например, года, месяца) при выполнении анализа на основе времени. - При анализе географических данных определите общий доход от продаж и средний объем продаж для каждого региона.
- Для аналитики категорий продуктов всегда используйте
DimProductCategory
для группирования продуктов соответствующим образом. - При сравнении продаж между регионами используйте
DimSalesTerritory
точные сведения о территории. - Используется
DimCurrency
для нормализации данных о продажах при анализе продаж в разных валютах. - Для получения подробных сведений о продукте всегда присоединяйтесь
FactInternetSales
кDimProduct
. - Используется
DimPromotion
для анализа эффективности различных рекламных кампаний. - Для повышения производительности торгового посредника сосредоточьтесь на общем объеме продаж, а не только на количестве проданных продуктов.
- При анализе тенденций с течением времени используйте и присоединитесь
FactInternetSales
кDimDate
группе данных по месяцам, кварталам или годам. - Всегда проверяйте согласованность данных, присоединяясь
FactInternetSales
к соответствующим таблицам измерений. - Используйте SUM для агрегирования данных о продажах, чтобы обеспечить точное получение общих значений.
- Определите приоритеты метрик доходов от продаж по количеству заказов, чтобы точно оценить финансовое влияние.
- Всегда группировать по соответствующим измерениям (например, продукту, клиенту, дате) для получения подробных сведений.
- Отвечая на вопрос о демографических данных клиентов, присоединяйтесь
DimCustomer
к соответствующим таблицам фактов. - Для продаж по продвижению, присоединяйтесь
FactInternetSales
кDimPromotion
группе и группу по имени промоушена. - Нормализованные показатели продаж, использующие для сравнения с
DimCurrency
различными валютами. - Используйте
ORDER BY
предложения для сортировки результатов по метрикам интереса (например, выручка от продаж, общий объем заказов). ListPrice
вDimProduct
предлагаемой цене продажи, в то время какUnitPrice
вFactInternetSales
иFactResellerSales
является фактической ценой, по которой каждая единица была продана. В большинстве случаев использования по доходу следует использовать цену единицы.- Ранжирование лучших торговых посредников по сумме продаж.
При копировании этого текста в заметки для текстового поля модели ИИ ссылается на эти инструкции при создании запросов SQL.
Укажите примеры
Помимо инструкций, примеры служат еще одним эффективным способом руководства по ИИ. Если у вас есть вопросы, которые навык ИИ часто получает, или вопросы, требующие сложных соединений, рассмотрите возможность добавления примеров для них.
Например, вопрос о том, сколько активных клиентов у нас есть 1 июня 2013 г., создает некоторые допустимые SQL, как показано на этом снимке экрана:
Однако это не хороший ответ.
Часть проблемы заключается в том, что "активный клиент" не имеет формального определения. Дополнительные инструкции в примечаниях к текстовому поле модели могут помочь, но пользователи могут часто задавать этот вопрос. Необходимо убедиться, что ИИ правильно обрабатывает вопрос. Соответствующий запрос является умеренно сложным, поэтому укажите пример, нажав кнопку редактирования.
Затем можно отправить пример.
Повтор вопроса возвращает улучшенный ответ.
Вы можете вручную добавить примеры, но их также можно отправить из JSON-файла. Предоставление примеров из файла полезно при наличии нескольких запросов SQL, которые вы хотите отправить одновременно, а не вручную отправлять запросы по одному. В этом упражнении используйте следующие примеры:
{
"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;",
}
Тестирование и изменение навыка искусственного интеллекта
В навык искусственного интеллекта добавлены инструкции и примеры. По мере того как тестирование продолжается, дополнительные примеры и инструкции могут еще больше улучшить навык ИИ. Обратитесь к коллегам, чтобы узнать, приведены ли примеры и инструкции, которые охватывают типы вопросов, которые они хотят задать.
Использование навыка искусственного интеллекта программным способом
Навык искусственного интеллекта можно использовать программным способом в записной книжке Fabric. Чтобы определить, имеет ли навык ИИ значение опубликованного URL-адреса, выберите "Параметры", как показано на снимке экрана:
Перед публикацией навыка ИИ он не имеет опубликованного ЗНАЧЕНИЯ URL-адреса, как показано на этом снимке экрана:
После проверки производительности навыка искусственного интеллекта его можно опубликовать. В этом случае выберите "Опубликовать", как показано на снимке экрана:
Появится опубликованный URL-адрес для навыка искусственного интеллекта, как показано на этом снимке экрана:
Затем вы можете скопировать опубликованный URL-адрес и использовать его в записной книжке Fabric. Таким образом, вы можете запросить навык ИИ, выполнив вызовы API навыков ИИ в записной книжке Fabric. Вставьте скопированный URL-адрес в фрагмент кода. Затем замените вопрос любым запросом, соответствующим навыку ИИ. Этот пример используется \<generic published URL value\>
в качестве 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"])