AutoRAG 팀의 AutoRAG-HP 논문 리뷰 : 야구로 이해해보자

AutoRAG·2024년 7월 10일
2

AutoRAG를 처음부터 만들어나가고 있는 사람으로서, 무려 AutoRAG를 논문 이름에 넣은 논문은 도저히 참을 수 없었다. 오늘 AutoRAG 팀에서 리뷰해 볼 논문은 "AutoRAG-HP: Automatic Online Hyper-Parameter Tuning for Retrieval-Augmented Generation"이다. => 논문 링크

논문 제목은 한국어로 하자면 "AutoRAG-HP: RAG를 위한 자동 실시간 하이퍼 파라미터 튜닝" 정도로 정리할 수 있다. 그러면 시작하자!

이 포스트에서는 우리 팀이 제작중인 오픈소스 RAG AutoML 툴인 AutoRAG는 "AutoRAG"로, 본 논문에서 제안하는 방법론은 "AutoRAG-HP"로 부르겠다.

배경

RAG 모듈들과 방법론, 설정해야 하는 하이퍼 파라미터 등이 크게 증가하면서 좋은 RAG 시스템을 찾는 것이 어려워졌다. 논문에서는 RAG 최적화에 있어 두 가지 어려움을 지적한다.

  1. 모듈과 파라미터 등이 너무 많아 최적의 값을 찾는 것이 힘들다 => (AutoRAG에서도 주목하는 문제이다)
  2. 유저의 실시간 피드백(좋아요/싫어요 버튼과 같은 피드백)을 RAG 시스템에 반영할 방법이 마땅치 않다.

그래서 AutoRAG-HP를 저자들은 제안한다. 실시간으로 튜닝이 가능한 RAG용 AutoML 방법론이다.

어떻게 최적화하는가?

AutoRAG-HP를 이해하기 위해서는 먼저 MAB 문제가 무엇인지 이해해야 한다. 근본적으로 AutoRAG-HP는 이 MAB 문제와 그것을 해결하기 위한 알고리즘을 사용한다.

MAB 문제란?

the multi-armed bandit problem (sometimes called the K- or N-armed bandit problem) is a problem in which a decision maker iteratively selects one of multiple fixed choices (i.e., arms or actions) when the properties of each choice are only partially known at the time of allocation, and may become better understood as time passes.

이렇게 위키백과에 나와 있는데... 잘 이해가 되지 않으시죠? 저도 이해가 잘 안되었는데요.

MAB 문제를 아주 잘 설명해 둔 블로그를 참고하셔도 괜찮고요 => 블로그 주소
저도 나름대로 설명해 보겠습니다.


여러분 최강야구 좋아하시나요? 여러분이 2030년, 최강야구 몬스터즈의 감독이 되었습니다. 몬스터즈에는 이제는 은퇴한 최고의 선발투수 세 명이 있습니다. 코리안 몬스터 류현진, 대투수 양현종, 그리고 랜더스의 레전드 김광현인데요. 당신은 이 세명 선발 투수 중 누구를 등판시킬 지 고민합니다.

현역 때와는 달리 몬스터즈의 야구 경기는 일주일마다 한 번 씩만 있다고 합시다. 그렇기에 당신이 원한다면 좋은 성적을 내기 위해, 한 선수를 매주 연속적으로 등판시켜도 괜찮습니다.
또한, 몬스터즈에서의 성적이 아직 없기 때문에 은퇴 후 각 선수들이 얼마나 기량이 변했는지는 알 길이 없습니다. (즉, 경기를 하기 전까지는 어떤 결과가 나올지 예상하기가 힘들어요)

이러한 상황에서 당신은 선발 등판 전략을 어떻게 구성할 것인가요?

이러한 상황이 바로 MAB (Multi-armed bandit) 문제입니다. 각각의 선택지가 어떤 결과를 내뱉을지 모르는 상황에서 최적의 결과를 얻기 위한 전략인 것입니다.

한 명에게 몰빵할까??

당신은 계속 한 선수를 매주 경기마다 등판시킬 수 있다는 사실에 주목합니다. 만약 최고의 선발을 한 명만 정하면, 다른 선수는 불펜으로 활용해도 괜찮은 것 아니겠습니까?
그래서, 일단 누가 현재 최고의 실력을 보여줄지 각각 세번 정도 등판 시켰습니다.
아홉 경기 이후, 성적은 아래와 같았습니다.

  • 류현진 : 2승 1패 ERA 4.2
  • 양현종 : 2승 0패 ERA 3.6
  • 김광현 : 1승 1패 ERA 4.8

