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

Go-stöd finns för närvarande inte tillgängligt för denna bindning.

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%", AIConnectionName = "AzureOpenAI")] 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%", AIConnectionName = "AzureOpenAI")] 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.FUNCTION,
            route = "embeddings")
        HttpRequestMessage<EmbeddingsRequest> request,
        @EmbeddingsInput(name = "Embeddings", input = "{RawText}", inputType = InputType.RawText, embeddingsModel = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%", aiConnectionName = "AzureOpenAI") 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.FUNCTION,
        route = "embeddings-from-file")
    HttpRequestMessage<EmbeddingsRequest> request,
    @EmbeddingsInput(name = "Embeddings", input = "{FilePath}", inputType = InputType.FilePath, maxChunkLength = 512, embeddingsModel = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%", aiConnectionName = "AzureOpenAI") 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%',
    aiConnectionName: 'AzureOpenAI',
})

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 ?? 0} 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%',
    aiConnectionName: 'AzureOpenAI',
})

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 ?? 0} 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%',
    aiConnectionName: 'AzureOpenAI',
})

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%',
    aiConnectionName: 'AzureOpenAI',
})

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%",
      "aiConnectionName": "AzureOpenAI"
    }
  ]
}

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%",
    ai_connection_name="AzureOpenAI",
)
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.

Connections

För att använda Azure OpenAI-bindningstillägget måste du specificera en anslutning till en OpenAI-modelldefinition. Ställ in OpenAI-modellanslutningen i dina bindningar med en av dessa metoder:

  • Använd bindningsegenskapen AIConnectionName (föredragen för Azure OpenAI).
  • Sätt AZURE_OPENAI_ENDPOINT och AZURE_OPENAI_KEY i app-inställningar (för Azure OpenAI).
  • Ställ in endast Open_API_Key i app-inställningarna (för https://api.openai.com).

Hur du ställer in anslutningen beror både på modellens API och autentiseringsmetoden, vilket indikeras i följande tabell:

Autentisering/Modell-API Azure OpenAI OpenAI (https://api.openai.com)
Hanterad identitetsanslutning AIConnectionName Stöds ej
Key Vault-referens AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_KEY
Open_API_Key
Appkonfigurationsreferens AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_KEY
Open_API_Key
Delad hemlighet AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_KEY
Open_API_Key

Använd hanterade identitetsbaserade kontakter och AIConnectionName egendomen.

När du använder AIConnectionName, beror värdet på denna egenskapsinställning på typen av anslutning:

  • Managed identity-anslutning: Egenskapen AIConnectionName<CONNECTION_NAME_PREFIX> delas av en grupp inställningar som tillsammans definierar en identitetsbaserad anslutning till Azure OpenAI. För mer information, se Definiera identitetskopplingar.
  • Key Vault-referens: Egenskapsinställningen AIConnectionName returnerar en Azure Key Vault-referens till platsen där API-nyckeln underhålls centralt. För mer information, se Definiera Key Vault-anslutningar.
  • App Configuration Reference: Egenskapsinställningen AIConnectionName returnerar en Azure App Configuration-referens som returnerar en API-nyckel eller en Key Vault-referens. För mer information, se Azure App Configuration i artikeln om anslutningar.
  • API-nyckel: Egenskapsinställningen AIConnectionName löses till appinställningar som innehåller endpoint och nyckel direkt. Eftersom delade nycklar kan komprometteras, använd hanterade identitetsanslutningar när det är möjligt. För mer information, se Definiera kopplingar.

För att lära dig mer om bindningsanslutningar, se Hantera anslutningar i Azure Functions.

OpenAI-bindningarna inkluderar en AIConnectionName egenskap som du kan använda för att specificera för <ConnectionNamePrefix> gruppen av appinställningar som definierar anslutningen till Azure OpenAI:

Inställningsnamn Beskrivning
<CONNECTION_NAME_PREFIX>__endpoint Sätter URI-endpoint för Azure OpenAI-tjänsten. Den här inställningen krävs alltid.
<CONNECTION_NAME_PREFIX>__clientId Anger den specifika användartilldelade identiteten som ska användas när du hämtar en åtkomsttoken. Kräver som <CONNECTION_NAME_PREFIX>__credential är inställt på managedidentity. Egenskapen accepterar ett klient-ID som motsvarar en användartilldelad identitet som tilldelats programmet. Det är ogiltigt att ange både ett resurs-ID och ett klient-ID. Om du inte specificerar denna egenskap används den systemtilldelade identiteten. Den här egenskapen används på olika sätt i lokala utvecklingsscenarier, när credential bör inte anges.
<CONNECTION_NAME_PREFIX>__credential Definierar hur en access token hämtas för anslutningen. Används managedidentity för hanterad identitetsautentisering. Det här värdet är endast giltigt när en hanterad identitet är tillgänglig i värdmiljön.
<CONNECTION_NAME_PREFIX>__managedIdentityResourceId När credential är satt till managedidentity, ställ in denna egenskap för att specificera resursidentifieraren som ska användas vid erhållning av en token. Egenskapen accepterar en resursidentifierare som motsvarar resurs-ID:t för den användardefinierade hanterade identiteten. Det är ogiltigt att ange både ett resurs-ID och ett klient-ID. Om du inte specificerar någon av dem används den system-tilldelade identiteten. Den här egenskapen används på olika sätt i lokala utvecklingsscenarier, när credential bör inte anges.
<CONNECTION_NAME_PREFIX>__key Sätter den delade hemliga nyckeln som krävs för att komma åt slutpunkten för Azure OpenAI-tjänsten genom att använda nyckelbaserad autentisering. Som säkerhetspraxis, använd alltid Microsoft Entra ID med hanterade identiteter för autentisering.

Överväg dessa inställningar för managed identity connection när du sätter egenskapen AIConnectionName till myAzureOpenAI:

  • myAzureOpenAI__endpoint=https://contoso.openai.azure.com/
  • myAzureOpenAI__credential=managedidentity
  • myAzureOpenAI__clientId=aaaaaaaa-bbbb-cccc-1111-222222222222

Vid körning tolkar värden dessa inställningar som en enda myAzureOpenAI inställning:

"myAzureOpenAI":
{
    "endpoint": "https://contoso.openai.azure.com/",
    "credential": "managedidentity",
    "clientId": "aaaaaaaa-bbbb-cccc-1111-222222222222"
}

När du använder hanterade identiteter, se till att lägga till din identitet i rollen Cognitive Services OpenAI User .

När du kör lokalt, lägg till dessa inställningar i local.settings.json projektfilen. Mer information finns i Lokal utveckling med identitetsbaserade anslutningar.

Mer information finns i Arbeta med programinställningar.