본문 바로가기
인공지능/LLM 서비스

Gradio와 OpenAI로 번역 앱 만들기: Few-shot 학습 활용

by hyunji00pj 2025. 1. 12.

Gradio와 OpenAI를 사용한 번역 앱 만들기

이 코드는 GradioOpenAI GPT API를 활용하여 간단한 번역 앱을 구축하는 예제이다. 사용자가 입력한 텍스트를 원하는 언어로 번역하여 결과를 출력하는 인터페이스를 제공한다. 코드와 함께 단계별 과정을 살펴보도록 하자.

import gradio as gr
import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(
    api_key = os.getenv("API_KEY")
)


#예제 데이터
# 예제 데이터: 소스 언어와 대상 언어에 대한 예제 번역 데이터를 딕셔너리로 정의합니다. Few-shot 학습에 사용됩니다.
example = {
    "한국어": ["오늘 날씨 어때?","최근 멀티모달 AI 기술이 인기를 끌고있다"],
    "영어": ["Yo, what’s the vibe with the weather today?","Aight, lately, them multimodal AI tech be blowin’ up big time, ya feel me?"],
    "일본어":["今日の天気、どう?」(きょうのてんき、どう?","最近、マルチモーダルAI技術が人気になってるよ。」(さいきん、マルチモーダルエーアイぎじゅつがにんきになってるよ"]
}

def translate_text_chatgpt(text, src_lang, trg_lang): #translate_text_chatgpt 함수 정의: OpenAI의 GPT 모델을 사용해 텍스트 번역을 수행하는 함수입니다.
    def build_fewshot(src_lang, trg_lang): #Few-shot 데이터 생성 함수 정의: 주어진 소스 언어와 대상 언어의 예제 데이터를 기반으로 메시지 포맷을 생성합니다.
        src_examples = example[src_lang]
        trg_examples = example[trg_lang]
        #소스와 대상 예제 데이터 가져오기: example 딕셔너리에서 소스와 대상 언어에 해당하는 예제 문장을 가져옵니다.
        fewshot_messages = []
        for src_text, trg_text in zip(src_examples,trg_examples):
            fewshot_messages.append({"role":"user","content":src_text})
            fewshot_messages.append({"role":"assistant","content":trg_text})
        # Few-shot 메시지 생성:
        # 예제 데이터를 순회하며, 소스 문장을 user 역할로, 대상 번역 문장을 assistant 역할로 설정합니다.
        return fewshot_messages
    system_instruction = f'assistant는 번역앱으로 동작한다. {src_lang}를 {trg_lang}로 적절하게 번역된 텍스트만 출력한다.'
    #시스템 지시문 정의: 번역 모델의 동작을 명시적으로 정의합니다.
    fewshot_messages = build_fewshot(src_lang=src_lang,trg_lang=trg_lang)
    #Few-shot 메시지 생성 호출: build_fewshot 함수를 사용해 소스와 대상 언어에 대한 메시지를 생성합니다.
    messages = [{"role":"system", "content":system_instruction}, *fewshot_messages, {"role":"user", "content":text}]
    #system_instruction, fewshot_messages, 사용자 입력 데이터를 포함한 메시지 배열을 생성합니다.
    response = client.chat.completions.create(
        model="gpt-3.5-turbo-0125",
        messages=messages
    )
    #OpenAI API 호출: 생성된 메시지 배열을 GPT 모델에 전달하여 번역 결과를 요청합니다.
    return response.choices[0].message.content
    #번역 결과 반환: GPT 모델의 첫 번째 응답 메시지 내용을 반환합니다.

def gradio_translate(text, src_lang, trg_lang):
    #gradio_translate 함수 정의: Gradio와 연동된 번역 처리 함수입니다.
    if not text.strip():
        return "번역할 내용을 입력하세요"
    #입력 값 검증: 입력 텍스트가 비어 있는지 확인합니다.
    if src_lang == trg_lang:
        return "원본 언어와 번역 언어가 같습니다. 다른 언어를 선택하세요"
    #언어 선택 검증: 소스와 대상 언어가 같으면 오류 메시지를 반환합니다.
    return translate_text_chatgpt(text, src_lang, trg_lang)
    #번역 함수 호출: 입력 값을 전달하여 번역 결과를 반환합니다.

with gr.Blocks() as demo:
    #Gradio 인터페이스 생성: Blocks를 사용해 Gradio UI 구성 시작.
    gr.Markdown("# 초간단 번역 앱")
    #Markdown 추가: 사용자 인터페이스에 제목 표시.
    text_input = gr.Textbox(label="변역할 내용을 입력하세요",placeholder="여기에 내용을 입력하세요")
    #텍스트 입력 필드: 번역할 내용을 입력받는 필드를 생성합니다.
    src_lang_dropdown = gr.Dropdown(choices=["한국어","영어","일본어"],value="영어",label="번역할 언어를 선택하세요")
    trg_lang_dropdown = gr.Dropdown(choices=["영어","한국어","일본어"],value="한국어",label="번역된 언어를 선택하세요")
    #언어 선택 드롭다운: 소스 언어와 대상 언어를 선택할 수 있는 드롭다운 메뉴를 생성합니다.
    translate_botton = gr.Button("번역하기")
    #버튼 추가: 번역을 실행하는 버튼을 생성합니다.
    output_text = gr.Textbox(label="번역 결과",placeholder="번역된 결과가 여기에 표시됩니다",interactive=False)
    #출력 필드: 번역 결과를 표시하는 텍스트 박스를 생성합니다.
    translate_botton.click(
        gradio_translate,
        inputs=[text_input,src_lang_dropdown,trg_lang_dropdown],
        outputs=output_text
    )
    #버튼 클릭 이벤트 설정: 버튼이 클릭되었을 때 gradio_translate 함수를 호출하며, 입력 값과 출력 필드를 연결합니다.
    
