快速入門:開始使用 Azure OpenAI Assistants (預覽版)

Azure OpenAI Assistants (預覽版) 可讓您透過自定義指示,以及透過程式代碼解釋器和自定義函式等進階工具來建立專為您需求量身打造的 AI 助理。

必要條件

  • Azure 訂用帳戶 - 建立免費帳戶

  • 在所需的 Azure 訂用帳戶中授與 Azure OpenAI 的存取權。

    目前只有應用程式會授予此服務的存取權。 您可以填妥 https://aka.ms/oai/access 的表單,以申請 Azure OpenAI 的存取權。 如有問題,請在此存放庫中提出問題來與我們連絡。

  • 已部署模型的 Azure OpenAI 資源 gpt-4 (1106-preview)

  • Azure OpenAI 助理目前位於瑞典中部、美國東部 2 和澳大利亞東部。 如需這些區域中模型可用性的詳細資訊,請參閱 模型指南

  • 建議您檢閱 負責任 AI 透明度附註 和其他 負責任 AI 資源 ,以熟悉 Azure OpenAI 服務的功能和限制。

移至 Azure OpenAI Studio

流覽至 Azure OpenAI Studio, https://oai.azure.com/ 並使用可存取 OpenAI 資源的認證登入。 在登入工作流程期間 (或之後),選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

從 Azure OpenAI Studio 登陸頁面,從左側導覽 遊樂場>助理啟動小幫手遊樂場 (預覽)

Azure OpenAI Studio 登陸頁面的螢幕快照。

操場

Assistants 遊樂場可讓您探索、原型及測試 AI 助理,而不需要執行任何程序代碼。 您可以從此頁面快速反覆運算並實驗新想法。

[小幫手] 設定畫面的螢幕快照,其中未填入所有值。

小幫手設定

使用 [ 小幫手設定 ] 窗格來建立新的 AI 助理,或選取現有的助理。

名稱 說明
助理名稱 與特定模型相關聯的部署名稱。
指示 指示類似於系統訊息,您可以在其中提供模型指引,說明其運作方式,以及產生回應時應參考的任何內容。 您可以描述助理的個性、告知其應該和不應該回答的內容,以及如何格式化回應。 您也可以提供回應回應時應採取的步驟範例。
[部署] 您可以在此設定要與助理搭配使用的模型部署。
函數 為模型建立自定義函式定義,以根據您的規格來制定 API 呼叫和結構數據輸出
程式代碼解釋器 程式代碼解釋器可讓您存取沙盒化 Python 環境,以允許模型測試和執行程式代碼。
檔案 您可以上傳最多 20 個檔案,檔案大小上限為 512 MB,以搭配工具使用。

工具

個別助理最多可以存取 128 個工具,包括 code interpreter,以及您透過 函式建立的任何自定義工具。

聊天工作階段

聊天會話也稱為 小幫手 API 內的線程 ,就是使用者與小幫手之間的交談發生的地方。 與傳統聊天完成呼叫不同,線程中的訊息數目沒有限制。 小幫手會自動壓縮要求,以符合模型的輸入令牌限制。

這也表示您不會控制在交談的每個回合期間,有多少令牌傳遞至模型。 管理令牌會抽象化,並由小幫手 API 完全處理。

選取 [ 清除聊天 ] 按鈕以刪除目前的交談歷程記錄。

在文字輸入方塊下方有兩個按鈕:

  • 新增訊息而不執行。
  • 新增並執行。

記錄

記錄會提供助理 API 活動的詳細快照集。

顯示面板

根據預設,有三個面板:助理設定、聊天會話和記錄。 顯示面板 可讓您新增、移除和重新排列面板。 如果您曾經關閉面板並需要取回面板,請使用 [顯示面板 ] 來還原遺失的面板。

