O Azure OpenAI incorpora a vinculação de entrada para o Funções do Azure

Importante

A extensão do Azure OpenAI para o Funções do Azure está atualmente em visualização.

A vinculação de entrada de incorporações do Azure OpenAI permite gerar incorporações para entradas. A associação pode gerar incorporações de arquivos ou entradas de texto bruto.

Para obter informações sobre detalhes de instalação e configuração da extensão do Azure OpenAI, consulte Extensões do Azure OpenAI para Funções do Azure. Para saber mais sobre incorporações no Serviço Azure OpenAI, consulte Compreender incorporações no Serviço Azure OpenAI.

Nota

Referências e exemplos são fornecidos apenas para o modelo Node.js v4.

Nota

Referências e exemplos são fornecidos apenas para o modelo Python v2.

Nota

Embora ambos os modelos de processo C# sejam suportados, apenas exemplos de modelos de trabalho isolados são fornecidos.

Exemplo

O suporte Go não está atualmente disponível para esta ligação.

Este exemplo mostra como gerar incorporações para uma cadeia de caracteres de texto bruto.

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

Este exemplo mostra como recuperar incorporações armazenadas em um arquivo especificado que é acessível à função.

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

Este exemplo mostra como gerar incorporações para uma cadeia de caracteres de texto bruto.

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

Este exemplo mostra como recuperar incorporações armazenadas em um arquivo especificado que é acessível à função.

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

Este exemplo mostra como gerar incorporações para uma cadeia de caracteres de texto bruto.

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

Este exemplo mostra como gerar incorporações para uma cadeia de caracteres de texto bruto.


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

Este exemplo mostra como gerar incorporações para uma cadeia de caracteres de texto bruto.

Aqui está o arquivo function.json para gerar as incorporações:

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

Para obter mais informações sobre function.json propriedades do arquivo, consulte a seção Configuração .

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

Este exemplo mostra como gerar incorporações para uma cadeia de caracteres de texto bruto.

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

Atributos

Aplique o EmbeddingsInput atributo para definir uma associação de entrada incorporada, que suporta estes parâmetros:

Parâmetro Descrição
Entrada A cadeia de caracteres de entrada para a qual gerar incorporações.
AIConnectionName Opcional. Obtém ou define o nome da seção de configuração para as configurações de conectividade do serviço de IA. Para o Azure OpenAI: Se especificado, procure os valores "Endpoint" e "Key" nesta seção de configuração. Se não for especificado ou a seção não existir, recorrerá às variáveis de ambiente: AZURE_OPENAI_ENDPOINT e AZURE_OPENAI_KEY. Para autenticação de identidade gerenciada atribuída pelo usuário, essa propriedade é necessária. Para o serviço OpenAI (não Azure), defina a variável de ambiente OPENAI_API_KEY.
IncorporaçõesModelo Opcional. A ID do modelo a ser usado, cujo padrão é text-embedding-ada-002. Você não deve alterar o modelo de um banco de dados existente. Para obter mais informações, consulte Uso.
MaxChunkLength [en] Opcional. O número máximo de caracteres usados para dividir a entrada. Para obter mais informações, consulte Uso.
MaxOverlap Opcional. Obtém ou define o número máximo de caracteres a serem sobrepostos entre as partes.
Tipo de entrada Opcional. Obtém o tipo de entrada.

Anotações

A EmbeddingsInput anotação permite definir uma associação de entrada incorporada, que suporta estes parâmetros:

Elemento Descrição
Designação Obtém ou define o nome da ligação de entrada.
entrada A cadeia de caracteres de entrada para a qual gerar incorporações.
aiConnectionName Opcional. Obtém ou define o nome da seção de configuração para as configurações de conectividade do serviço de IA. Para o Azure OpenAI: Se especificado, procure os valores "Endpoint" e "Key" nesta seção de configuração. Se não for especificado ou a seção não existir, recorrerá às variáveis de ambiente: AZURE_OPENAI_ENDPOINT e AZURE_OPENAI_KEY. Para autenticação de identidade gerenciada atribuída pelo usuário, essa propriedade é necessária. Para o serviço OpenAI (não Azure), defina a variável de ambiente OPENAI_API_KEY.
incorporaçõesModelo Opcional. A ID do modelo a ser usado, cujo padrão é text-embedding-ada-002. Você não deve alterar o modelo de um banco de dados existente. Para obter mais informações, consulte Uso.
maxChunkLength Opcional. O número máximo de caracteres usados para dividir a entrada. Para obter mais informações, consulte Uso.
maxSobreposição Opcional. Obtém ou define o número máximo de caracteres a serem sobrepostos entre as partes.
inputType Opcional. Obtém o tipo de entrada.

Decoradores

Durante a visualização, defina a ligação de entrada como uma generic_input_binding ligação do tipo embeddings, que suporta estes parâmetros: embeddings decorator suporta estes parâmetros:

Parâmetro Descrição
arg_name O nome da variável que representa o parâmetro de ligação.
entrada A cadeia de caracteres de entrada para a qual gerar incorporações.
ai_connection_name Opcional. Obtém ou define o nome da seção de configuração para as configurações de conectividade do serviço de IA. Para o Azure OpenAI: Se especificado, procure os valores "Endpoint" e "Key" nesta seção de configuração. Se não for especificado ou a seção não existir, recorrerá às variáveis de ambiente: AZURE_OPENAI_ENDPOINT e AZURE_OPENAI_KEY. Para autenticação de identidade gerenciada atribuída pelo usuário, essa propriedade é necessária. Para o serviço OpenAI (não Azure), defina a variável de ambiente OPENAI_API_KEY.
embeddings_model Opcional. A ID do modelo a ser usado, cujo padrão é text-embedding-ada-002. Você não deve alterar o modelo de um banco de dados existente. Para obter mais informações, consulte Uso.
maxChunkLength Opcional. O número máximo de caracteres usados para dividir a entrada. Para obter mais informações, consulte Uso.
max_overlap Opcional. Obtém ou define o número máximo de caracteres a serem sobrepostos entre as partes.
input_type Obtém o tipo de entrada.

Configuração

A associação suporta essas propriedades de configuração definidas no arquivo function.json.

Propriedade Descrição
tipo Deve ser EmbeddingsInput.
direção Deve ser in.
Designação O nome da ligação de entrada.
entrada A cadeia de caracteres de entrada para a qual gerar incorporações.
aiConnectionName Opcional. Obtém ou define o nome da seção de configuração para as configurações de conectividade do serviço de IA. Para o Azure OpenAI: Se especificado, procure os valores "Endpoint" e "Key" nesta seção de configuração. Se não for especificado ou a seção não existir, recorrerá às variáveis de ambiente: AZURE_OPENAI_ENDPOINT e AZURE_OPENAI_KEY. Para autenticação de identidade gerenciada atribuída pelo usuário, essa propriedade é necessária. Para o serviço OpenAI (não Azure), defina a variável de ambiente OPENAI_API_KEY.
incorporaçõesModelo Opcional. A ID do modelo a ser usado, cujo padrão é text-embedding-ada-002. Você não deve alterar o modelo de um banco de dados existente. Para obter mais informações, consulte Uso.
maxChunkLength Opcional. O número máximo de caracteres usados para dividir a entrada. Para obter mais informações, consulte Uso.
maxSobreposição Opcional. Obtém ou define o número máximo de caracteres a serem sobrepostos entre as partes.
inputType Opcional. Obtém o tipo de entrada.

Configuração

A associação suporta estas propriedades, que são definidas no seu código:

Propriedade Descrição
entrada A cadeia de caracteres de entrada para a qual gerar incorporações.
aiConnectionName Opcional. Obtém ou define o nome da seção de configuração para as configurações de conectividade do serviço de IA. Para o Azure OpenAI: Se especificado, procure os valores "Endpoint" e "Key" nesta seção de configuração. Se não for especificado ou a seção não existir, recorrerá às variáveis de ambiente: AZURE_OPENAI_ENDPOINT e AZURE_OPENAI_KEY. Para autenticação de identidade gerenciada atribuída pelo usuário, essa propriedade é necessária. Para o serviço OpenAI (não Azure), defina a variável de ambiente OPENAI_API_KEY.
incorporaçõesModelo Opcional. A ID do modelo a ser usado, cujo padrão é text-embedding-ada-002. Você não deve alterar o modelo de um banco de dados existente. Para obter mais informações, consulte Uso.
maxChunkLength Opcional. O número máximo de caracteres usados para dividir a entrada. Para obter mais informações, consulte Uso.
maxSobreposição Opcional. Obtém ou define o número máximo de caracteres a serem sobrepostos entre as partes.
inputType Opcional. Obtém o tipo de entrada.

Consulte a seção Exemplo para obter exemplos completos.

Utilização

Alterar as incorporações model padrão altera a maneira como as incorporações são armazenadas no banco de dados vetorial. Alterar o modelo padrão pode fazer com que as pesquisas comecem a se comportar incorretamente quando não corresponderem ao restante dos dados que foram ingeridos anteriormente no banco de dados vetorial. O modelo padrão para incorporações é text-embedding-ada-002.

Ao calcular o comprimento máximo de caracteres para blocos de entrada, considere que o máximo de tokens de entrada permitido para modelos de incorporação de entrada de segunda geração como text-embedding-ada-002 é 8191. Um único token tem aproximadamente quatro caracteres de comprimento (em inglês), o que se traduz em cerca de 32.000 caracteres (inglês) de entrada que podem caber em um único bloco.

Connections

