Bagikan melalui


Pengikatan input penyematan Azure OpenAI untuk Azure Functions

Penting

Ekstensi Azure OpenAI untuk Azure Functions saat ini dalam pratinjau.

Pengikatan input Penyematan Azure OpenAI memungkinkan Anda menghasilkan penyematan untuk input. Pengikatan dapat menghasilkan penyematan dari file atau input teks mentah.

Untuk informasi tentang penyiapan dan detail konfigurasi ekstensi Azure OpenAI, lihat Ekstensi Azure OpenAI untuk Azure Functions. Untuk mempelajari selengkapnya tentang penyematan di Azure OpenAI Service, lihat Memahami penyematan di Azure OpenAI Service.

Catatan

Referensi dan contoh hanya disediakan untuk model Node.js v4.

Catatan

Referensi dan contoh hanya disediakan untuk model Python v2.

Catatan

Meskipun kedua model proses C# didukung, hanya contoh model pekerja terisolasi yang disediakan.

Contoh

Contoh ini menunjukkan cara menghasilkan penyematan untuk string teks mentah.

internal class EmbeddingsRequest
{
    [JsonPropertyName("rawText")]
    public string? RawText { get; set; }

    [JsonPropertyName("filePath")]
    public string? FilePath { get; set; }

    [JsonPropertyName("url")]
    public string? Url { get; set; }
}

