[금융 LLM 시리즈 2] 금융 데이터 셋 구축 전략과 학습 예시 공개

금융 AI 모델을 경량화하려면 특화된 데이터셋으로 학습시켜야 합니다. 올거나이즈의 금융 데이터 셋 구축 전략과 학습 예시를 공개합니다. 금융 LLM 시리즈는 온프렘 구축이 가능한 오픈소스 모델 중에서 성능 좋은 금융 AI 모델을 만들기 위한 올거나이즈 AI 팀의 고민과 진행 과정을 공유하고 있습니다.

[금융 LLM 시리즈 2] 금융 데이터 셋 구축 전략과 학습 예시 공개

금융 LLM 시리즈는 온프렘 구축이 가능한 오픈소스 모델 중에서 성능 좋은 금융 AI 모델을 만들기 위한 올거나이즈 AI 팀의 고민과 진행 과정을 공유하고 있습니다.
1편에서는 성능 좋은 금융 전문 LLM의 정의와 이를 평가하기 위한 방법론에 대해 올거나이즈 신기빈 CAIO가 방향을 제시했는데요.

[금융 LLM 시리즈 1] 성능 좋은 금융 AI 모델의 정의와 평가 방법
오픈AI의 GPT-4나 앤트로픽의 클로드3는 성능이 뛰어나지만, 망분리 규제를 받는 금융권에서는 사용이 어려운 측면이 있습니다. 온프렘 구축이 가능한 오픈소스 모델 중에서 성능 좋은 금융 AI 모델을 만들기 위한 올거나이즈 AI 팀의 고민과 진행 과정을 공유합니다. 금융 전문 LLM의 정의와 이를 평가하기 위한 방법론에 대해 올거나이즈 신기빈 CAIO가 방향을 제시합니다.

2편에서는 본격적으로 어떤 데이터셋으로 어떻게 평가할 것인지, 올거나이즈는 어떤 학습 방법으로 데이터 셋을 만들어서 금융 LLM의 성능을 평가할 준비를 했는지에 대해 박종헌 AI 엔지니어가 자세히 설명하겠습니다.


1. 금융 모델의 데이터셋은?

LLM이 다양한 downstream task들에서 좋은 성능을 보여주면서 다양한 domain-specific llm도 제안되고 있습니다. 이러한 domain-specific llm은 일반적인 llm보다 좋은 성능을 보여줬습니다. 이러한 특정 지식을 주입하기 위한 작업은 사전 학습을 통해 진행됩니다. 따라서 도메인 지식을 주입하기 위한 사전 학습은 2가지 방식으로 진행되는데 초기화된 모델에 처음부터(from scratch) 도메인 지식만 사전 학습하거나 일반적인 사전 학습 모델에 도메인 지식을 이어서 사전 학습하는 continual pretrain 방식을 진행합니다. 후자의 방법을 Domain-Adaptive Pre-Training (DAPT)라고 부르고, 일반 llm이 가진 장점을 그대로 가져올 수 있기 때문에 더 효율적인 방법입니다.Don't Stop Pretraining: Adapt Language Models to Domains and Tasks

이후 작년 9월에 출시된 Adapting Large Language Models via Reading Comprehension 논문에서는 특정 도메인에 대한 continual pretrain 방식이 도메인 지식을 부여할 수는 있지만 프롬프트 능력을 크게 감소시킨다고 얘기합니다. 따라서 해당 논문에서는 AdaptLLM이라는 도메인 말뭉치를 RAG와 같은 형태의 질문-답변 형식으로 전처리하는 방식을 제안하여 도메인 별 task들에 대한 성능을 향상시킵니다.

생물의학, 금융, 법률 도메인에서 말뭉치 보다 RAG와 같은 독해 질문 형태의 데이터가 더 좋은 성능을 보입니다.

올해 1월Improving Domain Adaptation through Extended-Text Reading Comprehension 논문에선 AdaptLLM 방식을 그대로 사용하게 되면 질문-답변의 context의 길이가 너무 짧기 때문에 도메인 지식의 종합적인 이해가 부족해진다고 얘기합니다. 따라서 논문에서는 길이 기반의 클러스터링을 활용하여 유사한 context들을 질문-답변의 context와 같이 사용하는 방식으로 AdaptLLM을 개선합니다.

