load_dotenv() # 환경변수 불러오기
api_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=api_key)
# Few-shot 번역 예제 데이터
example = {
"한국어" : [
"오늘 날씨 어때?",
"최근 멀티모달과 Agent 기술이 인기를 끌고 있다."
],
"영어" : [
"How is the weather today?",
"Recently, multimodal and agent technologies have become popular"
],
"일본어": [
"今日の天気はどう?",
"最近、マルチモーダルとAgent技術が人気を集めている。"
]
}
def build_fewshot(src_lang, trg_lang):
src_examples = example[src_lang]
trg_examples = example[trg_lang]
fewshot_message = []
for src_text, trg_text in zip(src_examples, trg_examples):
fewshot_message.append({
"role": "user",
"content": src_text
})
fewshot_message.append({
"role": "assistant",
"content": trg_text
})
return fewshot_message
def translate_text_chatgpt(text, src_lang, trg_lang):
system_instruction = (
"당신은 전문 번역 애플리케이션입니다.\n"
f"입력된 {src_lang} 문장을 자연스러운 {trg_lang} 문장으로 번역하세요.\n"
"설명, 부연 설명, 따옴표, 제목을 추가하지 마세요.\n"
"번역된 텍스트만 출력하세요."
)
fewshot_messages = build_fewshot(
src_lang=src_lang, trg_lang=trg_lang
)
messages = [
{ "role": "developer", "content": system_instruction },
*fewshot_messages,
{ "role" : "user", "content": text }
]
try:
response = client.responses.create(
model="gpt-5-nano",
input=messages,
reasoning={ "effort": "low"}, # 복잡한 추론을 사용하지 않도록 옵션 부여
# 번역은 추론이 필요 없으니까
max_output_tokens=500
)
translate_text = response.output_text.strip()
if not translate_text:
return "변역 결과가 생성되지 않았습니다. 다시 시도해 주세요."
return translate_text
except Exception as e:
print(f'OpenAI API 오류: {e}')
return f'번역 중 오류가 발생했습니다: {e}'
def gradio_translate(text, src_lang, trg_lang):
if text is None or not text.strip():
return "번역할 내용을 입력하세요"
if src_lang == trg_lang:
return "원본 언어와 번역 언어가 같습니다. 다른 언얼르 선택하세요"
return translate_text_chatgpt(text=text.strip(), src_lang=src_lang, trg_lang=trg_lang)
with gr.Blocks() as demo:
gr.Markdown("# 초간단 번역 앱")
text_input = gr.Textbox(
label="번역할 내용을 입력하세요", placeholder="여기에 내용을 입력하세요", lines=3
)
src_lang_dropdown = gr.Dropdown(
choices=["한국어", "영어", "일본어"], value="영어", label="원본 언어를 선택하세요"
) # value = 기본값
trg_lang_dropdown = gr.Dropdown(
choices=['한국어', '영어', '일본어'], value="한국어", label="번역할 언어를 선택하세요"
)
translate_button = gr.Button("번역하기")
output_text = gr.Textbox(
label="번역 결과", placeholder="번역된 결과가 여기에 표시됩니다", lines=5, interactive=False
)
translate_button.click(
fn=gradio_translate, inputs=[text_input, src_lang_dropdown, trg_lang_dropdown], outputs=output_text
)
demo.launch()