你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:开始使用 Azure OpenAI 助手(预览版)

使用 Azure OpenAI 助手(预览版),可以创建通过自定义说明按需定制和使用高级工具(如代码解释器和自定义函数)增强的 AI 助手。

重要

本文中标记了“(预览版)”的项目目前为公共预览版。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

先决条件

转到 Azure AI Studio(预览版)

借助 AzureAI Studio,可以使用助手 v2,它提供了多个升级,例如文件搜索工具,该工具速度更快,并且支持更多文件。

  1. 登录到 Azure AI Studio

  2. 转到你的项目或在 Azure AI Studio 中创建新项目

  3. 从项目概述中,选择位于“项目操场”下的“助手”

    借助助手操场,无需运行任何代码,即可浏览、处理原型和测试 AI 助手。 在此页中,可以快速循环访问和试验这些新想法。

    操场提供了多个用于配置助手的选项。 在以下步骤中,你将使用“助理设置”窗格创建新的 AI 助手。

    Name 描述
    助手名称 与特定模型关联的部署名称。
    说明 说明类似于系统消息,你可以在其中提供模型指南,以了解其行为方式以及生成响应时应引用的任何上下文。 你可以描述助手的个性,告诉它应该回答什么和不应该回答什么,并告诉它如何设置回复的格式。 还可以提供在回答响应时应采取的步骤示例。
    部署 这是设置要与助手一起使用的模型部署的位置。
    函数 为模型创建自定义函数定义,以根据规范构建 API 调用和结构数据输出。 未在本快速入门中使用。
    代码解释器 代码解释器提供对沙盒化 Python 环境的访问权限,该环境可用于允许模型进行测试和执行代码。
    文件 最多可以上传 10,000 个文件,最大文件大小为 512 MB,以便与工具一起使用。 未在本快速入门中使用。

    “助理配置”屏幕的屏幕截图,其中未填充所有值。

创建第一个助手

  1. 从“部署”下拉列表中选择你的部署。

  2. 从“助手”下拉列表中选择“新建”

  3. 为助手命名。

  4. 输入以下说明“你是一个 AI 助手,可以编写代码来帮助回答数学问题”

  5. 选择模型部署。 建议使用最新 gpt-4 模型之一进行测试。

  6. 选择启用代码解释器的开关。

  7. 选择“保存”。

    已输入配置详细信息的助手的屏幕截图。

  8. 输入助手要回答的问题:“我需要对公式 3x + 11 = 14 求解。 你可以帮我吗?”

  9. 选择“添加并运行”按钮

    The solution to the equation (3x + 11 = 14) is (x = 1).
    

    虽然我们可以看到答案是正确的,但为了确认模型使用了代码解释器来得出此答案,并且它编写的代码有效,而不仅是重复模型训练数据中的答案,我们将提出另一个问题。

  10. 输入后续问题:“向我显示为获取此答案而运行的代码。”

    Sure. The code is very straightforward
    
    # calculation
    x = (14 - 11) / 3
    x
    
    
    First, we subtract 11 from 14, then divide the result by 3. This gives us the value of x which is 1.0.
    

    助手操场中对话会话的屏幕截图。

还可以查阅右侧面板中的日志,以确认是否使用了代码解释器,并验证为生成答复而运行的代码。 请务必记住,虽然代码解释器可支持模型通过将问题转换为代码并在沙盒化 Python 环境中运行来回答更复杂的数学问题,但仍需要验证答复,以确认模型是否正确地将问题转换为代码中的有效表示形式。

关键概念

使用助手操场时,请记住以下概念。

工具

单个助手最多可以访问 128 个工具,包括code interpreter 和通过函数创建的任何自定义工具。

聊天会话

聊天会话也称为助手 API 中的线程,是用户和助手之间的对话发生的位置。 与传统聊天完成调用不同,线程中的消息数没有限制。 助手会自动压缩请求,以适应模型的输入令牌限制。

这也意味着,你不会控制在会话的每个轮次期间传递给模型的令牌数。 管理令牌将被抽象化,并完全由助手 API 处理。

选择“清除聊天”按钮可删除当前对话历史记录。

在文本输入框下方提供了两个按钮:

  • 添加消息而不运行。
  • 添加并运行。

日志

日志可提供助理 API 活动的详细快照。

显示面板

默认情况下提供三个面板:助手设置、聊天会话和日志。 显示面板允许你添加、删除和重新排列面板。 如果你曾经关闭了某个面板并需要恢复它,请使用“显示面板”还原丢失的面板。

清理资源

如果你想要清理和删除 OpenAI 资源,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。

或者,可以通过助手的 API 删除助手线程

另请参阅

参考文档 | 库源代码 | 包 (PyPi) |

先决条件

对于无密码身份验证,需要

  1. 使用 azure-identity 包。
  2. Cognitive Services User角色分配给用户帐户。 这可以在 Azure 门户的访问控制 (IAM)>添加角色分配下完成。
  3. 使用 Azure CLI(例如,az login)登录。

设置

  1. 使用以下项安装 OpenAI Python 客户端库:
pip install openai
  1. 对于推荐的无密码身份验证:
pip install azure-identity

