RAG 만들기는 쉽다

RAG은 LLM이 응답을 생성할 때, 관련된 문서를 참고하도록 하는 기술이다. RAG을 만든다고 하면 문서 수집기, 전처리기, 검색기 등을 모두 구현하면 된다. 이게 어렵다면 LangChain이나 LlamaIndex같은 프레임워크를 사용할 수도 있다. 이 같은 프레임워크들은 미리 만들어진 여러 기능들을 제공하여, 매우 간단하게 RAG을 구현할 수 있도록 해준다. 이것조차 번거롭다면 상용 서비스를 이용하면 된다. 주요 클라우드 업체들이 제공하는 Amazon Bedrock, Azure AI Search, Vertex AI Search와 같은 관리형 RAG 서비스들이 있다. RAG의 각 요소들을 직접 구현할수도 있고, 프레임워크를 사용할 수도 있고, 상용 RAG 서비스를 이용할 수도 있다. RAG을 만들기는 쉽다.
RAG 잘 만들기는 어렵다. 특히 검색기!
LLM이 답변을 생성할 때, 모델의 지식에만 의존하는 것이 아니라 외부 문서를 참조한다는 것이 RAG의 핵심이다. 이 과정에서 LLM은 저장된 모든 문서를 참조하는 것이 아니라, 오직 검색기가 가져다준 몇 개의 문서만을 참조할 수 있다. 따라서 RAG 시스템의 성능은 전적으로 검색기가 얼마나 적절한 문서를 가져다 주는지에 의해 결정된다. 생성된 답변의 품질은 검색된 문서의 품질이라는 명확한 상한선을 가진다.
검색기의 성능이 좋지 못할 경우, 응답에 필요한 관련 문서를 찾지 못할 수 있다. 검색기가 사용자의 질문에 답변하는 데 필요한 문서를 찾아내지 못한다면, LLM은 답변을 생성할 사실적 근거를 전혀 갖지 못하게 된다. 이를 방지하고자 더 많은 문서를 가져오게 할 수도 있다. 하지만 관련 문서가 수많은 관련 없는 문서와 함께 전달된다면 LLM은 노이즈로 가득 차게 될 것이다. 이는 모델을 혼란스럽게 만들어 부정확하거나, 초점이 맞지 않거나, 불완전한 답변을 생성하게 만든다.
이러한 내용은 RAG 시스템의 성능 개선 방향에 중요한 시사점을 준다. 답변 품질이 낮을 때 더 강력한 LLM 모델로 교체하려는 유혹을 느낄 수 있다. llama-3-8B 모델을 llama-3-70B 모델로 바꾸고 싶을 수 있다. 하지만 검색기가 애초에 올바른 정보를 가져오지 못했다면, 아무리 뛰어난 LLM이라도 없는 사실을 만들어낼 수는 없다. 따라서 RAG 성능을 개선하기 위해서는 검색기의 성능을 향상시켜야 한다.
검색기 평가 데이터셋: BeIR/scifact



검색기의 품질을 정량적으로 평가할 수 있어야, 검색기의 성능을 향상시킬 수 있을 것이다. 견고한 평가를 위해서는 '정답'이 정의된 벤치마크 데이터셋이 필수적이다. RAG 평가를 위한 데이터셋은 질문 데이터셋, 문서 데이터셋, 질문-관련 문서 쌍 데이터셋 으로 이루어져있다. BeIR/scifact 데이터셋를 보면 queies, corpus, qrels로 구성되어있다. 이 외에도 수많은 데이터 셋이 있고, 필요에 따라 직접 데이터셋을 만들어서 성능을 평가할 수도 있을 것이다.
검색기 평가 지표: hit-rate, NDCG
Hit Rate는 가장 직관적인 검색 평가 지표이다. 질문에 대한 문서 검색 결과에 정답 문서가 하나라도 포함된 질문의 비율을 의미합니다. 이때 검색 상위 K개의 포함된 비율을 Hit Rate@K 라고 한다. NDCG는 검색 및 추천 시스템 분야에서 순위 품질을 평가하는 최고의 지표로 인정받으며, RAG 검색기 평가에도 적합한 지표이다. NDCG는 단순히 관련 문서를 찾았는지가 아니라, 가장 관련성 높은 문서들을 상위에 배치했는지까지 보는 지표이다.
BeIR/scifact 데이터셋으로 OpenAI의 text-embedding-3-small과 text-embedding-3-large의 성능을 평가해 보았다. corpus 데이터셋을 별도의 전처리 없이 임베딩하였고, queies 역시 그대로 임베딩하여 코사인 거리가 가장 까까운 10개의 문서를 찾아서 Hit Rate@10과 NDCG@10을 측정해보았다.
| Hit Rate@10 | NDCG@10 | |
| text-embedding-3-small | 0.8633 | 0.7309 | 
| text-embedding-3-large | 0.9067 | 0.7767 |