Udostępnij za pośrednictwem


Przykład umiejętności sztucznej inteligencji z zestawem danych AdventureWorks (wersja zapoznawcza)

W tym artykule opisano sposób konfigurowania umiejętności sztucznej inteligencji przy użyciu usługi Lakehouse jako źródła danych. Aby zilustrować ten proces, najpierw utworzymy lakehouse, a następnie dodamy do niego dane. Następnie utworzymy umiejętności sztucznej inteligencji i skonfigurujemy usługę Lakehouse jako źródło danych. Jeśli masz już model semantyczny usługi Power BI (z niezbędnymi uprawnieniami do odczytu/zapisu), magazynem lub bazą danych KQL, możesz wykonać te same kroki po utworzeniu umiejętności sztucznej inteligencji, aby dodać źródła danych. Chociaż kroki przedstawione tutaj koncentrują się na lakehouse, proces jest podobny dla innych źródeł danych — wystarczy wprowadzić korekty w zależności od wybranego wyboru.

Ważne

Ta funkcja jest dostępna w wersji zapoznawczej.

Wymagania wstępne

Utwórz lakehouse za pomocą AdventureWorksLH

Najpierw utwórz magazyn lakehouse i wypełnij go niezbędnymi danymi.

Jeśli masz już wystąpienie bazy danych AdventureWorksLH w magazynie typu lakehouse (lub magazynie), możesz pominąć ten krok. Jeśli nie, możesz skorzystać z poniższych instrukcji z notesu Fabric, aby wypełnić lakehouse danymi.

  1. Utwórz nowy notes w obszarze roboczym, w którym chcesz utworzyć umiejętności sztucznej inteligencji.

  2. Po lewej stronie okienka Eksplorator wybierz pozycję + Źródła danych. Ta opcja umożliwia dodanie istniejącego jeziora lub utworzenie nowego jeziora. Dla przejrzystości stwórz nowy Lakehouse i nadaj mu nazwę.

  3. W górnej komórce dodaj następujący fragment kodu:

    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. Wybierz pozycję Uruchom wszystko.

    Zrzut ekranu przedstawiający notes z kodem przekazywania AdventureWorks.

Po kilku minutach lakehouse zostaje wypełniony niezbędnymi danymi.

Tworzenie umiejętności sztucznej inteligencji

Aby utworzyć nową umiejętność sztucznej inteligencji, przejdź do obszaru roboczego i wybierz przycisk + Nowy element, jak pokazano na poniższym zrzucie ekranu:

Zrzut ekranu przedstawiający miejsce tworzenia umiejętności sztucznej inteligencji.

Na karcie Wszystkie elementy wyszukaj umiejętności sztucznej inteligencji, aby zlokalizować odpowiednią opcję. Po dokonaniu wyboru pojawi się prośba o podanie nazwy dla twojej umiejętności AI, jak pokazano na tym zrzucie ekranu.

Zrzut ekranu przedstawiający miejsce podania nazwy umiejętności sztucznej inteligencji.

Po wprowadzeniu nazwy wykonaj następujące kroki, aby dopasować umiejętności sztucznej inteligencji do określonych wymagań.

Wybieranie danych

Wybierz lakehouse utworzone w poprzednim kroku, a następnie wybierz pozycję Dodaj. Po dodaniu usługi Lakehouse jako źródła danych okienko Eksploratora po lewej stronie strony umiejętności sztucznej inteligencji zawiera nazwę magazynu typu lakehouse. Wybierz lakehouse, aby wyświetlić wszystkie dostępne tabele. Użyj pól wyboru, aby wybrać tabele, które mają być dostępne dla sztucznej inteligencji. W tym scenariuszu wybierz następujące tabele:

  • dimcustomer
  • dimdate
  • dimgeography
  • dimproduct
  • dimproductcategory
  • dimpromotion
  • dimreseller
  • dimsalesterritory
  • factinternetsales
  • cactresellersales

Zrzut ekranu przedstawiający, gdzie można wybrać tabele dla sztucznej inteligencji.

Podaj instrukcje

Aby dodać instrukcje dotyczące sztucznej inteligencji, wybierz przycisk instrukcje dotyczące sztucznej inteligencji, aby otworzyć okienko Instrukcje dotyczące sztucznej inteligencji po prawej stronie. Możesz dodać następujące instrukcje.