생물의학과 금융 도메인에서 Domain-adaptive pretraining (DAPT), AdaptLLM(ReadCompre)과 AdaptLLM with Length-based Clustering 중 가장 좋은 성능을 보입니다.

요약

  1. DAPT, 일반 llm이 가진 장점을 그대로 활용할 수 있습니다.
  2. AdaptLLM, 프롬프트 능력을 감소시키지 않은채 도메인 지식을 부여할 수 있습니다.
  3. 길이 기반 클러스터링을 사용한 AdaptLLM, 도메인 지식의 종합적인 이해가 가능해집니다.

올거나이즈 AI팀은 길이 기반 클러스터링을 사용한 AdaptLLM 방식으로 학습 데이터셋을 만들어 domain-specific llm을 학습하였습니다. 그리고 이전 정의 파트 글의 아래와 같은 고려사항들을 고려하여 AIhub 데이터셋을 활용한 TableQA와 MathQA, 실제 금융 법률 판례를 활용한 Finance Legal 데이터셋을 만들었습니다.

  • 금융 업계의 문서에서는 많은 양의 표가 존재합니다. 이런 표에 대해서 이해하고 잘 대답할 수 있어야합니다.
  • 숫자를 다루는 문서가 많다보니 숫자를 이해하고 잘 대답해야합니다.
  • 금융 규정들의 경우 서로간 참조가 많이 이루어집니다. 이런 복잡한 참조 안에서도 논리적으로 대답해야합니다.

뿐만 아니라 예상할 수 없는 다양한 instruction도 잘 따를 수 있도록 OpenHermes-2.5 데이터셋 번역과 AIhub, huggingface의 한국어 instruction 데이터셋도 수집하였습니다.

2. RAG 데이터셋

RAG 데이터셋은 논문의 방식을 거의 그대로 가져와 한국어 데이터셋을 구축하였고, 과정은 다음과 같습니다.

먼저, 금융과 관련된 뉴스 기사 데이터를 수집하였습니다. 빅카인즈(BIG KINDS) 의 금융관련 뉴스를 약 1만개, AIhub의 뉴스 기사 기계독해 데이터에서 3만개, 숫자연산 기계독해 데이터에서 6만개를 수집하였습니다.

그 다음, 빅카인즈의 뉴스 기사 1만개를 활용하여 GPT로 QA셋을 생성한 뒤, 해당 데이터로 QA generation 모델을 만들었습니다. 이후 AIhub의 뉴스 기사 9만개는 학습한 저희의 QA generation 모델을 통해 생성했습니다. 1개의 뉴스 기사마다 3~4개 정도의 질문-답변 쌍을 생성하여 총 39만개의 QA 데이터를 만들었습니다.

이 후, Improving Domain Adaptation through Extended-Text Reading Comprehension 논문에서와 같이 4만개의 context에 대해 길이 기반의 클러스터링을 사용하여 클러스터를 만들었습니다. 클러스터링을 위해 meta에서 개발한 faiss 라이브러리를 사용하였고, 각 context에 대한 embedding vector를 얻기 위해 bge-m3 embedding model을 사용하였습니다. 클러스터링 이후 금융 카테고리에 속해 있지만 실제 금융과 관련되지 않은 뉴스기사들이 존재하여 추가로 금융 키워드 사전을 만들어 해당 사전의 키워드가 포함되지 않은 기사의 클러스터를 제거하였습니다. 마지막으로, 각 context 마다 자신의 cluster내에서 similarity가 특정 threshold 이상이고, similarity가 높은 context를 기준으로 model의 max token length 내에 꽉 차도록 하여 총 23만개 RAG 데이터셋을 완성하였습니다.

Domain Adaptation LLM 논문의 길이 기반 클러스터링 알고리즘

