Microsoft Fabric中的数据代理将企业数据转换为聊天问答系统。 它使用户能够通过聊天与其数据交互,以发现可作的见解。 使用Fabric数据代理的一种方法是通过 Foundry 代理服务(Microsoft Foundry 的核心组件)。 通过将 Fabric 数据代理与 Foundry 集成,Azure AI 代理可以直接利用 OneLake Microsoft Fabric中提供的丰富、结构化和语义数据。 此集成提供对高质量企业数据的即时访问,并使Azure AI 代理能够生成可操作的见解并简化分析工作流。 然后,组织可以使用Fabric数据代理作为其Azure AI 环境中的强大知识源来增强数据驱动的决策。
重要
此功能目前为预览版。 使用 azure-ai-projects Python SDK 的最新预览版。
先决条件
- 付费的 F2 或更高版本的 Fabric 容量,或启用了Microsoft Fabric的Power BI Premium 容量(P1 或更高)。
- 根据 Fabric 数据代理租户设置中所述的要求,为 AI 启用跨地理位置处理和跨地理位置存储。
- 至少有一个数据源包含数据:数据仓库、lakehouse、Power BI 语义模型、KQL 数据库、镜像数据库或本体论。 必须具有对数据源的读取访问权限。
- Foundry 中的开发人员和最终用户必须至少具有
AI Developer基于角色的访问控制(RBAC)角色。
工作原理
Agent 安装程序:在代理服务中,创建新的代理,并将Fabric数据代理添加为其知识源之一。 若要建立此连接,需要 Fabric 数据代理的工作区 ID 和工件 ID。 通过安装程序,Azure AI 代理可以在收到查询时评估可用的源,以确保它调用正确的工具来处理请求。 目前,只能将一个Fabric数据代理作为知识源添加到 Azure AI 代理。
注释
在 Azure AI 代理设置中选择的模型仅用于Azure AI 代理业务流程和响应生成。 它不会影响Fabric数据代理使用的模型。
查询处理:当用户从 Foundry 平台发送查询时,代理服务将确定 Fabric 数据代理是否为执行任务的最佳工具。 如果是,Azure AI 代理:
- 使用最终用户的标识对用户有权从Fabric数据代理内访问的数据源生成安全查询。
- 调用Fabric提取和处理数据,以确保流畅、自动化的体验。
- 将Fabric数据代理的结果与其自己的逻辑组合在一起,以生成全面的响应。 标识直通(代理)授权会保护此流,以确保跨企业数据的可靠安全性和适当的访问控制。
注释
Fabric数据代理和 Foundry 资源应位于同一租户上,Microsoft Fabric和 Foundry 应使用相同的帐户登录。
将Fabric数据代理添加到 Azure AI 代理
可以通过编程方式或用户界面(UI)将Fabric数据代理添加到Azure AI 代理。 有关详细的代码示例和进一步说明,请参阅 Azure AI 代理集成文档。
通过 UI 添加Fabric数据代理:
- 导航到左侧窗格。 在“构建和自定义”下,选择“代理”,如以下屏幕截图所示:
此步骤显示现有Azure AI 代理的列表。 可以向其中一个代理添加Fabric,也可以选择新代理创建新代理。 新建代理会生成唯一的代理 ID 和默认名称。 可随时更改该名称。 有关详细信息,请参阅 Foundry 门户中的 Azure OpenAI。
- 启动“添加知识源”:选择“添加”按钮,如以下屏幕截图所示:
屏幕截图显示将 Fabric 数据代理添加为知识。
此步骤将打开受支持的知识源类型的菜单。
- 选择Microsoft Fabric作为源:从列表中选择Microsoft Fabric,如以下屏幕截图所示:
使用此选项,代理可以访问Fabric数据代理。
- 创建连接:如果以前建立了与Fabric数据代理的连接,则可以为新的 Azure AI 代理重复使用该连接。 否则,请选择 “新建连接 ”以创建连接,如以下屏幕截图所示:
创建新的Microsoft Fabric连接窗口将打开,如以下屏幕截图所示:
设置连接时,请将Fabric数据代理workspace-id和artifact-id值作为自定义键提供。 可以在 Fabric已发布的数据代理终结点中找到 workspace-id 和 artifact-id 值。 Fabric数据代理终结点采用以下格式:https://fabric.microsoft.com/groups/<workspace_id>/aiskills/<artifact-id>。 选中“ 是机密 ”复选框。
最后,为连接分配一个名称,并选择是将其提供给 Foundry 中的所有项目,还是将其限制为当前项目。
选择 Connect 后,Microsoft Fabric数据代理将添加为 Knowledge 资源,如以下屏幕截图所示:
还必须向 Azure AI 代理提供有关何时、如何以及哪些情况下使用Fabric数据代理的说明。 从 Azure AI 代理的角度来看,Fabric数据代理被视为Fabric工具,因此可以在说明中引用它。
还可以根据用例要求调整部署模型、添加作或更改模型设置。 完全配置 Azure AI 代理后,在 playground 中选择 Try 以测试其性能。
以编程方式添加 Fabric 数据代理:以下步骤介绍如何以编程方式将 Fabric 数据代理添加到 Azure AI 平台上的 Python 代理中。 有关其他语言(C#、JavaScript),请参阅 此 资源。
步骤 1:设置环境变量并导入 SDK
运行代码之前,请设置以下环境变量:
-
PROJECT_ENDPOINT:Foundry 项目终结点,位于 Foundry 项目的“概述”页上。 -
MODEL_DEPLOYMENT_NAME:模型部署名称,即您在 Foundry 项目的 Models + endpoints 下看到的名称。 -
FABRIC_CONNECTION_NAME:Microsoft Fabric 连接的名称,如其显示在您的 Foundry 已连接的资源中。
安装预览版 SDK 并导入模块:
pip install azure-identity
pip install --pre azure-ai-projects
import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from azure.ai.agents.models import FabricTool, ListSortOrder
步骤 2:创建启用了Microsoft Fabric工具的代理
若要使 Fabric 数据代理工具可用于 Azure AI 代理,请从 Foundry 项目中的命名连接检索连接 ID,然后将其传递给 FabricTool:
project_client = AIProjectClient(
endpoint=os.environ["PROJECT_ENDPOINT"],
credential=DefaultAzureCredential(),
)
# Look up the Fabric connection by name
conn_id = project_client.connections.get(os.environ["FABRIC_CONNECTION_NAME"]).id
# Initialize the Fabric tool with the connection ID
fabric = FabricTool(connection_id=conn_id)
with project_client:
agents_client = project_client.agents
agent = agents_client.create_agent(
model=os.environ["MODEL_DEPLOYMENT_NAME"],
name="my-agent",
instructions="You are a helpful agent",
tools=fabric.definitions,
)
print(f"Created agent, ID: {agent.id}")
步骤 3:创建线程并发送消息
# Create a thread for communication
thread = agents_client.threads.create()
print(f"Created thread, ID: {thread.id}")
# Add a message to the thread
message = agents_client.messages.create(
thread_id=thread.id,
role="user",
content="What is the top sold product in Contoso last month?",
)
print(f"Created message, ID: {message.id}")
步骤 4:运行代理并读取输出
处理该运行,然后遍历消息以读取智能体的响应:
# Create and process the run with the Fabric tool
run = agents_client.runs.create_and_process(thread_id=thread.id, agent_id=agent.id)
print(f"Run finished with status: {run.status}")
if run.status == "failed":
print(f"Run failed: {run.last_error}")
# Delete the agent when finished
agents_client.delete_agent(agent.id)
print("Deleted agent")
# Fetch and print all messages in the thread
messages = agents_client.messages.list(thread_id=thread.id, order=ListSortOrder.ASCENDING)
for msg in messages:
if msg.text_messages:
last_text = msg.text_messages[-1]
print(f"{msg.role}: {last_text.text.value}")