LangGraph 프로젝트 생성 및 기본 설정
먼저 LangGraph 플랫폼에서 새로운 프로젝트를 생성해야 합니다. LangGraph는 템플릿을 활용하여 프로젝트를 빠르게 시작할 수 있도록 지원합니다. 다음 명령어를 사용하여 새로운 LangGraph 프로젝트를 생성합니다.
langgraph new --template=new-langgraph-project-python chatbot-and-ui
이 명령어는 'chatbot-and-ui'라는 이름의 새로운 디렉토리를 생성하고, 필요한 모든 파일과 디렉토리를 자동으로 설정합니다. 프로젝트 디렉토리로 이동한 후, graph.py 파일을 수정하여 챗봇의 기본 동작을 정의할 수 있습니다.
cd chatbot-and-ui
vi src/agent/graph.py
graph.py 파일에는 챗봇의 에이전트 로직이 포함되어 있습니다. 이 파일에서 챗봇의 응답 방식, 사용 가능한 도구, 그리고 시스템 프롬프트를 정의할 수 있습니다. LangGraph는 Anthropic, Claude 등 다양한 언어 모델을 지원하며, 개발자는 자신의 필요에 맞는 모델을 선택할 수 있습니다.
사용자 정의 라우트 추가 및 FastAPI 통합
LangGraph는 FastAPI와 같은 웹 프레임워크와의 통합을 통해 사용자 정의 라우트를 쉽게 추가할 수 있도록 지원합니다. 이를 통해 개발자는 챗봇의 UI 엔드포인트를 직접 정의하고, 필요에 따라 다양한 기능을 추가할 수 있습니다. 먼저 FastAPI를 설치하고, 새로운 Python 파일을 생성하여 사용자 정의 라우트를 정의합니다.
uv add fastapi
vi src/agent/app.py
app.py 파일에는 다음과 같은 코드를 추가하여 'hello' 라우트를 정의할 수 있습니다.
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello")
def read_root():
return {"message": "Hello, world!"}
이 코드는 '/hello' 엔드포인트를 정의하고, 해당 엔드포인트에 접근하면 "Hello, world!" 메시지를 반환합니다. LangGraph에 사용자 정의 라우트를 추가하려면 langgraph.json 파일을 수정해야 합니다. 이 파일에서 HTTP 설정을 정의하고, 사용자 정의 애플리케이션을 LangGraph 플랫폼에 연결할 수 있습니다.
{
"http": {
"app": "./src/agent/app.py:app"
}
}
이 설정은 LangGraph 플랫폼이 app.py 파일의 'app' 변수를 사용하여 HTTP 요청을 처리하도록 지시합니다. 이제 LangGraph 개발 서버를 다시 시작하면, 사용자 정의 라우트에 접근할 수 있습니다.
uv run langgraph dev --no-browser
웹 브라우저에서 'http://localhost:2024/hello'에 접속하면 "Hello, world!" 메시지를 확인할 수 있습니다.
FastHTML을 이용한 UI 디자인 개선
단순한 API 엔드포인트 외에도, FastHTML을 사용하여 더욱 사용자 친화적인 UI를 구축할 수 있습니다. FastHTML은 FastAPI의 서브클래스로, HTML 템플릿을 쉽게 렌더링할 수 있도록 지원합니다. FastHTML을 사용하면 개발자는 Python 코드 내에서 HTML, CSS, JavaScript를 직접 작성하고, 동적인 웹 페이지를 생성할 수 있습니다.
FastHTML을 사용하려면 먼저 필요한 종속성을 설치해야 합니다.
uv add python-fasthtml
그런 다음 app.py 파일을 수정하여 FastHTML 애플리케이션을 정의합니다.
from python_fasthtml import FastHTML
app = FastHTML()
@app.get("/")
def index():
return """
<html>
<head>
<title>LangGraph Chatbot Demo</title>
</head>
<body>
<h1>Welcome to the LangGraph Chatbot Demo!</h1>
<p>This is a simple chatbot UI built with FastHTML.</p>
</body>
</html>
"""
이 코드는 '/' 엔드포인트를 정의하고, 해당 엔드포인트에 접근하면 HTML 코드를 렌더링합니다. FastHTML은 Tailwind CSS와 같은 CSS 프레임워크와의 통합을 지원하여, 모던하고 세련된 UI를 쉽게 디자인할 수 있도록 돕습니다.
서버 측 이벤트 스트리밍 (SSE) 구현
서버 측 이벤트 스트리밍(SSE)은 실시간으로 데이터를 클라이언트에 전송하는 데 사용되는 기술입니다. SSE를 사용하면 챗봇의 응답을 점진적으로 표시하여, 사용자 경험을 개선할 수 있습니다. LangGraph는 SSE를 쉽게 구현할 수 있도록 지원하며, 개발자는 비동기 제너레이터를 사용하여 SSE 엔드포인트를 정의할 수 있습니다.
다음 코드를 사용하여 SSE 엔드포인트를 정의할 수 있습니다.
import asyncio
from typing import AsyncGenerator
@app.get("/stream")
async def message_stream(message: str) -> AsyncGenerator[str, None]:
for word in message.split():
await asyncio.sleep(0.5)
yield f"data: {word}
"
이 코드는 '/stream' 엔드포인트를 정의하고, 해당 엔드포인트에 접근하면 메시지를 단어 단위로 나누어 실시간으로 전송합니다. 클라이언트는 SSE 엔드포인트에 연결하여 실시간으로 업데이트되는 데이터를 수신하고, 챗봇의 응답을 점진적으로 표시할 수 있습니다.
FastHTML과 서버 측 이벤트 스트리밍을 결합하면, 더욱 동적이고 사용자 친화적인 챗봇 UI를 구축할 수 있습니다.