建立您的第一個助理

  1. 從助理設定下拉式清單中,選取 [ 新增]

  2. 為您的小幫手命名

  3. 輸入下列指示「您是可撰寫程式代碼以協助回答數學問題的 AI 助理」

  4. 選取的 gpt-4 (1106-preview)部署。 下拉式清單會顯示您的自定義部署名稱,因此如果您的模型/部署名稱不同,您應該選擇基礎模型相當於 1106 預覽模型的部署。

  5. 選取啟用程式代碼解釋器的切換。

  6. 選取 [儲存]。

    已輸入設定詳細數據的助理螢幕快照。

  7. 輸入助理回答的問題:「我需要解決方程式 3x + 11 = 14。 你能幫我嗎?

  8. 選取 [ 新增並執行] 按鈕

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

    雖然我們可以看到答案正確,但若要確認模型使用程式代碼解釋器取得此答案,而且所撰寫的程序代碼有效,而不只是重複來自模型定型數據的答案,我們會詢問另一個問題。

  9. 輸入後續問題:「顯示您執行的程式代碼以取得此解決方案」。

    Certainly! Here's the Python code I ran to find the solution for the equation (3x + 11 = 14):
    
    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 環境中執行,來回應更複雜的數學問題,但您仍然需要驗證回應,以確認模型正確地將您的問題轉譯成程式代碼中的有效表示法。

清除資源

如果您想要清除和移除 Azure OpenAI 資源,則可以刪除資源或資源群組。 刪除資源群組也會刪除與其相關聯的任何其他資源。

另請參閱

注意

Azure AI Studio 目前為公開預覽狀態。 此預覽版本沒有服務等級協定,不建議將其用於生產工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款

必要條件

  • Azure 訂用帳戶 - 建立免費帳戶

  • 在所需的 Azure 訂用帳戶中授與 Azure OpenAI 的存取權。

    目前只有應用程式會授予此服務的存取權。 您可以填妥 https://aka.ms/oai/access 的表單,以申請 Azure OpenAI 的存取權。 如有問題,請在此存放庫中提出問題來與我們連絡。

  • 內含已部署模型的 Azure AI 中樞資源。 如需模型部署的詳細資訊,請參閱資源部署指南

  • Azure AI Studio 中的 Azure AI 專案

移至 Azure AI Studio (預覽版)

  1. 登入 Azure AI Studio

  2. 移至專案,或在 Azure AI Studio 中建立新專案

  3. 從 Azure AI Studio 首頁,選取 [建置]> [遊樂場]

    Assistants 遊樂場可讓您探索、原型及測試 AI 助理,而不需要執行任何程序代碼。 您可以從此頁面快速反覆運算並實驗新想法。

    遊樂場提供數個選項來設定您的小幫手。 在下列步驟中,您將使用 [ 小幫手] 設定 窗格來建立新的 AI 助理。

    名稱 說明
    助理名稱 與特定模型相關聯的部署名稱。
    指示 指示類似於系統訊息,您可以在其中提供模型指引,說明其運作方式,以及產生回應時應參考的任何內容。 您可以描述助理的個性、告知其應該和不應該回答的內容,以及如何格式化回應。 您也可以提供回應回應時應採取的步驟範例。
    [部署] 您可以在此設定要與助理搭配使用的模型部署。
    函數 為模型建立自定義函式定義,以根據您的規格來制定 API 呼叫和結構數據輸出。 本快速入門中未使用。
    程式代碼解釋器 程式代碼解釋器可讓您存取沙盒化 Python 環境,以允許模型測試和執行程式代碼。
    檔案 您可以上傳最多 20 個檔案,檔案大小上限為 512 MB,以搭配工具使用。 本快速入門中未使用。
  4. 從 [部署] 下拉式功能表中選取部署。

  5. 從 [模式] 下拉功能表中選取 [助理]。

    [小幫手] 設定畫面的螢幕快照,其中未填入所有值。

建立您的第一個助理

  1. 從 [小幫手設定] 下拉式清單中,選取 [ 新增]。

  2. 為您的小幫手命名。

  3. 輸入下列指示「您是可撰寫程式代碼以協助回答數學問題的 AI 助理」

  4. 選取模型部署。 我們建議使用其中一個最新的 gpt-4 模型進行測試。

  5. 選取啟用程式代碼解釋器的切換。

  6. 選取 [儲存]。

    已輸入設定詳細數據的助理螢幕快照。

  7. 輸入助理回答的問題:「我需要解決方程式 3x + 11 = 14。 你能幫我嗎?

  8. 選取 [ 新增並執行] 按鈕

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

    雖然我們可以看到答案正確,但若要確認模型使用程式代碼解釋器取得此答案,而且所撰寫的程序代碼有效,而不只是重複來自模型定型數據的答案,我們會詢問另一個問題。

  9. 輸入後續問題:「顯示您執行的程式代碼以取得此解決方案」。

    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 活動的詳細快照集。

