[Lobsters 요약] JetBrains, 코드 의미 검색을 위한 RAG 파이프라인 구축: 파싱, 청킹, 벡터화 심층 분석
0
설명
JetBrains는 개발자들의 생산성 향상을 위해 코드의 의미를 정확히 파악하는 시맨틱 코드 검색 플랫폼 구축에 나섰습니다.
이 글은 JetBrains의 RAG(Retrieval-Augmented Generation) 파이프라인 개발 과정에서 얻은 실질적인 경험과 기술적 통찰을 공유합니다.
특히, 코드의 의미를 효과적으로 추출하고 검색하기 위한 파싱, 청킹, 벡터화 단계에 대한 상세한 내용을 다룹니다.
### 배경 설명
최근 소프트웨어 개발 분야에서 AI 코딩 에이전트의 중요성이 급증하고 있습니다. 이러한 에이전트들은 복잡한 코드 속에서도 신뢰할 수 있는 코드를 생성하는 능력을 보여주고 있지만, 그 효율성과 생성 코드의 품질은 에이전트가 얼마나 정확하고 관련성 높은 코드를 컨텍스트로 가져올 수 있는지에 달려 있습니다. 특히 대규모 코드베이스에서는 에이전트가 현재 작업 중인 기능과 관련된 코드를 찾는 데 많은 시간을 소요합니다.
기존의 키워드 검색이나 grep과 같은 도구는 에이전트가 정확한 검색어를 미리 알고 있어야 한다는 한계가 있습니다. 예를 들어, 세션 토큰이 갱신되는 부분을 찾으려면 '갱신'이라는 단어가 코드에 반드시 포함되어 있어야만 합니다. 하지만 추상적인 도메인을 이해하기 위해서는 코드의 의미를 기반으로 검색하는 시맨틱 검색이 필수적입니다. Retrieval-Augmented Generation(RAG)은 이러한 시맨틱 검색을 가능하게 하는 핵심 기술로, 소스 코드를 의미론적으로 인덱싱하고 에이전트가 필요할 때 자유 텍스트 검색을 통해 관련 코드를 검색할 수 있도록 합니다. 이는 에이전트의 강점을 활용하는 인터페이스를 구축하는 데 기여합니다.
### 파싱 및 청킹: 코드의 의미를 담는 단위 분할
RAG 솔루션에서 파싱과 청킹은 코드의 의미를 효과적으로 추출하기 위한 중요한 전처리 단계입니다. 수천 개의 파일과 수백만 줄에 달하는 대규모 코드베이스에서 각 파일을 그대로 임베딩 모델에 입력하는 것은 비효율적이며, 검색 결과로 전체 파일이 반환되어 특정 함수나 코드 스니펫을 찾는 목적에 부합하지 않습니다. 반대로 각 줄을 개별적으로 임베딩하면 주변 컨텍스트 없이 의미론적으로 중요하지 않은 결과를 초래할 수 있습니다. 따라서 코드의 의미를 잘 나타내면서도 적절한 컨텍스트를 포함하는 '청크(chunk)' 단위로 코드를 분할하는 것이 중요합니다. 고정된 줄 수로 분할하는 방식은 관련 없는 코드 조각이 함께 묶이는 등 의미론적으로 부정확한 결과를 낳을 수 있습니다. JetBrains는 26년간 축적된 언어별 파서 기술을 활용하여 코드 구조를 이해하고, 클래스 정의, 메서드, 주석 등을 포함하는 구조 인식 청킹을 수행합니다. 현재 Kotlin, Java, Python, JavaScript, TypeScript, C#, PHP, Go, Rust 등 9개 언어를 지원하며, 기타 언어는 라인 기반 분할로 대체됩니다. 파서는 코드 파일을 구문 노드 스트림으로 분해하고, 청킹 알고리즘은 노드의 타입, 크기, 자식 노드 등을 고려하여 청크의 범위를 결정합니다. 또한, 문서, 어노테이션, 가시성 지정자 등은 선언과 함께 유지되며, 불필요한 공백 및 들여쓰기 정규화 과정을 거칩니다. 청크의 품질은 LLM을 활용한 평가 방식을 통해 검증되며, 예상치 못한 코드 조각이나 분리된 주석 등이 없는지 확인합니다.
### 벡터화: 의미를 숫자로 변환하는 과정
전처리된 텍스트 청크를 시맨틱 검색에 활용하기 위해 벡터화 과정을 거칩니다. 임베딩 모델은 텍스트를 고정된 길이의 숫자 벡터로 변환하며, 의미가 유사한 텍스트는 벡터 공간에서 가까운 위치에 배치됩니다. 이를 통해 키워드 일치만으로는 찾기 어려운 의미적으로 관련된 코드 조각들을 검색할 수 있습니다. 예를 들어, '버퍼링된 쓰기 작업을 플러시하는 함수'와 '대기 중인 큐를 비우는 함수'는 키워드는 다르지만 의미가 유사하여 벡터 공간에서 가깝게 위치하게 됩니다. 벡터 간의 거리는 코드 조각 간의 관련성을 나타내며, 쿼리 역시 동일한 벡터 공간에 투영되어 가장 가까운 벡터들이 검색 결과로 반환됩니다.
### 스토리지 최적화: 효율적인 벡터 저장 및 검색
대규모 코드베이스의 수백만 개 청크를 벡터화하면 수십 기가바이트에 달하는 인덱스가 생성됩니다. 따라서 벡터화 과정에서는 비용과 성능을 모두 고려해야 합니다. 벡터의 차원 수를 줄이거나 각 차원의 정밀도를 낮추는 방식으로 벡터 크기를 최적화할 수 있습니다. JetBrains는 수천 개의 차원을 유지하되 각 차원의 정밀도를 비트 단위로 낮추는 '이진 양자화(binary quantization)' 방식을 채택했습니다. 이는 각 차원이 '예/아니오'와 같은 이진 정보만을 담도록 하여 벡터 크기를 32배 이상 줄입니다. 각 차원을 질문으로 간주할 때, 적은 수의 차원을 높은 정밀도로 유지하는 것보다 많은 수의 차원을 낮은 정밀도로 유지하는 것이 더 많은 정보를 담을 수 있다는 원리에 기반합니다. 이진 벡터는 코사인 유사도 대신 해밍 거리(Hamming distance)를 사용하여 비교되며, 이는 XOR 연산을 통해 효율적으로 계산됩니다. 이진 양자화는 약간의 검색 정확도 손실을 가져오지만, 에이전트가 결과를 활용할 때는 상위 결과의 순서보다 관련성 높은 코드 조각이 근처에 존재하는 것이 더 중요하므로 수용 가능한 수준입니다. 다만, '관련 있음'과 '관련 없음' 사이의 명확한 구분선이 필요한 임계값 기반 판단에는 이진 양자화의 한계가 있어, 이러한 경우에는 16비트 부동 소수점 벡터를 사용합니다.
### 임베딩 범위 및 보안 고려사항
인덱싱과 검색은 동일한 모델을 사용하지만, 처리 방식은 다릅니다. 인덱싱은 처리량에 중점을 두어 대량의 청크를 비동기적으로 처리하며, 검색은 응답 속도에 중점을 둡니다. 쿼리는 자연어 질문으로, 문서는 코드 청크로 임베딩되며, 쿼리에는 '이 검색 쿼리에 답하는 코드를 찾아라'와 같은 지시문이 포함되어 모델이 텍스트의 역할을 이해하도록 합니다. 각 청크는 파일 경로와 함께 임베딩되어 메타데이터를 제공합니다. 대규모 모노레포의 경우 파일 경로가 매우 길어질 수 있으므로, 경로를 적절히 축약하여 임베딩합니다. 또한, 고객의 개인 정보 보호 및 보안을 위해 소스 코드를 JetBrains 시스템에 저장하지 않고, 검색 결과는 사용자의 로컬 체크아웃에서 조립됩니다. 임베딩 과정에서 사용되는 모델은 자체 인프라에서 실행되며, 외부 클라우드 모델을 사용하지 않아 데이터 유출 및 학습에 대한 우려를 해소합니다. 이러한 제약 조건에도 불구하고, 자체 벤치마크 결과 오픈소스 임베딩 모델이 주요 클라우드 제공업체의 API보다 우수한 성능을 보였습니다.
### 가치와 인사이트
이 글은 JetBrains가 개발한 시맨틱 코드 검색 RAG 파이프라인의 초기 단계인 파싱, 청킹, 벡터화 과정을 상세히 설명하며, 실제 개발 과정에서 마주치는 기술적 난제와 그 해결 방안을 제시합니다. 특히, 코드의 의미를 효과적으로 포착하기 위한 구조 인식 청킹 기법과, 대규모 코드베이스에서 발생하는 스토리지 및 성능 문제를 해결하기 위한 이진 양자화 및 벡터 최적화 전략은 개발자들에게 실질적인 인사이트를 제공합니다. 또한, 코드의 보안 및 개인 정보 보호를 위한 설계 원칙은 민감한 데이터를 다루는 시스템 구축 시 중요한 고려 사항임을 강조합니다. 이 글은 AI 코딩 에이전트의 효율성을 극대화하기 위한 RAG 시스템 구축에 대한 깊이 있는 이해를 돕습니다.
### 기술·메타
- 언어별 파서 (Kotlin, Java, Python, JavaScript, TypeScript, C#, PHP, Go, Rust)
- Retrieval-Augmented Generation (RAG)
- 임베딩 모델
- 이진 양자화 (Binary Quantization)
- 해밍 거리 (Hamming Distance)
- LLM-as-a-judge 평가 방식
### 향후 전망
이번 글에서는 RAG 파이프라인의 초기 단계만을 다루었으며, 향후 저장 효율성, 밀리초 단위의 빠른 응답 속도를 위한 시스템 구축, 결과 지속적인 평가 방법, 그리고 에이전트가 RAG 시스템을 효과적으로 활용하도록 하는 방안 등이 후속 시리즈에서 다뤄질 예정입니다. JetBrains Air Context는 현재 공개 프리뷰 상태이며 JetBrains 라이선스에 포함되어 있습니다. 앞으로 RAG 기술의 발전과 함께 코드 검색 및 AI 기반 개발 도구의 진화가 기대됩니다.
📝 원문 및 참고
- Source: Lobsters
- 토론(Lobsters): [lobste.rs](https://lobste.rs/s/ok0m3n/building_rag_pipeline_for_semantic_code)
- 원문: [링크 열기](https://blog.jetbrains.com/ai/2026/09/building-a-rag-pipeline-for-semantic-code-search-a-developer-diary-and-field-notes/)
---
출처: Lobsters · [원문 링크](https://blog.jetbrains.com/ai/2026/09/building-a-rag-pipeline-for-semantic-code-search-a-developer-diary-and-field-notes/)
이 글에 대한 한 줄 의견
신고 · 불법·유해·아동 안전(CSAE) 관련 콘텐츠

댓글 0
아직 댓글이 없습니다. 로그인하면 바로 의견을 남길 수 있습니다.