Para usar a extensão de ligação Azure OpenAI, precisa de especificar uma ligação a uma definição de modelo OpenAI. Defina a ligação do modelo OpenAI nas suas ligações usando uma destas abordagens:

  • Use a AIConnectionName propriedade binding (preferida para Azure OpenAI).
  • Definir AZURE_OPENAI_ENDPOINT e AZURE_OPENAI_KEY nas definições da aplicação (para Azure OpenAI).
  • Definir apenas Open_API_Key nas definições da aplicação (para https://api.openai.com).

A forma como se define a ligação depende tanto da API do modelo como do método de autenticação, conforme indicado na tabela seguinte:

API de Autenticação/Modelo Azure OpenAI OpenAI (https://api.openai.com)
Ligação de identidade gerida AIConnectionName Não suportado
Referência ao Key Vault AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_KEY
Open_API_Key
Referência de configuração da aplicação AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_KEY
Open_API_Key
Segredo partilhado AZURE_OPENAI_ENDPOINT
AZURE_OPENAI_KEY
Open_API_Key

Use ligações geridas baseadas em identidade e a propriedade AIConnectionName .

Quando usa AIConnectionName, o valor desta definição de propriedade depende do tipo de ligação:

  • Ligação de identidade gerida: A AIConnectionName propriedade é <CONNECTION_NAME_PREFIX> partilhada por um grupo de definições que, em conjunto, definem uma ligação baseada em identidade ao Azure OpenAI. Para mais informações, consulte Definir ligações de identidade.
  • Referência Key Vault: A AIConnectionName definição de propriedade devolve uma referência Azure Key Vault ao local onde a chave API é mantida centralmente. Para mais informações, consulte Definir ligações ao Key Vault.
  • Referência App Configuration: A AIConnectionName definição de propriedade devolve uma referência Azure App Configuration que devolve uma chave API ou uma referência ao Key Vault. Para mais informações, consulte Azure App Configuration no artigo de ligações.
  • Chave API: A AIConnectionName definição de propriedade resolve para as definições da aplicação que contêm diretamente o endpoint e a chave. Como as chaves partilhadas podem ser comprometidas, utilize ligações de identidade geridas sempre que possível. Para mais informações, veja Definir ligações.

Para saber mais sobre ligações de bindings, consulte Gerir ligações no Funções do Azure.

As ligações OpenAI incluem uma AIConnectionName propriedade que pode usar para especificar <ConnectionNamePrefix> o grupo de definições da aplicação que definem a ligação ao Azure OpenAI:

Nome da configuração Descrição
<CONNECTION_NAME_PREFIX>__endpoint Define o endpoint URI do serviço Azure OpenAI. Essa configuração é sempre necessária.
<CONNECTION_NAME_PREFIX>__clientId Define a identidade específica atribuída pelo usuário a ser usada ao obter um token de acesso. Requer que <CONNECTION_NAME_PREFIX>__credential esteja definido como managedidentity. A propriedade aceita um ID de cliente correspondente a uma identidade atribuída pelo usuário atribuída ao aplicativo. É inválido especificar uma ID de recurso e uma ID de cliente. Se não especificar esta propriedade, é usada a identidade atribuída pelo sistema. Esta propriedade é usada de forma diferente em cenários de desenvolvimento local, quando credential não deveria ser definida.
<CONNECTION_NAME_PREFIX>__credential Define como um token de acesso é obtido para a ligação. Use managedidentity para autenticação de identidade gerenciada. Esse valor só é válido quando uma identidade gerenciada está disponível no ambiente de hospedagem.
<CONNECTION_NAME_PREFIX>__managedIdentityResourceId Quando credential está definido como managedidentity, defina esta propriedade para especificar o Identificador de recurso a usar ao obter um token. A propriedade aceita um identificador de recurso correspondente ao ID do recurso da identidade gerenciada definida pelo usuário. É inválido especificar um ID de recurso e um ID de cliente. Se não especificar nenhum dos dois, é usada a identidade atribuída pelo sistema. Esta propriedade é usada de forma diferente em cenários de desenvolvimento local, quando credential não deveria ser definida.
<CONNECTION_NAME_PREFIX>__key Define a chave secreta partilhada necessária para aceder ao endpoint do serviço Azure OpenAI usando autenticação baseada em chaves. Como melhor prática de segurança, utilize sempre o Microsoft Entra ID com identidades geridas para autenticação.

Considere estas definições de ligação de identidade gerida quando definir a AIConnectionName propriedade para myAzureOpenAI:

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

Em tempo de execução, o anfitrião interpreta estas definições como uma única myAzureOpenAI definição:

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

Quando usar identidades geridas, certifique-se de adicionar a sua identidade ao papel de Utilizador OpenAI de Serviços Cognitivos .

Ao executar localmente, adicione estas definições ao ficheirolocal.settings.json projeto. Para obter mais informações, consulte Desenvolvimento local com conexões baseadas em identidade.

Para obter mais informações, consulte Trabalhar com configurações do aplicativo.