顯示面板

根據預設,有三個面板:助理設定、聊天會話和記錄。 顯示面板 可讓您新增、移除和重新排列面板。 如果您曾經關閉面板並需要取回面板,請使用 [顯示面板 ] 來還原遺失的面板。

清除資源

如果您想要清除和移除 Azure OpenAI 資源,則可以刪除資源或資源群組。 刪除資源群組也會刪除與其相關聯的任何其他資源。

或者,您可以透過小幫手的 API 刪除助理或線程

另請參閱

參考文件 | 庫原始碼 | 套件 (PyPi) |

必要條件

  • Azure 訂用帳戶 - 建立免費帳戶

  • 在所需的 Azure OpenAI 訂用帳戶中授與服務的存取權

    目前只有應用程式會授予此服務的存取權。 您可以填妥 https://aka.ms/oai/access 的表單,以申請 Azure OpenAI 的存取權。 如有問題,請在此存放庫中提出問題來與我們連絡。

  • Python 3.8 或更新版本

  • 下列 Python 連結庫:os、json、openai (需要 1.x 版)

  • Jupyter 筆記本

  • Azure OpenAI 助理目前位於瑞典中部、美國東部 2 和澳大利亞東部。 如需這些區域中模型可用性的詳細資訊,請參閱 模型指南

  • 建議您檢閱 負責任 AI 透明度附註 和其他 負責任 AI 資源 ,以熟悉 Azure OpenAI 服務的功能和限制。

  • 已部署模型的 Azure OpenAI 資源 gpt-4 (1106-preview) 會測試此範例。

設定

使用下列項目安裝 OpenAI Python 用戶端連結庫:

pip install openai==v1.20.0

注意

Azure OpenAI 尚不支援 Assistants V2。 請使用 OpenAI Python 連結庫的 v1.20.0 版本,直到 V2 支援可用為止。

注意

此連結庫由 OpenAI 維護。 請參閱發行歷程記錄,以追蹤連結庫的最新更新。

擷取金鑰和端點

若要成功對 Azure OpenAI 服務進行呼叫,您需要下列專案:

變數名稱
ENDPOINT 檢查來自 Azure 入口網站 的資源時,可以在 [金鑰和端點] 區段中找到此值。 或者,您可以在 Azure OpenAI Studio遊樂場>檢視程式代碼中找到此值。> 範例端點為:https://docs-test-001.openai.azure.com/
API-KEY 檢查來自 Azure 入口網站 的資源時,可以在 [金鑰和端點] 區段中找到此值。 您可以使用 KEY1KEY2
DEPLOYMENT-NAME 此值會對應至您在部署模型時為部署選擇的自訂名稱。 此值可在 Azure 入口網站 中的資源管理>模型部署找到,也可以在 Azure OpenAI Studio 中的管理>部署找到。

移至您在 Azure 入口網站中的資源。 您可以在 [資源管理] 區段中找到 [金鑰] 和 [端點]。 複製您的端點和存取金鑰,因為您需要這兩者才能驗證 API 呼叫。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。

Azure 入口網站 中 Azure OpenAI 資源的 [概觀] 刀鋒視窗螢幕快照,其中端點和存取密鑰位置會以紅色圓圈。

為您的金鑰和端點建立及指派永續性環境變數。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

setx AZURE_OPENAI_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE" 
setx AZURE_OPENAI_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE" 

建立助理

在我們的程式代碼中,我們將指定下列值:

