본문 바로가기

MLOps/Development

금융 전문가 Agent - 오픈소스 FinRoBot (1)

금융 투자 관련 서비스에서는 정말 다양한 질문에 답변을 해줘야함

출처 : theTerminalx

 

 

다양한 질문들을 어떤식으로 풀어나가야하나.. 하다가

일단 이런식으로 접근을 좀 했다


코딩을 하는데 손이 더 나가지 않음

상당히 잘못됨을 느꼈기 때문임

class QuestionClassifier:
    def __init__(self, llm: OpenAI, categories: List[str] = None):
        """
        질문을 카테고리로 분류하는 클래스를 초기화.
        :param llm: OpenAI LLM 모델 인스턴스 (LangChain 기반)
        :param categories: 분류할 카테고리 리스트 (기본값: 사전 정의된 카테고리)
        """
        self.llm = llm
        self.categories = categories or ["거시경제", "기업분석", "산업동향", "암호화폐", "ETF/펀드", "기타"]

    def classify(self, question: str) -> str:
        """
        주어진 질문을 LLM을 사용하여 카테고리 중 하나로 분류.
        """
        if not question.strip():
            return "기타"

        classification_prompt = f"""
        너는 질문을 아래 카테고리 중 하나로 분류해라
        {self.categories}.

        사용자의 질문:
        {question}

        위 카테고리 중 가장 잘 맞는 것을 정확히 하나만 골라라
        카테고리 이름만 출력해라.
        """

        response_text = self.llm.invoke(classification_prompt)
  

        return response_text if response_text in self.categories else "기타"

그래서 일단 관련 업종에 종사하는 형한테 질문을 함


대충 이런 내용 


 

추가로 FinRobot 이란걸 찾게됨. 

그래서 이 친구의 문제 해결 방식을 살펴보기로 함

 

FinRobot: An Open-Source AI Agent Platform for Financial Applications using Large Language Models

As financial institutions and professionals increasingly incorporate Large Language Models (LLMs) into their workflows, substantial barriers, including proprietary data and specialized knowledge, persist between the finance sector and the AI community. The

arxiv.org

 


Abstract

본 논문에서는 FinRobot이라는 새로운 오픈소스 AI 에이전트 플랫폼을 소개함.

이 플랫폼은 금융 특화 AI 에이전트들을 지원하며, 각 에이전트는 LLM을 기반으로 작동

 

FinRobot은 네 개의 주요 계층으로 구성됨

  1. Financial AI Agents Layer: Financial Chain-of-Thought(CoT) Prompting 기법을 활용하여 복잡한 금융 문제를 논리적인 단계로 나누어 해결
  2. Financial LLM Algorithms Layer: 특정 금융 작업에 적합한 모델을 동적으로 구성
  3. LLMOps & DataOps Layer: 훈련 및 미세 조정을 통해 보다 정확한 모델을 생성하고 금융 데이터와 연계
  4. Multi-source LLM Foundation Models Layer: 다양한 LLM을 통합하여 금융 분석을 위한 최적의 모델을 선택 가능

논문에서는 FinRobot의 기술적 세부사항과 금융 AI 에이전트의 성능 평가를 다루며, 플랫폼의 소스 코드는 GitHub에서 공개


📌 FinRobot의 주요 아키텍처 (4가지 레이어 구조)

FinRobot은 4개의 주요 계층(layers) 으로 구성

1. Financial AI Agents Layer (금융 AI 에이전트 계층)

  • AI가 시장 데이터를 실시간으로 수집하고 분석하여 투자 전략을 자동 생성
  • Financial Chain-of-Thought (CoT) Prompting을 활용하여 금융 분석을 체계적으로 수행
  • LLM(대형 언어 모델)과 결합하여 복잡한 금융 문제를 해결

 

1.2. Financial AI Agents Layer의 구조

  • 3가지 핵심 모듈로 구성
  1. Perception (데이터 수집 및 이해) : 금융 데이터를 인식하고 수집 (시장 뉴스, 경제 지표, 기업 재무 정보 등) 
  2. Brain (분석 및 의사 결정) : LLM을 활용하여 데이터를 분석하고 Financial Chain-of-Thought (CoT) 추론 수행 
  3. Action (실행 및 대응) : 분석 결과를 바탕으로 투자 전략 실행, 보고서 작성, 트레이딩 전략 자동화

 

