Advanced RAG (고급 RAG)

2. Advanced RAG (고급 RAG)

2.1 Advanced RAG란 무엇인가요?

Advanced RAG는 Naive RAG의 한계를 개선한 RAG입니다. 핵심은 “검색 품질을 올리는 테크닉의 집합”이라는 것입니다. Naive RAG가 단순히 “검색하고 답변 생성”이라면, Advanced RAG는 검색 전에 질문을 더 좋게 다듬고, 검색 방식을 다양화하고, 검색 후에 결과를 한 번 더 정제하는 과정을 추가합니다. Advanced RAG 기법인 쿼리 재작성, 하이브리드 검색, 리랭킹만 제대로 적용해도 체감 성능이 크게 달라집니다.

2.2 Advanced RAG의 핵심 테크닉들

Advanced RAG에서 사용되는 주요 기법들을 하나씩 자세히 설명하겠습니다.

테크닉 1: 쿼리 재작성 (Query Rewriting)

쿼리 재작성은 사용자의 질문을 검색에 더 적합한 형태로 바꾸는 것입니다.

사람들은 대화할 때 줄임말을 쓰거나, 문맥에 의존하거나, 모호하게 표현하는 경우가 많습니다. “연봉 어떻게 됨?”이라는 질문을 생각해봅시다. 이 질문에는 여러 문제가 있습니다. “어떻게 됨”은 구어체라서 문서의 공식적인 표현과 매칭되기 어렵습니다. “연봉”만으로는 신입 연봉인지, 연봉 인상률인지, 연봉 협상 방법인지 알 수 없습니다. 주어가 없어서 누구의 연봉인지도 불분명합니다.

쿼리 재작성은 이 질문을 “신입사원 연봉 책정 기준과 급여 체계는 어떻게 되나요?”처럼 더 구체적이고 명확한 질문으로 바꿔줍니다. 이렇게 하면 검색 엔진이 더 정확한 문서를 찾을 수 있습니다.

쿼리 재작성은 보통 LLM을 사용해서 수행합니다. LLM에게 “이 질문을 검색에 적합하게 다시 작성해줘”라고 요청하는 것이죠. 프롬프트 예시를 들면 이렇습니다:

당신은 검색 쿼리 최적화 전문가입니다.
사용자의 질문을 검색에 적합한 형태로 재작성해주세요.
– 모호한 표현을 구체화하세요
– 구어체를 공식적인 표현으로 바꾸세요
– 필요한 맥락을 추가하세요

원래 질문: “연봉 어떻게 됨?”
재작성된 질문:

테크닉 2: 쿼리 확장 (Query Expansion)

쿼리 확장은 하나의 질문을 여러 개의 관련 질문으로 확장하는 것입니다.

사용자가 “휴가 정책”이라고만 검색하면 “연차 휴가”, “병가”, “경조사 휴가”, “출산 휴가” 등 관련된 다양한 주제의 문서를 놓칠 수 있습니다. 사용자는 “휴가 정책”이라고 했지만, 실제로 알고 싶은 것은 “연차가 며칠인지”, “병가는 유급인지”, “휴가 신청은 어떻게 하는지” 등 여러 가지일 수 있습니다.

쿼리 확장은 원래 질문과 함께 관련된 여러 질문을 만들어서 검색합니다. “휴가 정책”이라는 질문이 들어오면, 이를 확장해서 “연차 휴가 일수”, “병가 신청 방법”, “휴가 승인 절차”, “경조사 휴가 기준” 같은 여러 질문을 추가로 생성합니다. 그리고 이 모든 질문으로 검색을 수행해서 결과를 모읍니다.

이렇게 하면 더 다양한 관련 문서를 찾을 수 있고, 답변의 완성도가 높아집니다. 사용자가 명시적으로 물어보지 않은 관련 정보도 함께 제공할 수 있어서, “휴가는 15일이고, 참고로 병가는 10일입니다”처럼 더 풍부한 답변이 가능해집니다.

