본문 바로가기
데이터 시각화 및 애플리케이션 개발/AI 컴퓨터 비전프로젝트

[Python] Streamlit으로 초간단 번역 서비스만들기

by 바다의 공간 2024. 6. 9.

초간단 번역 사이트 만들기

#stremalit 임포트

import streamlit as st

 

간단하게 UI를 구성합니다.

st.title('초간단 번역 서비스앱')
text = st.text_area('번역할 내용을 입력하세요', '')
src_lang = st.selectbox('번역할 언어를 선택하세요', ['영어', '일본어', '한국어'])
trg_lang = st.selectbox('번역될 언어를 선택하세요', ['한국어', '일본어', '영어'])

if st.button('번역하기'):
    pass

여기까지 front단을 구성했습니다.


여기서 ui로 케이스는 구성을 했지만 실질적인 역할을 해줄 수 있는 것이 없습니다.

그래서 번역을 도와줄 챗gpt를 사용하려고 합니다.

챗GPT API를 이용해서 방금 만들었던 프론트앤드를 완성시켜 보려고 합니다.

활용 사이트 ▼

https://platform.openai.com/


1. API keys로 키를 생성했습니다.

 

여기서 만든 시크릿키는 안알려주기에 어디 기록해 두어야합니다


chatGPT

- openAI가 개발한 자연어 처리 모델로, 인간과 유사한 방식으로 대화를 나눌 수 있는 인공지능 시스템입니다.

 

- GPT(Generative Pre-trained Transformer)아키텍처를 기반으로 현재는 GPT-4 버전을 사용(24.5기준)

 

- 기본적으로 영어로 세팅되어있기 때문에 다른 언어로 이용할 시에는 영어에 비해 느리고 정보량이 부족합니다

 

- 상황을 구체적으로 기술할수록 좋은 결과를 얻을 수 있음

예를들어서 "streamlit에 대해서 설명해줘" 보다는 "나는 AI개발자야. 직원을 교육하고 있는데 streamlit에 대해 개념을 설명하는 자료를 만들어줘 라고 하는것이 더 좋은 답변을 얻을 수 있음

 

- chatGPT에게 역할을 부여할수록 좋은 결과를 얻을 수 있음

예를들어서 "신입사원에게 질문할 문항을 만들어줘 보다는 "너는 스타트업 개발팀장이야. 팀장처럼 행동해줘 네가 질문을 하면 내가 대답을 할게. 첫번째 질문부터 생성해줘" 라고하는것이 더욱 구체적임


openai를 사용하기 위해서 임포트 해줍니다.

만약 오류가 뜬다면 설치를 먼저 해줍니다.

#openai 임포트

import openai

 

#openai_keys 입력

openai.api_key = "본인 키값 입력F"

 

#답변의 스타일을 먼저 선행학습 시켜줍니다.

이렇게 하면 원하는 답변스타일로 반환받을 수 있습니다.

example = {
    "한국어": ["오늘 날씨 어때?", "딥러닝 기반의 AI기술이 인기를 끌고 있다"],
    "영어": ["How about weather today?", "Deep learning-based AI technology is gaining popularity"],
    "일본어": ["今日の天気はどうですか?", "ディープラーニングベースAI技術は人気を得ている"]
}

 

#내부 함수입력

def translate_text_chatgpt(text, src_lang, trg_lang):
    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

1줄 : text, src_lang, trg_lang를 입력받는다는 함수입니다.

2줄 : build_fewshot을 이용해서 빌드업을 좀 시켜줍니다.

3,4줄 :  예를들어 한국어를 집어넣으면 example에있는 예시로 가져오고 반환할 수 있습니다.

6줄 :  (담을 리스트)

8줄 : for in을 이용해서 반환해줍니다. src_examples, trg_examples를 2개씩 돌면서 각각 sre_text, trg_text로 반환됩니다.

9,10줄 : user라는 role이 sre_text을 던지고 답변해야할 assistant라는 role이 trg_text로 해야해 라는뜻입니다.

일단 두개의 질문과 답을 정해서 알려줍니다.

 

#내부 함수입력

system_instruction = f'assistant는 번역앱으로서 동작한다. {src_lang}을 {trg_lang}으로 적절하게 번역하고 번역된 텍스트만 출력한다.'

이렇게 f스트링으로 작성하는 이유는 그냥 하게되면 과정설명같은걸 하게되어서 불필요한건 없애고

우리에게 필요한 번역된 텍스트만 받기 위해 작성합니다.


여기서 개인적으로는 어시스턴트에게 말하는건 알겠지만 assistant에게 직접적으로 명령하는 코드는 보이지 않아서

찾아보았습니다.

 

알아본 결과

system_instruction은 시스템에 어떤 방식으로 동작해야 하는지 지시하는 문자열로 쓰이고 있었습니다.