名稱 說明
助理名稱 與特定模型相關聯的部署名稱。
指示 指示類似於系統訊息,您可以在其中提供模型指引,說明其運作方式,以及產生回應時應參考的任何內容。 您可以描述助理的個性、告知其應該和不應該回答的內容,以及如何格式化回應。 您也可以提供回應回應時應採取的步驟範例。
模型 這是您設定要與助理搭配使用的模型部署名稱的位置。 擷取工具需要 gpt-35-turbo (1106)gpt-4 (1106-preview) 模型。 將此值設定為您的部署名稱,而不是模型名稱,除非它相同。
程式代碼解釋器 程式代碼解釋器可讓您存取沙盒化 Python 環境,以允許模型測試和執行程式代碼。

工具

個別助理最多可以存取 128 個工具,包括 code interpreter,以及您透過 函式建立的任何自定義工具。

使用下列專案建立並執行助理:

import os
import time
import json
from openai import AzureOpenAI
    
client = AzureOpenAI(
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
    api_version="2024-02-15-preview",
    azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
    )

# 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
run = client.beta.threads.runs.create(
  thread_id=thread.id,
  assistant_id=assistant.id,
)

# Retrieve the status of the run
run = client.beta.threads.runs.retrieve(
  thread_id=thread.id,
  run_id=run.id
)

status = run.status

# Wait till the assistant has responded
while status not in ["completed", "cancelled", "expired", "failed"]:
    time.sleep(5)
    run = client.beta.threads.runs.retrieve(thread_id=thread.id,run_id=run.id)
    status = run.status

messages = client.beta.threads.messages.list(
  thread_id=thread.id
)

print(messages.model_dump_json(indent=2))

輸出

{
  "data": [
    {
      "id": "msg_XOL8597uuV6zIEgaqZtI0KD3",
      "assistant_id": "asst_WKFOCDJ42Ld1bVUfS8w2pt6E",
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "The solution to the equation \\(3x + 11 = 14\\) is \\(x = 1\\)."
          },
          "type": "text"
        }
      ],
      "created_at": 1705892759,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "assistant",
      "run_id": "run_TSmF4LoU6bX4SD3xp5xDr1ey",
      "thread_id": "thread_hCOKdEZy1diZAAzwDudRqGRc"
    },
    {
      "id": "msg_F25tb90W5xTPqSn4KgU4aMsb",
      "assistant_id": null,
      "content": [
        {
          "text": {
            "annotations": [],
            "value": "I need to solve the equation `3x + 11 = 14`. Can you help me?"
          },
          "type": "text"
        }
      ],
      "created_at": 1705892751,
      "file_ids": [],
      "metadata": {},
      "object": "thread.message",
      "role": "user",
      "run_id": null,
      "thread_id": "thread_hCOKdEZy1diZAAzwDudRqGRc"
    }
  ],
  "object": "list",
  "first_id": "msg_XOL8597uuV6zIEgaqZtI0KD3",
  "last_id": "msg_F25tb90W5xTPqSn4KgU4aMsb",
  "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 沙盒中反覆執行該程式碼,以回應更複雜的查詢,直到到達解決方案為止,您仍然需要驗證回應,以確認模型正確地將您的問題轉譯成程式代碼中的有效表示法。

清除資源

如果您想要清除和移除 Azure OpenAI 資源,則可以刪除資源或資源群組。 刪除資源群組也會刪除與其相關聯的任何其他資源。

另請參閱

參考檔案 | 原始碼 | 套件 (NuGet)

必要條件

  • Azure 訂用帳戶 - 建立免費帳戶

  • 在所需的 Azure OpenAI 訂用帳戶中授與服務的存取權

    目前只有應用程式會授予此服務的存取權。 您可以填妥 https://aka.ms/oai/access 的表單,以申請 Azure OpenAI 的存取權。 如有問題,請在此存放庫中提出問題來與我們連絡。

  • .NET 8 SDK

  • Azure OpenAI 助理目前位於瑞典中部、美國東部 2 和澳大利亞東部。 如需這些區域中模型可用性的詳細資訊,請參閱 模型指南

  • 建議您檢閱 負責任 AI 透明度附註 和其他 負責任 AI 資源 ,以熟悉 Azure OpenAI 服務的功能和限制。

  • 已部署模型的 Azure OpenAI 資源 gpt-4 (1106-preview) 會測試此範例。

設定

建立新的 .NET Core 應用程式