注意

  • 文件搜索可为每个助手最多引入 10,000 个文件 - 比之前多 500 倍。 它速度快,支持通过多线程搜索进行并行查询,并具有增强的重新排序和查询重写功能。
    • 矢量存储是 API 中的新对象。 文件一旦添加到矢量存储中,就会自动进行分析、分块和嵌入,以便随时搜索。 矢量存储可跨助手和线程使用,简化了文件管理和计费。
  • 我们添加了对 tool_choice 参数的支持,该参数可用于在特定运行中强制使用特定工具(如文件搜索、代码解释器或函数)。

注意

此库由 OpenAI 维护。 请参阅发布历史记录,以跟踪库的最新更新。

检索密钥和终结点

若要成功对 Azure OpenAI 服务发出调用,需要准备好以下各项:

变量名称
ENDPOINT 从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。 还可以通过 Azure AI Studio 中的“部署”页查找终结点。 示例终结点为:https://docs-test-001.openai.azure.com/
API-KEY 从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。 可以使用 KEY1KEY2
DEPLOYMENT-NAME 此值将对应于在部署模型时为部署选择的自定义名称。 可以在 Azure 门户的“资源管理”>“模型部署”下,或通过 Azure AI Studio 中的“部署”页找到此值。

在 Azure 门户中转到你的资源。 可以在“资源管理”部分中找到“密钥和终结点”。 复制终结点和访问密钥,因为在对 API 调用进行身份验证时需要这两项。 可以使用 KEY1KEY2。 始终准备好两个密钥可以安全地轮换和重新生成密钥,而不会导致服务中断。

Azure 门户中 Azure OpenAI 资源概述边栏选项卡的屏幕截图,其中终结点和访问密钥的位置用红圈标示。

环境变量

为密钥和终结点创建和分配持久环境变量。

重要

如果使用 API 密钥,请将其安全地存储在某个其他位置,例如 Azure Key Vault 中。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。

有关 Azure AI 服务安全性的详细信息,请参阅对 Azure AI 服务的请求进行身份验证

setx AZURE_OPENAI_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE" 
setx AZURE_OPENAI_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE" 

创建助手

我们将在代码中指定以下值:

Name 描述
助手名称 与特定模型关联的部署名称。
说明 说明类似于系统消息,你可以在其中提供模型指南,以了解其行为方式以及生成响应时应引用的任何上下文。 你可以描述助手的个性,告诉它应该回答什么和不应该回答什么,并告诉它如何设置回复的格式。 还可以提供在回答响应时应采取的步骤示例。
型号 这是设置要与助手一起使用的模型部署名称的位置。 检索工具需要 gpt-35-turbo (1106)gpt-4 (1106-preview) 模型。 将此值设置为部署名称,而不是模型名称,除非它是相同的。
代码解释器 代码解释器提供对沙盒化 Python 环境的访问权限,该环境可用于允许模型进行测试和执行代码。

工具

单个助手最多可以访问 128 个工具,包括code interpreter 和通过函数创建的任何自定义工具。

创建 Python 应用

使用 az login 登录到 Azure,然后使用以下推荐的无密码 Python 示例创建并运行助手:

import os
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI

token_provider = get_bearer_token_provider(DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default")

client = AzureOpenAI(
    azure_ad_token_provider=token_provider,
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_version="2024-05-01-preview",
)

# Create an assistant
assistant = client.beta.assistants.create(
    name="Math Assist",
    instructions="You are an AI assistant that can write code to help answer math questions.",
    tools=[{"type": "code_interpreter"}],
    model="gpt-4-1106-preview" # You must replace this value with the deployment name for your model.
)

# Create a thread
thread = client.beta.threads.create()

# Add a user question to the thread
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="I need to solve the equation `3x + 11 = 14`. Can you help me?"
)

# Run the thread and poll for the result
run = client.beta.threads.runs.create_and_poll(
    thread_id=thread.id,
    assistant_id=assistant.id,
    instructions="Please address the user as Jane Doe. The user has a premium account.",
)

print("Run completed with status: " + run.status)

if run.status == "completed":
    messages = client.beta.threads.messages.list(thread_id=thread.id)
    print(messages.to_json(indent=2))

要使用服务 API 密钥进行身份验证,可以使用以下 Python 示例创建并运行助手:

import os
from openai import AzureOpenAI

client = AzureOpenAI(
    api_key=os.environ["AZURE_OPENAI_API_KEY"],
    azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],
    api_version="2024-05-01-preview",
)

# Create an assistant
assistant = client.beta.assistants.create(
    name="Math Assist",
    instructions="You are an AI assistant that can write code to help answer math questions.",
    tools=[{"type": "code_interpreter"}],
    model="gpt-4-1106-preview" # You must replace this value with the deployment name for your model.
)

# Create a thread
thread = client.beta.threads.create()

# Add a user question to the thread
message = client.beta.threads.messages.create(
    thread_id=thread.id,
    role="user",
    content="I need to solve the equation `3x + 11 = 14`. Can you help me?"
)

