RAG(Retrieval-Augmented Generation)는 LLM과 검색 기술을 결합하여, 필요한 정보를 검색하고 검색 결과를 기반으로 질문에 답변하는 AI 시스템입니다. 간단한 RAG 시스템을 구현하는 건 그리 어렵지 않습니다. 그러나 프로덕트 수준의 RAG를 개발하거나, RAG의 성능을 끌어내는 일은 상당히 까다롭고 많은 자원이 소모되는 일입니다. 이번 포스팅에선 이러한 RAG 시스템을 효율적으로 구현 및 최적화해 주는 툴인 AutoRAG에 대해서 살펴보겠습니다.
문제 : RAG 최적화의 어려움
기본적인 RAG 시스템(또는 Naive RAG)을 구축하는 것은 간단할 수 있지만, 실제 프로덕트 단계에서 요구하는 성능을 가지기 위해선 더 많은 장치들을 필요로 합니다. 예를 들어, 검색 결과의 질을 높이기 위해 리랭커(reranker)를 추가한다거나, 다양한 프롬프팅(prompting) 전략을 도입하여 답변의 질을 높이거나, 벡터 검색 방식을 최적화하는 등 여러 가지 고급 기능들을 조합해야 합니다. 이처럼 성능 개선을 위해 여러 기능이 추가된 것을 Advanced RAG라 부릅니다.
여기서 문제는 이 다양한 기능들 중, 어떤 조합이 최선인지 아무도 모른다는 것입니다. 검색하는 문서의 종류, 사용자의 쿼리 특성, 서비스의 목적에 따라 최적의 조합은 매번 달라질 수 있기 때문이죠. 최적화를 위해 모든 조합을 일일이 실험하고, 질문과 답변 품질을 일일이 비교하는 것은 엄청난 시간과 비용이 필요합니다. 마치 끝없는 실험의 늪에 빠지는 것과 같죠.
AutoRAG: RAG 최적화를 자동화하는 도구
이 복잡한 최적화 과정을 단순화하고, 더 나아가 자동화해주는 도구가 바로 AutoRAG입니다. AutoRAG는 다양한 파라미터가 정의된 yaml 파일을 기반으로 여러 가지 조합을 자동으로 실험하고, 최적의 조합을 찾아주는 툴입니다. AutoRAG의 구성 요소와 최적화하는 방법에 대해서 살펴볼게요.
✔️ AutoRAG의 구성 요소들 ✔️
AutoRAG는 RAG의 주요 단계들을 노드로 표현하고, 각 노드 별로 적용할 수 있는 실험 요소들을 모듈로 나누어 관리합니다. 아래는 AutoRAG에서 정의된 주요 노드는 아래와 같습니다.
크게 보면 Query에 대한 전처리 단계인 Pre Retrieve와 검색 단계인 Retrive, 검색 이후의 Post Retrieve, 총 3개의 단계로 묶어 볼 수 있습니다. 이제 각각의 노드들이 어떤 기능을 담당하는지 살펴보겠습니다.
1. Query Expansion
사용자의 질문을 바로 검색에 활용하는 대신, 해당 질문을 LLM을 통해 보다 구체적으로 확장하는 방식입니다. 확장 방식으로는 Query Decomposition, HYDE, Multi Query Expansion 등이 있으며, 각각은 LLM을 활용하여 쿼리를 더욱 정교하게 만듭니다. 이러한 쿼리 확장을 통해 검색 시 더 풍부한 쿼리의 질을 확보할 수 있기 때문에, 검색 성능이 향상될 것이라는 가설이 있습니다. Query Expansion의 효과는 Retrieval 단계의 성능을 통해 간접적으로 평가됩니다.
2. Retrieval
query를 바탕으로 관련 문서의 단락을 찾는 단계입니다. BM25와 같은 키워드 기반 검색과 VectorDB를 활용한 의미론적 검색을 모두 지원하며, 두 가지 방식을 결합한 Hybrid 방식도 사용할 수 있습니다. 개인적으로 한국어 문서에 대해서는 Hybrid 방식이 좋은 성능을 보여 추천드립니다. 평가 지표로는 F1-score, precision, recall, ndcg, mrr, map 등이 사용됩니다.
3. Passage Augmenter
검색된 단락을 그대로 활용하는 대신, 해당 단락의 앞뒤 내용을 추가로 가져오는 방법입니다. 검색된 단락만 활용하는 게 아니라, 주위 문맥을 함께 가져오는 덕분에 답변 생성 시 LLM이 더 풍부한 자료를 가지고 답변을 생성할 수 있게 됩니다.
4. Passage Reranker
검색된 문서 단락들을 보다 정교하게 재정렬하는 단계입니다. 검색 자체도 중요하지만, 더욱 의미 있는 순서로 결과를 재정렬함으로써 성능을 향상시킬 수 있습니다. 한 실험의 내용으로, 검색된 문서들을 LLM에게 제공할 때, 중간에 위치하는 정보는 LLM이 잘 파악하지 못하는 경향이 있다는 것을 확인한 바가 있습니다. 이러한 문제를 Lost in Middle이라고 합니다. 즉, 질문과 관련된 문서일수록, 상위에 존재해야 할 필요가 있는 것이죠. 이러한 재정렬의 중요성에 대해서는 AWS 기술 블로그에서도 강조되고 있습니다.
5. Passage Filter
검색된 단락 중에서 질문과 관련이 없는 부분을 제거하는 과정입니다. 불필요한 단락이 답변 생성에 포함되면 LLM이 혼란을 겪거나 할루시네이션을 일으킬 수 있기 때문에 필터링을 통해 질을 높이는 것이 중요합니다.
6. Passage Compressor
검색된 여러 단락을 LLM에 전달하기 전에 요약하는 단계입니다. 요약을 통해 핵심 정보를 간결하게 전달하면, 더 나은 답변을 기대할 수 있습니다. 또한, 토큰 사용량을 줄임으로써 운영 비용과 응답 속도를 개선할 수 있습니다.
7. Prompt Maker
Prompt Engineering은 원하는 답변을 이끌어내기 위해 매우 중요한 요소입니다. 다양한 프롬프트를 리스트 업하고 실험하여 최적의 프롬프트를 찾아나갑니다. Promp Maker는 그 자체적으로는 평가가 불가하여, 추후 나올 Generator의 성능을 통해 간접적으로 평가됩니다.
8. Generator
답변을 생성하는 LLM 자체를 다양하게 적용하며, 어떤 LLM이 가장 적합한지 실험합니다. OpenAI를 비롯하여 다양한 로컬 LLM도 활용할 수 있으며, 성능 평가 지표로는 bleu, meteor, rouge, sem_score, g_eval, bert_score 등이 사용됩니다.
✔️ AutoRAG 평가 데이터셋 ✔️
AutoRAG는 최적의 구성을 찾기 위해 평가 데이터셋을 활용합니다. 학생의 실력을 시험지로 평가하듯이, AI 모델의 성능을 측정하기 위한 기준 데이터가 필요합니다. 평가 데이터는 질문(query)과 그에 대한 정답(answer)으로 구성되며, 이 평가 데이터셋을 기반으로 점수를 매겨 각 노드별 최적화가 이루어집니다.
평가 데이터셋 구축 방법
- 질문(query) 생성: 특정 문서를 바탕으로 LLM이 자연스럽고 그럴듯한 질문을 생성합니다.
- 답변(answer) 생성: 생성된 질문에 대해, 해당 문서를 참고하여 LLM이 답변을 만들어냅니다.
이렇게 생성된 질문-답변 쌍은 평가 데이터로 활용되며, 이를 통해 AutoRAG는 다양한 조합을 실험하여 최적의 성능을 가진 구성을 찾아냅니다.
평가 데이터셋의 중요성
이 과정에서 중요한 것은 평가 데이터셋의 질입니다. LLM이 자동으로 생성한 질문-답변 쌍을 그대로 평가 데이터로 사용하기보다는, 도메인 지식을 가진 전문가가 해당 평가 데이터를 전처리하고 관리하는 것이 중요합니다. 유저들이 실제로 어떤 질문을 할지, 질문의 유형이나 난이도, 맥락을 고려하여 데이터셋을 사람이 관리해 줄 필요가 있는 것이죠. 생성된 평가 데이터셋을 기반으로 최적화가 진행되므로, 이 단계는 최적화 과정 중 가장 중요한 단계라고 할 수 있습니다.
마무리
단순히 많은 기능을 추가한다고 해서 RAG의 성능이 개선되지는 않습니다. 상황에 맞게 적절한 요소를 매번 찾아가는 과정이 꼭 필요하죠. AutoRAG는 이 복잡한 과정을 자동화하여 최적의 RAG 구성을 손쉽게 찾을 수 있도록 도와줍니다. 실험을 자동화해 주는 것으로 끝이 아니라, 해당 실험 결과를 바탕으로 최적의 RAG 시스템을 FastAPI로 배포해 주는 기능도 있습니다. 실험 결과를 간단 데모로 보여주기에 아주 유용한 기능이죠. 만약 RAG를 처음 접하시는 분이라면, AutoRAG를 살펴보시면서 Advanced RAG에는 어떤 요소들이 있는지 공부해 보는 것도 많은 도움이 되실 것 같습니다.
AutoRAG : https://github.com/Marker-Inc-Korea/AutoRAG
여담 1)
AutoRAG는 한국 팀이 만든 오픈소스입니다. RAG를 설계해 보신 분들을 아실 테지만, 한국어에 최적화된 RAG 시스템을 구현하는 것은 또 다른 어려운 과제입니다. AutoRAG를 자세히 들여다보시면, 한국어 전용 RAG를 구현하기 위해 많은 노력들이 묻어나 있는 것을 볼 수 있습니다.
여담 2)
여러 세미나를 통해 AutoRAG 팀을 간접적으로 만나 뵌 적이 있는데요, 정말 똑똑하시고 열정적인 팀입니다. AutoRAG라는 오픈소스에 대한 향후 로드맵에 대해서 자세히 들어봤을 때, 제가 RAG를 공부하고 구현하는 과정에서 AutoRAG는 필수템이 될 것 같다는 확신이 들었습니다. 더 많은 분들이 AutoRAG를 활용해 주시고 도움을 얻어 가셨으면 좋겠습니다😁
'Tech > Generative AI' 카테고리의 다른 글
[후기] 우아한 스터디 : 프롬프트 엔지니어링 (3) | 2024.11.24 |
---|---|
Rag : 나만의 LLM을 만들자 (0) | 2024.03.03 |
GPTs, 나의 과거 프로젝트를 구현하다. (0) | 2024.01.21 |
[StableDiffusion] Virtual Try On : AI로 원하는 옷 입히기 (1) | 2024.01.07 |
[Stable Diffusion] ControlNet이란? ControlNet의 종류 (1) | 2023.09.16 |