Elastic
Jina AI
모델
API
keyboard_arrow_down
Reader
어떤 URL이든 Markdown으로 변환하여 LLM 그라운딩을 개선하세요.
Embeddings
멀티모달 및 다국어 임베딩.
Reranker
검색 관련성을 극대화하는 리랭커.
Elastic Inference Service
Jina 모델을 Elasticsearch에서 네이티브 방식으로 실행하세요.
MCP
terminal
CLI
article
llms.txt
smart_toy
에이전트
data_object
스키마
menu_book
문서
로그인
login
실험 설정
모델이 [1, 2, 3, ..., 100] 사이의 숫자를 비교할 수 있을까요?
모델이 [-100, -99, -98, ..., -1] 사이의 음수를 비교할 수 있을까요?
모델이 더 큰 간격의 숫자 [1000, 2000, 3000, ..., 100000]를 비교할 수 있을까요?
모델이 임의의 범위의 숫자를 비교할 수 있나요? 예: [376, 377, 378, ..., 476]
모델이 큰 숫자를 비교할 수 있나요? [4294967296, 4294967297, 4294967298, ..., 4294967396]
모델이 소수를 비교할 수 있나요? [0.0001, 0.0002, 0.0003, ...,0.1] (고정 자릿수 없이)
모델이 화폐 단위의 숫자를 비교할 수 있나요? [ 1 , 1,2, 3 , . . . , 3,...,100]
모델이 날짜를 비교할 수 있나요? [2024-07-24, 2024-07-25, 2024-07-26, ..., 2024-10-31]
모델이 시간을 비교할 수 있나요? [19:00:07, 19:00:08, 19:00:09,..., 20:39:07]
관찰 결과
결론
기술 블로그
7월 24, 2024

임베딩/리랭커 모델은 숫자를 비교할 수 있을까?

많은 LLM은 9.11이 실제로 9.9보다 작다는 것을 알아내지 못합니다. 우리의 임베딩과 리랭커 모델은 이것을 더 잘 처리할 수 있을까요?
Rows of numbered wooden pieces on a white background, ranging from single digits to high numbers.
Han Xiao • 10 분 소요

이것은 오늘 비엔나의 ICML 학회에서 받은 질문이었습니다.

커피 브레이크 시간에 한 Jina 사용자가 최근 LLM 커뮤니티에서 나온 논의와 관련된 질문을 했습니다. 그는 우리의 임베딩 모델이 9.11이 9.9보다 작다는 것을 알 수 있는지 물었는데, 이는 많은 LLM이 반대로 판단하는 과제입니다.

"솔직히 모르겠네요"라고 답했습니다. 그가 자신의 애플리케이션에서 이 기능의 중요성을 설명하고 토큰화가 문제의 근원일 수 있다고 제안했을 때, 저는 동의하며 고개를 끄덕였습니다 - 이미 답을 찾기 위한 실험 아이디어가 머릿속에서 떠오르고 있었죠.

이 글에서는 우리의 임베딩 모델인 jina-embeddings-v2-base-en (2023년 10월 출시)과 Reranker 모델인 jina-reranker-v2-multilingual (2024년 6월 출시)이 숫자를 정확하게 비교할 수 있는지 테스트해보고자 합니다. 9.11과 9.9의 단순 비교를 넘어서, 작은 정수, 큰 수, 소수점, 음수, 통화, 날짜, 시간 등 다양한 유형의 숫자를 포함하는 실험을 설계했습니다. 목표는 우리 모델이 다양한 숫자 형식을 처리하는 효과를 평가하는 것입니다.

tag실험 설정

전체 구현은 아래 Colab에서 확인할 수 있습니다:

Google Colab

실험 설계는 매우 간단합니다. 예를 들어, 임베딩 모델이 [1, 100] 사이의 숫자를 이해하는지 확인하기 위한 단계는 다음과 같습니다:

  1. 문서 구성: 1부터 100까지 각 숫자에 대한 "문자열 리터럴" 문서를 생성합니다.
  2. 임베딩 API로 전송: 임베딩 API를 사용하여 각 문서의 임베딩을 얻습니다.
  3. 코사인 유사도 계산: 모든 두 문서 쌍의 코사인 유사도를 계산하여 유사도 행렬을 만듭니다.
  4. 산점도 작성: 결과를 산점도로 시각화합니다. 유사도 행렬의 각 요소 (i,j)(i, j)(i,j)는 다음과 같이 매핑됩니다: X축: (i−j)(i - j)(i−j); Y축: (i,j)(i, j)(i,j)의 유사도 값

