Sdílet prostřednictvím


Vkládání vstupní vazby Azure OpenAI pro Azure Functions

Důležité

Rozšíření Azure OpenAI pro Azure Functions je aktuálně ve verzi Preview.

Vstupní vazba Azure OpenAI pro vložení umožňuje vygenerovat vkládání pro vstupy. Vazba může generovat vkládání ze souborů nebo nezpracovaných textových vstupů.

Informace o nastavení a konfiguraci rozšíření Azure OpenAI najdete v tématu Rozšíření Azure OpenAI pro Azure Functions. Další informace o vkládání ve službě Azure OpenAI najdete v tématu Vysvětlení vkládání ve službě Azure OpenAI.

Poznámka:

Odkazy a příklady jsou k dispozici pouze pro model Node.js v4.

Poznámka:

Odkazy a příklady jsou k dispozici pouze pro model Pythonu v2.

Poznámka:

I když jsou podporovány oba modely procesu jazyka C#, jsou k dispozici pouze příklady izolovaného modelu pracovního procesu .

Příklad

Tento příklad ukazuje, jak vygenerovat vkládání pro nezpracovaný textový řetězec.

[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.
}

Tento příklad ukazuje, jak načíst vložené hodnoty uložené v zadaném souboru, který je přístupný pro funkci.

[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.
}

Tento příklad ukazuje, jak vygenerovat vkládání pro nezpracovaný textový řetězec.

@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();
}

Tento příklad ukazuje, jak načíst vložené hodnoty uložené v zadaném souboru, který je přístupný pro funkci.

@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();
}

Příklady ještě nejsou k dispozici.

Tento příklad ukazuje, jak vygenerovat vkládání pro nezpracovaný textový řetězec.

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}
    }
});

Tento příklad ukazuje, jak načíst vložené hodnoty uložené v zadaném souboru, který je přístupný pro funkci.

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

Tento příklad ukazuje, jak vygenerovat vkládání pro nezpracovaný textový řetězec.

Tady je soubor function.json pro generování vložených objektů:

{
  "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%"
    }
  ]
}

Další informace o function.json vlastnosti souboru naleznete v části Konfigurace .

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
})

Tento příklad ukazuje, jak vygenerovat vkládání pro nezpracovaný textový řetězec.

@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)

Atributy

Pomocí atributu EmbeddingsInput definujte vstupní vazbu embeddings, která podporuje tyto parametry:

Parametr Popis
Vstup Vstupní řetězec, pro který se mají generovat vložené hodnoty.
Model Volitelné. ID modelu, který se má použít, což je výchozí text-embedding-ada-002hodnota . Model pro existující databázi byste neměli měnit. Další informace najdete v tématu Využití.
MaxChunkLength Volitelné. Maximální počet znaků použitých pro vytváření bloků vstupu. Další informace najdete v tématu Využití.
MaxOverlap Volitelné. Získá nebo nastaví maximální počet znaků, které se mají překrývat mezi bloky dat.
InputType Volitelné. Získá typ vstupu.

Poznámky

Poznámka EmbeddingsInput umožňuje definovat vstupní vazbu vkládání, která podporuje tyto parametry:

Element (Prvek) Popis
Jméno Získá nebo nastaví název vstupní vazby.
vstup Vstupní řetězec, pro který se mají generovat vložené hodnoty.
model Volitelné. ID modelu, který se má použít, což je výchozí text-embedding-ada-002hodnota . Model pro existující databázi byste neměli měnit. Další informace najdete v tématu Využití.
maxChunkLength Volitelné. Maximální počet znaků použitých pro vytváření bloků vstupu. Další informace najdete v tématu Využití.
maxOverlap Volitelné. Získá nebo nastaví maximální počet znaků, které se mají překrývat mezi bloky dat.
inputType Volitelné. Získá typ vstupu.

Dekoratéry

Během období Preview definujte vstupní vazbu jako generic_input_binding vazbu typu embeddings, která podporuje tyto parametry: embeddings dekorátor podporuje tyto parametry:

Parametr Popis
arg_name Název proměnné, která představuje parametr vazby.
vstup Vstupní řetězec, pro který se mají generovat vložené hodnoty.
model Volitelné. ID modelu, který se má použít, což je výchozí text-embedding-ada-002hodnota . Model pro existující databázi byste neměli měnit. Další informace najdete v tématu Využití.
maxChunkLength Volitelné. Maximální počet znaků použitých pro vytváření bloků vstupu. Další informace najdete v tématu Využití.
max_overlap Volitelné. Získá nebo nastaví maximální počet znaků, které se mají překrývat mezi bloky dat.
input_type Získá typ vstupu.

Konfigurace

Vazba podporuje tyto vlastnosti konfigurace, které jste nastavili v souboru function.json.

Vlastnost Popis
type Musí být EmbeddingsInput.
direction Musí být in.
Jméno Název vstupní vazby.
vstup Vstupní řetězec, pro který se mají generovat vložené hodnoty.
model Volitelné. ID modelu, který se má použít, což je výchozí text-embedding-ada-002hodnota . Model pro existující databázi byste neměli měnit. Další informace najdete v tématu Využití.
maxChunkLength Volitelné. Maximální počet znaků použitých pro vytváření bloků vstupu. Další informace najdete v tématu Využití.
maxOverlap Volitelné. Získá nebo nastaví maximální počet znaků, které se mají překrývat mezi bloky dat.
inputType Volitelné. Získá typ vstupu.

Konfigurace

Vazba podporuje tyto vlastnosti, které jsou definovány v kódu:

Vlastnost Popis
vstup Vstupní řetězec, pro který se mají generovat vložené hodnoty.
model Volitelné. ID modelu, který se má použít, což je výchozí text-embedding-ada-002hodnota . Model pro existující databázi byste neměli měnit. Další informace najdete v tématu Využití.
maxChunkLength Volitelné. Maximální počet znaků použitých pro vytváření bloků vstupu. Další informace najdete v tématu Využití.
maxOverlap Volitelné. Získá nebo nastaví maximální počet znaků, které se mají překrývat mezi bloky dat.
inputType Volitelné. Získá typ vstupu.

Kompletní příklady najdete v části Příklad.

Využití

Změna výchozích vkládání model změní způsob, jakým se vkládání ukládají do vektorové databáze. Změna výchozího modelu může způsobit, že se vyhledávání začnou chovat nesprávně, když neodpovídají zbývajícím datům, která byla dříve ingestovaná do vektorové databáze. Výchozí model pro vkládání je text-embedding-ada-002.

Při výpočtu maximální délky znaků vstupních bloků vezměte v úvahu, že maximální vstupní tokeny povolené pro modely vkládání vstupu druhé generace, jako text-embedding-ada-002 je 8191. Jeden token je přibližně čtyři znaky v délce (v angličtině), což znamená přibližně 32 000 znaků vstupu, které se dají umístit do jednoho bloku.