임베딩

임베딩 (Embeddings)

텍스트 임베딩은 텍스트의 수치 표현으로, 의미적 유사성을 측정할 수 있게 해 줘요. 이 가이드는 임베딩을 소개하고, 활용 사례를 다루며, 검색·추천·이상 탐지 같은 작업에 임베딩 모델을 사용하는 방법을 설명해요. Anthropic은 자체 임베딩 모델을 제공하지 않지만, 다양한 옵션을 가진 Voyage AI를 추천해요.

출처: 문서

본문

임베딩 구현 전에 (Before implementing embeddings)

임베딩 제공자를 선택할 때, 당신의 필요와 선호에 따라 고려할 수 있는 몇 가지 요소가 있어요:

  • 데이터셋 크기 및 도메인 특이성: 모델 훈련 데이터셋의 크기와 임베딩하려는 도메인과의 관련성. 더 크거나 더 도메인 특화된 데이터는 일반적으로 더 나은 인도메인 임베딩을 만들어요.
  • 추론 성능: 임베딩 조회 속도와 종단 간 지연 시간. 대규모 프로덕션 배포에서 특히 중요한 고려 사항이에요.
  • 맞춤화: 사적 데이터에서 계속 훈련하거나 매우 특정한 도메인을 위한 모델 전문화 옵션. 독특한 어휘에서 성능을 향상시킬 수 있어요.

Anthropic으로 임베딩을 얻는 방법 (How to get embeddings with Anthropic)

Anthropic은 자체 임베딩 모델을 제공하지 않아요. 위의 모든 고려 사항을 아우르는 광범위한 옵션과 능력을 가진 임베딩 제공자 중 하나가 Voyage AI예요.

Voyage AI는 최첨단 임베딩 모델을 만들고, 금융·헬스케어 같은 특정 산업 도메인을 위한 맞춤 모델이나 개별 고객을 위한 주문제작 파인튜닝 모델을 제공해요.

이 가이드의 나머지는 Voyage AI에 관한 것이지만, 특정 사용 사례에 가장 잘 맞는지 여러 임베딩 공급업체를 평가해 보세요.

사용 가능한 모델 (Available models)

Voyage는 다음 텍스트 임베딩 모델을 추천해요:

Voyage 4 (최신 세대)

모델 컨텍스트 길이 임베딩 차원 설명
voyage-4-large 32,000 1024 (기본), 256, 512, 2048 최고의 범용 및 다국어 검색 품질. 자세한 내용은 Voyage 4 블로그 글 참고.
voyage-4 32,000 1024 (기본), 256, 512, 2048 범용 및 다국어 검색 품질에 최적화. 품질과 효율성의 균형. Voyage 4 블로그 글 참고.
voyage-4-lite 32,000 1024 (기본), 256, 512, 2048 지연 시간과 비용에 최적화. Voyage 4 블로그 글 참고.
voyage-4-nano 32,000 1024 (기본), 256, 512, 2048 Hugging Face에서 제공되는 오픈웨이트 모델(Apache 2.0 라이선스). Voyage 4 블로그 글 참고.

이전 세대

모델 컨텍스트 길이 임베딩 차원 설명
voyage-3-large 32,000 1024 (기본), 256, 512, 2048 최고의 범용 및 다국어 검색 품질. voyage-3-large 블로그 글 참고.
voyage-3.5 32,000 1024 (기본), 256, 512, 2048 범용 및 다국어 검색 품질에 최적화. voyage-3.5 블로그 글 참고.
voyage-3.5-lite 32,000 1024 (기본), 256, 512, 2048 지연 시간과 비용에 최적화. voyage-3.5 블로그 글 참고.
voyage-code-3 32,000 1024 (기본), 256, 512, 2048 코드 검색에 최적화. voyage-code-3 블로그 글 참고.
voyage-finance-2 32,000 1024 금융 검색과 RAG에 최적화. voyage-finance-2 블로그 글 참고.
voyage-law-2 16,000 1024 법률긴 컨텍스트 검색과 RAG에 최적화. 모든 도메인에서 성능도 개선. voyage-law-2 블로그 글 참고.

또한 Voyage는 다음 멀티모달 임베딩 모델을 추천해요:

모델 컨텍스트 길이 임베딩 차원 설명
voyage-multimodal-3.5 32,000 1024 (기본), 256, 512, 2048 텍스트, 이미지, 비디오를 인터리브한 것을 벡터화할 수 있는 풍부한 멀티모달 임베딩 모델. 최초의 프로덕션급 비디오 임베딩 모델로 비디오 지원 포함. voyage-multimodal-3.5 블로그 글 참고.
voyage-multimodal-3 32,000 1024 텍스트와 콘텐츠가 풍부한 이미지(PDF, 슬라이드, 표, 그림 등의 스크린샷)를 벡터화할 수 있는 풍부한 멀티모달 임베딩 모델. voyage-multimodal-3 블로그 글 참고.

