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를 활용한 답변 생성 부분은 다음 포스트에서 다룰 예정이다.