Associação de saída do repositório de inserções do OpenAI do Azure para o Azure Functions

Importante

Atualmente, a extensão do OpenAI do Azure para Azure Functions está em versão prévia.

A associação de saída do repositório de inserções do OpenAI do Azure permite que você grave arquivos em um repositório de documentos semânticos que podem ser referenciados posteriormente em uma pesquisa semântica.

Para obter informações sobre os detalhes de configuração da extensão do OpenAI do Azure, confira Extensões do OpenAI do Azure para Azure Functions. Para saber mais sobre a classificação semântica na Pesquisa de IA do Azure, confira Classificação semântica na Pesquisa de IA do Azure.

Observação

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

Observação

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

Observação

Embora haja suporte para ambos os modelos de processo C#, apenas exemplos de modelo de trabalho isolados são fornecidos.

Exemplo

Este exemplo grava um fluxo de entrada HTTP em um repositório de documentos semânticos 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 de documentos semânticos na URL fornecida.

import com.microsoft.azure.functions.openai.annotation.search.SemanticSearch;
import com.sun.jndi.toolkit.url.Uri;

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 MalformedURLException {

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

Ainda não há exemplos disponíveis.

Este exemplo grava um fluxo de entrada HTTP em um repositório de documentos semânticos 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 de documentos semânticos na URL fornecida.

Aqui está o arquivo function.json para ingestão de 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 as propriedades do arquivo function.json, 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 de documentos semânticos 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 atributo EmbeddingsStoreOutput para definir uma associação de saída do repositório de inserções, que dá suporte a estes parâmetros:

Parâmetro Descrição
Entrada A cadeia de caracteres de entrada para a qual gerar inserções.
Modelo Opcional. A ID do modelo a ser usado, que usa text-embedding-ada-002 como padrão. 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 agrupar 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 partes.
InputType Opcional. Obtém o tipo de entrada.
ConnectionName O nome de uma configuração de aplicativo ou uma variável de ambiente que contém o valor da cadeia de conexão. Essa propriedade dá suporte a expressões de associação.
Coleção O nome da coleção, da tabela ou do índice a ser pesquisado. Essa propriedade dá suporte a expressões de associação.

Anotações

A EmbeddingsStoreOutput anotação permite que você defina uma associação de saída de armazenamento de incorporações, que dá suporte a estes parâmetros:

Element Descrição
name Obtém ou define o nome da associação de saída.
input A cadeia de caracteres de entrada para a qual gerar inserções.
Modelo Opcional. A ID do modelo a ser usado, que usa text-embedding-ada-002 como padrão. 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 agrupar 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 partes.
inputType Opcional. Obtém o tipo de entrada.
connectionName O nome de uma configuração de aplicativo ou uma variável de ambiente que contém o valor da cadeia de conexão. Essa propriedade dá suporte a expressões de associação.
collection O nome da coleção, da tabela ou do índice a ser pesquisado. Essa propriedade dá suporte a expressões de associação.

Decoradores

Durante a versão prévia, defina a associação de saída como uma associação generic_output_binding do tipo semanticSearch, que dá suporte a esses parâmetros:

Parâmetro Descrição
arg_name O nome da variável que representa o parâmetro de associação.
input A cadeia de caracteres de entrada para a qual gerar inserções.
Modelo Opcional. A ID do modelo a ser usado, que usa text-embedding-ada-002 como padrão. 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 agrupar 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 partes.
input_type Obtém o tipo de entrada.
connection_name O nome de uma configuração de aplicativo ou uma variável de ambiente que contém o valor da cadeia de conexão. Essa propriedade dá suporte a expressões de associação.
collection O nome da coleção, da tabela ou do índice a ser pesquisado. Essa propriedade dá suporte a expressões de associação.

Configuração

A associação dá suporte a essas propriedades de configuração definidas no arquivo function.json.

Propriedade Descrição
tipo Deve ser embeddingsStore.
direction Deve ser out.
name O nome da associação de saída.
input A cadeia de caracteres de entrada para a qual gerar inserções.
Modelo Opcional. A ID do modelo a ser usado, que usa text-embedding-ada-002 como padrão. 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 agrupar 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 partes.
inputType Opcional. Obtém o tipo de entrada.
connectionName O nome de uma configuração de aplicativo ou uma variável de ambiente que contém o valor da cadeia de conexão. Essa propriedade dá suporte a expressões de associação.
collection O nome da coleção, da tabela ou do índice a ser pesquisado. Essa propriedade dá suporte a expressões de associação.

Configuração

A associação dá suporte a estas propriedades, que são definidas no código:

Propriedade Descrição
input A cadeia de caracteres de entrada para a qual gerar inserções.
Modelo Opcional. A ID do modelo a ser usado, que usa text-embedding-ada-002 como padrão. 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 agrupar 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 partes.
inputType Opcional. Obtém o tipo de entrada.
connectionName O nome de uma configuração de aplicativo ou uma variável de ambiente que contém o valor da cadeia de conexão. Essa propriedade dá suporte a expressões de associação.
collection O nome da coleção, da tabela ou do índice a ser pesquisado. Essa propriedade dá suporte a expressões de associação.

Uso

Consulte a Seção de exemplo para obter exemplos completos.