#AI

AI에게 도메인을 가르치다 두 번 갈아엎은 이야기 — LLM Wiki + RAG 혼합기

AI에게 도메인을 가르치다 두 번 갈아엎은 이야기 — LLM Wiki + RAG 혼합기
01

Summary

두 번의 실패 끝에 찾아낸, 컬리 엔지니어의 고성능 RAG 검색 엔진 생존기

단순 임베딩의 함정에서 벗어나 요약 임베딩과 SQLite FTS5의 하이브리드 분업으로 사내 도메인 AI를 구축하는 법

이 아티클은 사내 지식을 학습한 인공지능 비서를 구축하는 과정에서 겪은 생생한 시행착오와 설계 진화 과정을 다룹니다. 카파시의 LLM Wiki 방식부터 인덱싱 방식, 그리고 최적의 하이브리드 RAG에 이르기까지 점진적으로 문제를 극복해 나간 기술적 발자취를 추적합니다. 결국 고성능 RAG는 시스템 고도화뿐 아니라 AI, 사람, 기존 검색 기술 간의 역할 분담을 명확히 정의하는 데에 핵심이 있음을 일깨워줍니다.

  • 01LLM Wiki 방식에서 발생하는 컨텍스트 한계 및 'Lost in the middle' 응답 품질 저하 문제 지적
  • 02Inverted Index 기반의 키워드 매칭이 가질 수 있는 동의어 누락 및 무관한 문서 참조 한계 극복 과정
  • 03임베딩 모델의 512 토큰 제한을 우회하기 위해 발견한 요약본 중심 검색의 효용성과 그 구조화 방법
  • 04sqlite-vec과 SQLite 내장 FTS5를 활용한 무비용 하이브리드 검색 인프라(의미 검색 + 키워드 검색) 구성 가이드
  • 05다주제 문서를 단일 주제 단위로 파편화하여 의미 임베딩 성능 저하의 원인인 의미 평균화를 원천 처방한 해결책

RECOMMENDATION

사내 도메인이나 복잡한 위키 문서를 RAG로 연동하려는 엔지니어들에게 적극 추천합니다. 벡터 DB 도입 비용이 부담스럽거나 사내 특수 약어가 많은 시스템이라면, 경량 데이터베이스인 SQLite를 기반으로 요약 임베딩과 FTS5 하이브리드 방식을 결합하여 고효율의 고성능 검색 엔진을 최단 시간에 구축해 보시기 바랍니다.

The Problem

사내 도메인 지식을 갖춘 시니어 AI를 만들기 위해 초기에는 LLM Wiki 패턴을 도입하여 다수의 마크다운 문서를 대화 컨텍스트에 직접 로드하는 방식을 적용했습니다. 그러나 문서 수가 증가하면서 매 대화마다 소비되는 토큰 비용이 폭증하고, 컨텍스트가 길어져 중간 정보를 놓치는 'lost in the middle' 현상이 발생하여 응답 품질이 급격히 저하되었습니다.

The Solution

기존의 본문 임베딩 방식이 가진 의미 평균화 문제와 사내 약어 검색 실패 한계를 해결하기 위해 하이브리드 방식을 구축했습니다. 다주제 문서를 단일 주제로 쪼개고, LLM이 작성한 한 줄 요약본을 임베딩하는 '요약 임베딩(sqlite-vec)'과 본문 전체에 대한 키워드 검색(SQLite FTS5, BM25 알고리즘)으로 두 검색 채널을 분업화했습니다.

The Result

요약본 임베딩을 통해 임베딩 모델의 512 토큰 제한으로 인한 잘림(truncation) 문제를 구조적으로 해결했으며, 한 문서당 단일 요약만을 매칭하여 일반어 노이즈를 제거했습니다. 또한 FTS5 도입으로 사내 특수 약어나 티켓 ID 식별자 매칭 성공률을 비약적으로 개선하여 불필요한 토큰 낭비를 줄이고 검색 정확도를 극대화했습니다.

Trade-off

임베딩 모델의 본질적인 한계로 인해 무관한 문서가 낮은 점수로 매칭되는 일반어 노이즈가 완벽하게 배제되지는 못합니다. 또한 새 문서를 저장할 때마다 LLM이 요약문을 정성껏 작성하도록 유도해야 하고 사람의 추가 검토 프로세스가 개입하게 되어, 검색 정확도를 향상시킨 대신 운영상의 추가 리소스 비용과 요약 품질의 편차가 발생할 가능성이 존재합니다.

03

Key Concepts

Concept · 01

sqlite-vec

SQLite에서 벡터 유사도 검색 기능을 지원하는 경량 데이터베이스 확장 모듈입니다. 별도의 전용 벡터 데이터베이스 인프라를 구축할 필요 없이, 단일 SQLite 데이터베이스 파일 하나만으로도 로컬에서 완전하고 빠른 벡터 임베딩 저장 및 유사도 검색을 처리할 수 있는 장점을 가집니다.

  • 다국어 임베딩 모델인 multilingual-e5-small과 결합되어 저비용 고효율의 로컬 의미 검색 모듈로 활용되었습니다.
  • 복잡한 서버 설정 없이 SQLite 파일 하나만 복사하는 것만으로 환경 이전이 용이한 극도의 경량화 인프라를 달성했습니다.
Concept · 02

Lost in the Middle

거대 언어 모델(LLM)에 입력되는 프롬프트나 컨텍스트 텍스트가 너무 길어질 때, 모델이 제공된 정보의 앞쪽과 뒤쪽 내용은 비교적 잘 기억하지만 중간 부분에 위치한 핵심 세부 정보를 제대로 인지하거나 인출하지 못해 놓치게 되는 현상입니다.

  • 초기 LLM Wiki 실험 단계에서 마크다운 문서가 점차 늘어남에 따라 매 질의 시 발생하는 컨텍스트 과다 적재로 인해 응답의 신뢰성이 저하되는 원인이 되었습니다.
  • 모든 지식 문서를 프롬프트에 구겨 넣는 대신, 필요한 핵심 문서만 한정하여 LLM에 전달해야 하는 당위성을 확인하고 RAG 방식으로 진화하는 계기를 마련했습니다.
Concept · 03

SQLite FTS5

SQLite 데이터베이스 엔진에 기본적으로 내장된 고성능의 풀텍스트 검색 가속화 모듈입니다. 텍스트 문서 세트에 대해 BM25 알고리즘과 같은 고도화된 연관성 가중치 모델을 활용해, 일반적인 관계형 데이터베이스 검색보다 비약적으로 빠른 단어 매칭 및 검색 결과 랭킹 처리를 수행할 수 있도록 돕습니다.

  • 임베딩 벡터 검색의 치명적 약점인 사내 특수 약어, 티켓 식별자, 고유 ID 등의 완전 일치 검색을 높은 정확도로 보완하는 전용 채널로 도입되었습니다.
  • 의미 검색(sqlite-vec) 결과와 FTS5 검색 결과를 상호 결합하고 중복 제거하여 상호 보완적인 하이브리드 검색 솔루션을 구성하는 중추 역할을 담당했습니다.