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
ColBERT 간단 개요
히트맵으로 랭킹 설명하기
Jina-ColBERT로 AI 결과 설명하기
기술 블로그
6월 19, 2024

AI 설명가능성의 혁신: Late Interaction이 Jina-ColBERT를 투명하게 만드는 방법

AI 설명 가능성과 투명성은 뜨거운 주제입니다. AI가 어떻게 작동하는지 알 수 없다면 어떻게 신뢰할 수 있을까요? Jina-ColBERT는 적절한 모델 아키텍처를 통해 AI가 어떻게 자신의 비밀을 쉽게 드러낼 수 있는지 보여줍니다.
Digital representation of a golden building seen through a blue and yellow mesh pattern, evoking a technological vibe.
Maximilian Werk, Scott Martens • 11 분 소요

AI 모델의 오래된 문제점 중 하나는 신경망이 어떻게 특정 출력을 생성하는지 설명하지 못한다는 것입니다. 이것이 인공지능에서 실제로 얼마나 큰 문제인지는 항상 명확하지 않습니다. 사람에게 자신의 추론을 설명하라고 하면, 그들은 일상적으로 합리화를 하며, 대개 자신의 머릿속에서 실제로 어떤 일이 일어나고 있는지에 대한 아무런 표시 없이 자신에 대한 가장 그럴듯한 설명을 제시합니다.

우리는 이미 AI 모델이 그럴듯한 답변을 만들어내도록 하는 방법을 알고 있습니다. 아마도 인공지능은 우리가 인정하고 싶은 것보다 더 인간과 비슷할지도 모릅니다.

50년 전, 미국의 철학자 Thomas Nagel은 박쥐가 된다는 것은 어떤 것일까?라는 영향력 있는 에세이를 썼습니다. 그는 박쥐가 된다는 것은 분명 어떤 것이어야 한다고 주장했습니다: 박쥐가 세상을 보는 방식으로 보고, 박쥐가 존재를 인식하는 방식으로 인식하는 것입니다. 하지만 Nagel에 따르면, 우리가 박쥐의 뇌, 박쥐의 감각, 그리고 박쥐의 신체가 어떻게 작동하는지에 대한 모든 알 수 있는 사실을 알고 있다 하더라도, 우리는 여전히 박쥐가 된다는 것이 어떤 것인지 알 수 없을 것이라고 합니다.

AI 설명 가능성은 같은 종류의 문제입니다. 우리는 주어진 AI 모델에 대해 알 수 있는 모든 사실을 알고 있습니다. 그것은 단지 행렬 시퀀스로 배열된 유한 정밀도 숫자들의 집합일 뿐입니다. 우리는 모든 모델 출력이 올바른 산술의 결과라는 것을 쉽게 검증할 수 있지만, 그 정보는 설명으로서는 쓸모가 없습니다.

인간에게와 마찬가지로 AI에 대해서도 이 문제에 대한 일반적인 해결책은 없습니다. 하지만 ColBERT 아키텍처, 특히 재순위 지정자로 사용될 때의 "후기 상호작용" 방식은 모델이 특정 경우에 특정 결과를 제공하는 이유에 대한 의미 있는 통찰력을 얻을 수 있게 해줍니다.

이 글에서는 Jina-ColBERT 모델 jina-colbert-v1-en과 Matplotlib Python 라이브러리를 사용하여 후기 상호작용이 어떻게 설명 가능성을 가능하게 하는지 보여드리겠습니다.

tagColBERT 간단 개요

ColBERT는 Khattab & Zaharia (2020)에서 Google이 2018년에 처음 소개한 BERT 모델의 확장으로 소개되었습니다. Jina AI의 Jina-ColBERT 모델은 이 연구와 Santhanam, et al. (2021)에서 제안된 ColBERT v2 아키텍처를 기반으로 합니다. ColBERT 스타일 모델은 임베딩을 생성하는 데 사용될 수 있지만, 재순위 지정 모델로 사용될 때 몇 가지 추가 기능이 있습니다. 주요 이점은 후기 상호작용으로, 이는 표준 임베딩 모델과는 다르게 의미론적 텍스트 유사성 문제를 구조화하는 방법입니다.