다음 컨텍스트화된 청크 임베딩 모델은 수동 메타데이터 보강 없이 전체 문서 컨텍스트를 포착하는 청크 수준 벡터를 만들어요. 이 모델들은 embed() 대신 contextualized_embed()로 호출하세요:

모델 컨텍스트 길이 임베딩 차원 설명
voyage-context-4 120,000 1024 (기본), 256, 512, 2048 범용 및 다국어 검색 품질에 최적화된 컨텍스트화된 청크 임베딩. voyage-context-4 블로그 글 참고.
voyage-context-3 120,000 1024 (기본), 256, 512, 2048 범용 및 다국어 검색 품질에 최적화된 컨텍스트화된 청크 임베딩. voyage-context-3 블로그 글 참고.

Voyage AI는 또한 리랭커(reranker)를 제공해요. 질의와 문서 목록을 받아 질의에 대한 관련성 순으로 반환해요. 이 모델들은 rerank()로 호출하세요:

모델 컨텍스트 길이 설명
rerank-2.5 32,000 최고 정확도. 대부분 애플리케이션에 권장. rerank-2.5 블로그 글 참고.
rerank-2.5-lite 32,000 지연 시간과 비용에 최적화. rerank-2.5 블로그 글 참고.

어떤 텍스트 임베딩 모델을 쓸지 결정하는 데 도움이 필요하면 Voyage AI FAQ를 확인하세요.

Voyage AI 시작하기 (Getting started with Voyage AI)

Voyage 임베딩에 접근하려면:

  1. Voyage AI 웹사이트에 가입하세요.
  2. API 키를 얻으세요.
  3. 편의를 위해 API 키를 환경 변수로 설정하세요:
export VOYAGE_API_KEY="<your secret key>"

공식 voyageai Python 패키지 또는 HTTP 요청을 통해 임베딩을 얻을 수 있어요. 다음 섹션에서 설명해요.

Voyage Python 라이브러리

다음 명령으로 voyageai 패키지를 설치하세요:

pip install -U voyageai

그런 다음 클라이언트 객체를 만들고 텍스트를 임베딩하는 데 사용할 수 있어요:

import voyageai

vo = voyageai.Client()
# This will automatically use the environment variable VOYAGE_API_KEY.
# Alternatively, you can use vo = voyageai.Client(api_key="<your secret key>")

texts = ["Sample text 1", "Sample text 2"]

result = vo.embed(texts, model="voyage-4", input_type="document")
print(result.embeddings[0])
print(result.embeddings[1])

result.embeddings는 각각 1024개의 부동소수점 숫자를 포함하는 두 개의 임베딩 벡터 목록이에요. 위 코드를 실행하면 두 임베딩이 화면에 출력돼요:

[-0.013131560757756233, 0.019828535616397858, ...]   # embedding for "Sample text 1"
[-0.0069352793507277966, 0.020878976210951805, ...]  # embedding for "Sample text 2"

임베딩을 만들 때 embed() 함수에 다른 인자를 몇 개 더 지정할 수 있어요.

Voyage Python 패키지에 대한 자세한 내용은 Voyage Python 패키지 문서를 참고하세요.

Voyage HTTP API

Voyage HTTP API를 요청해서 임베딩을 얻을 수도 있어요. 예를 들어 터미널에서 curl 명령으로 HTTP 요청을 보낼 수 있어요:

curl https://api.voyageai.com/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ***" \
  -d '{
    "input": ["Sample text 1", "Sample text 2"],
    "model": "voyage-4"
  }'

받게 되는 응답은 임베딩과 토큰 사용량을 포함한 JSON 객체예요:

{
  "object": "list",
  "data": [
    {
      "embedding": [-0.013131560757756233, 0.019828535616397858 /* ... */],
      "index": 0
    },
    {
      "embedding": [-0.0069352793507277966, 0.020878976210951805 /* ... */],
      "index": 1
    }
  ],
  "model": "voyage-4",
  "usage": {
    "total_tokens": 10
  }
}

Voyage HTTP API에 대한 자세한 내용은 Voyage HTTP API 문서를 참고하세요.

AWS Marketplace

Voyage 임베딩은 AWS Marketplace에서 사용할 수 있어요. AWS에서 Voyage에 접근하는 지침은 Voyage AWS Marketplace 문서에 있어요.

퀵스타트 예시 (Quickstart example)

다음 간단한 예시는 임베딩을 사용하는 방법을 보여줘요.

