Gradio 애플리케이션에 상태 유지 기능 추가하기

KIM DA MI·2024년 1월 16일
0

gradio

목록 보기
7/9
post-thumbnail

상태 유지 기능 추가하기


Gradio에서는 전역(global) 상태와 세션(session) 상태 중에서 상태 유지를 할 수 있다.


Global state (전역 상태)

블록의 전역 상태(global state)는 인터페이스와 유사한 기능을 제공한다.
함수 외부에서 정의된 변수나 데이터는 모든 함수에서 접근할 수 있다.

아래의 track_gdp 예시에서는 변수 gdps가 모든 사용자에게 공유된다.
앱에 접근하는 사용자들은 자신의 점수를 리스트에 추가할 수 있다.

import gradio as gr

gdps = []

def track_gdp(gdp):
    gdps.append(gdp)
    top_gdps = sorted(gdps, reverse=True)[:3]
    return top_gdps

demo = gr.Interface(
    track_gdp,
    gr.Number(label="gdp"),
    gr.JSON(label="Top gdps")
)
demo.launch()


Session state (세션 상태)

Gradio는 세션 상태(session state)를 지원하여 페이지 세션 내에서 여러 번의 제출(submit)을 통해 데이터를 유지할 수 있다.
세션 상태를 사용하기 위해 다음 단계를 따른다:

  1. gradio.State() 객체를 정의한다.
  2. 이벤트 리스너(event listener)에 State 객체를 입력과 출력으로 배치한다.
  3. 이벤트 리스너 함수에서 변수를 입력 매개변수와 반환 값에 포함시킨다.

세션 상태(session state)를 설명하기 위해 행맨 게임을 예시로 들겠다.

import gradio as gr
import random

secret_word = "Machine"

with gr.Blocks() as demo:
    used_letters_var = gr.State([])
    with gr.Row() as row:
        with gr.Column():
            input_letter = gr.Textbox(label="Enter letter")
            btn = gr.Button("Guess Letter")
        with gr.Column():
            hangman = gr.Textbox(
                label="Hangman",
                value="_"*len(secret_word)
            )
            used_letters_box = gr.Textbox(label="Used Letters")

    def guess_letter(letter, used_letters):
        used_letters.append(letter)
        answer = "".join([
            (letter if letter in used_letters else "_")
            for letter in secret_word
        ])
        return {
            used_letters_var: used_letters,
            used_letters_box: ", ".join(used_letters),
            hangman: answer
        }
    btn.click(
        guess_letter,
        [input_letter, used_letters_var],
        [used_letters_var, used_letters_box, hangman]
        )
        
demo.launch()

페이지 내에서 세션이 유지되는 것을 확인할 수 있다.
그러나 앱을 새 탭에서 로드하거나 애플리케이션을 새로고침하면 "추측" 기록은 공유되지 않음을 알 수 있다.

0개의 댓글