2023年9月11日

使用自有数据的Azure聊天补全模型(预览版)

本示例展示如何将Azure OpenAI服务模型与您自己的数据结合使用。该功能目前处于预览阶段。

Azure OpenAI on your data 让您能够在自己的数据上运行支持的聊天模型(如 GPT-3.5-Turbo 和 GPT-4),而无需训练或微调模型。在自己的数据上运行模型,使您能够基于数据进行对话,并以更高的准确性和速度分析数据。Azure OpenAI on your data 的一个关键优势是其定制对话AI内容的能力。由于模型可以访问并引用特定来源来支持其响应,答案不仅基于其预训练知识,还基于指定数据源中的最新信息。这些基础数据还有助于模型避免基于过时或不准确的信息生成响应。

基于Azure AI搜索(原名Azure认知搜索)的Azure OpenAI为您提供了一种可定制的预构建知识检索解决方案,可用于构建对话式AI应用。如需了解其他知识检索和语义搜索方法,请参阅向量数据库的示例手册。

工作原理

Azure OpenAI on your own data 将模型与您的数据连接起来,使其能够以增强模型输出的方式检索和利用数据。通过与Azure AI搜索结合,系统会根据用户输入和提供的对话历史从指定数据源检索数据。随后这些数据会被增强并作为提示重新提交给模型,为模型提供可用于生成响应的上下文信息。

更多信息请参阅Azure OpenAI 服务的数据、隐私和安全性

先决条件

开始之前,我们先介绍一些必备条件。

要正确访问Azure OpenAI服务,我们需要在Azure门户创建适当的资源(您可以在Microsoft文档中查看详细的操作指南)

要将您自己的数据与Azure OpenAI模型一起使用,您需要:

  1. Azure OpenAI 访问权限以及部署了聊天模型的资源(例如 GPT-3 或 GPT-4)
  2. Azure AI Search(原名 Azure Cognitive Search)资源
  3. Azure Blob Storage 资源
  4. 您的文档将用作数据(参见数据源选项

如需完整了解如何将文档上传到blob存储并使用Azure AI Studio创建索引,请参阅此快速入门

设置

首先,我们安装必要的依赖项。

! pip install "openai>=1.0.0,<2.0.0"
! pip install python-dotenv

在本示例中,我们将使用dotenv来加载环境变量。要连接Azure OpenAI和搜索索引,以下变量应以KEY=VALUE格式添加到.env文件中:

  • AZURE_OPENAI_ENDPOINT - Azure OpenAI 终端节点。该值可在Azure门户中您的Azure OpenAI资源的"密钥和终端节点"部分找到。
  • AZURE_OPENAI_API_KEY - Azure OpenAI API密钥。该密钥可在Azure门户中您的Azure OpenAI资源的"密钥和终结点"部分找到。如果使用Azure Active Directory身份验证(请参阅下方使用Microsoft Active Directory进行身份验证),则可省略此项
  • SEARCH_ENDPOINT - AI搜索服务的终端节点。该URL可在Azure门户中搜索资源的"概览"页面找到。
  • SEARCH_KEY - AI搜索API密钥。可在Azure门户中搜索资源的"密钥"下找到。
  • SEARCH_INDEX_NAME - 您使用自有数据创建的索引名称。
import os
import openai
import dotenv

dotenv.load_dotenv()

认证

Azure OpenAI 服务支持多种认证机制,包括API密钥和Azure Active Directory令牌凭证。

use_azure_active_directory = False  # Set this flag to True if you are using Azure Active Directory

使用API密钥进行身份验证

要设置OpenAI SDK使用Azure API密钥,我们需要将api_key设置为与您的终端节点关联的密钥(您可以在Azure门户"资源管理"下的"密钥和终端节点"中找到此密钥)。您还可以在此处找到资源的终端节点。

if not use_azure_active_directory:
    endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]
    api_key = os.environ["AZURE_OPENAI_API_KEY"]
    # set the deployment name for the model we want to use
    deployment = "<deployment-id-of-the-model-to-use>"

    client = openai.AzureOpenAI(
        base_url=f"{endpoint}/openai/deployments/{deployment}/extensions",
        api_key=api_key,
        api_version="2023-09-01-preview"
    )

