For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
기본 탐색 메뉴
Theme

벡터 임베딩

텍스트를 숫자로 변환해 검색 등에 활용하는 방법을 알아보세요.

New embedding models
text-embedding-3-small and text-embedding-3-large, our newest and most performant embedding models, are now available. They feature lower costs, higher multilingual performance, and new parameters to control the overall size.

임베딩이란?

OpenAI의 텍스트 임베딩은 문자열 간의 관련성을 측정합니다. 임베딩은 주로 다음과 같은 작업에 사용합니다.

  • 검색 (검색어와의 관련성이 높은 순서로 결과를 정렬합니다)
  • 군집화 (유사한 문자열을 그룹으로 묶습니다)
  • 추천 (서로 관련 있는 문자열을 포함한 항목을 추천합니다)
  • 이상 탐지 (다른 항목과 관련성이 낮은 이상치를 찾습니다)
  • 다양성 측정 (유사도의 분포를 분석합니다)
  • 분류 (각 문자열에 가장 유사한 레이블을 부여합니다)

임베딩은 부동 소수점 수로 이루어진 벡터(리스트)입니다. 두 벡터 사이의 거리로 관련성을 측정합니다. 거리가 가까울수록 관련성이 높고, 멀수록 관련성이 낮다고 볼 수 있습니다.

임베딩 요금은 요금 페이지에서 확인하세요. 요청 요금은 토큰 수를 기준으로 계산하며, 입력에 포함된 토큰을 집계합니다.

임베딩 얻기

임베딩을 얻으려면 임베딩 API 엔드포인트에 텍스트 문자열과 임베딩 모델 이름(예: text-embedding-3-small)을 함께 보내세요.

예제: 임베딩 얻기
import OpenAI from "openai";
const openai = new OpenAI();

const embedding = await openai.embeddings.create({
  model: "text-embedding-3-small",
  input: "Your text string goes here",
  encoding_format: "float",
});

console.log(embedding);

응답에는 임베딩 벡터(부동 소수점 수 리스트)와 추가 메타데이터가 포함됩니다. 임베딩 벡터를 추출해 벡터 데이터베이스에 저장하고 다양한 작업에 활용할 수 있습니다.

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [
        -0.006929283495992422, -0.005336422007530928, -4.547132266452536e-5,
        -0.024047505110502243
      ]
    }
  ],
  "model": "text-embedding-3-small",
  "usage": {
    "prompt_tokens": 5,
    "total_tokens": 5
  }
}

임베딩 벡터의 기본 길이는 1536(text-embedding-3-small) 또는 3072(text-embedding-3-large)입니다. 임베딩이 개념을 표현하는 능력을 유지하면서 차원 수를 줄이려면 dimensions 매개변수를 전달하세요. 임베딩 차원에 대한 자세한 내용은 임베딩 활용 사례를 참고하세요.

임베딩 모델

OpenAI는 성능이 뛰어난 3세대 임베딩 모델 두 가지를 제공합니다. 모델 ID의 -3이 3세대를 나타냅니다. 자세한 내용은 3세대 임베딩 모델 출시 안내 글을 참고하세요.

요금은 입력 토큰당 부과됩니다. 아래 표는 페이지당 약 800토큰을 기준으로 미화 1달러로 처리할 수 있는 텍스트 분량을 보여 줍니다.

모델 1달러당 페이지 수(근사치) MTEB 평가 성능 최대 입력 토큰 수
text-embedding-3-small 62,500 62.3% 8192
text-embedding-3-large 9,615 64.6% 8192
text-embedding-ada-002 12,500 61.0% 8192

활용 사례

Amazon 식품 리뷰 데이터셋을 사용해 대표적인 활용 사례를 살펴봅니다.

리뷰 임베딩 얻기

이 데이터셋에는 2012년 10월까지 Amazon 사용자가 작성한 식품 리뷰 568,454개가 들어 있습니다. 예제에서는 이 중 가장 최근 리뷰 1,000개를 사용합니다. 리뷰는 영어로 작성되었으며 대체로 긍정적이거나 부정적인 의견을 담고 있습니다. 각 리뷰에는 ProductId, UserId, Score, 리뷰 제목(Summary), 리뷰 본문(Text)이 있습니다. 예시는 다음과 같습니다.

