졸업프로젝트로 생성 이미지 AI를 활용하여 숏폼 형태의 영어단어장 서비스를 만들고자 합니다.
중간발표 이후에 주제를 아예 바꾸어버렸고, 주제가 확정이 된지 한달도 안된 상태라 무슨 기술을 블로그에 써야할 지 막막했지만, 각자 팀원들과 기술 파트 상의를 통해서 CHAT-GPT 파트를 맡게 되었습니다.😊
1. Chat-GPT를 훈련시켜 원하는 대답을 얻자!
일단 Chat-GPT에서 만들어진 소설 텍스트를 기반으로 생성 이미지 AI와 TTS가 만들어지므로
가장 핵심 첫단계라고 할 수 있겠죠…?
우선, 저는 Chat-GPT를 올해 처음 들어서 사용한 지 1년도 안된 따끈따끈한 GPT 새내기입니다.ㅎ
그래도 수업시간에 이해 안가는 내용이나 궁금한 거 물어보면 따박따박 대답해줘서 좋은 AI라고 생각은 하고 있었습니다.
근데 심심해서 물어본 질문에 제대로 된 답변도 못하는 현상도 있었습니다^^
과제를 하면서 이해 안가는 파트를 물어보면 썡뚱맞게 다른 질문을 대답하고, 계산도 잘 못하는 경우도 있었습니다.
5번을 똑같이 말했는데 말했는데도 대답을 안해줌…ㅠ 너무 화가 나... (절대 이러지 마세요)
그래서 대답 똑바로 안해주면 new chat하고 새로운 질문을 했었습니다.
멘토링을 통해 멘토님과 함께 주제에 대해서 말했을 때 프롬프트 엔지니어링이라고 알고 있냐고 물으셨습니다.
네?? 처음 들어봤습니다…?
"프롬프트 엔지니어"라고 지금 뜨고 있는 분야라고 합니다.
새로운 지식이기도 하고 단어부터 위화감이 들어서 무서웠습니다.
프롬프트를 어디서 들어봤지 했는데 기본으로 깔려있는 cmd(명령 프롬프트)가 생각이 났습니다.
명령 프롬프트를 엔지니어링하라고…?
엔지니어링은 공업의 이론, 기술, 생산 따위를 체계적으로 연구하는 학문이고… 그래서 프롬프트를 연구하라고…?
생각만 해도 끔찍했습니다.
근데 자세히 알아보니 되게 단순하면서 열심히 하면 괜찮은 것 같았습니다.
프롬프트 엔지니어링은 AI가 최적의 결과물을 만들어낼 수 있도록, AI 프롬프트를 작성하는 일입니다.
일단, 프로젝트의 스타트는 중학생들 기준으로 만들 계획입니다.
그래서 GPT한테 물었더니....
영어소설 만들어달라니까... 냅다 한글소설 얘기하고...
두번째로 물으니까... 그제서야 영어로 된 소설을 말해주네요....
추상적으로 말하기 보다는 구체적으로 말하는 게 핵심 포인트!
일단 이 프로젝트에서는 중학생 수준에 맞는 영어소설이 필요하고,
무작위의 단어들을 뽑아내서 그 단어들이 모두 들어가고,
그 문장들이 생성이미지 AI를 이용해서 이미지로 표현되어야합니다.
원하는게 많죠?ㅎ
일단, GPT에게 역할 부여가 중요해요.
1. Role-Prompting
중학생 수준에 맞는 짧은 영어소설을 쓰고싶어. 지금부터 너가 초등학생 아니면 중학생 역할을 맡아줘. 알았으면 알겠다고 말해. 그러면 내가 원하는 주제를 던져줄게
먼저 내가 하고싶은 것부터 말하고, GPT가 해줘야하는 역할을 맡게 해야해요. 그리고 준비가 됐음을 파악해야해요.
안그러면 냅다 영어소설을 써줍니다...ㅎ
2. 원하는 거 구체적으로 다 말하기
chair(의자) clock(시계) water(물) pencil(연필)
20줄정도의 짧은 영어 소설을 써줘.
- 위 단어들을 모두 사용해야해.
- 마침표로 끝나는 문장들이 20줄로 이루어진 짧은 소설이여야해.
- 사용한 단어에 “”(큰 따옴표)를 사용해줘.
- 너의 말은 필요없고 소설만 보여줘.
이런 식으로 제가 원하는 바를 구체적으로 차근차근 알려줘야해요.
제 프롬프트 몇개를 빼서 작성하긴 했지만,
일단 4번이 제일 중요해요!!
왜냐하면 gpt는 쓸데 없는 말이 많거든요 ㅎ
저 4번을 뺀다면 냅다 영어소설을 보여주는 것이 아닌
네, 알겠습니다! 제가 위 단어들을 모두 사용해서 짧은 영어 소설을 써봤어요.
라고 시작하면서 영어 소설을 보여주거든요...
프로젝트에서 GPT의 말은 필요가 없으니 반드시 넣어줍니다.
3. 예시 상황 들기
문장을 통해서 생성 이미지를 만들어 내야하는데 직관적이고 시각적인 문장이 필요합니다.
그래서
너가 말했던 소설 밑에 시각적 표현이 가능한 영어를 써줘.
예를 들어서,
Inside the house, a wooden "chair" stood proudly by the window, basking in the warm sunlight.
이런 문장을 너가 생성했다면 그 밑에
→ Wooden chair basking in warm sunlight
화살표 다음 문장처럼 한 문장씩 2개의 영어 문장을 작성해줘.
라고 합니다. 그럼 예시상황을 GPT가 스스로 훈련해서 제가 원하는 답변을 이끌어냅니다.
결론은, 역할을 부여해서 내가 원하는 바를 구체적으로 명확하게 훈련하자!
2. 만들어진 답변을 가져오자!
만들어진 답변을 가져오는 거는 "API를 이용하면 되지 않나?"라고 생각이 듭니다. 물론 Chat-GPT API가 있습니다.
그러나 Chat-GPT의 API는 무료가 아닌
"유료"입니다^^😂
그래서 API를 사용해서 답변을 가져오려면 자본이 있어야합니다...
그러나 저는 자본이 부족한 학생인지라 API를 사용할 수 없습니다.
그래서 매크로를 이용해서 답변을 가져오자 결정했습니다.
제가 사용할 매크로 라이브러리는
셀레늄 라이브러리
모든 분들이 사용하실 수 있게 Google Colab과 CMD(명령 프롬프트)를 이용하였습니다!
1. 셀레늄 설치
파이썬 환경에서 셀레늄을 사용하려면 먼저 셀레늄 라이브러리를 설치해야 합니다.
cmd(명령 프롬프트)를 키신 아래의 명령을 입력하신 후 엔터를 눌러 셀레늄을 설치하세요
pip install selenium
그럼 뭔가 다운로드 받는 것처럼 보이면서 기다리시면 설치가 완료됩니다!
2. 웹 드라이버 설치
셀레늄은 실제 브라우저를 제어하기 위해 웹 드라이버를 사용합니다.
웹 드라이버는 브라우저마다 다르며, 사용하는 브라우저에 맞는 웹 드라이버를 다운로드하여 설치해야 합니다.
저는 가장 일반적으로 사용되는 브라우저인 Google Chrome을 기준으로 설명하겠습니다.
Chrome 웹 드라이버 다운로드
https://sites.google.com/a/chromium.org/chromedriver/downloads 에서
현재 사용 중인 Chrome 브라우저의 버전에 맞는 웹 드라이버를 다운로드하세요.
Chrome 브라우저의 버전을 확인하시려면 크롬 오른쪽 점 3개를 클릭 후 도움말 Chrome 정보를 누르세요.
처음 접속하시면 위 화면과 같이 사이트가 열립니다. 그리고 파란색 site 버튼을 클릭하세요.
site 버튼을 클릭하시면 위 화면이 뜨게 됩니다. 그리고 Downloads를 누르시면
위 화면이 뜨게 됩니다. 위에서 확인한 chrome 브라우저 정보와 일치하는 Driver를 클릭하세요!
마지막에 .(두자리 숫자)는 완전히 일치하지 않으셔도 됩니다.
예를 들어 저는 113.0.5672.127 정보여서 113.0.5672.63을 다운받았습니다!
일치하는 정보를 클릭 후 자신에게 맞는 OS를 클릭하셔서 다운받으세요.
LINUX, MAX, WINDOW 다 지원하네요 ㅎㅎ
다운로드한 드라이버를 압축 해제합니다.
압축 해제한 크롬 드라이버를
자신이 사용할 python 파일이 있는 위치 또는 자신이 사용하는 python의 경로로 옮겨주어야합니다.
저의 경우는 googlecolab을 사용하여 .py 파일을 따로 저장을 해두어야하기 때문에
바탕화면에 따로 새폴더를 만들어주었습니다.
만약 자신이 코딩할 파이썬의 저장될 파일 위치를 모르겠다면
import os
os.getcwd()
를 이용하여 파일 위치를 알아내세요
압축을 푼 파일을 사용할 파일 안에 "반드시" 넣어주세요!
3. 셀레늄으로 웹 브라우저 제어
다음 코드를 사용하여 셀레늄을 이용해 Chat GPT 답변을 가져올 수 있습니다.
그 전에 창이 잘 켜지는지 확인을 해봅시다!
난 확인 안하고 그냥 바로 답변을 가져오는 법을 알고싶다?
스크롤 내리시다보면 바로 아래에 보이는 구분선이 보이는 곳까지 스크롤 내리시면 됩니다 ㅎㅎ
근데 체크하시고 가시는 게 좋아요..ㅎ
browser.get("이동을 원하는 사이트의 주소를 입력")
저는 chat-gpt를 이용할 예정이므로 CHAT-GPT 사이트를 입력하였습니다.
위 코드를 따라서 작성하고 .py 파일로 저장합시다.
Google colab에서 .py 파일로 저장하는 방법은 새노트에 위 코드를 입력해주시고
파일 → 다운로드 → .py 다운로드 해주시면 됩니다.
.ipynb 부분을 클릭하시면 파이썬으로 저장될 때의 이름을 수정하실 수 있습니다.
그리고 저장한 .py 파일을 chromedriver.exe 파일이 있는 곳으로 이동시킵니다.
저는 selenuim-macro 폴더 안으로 .py 파일을 옮겨주었습니다!
실행하기에 앞서
.py 와 chromedriver.exe가 있는 폴더의 주소를 알아내야합니다.
폴더에 들어간 후 폴더 이름 위에 오른쪽 마우스를 클릭하시고 주소 복사를 눌러줍니다.
그리고 cmd(명령프롬프트)를 실행합니다.
주소복사한 곳으로 이동하기 위해서
cd "복사한 주소 붙여넣기(ctrl+v)"
엔터를 누르시면 이동이 됩니다.
파이썬 파일을 열어봅시다.
python "파일이름".py
입력하고 엔터를 누릅니다.
그럼 어쩌구저쩌구 하면서
Chrome이 자동화된 테스트 소프트웨어에 의해 제어되고 있습니다. 문자가 보이면서 사이트가 열렸습니다!
혹시 빈화면이다? 그럼 새로고침 한 번 눌러보세요!
창 잘 켜지는지 확인 완료!!
자... 이제 원하는 답변을 가져옵시다.
그런데...
어라라?^^
제가 망각한게 있었습니다.
항상 자동로그인이 된 상태에서 chat-gpt를 써서 그런지 로그인을 해야한다는 자체를 까먹었습니다...
아주 가볍게 chat-gpt 질문하고 답변하면 되잖아?라고 SELENIUM을 가볍게 보았습니다...
자 그래서
자동 로그인부터 CHAT-GPT에게 질문하기까지가 제 2번째 파트입니다ㅠ
Google, Microsoft Account, Apple 계정을 이용하는 것이 아닌
기존 로그인 방식을 했을 때의 코드입니다!
일단 코드를 설명하고 전체 코드를 보여드리겠습니다.
from selenium import webdriver
from selenium .webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
첫 번째 줄은, selenium을 이용해 webdriver를 사용할 것입니다.
두 번째 줄은, 새 창이 열리고 튕기는 것을 방지하기 위한 코드입니다.
세 번째 줄은, 원하는 답을 입력하거나 엔터키를 누를 때 필요한 코드입니다.
네 번째 줄은, 셀레늄 문법이 바뀌어서 find_element_by_name을 사용하지 못합니다. 그래서
새로운 문법인 find_element(By.NAME, ' ')을 사용하기 위해 필요한 코드입니다.
다섯 번째 줄은, 로딩이 되기까지 기다리는 시간이 필요하기에 넣어주었습니다.
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
brower = webdriver.Chrome(options=chrome_options)
# 웹 드라이버 경로 설정
webdriver_path = 'C:\\Users\\user\\Desktop\\selenium-macro' # 다운로드한 웹 드라이버의 경로로 바꾸세요
# 셀레늄으로 웹 드라이버 실행
driver = webdriver.Chrome(webdriver_path)
# Chat GPT가 있는 웹 페이지 열기
driver.get('https://chat.openai.com/') # Chat GPT가 있는 웹 페이지의 URL로 바꾸세요
여기서 중요한 포인트는 웹 드라이버 경로 설정입니다.
위에서 창 열리는 지 확인하는 파트에서는 없었지만, 웹 드라이버 경로 설정할 때, .py와 chromedriver.exe 있는 폴더의 경로를 설정해주셔야합니다.
이 때, 위에서 폴더의 위치를 확인할 때 주소 복사를 눌렀지만, 여기서는 "주소를 텍스트로 복사"를 해주셔야합니다.
또한, 붙여넣기를 하고나면 역슬래시(\)가 한번밖에 안나올텐데 한번 더 써주셔야합니다.
역슬래시 두번!!! 기억하세요!!!
login_button = driver.find_element(By.XPATH, '//*[@id="__next"]/div[1]/div[1]/div[4]/button[1]/div')
login_button.click()
time.sleep(5)
# 로그인에 필요한 사용자 정보를 입력합니다.
email_input = driver.find_element(By.XPATH, '/html/body/div/main/section/div/div/div/div[1]/div/form/div[1]/div/div/div/input')
email_input.send_keys('본인의 이메일 주소') # 본인의 이메일 주소를 입력해주세요.
time.sleep(5)
continue_button = driver.find_element(By.XPATH, '/html/body/div/main/section/div/div/div/div[1]/div/form/div[2]/button')
continue_button.click()
time.sleep(5)
password_input = driver.find_element(By.XPATH, '//*[@id="password"]')
password_input.send_keys('본인의 비밀번호') # 본인의 비밀번호를 입력해주세요.
time.sleep(5)
continue2_button = driver.find_element(By.XPATH, '/html/body/div/main/section/div/div/div/form/div[3]/button')
continue2_button.click()
time.sleep(20)
생각치도 못했던 자동로그인 파트입니다!
여기서는 이메일 주소, 비밀번호만 변경해주시면 됩니다!
find_element를 제가 하나하나 다 찾는데 시간이 더 오래걸린 것 같네요 ㅎ
그리고 time.sleep(숫자) 여기에서는 숫자를 자기 취향껏 바꿔주시면 됩니다!
빨리빨리 넘기고 싶다면 낮은 숫자를...
하지만 비추천입니다...ㅎㅎ
# 사용자 입력 전송
user_input = "안녕"
input_box = driver.find_element(By.ID, 'prompt-textarea') # 사용자 입력 필드 선택
input_box.send_keys(user_input)
input_box.send_keys(Keys.RETURN) # 엔터 키 입력
# 답변 가져오기
time.sleep(20) # 적절한 대기 시간을 설정하여 페이지가 완전히 로드될 때까지 기다립니다.
answer_element = driver.find_element(By.XPATH,'//*[@id="__next"]/div[2]/div/div/main/div[2]/div/div/div/div[2]/div/div[2]/div[1]/div/div') # 답변이 표시되는 요소 선택
answer = answer_element.text
time.sleep(10)
# 출력
print("질문:", user_input)
print("답변:", answer)
# 셀레늄 종료
driver.quit()
이제 마지막 Chat-GPT에게 원하는 말을 하고 답변을 받아오는 파트입니다!
여기서는 user_input = "원하는 질문" 에서 원하는 질문 부분만 바꿔주시면 됩니다!
그럼 시간이 지난 후 답변을 받고 cmd에서 답변을 출력하게 됩니다.
자 전체 코드입니다!
from selenium import webdriver
from selenium .webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import time
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
brower = webdriver.Chrome(options=chrome_options)
# 웹 드라이버 경로 설정
webdriver_path = 'C:\\Users\\user\\Desktop\\selenium-macro' # 다운로드한 웹 드라이버의 경로로 바꾸세요
# 셀레늄으로 웹 드라이버 실행
driver = webdriver.Chrome(webdriver_path)
# Chat GPT가 있는 웹 페이지 열기
driver.get('https://chat.openai.com/') # Chat GPT가 있는 웹 페이지의 URL로 바꾸세요
login_button = driver.find_element(By.XPATH, '//*[@id="__next"]/div[1]/div[1]/div[4]/button[1]/div')
login_button.click()
time.sleep(5)
# 로그인에 필요한 사용자 정보를 입력합니다.
email_input = driver.find_element(By.XPATH, '/html/body/div/main/section/div/div/div/div[1]/div/form/div[1]/div/div/div/input')
email_input.send_keys('이메일 주소') # 본인의 이메일 주소를 입력해주세요.
time.sleep(5)
continue_button = driver.find_element(By.XPATH, '/html/body/div/main/section/div/div/div/div[1]/div/form/div[2]/button')
continue_button.click()
time.sleep(5)
password_input = driver.find_element(By.XPATH, '//*[@id="password"]')
password_input.send_keys('비밀번호') # 본인의 비밀번호를 입력해주세요.
time.sleep(5)
continue2_button = driver.find_element(By.XPATH, '/html/body/div/main/section/div/div/div/form/div[3]/button')
continue2_button.click()
time.sleep(20)
# 사용자 입력 전송
user_input = "원하는 질문"
input_box = driver.find_element(By.ID, 'prompt-textarea') # 사용자 입력 필드 선택
input_box.send_keys(user_input)
input_box.send_keys(Keys.RETURN) # 엔터 키 입력
# 답변 가져오기
time.sleep(20) # 적절한 대기 시간을 설정하여 페이지가 완전히 로드될 때까지 기다립니다.
answer_element = driver.find_element(By.XPATH,'//*[@id="__next"]/div[2]/div/div/main/div[2]/div/div/div/div[2]/div/div[2]/div[1]/div/div') # 답변이 표시되는 요소 선택
answer = answer_element.text
time.sleep(10)
# 출력
print("질문:", user_input)
print("답변:", answer)
# 셀레늄 종료
driver.quit()
한번 돌려보겠습니다!!
짜잔-👍
분명 질문 프롬프트에 안녕이라고 작성했는데...
답변이 이상하다고요?
아니면 중간에 사람인지 확인하십시오가 뜨면서 갑자기 창이 닫힌다고요?
네 맞습니다. 캡챠때문입니다...
캡챠(CAPTCHA)는 기계는 인식할 수 없으나 사람은 쉽게 인식할 수 있는 텍스트, 이미지를 통해 사람과 기계를 구별하는 프로그램입니다.
게시글을 "꼼꼼하게" 보셨다면, 창이 열리는지 테스트하는 부분에서 사람인지 확인하십시오.가 있습니다 ㅎㅎ
위 코드에서
.click() .send_keys()
이거를 썼을 때, '매크로를 돌리는구나' '사람이 컨트롤하는게 아니구나'를 파악해버려서
창을 제대로 안열여줍니다.
아니면 서버 문제일 수도 있는데, 저는 캡챠 문제라고 생각합니다.
그래서 저는 2탄에서
캡챠 우회하는 방법과
한 질문이 아닌 여러 질문하기와
답변 중 원하는 부분만 가져오기를
가져오도록 하겠습니다 ㅎ
읽어주셔서 감사합니다!
'어플리케이션' 카테고리의 다른 글
(최신버전) Firebase와 Android Studio 연동하여 로그인, 회원가입 어플 만들기! 🚀 (3) | 2023.11.14 |
---|