텍스트 임베딩 가져오기

Vertex AI 텍스트 임베딩 API를 사용하면 Vertex AI의 생성형 AI를 사용해서 텍스트 임베딩을 만들 수 있습니다. 텍스트 임베딩은 단어와 구문 간의 관계를 캡처하는 텍스트의 숫자 표현입니다. 머신러닝 모델, 특히 생성형 AI 모델은 대규모 텍스트 데이터 세트 내에서 패턴을 식별하여 이러한 임베딩을 만드는 데 적합합니다. 애플리케이션에서 텍스트 임베딩을 사용하여 언어를 처리하고 생성하고, 콘텐츠와 관련된 복잡한 의미 및 시맨틱스 관계를 인식할 수 있습니다. Google 검색을 완료하거나 음악 스트리밍 추천을 확인할 때마다 텍스트 임베딩과 상호작용합니다.

텍스트 임베딩의 몇 가지 일반적인 사용 사례는 다음과 같습니다.

  • 시맨틱 검색: 의미론적 유사성에 따라 순위가 지정된 텍스트를 검색합니다.
  • 분류: 해당 텍스트 속성이 지정된 텍스트와 유사한 항목의 클래스를 반환합니다.
  • 클러스터링: 해당 텍스트 속성이 지정된 텍스트와 유사한 항목을 클러스터링합니다.
  • 이상치 감지: 해당 텍스트 속성이 지정된 텍스트와 가장 관련이 없는 항목을 반환합니다.
  • 대화 인터페이스: 대화 수준의 임베딩 공간에서와 같이 비슷한 응답으로 이어질 수 있는 문장 그룹을 클러스터링합니다.

텍스트 임베딩은 텍스트를 벡터라고 부르는 부동 소수점 숫자 배열로 변환하는 방식으로 작동합니다. 이러한 벡터는 텍스트의 의미를 캡처하도록 설계되었습니다. 임베딩 배열의 길이는 벡터의 차원이라고 합니다. 예를 들어 텍스트 문구 한 개를 수백 개의 차원을 포함하는 벡터로 표현할 수 있습니다. 그런 다음 두 텍스트의 벡터 표현 간 숫자 거리를 계산하여 애플리케이션이 객체 간의 유사성을 확인할 수 있습니다.

Vertex AI 텍스트 임베딩 API는 밀집 벡터 표현을 사용합니다. 예를 들어 text-embedding-gecko에서는 768차원 벡터를 사용합니다. 고밀도 벡터 임베딩 모델은 대규모 언어 모델에서 사용되는 것과 비슷한 딥 러닝 방법을 사용합니다. 단어를 숫자에 직접 매핑하는 희소 벡터와 달리 밀집 벡터는 텍스트의 의미를 더 잘 나타내도록 설계되었습니다. 생성형 AI에서 밀집 벡터 임베딩을 사용할 때의 이점은 직접 단어 또는 문법 일치를 검색하는 대신 문구의 언어가 다른 경우에도 쿼리의 의미와 일치하는 문구를 더 효과적으로 검색할 수 있다는 것입니다.

기본 요건

임베딩을 성공적으로 만들기 위한 특정 기본 요건이 있습니다. 시작하려면 빠른 시작: 텍스트 임베딩 사용해 보기를 참조하세요.

이 Colab을 사용하여 새로 출시된 텍스트 임베딩 모델(textembedding-geckotextembedding-gecko-multilingual)을 호출합니다.

Jupyter 노트북: Colab 또는 Jupyter 노트북을 사용하여 텍스트 임베딩 모델을 호출합니다.
Colab에서 실행

사용 사례 예시: 도서 추천 챗봇 개발

도서 추천 챗봇을 개발하려면 가장 먼저 해야 할 일이 심층신경망(DNN)을 통해 각 도서를 임베딩 벡터로 변환하는 것입니다. 여기서 임베딩 벡터 하나는 도서 한 권을 나타냅니다. DNN에 대한 입력으로 도서 제목 또는 텍스트 콘텐츠만 피드할 수 있습니다. 또는 장르와 같이 책을 설명하는 다른 메타데이터와 함께 사용할 수도 있습니다.

