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 강점 |
'앱개발' 카테고리의 다른 글
앱개발 (9) Llamaparse기반 텍스트 추출앱 개발 (0) | 2025.04.03 |
---|---|
PDF parser - LLamaparse 대안 오픈소스는? (0) | 2025.04.02 |
Vision LLM을 활용한 PDF 테이블 추출 전략 (0) | 2025.04.01 |
PDF 파서- google gemini deep research (0) | 2025.03.28 |
PDF 파서 - grok3를 이용한 deep research (0) | 2025.03.28 |