# Run the thread and poll for the result
run = client.beta.threads.runs.create_and_poll(
    thread_id=thread.id,
    assistant_id=assistant.id,
    instructions="Please address the user as Jane Doe. The user has a premium account.",
)

print("Run completed with status: " + run.status)

if run.status == "completed":
    messages = client.beta.threads.messages.list(thread_id=thread.id)
    print(messages.to_json(indent=2))

输出

运行完成,状态为:已完成

{
  "data": [
    {
      "id": "msg_4SuWxTubHsHpt5IlBTO5Hyw9",
      "assistant_id": "asst_cYqL1RuwLyFV3HU1gkaE2k0K",
      "attachments": [],
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "The solution to the equation \\(3x + 11 = 14\\) is \\(x = 1\\)."
          },
          "type": "text"
        }
      ],
      "created_at": 1716397091,
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_hFgBPbUtO8ZNTnNPC8PgpH1S",
      "thread_id": "thread_isb7spwRycI5ueT9E7357aOm"
    },
    {
      "id": "msg_Z32w2E7kY5wEWhZqQWxIbIUB",
      "assistant_id": null,
      "attachments": [],
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "I need to solve the equation `3x + 11 = 14`. Can you help me?"
          },
          "type": "text"
        }
      ],
      "created_at": 1716397025,
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_isb7spwRycI5ueT9E7357aOm"
    }
  ],
  "object": "list",
  "first_id": "msg_4SuWxTubHsHpt5IlBTO5Hyw9",
  "last_id": "msg_Z32w2E7kY5wEWhZqQWxIbIUB",
  "has_more": false
}

理解结果

在此示例中,我们将创建一个启用了代码解释器的助手。 当我们向助手提出数学问题时,它会将问题转换为 python 代码,并在沙盒环境中执行代码,以确定问题的答案。 由模型创建并进行测试以得出答案的代码为:

from sympy import symbols, Eq, solve  
  
# Define the variable  
x = symbols('x')  
  
# Define the equation  
equation = Eq(3*x + 11, 14)  
  
# Solve the equation  
solution = solve(equation, x)  
solution  

请务必记住,虽然代码解释器支持模型通过将问题转换为代码并在 Python 沙盒中以迭代方式运行该代码来响应更复杂的查询,直到它得出答案,但仍需对响应进行验证,以确认模型是否已正确地将问题转换为代码中的有效表示形式。

清理资源

如果你想要清理和删除 OpenAI 资源,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。

另请参阅

参考文档 | 源代码 | 包 (NuGet)

先决条件

设置

创建新的 .NET Core 应用程序

  1. 在控制台窗口(例如 cmd、PowerShell 或 Bash)中,使用 dotnet new 命令创建名为 azure-openai-quickstart 的新控制台应用:

    dotnet new console -n azure-openai-assistants-quickstart
    
  2. 更改为新创建的应用文件夹的目录,并使用 dotnet build 命令生成应用:

    dotnet build
    

    生成输出不应包含警告或错误。

    ...
    Build succeeded.
     0 Warning(s)
     0 Error(s)
    ...
    
  3. 使用 dotnet add package 命令安装 OpenAI .NET 客户端库

    dotnet add package Azure.AI.OpenAI --prerelease
    

检索密钥和终结点

若要成功对 Azure OpenAI 发出调用,需要一个终结点和一个密钥。

变量名称
ENDPOINT 从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到服务终结点。 或者,也可以通过 Azure AI Studio 中的“部署”页找到终结点。 示例终结点为:https://docs-test-001.openai.azure.com/
API-KEY 从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。 可以使用 KEY1KEY2

在 Azure 门户中转到你的资源。 可在“资源管理”部分中找到“密钥和终结点”部分。 复制终结点和访问密钥,因为在对 API 调用进行身份验证时需要这两项。 可以使用 KEY1KEY2。 始终准备好两个密钥可以安全地轮换和重新生成密钥,而不会导致服务中断。

Azure 门户中 Azure OpenAI 资源概述 UI 的屏幕截图,其中终结点和访问密钥的位置用红圈标示。

环境变量

为密钥和终结点创建和分配持久环境变量。

重要

如果使用 API 密钥,请将其安全地存储在某个其他位置,例如 Azure Key Vault 中。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。

有关 Azure AI 服务安全性的详细信息,请参阅对 Azure AI 服务的请求进行身份验证

setx AZURE_OPENAI_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE" 
setx AZURE_OPENAI_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE" 

无密码身份验证比基于密钥的替代方法更安全,建议使用它连接到 Azure 服务。 如果选择无密码身份验证,则需要完成以下操作:

  1. 添加 Azure.Identity 程序包。

    dotnet add package Azure.Identity
    
  2. Cognitive Services User角色分配给用户帐户。 这可以在 Azure 门户中你的 OpenAI 资源内的“访问控制(IAM)”>“添加角色分配”下完成。

  3. 通过 az login 使用 Visual Studio 或 Azure CLI 登录到 Azure。

创建助手

使用以下代码更新 Program.cs 文件以创建助手:

using Azure;
using Azure.AI.OpenAI.Assistants;

// Assistants is a beta API and subject to change
// Acknowledge its experimental status by suppressing the matching warning.
string endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT");
string key = Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY");

