適用於 Azure Functions 的 Azure OpenAI 助理發佈輸入繫結

重要

適用於 Azure Functions 的 Azure OpenAI 延伸模組目前為預覽狀態。

Azure OpenAI 助理發佈輸入繫結可讓您將提示傳送給助理聊天機器人。

如需 Azure OpenAI 延伸模組的安裝和設定詳細資訊,請參閱適用於 Azure Functions 的 Azure OpenAI 延伸模組。 若要深入了解 Azure OpenAI 助理,請參閱 Azure OpenAI 助理 API。

注意

參考和範例僅適用於 Node.js v4 模型。

注意

參考和範例僅適用於 Python v2 模型。

注意

雖然支援這兩個 C# 進程模型,但只會 提供隔離的背景工作模型 範例。

範例

目前這款綁定沒有 Go 支援。

此範例示範了建立程序,其中 HTTP POST 函式會將使用者提示傳送給助理聊天機器人。 對提示的回應會在 HTTP 回應中傳回。

/// <summary>
/// HTTP POST function that sends user prompts to the assistant chat bot.
/// </summary>
[Function(nameof(PostUserQuery))]
public static IActionResult PostUserQuery(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "assistants/{assistantId}")] HttpRequestData req,
    string assistantId,
    [AssistantPostInput("{assistantId}", "{Query.message}", ChatModel = "%CHAT_MODEL_DEPLOYMENT_NAME%", AIConnectionName = "AzureOpenAI", ChatStorageConnectionSetting = DefaultChatStorageConnectionSetting, CollectionName = DefaultCollectionName)] AssistantState state)
{
    return new OkObjectResult(state.RecentMessages.Any() ? state.RecentMessages[state.RecentMessages.Count - 1].Content : "No response returned.");
}

此範例示範了建立程序,其中 HTTP POST 函式會將使用者提示傳送給助理聊天機器人。 對提示的回應會在 HTTP 回應中傳回。

/*
 * HTTP POST function that sends user prompts to the assistant chat bot.
 */ 
@FunctionName("PostUserResponse")
public HttpResponseMessage postUserResponse(
    @HttpTrigger(
        name = "req",
        methods = {HttpMethod.POST}, 
        authLevel = AuthorizationLevel.FUNCTION,
        route = "assistants/{assistantId}") 
        HttpRequestMessage<Optional<String>> request,
    @BindingName("assistantId") String assistantId,        
    @AssistantPost(name="newMessages", id = "{assistantId}", chatModel = "%CHAT_MODEL_DEPLOYMENT_NAME%", aiConnectionName = "AzureOpenAI", userMessage = "{Query.message}", chatStorageConnectionSetting = DEFAULT_CHATSTORAGE, collectionName = DEFAULT_COLLECTION) AssistantState state,
    final ExecutionContext context) {
        
        List<AssistantMessage> recentMessages = state.getRecentMessages();
        String response = recentMessages.isEmpty() ? "No response returned." : recentMessages.get(recentMessages.size() - 1).getContent();
        
        return request.createResponseBuilder(HttpStatus.OK)
            .header("Content-Type", "application/json")
            .body(response)
            .build();
}

此範例示範了建立程序,其中 HTTP POST 函式會將使用者提示傳送給助理聊天機器人。 對提示的回應會在 HTTP 回應中傳回。

const { app, input, output } = require("@azure/functions");

const assistantPostInput = input.generic({
    type: 'assistantPost',
    id: '{assistantId}',
    chatModel: '%CHAT_MODEL_DEPLOYMENT_NAME%',
    aiConnectionName: 'AzureOpenAI',
    userMessage: '{Query.message}',
    chatStorageConnectionSetting: CHAT_STORAGE_CONNECTION_SETTING,
    collectionName: COLLECTION_NAME
})
app.http('PostUserResponse', {
    methods: ['POST'],
    route: 'assistants/{assistantId}',
    authLevel: 'function',
    extraInputs: [assistantPostInput],
    handler: async (_, context) => {
        const chatState = context.extraInputs.get(assistantPostInput)
        const content = chatState.recentMessages[0].content
        return {
            status: 200,
            body: content,
            headers: {
                'Content-Type': 'text/plain'
            }
        };
    }
})
import { HttpRequest, InvocationContext, app, input, output } from "@azure/functions"