테크닉 3: 하이브리드 검색 (Dense + Sparse Hybrid Search)

하이브리드 검색은 두 가지 다른 검색 방식을 결합하는 것입니다. 이 부분이 특히 중요한데, Dense 검색과 Sparse 검색이 각각 무엇인지부터 설명하겠습니다.

Dense 검색 (밀집 검색, 벡터 검색)은 텍스트를 밀집된 벡터(Dense Vector)로 변환해서 검색하는 방식으로  “임베딩 기반 검색”이라고도 부릅니다.  텍스트의 의미를 수백 차원의 숫자 배열(벡터)로 표현하고, 벡터 간의 거리나 각도로 유사도를 계산하여 텍스트간의 유사도를 측정합니다. 

Dense 검색의 강점은 의미적 유사성을 잡아낸다는 것입니다. “고양이”를 검색하면 “반려묘”, “펫”, “냥이”처럼 단어는 다르지만 의미가 비슷한 단어도 찾아줍니다. 하지만 약점도 있습니다. 특정 키워드나 고유명사를 검색할 때는 정확도가 떨어질 수 있습니다. “BM25 알고리즘”을 검색했는데 “정보 검색 기법”이라는 일반적인 문서가 나올 수 있습니다.

Sparse 검색 (희소 검색, 키워드 검색)은 텍스트를 희소한 벡터(Sparse Vector)로 표현해서 검색하는 방식입니다. 대표적인 것이 BM25 알고리즘입니다. 문서에 특정 단어가 몇 번 나오는지, 그 단어가 얼마나 희귀한지를 기반으로 점수를 매깁니다.

Sparse 검색의 강점은 정확한 키워드 매칭입니다. “BM25″를 검색하면 정확히 “BM25″라는 단어가 포함된 문서를 찾아줍니다. 고유명사, 전문 용어, 코드명 등을 검색할 때 유리합니다. 약점은 동의어나 유사 표현을 처리하지 못한다는 것입니다. “자동차”를 검색하면 “차량”, “car”, “vehicle”이 포함된 문서는 찾지 못합니다.

하이브리드 검색은 이 두 가지의 장점을 결합합니다. Dense 검색으로 의미적으로 관련된 문서를 찾고, Sparse 검색으로 키워드가 정확히 일치하는 문서를 찾은 다음, 두 결과를 적절히 조합합니다. 조합 방법은 여러 가지가 있는데, 가장 간단한 것은 두 점수를 가중 평균하는 것입니다. 예를 들어 최종점수 = 0.7 × Dense점수 + 0.3 × Sparse점수처럼 계산합니다.

하이브리드 검색은 전문 용어, 제품명, 코드명 등이 많이 등장하는 기술 문서나 법률 문서에서 유용합니다. 이런 문서에선 키워드 매칭이 중요하기 때문입니다.

테크닉 4: 리랭킹 (Re-ranking)

리랭킹은 검색 결과의 순서를 다시 정하는 것입니다.

처음 검색했을 때 나온 순서가 항상 최선은 아닙니다. Dense 검색이든 Sparse 검색이든, 첫 번째 검색 단계에서는 빠른 속도를 위해 대략적인 유사도만 계산합니다. 수백만 개의 문서 중에서 관련 있을 것 같은 후보를 빠르게 추려내는 것이 목적이기 때문입니다.

리랭킹은 이 후보들을 더 정밀한 모델로 다시 평가해서 순서를 조정합니다. 마치 서류 전형으로 후보를 100명 추린 다음, 면접으로 최종 10명을 선발하는 것과 비슷합니다.