제품 ID 사용자 ID 평점 제목 본문
B001E4KFG0 A3SGXH7AUHU8GW 5 Good Quality Dog Food I have bought several of the Vitality canned…
B00813GRG4 A1D87F6ZCVE5NK 1 Not as Advertised Product arrived labeled as Jumbo Salted Peanut…

아래에서는 리뷰 제목과 본문을 하나의 텍스트로 합칩니다. 모델은 이 텍스트를 인코딩해 임베딩 벡터 하나를 출력합니다.

Get_embeddings_from_dataset.ipynb
import { mkdir, writeFile } from "node:fs/promises";
import OpenAI from "openai";

const client = new OpenAI();
const reviews = ["A rich cup of coffee.", "A bright herbal tea."];

const response = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: reviews.map((review) => review.replaceAll("\n", " ")),
});

const csvField = (value) => `"${value.replaceAll('"', '""')}"`;
const rows = response.data.map(({ embedding }, index) =>
  [csvField(reviews[index]), csvField(JSON.stringify(embedding))].join(",")
);

await mkdir("output", { recursive: true });
await writeFile(
  "output/embedded_1k_reviews.csv",
  ["combined,ada_embedding", ...rows].join("\n") + "\n"
);

저장된 파일에서 데이터를 불러오려면 다음 코드를 실행하세요.

from ast import literal_eval
import pandas as pd

df = pd.read_csv("output/embedded_1k_reviews.csv")
df["ada_embedding"] = df.ada_embedding.apply(literal_eval).apply(np.array)

자주 묻는 질문

임베딩을 생성하기 전에 문자열의 토큰 수를 어떻게 확인하나요?

Python에서는 OpenAI의 토크나이저 tiktoken으로 문자열을 토큰으로 나눌 수 있습니다.

예제 코드는 다음과 같습니다.

import tiktoken


def num_tokens_from_string(string: str, encoding_name: str) -> int:
    """Returns the number of tokens in a text string."""
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens


num_tokens_from_string("tiktoken is great!", "cl100k_base")

text-embedding-3-small과 같은 3세대 임베딩 모델에는 cl100k_base 인코딩을 사용하세요.

자세한 내용과 예제 코드는 OpenAI Cookbook의 tiktoken으로 토큰 수 계산하기를 참고하세요.

가장 가까운 임베딩 벡터 K개를 빠르게 찾으려면 어떻게 해야 하나요?

많은 벡터를 빠르게 검색하려면 벡터 데이터베이스 사용을 권장합니다. 벡터 데이터베이스와 OpenAI API를 함께 사용하는 예제는 GitHub의 OpenAI Cookbook에서 확인할 수 있습니다.

어떤 거리 함수를 사용해야 하나요?

코사인 유사도를 권장합니다. 일반적으로 어떤 거리 함수를 선택하느냐에 따른 차이는 크지 않습니다.

OpenAI 임베딩은 벡터의 길이가 1이 되도록 정규화되어 있어 다음과 같은 특성이 있습니다.

  • 내적만으로 코사인 유사도를 구할 수 있어 계산이 조금 더 빠릅니다.
  • 코사인 유사도로 순위를 매기든 유클리드 거리로 순위를 매기든 결과는 같습니다.

임베딩을 온라인에서 공유해도 되나요?

네. 고객은 OpenAI 모델에 제공한 입력과 모델에서 얻은 출력을 소유하며, 이는 임베딩에도 적용됩니다. OpenAI API에 입력하는 콘텐츠가 관련 법률이나 OpenAI 이용약관을 위반하지 않도록 할 책임은 고객에게 있습니다.

3세대 임베딩 모델은 최근 사건에 대해 알고 있나요?

아니요. text-embedding-3-large와 text-embedding-3-small 모델은 2021년 9월 이후에 발생한 사건에 대한 지식이 없습니다. 일반적으로 텍스트 생성 모델에서만큼 큰 제약은 아니지만, 일부 예외적인 상황에서는 성능이 떨어질 수 있습니다.