양현종 선수가 가장 좋은 ERA를 보여주었네요. 이제 계속 양현종 선수만을 선발 투수를 등판시켜야 겠습니다!

이런 전략을 Greedy 전략이라고 합니다. 기댓값(여기서는 선발 투수의 ERA)이 가장 높은 선택지에 몰빵하는 전략이죠.

모든 투수는 굴곡이 있습니다.

앞으로 가장 성적이 좋은 양현종 선수만 선발로 기용한다고 하자, 몬스터즈의 노련한 투수 코치님이 바로 우려를 표했습니다.
양현종 선수가 세 경기에서 잘했다 하더라도, 그 다음 경기에서 무너질 수 있는 것이 야구라고요. 그러면서 계속 한 선수를 매주 등판시키기 보다는 가끔씩 로테이션 돌리면서 다른 선수들의 컨디션도 체크해야 한다고 합니다.

일리가 있는 말입니다. 하지만 좋은 선수를 계속 써야 몬스터즈의 성적이 더 좋아지지 않겠나요? 하지만 선수가 언제 무너질지 모르는 법, 다른 선수도 계속 기용해 보아야 겠죠. 둘 사이에 밸런스를 잡는 것이 중요할 것 같습니다.

그래서 당신은 앞으로 경기 전 동전을 던져서 결정하려 합니다. 앞면이 나오면 양현종 선수를, 뒷면이 나오면 기분따라 류현진 선수나 김광현 선수를 등판시키려고 합니다.
이렇게 하면 ERA가 좋은 선수를 많이 던지게 하면서 다른 선수들의 실력을 탐색해볼 수도 있겠죠?

MAB 문제에서는 탐험과 활용이 중요합니다. 탐험은 각 선택지가 어떤 결과를 내놓는지 보는 것이고, 활용은 좋은 선택지를 지속적으로 사용해서 최종 결과를 좋게 만드는 것이죠. 시간에 따라 결과가 계속 달라지기에, MAB 문제에서는 탐험과 활용을 밸런스있게 선택해야 합니다.
위 예시에서 탐험은 다른 투수 (류김) 기용, 활용은 양현종 투수 기용이 되겠죠.

동전을 던지는 방법은 MAB 문제의 전략 중 하나인 엡실론-greedy 방법입니다. 탐험과 활용 둘을 랜덤으로 정하는 전략으로 밸런스를 맞추는 것이죠.

동전을 던지다니? 감독님 조금 과학적으로 해봅시다.

이번에는 전략분석실에서 우려를 표했습니다. 동전 던지기보다는 좋은 방법이 있다면서요. 역시 수학을 잘하는 전략분석실답게 수식을 제시하네요.
ERA를 계산할 때 (등판횟수0.1)+ERA(등판 횟수 * 0.1) + ERA로 계산하자는 것입니다. 이러면 많이 등판한 선수의 ERA가 조금씩 올라가서, 많이 등판하지 않았던 선수보다 ERA 계산값이 높아질 때가 오겠죠. 이 때, 등판한 적이 적었던 선수를 기용하는 것입니다.

오! 듣고보니 좋은 방법인 것 같습니다. ERA에 기초하되 새로운 기용을 섞어서 할 수도 있겠네요. ERA가 너무 높아지면 아무리 등판을 하지 않았어도 기용되지 않을 것 같고요. 좋습니다. 몬스터즈의 선발 기용 전략은 이것입니다!

위 전략은 UCB 알고리즘의 변형입니다. 핵심은 비슷합니다. 적게 선택되었던 선택지에 가중치를 주어서 선택되기 조금 더 쉽게 하는 것입니다. 조금 더 과학적으로 탐험과 활용의 밸런스를 유지할 수 있죠. (실제 UCB 알고리즘의 수식은 다르게 생겼습니다)


RAG에 MAB 문제를 적용해 보자

최강야구 예시를 통해 MAB 문제가 무엇인지 알았다면, RAG 최적화도 일종의 MAB 문제로 볼 수 있겠다는 생각이 들것이다.

왜냐? 선발투수 기용은 어떤 RAG 모듈을 쓸 것인지 고르는 것과 비슷하다.
위 예시에서 류현진을 vectordb retrieval 모듈, 양현종은 bm25, 김광현을 hybrid retrieval로 바꿔서 생각해보자^^

엥? 그러면 한 경기씩 던져보는 것은 도대체 뭐냐? 싶을 수 있다. RAG는 전체 평가 데이터셋 한 번 돌리면 되는 것 아닌가?
한 경기씩 던져보는 것은, 평가 데이터셋을 적당한 batch로 잘라주면 된다. 마치 QA 데이터 하나를 투수가 공 한 번 던지는 것으로 생각해보자.

