openai_client.chat으로 번역 프로그램

사우나도깨비·2025년 9월 30일

개발공부

목록 보기
2/10
post-thumbnail

openai key 발급을 통해 이제 기능들을 사용하게 될 수 있게 되었으니,
openai키를 이용한 번역기와 이미지 생성 프로그램 제작 실습해보았습니다.

번역기 프로그램

1) translation.py 생성

from openai import OpenAI
from dotenv import load_dotenv
import os

◦ openAI 모듈, openAI키를 담고 있는 env.모듈,
openAI키를 환경변수로 쓰는 os모듈을 import함

load_dotenv()
◦ env.에서 받아온 openAI키를 적용시킴
client = OpenAI(
    api_key = os.environ.get("API_KEY")
)
◦ client객체 = OpenAI생성자를 시행시켜, api_key를 매개변수로 삼음
(api_key는 os.evv에서 "API_KEY"로 저장된 값임)
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "You will be provided with a sentence in English, and your task is to translate it into Korean"},
        {"role": "user", "content": "My name is Jane. What is your name?"}
    ],
    temperature=0.7,
    max_tokens=64,
    top_p=1
)
◦ 응답 객체(response)= client 객체의 chat.completions.create() 메서드를 호출하며, model, messages, temperature, max_tokens, top_p를 매개변수로 전달함
print(response.choices[0].message.content)

◦ 여기까지는 role에 직접 번역내용을 넣으면 작동 가능한 코드가 됩니다!
input로 사용자 입력 가능한 코드는 피곤해서 생략...

2. translationAPP.py 생성

이제 번역기능을 프로그램 형식으로 보여주기 위해서 PyQt5라이브러리를 추가하겠습니다.
PyQt5는 파이썬 기반의 GUI 프로그램을 만들 수 있는 라이브러리입니다

사용을 위해선 우선 터미널에 파이큐티를 인스톨해야 합니다.

"pip install PyQt5"
"pip3 install PyQt5"(맥)


파이큐티 주요 위젯들은 위와 같으며 필요한 기능을 사용하면 됩니다.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QTextEdit, QPushButton
from PyQt5.QtCore import QRunnable, QThreadPool, pyqtSlot, pyqtSignal, QObject
◦ 시스템과 파이큐티에서 필요한 기능들을 끌어와줌
from translation_input_app import Translator

class TranslateWorkerSignals(QObject):
finished = pyqtSignal()
error = pyqtSignal(tuple)
result = pyqtSignal(str)

class TranslateWorker(QRunnable):
def init(self, text):
super().init()
self.text = text
self.signals = TranslateWorkerSignals()

@pyqtSlot()
def run(self):
    try:
        translator = Translator()
        translated_text = translator.translate_to_korean(self.text)
        self.signals.result.emit(translated_text)
    except Exception as e:
        self.signals.error.emit((e,))
    finally:
        self.signals.finished.emit()
        

class TranslatorApp(QWidget):
def init(self):
super().init()
self.initUI()
self.thread_pool = QThreadPool()

◦TranslateWorkerSignals/TranslateWorker/TranslatorApp클래스 3개 정의

◦TranslateWorkerSignals = 결과, 에러, 종료 시그널 값 정의
◦TranslateWorker = init, run 함수 정의. init은 입력받은 텍스트 값 저장 및 시그널 전송
run은 입력값을 translator에 넣어서 결과값,에러값을 받아옴
◦TranslatorApp: init 함수 정의. 부모 클래스 초기화, QThreadPool클래스 값을 받아와서 thread_pool에 저장(큐스레드: 스레드풀 갯수 생성, 작업 제출)

    def initUI(self):
        # 메인 레이아웃
        main_layout = QVBoxLayout()
    # 상단 레이아웃
    top_layout = QHBoxLayout()
    lbl_input = QLabel('영어문장을 입력해주세요.')
    lbl_output = QLabel('한글 번역 결과')
    top_layout.addWidget(lbl_input)
    top_layout.addStretch(1)
    top_layout.addWidget(lbl_output)

    # 중앙 레이아웃
    center_layout = QHBoxLayout()
    self.text_input = QTextEdit()
    self.text_output = QTextEdit()
    center_layout.addWidget(self.text_input)
    center_layout.addWidget(self.text_output)

    # 하단 레이아웃
    bottom_layout = QHBoxLayout()
    self.translate_button = QPushButton('번역 요청 버튼')
    self.translate_button.clicked.connect(self.translate_text)
    bottom_layout.addStretch(1)
    bottom_layout.addWidget(self.translate_button)

    # 전체 레이아웃에 추가
    main_layout.addLayout(top_layout)
    main_layout.addLayout(center_layout)
    main_layout.addLayout(bottom_layout)

    # 메인 윈도우 설정
    self.setLayout(main_layout)
    self.setWindowTitle('영어 -> 한글 번역기')
    self.setGeometry(300, 300, 800, 400)
    self.show()
◦ 프로그램 다운 구성을 위해서 레이아웃 설정
레이아웃은 열 대로 위->아래로 작성하며, 레이아웃 내에선 좌->우로 작성
    def translate_text(self):
        input_text = self.text_input.toPlainText()
        worker = TranslateWorker(input_text)
        worker.signals.result.connect(self.display_translation)
        worker.signals.error.connect(self.handle_error)
        self.thread_pool.start(worker)
def display_translation(self, translated_text):
    self.text_output.setPlainText(translated_text + " (번역됨)")

def handle_error(self, error):
    self.text_output.setPlainText(f"Error: {error}")
◦input_text = QPlainTextEdit에서 사용자가 입력한 문자열 가져오기 worker = 가져온 텍스트를 번역할 Qrunnuble 생성 result = 번역완료시 display_translation 메서드 연결 error = 에러 발생 시 handle_error 메서드 연r결 스레드풀에서 작업 시행
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = TranslatorApp()
    sys.exit(app.exec_())
◦ main일때 실행 app객체= sys.argv를 통해 파일명, 사용자 입력값 받아옴 ex = 인스턴스 생성되어 translatorApp 속성 접근해서 초기화 진행 sys.exit = app.exec 이벤트 루프(클릭 등)이 끝나면 시스템 종료 진행

0개의 댓글