BOK(Bank of Korea) Reports Analyzer
Google ML Bootcamp 2024 Gemma Sprint : 김지우 박지훈 신재솔
[요약]
중앙은행의 발표와 간행물은 금융 부문과 경제 전반에 걸쳐 지대한 영향을 미치고 있습니다. 이에 대응하여 한국은행의 정책 및 연구 결과와 관련된 질문에 답변할 수 있도록 설계된 챗봇 시스템을 개발하고 있습니다. 이를 뒷받침하기 위해 한국은행의 연례 보고서와 보도 자료에서 종합적인 데이터 세트를 만들고 있습니다. 이 챗봇은 한국은행의 경제 정책과 의사 결정에 대한 인사이트를 찾는 모든 사람에게 귀중한 자료가 될 것입니다.
The announcements and publications from central banks have a profound impact on both the financial sector and the broader economy. In response to this, we are developing a chatbot system designed to answer questions related to the Bank of Korea’s policies and research findings. To support this, we are creating a comprehensive dataset from the Bank of Korea’s annual reports and press releases. This chatbot will be a valuable resource for anyone seeking insights into the economic policies and decisions made by the Bank of Korea.
[데이터]
- 한국은행의 연차보고서 2019-2023 2003년부터 수집했으나 최근 5개년 데이터에 대해 학습을 진행함
- 한국은행의 Q&A 자료
[진행과정] 텍스트 전처리 임베딩 모델 파인튜닝 LLM 파인튜닝 Q&A, RAG 챗봇 구현
[서론]
목표 및 문제 정의 한국은행(BOK)의 발표와 간행물은 금융 부문과 경제 전반에 걸쳐 중요한 영향을 미칩니다. 이에 대응하여, 한국은행의 정책 및 연구 결과와 관련된 질문에 답변할 수 있는 챗봇 시스템을 개발하고 있습니다. 이 시스템은 한국은행의 연차보고서와 Q&A 자료를 지식 원천으로 활용하여 신속하고 정확한 정보를 제공하는 것을 목표로 하고 있습니다. RAG 시스템의 중요성 및 배경 LLM(대형 언어 모델)은 자연어 처리에서 혁신을 이루었지만, 여전히 학습된 데이터 외의 정보에 접근할 수 없다는 한계를 지녔습니다. 이에 따라 등장한 RAG(Retrieval-Augmented Generation)는 대형 언어 모델이 외부 데이터베이스나 문서에서 관련 정보를 검색하고 이를 활용해 더욱 정확한 답변을 생성할 수 있도록 합니다. 이는 방대한 데이터를 실시간으로 처리하고 정책 관련 정보를 제공하는 데 매우 유용합니다. RAG의 이러한 특성은 특히 한국은행과 같은 대규모 정책 기관의 연차보고서와 같은 문서에서 필요한 정보를 실시간으로 검색하고 활용하는 데 중요한 역할을 합니다. 이로 인해 한국은행의 정책과 연구 자료를 보다 효과적으로 사용자에게 전달할 수 있습니다. 실습의 의의 이번 프로젝트에서 RAG 시스템을 실습함으로써 방대한 문서를 효율적으로 처리할 수 있는 방법을 탐구했습니다. 특히, 대형 문서 데이터셋을 활용한 질의응답 시스템 구축 경험을 통해 대규모 데이터를 다루는 실무 환경에서도 높은 효율성을 달성할 수 있는 방법론을 체험했습니다. 또한, 이 실습을 통해 얻은 기술은 금융 정책뿐만 아니라 법률, 의료, 학술 등 다양한 도메인에 응용이 가능합니다.
[세부 진행사항] 데이터 수집 및 전처리
먼저 우리는 한국은행 공식 홈페이지(www.bok.or.k)에서 2003년부터 2024년까지 작성된 공식 연차보고서 및 민원 FAQ에 올라온 텍스트 데이터를 수집했습니다. 크롤러는 Selenium을 사용했고, PyMuPDF는 PDF 파일 작업을 위한 포괄적인 도구 세트를 제공하는 오픈 소스 Python 라이브러리 Fitz를 사용해 텍스트를 추출했습니다. 추출한 데이터는 띄어쓰기가 되어있지 않았기 때문에 pykospacing 라이브러리를 통해 한국어 문법에 맞는 띄어쓰기를 했습니다. 표나 목차 형식의 데이터를 제거하여 정제하기 위해, Langchain의 SpacyTextSplitter를 통해 문서를 분할한 뒤, Few-Shot Prompt 방식으로 정제해야 할 텍스트에 대한 예시를 제시하여 OpenAI API에 던졌습니다. 모델은 성능이 준수하면서도 가벼운 gpt-4o-mini-2024-07-18를 이용했습니다. 모델 선택과 및 파인튜닝
Q&A에는 명확한 질문과 답이 존재하는 한편, 연차보고서에는 어떤 내용이 중요한 내용인지 명확하지 않습니다. 그래서 먼저 Q&A에 대해서는 입력으로 들어온 질문과 유사한 질문이 있는지 검색하고, 설정한 수준 이상일 경우 해당 질문의 답변을 출력하는 시스템을 구현했습니다. 그리고 설정한 수준 이하일 경우, 연차보고서를 지식원천으로 하여 가장 유사도가 높은 문단들을 컨텍스트로 답변을 생성하는 RAG 시스템을 구현하였습니다. 구현 과정에서 성능을 높이기 위해 연차보고서 코퍼스를 바탕으로 두 차례 파인튜닝을 진행했습니다.
BoK Reports Analyzer의 Data Flow Diagram
(1) 임베딩 인코더 Sentence-BERT 파인튜닝
Q&A나 RAG 검색과정에서 활용하는 임베딩 인코더를 학습시키기 위해 연차보고서를 바탕으로 hugging face의 sentence transformer를 파인튜닝했습니다. 학습 과정은 Sentence-BERT(SBERT) 기반 모델을 사용하여 문장 임베딩을 생성하고, STS(Semantic Textual Similarity)와 NLI(Natural Language Inference)를 사용하여 문장 간 유사도 예측, 문장 간 관계를 학습하였습니다.
파인 튜닝은 크게 STS 단일 학습 -> NLI 학습 후 STS 추가 학습으로 진행하였습니다.
① STS 단일 학습 Cosine Similarity Loss를 사용하여 학습하였고, 학습 후 training loss는 0.001정도로 단일 학습만으로도 좋은 성능을 보였습니다.
② NLI 학습 후 STS 추가 학습 Multiple Negatives Ranking Loss를 사용하여 NLI를 학습하고, 이전과 마찬가지로 Cosine Similarity Loss를 적용해 추가 학습을 하였습니다. 이 과정에서는 training loss가 0.003 정도로 STS 단일 학습보다 약간 높은 loss를 보였지만, 이는 일반화 성능이 높아졌다는 결과이므로 전체적인 성능은 더 좋아졌다고 판단하였습니다.
학습 과정에서는 Pearson과 Spearman 같은 다양한 평가 지표를 사용해 모델 성능을 모니터링 했습니다. 이를 통해 모델이 문장 유사도를 잘 예측하는지(Pearson) 뿐만 아니라, 유사도 순위를 잘 맞추는지(Spearman)을 동시에 확인하였습니다. 두 상관계수 간의 균형을 유지하는 것이 모델 성능을 종합적으로 평가하는 데 중요한 역할을 했으며, 지표 변화를 분석하면서 모델을 더욱 정교하게 튜닝할 수 있었습니다.
(2) 언어모델 Gemma-2b-it 파인튜닝
답변 부분의 성능을 개선하기 위해 LLM 자체를 2019-2023 연차보고서를 바탕으로 파인튜닝했습니다. Gemma2 언어 모델을 한국은행의 2019년부터 2023년까지의 연차보고서 데이터를 기반으로 Fine-Tuning하여, 한국 경제와 금융 관련 문서에서의 이해력과 텍스트 생성 능력을 개선했습니다. 우선, Hugging Face의 AutoTokenizer와 AutoModelForCausalLM을 사용하여 Gemma2 모델을 초기화하고, Causal Language Modeling 작업에 맞는 설정을 적용했습니다. 이를 통해 Gemma2 모델이 보고서 형식의 텍스트를 더 잘 이해하고 생성할 수 있도록 최적화하였습니다. 추가적으로, 모델 학습 시 메모리 효율성을 높이기 위해 BitsAndBytesConfig를 활용한 4bit 양자화(Quantization) 설정을 적용하였습니다. 이는 모델의 메모리 사용량을 줄이는 동시에, 연산 정확도를 보장하기 위해 torch.float32를 사용하여 계산하도록 설정하였습니다. 이를 통해 제한된 자원으로도 대규모 데이터를 효율적으로 학습할 수 있는 환경을 구축할 수 있었습니다. 또한, 학습 중 불필요한 파라미터 업데이트를 최소화하고 효율적인 학습을 진행하기 위해 peft 라이브러리의 LoRA(Low-Rank Adaptation) 기법을 사용하였습니다. LoraConfig를 통해 모델의 특정 레이어만 학습하도록 구성하였고, get_peft_model 함수로 경량화된 모델을 생성하여 전체 학습 과정에서 메모리와 연산량을 크게 줄일 수 있었습니다. 이러한 설정은 Fine-Tuning된 모델이 한국은행의 특화된 경제 보고서 문체를 더 잘 반영하도록 도왔습니다. 학습이 완료된 후, 한국은행 연차보고서 내 특정 주제에 대해 질문을 하거나, 연차보고서와 유사한 스타일의 텍스트를 생성하는 테스트를 수행하였습니다.
[결과 및 시현예시]
-
Q&A시스템에 의해 답변이 출력된 경우 : 속도가 빠르고 자세한 답변을 제공하지만, 질문과 맞지 않는 답변을 제공할 때도 많다
-
RAG에 의해 답변이 출력된 경우 기본적으로 관련 문서를 찾아와 모델이 이를 참고하여 응답하는 과정은 잘 이루어지고 있으나, 지나치게 단답식이거나 답변을 못하고 뻗어버리는 상황이 자주 발생한다.
-
파인튜닝된 모델 비교적 한국은행이나 경제 관련 지식들을 잘 습득하고 있으나, 특정한 사실들을 잘 기억해내지는 못한다.
[향후 개선 방향] 현재 시스템은 실용성 있는 수준에 도달하지 못한 부분이 존재합니다. 먼저, 여전히 답변의 품질이 만족스럽지 못하고, 또 일관성 있는 답변의 수준을 얻지 못하고 있습니다. 입력된 쿼리에 대해 Q&A, RAG, 파인튜닝 모델, 3가지 답변을 제공할 수 있는데, 어떤 질문에 대해 어느 답변을 제공하면 좋을지에 대해서도 기준이 모호합니다. 또한, 반복되는 내용이나 끊기는 문장, 입력이 그대로 출력되는 문장 등에서 발생하는 환각 문제를 제대로 제어하지 못하고 있어 기계적인 후처리에 의존하는 상황입니다. 이 부분은 향후 자연스러운 응답 생성을 위해 추가적인 개선이 필요합니다. 또한 현재 시스템은 처리 속도가 느려 실시간 응답에 어려움이 있습니다. 이를 해결하기 위해 한편으로는 모델 경량화, 다른 한편으로는 좀 더 높은 처리성능을 가진 서빙 환경을 구축할 필요성이 있습니다. 구현과정에서의 문제 또한 있었습니다. 이번에는 최근 5년 간 자료만을 사용했는데, 과거로 갈 수록 OCR 인식률이 떨어지는 문제점이 있었습니다. 또한 표 형식으로 구성된 데이터를 단순히 버리는 것이 아니라, 이를 활용할 수 있는 방법을 모색할 필요가 있습니다. 또한 현행 시스템은 문장을 분할한 뒤, 문장만을 가지고 거리와 유사도를 계산하고 있습니다. 같은 문장이라도 다른 연도의 보고서에 속한 경우, 해당 문장의 맥락이 달라질 수 있는데, 이런 점들을 반영한다면 더욱 충실한 내용을 소개할 수 있는 챗봇을 구현할 수 있을 것이라 생각합니다.