Partilhar via


Azure OpenAI incorpora vinculação de saída de armazenamento para o Azure Functions

Importante

A extensão do Azure OpenAI para o Azure Functions está atualmente em visualização.

A associação de saída do repositório de incorporações do Azure OpenAI permite gravar arquivos em um repositório semântico de documentos que pode ser referenciado posteriormente em uma pesquisa semântica.

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 Azure Functions. Para saber mais sobre a classificação semântica na Pesquisa de IA do Azure, consulte Classificação semântica na Pesquisa de IA do Azure.

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

Este exemplo grava um fluxo de entrada HTTP em um repositório semântico de documentos na URL fornecida.

[Function("IngestFile")]
public static async Task<EmbeddingsStoreOutputResponse> IngestFile(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
{
    ArgumentNullException.ThrowIfNull(req);

    using StreamReader reader = new(req.Body);
    string request = await reader.ReadToEndAsync();

    if (string.IsNullOrWhiteSpace(request))
    {
        throw new ArgumentException("Request body is empty.");
    }

    EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);

    if (string.IsNullOrWhiteSpace(requestBody?.Url))
    {
        throw new ArgumentException("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
    }

    if (!Uri.TryCreate(requestBody.Url, UriKind.Absolute, out Uri? uri))
    {
        throw new ArgumentException("Invalid Url format.");
    }

    string filename = Path.GetFileName(uri.AbsolutePath);

    return new EmbeddingsStoreOutputResponse
    {
        HttpResponse = new OkObjectResult(new { status = HttpStatusCode.OK }),
        SearchableDocument = new SearchableDocument(filename)
    };

Este exemplo grava um fluxo de entrada HTTP em um repositório semântico de documentos na URL fornecida.

import com.microsoft.azure.functions.openai.annotation.search.SearchableDocument;
import com.microsoft.azure.functions.openai.annotation.search.SemanticSearch;

public class FilePrompt {

    @FunctionName("IngestFile")
    public HttpResponseMessage ingestFile(
        @HttpTrigger(
            name = "req", 
            methods = {HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<EmbeddingsRequest> request,
        @EmbeddingsStoreOutput(name="EmbeddingsStoreOutput", input = "{url}", inputType = InputType.Url,
                connectionName = "AISearchEndpoint", collection = "openai-index",
                model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") OutputBinding<EmbeddingsStoreOutputResponse> output,
        final ExecutionContext context) throws URISyntaxException {

        if (request.getBody() == null || request.getBody().getUrl() == null)
        {
            throw new IllegalArgumentException("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
        }

        URI uri = new URI(request.getBody().getUrl());
        String filename = Paths.get(uri.getPath()).getFileName().toString();

        EmbeddingsStoreOutputResponse embeddingsStoreOutputResponse = new EmbeddingsStoreOutputResponse(new SearchableDocument(filename));

        output.setValue(embeddingsStoreOutputResponse);

        JSONObject response = new JSONObject();
        response.put("status", "success");
        response.put("title", filename);

        return request.createResponseBuilder(HttpStatus.CREATED)
                .header("Content-Type", "application/json")
                .body(response)
                .build();
    }

    public class EmbeddingsStoreOutputResponse {
        private SearchableDocument searchableDocument;

        public EmbeddingsStoreOutputResponse(SearchableDocument searchableDocument) {
            this.searchableDocument = searchableDocument;
        }

Os exemplos ainda não estão disponíveis.

Este exemplo grava um fluxo de entrada HTTP em um repositório semântico de documentos na URL fornecida.

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

interface EmbeddingsFilePath {
    FilePath?: string;
}

const embeddingsFilePathInput = input.generic({
    input: '{filePath}',

Este exemplo grava um fluxo de entrada HTTP em um repositório semântico de documentos na URL fornecida.

Aqui está o arquivo function.json para ingerir arquivos:

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "name": "EmbeddingsStoreOutput",
      "type": "embeddingsStore",
      "direction": "out",
      "input": "{url}",
      "inputType": "Url",
      "connectionName": "AISearchEndpoint",
      "collection": "openai-index",
      "model": "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
    }
  ]
}

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

using namespace System.Net

param($Request, $TriggerMetadata)

$ErrorActionPreference = 'Stop'

$inputJson = $Request.Body

if (-not $inputJson -or -not $inputJson.Url) {
    throw 'Invalid request body. Make sure that you pass in {\"url\": value } as the request body.'
}

$uri = [URI]$inputJson.Url
$filename = [System.IO.Path]::GetFileName($uri.AbsolutePath)


Push-OutputBinding -Name EmbeddingsStoreOutput -Value @{
    "title" = $filename
}

$response = @{
    "status" = "success"
    "title" = $filename
}

Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
        StatusCode = [HttpStatusCode]::OK
        Body = $response
        Headers    = @{
            "Content-Type" = "application/json"
        }
})

Este exemplo grava um fluxo de entrada HTTP em um repositório semântico de documentos na URL fornecida.

@app.function_name("IngestFile")
@app.route(methods=["POST"])
@app.embeddings_store_output(arg_name="requests", input="{url}", input_type="url", connection_name="AISearchEndpoint", collection="openai-index", model="%EMBEDDING_MODEL_DEPLOYMENT_NAME%")
def ingest_file(req: func.HttpRequest, requests: func.Out[str]) -> func.HttpResponse:
    user_message = req.get_json()
    if not user_message:
        return func.HttpResponse(json.dumps({"message": "No message provided"}), status_code=400, mimetype="application/json")
    file_name_with_extension = os.path.basename(user_message["url"])
    title = os.path.splitext(file_name_with_extension)[0]
    create_request = {
        "title": title
    }
    requests.set(json.dumps(create_request))
    response_json = {
        "status": "success",
        "title": title
    }
    return func.HttpResponse(json.dumps(response_json), status_code=200, mimetype="application/json")

Atributos

Aplique o EmbeddingsStoreOutput atributo para definir uma associação de saída de armazenamento incorporado, que suporta estes parâmetros:

Parâmetro Description
Entrada A cadeia de caracteres de entrada para a qual gerar incorporações.
Modelo 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.
Nome da conexão O nome de uma configuração de aplicativo ou variável de ambiente que contém o valor da cadeia de conexão. Esta propriedade suporta expressões de ligação.
Coleção O nome da coleção, tabela ou índice a pesquisar. Esta propriedade suporta expressões de ligação.

Anotações

A EmbeddingsStoreOutput anotação permite definir uma associação de saída de armazenamento incorporado, que suporta estes parâmetros:

Elemento Description
Designação Obtém ou define o nome da ligação de saída.
entrada A cadeia de caracteres de entrada para a qual gerar incorporações.
modelo 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.
nome_da_conexão O nome de uma configuração de aplicativo ou variável de ambiente que contém o valor da cadeia de conexão. Esta propriedade suporta expressões de ligação.
Coleção O nome da coleção, tabela ou índice a pesquisar. Esta propriedade suporta expressões de ligação.

Decoradores

Durante a visualização, defina a ligação de saída como uma generic_output_binding associação do tipo semanticSearch, que suporta estes parâmetros:

Parâmetro Description
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.
modelo 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.
connection_name O nome de uma configuração de aplicativo ou variável de ambiente que contém o valor da cadeia de conexão. Esta propriedade suporta expressões de ligação.
Coleção O nome da coleção, tabela ou índice a pesquisar. Esta propriedade suporta expressões de ligação.

Configuração

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

Property Descrição
type Deve ser embeddingsStore.
direção Deve ser out.
Designação O nome da ligação de saída.
entrada A cadeia de caracteres de entrada para a qual gerar incorporações.
modelo 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.
nome_da_conexão O nome de uma configuração de aplicativo ou variável de ambiente que contém o valor da cadeia de conexão. Esta propriedade suporta expressões de ligação.
Coleção O nome da coleção, tabela ou índice a pesquisar. Esta propriedade suporta expressões de ligação.

Configuração

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

Property Description
entrada A cadeia de caracteres de entrada para a qual gerar incorporações.
modelo 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.
nome_da_conexão O nome de uma configuração de aplicativo ou variável de ambiente que contém o valor da cadeia de conexão. Esta propriedade suporta expressões de ligação.
Coleção O nome da coleção, tabela ou índice a pesquisar. Esta propriedade suporta expressões de ligação.

Utilização

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