Skip to main content
이 문서는 GenAI 개념 섹션의 일부입니다.
프레임워크 종합 비교 테이블, 의사결정 트리, Agent UI 개요, 2025년 생태계 트렌드, 고객 FAQ, 연습문제를 다룹니다.

프레임워크 종합 비교

전체 비교표

항목LangChainLangGraphCrewAIOpenAI SDKAutoGenDatabricks
설계 철학체인 (순차 연결)그래프 (유향 그래프)역할/팀핸드오프대화 기반엔터프라이즈 운영
학습 난이도중간높음낮음낮음중간중간
유연성높음매우 높음중간중간높음중간
프로덕션 적합성부분적좋음제한적좋음제한적최적
Multi-Agent기본우수우수좋음우수좋음
상태 관리Memory (제한적)Checkpoint (강력)내부 관리기본대화 히스토리MLflow + UC
모델 종속성없음 (700+)없음없음OpenAI 중심없음없음 (FMAPI)
거버넌스없음없음없음기본없음네이티브 (UC)
MLflow 통합플러그인플러그인플러그인커스텀커스텀네이티브
배포자체 구축 필요자체 구축 필요자체 구축 필요OpenAI 호스팅자체 구축 필요원클릭 서버리스
TracingLangSmith (유료)LangSmith (유료)제한적OpenAI 대시보드제한적MLflow Tracing (무료)
커뮤니티매우 큼중간중간Databricks 커뮤니티
주요 사용처PoC, 프로토타입복잡한 워크플로빠른 데모OpenAI 생태계연구/실험엔터프라이즈 배포

성격별 비교

참고 한 줄 요약:
  • LangChain= “레고 블록 세트” (다양하지만 복잡)
  • LangGraph= “프로그래밍 가능한 회로판” (강력하지만 어려움)
  • CrewAI= “팀 빌딩 게임” (직관적이지만 제한적)
  • OpenAI SDK= “콜센터 시스템” (깔끔하지만 OpenAI 한정)
  • AutoGen= “자유 토론방” (창의적이지만 예측 불가)
  • Databricks= “기업용 관제탑” (안전하지만 플랫폼 종속)

프레임워크 선택 가이드 — 의사결정 트리

시나리오별 추천

시나리오추천 프레임워크이유
빠른 프로토타입/데모가 목표CrewAI10분 내에 멀티에이전트 데모 가능
복잡한 워크플로 + 조건 분기LangGraph유향 그래프로 어떤 흐름이든 표현 가능
OpenAI만 사용 + 핸드오프 패턴OpenAI Agents SDK가장 깔끔한 Handoff 구현
Databricks 환경에서 프로덕션 배포Databricks Agent Framework(+ LangGraph)거버넌스, 모니터링, 원클릭 배포
연구/실험 + 코드 실행AutoGenAgent 간 자유 대화 + 코드 실행 내장
RAG 파이프라인만 필요LangChain(LCEL)간단한 파이프라인에 적합
기존 LangChain 코드 마이그레이션LangGraphLangChain 컴포넌트 재사용 가능

의사결정 흐름

[시작] 어떤 Agent를 만들려는가?

├── "단순 RAG / QA 봇"
│   └── LangChain LCEL 또는 Databricks Agent Bricks (Knowledge Assistant)

├── "복잡한 멀티스텝 워크플로"
│   ├── Databricks 환경?
│   │   ├── YES → LangGraph + Databricks Agent Framework
│   │   └── NO  → LangGraph 단독
│   └── 조건 분기/루프 필요?
│       ├── YES → LangGraph
│       └── NO  → LangChain LCEL

├── "멀티에이전트 협업"
│   ├── 역할 기반 (리서처, 작성자 등)?
│   │   ├── 프로덕션? → LangGraph Multi-Agent
│   │   └── PoC/데모? → CrewAI
│   ├── 대화 기반 (자유 토론)?
│   │   └── AutoGen
│   └── 라우팅/핸드오프?
│       ├── OpenAI만 사용? → OpenAI Agents SDK
│       └── 모델 무관? → LangGraph Swarm 패턴

└── "엔터프라이즈 프로덕션"
    └── Databricks Agent Framework (빌드 프레임워크는 선택)
        ├── 복잡한 로직 → + LangGraph
        ├── 간단한 로직 → + 순수 Python
        └── 노코드 → Agent Bricks
주의 실전 팁: 프레임워크 선택에 너무 많은 시간을 쓰지 마세요. 중요한 것은 “어떤 프레임워크를 쓰느냐”가 아니라 “Agent가 해결하는 비즈니스 문제가 무엇인가”입니다. 대부분의 엔터프라이즈 시나리오에서는 LangGraph + Databricks Agent Framework 조합이 정답입니다.

Agent UI/배포 기술 스택

Agent를 만들었다면 사용자가 상호작용할 UI가 필요합니다. 용도와 환경에 따라 적합한 프론트엔드 기술이 다릅니다.

주요 프론트엔드 기술

기술특징적합한 용도
StreamlitPython만으로 웹앱 구축. 가장 빠른 프로토타이핑PoC, 내부 도구, 데이터 대시보드
GradioML 모델 데모 특화. Hugging Face 통합모델 데모, 인터랙티브 ML 실험
ChainlitLangChain/LangGraph 전용 채팅 UI. 대화형 Agent에 최적화Agent 채팅 인터페이스
Databricks AppsDatabricks 네이티브 웹앱 호스팅. OAuth 통합프로덕션 엔터프라이즈 앱

비교표

항목StreamlitGradioChainlitDatabricks Apps
언어PythonPythonPythonPython (Streamlit/Dash/FastAPI)
학습 난이도매우 낮음낮음낮음중간
UI 자유도중간낮음낮음 (채팅 특화)높음 (프레임워크 선택 가능)
채팅 UIst.chat_messagegr.ChatInterface네이티브 지원Streamlit 기반
스트리밍st.write_stream지원네이티브 지원Streamlit 기반
인증없음 (자체 구현)없음없음OAuth 통합 (Databricks)
프로덕션 적합성제한적제한적제한적우수
배포Streamlit Cloud / 자체 서버HF Spaces / 자체 서버자체 서버Databricks 서버리스
Databricks 통합SDK 연동 필요SDK 연동 필요SDK 연동 필요네이티브 (서비스 프린시펄)
참고 추천 경로: PoC 단계에서는 Streamlit으로 빠르게 만들고, 프로덕션에서는 Databricks Apps(Streamlit 호스팅)로 배포하면 코드 변경 최소화로 인증/보안이 자동 적용됩니다.

Agent UI 코드 예시 (Streamlit + Databricks Model Serving)

import streamlit as st
from databricks.sdk import WorkspaceClient

st.title("고객 서비스 Agent")

# Databricks 클라이언트 초기화
w = WorkspaceClient()

# 대화 히스토리 관리
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"])

# 사용자 입력
if prompt := st.chat_input("질문을 입력하세요"):
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)

    # Agent 호출 (Model Serving Endpoint)
    with st.chat_message("assistant"):
        response = w.serving_endpoints.query(
            name="customer-service-agent",
            messages=st.session_state.messages,
        )
        answer = response.choices[0].message.content
        st.markdown(answer)
        st.session_state.messages.append(
            {"role": "assistant", "content": answer}
        )