RAG Project

[RAG Project] GlobalMacro QA chatbot - Overview (0)

hibyeys 2024. 8. 20. 19:40

Preview

  • 필자는 원래 LLM에 크게 관심 없었다. (하지만 chatGPT는 유료결제해서 열심히 갈궜다!)
  • 아무래도 작곡을 했었다 보니 주로 Music Source Separation이나 Voice Conversion 등 Audio task에 관심을 기울였다.
  • 최근에 포트폴리오용 프로젝트 주제를 찾다가 유튜버 테디노트님의 RAG 강의들에 눈이 갔다.
  • Voice Conversion에도 Faiss를 통해 간단하게 쓰이고 예전에 한번 훑었지만 별생각 없이 넘어갔다.
  • 하지만 테디노트님의 강의를 보면서 RAG가 꽤 많이 발전했고 잠재가능성이 높다는 사실을 알게 되어 RAG를 통해 무언가를 해봐야겠다고 생각했다.
  • 그러면서 내 삶에 도움이 되는 무언가를 했으면 좋겠다고 생각했다. 그래서 하고자 하는 게 현재의 프로젝트다.
  • 필자는 금융 도메인에 관심이 많다. (경제적 자유를 꿈꾸며!!!)
  • 사실 투자를 많이 해보지는 않았지만 공부는 꾸준히 하고 있다.
  • 그중 유튜버 중 월가아재님의 투자방식을 많이 따라가려고 한다.
  • 투자 flow를 간략하게 설명하자면 아래와 같다.

          1. 경제 지표나 발생한 이벤트를 통해 사이클 국면 파악

          2. 해당 국면에 적합한 자산군 파악

          3. 자산군 Valuation

          4. 투자 의사 결정

  • 위의 단계는 더욱 세분화되어 있고 확장될 수 있지만 주안점이 아니기에 넘어가겠다.
  • 원래 처음에 구상한 것은 각 분야의 전문성을 가진 Multi-Agent를 만들어 위의 프로세스를 자동으로 해주어 빠른 의사결정을 하는 것이 목표였다.
  • 하지만 7월 중순 기준으로 9월 취업을 목표로 하는 나로서는, 이 방대한 내용을 학습&빌드하고 성능을 위해 테스트를 하기에 역부족일 것 같다는 판단을 내렸다.
  • 그래서 Step by Step으로 QA chatbot을 통해 투자 flow의 1, 2 단계를 빠르게 파악하는 프로젝트를 진행하기로 했다.

Overview

위에서 언급한 것처럼 이 프로젝트는 투자 flow 1, 2 단계를 빠르게 파악하는 것이 목표다.
즉, 최신 데이터를 바탕으로 현재의 국면을 이해하고 있는 chatbot이 필요하다.

 

목표를 수행하기 위해 어떻게 구현해야 할까?

(8월 초 까지 학습한 것을 기준으로 작성 -> 구현하면서 수정될 수 있음)

 

먼저 크게 3가지를 고려할 수 있다.

  1. 데이터 수집 & 처리
  2. LangChain & LangGraph를 통한 Pipeline 구축
  3. 어떠한 질문을 던질 것인가?

<데이터 수집 & 처리>

데이터 수집은 매크로 판단에 참고할만한 다양한 데이터 수집이 필요하다.

데이터도 세부류로 나누면 아래와 같다.

1. 국면을 파악하기 위한 수치 데이터 (경기지표, 주가지수, 자산군별 가격, 주요 인덱스 등)

2. 수치 해석을 위한 전문가들의 칼럼&영상 데이터(개인적으로 엄선한 칼럼 및 영상, 투자 거장들의 투자 전략, 책 등)

3. 발생한 이벤트 데이터 (위키피디아 등 과거 발생한 이벤트들이 게시된 사이트, 최근 발생한 뉴스 등)

 

상당히 많은 수의 데이터가 필요해 보인다.

그렇다고 모으기만 해서 데이터를 때려 넣어 결과가 잘 나온다면 얼마나 좋을까? 

RAG Chain을 구축해서 최적화하기 전에도 데이터를 프로세싱하는데 수많은 노력이 필요하다. 