추가로 실제 서비스에서 있을 법한 지저분한 형태의 context에 대해서도 잘 동작하도록 하기 위해 금융 보고서와 같은 문서들을 수집하였고, 자체 parsing pipeline, retriever pipeline을 사용하여 real world의 context들에 대해서도 RAG 데이터셋을 만들었습니다. 평가 데이터들은 금융 전문 LLM 리더보드의 금융 LLM 아레나에서 확인 가능합니다.

금융 LLM Leaderboard
금융 전문 LLM 리더보드는 금융 용어와 약어를 이해하고, 복잡한 추론에 특화된 한국어 LLM의 성능을 평가합니다. 일반적인 LLM은 범용적으로 사용이 편리하지만, 금융에 필요한 수식 계산과 예외 조건 등을 포함한 복잡한 추론에 특화되어있지 않습니다. 금융 문서 특성상 수치와 트렌드가 강조된 표와 차트를 이해하는 것도 약한 편입니다. 금융 전문 LLM은 금융권 실무자들이 업무 현장에서 바로 사용할 수 있도록 금융 전문 데이터로 파인튜닝한 모델들입니다. 정제된 실험실의 데이터가 아닌 금융 현장의 데이터로 파인튜닝했고, 평가 데이터셋을 모두 공개합니다. 평가 데이터는 수식 계산, 복잡한 차트와 표 이해, RAG 관련 데이터들로, 금융 문서 스타일 및 업무 연관도가 높은 내용으로 구성되어 있습니다. 이 리더보드는 올거나이즈가 운영하고 있습니다.

3. TableQA & MathQA

실제 금융 문서에서는 표와 수학 계산 문제들이 많이 존재합니다. 금융 벤치마크 중 하나로 알려진 ConvFinQA: Exploring the Chain of Numerical Reasoning in... 데이터셋은 금융 영역에서 재무 보고서의 정량적 분석과 같이 실제로 사람들의 노동력이 들어간 현실적 문제의 요구가 있기 때문에 복잡한 수학적 reasoning 능력이 평가될 필요가 있다고 얘기합니다.

ConvFinQA 예시

올거나이즈 또한 위와 같은 능력을 중요하게 생각하여 AIHub의 표 정보 질의응답 데이터숫자연산 기계독해 데이터를 기반으로 CoT(Chain-of-Thought Prompting Elicits Reasoning in Large Language Models )와 같이 reasoning이 포함된 QA 데이터셋을 만들었습니다.

숫자연산 기계독해 데이터는 아래와 같은 형태로 정답에 계산 과정이 나와있지만 답변 자체는 단위만 포함된 단답형 숫자형태입니다. 따라서 저희는 아래 정보들을 GPT에 입력하여 resoning이 포함된 새로운 답변을 재생성하여 MathQA 데이터셋을 완성했습니다.

  • 원본 데이터
  • 재생성 후 데이터

표 정보 질의응답 데이터 또한 동일한 방식으로 답변을 재생성하였는데, html 태그 형태로 되어 있는 테이블을 markdown 형태로 바꿔서 사용하였습니다. 또한, TableQA에 사용되지 않은 테이블 데이터로 html to md / md to html instruction 데이터셋을 만들어 다양항 형태의 테이블에 대한 이해도를 높이도록 하였습니댜.

  • html 형식의 테이블
  • markdown(md) 형태의 테이블

4. Genaral Instruction dataset

V1 모델을 학습하고 겪은 문제 중 하나는 올거나이즈 pipeline에는 가장 최적화되어 있지만 다양한 instruction에 대응하지 못한다는 점이었습니다. 금융 도메인의 instruction dataset만 만들게 되면 데이터셋의 instruction 종류가 다양하지 못하여 학습한 instruction이 아닌 경우에 모델이 잘 대응하지 못하게 됩니다. 따라서 금융 도메인이 아닌 일반적으로 instruction tuning에 사용되는 dataset도 같이 학습하여 llm이 다양한 instruction에도 잘 대응할 수 있도록 해주었습니다.

