يقوم Azure OpenAI بتضمين ربط الإدخال لوظائف Azure

هام

ملحق Azure OpenAI ل Azure Functions قيد المعاينة حاليا.

يسمح لك ربط إدخال تضمينات Azure OpenAI بإنشاء تضمينات للإدخالات. يمكن أن ينشئ الربط تضمينات من الملفات أو مدخلات النص الخام.

للحصول على معلومات حول تفاصيل الإعداد والتكوين لملحق Azure OpenAI، راجع ملحقات Azure OpenAI لوظائف Azure. لمعرفة المزيد حول التضمينات في خدمة Azure OpenAI، راجع فهم التضمينات في خدمة Azure OpenAI.

إشعار

يتم توفير المراجع والأمثلة فقط لنموذج Node.js v4.

إشعار

يتم توفير المراجع والأمثلة فقط لنموذج Python v2.

إشعار

بينما يتم دعم نموذجي عملية C#، يتم توفير أمثلة نموذج عامل معزول فقط.

مثال

يوضح هذا المثال كيفية إنشاء تضمينات لسلسلة نصية خام.

[Function(nameof(GenerateEmbeddings_Http_RequestAsync))]
public async Task GenerateEmbeddings_Http_RequestAsync(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "embeddings")] HttpRequestData req,
    [EmbeddingsInput("{RawText}", InputType.RawText, Model = "%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.
}

يوضح هذا المثال كيفية استرداد التضمينات المخزنة في ملف محدد يمكن الوصول إليه من قبل الدالة.

[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, Model = "%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.
}

يوضح هذا المثال كيفية إنشاء تضمينات لسلسلة نصية خام.

@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, model = "%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.getJSONObject("response")
                    .getJSONArray("data")
                    .getJSONObject(0)
                    .getJSONArray("embedding").length(),
            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();
}

يوضح هذا المثال كيفية استرداد التضمينات المخزنة في ملف محدد يمكن الوصول إليه من قبل الدالة.

@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, model = "%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 file %s.",
            embeddingsContextJsonObject.getJSONObject("response")
                    .getJSONArray("data")
                    .getJSONObject(0)
                    .getJSONArray("embedding").length(),
            request.getBody().getFilePath()));

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

الأمثلة غير متوفرة بعد.

يوضح هذا المثال كيفية إنشاء تضمينات لسلسلة نصية خام.

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

يوضح هذا المثال كيفية استرداد التضمينات المخزنة في ملف محدد يمكن الوصول إليه من قبل الدالة.

const embeddingsFilePathInput = input.generic({
    input: '{FilePath}',
    inputType: 'FilePath',
    type: 'embeddings',
    maxChunkLength: 512,
    model: '%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}
    }

يوضح هذا المثال كيفية إنشاء تضمينات لسلسلة نصية خام.

فيما يلي ملف function.json لإنشاء عمليات التضمين:

{
  "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}",
      "model": "%EMBEDDING_MODEL_DEPLOYMENT_NAME%"
    }
  ]
}

لمزيد من المعلومات حول خصائص الملف function.json ، راجع قسم التكوين .

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

يوضح هذا المثال كيفية إنشاء تضمينات لسلسلة نصية خام.

@app.function_name("GenerateEmbeddingsHttpRequest")
@app.route(route="embeddings", methods=["POST"])
@app.embeddings_input(arg_name="embeddings", input="{rawText}", input_type="rawText", 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"),
        "file_path": user_message.get("FilePath")
    }
    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)

السمات

تطبيق السمة EmbeddingsInput لتعريف ربط إدخال تضمينات، والذي يدعم هذه المعلمات:

المعلمة ‏‏الوصف‬
الادخال سلسلة الإدخال التي سيتم إنشاء تضمينات لها.
النموذج اختياري. معرف النموذج المراد استخدامه، والذي يتم تعيينه افتراضيا إلى text-embedding-ada-002. يجب عدم تغيير النموذج لقاعدة بيانات موجودة. لمزيد من المعلومات، راجع الاستخدام.
MaxChunkLength اختياري. الحد الأقصى لعدد الأحرف المستخدمة لتقسيم الإدخال. لمزيد من المعلومات، راجع الاستخدام.
MaxOverlap اختياري. الحصول على الحد الأقصى لعدد الأحرف أو تعيينه للتداخل بين المجموعات.
InputType اختياري. يحصل على نوع الإدخال.

تعليقات توضيحية

EmbeddingsInput يمكنك التعليق التوضيحي من تحديد ربط إدخال تضمينات، والذي يدعم هذه المعلمات:

العنصر ‏‏الوصف‬
الاسم الحصول على اسم ربط الإدخال أو تعيينه.
إدخال سلسلة الإدخال التي سيتم إنشاء تضمينات لها.
النموذج اختياري. معرف النموذج المراد استخدامه، والذي يتم تعيينه افتراضيا إلى text-embedding-ada-002. يجب عدم تغيير النموذج لقاعدة بيانات موجودة. لمزيد من المعلومات، راجع الاستخدام.
maxChunkLength اختياري. الحد الأقصى لعدد الأحرف المستخدمة لتقسيم الإدخال. لمزيد من المعلومات، راجع الاستخدام.
maxOverlap اختياري. الحصول على الحد الأقصى لعدد الأحرف أو تعيينه للتداخل بين المجموعات.
نوع الإدخال اختياري. يحصل على نوع الإدخال.

الديكور

أثناء المعاينة، حدد ربط الإدخال كربط generic_input_binding من النوع embeddings، والذي يدعم هذه المعلمات: embeddings يدعم مصمم الديكور هذه المعلمات:

المعلمة ‏‏الوصف‬
arg_name اسم المتغير الذي يمثل معلمة الربط.
إدخال سلسلة الإدخال التي سيتم إنشاء تضمينات لها.
النموذج اختياري. معرف النموذج المراد استخدامه، والذي يتم تعيينه افتراضيا إلى text-embedding-ada-002. يجب عدم تغيير النموذج لقاعدة بيانات موجودة. لمزيد من المعلومات، راجع الاستخدام.
maxChunkLength اختياري. الحد الأقصى لعدد الأحرف المستخدمة لتقسيم الإدخال. لمزيد من المعلومات، راجع الاستخدام.
max_overlap اختياري. الحصول على الحد الأقصى لعدد الأحرف أو تعيينه للتداخل بين المجموعات.
input_type يحصل على نوع الإدخال.

التكوين

يدعم الربط خصائص التكوين هذه التي قمت بتعيينها في ملف function.json.

الخاصية الوصف
النوع يجب أن يكونEmbeddingsInput.
الاتجاه يجب أن يكونin.
الاسم اسم ربط الإدخال.
إدخال سلسلة الإدخال التي سيتم إنشاء تضمينات لها.
النموذج اختياري. معرف النموذج المراد استخدامه، والذي يتم تعيينه افتراضيا إلى text-embedding-ada-002. يجب عدم تغيير النموذج لقاعدة بيانات موجودة. لمزيد من المعلومات، راجع الاستخدام.
maxChunkLength اختياري. الحد الأقصى لعدد الأحرف المستخدمة لتقسيم الإدخال. لمزيد من المعلومات، راجع الاستخدام.
maxOverlap اختياري. الحصول على الحد الأقصى لعدد الأحرف أو تعيينه للتداخل بين المجموعات.
نوع الإدخال اختياري. يحصل على نوع الإدخال.

التكوين

يدعم الربط هذه الخصائص، والتي يتم تعريفها في التعليمات البرمجية الخاصة بك:

الخاصية ‏‏الوصف
إدخال سلسلة الإدخال التي سيتم إنشاء تضمينات لها.
النموذج اختياري. معرف النموذج المراد استخدامه، والذي يتم تعيينه افتراضيا إلى text-embedding-ada-002. يجب عدم تغيير النموذج لقاعدة بيانات موجودة. لمزيد من المعلومات، راجع الاستخدام.
maxChunkLength اختياري. الحد الأقصى لعدد الأحرف المستخدمة لتقسيم الإدخال. لمزيد من المعلومات، راجع الاستخدام.
maxOverlap اختياري. الحصول على الحد الأقصى لعدد الأحرف أو تعيينه للتداخل بين المجموعات.
نوع الإدخال اختياري. يحصل على نوع الإدخال.

راجع قسم Example للحصول على أمثلة كاملة.

الاستخدام

يؤدي تغيير التضمينات model الافتراضية إلى تغيير الطريقة التي يتم بها تخزين عمليات التضمين في قاعدة بيانات المتجهات. يمكن أن يؤدي تغيير النموذج الافتراضي إلى بدء عمليات البحث بشكل خاطئ عندما لا تتطابق مع بقية البيانات التي تم تناولها مسبقا في قاعدة بيانات المتجهات. النموذج الافتراضي للتضمينات هو text-embedding-ada-002.

عند حساب الحد الأقصى لطول الأحرف لتقسيمات الإدخال، ضع في اعتبارك أن الحد الأقصى الرموز المميزة للإدخال المسموح به لنماذج تضمين إدخال الجيل الثاني مثل text-embedding-ada-002 .8191 يبلغ طول الرمز المميز الواحد ما يقرب من أربعة أحرف (باللغة الإنجليزية)، والذي يترجم إلى حوالي 32000 حرف (إنجليزي) من الإدخالات التي يمكن أن تتناسب مع جزء واحد.