1.2.1 Perception (데이터 수집 및 이해) : 다양한 금융 데이터를 실시간으로 수집하고 전처리하는 역할을 수행 

  • 데이터 소스
    • 정형 데이터 : 주식 가격, 거래량, 기업 재무제표
    • 비정형 데이터 : 뉴스, 리포트, 소셜미디어 감성분석
    • API : Yahoo Finance, Alpha Vantage, Bloomberg 
  • 📌 예시: "애플(AAPL)의 최근 실적을 분석하라."
    ✅ AI의 첫 번째 단계 → "애플의 최근 분기 매출, 이익률, EPS 등을 불러옴"

1.2.2 Brain (분석 및 의사 결정) : LLM 활용하여 데이터 분석,  Financial Chain-of-Thought 추론 수행

  • AI가 Financial Chain-of-Thought (CoT) Prompting을 활용하여 중간 추론 과정을 생성
  • 기업 실적, 시장 트렌드, 투자 심리 등을 고려하여 의사 결정
  • 📌 예시: "애플의 매출 증가 원인은?"
    ✅ AI의 분석 단계
    1. "아이폰 15 판매 호조"
    2. "서비스 부문(앱스토어, 애플뮤직) 수익 증가"
    3. "환율 효과로 해외 매출 증가"

1.2.3 Action (실행 및 대응 - 자동 보고서 생성 및 전략 실행) : 분석 결과 바탕으로 투자 전략 실행, 보고서 작성, 트레이딩 전략 자동화

  • 📌 예시: "애플(AAPL)의 향후 주가 전망?"
    ✅ AI의 최종 결론 →"애플은 강력한 실적을 발표했으며, 서비스 부문의 지속적인 성장과 AI 기술 투자로 인해 향후 3개월 내 5~10% 주가 상승이 예상됨."

주요 Financial AI Agents

 

여러개 에이전트는 협업하여 금융 분석을 수행함(Multi-Agent)

  1. Director (디렉터) : 전체적인 금융 분석 전략을 지휘
  2. Assistant (보조 분석가) : 데이터 수집 및 기본 분석 
  3. LLM Analyst (LLM 분석가) : LLM을 활용한 텍스트 분석 및 시장 예측 
  4. Financial Analyst (재무 분석가) : 포트폴리오 관리, 리스크 평가 수행
  • 📌 예시: "애플의 최근 실적을 기반으로 향후 주가를 예측하라."
    ✅ 분석 과정
    1. Assistant → 애플의 실적 데이터 수집
    2. LLM Analyst → 뉴스와 기업 보고서 분석
    3. Financial Analyst → 재무 모델을 기반으로 주가 전망 도출
    4. Director → 최종 투자 전략 결정

2. Financial LLM Algorithms Layer (금융 LLM 알고리즘 계층)

  • 금융 데이터 분석을 수행하기 위해 특화된 대형 언어 모델(LLM)을 적용하는 계층
  • 다양한 LLM을 사용하여 지역별(예: 미국, 중국) 금융 데이터 분석 수행
    • FinGPT: 금융 특화 LLM
    • Llama, ChatGLM, Falcon: 특정 금융 분석 목적에 맞게 조정된 모델
    • Financial Reinforcement Learning (FinRL): AI 기반 포트폴리오 최적화
    • Financial Machine Learning (FinML): 머신러닝 기반 금융 예측

 

Financial LLM Algorithms Layer의 차별점

  1. FinGPT: 금융 특화 LLM 활용 → 일반 GPT 모델보다 금융 데이터 해석 성능 우수
  2. Multi-Source LLM 조합 → 글로벌 금융 시장 분석 최적화
  3. Fine-Tuning & Instruction Tuning 적용 → 금융 문서 해석 성능 향상
  4. FinRL 기반 AI 트레이딩 → 강화 학습으로 자동 투자 전략 생성
  5. FinML을 활용한 금융 예측 → 머신러닝 기반으로 리스크 평가 및 시장 예측

3. LLMOps & DataOps Layer (LLM 운영 및 데이터 운영 계층)

  • LLM 모델의 효율적인 운영 및 금융 데이터의 실시간 처리

