다음을 통해 공유


Azure Functions에 대한 Azure OpenAI 임베딩 입력 바인딩

Important

Azure Functions용 Azure OpenAI 확장은 현재 미리 보기 상태입니다.

Azure OpenAI 임베딩 입력 바인딩을 사용하면 입력에 대한 임베딩을 생성할 수 있습니다. 바인딩은 파일 또는 원시 텍스트 입력에서 임베딩을 생성할 수 있습니다.

Azure OpenAI 확장의 설정 및 구성 세부 정보에 대한 자세한 내용은 Azure Functions용 Azure OpenAI 확장을 참조하세요. Azure OpenAI Service의 포함에 대한 자세한 내용은 Azure OpenAI Service의 포함 이해를 참조하세요.

참고 항목

참조 및 예는 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")
    }
    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 특성을 적용하여 다음 매개 변수를 지원하는 임베딩 입력 바인딩을 정의합니다.

매개 변수 설명
Input 임베딩을 생성할 입력 문자열입니다.
모델 선택 사항. 사용할 모델의 ID이며, 기본값은 text-embedding-ada-002입니다. 기존 데이터베이스에 대한 모델을 변경해서는 안 됩니다. 자세한 내용은 사용량을 참조하세요.
MaxChunkLength 선택 사항. 입력을 청크하는 데 사용되는 최대 문자 수입니다. 자세한 내용은 사용량을 참조하세요.
MaxOverlap 선택 사항. 청크 간에 겹치는 최대 문자 수를 가져오거나 설정합니다.
InputType 선택 사항. 입력의 형식을 가져옵니다.

주석

EmbeddingsInput 주석을 사용하면 다음 매개 변수를 지원하는 임베딩 입력 바인딩을 정의할 수 있습니다.

요소 설명
이름 입력 바인딩의 이름을 가져오거나 설정합니다.
input 임베딩을 생성할 입력 문자열입니다.
model 선택 사항. 사용할 모델의 ID이며, 기본값은 text-embedding-ada-002입니다. 기존 데이터베이스에 대한 모델을 변경해서는 안 됩니다. 자세한 내용은 사용량을 참조하세요.
maxChunkLength 선택 사항. 입력을 청크하는 데 사용되는 최대 문자 수입니다. 자세한 내용은 사용량을 참조하세요.
maxOverlap 선택 사항. 청크 간에 겹치는 최대 문자 수를 가져오거나 설정합니다.
inputType 선택 사항. 입력의 형식을 가져옵니다.

데코레이터

미리 보기 중에 입력 바인딩을 다음 매개 변수를 지원하는 embeddings 형식의 generic_input_binding 바인딩으로 정의합니다. embeddings 데코레이터는 다음 매개 변수를 지원합니다.

매개 변수 설명
arg_name 바인딩 매개 변수를 나타내는 변수의 이름입니다.
input 임베딩을 생성할 입력 문자열입니다.
model 선택 사항. 사용할 모델의 ID이며, 기본값은 text-embedding-ada-002입니다. 기존 데이터베이스에 대한 모델을 변경해서는 안 됩니다. 자세한 내용은 사용량을 참조하세요.
maxChunkLength 선택 사항. 입력을 청크하는 데 사용되는 최대 문자 수입니다. 자세한 내용은 사용량을 참조하세요.
max_overlap 선택 사항. 청크 간에 겹치는 최대 문자 수를 가져오거나 설정합니다.
input_type 입력의 형식을 가져옵니다.

구성

바인딩은 function.json 파일에 설정한 이러한 구성 속성을 지원합니다.

속성 설명
type EmbeddingsInput이어야 합니다.
direction in이어야 합니다.
이름 입력 바인딩의 이름입니다.
input 임베딩을 생성할 입력 문자열입니다.
model 선택 사항. 사용할 모델의 ID이며, 기본값은 text-embedding-ada-002입니다. 기존 데이터베이스에 대한 모델을 변경해서는 안 됩니다. 자세한 내용은 사용량을 참조하세요.
maxChunkLength 선택 사항. 입력을 청크하는 데 사용되는 최대 문자 수입니다. 자세한 내용은 사용량을 참조하세요.
maxOverlap 선택 사항. 청크 간에 겹치는 최대 문자 수를 가져오거나 설정합니다.
inputType 선택 사항. 입력의 형식을 가져옵니다.

구성

바인딩은 코드에 정의된 다음 속성을 지원합니다.

속성 설명
input 임베딩을 생성할 입력 문자열입니다.
model 선택 사항. 사용할 모델의 ID이며, 기본값은 text-embedding-ada-002입니다. 기존 데이터베이스에 대한 모델을 변경해서는 안 됩니다. 자세한 내용은 사용량을 참조하세요.
maxChunkLength 선택 사항. 입력을 청크하는 데 사용되는 최대 문자 수입니다. 자세한 내용은 사용량을 참조하세요.
maxOverlap 선택 사항. 청크 간에 겹치는 최대 문자 수를 가져오거나 설정합니다.
inputType 선택 사항. 입력의 형식을 가져옵니다.

전체 예제는 예제 섹션을 참조하세요.

사용

기본 임베딩 model을 변경하면 임베딩이 벡터 데이터베이스에 저장되는 방식을 변경합니다. 기본 모델을 변경하면 이전에 벡터 데이터베이스에 수집된 나머지 데이터와 일치하지 않을 때 조회가 잘못된 동작을 시작할 수 있습니다. 임베딩의 기본 모델은 text-embedding-ada-002입니다.

입력 청크의 최대 문자 길이를 계산할 때는 text-embedding-ada-002와 같은 2세대 입력 임베딩 모델에 허용되는 최대 입력 토큰이 8191입니다. 단일 토큰은 약 4자 길이(영어)로, 단일 청크에 들어갈 수 있는 약 32,000자(영어) 입력 문자로 변환됩니다.