1. Introduction
- 대형 언어 모델(LLMs)은 인간 피드백에 기반한 정렬(reinforcement learning from human feedback, RLHF)에도 불구하고, 여전히 오래된 정보 생성, 사실 왜곡(hallucination) 문제를 가진다.
- Retrieval-Augmented Generation(RAG)은 사전학습(pretraining)과 검색 기반(retrieval-based) 모델의 장점을 결합하여 이 문제를 해결하는 방법이다.
- RAG는 모델 파라미터를 수정하지 않고 특정 조직/도메인에 특화된 응용을 빠르게 배포할 수 있게 한다.
- RAG 워크플로우
- 쿼리 분류(Query Classification)
- 검색(Retrieval)
- 재정렬(Reranking)
- 재구성(Repacking)
- 요약(Summarization)
- 각 단계는 다양한 방법으로 구현할 수 있으며, 각각 성능과 효율성에 영향을 미친다.
- 본 연구는 RAG 각 모듈의 다양한 구현 방법을 비교하고, 최적 조합을 찾아내어 RAG 시스템의 성능과 효율성을 균형 있게 향상시키는 전략을 제안한다.
2. Related Work
2.1. Query and Retrieval Transformation
- 검색 성능 향상을 위해 쿼리를 변환하거나, 검색 대상을 변형하는 다양한 방법이 제안되었다.
- 대표적 기법
- Query2Doc, HyDE: 쿼리로부터 의사 문서(pseudo-document)를 생성하여 검색 성능 향상
- TOC(Tree of Clarifications): 쿼리를 세부 질문으로 분해하여 검색
- 검색 대상을 변환하는 방법
- LlamaIndex: 문서로부터 의사 쿼리(pseudo-query)를 생성해 매칭 성능 향상.
- 대조학습 기반 임베딩: 쿼리-문서 임베딩 간 거리를 좁히는 방식.
2.2. Retriever Enhancement Strategy
- 검색 품질을 높이기 위해 문서를 적절히 chunking하고, 임베딩을 고도화하는 연구가 진행되었다.
- Chunking 기법: Small2Big, Sliding Window
- Reranking 필요성: 초기 검색 결과를 BERT, T5, LLaMA 기반 모델로 재정렬하여 검색 품질 향상
2.3. Retriever and Generator Fine-tuning
- 검색기(retriever)와 생성기(generator)를 별도로 또는 통합적으로 파인튜닝하여 성능을 최적화하는 연구가 진행되었다.
- RAG를 통합 시스템으로 보고 동시 학습(joint fine-tuning)하는 방법도 제안되었다.
3. RAG Workflow
3.1. Query Classification
- 모든 쿼리가 검색을 필요로 하는 것은 아니므로, 쿼리 분류기를 통해 필요 여부를 판정한다.
- "정보가 충분한" 쿼리는 검색 없이 직접 답변하고, "불충분한" 쿼리만 검색을 거친다.
- 111K 쿼리 데이터셋을 구축해 분류기를 훈련시켰으며, BERT-base-multilingual-cased 모델을 사용했다.
3.2. Chunking
- 문서 청킹은 검색 정확도를 높이고 LLM 입력 길이 한계를 해결하기 위해 필요하다.
- 청킹 단위:
- 토큰 단위
- 문장 단위 (본 연구 기본 설정)
- 의미 단위(LLM 이용)
- 추가적으로 메타데이터(title, keyword 등)를 붙여 검색 품질을 높일 수 있다.
- 임베딩 모델로는 LLM-Embedder를 채택했다.
3.3. Vector Databases
- 검색을 위한 벡터 DB로 Milvus, Faiss, Weaviate, Qdrant, Chroma를 평가하였다.
- 기준: 다양한 인덱스 지원, 대규모 데이터 처리, 하이브리드 검색 지원, 클라우드 친화성.
- 최종적으로 Milvus를 채택했다.
3.4. Retrieval Methods
- 검색 성능 향상을 위해 다음 세 가지 쿼리 변형 방법을 비교했다:
- 쿼리 리라이팅(Query Rewriting)
- 쿼리 분해(Query Decomposition)
- 의사 문서 생성(Pseudo-document Generation; HyDE)
- BM25 + Contriever 조합과 하이브리드 검색(Hybrid Search)을 비교 분석.
- 최종적으로 Hybrid Search + HyDE 방법이 가장 높은 성능을 기록했다.
3.5. Reranking Methods
- 초기 검색 결과를 재정렬하여 품질 향상.
- 방법:
- DLM Reranking: monoT5, monoBERT, RankLLaMA 사용.
- TILDE Reranking: 빠른 재정렬을 목표로 한 전통적 확률 기반 접근.
- 최종적으로 monoT5를 기본 선택으로 채택했다.
3.6. Document Repacking
- 검색 결과를 어떻게 배열하느냐에 따라 생성 품질이 달라진다.
- 방법:
- Forward (높은 점수부터)
- Reverse (낮은 점수부터)
- Sides (가장 관련성 높은/낮은 정보를 양 끝에 배치)
- 실험 결과, Reverse 방식이 최적이었다.
3.7. Summarization
- 검색된 문서에서 핵심 내용을 요약하여 입력 길이를 줄이고 응답 품질을 높인다.
- 요약 방법:
- Recomp: 추출적, 생성적 요약 둘 다 가능.
- LongLLMLingua: 압축 요약, 일반화에 강함.
- 최종적으로 Recomp를 기본 요약 방법으로 선택했다.
3.8. Generator Fine-tuning
- 생성기는 검색 결과의 품질에 민감하므로, 파인튜닝이 필요하다.
- 다양한 맥락 조합으로 모델을 훈련:
- 골드 컨텍스트만(Dg)
- 무작위 컨텍스트만(Dr)
- 골드+무작위(Dgr)
- 골드 2개(Dgg)
- Dgr 방식(골드와 랜덤을 섞어 훈련)이 가장 강건한 성능을 보였다.
4. Searching for Best RAG Practices
4.1. Comprehensive Evaluation
- 다양한 태스크 (상식 추론, 팩트 체크, 오픈 도메인 QA, 멀티홉 QA, 메디컬 QA)에 대해 평가를 실시
- 평가 지표: Faithfulness, Context Relevancy, Answer Relevancy, Answer Correctness, Retrieval Similarity.
4.2. Results and Analysis
- Query Classification: 성능 향상과 응답 속도 개선에 크게 기여
- Retrieval: Hybrid + HyDE가 가장 좋은 성능을 보였지만, 계산 비용이 높았음
- Reranking: monoT5가 가장 우수했으며, 필수적이었음
- Repacking: Reverse 구성이 최적
- Summarization: Recomp가 의미 왜곡 없이 정보를 보존함
- 종합적으로 모든 모듈이 성능 개선에 기여함
5. Discussion
5.1. Best Practices for Implementing RAG
- 최고 성능 목표
- Query Classification 사용
- Hybrid with HyDE 검색
- monoT5 Reranker
- Reverse Repacking
- Recomp Summarizer
- 성능-효율 균형 목표
- Query Classification 사용
- Hybrid 검색
- TILDEv2 Reranker
- Reverse Repacking
- Recomp Summarizer
5.2. Generalization of Best Practices
- 모든 태스크에 완벽하게 적용되지는 않으므로, 각 모듈별로 조합을 평가하고 최적화를 해야 함을 강조하였다.
5.3. Multimodal Extension
- 텍스트 외에도 이미지(text-to-image, image-to-text)를 검색 대상으로 삼아, 멀티모달 RAG 확장을 시도했다.
- Retrieval-as-Generation 전략을 통해 효율성과 정합성(groundedness)을 향상시켰다.
6. Conclusion
- RAG 시스템을 최적화하기 위한 모듈별 평가와 최적 조합을 체계적으로 제시하였다.
- 새로운 평가 벤치마크를 도입하고, 대규모 실험을 통해 최적 관행(best practices)을 검증하였다.
- 향후 연구 방향으로 리트리버-제너레이터 통합 파인튜닝, 다른 모달리티(음성, 비디오 등) 확장을 제시하였다.
Limitations
- 본 연구는 생성기 파인튜닝만 다루었고, 리트리버 파인튜닝은 미래 연구로 남겨두었다.
- 청킹 기술의 전체 시스템에 미치는 영향은 추가 연구가 필요하다.
- 실험은 NLP 및 이미지 생성에 집중되었으며, 음성, 비디오 모달리티로 확장할 계획이다.
프로젝트 활용
대규모 코드베이스 검색 최적화 (Chunking, Embedding, Retrieval)
- 코드 파일을 청킹하고(chunking)
- 코드를 의미 기반으로 임베딩하고(embedding)
- 적절한 벡터 DB를 활용해 검색하는(retrieval) 체계
→ 코드베이스 검색 효율화!
- Chunking: 함수 단위, 클래스 단위, 또는 의미 단위로 코드 청킹 가능
- 'Small2Big' 전략: 작은 코드 블록 먼저 매칭하고, 이후 확장
- Embedding 모델
- 코드베이스 특화 Embedding(CodeBERT, GraphCodeBERT, starcoder embeddings)로 대체할 수 있음
- Vector Database
- Milvus, Faiss, Qdrant 등으로 코드 청크 임베딩을 저장하고 검색 가능
- 수십~수백만 단위 코드 청크에 대해 확장성 보장
→ 코드 청킹, 임베딩, 벡터DB 구축 → 검색까지 RAG 전처리 파이프라인 구축
검색 결과 최적화 (Retrieval + Reranking)
- LLM이 취약점을 찾을 때, 단순히 검색된 코드만 사용하는 것이 아니라 검색된 결과를 reranking하여 더 유효한 코드 조각을 우선순위로 주는 것이 중요
- Hybrid Retrieval (BM25 + Dense Retrieval)
- 오타나 특수 토큰이 많은 코드베이스에 매우 유효
- Reranking
- monoT5와 같은 딥러닝 기반 Reranker를 적용하여 취약점 탐지에 더 적합한 코드 청크를 상위에 배치할 수 있음
→ 우리가 코드 검색 후 LLM에 넘기기 전에 reranking 단계를 추가하여 LLM 응답 품질을 높일 수 있음
검색 결과 정제 및 요약
- 검색된 코드 조각이 너무 크거나 중복된 경우 LLM이 문맥 길이 제한 때문에 제대로 이해하지 못할 수 있다.
→ Recomp Summarization 방식 적용- 검색된 다수의 코드 조각 중 취약점 분석에 필수적인 부분만 추출하고 요약하여 LLM 입력 길이를 최적화
→ 우리가 최종적으로 LLM에 넣어줄 코드를 가볍게 요약, 최적화할 수 있음
LLM Fine-tuning
- 실제 코드 취약점 탐지는 정답과 관련 없는 코드 조각이 함께 있을 가능성이 높음
→ 노이즈가 섞인 입력에도 강인한 LLM이 필요 - Relevant + Random Context Fine-tuning (Dgr 방식)
- 골드 문맥과 무작위 문맥을 섞어서 LLM을 훈련하면 노이즈에 강하고, 정확성도 유지하는 LLM을 만들 수 있음
→ 우리 프로젝트에서 fine-tuning을 고려할 경우 매우 유용한 전략이 될 수 있음