var openAIClient = new AzureOpenAIClient(new Uri(endpoint), new AzureKeyCredential(key));

// Use for passwordless auth
//var openAIClient = new AzureOpenAIClient(new Uri(endpoint), new DefaultAzureCredential()); 

FileClient fileClient = openAIClient.GetFileClient();
AssistantClient assistantClient = openAIClient.GetAssistantClient();

// First, let's contrive a document we'll use retrieval with and upload it.
using Stream document = BinaryData.FromString("""
            {
                "description": "This document contains the sale history data for Contoso products.",
                "sales": [
                    {
                        "month": "January",
                        "by_product": {
                            "113043": 15,
                            "113045": 12,
                            "113049": 2
                        }
                    },
                    {
                        "month": "February",
                        "by_product": {
                            "113045": 22
                        }
                    },
                    {
                        "month": "March",
                        "by_product": {
                            "113045": 16,
                            "113055": 5
                        }
                    }
                ]
            }
            """).ToStream();

OpenAIFileInfo salesFile = await fileClient.UploadFileAsync(
    document,
    "monthly_sales.json",
    FileUploadPurpose.Assistants);

// Now, we'll create a client intended to help with that data
AssistantCreationOptions assistantOptions = new()
{
    Name = "Example: Contoso sales RAG",
    Instructions =
        "You are an assistant that looks up sales data and helps visualize the information based"
        + " on user queries. When asked to generate a graph, chart, or other visualization, use"
        + " the code interpreter tool to do so.",
    Tools =
            {
                new FileSearchToolDefinition(),
                new CodeInterpreterToolDefinition(),
            },
    ToolResources = new()
    {
        FileSearch = new()
        {
            NewVectorStores =
                    {
                        new VectorStoreCreationHelper([salesFile.Id]),
                    }
        }
    },
};

Assistant assistant = await assistantClient.CreateAssistantAsync(deploymentName, assistantOptions);

// Create and run a thread with a user query about the data already associated with the assistant
ThreadCreationOptions threadOptions = new()
{
    InitialMessages = { "How well did product 113045 sell in February? Graph its trend over time." }
};

ThreadRun threadRun = await assistantClient.CreateThreadAndRunAsync(assistant.Id, threadOptions);

// Check back to see when the run is done
do
{
    Thread.Sleep(TimeSpan.FromSeconds(1));
    threadRun = assistantClient.GetRun(threadRun.ThreadId, threadRun.Id);
} while (!threadRun.Status.IsTerminal);

// Finally, we'll print out the full history for the thread that includes the augmented generation
AsyncCollectionResult<ThreadMessage> messages
    = assistantClient.GetMessagesAsync(
        threadRun.ThreadId,
        new MessageCollectionOptions() { Order = MessageCollectionOrder.Ascending });

await foreach (ThreadMessage message in messages)
{
    Console.Write($"[{message.Role.ToString().ToUpper()}]: ");
    foreach (MessageContent contentItem in message.Content)
    {
        if (!string.IsNullOrEmpty(contentItem.Text))
        {
            Console.WriteLine($"{contentItem.Text}");

            if (contentItem.TextAnnotations.Count > 0)
            {
                Console.WriteLine();
            }

            // Include annotations, if any.
            foreach (TextAnnotation annotation in contentItem.TextAnnotations)
            {
                if (!string.IsNullOrEmpty(annotation.InputFileId))
                {
                    Console.WriteLine($"* File citation, file ID: {annotation.InputFileId}");
                }
                if (!string.IsNullOrEmpty(annotation.OutputFileId))
                {
                    Console.WriteLine($"* File output, new file ID: {annotation.OutputFileId}");
                }
            }
        }
        if (!string.IsNullOrEmpty(contentItem.ImageFileId))
        {
            OpenAIFileInfo imageInfo = await fileClient.GetFileAsync(contentItem.ImageFileId);
            BinaryData imageBytes = await fileClient.DownloadFileAsync(contentItem.ImageFileId);
            using FileStream stream = File.OpenWrite($"{imageInfo.Filename}.png");
            imageBytes.ToStream().CopyTo(stream);

            Console.WriteLine($"<image: {imageInfo.Filename}.png>");
        }
    }
    Console.WriteLine();
}

使用 dotnet run 命令运行应用:

dotnet run

控制台输出应如下所示:

[USER]: How well did product 113045 sell in February? Graph its trend over time.

[ASSISTANT]: Product 113045 sold 22 units in February. Let's visualize its sales trend over the given months (January through March).

I'll create a graph to depict this trend.

[ASSISTANT]: <image: 553380b7-fdb6-49cf-9df6-e8e6700d69f4.png>
The graph above visualizes the sales trend for product 113045 from January to March. As seen, the sales peaked in February with 22 units sold, and fluctuated over the period from January (12 units) to March (16 units).

If you need further analysis or more details, feel free to ask!

清理资源

如果你想要清理和删除 OpenAI 资源,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。

另请参阅

参考文档 | 库源代码 | 包 (npm) |

先决条件

