- 8개월간 RAG(검색 증강 생성) 프로젝트를 진행하며 실제로 효과적인 방법과 시간 낭비였던 방법을 구분함
- 초기에는 Langchain과 Llamaindex를 사용하여 프로토타입을 빠르게 완성했지만, 실제 사용자 피드백에서 성능 한계를 경험함
- 문서 검색 성능을 개선한 가장 큰 요인은 쿼리 생성, 리랭킹, 청킹 전략, 메타데이터 활용, 쿼리 라우팅으로 확인됨
- 실무에서는 벡터 데이터베이스, 임베딩, 리랭킹, LLM 등을 유동적으로 선택하며 커스텀 파이프라인을 구축함
- 모든 경험과 노하우를 오픈 소스 프로젝트(agentset-ai/agentset) 에 집약하여 공개함
8개월간의 Production RAG 구축 경험 개요
- 총 9백만 페이지(Usul AI), 4백만 페이지(모 익명 법률 AI 기업) 등 대규모 데이터셋에서 RAG 시스템을 구축 및 운영하는 경험을 공유함
- 초기에는 YouTube 튜토리얼을 따라 Langchain에서 Llamaindex로 옮기며 며칠 만에 프로토타입을 완성했으나, 실제 배포시 사용자만이 알아챌 수 있는 낮은 성능 문제가 드러남
- 몇 달에 걸쳐 시스템 구성 요소를 부분적으로 고치며 최적의 성능에 도달했음
성능 개선에 실질적으로 기여한 요소들 (ROI 순)
-
쿼리 생성(Query Generation)
- 사용자의 마지막 쿼리로는 모든 맥락을 담을 수 없기 때문에, LLM으로 대화 내용을 검토해 의미론적 쿼리와 키워드 쿼리 여러 개를 생성함
- 이 쿼리들을 병렬로 처리하고 이를 리랭커에 넘겨 검색 범위 확대 및 하이브리드 서치의 편향 보완 효과를 얻음
-
리랭킹(Reranking)
- 5줄 정도의 코드로 구현 가능한 리랭킹이 성능에 미치는 영향이 상상 이상으로 큼
- 대량 청크 입력(예: 50개)에서 상위 일부(예: 15개) 청크를 재정렬 및 선별하는 과정이 가장 ROI가 큼
- 리랭킹만으로도 설계가 미흡한 파이프라인의 부족분을 상당히 상쇄할 수 있음
-
청킹 전략(Chunking Strategy)
- 전체 개발 과정의 주요 시간을 차지하는 부분
- 데이터 구조와 패턴을 정확히 이해하고, 논리적 단위로 청킹하며 글자나 문장이 중간에 잘리지 않도록 직접 검수 필요
- 청크별로 독립적 의미가 유지되어야 함
-
LLM 입력 메타데이터 활용
- 단순 청크 텍스트만 LLM에 전달하지 않고, 메타데이터(title, author 등) 를 추가하여 문맥 및 답변 품질을 크게 개선함
-
쿼리 라우팅(Query Routing)
- RAG로는 답변 불가능한 유형(예: 기사 요약, 작성자 정보 요청 등)에는 경량 라우터를 도입, 해당 쿼리를 API+LLM 처리 경로로 분기함
실전 스택(Our stack)
- 벡터 데이터베이스: Azure → Pinecone → Turbopuffer(저렴하며 기본적으로 키워드 검색 지원)
- 문서 추출: 커스텀 방식 적용
- 청킹 툴: 기본적으로 Unstructured.io, 기업용 파이프라인은 커스텀(Chonkie도 좋은 평 있음)
- 임베딩 모델: text-embedding-large-3 사용(다른 모델 미테스트)
- 리랭커: None → Cohere 3.5 → Zerank(대중적이지 않으나 실제로 우수함)
- LLM: GPT 4.1 → GPT 5 → GPT 4.1(주로 Azure 크레딧 사용)
오픈 소스화 및 결론
- 모든 학습 결과와 실전 경험을 오픈 소스 프로젝트agentset-ai/agentset 로 귀결
- MIT 라이선스로 공개되어 자유롭게 사용 및 문의 가능(연락처 제공)