OpenAI 임베딩을 바이너리 양자화로 강화하기

OpenAI 임베딩을 바이너리 양자화로 강화하기 (Binary Quantization OpenAI)

OpenAI Ada-003 임베딩은 자연어 처리(NLP)를 위한 강력한 도구예요. 하지만 임베딩의 크기가 문제가 되곤 하죠. 특히 실시간 검색과 조회에서는 더욱 그래요. 이 글에서는 Qdrant의 **바이너리 양자화(Binary Quantization)**를 사용해 OpenAI 임베딩의 성능과 효율을 어떻게 높일 수 있는지 탐구해 볼게요.

이 글에서는 다음을 다룰 거예요.

  • OpenAI 임베딩의 중요성과 실전에서의 과제
  • Qdrant의 바이너리 양자화와 그것이 OpenAI 임베딩 성능을 어떻게 개선하는지
  • 검색 효율과 정확도 개선을 강조하는 실험 결과
  • 이 발견이 실제 애플리케이션에 주는 의미
  • 바이너리 양자화를 활용해 OpenAI 임베딩을 강화하는 모범 사례

바이너리 양자화가 처음이라면, 개념과 Qdrant에서의 사용법을 안내하는 저희 글을 먼저 읽어 보세요. Binary Quantization OpenAI에서 Jupyter 노트북을 포함한 이 기법들을 직접 시도해 볼 수도 있어요.

출처: 공식문서

새로운 OpenAI 임베딩: 성능과 변화

임베딩 모델 기술이 발전하면서 수요도 커졌어요. 사용자들은 더 강력하고 효율적인 텍스트 임베딩 모델을 찾고 있어요. OpenAI의 Ada-003 임베딩은 MTEBMIRACL에 언급된 것들을 포함해 광범위한 NLP 작업에서 최첨단 성능을 제공해요.

이 모델들은 100개 이상의 언어에 대한 다국어 지원을 포함해요. text-embedding-ada-002에서 text-embedding-3-large로의 전환은 성능 점수의 큰 도약을 이끌었어요 (MIRACL에서 31.4%에서 54.9%로).

Matryoshka 표현 학습

새로운 OpenAI 모델은 "Matryoshka Representation Learning"(마트료시카 표현 학습)이라는 새로운 접근 방식으로 학습됐어요. 개발자는 서로 다른 크기(차원 수)의 임베딩을 설정할 수 있어요. 이 글에서는 small과 large 변형을 사용해요. 개발자는 정확도와 크기의 균형을 맞추는 임베딩을 선택할 수 있어요.

여기서 바이너리 양자화의 정확도가 서로 다른 차원에서 꽤 좋다는 걸 보여드릴게요 — 두 모델 모두에서 말이죠.

바이너리 양자화로 성능과 효율 강화

저장 요구를 줄임으로써 더 낮은 비용으로 애플리케이션을 확장할 수 있어요. 이는 원래 임베딩 크기가 제기하는 핵심 과제를 해결해요. 바이너리 양자화는 또한 검색 과정을 가속화해요. 벡터 간의 복잡한 거리 계산을 더 관리하기 쉬운 비트 연산(bitwise operations)으로 단순화해서, 방대한 데이터셋에서 잠재적인 실시간 검색을 지원해요.

이 그림은 서로 다른 모델 크기에서 바이너리 양자화로 달성 가능한 유망한 정확도 수준을 보여줘요. 성능을 심각하게 손상시키지 않으면서 실용성을 입증하죠. 저장 공간 감소와 가속화된 검색이라는 이중 이점은, 다양한 실전 애플리케이션에서 OpenAI 임베딩을 더 효과적으로 배포하는 바이너리 양자화의 변혁적 잠재력을 강조해요.

바이너리 양자화의 효율 개선은 다음과 같아요:

  • 저장 공간 축소: 대규모 데이터셋에 도움이 돼요. 메모리도 아끼고, 같은 비용으로 최대 30배까지 확장할 수 있어요.
  • 데이터 조회 속도 향상: 더 작은 데이터 크기는 일반적으로 더 빠른 검색으로 이어져요.
  • 검색 프로세스 가속화: 벡터 간의 단순화된 거리 계산을 비트 연산으로 바꾸는 데 기반해요. 방대한 데이터베이스에서도 실시간 쿼리를 가능하게 해요.

실험 설정: OpenAI 임베딩에 집중

검색 효율과 정확도에 대한 바이너리 양자화의 영향을 파악하기 위해, OpenAI 텍스트 임베딩 모델로 실험을 설계했어요. 미묘한 언어 특징과 의미 관계를 포착하는 이 모델들은 우리 분석의 중추예요. 그런 다음 Qdrant의 바이너리 양자화 기능이 제공하는 잠재적 개선을 깊이 파고들었어요.