델타 (i−j)(i - j)(i−j)가 0이면, 즉 i=ji = ji=j이면 의미적 유사도가 가장 높아야 합니다. 델타 (i−j)(i - j)(i−j)가 증가할수록 유사도는 감소해야 합니다. 이상적으로는 유사도가 델타 값에 선형적으로 비례해야 합니다. 이러한 선형성이 관찰되지 않는다면, 모델이 숫자를 이해하지 못해 9.11이 9.9보다 크다와 같은 오류를 발생시킬 수 있습니다.

Reranker 모델도 비슷한 절차를 따릅니다. 주요 차이점은 구성된 문서들을 반복하며 각각을 query로 설정하고 "what is the closest item to..."라는 프롬프트를 앞에 붙이고 나머지를 documents로 랭킹하는 것입니다. Reranker API가 반환하는 관련성 점수를 의미적 유사도 측정값으로 직접 사용합니다. 핵심 구현은 다음과 같습니다.

def rerank_documents(documents):
    reranker_url = "https://api.jina.ai/v1/rerank"
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {token}"
    }

    # Initialize similarity matrix
    similarity_matrix = np.zeros((len(documents), len(documents)))

    for idx, d in enumerate(documents):
        payload = {
            "model": "jina-reranker-v2-base-multilingual",
            "query": f"what is the closest item to {d}?",
            "top_n": len(documents),
            "documents": documents
        }
    ...

tag모델이 [1, 2, 3, ..., 100] 사이의 숫자를 비교할 수 있을까요?

각 델타에 대한 평균과 분산을 보여주는 산점도. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual. documents = [str(i) for i in range(1, 101)]

tag이 그래프를 읽는 방법

더 많은 실험으로 넘어가기 전에, 먼저 이 그래프들을 제대로 읽는 방법을 설명하겠습니다. 우선, 위의 두 그래프에서 관찰한 바로는 임베딩 모델은 잘 수행되지만, reranker 모델은 그만큼 좋지 않은 성능을 보입니다. 그럼 우리가 무엇을 보고 있고 왜 그런 것일까요?

X축은 문서 집합에서 균일하게 샘플링된 did_idi​와 djd_jdj​의 인덱스 (i,j)(i,j)(i,j) 또는 i−ji-ji−j의 델타를 나타냅니다. 이 델타는 [−100,100][-100, 100][−100,100] 범위입니다. 우리의 문서 집합은 구성상 정렬되어 있기 때문에, ∣i−j∣|i-j|∣i−j∣가 작을수록 did_idi​와 djd_jdj​는 의미적으로 더 가깝고, iii와 jjj가 멀어질수록 did_idi​와 djd_jdj​ 사이의 유사도는 낮아집니다. 그래서 유사도(Y축으로 표현)가 X=0X=0X=0에서 피크를 보이고 좌우로 이동할수록 선형적으로 감소하는 것을 볼 수 있습니다.

이상적으로는 이것이 날카로운 피크나 ^와 같은 "위쪽 화살표" 모양을 만들어야 합니다. 하지만 항상 그런 것은 아닙니다. X축의 한 지점, 예를 들어 X=25X=25X=25를 고정하고 Y축을 따라 보면, 0.80에서 0.95 사이의 유사도 값을 찾을 수 있습니다. 이는 델타가 모두 25임에도 불구하고 sim(d27,d2)\mathrm{sim}(d_27, d_2)sim(d2​7,d2​)는 0.81일 수 있고 sim(d42,d17)\mathrm{sim}(d_42, d_17)sim(d4​2,d1​7)는 0.91일 수 있다는 것을 의미합니다.

청록색 추세선은 각 X값에서의 평균 유사도와 표준편차를 보여줍니다. 또한 우리의 문서 집합이 균등하게 간격을 두고 있어 연속된 문서 사이에 동일한 간격이 보장되므로 유사도는 선형적으로 감소해야 합니다.

임베딩 그래프는 항상 대칭이며, X=0X=0X=0에서 가장 큰 Y값인 1.0을 가진다는 점에 유의하세요. 이는 코사인 유사도가 did_idi​와 djd_jdj​에 대해 대칭이고 cos⁡(0)=1\cos(0)=1cos(0)=1이기 때문입니다.

반면에 reranker 그래프는 쿼리와 문서가 reranker 모델에서 서로 다른 역할을 하기 때문에 항상 비대칭입니다. 최대값이 1.0이 아닐 수 있습니다. 왜냐하면 X=0X=0X=0은 reranker를 사용하여 "what is the closest item to 4"와 "4"의 관련성 점수를 계산한다는 의미이기 때문입니다. 생각해보면, X=0X=0X=0이 최대 Y값으로 이어진다는 보장이 없습니다.

tag모델이 [-100, -99, -98, ..., -1] 사이의 음수를 비교할 수 있을까요?