const assistantPostInput = input.generic({
    type: 'assistantPost',
    id: '{assistantId}',
    chatModel: '%CHAT_MODEL_DEPLOYMENT_NAME%',
    aiConnectionName: 'AzureOpenAI',
    userMessage: '{Query.message}',
    chatStorageConnectionSetting: CHAT_STORAGE_CONNECTION_SETTING,
    collectionName: COLLECTION_NAME
})
app.http('PostUserResponse', {
    methods: ['POST'],
    route: 'assistants/{assistantId}',
    authLevel: 'function',
    extraInputs: [assistantPostInput],
    handler: async (_, context) => {
        const chatState: any = context.extraInputs.get(assistantPostInput)
        const content = chatState.recentMessages[0].content
        return {
            status: 200,
            body: content,
            headers: {
                'Content-Type': 'text/plain'
            }
        };
    }
})

此範例示範了建立程序,其中 HTTP POST 函式會將使用者提示傳送給助理聊天機器人。 對提示的回應會在 HTTP 回應中傳回。

以下是 後續使用者查詢的 function.json檔案:

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "route": "assistants/{assistantId}",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "name": "State",
      "type": "assistantPost",
      "direction": "in",
      "dataType": "string",
      "id": "{assistantId}",
      "userMessage": "{Query.message}",
      "chatModel": "%CHAT_MODEL_DEPLOYMENT_NAME%",
      "chatStorageConnectionSetting": "AzureWebJobsStorage",
      "collectionName": "ChatState",
      "aiConnectionName": "AzureOpenAI"
    }
  ]
}

如需 function.json 檔案屬性的詳細資訊,請參閱設定一節。

using namespace System.Net

param($Request, $TriggerMetadata, $State)

$recent_message_content = "No recent messages!"

if ($State.recentMessages.Count -gt 0) {
    $recent_message_content = $State.recentMessages[0].content
}

Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body       = $recent_message_content
    Headers    = @{
        "Content-Type" = "text/plain"
    }
})

此範例示範了建立程序,其中 HTTP POST 函式會將使用者提示傳送給助理聊天機器人。 對提示的回應會在 HTTP 回應中傳回。

@apis.function_name("PostUserQuery")
@apis.route(route="assistants/{assistantId}", methods=["POST"])
@apis.assistant_post_input(
    arg_name="state",
    id="{assistantId}",
    user_message="{Query.message}",
    chat_model="%CHAT_MODEL_DEPLOYMENT_NAME%",
    ai_connection_name="AzureOpenAI",
    chat_storage_connection_setting=DEFAULT_CHAT_STORAGE_SETTING,
    collection_name=DEFAULT_CHAT_COLLECTION_NAME,
)
def post_user_response(req: func.HttpRequest, state: str) -> func.HttpResponse:
    # Parse the JSON string into a dictionary
    data = json.loads(state)

    # Extract the content of the recentMessage
    recent_message_content = data["recentMessages"][0]["content"]
    return func.HttpResponse(
        recent_message_content, status_code=200, mimetype="text/plain"
    )

屬性

套用 PostUserQuery 屬性來定義助理發佈輸入繫結,其支援下列參數:

參數 描述
標識碼 要更新之助理的識別碼。
UserMessage 取得或設定聊天完成模型的使用者訊息,編碼為字串。
AIConnectionName 選擇性。 取得或設定 AI 服務連線設定的組態區段名稱。 針對 Azure OpenAI:如果指定,請在此組態區段中尋找「端點」和「金鑰」值。 如果未指定或區段不存在,請回復為環境變數:AZURE_OPENAI_ENDPOINT和AZURE_OPENAI_KEY。 針對使用者指派的受控識別驗證,需要此屬性。 針對OpenAI服務 (非 Azure),請設定OPENAI_API_KEY環境變數。
ChatModel 選擇性。 取得或設定要當做字串使用的模型識別碼,預設值為 gpt-3.5-turbo。
溫度 選擇性。 取得或設定要使用的取樣溫度,做為 和0之間的2字串。 較高的值 (0.8) 會使輸出更具隨機性,而較低的值,例如 (0.2) 讓輸出更具焦點且具決定性。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
TopP 選擇性。 取得或設定以溫度作為字串進行取樣的替代方法,稱為核取樣。 在此取樣方法中,模型會考慮具有 top_p 機率品質的令牌結果。 因此 0.1 ,表示只會考慮包含前10個% 機率質量的標記。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
MaxTokens 選擇性。 取得或設定完成時要產生的令牌數目上限,做為預設值為的 100字串。 提示的權杖計數加上 max_tokens 不能超過模型的內容長度。 大部分模型的內容長度為 2,048 個標記(但支援 4096 的最新模型除外)。
IsReasoningModel 選擇性。 取得或設定值,指出聊天完成模型是否為推理模型。 此選項是實驗性的,且與推理模型相關聯,直到所有模型在預期的屬性中具有同位,預設值為 false。

