Most RAG Problems Are Retrieval Problems. Here Are 8 Fixes That Worked for Me

개요

Retrieval-Augmented Generation (RAG) 시스템의 성능 문제는 종종 모델 자체보다 검색(Retrieval) 단계의 문제에서 비롯되며, 이를 해결하기 위한 8가지 기법이 제시됩니다.

주요 내용

* 청크(Chunk) 크기 및 오버랩(Overlap) 최적화: RecursiveCharacterTextSplitter를 사용하여 청크 크기(예: 1000)와 오버랩(예: 200)을 설정하며, 이는 후속 처리의 기반이 됩니다. 너무 크면 노이즈에 묻히고, 너무 작으면 문맥을 잃습니다. 오버랩은 경계를 넘는 정보가 잘리는 것을 방지합니다.
* 문맥화 청킹(Contextual Chunking): llm(doc, chunk) 함수를 사용하여 각 청크에 대한 짧은 문맥 설명을 추가하여 임베딩합니다. 이를 통해 모호한 청크의 검색 가능성을 높입니다.
* 하이브리드 검색 (BM25 + Dense): 벡터 검색은 의미 기반 검색에, BM25은 오류 코드, 제품명 등 문자열 검색에 강점을 가지므로 두 가지를 함께 사용합니다. collection.query.hybrid(query, alpha=0.5)와 같은 방식으로 통합합니다.
* 재랭킹(Reranking): co.rerank(model="rerank-v3.5", query=q, documents=texts, top_n=10)와 같은 기능을 사용하여 검색된 문서 쌍을 더 면밀히 평가하여 순서를 재조정합니다. LLM 호출 비용 대비 정확도를 크게 향상시킵니다.
* 부모-문서 검색기(Parent-document Retriever): 작은 청크로 검색하여 정확한 지점을 찾고, 더 큰 주변 청크를 LLM에 전달하여 추론 공간을 확보합니다.
* 질문 재작성(Rewrite the query): MultiQueryRetriever.from_llm(retriever, llm)를 활용하여 사용자의 질문을 문서 작성 방식과 다르게 표현하는 경우, 여러 변형을 생성하거나 가짜 답변을 생성하는 등의 방식으로 검색을 개선합니다.
* 메타데이터 필터링(Filter on metadata): where={"source": "handbook"}와 같이 출처, 날짜, 섹션 등의 메타데이터를 사용하여 벡터 검색 이전에 후보군을 줄여 검색 속도와 정확도를 높입니다.
* RRF(Reciprocal Rank Fusion)를 사용한 퓨징(Fuse): 여러 개의 랭킹 리스트를 점수 보정 없이 병합하여 최종 순위를 결정합니다.
* 중복 제거 / MMR(De-dupe / MMR): SimilarityPostprocessor + dedup을 사용하여 동일한 내용을 담고 있는 청크가 중복으로 LLM에 전달되는 것을 방지합니다.

시사점

RAG 시스템의 품질은 검색(Retrieval) 성능에 크게 좌우되며, 위에 제시된 기법들은 상호 보완적으로 작용하여 검색 결과를 개선하고 궁극적으로 RAG 시스템의 전반적인 정확도를 향상시킬 수 있습니다.

원문 읽기 →
원문을 불러오는 중...

댓글

GitHub Discussions