이 예시의 임베딩은 줄거리와 장르가 있는 수천 개의 도서 제목으로 구성될 수 있으며, 에밀리 브론테의 폭풍의 언덕 및 제인 오스틴의 설득과 같이 서로 유사한 도서에 대한 표현이 있을 수 있습니다(수치 표현 간의 가까운 거리). 반면 F.스콧 피츠제럴드의 도서 개츠비에 대한 수치 표현은 시대, 장르, 줄거리가 덜 유사하기 때문에 더 거리가 멉니다.

입력은 임베딩 공간의 방향에 가장 큰 영향을 줍니다. 예를 들어 도서 제목 입력만 있는 경우 제목이 비슷하지만 줄거리가 매우 다른 두 도서는 서로 가까워질 수 있습니다. 하지만 제목과 줄거리를 포함하면 이러한 도서는 임베딩 공간에서 유사성이 떨어집니다(더 멀리 떨어져 있음).

생성형 AI를 사용하면 이 도서 추천 챗봇이 쿼리를 기반으로 사용자가 좋아하거나 싫어할 만한 도서를 요약, 추천, 표시할 수 있습니다.

지원되는 모델

사용 가능한 정식 텍스트 임베딩 모델 버전에 대한 자세한 내용은 사용 가능한 정식 모델 버전을 참조하세요. 사용 가능한 최신 텍스트 임베딩 모델 버전에 대해 알아보려면 최신 모델을 참조하세요.

정식 모델 버전을 지정하는 것이 좋습니다(예: textembedding-gecko@003). 모델의 최신 버전은 미리보기에 있으며 정식 버전(GA)이 아닙니다. 최신 버전이 미리보기 상태이므로 프로덕션 사용이 보장되지 않습니다.

하위 호환되는 임베딩이 필요한 애플리케이션에 정식 모델 버전(예: textembedding-gecko@003)을 사용하는 것이 특히 중요합니다. 이전 버전과의 호환성이 문제가 되지 않고 최신 모델 버전을 사용하려면 @latest를 명시적으로 지정해야 합니다. 지정된 버전이 없으면 textembedding-gecko의 기본값은 textembedding-gecko@003이고 textembedding-gecko-multilingual의 기본값은 textembedding-gecko-multilingual@001입니다.

최신 모델

미리보기에는 두 가지 모델을 사용할 수 있습니다.

  • text-embedding-preview-0409
  • text-multilingual-embedding-preview-0409

이러한 모델은 검색 및 분류와 같은 다양한 다운스트림 태스크를 다루는 설정된 벤치마크에서 이전 모델보다 향상됩니다. 자세한 내용은 Gecko: 대규모 언어 모델에서 정제된 다양한 텍스트 임베딩을 참조하세요.

이러한 모델은 각각 textembedding-gecko@003textembedding-gecko-multilingual@001 모델보다 우수한 임베딩 품질을 제공합니다. 이러한 모델은 model-name@version 이름 지정 규칙에서 벗어납니다. '@version' 서픽스 없이 이러한 모델을 지정합니다. 예를 들면 다음과 같습니다.

curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT/locations/us-central1/publishers/google/models/text-embedding-preview-0409:predict -d $'{
  "instances": [
    { "content": "What is life?"}
  ],
}'

새 모델에서는 품질 개선 외에도 다음 기능이 지원됩니다.

  • 새 매개변수 outputDimensionality가 지원됩니다. 이 매개변수를 사용하면 스토리지 최적화 등을 위해 임베딩 크기를 줄일 수 있습니다.

    • QUESTION_ANSWERING
    • FACT_VERIFICATION

    두 가지 새로운 작업 유형이 지원됩니다. 더 많은 태스크 유형을 보려면 모델 참조를 확인하세요.

다음 예시는 새로운 기능을 보여줍니다.

curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT/locations/us-central1/publishers/google/models/text-embedding-preview-0409:predict -d $'{
  "instances": [
    {
      "task_type": "QUESTION_ANSWERING",
      "content": "What is life?"
    }
  ],
"parameters": {
    "outputDimensionality": 256
  }
}'

이러한 모델을 사용할 때 다음 제한사항이 적용됩니다.

  • 미션 크리티컬 시스템이나 프로덕션 시스템에서는 이러한 미리보기 모델을 사용하지 마세요.
  • 이 모델은 us-central1에서만 사용할 수 있습니다.
  • 일괄 예측은 지원되지 않습니다.
  • 맞춤설정이 지원되지 않습니다.

텍스트 스니펫의 텍스트 임베딩 가져오기

