Delen via


Uitvoerbinding voor Azure OpenAI-insluitingen opslaan voor Azure Functions

Belangrijk

De Azure OpenAI-extensie voor Azure Functions is momenteel in preview.

Met de azure OpenAI-insluitingen kunt u uitvoerbinding opslaan om bestanden naar een semantisch documentarchief te schrijven waarnaar later in een semantische zoekopdracht kan worden verwezen.

Zie Azure OpenAI-extensies voor Azure Functions voor informatie over de installatie en configuratie van de Azure OpenAI-extensie. Zie Semantische rangschikking in Azure AI Search voor meer informatie over semantische rangschikking in Azure AI Search.

Notitie

Verwijzingen en voorbeelden worden alleen verstrekt voor het Node.js v4-model.

Notitie

Verwijzingen en voorbeelden worden alleen verstrekt voor het Python v2-model.

Notitie

Hoewel beide C#-procesmodellen worden ondersteund, worden alleen geïsoleerde werkrolmodelvoorbeelden gegeven.

Opmerking

In dit voorbeeld wordt een HTTP-invoerstroom naar een semantisch documentarchief geschreven op de opgegeven URL.

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

    EmbeddingsStoreOutputResponse badRequestResponse = new()
    {
        HttpResponse = new BadRequestResult(),
        SearchableDocument = new SearchableDocument(string.Empty)
    };

    if (string.IsNullOrWhiteSpace(request))
    {
        return badRequestResponse;
    }

    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))
    {
        return badRequestResponse;
    }

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

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