검색할 여섯 개의 작은 문서 모음이 있다고 가정해 보세요:

documents = [
    "The Mediterranean diet emphasizes fish, olive oil, and vegetables, believed to reduce chronic diseases.",
    "Photosynthesis in plants converts light energy into glucose and produces essential oxygen.",
    "20th-century innovations, from radios to smartphones, centered on electronic advancements.",
    "Rivers provide water, irrigation, and habitat for aquatic species, vital for ecosystems.",
    "Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.",
    "Shakespeare's works, like 'Hamlet' and 'A Midsummer Night's Dream,' endure in literature.",
]

먼저 Voyage를 사용해 각 문서를 임베딩 벡터로 변환해요:

import voyageai

vo = voyageai.Client()

# Embed the documents
doc_embds = vo.embed(documents, model="voyage-4", input_type="document").embeddings

임베딩은 벡터 공간에서 의미적 검색/검색을 할 수 있게 해 줘요. 예시 질의가 주어졌을 때,

query = "When is Apple's conference call scheduled?"

이것을 임베딩으로 변환하고 최근접 이웃 검색을 수행해 임베딩 공간의 거리를 기반으로 가장 관련성 높은 문서를 찾아요:

import numpy as np

# Embed the query
query_embd = vo.embed([query], model="voyage-4", input_type="query").embeddings[0]

# Compute the similarity
# Voyage embeddings are normalized to length 1, therefore dot-product
# and cosine similarity are the same.
similarities = np.dot(doc_embds, query_embd)

retrieved_id = np.argmax(similarities)
print(documents[retrieved_id])

input_type="document"input_type="query"가 각각 문서와 질의를 임베딩하는 데 사용된다는 점에 주목하세요. 더 자세한 명세는 Voyage Python 라이브러리에서 확인할 수 있어요.

출력은 다섯 번째 문서인데, 실제로 질의에 가장 관련성이 높아요:

Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.

벡터 데이터베이스를 포함해 임베딩으로 RAG를 하는 상세한 레시피 모음을 찾고 있다면 RAG 레시피를 확인하세요.

FAQ

임베딩 모델은 생성 모델과 유사하게 강력한 신경망에 의존해 의미 컨텍스트를 포착하고 압축해요. Voyage의 경험 많은 AI 연구자 팀은 임베딩 프로세스의 모든 구성 요소를 최적화해요. 다음을 포함해서요:
* 모델 아키텍처
* 데이터 수집
* 손실 함수
* 옵티마이저 선택