Vertex AI API 또는 Python용 Vertex AI SDK를 사용하여 텍스트 스니펫의 텍스트 임베딩을 가져올 수 있습니다. 요청마다 us-central1의 입력 텍스트가 250개로 제한되며 다른 리전에서는 최대 입력 텍스트가 5개입니다. 각 입력 텍스트의 토큰 한도는 3,072입니다. 이 길이보다 긴 입력은 자동으로 잘립니다. autoTruncatefalse로 설정하여 자동 잘림을 사용 중지할 수도 있습니다.

이 예시에서는 textembedding-gecko@003 모델을 사용합니다.

REST

텍스트 임베딩을 가져오려면 게시자 모델의 모델 ID를 지정하여 POST 요청을 전송합니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID
  • TEXT: 임베딩을 생성하려는 텍스트입니다. 한도: 텍스트당 최대 3,072개의 토큰으로 구성된 텍스트 5개입니다.
  • AUTO_TRUNCATE: false로 설정하면 토큰 한도를 초과하는 텍스트로 인해 요청이 실패합니다. 기본값은 true입니다.

HTTP 메서드 및 URL:

POST https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/textembedding-gecko@003:predict

JSON 요청 본문:

{
  "instances": [
    { "content": "TEXT"}
  ],
  "parameters": {
    "autoTruncate": AUTO_TRUNCATE
  }
}

요청을 보내려면 다음 옵션 중 하나를 선택합니다.

curl

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/textembedding-gecko@003:predict"

PowerShell

요청 본문을 request.json 파일에 저장하고 다음 명령어를 실행합니다.

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/textembedding-gecko@003:predict" | Select-Object -Expand Content

다음과 비슷한 JSON 응답이 수신됩니다. values는 공간 절약을 위해 잘렸습니다.

curl 명령어 예시

MODEL_ID="textembedding-gecko@003"
PROJECT_ID=PROJECT_ID

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/publishers/google/models/${MODEL_ID}:predict -d \
$'{
  "instances": [
    { "content": "What is life?"}
  ],
}'

Python

Python을 설치하거나 업데이트하는 방법은 Python용 Vertex AI SDK 설치를 참조하세요. 자세한 내용은 Python API 참고 문서를 참조하세요.

from typing import List

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

def embed_text(
    texts: List[str] = ["banana muffins? ", "banana bread? banana muffins?"],
    task: str = "RETRIEVAL_DOCUMENT",
    model_name: str = "textembedding-gecko@003",
) -> List[List[float]]:
    """Embeds texts with a pre-trained, foundational model."""
    model = TextEmbeddingModel.from_pretrained(model_name)
    inputs = [TextEmbeddingInput(text, task) for text in texts]
    embeddings = model.get_embeddings(inputs)
    return [embedding.values for embedding in embeddings]

Go

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작: 클라이언트 라이브러리 사용Go 설정 안내를 따르세요. 자세한 내용은 Vertex AI Go API 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

import (
	"context"
	"fmt"
	"io"

	aiplatform "cloud.google.com/go/aiplatform/apiv1beta1"
	"cloud.google.com/go/aiplatform/apiv1beta1/aiplatformpb"
	"google.golang.org/api/option"
	"google.golang.org/protobuf/types/known/structpb"
)

// generateEmbeddings creates embeddings from text provided.
func generateEmbeddings(w io.Writer, prompt, project, location, publisher, model string) error {
	ctx := context.Background()

	apiEndpoint := fmt.Sprintf("%s-aiplatform.googleapis.com:443", location)

	client, err := aiplatform.NewPredictionClient(ctx, option.WithEndpoint(apiEndpoint))
	if err != nil {
		fmt.Fprintf(w, "unable to create prediction client: %v", err)
		return err
	}
	defer client.Close()

	// PredictRequest requires an endpoint, instances, and parameters
	// Endpoint
	base := fmt.Sprintf("projects/%s/locations/%s/publishers/%s/models", project, location, publisher)
	url := fmt.Sprintf("%s/%s", base, model)

	// Instances: the prompt
	promptValue, err := structpb.NewValue(map[string]interface{}{
		"content": prompt,
	})
	if err != nil {
		fmt.Fprintf(w, "unable to convert prompt to Value: %v", err)
		return err
	}

	// PredictRequest: create the model prediction request
	req := &aiplatformpb.PredictRequest{
		Endpoint:  url,
		Instances: []*structpb.Value{promptValue},
	}

	// PredictResponse: receive the response from the model
	resp, err := client.Predict(ctx, req)
	if err != nil {
		fmt.Fprintf(w, "error in prediction: %v", err)
		return err
	}

	fmt.Fprintf(w, "embeddings generated: %v", resp.Predictions[0])
	return nil
}

