RAG 파이프라인이 표준 부하 테스트를 가뿐히 통과합니다. p95 지연 시간도 양호하고 에러율도 거의 0에 가깝습니다. 하지만 사용자들은 질문을 회피하거나, 존재하지 않는 문서를 인용하거나, 6개월 전에 업로드된 백서에서 무관한 단락을 들춰내는 답변을 보고합니다. 대시보드는 모든 것이 정상이라고 말하지만, 실제 경험은 망가졌다고 말합니다.
이러한 괴리가 발생하는 이유는 기존의 성능 테스트가 '생각하는 시스템'이 아닌 '요청-응답 시스템'을 위해 설계되었기 때문입니다. REST 엔드포인트에 수천 개의 병렬 요청을 보낼 때, 여러분은 서버가 버티는지를 알 수 있습니다. 하지만 검색 레이어가 올바른 청크를 가져오는지, 프롬프트 템플릿이 컨텍스트를 유지하는지, 혹은 벡터 스토어가 비어 있을 때 모델이 출처를 지어내는지에 대해서는 아무것도 알 수 없습니다. 표준 부하 테스트는 속도를 측정합니다. RAG 애플리케이션은 이해도를 측정할 것을 요구합니다.
상태 코드 200 그 이상
일반적인 API 부하 테스트는 가용성, 지연 시간, 처리량이라는 세 가지를 확인합니다. 서버가 응답했는지, 얼마나 걸렸는지, 얼마나 많은 동시 사용자를 견뎌냈는지를 묻습니다. RAG 애플리케이션에서 이러한 수치는 결론이 아니라 전제 조건입니다. 빠른 오답은 여전히 오답이며, 대규모 환경에서의 오답은 느린 답변보다 더 큰 비용을 초래합니다.
RAG는 모든 요청에 두 가지 별도의 단계를 추가합니다. 첫째, 시스템은 사용자 질문을 임베딩으로 변환하고, 벡터 스토어를 쿼리하여 컨텍스트 청크 세트를 가져옵니다. 둘째, 이 청크들을 프롬프트에 집어넣고, 모든 내용을 언어 모델로 보내 완료된 내용을 스트리밍합니다. 전통적인 테스트는 종종 이를 단일 "응답 시간" 지표로 통합해 버립니다. 검색 엔진과 생성기를 하나의 블랙박스로 취급하는 것입니다.
여러분은 그 박스를 열어봐야 합니다. 부하 상황에서 벡터 데이터베이스가 느려지면 검색 지연 시간이 상승합니다. LLM은 여전히 빠르게 응답할 수 있지만, 서둘러 가져온 쓰레기 컨텍스트를 바탕으로 응답하게 됩니다. 반대로, 벡터 검색은 빠르지만 LLM 큐가 쌓여 사용자가 깜빡이는 커서만 바라보게 될 때까지 첫 번째 토큰 생성 시간(time-to-first-token)이 늘어날 수도 있습니다. 단일 엔드-투-엔드 타이머는 이 두 가지 실패를 모두 숨깁니다.
데이터베이스만이 아닌 검색을 테스트하라
대부분의 팀은 간단한 벡터 검색 벤치마크를 실행하고 검색 레이어 테스트를 마쳤다고 생각합니다. 하지만 그 벤치마크는 대개 선정된 쿼리에 대해 데이터베이스가 얼마나 빨리 최근접 이웃을 반환하는지만 측정합니다. 그 이웃들이 실제로 정답을 포함하고 있는지는 거의 측정하지 않습니다.
검색 품질은 부하에 따라 미묘한 방식으로 변합니다. 동시 요청 압박이 가해지면 근사 최근접 이웃(ANN) 인덱스는 격리된 상태에서와 다르게 동작할 수 있습니다. 노트북 환경에서 완벽해 보였던 청킹 전략도 만 개의 문서가 동일한 임베딩 공간을 두고 경쟁할 때는 경계 사이에서 컨텍스트가 새어나가기 시작합니다. 조용한 환경에서는 이상적인 단락을 반환하던 쿼리가, 인덱스가 재구축 중이거나 요청 압박으로 인해 메타데이터 필터링이 누락될 때는 잘못된 마케팅 슬라이드를 노출할 수도 있습니다.
이를 제대로 테스트하려면 그라운드 트루스(ground-truth) 데이터셋이 필요합니다. 어떤 소스 문서가 나타나야 하는지 이미 알고 있는 질문들을 선별하십시오. 다양한 동시성 수준에서 해당 질문들을 실행하고, 예상되는 청크가 top-k 결과에 포함되는지 확인하십시오. 단순히 쿼리 지속 시간뿐만 아니라 히트 레이트(hit rate)를 추적하십시오. 만약 상위 5개 청크에 핵심 소스가 전혀 포함되지 않는다면, LLM이 깨어나기도 전에 검색 파이프라인은 이미 실패한 것입니다.
또한 경계 조건(edge cases)에 대한 스트레스 테스트도 수행해야 합니다. 코퍼스에 답이 없는 쿼리를 제출하십시오. 여러 도메인에 걸쳐 있을 수 있는 모호한 질문을 제출하십시오. 임베딩 모델의 토큰 제한을 초과하여 조용히 잘려 나가는 긴 질문을 제출하십시오. 검색 레이어가 무엇을 반환하는지 지켜보십시오. 각 경우에서, 경과된 밀리초(ms)보다 실패 모드가 더 중요합니다.
모델이 조용히 막힐 때
청크가 LLM에 도달하면, 표준 부하 테스트는 계속해서 거짓말을...
