임베딩 개요

텍스트 임베딩은 텍스트 문자열의 수치적 표현으로, 부동 소수점 숫자의 벡터로 표현됩니다. 두 개의 임베딩된 텍스트 조각(단어, 구 또는 문장) 사이의 거리를 사용하여 해당 텍스트 조각이 서로 얼마나 관련되어 있는지 측정할 수 있습니다. 코사인 유사도가 널리 사용되는 측정 방법이지만, 유클리드 거리나 내적과 같은 다른 거리 함수를 통해서도 유사도를 측정할 수 있습니다(FAQ 참조). 일반적으로 거리가 가까울수록 텍스트 간의 의미적 또는 구문적 관계 측면에서 더 높은 연관성을 예측합니다.

문자열의 유사도를 비교하거나 문자열을 서로의 거리에 따라 클러스터링하면 검색(RAG 아키텍처에서 널리 사용됨), 추천이상 탐지를 포함한 다양한 응용 프로그램을 사용할 수 있습니다.


Anthropic에서 임베딩을 얻는 방법

임베딩 제공업체를 선택할 때는 필요와 선호도에 따라 여러 요소를 고려할 수 있습니다:

  • 데이터셋 크기 및 도메인 특이성: 모델 학습 데이터셋의 크기와 임베딩하려는 도메인과의 관련성. 더 크거나 도메인에 특화된 데이터는 일반적으로 더 나은 도메인 내 임베딩을 생성합니다
  • 모델 아키텍처: 모델 설계 및 복잡성. Transformer와 같은 더 현대적인 기술과 아키텍처는 더 높은 품질의 임베딩을 학습하고 생성하는 경향이 있습니다
  • 추론 성능: 임베딩 조회 속도 및 엔드 투 엔드 지연 시간. 이는 대규모 프로덕션 배포에 특히 중요한 고려 사항입니다
  • 맞춤화: 비공개 데이터에 대한 지속적인 학습 옵션 또는 매우 특정한 도메인에 대한 모델 전문화. 이는 고유한 어휘에 대한 성능을 향상시킬 수 있습니다

Anthropic은 자체 임베딩 모델을 제공하지 않습니다. 위의 네 가지 고려 사항을 모두 포괄하는 다양한 옵션과 기능을 갖춘 임베딩 제공업체 중 하나는 Voyage AI입니다. Voyage AI는 최첨단 임베딩 모델을 만들고 금융 및 의료와 같은 특정 산업 도메인에 대한 맞춤형 모델이나 개별 고객을 위한 맞춤형 미세 조정 모델을 제공합니다.

이 가이드의 나머지 부분은 Voyage AI에 대한 것이지만, 특정 사용 사례에 가장 적합한 임베딩 공급업체를 찾기 위해 다양한 임베딩 공급업체를 평가하는 것이 좋습니다.


Voyage AI 시작하기

Voyage AI 구현 예제를 보려면 임베딩 노트북을 확인하세요.

Voyage 임베딩에 액세스하려면:

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

공식 voyageai Python 패키지를 사용하거나 아래에 설명된 대로 HTTP 요청을 사용하여 임베딩을 실행할 수 있습니다.

Voyage Python 패키지

voyageai 패키지는 다음 명령을 사용하여 설치할 수 있습니다:

Python
pip install -U voyageai

그런 다음 클라이언트 객체를 만들고 이를 사용하여 텍스트를 임베딩할 수 있습니다:

Python
import voyageai

vo = voyageai.Client()
# 이렇게 하면 환경 변수 VOYAGE_API_KEY가 자동으로 사용됩니다.
# 또는 vo = voyageai.Client(api_key="<your secret key>")를 사용할 수 있습니다.

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

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

result.embeddings는 각각 1024개의 부동 소수점 숫자를 포함하는 두 개의 임베딩 벡터 목록이 됩니다.

위의 코드를 실행하면 두 개의 임베딩이 화면에 출력됩니다:

Python
[0.02012746, 0.01957859, ...]  # "Sample text 1"에 대한 임베딩
[0.01429677, 0.03077182, ...]  # "Sample text 2"에 대한 임베딩

임베딩을 만들 때 embed() 함수에 몇 가지 다른 인수를 지정할 수 있습니다. 다음은 명세서입니다:

voyageai.Client.embed(texts : List[str], model : str, input_type : Optional[str] = None, truncation : Optional[bool] = None)

  • texts (List[str]) - ["I like cats", "I also like dogs"]와 같은 문자열 목록으로 된 텍스트 목록. 현재 목록의 최대 길이는 128이며, voyage-2의 경우 목록의 총 토큰 수는 최대 320K, voyage-large-2/voyage-code-2의 경우 120K입니다.
  • model (str) - 모델의 이름. 권장 옵션: voyage-2, voyage-large-2, voyage-code-2.
  • input_type (str, 선택 사항, 기본값은 None) - 입력 텍스트의 유형. 기본값은 None입니다. 다른 옵션: query, document
    • input_type이 None으로 설정되면 입력 텍스트가 Voyage의 임베딩 모델에 의해 직접 인코딩됩니다. 또는 입력이 문서 또는 쿼리인 경우 사용자는 input_type을 각각 query 또는 document로 지정할 수 있습니다. 이러한 경우 Voyage는 특수한 프롬프트를 입력 텍스트 앞에 추가하고 확장된 입력을 임베딩 모델로 보냅니다
    • 검색/검색 사용 사례의 경우 쿼리 또는 문서를 인코딩할 때 이 인수를 지정하여 검색 품질을 향상시키는 것이 좋습니다. input_type 인수 유무에 관계없이 생성된 임베딩은 호환됩니다
  • truncation (bool, 선택 사항, 기본값은 None) - 입력 텍스트를 컨텍스트 길이에 맞게 잘라낼지 여부.
    • True인 경우 길이가 초과된 입력 텍스트는 임베딩 모델에 의해 벡터화되기 전에 컨텍스트 길이에 맞게 잘립니다
    • False인 경우 주어진 텍스트가 컨텍스트 길이를 초과하면 오류가 발생합니다
    • 지정하지 않으면(기본값은 None) Voyage는 입력 텍스트가 컨텍스트 창 길이를 약간 초과하는 경우 임베딩 모델로 보내기 전에 입력 텍스트를 잘라냅니다. 컨텍스트 창 길이를 크게 초과하면 오류가 발생합니다

Voyage HTTP API

Voyage HTTP API를 요청하여 임베딩을 얻을 수도 있습니다. 예를 들어 터미널에서 curl 명령을 통해 HTTP 요청을 보낼 수 있습니다:

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

받게 될 응답은 임베딩과 토큰 사용량을 포함하는 JSON 객체입니다:

Shell
{
  "object": "list",
  "data": [
    {
      "embedding": [0.02012746, 0.01957859, ...],
      "index": 0
    },
    {
      "embedding": [0.01429677, 0.03077182, ...],
      "index": 1
    }
  ],
  "model": "voyage-2",
  "usage": {
    "total_tokens": 10
  }
}

Voyage AI의 임베딩 엔드포인트는 https://api.voyageai.com/v1/embeddings(POST)입니다. 요청 헤더에는 API 키가 포함되어야 합니다. 요청 본문은 다음 인수를 포함하는 JSON 객체입니다:

  • input (str, List[str]) - 단일 텍스트 문자열 또는 문자열 목록으로 된 텍스트 목록. 현재 목록의 최대 길이는 128이며, voyage-2의 경우 목록의 총 토큰 수는 최대 320K, voyage-large-2/voyage-code-2의 경우 120K입니다.
  • model (str) - 모델의 이름. 권장 옵션: voyage-2, voyage-large-2, voyage-code-2.
  • input_type (str, 선택 사항, 기본값은 None) - 입력 텍스트의 유형. 기본값은 None입니다. 다른 옵션: query, document
  • truncation (bool, 선택 사항, 기본값은 None) - 입력 텍스트를 컨텍스트 길이에 맞게 잘라낼지 여부
    • True인 경우 길이가 초과된 입력 텍스트는 임베딩 모델에 의해 벡터화되기 전에 컨텍스트 길이에 맞게 잘립니다
    • False인 경우 주어진 텍스트가 컨텍스트 길이를 초과하면 오류가 발생합니다
    • 지정하지 않으면(기본값은 None) Voyage는 입력 텍스트가 컨텍스트 창 길이를 약간 초과하는 경우 임베딩 모델로 보내기 전에 입력 텍스트를 잘라냅니다. 컨텍스트 창 길이를 크게 초과하면 오류가 발생합니다
  • encoding_format (str, 선택 사항, 기본값은 None) - 임베딩이 인코딩되는 형식. Voyage는 현재 두 가지 옵션을 지원합니다:
    • 지정하지 않으면(기본값은 None): 임베딩은 부동 소수점 숫자 목록으로 표현됩니다
    • "base64": 임베딩은 Base64 인코딩으로 압축됩니다

Voyage 임베딩 예제

이제 Voyage로 임베딩을 얻는 방법을 알았으니, 간단한 예제로 실제로 사용해 보겠습니다.

검색할 6개의 문서로 구성된 작은 코퍼스가 있다고 가정해 보겠습니다

Python
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를 사용하여 각 문서를 임베딩 벡터로 변환합니다

Python
import voyageai

vo = voyageai.Client()

# 문서 임베딩
doc_embds = vo.embed(
    documents, model="voyage-2", input_type="document"
).embeddings

임베딩을 통해 벡터 공간에서 의미론적 검색/검색을 수행할 수 있습니다. 그런 다음 예제 쿼리,

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

를 임베딩으로 변환한 다음 최근접 이웃 검색을 수행하여 임베딩 공간의 거리를 기준으로 가장 관련성이 높은 문서를 찾을 수 있습니다.