tag임베딩 모델

전통적인 임베딩 모델에서는 임베딩이라고 하는 대표 벡터를 생성하고 코사인이나 해밍 거리와 같은 거리 메트릭을 통해 이러한 임베딩을 비교하여 두 텍스트를 비교합니다. 두 텍스트의 의미론적 유사성을 수량화하는 것은 일반적으로 공통된 절차를 따릅니다.

먼저, 두 텍스트에 대해 별도로 임베딩을 생성합니다. 각 텍스트에 대해:

  1. 토크나이저가 텍스트를 대략 단어 크기의 청크로 나눕니다.
  2. 각 토큰은 벡터에 매핑됩니다.
  3. 토큰 벡터는 어텐션 시스템과 컨볼루션 레이어를 통해 상호작용하여 각 토큰의 표현에 컨텍스트 정보를 추가합니다.
  4. 풀링 레이어가 이러한 수정된 토큰 벡터를 단일 임베딩 벡터로 변환합니다.
컨볼루션, 어텐션, 풀링 레이어가 있는 텍스트 분류 모델과 검은 배경의 텍스트 토큰을 보여주는 다이어그램.
텍스트에 대한 단일 임베딩을 생성하는 도식화된 임베딩 모델.

그런 다음, 각 텍스트에 대한 임베딩이 있으면 일반적으로 코사인 메트릭이나 해밍 거리를 사용하여 서로 비교합니다.

토큰화, 임베딩 모델, 점수 매기기가 포함된 텍스트 유사성 계산 프로세스를 설명하는 순서도.
기존 임베딩 모델에서는 임베딩을 직접 비교하여 문서를 비교합니다.

점수 매기기는 토큰에 대한 특정 정보 없이 두 전체 임베딩을 서로 비교하여 이루어집니다. 두 텍스트가 서로 비교되기 전에 상호작용이 발생하므로 모든 토큰 간의 상호작용은 "초기"입니다.

tag재순위 지정 모델

재순위 지정 모델은 다르게 작동합니다.

먼저, 텍스트에 대한 임베딩을 생성하는 대신, 쿼리라고 하는 하나의 텍스트와 우리가 모두 대상 문서라고 부를 다른 텍스트들의 컬렉션을 가져와서 쿼리 텍스트에 대해 각 대상 문서의 점수를 매깁니다. 이 숫자들은 정규화되지 않았으며 임베딩을 비교하는 것과는 다르지만, 정렬이 가능합니다. 쿼리에 대해 가장 높은 점수를 받은 대상 문서는 모델에 따르면 쿼리와 의미론적으로 가장 관련이 있는 텍스트입니다.

Jina Reranker API와 Python을 사용하여 jina-colbert-v1-en 재순위 지정 모델로 이것이 어떻게 작동하는지 구체적으로 살펴보겠습니다.

아래 코드는 다운로드하거나 Google Colab에서 실행할 수 있는 노트북에도 있습니다.

먼저 Python 환경에 가장 최신 버전의 requests 라이브러리를 설치해야 합니다. 다음 명령어로 설치할 수 있습니다:

pip install requests -U

다음으로, Jina Reranker API 페이지를 방문하여 최대 100만 토큰의 텍스트 처리가 가능한 무료 API 토큰을 받으세요. 아래 그림과 같이 페이지 하단에서 API 토큰 키를 복사하세요:

설명 텍스트와 검색 최적화를 위한 빨간색으로 강조 표시된 코드 세그먼트가 있는 Reranker API 인터페이스 스크린샷.
Jina Reranker API 페이지에서 개인 API 키를 얻는 방법.

다음 쿼리 텍스트를 사용하겠습니다:

  • "Elephants eat 150 kg of food per day."

