[Continue] 임베딩 모델 선택가이드

hee.moon·2024년 10월 3일

Continue

목록 보기
2/2

Continue에서는 내가 원하는 임베딩 모델을 선택하여 사용할 수 있다. 코딩 환경에 어떤 임베딩 모델을 사용하는 것이 좋을지 코드 벤치마크, 모델의 크기와 차원(Dimension), 양자화(Quantization), 한국어 처리 능력을 기준으로 조사해보기로 했다.


1. 임베딩 모델(Embeddings model)이란?

임베딩 모델은 텍스트, 코드 등의 데이터를 고정된 크기의 밀집 벡터(dense vector)로 변환하는 기계학습 모델이다. 이러한 벡터는 원본 데이터의 의미론적 특성을 수치화하여 표현한다.

1-1. 주요 특징

  • 차원 축소: 고차원의 데이터(텍스트, 코드 등)를 저차원의 벡터로 변환
  • 의미 보존: 유사한 입력은 벡터 공간에서도 가까운 위치에 매핑
  • 효율적 처리: 벡터화된 데이터는 기계학습 알고리즘이 효율적으로 처리 가능

1-2. 활용

  • 유사도 검색: 코드나 문서에서 유사한 내용 찾기
  • 분류: 코드의 기능이나 버그 유형 분류
  • 추천: 관련 코드나 문서 추천
  • 시각화: 고차원 데이터의 2D/3D 시각화

1-3. '코드' 임베딩의 특수성

일반 텍스트 임베딩과 달리, 코드 임베딩은 다음과 같은 특별한 고려사항이 있다.

  • 구문적 특성: 프로그래밍 언어의 문법과 구조 고려
  • 의미론적 정보: 변수명, 함수명 등의 의미론적(Semantic) 정보 포착
  • 실행 컨텍스트: 코드의 실행 흐름과 의존성 관계 반영

1-4. Continue에서 임베딩 모델

Continue에서 임베딩 모델의 작동 순서는 다음과 같다.

  • 인덱싱 단계
    • 코드를 적절한 크기로 분할(chunking)
    • 각 코드 조각을 벡터로 변환
    • 벡터 데이터베이스에 저장
  • 검색 단계(@codebase를 사용한)
    • 개발자의 질문을 위와 동일한 방식으로 벡터로 변환
    • 저장된 벡터들과 비교하여 가장 유사한 코드 조각 찾기
임베딩 모델 선택 이외에 다른 고려사항이 있나요?
  • 벡터 데이터베이스(예: LanceDB) 선택
  • 코드 분할(chunking) 전략
임베딩 모델을 최적화 하려면?
  • 재순위화(reranking): 더 정확한 결과를 위해 검색 결과 재정렬
  • 자동 증분 인덱싱: 변경된 파일만 자동으로 재인덱싱


2. 비교할 모델 선정

Continue 문서에서 추천하는 7개 모델과 직접 조사했을 때 같이 비교해보면 좋을 것 같은 모델을 추가로 선정해 보았다.

No.모델선정 이유
1Voyage AI의 voyage-code-2Continue 문서에서 (가장) 추천됨
2Ollama의 nomic-embed-textContinue 문서에서 추천됨
3Transformers.js의 all-MiniLM-L6-v2Continue 문서에서 추천됨 (기본값)
4Text Embeddings InferenceContinue 문서에서 추천됨
5Open AI의 text-embedding-3-largeContinue 문서에서 추천됨
6Cohere의 embed-english-v3.0Continue 문서에서 추천됨
7Gemini의 models/text-embedding-004Continue 문서에서 추천됨
8Upstage의 solar-embedding-1-large-query한국어 임베딩 벤치마크 Repo에서 추천됨


3. 비교 기준 선정

3-1. 코드 벤치마크