对于无密钥身份验证,需要

  1. 使用@azure/identity包。
  2. Cognitive Services User角色分配给用户帐户。 这可以在 Azure 门户的访问控制 (IAM)>添加角色分配下完成。
  3. 使用 Azure CLI(例如,az login)登录。

设置

  1. 创建一个新文件夹 assistants-quickstart 以包含该应用程序,并在该文件夹中使用以下命令打开 Visual Studio Code:

    mkdir assistants-quickstart && code assistants-quickstart
    
  2. 使用以下命令创建 package.json

    npm init -y
    
  3. 使用以下命令将 package.json 更新为 ECMAScript:

    npm pkg set type=module
    
  4. 使用以下内容安装适用于 JavaScript 的 OpenAI 助手客户端库:

    npm install openai
    
  5. 对于推荐的无密码身份验证:

    npm install @azure/identity
    

检索资源信息

变量名称
AZURE_OPENAI_ENDPOINT 从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。
AZURE_OPENAI_DEPLOYMENT_NAME 此值将对应于在部署模型时为部署选择的自定义名称。 Azure 门户中的“资源管理”>“模型部署”下提供了此值。
OPENAI_API_VERSION 详细了解 API 版本

详细了解无密钥身份验证,以及如何设置环境变量

注意

若要对 SDK 使用推荐的无密钥身份验证,请确保未设置 AZURE_OPENAI_API_KEY 环境变量。

创建助手

我们将在代码中指定以下值:

Name 描述
助手名称 与特定模型关联的部署名称。
说明 说明类似于系统消息,你可以在其中提供模型指南,以了解其行为方式以及生成响应时应引用的任何上下文。 你可以描述助手的个性,告诉它应该回答什么和不应该回答什么,并告诉它如何设置回复的格式。 还可以提供在回答响应时应采取的步骤示例。
型号 这是部署名称。
代码解释器 代码解释器提供对沙盒化 Python 环境的访问权限,该环境可用于允许模型进行测试和执行代码。

工具

单个助手最多可以访问 128 个工具,包括 code interpreter 和通过函数创建的任何自定义工具。

创建新的 JavaScript 应用程序

  1. 使用以下代码创建 index.js 文件:

    const { AzureOpenAI } = require("openai");
    const {
      DefaultAzureCredential,
      getBearerTokenProvider,
    } = require("@azure/identity");
    
    // Get environment variables
    const azureOpenAIEndpoint = process.env.AZURE_OPENAI_ENDPOINT;
    const azureOpenAIDeployment = process.env.AZURE_OPENAI_DEPLOYMENT_NAME;
    const azureOpenAIVersion = process.env.OPENAI_API_VERSION;
    
    // Check env variables
    if (!azureOpenAIEndpoint || !azureOpenAIDeployment || !azureOpenAIVersion) {
      throw new Error(
        "Please ensure to set AZURE_OPENAI_DEPLOYMENT_NAME and AZURE_OPENAI_ENDPOINT in your environment variables."
      );
    }
    
    // Get Azure SDK client
    const getClient = () => {
      const credential = new DefaultAzureCredential();
      const scope = "https://cognitiveservices.azure.com/.default";
      const azureADTokenProvider = getBearerTokenProvider(credential, scope);
    
      const assistantsClient = new AzureOpenAI({
        endpoint: azureOpenAIEndpoint,
        apiVersion: azureOpenAIVersion,
        azureADTokenProvider,
      });
      return assistantsClient;
    };
    
    const assistantsClient = getClient();
    
    const options = {
      model: azureOpenAIDeployment, // Deployment name seen in Azure AI Studio
      name: "Math Tutor",
      instructions:
        "You are a personal math tutor. Write and run JavaScript code to answer math questions.",
      tools: [{ type: "code_interpreter" }],
    };
    const role = "user";
    const message = "I need to solve the equation `3x + 11 = 14`. Can you help me?";
    
    // Create an assistant
    const assistantResponse = await assistantsClient.beta.assistants.create(
      options
    );
    console.log(`Assistant created: ${JSON.stringify(assistantResponse)}`);
    
    // Create a thread
    const assistantThread = await assistantsClient.beta.threads.create({});
    console.log(`Thread created: ${JSON.stringify(assistantThread)}`);
    
    // Add a user question to the thread
    const threadResponse = await assistantsClient.beta.threads.messages.create(
      assistantThread.id,
      {
        role,
        content: message,
      }
    );
    console.log(`Message created:  ${JSON.stringify(threadResponse)}`);
    
    // Run the thread and poll it until it is in a terminal state
    const runResponse = await assistantsClient.beta.threads.runs.createAndPoll(
      assistantThread.id,
      {
        assistant_id: assistantResponse.id,
      },
      { pollIntervalMs: 500 }
    );
    console.log(`Run created:  ${JSON.stringify(runResponse)}`);
    
    // Get the messages
    const runMessages = await assistantsClient.beta.threads.messages.list(
      assistantThread.id
    );
    for await (const runMessageDatum of runMessages) {
      for (const item of runMessageDatum.content) {
        // types are: "image_file" or "text"
        if (item.type === "text") {
          console.log(`Message content: ${JSON.stringify(item.text?.value)}`);
        }
      }
    }
    
  2. 使用以下命令登录到 Azure:

    az login
    
  3. 运行 JavaScript 文件。

    node index.js
    