이 접근 방식은 높은 수준의 OpenAI 임베딩을 활용할 뿐만 아니라, 조사 중인 검색 메커니즘을 평가하기 위한 넓은 기반도 제공해요.

데이터셋

이 연구는 OpenAI 1M 데이터셋에서 100K 무작위 샘플을 사용하며, 무작위로 선택된 100개 레코드에 집중해요. 이 레코드들은 실험에서 쿼리 역할을 하며, 바이너리 양자화가 데이터셋 내 검색 효율과 정밀도에 어떻게 영향을 주는지 평가하는 것을 목표로 해요. 그런 다음 쿼리의 임베딩을 사용해 데이터셋에서 최근접 이웃을 검색해요.

파라미터: oversampling, rescoring, 검색 한도

각 레코드에 대해 oversampling 수, rescoring, 검색 한도에 걸쳐 파라미터 스윕을 실행해요. 그러면 이 파라미터들이 검색 정확도와 효율에 미치는 영향을 이해할 수 있어요. 실험은 다음 파라미터를 기반으로 다양한 조건에서 바이너리 양자화의 영향을 평가하도록 설계됐어요:

  • Oversampling: 오버샘플링을 통해 양자화에 내재된 정보 손실을 제한할 수 있어요. 이는 또한 OpenAI 임베딩의 의미적 풍부함을 보존하는 데 도움이 돼요. 다양한 오버샘플링 요소로 실험하고 검색 정확도와 효율에 미치는 영향을 파악했어요. 스포일러: 더 높은 오버샘플링 요소는 검색 정확도를 개선하는 경향이 있어요. 다만 보통 더 많은 계산 리소스가 필요해요.

  • Rescoring: 리스코어링은 초기 바이너리 검색의 첫 결과를 다듬어요. 이 프로세스는 원래의 고차원 벡터를 활용해 검색 결과를 다듬어, 항상 정확도를 개선해요. 바이너리 양자화와 결합했을 때의 효과를 측정하기 위해 리스코어링을 켜고 끄면서 실험했어요. 검색 성능에 미치는 영향도 측정했어요.

  • 검색 한도 (Search Limits): 검색 프로세스의 결과 수를 지정해요. 다양한 검색 한도로 실험해 정확도와 효율에 미치는 영향을 측정했어요. 검색 깊이와 성능 사이의 트레이드오프를 탐구했어요. 결과는 정밀도와 속도 요구사항이 다른 애플리케이션에 대한 통찰을 제공해요.

이 상세한 설정을 통해, 실험은 바이너리 양자화와 OpenAI 모델이 만든 고품질 임베딩 사이의 미묘한 상호작용을 밝히는 것을 목표로 했어요. 다양한 조건에서 결과를 세심하게 조정하고 관찰함으로써, 구체적인 애플리케이션 요구와 무관하게 사용자가 Qdrant와 OpenAI 임베딩의 결합 잠재력을 최대한 활용할 수 있게 해주는 실행 가능한 통찰을 발견하고자 했어요.

결과: OpenAI 임베딩에 대한 바이너리 양자화의 영향

리스코어링(True 또는 False)의 영향을 분석하기 위해, 서로 다른 모델 구성과 검색 한도에서 결과를 비교했어요. 리스코어링은 초기 쿼리의 결과를 기반으로 더 정밀한 검색을 설정해요.

리스코어링 (Rescoring)

리스코어링(True 또는 False)의 영향을 분석하는 몇 가지 핵심 관찰은 다음과 같아요:

  1. 정확도가 크게 개선됨:

    • 모든 모델과 차원 구성에서 리스코어링(True)을 활성화하면 리스코어링을 비활성화한(False) 경우보다 일관되게 더 높은 정확도 점수가 나와요.
    • 정확도 개선은 다양한 검색 한도(10, 20, 50, 100)에서 모두 일어나요.
  2. 모델 및 차원별 관찰:

    • 3072차원의 text-embedding-3-large 모델의 경우, 리스코어링은 검색 한도와 오버샘플링 비율에 따라 리스코어링 없음(평균 약 76-77%)에서 리스코어링 있음(97-99%)으로 정확도를 끌어올려요.
    • 오버샘플링 증가에 따른 정확도 개선은 리스코어링이 활성화됐을 때 더 두드러져서, 검색 결과를 다듬는 데 추가 바이너리 코드를 더 잘 활용한다는 것을 나타내요.
    • 512차원의 text-embedding-3-small 모델의 경우, 정확도는 리스코어링 없이 약 53-55%에서 리스코어링 시 71-91%로 증가해요. 특히 낮은 차원에서 리스코어링의 중요성을 강조해요.