예를 들어, "assistant는 번역앱으로서 동작한다. {src_lang}을 {trg_lang}으로 적절하게 번역하고 번역된 텍스트만 출력한다."라는 지시를 통해, AI 모델이 번역 기능을 수행하도록 설정할 수 있었습니다.

 

또한 직접적으로 명령하지않아도 이 지시는 일반적으로 ai 모델을 초기화하거나 설정할 때 사용되는 API 호출이나 함수에 전달이 된다고 합니다. 에를들어 ai를 설정하는 함수나 메서드에 

'system_instruction'을 인자로 넘겨줄 수도 있다고 합니다.

 

요약하자면, system_instruction은 AI 모델이 어떻게 동작해야 하는지 설명하는 문자열이고, 이 지시는 모델을 초기화하거나 설정하는 과정에서 사용돼요. 해당 코드는 이를 직접적으로 보여주지 않지만, 실제 사용 시에는 모델 설정 함수나 메서드에 이 지시를 전달하게 됩니다.

 

# AI 모델 초기화 또는 설정 함수
initialize_model(instruction=system_instruction)

# 번역 예제 설정 함수
fewshot_messages = build_fewshot(src_lang=src_lang, trg_lang=trg_lang)

# AI 모델에게 지시를 전달하는 과정이 포함될 수 있음
assistant.set_instructions(system_instruction)

여기서 initialize_model이나 assistant.set_instructions 같은 함수가 system_instruction을 AI 모델에게 전달하는 역할을 해요. 이 코드는 예시일 뿐이지만, 일반적으로 AI 모델을 설정할 때 이런 방식으로 지시를 전달합니다.


#AI학습

fewshot_messages = build_fewshot(src_lang=src_lang, trg_lang=trg_lang)

적어주는 이유는 각각 어떤 결과값을 반환하고 알려줄지 일러줍니다.

 

#실제로 gpt에게 보낼 메세지 만들기

messages = [{"role":"system", "content": system_instruction}, *fewshot_messages, {"role": "user", "content": text}]

메세지를 만든 형식 /1번째는 프롬포트 엔지니어를 보내고 /2번째는예시를 보내고 /3번쨰는 직무를 부여합니다.


통신하기 전 잘 만들어졌는지만 확인하기

기존에 만들어놨던 ui/st.title('초간단 번역 서비스앱')에서 번역하기 버튼을 누르면 작동하도록

pass에 넣어주도록 합니다.

if st.button('번역하기'):
    translated_text = translate_text_chatgpt(text, src_lang, trg_lang)
    st.success(translated_text)

번역할 내용을 입력하면 1번째 text 2번째 src_lang 3번쨰 trg_lang으로 반환할 수 있도록 합니다.

messages = [{"role":"system", "content": system_instruction}, *fewshot_messages, {"role": "user", "content": text}]
print(messages)

messages부분에다가 print를 넣어 확인해보기로 했습니다.


번역하기를 누르면 UI에서 번역되는것이 아니라 파이참 터미널에서 확인이 되는걸 확인할 수 있습니다.

위에 학습을 시킨 내용들을 기반으로 잘 나온걸 확인할 수 있었습니다.

response = openai.chat.completions.create()
print(response)

를 이용하여 모델을 선택하고 메세지를 넣어주면 됩니다.

모델은 사이트에 가면 굉장히 많기에 내가 사용할 모델을 적어주면 됩니다.

저는 gpt=3.5-turbo를 사용했습니다. 그리고 messages는 위에서 적었던 messages를 그대로 가져옵니다.

그리고 print를 해보았습니다.


 

여기서 create()메서드를 정확하게 이해가지않아서 찾아본 결과

 

  • create() 메서드는 OpenAI의 챗봇 모델을 사용하여 주어진 메시지 맥락으로부터 응답을 생성하고
  • 이 메서드는 model과 messages 같은 매개변수를 받아들여 모델과 대화 맥락을 설정합니다.
  • 실제 사용 시에는 API 키 설정, 메시지 구성, 그리고 create() 메서드 호출의 과정을 통해 AI 응답을 생성하고 사용할 수 있습니다.

 


다시 새로고침을 해준 후 입력을 한 후 결과를 터미널에서 확인했구요

id와 choice의 첫번째 list의 메세지 안의 content에 들어있는것을 확인하고 방금했던 response는 주석걸어주고

print(response.choices[0].message.content)

를 실행해줍니다.

다시 새로고침을 해주고 터미널쪽에서 확인해보면 오른쪽처럼 결과가 잘 나오는것을 확인할 수 있습니다.

 

화면으로 구현

response.choices[0].message.content

윗 부분이 잘 나오는것을 확인했으니 다시 윗부분은 주석걸어주고 코드를 작성해줍니다.

오른쪽처럼 번역하기를 누르면 잘 구현되는것을 확인할 수 있습니다.