MLOps 부트캠프 by 한경+토스뱅크

금융 데이터 AI 챗봇 개발기: 1) 그래서 PDF를 어떻게 분석할건데? (기획부터 데이터 전처리까지)

나니니 2025. 1. 16. 01:19

드디어, 6개월의 부트캠프에서 최종,

그러니까

최종_찐최종_찐찐최종_마지막최종 으로 진행했던 프로젝트에 대해 리뷰하고자 한다. 

(아래의 자료들은 실제 프로젝트와 발표에 사용되었던 자료들이다)

 

약 3회에 걸쳐 리뷰할 예정이고,

본 포스팅은 서비스 기획부터 데이터 전처리까지의 이야기를 담고 있다. 

 


0. 팀빌딩 및 기획

우리의 서비스 명은 RePick이고, 팀명도 RePick이다.

(*다른 팀원들은 개인정보 이슈로 블러처리함)

RePick
RePick Team

RePick 개발에는 나를 포함하여 7명(백엔드 3, 프론트 1, 엠엘 3)이 함께 개발에 참여했다. 

 

그리고 이 프로젝트에서 맡은 나의 역할은

프로젝트 리드 및 데이터 전처리, 모델링이었고

또, 제일 고연령(;;) 및 경력직도 맡았다. 하하하

 

이 부분의 혜택을 얻은 부분도 있는데, 바로 리더십이다. 

 

지금 생각해도 프로젝트에서 가장 잘했다고 여겨지는 부분 중 하나인데

우리팀이 큰 의견 대립 없이 처음에 기획한 내용을 골자로 배포까지 할 수 있었던 것은

나이도 좀 있고, 회사도 몇번 다녀온 나를 많이 믿고 따라와 준 덕택이었다.

(자연스럽게 리더십 획득)

 

내가 제시한 아이디어는 '금융 레포트 기반 AI 챗봇' 이었는데,

나를 제외한 친구들이 금융 레포트, 그러니까 증권사가 발행한 금융 레포트를 한번도 본 적이 없다는 것이었다. 

요즘은 주식이 하도 보편화되어 있어서 다들 한번쯤은 봤을 거라 생각했는데

응, 경기도오산이었다...

 

난, 

오히려 좋은 관점이라고 생각했는데,

결국 이 친구들 그러니까 20대 초중반의 아직 직장을 가지지 않은 인구는 잠재투자자일 수 있다고 보았다. 

 

그렇다면 분명 '금융 레포트를 보는 주린이들, 전문가들이 많아질 것이고 그럼 금융 레포트 기반의 챗봇 서비스를 내놓았을 때, 시장을 점유할 수 있지 않을까? 반응이 있지 않을까? ' 라고 생각했다. 

 

그리고 가볍게

기획에 대한 근거를 얻음과 동시에 시장반응을 보고자 설문조사를 진행했고

결과는 다음과 같았다. 

 

  • 레포트 요약 챗봇 서비스가 있다면 사용해보시겠습니까? YES!!!
  • 그럼 레포트에서 가장 중점적으로 보는 정보는? 시장전망!!

설문조사 결과

 

여기서 우린 

기존 금융 레포트의 높은 허들을 발견했고, 

우리가 파고들 나이스한 기회 또한 발견했다. 

Pain point 및 기회

 

이렇게 발견한 기회와 가능성을 바탕으로

RePick이란 팀으로 '금융 데이터 AI 챗봇 개발'을 진행하기로 했다. ✨✨✨

 

1. 데이터 수집

자, 이제 주제가 정해졌으니 데이터를 확보하는 문제만 해결하면 된다.

그런데 기획을 '금융 레포트 기반 AI 챗봇'으로 정한 이유에는 데이터 확보가 용이하다는 점도 이미 고려되어 있었다.

 

참고로, 금융 데이터 기반의 프로젝트에서 가장 핵심은 '데이터 수집'이다.

특히 우리처럼 부트캠프를 통해 진행하는 경우에는 '금융'과 관련한 데이터를 확보하기엔 큰 어려움이 있다. 

그런데 금융 레포트는 굉장히 양질의 데이터가 매일 무료로 리서치센터에 올라온다!

 

이로써 원천 데이터는 안전하게 확보되었다.

 

2. 역할 분배

원천 데이터 확보의 문제가 해결되니

백엔드와 프론트, MLOps(줄여서 엠엘)의 역할이 명확히 나뉘어졌다. 

 

그래서 우린 Jira와 Confluence로 프로젝트를 관리하기로 했는데, 

Jira는 이슈들과 태스크를 관리하기 용이했고, 전체적으로 프로젝트를 매니징하기에 수월하여 사용하기로 했다.

그리고 Confluence에는 매일매일의 회의록을 기록했고, 캘린더와 연동해서 언제 어떤 회의가 진행되었고, 회의에서 이슈된 내용들은 무엇이며 각각 담당하는 태스크에 대해 서로가 충분히 공유할 수 있도록 했다. 

 

그리고 실시간 커뮤니케이션은 Slack을 사용했는데, 채널을 각각 풀스택과 엠엘로 나누어 운영하여

태스크가 구분되도록 했다. 

RePick 개발 스케줄 및 흔적들..

3. 데이터 전처리

데이터 전처리에서 큰 난관을 마주하게 된다. 

 

1번에서 확보된 원천 데이터는 모두 PDF형태이다. 