使用 Azure Active Directory 进行身份验证

现在让我们看看如何通过Azure Active Directory进行身份验证。我们将从安装azure-identity库开始。这个库将提供我们进行身份验证所需的令牌凭证,并通过get_bearer_token_provider辅助函数帮助我们构建令牌凭证提供程序。建议使用get_bearer_token_provider而不是向AzureOpenAI提供静态令牌,因为此API会自动为您缓存和刷新令牌。

有关如何设置Azure OpenAI与Azure Active Directory身份验证的更多信息,请参阅文档

! pip install "azure-identity>=1.15.0"
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

if use_azure_active_directory:
    endpoint = os.environ["AZURE_OPENAI_ENDPOINT"]
    api_key = os.environ["AZURE_OPENAI_API_KEY"]
    # set the deployment name for the model we want to use
    deployment = "<deployment-id-of-the-model-to-use>"

    client = openai.AzureOpenAI(
        base_url=f"{endpoint}/openai/deployments/{deployment}/extensions",
        azure_ad_token_provider=get_bearer_token_provider(DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"),
        api_version="2023-09-01-preview"
    )

注意:如果未提供以下参数,AzureOpenAI会从相应的环境变量中推断出这些参数:

  • api_key 来自 AZURE_OPENAI_API_KEY
  • azure_ad_token 来自 AZURE_OPENAI_AD_TOKEN
  • api_version 来自 OPENAI_API_VERSION
  • azure_endpoint 来自 AZURE_OPENAI_ENDPOINT

在本示例中,我们希望模型基于Azure AI服务文档数据生成回答。按照之前分享的快速入门指南,我们已将Azure AI服务和机器学习文档页面的markdown文件添加到搜索索引中。现在该模型已准备好回答有关Azure AI服务和机器学习的问题。

现在我们可以通过Chat Completions在您自己的数据上使用Azure。在dataSources中提供我们的搜索端点、密钥和索引名称后,向模型提出的任何问题都将基于我们自己的数据。响应中将提供一个额外的属性context,用于显示模型回答问题时所参考的数据。

completion = client.chat.completions.create(
    messages=[{"role": "user", "content": "What are the differences between Azure Machine Learning and Azure AI services?"}],
    model=deployment,
    extra_body={
        "dataSources": [
            {
                "type": "AzureCognitiveSearch",
                "parameters": {
                    "endpoint": os.environ["SEARCH_ENDPOINT"],
                    "key": os.environ["SEARCH_KEY"],
                    "indexName": os.environ["SEARCH_INDEX_NAME"],
                }
            }
        ]
    }
)
print(f"{completion.choices[0].message.role}: {completion.choices[0].message.content}")

# `context` is in the model_extra for Azure
print(f"\nContext: {completion.choices[0].message.model_extra['context']['messages'][0]['content']}")

如果您希望以流式传输方式获取模型的响应,可以传入 stream=True 关键字参数:

response = client.chat.completions.create(
    messages=[{"role": "user", "content": "What are the differences between Azure Machine Learning and Azure AI services?"}],
    model=deployment,
    extra_body={
        "dataSources": [
            {
                "type": "AzureCognitiveSearch",
                "parameters": {
                    "endpoint": os.environ["SEARCH_ENDPOINT"],
                    "key": os.environ["SEARCH_KEY"],
                    "indexName": os.environ["SEARCH_INDEX_NAME"],
                }
            }
        ]
    },
    stream=True,
)

for chunk in response:
    delta = chunk.choices[0].delta

    if delta.role:
        print("\n"+ delta.role + ": ", end="", flush=True)
    if delta.content:
        print(delta.content, end="", flush=True)
    if delta.model_extra.get("context"):
        print(f"Context: {delta.model_extra['context']}", end="", flush=True)