输出

Assistant created: {"id":"asst_zXaZ5usTjdD0JGcNViJM2M6N","createdAt":"2024-04-08T19:26:38.000Z","name":"Math Tutor","description":null,"model":"daisy","instructions":"You are a personal math tutor. Write and run JavaScript code to answer math questions.","tools":[{"type":"code_interpreter"}],"fileIds":[],"metadata":{}}
Thread created: {"id":"thread_KJuyrB7hynun4rvxWdfKLIqy","createdAt":"2024-04-08T19:26:38.000Z","metadata":{}}
Message created:  {"id":"msg_o0VkXnQj3juOXXRCnlZ686ff","createdAt":"2024-04-08T19:26:38.000Z","threadId":"thread_KJuyrB7hynun4rvxWdfKLIqy","role":"user","content":[{"type":"text","text":{"value":"I need to solve the equation `3x + 11 = 14`. Can you help me?","annotations":[]},"imageFile":{}}],"assistantId":null,"runId":null,"fileIds":[],"metadata":{}}
Created run
Run created:  {"id":"run_P8CvlouB8V9ZWxYiiVdL0FND","object":"thread.run","status":"queued","model":"daisy","instructions":"You are a personal math tutor. Write and run JavaScript code to answer math questions.","tools":[{"type":"code_interpreter"}],"metadata":{},"usage":null,"assistantId":"asst_zXaZ5usTjdD0JGcNViJM2M6N","threadId":"thread_KJuyrB7hynun4rvxWdfKLIqy","fileIds":[],"createdAt":"2024-04-08T19:26:39.000Z","expiresAt":"2024-04-08T19:36:39.000Z","startedAt":null,"completedAt":null,"cancelledAt":null,"failedAt":null}
Message content: "The solution to the equation \\(3x + 11 = 14\\) is \\(x = 1\\)."
Message content: "Yes, of course! To solve the equation \\( 3x + 11 = 14 \\), we can follow these steps:\n\n1. Subtract 11 from both sides of the equation to isolate the term with x.\n2. Then, divide by 3 to find the value of x.\n\nLet me calculate that for you."
Message content: "I need to solve the equation `3x + 11 = 14`. Can you help me?"

请务必记住,虽然代码解释器支持模型响应更复杂的查询(因为它可以将问题转换为代码,并在 JavaScript 中以迭代方式运行该代码,直到得出答案),但你仍需对响应进行验证,以确认模型是否已正确地将问题转换为有效的代码表示形式。

清理资源

如果你想要清理和删除 OpenAI 资源,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。

示例代码

另请参阅

参考文档 | 库源代码 | 包 (npm) |

先决条件

对于无密码身份验证,需要

  1. 使用@azure/identity包。
  2. Cognitive Services User角色分配给用户帐户。 这可以在 Azure 门户的访问控制 (IAM)>添加角色分配下完成。
  3. 使用 Azure CLI(例如,az login)登录。

设置

  1. 创建一个新文件夹 assistants-quickstart 以包含该应用程序,并在该文件夹中使用以下命令打开 Visual Studio Code:

    mkdir assistants-quickstart && code assistants-quickstart
    
  2. 使用以下命令创建 package.json

    npm init -y
    
  3. 使用以下命令将 package.json 更新为 ECMAScript:

    npm pkg set type=module
    
  4. 使用以下内容安装适用于 JavaScript 的 OpenAI 助手客户端库:

    npm install openai
    
  5. 对于推荐的无密码身份验证:

    npm install @azure/identity
    

检索资源信息

变量名称
AZURE_OPENAI_ENDPOINT 从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。
AZURE_OPENAI_DEPLOYMENT_NAME 此值将对应于在部署模型时为部署选择的自定义名称。 Azure 门户中的“资源管理”>“模型部署”下提供了此值。
OPENAI_API_VERSION 详细了解 API 版本

详细了解无密钥身份验证,以及如何设置环境变量

注意

若要对 SDK 使用推荐的无密钥身份验证,请确保未设置 AZURE_OPENAI_API_KEY 环境变量。

创建助手

我们将在代码中指定以下值:

Name 描述
助手名称 与特定模型关联的部署名称。
说明 说明类似于系统消息,你可以在其中提供模型指南,以了解其行为方式以及生成响应时应引用的任何上下文。 你可以描述助手的个性,告诉它应该回答什么和不应该回答什么,并告诉它如何设置回复的格式。 还可以提供在回答响应时应采取的步骤示例。
型号 这是部署名称。
代码解释器 代码解释器提供对沙盒化 Python 环境的访问权限,该环境可用于允许模型进行测试和执行代码。

工具

单个助手最多可以访问 128 个工具,包括 code interpreter 和通过函数创建的任何自定义工具。

