Входная привязка Azure OpenAI для Функции Azure

Внимание

Расширение Azure OpenAI для Функции Azure в настоящее время находится в предварительной версии.

Входная привязка Azure OpenAI позволяет создавать внедренные данные для входных данных. Привязка может создавать внедрения из файлов или необработанных текстовых входных данных.

Сведения о настройке и настройке расширения Azure OpenAI см. в Функции Azure расширения Azure OpenAI. Дополнительные сведения об внедрениях в Службе OpenAI Azure см. в статье "Общие сведения о внедрении в Службе OpenAI Azure".

Примечание.

Ссылки и примеры предоставляются только для модели Node.js версии 4.

Примечание.

Ссылки и примеры предоставляются только для модели Python версии 2.

Примечание.

Хотя поддерживаются обе модели процессов 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")
    }
    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 позволяет определить входную привязку внедрения, которая поддерживает следующие параметры:

Элемент Description
name Возвращает или задает имя входной привязки.
input Входная строка, для которой создается внедрение.
model Необязательно. Идентификатор модели, используемой по умолчанию text-embedding-ada-002. Модель для существующей базы данных не следует изменять. Дополнительные сведения см. в разделе "Использование".
maxChunkLength Необязательно. Максимальное количество символов, используемых для блокирования входных данных. Дополнительные сведения см. в разделе "Использование".
maxOverlap Необязательно. Возвращает или задает максимальное количество символов, перекрывающихся между блоками.
inputType Необязательно. Возвращает тип входных данных.

Декораторы

Во время предварительной версии определите входную привязку как привязку generic_input_binding типа embeddings, которая поддерживает следующие параметры: embeddings декоратор поддерживает следующие параметры:

Параметр Описание
arg_name Имя переменной, представляющей параметр привязки.
input Входная строка, для которой создается внедрение.
model Необязательно. Идентификатор модели, используемой по умолчанию text-embedding-ada-002. Модель для существующей базы данных не следует изменять. Дополнительные сведения см. в разделе "Использование".
maxChunkLength Необязательно. Максимальное количество символов, используемых для блокирования входных данных. Дополнительные сведения см. в разделе "Использование".
max_overlap Необязательно. Возвращает или задает максимальное количество символов, перекрывающихся между блоками.
input_type Возвращает тип входных данных.

Настройка

Привязка поддерживает эти свойства конфигурации, заданные в файле function.json.

Свойство Описание
type Этот параметр должен содержать значение EmbeddingsInput.
direction Этот параметр должен содержать значение in.
name Имя входной привязки.
input Входная строка, для которой создается внедрение.
model Необязательно. Идентификатор модели, используемой по умолчанию text-embedding-ada-002. Модель для существующей базы данных не следует изменять. Дополнительные сведения см. в разделе "Использование".
maxChunkLength Необязательно. Максимальное количество символов, используемых для блокирования входных данных. Дополнительные сведения см. в разделе "Использование".
maxOverlap Необязательно. Возвращает или задает максимальное количество символов, перекрывающихся между блоками.
inputType Необязательно. Возвращает тип входных данных.

Настройка

Привязка поддерживает эти свойства, определенные в коде:

Свойство Description
input Входная строка, для которой создается внедрение.
model Необязательно. Идентификатор модели, используемой по умолчанию text-embedding-ada-002. Модель для существующей базы данных не следует изменять. Дополнительные сведения см. в разделе "Использование".
maxChunkLength Необязательно. Максимальное количество символов, используемых для блокирования входных данных. Дополнительные сведения см. в разделе "Использование".
maxOverlap Необязательно. Возвращает или задает максимальное количество символов, перекрывающихся между блоками.
inputType Необязательно. Возвращает тип входных данных.

Подробные примеры см. в разделе Примеры.

Использование

Изменение внедрения по умолчанию изменяет способ хранения внедрения model в векторной базы данных. Изменение модели по умолчанию может привести к неправильному выполнению подстановок, если они не соответствуют остальным данным, которые ранее были приема в векторной базе данных. Модель по умолчанию для внедрения text-embedding-ada-002.

При вычислении максимальной длины символов для входных блоков следует учитывать, что максимальные входные маркеры, разрешенные для входных моделей второго поколения, например text-embedding-ada-002 8191. Один маркер составляет примерно четыре символа (на английском языке), что переводится примерно на 32 000 (английский) символов входных данных, которые могут помещаться в один блок.