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.

internal class EmbeddingsRequest
{
    [JsonPropertyName("rawText")]
    public string? RawText { get; set; }

    [JsonPropertyName("filePath")]
    public string? FilePath { get; set; }

    [JsonPropertyName("url")]
    public string? Url { get; set; }
}

/// <summary>
/// Example showing how to use the <see cref="EmbeddingsAttribute"/> input binding to generate embeddings 
/// for a raw text string.
/// </summary>
[Function(nameof(GenerateEmbeddings_Http_RequestAsync))]
public async Task GenerateEmbeddings_Http_RequestAsync(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings")] HttpRequestData req,
    [EmbeddingsInput("{rawText}", InputType.RawText, EmbeddingsModel = "%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, EmbeddingsModel = "%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, embeddingsModel = "%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.get("count"),
            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, embeddingsModel = "%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 {\"filePath\": value } as the request body.");
    }

    JSONObject embeddingsContextJsonObject = new JSONObject(embeddingsContext);

    context.getLogger().info(String.format("Received %d embedding(s) for input file %s.",
            embeddingsContextJsonObject.get("count"),
            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',
    embeddingsModel: '%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}
    }
});
interface EmbeddingsHttpRequest {
    RawText?: string;
}

const embeddingsHttpInput = input.generic({
    input: '{rawText}',
    inputType: 'RawText',
    type: 'embeddings',
    embeddingsModel: '%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,
    embeddingsModel: '%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,
    embeddingsModel: '%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}",
      "embeddingsModel": "%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",
    embeddings_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:

Kenmerk Beschrijving
Invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
AIConnectionName Optioneel. Hiermee haalt u de naam van de configuratiesectie op voor connectiviteitsinstellingen voor AI-services. Voor Azure OpenAI: Als dit is opgegeven, zoekt u in deze configuratiesectie naar de waarden 'Eindpunt' en 'Sleutel'. Als deze niet is opgegeven of de sectie niet bestaat, valt u terug op omgevingsvariabelen: AZURE_OPENAI_ENDPOINT en AZURE_OPENAI_KEY. Voor door de gebruiker toegewezen beheerde identiteitverificatie is deze eigenschap vereist. Stel voor openAI-service (niet-Azure) de omgevingsvariabele OPENAI_API_KEY in.
EmbeddingsModel 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:

Onderdeel Beschrijving
naam Hiermee haalt u de naam van de invoerbinding op of stelt u deze in.
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
aiConnectionName Optioneel. Hiermee haalt u de naam van de configuratiesectie op voor connectiviteitsinstellingen voor AI-services. Voor Azure OpenAI: Als dit is opgegeven, zoekt u in deze configuratiesectie naar de waarden 'Eindpunt' en 'Sleutel'. Als deze niet is opgegeven of de sectie niet bestaat, valt u terug op omgevingsvariabelen: AZURE_OPENAI_ENDPOINT en AZURE_OPENAI_KEY. Voor door de gebruiker toegewezen beheerde identiteitverificatie is deze eigenschap vereist. Stel voor openAI-service (niet-Azure) de omgevingsvariabele OPENAI_API_KEY in.
embeddingsModel 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.

Decorateurs

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:

Kenmerk Beschrijving
arg_name De naam van de variabele die de bindingsparameter vertegenwoordigt.
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
ai_connection_name Optioneel. Hiermee haalt u de naam van de configuratiesectie op voor connectiviteitsinstellingen voor AI-services. Voor Azure OpenAI: Als dit is opgegeven, zoekt u in deze configuratiesectie naar de waarden 'Eindpunt' en 'Sleutel'. Als deze niet is opgegeven of de sectie niet bestaat, valt u terug op omgevingsvariabelen: AZURE_OPENAI_ENDPOINT en AZURE_OPENAI_KEY. Voor door de gebruiker toegewezen beheerde identiteitverificatie is deze eigenschap vereist. Stel voor openAI-service (niet-Azure) de omgevingsvariabele OPENAI_API_KEY in.
embeddings_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
soort Moet EmbeddingsInput zijn.
richting Moet in zijn.
naam De naam van de invoerbinding.
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
aiConnectionName Optioneel. Hiermee haalt u de naam van de configuratiesectie op voor connectiviteitsinstellingen voor AI-services. Voor Azure OpenAI: Als dit is opgegeven, zoekt u in deze configuratiesectie naar de waarden 'Eindpunt' en 'Sleutel'. Als deze niet is opgegeven of de sectie niet bestaat, valt u terug op omgevingsvariabelen: AZURE_OPENAI_ENDPOINT en AZURE_OPENAI_KEY. Voor door de gebruiker toegewezen beheerde identiteitverificatie is deze eigenschap vereist. Stel voor openAI-service (niet-Azure) de omgevingsvariabele OPENAI_API_KEY in.
embeddingsModel 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.
aiConnectionName Optioneel. Hiermee haalt u de naam van de configuratiesectie op voor connectiviteitsinstellingen voor AI-services. Voor Azure OpenAI: Als dit is opgegeven, zoekt u in deze configuratiesectie naar de waarden 'Eindpunt' en 'Sleutel'. Als deze niet is opgegeven of de sectie niet bestaat, valt u terug op omgevingsvariabelen: AZURE_OPENAI_ENDPOINT en AZURE_OPENAI_KEY. Voor door de gebruiker toegewezen beheerde identiteitverificatie is deze eigenschap vereist. Stel voor openAI-service (niet-Azure) de omgevingsvariabele OPENAI_API_KEY in.
embeddingsModel 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, zijntext-embedding-ada-002.8191 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.