이전 내용
번역봇 기능 추가하기
4) 번역봇 구현하기
번역봇은 사용자가 입력 텍스트를 원하는 국가의 텍스트로 번역하는 챗봇이다.
이전에 만들어둔 코드 중 '번역봇' 탭에서 작성한다.
4-1) 레이아웃 구현하기
탭을 제외한 번역봇의 레이아웃은 세로로 4블록이 쌓여 있고, 2번째와 4번째 블록에는 가로로 2블록씩 나눌 예정이다. 이 레이아웃에 맞춰 코드를 작성해 블록을 쌓기 위해 코드를 입력한다. (pass 부분 삭제 후 코드 작성)
# 상담봇
with gr.Tab("번역봇"):
gr.Markdown()
with gr.Row():
gr.Text()
gr.Dropdown()
gr.Button()
with gr.Row():
gr.Text()
gr.Text()
# 소설봇
- 타이틀 레이아웃
with gr.Tab("번역봇"):
gr.Markdown(
value="""
# <center>번역봇</center>
<center>다국어 번역봇입니다.</center>
""")
with gr.Row():
gr.Text()
gr.Dropdown()
gr.Button()
with gr.Row():
gr.Text()
gr.Text()
- 번역 조건: 챗GPT를 이용한 번역을 할 때 번역 스타일을 작성하는 레이아웃 구현
with gr.Row():
gr.Text(
label="번역 조건",
placeholder="예시: 자연스럽게",
lines=1,
max_lines=3
)
gr.Dropdown()
- 출력 언어: 챗GPT가 번역할 수 있는 언어 중 일부만 선택할 수 있도록 제한하여 코드를 작성한다.
gr.Dropdown(
label="출력 언어",
choices=["한국어", "영어", "일본어", "중국어"],
value="한국어",
allow_custom_value=True,
interactive=True
)
- choices: 값을 지정하여 번역 가능한 국가의 리스트 제한 (필요에 따라 추가 가능)
- value: 초깃값 지정. (여기서는 한국어)
- allow_custom_value를 True로 하여 번역 가능한 국가 리스트 외의 국가도 직접 설정 가능하도록 함
- 초깃값을 지정하면 상호 작용이 비활성화되므로 interactive를 True로 하여 상호 작용 활성화
- 번역하기 버튼 구현
gr.Button(
value="번역 하기",
variant="primary"
)
- 입력 텍스트 필드 구현: 번역하고 싶은 언어를 적는 입력 텍스트 필드 구현
with gr.Row():
gr.Text(
placeholder="번역할 내용을 적어 주세요.",
lines=10,
max_lines=20,
show_copy_button=True,
label=""
)
- show_copy_button을 활성화하여 쉽게 내용을 복사할 수 있도록 설정(빨간 네모 버튼)
- 출력 텍스트 필드 구현: 번역된 내용을 보여 주는 출력 텍스트 필드 구현
gr.Text(
lines=10,
max_lines=20,
show_copy_button=True,
label="",
interactive=False
)
- interactive는 False로 설정하여 실수로 번역된 내용을 편집하는 일이 없도록 방지한다.
4-2) 번역봇 기능 구현하기
[번역하기] 버튼을 클릭하면 '번역 조건'과 '출력 언어'를 참고해 챗GPT로 번역된 값을 받아 화면에 출력하는 기능을 구현한다.
- translate_bot() 함수
- 매개변수1 - output_conditions: 번역 조건에 대한 값
- 매개변수2 - output_language: 출력 언어에 대한 값
- 매개변수 3 - input_text: 번역할 내용
해당 코드는 상담봇 함수와 레이아웃 사이에 쓴다.
# 번역봇
def translate_bot(output_conditions, output_language, input_text):
if input_text == "":
return ""
else:
if output_conditions == "":
output_conditions=""
else:
output_conditions="번역할 때의 조건은 다음과 같습니다." + output_conditions
completion = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "당신은 번역가입니다. 입력한 언어를 설명 없이 곧바로 {0}로 번역해서 알려 주세요.\
번역이 불가능한 언어라면 번역이 불가하다고 말한 후 그 이유를 설명해 주세요. {1}".format(output_language, output_conditions)},
{"role": "user", "content":input_text}
])
return completion.choices[0].message.content
- if 부분: 입력값이 없을 경우, 빈 값을 return 하여 API를 호출하는 데 드는 비용 절약
- else 부분: API 호출 시 system에 입력할 값을 자연스럽게 설정하기 위해, 번역 조건에 값이 있을 경우와 없을 경우로 나뉨.
- completion 부분: OpenAI API 통신 코드를 활용해 값을 전달받고 전달받은 값을 return. system 규칙의 content를 지정해 챗GPT가 번역 할 수 있도록 역할 부여.
- 번역의 품질은 model의 값을 상위 버전(예. GPT-4)의 모델로 변경하여 높일 수 있음.
4-3) 변수에 컴포넌트 바인딩하기
앞서 작성한 함수에 참조하기 위한 기능을 변수에 바인딩해준다.
4-4) 이벤트 리스너 추가하기
tb_submit 변수에 클릭 이벤트 리스너를 추가해 클릭 이벤트를 받도록 코드를 작성 한다.
tb_submit.click(
fn=translate_bot,
inputs=[tb_output_conditions,
tb_output_language,
tb_input_text],
outputs=tb_output_text
)
4-5) 실행하기
BTS의 Permission to dance 중 일부분을 번역봇에게 번역을 요청해봤다.
번역이 잘 실행되었다.
전체 코드 (상담봇 포함)
이전 내용에 만들어둔 상담봇을 포함한 전체 코드이다.
import gradio as gr
import os
from openai import OpenAI
# OpenAI 클라이언트 설정
client = OpenAI(
api_key=os.environ['OPENAI_API_KEY'])
# 상담봇 - 채팅 및 답변
def counseling_bot_chat(message, chat_history):
if message == "":
return "", chat_history
else:
completion = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "당신은 DUDE의 상담원입니다.\
쇼핑몰 상품과 관련되지 않은 질문에는 정중히 거절하세요."},
{"role": "user", "content": message}
]
)
chat_history.append([message, completion.choices[0].message.content])
return "", chat_history
# 상담봇 - 되돌리기
def counseling_bot_undo(chat_history):
if len(chat_history) > 1:
chat_history.pop()
return chat_history
# 상담봇 - 초기화
def counseling_bot_reset(chat_hisotry):
chat_history=[[None, "안녕하세요, DUDE 입니다. 상담을 도와드리겠습니다."]]
return chat_history
# 번역봇
def translate_bot(output_conditions, output_language, input_text):
if input_text == "":
return ""
else:
if output_conditions == "":
output_conditions=""
else:
output_conditions="번역할 때의 조건은 다음과 같습니다." + output_conditions
completion = openai.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "당신은 번역가입니다.\
입력한 언어를 설명 없이 곧바로 {0}로 번역해서 알려 주세요.\
번역이 불가능한 언어라면 번역이 불가하다고 말한 후 그 이유를 설명해 주세요. {1}".format(output_language, output_conditions)},
{"role": "user", "content":input_text}
])
return completion.choices[0].message.content
# 레이아웃
with gr.Blocks(theme=gr.themes.Default()) as app:
with gr.Tab("상담봇"):
gr.Markdown(
value="""
# <center>상담봇</center>
<center> DUDE 상담봇입니다. 판매하는 상품과 관련된 질문에 답변 드립니다.</center>
""")
cb_chatbot=gr.Chatbot(
value=[[None, "안녕하세요, DUDE 입니다. 상담을 도와드리겠습니다."]],
show_label=False
)
with gr.Row():
cb_user_input=gr.Text(
lines=1,
placeholder="입력 창",
container=False,
scale=9
)
cb_send_btn=gr.Button(
value="보내기",
scale=1,
variant="primary",
icon="https://cdn-icons-png.flaticon.com/128/12439/12439334.png"
)
with gr.Row():
gr.Button(value="↪️되돌리기").click(fn=counseling_bot_undo, inputs=cb_chatbot, outputs=cb_chatbot)
gr.Button(value="🔄️초기화").click(fn=counseling_bot_reset, inputs=cb_chatbot, outputs=cb_chatbot)
# 보내기1
cb_send_btn.click(fn=counseling_bot_chat, inputs=[cb_user_input, cb_chatbot], outputs=[cb_user_input, cb_chatbot])
# 보내기2
cb_user_input.submit(fn=counseling_bot_chat, inputs=[cb_user_input, cb_chatbot], outputs=[cb_user_input, cb_chatbot])
with gr.Tab("번역봇"):
gr.Markdown(
value="""
# <center>번역봇</center>
<center>다국어 번역봇입니다.</center>
""")
with gr.Row():
tb_output_conditions=gr.Text(
label="번역 조건",
placeholder="예시: 자연스럽게",
lines=1,
max_lines=3
)
tb_output_language=gr.Dropdown(
label="출력 언어",
choices=["한국어", "영어", "일본어", "중국어"],
value="한국어",
allow_custom_value=True,
interactive=True
)
tb_submit=gr.Button(
value="번역 하기",
variant="primary"
)
with gr.Row():
tb_input_text=gr.Text(
placeholder="번역할 내용을 적어 주세요.",
lines=10,
max_lines=20,
show_copy_button=True,
label=""
)
tb_output_text=gr.Text(
lines=10,
max_lines=20,
show_copy_button=True,
label="",
interactive=False
)
tb_submit.click(
fn=translate_bot,
inputs=[tb_output_conditions,
tb_output_language,
tb_input_text],
outputs=tb_output_text
)
with gr.Tab("소설봇"):
pass
app.launch()
다음 내용
[출처]
Hey, 파이썬! 생성형 AI 활용 앱 만들어줘
'[파이썬 Projects] > <파이썬 Gen AI>' 카테고리의 다른 글
[Gen AI] 그라디오로 제작한 챗봇 허깅 페이스에 업로드하기 (1) | 2024.12.13 |
---|---|
[Gen AI] 그라디오로 챗봇 제작하기 - 3 (소설봇) (1) | 2024.12.12 |
[Gen AI] 그라디오로 챗봇 제작하기 - 1 (상담봇) (0) | 2024.12.12 |
[Gen AI] 그라디오(Gradio) (1) | 2024.12.11 |
[Gen AI] OpenAI API 사용해보기 (로컬, 주피터노트북) (0) | 2024.12.10 |