Java

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작: 클라이언트 라이브러리 사용Java 설정 안내를 따르세요. 자세한 내용은 Vertex AI Java API 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

import static java.util.stream.Collectors.toList;

import com.google.cloud.aiplatform.v1beta1.EndpointName;
import com.google.cloud.aiplatform.v1beta1.PredictRequest;
import com.google.cloud.aiplatform.v1beta1.PredictResponse;
import com.google.cloud.aiplatform.v1beta1.PredictionServiceClient;
import com.google.cloud.aiplatform.v1beta1.PredictionServiceSettings;
import com.google.protobuf.Struct;
import com.google.protobuf.Value;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PredictTextEmbeddingsSample {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    // Details about text embedding request structure and supported models are available in:
    // https://cloud.google.com/vertex-ai/docs/generative-ai/embeddings/get-text-embeddings
    String endpoint = "us-central1-aiplatform.googleapis.com:443";
    String project = "YOUR_PROJECT_ID";
    String model = "textembedding-gecko@003";
    predictTextEmbeddings(
        endpoint,
        project,
        model,
        List.of("banana bread?", "banana muffins?"),
        "RETRIEVAL_DOCUMENT");
  }

  // Gets text embeddings from a pretrained, foundational model.
  public static List<List<Float>> predictTextEmbeddings(
      String endpoint, String project, String model, List<String> texts, String task)
      throws IOException {
    PredictionServiceSettings settings =
        PredictionServiceSettings.newBuilder().setEndpoint(endpoint).build();
    Matcher matcher = Pattern.compile("^(?<Location>\\w+-\\w+)").matcher(endpoint);
    String location = matcher.matches() ? matcher.group("Location") : "us-central1";
    EndpointName endpointName =
        EndpointName.ofProjectLocationPublisherModelName(project, location, "google", model);

    // You can use this prediction service client for multiple requests.
    try (PredictionServiceClient client = PredictionServiceClient.create(settings)) {
      PredictRequest.Builder request =
          PredictRequest.newBuilder().setEndpoint(endpointName.toString());
      for (int i = 0; i < texts.size(); i++) {
        request.addInstances(
            Value.newBuilder()
                .setStructValue(
                    Struct.newBuilder()
                        .putFields("content", valueOf(texts.get(i)))
                        .putFields("taskType", valueOf(task))
                        .build()));
      }
      PredictResponse response = client.predict(request.build());
      List<List<Float>> floats = new ArrayList<>();
      for (Value prediction : response.getPredictionsList()) {
        Value embeddings = prediction.getStructValue().getFieldsOrThrow("embeddings");
        Value values = embeddings.getStructValue().getFieldsOrThrow("values");
        floats.add(
            values.getListValue().getValuesList().stream()
                .map(Value::getNumberValue)
                .map(Double::floatValue)
                .collect(toList()));
      }
      return floats;
    }
  }

  private static Value valueOf(String s) {
    return Value.newBuilder().setStringValue(s).build();
  }
}

Node.js

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작: 클라이언트 라이브러리 사용Node.js 설정 안내를 따르세요. 자세한 내용은 Vertex AI Node.js API 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

async function main(
  project,
  model = 'textembedding-gecko@003',
  texts = 'banana bread?;banana muffins?',
  task = 'RETRIEVAL_DOCUMENT',
  apiEndpoint = 'us-central1-aiplatform.googleapis.com'
) {
  const aiplatform = require('@google-cloud/aiplatform');
  const {PredictionServiceClient} = aiplatform.v1;
  const {helpers} = aiplatform; // helps construct protobuf.Value objects.
  const clientOptions = {apiEndpoint: apiEndpoint};
  const match = apiEndpoint.match(/(?<Location>\w+-\w+)/);
  const location = match ? match.groups.Location : 'us-centra11';
  const endpoint = `projects/${project}/locations/${location}/publishers/google/models/${model}`;

  async function callPredict() {
    const instances = texts
      .split(';')
      .map(e => helpers.toValue({content: e, taskType: task}));
    const request = {endpoint, instances};
    const client = new PredictionServiceClient(clientOptions);
    const [response] = await client.predict(request);
    console.log('Got predict response');
    const predictions = response.predictions;
    for (const prediction of predictions) {
      const embeddings = prediction.structValue.fields.embeddings;
      const values = embeddings.structValue.fields.values.listValue.values;
      console.log('Got prediction: ' + JSON.stringify(values));
    }
  }

  callPredict();
}