(개인적으로 긴 내용의 문서를 요약하는데 고생 좀 했다.)

 

<LangChain & LangGraph를 통한 Pipeline 구축>

위 그림은 기본적인 Conventional RAG Chain 이다. (출처: LangChain Blog)

 

데이터가 갖춰지면 기본적인 RAG Chain을 구성해서 QA를 해볼 수 있다. 하지만 생각했던 결과가 쉽게 나오지는 않는다.

Chain을 최적화하기 위해서도 다양한 노력이 필요하다.

Load 단계에서도 데이터의 형식마다 Loader가 제각각이고 Loader에 따라 Parsing 방식등 다양한 이유로 결과가 다르게 나올 수 있다.

또한 Load 한 문서를 split 하는 방법 및 Chunk_size 조절에 따라서도 성능이 달라지고 어떤 임베딩 모델을 쓰느냐에 따라서도 성능이 달라진다. 그리고 어떤 Vector Store를 써서 어떤 방식으로 저장하느냐도 고려대상이다.

물론 이것들을 최적화해 주는 라이브러리들이 존재한다. (AutoRAG, RAGAS, LangSmith 등 추후 프로젝트를 진행하면서 한 번씩 다뤄볼 예정이다.)

 

위 그림은 LangGraph RAG Chain 이다. (출처: TeddyNote)

 

LangGraph는 LangChain의 확장형 프레임워크로 각 단계를 모듈화 해서 좀 더 복잡한 애플리케이션을 만드는 게 가능해지고

확장도 용이히다. 위에 언급한 Conventional RAG는 각 단계별로 pre-fix 된 값이나 고정된 프롬프트형식을 가지고 RAG를 수행하며 단방향 구조를 가지고 있기에 원하는 답변이 잘 나오지 않을 경우 이전 단계로 돌아가서 수정할 방법이 없다.

반면에 LangGraph 에서는 각 세부과정을 노드(Node)라고 정의하고 엣지(Edge)를 연결하여 RAG Pipeline을 보다 유연하게 설계할 수 있게 만들었다.

예를 들어 문서 내 질문에 대한 답변이 존재하지 않을 때 Web_Search Node를 추가해 해당 정보를 가져와 답변할 수도 있다.

또한 이전 단계와 엣지를 연결해 잘못된 대답을 주었을 때 다시 이전 단계로 돌아가 잘못된 부분을 수정할 수도 있다.

 

나중에 프로젝트가 진행되면서 어떤 문제가 생겼을 때 Node를 추가하거나 Edge 연결하며 다양한 시도를 해볼 수 있겠다.

 

<어떠한 질문을 던질 것인가?>

만약 성능이 잘 나오는 RAG를 구축한다고 하더라도 의사결정은 본인의 몫이다.

구축하고자 하는 ChatBot은 의사결정을 가속화하는 도구일 뿐이고 의사결정을 하기 위해서는 어느 정도의 금융지식과 연역적 사고가 필요하다. (물론 질문을 통해 배울 수 있게 데이터를 수집할 예정이다)

 

단순히 "경기국면을 파악하고 현재 유망한 자산군을 추천해 줘 " 는 의사결정을 하는데 아무런 도움이 되지 않는다.

옳은 의사결정의 확률을 높이기 위해서는 다양한 방식으로 접근하는 게 필요하다.

프로젝트를 수행하면서 여러 질문들을 구체화할 생각이지만 아래와 같은 흐름으로 질문을 해볼 수 있겠다.

현재 경기 지표 데이터 검색 -> 각 지표 및 발생이벤트 분석 (추세, 상관관계, 과거 영향 등등) -> 현재 사이클 국면 파악
-> 과거 비슷한 사이클들 분석해 보기 -> 현재 경기 국면에서 적합한 자산군 파악 -> 해당 자산군의 특수성 파악 (공통점과 차이점)

 

Outline

최종 목표는 LangGraph를 통해 RAG Chain을 구축하는 것이지만, 위에서 열거한 순서대로 차근차근 진행하면서 내가 경험한 것들을 정리하고 공유하려고 한다.