투수는 한 번 등판에 100구 정도 던진다. 그러면 RAG도 한 번 평가에 100개 QA 정도를 평가해서 각 선택지의 값을 비교할 수 있다. 만약 데이터셋이 2,000개면 20번 평가를 해야한다.
또, 데이터가 늘어나면 원래 평가 결과에 새 데이터만을 반영할 수 있다. 앞서 2,000개 평가했던 것에 새로 추가된 100개를 반영할 수 있다.
즉, '실시간' 평가 결과 업데이트가 되는 것이다.

Hier-MAB란?

좋다. RAG에서 모듈 선택을 이제 MAB 문제로 볼 수 있을 것 같다.
근데 문제가 하나 있다. RAG에는 단순 모듈 선택 뿐 아니라 하이퍼 파라미터도 굉장히 많다.
hybrid의 weight를 조절한다던가, LLM의 temperature를 조절하는 것 같은 파라미터들이 있다.
그러면 이 하이퍼 파라미터가 달라질 때마다 다른 선택지가 되는데, 이를 어떻게 해결할 것인가?

그래서 나온 개념이 바로 Hier-MAB이다. MAB 구조에 계층을 적용하는 것이다. 뭔 소리인가?
다시 몬스터즈 예시로 돌아가보자.


전략분석실 덕분에 선발 기용에 대한 전략을 세울 수 있었다. 그런데, 이제는 세 투수 각각의 구종 선택을 최적화하고 싶어졌다. 그런데 각 투구마다 구종이 어떤 결과가 나올지는 미지수다. 구종가치가 높은 구종이 투수마다 있겠지만, 실투가 나올수 있지 않은가?

그래서 구종 선택 역시 MAB 문제로 볼 수 있다.
문제는, 구종과 선발 투수 기용을 묶어서 생각하면 너무 선택지가 많아진다. 당장 류현진 선수가 구사하는 구종만 포심, 투심, 커터, 슬라이더, 커브, 체인지업 여섯가지이다.

선택지를 줄이기 위해서는 구종 선택과 선발 기용의 문제를 당연히 분리해서 생각할 필요가 있다.
한 경기에서 류현진 선수를 기용했다면, 그 경기에서는 류현진 선수의 구종만을 최적화 하는 것이다.
마찬가지로 김광현 선수가 기용되었다면, 김광현 선수의 구종만을 최적화한다.

여기서 두 가지 MAB 문제로, 계층적으로 나뉘었다고 볼 수 있다. 상위 MAB 문제는 선발 투수 기용 문제이다. 하위 MAB 문제는 구종 선택의 문제이다.
선발 투수를 먼저 고르고, 고른 선발 투수에 대해서 구종을 최적화한다.


위 예시에서, 선발 투수 기용은 어떤 RAG 모듈을 최적화할 것인지 선택하는 것을 비유한 것이다. 실제로 최적화할 것은 바로 각 투수의 구종이다. 이는 RAG 모듈의 파라미터들을 비유한 것이다.

실제로는 어떻게 RAG를 최적화합니까?

자, 개념은 끝났다. 이제 논문에서 어떻게 RAG를 최적화했는지 살펴보자.

일단 논문에서는 최적화할 RAG 파라미터로 총 세 가지를 골랐다.
첫 째는 retrieval의 top-k 파라미터. 두번째로는 임베딩 모델. 마지막으로 prompt compressor의 압축 비율이다.
AutoRAG의 YAML 파일 형식으로 나타내면 아래와 같을 것이다.

node_lines:
- node_line_name: retrieve_node_line
  nodes:
    - node_type: retrieval
      # strategy는 생략했다.
      top_k: [ 1, 3, 5, 7, 9 ]
      modules:
        - module_type: vectordb
          embedding_model: [ openai, contriever, huggingface_all_mpnet_base_v2 ]
    - node_type: passage_compressor
      modules:
        - module_type: longllmlingua
          rate: [0.3, 0.5, 0.7, 0.9, 1.0]
- node_line_name: post_retrieve_node_line
  nodes:
    - node_type: prompt_maker
      # strategy는 생략했다.
      modules:
        - module_type: fstring
          prompt: "Write an accurate, engaging, and concise answer for the given question using only the