각 델타에 대한 평균과 분산을 보여주는 산점도. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual. 여기서는 모델이 음수 공간에서 의미적 유사도를 판단할 수 있는지 테스트하고자 합니다. documents = [str(-i) for i in range(1, 101)]

tag모델이 더 큰 간격의 숫자 [1000, 2000, 3000, ..., 100000]를 비교할 수 있을까요?

여기서는 1000 단위로 간격이 있는 숫자들을 비교할 때 모델이 의미적 유사성을 파악할 수 있는지 테스트하고자 합니다. documents = [str(i*1000) for i in range(1, 101)] 각 델타에 대한 평균과 분산을 나타내는 산점도. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual.

tag모델이 임의의 범위의 숫자를 비교할 수 있나요? 예: [376, 377, 378, ..., 476]

여기서는 임의의 범위에서 숫자를 비교할 때 모델이 의미적 유사성을 파악할 수 있는지 테스트하기 위해 임의의 범위로 숫자를 이동시켰습니다 documents = [str(i+375) for i in range(1, 101)] . 각 델타에 대한 평균과 분산을 나타내는 산점도. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual.

tag모델이 큰 숫자를 비교할 수 있나요? [4294967296, 4294967297, 4294967298, ..., 4294967396]

여기서는 매우 큰 숫자를 비교할 때 모델이 의미적 유사성을 파악할 수 있는지 테스트하고자 합니다. 이전 실험과 유사한 아이디어로 범위를 더 큰 숫자로 이동시켰습니다. documents = [str(i+4294967296) for i in range(1, 101)] 각 델타에 대한 평균과 분산을 나타내는 산점도. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual.

tag모델이 소수를 비교할 수 있나요? [0.0001, 0.0002, 0.0003, ...,0.1] (고정 자릿수 없이)

여기서는 소수를 비교할 때 모델이 의미적 유사성을 파악할 수 있는지 테스트하고자 합니다. documents = [str(i/1000) for i in range(1, 101)] 각 델타에 대한 평균과 분산을 나타내는 산점도. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual.

tag모델이 화폐 단위의 숫자를 비교할 수 있나요? [1,1, 1,2, 3,...,3, ..., 3,...,100]

여기서는 화폐 단위의 숫자를 비교할 때 모델이 의미적 유사성을 파악할 수 있는지 테스트하고자 합니다. documents = ['$'+str(i) for i in range(1, 101)] 각 델타에 대한 평균과 분산을 나타내는 산점도. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual.

tag모델이 날짜를 비교할 수 있나요? [2024-07-24, 2024-07-25, 2024-07-26, ..., 2024-10-31]

여기서는 YYYY-MM-DD 형식의 날짜를 비교할 때 모델이 의미적 유사성을 파악할 수 있는지 테스트하고자 합니다. today = datetime.today(); documents = [(today + timedelta(days=i)).strftime('%Y-%m-%d') for i in range(100)] 각 델타에 대한 평균과 분산을 나타내는 산점도. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual.

tag모델이 시간을 비교할 수 있나요? [19:00:07, 19:00:08, 19:00:09,..., 20:39:07]

여기서는 모델이 시간 형식의 숫자를 비교할 때 의미적 유사성을 파악할 수 있는지 테스트하고자 합니다. 즉, hh:mm:ss. now = datetime.now(); documents = [(now + timedelta(minutes=i)).strftime('%H:%M:%S') for i in range(100)] 각 델타에 대한 평균과 분산이 있는 산점도. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual.

tag관찰 결과

위 그래프에서 관찰된 내용은 다음과 같습니다:

tag리랭커 모델

  • 리랭커 모델은 숫자 비교에 어려움을 겪습니다. [1, 100] 사이의 숫자를 비교하는 가장 단순한 경우에도 성능이 좋지 않습니다.
  • 리랭커 사용 시 쿼리에 사용된 특별한 프롬프트 구성(what is the closest item to x)이 결과에 영향을 미칠 수 있다는 점에 주목해야 합니다.

tag임베딩 모델

  • 임베딩 모델은 [1, 100] 범위 내의 작은 정수나 [-100, 1] 범위 내의 음수를 비교할 때 비교적 잘 수행됩니다. 하지만 이 범위를 다른 값으로 이동하거나, 더 많은 구간을 추가하거나, 더 크거나 작은 부동소수점을 다룰 때는 성능이 크게 저하됩니다.
  • 일반적으로 10단계마다 주기적인 스파이크가 관찰됩니다. 이는 토크나이저가 문자열을 "10" 또는 "1"과 "0"으로 토큰화하는 방식과 관련이 있을 수 있습니다.