대조적으로, 낮은 차원의 모델(예: 512차원의 text-embedding-3-small)에서는 리스코어링이 활성화된 경우에도 오버샘플링 수준 증가에 따른 정확도 향상이 덜 두드러져요. 이것은 낮은 차원 공간에서 높은 오버샘플링에 따른 정확도 개선의 수익 체감을 시사해요.

  1. 검색 한도의 영향:
    • 리스코어링의 성능 이득은 다양한 검색 한도에서 상대적으로 안정적인 것처럼 보여요. 리스코어링이 고려되는 상위 결과 수와 무관하게 일관되게 정확도를 향상시킨다는 것을 시사해요.

요약하면, 리스코어링을 활성화하면 모든 테스트된 구성에서 검색 정확도가 극적으로 개선돼요. 정밀도가 무엇보다 중요한 애플리케이션에 필수적인 기능이에요. 리스코어링이 제공하는 일관된 성능 향상은, 특히 OpenAI 임베딩 같은 복잡한 고차원 데이터를 다룰 때 검색 결과를 다듬는 데 있어 그 가치를 강조해요. 이 개선은 의미 검색, 콘텐츠 발견, 추천 시스템처럼 검색 결과 품질이 사용자 경험과 만족도에 직접 영향을 주는 높은 정확도를 요구하는 애플리케이션에 중요해요.

데이터셋 조합

텍스트 임베딩 모델을 Qdrant에 통합하는 것을 탐구하는 분들을 위해, 최적 성능을 위한 다양한 모델 구성을 고려하는 것이 중요해요. 위에서 정의한 데이터셋 조합은 Qdrant에 대해 테스트할 서로 다른 구성을 보여줘요. 이 조합은 두 가지 주요 속성으로 구분돼요:

  1. 모델 이름: "text-embedding-3-large" 또는 "text-embedding-3-small" 같은 특정 텍스트 임베딩 모델 변형을 나타내요. 이 구분은 모델의 용량과 상관관계가 있어요. "large" 모델은 증가된 계산 리소스 비용으로 더 상세한 임베딩을 제공해요.

  2. 차원 (Dimensions): 모델이 만드는 벡터 임베딩의 크기를 말해요. 옵션은 512에서 3072차원까지 다양해요. 더 높은 차원은 더 정밀한 임베딩으로 이어질 수 있지만 Qdrant에서 검색 시간과 메모리 사용량을 늘릴 수도 있어요.

이 파라미터를 최적화하는 것은 검색 정확도와 리소스 효율 사이의 균형 잡기예요. 이 조합들에 걸쳐 테스트하면 사용자가 계산 리소스와 검색 결과 품질 사이의 트레이드오프를 고려해 자신의 특정 요구를 가장 잘 충족하는 구성을 식별할 수 있어요.

dataset_combinations = [
    {
        "model_name": "text-embedding-3-large",
        "dimensions": 3072,
    },
    {
        "model_name": "text-embedding-3-large",
        "dimensions": 1024,
    },
    {
        "model_name": "text-embedding-3-large",
        "dimensions": 1536,
    },
    {
        "model_name": "text-embedding-3-small",
        "dimensions": 512,
    },
    {
        "model_name": "text-embedding-3-small",
        "dimensions": 1024,
    },
    {
        "model_name": "text-embedding-3-small",
        "dimensions": 1536,
    },
]

데이터셋 조합과 모델 성능에 미치는 영향 살펴보기

코드 스니펫은 사전 정의된 데이터셋과 모델 조합을 반복합니다. 모델 이름과 차원으로 특성화된 각 조합에 대해, 해당 실험의 결과가 로드됩니다. JSON 형식으로 저장된 이 결과는 오버샘플링 유무, 리스코어 단계 유무 같은 다양한 구성에서의 정확도 같은 성능 지표를 포함해요.

이 지표를 추출한 후, 코드는 매우 낮은 한도(구체적으로 1과 5의 한도)의 극단적인 경우를 제외하고 다양한 설정에서 평균 정확도를 계산해요. 이 계산은 결과를 오버샘플링, 리스코어 존재, 한도별로 그룹화한 다음 각 하위 그룹의 평균 정확도를 계산해요.

데이터를 수집하고 처리한 후, 평균 정확도를 피벗 테이블로 정리해요. 이 테이블은 한도(고려된 상위 결과 수)로 인덱싱되고, 열은 오버샘플링과 리스코어링의 조합을 기반으로 형성돼요.

import pandas as pd

