TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 Gen AI>

[Gen AI] 그라디오로 챗봇 제작하기 - 2 (번역봇)

by 기록자_Recordian 2024. 12. 12.
728x90
반응형
이전 내용
 

[Gen AI] 그라디오로 챗봇 제작하기 - 1 (상담봇)

이전 내용 [Gen AI] 그라디오(Gradio)이전 내용 [Gen AI] OpenAI API 사용해보기 (로컬, 주피터노트북)이전 내용 [Gen AI] OpenAI API 키 발급하기Open AI API란? OpenAI에서 개발한 인공지능 모델을 프로그래밍 인

puppy-foot-it.tistory.com


번역봇 기능 추가하기

 

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()

다음 내용

 

[Gen AI] 그라디오로 챗봇 제작하기 - 3 (소설봇)

이전 내용 [Gen AI] 그라디오로 챗봇 제작하기 - 1 (상담봇)이전 내용 [Gen AI] 그라디오(Gradio)이전 내용 [Gen AI] OpenAI API 사용해보기 (로컬, 주피터노트북)이전 내용 [Gen AI] OpenAI API 키 발급하기Open AI

puppy-foot-it.tistory.com


[출처]

Hey, 파이썬! 생성형 AI 활용 앱 만들어줘

728x90
반응형