~/tools / 임베딩과 검색(RAG) / Embedding Similarity Calculator

Embedding Similarity Calculator — Ollama /api/embed 벡터 비교: 코사인 유사도, 내적

Ollama의 /api/embed 또는 OpenAI 호환 /v1/embeddings 엔드포인트의 응답을 붙여 넣고 벡터를 비교합니다. 선택한 벡터를 기준으로 코사인 유사도, 내적, 유클리드 거리 순위를 매기고 유사도 행렬도 보여 줍니다. 각 벡터의 차원 수와 길이도 표시하므로, 벡터가 정규화되어 있는지, 같은 모델에서 나온 것인지 확인할 수 있습니다. 데이터는 브라우저 밖으로 나가지 않습니다.

예시는 읽기 쉽도록 4차원의 가상 단위 길이 벡터를 사용합니다. 실제 임베딩은 수백~수천 차원입니다.

Ollama /api/embed 응답(으)로 읽었습니다: 4차원 벡터 4개. 모든 벡터의 길이가 1이므로 코사인 유사도와 내적이 같습니다.

코사인 유사도 순위

#0 How do I keep a model loaded in Ollama?와(과) 비교한 결과입니다. 값이 클수록 더 비슷합니다.

순위텍스트코사인내적거리
1#1 keep_alive controls how long the model stays in memory0.99620.99620.0876
2#2 Protect Ollama with nginx and a password0.40370.40371.0921
3#3 Tomorrow's weather forecast0.01000.01001.4071

코사인 유사도 행렬

각 칸은 행의 벡터와 열의 벡터를 비교한 값입니다.

#0#1#2#3
#01.0000.9960.4040.010
#10.9961.0000.475-0.005
#20.4040.4751.000-0.377
#30.010-0.005-0.3771.000

벡터

텍스트차원길이(L2 노름)단위 길이
#0 How do I keep a model loaded in Ollama?41.000000예
#1 keep_alive controls how long the model stays in memory41.000000예
#2 Protect Ollama with nginx and a password41.000001예
#3 Tomorrow's weather forecast41.000000예

Ollama의 embeddings 문서와 API 레퍼런스를 바탕으로 2026-11-04에 확인했습니다. Ollama: Embeddings / Ollama API: Generate embeddings

모든 계산은 브라우저에서 이루어집니다. 어디로도 전송되지 않습니다.

임베딩 모델은 텍스트를 숫자 목록, 즉 벡터로 바꿉니다. Ollama 문서에는 이 벡터를 코사인 유사도를 이용한 시맨틱 검색과 RAG에 쓰는 방법이 나와 있습니다. 검색 코드를 짜기 전에 숫자를 직접 보면 도움이 됩니다. 질문이 정말로 그 질문에 답이 되는 문단과 가장 가깝게 나올까요? 이 도구는 Ollama가 /api/embed에서 돌려주는 JSON({"embeddings": [[…], …]}), /v1/embeddings의 OpenAI 호환 형식({"data": [{"embedding": […]}]}), 또는 벡터만 담긴 배열을 읽습니다. 선택한 벡터를 기준으로 모든 벡터를 코사인 유사도로 순위 매기고, 내적과 유클리드 거리도 함께 보여 줍니다. Ollama 문서에는 /api/embed가 L2 정규화된(단위 길이) 벡터를 반환한다고 나와 있습니다. 이런 벡터에서는 코사인 유사도와 내적이 같은 숫자이며, 도구가 각 벡터의 길이를 보여 주므로 직접 확인할 수 있습니다. 문서에는 인덱싱할 때와 질의할 때 같은 임베딩 모델을 쓰라는 말도 있습니다. 차원 수가 다른 벡터는 아예 비교할 수 없으므로, 그런 벡터를 발견하면 도구가 오류를 내고 멈춥니다. 계산은 Python으로 따로 구한 값과 대조해 확인했습니다.