벡터 데이터베이스에 임베딩 추가

임베딩을 생성했으면 벡터 검색과 같은 벡터 데이터베이스에 임베딩을 추가할 수 있습니다. 이렇게 하면 지연 시간이 짧은 검색이 가능하며, 데이터 크기가 커질수록 매우 중요합니다.

벡터 검색에 대한 자세한 내용은 벡터 검색 개요를 참조하세요.

2023년 8월 이후 출시된 모델에 대한 API 변경사항

textembedding-gecko@003textembedding-gecko-multilingual@001을 포함하여 2023년 8월 이후에 출시된 모델 버전을 사용하는 경우 새로운 태스크 유형 매개변수와 선택적 제목(task_type=RETRIEVAL_DOCUMENT에서만 유효)이 있습니다.

이러한 새 매개변수는 앞으로 이러한 공개 미리보기 모델과 모든 정식 모델에 적용됩니다.

{
  "instances": [
    {
      "task_type": "RETRIEVAL_DOCUMENT",
      "title": "document title",
      "content": "I would like embeddings for this text!"
    },
  ]
}

task_type 매개변수는 모델이 더 나은 품질의 임베딩을 생성할 수 있도록 의도된 다운스트림 애플리케이션으로 정의됩니다. 다음 값 중 하나를 사용할 수 있는 문자열입니다.

task_type 설명
RETRIEVAL_QUERY 지정된 텍스트가 검색 또는 가져오기 설정의 쿼리임을 지정합니다.
RETRIEVAL_DOCUMENT 지정된 텍스트가 검색 또는 가져오기 설정의 문서임을 지정합니다.
SEMANTIC_SIMILARITY 지정된 텍스트를 시맨틱 텍스트 유사성(STS)에 사용하도록 지정합니다.
CLASSIFICATION 분류에 임베딩을 사용하도록 지정합니다.
CLUSTERING 클러스터링에 임베딩을 사용하도록 지정합니다.
QUESTION_ANSWERING 질문에 답변하는 데 쿼리 임베딩을 사용하도록 지정합니다. 문서에는 RETRIEVAL_DOCUMENT를 사용합니다.
FACT_VERIFICATION 사실 확인에 쿼리 임베딩을 사용하도록 지정합니다.

textembedding-gecko-multilingual 모델의 언어 범위입니다.

textembedding-gecko-multilingual@001 모델은 다음 언어로 평가되었습니다. Arabic (ar), Bengali (bn), English (en), Spanish (es), German (de), Persian (fa), Finnish (fi), French (fr), Hindi (hi), Indonesian (id), Japanese (ja), Korean (ko), Russian (ru), Swahili (sw), Telugu (te), Thai (th), Yoruba (yo), Chinese (zh).

다음은 지원되는 언어의 전체 목록입니다. Afrikaans, Albanian, Amharic, Arabic, Armenian, Azerbaijani, Basque, Belarusian, Bengali, Bulgarian, Burmese, Catalan, Cebuano, Chichewa, Chinese, Corsican, Czech, Danish, Dutch, English, Esperanto, Estonian, Filipino, Finnish, French, Galician, Georgian, German, Greek, Gujarati, Haitian Creole, Hausa, Hawaiian, Hebrew, Hindi, Hmong, Hungarian, Icelandic, Igbo, Indonesian, Irish, Italian, Japanese, Javanese, Kannada, Kazakh, Khmer, Korean, Kurdish, Kyrgyz, Lao, Latin, Latvian, Lithuanian, Luxembourgish, Macedonian, Malagasy, Malay, Malayalam, Maltese, Maori, Marathi, Mongolian, Nepali, Norwegian, Pashto, Persian, Polish, Portuguese, Punjabi, Romanian, Russian, Samoan, Scottish Gaelic, Serbian, Shona, Sindhi, Sinhala, Slovak, Slovenian, Somali, Sotho, Spanish, Sundanese, Swahili, Swedish, Tajik, Tamil, Telugu, Thai, Turkish, Ukrainian, Urdu, Uzbek, Vietnamese, Welsh, West Frisian, Xhosa, Yiddish, Yoruba, Zulu.

다음 단계