주요 역할

  • Smart Scheduler 시스템을 사용하여 작업을 최적의 LLM 및 AI 에이전트에 자동 할당
  • 모델 평가 및 성능 최적화 : LLM의 정확도를 지속적으로 개선 
  • 실시간 데이터 수집 및 처리 : 최신 금융 데이터(뉴스, 재무제표, 시장 데이터) 자동 업데이트 
  • Retrieval-Augmented Generation (RAG) 활용 : 실시간 검색 + LLM 조합으로 최신 금융 정보 반영 
  • LLM + 데이터 연계 자동화 : LLM이 금융 데이터를 자동으로 가져오고, 필요한 분석 수행 

Smart Scheduler의 작동 방식

  1. 사용자가 금융 분석 요청 (예: "테슬라의 향후 주가를 예측하라.")
  2. Smart Scheduler가 LLM 후보 평가 (GPT-4, FinGPT, Llama, Falcon 중 최적 모델 선택)
  3. 가장 높은 점수를 받은 모델을 실행
  4. 분석 결과를 사용자에게 반환
  • 📌 예시
    💡 "미국과 중국 시장에서 테슬라의 성장 가능성을 평가하라."
    ✅ Smart Scheduler의 작동 과정
    1. 미국 시장 분석 → GPT-4 사용
    2. 중국 시장 분석 → ChatGLM 사용
    3. 최종적으로 두 개의 분석을 종합하여 보고서 생성

4. Multi-source LLM Foundation Models Layer (다중 소스 LLM 기반 모델 계층)

  • 다양한 LLM 모델 통합 : 여러 개의 LLM을 동시에 활용하여 금융 분석 최적화 
  • Plug-and-Play 기능 : 필요에 따라 LLM을 추가, 제거, 교체 가능 
  • 다국어 모델 지원 : 글로벌 금융 시장에 적용 가능 

Financial Chain-of-Thought (CoT) Prompting (가장 궁금했던 부분)

금융 분석에서는 재무제표, 경제 지표, 시장 심리 등 다양한 요인을 고려해야 하므로 CoT가 매우 효과적이라고 함

 

금융 분석에서 CoT 필요성 

  1. 금융 데이터는 복잡한 관계를 가짐 → 단순한 응답보다 논리적인 분석이 필요
  2. 설명 가능성(Explainability) 향상 → AI가 분석한 과정이 명확해야 투자자가 신뢰할 수 있음
  3. 주식 분석, 투자 결정, 리스크 평가 등에 최적화됨

3단계 프로세스 : Perception → Brain → Action

  1. Perception (데이터 수집 및 이해) → 시장 데이터, 기업 재무제표, 뉴스 등 수집
  2. Brain (분석 및 의사 결정) → Financial CoT를 통해 논리적으로 분석 수행
  3. Action (실행 및 대응) → 투자 전략 생성, 보고서 작성, 트레이딩 전략 실행

 

📌 예시: Financial CoT 기반 테슬라(TSLA) 분석 과정
✅ 질문: "테슬라(TSLA)의 주가 상승 가능성이 있는가?"

1. Perception (데이터 수집)

  • 최근 실적 보고서 분석
  • AI 및 자율주행 기술 발전 뉴스 분석
  • 주가 변동 데이터 수집

2. Brain (논리적 분석)

  • 재무 분석: "매출 증가율 15%, 영업이익 증가"
  • 경쟁력 분석: "테슬라는 AI 칩과 자율주행 기술 투자 확대"
  • 시장 심리 분석: "투자자들은 AI 관련 기업에 긍정적인 반응"

3.  Action (실행 및 대응)

  • 결론: "테슬라는 강력한 실적과 기술력을 보유하고 있어, 향후 6개월 내 10~15% 주가 상승 가능성이 있음."

코드 

 

리포트 작성을 위한 에이전트 실행 예시

 

SingleAssistantShadow 인스턴스 생성, agent_config는 "투자 전문가" 

assistant = SingleAssistantShadow(
    "Expert_Investor",
    llm_config,
    max_consecutive_auto_reply=None,
    human_input_mode="TERMINATE",
)

company = "Microsoft"
fyear = "2023"

message = dedent(
    f"""
    With the tools you've been provided, write an annual report based on {company}'s {fyear} 10-k report, format it into a pdf.
    Pay attention to the followings:
    - Explicitly explain your working plan before you kick off.
    - Use tools one by one for clarity, especially when asking for instructions. 
    - All your file operations should be done in "{work_dir}". 
    - Display any image in the chat once generated.
    - All the paragraphs should combine between 400 and 450 words, don't generate the pdf until this is explicitly fulfilled.
"""
)