创建新的 TypeScript 应用程序

  1. 使用以下代码创建 index.ts 文件:

    import { AzureOpenAI } from "openai";
    import {
      Assistant,
      AssistantCreateParams,
      AssistantTool,
    } from "openai/resources/beta/assistants";
    import { Message, MessagesPage } from "openai/resources/beta/threads/messages";
    import { Run } from "openai/resources/beta/threads/runs/runs";
    import { Thread } from "openai/resources/beta/threads/threads";
    
    // Add `Cognitive Services User` to identity for Azure OpenAI resource
    import {
      DefaultAzureCredential,
      getBearerTokenProvider,
    } from "@azure/identity";
    
    // Get environment variables
    const azureOpenAIEndpoint = process.env.AZURE_OPENAI_ENDPOINT as string;
    const azureOpenAIDeployment = process.env
      .AZURE_OPENAI_DEPLOYMENT_NAME as string;
    const openAIVersion = process.env.OPENAI_API_VERSION as string;
    
    // Check env variables
    if (!azureOpenAIEndpoint || !azureOpenAIDeployment || !openAIVersion) {
      throw new Error(
        "Please ensure to set AZURE_OPENAI_DEPLOYMENT_NAME and AZURE_OPENAI_ENDPOINT in your environment variables."
      );
    }
    
    // Get Azure SDK client
    const getClient = (): AzureOpenAI => {
      const credential = new DefaultAzureCredential();
      const scope = "https://cognitiveservices.azure.com/.default";
      const azureADTokenProvider = getBearerTokenProvider(credential, scope);
      const assistantsClient = new AzureOpenAI({
        endpoint: azureOpenAIEndpoint,
        apiVersion: openAIVersion,
        azureADTokenProvider,
      });
      return assistantsClient;
    };
    
    const assistantsClient = getClient();
    
    const options: AssistantCreateParams = {
      model: azureOpenAIDeployment, // Deployment name seen in Azure AI Studio
      name: "Math Tutor",
      instructions:
        "You are a personal math tutor. Write and run JavaScript code to answer math questions.",
      tools: [{ type: "code_interpreter" } as AssistantTool],
    };
    const role = "user";
    const message = "I need to solve the equation `3x + 11 = 14`. Can you help me?";
    
    // Create an assistant
    const assistantResponse: Assistant =
      await assistantsClient.beta.assistants.create(options);
    console.log(`Assistant created: ${JSON.stringify(assistantResponse)}`);
    
    // Create a thread
    const assistantThread: Thread = await assistantsClient.beta.threads.create({});
    console.log(`Thread created: ${JSON.stringify(assistantThread)}`);
    
    // Add a user question to the thread
    const threadResponse: Message =
      await assistantsClient.beta.threads.messages.create(assistantThread.id, {
        role,
        content: message,
      });
    console.log(`Message created:  ${JSON.stringify(threadResponse)}`);
    
    // Run the thread and poll it until it is in a terminal state
    const runResponse: Run = await assistantsClient.beta.threads.runs.createAndPoll(
      assistantThread.id,
      {
        assistant_id: assistantResponse.id,
      },
      { pollIntervalMs: 500 }
    );
    console.log(`Run created:  ${JSON.stringify(runResponse)}`);
    
    // Get the messages
    const runMessages: MessagesPage =
      await assistantsClient.beta.threads.messages.list(assistantThread.id);
    for await (const runMessageDatum of runMessages) {
      for (const item of runMessageDatum.content) {
        // types are: "image_file" or "text"
        if (item.type === "text") {
          console.log(`Message content: ${JSON.stringify(item.text?.value)}`);
        }
      }
    }
    
  2. 创建 tsconfig.json 文件以转译 TypeScript 代码,然后复制以下 ECMAScript 代码。

    {
        "compilerOptions": {
          "module": "NodeNext",
          "target": "ES2022", // Supports top-level await
          "moduleResolution": "NodeNext",
          "skipLibCheck": true, // Avoid type errors from node_modules
          "strict": true // Enable strict type-checking options
        },
        "include": ["*.ts"]
    }
    
  3. 从 TypeScript 转译到 JavaScript。

    tsc
    
  4. 使用以下命令登录到 Azure:

    az login
    
  5. 使用以下命令运行代码:

    node index.js
    

输出

Assistant created: {"id":"asst_zXaZ5usTjdD0JGcNViJM2M6N","createdAt":"2024-04-08T19:26:38.000Z","name":"Math Tutor","description":null,"model":"daisy","instructions":"You are a personal math tutor. Write and run JavaScript code to answer math questions.","tools":[{"type":"code_interpreter"}],"fileIds":[],"metadata":{}}
Thread created: {"id":"thread_KJuyrB7hynun4rvxWdfKLIqy","createdAt":"2024-04-08T19:26:38.000Z","metadata":{}}
Message created:  {"id":"msg_o0VkXnQj3juOXXRCnlZ686ff","createdAt":"2024-04-08T19:26:38.000Z","threadId":"thread_KJuyrB7hynun4rvxWdfKLIqy","role":"user","content":[{"type":"text","text":{"value":"I need to solve the equation `3x + 11 = 14`. Can you help me?","annotations":[]},"imageFile":{}}],"assistantId":null,"runId":null,"fileIds":[],"metadata":{}}
Created run
Run created:  {"id":"run_P8CvlouB8V9ZWxYiiVdL0FND","object":"thread.run","status":"queued","model":"daisy","instructions":"You are a personal math tutor. Write and run JavaScript code to answer math questions.","tools":[{"type":"code_interpreter"}],"metadata":{},"usage":null,"assistantId":"asst_zXaZ5usTjdD0JGcNViJM2M6N","threadId":"thread_KJuyrB7hynun4rvxWdfKLIqy","fileIds":[],"createdAt":"2024-04-08T19:26:39.000Z","expiresAt":"2024-04-08T19:36:39.000Z","startedAt":null,"completedAt":null,"cancelledAt":null,"failedAt":null}
Message content: "The solution to the equation \\(3x + 11 = 14\\) is \\(x = 1\\)."
Message content: "Yes, of course! To solve the equation \\( 3x + 11 = 14 \\), we can follow these steps:\n\n1. Subtract 11 from both sides of the equation to isolate the term with x.\n2. Then, divide by 3 to find the value of x.\n\nLet me calculate that for you."
Message content: "I need to solve the equation `3x + 11 = 14`. Can you help me?"