네이버 리서치센터

금융 레포트의 특성 상, 

PDF에는 아래 이미지처럼

텍스트는 물론이거니와 여러 형태의 표와 차트가 존재한다. 

혹은 전체 PDF가 통으로 이루어진 이미지가 있기도 하고..

교보증권 현대로템

그런데 두둥,

ChatGPT는 텍스트와 이미지(표, 차트)를 동시에 분석할 수 없는 한계가 존재했다. 

 

그래서 PDF를 어떻게 요소별로 잘 추출하면서, 문맥을 유지한 채 분석할 수 있을까에 대해

구글링을 엄청 했다. 

먼저 OCR은 이미지에서 텍스트를 추출하는 건데, 

재무제표 같은 표가 이미지로 들어가있다면 이걸 추출했을 때 그냥 숫자의 나열만 되는 결과가 나온다. 이 숫자들은 표형태가 유지되어야지만, 그러니까 표 자체에 대한 이해가 되어야 하는데 그렇지 못한 상태이므로 제외했다. 

 

다음은 PyPDF2, PDFplumber

이건 PDF 내 텍스트를 추출하는 것인데 PDF를 ChatGPT에 넣으면 애초에 텍스트 기반으로 결과가 나오기 때문에 PDF의 맥락을 유지한 분석은 어려웠다. 

 

강사님께서 던지신 힌트!

1) PDF를 낱장으로 분리 한 후에, 2) 이미지(표, 차트)를 바운딩박스로 설정하여 크롭한 후 저장, 3) 그리고 크롭된 이미지와 텍스트를 ChatGPT에 Input하여 분석하기 였다. 

+Upstage AI의 Document Parse를 이용하여 멀티모달로~

 

사실 이게 들었을 때는

'아~ 그러면 되겠다!' 하고 이해가 가지만

막상 코드로 구현하려고 하니, 아니 ..그래서 어떻게???????? 소리가 절로 나왔다. 

 

그러다 자주 참고하던 테디노트에서 이와 관련된 강의를 하고 있단 걸 발견했고, 

진행시켜!!!! 해서 강의를 수강했다. 

 

여기서 제공하는 코드를 바탕으로

금융 레포트 맞춤형으로 변경했는데, 처음에는 이미지를 잘라내는 바운딩박스가 조금씩 어긋나서 되어 골치를 먹었다.

 

아래 이미지를 보면 표는 'table'이라는 요소로 되어 있어 코드에서도 'table'을 가져오도록 했다. 

Upstage Palyground - PDF table elements

 

그런데 이상하게 차트는 가져와지지 않는 것이다. 

아래 사진처럼 차트는 figure로 되어 있어서, 코드에서 figure 요소를 가져오도록 했으나, 원하는 바운딩박스가 설정되지 않았다.

Upstage Palyground - PDF chart elements

다시금 Upstage의 Documentation문서를 확인했지만 여기에도 figure라는 요소가 있어서 '뭐지...?' 생각했는데

아뿔싸!!! 내가 잘못 알았다!!!

 

아래 공식문서의 figure 바로 하단에 보면 chart라는 요소가 있다. 

chart는 figure요소로 묶여 data-category='chart'로 구분되고 있었다. 

Upstage의 Documet Parse 중..


올레!!!

 

figure를 chart로 변경하니 표와 차트가 아주 깔끔하게 저장되었다.

chart & table crop

 

아래처럼 표와 차트는 pdf단위로 모두 추출하여 .png로 저장되었다.

 

차트 크롭

 

 

이제 이렇게 저장된 이미지와 PDF내 텍스트를 함께 ChatGPT에 넣어서

분석하는 일만 남았다. 

 

이미지와 텍스트를 함께 처리하는 것이므로 Multimodal로 진행했는데, 

분석된 내용은 PDF의 맥락을 유지하면서 각각의 분석이 진행되어야 했다. 이 부분은 PDF 내 각 요소들을 순차적으로 ChatGPT에 넣어 각각의 summary를 생성하는 방법으로 해결했는데, 이미지는 base64로 인코딩하여 진행했고 이때 이미지가 조금 많은 PDF를 돌렸을 때..ChatGPT토큰이 급증하기도 했다. 

 

그리고 테이블은 표 자체의 맥락을 유지하기 위해 마크다운으로도 변환하여 저장했다.

 

마지막으로 향후 LLM을 통해 레포트와 관련된 질문이 들어왔을 때, 빠른 벡터 검색이 되도록 하고자

각 요소별로 예상질문들도 뽑아서 함께 저장했다. 

hypothetical_questions

 

그리고 이렇게 요약 및 분석한 데이터는

디버깅에도 용이하고, PDF처리상황, 그리고 벡터화를 시키고자 JSON으로 저장했다. 

PDF 전처리

 

 

벡터스토어는 Chroma를 사용했는데,

데이터의 양이 많아짐에 따라 빠른 검색 속도가 필요했고, 메타데이터도 함께 저장해야 했다. 

그리고 무엇보다 별도의 서버 설정 없이 로컬에서 실행 가능하여 개발 및 테스트가 용이하다는 것..(이게 제일 큰 이유다 ㄷㄷ)

 

 

전처리는 끝났으니,

이제 RAG(Retrieval-Augmented Generation)를 생성하러 가보자! 

 

다음 글에서..


 

RePick의 개발 코드가 궁금하다면 😉? RePick-MLOps Github