在主控台視窗中 (例如 cmd、PowerShell 或 Bash),使用 dotnet new 命令建立名為 azure-openai-quickstart 的新主控台應用程式。 此命令會建立具有單一 C# 原始程式檔的簡單 「Hello World」 專案: Program.cs

dotnet new console -n azure-openai-assistants-quickstart

將目錄變更為新建立的應用程式資料夾。 您可以使用下列命令來建置應用程式:

dotnet build

建置輸出應該不會有警告或錯誤。

...
Build succeeded.
 0 Warning(s)
 0 Error(s)
...

使用下列項目安裝 OpenAI .NET 用戶端連結庫:

dotnet add package Azure.AI.OpenAI.Assistants --prerelease

擷取金鑰和端點

若要成功對 Azure OpenAI 進行呼叫,您需要 端點密鑰

變數名稱
ENDPOINT 從 Azure 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 Azure OpenAI Studio遊樂場>程式代碼檢視中找到值。> 範例端點為:https://docs-test-001.openai.azure.com/
API-KEY 從 Azure 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 您可以使用 KEY1KEY2

移至您在 Azure 入口網站中的資源。 您可以在 [資源管理] 區段中找到 [金鑰和端點] 區段。 複製您的端點和存取金鑰,因為您需要這兩者才能驗證 API 呼叫。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。

Azure 入口網站 中 Azure OpenAI 資源的概觀 UI 螢幕快照,其中端點和存取密鑰位置會以紅色圓圈。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

setx AZURE_OPENAI_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE" 
setx AZURE_OPENAI_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE" 

建立助理

在我們的程式代碼中,我們將指定下列值:

名稱 說明
助理名稱 與特定模型相關聯的部署名稱。
指示 指示類似於系統訊息,您可以在其中提供模型指引,說明其運作方式,以及產生回應時應參考的任何內容。 您可以描述助理的個性、告知其應該和不應該回答的內容,以及如何格式化回應。 您也可以提供回應回應時應採取的步驟範例。
模型 這是您設定要與助理搭配使用的模型部署名稱的位置。 擷取工具需要 gpt-35-turbo (1106)gpt-4 (1106-preview) 模型。 將此值設定為您的部署名稱,而不是模型名稱,除非它相同。
程式代碼解釋器 程式代碼解釋器可讓您存取沙盒化 Python 環境,以允許模型測試和執行程式代碼。

工具

個別助理最多可以存取 128 個工具,包括 code interpreter,以及您透過 函式建立的任何自定義工具。

使用下列專案建立並執行助理:

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

string endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") ?? throw new ArgumentNullException("AZURE_OPENAI_ENDPOINT");
string key = Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY") ?? throw new ArgumentNullException("AZURE_OPENAI_API_KEY");
AssistantsClient client = new AssistantsClient(new Uri(endpoint), new AzureKeyCredential(key));

// Create an assistant
Assistant assistant = await client.CreateAssistantAsync(
    new AssistantCreationOptions("gpt-4-1106-preview") // Replace this with the name of your model deployment
    {
        Name = "Math Tutor",
        Instructions = "You are a personal math tutor. Write and run code to answer math questions.",
        Tools = { new CodeInterpreterToolDefinition() }
    });

// Create a thread
AssistantThread thread = await client.CreateThreadAsync();

// Add a user question to the thread
ThreadMessage message = await client.CreateMessageAsync(
    thread.Id,
    MessageRole.User,
    "I need to solve the equation `3x + 11 = 14`. Can you help me?");

// Run the thread
ThreadRun run = await client.CreateRunAsync(
    thread.Id,
    new CreateRunOptions(assistant.Id)
);

// Wait for the assistant to respond
do
{
    await Task.Delay(TimeSpan.FromMilliseconds(500));
    run = await client.GetRunAsync(thread.Id, run.Id);
}
while (run.Status == RunStatus.Queued
    || run.Status == RunStatus.InProgress);

// Get the messages
PageableList<ThreadMessage> messagesPage = await client.GetMessagesAsync(thread.Id);
IReadOnlyList<ThreadMessage> messages = messagesPage.Data;