3-1-1. 벤치마크 둘러보기

  • Microsoft의 CodeXGLUE(General Language Understanding Evaluation benchmark for CODE)

    • 다양한 코드 관련 작업을 수행할 수 있는 대규모 벤치마크다. 여러 모델의 코딩 성능을 측정하기 위한 기준으로 많이 사용된다.
    • 10가지 코딩 작업에 대한 14개 데이터 세트를 가진다.
    • 각 작업의 성능은 주로 정확도(accuracy), F1 스코어 등으로 평가된다.
  • OpenAI의 HumanEval

    • 모델이 주어진 문제를 해결하기 위해 코드 스니펫을 얼마나 정확하게 생성할 수 있는지 평가한다.
    • 주어진 자연어 문제 설명을 바탕으로 Python 코드를 생성하는 작업을 평가한다. 이후 생성된 코드를 실제로 실행하여 결과가 올바른지 판단한다.
    • 평가 지표로는 pass@k가 사용된다.
  • Google Research의 MBPP (Mostly Basic Python Programming)

    • 초급 프로그래머를 위한 Python 코딩 문제를 활용하여 코드 생성 능력을 테스트한다.
    • 약 1,000개의 Python 프로그래밍 문제로 구성되어 있다. 각 문제는 문제 설명, 코드 솔루션, 테스트 케이스로 구성되어 있다.
    • 평가 지표로는 정확도와 pass@k를 사용한다.
  • Microsoft Research의 CodeSearchNet

    • 코드 검색 능력을 평가하기 위한 벤치마크다. 코드와 관련된 자연어 설명이 주어졌을 때, 그에 맞는 코드를 얼마나 정확하게 검색할 수 있는지 평가한다.
    • 이 벤치마크는 Github에 있는 다양한 프로그래밍 언어(Python, Java, JavaScript 등)로 작성된 코드를 포함하고 있으며, 모델의 코드-텍스트 매핑 능력을 평가한다.
    • 검색 성능은 MRR(Mean Reciprocal Rank)나 Precision@k와 같은 지표로 평가된다.

3-1-2. 평가지표 둘러보기

  • Accuracy (정확도):

    • 모델이 전체 예측 중에서 정답을 맞힌 비율을 나타내는 지표. 단순하게 올바른 예측의 개수를 전체 예측 개수로 나눈 값이다.
    • 예시: 100개의 질문 중 85개에 대해 모델이 정확한 답을 맞췄다면, Accuracy는 85%이다.
  • Precision@k:

    • 모델이 상위 k개의 예측 중 얼마나 많은 예측이 정답인지를 평가하는 지표다. 주로 검색, 추천 시스템 등에서 상위 k개의 결과의 정확성을 평가할 때 사용된다.
    • 예시: 추천 시스템에서 사용자가 5개의 추천 중 3개를 실제로 선택했다면, Precision@5는 60%이다.
  • Pass@k:

    • 모델이 k개의 시도 중 적어도 한 번은 정답을 맞힐 확률을 측정하는 지표다. 주로 코드 생성과 같은 다수의 시도가 가능한 작업에서 사용된다.
    • 예시: 코드 생성 모델이 문제에 대해 5개의 코드를 생성했을 때, 그중 하나라도 올바르면 Pass@5는 성공이다.
  • MRR (Mean Reciprocal Rank, 평균 역순위):

    • 모델이 정답을 얼마나 빠르게 예측했는지를 평가하는 지표다. 첫 번째로 올바른 예측이 나온 순위의 역수를 계산해 평균을 낸다. 검색 엔진이나 추천 시스템에서 자주 사용된다.
    • 예시: 검색 엔진에서 사용자가 원하는 문서가 첫 번째 결과로 나온다면 MRR은 1.0이고, 세 번째 결과로 나온다면 MRR은 1/3 = 0.33이다.
  • F1 Score:

    • Precision(정밀도)과 Recall(재현율)의 조화 평균으로, 특히 불균형한 데이터셋에서 유용한 지표이다. Precision은 예측한 정답 중 실제로 맞춘 비율을, Recall은 실제 정답 중 모델이 맞춘 비율을 의미한다.
    • 예시: 스팸 필터링 모델이 10개의 스팸 이메일 중 8개를 정확히 스팸으로 분류했다면, Recall은 높지만 잘못된 스팸 분류(정상 이메일을 스팸으로 분류)도 적어야 Precision이 높아진다.

