일반적 RAG turn 에서 시간이 가는 곳
- Query 임베딩 — 30–200 ms (호스티드) 또는 5–20 ms (로컬 작은 모델)
- 벡터 검색 — 5–50 ms (Chroma, single-node) 또는 1–10 ms (HNSW 의 pgvector)
- (옵션) BM25 — 5–30 ms
- (옵션) 50개 cross-encoder rerank — 100–500 ms (CPU) 또는 30–150 ms (GPU)
- LLM 생성 — 500ms (작은) ~ 10s (큰 + 긴 출력). 다른 거 다 dominate.
최적화 순서
먼저 profile, dominant 비용 최적화. LLM 호출이 4초인데 query 임베딩을 100ms 에서 10ms 로 줄이는 건 낭비된 노력. LLM 응답 streaming 이 retrieval latency 절반으로 줄이는 것보다 보통 큰 UX win.
threading 아니라 async
Retrieval 은 I/O bound. async (Python 의 asyncio, 다른 데서는 async/await) 사용해서 아키텍처 허용할 때 임베딩 호출, 벡터 검색, BM25 평행 issue. Threading 은 이 작업의 잘못된 abstraction.