// Note: messages iterate from newest to oldest, with the messages[0] being the most recent
foreach (ThreadMessage threadMessage in messages.Reverse())
{
    Console.Write($"{threadMessage.CreatedAt:yyyy-MM-dd HH:mm:ss} - {threadMessage.Role,10}: ");
    foreach (MessageContent contentItem in threadMessage.ContentItems)
    {
        if (contentItem is MessageTextContent textItem)
        {
            Console.Write(textItem.Text);
        }
        Console.WriteLine();
    }
}

這會列印輸出,如下所示:

2024-03-05 03:38:17 -       user: I need to solve the equation `3x + 11 = 14`. Can you help me?
2024-03-05 03:38:25 -  assistant: The solution to the equation \(3x + 11 = 14\) is \(x = 1\).

您可以在重新執行之前,在線程上建立新訊息,這會看到助理使用過去的訊息做為線程內的內容。

清除資源

如果您想要清除和移除 Azure OpenAI 資源,則可以刪除資源或資源群組。 刪除資源群組也會刪除與其相關聯的任何其他資源。

另請參閱

參考文件 | 庫原始碼 | 套件 (npm) |

必要條件

針對無密碼驗證,您需要

  1. @azure/identity使用套件。
  2. Cognitive Services User 角色指派給您的用戶帳戶。 這可以在訪問控制 (IAM)>[新增角色指派] 底下的 Azure 入口網站 中完成。
  3. 使用 Azure CLI 登入,例如 az login

設定

  1. 使用下列專案安裝適用於 JavaScript 的 OpenAI Assistants 用戶端連結庫:

    npm install @azure/openai-assistants
    
  2. 針對建議無密碼驗證:

    npm install @azure/identity
    

    或使用服務金鑰連線:

    npm install @azure/core-auth
    

擷取金鑰和端點

若要成功對 Azure OpenAI 服務進行呼叫,您需要下列專案:

變數名稱
ENDPOINT 檢查來自 Azure 入口網站 的資源時,可以在 [金鑰和端點] 區段中找到此值。 或者,您可以在 Azure OpenAI Studio遊樂場>檢視程式代碼中找到此值。> 範例端點為:https://docs-test-001.openai.azure.com/
API-KEY 檢查來自 Azure 入口網站 的資源時,可以在 [金鑰和端點] 區段中找到此值。 您可以使用 KEY1KEY2
DEPLOYMENT-NAME 此值會對應至您在部署模型時為部署選擇的自訂名稱。 此值可以在 Azure 入口網站 中的資源管理>模型部署找到,也可以在 Azure OpenAI Studio 中的管理>部署找到。

移至您在 Azure 入口網站中的資源。 您可以在 [資源管理] 區段中找到 [金鑰] 和 [端點]。 複製您的端點和存取金鑰,因為您需要這兩者才能驗證 API 呼叫。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。

Azure 入口網站 中 OpenAI 資源的概觀刀鋒視窗螢幕快照,其中端點和存取密鑰位置會以紅色圓圈。

為您的金鑰和端點建立及指派永續性環境變數。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

setx AZURE_OPENAI_API_KEY "REPLACE_WITH_YOUR_KEY_VALUE_HERE" 
setx AZURE_OPENAI_ENDPOINT "REPLACE_WITH_YOUR_ENDPOINT_HERE" 

為部署名稱新增其他環境變數: AZURE_OPENAI_DEPLOYMENT_NAME

為您的金鑰和端點建立及指派永續性環境變數。

setx AZURE_OPENAI_DEPLOYMENT_NAME "REPLACE_WITH_YOUR_DEPLOYMENT_NAME" 

建立助理

在我們的程式代碼中,我們將指定下列值:

名稱 說明
助理名稱 與特定模型相關聯的部署名稱。
指示 指示類似於系統訊息,您可以在其中提供模型指引,說明其運作方式,以及產生回應時應參考的任何內容。 您可以描述助理的個性、告知其應該和不應該回答的內容,以及如何格式化回應。 您也可以提供回應回應時應採取的步驟範例。
模型 這是部署名稱。
程式代碼解釋器 程式代碼解釋器可讓您存取沙盒化 Python 環境,以允許模型測試和執行程式代碼。

工具

個別助理最多可以存取 128 個工具,包括 code interpreter,以及您透過 函式建立的任何自定義工具。