리랭킹에는 주로 Cross-encoder라는 모델을 사용합니다. 일반적인 임베딩 모델(Bi-encoder)은 질문과 문서를 각각 따로 벡터로 변환한 다음 비교합니다. 반면 Cross-encoder는 질문과 문서를 함께 입력받아서 “이 문서가 이 질문에 얼마나 적합한지”를 직접 점수로 출력합니다. 질문과 문서 사이의 복잡한 상호작용을 고려할 수 있어서 더 정확하지만, 계산이 느리기 때문에 모든 문서에 적용하기는 어렵습니다. 그래서 먼저 빠른 검색으로 후보를 추리고, 후보들에 대해서만 Cross-encoder로 리랭킹하는 것입니다.

리랭킹을 적용하면 처음에 3번째로 나온 문서가 실제로는 질문과 가장 관련이 높아서 1번째로 올라오거나, 처음에 높은 순위였지만 실제로는 관련 없는 문서가 아래로 밀려나는 일이 생깁니다. 이렇게 순서가 조정되면 LLM에게 전달되는 컨텍스트의 품질이 좋아지고, 결과적으로 답변의 질도 향상됩니다.

예를 들어 Advanced RAG를 살펴봅니다.

1. 쿼리 재작성 (Query Rewriting)

원래 질문: “연봉 어떻게 됨?”

           ↓

재작성된 질문: “신입사원 연봉과 급여 체계는 어떻게 되나요?”

→ 더 구체적이고 검색에 적합한 형태로 변환

2. 쿼리 확장 (Query Expansion)

원래 질문: “휴가 정책”

           ↓

확장된 쿼리들:

├── “휴가 정책”

├── “연차 휴가 일수”

├── “병가 사용 방법”

└── “휴가 신청 절차”

→ 여러 관련 쿼리로 검색하여 더 많은 관련 문서 찾기

3. 하이브리드 검색 (Hybrid Search)

4.  리랭킹 (Re-ranking)

→ 더 정교한 모델로 순서를 재조정하여 정확도 향상

2.3 Advanced RAG를 많이 쓰는 이유

앞서 말씀드렸듯이, 실무에서 RAG의 대부분의 문제는 Advanced RAG 기법으로 해결됩니다. 그 이유를 구체적으로 설명하겠습니다.

첫째, 사용자의 질문은 예측할 수 없습니다. 어떤 사람은 정확한 용어로 질문하고, 어떤 사람은 구어체로 질문하고, 어떤 사람은 오타를 내기도 합니다. 쿼리 재작성은 이런 다양한 질문을 검색에 적합한 형태로 정규화해줍니다.

둘째, 하나의 검색 방식만으로는 모든 케이스를 커버할 수 없습니다. “삼성전자 주가”처럼 정확한 키워드가 중요한 질문과 “요즘 반도체 시장 어때?”처럼 의미적 이해가 중요한 질문은 다른 검색 방식이 유리합니다. 하이브리드 검색은 두 가지를 모두 커버합니다.

셋째, 검색 결과의 순위가 항상 정확하지 않습니다. 벡터 유사도가 높다고 해서 질문에 대한 답이 있는 것은 아닙니다. 리랭킹은 실제로 질문에 답하는 데 필요한 문서를 상위로 올려줍니다.

2.4 Advanced RAG의 단점

첫째, 처리 시간이 더 오래 걸립니다. 쿼리 재작성을 위해 LLM을 호출하고, 여러 쿼리로 검색하고, 리랭킹까지 수행하면 Naive RAG보다 응답 시간이 길어집니다. 실시간 응답이 중요한 서비스에서는 이 지연 시간이 문제가 될 수 있습니다.

둘째, 비용이 증가합니다. LLM 호출 횟수가 늘어나고, 검색 횟수도 늘어나고, 리랭킹 모델도 실행해야 합니다. 대규모 서비스에서는 이 비용이 무시할 수 없는 수준이 될 수 있습니다.

셋째, 구현과 튜닝이 더 복잡해집니다. 쿼리 재작성 프롬프트를 어떻게 작성할지, Dense와 Sparse 검색의 가중치를 어떻게 설정할지, 리랭킹 모델은 어떤 것을 사용할지 등 결정해야 할 것이 많습니다.

댓글 남기기