註釋

PostUserQuery 註釋可讓您定義助理發佈輸入繫結,其支援下列參數:

元素 描述
名字 輸出繫結的名稱。
識別碼 要更新之助理的識別碼。
userMessage 取得或設定聊天完成模型的使用者訊息,編碼為字串。
aiConnectionName 選擇性。 取得或設定 AI 服務連線設定的組態區段名稱。 針對 Azure OpenAI:如果指定,請在此組態區段中尋找「端點」和「金鑰」值。 如果未指定或區段不存在,請回復為環境變數:AZURE_OPENAI_ENDPOINT和AZURE_OPENAI_KEY。 針對使用者指派的受控識別驗證,需要此屬性。 針對OpenAI服務 (非 Azure),請設定OPENAI_API_KEY環境變數。
chatModel 取得或設定要當做字串使用的模型識別碼,預設值為 gpt-3.5-turbo。
溫度 選擇性。 取得或設定要使用的取樣溫度,做為 和0之間的2字串。 較高的值 (0.8) 會使輸出更具隨機性,而較低的值,例如 (0.2) 讓輸出更具焦點且具決定性。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
topP 選擇性。 取得或設定以溫度作為字串進行取樣的替代方法,稱為核取樣。 在此取樣方法中,模型會考慮具有 top_p 機率品質的令牌結果。 因此 0.1 ,表示只會考慮包含前10個% 機率質量的標記。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
maxTokens 選擇性。 取得或設定完成時要產生的令牌數目上限,做為預設值為的 100字串。 提示的權杖計數加上 max_tokens 不能超過模型的內容長度。 大部分模型的內容長度為 2,048 個標記(但支援 4096 的最新模型除外)。
isReasoningModel 選擇性。 取得或設定值,指出聊天完成模型是否為推理模型。 此選項是實驗性的,且與推理模型相關聯,直到所有模型在預期的屬性中具有同位,預設值為 false。

裝飾項目

在預覽期間,將輸出繫結定義為 generic_output_binding 類型的 postUserQuery 繫結,其支援下列參數:

參數 描述
arg_name 代表繫結參數的變數名稱。
識別碼 要更新之助理的識別碼。
user_message 取得或設定聊天完成模型的使用者訊息,編碼為字串。
ai_connection_name 選擇性。 取得或設定 AI 服務連線設定的組態區段名稱。 針對 Azure OpenAI:如果指定,請在此組態區段中尋找「端點」和「金鑰」值。 如果未指定或區段不存在,請回復為環境變數:AZURE_OPENAI_ENDPOINT和AZURE_OPENAI_KEY。 針對使用者指派的受控識別驗證,需要此屬性。 針對OpenAI服務 (非 Azure),請設定OPENAI_API_KEY環境變數。
chat_model 取得或設定要當做字串使用的模型識別碼,預設值為 gpt-3.5-turbo。
溫度 選擇性。 取得或設定要使用的取樣溫度,做為 和0之間的2字串。 較高的值 (0.8) 會使輸出更具隨機性,而較低的值,例如 (0.2) 讓輸出更具焦點且具決定性。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
top_p 選擇性。 取得或設定以溫度作為字串進行取樣的替代方法,稱為核取樣。 在此取樣方法中,模型會考慮具有 top_p 機率品質的令牌結果。 因此 0.1 ,表示只會考慮包含前10個% 機率質量的標記。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
max_tokens 選擇性。 取得或設定完成時要產生的令牌數目上限,做為預設值為的 100字串。 提示的權杖計數加上 max_tokens 不能超過模型的內容長度。 大部分模型的內容長度為 2,048 個標記(但支援 4096 的最新模型除外)。
is_reasoning _model 選擇性。 取得或設定值,指出聊天完成模型是否為推理模型。 此選項是實驗性的,且與推理模型相關聯,直到所有模型在預期的屬性中具有同位,預設值為 false。