使用 登入 Azure az login ,然後使用下列 建議 的無密碼 TypeScript 模組建立並執行小幫手(index.ts):

import "dotenv/config";
import {
  AssistantsClient,
  AssistantCreationOptions,
  ToolDefinition,
  Assistant,
  AssistantThread,
  ThreadMessage,
  ThreadRun,
  ListResponseOf,
  MessageContent
} from "@azure/openai-assistants";

// Add `Cognitive Services User` to identity for Azure OpenAI resource
import { DefaultAzureCredential } 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;

// Check env varaibles
if (!azureOpenAIEndpoint || !azureOpenAIDeployment) {
  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 = (): AssistantsClient => {
  const credential = new DefaultAzureCredential();
  const assistantsClient = new AssistantsClient(azureOpenAIEndpoint, credential);
  return assistantsClient;  
}

const assistantsClient = getClient();

const options: AssistantCreationOptions = {
  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 ToolDefinition],
};
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.createAssistant(options);
console.log(`Assistant created: ${JSON.stringify(assistantResponse)}`);

// Create a thread
const assistantThread: AssistantThread = await assistantsClient.createThread({});
console.log(`Thread created: ${JSON.stringify(assistantThread)}`);

// Add a user question to the thread
const threadResponse: ThreadMessage = await assistantsClient.createMessage(
  assistantThread.id,
  role,
  message
);
console.log(`Message created:  ${JSON.stringify(threadResponse)}`);

// Run the thread
let runResponse: ThreadRun = await assistantsClient.createRun(assistantThread.id, {
  assistantId: assistantResponse.id,
});
console.log(`Run created:  ${JSON.stringify(runResponse)}`);

// Wait for the assistant to respond
do {
  await new Promise((r) => setTimeout(r, 500));
  runResponse = await assistantsClient.getRun(
    assistantThread.id,
    runResponse.id
  );
} while (
  // RunStatus is an enum with the following values: 
  // "queued", "in_progress", "requires_action", "cancelling", "cancelled", "failed", "completed", "expired"
  runResponse.status === "queued" ||
  runResponse.status === "in_progress"
);

// Get the messages
const runMessages: ListResponseOf<ThreadMessage> = await assistantsClient.listMessages(assistantThread.id);
for (const runMessageDatum of runMessages.data) {
  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)}`);
    }
  }
}

若要使用服務金鑰進行驗證,您可以使用下列 TypeScript 模組建立並執行助理(index.ts):

import "dotenv/config";
import {
  AssistantsClient,
  AssistantCreationOptions,
  ToolDefinition,
  Assistant,
  AssistantThread,
  ThreadMessage,
  ThreadRun,
  ListResponseOf,
  MessageContent
} from "@azure/openai-assistants";
import { AzureKeyCredential } from "@azure/core-auth";

// Get environment variables
const azureOpenAIKey = process.env.AZURE_OPENAI_KEY as string;
const azureOpenAIEndpoint = process.env.AZURE_OPENAI_ENDPOINT as string;
const azureOpenAIDeployment = process.env.AZURE_OPENAI_DEPLOYMENT_NAME as string;
const credential = new AzureKeyCredential(azureOpenAIKey);

// Check env varaibles
if (!azureOpenAIKey || !azureOpenAIEndpoint || !azureOpenAIDeployment) {
  throw new Error(
    "Please ensure to set AZURE_OPENAI_KEY and AZURE_OPENAI_ENDPOINT in your environment variables."
  );
}

// Get Azure SDK client
const getClient = (): AssistantsClient => {
  const assistantsClient = new AssistantsClient(azureOpenAIEndpoint, credential);
  return assistantsClient;
}

const assistantsClient = getClient();

const options: AssistantCreationOptions = {
  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 ToolDefinition],
};
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.createAssistant(options);
console.log(`Assistant created: ${JSON.stringify(assistantResponse)}`);

// Create a thread
const assistantThread: AssistantThread = await assistantsClient.createThread({});
console.log(`Thread created: ${JSON.stringify(assistantThread)}`);

// Add a user question to the thread
const threadResponse: ThreadMessage = await assistantsClient.createMessage(
  assistantThread.id,
  role,
  message
);
console.log(`Message created:  ${JSON.stringify(threadResponse)}`);

// Run the thread
let runResponse: ThreadRun = await assistantsClient.createRun(assistantThread.id, {
  assistantId: assistantResponse.id,
});
console.log(`Run created:  ${JSON.stringify(runResponse)}`);

// Wait for the assistant to respond
do {
  await new Promise((r) => setTimeout(r, 500));
  runResponse = await assistantsClient.getRun(
    assistantThread.id,
    runResponse.id
  );
} while (
  // RunStatus is an enum with the following values: 
  // "queued", "in_progress", "requires_action", "cancelling", "cancelled", "failed", "completed", "expired"
  runResponse.status === "queued" ||
  runResponse.status === "in_progress"
);

// Get the messages
const runMessages: ListResponseOf<ThreadMessage> = await assistantsClient.listMessages(assistantThread.id);
for (const runMessageDatum of runMessages.data) {
  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)}`);
    }
  }
}

