Partager via


Liaison de sortie de magasin d’incorporations Azure OpenAI pour Azure Functions

Important

L’extension Azure OpenAI pour Azure Functions est actuellement en préversion.

La liaison de sortie de magasin d’incorporations Azure OpenAI vous permet d’écrire des fichiers dans un magasin de documents sémantique qui peut être référencé ultérieurement dans une recherche sémantique.

Pour plus d’informations sur l’installation et la configuration de l’extension Azure OpenAI, consultez Extensions Azure OpenAI pour Azure Functions. Pour en savoir plus sur le classement sémantique dans Recherche IA Azure, veuillez consulter la rubrique Classement par ordre de priorité sémantique dans Recherche Azure AI.

Remarque

Les références et les exemples sont fournis uniquement pour le modèle Node.js v4.

Remarque

Les références et exemples sont fournis uniquement pour le modèle Python v2.

Remarque

Bien que les deux modèles de processus C# soient pris en charge, seuls les exemples de modèles worker isolés sont fournis.

Exemple

Cet exemple écrit un flux d’entrée HTTP dans un magasin de documents sémantique à l’URL fournie.

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

Cet exemple écrit un flux d’entrée HTTP dans un magasin de documents sémantique à l’URL fournie.

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

Les exemples ne sont pas encore disponibles.

Cet exemple écrit un flux d’entrée HTTP dans un magasin de documents sémantique à l’URL fournie.

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

Cet exemple écrit un flux d’entrée HTTP dans un magasin de documents sémantique à l’URL fournie.

Voici le fichier function.json pour l’ingestion de fichiers :

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

Pour plus d’informations sur les propriétés du fichier function.json, consultez la section Configuration.

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

Cet exemple écrit un flux d’entrée HTTP dans un magasin de documents sémantique à l’URL fournie.

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

Attributs

Appliquez l’attribut EmbeddingsStoreOutput pour définir une liaison de sortie de magasin d’incorporations, qui prend en charge ces paramètres :

Paramètre Description
Entrée La chaîne d’entrée pour laquelle générer des incorporations.
Modèle Facultatif. L’ID du modèle à utiliser, par défaut text-embedding-ada-002. Vous ne devez pas modifier le modèle d’une base de données existante. Pour plus d’informations, consultez Utilisation.
MaxChunkLength Facultatif. Le nombre maximal de caractères utilisés pour segmenter l’entrée. Pour plus d’informations, consultez Utilisation.
MaxOverlap Facultatif. Obtient ou définit le nombre maximal de caractères à chevaucher entre les blocs.
InputType Facultatif. Obtient le type de l’entrée.
ConnectionName Au lieu de cela, Nom d’un paramètre d’application ou d’une variable d’environnement qui contient la valeur de la chaîne de connexion. Cette propriété prend en charge les expressions de liaison.
Collection Nom de la collection, de la table ou de l’index ou effectuer la recherche. Cette propriété prend en charge les expressions de liaison.

Annotations

L’annotation EmbeddingsStoreOutput vous permet de définir une liaison de sortie de magasin d’incorporations, qui prend en charge ces paramètres :

Element Description
name Obtient ou définit le nom de la liaison de sortie.
input La chaîne d’entrée pour laquelle générer des incorporations.
modèle Facultatif. L’ID du modèle à utiliser, par défaut text-embedding-ada-002. Vous ne devez pas modifier le modèle d’une base de données existante. Pour plus d’informations, consultez Utilisation.
maxChunkLength Facultatif. Le nombre maximal de caractères utilisés pour segmenter l’entrée. Pour plus d’informations, consultez Utilisation.
maxOverlap Facultatif. Obtient ou définit le nombre maximal de caractères à chevaucher entre les blocs.
inputType Facultatif. Obtient le type de l’entrée.
connectionName Au lieu de cela, Nom d’un paramètre d’application ou d’une variable d’environnement qui contient la valeur de la chaîne de connexion. Cette propriété prend en charge les expressions de liaison.
collection Nom de la collection, de la table ou de l’index ou effectuer la recherche. Cette propriété prend en charge les expressions de liaison.

Décorateurs

Pendant la préversion, définissez la liaison de sortie en tant que liaison generic_output_binding de type semanticSearch, qui prend en charge ces paramètres :

Paramètre Description
arg_name Le nom de la variable qui représente le paramètre de liaison.
input La chaîne d’entrée pour laquelle générer des incorporations.
modèle Facultatif. L’ID du modèle à utiliser, par défaut text-embedding-ada-002. Vous ne devez pas modifier le modèle d’une base de données existante. Pour plus d’informations, consultez Utilisation.
maxChunkLength Facultatif. Le nombre maximal de caractères utilisés pour segmenter l’entrée. Pour plus d’informations, consultez Utilisation.
max_overlap Facultatif. Obtient ou définit le nombre maximal de caractères à chevaucher entre les blocs.
input_type Obtient le type de l’entrée.
connection_name Au lieu de cela, Nom d’un paramètre d’application ou d’une variable d’environnement qui contient la valeur de la chaîne de connexion. Cette propriété prend en charge les expressions de liaison.
collection Nom de la collection, de la table ou de l’index ou effectuer la recherche. Cette propriété prend en charge les expressions de liaison.

Configuration

La liaison prend en charge ces propriétés de configuration que vous définissez dans le fichier function.json.

Propriété Description
type Doit être embeddingsStore.
direction Doit être out.
name Nom de la liaison de sortie.
input La chaîne d’entrée pour laquelle générer des incorporations.
modèle Facultatif. L’ID du modèle à utiliser, par défaut text-embedding-ada-002. Vous ne devez pas modifier le modèle d’une base de données existante. Pour plus d’informations, consultez Utilisation.
maxChunkLength Facultatif. Le nombre maximal de caractères utilisés pour segmenter l’entrée. Pour plus d’informations, consultez Utilisation.
maxOverlap Facultatif. Obtient ou définit le nombre maximal de caractères à chevaucher entre les blocs.
inputType Facultatif. Obtient le type de l’entrée.
connectionName Au lieu de cela, Nom d’un paramètre d’application ou d’une variable d’environnement qui contient la valeur de la chaîne de connexion. Cette propriété prend en charge les expressions de liaison.
collection Nom de la collection, de la table ou de l’index ou effectuer la recherche. Cette propriété prend en charge les expressions de liaison.

Configuration

La liaison prend en charge ces propriétés, qui sont définies dans votre code :

Propriété Description
input La chaîne d’entrée pour laquelle générer des incorporations.
modèle Facultatif. L’ID du modèle à utiliser, par défaut text-embedding-ada-002. Vous ne devez pas modifier le modèle d’une base de données existante. Pour plus d’informations, consultez Utilisation.
maxChunkLength Facultatif. Le nombre maximal de caractères utilisés pour segmenter l’entrée. Pour plus d’informations, consultez Utilisation.
maxOverlap Facultatif. Obtient ou définit le nombre maximal de caractères à chevaucher entre les blocs.
inputType Facultatif. Obtient le type de l’entrée.
connectionName Au lieu de cela, Nom d’un paramètre d’application ou d’une variable d’environnement qui contient la valeur de la chaîne de connexion. Cette propriété prend en charge les expressions de liaison.
collection Nom de la collection, de la table ou de l’index ou effectuer la recherche. Cette propriété prend en charge les expressions de liaison.

Utilisation

Pour obtenir des exemples complets, consultez la section Exemple.