Źródło danych AdventureWorksLH zawiera informacje z trzech tabel:

  • dimcustomer, w celu uzyskania szczegółowych danych demograficznych klientów i informacji kontaktowych
  • dimdate, dla danych związanych z datami — na przykład informacji kalendarzowych i finansowych
  • dimgeography, aby uzyskać szczegółowe informacje geograficzne, w tym nazwy miast i kody regionów kraju.

To źródło danych służy do wykonywania zapytań i analiz obejmujących szczegóły klienta, zdarzenia oparte na czasie i lokalizacje geograficzne.

Zrzut ekranu pokazujący, gdzie można podać instrukcje dotyczące sztucznej inteligencji.

Przykłady

Aby dodać przykładowe zapytania, wybierz przycisk Przykładowe zapytania, aby otworzyć okienko przykładowych zapytań po prawej stronie. To okienko zawiera opcje dodawania lub edytowania przykładowych zapytań dla wszystkich obsługiwanych źródeł danych. Dla każdego źródła danych możesz wybrać pozycję Dodaj lub Edytuj przykładowe zapytania, aby wprowadzić odpowiednie przykłady, jak pokazano na poniższym zrzucie ekranu:

Zrzut ekranu przedstawiający miejsce dodawania przykładów do sztucznej inteligencji.

W tym miejscu należy dodać przykładowe zapytania dla utworzonego źródła danych lakehouse.

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

Zrzut ekranu przedstawiający dodawanie przykładów SQL.

Uwaga

Dodawanie przykładowych par zapytań/pytań nie jest obecnie obsługiwane w przypadku semantycznych źródeł danych modelu usługi Power BI.

Testowanie i poprawianie umiejętności sztucznej inteligencji

Po skonfigurowaniu umiejętności sztucznej inteligencji, dodaniu instrukcji dotyczących sztucznej inteligencji i podaniu przykładowych zapytań dotyczących usługi Lakehouse możesz z nią korzystać, zadając pytania i odbierając odpowiedzi. W miarę kontynuowania testowania możesz dodać więcej przykładów i udoskonalić instrukcje, aby jeszcze bardziej poprawić wydajność umiejętności sztucznej inteligencji. Współpracuj ze współpracownikami, aby zebrać opinie i na podstawie ich danych wejściowych, upewnij się, że podane przykładowe zapytania i instrukcje są zgodne z typami pytań, które chcą zadać.

Programowe używanie umiejętności sztucznej inteligencji

Umiejętności sztucznej inteligencji można używać programowo w notesie sieci Szkieletowej. Aby określić, czy umiejętność sztucznej inteligencji ma opublikowaną wartość adresu URL, wybierz pozycję Ustawienia, jak pokazano na poniższym zrzucie ekranu:

Zrzut ekranu przedstawiający wybór ustawień umiejętności sztucznej inteligencji.

Przed opublikowaniem umiejętności sztucznej inteligencji nie ma opublikowanej wartości adresu URL, jak pokazano na poniższym zrzucie ekranu:

Zrzut ekranu przedstawiający, że umiejętność sztucznej inteligencji nie ma opublikowanej wartości adresu URL przed publikacją.

Po zweryfikowaniu wydajności umiejętności sztucznej inteligencji możesz zdecydować się na jej opublikowanie, aby następnie udostępnić go współpracownikom, którzy chcą wykonać Q&A za pośrednictwem danych. W takim przypadku wybierz pozycję Publikuj, jak pokazano na poniższym zrzucie ekranu:

Zrzut ekranu przedstawiający wybór opcji Publikuj.

Zostanie wyświetlony opublikowany adres URL umiejętności sztucznej inteligencji, jak pokazano na poniższym zrzucie ekranu:

Zrzut ekranu przedstawiający opublikowany adres URL.

Następnie możesz skopiować opublikowany adres URL i użyć go w notesie sieci szkieletowej. Dzięki temu możesz wykonywać zapytania dotyczące umiejętności sztucznej inteligencji, wykonując wywołania interfejsu API umiejętności sztucznej inteligencji w notesie usługi Fabric. Wklej skopiowany adres URL w tym fragmencie kodu. Następnie zastąp pytanie dowolnym zapytaniem odpowiednim dla umiejętności sztucznej inteligencji. W tym przykładzie użyto \<generic published URL value\> adresu 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)