Python
import numpy as np

# 쿼리 임베딩
query_embd = vo.embed(
    [query], model="voyage-2", input_type="query"
).embeddings[0]

# 유사도 계산
# Voyage 임베딩은 길이 1로 정규화되므로 내적과 코사인 유사도가 동일합니다.
similarities = np.dot(doc_embds, query_embd)

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

문서와 쿼리를 임베딩할 때 각각 input_type="document"input_type="query"를 사용합니다. 자세한 내용은 여기에서 확인할 수 있습니다.

출력은 5번째 문서가 될 것이며, 이는 실제로 쿼리와 가장 관련이 있습니다:

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 모델

Voyage는 다음 임베딩 모델을 사용하는 것이 좋습니다:

모델컨텍스트 길이임베딩 차원설명
voyage-large-2160001536Voyage AI의 가장 강력한 범용 임베딩 모델.
voyage-code-2160001536코드 검색에 최적화(대안보다 17% 우수)되었으며 범용 코퍼스에서도 SoTA입니다. 자세한 내용은 Voyage 블로그 게시물을 참조하세요.
voyage-240001024지연 시간과 품질 모두에 최적화된 기본 범용 임베딩 모델.
voyage-lite-02-instruct40001024분류, 클러스터링 및 문장 텍스트 유사성 작업을 위해 지시 튜닝되었으며, 이 모델에 권장되는 유일한 사용 사례입니다.

voyage-2voyage-large-2는 범용 임베딩 모델로, 도메인 전반에 걸쳐 최첨단 성능을 달성하고 높은 효율성을 유지합니다. voyage-code-2는 코드 분야에 최적화되어 있으며, 상대적으로 높은 지연 시간에도 불구하고 더 유연한 사용을 위해 4배의 컨텍스트 길이를 제공합니다.

Voyage는 더 발전하고 전문화된 모델을 적극적으로 개발하고 있으며, 개별 고객을 위한 맞춤형 모델을 사용자 정의하는 미세 조정 서비스도 제공합니다. 맞춤형 모델에 대한 자세한 내용은 Anthropic 계정 관리자에게 이메일을 보내거나 Anthropic 지원팀에 문의하세요.

  • voyage-finance-2: 곧 출시 예정
  • voyage-law-2: 곧 출시 예정
  • voyage-multilingual-2: 곧 출시 예정
  • voyage-healthcare-2: 곧 출시 예정

AWS Marketplace의 Voyage

Voyage 임베딩은 AWS Marketplace에서도 사용할 수 있습니다. 다음은 AWS에서 Voyage에 액세스하는 방법입니다:

  1. 모델 패키지 구독
    1. 모델 패키지 목록 페이지로 이동하여 배포할 모델을 선택합니다
    2. Continue to subscribe 버튼을 클릭합니다
    3. Subscribe to this software 페이지의 세부 정보를 주의 깊게 검토합니다. 표준 최종 사용자 라이선스 계약(EULA), 가격 책정 및 지원 약관에 동의하는 경우 “Accept Offer”를 클릭합니다
    4. Continue to configuration을 선택하고 지역을 선택하면 Product Arn이 표시됩니다. 이것은 Boto3를 사용하여 배포 가능한 모델을 만드는 데 필요한 모델 패키지 ARN입니다
      1. 선택한 지역에 해당하는 ARN을 복사하여 다음 셀에서 사용합니다
  2. 모델 패키지 배포

여기에서 Sagemaker Studio에서 JupyterLab 공간을 만들고 Voyage의 노트북을 업로드한 다음 내부 지침을 따르세요.


자주 묻는 질문

두 임베딩 벡터 사이의 거리는 어떻게 계산하나요?

코사인 유사도가 널리 사용되는 선택이지만 대부분의 거리 함수도 잘 작동합니다. Voyage 임베딩은 길이 1로 정규화되므로 코사인 유사도는 본질적으로 두 벡터 사이의 내적과 동일합니다. 다음은 두 임베딩 벡터 사이의 코사인 유사도를 계산하는 데 사용할 수 있는 코드 스니펫입니다.

Python
import numpy

similarity = np.dot(embd1, embd2)
# Voyage 임베딩은 길이 1로 정규화되므로 코사인 유사도는 내적과 동일합니다.

대규모 코퍼스에서 K개의 가장 가까운 임베딩 벡터를 찾으려면 대부분의 벡터 데이터베이스에 내장된 기능을 사용하는 것이 좋습니다.

임베딩하기 전에 문자열의 토큰 수를 계산할 수 있나요?

네! 다음 코드를 사용하여 수행할 수 있습니다.

Python
import voyageai

vo = voyageai.Client()
total_tokens = vo.count_tokens(["Sample text"])

가격

가장 최신 가격 세부 정보는 Voyage의 가격 페이지를 참조하세요.