Azure OpenAI-inbäddningsindatabindning för Azure Functions

Viktigt!

Azure OpenAI-tillägget för Azure Functions är för närvarande i förhandsversion.

Med azure OpenAI-inbäddningsindatabindningen kan du generera inbäddningar för indata. Bindningen kan generera inbäddningar från filer eller råtextindata.

Information om konfiguration och konfigurationsinformation för Azure OpenAI-tillägget finns i Azure OpenAI-tillägg för Azure Functions. Mer information om inbäddningar i Azure OpenAI-tjänsten finns i Förstå inbäddningar i Azure OpenAI Service.

Kommentar

Referenser och exempel tillhandahålls endast för modellen Node.js v4.

Kommentar

Referenser och exempel tillhandahålls endast för Python v2-modellen.

Kommentar

Båda C#-processmodellerna stöds, men endast exempel på isolerade arbetsmodeller tillhandahålls.

Exempel

Det här exemplet visar hur du genererar inbäddningar för en rå textsträng.

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

Det här exemplet visar hur du hämtar inbäddningar som lagras i en angiven fil som är tillgänglig för funktionen.

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

Det här exemplet visar hur du genererar inbäddningar för en rå textsträng.

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

Det här exemplet visar hur du hämtar inbäddningar som lagras i en angiven fil som är tillgänglig för funktionen.

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

Det här exemplet visar hur du genererar inbäddningar för en rå textsträng.

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

Det här exemplet visar hur du genererar inbäddningar för en rå textsträng.

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

Det här exemplet visar hur du genererar inbäddningar för en rå textsträng.

Här är function.json-filen för att generera inbäddningarna:

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

Mer information om function.json filegenskaper finns i avsnittet Konfiguration .

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

Det här exemplet visar hur du genererar inbäddningar för en rå textsträng.

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

Attribut

EmbeddingsInput Använd attributet för att definiera en inbäddningsindatabindning som stöder följande parametrar:

Parameter Beskrivning
Indata Den indatasträng som du vill generera inbäddningar för.
AIConnectionName Valfritt. Hämtar eller anger namnet på konfigurationsavsnittet för anslutningsinställningar för AI-tjänsten. För Azure OpenAI: Om det anges söker du efter värdena "Slutpunkt" och "Nyckel" i det här konfigurationsavsnittet. Om det inte anges eller om avsnittet inte finns återgår du till miljövariabler: AZURE_OPENAI_ENDPOINT och AZURE_OPENAI_KEY. För användartilldelad hanterad identitetsautentisering krävs den här egenskapen. För OpenAI-tjänsten (icke-Azure) anger du miljövariabeln OPENAI_API_KEY.
EmbeddingsModel Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
MaxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
MaxOverlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
InputType Valfritt. Hämtar indatatypen.

Kommentarer

Med anteckningen EmbeddingsInput kan du definiera en inbäddningsindatabindning som stöder följande parametrar:

Komponent Beskrivning
Namn Hämtar eller anger namnet på indatabindningen.
inmatning Den indatasträng som du vill generera inbäddningar för.
aiConnectionName Valfritt. Hämtar eller anger namnet på konfigurationsavsnittet för anslutningsinställningar för AI-tjänsten. För Azure OpenAI: Om det anges söker du efter värdena "Slutpunkt" och "Nyckel" i det här konfigurationsavsnittet. Om det inte anges eller om avsnittet inte finns återgår du till miljövariabler: AZURE_OPENAI_ENDPOINT och AZURE_OPENAI_KEY. För användartilldelad hanterad identitetsautentisering krävs den här egenskapen. För OpenAI-tjänsten (icke-Azure) anger du miljövariabeln OPENAI_API_KEY.
embeddingsModel Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
maxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
maxOverlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
inputType Valfritt. Hämtar indatatypen.

Dekoratörer

Under förhandsversionen definierar du indatabindningen som en generic_input_binding bindning av typen embeddings, som stöder följande parametrar: embeddings dekoratör stöder följande parametrar:

Parameter Beskrivning
arg_name Namnet på variabeln som representerar bindningsparametern.
inmatning Den indatasträng som du vill generera inbäddningar för.
ai_connection_name Valfritt. Hämtar eller anger namnet på konfigurationsavsnittet för anslutningsinställningar för AI-tjänsten. För Azure OpenAI: Om det anges söker du efter värdena "Slutpunkt" och "Nyckel" i det här konfigurationsavsnittet. Om det inte anges eller om avsnittet inte finns återgår du till miljövariabler: AZURE_OPENAI_ENDPOINT och AZURE_OPENAI_KEY. För användartilldelad hanterad identitetsautentisering krävs den här egenskapen. För OpenAI-tjänsten (icke-Azure) anger du miljövariabeln OPENAI_API_KEY.
embeddings_model Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
maxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
max_overlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
input_type Hämtar indatatypen.

Konfiguration

Bindningen stöder de konfigurationsegenskaper som du anger i filen function.json.

Fastighet Beskrivning
typ Måste vara EmbeddingsInput.
riktning Måste vara in.
Namn Namnet på indatabindningen.
inmatning Den indatasträng som du vill generera inbäddningar för.
aiConnectionName Valfritt. Hämtar eller anger namnet på konfigurationsavsnittet för anslutningsinställningar för AI-tjänsten. För Azure OpenAI: Om det anges söker du efter värdena "Slutpunkt" och "Nyckel" i det här konfigurationsavsnittet. Om det inte anges eller om avsnittet inte finns återgår du till miljövariabler: AZURE_OPENAI_ENDPOINT och AZURE_OPENAI_KEY. För användartilldelad hanterad identitetsautentisering krävs den här egenskapen. För OpenAI-tjänsten (icke-Azure) anger du miljövariabeln OPENAI_API_KEY.
embeddingsModel Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
maxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
maxOverlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
inputType Valfritt. Hämtar indatatypen.

Konfiguration

Bindningen stöder dessa egenskaper, som definieras i koden:

Fastighet Beskrivning
inmatning Den indatasträng som du vill generera inbäddningar för.
aiConnectionName Valfritt. Hämtar eller anger namnet på konfigurationsavsnittet för anslutningsinställningar för AI-tjänsten. För Azure OpenAI: Om det anges söker du efter värdena "Slutpunkt" och "Nyckel" i det här konfigurationsavsnittet. Om det inte anges eller om avsnittet inte finns återgår du till miljövariabler: AZURE_OPENAI_ENDPOINT och AZURE_OPENAI_KEY. För användartilldelad hanterad identitetsautentisering krävs den här egenskapen. För OpenAI-tjänsten (icke-Azure) anger du miljövariabeln OPENAI_API_KEY.
embeddingsModel Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
maxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
maxOverlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
inputType Valfritt. Hämtar indatatypen.

Se avsnittet Exempel för fullständiga exempel.

Förbrukning

Om du ändrar standardbäddningarna model ändras hur inbäddningar lagras i vektordatabasen. Om du ändrar standardmodellen kan sökningarna börja bete sig felaktigt när de inte matchar resten av de data som tidigare matades in i vektordatabasen. Standardmodellen för inbäddningar är text-embedding-ada-002.

När du beräknar den maximala teckenlängden för indatasegment bör du tänka på att de maximala indatatoken som tillåts för andra generationens inbäddningsmodeller som text-embedding-ada-002 är 8191. En enskild token är ungefär fyra tecken lång (på engelska), vilket innebär ungefär 32 000 tecken (engelska) indata som får plats i ett enda segment.