Contoh keterampilan AI dengan himpunan data AdventureWorks (pratinjau)
Artikel ini menjelaskan cara menyiapkan kemampuan AI, menggunakan lakehouse sebagai sumber data. Untuk mengilustrasikan prosesnya, pertama-tama kita membuat lakehouse, lalu menambahkan data ke dalamnya. Kemudian, kami membuat kemampuan AI dan mengonfigurasi lakehouse sebagai sumber datanya. Jika Anda sudah memiliki model semantik Power BI (dengan izin baca/tulis yang diperlukan), gudang, atau database KQL, Anda bisa mengikuti langkah yang sama setelah membuat keterampilan AI untuk menambahkan sumber data Anda. Meskipun langkah-langkah yang ditampilkan di sini berfokus pada lakehouse, prosesnya mirip dengan sumber data lainnya—Anda hanya perlu membuat penyesuaian berdasarkan pilihan spesifik Anda.
Penting
Fitur ini dalam pratinjau.
Prasyarat
- sumber daya kapasitas F64 berbayar atau Fabric yang lebih tinggi
- Sakelar penyewa keterampilan AI diaktifkan.
- Sakelar penyewa salinan diaktifkan.
- Pemrosesan lintas geo untuk AI diaktifkan.
- Penyimpanan lintas geo untuk AI telah diaktifkan.
- Gudang, lakehouse, model semantik Power BI, dan database KQL yang berisi data.
- Pengalihan penyewa titik akhir XMLA untuk model semantik Power BI diaktifkan untuk sumber data model semantik Power BI.
Membangun lakehouse dengan AdventureWorksLH
Pertama, buat lakehouse dan isi dengan data yang diperlukan.
Jika Anda sudah memiliki instans AdventureWorksLH di lakehouse (atau gudang), Anda dapat melewati langkah ini. Jika tidak, Anda dapat menggunakan instruksi berikut dari notebook Fabric untuk mengisi lakehouse dengan data.
Buat buku catatan baru di ruang kerja tempat Anda ingin membuat keterampilan AI Anda.
Di sisi kiri panel Explorer, pilih + Sumber data. Opsi ini memungkinkan Anda menambahkan lakehouse yang ada atau membuat lakehouse baru. Demi kejelasan, buat lakehouse baru dan tetapkan nama untuk itu.
Di sel atas, tambahkan cuplikan kode berikut:
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)
Pilih Jalankan Semua.
Setelah beberapa menit, lakehouse terisi dengan data yang diperlukan.
Membuat keterampilan AI
Untuk membuat keterampilan AI baru, navigasikan ke ruang kerja Anda dan pilih tombol + Item Baru, seperti yang ditunjukkan pada cuplikan layar ini:
Pada tab Semua item, cari keterampilan AI untuk menemukan opsi yang sesuai. Setelah dipilih, perintah meminta Anda untuk memberikan nama untuk keterampilan AI Anda, seperti yang ditunjukkan pada cuplikan layar ini:
Setelah Anda memasukkan nama, lanjutkan dengan langkah-langkah berikut untuk menyelaraskan keterampilan AI dengan persyaratan spesifik Anda.
Pilih data
Pilih lakehouse yang Anda buat di langkah sebelumnya, lalu pilih Tambahkan. Setelah lakehouse ditambahkan sebagai sumber data, panel Explorer di sisi kiri halaman kemampuan AI akan menampilkan nama lakehouse. Pilih Lakehouse untuk melihat semua tabel yang tersedia. Gunakan kotak centang untuk memilih tabel yang ingin Anda sediakan untuk AI. Untuk skenario ini, pilih tabel ini:
dimcustomer
dimdate
dimgeography
dimproduct
dimproductcategory
dimpromotion
dimreseller
dimsalesterritory
factinternetsales
cactresellersales
Berikan instruksi
Untuk menambahkan instruksi AI, pilih tombol instruksi AI untuk membuka panel instruksi AI di sebelah kanan. Anda dapat menambahkan instruksi berikut.
Sumber data AdventureWorksLH
berisi informasi dari tiga tabel:
-
dimcustomer
, untuk demografi pelanggan terperinci dan informasi kontak -
dimdate
, untuk data terkait tanggal - misalnya, informasi kalender dan fiskal -
dimgeography
, untuk detail geografis termasuk nama kota dan kode wilayah negara.
Gunakan sumber data ini untuk kueri dan analisis yang melibatkan detail pelanggan, peristiwa berbasis waktu, dan lokasi geografis.
Berikan contoh
Untuk menambahkan kueri contoh, pilih tombol Kueri Contoh untuk membuka panel kueri contoh di sebelah kanan. Panel ini menyediakan opsi untuk menambahkan atau mengedit contoh kueri untuk semua sumber data yang didukung. Untuk setiap sumber data, Anda dapat memilih Menambahkan atau Mengedit Contoh Kueri untuk memasukkan contoh yang relevan, seperti yang ditunjukkan pada cuplikan layar berikut:
Di sini, Anda harus menambahkan Contoh kueri untuk sumber data lakehouse yang Anda buat.
Question: Calculate the average percentage increase in sales amount for repeat purchases for every zipcode. Repeat purchase is a purchase subsequent to the first purchase (the average should always be computed relative to the first purchase)
SELECT AVG((s.SalesAmount - first_purchase.SalesAmount) / first_purchase.SalesAmount * 100) AS AvgPercentageIncrease
FROM factinternetsales s
INNER JOIN dimcustomer c ON s.CustomerKey = c.CustomerKey
INNER JOIN dimgeography g ON c.GeographyKey = g.GeographyKey
INNER JOIN (
SELECT *
FROM (
SELECT
CustomerKey,
SalesAmount,
OrderDate,
ROW_NUMBER() OVER (PARTITION BY CustomerKey ORDER BY OrderDate) AS RowNumber
FROM factinternetsales
) AS t
WHERE RowNumber = 1
) first_purchase ON s.CustomerKey = first_purchase.CustomerKey
WHERE s.OrderDate > first_purchase.OrderDate
GROUP BY g.PostalCode;
Question: Show the monthly total and year-to-date total sales. Order by year and month.
SELECT
Year,
Month,
MonthlySales,
SUM(MonthlySales) OVER (PARTITION BY Year ORDER BY Year, Month ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS CumulativeTotal
FROM (
SELECT
YEAR(OrderDate) AS Year,
MONTH(OrderDate) AS Month,
SUM(SalesAmount) AS MonthlySales
FROM factinternetsales
GROUP BY YEAR(OrderDate), MONTH(OrderDate)
) AS t
Nota
Menambahkan contoh pasangan kueri/pertanyaan saat ini tidak didukung untuk sumber data model semantik Power BI.
Menguji dan merevisi keterampilan AI
Sekarang setelah Anda mengonfigurasi keterampilan AI, menambahkan instruksi AI, dan memberikan contoh kueri untuk lakehouse, Anda dapat berinteraksi dengannya dengan mengajukan pertanyaan dan menerima jawaban. Saat melanjutkan pengujian, Anda dapat menambahkan lebih banyak contoh, dan menyempurnakan instruksi, untuk lebih meningkatkan performa keterampilan AI. Berkolaborasi dengan kolega Anda untuk mengumpulkan umpan balik, dan berdasarkan input mereka, pastikan contoh kueri dan instruksi yang disediakan selaras dengan jenis pertanyaan yang ingin mereka tanyakan.
Menggunakan keterampilan AI secara terprogram
Anda dapat menggunakan keterampilan AI secara terprogram dalam notebook Fabric. Untuk menentukan apakah keterampilan AI memiliki nilai URL yang diterbitkan atau tidak, pilih Pengaturan, seperti yang ditunjukkan dalam cuplikan layar ini:
Sebelum Anda menerbitkan keterampilan AI, keterampilan tersebut tidak memiliki nilai URL yang diterbitkan, seperti yang ditunjukkan pada cuplikan layar ini:
Setelah memvalidasi performa keterampilan AI, Anda dapat memutuskan untuk menerbitkannya sehingga Anda kemudian dapat membagikannya dengan kolega yang ingin melakukan Q&A melalui data. Dalam hal ini, pilih Terbitkan, seperti yang ditunjukkan dalam cuplikan layar ini:
URL yang diterbitkan untuk keterampilan AI muncul, seperti yang ditunjukkan pada cuplikan layar ini:
Anda kemudian dapat menyalin URL yang diterbitkan dan menggunakannya di notebook Fabric. Dengan cara ini, Anda dapat mengkueri keterampilan AI dengan melakukan panggilan ke API keterampilan AI di notebook Fabric. Tempelkan URL yang disalin dalam cuplikan kode ini. Kemudian, ganti pertanyaan dengan kueri apa pun yang relevan dengan keterampilan AI Anda. Contoh ini menggunakan \<generic published URL value\>
sebagai URL.
%pip install "openai==1.14.1"
%pip install httpx==0.27.2
import requests
import json
import pprint
import typing as t
import time
import uuid
from openai import OpenAI
from openai._exceptions import APIStatusError
from openai._models import FinalRequestOptions
from openai._types import Omit
from openai._utils import is_given
from synapse.ml.mlflow import get_mlflow_env_config
from sempy.fabric._token_provider import SynapseTokenProvider
base_url = "https://<generic published base URL value>"
question = "What datasources do you have access to?"
configs = get_mlflow_env_config()
# Create OpenAI Client
class FabricOpenAI(OpenAI):
def __init__(
self,
api_version: str ="2024-05-01-preview",
**kwargs: t.Any,
) -> None:
self.api_version = api_version
default_query = kwargs.pop("default_query", {})
default_query["api-version"] = self.api_version
super().__init__(
api_key="",
base_url=base_url,
default_query=default_query,
**kwargs,
)
def _prepare_options(self, options: FinalRequestOptions) -> None:
headers: dict[str, str | Omit] = (
{**options.headers} if is_given(options.headers) else {}
)
options.headers = headers
headers["Authorization"] = f"Bearer {configs.driver_aad_token}"
if "Accept" not in headers:
headers["Accept"] = "application/json"
if "ActivityId" not in headers:
correlation_id = str(uuid.uuid4())
headers["ActivityId"] = correlation_id
return super()._prepare_options(options)
# Pretty printing helper
def pretty_print(messages):
print("---Conversation---")
for m in messages:
print(f"{m.role}: {m.content[0].text.value}")
print()
fabric_client = FabricOpenAI()
# Create assistant
assistant = fabric_client.beta.assistants.create(model="not used")
# Create thread
thread = fabric_client.beta.threads.create()
# Create message on thread
message = fabric_client.beta.threads.messages.create(thread_id=thread.id, role="user", content=question)
# Create run
run = fabric_client.beta.threads.runs.create(thread_id=thread.id, assistant_id=assistant.id)
# Wait for run to complete
while run.status == "queued" or run.status == "in_progress":
run = fabric_client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id,
)
print(run.status)
time.sleep(2)
# Print messages
response = fabric_client.beta.threads.messages.list(thread_id=thread.id, order="asc")
pretty_print(response)
# Delete thread
fabric_client.beta.threads.delete(thread_id=thread.id)