Chainlit: CoT 시각화를 지원하는 대화형 AI 애플리케이션 구축 프레임워크

Chainlit 소개

Chainlit은 개발자가 복잡한 대화형 AI(Conversational AI) 애플리케이션을 놀라운 속도로 구축할 수 있도록 설계된 오픈소스 Python 프레임워크입니다. 오늘날의 LLM(Large Language Model) 애플리케이션은 단순한 텍스트 응답을 넘어, 문서 검색(RAG), 외부 API 호출, 코드 실행 등 복잡한 추론 과정을 거칩니다.

Chainlit은 이러한 흐름에 맞춰 "중간 추론 과정(Chain of Thought)"의 시각화를 핵심 철학으로 삼고 있습니다. React나 Vue.js 같은 프론트엔드 지식이 전혀 없어도, Python 코드만으로 ChatGPT와 유사한 수준의 세련된 UI를 만들 수 있습니다. 또한, 단순한 프로토타이핑을 넘어 사용자 인증, 데이터 지속성(Persistence), 멀티턴 대화 처리 등 프로덕션 레벨의 기능을 기본적으로 제공합니다.

LangChain, LlamaIndex, Haystack, OpenAI Assistant API 등 주요 AI 라이브러리들과 완벽하게 통합되며, 독립적인 웹 앱으로 배포하거나 기존 서비스에 위젯 형태(Copilot)로 임베딩할 수도 있습니다.

Chainlit vs. Streamlit 및 Gradio와 비교

AI 엔지니어들이 자주 사용하는 기존 도구들과 비교했을 때, Chainlit은 대화형 경험(Chat Experience)에 특화되어 있다는 점이 가장 큰 차이입니다.

Streamlit은 데이터 분석 대시보드 및 일반적인 ML 앱에 강력하지만, 사용자와의 상호작용 때마다 스크립트 전체를 다시 실행(Rerun)하는 구조를 가집니다. 이는 대화의 상태(Context)를 관리해야 하는 챗봇 구현 시 비효율적이거나 복잡해질 수 있습니다. 이에 비해 Chainlit이벤트 기반(Event-driven) 아키텍처를 사용하여 채팅 세션을 효율적으로 유지합니다. 대화 맥락이 끊기지 않으며, LLM이 응답을 생성하는 동안 실시간 스트리밍(Streaming) 처리에 훨씬 최적화되어 있습니다.

Gradio는 모델의 입력(Input)과 출력(Output)을 빠르게 시연하는 데모 페이지를 만드는 데 최적화되어 있습니다. 반면, Chainlit복잡한 멀티턴 대화추론 과정의 시각화에 중점을 둡니다. 단순한 질의응답을 넘어, AI가 문서를 참조하거나 도구를 사용하는 과정을 UI 상에서 단계별(Step-by-step)로 보여주는 기능을 기본으로 제공합니다.

Chainlit의 주요 기능

생각의 사슬 (CoT, Chain of Thought) 시각화

Chainlit의 가장 독보적인 기능은 AI의 내부 동작을 사용자에게 투명하게 보여줄 수 있다는 점입니다. 이를 통해 사용자는 AI가 단순히 답변을 내놓는 것이 아니라, "어떤 문서를 참고했는지", "어떤 도구(Tool)를 사용했는지"를 확장 가능한 UI(Expandable UI)를 통해 확인할 수 있습니다. 이는 AI 애플리케이션의 신뢰성(Trust)을 높이고, 개발자에게는 디버깅의 편의를 제공합니다.

다양한 요소(Elements) 및 멀티모달 지원

텍스트뿐만 아니라 다양한 형태의 미디어와 데이터를 채팅 인터페이스 내에서 직접 렌더링할 수 있습니다.

  • 이미지 및 비디오: 생성된 이미지나 업로드된 영상을 즉시 표시합니다.

  • PDF 뷰어: 참조한 문서를 다운로드하지 않고 채팅창 내에서 바로 열람할 수 있습니다.

  • 데이터 시각화: Plotly, Matplotlib 등의 그래프를 대화형으로 렌더링합니다.

  • 오디오: 음성 입출력(STT/TTS)을 위한 오디오 플레이어를 지원합니다.

직관적인 Python API 및 비동기 지원

Chainlit은 Python의 데코레이터 패턴을 사용하여 직관적인 개발 경험을 제공합니다. 또한 FastAPI를 기반으로 구축되어 있어 기본적으로 비동기(Async) 처리를 지원합니다. 이는 다수의 사용자가 동시에 접속해도 서버가 멈추지 않고 효율적으로 요청을 처리할 수 있음을 의미합니다.

