RAG에서 놓친 단계: 왜 당신의 Vector DB가 부풀어 있는가 (그리고 로컬에서 해결하는 방법)
Source: Dev.to
Introduction
우리는 LLM 프롬프트를 최적화하고, 검색 파라미터(k‑NN)를 조정하며, 최고의 임베딩 모델을 선택하는 데 수많은 시간을 투자합니다. 하지만 종종 방 안의 코끼리, 즉 데이터 품질을 간과합니다.
내부 회사 데이터(로그, 티켓, 문서, 이메일 등)를 사용해 RAG(검색 기반 생성) 파이프라인을 구축하고 있다면 Semantic Duplicate Problem을 겪어봤을 가능성이 높습니다.
The Problem: Different Words, Same Meaning
표준 중복 제거 도구(예: pandas.DataFrame.drop_duplicates() 또는 SQL DISTINCT)는 문자열 수준에서 작동하며 정확히 일치하는 경우만 찾습니다.
예시 로그 항목
Error: Connection to database timed out after 3000ms.
DB Connection Failure: Timeout limit reached (3s).
표준 스크립트에서는 두 개의 고유 행으로 인식됩니다.
LLM(및 인간)에게는 동일한 내용입니다.
이러한 행 10,000개를 벡터 데이터베이스(Pinecone, Milvus, Weaviate)에 삽입하면:
- 💸 비용 – 중복된 벡터를 저장하는 데 비용이 발생합니다.
- 📉 검색 품질 – 사용자가 “DB가 왜 실패했나요?”라고 물으면 동일한 오류의 여러 변형이 반환되어 다른 관련 정보를 가립니다.
- 😵 모델 환각 – 반복적인 컨텍스트가 출력 품질을 저하시킵니다.
The Solution: Semantic Deduplication
중복 제거는 **문법(텍스트)**이 아니라 **의미(벡터)**를 기준으로 해야 합니다.
경량이며 프라이버시를 우선시하고, Spark 클러스터나 외부 API 호출 없이 로컬에서 실행되는 도구를 찾지 못해 직접 만들었습니다: EntropyGuard.
EntropyGuard – A Local‑First ETL Engine
EntropyGuard는 파이썬으로 작성된 오픈소스 CLI 도구로, 데이터가 벡터 데이터베이스에 들어가기 전에 정제합니다. 다음 세 가지 핵심 문제를 해결합니다:
- Semantic Deduplication –
sentence‑transformers와 FAISS를 사용해 코사인 유사도로 중복을 찾습니다. - Sanitization – PII(이메일, 전화번호)와 HTML 잡음을 제거합니다.
- Privacy – CPU만으로 100 % 로컬에서 실행되며, 데이터 유출이 없습니다.
Tech Stack (Hard Tech)
| Component | Choice | Reason |
|---|---|---|
| Engine | Polars LazyFrame | 스트리밍 실행; 16 GB RAM 노트북에서도 10 GB CSV를 메모리 전체에 로드하지 않고 처리 가능 |
| Vector Search | FAISS (Facebook AI Similarity Search) | CPU 전용 초고속 벡터 비교 |
| Chunking | Native recursive chunker (paragraph → sentence) | LangChain 같은 무거운 프레임워크의 부피를 피함 |
| Ingestion | Excel (.xlsx), Parquet, CSV, JSONL | 네이티브 지원 |
How It Works (The Code)
Installation
pip install "git+https://github.com/DamianSiuta/entropyguard.git"
Running an Audit (Dry Run)
entropyguard \
--input raw_data.jsonl \
--output clean_data.jsonl \
--dedup-threshold 0.85 \
--audit-log audit_report.json
드라이 런은 어떤 행이 왜 삭제될지 정확히 보여주는 JSON 감사 로그를 생성합니다—컴플라이언스 팀에 필수적입니다.
What Happens Under the Hood
- Embedding –
all-MiniLM-L6-v2와 같은 소형 모델을 사용해 로컬에서 임베딩을 생성합니다. - Clustering – FAISS로 임베딩을 클러스터링합니다.
- Deduplication – 코사인 유사도가 지정된 임계값(예: 0.85)을 초과하는 이웃을 제거합니다.
Benchmark: 99.5 % Noise Reduction
10 000행(노이즈가 심한 HTML 태그, 문장 재구성, 오타 등)으로 구성된 합성 데이터셋에 대한 스트레스 테스트 결과:
- Raw Data: 10 000 rows
- Cleaned Data: ~50 rows
- Execution Time: (not specified)
데이터 엔지니어링 커뮤니티의 피드백을 적극적으로 찾고 있습니다. 더러운 RAG 데이터셋에 어려움을 겪고 있다면 EntropyGuard를 한번 사용해보고, 어떻게 작동했는지 알려주세요!