次の方法で共有


Azure Functions 用の Azure OpenAI 埋め込み入力バインド

重要

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

Azure OpenAI 埋め込み入力バインドを使用すると、入力の埋め込みを生成できます。 このバインドを使用して、ファイルまたは生のテキスト入力から埋め込みを生成できます。

Azure OpenAI 拡張機能のセットアップと構成の詳細については、Azure Functions 用の Azure OpenAI 拡張機能に関する記事を参照してください。 Azure OpenAI Service での埋め込みの詳細については、「Azure OpenAI Service での埋め込みについて理解する」を参照してください。

Note

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

Note

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

Note

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

この例では、生のテキスト文字列の埋め込みを生成する方法を示します。

[Function(nameof(GenerateEmbeddings_Http_RequestAsync))]
public async Task GenerateEmbeddings_Http_RequestAsync(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings")] HttpRequestData req,
    [EmbeddingsInput("{rawText}", InputType.RawText, Model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")] EmbeddingsContext embeddings)
{
    using StreamReader reader = new(req.Body);
    string request = await reader.ReadToEndAsync();

    EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);

    this.logger.LogInformation(
        "Received {count} embedding(s) for input text containing {length} characters.",
        embeddings.Count,
        requestBody?.RawText?.Length);

    // TODO: Store the embeddings into a database or other storage.
}

この例では、関数からアクセスできる指定したファイルに格納されている埋め込みを取得する方法を示します。

[Function(nameof(GetEmbeddings_Http_FilePath))]
public async Task GetEmbeddings_Http_FilePath(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings-from-file")] HttpRequestData req,
    [EmbeddingsInput("{filePath}", InputType.FilePath, MaxChunkLength = 512, Model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")] EmbeddingsContext embeddings)
{
    using StreamReader reader = new(req.Body);
    string request = await reader.ReadToEndAsync();

    EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);
    this.logger.LogInformation(
        "Received {count} embedding(s) for input file '{path}'.",
        embeddings.Count,
        requestBody?.FilePath);

    // TODO: Store the embeddings into a database or other storage.
}

この例では、生のテキスト文字列の埋め込みを生成する方法を示します。

@FunctionName("GenerateEmbeddingsHttpRequest")
public HttpResponseMessage generateEmbeddingsHttpRequest(
    @HttpTrigger(
        name = "req", 
        methods = {HttpMethod.POST},
        authLevel = AuthorizationLevel.ANONYMOUS,
        route = "embeddings")
    HttpRequestMessage<EmbeddingsRequest> request,
    @EmbeddingsInput(name = "Embeddings", input = "{RawText}", inputType = InputType.RawText, model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") String embeddingsContext,
    final ExecutionContext context) {

    if (request.getBody() == null)
    {
        throw new IllegalArgumentException("Invalid request body. Make sure that you pass in {\"rawText\": value } as the request body.");
    }

    JSONObject embeddingsContextJsonObject = new JSONObject(embeddingsContext);
    
    context.getLogger().info(String.format("Received %d embedding(s) for input text containing %s characters.",
            embeddingsContextJsonObject.getJSONObject("response")
                    .getJSONArray("data")
                    .getJSONObject(0)
                    .getJSONArray("embedding").length(),
            request.getBody().getRawText().length()));

    // TODO: Store the embeddings into a database or other storage.
    return request.createResponseBuilder(HttpStatus.ACCEPTED)
            .header("Content-Type", "application/json")
            .build();
}

この例では、関数からアクセスできる指定したファイルに格納されている埋め込みを取得する方法を示します。

@FunctionName("GenerateEmbeddingsHttpFilePath")
public HttpResponseMessage generateEmbeddingsHttpFilePath(
    @HttpTrigger(
        name = "req", 
        methods = {HttpMethod.POST},
        authLevel = AuthorizationLevel.ANONYMOUS,
        route = "embeddings-from-file")
    HttpRequestMessage<EmbeddingsRequest> request,
    @EmbeddingsInput(name = "Embeddings", input = "{FilePath}", inputType = InputType.FilePath, maxChunkLength = 512, model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") String embeddingsContext,
    final ExecutionContext context) {

    if (request.getBody() == null)
    {
        throw new IllegalArgumentException("Invalid request body. Make sure that you pass in {\"rawText\": value } as the request body.");
    }

    JSONObject embeddingsContextJsonObject = new JSONObject(embeddingsContext);
    
    context.getLogger().info(String.format("Received %d embedding(s) for input file %s.",
            embeddingsContextJsonObject.getJSONObject("response")
                    .getJSONArray("data")
                    .getJSONObject(0)
                    .getJSONArray("embedding").length(),
            request.getBody().getFilePath()));

    // TODO: Store the embeddings into a database or other storage.
    return request.createResponseBuilder(HttpStatus.ACCEPTED)
            .header("Content-Type", "application/json")
            .build();
}

利用できる例はまだありません。

この例では、生のテキスト文字列の埋め込みを生成する方法を示します。

const embeddingsHttpInput = input.generic({
    input: '{rawText}',
    inputType: 'RawText',
    type: 'embeddings',
    model: '%EMBEDDING_MODEL_DEPLOYMENT_NAME%'
})

app.http('generateEmbeddings', {
    methods: ['POST'],
    route: 'embeddings',
    authLevel: 'function',
    extraInputs: [embeddingsHttpInput],
    handler: async (request, context) => {
        let requestBody: EmbeddingsHttpRequest = await request.json();
        let response: any = context.extraInputs.get(embeddingsHttpInput);

        context.log(
            `Received ${response.count} embedding(s) for input text containing ${requestBody.RawText.length} characters.`
        );
        
        // TODO: Store the embeddings into a database or other storage.

        return {status: 202}
    }
});

この例では、関数からアクセスできる指定したファイルに格納されている埋め込みを取得する方法を示します。

const embeddingsFilePathInput = input.generic({
    input: '{filePath}',
    inputType: 'FilePath',
    type: 'embeddings',
    maxChunkLength: 512,
    model: '%EMBEDDING_MODEL_DEPLOYMENT_NAME%'
})

app.http('getEmbeddingsFilePath', {
    methods: ['POST'],
    route: 'embeddings-from-file',
    authLevel: 'function',
    extraInputs: [embeddingsFilePathInput],
    handler: async (request, context) => {
        let requestBody: EmbeddingsFilePath = await request.json();
        let response: any = context.extraInputs.get(embeddingsFilePathInput);

        context.log(
            `Received ${response.count} embedding(s) for input file ${requestBody.FilePath}.`
        );
        
        // TODO: Store the embeddings into a database or other storage.

        return {status: 202}
    }

この例では、生のテキスト文字列の埋め込みを生成する方法を示します。

埋め込みを生成するための function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "route": "embeddings",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "name": "Embeddings",
      "type": "embeddings",
      "direction": "in",
      "inputType": "RawText",
      "input": "{rawText}",
      "model": "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
    }
  ]
}

function.json ファイルのプロパティについて詳しくは、「構成」セクションをご覧ください。

using namespace System.Net

param($Request, $TriggerMetadata, $Embeddings)

$input = $Request.Body.RawText

Write-Host "Received $($Embeddings.Count) embedding(s) for input text containing $($input.Length) characters."

Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
        StatusCode = [HttpStatusCode]::Accepted
})

この例では、生のテキスト文字列の埋め込みを生成する方法を示します。

@app.function_name("GenerateEmbeddingsHttpRequest")
@app.route(route="embeddings", methods=["POST"])
@app.embeddings_input(arg_name="embeddings", input="{rawText}", input_type="rawText", model="%EMBEDDING_MODEL_DEPLOYMENT_NAME%")
def generate_embeddings_http_request(req: func.HttpRequest, embeddings: str) -> func.HttpResponse:
    user_message = req.get_json()
    embeddings_json = json.loads(embeddings)
    embeddings_request = {
        "raw_text": user_message.get("rawText")
    }
    logging.info(f'Received {embeddings_json.get("count")} embedding(s) for input text '
        f'containing {len(embeddings_request.get("raw_text"))} characters.')
    # TODO: Store the embeddings into a database or other storage.
    return func.HttpResponse(status_code=200)

属性

EmbeddingsInput 属性を適用して、これらのパラメーターをサポートする埋め込み入力バインドを定義します。

パラメーター 説明
入力 埋め込みを生成する入力文字列。
モデル 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
MaxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
MaxOverlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
InputType 省略可。 入力の型を取得します。

注釈

EmbeddingsInput 注釈を使用すると、これらのパラメーターをサポートする埋め込み入力バインドを定義できます。

要素 説明
name 入力バインドの名前を取得または設定します。
input 埋め込みを生成する入力文字列。
model 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
maxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
maxOverlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
inputType 省略可。 入力の型を取得します。

デコレーター

プレビュー中に、入力バインドを embeddings 型の generic_input_binding バインド (これらのパラメーターをサポートします) として定義します。embeddings デコレーターではこれらのパラメーターをサポートします。

パラメーター 説明
arg_name バインド パラメーターを表す変数の名前。
input 埋め込みを生成する入力文字列。
model 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
maxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
max_overlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
input_type 入力の型を取得します。

構成

このバインドでは、function.json ファイルで設定したこれらの構成プロパティをサポートします。

プロパティ 説明
type EmbeddingsInputである必要があります。
direction inである必要があります。
name 入力バインドの名前。
input 埋め込みを生成する入力文字列。
model 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
maxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
maxOverlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
inputType 省略可。 入力の型を取得します。

構成

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

プロパティ 説明
input 埋め込みを生成する入力文字列。
model 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
maxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
maxOverlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
inputType 省略可。 入力の型を取得します。

完全な例については、セクションの例を参照してください。

使用方法

既定の埋め込み model を変更すると、埋め込みがベクター データベースに保存される方法が変わります。 既定のモデルを変更した場合、以前にベクター データベースに取り込まれた残りのデータと一致していない場合、検索が誤動作し始めるおそれがあります。 埋め込みの既定のモデルは text-embedding-ada-002 です。

入力チャンクの最大文字長を計算する際は、text-embedding-ada-002 などの第 2 世代入力埋め込みモデルで許可される入力トークンの最大数は 8191 であることを考慮してください。 1 つのトークンの長さは約 4 文字 (英語の場合) であり、これは、1 つのチャンクに収まる入力の約 32,000 文字 (英語の場合) に変換されます。