그리고 이 쿼리를 세 개의 텍스트와 비교합니다:

  • "Elephants eat 150 kg of food per day."
  • "Every day, the average elephant consumes roughly 150 kg of plants."
  • "The rain in Spain falls mainly on the plain."

첫 번째 문서는 쿼리와 동일하고, 두 번째는 첫 번째의 다른 표현이며, 마지막 텍스트는 완전히 관련이 없습니다.

다음 Python 코드를 사용하여 점수를 얻으세요. jina_api_key 변수에 Jina Reranker API 토큰을 할당하세요:

import requests

url = "<https://api.jina.ai/v1/rerank>"
jina_api_key = "<YOUR JINA RERANKER API TOKEN HERE>"

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {jina_api_key}"
}
data = {
    "model": "jina-colbert-v1-en",
    "query": "Elephants eat 150 kg of food per day.",
    "documents": [
        "Elephants eat 150 kg of food per day.",
        "Every day, the average elephant consumes roughly 150 kg of food.",
        "The rain in Spain falls mainly on the plain.",
    ],
    "top_n": 3
}

response = requests.post(url, headers=headers, json=data)
for item in response.json()['results']:
    print(f"{item['relevance_score']} : {item['document']['text']}")

Python 파일이나 노트북에서 이 코드를 실행하면 다음과 같은 결과가 나와야 합니다:

11.15625 : Elephants eat 150 kg of food per day.
9.6328125 : Every day, the average elephant consumes roughly 150 kg of food.
1.568359375 : The rain in Spain falls mainly on the plain.

예상대로 정확히 일치하는 것이 가장 높은 점수를 받았고, 다른 표현이 두 번째로 높은 점수를 받았으며, 완전히 관련 없는 텍스트는 훨씬 낮은 점수를 받았습니다.

tagColBERT를 사용한 점수 매기기

ColBERT 재순위 지정이 임베딩 기반 점수 매기기와 다른 점은 두 텍스트의 토큰이 점수 매기기 과정에서 서로 비교된다는 것입니다. 두 텍스트는 자체 임베딩을 가지지 않습니다.

먼저, 임베딩 모델과 동일한 아키텍처를 사용하여 텍스트의 컨텍스트 정보를 포함하는 각 토큰에 대한 새로운 표현을 생성합니다. 그런 다음 쿼리의 각 토큰을 문서의 각 토큰과 비교합니다.

쿼리의 각 토큰에 대해, 문서에서 가장 강한 상호작용을 가진 토큰을 식별하고, 이러한 상호작용 점수를 합산하여 최종 수치를 계산합니다.

Detailed diagram showing computational model with tokens, scored and categorized into "Early" and "Late" interactions.

이 상호작용은 "후기(late)" 상호작용입니다: 두 텍스트를 서로 비교할 때 토큰들이 상호작용합니다. 하지만 "후기" 상호작용이 "초기" 상호작용을 배제하는 것은 아닙니다. 비교되는 토큰 벡터 쌍들은 이미 각각의 컨텍스트에 대한 정보를 포함하고 있습니다.

이러한 후기 상호작용 방식은 토큰 수준의 정보를 보존하며, 그 정보가 컨텍스트에 특화된 것이라 하더라도 유지됩니다. 이를 통해 우리는 ColBERT 모델이 어떻게 점수를 계산하는지 부분적으로 볼 수 있는데, 최종 점수에 기여하는 문맥화된 토큰 쌍들을 식별할 수 있기 때문입니다.

tag히트맵으로 랭킹 설명하기

히트맵은 Jina-ColBERT가 점수를 생성할 때 무슨 일이 일어나는지 볼 수 있게 해주는 시각화 기법입니다. 이 섹션에서는 seaborn과 matplotlib 라이브러리를 사용하여 jina-colbert-v1-en의 후기 상호작용 레이어로부터 히트맵을 생성하여, 쿼리 토큰이 대상 텍스트 토큰과 어떻게 상호작용하는지 보여줄 것입니다.

tag설정

