ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [5월 3주차-5/21]📈 GPT + Streamlit + yfinance로 주식 정보 챗봇 만들기
    Why Not SW CAMP 5기/수업 기록 2025. 5. 21. 11:49

    ✨ 목표

    자연어로 “애플 주가 알려줘”라고 입력하면,
    GPT가 스스로 종목을 파악하고, yfinance 데이터를 가져와 보여주는
    AI 주식 상담 챗봇을 만드는 프로젝트입니다.


    📁 프로젝트 구조

    📦 stock_chatbot_project/
    ├── gpt_functions.py          # yfinance 기반 기능 정의 (시간, 주가, 추천 등)
    ├── stock_info_streaming.py   # Streamlit 앱 실행 및 GPT와 통합 처리
    ├── yfinance.py               # yfinance 기본 테스트 코드 (연습용)
    └── .env                      # OpenAI API 키 저장
    

    1. yfinance.py — 주식 데이터 확인용 연습 코드

    import yfinance as yf
    
    msft = yf.Ticker("MSFT")
    print(msft.info)                # 기업 정보
    print(msft.history(period="5d"))  # 최근 5일간 주가
    print(msft.recommendations)    # 애널리스트 추천
    

    yfinance는 야후 파이낸스 데이터를 가져오는 강력한 파이썬 라이브러리예요.


    2. gpt_functions.py — GPT가 사용할 함수들 정의

    이 파일에서는 GPT가 사용할 도구(Functions)를 정의하고,
    각 도구에서 실행할 함수도 직접 구현합니다.

    ✅ 주요 함수

    • get_current_time(timezone) — 현재 시간 반환
    • get_yf_stock_info(ticker) — 종목의 기업 정보 반환
    • get_yf_stock_history(ticker, period) — 주가 이력 반환
    • get_yf_stock_recommendations(ticker) — 추천 정보 반환
    def get_yf_stock_history(ticker: str, period: str):
        stock = yf.Ticker(ticker)
        history = stock.history(period=period)
        history_md = history.to_markdown()
        return history_md
    

    ✅ GPT Tool 형식 등록

    tools = [
        {
            "type": "function",
            "function": {
                "name": "get_yf_stock_history",
                "description": "...",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "ticker": {"type": "string", ...},
                        "period": {"type": "string", ...}
                    },
                    "required": ["ticker", "period"]
                }
            }
        },
        ...
    ]
    

    이런 식으로 GPT가 사용할 수 있는 도구 목록을 JSON 형식으로 등록해줍니다.
    이제 GPT가 대화 중 필요한 정보를 스스로 함수 호출로 요청할 수 있게 됩니다!


    3. stock_info_streaming.py — 챗봇 실행 (Streamlit + GPT 연동)

    ✅ 기본 UI 구성

    st.title("💬 Chatbot")
    

    ✅ 메시지 저장소

    if "messages" not in st.session_state:
        st.session_state["messages"] = [
            {"role": "system", "content": "너는 사용자를 도와주는 상담사야."}
        ]
    

    ✅ 사용자 입력 처리

    if user_input := st.chat_input():
        st.session_state.messages.append({"role": "user", "content": user_input})
    

    ✅ GPT 응답 스트리밍 함수

    def get_ai_response(messages, tools=None, stream=True):
        response = client.chat.completions.create(
            model="gpt-4o",
            stream=stream,
            messages=messages,
            tools=tools,
        )
        ...
    

    GPT가 응답을 스트리밍 방식으로 한 줄씩 보내줄 수 있게 구성되어 있어요.
    중간중간 멈추지 않고 부드럽게 답변이 출력됩니다.


    4. 🎯 핵심 로직 — 도구 호출 & 함수 실행

    🔍 GPT가 도구를 요청할 경우

    GPT는 다음과 같이 툴을 호출합니다:

    {
      "function": {
        "name": "get_yf_stock_history",
        "arguments": "{\"ticker\": \"AAPL\", \"period\": \"5d\"}"
      }
    }
    

    이걸 받아서 실제 Python 함수로 실행해주는 파트가 아래 코드예요.

    if tool_calls:
        for tool_call in tool_calls:
            tool_name = tool_call["function"]["name"]
            arguments = json.loads(tool_call["function"]["arguments"])
    
            if tool_name == "get_yf_stock_history":
                func_result = get_yf_stock_history(
                    ticker=arguments["ticker"],
                    period=arguments["period"]
                )
            ...
    

    🧠 실행 결과를 GPT에게 다시 넘겨줌

    st.session_state.messages.append({
        "role": "function",
        "tool_call_id": tool_call_id,
        "name": tool_name,
        "content": func_result,
    })
    
    st.session_state.messages.append({
        "role": "system", 
        "content": "이제 주어진 결과를 바탕으로 답변할 차례다."
    })
    
    • GPT가 주식 정보를 가져오도록 요청
    • Streamlit에서 해당 함수 실행
    • 결과를 다시 GPT에게 넘김
    • GPT가 그걸 바탕으로 최종 사용자용 응답 생성!

     

    📌 마무리

    기술                                                         역할

    yfinance 야후 파이낸스 데이터 수집
    GPT-4o 자연어 처리 + 도구 호출
    Streamlit 대화형 웹 UI
Designed by Tistory.