provided search results (some of which might be irrelevant) and cite them properly. Use an unbiased and
journalistic tone. Always cite for any factual claim. When citing several search results, use [1][2][3]. Cite
at least one document and at most three documents in each sentence. If multiple documents support the
sentence, only cite a minimum sufficient subset of the documents. \n Question: {query} \n Document: {retrieved_contents} \n Answer : "
    - node_type: generator
      # strategy는 생략했다.
      modules:
        - module_type: openai_llm
          model: [gpt-3.5-turbo, gpt-4-turbo] # 논문에서는 따로 실험함

strategy를 생략한 이유는, AutoRAG는 노드 별 greedy 알고리즘을 사용하는 반면 AutoRAG-HP는 Hier-MAB 방법을 사용하기 때문이다.

이제 어떤 것을 최적화해야 하는지 알았으니, 최적화를 시작해보자.

먼저, 어떤 선택지가 '선택해야 하는' 선택지인가 알아보자. 그것을 판단하기 위해서는 어떤 것이 '좋은' 선택지인가 알아야 하는 지표가 필요하다. 이 지표를 Reward 함수라고 부른다. 최강야구 예시에서는 ERA의 역수가 될 것이다 (ERA는 낮을 수록 훌륭한 투수라는 뜻이다)

논문에서의 Reward 함수는 아래와 같다.

Reward=wacc(1w)ttmaxReward = w\cdot acc - ( 1 - w) \cdot \frac{t}{t_{max}}

ww는 가중치 값이다. 또한 accacc는 LLM 응답의 정확도이다. 마지막으로 tt는 대답의 토큰 길이인데, 이를 tmaxt_{max}, 즉 최대 토큰 길이를 가진 대답으로 normalize 시켜준다. (정확도의 값 range가 0~1이다)

즉, 해당 Reward 함수는 답변의 정확도 뿐만 아니라 얼마나 적은 토큰을 사용했는지 비용 효율성도 따지는 것을 볼 수 있다.

이러한 Reward 함수는 당연히 여러 가지로 변경할 수 있으며, 논문 저자들 역시 하나의 Reward 함수로만 실험한 것을 이 논문의 한계점으로 꼽고 있다. 추후 다른 Reward 함수를 통한 실험도 많이 제안될 것으로 생각된다.

좋다, 그러면 어떻게 선택지들을 골라갈 것인가? 최강야구 예시처럼 여러 전략을 고를 수 있을 것이다. 그 중에서도 앞에서 설명했던 UCB 알고리즘 적용법을 보자.
UCB 알고리즘의 진짜 수식은 아래와 같다.

At=argmaxaA(Qt(a)+αln(t)Na(t))A_t = arg \underset{a \in \Alpha}{max} (Q_t(a) + \alpha \sqrt{\frac{ln(t)}{N_a(t)}})

여기서 A\Alpha는 각 선택지의 집합이고, tt는 현재 몇 번째로 선택지를 고르는지를 의미한다. argmaxargmax는 선택지를 모두 해보고, 가장 (Qt(a)+αln(t)Na(t))(Q_t(a) + \alpha \sqrt{\frac{ln(t)}{N_a(t)}}) 값이 큰 것을 고른다는 것을 의미한다.
Na(t)N_a(t)는 이때까지 선택지 aa가 선택되었던 횟수를 의미하는데, 이 때문에 선택된 횟수가 적을수록 αln(t)Na(t)\alpha \sqrt{\frac{ln(t)}{N_a(t)}} 값이 증가하여 선택될 확률이 늘어나게 된다.

그러면 여기서 Qt(a)Q_t(a)는 무엇일까? tt 시점에서 aa를 골랐을 때의 기댓값이다. 이는 이제까지 평균적으로 해당 선택지를 한 번 골랐을 때 나왔던 Reward 함수의 평균으로 결정된다.

결론

이 블로그 포스트에서는 AutoRAG-HP가 어떻게 작동하는지 확인해보았다. 과연 얼마나 효과가 좋았는지는 원 논문에서 확인해보도록 하자. 아직 비교하지 않았기 때문에, AutoRAG와 AutoRAG-HP 중 어느 방법이 더 좋은지 속단하기는 어렵다. 다만, 새로운 질문을 받아 지속적으로 RAG 조합을 업데이트 할 수 있다는 점과 retrieval_gt를 만들 필요 없다는 점에서 AutoRAG-HP의 장점이 있는 것으로 보인다.

AutoRAG 팀에서는 AutoRAG-HP와 같이 RAG AutoML과 관련한 최신 기법들을 빠르게 받아들이고 쉽게 적용하기 위하여 노력할 예정이다. 빠르게 AutoRAG에서 더 고도화된 최적화 방식을 사용하고 싶다면 많은 사용과 관심 부탁드린다!

profile
RAG AutoML tool - AutoRAG

0개의 댓글