3-1-3. 벤치마크 결과(1)

8개 모델의 벤치마크를 직접 확인할 수 있는 방법을 찾지 못해서 GPT와 Claude에게 결과를 산출해달라고 요청해보았다.

  • GPT-4
모델CodeXGLUE 성능HumanEval 성능MBPP 성능CodeSearchNet 성능기타 참고 사항
지표accuracyF1 스코어pass@kaccuracypass@kMRRPrecision@k
Voyage AI의 voyage-code-292%90%85%75%80%70%75%코드 관련 작업에서 강력한 성능을 보임
Ollama의 nomic-embed-text80%75%70%60%65%85%70%코드와 자연어 검색 작업에 적합
Transformers.js의 all-MiniLM-L6-v275%70%65%65%60%70%65%소형 모델로 경량화된 환경에서 성능 발휘
Text Embeddings Inference90%85%75%70%72%80%80%검색과 코드 매핑 작업에서 우수한 성능
OpenAI의 text-embedding-3-large95%93%90%90%88%95%92%다목적 임베딩 모델로, 다양한 작업에서 강력
Cohere의 embed-english-v3.070%68%65%60%55%75%70%영어 기반 코드 생성과 검색에서 안정적 성능
Gemini의 models/text-embedding-00488%82%72%80%78%85%80%다양한 언어와 코드 검색 작업에 강점
Upstage의 solar-embedding-1-large-query78%74%70%68%66%80%76%한국어 코드 관련 작업에서 특히 우수
  • Claude
모델CodeXGLUE 성능HumanEval 성능MBPP 성능CodeSearchNet 성능주요 특징
지표accuracyF1 scorepass@1pass@100accuracypass@kMRRPrecision@10
Voyage AI의 voyage-code-288%86%45%72%70%75%0.6872%코드 특화 임베딩으로 우수한 성능
Ollama의 nomic-embed-text82%79%38%65%65%68%0.7268%오픈소스로 유연한 활용 가능
Transformers.js의 all-MiniLM-L6-v278%75%35%60%62%65%0.6564%경량화 모델로 빠른 처리 속도
Text Embeddings Inference85%82%42%70%68%72%0.7070%높은 정확도와 빠른 추론 속도
OpenAI의 text-embedding-3-large92%90%48%78%75%80%0.7578%전반적으로 최고 수준의 성능
Cohere의 embed-english-v3.084%81%40%68%66%70%0.6969%영어 텍스트에 최적화
Gemini의 models/text-embedding-00490%87%46%75%72%77%0.7375%멀티모달 지원으로 확장성 높음
Upstage의 solar-embedding-1-large-query86%83%41%69%67%71%0.7171%한국어 코드 관련 작업에 강점

3-1-4. 벤치마크 결과(2)

CodeXGLUE (코드 이해 및 분석)

  • 상위 성능

    • 순위GPT 결과Claude 결과
      1OpenAI의 text-embedding-3-largeOpenAI의 text-embedding-3-large
      2Voyage AI의 voyage-code-2Gemini의 models/text-embedding-004
      3Text Embeddings InferenceVoyage AI의 voyage-code-2
  • 적합한 코딩 작업:

    • 코드 품질 분석하기
    • 버그 검출

HumanEval (코드 생성)

  • 상위 성능

    • 순위GPT 결과Claude 결과
      1OpenAI의 text-embedding-3-largeOpenAI의 text-embedding-3-large
      2Voyage AI의 voyage-code-2Gemini의 models/text-embedding-004
      3Text Embeddings InferenceVoyage AI의 voyage-code-2
  • 적합한 코딩 작업:

    • 자동 코드 생성
    • 코드 자동 완성
    • 단위 테스트 생성

MBPP (기초 프로그래밍)

  • 상위 성능

    • 순위GPT 결과Claude 결과
      1OpenAI의 text-embedding-3-largeOpenAI의 text-embedding-3-large
      2Gemini의 models/text-embedding-004Gemini의 models/text-embedding-004
      3Voyage AI의 voyage-code-2Voyage AI의 voyage-code-2
  • 적합한 코딩 작업:

    • 기초 알고리즘 구현
    • 데이터 구조 조작
    • 일반적인 프로그래밍 작업

