Пример агента данных Fabric с набором данных AdventureWorks (предварительная версия)

В этой статье показано, как настроить агент данных в Microsoft Fabric с помощью lakehouse в качестве примера источника данных. Сначала мы создадим и заполним lakehouse, а затем создадим агент данных Fabric и добавим в него lakehouse. Если у вас уже есть Power BI семантическая модель, убедитесь, что у вас есть разрешение на чтение для взаимодействия с ним с помощью агента данных (разрешение на запись требуется только для изменения семантической модели или использования таких возможностей, как подготовка для искусственного интеллекта). Для хранилища, базы данных KQL или ontology выполните те же действия и выберите этот источник. Хотя в этом пошаговом руководстве используется lakehouse, шаблон совпадает с другими источниками; отличается только выбор источника данных.

Это важно

Эта функция доступна в предварительной версии.

Предпосылки

Это важно

Убедитесь, что автономная функция Copilot включена на портале администрирования Power BI (параметры клиента > Copilot > автономная функция Copilot). Если он не включен, вы не сможете использовать агент данных в сценариях Copilot, даже если другие параметры клиента Copilot включены. Дополнительные сведения см. в разделе Copilot в параметрах клиента Power BI.

Создание озера с помощью AdventureWorksLH

Сначала создайте озеро и заполните его необходимыми данными.

Если у вас уже есть экземпляр AdventureWorksLH в лейкхаусе (или складе), этот шаг можно пропустить. В противном случае можно использовать следующие инструкции из записной книжки Fabric, чтобы заполнить озерный дом данных данными.

  1. Создайте записную книжку в рабочей области, в которой вы хотите создать агент данных Fabric.

  2. В левой части области обозревателя выберите +Источники данных. Этот параметр позволяет добавить существующий lakehouse или создать новый lakehouse. Для ясности создайте новое озеро и назначьте ему имя.

  3. В верхней ячейке добавьте следующий фрагмент кода:

    import pandas as pd
    from tqdm.auto import tqdm
    base = "https://synapseaisolutionsa.z13.web.core.windows.net/data/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. Выберите Запустить все.

Снимок экрана: записная книжка с кодом отправки AdventureWorks.

Через несколько минут лейкхаус заполняется необходимыми данными.

Caution

Записные книжки, которые продолжают работать (например, из-за случайных бесконечных циклов или постоянного опроса), могут использовать ресурсы Fabric на неопределенный срок. После завершения загрузки данных остановите любые активные ячейки и завершите сеанс записной книжки (на панели инструментов > Остановка сеанса), если он вам больше не нужен. Избегайте добавления длительных циклов без времени ожидания.

Создание агента данных Fabric

Чтобы создать агент данных Fabric, перейдите в рабочую область и нажмите кнопку + Новый элемент, как показано на снимке экрана:

Этот скриншот показывает, где создавать агентов данных функции Fabric.

На вкладке "Все элементы" найдите агент данных Fabric, чтобы найти соответствующий параметр. После выбора запрос запрашивает указать имя агента данных Fabric, как показано на этом снимке экрана:

Скриншот, на котором показано, где указать имя агента данных Fabric.

После ввода имени выполните следующие действия, чтобы настроить агента данных Fabric в соответствии с вашими конкретными требованиями.

Выбор данных

Выберите озерный дом, созданный на предыдущем шаге, и нажмите "Добавить", как показано на следующем снимке экрана.

Снимок экрана: шаг добавления lakehouse.

После добавления lakehouse в качестве источника данных в панели Explorer, расположенной слева на странице агента данных Fabric, отображается имя lakehouse. Выберите lakehouse, чтобы просмотреть все доступные таблицы. Установите флажки, чтобы выбрать таблицы, которые нужно сделать доступными для ИИ. Для этого сценария выберите следующие таблицы:

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

Снимок экрана, показывающий, где можно выбрать таблицы для искусственного интеллекта.

Разрешения для семантических моделей в агентах данных

