Gradio 기반 NL2SQL 챗봇 만들기 - Part 2: 웹 인터페이스 만들기

Gradio 기반 NL2SQL 챗봇 만들기 - Part 2: 웹 인터페이스 만들기

안녕하세요🤗 오늘은 Hugging Face에서 개발한 Gradio 라이브러리를 사용하여 머신러닝 모델을 위한 웹 인터페이스를 쉽고 빠르게 만드는 방법을 알아보겠습니다. Gradio를 사용하면 복잡한 웹 개발 지식 없이도 데모나 인터페이스를 빠르게 제작할 수 있습니다.

1. Gradio 소개

Gradio는 머신러닝 모델이나 Python 함수를 위한 웹 기반 GUI를 몇 줄의 코드로 만들 수 있게 해주는 강력한 도구입니다. 주요 특징은 다음과 같아요.

  • 다양한 입력/출력 컴포넌트 지원 (텍스트, 이미지, 오디오 등)
  • 간단한 Python API
  • 로컬 호스팅 및 클라우드 배포 옵션
  • 다양한 머신러닝 프레임워크와의 호환성

2. 기본 사용법: Hello World 예제

먼저, 가장 기본적인 Gradio 애플리케이션을 만들어 보겠습니다. 이 예제에서는 사용자의 이름을 입력받아 인사말을 반환하는 간단한 함수를 만들고, 이를 웹 인터페이스로 구현해볼 것입니다.

import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="textbox", outputs="textbox")

if __name__ == "__main__":
    demo.launch()

이 코드를 실행하면, 로컬 서버가 시작되고 웹 브라우저에서 인터페이스를 볼 수 있습니다. 텍스트 상자에 이름을 입력하고 ‘Submit’ 버튼을 클릭하면, 인사말이 출력됩니다.

3. Gradio Interface 클래스 상세 설명

Gradio의 핵심은 Interface 클래스입니다. 이 클래스를 사용하여 함수와 입력/출력 컴포넌트를 연결하고 웹 인터페이스를 생성합니다.

주요 매개변수

  • fn: 인터페이스로 감싸고자 하는 함수
  • inputs: 입력 컴포넌트 (예: “textbox”, “image” 등)
  • outputs: 출력 컴포넌트
  • examples: 예제 입력값 리스트
  • title: 인터페이스 제목
  • description: 인터페이스 설명

4. 고급 예제: 이미지 분류기

이번에는 조금 더 복잡한 예제로, 이미지 분류기를 위한 인터페이스를 만들어 보겠습니다.

import gradio as gr
import torch
from torchvision import models, transforms
from PIL import Image

# 사전 훈련된 ResNet50 모델 로드
model = models.resnet50(pretrained=True)
model.eval()

# 이미지 전처리를 위한 변환 정의
preprocess = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

# ImageNet 클래스 레이블 로드
with open('imagenet_classes.txt', 'r') as f:
    labels = [line.strip() for line in f.readlines()]

def image_classifier(img):
    # 이미지 전처리
    input_tensor = preprocess(img)
    input_batch = input_tensor.unsqueeze(0)

    # 추론
    with torch.no_grad():
        output = model(input_batch)

    # 결과 처리
    probabilities = torch.nn.functional.softmax(output[0], dim=0)
    top5_prob, top5_catid = torch.topk(probabilities, 5)

    # 결과를 사전 형식으로 변환
    results = {}
    for i in range(top5_prob.size(0)):
        results[labels[top5_catid[i]]] = float(top5_prob[i])

    return results

demo = gr.Interface(
    fn=image_classifier,
    inputs=gr.Image(type="pil"),
    outputs=gr.Label(num_top_classes=5),
    title="이미지 분류기",
    description="이미지를 업로드하면 상위 5개의 예측 클래스와 확률을 보여줍니다."
)

if __name__ == "__main__":
    demo.launch()

이 예제에서는 이미지를 입력으로 받아 상위 5개의 예측 클래스와 확률 출력하는 인터페이스를 만들었습니다.

5. 인터페이스 실행하기

launch() 메서드를 사용하여 인터페이스를 실행할 수 있습니다. 다양한 옵션을 제공하여 실행 방식을 커스터마이즈할 수 있습니다.

demo.launch(
    share=True,  # 공유 가능한 링크 생성
    auth=("username", "password"),  # 기본 인증 설정
    server_port=7860  # 서버 포트 지정
)

6. 큐 시스템 활용하기

Gradio는 큐 시스템을 제공하여 동시 요청을 관리하고 사용자 경험을 향상시킬 수 있습니다.

demo = gr.Interface(image_classifier, gr.Image(), gr.Label())
demo.queue(max_size=50)  # 최대 50개의 요청을 큐에 저장
demo.launch()

이렇게 하면 동시에 들어오는 요청을 효과적으로 관리하고, 사용자에게 대기 시간을 알려줄 수 있습니다.

결론

Gradio를 사용하면 복잡한 머신러닝 모델도 쉽게 웹 인터페이스로 만들 수 있습니다. 이 튜토리얼에서는 기본적인 사용법부터 고급 기능까지 살펴보았습니다. Gradio의 다양한 컴포넌트와 옵션을 활용하여 여러분의 프로젝트에 맞는 인터페이스를 만들어보세요!

다음 포스팅에서는 이러한 Gradio의 기능을 활용하여 Text-to-SQL 챗봇을 구현해볼 예정입니다. 이 챗봇은 다음과 같은 특징을 가질 예정이에요.

  • 자연어 질문을 SQL 쿼리로 변환하는 NLP 모델 통합
  • 데이터베이스 스키마 정보를 컨텍스트로 활용
  • 생성된 SQL 쿼리와 실행 결과를 동시에 표시하는 다중 출력 인터페이스
  • 대화 기록을 유지하는 채팅 인터페이스 구현

Gradio의 다양한 컴포넌트와 옵션을 활용하면, 이러한 복잡한 기능도 비교적 적은 코드로 구현할 수 있습니다. 여러분의 프로젝트에 맞는 고유한 인터페이스를 만들어보세요!

참고 자료

Chaewon
Chaewon Hello! I'm Chaewon Song, a developer aspiring to become an Software engineer 🤗