이 도구의 핵심 로직은 MIT 라이선스의 오픈 소스로 공개되어 있습니다. github.com/seigo5555/toolkitbox-lib/src/embedding-similarity.ts

이럴 때 사용

  • 질문과 후보 문단 몇 개를 /api/embed 요청 한 번으로 임베딩하고, 검색을 만들기 전에 어떤 문단이 1위로 나오는지 확인하기
  • 같은 문장으로 임베딩 모델 두 개를 한 번에 하나씩 비교해, 어느 쪽이 관련 있는 텍스트와 없는 텍스트를 더 뚜렷하게 구분하는지 보기
  • 벡터 데이터베이스의 거리 지표를 고르기 전에, 저장된 벡터가 단위 길이이고 기대한 차원 수인지 확인하기

사용법

  1. 텍스트를 요청 한 번으로 모델에 보내고(예: curl http://localhost:11434/api/embed -d '{"model": "embeddinggemma", "input": ["question", "passage 1", "passage 2"]}') JSON 응답 전체를 붙여 넣습니다.
  2. 원하면 입력과 같은 순서로 한 줄에 라벨을 하나씩 적으세요. 그러면 결과에 번호 대신 텍스트가 표시됩니다.
  3. 비교 기준이 될 벡터를 고릅니다(기본값은 #0, 첫 번째 입력). 표는 나머지 벡터를 코사인 유사도 순으로 보여 주고, 벡터가 10개 이하이면 행렬에 모든 쌍이 표시됩니다.

FAQ

어떤 유사도를 써야 하나요?

Ollama의 embeddings 페이지는 대부분의 시맨틱 검색에는 코사인 유사도를 쓰라고 합니다. 코사인 유사도는 두 벡터의 방향을 비교하며 길이는 무시합니다. 1은 방향이 같다는 뜻입니다. 벡터 데이터베이스에서는 이들 중에서 고를 수 있는 경우가 많으므로, 도구는 내적과 유클리드 거리도 함께 보여 줍니다.

코사인 유사도와 내적이 같은 이유는 무엇인가요?

벡터의 길이가 1이기 때문입니다. Ollama 문서에는 /api/embed가 L2 정규화된 단위 길이 벡터를 반환한다고 나와 있으며, 단위 길이 벡터에서는 코사인 유사도가 내적과 같습니다. 도구는 각 벡터의 길이를 보여 주고, 모든 벡터가 단위 길이인지(0.001 이내) 알려 줍니다.

차원이 일치하지 않는다고 나옵니다. 무슨 뜻인가요?

두 벡터는 숫자의 개수가 같을 때만 비교할 수 있습니다. 길이는 모델에 따라 달라지며, 문서는 보통 384~1024차원이라고 합니다. /api/embed 요청에는 dimensions 필드도 쓸 수 있습니다. 길이가 다르면 대개 벡터가 서로 다른 모델이나 설정에서 나왔다는 뜻입니다. 문서는 인덱싱할 때와 질의할 때 같은 임베딩 모델을 쓰라고 합니다.

base64 임베딩이 든 응답도 붙여 넣을 수 있나요?

아니요. 이 도구는 숫자만 읽습니다. OpenAI 호환 /v1/embeddings 엔드포인트를 호출한다면, 임베딩을 base64가 아니라 float로 요청하세요.

유사도 0.8은 높은 편인가요?

정해진 기준은 없습니다. 값은 모델과 텍스트에 따라 달라지므로, 숫자 하나만 보고 판단하지 말고 같은 모델에서 나온 관련 있는 문단과 없는 문단의 점수를 비교하세요.

내 데이터가 어딘가로 전송되나요?

아니요. 계산은 브라우저에서 이루어집니다. 이 도구는 Ollama나 다른 서버를 호출하지 않으며, 모델에 요청을 보내는 것은 직접 하셔야 합니다.

관련 글

관련 도구