Azure Functions 用の Azure OpenAI アシスタント ポスト入力バインド

重要

Azure Functions 用の Azure OpenAI 拡張機能は現在、プレビュー段階です。

Azure OpenAI アシスタント ポスト入力バインドを使用すると、アシスタント チャット ボットにプロンプトを送信できます。

Azure OpenAI 拡張機能のセットアップと構成の詳細については、「Azure Functions 用の Azure OpenAI 拡張機能」を参照してください。 Azure OpenAI アシスタントの詳細については、「Azure OpenAI Assistants API」を参照してください。

リファレンスと例は、Node.js v4 モデルに対してのみ提供されています。

リファレンスと例は、Python v2 モデルに対してのみ提供されます。

両方の C# プロセス モデルがサポートされていますが、 isolated worker モデル 例のみが提供されます。

このバインドに関しては現在、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 属性を適用して、これらのパラメーターをサポートするアシスタント ポスト入力バインドを定義します。

パラメーター 内容
身分証明書 更新するアシスタントの ID。
UserMessage 文字列としてエンコードされたチャット完了モデルのユーザー メッセージを取得または設定します。
AIConnectionName オプション。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
ChatModel オプション。 既定値の gpt-3.5-turbo を使用して、文字列として使用するモデルの ID を取得または設定します。
気温 オプション02の間の文字列として、使用するサンプリング温度を取得または設定します。 値が大きいほど (0.8) 出力がランダムになり、(0.2) などの値が小さいほど出力のフォーカスが高くなり、決定論的になります。 TemperatureまたはTopPを使用する必要がありますが、両方は使用しないでください。
TopP オプション。 温度を使用したサンプリングの代替手段を取得または設定します。これは、核サンプリングと呼ばれ、文字列として設定されます。 このサンプリング方法では、モデルは top_p 確率質量を持つトークンの結果を考慮します。 したがって、 0.1 は、上位 10 個の% 確率質量を含むトークンのみが考慮されていることを意味します。 TemperatureまたはTopPを使用する必要がありますが、両方は使用しないでください。
MaxTokens オプション。 既定の 100 を持つ文字列として、完了時に生成するトークンの最大数を取得または設定します。 プロンプトのトークン数と max_tokens の合計は、モデルのコンテキスト長を超えることはできません。 ほとんどのモデルのコンテキスト長は 2,048 トークンです (4096 をサポートする最新のモデルを除く)。
IsReasoningModel オプション。 チャット完了モデルが推論モデルであるかどうかを示す値を取得または設定します。 このオプションは試験段階であり、すべてのモデルが予期されるプロパティにパリティを持ち、既定値が false になるまで推論モデルに関連付けられます。

注釈

PostUserQuery 注釈を使用すると、これらのパラメーターをサポートするアシスタント ポスト入力バインドを定義できます。

