将 Fabric 中的 Azure OpenAI 与 REST API 结合使用(预览版)

重要

此功能目前为预览版

本文档演示了如何通过 REST API 在 Fabric 中使用 Azure OpenAI 的示例。

初始化

from synapse.ml.fabric.service_discovery import get_fabric_env_config
from synapse.ml.fabric.token_utils import TokenUtils

fabric_env_config = get_fabric_env_config().fabric_env_config
auth_header_value = TokenUtils().get_openai_auth_header()

auth_headers = {
    "Authorization": auth_header_value,
    "Content-Type": "application/json"
}

聊天

GPT-4.1 和 GPT-4.1-mini 是针对聊天界面优化的语言模型。 将 GPT-5 用于推理功能。

import requests

def print_chat_result(messages, response_code, response):
    print("=" * 90)
    print("| OpenAI Input    |")
    for msg in messages:
        if msg["role"] == "system":
            print("[System]", msg["content"])
        elif msg["role"] == "user":
            print("Q:", msg["content"])
        else:
            print("A:", msg["content"])
    print("-" * 90)
    print("| Response Status |", response_code)
    print("-" * 90)
    print("| OpenAI Output   |")
    if response.status_code == 200:
        print(response.json()["choices"][0]["message"]["content"])
    else:
        print(response.content)
    print("=" * 90)

deployment_name = "gpt-4.1"

openai_url = (
    f"{fabric_env_config.ml_workload_endpoint}cognitive/openai/openai/deployments/"
    f"{deployment_name}/chat/completions?api-version=2024-02-15-preview"
)

payload = {
    "messages": [
        {"role": "system", "content": "You are an AI assistant that helps people find information."},
        {"role": "user", "content": "Does Azure OpenAI support customer managed keys?"}
    ]
}

response = requests.post(openai_url, headers=auth_headers, json=payload)
print_chat_result(payload["messages"], response.status_code, response)

输出

==========================================================================================
| OpenAI Input    |
[System] You are an AI assistant that helps people find information.
Q: Does Azure OpenAI support customer managed keys?
------------------------------------------------------------------------------------------
| Response Status | 200
------------------------------------------------------------------------------------------
| OpenAI Output   |
Yes, **Azure OpenAI Service** supports **customer managed keys (CMK)** for encrypting your data at rest. This allows organizations to control and manage their own encryption keys using **Azure Key Vault**. By integrating with Azure Key Vault, you can bring your own keys (BYOK) to have full control over the encryption of data stored and processed by Azure OpenAI.

**Reference:**
- [Azure OpenAI encryption documentation - Microsoft Learn](https://dori-uw-1.kuma-moon.com/en-us/azure/ai-services/openai/concepts/security#encryption)
- [Azure OpenAI Security - Microsoft Learn](https://dori-uw-1.kuma-moon.com/en-us/azure/ai-services/openai/concepts/security)

**Key features:**
- Data at rest is encrypted by default with a service-managed key.
- You can specify your own customer managed key (CMK) in Azure Key Vault for additional control.
- Supported for both Standard and Enterprise Azure OpenAI deployments.

**Summary:**  
You can use customer managed keys with Azure OpenAI for enhanced security and regulatory compliance.
==========================================================================================

嵌入

嵌入是机器学习模型和算法可以轻松使用的一种特殊数据表示格式。 它包含信息丰富的文本语义,由浮点数向量表示。 向量空间中两个嵌入之间的距离与两个原始输入之间的语义相似性有关。 例如,如果两个文本相似,则它们的向量表示形式也应该相似。

若要在 Fabric 中访问 Azure OpenAI 嵌入终结点,可以使用以下格式发送 API 请求:

POST <url_prefix>/openai/deployments/<deployment_name>/embeddings?api-version=2024-02-01

deployment_name 可以是 text-embedding-ada-002

from synapse.ml.fabric.service_discovery import get_fabric_env_config
from synapse.ml.fabric.token_utils import TokenUtils
import requests


fabric_env_config = get_fabric_env_config().fabric_env_config

auth_header_value = TokenUtils().get_openai_auth_header()
auth_headers = {
    "Authorization": auth_header_value,
    "Content-Type": "application/json"
}

def print_embedding_result(prompts, response_code, response):
    print("=" * 90)
    print("| OpenAI Input    |\n\t" + "\n\t".join(prompts))
    print("-" * 90)
    print("| Response Status |", response_code)
    print("-" * 90)
    print("| OpenAI Output   |")
    if response_code == 200:
        for data in response.json()['data']:
            print("\t[" + ", ".join([f"{n:.8f}" for n in data["embedding"][:10]]) + ", ... ]")
    else:
        print(response.content)
    print("=" * 90)

deployment_name = "text-embedding-ada-002"
openai_url = (
    f"{fabric_env_config.ml_workload_endpoint}cognitive/openai/openai/deployments/"
    f"{deployment_name}/embeddings?api-version=2024-02-15-preview"
)

payload = {
    "input": [
        "empty prompt, need to fill in the content before the request",
        "Once upon a time"
    ]
}

response = requests.post(openai_url, headers=auth_headers, json=payload)
print_embedding_result(payload["input"], response.status_code, response)

输出:

==========================================================================================
| OpenAI Input    |
	empty prompt, need to fill in the content before the request
	Once upon a time
------------------------------------------------------------------------------------------
| Response Status | 200
------------------------------------------------------------------------------------------
| OpenAI Output   |
	[-0.00263638, -0.00441368, -0.01702866, 0.00410065, -0.03052361, 0.01894856, -0.01293149, -0.01421838, -0.03505902, -0.01835033, ... ]
	[0.02133885, -0.02018847, -0.00464259, -0.01151640, -0.01114348, 0.00194205, 0.00229917, -0.01371602, 0.00857094, -0.01467678, ... ]
==========================================================================================