Пользователям необходимо только разрешение на чтение семантической модели Power BI, чтобы добавить её в агент данных и задавать вопросы через него. Доступ к рабочей области (роль участника) и разрешение на сборку не требуются для взаимодействия с помощью агентов данных. Разрешение на запись требуется только для изменения семантической модели или использования таких возможностей, как подготовка для искусственного интеллекта.

Это изменение разрешений применяется только к взаимодействию с помощью агентов данных. Другие шаблоны доступа (например, анализ в Excel или прямое авторство отчетов) соответствуют стандартным разрешениям Power BI.

Укажите инструкции

Чтобы добавить инструкции, нажмите кнопку "Инструкции агента данных" , чтобы открыть область инструкций справа. Вы можете добавить следующие инструкции.

Источник данных AdventureWorksLH содержит сведения из трех таблиц:

  • dimcustomer, для подробной информации о демографии и контактной информации клиентов
  • dimdate, для данных, связанных с датой, например, календарная и финансовая информация
  • dimgeography для получения географических сведений, включая названия городов и коды регионов страны.

Используйте этот источник данных для запросов и анализа, включающих сведения о клиентах, событиях на основе времени и географических расположениях.

Снимок экрана: где можно указать инструкции для ИИ.

Укажите примеры

Чтобы добавить примеры запросов, нажмите кнопку Примеры запросов, чтобы открыть панель примеров справа. Эта область предоставляет параметры для добавления или изменения примеров запросов для всех поддерживаемых источников данных. Для каждого источника данных можно выбрать "Добавить или изменить примеры запросов" для ввода соответствующих примеров, как показано на следующем снимке экрана:

Скриншот, показывающий, где можно добавить примеры, которые вы предоставляете в ИИ.

Здесь необходимо добавить примеры запросов к созданному источнику данных 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

Снимок экрана: добавление примеров SQL.

Замечание

Добавление примеров пар запросов и вопросов в настоящее время не поддерживается для Power BI источников данных семантической модели.

Тестирование и изменение агента данных Fabric

Теперь, когда вы настроили агент данных Fabric, добавили инструкции по работе с агентом данных Fabric и предоставили примеры запросов для платформы Lakehouse, вы можете взаимодействовать с ней, задавая вопросы и получая ответы. При продолжении тестирования можно добавить дополнительные примеры и уточнить инструкции, чтобы повысить производительность агента данных Fabric. Работайте вместе с коллегами, чтобы собирать отзывы, и, учитывая их отзывы, убедитесь, что предоставленные примеры запросов и инструкций соответствуют типам вопросов, которые они хотят задать.

Публикация агента данных Fabric

После подтверждения производительности агента данных Fabric вы можете опубликовать его, чтобы вы могли поделиться им с коллегами, которые хотят задавать вопросы и получать ответы по данным. В этом случае выберите "Опубликовать", как показано на снимке экрана:

Снимок экрана: выбор параметра

Откроется окно агента публикации данных, как показано на данном снимке экрана:

Снимок экрана, демонстрирующий функцию агента публикации данных.

В этом поле выберите Publish для публикации агента данных Fabric. Появится опубликованный URL-адрес агента данных Fabric, как показано на этом снимке экрана:

Снимок экрана: опубликованный URL-адрес.

Использование агента данных Fabric в Copilot в Power BI

Вы можете использовать Copilot в Power BI для взаимодействия с агентом данных Fabric после публикации. С помощью Copilot в Power BI можно напрямую использовать агент данных и другие элементы (например, отчеты или семантические модели) без необходимости переключаться между ними.

Нажмите кнопку Copilot на левой панели навигации, чтобы открыть Copilot в Power BI. Затем нажмите кнопку "Добавить элементы", чтобы улучшить результаты в текстовом поле внизу, чтобы добавить агент данных. Выберите агенты данных в открываемом окне. Вы можете видеть только тех агентов данных, к которым у вас есть разрешение на доступ. Выберите нужный агент данных и нажмите кнопку "Подтвердить". В этом примере показано, как работать с одним агентом данных, но можно добавить дополнительные элементы, например другие агенты данных, отчеты или семантические модели. На следующем снимках экрана показаны шаги с одним агентом данных:

Скриншот с кнопкой Copilot и кнопкой для добавления таких элементов, как Data Agents.

Если агент данных включает семантику Power BI, пользователям требуется разрешение только на чтение этой семантической модели для взаимодействия с ним с помощью Copilot; доступ к рабочей области не требуется. Разрешение на запись по-прежнему требуется для изменений семантической модели и подготовки для искусственного интеллекта.

Теперь, когда вы добавили агент данных в Copilot в Power BI, вы можете задать любые вопросы, связанные с агентом данных Fabric, как показано на следующем снимке экрана:

Скриншот, на котором Copilot отвечает на вопрос.

Программное использование агента данных Fabric

Агент данных Fabric можно использовать программным способом в записной книжке Fabric. Чтобы определить, имеет ли агент данных Fabric значение опубликованного URL-адреса, выберите Settings, как показано на следующем снимке экрана:

Screenshot, показывающий выбор параметров агента данных Fabric.

Перед публикацией агента данных Fabric он не имеет опубликованного значения URL-адреса, как видно на следующем снимке экрана.

Скриншот, на котором показано, что у агента данных Fabric нет значения URL-адреса до того, как он будет опубликован.

Если вы еще не опубликовали агент данных Fabric, его можно опубликовать, выполнив инструкции, описанные в предыдущих шагах. Затем можно скопировать опубликованный URL-адрес и использовать его в записной книжке Fabric. Таким образом, можно обращаться к агенту данных Fabric, вызывая API агента данных в записной книжке Fabric. Вставьте скопированный URL-адрес в фрагмент кода. Затем замените вопрос любым запросом, соответствующим агенту данных Fabric. Этот пример использует \<generic published URL value\> в качестве URL-адреса.

Это важно

При программном вызове агента данных реализуйте:

  1. Время ожидания опроса (см. пример ниже), чтобы избежать бесконечных циклов.
  2. Минимальная частота опроса (начинается с 2–5 секунд; увеличивается только в случае необходимости).
  3. Очистка созданных потоков или ресурсов после завершения.
  4. Завершение сеанса записной книжки для освобождения емкости Fabric.

Замечание

Настройте пинки версий (openai, synapseml, pandas, tqdm) до последних проверенных версий среды выполнения Fabric, если эти точные версии становятся устаревшими.

%pip install "openai==1.70.0"
%pip install "synapseml==1.0.5"  # Required for synapse.ml.mlflow (update version as needed)
%pip install pandas tqdm  # Skip if already available in the Fabric runtime

Это важно

Приведённый ниже код использует API Assistants OpenAI (beta.assistants, beta.threads, beta.threads.runs), который OpenAI объявила устаревшим с датой прекращения работы 26 августа 2026 года. Текущий код продолжает работать до 26 августа 2026 г., но планируется перенести конечную точку MCP до этой даты.

import typing as t
import time
import uuid

# OpenAI SDK internals
from openai import OpenAI
from openai._models import FinalRequestOptions
from openai._types import Omit
from openai._utils import is_given

# SynapseML helper for env config
from synapse.ml.mlflow import get_mlflow_env_config

# Removed unused imports: requests, json, pprint, APIStatusError, SynapseTokenProvider
 
base_url = "https://<generic published base URL value>"
question = "What data sources 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 (avoid indefinite loop)
terminal_states = {"completed", "failed", "cancelled", "requires_action"}
poll_interval = 2
timeout_seconds = 300  # Adjust based on expected workload
start_time = time.time()

while run.status not in terminal_states:
    if time.time() - start_time > timeout_seconds:
        raise TimeoutError(f"Run polling exceeded {timeout_seconds} seconds (last status={run.status})")
    run = fabric_client.beta.threads.runs.retrieve(
        thread_id=thread.id,
        run_id=run.id,
    )
    print(run.status)
    time.sleep(poll_interval)

if run.status != "completed":
    print(f"Run finished with status: {run.status}")

# 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)