輸出

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 中反覆執行該程式碼,以回應更複雜的查詢,直到到達解決方案為止,您仍然需要驗證回應,以確認模型正確地將您的問題轉譯成程式代碼中的有效表示法。

清除資源

如果您想要清除和移除 Azure OpenAI 資源,則可以刪除資源或資源群組。 刪除資源群組也會刪除與其相關聯的任何其他資源。

範例指令碼

另請參閱

必要條件

  • Azure 訂用帳戶 - 建立免費帳戶

  • 在所需的 Azure OpenAI 訂用帳戶中授與服務的存取權

    目前只有應用程式會授予此服務的存取權。 您可以在 完成表單 https://aka.ms/oai/access,以申請 Azure OpenAI 服務的存取權。 如有問題,請在此存放庫中提出問題來與我們連絡。

  • Python 3.8 或更新版本

  • Azure OpenAI 助理目前位於瑞典中部、美國東部 2 和澳大利亞東部。 如需這些區域中模型可用性的詳細資訊,請參閱 模型指南

  • 建議您檢閱 負責任 AI 透明度附註 和其他 負責任 AI 資源 ,以熟悉 Azure OpenAI 服務的功能和限制。

  • 已部署模型的 Azure OpenAI 資源 gpt-4 (1106-preview) 會測試此範例。

設定

擷取金鑰和端點

若要成功對 Azure OpenAI 進行呼叫,您需要下列專案:

變數名稱
ENDPOINT 從 Azure 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 或者,您可以在 [Azure OpenAI Studio]>[遊樂場]>[程式碼檢視] 中找到該值。 範例端點為:https://docs-test-001.openai.azure.com/
API-KEY 從 Azure 入口網站查看您的資源時,可以在 [金鑰與端點] 區段中找到此值。 您可以使用 KEY1KEY2
DEPLOYMENT-NAME 此值會對應至您在部署模型時為部署選擇的自訂名稱。 此值可以在 Azure 入口網站中的 [資源管理]>[部署] 底下找到,也可以在 Azure OpenAI Studio 的 [管理]>[部署]下找到。

移至您在 Azure 入口網站中的資源。 您可以在 [資源管理] 區段中找到 [端點和金鑰]。 複製您的端點和存取金鑰,因為您需要這兩者才能驗證 API 呼叫。 您可以使用 KEY1KEY2。 隨時持有兩個金鑰可讓您安全地輪替和重新產生金鑰,而不會造成服務中斷。

Azure 入口網站 中 Azure OpenAI 資源概觀刀鋒視窗的螢幕快照,其中端點和存取密鑰位置會以紅色圓圈顯示。

為您的金鑰和端點建立及指派永續性環境變數。

環境變數

為您的金鑰和端點建立及指派永續性環境變數。

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-02-15-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 沙盒中反覆執行該程式碼,以回應更複雜的查詢,直到到達解決方案為止,您仍然需要驗證回應,以確認模型正確地將您的問題轉譯成程式代碼中的有效表示法。

清除資源

如果您想要清除和移除 Azure OpenAI 資源,則可以刪除資源或資源群組。 刪除資源群組也會刪除與其相關聯的任何其他資源。

另請參閱