텍스트, 이미지, 소리 같은 비정형 데이터를 컴퓨터가 이해할 수 있는 숫자 배열(벡터)로 변환하는 과정을 인베딩(embedding)이라고 합니다.
이 인베딩은 검색, 추천 시스템 등 다양한 AI 애플리케이션의 핵심 기술이죠.
하지만 실제 데이터를 다루다 보면 인베딩을 활용한 검색 결과가 기대와 다르게 나오는 "인베딩 불일치" 문제에 자주 부딪히게 됩니다.
왜 이런 문제가 발생하며, 어떻게 해결할 수 있을까요?
인베딩 불일치는 크게 두 가지 이유에서 발생합니다.
대부분의 인베딩 모델은 BERT와 같은 인코더 기반 모델을 사용합니다.
인코더는 고정된 입력을 받아 한 번의 어텐션 계산으로 결과를 도출하기 때문에 빠르고 효율적이라는 장점이 있습니다.
하지만 문제는 최신 어텐션 기술이 디코더 중심으로 발전하면서 인코더 모델은 상대적으로 구형 기술에 머물러 있다는 점입니다.
이러한 구형 어텐션 메커니즘을 사용하는 인코더 기반 인베딩은 시맨틱 정보 처리가 미흡하여 문장의 의미를 정확히 반영하지 못하는 경향이 있습니다.
결과적으로 검색 유사도가 낮아지는 주요 원인이 됩니다.
사용자의 질의는 의도, 맥락, 감정 등 복합적인 정보를 포함하고 있습니다.
반면, 데이터(예: 문서, 팩트)는 대체로 단순한 사실 중심인 경우가 많습니다.
예를 들어, "이번 분기 삼성전자가 괜찮은 거야?"라는 질의에는 질문자의 감정적 의도와 맥락이 담겨 있지만, 데이터는 단순히 "삼성전자 주식 종가: 80,000원"처럼 팩트만을 담고 있습니다.
이처럼 질의와 데이터의 인베딩이 서로 다른 시맨틱 공간에 존재하기 때문에 유사도 비교가 제대로 작동하지 않아 인베딩 불일치가 발생합니다.
인베딩 불일치 문제를 해결하기 위해 다양한 기술들이 활용됩니다.
이 기술들은 기본적으로 질의와 데이터 간의 시맨틱 차이를 좁히거나, 검색 결과를 최적화하는 데 초점을 맞춥니다.
검색된 문서에서 불필요한 부분을 제거하고 핵심 내용을 요약하여 데이터의 품질을 높이는 방법입니다. 이
를 통해 검색 대상 데이터의 시맨틱이 명확해지고, 질의와의 유사도 계산이 개선됩니다.
전통적인 키워드 기반 검색(BM25, ElasticSearch 등)을 먼저 수행한 후, 그 결과를 벡터 검색으로 필터링합니다.
이는 키워드 검색의 정확성과 벡터 검색의 시맨틱 검색 능력을 결합하는 방식입니다.
키워드 검색이 의도를 반영하지 못하는 단점을 보완하고 벡터 검색의 부정확성을 줄일 수 있습니다.
문서를 작은 청크(chunk)로 나누어 인베딩하는 대신, 원본 문서(부모 문서)와 청크를 모두 인베딩하여 비교합니다.
상세 질의는 청크 단위로, 추상적인 질의는 부모 문서 단위로 매칭하여 검색의 정확도를 높입니다.
LLM(대규모 언어 모델)을 사용해 사용자 질의를 데이터의 시맨틱에 맞게 변형합니다.
질의에 포함된 의도, 맥락 등을 분석하여 데이터와 유사한 형태로 재구성한 후 인베딩을 생성합니다.
데이터 자체를 인베딩하는 대신, LLM을 통해 데이터에서 파생될 수 있는 잠재적 질문을 생성한 후 이를 인베딩합니다.
하나의 데이터에 대해 여러 질문을 생성하여 다중 벡터를 저장함으로써 질의와 데이터 간 시맨틱 불일치를 줄이고 검색 효율성을 높일 수 있습니다.
벡터 데이터베이스에 메타데이터(예: 평점, 날짜)를 추가하고, 질의에서 메타데이터 조건을 추출하여 검색을 정교화합니다.
이는 단순히 벡터 유사도만을 보는 것을 넘어, 추가적인 정보를 활용하여 검색 결과를 필터링하고 정확도를 높이는 방법입니다.
벡터 데이터베이스에서 최신 데이터를 우선시하도록 시간 메타데이터를 추가합니다.
오래된 데이터는 자동으로 우선순위를 낮추거나 삭제하여 검색 결과의 관련성을 높입니다.
벡터 데이터베이스는 키가 인베딩으로 구성되어 중복 데이터 식별이 어렵다는 단점이 있는데, 데이터 입력 시 우선순위 메타데이터를 추가하거나 일정 기간 후 데이터를 자동 삭제하도록 설정하여 해결할 수 있습니다.
초기 벡터 검색 결과(코사인 유사도 기반)를 LLM 기반 크로스 인코더(cross-encoder)로 재평가합니다.
질의와 검색된 데이터를 쌍으로 입력하여 유사도를 재계산하고 순위를 재조정함으로써 인베딩의 부정확성을 보완하고 더 정확한 검색 결과를 제공합니다.
하지만 여전히 인코더 기반이므로 구형 어텐션의 한계가 존재할 수 있습니다.
문서 청크를 인베딩한 후, 유사한 청크를 군집화(cluster)하고, 이를 LLM으로 요약하여 새로운 인베딩을 생성합니다. 이 과정을 반복하여 계층적 인베딩을 구축하는 방식입니다.
높은 계산 비용 대비 성능 향상이 제한적이며 특정 데이터셋에 최적화된 경우에만 효과적일 수 있습니다.
벡터 데이터베이스를 운영할 때는 데이터 축적 문제를 고려해야 합니다.
데이터가 계속 쌓이면서 중복되거나 오래된 데이터를 효과적으로 제거하기 어렵기 때문입니다.
이를 해결하려면 다음과 같은 방법들을 활용할 수 있습니다.
추천 도구로는 설치와 사용이 간단하며 API 기반으로 CRUD 작업을 지원하는 Chroma DB가 있습니다.
또한, ElasticSearch의 벡터 확장 플러그인도 강력한 대안이 될 수 있습니다.
인베딩 불일치 문제는 구형 인코더 모델의 한계와 질의-데이터 간의 시맨틱 차이에서 비롯됩니다. 이를 해결하기 위해 문서 압축, 키워드 검색 결합, 부모 문서 검색, 질의 변환, 다중 벡터 스토어, 셀프 쿼리, 시간 요소 고려, 리랭커, 랩터 등 다양한 기술들이 활용될 수 있습니다.
특히, LLM을 활용한 질의 변환과 다중 벡터 스토어는 질의와 데이터 간의 시맨틱 불일치를 효과적으로 줄여 검색 성능을 크게 향상시킬 수 있는 방법입니다.
또한, Chroma DB와 같은 효율적인 벡터 데이터베이스 도구를 활용하면 인베딩 불일치 문제를 해결하고 AI 시스템의 성능을 최적화하는 데 큰 도움이 될 것입니다.