組態

繫結支援您在 function.json 檔案中設定的下列組態屬性。

屬性 描述
類型 必須是 PostUserQuery。
方向 必須是 out。
名字 輸出繫結的名稱。
識別碼 要更新之助理的識別碼。
userMessage 取得或設定聊天完成模型的使用者訊息,編碼為字串。
aiConnectionName 選擇性。 取得或設定 AI 服務連線設定的組態區段名稱。 針對 Azure OpenAI:如果指定,請在此組態區段中尋找「端點」和「金鑰」值。 如果未指定或區段不存在,請回復為環境變數:AZURE_OPENAI_ENDPOINT和AZURE_OPENAI_KEY。 針對使用者指派的受控識別驗證,需要此屬性。 針對OpenAI服務 (非 Azure),請設定OPENAI_API_KEY環境變數。
chatModel 取得或設定要當做字串使用的模型識別碼,預設值為 gpt-3.5-turbo。
溫度 選擇性。 取得或設定要使用的取樣溫度,做為 和0之間的2字串。 較高的值 (0.8) 會使輸出更具隨機性,而較低的值,例如 (0.2) 讓輸出更具焦點且具決定性。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
topP 選擇性。 取得或設定以溫度作為字串進行取樣的替代方法,稱為核取樣。 在此取樣方法中,模型會考慮具有 top_p 機率品質的令牌結果。 因此 0.1 ,表示只會考慮包含前10個% 機率質量的標記。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
maxTokens 選擇性。 取得或設定完成時要產生的令牌數目上限,做為預設值為的 100字串。 提示的權杖計數加上 max_tokens 不能超過模型的內容長度。 大部分模型的內容長度為 2,048 個標記(但支援 4096 的最新模型除外)。
isReasoningModel 選擇性。 取得或設定值,指出聊天完成模型是否為推理模型。 此選項是實驗性的,且與推理模型相關聯,直到所有模型在預期的屬性中具有同位,預設值為 false。

組態

繫結支援您在程式碼中定義的下列屬性:

屬性 描述
識別碼 要更新之助理的識別碼。
userMessage 取得或設定聊天完成模型的使用者訊息,編碼為字串。
aiConnectionName 選擇性。 取得或設定 AI 服務連線設定的組態區段名稱。 針對 Azure OpenAI:如果指定,請在此組態區段中尋找「端點」和「金鑰」值。 如果未指定或區段不存在,請回復為環境變數:AZURE_OPENAI_ENDPOINT和AZURE_OPENAI_KEY。 針對使用者指派的受控識別驗證,需要此屬性。 針對OpenAI服務 (非 Azure),請設定OPENAI_API_KEY環境變數。
chatModel 取得或設定要當做字串使用的模型識別碼,預設值為 gpt-3.5-turbo。
溫度 選擇性。 取得或設定要使用的取樣溫度,做為 和0之間的2字串。 較高的值 (0.8) 會使輸出更具隨機性,而較低的值,例如 (0.2) 讓輸出更具焦點且具決定性。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
topP 選擇性。 取得或設定以溫度作為字串進行取樣的替代方法,稱為核取樣。 在此取樣方法中,模型會考慮具有 top_p 機率品質的令牌結果。 因此 0.1 ,表示只會考慮包含前10個% 機率質量的標記。 您應該使用 或 Temperature,但不應該同時使用TopP兩者。
maxTokens 選擇性。 取得或設定完成時要產生的令牌數目上限,做為預設值為的 100字串。 提示的權杖計數加上 max_tokens 不能超過模型的內容長度。 大部分模型的內容長度為 2,048 個標記(但支援 4096 的最新模型除外)。
isReasoningModel 選擇性。 取得或設定值,指出聊天完成模型是否為推理模型。 此選項是實驗性的,且與推理模型相關聯,直到所有模型在預期的屬性中具有同位,預設值為 false。

使用方式

如需完整範例,請參閱範例一節。

連結