assistant.chat(message, use_cache=True, max_turns=50,
               summary_method="last_msg")

메인 어시스턴트와 쉐도우 어시스턴트를 초기화


특정 트리거가 발생하면, 메인 어시스턴트와 Shadow 어시스턴트가 대화 시작 


FinRobot은 AutoGen을 기반으로 하고 있음

register_nested_chats 메서드는 특정 에이전트(assistant_1 등)에 대해 하나 이상의 중첩된(Nested) 채팅 흐름을 등록하는 기능

이를 통해 복잡한 작업을 계층적으로 해결


밑에는 예시임

assistant_1 이 manger/writer /reviewer/writer과 차례대로 대화

def writing_message(recipient, messages, sender, config):
    return f"Polish the content to make an engaging and nicely formatted blog post. \n\n {recipient.chat_messages_for_summary(sender)[-1]['content']}"


nested_chat_queue = [
    {"recipient": manager, "summary_method": "reflection_with_llm"},
    {"recipient": writer, "message": writing_message, "summary_method": "last_msg", "max_turns": 1},
    {"recipient": reviewer, "message": "Review the content provided.", "summary_method": "last_msg", "max_turns": 1},
    {"recipient": writer, "message": writing_message, "summary_method": "last_msg", "max_turns": 1},
]
assistant_1.register_nested_chats(
    nested_chat_queue,
    trigger=user,
)
# user.initiate_chat(assistant, message=tasks[0], max_turns=1)

chat 메서드를 사용해 사용자와 에이전트(어시스턴트 = 투자 전문가(Expert Investor)가 대화를 시작함 

 

assistant.chat(message, use_cache=True, max_turns=50,
               summary_method="last_msg")

 


UserProxyAgent 클래스의 initate_chat 메서드를 찾아봄

출처 : Autogetn docs

 

문서에 적혀있는 설명을 보면

 

1. 사용자 요청 수신

  • UserProxyAgent는 사용자로부터 작업 요청받음

2. 코드 작성 및 실행

  • AssistantAgent는 작업을 해결하기 위해 Python 코드를 작성하고 이를 응답으로 반환.
    • 작성된 코드는 주어진 문제(예: 주식 데이터 조회)를 해결
    • AssistantAgent는 코드 실행 없이 코드를 반환하며, 이후 실행은 UserProxyAgent가 담당

3. 코드 실행 및 결과 응답

  • UserProxyAgent는 작성된 코드를 실행하고 결과를 확인
    • 실행 결과를 사용자에게 자동 응답으로 제공하거나, 추가적인 인간 입력을 요청할 수도 있음
    • 만약 사람이 입력하지 않아도 자동 응답 생성이 가능하면, 이를 사용하여 작업 결과를 전달합니다.
    • 예: "Apple이 올해 가장 높은 상승률을 기록했으며, YTD 상승률은 42.59%입니다."

4. 결과 검토 및 대화 반복

  • AssistantAgent는 결과를 바탕으로 추가 작업을 수행
    • 코드를 수정하거나 결과를 보완하는 메시지를 생성
    • 필요 시 단계 3과 4를 반복하며, 최종적으로 대화를 종료(TERMINATE

FinRobot 인스턴스 초기화 과정을 살펴보자

assistant로 사용하고 있는 "Expert_Investor" 는 agent_library에 정의되어있음 


그리고 사용가능한 toolkits들은 register_function 함수를 사용해 에이전트들이 사용할수 있게 등록함


register_function은 autogen 함수


에이전트에 도구를 등록해두면, 앞에서 봤던 initiate_chat을 통한 대화에서 사용한다고 함


Multi Agent Workflows

위에는 하나의 Agent만 사용할 때였고, 이제는 다중 Agent를 사용할 때 필요한 클래스

 

SingleAssistant와는 다르게,  group_config를 추가로 인자로 받음 


group_config는 리더와 부하 에이전트의 정보가 적혀있음


리더를 초기화하고 user_proxy가 각각의 부하 Agent 에게 order_message 보냄

 


order_message 함수를 살펴보자

부하가 진행할 Task를 추출하고 order_template로 지시사항을 명확히함


GroupChatManager는 여러 에이전트로 구성된 그룹 채팅을 관리할 수 있는 채팅 관리자 에이전트라고 함



이거는 도큐먼트에 나온 예시인데 그냥 그렇게 쓰는구나 하고 이해함