dataset은 많이 알려져있는 OpenHermes-2.5 데이터셋을 자체 번역 모델을 사용하여 만들었고, 번역으로 만들기 어려운 데이터셋은 AIHub의 다양한 데이터셋에 기반하여 만들었습니다. 우선 OpenHermes-2.5 데이터셋은 다양한 오픈 소스 데이터셋을 합쳐놓은 데이터셋으로 coding, translation, multiple choice 등등의 정말 많은 instruction이 존재합니다.

instruction이 다양한 만큼 주어진 데이터를 그대로 번역을 하게 되면 문제가 생기는 경우가 굉장히 많습니다. 아래 몇가지만 예시로 설명드리겠습니다.

  • 코딩
    • code 중 일부가 번역되는 경우
    • 예시
      • 원본
        • Human
          • Create a REST API which adds two numbers provided by the user.
        • GPT
          • from flask import Flask, request

            app = Flask(__name__)

            @app.route('/add_two_numbers', methods=['GET', 'POST'])
            def add_two_numbers():
            if request.method == 'POST':
            # get data from the request
            data = request.get_json()

            # extract the numbers from the data
            num1 = data["num1"]
            num2 = data["num2"]

            # add the numbers
            result = num1 + num2

            # return the response
            return {'result': result}

            if __name__ == '__main__':
            app.run()
      • 번역
        • Human
          • 사용자가 제공한 두 개의 숫자를 추가하는 REST API를 생성합니다.
        • GPT
          • 플라스크에서 플라스크 가져오기, 요청

            app = Flask(__name__)

            @app.route('/add_two_numbers', methods=['GET', 'POST'])
            def add_two_numbers():
            if request.method == 'POST':
            # get data from the request
            data = request.get_json()

            # extract the numbers from the data
            num1 = data["num1"]
            num2 = data["num2"]
            # add the numbers
            result = num1 + num2
            # return the response
            return {'result': result}
            if __name__ == '__main__':
            app.run()
  • 번역 & 언어 맞추기
    • 영-일 번역이라면 영어와 일본어가 전부 한국어로 번역되는 경우
    • 이탈리아어 문장이 주어지고 어떤 언어인지 맞춰야 되는 문제가 아랍어 포함 전부 한국어로 번역되는 경우
    • 예시
      • 원본
        • Human
          • Sille sanon: "tavataan oikeudessa".

            Translate to English
        • GPT
          • The Finnish phrase "Sille sanon: 'tavataan oikeudessa'" translates to English as "To that, I say: 'See you in court'."
      • 번역
        • Human
          • 실레 산온: "타바탄 오이크데사".

            영어로 번역하기
        • GPT
          • 핀란드어 "Sille sanon: 'tavataan oikeudessa'"는 영어로 "그래서 저는 이렇게 말합니다: '법정에서 뵙겠습니다'"로 번역됩니다.
  • 구두점 추가
    • 번역이 되면서 구두점이 있는 문장과 없는 문장이 동일한 단어들이 사용되지 않는 경우
    • 예시
      • 원본
        • Human
          • Even a damn narrow bridge I should enter it The first doubts I had immediately Whether that works so well without being let describes as Marita R their concerns at the start of a week coaching under sail

            Add punctuation
        • GPT
          • Even a damn narrow bridge, I should enter it. The first doubts I had immediately. Whether that works so well without being let, describes as Marita R. their concerns at the start of a week coaching under sail.
      • 번역
        • Human
          • 망할 좁은 다리라도 들어가야 한다 첫 번째 의심은 즉시 그것이 항해하는 동안 일주일 동안 코칭을 시작할 때 그들이 걱정하는 것을 설명하지 않고 그렇게 잘 작동하는지 여부입니다.

            구두점 추가
        • GPT
          • 좁은 다리라도 들어가야 해요. 첫 번째 의심이 바로 들었습니다. 항해 코칭을 시작하면서 마리타 R.이 걱정하는 부분을 설명하는 데 도움이 됩니다.
  • 띄어쓰기
    • 단어 사이의 공백이 없는 문장이 주어지고 알맞게 띄어쓰기를 해야하는 문제에서 주어진 문장이 이상하게 번역 되는 경우
    • 예시
      • 원본
        • Human
          • Add spaces between the words in the following text: UltimateStackisyouranswer.Doyouwanttomultiplyyourenduranceduringdemandingcardioexercises?
        • GPT
          • Ultimate Stack is your answer. Do you want to multiply your endurance during demanding cardio exercises?
      • 번역
        • Human
          • 다음 텍스트의 단어 사이에 공백을 추가합니다: UltimateStackisyouranswer.Doyouwanttomultiplyyourenduranceduringdemandingcardioexercises?
        • GPT
          • 얼티밋 스택이 정답입니다. 힘든 유산소 운동 중 지구력을 높이고 싶으신가요?
  • 문장 이어서 생성하기
    • 중간까지만 문장을 주어주고 문장을 완성하도록 하는 경우
    • 예시
      • 원본
        • Human
          • Continue writing the next sentence in this paragraph:

            The woman in black shirt is bend over and hit the ball with mallet. The woman hit again the green ball causing it to hit the small pole. the woman in black
        • GPT
          • shirt is playing a game called croquet. In this game, you use a long stick with a flat end, called a mallet, to tap colorful balls through little wire gates, called wickets. The woman in black is trying to move her green ball through the wickets and win the game.
      • 번역
        • Human
          • 이 단락의 다음 문장을 계속 작성합니다:

            검은색 셔츠를 입은 여자가 허리를 굽혀 망치로 공을 치고 있습니다. 여자는 다시 녹색 공을 쳐서 작은 기둥에 부딪혔습니다. 검은 옷을 입은 여자
        • GPT
          • 셔츠가 크로켓이라는 게임을 하고 있습니다. 이 게임에서는 망치라고 불리는 끝이 평평한 긴 막대기를 사용하여 위켓이라고 불리는 작은 철제 게이트를 통해 형형색색의 공을 두드리는 게임입니다. 검은색 여성은 녹색 공을 위켓을 통과시켜 게임에서 승리하려고 합니다.
  • 대명사
    • 특정 이름, 약어, 대명사의 경우, 이전 내용을 고려하지 않은채 번역이 되는 경우
    • 예시
      • 원본
        • Q: Bill has 15 cookies and gives 3 to John. Sally then asks Bill for an apple. Who gave John cookies?
        • A: Bill
      • 번역
        • Q: 빌은 15개의 쿠키를 가지고 있고 존에게 3개를 줍니다. 샐리는 그리고 나서 빌에게 사과를 요구합니다. 누가 존에게 쿠키를 주었습니까?
        • A: 청구서