CodeSearchNet (코드 검색)

  • 상위 성능

    • 순위GPT 결과Claude 결과
      1OpenAI의 text-embedding-3-largeOpenAI의 text-embedding-3-large
      2Gemini의 models/text-embedding-004Ollama의 nomic-embed-text
      3Text Embeddings InferenceGemini의 models/text-embedding-004
  • 적합한 코딩 작업:

    • 코드 베이스 검색
    • 유사 코드 찾기
    • 코드-문서 매핑

3-1-5. 🚀 선택 가이드

  • 전반적으로 OpenAI의 text-embedding-3-large가 코딩 능력이 좋다.
  • Gemini models/text-embedding-004도 코딩 능력이 좋다.
  • 하지만, 위 2개 모델은 비용이 많이 들고 API 의존성이 높다. 따라서 대규모 엔터프라이즈 개발에서는 위 2개 모델을 사용할 수 있을 것이다.
  • Voyage AI의 voyage-code-2도 성능이 상위권이다. 하지만 비용은 OpenAI나 Gemini 보다 적게 들어서 규모가 작은 개발에 적합해 보인다.
  • Text Embeddings Inference도 성능이 상위권이다. 개별 서버에서 TEI 서비스를 호스팅하고 있을 때 적합하다.

3-2. 모델 크기와 임베딩 차원

모델모델 사이즈임베딩 차원비고
OpenAI text-embedding-3-large공개되지 않음3,072API로만 제공되어 정확한 모델 크기는 알 수 없음
Gemini text-embedding-004공개되지 않음1,408API로만 제공되어 정확한 모델 크기는 알 수 없음
Voyage AI voyage-code-2공개되지 않음1,024API로만 제공
Ollama nomic-embed-text560MB768오픈소스, 로컬 실행 가능
Transformers.js all-MiniLM-L6-v292MB384가장 작은 모델 사이즈, 브라우저에서도 실행 가능
Text Embeddings Inference~400MB768Rust 기반 최적화로 빠른 추론 속도
Cohere embed-english-v3.0공개되지 않음1,024API로만 제공
Upstage solar-embedding-1-large-query~1.5GB1,024한국어 특화 모델

3-2-1. 모델 크기별 분류

경량 모델 (100MB 미만)

  • Transformers.js all-MiniLM-L6-v2
    • 사이즈: 92MB
    • 특징: 브라우저 실행 가능, 빠른 로딩
    • 활용: 클라이언트 사이드 임베딩, 리소스 제한 환경

중간 크기 모델 (100MB-1GB)

  • Text Embeddings Inference: ~400MB
  • Ollama nomic-embed-text: 560MB
    • 특징: 로컬 실행 가능, 준수한 성능
    • 활용: 온프레미스 환경, 개인 개발 환경

대형 모델 (1GB 이상)

  • Upstage solar-embedding-1-large-query: ~1.5GB
    • 특징: 높은 성능, 한국어 특화
    • 활용: 서버 사이드 임베딩, 대규모 프로젝트

비공개 사이즈 (API 전용)

  • OpenAI text-embedding-3-large
  • Gemini text-embedding-004
  • Voyage AI voyage-code-2
  • Cohere embed-english-v3.0
    • 특징: API를 통한 접근만 가능
    • 활용: 클라우드 기반 서비스

3-2-2. 모델 크기 및 차원과 성능의 상관관계

  • 모델 크기
    • 작은 모델: 빠른 배포, 적은 리소스 요구
    • 큰 모델: 더 높은 성능, 더 많은 리소스 필요
  • 임베딩 차원
    • 일반적으로 높은 차원수가 더 많은 정보를 포함
    • OpenAI (3,072차원)가 전반적으로 최고 성능
    • Transformers.js (384차원)가 가장 낮은 성능

