본문

3. 데이터셋 준비하기

반응형

앞서 살펴본 파인튜닝의 개념을 실제로 적용하기 위해서는 학습을 위한 데이터가 필요합니다.

이제 데이터를 어떻게 준비하고 처리하는지 알아보겠습니다.

데이터 학습을 위해 데이터셋을 토크나이징하는 과정

 

  • 데이터셋 준비하기
    • 첫 번째 방법: 허깅페이스에서 데이터셋 찾기
    • 두 번째 방법: 자체 데이터셋 만들기

허깅페이스에서 데이터셋 찾기

 

  • 허깅페이스(Hugging Face)가 뭐야?
    • 인공지능 분야에서 사용되는 머신러닝 모델과 데이터셋을 공유하고 협업하는 서비스입니다.

 

허깅페이스(https://huggingface.co/datasets)에서 금융 관련 키워드로 검색하면 다양한 금융 데이터셋을 찾을 수 있어요.

https://huggingface.co/datasets?other=finance&sort=likes

 

허깅페이스 데이터셋 샘플

gbharti/finance-alpaca

 

sujet-ai/Sujet-Finance-Instruct-177k

  1. gbharti/finance-alpaca
    • 금융 상담: 투자, 은퇴, 포트폴리오 관련 조언
    • 금융 교육: 경제 개념, 용어, 법률 설명
    • 실용 조언: 신용카드, 투자 위험, 세금 관련
    • 맞춤형 상담: 개인별 상황에 따른 전문 조언
  2. sujet-ai/Sujet-Finance-Instruct-177k
    • 감성 분석: 금융 텍스트의 긍정/부정 분석, 주가 전망
    • 금융 특화: 전문 질의응답, 뉴스 분석, 대화형 응답
    • 고급 분석: 복잡한 금융 질문 답변, 맥락 기반 상담

자체 데이터셋 만들기

AI를 가르치기 위한 교과서를 만든다고 생각하면 쉬워요!

 

시작하기 전에 필요한 것들

  • 기본 데이터 (AI에게 가르칠 내용)
    • 마치 학생에게 줄 교과서처럼!
  • GPT-4 API 키
    • 도서관 출입증과 같은 것!
  • 데이터 검증 도구
    • 교과서 내용이 정확한지 검토하는 도구

 

1. 학습 데이터 모으기

  • 첫 번째 방법: 회사 데이터베이스에서 직접 가져오기
    • 마치 회사 도서관에서 책을 빌리는 것처럼!
    • OO증권의 2024년 1분기 실적 데이터 가져오기 (영업 수익, 순이익, 기타 재무 정보)
# 사내 DB 연결 예시
import pymysql
import pandas as pd
from sqlalchemy import create_engine

# DB 연결 설정
db_connection = create_engine(
    'mysql+pymysql://user:password@hostname/database'
)

# 실적 데이터 쿼리
query = """
SELECT quarter, revenue, profit, roe, roa
FROM test_securities_results
WHERE year = 2024 AND quarter = 1
"""

# DB에서 데이터 불러오기
test_data = pd.read_sql(query, db_connection)

# System Prompt에 실시간 데이터 반영
system_prompt = f"""당신은 한국의 금융 전문가입니다.
현재 OO증권의 데이터:
- 2024년 1분기 영업수익: {test_data.iloc[0]['revenue']}
- 2024년 1분기 순이익: {test_data.iloc[0]['profit']}
...

 

  • 두 번째 방법: 문서에서 추출하기
  • 마치 신문이나 보고서에서 중요한 내용을 스크랩하는 것처럼!
    • 실적 보고서에서 중요 내용 추출
    • 시장 분석 보고서에서 인사이트 추출
# 실적보고서와 시장분석 자료 활용
earnings_report = """[실적보고서]..."""
market_analysis = """[시장분석]..."""

system_prompt = f"""다음 OO증권 관련 문서들을 참고해 답변해주세요:

1. 실적 정보:
{earnings_report}

2. 시장 분석:
{market_analysis}

제시된 문서 내용에 기반하여 답변해주세요."""
  • 세 번째 방법: 파일에서 읽어오기
  • # 마치 엑셀 파일에 잘 정리된 성적표를 읽는 것처럼!
    • OO증권의 분기별 실적이 정리된 CSV 파일 읽기
    • 정리된 데이터를 AI가 이해할 수 있는 형태로 변환
# CSV 파일에서 데이터 읽기
def load_test_financial_data(file_path):
    # OO증권 재무데이터 로드
    df = pd.read_csv(file_path)
    return df

# 데이터 로드
test_financial_data = load_test_financial_data('test_securities_financial_data.csv')

# System Prompt 구성
system_prompt = f"""당신은 한국의 금융 전문가입니다.
다음 OO증권의 분기별 실적 데이터를 참고하여 답변해주세요:

{test_financial_data.to_string()}

제공된 데이터의 범위 내에서만 답변해주세요."""

 

2. AI에게 금융 전문가 역할 부여하기

#마치 신입 직원에게 업무 매뉴얼을 주는 것처럼:

  • "당신은 OO증권의 리서치 전문가입니다"
  • "이 공시 자료를 참고해서 답변하세요"
  • "전문 용어는 쉽게 설명해주세요"
# GPT-4를 금융 전문가로 설정
system_prompt = f"""당신은 OO증권의 리서치 전문가입니다.
다음 공시 데이터를 기반으로 답변해주세요:

{reference_doc}

주의사항:
1. 제공된 실제 데이터만 사용하여 답변
2. 수치는 정확하게 인용
3. 금융 전문 용어는 쉽게 설명

 

3. 질문-답변 세트 만들기

  • Q: "OO증권의 2024년 1분기 실적이 어떤가요?"
  • A: "2024년 1분기 영업수익은 1조 2,345억원으로..."
qa_pairs = [
    {
        "질문": "OO증권의 2024년 1분기 영업수익이 얼마인가요?",
        "답변": "OO증권의 2024년 1분기 영업수익은 1조 2,345억원..."
    },
    ...
]

 

4. 데이터 저장하기

  • CSV 파일로 저장 (엑셀로 열 수 있게)
  • JSON 파일로 저장 (컴퓨터가 읽기 쉽게)
  • 한글이 깨지지 않도록 관리
# CSV와 JSON 형식으로 저장
def save_dataset(dataset: List[Dict], filename: str):
    """데이터셋을 CSV와 JSON 형식으로 저장"""
    try:
        # DataFrame 생성
        df = pd.DataFrame(dataset)
        
        # CSV 저장 (한글 깨짐 방지)
        df.to_csv(
            f"{filename}.csv", 
            index=False, 
            encoding='utf-8-sig'
        )
        
        # JSON 저장 (한글 깨짐 방지 + 들여쓰기)
        with open(f"{filename}.json", 'w', encoding='utf-8') as f:
            json.dump(
                dataset, 
                f, 
                ensure_ascii=False, 
                indent=2
            )
            
        print(f"데이터셋 저장 완료:")
        print(f"- CSV 파일: {filename}.csv")
        print(f"- JSON 파일: {filename}.json")
        
    except Exception as e:
        print(f"데이터셋 저장 중 오류 발생: {str(e)}")
        raise

 

5. 전체 과정 자동화하기

  • 파이프라인 단계
    • 1단계: 준비 작업
    • 2단계: 질문-답변 세트 만들기
    • 3단계: 데이터 검증하기
    • 4단계: 데이터 저장하기
    • 5단계: 샘플 확인하기
  • 예시 코드
import os
import json
from typing import List, Dict
import random

def generate_qa_pair() -> Dict[str, str]:
    """단일 질문-답변 쌍 생성"""
    templates = [
        {
            "instruction": "주식 투자를 처음 시작하려고 합니다. 어떻게 시작해야 할까요?",
            "response": "주식 투자를 시작하기 위한 기본 단계를 안내해드리겠습니다:\n1. 증권사 계좌 개설\n2. 기본적인 투자 교육 이수\n3. 소액으로 시작하여 경험 쌓기\n4. 분산 투자로 리스크 관리\n5. 정기적인 투자 성과 모니터링"
        },
        {
            "instruction": "ETF와 주식의 차이점은 무엇인가요?",
            "response": "ETF와 주식의 주요 차이점을 설명드리겠습니다:\n1. 분산투자: ETF는 여러 종목에 분산투자, 주식은 단일 기업 투자\n2. 위험도: ETF가 일반적으로 위험도가 낮음\n3. 운용방식: ETF는 인덱스 추종, 주식은 기업 실적에 따라 변동\n4. 거래방식: 둘 다 실시간 거래 가능"
        },
        {
            "instruction": "주식 투자 시 손실 관리는 어떻게 해야 하나요?",
            "response": "효과적인 손실 관리 방법을 안내해드립니다:\n1. 투자금 분산\n2. 손절매 기준 설정\n3. 적정 투자 비중 유지\n4. 정기적인 포트폴리오 리밸런싱\n5. 투자 일지 작성으로 실수 분석"
        }
    ]
    return random.choice(templates)

def generate_dataset(num_samples: int) -> List[Dict[str, str]]:
    """지정된 수만큼 Q&A 쌍 생성"""
    dataset = []
    for _ in range(num_samples):
        qa_pair = generate_qa_pair()
        dataset.append(qa_pair)
    return dataset

def validate_response(qa_pair: Dict[str, str]) -> bool:
    """Q&A 쌍 유효성 검증"""
    # 필수 키 존재 확인
    if not all(key in qa_pair for key in ['instruction', 'response']):
        return False
    
    # 내용 길이 검증
    if len(qa_pair['instruction']) < 10 or len(qa_pair['response']) < 20:
        return False
    
    # 내용 형식 검증
    if not qa_pair['instruction'].endswith('?'):
        return False
        
    return True

def save_dataset(dataset: List[Dict[str, str]], output_path: str) -> None:
    """데이터셋을 JSON 형식으로 저장"""
    # JSON 파일로 저장
    with open(f"{output_path}.json", 'w', encoding='utf-8') as f:
        json.dump(dataset, f, ensure_ascii=False, indent=2)
    
    # CSV 형식으로도 저장 (backup)
    import csv
    with open(f"{output_path}.csv", 'w', encoding='utf-8', newline='') as f:
        writer = csv.DictWriter(f, fieldnames=['instruction', 'response'])
        writer.writeheader()
        writer.writerows(dataset)

# 메인 실행 프로그램
def main():
    """데이터셋 생성부터 저장까지 전체 파이프라인"""
    try:
        print("OO증권 데이터셋 생성 시작...")
        
        # 1. 초기 설정
        os.makedirs('output', exist_ok=True)  # 출력 폴더 생성
        
        # 2. 데이터셋 생성 (5개의 Q&A 쌍)
        dataset = generate_dataset(num_samples=5)
        print(f"데이터셋 생성: {len(dataset)}개의 Q&A 쌍")
        
        # 3. 데이터 검증
        validated_dataset = [
            qa for qa in dataset 
            if validate_response(qa)
        ]
        print(f"검증 통과: {len(validated_dataset)}개의 Q&A 쌍")
        
        # 4. 데이터셋 저장
        output_path = "output/test_securities_qa_dataset"
        save_dataset(validated_dataset, output_path)
        
        # 5. 샘플 데이터 확인
        print("\n생성된 데이터 샘플:")
        for idx, qa in enumerate(validated_dataset[:2], 1):
            print(f"\n[샘플 {idx}]")
            print(f"Q: {qa['instruction']}")
            print(f"A: {qa['response']}")
            
    except Exception as e:
        print(f"실행 중 오류 발생: {str(e)}")
        raise
    else:
        print("\n데이터셋 생성 완료!")

if __name__ == "__main__":
    main()

 

반응형

공유

댓글