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.