RAG 와 검색 — 청킹·임베딩·재정렬·하이브리드
RAG 와 검색 — 청킹·임베딩·재정렬·하이브리드
RAG (Retrieval-Augmented Generation) 는 LLM 의 한정된 학습 시점·메모리 한계를 외부 지식으로 보완하려는 방식입니다. 검색·생성을 분리하면 모델을 다시 학습시키지 않고도 새로운 자료를 다룰 수 있습니다.
1. RAG 에 대한 이야기
RAG 라는 용어는 Patrick Lewis 등 연구자가 2020 년 NeurIPS 에 발표한 논문 "Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks" 에서 이름이 굳어졌습니다. 외부 코퍼스에서 관련 문서를 검색해 모델 입력에 함께 넣어 생성한다는 단순한 아이디어.
원본 → 전처리·청킹 → 임베딩 → 인덱스 저장
↓
사용자 쿼리 → 임베딩 → 후보 검색 → 재정렬 → 컨텍스트 → LLM → 응답
2. 청킹 전략
문서를 LLM 컨텍스트에 통째로 넣을 수 없을 때가 많아 작은 단위로 쪼갭니다. 청킹은 정답이 없고 데이터·도메인에 따라 다릅니다.
| 전략 | 설명 | 장단 |
|---|---|---|
| 고정 크기 | 토큰·문자 수 기준 (512 토큰) | 단순 · 의미 경계 무시 |
| 슬라이딩 윈도 | 고정 + 오버랩 (50 토큰) | 경계 손실 완화 · 저장량 증가 |
| 의미 기반 | 문장 임베딩 유사도로 경계 추정 | 의미 보존 · 비용 큼 |
| 계층적 | 문서 → 섹션 → 단락 → 청크 | 추상도별 검색 · 구현 복잡 |
| 구조 기반 | 마크다운 헤딩 · HTML · 코드 AST | 구조가 명확한 자료 |
오버랩은 보통 청크 크기의 10~20%. 너무 크면 중복 검색·중복 비용이 늘고 너무 작으면 경계에 걸친 문장이 끊깁니다.
한국어·영어 혼합 문서에서는 256~768 토큰 범위가 자주 거론됩니다. 코드·기술 문서는 함수·헤딩 단위 구조 기반 청킹이 어울립니다.
3. 임베딩 → 검색
청크를 임베딩 모델에 통과시켜 고정 차원 벡터로 만듭니다. 쿼리도 같은 모델로 임베딩한 뒤 거리·유사도가 가까운 K 개를 가져옵니다. 거리 함수는 코사인이 가장 흔하지만 모델 권장 사항을 따릅니다.
4. pgvector
Postgres 에 pgvector extension 을 얹으면 벡터 검색이 같은 DB 안에서 가능. 거리 연산자 (<-> L2 · <=> 코사인 · <#> 음수 내적) 와 두 종류의 ANN 인덱스:
- IVFFlat — 클러스터링 기반. 빠른 빌드 · 작은 메모리. 데이터가 어느 정도 쌓인 뒤 인덱스를 만들어야 클러스터 품질이 좋습니다.
- HNSW — 다층 그래프 기반 (Malkov · Yashunin 2018). 검색 정확도·속도 우수, 빌드 시간·메모리 더 큼. 점진적 추가에 강함.
별도 벡터 DB (Pinecone · Qdrant · Weaviate · Milvus) 와의 선택은 데이터 규모 · 운영 표면 · 필터링 요구의 균형.
5. 재정렬 (Reranking)
벡터 검색은 빠르지만 의미 정확도에 한계가 있습니다. 1 차로 30100 개를 가져와 cross-encoder 또는 LLM 으로 다시 점수를 매겨 상위 510 개만 남기는 절차가 reranking.
| 모델 | 메모 |
|---|---|
| Cohere Rerank | 상용 API. |
| BGE-Reranker (BAAI) | 오픈 가중치, 다국어 변형. |
| Cross-Encoder/ms-marco | Sentence-Transformers 공개. |
| Jina Reranker | 다국어 · 코드 변형. |
Bi-encoder (임베딩) 는 두 텍스트를 따로 인코딩하지만 cross-encoder 는 쿼리·문서를 함께 입력해 더 깊은 상호작용을 봅니다. 정확하지만 비용이 크기 때문에 1 차 검색 뒤의 좁은 자리에서만.
6. 하이브리드 검색
키워드 검색 (BM25 · Postgres tsvector) + 벡터 검색을 결합. 약어·고유명사·숫자 같은 토큰은 임베딩이 약할 때가 있어 키워드가 보완.
결합의 단순한 예 — RRF (Reciprocal Rank Fusion):
score(d) = Σ 1 / (k + rank_i(d)) # k 는 보통 60
각 검색기에서의 순위만 쓰는 단순한 함수이지만 잘 동작합니다.
7. 평가 지표
검색 단:
| 지표 | 의미 |
|---|---|
| Recall@K | 정답 문서가 상위 K 안에 있는 비율 |
| Precision@K | 상위 K 중 관련 있는 비율 |
| MRR | 첫 정답의 역순위 평균 |
| nDCG | 순위 가중치를 반영한 누적 이득 |
생성 단 — RAGAS · TruLens 같은 프레임워크가 컨텍스트 충실성 (faithfulness) · 정확성 · 답변 관련성을 LLM 으로 평가. 자동 평가는 참고용이고 수작업 검수와 함께 봅니다.
8. 다른 길들
- Long-context LLM — Gemini 1.5 Pro 의 1M 토큰, Claude 3 의 200k 토큰 같은 큰 컨텍스트로 RAG 없이 통째로 넣는 접근. 비용 · 지연 · "lost in the middle" 과 균형.
- Fine-tuning — 도메인 데이터를 직접 학습. 자료가 거의 정적이고 양이 충분할 때.
- 그래프 RAG — 문서를 엔티티·관계 그래프로. Microsoft 가 2024 년 GraphRAG 사례 공개.
- 에이전트형 검색 — LLM 이 검색 쿼리를 반복 생성·정련.
9. 메타데이터 결합
청크에 작성일 · 출처 URL · 문서 종류 · 태그를 컬럼으로 함께. RDBMS 의 WHERE 와 결합되는 자리가 pgvector 의 강점.
SELECT id, content
FROM chunks
WHERE doc_type = 'manual' AND created_at > now() - interval '30 days'
ORDER BY embedding <=> $1
LIMIT 20;
필터가 너무 좁으면 인덱스가 거른 후보가 적어 정확도가 떨어집니다. prefilter · postfilter 위치 결정이 데이터 분포에 달려 있습니다.
10. 자주 걸리는 자리
임베딩 모델 변경 시 재임베딩 — 다른 모델의 벡터 공간은 호환되지 않습니다. 마이그레이션 계획을 처음부터.
차원 불일치 — vector(1536) 컬럼에 다른 차원을 넣지 못합니다. 모델별 분리 컬럼·테이블.
거리 연산자와 인덱스 일치 — 인덱스를 vector_cosine_ops 로 만들었으면 <=> 만 인덱스를 씁니다.
컨텍스트 윈도 초과 — 검색 결과를 모두 LLM 에 넣으면 한도 초과. reranking · 요약과 결합.
lost in the middle — 컨텍스트 중간에 놓인 정보가 양 끝보다 모델에 덜 반영된다는 관찰 (Liu et al. 2023). 핵심 자료를 앞·뒤로.
중복 문서 — 같은 내용이 여러 청크로 들어가면 검색 결과가 동일 정보로 채워집니다. dedup 또는 MMR (Maximum Marginal Relevance).
평가 데이터 부재 — 자기 도메인 질문·정답 쌍이 없으면 모든 튜닝이 추측. 작은 평가셋부터.
하고픈 말
RAG 는 단순한 아이디어지만 청킹 · 임베딩 모델 · 인덱스 · 재정렬 · 평가의 각 자리가 모두 도메인 의존적입니다. 작은 평가셋을 먼저 만들어 두지 않으면 모든 튜닝이 감각에 머무릅니다. pgvector + Postgres 의 메타데이터 필터 결합은 작은~중간 운영의 가장 단순한 답이 됩니다.
Next
- prompt-design
- gemini-api
Lewis et al. RAG (2020) · Lost in the Middle (2023) · HNSW (Malkov · Yashunin) · pgvector · Pinecone Learn RAG · Cohere Rerank · RAGAS · Microsoft GraphRAG 를 참고합니다.