다음은 기본적인 챗봇의 예시 코드입니다:

import chainlit as cl

@cl.on_chat_start
async def start():
    # 채팅 세션이 시작될 때 실행됩니다.
    await cl.Message(content="안녕하세요! 무엇을 도와드릴까요?").send()

@cl.on_message
async def main(message: cl.Message):
    # 사용자의 메시지가 도착했을 때 실행됩니다.
    
    # 1. 중간 단계(Step) 시각화 예시
    async with cl.Step(name="정보 검색 중...") as step:
        step.input = message.content
        await cl.sleep(2)  # 작업을 시뮬레이션
        step.output = "관련 문서를 찾았습니다."
    
    # 2. 최종 답변 전송
    response = f"입력하신 내용 '{message.content}'에 대한 답변입니다."
    await cl.Message(content=response).send()

강력한 데이터 계층 및 인증 (Data Layer & Auth)

Chainlit에는 프로덕션 배포를 위해 필수적인 기능들이 내장되어 있습니다.

  • 사용자 인증: 간단한 비밀번호 인증부터 OAuth(Google, GitHub 등), 사용자 정의 인증까지 다양한 방식을 지원합니다.

  • 데이터 지속성 (Data Persistence): 대화 기록(Chat History)과 사용자 피드백(좋아요/싫어요)을 데이터베이스에 저장할 수 있습니다. Chainlit은 이를 위해 'Literal AI'와 같은 플랫폼과 연동하거나, 직접 커스텀 데이터 레이어를 구현할 수 있는 유연성을 제공합니다.

배포 유연성 및 Copilot 모드

Chainlit은 "한 번 작성하여 어디서든 실행(Write once, run everywhere)"을 목표로 WebApp 외 Copilot, Bot, API Only 등의 다양한 배포 옵션을 제공합니다. 각각은 다음과 같습니다:

가장 기본적인 배포 형태는 표준 웹 애플리케이션 (Web App) 으로, 독립적인 ChatGPT 스타일의 웹 인터페이스를 제공합니다. Chainlit으로 작성한 애플리케이션을 WebApp 형태로 배포할 때에는 Dockerfile 템플릿을 제공하므로, Google Cloud Run, AWS ECS, Azure Container Apps 등 컨테이너 기반 환경에 쉽게 배포할 수 있습니다. 또한, 서버 환경 배포 시 브라우저가 자동으로 열리는 것을 방지하기 위해 Headless 모드(chainlit run -h) 옵션을 사용합니다.


또는, 기존에 운영 중인 웹사이트나 애플리케이션이 있다면, Chainlit 봇을 우측 하단 위젯 형태의 임베디드 코파일럿 (Software Copilot) 형태로 심을 수 있습니다. 이는 웹사이트의 <body> 태그에 간단한 JavaScript 스크립트를 추가하는 것만으로 간편하게 연동이 가능합니다. 또한, 호스트 웹사이트와 봇 간에 데이터나 함수 호출(Function Calling)을 주고받을 수 있어, 봇이 웹사이트의 기능을 제어하거나 컨텍스트를 인식하게 하는 등의 상호 작용이 가능합니다.


만약 사용자가 별도의 UI 없이 봇(Bot) 로직만 사용하는 경우에는 Slack, Discord, Teams 등과 같은 다양한 협업 도구에 봇(Bot) 형태로 배포할 수 있습니다. Chainlit 앱을 Slack 앱이나 Discord 봇으로 연결하여, 사내 메신저 내에서 직원들이 AI 비서와 대화하게 할 수 있습니다. 또는, 하나의 코드베이스로 웹 UI와 Slack 봇을 동시에 운영하는 것도 가능합니다.


마지막으로 Chainlit의 강력한 백엔드 로직과 대화 관리 기능만 사용하고, 프론트엔드는 React 등으로 완전히 커스텀하여 개발하고 싶은 경우에는 API 전용 (API Only) 모드로 배포하여 API 서버로만 활용할 수도 있습니다.

라이선스

Chainlit 프로젝트는 Apache-2.0 license로 공개 및 배포 되고 있습니다. 상업적 이용 및 수정 배포가 자유로운 편입니다.

:scroll: Chainlit 공식 문서

:github: Chainlit 프로젝트 GitHub 저장소

:github: Chainlit 예제를 모아둔 Cookbook 저장소




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요