demo.launch()
#Gradio 앱 실행: 생성된 UI를 실행하고 로컬 서버를 시작합니다.

 

 

  • 텍스트 번역:
    • 사용자가 입력한 텍스트를 지정된 언어로 번역.
  • Few-shot 학습:
    • 예제 데이터를 사용해 모델의 번역 성능을 향상.
  • Gradio 인터페이스:
    • 간단한 웹 기반 번역 UI 제공.

필요한 라이브러리 설치

pip install gradio openai python-dotenv

 

 

  • Gradio: 웹 기반 인터페이스 생성.
  • OpenAI: GPT API를 활용해 번역 처리.
  • python-dotenv: 환경 변수 관리.

환경 변수 설정 및 OpenAI 클라이언트 초기화

import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(
    api_key=os.getenv("API_KEY")
)

 

 

Few-shot 예제 데이터

 

example = {
    "한국어": ["오늘 날씨 어때?", "최근 멀티모달 AI 기술이 인기를 끌고있다"],
    "영어": ["Yo, what’s the vibe with the weather today?", "Aight, lately, them multimodal AI tech be blowin’ up big time, ya feel me?"],
    "일본어": ["今日の天気、どう?」(きょうのてんき、どう?", "最近、マルチモーダルAI技術が人気になってるよ。」(さいきん、マルチモーダルエーアイぎじゅつがにんきになってるよ"]
}

 

Few-shot 학습용 데이터:

  • 각 언어별 예제 문장을 저장한 딕셔너리.
  • 번역 정확도를 높이기 위해 GPT에 학습 데이터 제공.

 

Few-shot 메시지 생성

 

def build_fewshot(src_lang, trg_lang):
    src_examples = example[src_lang]
    trg_examples = example[trg_lang]
    fewshot_messages = []
    for src_text, trg_text in zip(src_examples, trg_examples):
        fewshot_messages.append({"role": "user", "content": src_text})
        fewshot_messages.append({"role": "assistant", "content": trg_text})
    return fewshot_messages

 

  • 소스 언어(src_lang)와 대상 언어(trg_lang)의 예제 데이터를 기반으로 메시지를 생성.
  • 생성된 메시지는 GPT에게 Few-shot 학습 데이터를 제공하여 번역 품질을 높이는 역할.

 

번역 처리

def translate_text_chatgpt(text, src_lang, trg_lang):
    system_instruction = f'assistant는 번역앱으로 동작한다. {src_lang}를 {trg_lang}로 적절하게 번역된 텍스트만 출력한다.'
    fewshot_messages = build_fewshot(src_lang=src_lang, trg_lang=trg_lang)
    messages = [{"role": "system", "content": system_instruction}, *fewshot_messages, {"role": "user", "content": text}]
    response = client.chat.completions.create(
        model="gpt-3.5-turbo-0125",
        messages=messages
    )
    return response.choices[0].message.content

 

 

  • system_instruction:
    • GPT가 번역 앱으로 동작하도록 설정.
  • Few-shot 학습:
    • build_fewshot 함수로 생성된 메시지 포함.
  • API 호출:
    • OpenAI GPT API에 메시지를 전달해 번역 결과를 요청.

Gradio 연동 함수 정의

def gradio_translate(text, src_lang, trg_lang):
    if not text.strip():
        return "번역할 내용을 입력하세요"
    if src_lang == trg_lang:
        return "원본 언어와 번역 언어가 같습니다. 다른 언어를 선택하세요"
    return translate_text_chatgpt(text, src_lang, trg_lang)

 

 

  • 입력값 검증:
    • 텍스트가 비어 있거나, 소스와 대상 언어가 같은 경우 오류 메시지 반환.
  • 번역 결과 반환:
    • translate_text_chatgpt를 호출해 결과 출력.

Gradio 인터페이스 구성

 

with gr.Blocks() as demo:
    gr.Markdown("# 초간단 번역 앱")
    text_input = gr.Textbox(label="변역할 내용을 입력하세요", placeholder="여기에 내용을 입력하세요")
    src_lang_dropdown = gr.Dropdown(choices=["한국어", "영어", "일본어"], value="영어", label="번역할 언어를 선택하세요")
    trg_lang_dropdown = gr.Dropdown(choices=["영어", "한국어", "일본어"], value="한국어", label="번역된 언어를 선택하세요")
    translate_botton = gr.Button("번역하기")
    output_text = gr.Textbox(label="번역 결과", placeholder="번역된 결과가 여기에 표시됩니다", interactive=False)
    translate_botton.click(
        gradio_translate,
        inputs=[text_input, src_lang_dropdown, trg_lang_dropdown],
        outputs=output_text
    )
demo.launch()

 

 

 

  • Gradio 컴포넌트:
    • gr.Textbox: 사용자 입력 및 결과 표시.
    • gr.Dropdown: 소스 언어와 대상 언어 선택.
    • gr.Button: 번역 실행.
  • 버튼 클릭 이벤트:
    • 사용자가 "번역하기" 버튼을 클릭하면 gradio_translate 함수가 호출되고 결과를 출력.

실행 결과

 

 

'인공지능 > LLM 서비스' 카테고리의 다른 글

Python FastAPI와 비동기 프로그래밍 기초  (0) 2025.01.14
Fast API로 시작하는 웹 개발 - 기초  (0) 2025.01.14
Gradio  (0) 2025.01.12
프롬프트 엔지니어링  (0) 2025.01.12
생성형 AI에 대해서 - GPT API  (0) 2025.01.12