for combination in dataset_combinations:
    model_name = combination["model_name"]
    dimensions = combination["dimensions"]
    print(f"Model: {model_name}, dimensions: {dimensions}")
    results = pd.read_json(f"../results/results-{model_name}-{dimensions}.json", lines=True)
    average_accuracy = results[results["limit"] != 1]
    average_accuracy = average_accuracy[average_accuracy["limit"] != 5]
    average_accuracy = average_accuracy.groupby(["oversampling", "rescore", "limit"])[
        "accuracy"
    ].mean()
    average_accuracy = average_accuracy.reset_index()
    acc = average_accuracy.pivot(
        index="limit", columns=["oversampling", "rescore"], values="accuracy"
    )
    print(acc)

이 결과의 선택된 일부를 rescore=True로 보여드릴게요:

Method Dimensionality Test Dataset Recall Oversampling
OpenAI text-embedding-3-large (highest MTEB score from the table) 3072 DBpedia 1M 0.9966 3x
OpenAI text-embedding-3-small 1536 DBpedia 100K 0.9847 3x
OpenAI text-embedding-3-large 1536 DBpedia 1M 0.9826 3x

오버샘플링의 영향

머신러닝에서 오버샘플링을 사용해 데이터셋의 불균형에 대응할 수 있어요. 한 클래스가 다른 클래스보다 숫자가 크게 많을 때 잘 동작해요. 이런 불균형은 다른 클래스를 희생하면서 다수 클래스를 선호하는 모델의 성능을 왜곡할 수 있어요. 소수 클래스에서 추가 샘플을 만들어 오버샘플링은 학습 데이터셋에서 클래스 표현을 균등화하는 데 도움이 되어, 실제 시나리오를 더 공정하고 정확하게 모델링할 수 있게 해요.

이 스크린샷은 모델 성능 지표에 대한 오버샘플링의 효과를 보여줘요. 실제 지표는 표시되지 않지만, 정밀도, 리콜 또는 F1 점수 같은 측정 항목에서 개선을 기대해요. 이러한 개선은 더 균형 잡힌 데이터셋을 만드는 오버샘플링의 효과를 보여줘요. 모델이 지배적인 클래스뿐만 아니라 모든 클래스의 더 나은 표현을 학습할 수 있게 해요.

명시적인 코드 스니펫이나 출력 없이, 우리는 모델 공정성과 성능에서 오버샘플링의 역할에 집중해요. 그래픽 표현을 통해 before-and-after 비교를 설정할 수 있어요. 이런 비교는 머신러닝 프로젝트에 대한 기여를 보여줘요.

바이너리 양자화 활용: 모범 사례

바이너리 양자화를 활용해 OpenAI 임베딩을 강화하기 위해 다음 모범 사례를 권장해요:

  1. 임베딩 모델: MTEB에서 text-embedding-3-large를 사용하세요. 테스트 대상 중 가장 정확해요.
  2. 차원: 정확도를 최대화하려면 모델에 사용 가능한 가장 높은 차원을 사용하세요. 이 결과는 영어와 다른 언어 모두에 해당해요.
  3. 오버샘플링: 정확도와 효율 사이의 최상의 균형을 위해 오버샘플링 요소 3을 사용하세요. 이 요소는 광범위한 애플리케이션에 적합해요.
  4. 리스코어링: 검색 결과의 정확도를 개선하려면 리스코어링을 활성화하세요.
  5. RAM: full 벡터와 페이로드를 디스크에 저장하세요. 메모리에서 로드하는 것을 바이너리 양자화 인덱스로 제한하세요. 이는 메모리 사용량을 줄이고 시스템의 전반적인 효율을 개선하는 데 도움이 돼요. 디스크 읽기의 증가된 지연시간은, 가능한 곳에서 SIMD 명령어를 사용하는 Qdrant의 바이너리 스코어링에서 얻는 지연시간 절감에 비하면 무시할 만해요.

다음은 뭐예요?

높은 recall을 기대하면서 대량의 데이터를 다뤄야 한다면 바이너리 양자화가 훌륭한 선택이에요. 이 기능은 Qdrant 컨테이너 이미지를 로컬에서 띄우거나, 클라우드 호스팅 서비스의 무료 계정으로 시작해 볼 수 있어요.

이 글은 시작하는 데 사용할 수 있는 데이터셋과 구성의 예를 제공해요. 저희 문서는 대규모 데이터셋을 Qdrant에 추가하는 방법더 많은 양자화 기법에 대해 다루고 있어요.

이 발견에 대해 논의하고 바이너리 양자화에 대해 더 배우고 싶다면 Discord 커뮤니티에 참여해 보세요.

더 알아보기 (Learn more)