우리는 jina-colbert-v1-en 모델에 접근하고 seaborn, matplotlib, Pillow를 사용하여 히트맵을 생성하는 코드가 포함된 Python 라이브러리 파일을 만들었습니다. 이 라이브러리를 GitHub에서 직접 다운로드하거나, 제공된 노트북을 자신의 시스템에서 또는 Google Colab에서 사용할 수 있습니다.

먼저, 요구사항을 설치하세요. Python 환경에 최신 버전의 requests 라이브러리가 필요합니다. 아직 설치하지 않았다면 다음을 실행하세요:

pip install requests -U 

그런 다음, 핵심 라이브러리를 설치하세요:

pip install matplotlib seaborn torch Pillow

다음으로, GitHub에서 jina_colbert_heatmaps.py를 다운로드하세요. 웹 브라우저를 통해 또는 wget이 설치되어 있다면 커맨드 라인에서 다운로드할 수 있습니다:

wget https://raw.githubusercontent.com/jina-ai/workshops/main/notebooks/heatmaps/jina_colbert_heatmaps.py

라이브러리가 준비되면, 이 글의 나머지 부분을 위해 하나의 함수만 선언하면 됩니다:

from jina_colbert_heatmaps import JinaColbertHeatmapMaker

def create_heatmap(query, document, figsize=None):
    heat_map_maker = JinaColbertHeatmapMaker(jina_api_key=jina_api_key)
    # get token embeddings for the query
    query_emb = heat_map_maker.embed(query, is_query=True)
    # get token embeddings for the target document
    document_emb = heat_map_maker.embed(document, is_query=False)
    return heat_map_maker.compute_heatmap(document_emb[0], query_emb[0], figsize)

tag결과

이제 히트맵을 만들 수 있으니, 몇 개를 만들어보고 무엇을 알려주는지 살펴보겠습니다.

Python에서 다음 명령을 실행하세요:

create_heatmap("Elephants eat 150 kg of food per day.", "Elephants eat 150 kg of food per day.")

결과는 다음과 같은 히트맵이 될 것입니다:

Heatmap visualizing relationships between phrases like "elephants eat 150 kg of food per day" with color gradients indicating

이것은 두 개의 동일한 텍스트를 비교할 때 토큰 쌍들 간의 활성화 수준을 보여주는 히트맵입니다. 각 사각형은 각 텍스트에서 하나씩 가져온 두 토큰 간의 상호작용을 보여줍니다. 추가 토큰 [CLS]와 [SEP]는 각각 텍스트의 시작과 끝을 나타내며, q와 d는 쿼리와 대상 문서에서 각각 [CLS] 토큰 바로 뒤에 삽입됩니다. 이를 통해 모델은 토큰들과 텍스트의 시작과 끝 사이의 상호작용을 고려할 수 있으며, 또한 토큰 표현이 쿼리나 대상에 있는지에 따라 민감하게 반응할 수 있습니다.

사각형이 밝을수록 두 토큰 간의 상호작용이 더 크며, 이는 의미적으로 관련이 있음을 나타냅니다. 각 토큰 쌍의 상호작용 점수는 -1.0에서 1.0 사이의 범위에 있습니다. 빨간 테두리로 강조된 사각형들이 최종 점수에 기여하는 것들입니다: 쿼리의 각 토큰에 대해, 문서의 모든 토큰과의 상호작용 중 가장 높은 값이 계산에 사용됩니다.

가장 좋은 매치 — 가장 밝은 점들 — 와 빨간 테두리로 표시된 최대값들은 거의 모두 정확히 대각선 상에 있으며, 매우 강한 상호작용을 보입니다. 유일한 예외는 "기술적" 토큰인 [CLS], q, d와 영어에서 독립적인 정보를 거의 담고 있지 않은 고빈도 "불용어"인 "of"입니다.

구조적으로 비슷한 문장 — "Cats eat 50 g of food per day." — 을 가져와서 토큰들이 어떻게 상호작용하는지 살펴보겠습니다:

create_heatmap("Elephants eat 150 kg of food per day.", "Cats eat 50 g of food per day.")
Heatmap visualizing the relevance of keywords like "elephants", "food", and "kg" with varying intensity colors, indicating da

다시 한번, 단어들이 자주 동일하고 문장 구조가 거의 동일하기 때문에 가장 좋은 매치는 주로 대각선 상에 있습니다. "cats"와 "elephants"도 공통된 컨텍스트 때문에 매치되지만, 그렇게 잘 매치되지는 않습니다.

컨텍스트가 덜 유사할수록 매치가 더 나빠집니다. "Employees eat at the company canteen."이라는 텍스트를 살펴보겠습니다.

create_heatmap("Elephants eat 150 kg of food per day.", "Employees eat at the company canteen.")
Heatmap visualization showing word correlations from news articles, including topics like food, elephants, and work environme

구조적으로는 비슷하지만, 여기서 유일하게 강한 매치는 두 "eat" 사이에서만 나타납니다. 주제적으로 이 문장들은 구조가 매우 유사하더라도 매우 다른 문장입니다.

빨간 테두리가 있는 사각형들의 색상 명암을 보면 모델이 "Elephants eat 150 kg of food per day"에 대한 매치로 어떻게 순위를 매길지 알 수 있으며, jina-colbert-v1-en은 이러한 직관을 확인해줍니다:

Score Text
11.15625 Elephants eat 150 kg of food per day.
8.3671875 Cats eat 50 g of food per day.
3.734375 Employees eat at the company canteen.

이제, "Elephants eat 150 kg of food per day."를 본질적으로 같은 의미지만 다른 표현을 사용한 문장과 비교해 보겠습니다: "Every day, the average elephant consumes roughly 150 kg of food."

create_heatmap("Elephants eat 150 kg of food per day.", "Every day, the average elephant consumes roughly 150 kg of food.")
Colorful heatmap visualizing the relationship between elephant consumption metrics and other variables.

첫 번째 문장의 "eat"과 두 번째 문장의 "consume" 사이의 강한 연관성을 주목해보세요. 어휘가 다르더라도 Jina-ColBERT는 공통된 의미를 인식할 수 있습니다.

또한 "every day"는 완전히 다른 위치에 있더라도 "per day"와 강하게 매칭됩니다. 오직 낮은 가치의 단어인 "of"만이 매칭되지 않는 이례적인 경우입니다.

이제 같은 쿼리를 전혀 관련 없는 텍스트와 비교해보겠습니다: "The rain in Spain falls mainly on the plain."

create_heatmap("Elephants eat 150 kg of food per day.", "The rain in Spain falls mainly on the plain.")
Seaborn heatmap visualizing frequencies of topic discussions over months, shaded from red to dark blue.

"최상의 매치" 상호작용이 이 쌍에서는 훨씬 낮은 점수를 기록하며, 두 텍스트의 단어들 사이에 거의 상호작용이 없음을 볼 수 있습니다. 직관적으로 "Every day, the average elephant consumes roughly 150 kg of food"와 비교했을 때 낮은 점수를 받을 것이라 예상할 수 있으며, jina-colbert-v1-en도 이에 동의합니다:

Score Text
9.6328125 Every day, the average elephant consumes roughly 150 kg of food.
1.568359375 The rain in Spain falls mainly on the plain.

tag긴 텍스트

이것들은 ColBERT 스타일 리랭커 모델의 작동 방식을 보여주기 위한 간단한 예시입니다. 검색 증강 생성과 같은 정보 검색 맥락에서, 쿼리는 일반적으로 짧은 텍스트이며 매칭 후보 문서는 더 길어서 종종 모델의 입력 컨텍스트 윈도우만큼 깁니다.

Jina-ColBERT 모델들은 모두 8192 토큰 입력 컨텍스트를 지원하며, 이는 대략 한 줄 간격의 표준 페이지 16장에 해당합니다.

