앱개발

Streamlit vs Shiny for Python: LLM 에이전트 개발에 더 유연한 선택은?

프로페서 H 2025. 4. 2. 06:42

 

 

Shiny for Python은 최근 많이 주목받고 있고, 특히 복잡한 인터랙티브 UI 구성에 강점이 있어서 LLM 기반 에이전트 인터페이스에도 적합할 수 있어요.
하지만 비교는 단순하지 않아요. 그래서 아래와 같이 LLM 기반 앱 개발 관점에서 Streamlit과 Shiny for Python을 정면 비교해드릴게요.


🤖 비교 기준: "LLM 기반 에이전트를 구축할 때 어떤 프레임워크가 더 좋은가?"


 

항목 Streamlit Shiny for Python
 LLM API 연동 매우 쉬움 (requests, openai, langchain, llama-index 등 생태계 풍부) 가능하지만 직접 처리 위주
 상태 관리 st.session_state로 직관적이고 간단 reactive.Var, reactive.Value 등으로 더 정밀하고 선언적
 UI 반응성 버튼, 채팅, 파일 업로드 등 빠르게 구현 가능 매우 유연한 reactive 시스템 (@reactive.Effect, @reactive.Calc)
 채팅 UI 구성 st.chat_message 사용 → LLM 대화 UI 빠르게 구현 가능 직접 구성해야 하지만 layout 자유도는 더 높음
 멀티 페이지 지원 지원 (.streamlit/pages/) 앱 전체를 하나의 App() 함수 안에 통합해야 함 (라우팅은 별도 구성 필요)
 배포/공유 용이성 streamlit.io에 클릭 한 번 배포 아직 공식 배포 플랫폼 없음 (Shiny server 필요 또는 Docker)
 커뮤니티/생태계 매우 활발함, ChatGPT 앱, LLM 데모 예제 풍부 아직은 작고 초기 단계, 특히 LLM 관련 자료는 적음
 프론트엔드 제어력 중간 (컴포넌트는 제한됨) 높음 (UI를 R Shiny 스타일로 직접 제어 가능)
 사용자 정의 Layout 쉬움 (col1, col2, st.sidebar 등) CSS/JS 기반 복잡한 layout도 가능 (조금 더 복잡)

📌 요약해서 말하면


 

목적 추천   이유
빠르게 LLM 챗봇 만들기 / 데모 배포  Streamlit st.chat_message, session_state, st.sidebar 조합이 매우 빠름
복잡한 반응형 인터페이스 만들기 (대시보드, 멀티에이전트 인터랙션) 🌟 Shiny for Python reactive 시스템이 선언적이어서 상태 변화 중심 LLM 앱 만들기에 유리
LLM + 사용자 정의 UI 필요 (예: 그래프, 구조화 입력) Shiny 우세 다양한 레이아웃 제어 가능
간단한 LLM 앱, 팀과 공유, 빠른 프로토타입 Streamlit 우세 배포까지 훨씬 쉽고 생태계도 크기 때문

💬 예시: 챗봇 인터페이스

Streamlit

import streamlit as st
import openai

st.title("💬 GPT 대화")
if "messages" not in st.session_state:
    st.session_state.messages = []

for msg in st.session_state.messages:
    with st.chat_message(msg["role"]):
        st.markdown(msg["content"])

prompt = st.chat_input("무엇을 도와드릴까요?")
if prompt:
    st.chat_message("user").markdown(prompt)
    st.session_state.messages.append({"role": "user", "content": prompt})

    response = openai.ChatCompletion.create(...)
    message = response['choices'][0]['message']['content']
    st.chat_message("assistant").markdown(message)
    st.session_state.messages.append({"role": "assistant", "content": message})
 
 

✅ 몇 줄이면 기본 챗봇 UI 완성!


Shiny for Python (컨셉)

from shiny import App, render, ui, reactive

history = reactive.Value([])

app_ui = ui.page_fluid(
    ui.input_text("prompt", "입력", ""),
    ui.output_text_verbatim("chat_log"),
)

def server(input, output, session):
    @reactive.Effect
    def _():
        if input.prompt():
            user_input = input.prompt()
            response = openai_call(user_input)
            history.set(history.get() + [(user_input, response)])
    
    @output
    @render.text
    def chat_log():
        return "\n\n".join(f"User: {q}\nGPT: {a}" for q, a in history.get())

app = App(app_ui, server)

✅ 더 정교한 반응성 → 고급 상태 제어 가능
⚠️ UI 직접 구성 필요 → 진입 장벽이 조금 있음


🔚 결론 요약

상황추천
빠른 개발 & 공유 목적  Streamlit
정교한 반응형 LLM 앱 (Agent 흐름 관리 포함)  Shiny for Python (단, 학습 필요)
LLM + GUI 조작 + 분석 보고서 🌟 Shiny 강점
LLM + 챗봇/문서 요약 + 데모 사이트 🌟 Streamlit 강점