次の方法で共有


Azure Functions 用の Azure OpenAI 埋め込みストアの出力バインド

重要

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

Azure OpenAI 埋め込みストアの出力バインドを使ってファイルをセマンティック ドキュメント ストアに書き込み、セマンティック検索で後で参照できるようにすることができます。

Azure OpenAI 拡張機能のセットアップと構成の詳細については、「Azure Functions 用の Azure OpenAI 拡張機能」を参照してください。 Azure AI 検索でのセマンティック ランク付けの詳細については、「Azure AI Search でのセマンティック ランク付け」を参照してください。

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

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

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

この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。

public class EmbeddingsRequest
{
    [JsonPropertyName("url")]
    public string? Url { get; set; }
}
[Function("IngestFile")]
public static async Task<EmbeddingsStoreOutputResponse> IngestFile(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
{
    using StreamReader reader = new(req.Body);
    string request = await reader.ReadToEndAsync();

    EmbeddingsStoreOutputResponse badRequestResponse = new()
    {
        HttpResponse = new BadRequestResult(),
        SearchableDocument = new SearchableDocument(string.Empty)
    };

    if (string.IsNullOrWhiteSpace(request))
    {
        return badRequestResponse;
    }

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

    if (string.IsNullOrWhiteSpace(requestBody?.Url))
    {
        throw new ArgumentException("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
    }

    if (!Uri.TryCreate(requestBody.Url, UriKind.Absolute, out Uri? uri))
    {
        return badRequestResponse;
    }

    string filename = Path.GetFileName(uri.AbsolutePath);

    return new EmbeddingsStoreOutputResponse
    {
        HttpResponse = new OkObjectResult(new { status = HttpStatusCode.OK }),
        SearchableDocument = new SearchableDocument(filename)
    };
}

この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。

@FunctionName("IngestFile")
public HttpResponseMessage ingestFile(
    @HttpTrigger(
        name = "req", 
        methods = {HttpMethod.POST},
        authLevel = AuthorizationLevel.ANONYMOUS)
        HttpRequestMessage<EmbeddingsRequest> request,
    @EmbeddingsStoreOutput(name="EmbeddingsStoreOutput", input = "{url}", inputType = InputType.Url,
            storeConnectionName = "AISearchEndpoint", collection = "openai-index",
            embeddingsModel = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") OutputBinding<EmbeddingsStoreOutputResponse> output,
    final ExecutionContext context) throws URISyntaxException {

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

    URI uri = new URI(request.getBody().getUrl());
    String filename = Paths.get(uri.getPath()).getFileName().toString();

    EmbeddingsStoreOutputResponse embeddingsStoreOutputResponse = new EmbeddingsStoreOutputResponse(new SearchableDocument(filename));

    output.setValue(embeddingsStoreOutputResponse);

    JSONObject response = new JSONObject();
    response.put("status", "success");
    response.put("title", filename);

    return request.createResponseBuilder(HttpStatus.CREATED)
            .header("Content-Type", "application/json")
            .body(response)
            .build();
}

public class EmbeddingsStoreOutputResponse {
    private SearchableDocument searchableDocument;

    public EmbeddingsStoreOutputResponse(SearchableDocument searchableDocument) {
        this.searchableDocument = searchableDocument;
    }
    public SearchableDocument getSearchableDocument() {
        return searchableDocument;
    }

}

この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。

const embeddingsStoreOutput = output.generic({
    type: "embeddingsStore",
    input: "{url}", 
    inputType: "url", 
    connectionName: "AISearchEndpoint", 
    collection: "openai-index", 
    embeddingsModel: "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
});

app.http('IngestFile', {
    methods: ['POST'],
    authLevel: 'function',
    extraOutputs: [embeddingsStoreOutput],
    handler: async (request, context) => {
        let requestBody = await request.json();
        if (!requestBody || !requestBody.url) {
            throw new Error("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
        }

        let uri = requestBody.url;
        let url = new URL(uri);

        let fileName = path.basename(url.pathname);
        context.extraOutputs.set(embeddingsStoreOutput, { title: fileName });

        let response = {
            status: "success",
            title: fileName
        };

        return { status: 202, jsonBody: response } 
    }
});
interface EmbeddingsRequest {
    url?: string;
}

const embeddingsStoreOutput = output.generic({
    type: "embeddingsStore",
    input: "{url}", 
    inputType: "url", 
    connectionName: "AISearchEndpoint", 
    collection: "openai-index", 
    embeddingsModel: "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
});

app.http('IngestFile', {
    methods: ['POST'],
    authLevel: 'function',
    extraOutputs: [embeddingsStoreOutput],
    handler: async (request, context) => {
        let requestBody: EmbeddingsRequest | null = await request.json();
        if (!requestBody || !requestBody.url) {
            throw new Error("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
        }

        let uri = requestBody.url;
        let url = new URL(uri);

        let fileName = path.basename(url.pathname);
        context.extraOutputs.set(embeddingsStoreOutput, { title: fileName });

        let response = {
            status: "success",
            title: fileName
        };

        return { status: 202, jsonBody: response } 
    }
});

この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。

ファイルを取り込むための function.json ファイルを次に示します。

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "name": "EmbeddingsStoreOutput",
      "type": "embeddingsStore",
      "direction": "out",
      "input": "{url}",
      "inputType": "Url",
      "storeConnectionName": "AISearchEndpoint",
      "collection": "openai-index",
      "embeddingsModel": "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
    }
  ]
}

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

using namespace System.Net

param($Request, $TriggerMetadata)

$ErrorActionPreference = 'Stop'

$inputJson = $Request.Body

if (-not $inputJson -or -not $inputJson.Url) {
    throw 'Invalid request body. Make sure that you pass in {\"url\": value } as the request body.'
}

$uri = [URI]$inputJson.Url
$filename = [System.IO.Path]::GetFileName($uri.AbsolutePath)


Push-OutputBinding -Name EmbeddingsStoreOutput -Value @{
    "title" = $filename
}

$response = @{
    "status" = "success"
    "title" = $filename
}

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

この例では、指定された URL のセマンティック ドキュメント ストアに HTTP 入力ストリームを書き込みます。

@app.function_name("IngestFile")
@app.route(methods=["POST"])
@app.embeddings_store_output(
    arg_name="requests",
    input="{url}",
    input_type="url",
    store_connection_name="AISearchEndpoint",
    collection="openai-index",
    embeddings_model="%EMBEDDING_MODEL_DEPLOYMENT_NAME%",
)
def ingest_file(
    req: func.HttpRequest, requests: func.Out[str]
) -> func.HttpResponse:
    user_message = req.get_json()
    if not user_message:
        return func.HttpResponse(
            json.dumps({"message": "No message provided"}),
            status_code=400,
            mimetype="application/json",
        )
    file_name_with_extension = os.path.basename(user_message["url"])
    title = os.path.splitext(file_name_with_extension)[0]
    create_request = {"title": title}
    requests.set(json.dumps(create_request))
    response_json = {"status": "success", "title": title}
    return func.HttpResponse(
        json.dumps(response_json), status_code=200, mimetype="application/json"
    )

属性

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

パラメーター 説明
入力 埋め込みを生成する入力文字列。
AIConnectionName 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
EmbeddingsModel 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
MaxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
MaxOverlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
InputType 省略可。 入力の型を取得します。
StoreConnectionName 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。
コレクション 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。

注釈

EmbeddingsStoreOutput注釈を使用すると、次のパラメーターをサポートする埋め込みストア出力バインドを定義できます。

要素 説明
名前 出力バインドの名前を取得または設定します。
インプット 埋め込みを生成する入力文字列。
aiConnectionName 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
embeddingsModel 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
maxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
maxOverlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
inputType 省略可。 入力の型を取得します。
storeConnectionName 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。
コレクション 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。

デコレーター

プレビュー中に、出力バインドをこれらのパラメーターをサポートする generic_output_binding 型の semanticSearch バインドとして定義します。

パラメーター 説明
arg_name バインド パラメーターを表す変数の名前。
インプット 埋め込みを生成する入力文字列。
ai_connection_name 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
embeddings_model 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
maxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
max_overlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
input_type 入力の型を取得します。
store_connection_name 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。
コレクション 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。

構成

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

プロパティ 説明
タイプ embeddingsStoreである必要があります。
方向 outである必要があります。
名前 出力バインドの名前。
インプット 埋め込みを生成する入力文字列。
aiConnectionName 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
embeddingsModel 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
maxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
maxOverlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
inputType 省略可。 入力の型を取得します。
storeConnectionName 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。
コレクション 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。

構成

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

プロパティ 説明
インプット 埋め込みを生成する入力文字列。
aiConnectionName 省略可。 AI サービス接続設定の構成セクションの名前を取得または設定します。 Azure OpenAI の場合: 指定した場合は、この構成セクションで "Endpoint" と "Key" の値を探します。 指定されていない場合、またはセクションが存在しない場合は、環境変数 (AZURE_OPENAI_ENDPOINTとAZURE_OPENAI_KEY) にフォールバックします。 ユーザー割り当てマネージド ID 認証の場合、このプロパティは必須です。 OpenAI サービス (Azure 以外) の場合は、OPENAI_API_KEY環境変数を設定します。
embeddingsModel 省略可。 使用するモデルの ID。既定値は text-embedding-ada-002 です。 既存のデータベースのモデルは変更しないでください。 詳細については、「使用」を参照してください。
maxChunkLength 省略可。 入力のチャンキングに使用される文字の最大数。 詳細については、「使用」を参照してください。
maxOverlap 省略可。 チャンク間で重複する文字の最大数を取得または設定します。
inputType 省略可。 入力の型を取得します。
storeConnectionName 接続文字列の値を含むアプリ設定または環境変数の名前。 このプロパティは、バインド式をサポートしています。
コレクション 検索するコレクション、テーブル、またはインデックスの名前。 このプロパティは、バインド式をサポートしています。

使用方法

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