이러한 비대칭적인 경우에도 히트맵을 생성할 수 있습니다. 예를 들어, 인도 코끼리에 대한 위키피디아 페이지의 첫 번째 섹션을 살펴보겠습니다:

Screenshot of Wikipedia page on Indian elephants, featuring articles, three elephant images, and conservation status.

jina-colbert-v1-en에 전달된 평문을 보려면 이 링크를 클릭하세요.

이 텍스트는 364개 단어로 구성되어 있어서, 히트맵이 정사각형 모양이 아닐 것입니다:

create_heatmap("Elephants eat 150 kg of food per day.", wikipedia_elephants, figsize=(50,7))
Graphical heatmap displaying genetic data, with red and orange dots indicating varying expression levels across base pairs an

"elephants"가 텍스트의 많은 부분과 매칭되는 것을 볼 수 있습니다. 코끼리에 대한 텍스트이므로 이는 놀랍지 않습니다. 하지만 더 강한 상호작용이 있는 영역도 볼 수 있습니다:

Genomic heatmap with red and black patterns, axis labeled 'XNTY', and highlighted regions indicating data points.

여기서 무슨 일이 일어나고 있을까요? Jina-ColBERT를 사용하면 이것이 긴 텍스트의 어느 부분에 해당하는지 찾을 수 있습니다. 두 번째 단락의 네 번째 문장이라는 것을 알 수 있습니다:

The species is classified as a megaherbivore and consume up to 150 kg (330 lb) of plant matter per day.

이는 쿼리 텍스트와 동일한 정보를 다시 말하고 있습니다. 이 문장만을 대상으로 히트맵을 보면 강한 매칭을 볼 수 있습니다:

Heatmap displaying word co-occurrence with a focus on "elephants," "food," and "day," with color intensity indicating the str

Jina-ColBERT는 긴 텍스트에서 어떤 영역이 쿼리와 매칭되었는지 정확히 볼 수 있게 해줍니다. 이는 더 나은 디버깅뿐만 아니라 더 높은 설명 가능성으로 이어집니다. 매칭이 어떻게 이루어졌는지 보는 데 특별한 지식이 필요하지 않습니다.

tagJina-ColBERT로 AI 결과 설명하기

임베딩은 현대 AI의 핵심 기술입니다. 우리가 하는 거의 모든 것은 입력 데이터의 복잡하고 학습 가능한 관계가 고차원 공간의 기하학으로 표현될 수 있다는 아이디어를 기반으로 합니다. 하지만 수천에서 수백만 차원의 공간적 관계를 인간이 이해하기는 매우 어렵습니다.

ColBERT는 그러한 추상화 수준에서 한 걸음 물러선 것입니다. AI 모델이 하는 일을 설명하는 완벽한 답은 아니지만, 우리의 결과에 책임이 있는 데이터의 어떤 부분을 직접 가리켜 줍니다.

때로는 AI가 블랙박스여야 할 수밖에 없습니다. 모든 중요한 작업을 수행하는 거대한 행렬들은 인간이 머릿속에 담기에는 너무 큽니다. 하지만 ColBERT 아키텍처는 그 박스 안에 약간의 빛을 비추어 더 많은 것이 가능하다는 것을 보여줍니다.

Jina-ColBERT 모델은 현재 영어(jina-colbert-v1-en)로만 사용 가능하지만, 더 많은 언어와 사용 맥락이 준비 중입니다. 최첨단 정보 검색을 수행할 뿐만 아니라 왜 무언가를 매칭했는지 설명할 수 있는 이러한 모델 계열은 AI 기술을 접근 가능하고 유용하게 만들고자 하는 Jina AI의 노력을 보여줍니다.

범주:
기술 블로그
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.보안이용약관개인정보 보호쿠키 관리제 개인 정보를 판매하거나 공유하지 마세요.
본 웹사이트 및 관련 콘텐츠, 소프트웨어, 제품, 서비스는 전문가용으로만 제작되었습니다. 일반 소비자를 위한 것이 아니며, 소비자의 사용을 권장하지 않습니다.