예시 외에도 다양한 번역 문제가 존재하였고, 뿐만 아니라 중복 데이터, 번역 모델의 end token 미생성으로 인한 반복 답변 문제도 있었습니다. 번역 문제는 무작위로 샘플링하며 문제가 되는 경우의 instruction을 수작업으로 확인하여 제거하였고, 중복 데이터와 반복 답변 문제는 deduplication, n-gram 기반의 filtering을 사용하여 탐지, 제거하였습니다. 후처리 작업 후 약 30만개로 데이터셋을 완성하였습니다.

그리고 번역으로 누락된 경우의 instruction 데이터셋을 가능한 보강해주기 위해 AIHub의 데이터셋을 활용하여 만들어주었고, 번역, 코딩, 수학 문제의 경우는 영어 데이터셋을 그대로 사용하여 학습하였습니다.

5. Dataset Details


3편은 본격적으로 금융 LLM의 평가 방법에 대해 말씀드릴 예정입니다. 정성 평가와 정량 평가 중 중요한 것은 무엇일까요? 여러가지 평가 방법 중에 유효한 것, 옳은 것을 찾을 때는 어떤 것을 봐야 할까요? 다음 편에서 올거나이즈 AI 팀의 고민과 결론에 대해 보실 수 있습니다. 기대해 주세요.

온프렘 금융 LLM 구축 방법 및 관련해 궁금한 점이 있으시다면 언제든지 올거나이즈에 문의 남겨 주세요.

Contact Us