要素 内容
名前 出力バインドの名前。
ID 更新するアシスタントの ID。
userMessage 文字列としてエンコードされたチャット完了モデルのユーザー メッセージを取得または設定します。
aiConnectionName オプション。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
chatModel 既定値の gpt-3.5-turbo を使用して、文字列として使用するモデルの ID を取得または設定します。
温度 オプション02の間の文字列として、使用するサンプリング温度を取得または設定します。 値が大きいほど (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 バインド パラメーターを表す変数の名前。
ID 更新するアシスタントの ID。
user_message 文字列としてエンコードされたチャット完了モデルのユーザー メッセージを取得または設定します。
ai_connection_name オプション。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
chat_model 既定値の gpt-3.5-turbo を使用して、文字列として使用するモデルの ID を取得または設定します。
温度 オプション02の間の文字列として、使用するサンプリング温度を取得または設定します。 値が大きいほど (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である必要があります。
名前 出力バインドの名前。
ID 更新するアシスタントの ID。
userMessage 文字列としてエンコードされたチャット完了モデルのユーザー メッセージを取得または設定します。
aiConnectionName オプション。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
chatModel 既定値の gpt-3.5-turbo を使用して、文字列として使用するモデルの ID を取得または設定します。
温度 オプション02の間の文字列として、使用するサンプリング温度を取得または設定します。 値が大きいほど (0.8) 出力がランダムになり、(0.2) などの値が小さいほど出力のフォーカスが高くなり、決定論的になります。 TemperatureまたはTopPを使用する必要がありますが、両方は使用しないでください。
topP オプション。 温度を使用したサンプリングの代替手段を取得または設定します。これは、核サンプリングと呼ばれ、文字列として設定されます。 このサンプリング方法では、モデルは top_p 確率質量を持つトークンの結果を考慮します。 したがって、 0.1 は、上位 10 個の% 確率質量を含むトークンのみが考慮されていることを意味します。 TemperatureまたはTopPを使用する必要がありますが、両方は使用しないでください。
maxTokens オプション。 既定の 100 を持つ文字列として、完了時に生成するトークンの最大数を取得または設定します。 プロンプトのトークン数と max_tokens の合計は、モデルのコンテキスト長を超えることはできません。 ほとんどのモデルのコンテキスト長は 2,048 トークンです (4096 をサポートする最新のモデルを除く)。
isReasoningModel オプション。 チャット完了モデルが推論モデルであるかどうかを示す値を取得または設定します。 このオプションは試験段階であり、すべてのモデルが予期されるプロパティにパリティを持ち、既定値が false になるまで推論モデルに関連付けられます。

構成

このバインドでは、コードで定義されている、これらのプロパティをサポートします。

プロパティ 内容
ID 更新するアシスタントの ID。
userMessage 文字列としてエンコードされたチャット完了モデルのユーザー メッセージを取得または設定します。
aiConnectionName オプション。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
chatModel 既定値の gpt-3.5-turbo を使用して、文字列として使用するモデルの ID を取得または設定します。
温度 オプション02の間の文字列として、使用するサンプリング温度を取得または設定します。 値が大きいほど (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プロパティ(OpenAI Azure推奨)を使いましょう。
  • OpenAI Azureのアプリ設定でAZURE_OPENAI_ENDPOINTAZURE_OPENAI_KEYを設定してください。
  • アプリの設定で Open_API_Key だけに設定してください( https://api.openai.com用)。

接続の設定方法は、モデルAPIと認証方法の両方に依存し、以下の表に示されています:

認証/モデルAPI Azure OpenAI OpenAI(https://api.openai.com)
マネージド・アイデンティティ接続 AIConnectionName サポートしていません
Key Vault 参照 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>は、複数の設定群が共有するものであり、これらが共同でOpenAIへのアイデンティティベースの接続を定義しますAzure。 詳細については、「 同一性接続の定義」を参照してください。
  • Key Vault参照:AIConnectionNameプロパティ設定は、APIキーが中央管理されている場所へのAzure Key Vault参照を返します。 詳細については、「Key Vault connectionsの定義」をご覧ください。
  • App Configuration reference:AIConnectionNameプロパティ設定はAPIキーまたはKey Vault参照を返すAzure App Configuration参照を返します。 詳細については、接続記事のAzure App Configurationをご覧ください。
  • APIキー: AIConnectionName プロパティ設定はエンドポイントとキーを含むアプリ設定に解決されます。 共有鍵は漏洩する可能性があるため、可能な限り管理型ID接続を使用してください。 詳細については、「 接続の定義」を参照してください。

バインディング接続について詳しく知りたい方は、「Azure Functionsの接続管理」をご覧ください。

OpenAIのバインディングには、OpenAIとの接続を定義するアプリ設定群のAIConnectionNameを指定するための<ConnectionNamePrefix>プロパティAzure含まれています。

設定名 内容
<CONNECTION_NAME_PREFIX>__endpoint Azure OpenAIサービスのURIエンドポイントを設定します。 この設定は常に必須です。
<CONNECTION_NAME_PREFIX>__clientId アクセス トークンを取得するときに使用する特定のユーザー割り当て ID を設定します。 <CONNECTION_NAME_PREFIX>__credentialmanagedidentity に設定する必要があります。 このプロパティは、アプリケーションに割り当てられたユーザー割り当て ID に相当するクライアント ID を受け取ります。 リソース ID とクライアント ID の両方を指定することは無効です。 このプロパティを指定しない場合は、システムが割り当てたアイデンティティが使われます。 このプロパティは、 を設定しないとき、credentialで異なる方法で使用されます。
<CONNECTION_NAME_PREFIX>__credential 接続のaccess トークンを取得する方法を定義します。 マネージド ID 認証には managedidentity を使用します。 この値は、ホスティング環境でマネージド ID が使用できる場合にのみ有効です。
<CONNECTION_NAME_PREFIX>__managedIdentityResourceId credentialmanagedidentityに設定されている場合、このプロパティでトークンを取得する際に使用するリソース識別子を指定します。 プロパティは、ユーザー定義マネージド ID のリソース ID に対応するリソース識別子を受け取ります。 リソース ID とクライアント ID の両方を指定することは無効です。 どちらかを指定しなければ、システムが割り当てたアイデンティティが使われます。 このプロパティは、 を設定しないとき、credentialで異なる方法で使用されます。
<CONNECTION_NAME_PREFIX>__key 鍵ベースの認証を用いて、Azure OpenAIサービスのエンドポイントにアクセスするために必要な共有秘密鍵を設定します。 セキュリティのベストプラクティスとして、認証には必ず管理されたIDと共にMicrosoft Entra IDを使用してください。

AIConnectionNameプロパティをmyAzureOpenAIに設定する際は、以下の管理されたID接続設定を考慮してください。

  • 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"
}

マネージドIDを使う場合は、必ず Cognitive Services OpenAIユーザー ロールに自分のIDを追加してください。

ローカルで動作する場合は、これらの設定を local.settings.json プロジェクトファイルに追加してください。 詳細については、「 ID ベースの接続を使用したローカル開発」を参照してください。

詳細については、アプリケーション設定の操作に関する記事を参照してください。