要使用 Azure OpenAI 綁定擴充功能,你需要指定一個連接到 OpenAI 模型定義的連結。 請使用以下其中一種方法在綁定中設定 OpenAI 模型連線:

  • 使用 AIConnectionName binding 屬性(Azure OpenAI 偏好)。
  • 在應用程式內設定並設定AZURE_OPENAI_ENDPOINTAZURE_OPENAI_KEY(針對 Azure OpenAI)。
  • 只 Open_API_Key 在應用程式設定中設定(針對 https://api.openai.com)。

連線的設定方式取決於模型 API 與認證方法,如下表所示:

認證/模型 API Azure OpenAI OpenAI (https://api.openai.com)
管理身份連線 AIConnectionName 不支援
金鑰保存庫 參考 AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_KEY
Open_API_Key
應用程式配置參考 AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_KEY
Open_API_Key
共用密碼 AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_KEY
Open_API_Key

使用基於管理身份的連線和屬性 AIConnectionName 。

當你使用 AIConnectionName時,這個屬性設定的值會依連接類型而異:

  • 管理身份連線:此AIConnectionName屬性由<CONNECTION_NAME_PREFIX>一組設定共享,這些設定共同定義了與 Azure OpenAI 的身份基礎連線。 欲了解更多資訊,請參閱定義身份連結。
  • 金鑰保存庫 參考:AIConnectionName屬性設定回傳一個 Azure Key Vault 參考,指向 API 金鑰集中維護的位置。 欲了解更多資訊,請參閱定義 金鑰保存庫 連接。
  • App Configuration 參考:AIConnectionName屬性設定會回傳一個 Azure 應用程式組態 參考,該參考會回傳 API 金鑰或 金鑰保存庫 參考。 欲了解更多資訊,請參閱連接條目中的 Azure 應用程式組態。
  • API 金鑰: AIConnectionName 屬性設定會解析成包含端點與金鑰的應用程式設定。 由於共享金鑰可能被入侵,請盡可能使用受管理身份連線。 欲了解更多資訊,請參閱定義連結。

想了解更多關於綁定連接的資訊,請參閱 Azure Functions 中的 Manage connections 。

OpenAI 綁定包含一個AIConnectionName屬性,你可以用來指定定義與 Azure OpenAI 連結的應用程式設定群組:<ConnectionNamePrefix>

設定名稱 描述
<CONNECTION_NAME_PREFIX>__endpoint 設定 Azure OpenAI 服務的 URI 端點。 這項設定一律為必要。
<CONNECTION_NAME_PREFIX>__clientId 設定取得存取令牌時要使用的特定使用者指派身分識別。 需要將 <CONNECTION_NAME_PREFIX>__credential 設定為 managedidentity。 屬性接受的用戶端識別碼,對應至指派給應用程式的使用者指派身分識別。 指定資源識別碼和用戶端識別碼無效。 如果你沒有指定這個屬性,則會使用系統指定的身份。 不應該設定 時,這個屬性會以不同的方式用於credential。
<CONNECTION_NAME_PREFIX>__credential 定義連線中取得 access token 的方式。 為受控識別驗證使用 managedidentity。 僅在裝載環境中有受控識別可用時,這個值才有效。
<CONNECTION_NAME_PREFIX>__managedIdentityResourceId 當 credential 設定為 managedidentity時,設定此屬性以指定取得標記時使用的資源識別碼。 屬性會接受的資源識別碼是對應至使用者定義受控識別的資源識別碼。 指定資源識別碼和用戶端識別碼無效。 如果你沒有指定任何一個,系統會用指定的身份。 不應該設定 時,這個屬性會以不同的方式用於credential。
<CONNECTION_NAME_PREFIX>__key 透過基於金鑰的認證,設定存取 Azure OpenAI 服務端點所需的共享秘密金鑰。 作為安全最佳實務,請務必使用 Microsoft Entra ID 搭配受管理身份來進行驗證。

當你將屬性設定 AIConnectionName 為 myAzureOpenAI:

  • myAzureOpenAI__endpoint=https://contoso.openai.azure.com/
  • myAzureOpenAI__credential=managedidentity
  • myAzureOpenAI__clientId=aaaaaaaa-bbbb-cccc-1111-222222222222

執行時,主機將這些設定解讀為單一 myAzureOpenAI 設定:

"myAzureOpenAI":
{
    "endpoint": "https://contoso.openai.azure.com/",
    "credential": "managedidentity",
    "clientId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
}

使用受管理身份時,務必將你的身份加入認知 服務 OpenAI 使用者 角色。

本地執行時,請將這些設定加入 local.settings.json 專案檔案。 如需詳細資訊,請參閱 使用身分識別型連線進行本機開發。

如需詳細資訊,請參閱使用應用程式設定。