3-2-3. 🚀 선택 가이드

  • 리소스 제약 환경

    • 제한된 메모리: Transformers.js 추천
    • 중간 수준 리소스: Ollama 또는 Text Embeddings Inference
  • 온프레미스 요구사항

    • 완전 독립 환경: Ollama, Text Embeddings Inference
    • 높은 성능 필요: Upstage (리소스 충분 시)
  • 클라우드/API 기반

    • 리소스 제약 없음: OpenAI, Gemini
    • 비용 고려 필요: API 호출 횟수에 따른 요금

3-3. 양자화(Quantization)

양자화는 모델의 파라미터를 더 적은 비트로 표현하여 모델 크기를 줄이고 추론 속도를 향상시키는 기법이다.

INT4와 INT8은 정수형 데이터 타입으로, 양자화에서 중요한 역할을 한다.

  • INT4(4-bit Integer):
    • 매우 적은 비트 수로 가중치와 활성화를 저장하므로, 메모리 사용량과 연산 복잡도를 극도로 줄일 수 있다. 그러나 정밀도가 낮기 때문에 일부 경우 모델의 정확도가 떨어질 수 있다. 보통 극도로 경량화된 모델이나 엣지 디바이스에서 사용된다.
  • INT8(8-bit Integer):
    • INT4에 비해 더 많은 비트 수를 사용하므로, 상대적으로 더 높은 정확도를 유지하면서도 메모리 사용량과 연산 속도를 줄일 수 있다.

3-3-1. 양자화 지원 현황

모델양자화 지원지원 형식성능 영향크기 감소율
OpenAI text-embedding-3-largeAPI만 제공---
Gemini text-embedding-004API만 제공---
Voyage AI voyage-code-2API만 제공---
Ollama nomic-embed-text지원INT8-2~3%~75%
Transformers.js all-MiniLM-L6-v2지원INT8-1~2%~75%
Text Embeddings Inference지원INT8, INT4-3~5%~75-87%
Cohere embed-english-v3.0API만 제공---
Upstage solar-embedding-1-large-query지원INT8-2~4%~75%

3-3-2. 양자화의 장단점

장점

  • 저장 공간 절약: 모델 크기 75-87% 감소
  • 메모리 사용량 감소: 실행 시 필요한 RAM 감소
  • 추론 속도 향상: 특히 CPU에서 의미있는 속도 향상

단점

  • 정확도 손실: 일반적으로 1-5%의 성능 저하
  • 특정 하드웨어 요구: 일부 양자화는 특정 CPU/GPU 필요

3-3-3. 🚀 선택 가이드

  • 리소스 제한 환경

    • 엣지 디바이스, 모바일: INT8 양자화 권장
    • 매우 제한된 환경: INT4 고려 (TEI만 지원)
  • 성능 중심 환경

    • 높은 정확도 필요: 비양자화 모델 사용
    • balanced 접근: INT8 양자화로 시작

3-4. 한국어 처리 능력

현재 한국어 '코드' 관련 임베딩 모델의 성능을 직접적으로 비교할 수 있는 표준화된 벤치마크를 찾을 수 없었다😭.

3-4-1. 알려진 한국어 관련 벤치마크 결과

코드가 아닌 한국어 텍스트 처리에 관한 임베딩 벤치마크는 Upstage의 AutoRAG Korean Embedding Benchmark가 있다.

AutoRAG Korean Embedding Benchmark 주요 결과

(실제 벤치마크 결과가 있는 모델만 포함)

  1. Upstage solar-embedding-1-large-query

    • 한국어 텍스트 검색 및 유사도 측정에서 최고 성능
    • 한국어 특화 모델로 개발됨
  2. OpenAI text-embedding-3-large

    • 다국어 성능이 우수하며 한국어도 준수한 성능
  3. Ollama nomic-embed-text

    • 오픈소스 모델 중 상대적으로 양호한 한국어 처리

3-4-2. 🚀 선택 가이드

  • Upstage solar-embedding-1-large-query
    • 한국어 코드베이스가 주된 프로젝트
    • 한글 변수명이 많은 레거시 코드 분석
  • OpenAI text-embedding-3-large
    • 한영 혼용 프로젝트
    • 국제화 고려가 필요한 프로젝트
profile
Frontend Engineer

0개의 댓글