Vector Search 지연 시간 위기: RAGFlow 메모리 레이어 통합을 통해 배운 점
요약
본 기사는 RAGFlow를 에이전트 메모리 파이프라인에 통합하는 과정에서 발생한 Vector Search의 성능 병목 현상과 이를 해결한 방법을 다룹니다. HNSW 인덱스 잠금 경합 문제를 쓰기/읽기 전용 이중 인덱싱으로 해결하고, 임베딩 정규화를 통해 재현율을 높였으며, RRF를 사용한 하이브리드 검색을 구현하여 성능을 크게 개선했습니다.
핵심 포인트
- HNSW의 동시성 쓰기 한계를 극복하기 위해 IVFFlat/HNSW 이중 인덱스 스키마 적용
- 임베딩 벡터는 코사인 유사도 계산 전 반드시 정규화(Normalization)를 수행해야 함
- 벡터 검색만으로는 부족하며, RRF를 활용한 하이브리드 검색이 답변 관련성을 높임
- 성능 개선 결과: 삽입 처리량 50/s → 180/s, p95 지연 시간 4.2초 → 120ms
문제점: Vector Search가 병목 현상이 될 때
RAGFlow를 에이전트 메모리 파이프라인에 통합하는 과정에서, 초당 약 50개의 동시 문서 삽입 지점에서 한계에 부딪혔습니다. 쿼리 지연 시간은 80ms에서 4초 이상으로 급증했고, 재현율(recall rates)은 30% 감소했습니다. 원인은 무엇일까요? HNSW 인덱스 잠금(index locks)과 부적절한 임베딩 정규화였습니다.
RAGFlow는 검색(retrieval)을 에이전트 기능과 결합하는 견고한 오픈소스 RAG 엔진이지만, 모든 vector search 시스템과 마찬가지로 높은 부하 조건에서 PostgreSQL의 pgvector 특유의 문제에 노출됩니다. 무엇이 잘못되었는지, 그리고 프로덕션 배포를 안정화시킨 정확한 해결책들을 소개합니다.
근본 원인 1: HNSW 인덱스 잠금 경합(Lock Contention)
pgvector의 HNSW 인덱스는 높은 동시성 쓰기 작업에 최적화되어 있지 않습니다. 대량 문서 수집(bulk document ingestion) 과정에서, INSERT 쿼리들이 서로를 막는 현상(blocking)이 발생하여 '호위대 효과(convoy effect)'가 나타났습니다.
해결책: 쓰기 전용 인덱스와 읽기 전용 인덱스 분리
저희는 쓰기 작업에는 IVFFlat을, 읽기 작업에는 HNSW를 사용하는 이중 인덱스 스키마를 만들었습니다:
-- 이중 인덱싱을 갖춘 에이전트 메모리 청크용 스키마
CREATE TABLE agent_memory_chunks (
id BIGSERIAL PRIMARY KEY,
...
IVFFlat 인덱스는 블로킹 없이 삽입(inserts)을 처리하고, HNSW가 읽기(reads)를 담당합니다. 트래픽이 적은 시간에 HNSW를 비동기적으로 재구축하세요:
-- 쓰기 작업을 막지 않고 HNSW 재구축
REINDEX INDEX CONCURRENTLY idx_memory_hnsw;
에이전트별 필터링을 사용한 쿼리:
SELECT id, chunk_text, metadata,
1 - (embedding <=> $1::vector) AS similarity
FROM agent_memory_chunks
...
근본 원인 2: 임베딩 정규화 부족이 재현율을 떨어뜨림
저희는 처음에 OpenAI의 API에서 받은 원시(raw) 임베딩을 정규화 없이 저장했습니다. pgvector의 코사인 유사도(Cosine similarity)는 단위 벡터(unit vectors)를 기대하지만, 저희 임베딩은 크기(magnitudes)가 다양하여 의미적으로 유사한 청크들이 낮은 순위로 평가되는 문제가 발생했습니다.
해결책: 쓰기 시점에 정규화 수행
import numpy as np
from typing import List
...
정규화를 수행한 후, 테스트 세트에서 recall@10이 0.68에서 0.91로 급증했습니다.
전달할 내용 2: Reciprocal Rank Fusion을 사용한 하이브리드 검색
벡터 검색만으로는 정확한 키워드 일치(exact keyword matches)를 놓칩니다. 저희는 pgvector와 PostgreSQL의 전체 텍스트 검색(full-text search)을 RRF(Reciprocal Rank Fusion)로 융합하는 하이브리드 검색을 구현했습니다:
import psycopg2
from typing import List, Tuple
...
결과 (The Outcome)
이러한 변경 사항 적용 후:
- 삽입 처리량(Insert throughput): 50/s → 180/s
- 쿼리 p95 지연 시간(Query p95 latency): 4.2초 → 120ms
- Recall@10: 0.68 → 0.91
- 하이브리드 검색은 A/B 테스트에서 답변 관련성(answer relevance)을 23% 향상시켰습니다.
RAGFlow 또는 모든 벡터 기반 RAG 시스템을 평가할 때는 메모리 레이어에 대한 스트레스 테스트를 조기에 수행해야 합니다. 인덱싱 전략과 임베딩 위생(embedding hygiene)이 모델 선택보다 더 중요합니다.
광고 없음, 스폰서 없음
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기