RAG 시스템 구축하며 마주친 임베딩 차원 문제

문제 상황

사내 문서 검색 정확도 개선을 위해 RAG(Retrieval-Augmented Generation) 시스템을 구축하기로 했다. OpenAI의 text-embedding-ada-002 모델과 Pinecone을 벡터 DB로 선택했는데, 쿼리 시점에 차원 불일치 에러가 발생했다.

ValueError: Query vector dimension (1536) does not match index dimension (768)

원인 분석

Pinecone 인덱스 생성 시 차원을 768로 설정했던 것이 문제였다. 초기에 BERT 기반 모델을 고려하다가 OpenAI로 변경했는데, 인덱스는 그대로 두고 임베딩만 교체했다.

text-embedding-ada-002는 1536 차원 벡터를 반환한다. 문서를 보니 명시되어 있었지만 놓쳤다.

해결 과정

인덱스를 삭제하고 올바른 차원으로 재생성했다.

import pinecone

pinecone.init(api_key=os.getenv("PINECONE_API_KEY"))

# 기존 인덱스 삭제
if "docs-search" in pinecone.list_indexes():
    pinecone.delete_index("docs-search")

# 올바른 차원으로 재생성
pinecone.create_index(
    name="docs-search",
    dimension=1536,  # OpenAI ada-002
    metric="cosine"
)

약 2000개 문서를 다시 임베딩하고 업로드하는 데 20분 정도 소요됐다. 비용은 $0.40 정도 발생했다.

교훈

  • 벡터 DB 인덱스는 생성 후 차원 변경이 불가능하다
  • 임베딩 모델 선택 시 차원, 비용, 성능을 먼저 정리할 것
  • 프로토타입 단계에서는 소량 데이터로 E2E 테스트 필수

GPT-4를 활용한 답변 생성 부분은 다음 포스트에서 다룰 예정이다.

RAG 시스템 구축하며 마주친 임베딩 차원 문제