public class EmbeddingsStoreOutputResponse
{
    [EmbeddingsStoreOutput("{url}", InputType.Url, "AISearchEndpoint", "openai-index", Model = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")]

In dit voorbeeld wordt een HTTP-invoerstroom naar een semantisch documentarchief geschreven op de opgegeven URL.

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

In dit voorbeeld wordt een HTTP-invoerstroom naar een semantisch documentarchief geschreven op de opgegeven URL.

const embeddingsStoreOutput = output.generic({
    type: "embeddingsStore",
    input: "{url}", 
    inputType: "url", 
    connectionName: "AISearchEndpoint", 
    collection: "openai-index", 
    model: "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
});

app.http('IngestFile', {
    methods: ['POST'],
    authLevel: 'function',
    extraOutputs: [embeddingsStoreOutput],
    handler: async (request, context) => {
        let requestBody = await request.json();
        if (!requestBody || !requestBody.url) {
            throw new Error("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
        }

        let uri = requestBody.url;
        let url = new URL(uri);

        let fileName = path.basename(url.pathname);
        context.extraOutputs.set(embeddingsStoreOutput, { title: fileName });

        let response = {
            status: "success",
            title: fileName
        };

        return { status: 202, jsonBody: response } 
    }
});
interface EmbeddingsRequest {
    url?: string;
}

const embeddingsStoreOutput = output.generic({
    type: "embeddingsStore",
    input: "{url}", 
    inputType: "url", 
    connectionName: "AISearchEndpoint", 
    collection: "openai-index", 
    model: "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
});

app.http('IngestFile', {
    methods: ['POST'],
    authLevel: 'function',
    extraOutputs: [embeddingsStoreOutput],
    handler: async (request, context) => {
        let requestBody: EmbeddingsRequest | null = await request.json();
        if (!requestBody || !requestBody.url) {
            throw new Error("Invalid request body. Make sure that you pass in {\"url\": value } as the request body.");
        }

        let uri = requestBody.url;
        let url = new URL(uri);

        let fileName = path.basename(url.pathname);
        context.extraOutputs.set(embeddingsStoreOutput, { title: fileName });

        let response = {
            status: "success",
            title: fileName
        };

        return { status: 202, jsonBody: response } 
    }
});

In dit voorbeeld wordt een HTTP-invoerstroom naar een semantisch documentarchief geschreven op de opgegeven URL.

Dit is het function.json-bestand voor het opnemen van bestanden:

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

Zie de sectie Configuratie voor meer informatie over function.json bestandseigenschappen.

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

In dit voorbeeld wordt een HTTP-invoerstroom naar een semantisch documentarchief geschreven op de opgegeven URL.

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

Kenmerken

Pas het EmbeddingsStoreOutput kenmerk toe om een uitvoerbinding voor het insluiten van inhoudsarchieven te definiëren, die ondersteuning biedt voor deze parameters:

Parameter Description
Invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
Model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
MaxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
MaxOverlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
InputType Optioneel. Hiermee haalt u het type invoer op.
ConnectionName De naam van een app-instelling of omgevingsvariabele die de verbindingsreeks waarde bevat. Deze eigenschap ondersteunt bindingexpressies.
Verzameling De naam van de verzameling of tabel of index die u wilt zoeken. Deze eigenschap ondersteunt bindingexpressies.

Aantekeningen

Met de EmbeddingsStoreOutput aantekening kunt u een insluitingsarchiefbinding definiëren, die ondersteuning biedt voor deze parameters:

Element Description
name Hiermee haalt u de naam van de uitvoerbinding op of stelt u deze in.
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
maxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
maxOverlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
inputType Optioneel. Hiermee haalt u het type invoer op.
connectionName De naam van een app-instelling of omgevingsvariabele die de verbindingsreeks waarde bevat. Deze eigenschap ondersteunt bindingexpressies.
collectie De naam van de verzameling of tabel of index die u wilt zoeken. Deze eigenschap ondersteunt bindingexpressies.

Decorators

Definieer tijdens de preview de uitvoerbinding als een generic_output_binding binding van het type semanticSearch, die ondersteuning biedt voor deze parameters:

Parameter Description
arg_name De naam van de variabele die de bindingsparameter vertegenwoordigt.
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
maxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
max_overlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
input_type Hiermee haalt u het type invoer op.
connection_name De naam van een app-instelling of omgevingsvariabele die de verbindingsreeks waarde bevat. Deze eigenschap ondersteunt bindingexpressies.
collectie De naam van de verzameling of tabel of index die u wilt zoeken. Deze eigenschap ondersteunt bindingexpressies.

Configuratie

De binding ondersteunt deze configuratie-eigenschappen die u in het function.json-bestand hebt ingesteld.

Eigenschappen Beschrijving
type Moet embeddingsStore zijn.
direction Moet out zijn.
name De naam van de uitvoerbinding.
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
maxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
maxOverlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
inputType Optioneel. Hiermee haalt u het type invoer op.
connectionName De naam van een app-instelling of omgevingsvariabele die de verbindingsreeks waarde bevat. Deze eigenschap ondersteunt bindingexpressies.
collectie De naam van de verzameling of tabel of index die u wilt zoeken. Deze eigenschap ondersteunt bindingexpressies.

Configuratie

De binding ondersteunt deze eigenschappen, die zijn gedefinieerd in uw code:

Eigenschappen Beschrijving
invoer De invoertekenreeks waarvoor insluitingen moeten worden gegenereerd.
model Optioneel. De id van het model dat moet worden gebruikt, wat standaard wordt gebruikt text-embedding-ada-002. U moet het model voor een bestaande database niet wijzigen. Zie Gebruik voor meer informatie.
maxChunkLength Optioneel. Het maximum aantal tekens dat wordt gebruikt voor het segmenteren van de invoer. Zie Gebruik voor meer informatie.
maxOverlap Optioneel. Hiermee wordt het maximum aantal tekens tussen segmenten ophaalt of ingesteld.
inputType Optioneel. Hiermee haalt u het type invoer op.
connectionName De naam van een app-instelling of omgevingsvariabele die de verbindingsreeks waarde bevat. Deze eigenschap ondersteunt bindingexpressies.
collectie De naam van de verzameling of tabel of index die u wilt zoeken. Deze eigenschap ondersteunt bindingexpressies.

Gebruik

Zie de sectie Voorbeeld voor volledige voorbeelden.