벡터 RAG가 코드에서 실패하는 세 가지 방식
벡터 RAG는 코드의 특성을 제대로 반영하지 못해 다음과 같은 문제점을 드러냅니다.
-
실패 모드 #1: 잘못된 패턴 매칭: 코드베이스 전반에 걸쳐 반복되는 패턴(인증, 에러 처리 등)은 유사한 임베딩을 생성하여 관련 없는 파일들까지 검색합니다. 예를 들어, 인증 관련 질문에 대해 HTTP 미들웨어, 데이터베이스 유틸리티, 테스트 모의 등 다양한 파일이 반환될 수 있습니다.
-
실패 모드 #2: 박물관 문제 (The Museum Problem): 벡터 임베딩은 현재 활성화된 코드와 과거의 아티팩트(이전 버전, 백업 파일, 주석 처리된 코드)를 구분하지 못합니다. 이로 인해 에이전트는 더 이상 유효하지 않은 코드를 참조하여 잘못된 결과를 생성할 수 있습니다.
-
실패 모드 #3: 고정된 Top-K 검색: 대부분의 벡터 RAG 시스템은 고정된 수의 결과(예: Top 5)를 반환합니다. 이는 단순 쿼리에서는 불필요한 노이즈를, 복잡한 쿼리에서는 필수적인 파일을 누락시키는 문제를 발생시킵니다.
에이전틱 검색(Agentic Search)의 차별점: 컨텍스트 트리
에이전틱 검색은 키워드 매칭 대신 사용자 의도를 파악하고 코드베이스의 관련 부분으로 직접 이동합니다. 이는 코드의 계층적 구조를 반영하는 컨텍스트 트리(.brv/context-tree/)를 통해 이루어집니다.
-
구조 기반 지식 조직: 컨텍스트 트리는 코드를 도메인, 토픽, 서브토픽으로 계층적으로 구성하며, 각 토픽은
context.md파일과@domain/topic형식의 명시적 관계를 가집니다. 이는 임베딩이나 코사인 유사성 없이도 관계를 인코딩합니다. -
의도 파싱 및 탐색: 쿼리를 분석하여 사용자 의도(도메인, 범위)를 이해하고 컨텍스트 트리 계층을 탐색하여 관련 토픽으로 이동합니다.
-
적응형 검색: 쿼리 복잡도에 따라 반환되는 파일의 수가 달라지므로, 고정된 Top-K 방식의 문제를 해결합니다.
실험 결과: 에이전틱 검색의 압도적 우위
gemini-cli (약 1,300개 TypeScript 파일) 코드베이스에 대해 벡터 RAG(OpenAI 임베딩 + Qdrant)와 에이전틱 검색(ByteRover의 컨텍스트 트리 시스템)을 비교한 결과는 다음과 같습니다.
에이전틱 검색은 토큰 사용량을 130배 이상 절감하면서도 정확도를 2배 높였습니다. 벡터 RAG의 높은 재현율은 관련 없는 파일까지 다수 반환하는 ‘넓은 그물 방식’에서 비롯된 것으로, 컨텍스트 희석을 가중시켜 모델의 추론을 방해합니다. 특히 ‘직접 쿼리’(예: ‘OAuth2 구현 위치’)에서는 에이전틱 검색이 벡터 RAG보다 3.7배 우수한 성능을 보였습니다.