Voyage의 기술적 접근 방식에 대해 더 알아보려면 [Voyage AI 블로그](https://blog.voyageai.com/)를 방문하세요.
범용 임베딩의 경우 권장 모델은:
* `voyage-4-large`: 최고 품질
* `voyage-4-lite`: 최저 지연 시간과 비용
* `voyage-4`: 균형 잡힌 성능

검색의 경우 `input_type` 매개변수로 텍스트가 질의인지 문서인지 지정하세요.

도메인 특화 모델:

* 법률 작업: `voyage-law-2`
* 코드 및 프로그래밍 문서: `voyage-code-3`
* 금융 관련 작업: `voyage-finance-2`

청크 수준 및 문서 수준 검색: `voyage-context-4`
dot-product 유사성, 코사인 유사성, 유클리드 거리 중 하나로 Voyage 임베딩을 사용할 수 있어요. 임베딩 유사성에 대한 설명은 이 [벡터 유사성 가이드](https://www.pinecone.io/learn/vector-similarity/)를 참고하세요.
Voyage AI 임베딩은 길이 1로 정규화되어 있어서:

* 코사인 유사성은 dot-product 유사성과 동일하며, 후자가 더 빠르게 계산될 수 있어요.
* 코사인 유사성과 유클리드 거리는 동일한 순위를 만든다요.
[Voyage 토큰화 가이드](https://docs.voyageai.com/docs/tokenization?ref=anthropic)를 참고하세요. 모든 검색 작업과 사용 사례(예: RAG)에서 `input_type` 매개변수로 입력 텍스트가 질의인지 문서인지 지정하세요. `input_type`을 생략하거나 `input_type=None`으로 설정하지 마세요. 입력 텍스트가 질의인지 문서인지 지정하면 검색을 위한 더 나은 밀집 벡터 표현을 만들 수 있어 더 나은 검색 품질로 이어져요.
`input_type` 매개변수를 사용할 때 임베딩 전에 입력 텍스트 앞에 특수 프롬프트가 붙어요. 구체적으로:

> 📘 **`input_type`와 관련된 프롬프트**
>
> * 질의의 경우 프롬프트는 "Represent the query for retrieving supporting documents: "예요.
>
> * 문서의 경우 프롬프트는 "Represent the document for retrieval: "이에요.
>
> * 예시
>
>   * `input_type="query"`일 때 "When is Apple's conference call scheduled?" 같은 질의는 "**Represent the query for retrieving supporting documents:** When is Apple's conference call scheduled?"가 돼요.
>   * `input_type="document"`일 때 "Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET." 같은 질의는 "**Represent the document for retrieval:** Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET."가 돼요.

`voyage-large-2-instruct`는 이름에서 알 수 있듯이 입력 텍스트 앞에 붙는 추가 지침에 반응하도록 훈련됐어요. 분류, 클러스터링 또는 기타 [MTEB](https://huggingface.co/mteb) 하위 작업에는 [voyage-large-2-instruct 지침](https://github.com/voyage-ai/voyage-large-2-instruct)을 사용하세요.
임베딩의 양자화는 32비트 단정밀도 부동소수점 같은 고정밀도 값을 8비트 정수나 1비트 이진 값 같은 저정밀도 형식으로 변환해, 저장 공간·메모리·비용을 각각 4배와 32배 줄여요. 지원되는 Voyage 모델은 `output_dtype` 매개변수로 출력 데이터 타입을 지정해 양자화를 활성화해요:
* `float`: 각 반환 임베딩은 32비트(4바이트) 단정밀도 부동소수점 숫자 목록. 기본값이며 최고 정밀도/검색 정확도를 제공.
* `int8` 및 `uint8`: 각 반환 임베딩은 각각 -128~127 및 0~255 범위의 8비트(1바이트) 정수 목록.
* `binary` 및 `ubinary`: 각 반환 임베딩은 비트 팩된 양자화 단일 비트 임베딩 값을 나타내는 8비트 정수 목록. `binary`는 `int8`, `ubinary`은 `uint8`. 반환되는 정수 목록의 길이는 임베딩 실제 차원의 1/8. binary 유형은 오프셋 이진 방식(offset binary method)을 사용하며, 이는 [임베딩 FAQ](https://platform.claude.com/docs/en/build-with-claude/embeddings#faq)에서 더 자세히 배울 수 있어요.

> **이진 양자화 예시**
>
> 다음 여덟 개의 임베딩 값을 고려하세요: -0.03955078, 0.006214142, -0.07446289, -0.039001465, 0.0046463013, 0.00030612946, -0.08496094, 0.03994751. 이진 양자화로 0 이하의 값은 이진 0으로, 양수 값은 이진 1로 양자화되어 다음 이진 시퀀스가 만들어져요: 0, 1, 0, 0, 1, 1, 0, 1. 이 여덟 비트는 단일 8비트 정수 01001101(가장 왼쪽 비트가 최상위 비트)로 팩된다요.
>
> * `ubinary`: 이진 시퀀스가 직접 변환되어 부호 없는 정수(`uint8`) 77로 표현돼요.
> * `binary`: 이진 시퀀스가 오프셋 이진 방식(77 - 128 = -51)으로 계산되어 부호 있는 정수(`int8`) -51로 표현돼요.
Matryoshka 학습은 단일 벡터 안에 조대한(coarse-to-fine) 표현을 가진 임베딩을 만들어요. 여러 출력 차원을 지원하는 `voyage-code-3` 같은 Voyage 모델은 이런 Matryoshka 임베딩을 만든다요. 차원의 앞부분 하위 집합을 유지해 이 벡터를 잘라낼 수 있어요. 예를 들어 다음 Python 코드는 1024차원 벡터를 256차원으로 잘라내는 방법을 보여줘요:
```python
import voyageai
import numpy as np


def embd_normalize(v: np.ndarray) -> np.ndarray:
    """
    Normalize the rows of a 2D numpy array to unit vectors by dividing each row by its Euclidean
    norm. Raises a ValueError if any row has a norm of zero to prevent division by zero.
    """
    row_norms = np.linalg.norm(v, axis=1, keepdims=True)
    if np.any(row_norms == 0):
        raise ValueError("Cannot normalize rows with a norm of zero.")
    return v / row_norms


vo = voyageai.Client()

# Generate voyage-code-3 vectors, which by default are 1024-dimensional floating-point numbers
embd = vo.embed(["Sample text 1", "Sample text 2"], model="voyage-code-3").embeddings

# Set shorter dimension
short_dim = 256

# Resize and normalize vectors to shorter dimension
resized_embd = embd_normalize(np.array(embd)[:, :short_dim]).tolist()
```

가격 (Pricing)

최신 가격 상세는 Voyage의 가격 페이지를 방문하세요.

더 알아보기 (Learn more)