Azure OpenAI-Ausgabebindung zum Speichern von Einbettungen für Azure Functions

Wichtig

Die Azure OpenAI-Erweiterung für Azure Functions befindet sich derzeit in der Vorschau.

Die Azure OpenAI-Ausgabebindung zum Speichern von Einbettungen ermöglicht es Ihnen, Dateien in einen semantischen Dokumentenspeicher zu schreiben, der später in einer semantischen Suche referenziert werden kann.

Informationen zu Einrichtungs- und Konfigurationsdetails der Azure OpenAI-Erweiterung finden Sie unter Azure OpenAI-Erweiterungen für Azure Functions. Weitere Informationen zur semantischen Rangfolge in der Azure KI-Suche finden Sie unter Semantische Rangfolge in der Azure KI-Suche.

Hinweis

Referenzen und Beispiele werden nur für das Node.js v4-Modell bereitgestellt.

Hinweis

Referenzen und Beispiele werden nur für das Python v2-Modell bereitgestellt.

Hinweis

Während beide C#-Prozessmodelle unterstützt werden, werden nur Isolierte Arbeitsmodellbeispiele bereitgestellt.

Beispiel

In diesem Beispiel wird ein HTTP-Eingabedatenstrom in einen semantischen Dokumentspeicher unter der angegebenen URL geschrieben.

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

In diesem Beispiel wird ein HTTP-Eingabedatenstrom in einen semantischen Dokumentspeicher unter der angegebenen URL geschrieben.

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

Beispiele sind noch nicht verfügbar.

In diesem Beispiel wird ein HTTP-Eingabedatenstrom in einen semantischen Dokumentspeicher unter der angegebenen URL geschrieben.

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

In diesem Beispiel wird ein HTTP-Eingabedatenstrom in einen semantischen Dokumentspeicher unter der angegebenen URL geschrieben.

Dies ist die function.json Datei zum Aufnehmen von Dateien:

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

Weitere Informationen zu den Dateieigenschaften von function.json finden Sie im Abschnitt Konfiguration.

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 diesem Beispiel wird ein HTTP-Eingabedatenstrom in einen semantischen Dokumentspeicher unter der angegebenen URL geschrieben.

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

Attribute

Wenden Sie das EmbeddingsStoreOutput-Attribut an, um eine Ausgabebindung zum Speichern von Einbettungen zu definieren, die diese Parameter unterstützt:

Parameter Beschreibung
Eingabe Die Eingabezeichenfolge, für die Einbettungen generiert werden sollen.
Modell Optional. Die ID des zu verwendenden Modells, die standardmäßig text-embedding-ada-002 lautet. Sie sollten das Modell für eine vorhandene Datenbank nicht ändern. Weitere Informationen finden Sie unter Verbrauch.
MaxChunkLength Optional. Die maximale Anzahl von Zeichen, die für die Segmentierung der Eingabe verwendet werden. Weitere Informationen finden Sie unter Verbrauch.
MaxOverlap Optional. Ruft die maximale Anzahl von Zeichen ab, die zwischen Blöcken überlappen sollen, oder legt diese fest.
InputType Optional. Ruft den Typ der Eingabe ab.
ConnectionName Den Namen einer App-Einstellung oder Umgebungsvariable, die den Wert der Verbindungszeichenfolge enthält. Diese Eigenschaft unterstützt Bindungsausdrücke.
Sammlung Den Name der zu durchsuchenden Sammlung oder Tabelle oder des Indexes. Diese Eigenschaft unterstützt Bindungsausdrücke.

Anmerkungen

Mit der EmbeddingsStoreOutput Anmerkung können Sie eine Einbettungsspeicher-Ausgabebindung definieren, die diese Parameter unterstützt:

Element BESCHREIBUNG
name Ruft den Namen der Ausgabebindung ab oder legt ihn fest.
input Die Eingabezeichenfolge, für die Einbettungen generiert werden sollen.
Modell Optional. Die ID des zu verwendenden Modells, die standardmäßig text-embedding-ada-002 lautet. Sie sollten das Modell für eine vorhandene Datenbank nicht ändern. Weitere Informationen finden Sie unter Verbrauch.
maxChunkLength Optional. Die maximale Anzahl von Zeichen, die für die Segmentierung der Eingabe verwendet werden. Weitere Informationen finden Sie unter Verbrauch.
maxOverlap Optional. Ruft die maximale Anzahl von Zeichen ab, die zwischen Blöcken überlappen sollen, oder legt diese fest.
inputType Optional. Ruft den Typ der Eingabe ab.
connectionName Den Namen einer App-Einstellung oder Umgebungsvariable, die den Wert der Verbindungszeichenfolge enthält. Diese Eigenschaft unterstützt Bindungsausdrücke.
collection Den Name der zu durchsuchenden Sammlung oder Tabelle oder des Indexes. Diese Eigenschaft unterstützt Bindungsausdrücke.

