Delen via


Invoerbinding voor Azure OpenAI-insluitingen voor Azure Functions

Belangrijk

De Azure OpenAI-extensie voor Azure Functions is momenteel in preview.

Met de Invoerbinding van Azure OpenAI-insluitingen kunt u insluitingen genereren voor invoer. De binding kan insluitingen genereren op basis van bestanden of onbewerkte tekstinvoer.

Zie Azure OpenAI-extensies voor Azure Functions voor informatie over de installatie en configuratie van de Azure OpenAI-extensie. Zie Meer informatie over insluitingen in Azure OpenAI Service voor meer informatie over insluitingen in Azure OpenAI Service.

Notitie

Verwijzingen en voorbeelden worden alleen verstrekt voor het Node.js v4-model.

Notitie

Verwijzingen en voorbeelden worden alleen verstrekt voor het Python v2-model.

Notitie

Hoewel beide C#-procesmodellen worden ondersteund, worden alleen geïsoleerde werkrolmodelvoorbeelden gegeven.

Opmerking

In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.

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

In dit voorbeeld ziet u hoe u insluitingen ophaalt die zijn opgeslagen in een opgegeven bestand dat toegankelijk is voor de functie.

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

In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.

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

In dit voorbeeld ziet u hoe u insluitingen ophaalt die zijn opgeslagen in een opgegeven bestand dat toegankelijk is voor de functie.

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

In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.

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 = await request.json();
        let response = 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',
interface EmbeddingsHttpRequest {
    RawText?: string;
}

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

In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.

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 = await request.json();
        let response = 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}
    }
});
interface EmbeddingsFilePath {
    FilePath?: string;
}

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

In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.

Dit is het function.json-bestand voor het genereren van de insluitingen:

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

Zie de sectie Configuratie voor meer informatie over function.json bestandseigenschappen.

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

In dit voorbeeld ziet u hoe u insluitingen voor een tekenreeks met onbewerkte tekst genereert.

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

Kenmerken

Pas het EmbeddingsInput kenmerk toe om een invoerbinding voor insluitingen te definiëren, die ondersteuning biedt voor deze parameters:

Parameter Description
Invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
Model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
MaxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
MaxOverlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
InputType Optioneel. Hiermee haalt u het type invoer op.

Aantekeningen

Met de EmbeddingsInput aantekening kunt u een invoerbinding voor insluitingen definiëren, die ondersteuning biedt voor deze parameters:

Element Description
name Hiermee haalt u de naam van de invoerbinding op of stelt u deze in.
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
maxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
maxOverlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
inputType Optioneel. Hiermee haalt u het type invoer op.

Decorators

Definieer tijdens de preview de invoerbinding als een binding van het generic_input_binding type embeddings, die deze parameters ondersteunt: embeddings decorator ondersteunt deze parameters:

Parameter Description
arg_name De naam van de variabele die de bindingsparameter vertegenwoordigt.
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
maxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
max_overlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
input_type Hiermee haalt u het type invoer op.

Configuratie

De binding ondersteunt deze configuratie-eigenschappen die u in het function.json-bestand hebt ingesteld.

Eigenschappen Beschrijving
type Moet EmbeddingsInput zijn.
direction Moet in zijn.
name De naam van de invoerbinding.
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
maxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
maxOverlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
inputType Optioneel. Hiermee haalt u het type invoer op.

Configuratie

De binding ondersteunt deze eigenschappen, die zijn gedefinieerd in uw code:

Eigenschappen Beschrijving
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
maxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
maxOverlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
inputType Optioneel. Hiermee haalt u het type invoer op.

Zie de sectie Voorbeeld voor volledige voorbeelden.

Gebruik

Als u de standaard insluitingen model wijzigt, wordt de manier gewijzigd waarop insluitingen worden opgeslagen in de vectordatabase. Als u het standaardmodel wijzigt, kunnen de zoekacties niet goed werken wanneer ze niet overeenkomen met de rest van de gegevens die eerder in de vectordatabase zijn opgenomen. Het standaardmodel voor insluitingen is text-embedding-ada-002.

Houd er bij het berekenen van de maximale tekenlengte voor invoersegmenten rekening mee dat de maximuminvoertokens die zijn toegestaan voor insluitingsmodellen van de tweede generatie, zijn8191.text-embedding-ada-002 Een enkel token is ongeveer vier tekens lang (in het Engels), wat resulteert in ongeveer 32.000 (Engelse) tekens van invoer die in één segment passen.