/// <summary>
/// Example showing how to use the <see cref="EmbeddingsAttribute"/> input binding to generate embeddings 
/// for a raw text string.
/// </summary>
[Function(nameof(GenerateEmbeddings_Http_RequestAsync))]
public async Task GenerateEmbeddings_Http_RequestAsync(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings")] HttpRequestData req,
    [EmbeddingsInput("{rawText}", InputType.RawText, EmbeddingsModel = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")] EmbeddingsContext embeddings)
{
    using StreamReader reader = new(req.Body);
    string request = await reader.ReadToEndAsync();

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

    this.logger.LogInformation(
        "Received {count} embedding(s) for input text containing {length} characters.",
        embeddings.Count,
        requestBody?.RawText?.Length);

    // TODO: Store the embeddings into a database or other storage.
}

Contoh ini menunjukkan cara mengambil penyematan yang disimpan pada file tertentu yang dapat diakses oleh fungsi.

[Function(nameof(GetEmbeddings_Http_FilePath))]
public async Task GetEmbeddings_Http_FilePath(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings-from-file")] HttpRequestData req,
    [EmbeddingsInput("{filePath}", InputType.FilePath, MaxChunkLength = 512, EmbeddingsModel = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%")] EmbeddingsContext embeddings)
{
    using StreamReader reader = new(req.Body);
    string request = await reader.ReadToEndAsync();

    EmbeddingsRequest? requestBody = JsonSerializer.Deserialize<EmbeddingsRequest>(request);
    this.logger.LogInformation(
        "Received {count} embedding(s) for input file '{path}'.",
        embeddings.Count,
        requestBody?.FilePath);

    // TODO: Store the embeddings into a database or other storage.
}

Contoh ini menunjukkan cara menghasilkan penyematan untuk string teks mentah.

@FunctionName("GenerateEmbeddingsHttpRequest")
public HttpResponseMessage generateEmbeddingsHttpRequest(
        @HttpTrigger(
            name = "req", 
            methods = {HttpMethod.POST},
            authLevel = AuthorizationLevel.ANONYMOUS,
            route = "embeddings")
        HttpRequestMessage<EmbeddingsRequest> request,
        @EmbeddingsInput(name = "Embeddings", input = "{RawText}", inputType = InputType.RawText, embeddingsModel = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") String embeddingsContext,
        final ExecutionContext context) {

    if (request.getBody() == null) 
    {
        throw new IllegalArgumentException(
                "Invalid request body. Make sure that you pass in {\"rawText\": value } as the request body.");
    }

    JSONObject embeddingsContextJsonObject = new JSONObject(embeddingsContext);

    context.getLogger().info(String.format("Received %d embedding(s) for input text containing %s characters.",
            embeddingsContextJsonObject.get("count"),
            request.getBody().getRawText().length()));

    // TODO: Store the embeddings into a database or other storage.
    return request.createResponseBuilder(HttpStatus.ACCEPTED)
            .header("Content-Type", "application/json")
            .build();
}

Contoh ini menunjukkan cara mengambil penyematan yang disimpan pada file tertentu yang dapat diakses oleh fungsi.

@FunctionName("GenerateEmbeddingsHttpFilePath")
public HttpResponseMessage generateEmbeddingsHttpFilePath(
    @HttpTrigger(
        name = "req", 
        methods = {HttpMethod.POST},
        authLevel = AuthorizationLevel.ANONYMOUS,
        route = "embeddings-from-file")
    HttpRequestMessage<EmbeddingsRequest> request,
    @EmbeddingsInput(name = "Embeddings", input = "{FilePath}", inputType = InputType.FilePath, maxChunkLength = 512, embeddingsModel = "%EMBEDDING_MODEL_DEPLOYMENT_NAME%") String embeddingsContext,
    final ExecutionContext context) {

    if (request.getBody() == null) 
    {
        throw new IllegalArgumentException(
                "Invalid request body. Make sure that you pass in {\"filePath\": value } as the request body.");
    }

    JSONObject embeddingsContextJsonObject = new JSONObject(embeddingsContext);

    context.getLogger().info(String.format("Received %d embedding(s) for input file %s.",
            embeddingsContextJsonObject.get("count"),
            request.getBody().getFilePath()));

    // TODO: Store the embeddings into a database or other storage.
    return request.createResponseBuilder(HttpStatus.ACCEPTED)
            .header("Content-Type", "application/json")
            .build();
}

Contoh ini menunjukkan cara menghasilkan penyematan untuk string teks mentah.

const embeddingsHttpInput = input.generic({
    input: '{rawText}',
    inputType: 'RawText',
    type: 'embeddings',
    embeddingsModel: '%EMBEDDING_MODEL_DEPLOYMENT_NAME%'
})

app.http('generateEmbeddings', {
    methods: ['POST'],
    route: 'embeddings',
    authLevel: 'function',
    extraInputs: [embeddingsHttpInput],
    handler: async (request, context) => {
        let requestBody = await request.json();
        let response = 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 EmbeddingsHttpRequest {
    RawText?: string;
}

const embeddingsHttpInput = input.generic({
    input: '{rawText}',
    inputType: 'RawText',
    type: 'embeddings',
    embeddingsModel: '%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}
    }
});

Contoh ini menunjukkan cara menghasilkan penyematan untuk string teks mentah.

const embeddingsFilePathInput = input.generic({
    input: '{filePath}',
    inputType: 'FilePath',
    type: 'embeddings',
    maxChunkLength: 512,
    embeddingsModel: '%EMBEDDING_MODEL_DEPLOYMENT_NAME%'
})

app.http('getEmbeddingsFilePath', {
    methods: ['POST'],
    route: 'embeddings-from-file',
    authLevel: 'function',
    extraInputs: [embeddingsFilePathInput],
    handler: async (request, context) => {
        let requestBody = await request.json();
        let response = context.extraInputs.get(embeddingsFilePathInput);

        context.log(
            `Received ${response.count} embedding(s) for input file ${requestBody.FilePath}.`
        );
        
        // TODO: Store the embeddings into a database or other storage.

        return {status: 202}
    }
});
interface EmbeddingsFilePath {
    FilePath?: string;
}

const embeddingsFilePathInput = input.generic({
    input: '{filePath}',
    inputType: 'FilePath',
    type: 'embeddings',
    maxChunkLength: 512,
    embeddingsModel: '%EMBEDDING_MODEL_DEPLOYMENT_NAME%'
})

app.http('getEmbeddingsFilePath', {
    methods: ['POST'],
    route: 'embeddings-from-file',
    authLevel: 'function',
    extraInputs: [embeddingsFilePathInput],
    handler: async (request, context) => {
        let requestBody: EmbeddingsFilePath = await request.json();
        let response: any = context.extraInputs.get(embeddingsFilePathInput);

        context.log(
            `Received ${response.count} embedding(s) for input file ${requestBody.FilePath}.`
        );
        
        // TODO: Store the embeddings into a database or other storage.

        return {status: 202}
    }
});

Contoh ini menunjukkan cara menghasilkan penyematan untuk string teks mentah.

Berikut adalah file function.json untuk menghasilkan penyematan:

{
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "route": "embeddings",
      "methods": [
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "name": "Embeddings",
      "type": "embeddings",
      "direction": "in",
      "inputType": "RawText",
      "input": "{rawText}",
      "embeddingsModel": "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
    }
  ]
}

Untuk informasi selengkapnya tentang properti file function.json , lihat bagian Konfigurasi .

using namespace System.Net

param($Request, $TriggerMetadata, $Embeddings)

$input = $Request.Body.RawText

Write-Host "Received $($Embeddings.Count) embedding(s) for input text containing $($input.Length) characters."

Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
        StatusCode = [HttpStatusCode]::Accepted
})

Contoh ini menunjukkan cara menghasilkan penyematan untuk string teks mentah.

@app.function_name("GenerateEmbeddingsHttpRequest")
@app.route(route="embeddings", methods=["POST"])
@app.embeddings_input(
    arg_name="embeddings",
    input="{rawText}",
    input_type="rawText",
    embeddings_model="%EMBEDDING_MODEL_DEPLOYMENT_NAME%",
)
def generate_embeddings_http_request(
    req: func.HttpRequest, embeddings: str
) -> func.HttpResponse:
    user_message = req.get_json()
    embeddings_json = json.loads(embeddings)
    embeddings_request = {"raw_text": user_message.get("rawText")}
    logging.info(
        f'Received {embeddings_json.get("count")} embedding(s) for input text '
        f'containing {len(embeddings_request.get("raw_text"))} characters.'
    )
    # TODO: Store the embeddings into a database or other storage.
    return func.HttpResponse(status_code=200)

Atribut

EmbeddingsInput Terapkan atribut untuk menentukan pengikatan input penyematan, yang mendukung parameter ini:

Pengaturan Deskripsi
Masukan String input yang akan menghasilkan penyematan.
AIConnectionName Opsional. Mendapatkan atau mengatur nama bagian konfigurasi untuk pengaturan konektivitas layanan AI. Untuk Azure OpenAI: Jika ditentukan, cari nilai "Titik Akhir" dan "Kunci" di bagian konfigurasi ini. Jika tidak ditentukan atau bagian tidak ada, kembali ke variabel lingkungan: AZURE_OPENAI_ENDPOINT dan AZURE_OPENAI_KEY. Untuk autentikasi identitas terkelola yang ditetapkan pengguna, properti ini diperlukan. Untuk layanan OpenAI (non-Azure), atur variabel lingkungan OPENAI_API_KEY.
EmbeddingsModel Opsional. ID model yang akan digunakan, yang default ke text-embedding-ada-002. Anda tidak boleh mengubah model untuk database yang sudah ada. Untuk informasi selengkapnya, lihat Penggunaan.
MaxChunkLength Opsional. Jumlah maksimum karakter yang digunakan untuk memotong input. Untuk informasi selengkapnya, lihat Penggunaan.
MaxOverlap Opsional. Mendapatkan atau mengatur jumlah karakter maksimum untuk tumpang tindih di antara gugus.
InputType Opsional. Mendapatkan jenis input.

Anotasi

Anotasi EmbeddingsInput memungkinkan Anda menentukan pengikatan input penyematan, yang mendukung parameter ini:

Elemen Deskripsi
nama Mendapatkan atau mengatur nama pengikatan input.
masukan String input yang akan menghasilkan penyematan.
aiConnectionName Opsional. Mendapatkan atau mengatur nama bagian konfigurasi untuk pengaturan konektivitas layanan AI. Untuk Azure OpenAI: Jika ditentukan, cari nilai "Titik Akhir" dan "Kunci" di bagian konfigurasi ini. Jika tidak ditentukan atau bagian tidak ada, kembali ke variabel lingkungan: AZURE_OPENAI_ENDPOINT dan AZURE_OPENAI_KEY. Untuk autentikasi identitas terkelola yang ditetapkan pengguna, properti ini diperlukan. Untuk layanan OpenAI (non-Azure), atur variabel lingkungan OPENAI_API_KEY.
embeddingsModel Opsional. ID model yang akan digunakan, yang default ke text-embedding-ada-002. Anda tidak boleh mengubah model untuk database yang sudah ada. Untuk informasi selengkapnya, lihat Penggunaan.
maxChunkLength Opsional. Jumlah maksimum karakter yang digunakan untuk memotong input. Untuk informasi selengkapnya, lihat Penggunaan.
maxOverlap Opsional. Mendapatkan atau mengatur jumlah karakter maksimum untuk tumpang tindih di antara gugus.
inputType Opsional. Mendapatkan jenis input.

Dekorator

Selama pratinjau, tentukan pengikatan input sebagai generic_input_binding pengikatan jenis embeddings, yang mendukung parameter ini: embeddings dekorator mendukung parameter ini:

Pengaturan Deskripsi
arg_name Nama variabel yang mewakili parameter pengikatan.
masukan String input yang akan menghasilkan penyematan.
ai_connection_name Opsional. Mendapatkan atau mengatur nama bagian konfigurasi untuk pengaturan konektivitas layanan AI. Untuk Azure OpenAI: Jika ditentukan, cari nilai "Titik Akhir" dan "Kunci" di bagian konfigurasi ini. Jika tidak ditentukan atau bagian tidak ada, kembali ke variabel lingkungan: AZURE_OPENAI_ENDPOINT dan AZURE_OPENAI_KEY. Untuk autentikasi identitas terkelola yang ditetapkan pengguna, properti ini diperlukan. Untuk layanan OpenAI (non-Azure), atur variabel lingkungan OPENAI_API_KEY.
embeddings_model Opsional. ID model yang akan digunakan, yang default ke text-embedding-ada-002. Anda tidak boleh mengubah model untuk database yang sudah ada. Untuk informasi selengkapnya, lihat Penggunaan.
maxChunkLength Opsional. Jumlah maksimum karakter yang digunakan untuk memotong input. Untuk informasi selengkapnya, lihat Penggunaan.
max_overlap Opsional. Mendapatkan atau mengatur jumlah karakter maksimum untuk tumpang tindih di antara gugus.
input_type Mendapatkan jenis input.

Konfigurasi

Pengikatan mendukung properti konfigurasi ini yang Anda tetapkan dalam file function.json.

Properti Deskripsi
jenis Harus berupa EmbeddingsInput .
arah Harus berupa in .
nama Nama pengikatan input.
masukan String input yang akan menghasilkan penyematan.
aiConnectionName Opsional. Mendapatkan atau mengatur nama bagian konfigurasi untuk pengaturan konektivitas layanan AI. Untuk Azure OpenAI: Jika ditentukan, cari nilai "Titik Akhir" dan "Kunci" di bagian konfigurasi ini. Jika tidak ditentukan atau bagian tidak ada, kembali ke variabel lingkungan: AZURE_OPENAI_ENDPOINT dan AZURE_OPENAI_KEY. Untuk autentikasi identitas terkelola yang ditetapkan pengguna, properti ini diperlukan. Untuk layanan OpenAI (non-Azure), atur variabel lingkungan OPENAI_API_KEY.
embeddingsModel Opsional. ID model yang akan digunakan, yang default ke text-embedding-ada-002. Anda tidak boleh mengubah model untuk database yang sudah ada. Untuk informasi selengkapnya, lihat Penggunaan.
maxChunkLength Opsional. Jumlah maksimum karakter yang digunakan untuk memotong input. Untuk informasi selengkapnya, lihat Penggunaan.
maxOverlap Opsional. Mendapatkan atau mengatur jumlah karakter maksimum untuk tumpang tindih di antara gugus.
inputType Opsional. Mendapatkan jenis input.

Konfigurasi

Pengikatan mendukung properti ini, yang ditentukan dalam kode Anda:

Properti Deskripsi
masukan String input yang akan menghasilkan penyematan.
aiConnectionName Opsional. Mendapatkan atau mengatur nama bagian konfigurasi untuk pengaturan konektivitas layanan AI. Untuk Azure OpenAI: Jika ditentukan, cari nilai "Titik Akhir" dan "Kunci" di bagian konfigurasi ini. Jika tidak ditentukan atau bagian tidak ada, kembali ke variabel lingkungan: AZURE_OPENAI_ENDPOINT dan AZURE_OPENAI_KEY. Untuk autentikasi identitas terkelola yang ditetapkan pengguna, properti ini diperlukan. Untuk layanan OpenAI (non-Azure), atur variabel lingkungan OPENAI_API_KEY.
embeddingsModel Opsional. ID model yang akan digunakan, yang default ke text-embedding-ada-002. Anda tidak boleh mengubah model untuk database yang sudah ada. Untuk informasi selengkapnya, lihat Penggunaan.
maxChunkLength Opsional. Jumlah maksimum karakter yang digunakan untuk memotong input. Untuk informasi selengkapnya, lihat Penggunaan.
maxOverlap Opsional. Mendapatkan atau mengatur jumlah karakter maksimum untuk tumpang tindih di antara gugus.
inputType Opsional. Mendapatkan jenis input.

Lihat Bagian contoh untuk contoh lengkapnya.

Penggunaan

Mengubah penyematan model default mengubah cara penyematan disimpan dalam database vektor. Mengubah model default dapat menyebabkan pencarian mulai salah tingkah ketika mereka tidak cocok dengan data lainnya yang sebelumnya diserap ke dalam database vektor. Model default untuk penyematan adalah text-embedding-ada-002.

Saat menghitung panjang karakter maksimum untuk gugus input, pertimbangkan bahwa token input maksimum yang diizinkan untuk model penyematan input generasi kedua seperti text-embedding-ada-002 .8191 Panjang token tunggal adalah sekitar empat karakter (dalam bahasa Inggris), yang diterjemahkan menjadi sekitar 32.000 karakter input (Inggris) yang dapat masuk ke dalam satu gugus.