tag날짜와 시간 이해

  • 흥미롭게도 임베딩 모델은 대부분의 경우 날짜와 시간을 올바르게 비교하며 잘 이해하는 것으로 보입니다. 날짜 그래프에서는 30/31단계마다 스파이크가 나타나는데, 이는 한 달의 일수와 일치합니다. 시간 그래프에서는 60단계마다 스파이크가 나타나는데, 이는 한 시간의 분 단위와 일치합니다.
  • 리랭커 모델도 어느 정도 이러한 이해를 보여줍니다.

tag"제로"와의 유사성 시각화

2024년 7월 29일 업데이트
Google Colab

또 다른 흥미로운 실험은 아마도 더 직관적일 수 있는데, 모든 숫자와 0(즉, 원점) 사이의 유사성 또는 관련성 점수를 직접 시각화하는 것입니다. 0의 임베딩을 기준점으로 고정하고, 숫자가 커질수록 의미적 유사성이 선형적으로 감소하는지 보고자 합니다. 리랭커의 경우, 쿼리를 "0" 또는 "What is the closest number to number zero?"로 고정하고 모든 숫자를 순위화하여 숫자가 증가할수록 관련성 점수가 감소하는지 확인할 수 있습니다. 결과는 아래와 같습니다:

"원점 임베딩"을 "제로"의 임베딩으로 고정하고 모든 숫자와 제로 사이의 의미적 유사성이 숫자의 값에 비례하는지 확인합니다. 구체적으로 documents = [str(i) for i in range(2048)]를 사용합니다. 각 델타에 대한 평균과 분산이 있는 산점도가 표시됩니다. 왼쪽: jina-embeddings-v2-base-en; 오른쪽: jina-reranker-v2-multilingual.

tag결론

이 글은 현재 임베딩 및 리랭커 모델이 숫자 비교를 어떻게 처리하는지 보여줍니다. 비교적 단순한 실험 설정에도 불구하고, 현재 모델의 일부 근본적인 결함을 드러내며 다음 임베딩과 리랭커 개발에 귀중한 통찰을 제공합니다.

모델이 숫자를 정확하게 비교할 수 있는지 여부를 결정하는 두 가지 주요 요소가 있습니다:

첫째, 토큰화: 어휘가 0-9 숫자만 포함하는 경우, 11은 개별 토큰 1과 1로 토큰화되거나 단일 토큰 11로 토큰화될 수 있습니다. 이러한 선택은 모델의 수치 값 이해에 영향을 미칩니다.

서로 다른 토크나이저는 9.11을 다르게 해석합니다. 이는 문맥적 학습에 영향을 미칠 수 있습니다. 출처: The Tokenizer Playground on HuggingFace.

둘째, 학습 데이터: 학습 코퍼스는 모델의 수치 추론 능력에 큰 영향을 미칩니다. 예를 들어, 학습 데이터가 주로 시맨틱 버저닝이 일반적인 소프트웨어 문서나 GitHub 저장소를 포함하는 경우, 모델은 9.9 다음에 마이너 버전인 9.11이 오므로 9.11이 9.9보다 크다고 해석할 수 있습니다.

임베딩과 리랭커와 같은 밀집 검색 모델의 산술 능력은 RAG와 고급 검색 및 추론 작업에 중요합니다. 강력한 수치 추론 능력은 특히 JSON과 같은 구조화된 데이터를 다룰 때 검색 품질을 크게 향상시킬 수 있습니다.

범주:
기술 블로그
rss_feed

자세히 보기
3월 11, 2026 • 7 분 소요
Bootstrapping Audio Embeddings from Multimodal LLMs
Han Xiao
Abstract illustration of a sound wave or heartbeat, formed by blue, orange, and gray dots on a white background.
3월 06, 2026 • 6 분 소요
Identifying Embedding Models from Raw Numerical Values
Han Xiao
Fingerprint illustration made from numbers, showcasing digital and high-tech design on a light background.
9월 09, 2025 • 11 분 소요
Multimodal Embeddings in Llama.cpp and GGUF
Andrei Ungureanu
Alex C-G
Cartoon llama in the center of a white background, emitting laser-like beams from its eyes. The illustration creates a playfu
현재 언어 / 테마
Search Foundation
Reader
Embeddings
Reranker
Jina API 키 받기
속도 제한
회사 소개
소식
Jina 로고 다운로드
open_in_new
Elastic 로고 다운로드
open_in_new
API 상태
Elastic © 2026.보안이용약관개인정보 보호쿠키 관리제 개인 정보를 판매하거나 공유하지 마세요.
본 웹사이트 및 관련 콘텐츠, 소프트웨어, 제품, 서비스는 전문가용으로만 제작되었습니다. 일반 소비자를 위한 것이 아니며, 소비자의 사용을 권장하지 않습니다.