请务必记住,虽然代码解释器支持模型响应更复杂的查询(因为它可以将问题转换为代码,并在 JavaScript 中以迭代方式运行该代码,直到得出答案),但你仍需对响应进行验证,以确认模型是否已正确地将问题转换为有效的代码表示形式。

清理资源

如果你想要清理和删除 OpenAI 资源,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。

示例代码

另请参阅

先决条件

设置

检索密钥和终结点

若要成功地对 Azure OpenAI 发出调用,需要准备好以下各项:

变量名称
ENDPOINT 从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到服务终结点。 或者,也可以通过 Azure AI Studio 中的“部署”页找到终结点。 示例终结点为:https://docs-test-001.openai.azure.com/
API-KEY 从 Azure 门户检查资源时,可在“密钥和终结点”部分中找到此值。 可以使用 KEY1KEY2
DEPLOYMENT-NAME 此值将对应于在部署模型时为部署选择的自定义名称。 可以在 Azure 门户的“资源管理”>“部署”下,或通过 Azure AI Studio 中的“部署”页找到此值。

在 Azure 门户中转到你的资源。 可以在“资源管理”部分找到“终结点和密钥”。 复制终结点和访问密钥,因为在对 API 调用进行身份验证时需要这两项。 可以使用 KEY1KEY2。 始终准备好两个密钥可以安全地轮换和重新生成密钥,而不会导致服务中断。

Azure 门户中 Azure OpenAI 资源概述边栏选项卡的屏幕截图,其中终结点和访问密钥的位置用红圈标示。

环境变量

为密钥和终结点创建和分配持久环境变量。

重要

如果使用 API 密钥,请将其安全地存储在某个其他位置,例如 Azure Key Vault 中。 请不要直接在代码中包含 API 密钥,并且切勿公开发布该密钥。

有关 Azure AI 服务安全性的详细信息,请参阅对 Azure AI 服务的请求进行身份验证

setx AZURE_OPENAI_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE" 
setx AZURE_OPENAI_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE" 

REST API

创建助手

注意

使用 Azure OpenAI 时,model 参数需要模型部署名称。 如果模型部署名称与基础模型名称不同,则需要将代码调整为 "model": "{your-custom-model-deployment-name}"

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/assistants?api-version=2024-05-01-preview \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "instructions": "You are an AI assistant that can write code to help answer math questions.",
    "name": "Math Assist",
    "tools": [{"type": "code_interpreter"}],
    "model": "gpt-4-1106-preview"
  }'

工具

单个助手最多可以访问 128 个工具,包括code interpreter 和通过函数创建的任何自定义工具。

创建线程

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/threads \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d ''

将用户问题添加到线程

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/threads/thread_abc123/messages \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
      "role": "user",
      "content": "I need to solve the equation `3x + 11 = 14`. Can you help me?"
    }'

运行线程

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/threads/thread_abc123/runs \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "assistant_id": "asst_abc123",
  }'

检索运行状态

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/threads/thread_abc123/runs/run_abc123 \
  -H "api-key: $AZURE_OPENAI_API_KEY" \

助手响应

curl https://YOUR_RESOURCE_NAME.openai.azure.com/openai/threads/thread_abc123/messages \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \

理解结果

在此示例中,我们将创建一个启用了代码解释器的助手。 当我们向助手提出数学问题时,它会将问题转换为 python 代码,并在沙盒环境中执行代码,以确定问题的答案。 由模型创建并进行测试以得出答案的代码为:

    from sympy import symbols, Eq, solve  
      
    # Define the variable  
    x = symbols('x')  
      
    # Define the equation  
    equation = Eq(3*x + 11, 14)  
      
    # Solve the equation  
    solution = solve(equation, x)  
    solution  

请务必记住,虽然代码解释器支持模型通过将问题转换为代码并在 Python 沙盒中以迭代方式运行该代码来响应更复杂的查询,直到它得出答案,但仍需对响应进行验证,以确认模型是否已正确地将问题转换为代码中的有效表示形式。

清理资源

如果你想要清理和删除 OpenAI 资源,可以删除资源或资源组。 删除资源组同时也会删除与之相关联的任何其他资源。

另请参阅