Compartir a través de


Inserciones de Azure OpenAI para almacenar el enlace de salida para Azure Functions

Importante

La extensión de Azure OpenAI para Azure Functions está actualmente en versión preliminar.

El enlace de salida del almacén de inserciones de Azure OpenAI permite escribir archivos en un almacén de documentos semántico al que se puede hacer referencia más adelante en una búsqueda semántica.

Para obtener información sobre la configuración y los detalles de configuración de la extensión de Azure OpenAI, consulte Extensiones de Azure OpenAI para Azure Functions. Para más información sobre la clasificación semántica en Búsqueda de Azure AI, consulte Clasificación semántica en Búsqueda de Azure AI.

Nota:

Las referencias y ejemplos solo se proporcionan para el modelo de Node.js v4.

Nota:

Las referencias y ejemplos solo se proporcionan para el modelo de Python v2.

Nota:

Aunque se admiten ambos modelos de proceso de C#, solo se proporcionan ejemplos de modelos de trabajo aislados.

Ejemplo

En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.

[Function("IngestFile")]
public static async Task<EmbeddingsStoreOutputResponse> IngestFile(
    [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
{
    using StreamReader reader = new(req.Body);
    string request = await reader.ReadToEndAsync();

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

    if (requestBody == null || requestBody.Url == null)
    {
        throw new ArgumentException("Invalid request body. Make sure that you pass in {\"Url\": value } as the request body.");
    }

    Uri uri = new(requestBody.Url);
    string filename = Path.GetFileName(uri.AbsolutePath);

    IActionResult result = new OkObjectResult(new { status = HttpStatusCode.OK });

    return new EmbeddingsStoreOutputResponse
    {
        HttpResponse = result,
        SearchableDocument = new SearchableDocument(filename)
    };
}

public class EmbeddingsStoreOutputResponse
{
    [EmbeddingsStoreOutput("{Url}", InputType.Url, "AISearchEndpoint", "openai-index", Model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")]
    public required SearchableDocument SearchableDocument { get; init; }

    public IActionResult? HttpResponse { get; set; }
}

En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.

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

Los ejemplos aún no están disponibles.

En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.

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}',

En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.

Este es el archivo de function.json para la ingesta de archivos:

{
  "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 obtener más información sobre las propiedades del archivo function.json, consulte la sección de Configuración.

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

En este ejemplo se escribe un flujo de entrada HTTP en un almacén de documentos semántico en la dirección URL proporcionada.

@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 el atributo EmbeddingsStoreOutput para definir un enlace de salida del almacén de inserciones, que admite estos parámetros:

Parámetro Descripción
Entrada Cadena de entrada para la que se van a generar inserciones.
Modelo Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002. No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso.
MaxChunkLength Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso.
MaxOverlap Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos.
InputType Opcional. Obtiene el tipo de la entrada.
ConnectionName Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace.
Colección Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace.

anotaciones

La EmbeddingsStoreOutput anotación permite definir un enlace de salida del almacén de incrustaciones, que admite estos parámetros:

Elemento Descripción
name Obtiene o establece el nombre del enlace de salida.
input Cadena de entrada para la que se van a generar inserciones.
model Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002. No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso.
maxChunkLength Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso.
maxOverlap Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos.
inputType Opcional. Obtiene el tipo de la entrada.
connectionName Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace.
collection Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace.

Elementos Decorator

Durante la versión preliminar, defina el enlace de salida como un enlace generic_output_binding de tipo semanticSearch, que admite estos parámetros:

Parámetro Descripción
arg_name Nombre de la variable que representa el parámetro de enlace.
input Cadena de entrada para la que se van a generar inserciones.
model Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002. No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso.
maxChunkLength Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso.
max_overlap Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos.
input_type Obtiene el tipo de la entrada.
connection_name Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace.
collection Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace.

Configuración

El enlace admite estas propiedades de configuración que se establecen en el archivo function.json.

Propiedad Descripción
type Debe ser embeddingsStore.
direction Debe ser out.
name Nombre del enlace de salida.
input Cadena de entrada para la que se van a generar inserciones.
model Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002. No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso.
maxChunkLength Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso.
maxOverlap Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos.
inputType Opcional. Obtiene el tipo de la entrada.
connectionName Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace.
collection Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace.

Configuración

El enlace admite estas propiedades, que se definen en el código:

Propiedad Descripción
input Cadena de entrada para la que se van a generar inserciones.
model Opcional. Identificador del modelo que se va a usar, que tiene como valor predeterminado text-embedding-ada-002. No debe cambiar el modelo de una base de datos existente. Para obtener más información, consulte Uso.
maxChunkLength Opcional. Número máximo de caracteres usados para fragmentar la entrada. Para obtener más información, consulte Uso.
maxOverlap Opcional. Obtiene o establece el número máximo de caracteres que se superponen entre fragmentos.
inputType Opcional. Obtiene el tipo de la entrada.
connectionName Nombre de una configuración de aplicación o una variable de entorno que contiene el valor de la cadena de conexión. Esta propiedad es compatible con expresiones de enlace.
collection Nombre de la colección o tabla o índice que se va a buscar. Esta propiedad es compatible con expresiones de enlace.

Uso

Consulte la sección de ejemplos para ver ejemplos completos.