Post

금융 RAG 근거 설계 정리: 리포트, 뉴스, 표 데이터

금융 RAG 근거 설계 정리: 리포트, 뉴스, 표 데이터

금융 RAG를 보며 계속 걸렸던 지점은 근거의 종류가 너무 다르다는 점이었습니다.

증권 리포트는 길고 정적이며, 뉴스는 짧고 최신성이 중요합니다. 표 데이터에서는 숫자와 단위가 중요하고 그래프는 추세를 담습니다. 이 네 가지를 같은 chunk로 취급하면 답변은 자연스러워도 근거가 흐려집니다.

flowchart LR
  A["Analyst Report<br/>장기 분석 근거"] --> M["Metadata<br/>source, date, page, unit"]
  N["News<br/>최신 이벤트"] --> M
  T["Table<br/>수치와 단위"] --> M
  C["Chart<br/>추세와 변동"] --> M

  M --> S["Source-Type Retrieval<br/>근거 유형별 검색"]
  S --> R["Reranking<br/>질문별 근거 재정렬"]
  R --> G["Grounded Answer<br/>근거 안에서 답변"]
  G --> CIT["Citation<br/>출처와 조건 표시"]

금융 RAG에서 처음에 나눌 것

금융 질의응답에서는 “무엇을 검색할 것인가”만으로는 부족합니다. 근거를 어떻게 분리할지도 함께 정해야 합니다.

근거특징주의점
리포트 본문분석 관점과 장기 근거발행일과 증권사 기준을 남겨야 한다
뉴스최신 이벤트와 감성과거 리포트와 시간 기준이 다르다
표 데이터매출, 이익, 비율 등 수치단위, 기간, 행/열 관계가 중요하다
그래프/차트추세와 변동이미지 설명과 주변 문맥이 필요하다

금융 RAG에서 근거는 하나가 아닙니다. 따라서 retrieval 단계에서 source type을 metadata로 남겨야 합니다.

리포트와 뉴스는 분리한다

리포트 기반 답변과 뉴스 기반 답변을 섞으면 시간 기준이 흔들릴 수 있습니다.

예를 들어 리포트는 3개월 전 데이터를 기준으로 기업을 평가했지만, 뉴스는 어제 발생한 이벤트를 말할 수 있습니다. 둘 다 맞는 정보라도 같은 근거처럼 쓰면 답변의 기준이 애매해집니다.

질문 유형우선 근거
기업의 장기 경쟁력리포트 본문
최근 주가 변동 이유뉴스
재무 수치 확인표 데이터
추세 설명그래프/차트 설명

따라서 답변에서는 “리포트 기준”과 “최근 뉴스 기준”을 분리해 말할 수 있어야 한다고 봤습니다.

표 데이터는 RAG의 별도 입력이다

금융 문서에서 표는 부가 자료가 아닙니다. 핵심 수치가 표에 들어 있습니다.

표를 일반 텍스트처럼 chunking하면 다음 문제가 생깁니다.

문제예
헤더 손실숫자가 매출인지 영업이익인지 알 수 없음
기간 손실2023년 값인지 2024년 값인지 불명확
단위 손실억 원, %, 배수 같은 단위 누락
행/열 관계 손실셀 값만 남고 비교 구조가 사라짐

따라서 표는 table_id, page, company, period, metric, unit 같은 metadata를 붙여 저장하는 편이 낫습니다.

Hallucination을 줄이는 방식

금융 RAG에서 hallucination을 줄인다는 말은 조심해야 합니다. 완전히 제거한다고 말할 수는 없지만, 줄일 수 있는 방향은 있습니다.

방법기대 효과
근거 source type 분리리포트, 뉴스, 표 근거가 섞이는 문제 감소
Retrieval / Generation 평가 분리검색 실패와 생성 실패를 구분
Groundedness check답변이 근거에 묶여 있는지 확인
Query rewrite질문과 문서 표현 차이 완화
Reranker관련 근거를 앞쪽으로 재정렬

중요한 것은 “답변이 그럴듯한가”보다 “근거 문서로 돌아갈 수 있는가”입니다.

다시 설계할 때 볼 것

금융 RAG를 다시 설계한다면 아래 항목부터 확인하겠습니다.

체크질문
근거 종류리포트, 뉴스, 표, 그래프를 분리했는가
시간 기준발행일과 최신성을 답변에 반영했는가
수치 근거단위와 기간을 보존했는가
검색 평가정답 근거가 Top-K 안에 들어오는가
생성 평가답변이 근거 밖으로 나가지 않는가
사용자 표현투자 조언처럼 단정하지 않는가

Evidence를 따로 남기는 코드

금융 RAG를 코드로 적어보면 retrieval 결과를 바로 문자열로 합치지 않는 것이 중요합니다. content, metadata, score, source를 묶어두고, 표 데이터는 별도 경로로 처리해야 합니다. 금융 문서에서 표를 본문과 같은 방식으로 다루면 수치와 단위가 쉽게 깨집니다.

코드로는 다음 정도만 남겨도 기준이 분명해집니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from dataclasses import dataclass


@dataclass
class Evidence:
    content: str
    source_type: str  # report, news, table, chart를 섞지 않기 위한 경계
    page: int | None
    published_at: str | None
    score: float


@dataclass
class GroundedAnswer:
    answer: str
    # 답변보다 먼저 근거 목록이 남아야 나중에 검증할 수 있다.
    evidences: list[Evidence]
    missing_context: bool

금융 RAG에서는 답변 문장보다 Evidence가 먼저입니다. 답변이 맞아 보여도 어떤 리포트, 어떤 날짜, 어떤 표에서 온 근거인지 남아 있지 않으면 나중에 검증할 수 없습니다.

남은 원칙

금융 RAG는 일반 문서 RAG보다 근거 경계에 더 민감합니다. 리포트, 뉴스, 표, 그래프가 서로 다른 시간성과 의미를 갖기 때문입니다.

좋은 답변 문장보다 먼저 해야 할 일은 근거를 분리하고 추적 가능하게 만드는 것입니다. 금융 RAG의 품질은 그 지점에서 시작됩니다.

This post is licensed under CC BY 4.0 by the author.