Decorator-Elemente

Definieren Sie während der Vorschau die Ausgabebindung als Bindung generic_output_binding vom Typ semanticSearch, die diese Parameter unterstützt:

Parameter Beschreibung
arg_name Der Name der Variablen, die den Bindungsparameter darstellt.
input Die Eingabezeichenfolge, für die Einbettungen generiert werden sollen.
Modell Optional. Die ID des zu verwendenden Modells, die standardmäßig text-embedding-ada-002 lautet. Sie sollten das Modell für eine vorhandene Datenbank nicht ändern. Weitere Informationen finden Sie unter Verbrauch.
maxChunkLength Optional. Die maximale Anzahl von Zeichen, die für die Segmentierung der Eingabe verwendet werden. Weitere Informationen finden Sie unter Verbrauch.
max_overlap Optional. Ruft die maximale Anzahl von Zeichen ab, die zwischen Blöcken überlappen sollen, oder legt diese fest.
input_type Ruft den Typ der Eingabe ab.
connection_name Den Namen einer App-Einstellung oder Umgebungsvariable, die den Wert der Verbindungszeichenfolge enthält. Diese Eigenschaft unterstützt Bindungsausdrücke.
collection Den Name der zu durchsuchenden Sammlung oder Tabelle oder des Indexes. Diese Eigenschaft unterstützt Bindungsausdrücke.

Konfiguration

Die Bindung unterstützt diese Konfigurationseigenschaften, die Sie in der Datei „function.json“ festlegen.

Eigenschaft Beschreibung des Dataflows
type Muss embeddingsStorelauten.
direction Muss outlauten.
name Der Name der Ausgabebindung.
input Die Eingabezeichenfolge, für die Einbettungen generiert werden sollen.
Modell Optional. Die ID des zu verwendenden Modells, die standardmäßig text-embedding-ada-002 lautet. Sie sollten das Modell für eine vorhandene Datenbank nicht ändern. Weitere Informationen finden Sie unter Verbrauch.
maxChunkLength Optional. Die maximale Anzahl von Zeichen, die für die Segmentierung der Eingabe verwendet werden. Weitere Informationen finden Sie unter Verbrauch.
maxOverlap Optional. Ruft die maximale Anzahl von Zeichen ab, die zwischen Blöcken überlappen sollen, oder legt diese fest.
inputType Optional. Ruft den Typ der Eingabe ab.
connectionName Den Namen einer App-Einstellung oder Umgebungsvariable, die den Wert der Verbindungszeichenfolge enthält. Diese Eigenschaft unterstützt Bindungsausdrücke.
collection Den Name der zu durchsuchenden Sammlung oder Tabelle oder des Indexes. Diese Eigenschaft unterstützt Bindungsausdrücke.

Konfiguration

Die Bindung unterstützt diese Eigenschaften, die in Ihrem Code definiert sind:

Eigenschaft Beschreibung
input Die Eingabezeichenfolge, für die Einbettungen generiert werden sollen.
Modell Optional. Die ID des zu verwendenden Modells, die standardmäßig text-embedding-ada-002 lautet. Sie sollten das Modell für eine vorhandene Datenbank nicht ändern. Weitere Informationen finden Sie unter Verbrauch.
maxChunkLength Optional. Die maximale Anzahl von Zeichen, die für die Segmentierung der Eingabe verwendet werden. Weitere Informationen finden Sie unter Verbrauch.
maxOverlap Optional. Ruft die maximale Anzahl von Zeichen ab, die zwischen Blöcken überlappen sollen, oder legt diese fest.
inputType Optional. Ruft den Typ der Eingabe ab.
connectionName Den Namen einer App-Einstellung oder Umgebungsvariable, die den Wert der Verbindungszeichenfolge enthält. Diese Eigenschaft unterstützt Bindungsausdrücke.
collection Den Name der zu durchsuchenden Sammlung oder Tabelle oder des Indexes. Diese Eigenschaft unterstützt Bindungsausdrücke.

Verbrauch

Vollständige Beispiele finden Sie im Abschnitt Beispiele.