Dela via


Azure OpenAI-inbäddning lagrar utdatabindning för Azure Functions

Viktigt!

Azure OpenAI-tillägget för Azure Functions är för närvarande i förhandsversion.

Med Azure OpenAI-inbäddningsarkivets utdatabindning kan du skriva filer till ett semantiskt dokumentarkiv som kan refereras senare i en semantisk sökning.

Information om konfiguration och konfigurationsinformation för Azure OpenAI-tillägget finns i Azure OpenAI-tillägg för Azure Functions. Mer information om semantisk rankning i Azure AI Search finns i Semantisk rankning i Azure AI Search.

Kommentar

Referenser och exempel tillhandahålls endast för modellen Node.js v4.

Kommentar

Referenser och exempel tillhandahålls endast för Python v2-modellen.

Kommentar

Båda C#-processmodellerna stöds, men endast exempel på isolerade arbetsmodeller tillhandahålls.

Exempel

Det här exemplet skriver en HTTP-indataström till ett semantiskt dokumentarkiv på den angivna URL:en.

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

Det här exemplet skriver en HTTP-indataström till ett semantiskt dokumentarkiv på den angivna URL:en.

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

Exempel är ännu inte tillgängliga.

Det här exemplet skriver en HTTP-indataström till ett semantiskt dokumentarkiv på den angivna URL:en.

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

Det här exemplet skriver en HTTP-indataström till ett semantiskt dokumentarkiv på den angivna URL:en.

Här är function.json-filen för inmatning av filer:

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

Mer information om function.json filegenskaper finns i avsnittet 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"
        }
})

Det här exemplet skriver en HTTP-indataström till ett semantiskt dokumentarkiv på den angivna URL:en.

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

Attribut

EmbeddingsStoreOutput Använd attributet för att definiera en inbäddningslagerutdatabindning, som stöder följande parametrar:

Parameter Description
Indata Den indatasträng som du vill generera inbäddningar för.
Modell Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
MaxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
MaxOverlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
InputType Valfritt. Hämtar indatatypen.
ConnectionName Namnet på en appinställning eller miljövariabel som innehåller värdet anslutningssträng. Den här egenskapen stöder bindningsuttryck.
Samling Namnet på samlingen eller tabellen eller indexet som ska sökas. Den här egenskapen stöder bindningsuttryck.

Kommentarer

Med anteckningen EmbeddingsStoreOutput kan du definiera en inbäddningslagerutdatabindning som stöder följande parametrar:

Element Description
Namn Hämtar eller anger namnet på utdatabindningen.
inmatning Den indatasträng som du vill generera inbäddningar för.
modell Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
maxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
maxOverlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
inputType Valfritt. Hämtar indatatypen.
connectionName Namnet på en appinställning eller miljövariabel som innehåller värdet anslutningssträng. Den här egenskapen stöder bindningsuttryck.
samling Namnet på samlingen eller tabellen eller indexet som ska sökas. Den här egenskapen stöder bindningsuttryck.

Dekoratörer

Under förhandsversionen definierar du utdatabindningen som en generic_output_binding bindning av typen semanticSearch, som stöder följande parametrar:

Parameter Description
arg_name Namnet på variabeln som representerar bindningsparametern.
inmatning Den indatasträng som du vill generera inbäddningar för.
modell Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
maxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
max_overlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
input_type Hämtar indatatypen.
connection_name Namnet på en appinställning eller miljövariabel som innehåller värdet anslutningssträng. Den här egenskapen stöder bindningsuttryck.
samling Namnet på samlingen eller tabellen eller indexet som ska sökas. Den här egenskapen stöder bindningsuttryck.

Konfiguration

Bindningen stöder de konfigurationsegenskaper som du anger i filen function.json.

Property Beskrivning
typ Måste vara embeddingsStore.
riktning Måste vara out.
Namn Namnet på utdatabindningen.
inmatning Den indatasträng som du vill generera inbäddningar för.
modell Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
maxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
maxOverlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
inputType Valfritt. Hämtar indatatypen.
connectionName Namnet på en appinställning eller miljövariabel som innehåller värdet anslutningssträng. Den här egenskapen stöder bindningsuttryck.
samling Namnet på samlingen eller tabellen eller indexet som ska sökas. Den här egenskapen stöder bindningsuttryck.

Konfiguration

Bindningen stöder dessa egenskaper, som definieras i koden:

Property beskrivning
inmatning Den indatasträng som du vill generera inbäddningar för.
modell Valfritt. ID:t för modellen som ska användas, som standard är text-embedding-ada-002. Du bör inte ändra modellen för en befintlig databas. Mer information finns i Användning.
maxChunkLength Valfritt. Det maximala antalet tecken som används för segmentering av indata. Mer information finns i Användning.
maxOverlap Valfritt. Hämtar eller anger det maximala antalet tecken som ska överlappa mellan segment.
inputType Valfritt. Hämtar indatatypen.
connectionName Namnet på en appinställning eller miljövariabel som innehåller värdet anslutningssträng. Den här egenskapen stöder bindningsuttryck.
samling Namnet på samlingen eller tabellen eller indexet som ska sökas. Den här egenskapen stöder bindningsuttryck.

Förbrukning

Se avsnittet Exempel för fullständiga exempel.