정화 코딩
[AI] GPT-4o fine-tuning하여 자기소개서 첨삭 모델 만들기 본문
프로젝트 소개
우리 팀 찹쌀떡은 졸업 프로젝트에서 "취업 준비자를 위해 LLM을 이용하여 자기소개서를 분석하고 예상 질문을 제공하는 면접 시뮬레이션 서비스"를 만들고자 한다. 가장 대표적인 대규모 언어 모델(LLM) 중 하나인 GPT를 사용하기로 결정했다. 잡코리아와 사람인 등에서 제공하는 합격 자기소개서를 데이터셋으로 활용하여 GPT-4o를 파인튜닝하고, 추가적인 프롬프트 엔지니어링을 통해 사용자가 작성한 자기소개서에 대해 구체적이고 실질적인 첨삭 및 피드백을 제공할 수 있도록 한다. 면접 예상 질문 생성 시에는 검색 기반 AI인 Perplexity를 활용해 기업 관련 정보를 수집한 뒤, 이를 기반으로 GPT-4o를 통해 질문을 생성하고자 한다.
https://github.com/Chapssal-tteok/capstone-project
크롤링을 통해 데이터셋 준비하기
https://platform.openai.com/docs/guides/fine-tuning
GPT를 파인튜닝 하기 위해서는 이런 형태로 데이터셋을 준비하면 된다. system은 모델의 성격이나 행동 방식을 정의한다. user는 사용자가 모델에게 하는 질문 또는 요청을 나타낸다. assistant는 AI가 사용자의 요청에 따라 응답하는 부분이다.
데이터셋 형태뿐만 아니라 전반적인 과정에 대한 설명도 잘 나와있으니 공식 문서를 적극 활용하자.
먼저 잡코리아 크롤링을 해보겠다. 사이트에서 개발자 도구를 열어 이렇게 크롤링하고 싶은 요소를 찾아 XPath를 복사한다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# WebDriver의 경로 설정
driver_path = "C:\\Users\\ShinJunghwa\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"
service = Service(executable_path=driver_path)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)
# 웹페이지 열기
driver.get("https://www.jobkorea.co.kr/starter/PassAssay/View/242124?Page=1&OrderBy=0&FavorCo_Stat=0&Pass_An_Stat=0")
# 웹페이지에서 요소 찾기
element = driver.find_element(By.XPATH, '//*[@id="container"]/div[2]/div[1]/div[1]/h2/strong/a')
print('element', element.text)
# 웹페이지 닫기
driver.quit()
Selenium을 이용한 크롤링 스켈레톤 코드이다. WebDriver의 경로, 웹페이지 링크, 크롤링 하고자 하는 요소의 XPath 등을 알맞게 넣어주고 실행시키면 된다. 그러면 아까 복사해서 넣은 XPath로 크롤링하려는 요소를 찾고 그 요소의 텍스트를 추출하여 출력한다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# WebDriver의 경로 설정
driver_path = "C:\\Users\\ShinJunghwa\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"
service = Service(executable_path=driver_path)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)
# 로그인 페이지 열기
driver.get("https://www.jobkorea.co.kr/Login")
# 로그인 정보 입력
username = {YourID} # 잡코리아 아이디 입력
password = {YourPW} # 잡코리아 비밀번호 입력
# 아이디 입력 필드 찾기 및 입력
id_field = driver.find_element(By.ID, "M_ID")
id_field.send_keys(username)
# 비밀번호 입력 필드 찾기 및 입력
pw_field = driver.find_element(By.ID, "M_PWD")
pw_field.send_keys(password)
# 로그인 버튼 클릭
login_button = driver.find_element(By.XPATH, '//*[@id="login-form"]/fieldset/section[3]/button')
login_button.click()
# 로그인 완료 대기 (필요에 따라 조정)
time.sleep(3)
# 웹페이지 열기
driver.get("https://www.jobkorea.co.kr/starter/PassAssay/View/242124?Page=1&OrderBy=0&FavorCo_Stat=0&Pass_An_Stat=0")
# 웹페이지에서 요소 찾기
company = driver.find_element(By.XPATH, '//*[@id="container"]/div[2]/div[1]/div[1]/h2/strong/a').text
part = driver.find_element(By.XPATH, '//*[@id="container"]/div[2]/div[1]/div[1]/h2/em').text
print(company)
print(part)
idx = 1
while True:
try:
q = driver.find_element(By.XPATH, f'//*[@id="container"]/div[2]/div[2]/dl/dt[{idx}]/button/span[2]').text
a = driver.find_element(By.XPATH, f'//*[@id="container"]/div[2]/div[2]/dl/dd[{idx}]/div').text
print(f'Q{idx}.')
print(q)
print(f'A{idx}.')
print(a)
idx += 1
except NoSuchElementException:
break
# 웹페이지 닫기
driver.quit()
잡코리아의 경우, 특정 스크롤 이후부터는 로그인을 해야 조회가 가능하다. 따라서 로그인을 진행하는 코드를 앞부분에 추가해주어 모든 질문에 대한 답을 가져오도록 수정하였다.
그러나 이렇게 실행해보면 질문들은 전부 잘 크롤링되는데, 세번째 답변부터는 제대로 크롤링이 안되는 모습이다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# WebDriver의 경로 설정
driver_path = "C:\\Users\\ShinJunghwa\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"
service = Service(executable_path=driver_path)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)
# 로그인 페이지 열기
driver.get("https://www.jobkorea.co.kr/Login")
# 로그인 정보 입력
username = "jungh150" # 잡코리아 아이디 입력
password = "jungh051248!" # 잡코리아 비밀번호 입력
# 아이디 입력 필드 찾기 및 입력
id_field = driver.find_element(By.ID, "M_ID")
id_field.send_keys(username)
# 비밀번호 입력 필드 찾기 및 입력
pw_field = driver.find_element(By.ID, "M_PWD")
pw_field.send_keys(password)
# 로그인 버튼 클릭
login_button = driver.find_element(By.XPATH, '//*[@id="login-form"]/fieldset/section[3]/button')
login_button.click()
# 로그인 완료 대기 (필요에 따라 조정)
time.sleep(3)
# 웹페이지 열기
driver.get("https://www.jobkorea.co.kr/starter/PassAssay/View/242124?Page=1&OrderBy=0&FavorCo_Stat=0&Pass_An_Stat=0")
# 버튼 클릭 (답변들이 전부 보이게)
idx = 3
while True:
try:
btn = driver.find_element(By.XPATH, f'//*[@id="container"]/div[2]/div[2]/dl/dt[{idx}]/button')
btn.click()
idx += 1
except NoSuchElementException:
break
# 웹페이지에서 요소 찾기
company = driver.find_element(By.XPATH, '//*[@id="container"]/div[2]/div[1]/div[1]/h2/strong/a').text
part = driver.find_element(By.XPATH, '//*[@id="container"]/div[2]/div[1]/div[1]/h2/em').text
print(company)
print(part)
idx = 1
while True:
try:
q = driver.find_element(By.XPATH, f'//*[@id="container"]/div[2]/div[2]/dl/dt[{idx}]/button/span[2]').text
a = driver.find_element(By.XPATH, f'//*[@id="container"]/div[2]/div[2]/dl/dd[{idx}]/div').text
print(f'Q{idx}.')
print(q)
print(f'A{idx}.')
print(a)
idx += 1
except NoSuchElementException:
break
# 웹페이지 닫기
driver.quit()
찾아보니 잡코리아는 세번째 답변부터는 질문을 클릭해야 그에 대한 답변이 펼쳐지면서 보이는 형태이다. 하지만 Selenium의 text 속성은 요소가 화면에 표시되는 경우에만 값을 반환한다. 따라서 해당 요소가 화면에 보이지 않거나 숨겨져 있는 경우에는 해당 요소가 화면에 표시되도록 스크롤하거나 클릭하여 확장한 후 크롤링 해야한다. 모든 답변이 보이도록 크롤링 전에 3번 이후의 모든 질문들을 한번씩 클릭하도록 수정하였다. 이렇게 실행하면 모든 답변에 대한 크롤링이 잘 이루어지는 모습을 볼 수 있다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
import time
import json
import jsonlines
# WebDriver의 경로 설정
driver_path = "C:\\Users\\ShinJunghwa\\Downloads\\chromedriver-win64\\chromedriver-win64\\chromedriver.exe"
service = Service(executable_path=driver_path)
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(service=service, options=options)
# 로그인 페이지 열기
driver.get("https://www.jobkorea.co.kr/Login")
# 로그인 정보 입력
username = "jungh150" # 잡코리아 아이디 입력
password = "jungh051248!" # 잡코리아 비밀번호 입력
# 아이디 입력 필드 찾기 및 입력
id_field = driver.find_element(By.ID, "M_ID")
id_field.send_keys(username)
# 비밀번호 입력 필드 찾기 및 입력
pw_field = driver.find_element(By.ID, "M_PWD")
pw_field.send_keys(password)
# 로그인 버튼 클릭
login_button = driver.find_element(By.XPATH, '//*[@id="login-form"]/fieldset/section[3]/button')
login_button.click()
# 로그인 완료 대기 (필요에 따라 조정)
time.sleep(3)
# 웹페이지 열기
driver.get("https://www.jobkorea.co.kr/starter/PassAssay/View/242124?Page=1&OrderBy=0&FavorCo_Stat=0&Pass_An_Stat=0")
# 버튼 클릭 (답변들이 전부 보이게)
idx = 3
while True:
try:
btn = driver.find_element(By.XPATH, f'//*[@id="container"]/div[2]/div[2]/dl/dt[{idx}]/button')
btn.click()
idx += 1
except NoSuchElementException:
break
# 웹페이지에서 요소 찾기
company = driver.find_element(By.XPATH, '//*[@id="container"]/div[2]/div[1]/div[1]/h2/strong/a').text
part = driver.find_element(By.XPATH, '//*[@id="container"]/div[2]/div[1]/div[1]/h2/em').text
print(company)
print(part)
idx = 1
while True:
try:
question = driver.find_element(By.XPATH, f'//*[@id="container"]/div[2]/div[2]/dl/dt[{idx}]/button/span[2]').text
answer = driver.find_element(By.XPATH, f'//*[@id="container"]/div[2]/div[2]/dl/dd[{idx}]/div').text
print(f'Q{idx}.')
print(question)
print(f'A{idx}.')
print(answer)
idx += 1
new_message = {
"messages": [
{
"role": "system",
"content": f"당신은 {company}의 {part} 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."
},
{
"role": "user",
"content": f"질문: [{question}] 답변: [지원자의 답변]"
},
{
"role": "assistant",
"content": f"모범 답변: [{answer}]"
}
]
}
# 'dataset.jsonl' 파일에 새로운 메시지 추가
with jsonlines.open('dataset.jsonl', mode='a') as writer:
writer.write(new_message)
except NoSuchElementException:
break
# 웹페이지 닫기
driver.quit()
크롤링으로 읽은 데이터들을 잘 정리하여 dataset.json 파일에 쌓이도록 수정해주었다.
이렇게 잘 저장되는 것을 볼 수 있다.
데이터셋 가공하기
GPT-4o가 자기소개서를 첨삭할 수 있도록 파인튜닝하기 위해서는 데이터셋 구조가 다음과 같아야 한다.
1. 전체 구조
- messages: 메시지 배열로 구성되어 있으며, 시스템의 역할 설정과 사용자 질문 및 답변을 포함합니다.
2. 메시지 배열 (messages)
- 각 메시지는 다음과 같은 키-값 쌍으로 구성됩니다:
- role: 메시지를 작성한 역할을 나타냄 (system, user, assistant 중 하나).
- content: 메시지 내용. 문항, 답변, 또는 피드백 텍스트를 포함.
3. system 메시지
- 데이터의 문맥 설정과 역할을 설명.
{"role": "system", "content": "당신은 현대캐피탈의 2023년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}
4. user 메시지
- 사용자가 입력한 질문(자기소개서 문항) 및 답변.
- 주요 구성:
- 질문: 자기소개서의 문항.
- 답변: 지원자가 작성한 자기소개서 답변.
{
"role": "user",
"content": "질문: [가치관이 다른 구성원들과 협업했던 과정에서 본인의 역할은 무엇이었는지, 그 경험을 통해 어떤 역량이 향상되었는지 기술해 주십시오.] 답변: [SSAFY에서 프로젝트를 진행하면서 팀원과 보안에 대한 관점이 달랐던 경험이 있습니다. 저는 사소한 부분까지 보안을 고려해야 한다고 생각했지만, 팀원은 복잡성이 증가한다고 반대했습니다...]"
}
5. assistant 메시지
- 시스템이 제공한 피드백(첨삭된 모범 답변).
- 주요 구성:
- 피드백: 답변에 대한 수정 및 보완 사항, 또는 모범 답변 제시.
{
"role": "assistant",
"content": "모범 답변: [SSAFY에서 프로젝트를 진행하던 도중 어느 정도까지 보안을 고려해야 하는지에 대한 가치관이 팀원과 달랐던 적이 있습니다...]"
}
{"messages": [{"role": "system", "content": "당신은 금융결제원의 2022년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [금융결제원 지원 동기(금융결제원이 본인을 채용해야 하는 이유) ※ 작성 내용에 본인의 성명, 출생지, 성장지, 출신 학교(동아리명, 대회명, 교수명 등), 가족관계 등 인적 사항을 확인할 수 있는 사항이나 허위사실이 포함될 경우 불이익이 있습니다. (예시 : 일체의 인명 작성 금지(위인, 유명인, 작가 등 포함) / 구체적 동아리명 → OO 관련 동아리 / 구체적 회사, 부서명 -> ○○회사에서 ○○업무를 할 당시 / 지원자가 특정되는 논문 제목, 대회 및 링크 언급 금지 / 미국 학창 시절, 프랑스 교환학생 -> 해외 학창 시절, 외국 교환학생)] 답변: [금융결제원에 입사하고 싶습니다.\n\n금융결제원은 금융과 관련된 여러 업무를 다루는 중요한 곳으로 알고 있습니다.\n저는 평소에 컴퓨터를 다루는 것을 좋아하고, 특히 웹 개발과 같은 기술에 관심이 많아 금융결제원의 전산직 사무원 모집 공고를 보고 지원하게 되었습니다.\n\n사실 구체적으로 금융결제원에서 어떤 업무를 하게 될지 잘 모르지만, 제가 배워온 여러 기술들을 활용해 기여할 수 있을 것 같다는 생각이 들었습니다.\n학교에서 JSP를 배우고 몇 가지 프로젝트를 진행해본 경험이 있습니다. 이후 Spring이라는 기술도 공부하고 있는데, 학원에 다니면서 조금씩 알아가고 있는 중입니다.\n\n또한, 알고리즘 문제를 푸는 것도 좋아해서 코딩 테스트 준비를 위해 매일 꾸준히 문제를 풀고 있습니다. 앞으로 더 열심히 노력해서 금융결제원의 목표와 가치에 기여할 수 있도록 하겠습니다.]"}, {"role": "assistant", "content": "모범 답변: [\"최고가 되기 위해서\"\n\n금융결제원은 국내 다양한 금융 관련 서비스를 지원하는 최고의 기업입니다.\n\n이런 여러 서비스 운영에 있어 중요한 것은 사용자에게 적절한 UI의 표출, 그리고 효율적인 데이터 처리를 통한 빠른 속도 제공입니다.\n\n저는 이를 배우기 위해 매일 진행 중인 알고리즘 풀이 외에도 기존에 공부했던 JSP에 대해 조금 더 파악하고, spring에 활용하기 전에 배우기 위해 관련 학원에 다니며 공부하였고, 여러 예제를 사용한 Spring 프로젝트를 진행했습니다.\n\n그리고 JPA를 사용하는 여러 방식과 주의점, querydsl 등 많은 부분에의 공부를 해 보았습니다.\n\n백엔드 이외에도 front-end에 활용되는 javascript의 기능 활용을 더 잘 알기 위해, vanilla JS를 사용하여 조금씩 난도를 높여가며 프로젝트를 진행 중입니다.\n\n그렇게 실력을 쌓아 가던 중 운이 좋게도 그동안 제가 공부하였고 앞으로의 진로로 결정하게 된 java spring이 기반이 되는 전산직 사무원을 채용한다는 소식을 들었고, 최고의 기업에서 가장 좋아하는 공부를 할 수 있을 것이라는 기대감을 품고 지원하게 되었습니다.\n글자수 588자\n947Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 금융결제원의 2022년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [금융결제원이 제공하는 서비스를 이용해 본 경험과 느낀 점을 기술하시오.] 답변: [금융결제원이 제공하는 서비스는 여러 가지가 있다고 알고 있습니다. 제가 직접적으로 이용해본 서비스는 많지 않지만, 인터넷지로 서비스에 대해 들어본 적이 있습니다.\n\n인터넷지로는 요금을 납부하거나 조회할 수 있는 서비스라고 알고 있습니다. 저는 한 번쯤 요금을 납부하면서 이 서비스를 이용했던 것 같습니다. 그때 느꼈던 점은 사용법이 복잡하지 않고 편리하다는 것이었습니다.\n\n이 외에도 금융결제원은 금융 관련 시스템을 운영하고 있는 중요한 기관이라는 인상을 받았습니다. 앞으로 이런 서비스를 더 많이 알아가고 싶고, 개발자로 일하면서 이런 서비스를 개선하거나 새로운 기능을 만들어 보고 싶습니다.]"}, {"role": "assistant", "content": "모범 답변: [금융결제원이 제공하는 서비스는 매우 다양하며, 저는 개인적으로 금융공동망과 인터넷지로 서비스를 이용해 본 경험이 있습니다.\n\n금융공동망은 금융기관 간의 자금 이체를 실시간으로 처리하는 시스템으로, 이를 이용하면 다른 은행 계좌로 송금을 하거나 대출금을 상환하는 등의 업무를 편리하게 처리할 수 있습니다. 또한, 금융공동망은 보안성이 매우 높아 안전하게 이용할 수 있습니다.\n\n인터넷지로 서비스는 지로 요금 납부 및 조회 서비스를 제공하는 것으로, 이를 이용하면 지로 요금을 간편하게 납부할 수 있습니다. 또한, 인터넷지로 서비스를 이용하면 납부 내역을 쉽게 조회할 수 있어 편리합니다.\n\n금융결제원이 제공하는 서비스를 이용하면서 느낀 점은, 이들이 매우 편리하고 안전하다는 것입니다. 또한, 금융결제원은 고객들의 편의를 위해 다양한 서비스를 제공하고 있으며, 고객들의 요구에 적극적으로 대응하고 있습니다.\n\n금융결제원이 제공하는 서비스는 금융산업의 발전에 큰 역할을 하고 있으며, 앞으로도 더욱 발전할 것으로 기대됩니다. 그렇기 때문에 이곳에서 개발자로 일하며 다양한 사람을 위한 서비스를 만들 때에 저의 경험과 지식이 도움이 될 수 있을 것이라 생각합니다.\n글자수 600자\n1,037Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 금융결제원의 2022년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [채용공고 상의 수행 직무 및 본인이 희망하는 관심 직무와 관련하여 전문가가 되기 위한 노력(프로젝트 경험 등)을 구체적으로 기술하시오.(프로그램 개발 언어 사용 능력 등 기술적 설명 포함)] 답변: [개인 프로젝트 중 기억에 남는 것은 회원 정보를 가져오는 기능을 구현했던 경험입니다.\n\n제가 해당 프로젝트에서 진행한 내용은 다음과 같습니다.\n\n1. Entity를 DTO로 변환하기 위한 작업\nEntity를 DTO로 변환하는 작업이 필요했는데, 처음에는 변환 과정이 잘 이해되지 않아 기존 코드를 참고하면서 진행했습니다. 여러 시행착오 끝에 변환은 성공적으로 이루어졌습니다.\n\n2. 데이터 페이징 처리\n회원 목록을 페이징 처리하기 위해 JPA의 Page 객체를 사용했는데, 정확한 동작 원리는 잘 이해하지 못한 상태에서 사용했습니다. 결과적으로 페이징 자체는 동작했지만, 최적화가 필요한 부분이 많았던 것 같습니다.\n\n3. 결과\n기능은 작동했지만, 성능 면에서 아쉬운 점이 많았습니다. 이후 더 나은 방법을 찾으려고 노력 중입니다.\n\n아직 부족한 점이 많지만, 앞으로 더 공부하고 프로젝트를 진행하면서 개선해 나가고 싶습니다.]"}, {"role": "assistant", "content": "모범 답변: [\"노력의 발자취\"\n\n개인 프로젝트 중 기억에 남는 것은 member의 id를 통해 이름을 가져오기 위한 fetch join을 사용해 여러 값들을 한꺼번에 가져오는 것이었습니다.\n\n제가 해당 프로젝트에서 진행한 내용은 다음과 같습니다.\n\n1. Entity를 통해 가져온 값을 DTO로 변환하고 mapstruct 사용\nEntity를 DTO로 mapstruct를 사용하여 변경하고 이를 노출하려 했습니다.\n그리고 mapstruct에서의 변환에서 기존의 Page로는 해당 방법이 불가능하다 생각하였습니다.\n그렇게 기존의 Page 형식을 List 형식으로 변환하고 mapstruct를 사용했습니다.\n\n2. List를 사용한 방식 사용 시 카운트 방식\nPage를 사용하면, JPA에서 TotalCount를 진행해 줍니다.\n당시에 이 totalcount를 통해 바로 최대 결과를 가져오는 것이 성능에의 불이익을 줄 수도 있다는 것을 간과하여 Page를 사용하는 것이 더 효율적일 것이라 생각하였습니다.\n\n3. 결과\n최종적으로 해당 문제를 해결하였고, 현재는 이보다 훨씬 정규화되고 효율적인 방법을 사용하는 더 빠른 방법을 도입하고 있습니다.\n\n앞으로도 노력을 통해 더욱 발전하겠습니다.\n글자수 618자\n952Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 금융결제원의 2022년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [조직(예 : 학교, 동아리, 가족 등)의 구성원으로서 갈등이 있었던 상황을 설명하고, 원인, 대처방안, 현재 시점에서의 판단을 구체적으로 기술하시오.] 답변: [4차 산업혁명과 관련된 프로젝트를 진행하면서 팀원들과 갈등이 있었던 경험이 있습니다.\n\n저는 팀장으로서 프로젝트를 이끌게 되었는데, 처음에는 팀원들이 각자 의견을 내지 않아 진행이 어렵다고 느꼈습니다. 아이디어가 명확히 정리되지 않아서 프로젝트의 방향성을 잡는 데 시간이 걸렸습니다.\n\n이를 해결하기 위해 매주 한 번씩 만나 이야기를 나누고 아이디어를 교환해 보려고 했습니다. 하지만 일부 팀원은 여전히 적극적으로 참여하지 않았고, 결국 몇 가지 작업을 제가 주도적으로 맡아 진행해야 했습니다.\n\n결과적으로 프로젝트는 완성되었지만, 진행 과정에서 생긴 갈등이 완전히 해결되지 못한 점이 아쉬웠습니다. 지금 생각해 보면, 팀원들의 상황을 더 이해하려고 노력하고, 각자의 역할을 명확히 나누는 것이 필요했을 것 같습니다. 앞으로는 이러한 점을 개선해 나가고 싶습니다.]"}, {"role": "assistant", "content": "모범 답변: [\"융합이란, IoT란\"\n\n4차 산업혁명이 도래하며 세계는 빠르게 발전하고 있습니다.\n그중 가장 눈에 띄는 것은 바로 기기와 인터넷의 연결, IoT입니다.\n\n저는 백엔드 개발자임과 동시에 전자공학과의 학생으로서 기존의 것에 새로운 아이디어를 합쳐 더 발전된 것을 만들 수 있는 방법을 모색했습니다.\n마침 대학교 4학년이 신청할 수 있는 OOO 프로젝트를 진행하였고, 제가 만든 아이디어를 바탕으로 저는 팀장이 되어 저를 포함한 4인의 학생과 1인의 현업 개발자를 모집하였습니다.\n\n처음 프로젝트를 진행할 때에는 아직 아이디어가 구체화되지 않고, 서로의 생각이 정리되지 않아 진행에 어려움이 있었습니다.\n이를 해결하기 위해 저희는 매주 1회 정기 세션으로 브레인스토밍과 에자일 회의를 진행하며 의견과 상황을 교환하였습니다.\n\n이 결과, 저희는 서로의 상황을 잘 이해하고 도움을 주는 법을 알았고, 특허를 출원하는 등의 성과 외에도 새로운 아이디어를 생각해 내고, 이를 구현하기 위해 노력하는 방법을 배웠습니다.\n\n저는 이 경험을 토대로 언제나 새로운 방법을 생각하고, 이를 구현할 수 있는 사람이 될 수 있었다 생각합니다.\n글자수 583자\n982Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 금융결제원의 2022년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [자신의 가치관 또는 인생관에 영향을 미친 경험을 소개하고, 이를 통해 배우거나 느낀 점을 구체적으로 기술하시오.] 답변: [저는 고등학생 시절에 취약계층 어린이에게 피아노를 가르치는 봉사활동을 한 경험이 있습니다.\n\n처음에는 아이에게 곡 하나를 완성하도록 가르쳐 주는 것이 목표였습니다. 하지만 제가 가르치는 방식에 문제가 있었는지, 아이가 종종 약속에 늦거나 아예 오지 않는 일이 발생했습니다. 그래서 저는 그냥 아이가 관심이 없다고 생각하고 그저 주어진 봉사 시간을 채우는 데만 집중했습니다.\n\n그 후로도 아이와의 관계는 크게 나아지지 않았고, 결국 곡을 완성하지 못한 채 봉사활동이 끝났습니다. 지금 생각해 보면, 제가 먼저 아이와 소통하며 그 아이의 입장을 이해하려는 노력이 부족했다는 것을 깨닫게 되었습니다. 앞으로는 상대방과 소통을 더 중요시하고 관계를 쌓는 데 더 신경 써야겠다고 느꼈습니다.]"}, {"role": "assistant", "content": "모범 답변: [\"앞서, 소통하며\"\n\n저는 지금까지 친구들과 버스킹을 하거나, 농구 대회를 나가고, OOO을 통해 프로젝트를 하는 등 다양한 사람들과 많은 활동을 하였습니다.\n\n그중, 고등학생 나이대의 근처 취약계층 어린이에게 피아노를 가르쳐 주는 봉사활동을 했던 적이 있습니다.\n음악을 제대로 배운 적이 없는 아이에게 한 가지의 곡을 완성시키는 것을 도와주는 것이었는데, 배우는 아이도 저도 어렸을 때였기 때문에 처음부터 쉽게 되지는 않았습니다.\n\n저는 단순히 아이에게 음악을 가르쳐서 곡을 완성시키려고 했기 때문에 그 학생과의 소통을 중요시하지 않았고, 그 결과로 학생이 약속에 늦거나 오지 않는 일이 많았습니다.\n그와 관련해 주변 어른들에게 상담하였더니, 그 아이와 비슷한 나이대의 사람으로서, 그리고 공감을 해 줄 수 있는 선생으로서 도움을 주는 것이 선행되어야 한다는 것을 깨달을 수 있었습니다.\n\n이후 그 아이와 봉사시간 이후로도 자주 만나며 관계를 쌓았고, 완성하고자 했던 곡을 다 가르칠 수 있었으며, 최근에도 연락을 계속하는 좋은 친구로 남을 수 있었습니다.\n\n이를 통해 저는 누군가와 함께할 때에 먼저 소통을 통해 서로 알아가는 것이 중요하다는 것을 깨닫게 되었습니다.\n글자수 611자\n1,039Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 금융결제원의 2022년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [(선택) 빅데이터 관련 역량을 개발하기 위해 수행한 노력을 본인의 경험 및 경력을 기반으로 기술하시오. (빅데이터 관련 직무 또는 학습경험이 있는 자에 한하며, 면접 시 참고 예정)] 답변: [저는 회사에서 일하면서 빅데이터와 관련된 프로젝트에 참여한 적이 있습니다.\n\n프로젝트에서 GraphDB라는 것을 처음 알게 되었고, 그중 neo4j를 사용해 보았습니다. 기존의 RDB와는 다르게 데이터를 다루는 방식이 독특했지만, 처음에는 이해하기가 어려웠습니다. 그래서 인터넷에서 자료를 찾아보며 공부했고, 간단한 예제를 따라 해 보았습니다.\n\n이 경험을 통해 GraphDB가 연관 데이터를 다루는 데 유용하다는 점을 알게 되었습니다. 하지만 실제로 프로젝트에 어떻게 적용해야 할지는 충분히 알지 못해 아쉬움이 남습니다. 앞으로 이런 기술들을 더 잘 이해하고 활용할 수 있도록 노력해야겠다고 생각합니다.]"}, {"role": "assistant", "content": "모범 답변: [\"GraphDB\"\n\n회사를 재직하며 여러 고객을 위해 맞춤형 정보를 제공하는 프로젝트를 신입으로 참가하여 관련 DB 공부를 해 보았습니다\n해당 DB는 NoSql의 일종인 GraphDB로서 neo4j를 사용하였습니다.\n\n이를 통해 기존 RDB에 비해 여러 연관된 데이터를 찾아갈 때 장점을 가지는 GraphDB의 특성과 활용법 등에 대해 알 수 있었습니다.\n\n해당 내용은 제가 개인적으로 원서를 통해 공부하고, 회사의 데이터를 통해 익힌 후 블로그에 게시해 보았습니다.\n\n그 덕분에 다양한 데이터를 안전하게 보관할 수 있는 RDB 외에도 여러 가지 방법을 사용하여 데이터를 처리할 수 있다는 것을 알았습니다.\n\n금융결제원은 다양한 고객의 정보와 관련 데이터를 보관하고, 이를 잘 활용할 수 있도록 해줍니다.\n그렇기 때문에 이 데이터 간의 관계와 활용을 고려하여 빅데이터를 사용할 것입니다.\n\n그때에 저의 RDB에의 경험 외에 GraphDB를 배워 온 경험은 큰 도움이 될 수 있을 것이라 생각합니다.\n글자수 516자\n832Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 현대오토에버㈜의 2021년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [현대오토에버의 해당 직무에 지원한 이유와 앞으로 현대오토에버에서 키워 나갈 커리어 계획을 작성해 주시기 바랍니다. (최소 500자, 최대 1,000자 입력 가능)] 답변: [IT 산업이 발전하고 있는 요즘, 저도 이 분야에서 일하고 싶다는 생각을 하게 되어 현대오토에버에 지원했습니다.\n\n저는 대학에서 전자공학을 전공하며 스마트폰과 도어락을 연결하는 프로젝트에 참여한 적이 있습니다. 당시 웹 페이지와 어플리케이션 제작을 담당했는데, 기술을 융합하는 과정이 흥미로웠습니다. 이후로 백엔드 개발에 관심을 가지게 되었고, 효율적인 프로그램을 만드는 개발자가 되고 싶다고 생각하게 되었습니다.\n\n현재 저는 여러 가지 프로젝트를 진행하며 백엔드 기술을 공부하고 있습니다. 프로젝트를 통해 다양한 환경에 적응하는 방법을 배우고 있으며, 현대오토에버에 입사하면 이러한 경험을 살려 더 많은 것을 배우고 싶습니다.\n\n앞으로 더 많은 기술을 배우고 협업 경험을 쌓아 현대오토에버에서 성장해 나가고 싶습니다.]"}, {"role": "assistant", "content": "모범 답변: [\"최고가 되기 위해서\"\n\n현재 IT 산업은 이전에 비해 눈부시게 발전하고 있습니다.\n또, 하드웨어와 소프트웨어 기술을 융합하여 기존보다 발전된 생활을 누릴 수 있게 해 주고 있습니다.\n\n저는 전자공학도로서 이전에 스마트폰과 도어락을 연결하여 기존보다 편의성과 보안성을 향상시킨 기술을 고안하여 여러 학생들, 그리고 멘토와 함께 프로젝트를 진행했던 적이 있었습니다.\n그때에 저는 웹 페이지 제작과 어플리케이션 제작 전체 내용을 담당하였는데, 이를 통해 융합 IoT 기술의 중요성을 알게 되었습니다.\n또한 새로운 기술들을 적용하고 원래 있던 기술들을 더하여 이전보다 발전되고 편리한 방법을 찾아 나간다는 것이 얼마나 재미있고 보람 있는 일인지 느꼈습니다.\n\n그리고 이 활동을 통해 저는 앞으로의 커리어에 대한 목표를 세울 수 있게 되었습니다.\n백엔드를 사용하며 구현한 API는 ICT와 APP 모든 곳에서 활용될 수 있는 것이었고, 그렇기 때문에 가장 기초적이고 중요한 분야라고 생각하였습니다.\n그렇기에 저는 최고의 백엔드 개발자가 되어 효율적이고 효과적인 프로그램을 만들고 싶어졌습니다.\n\n또한 이전까지 좁은 식견을 갖고 있던 저에게 다양한 개발법과 협업 방법을 알려 주었던 멘토님처럼, 제가 알고 있는 것들을 다른 사람에게 공유하며 그들과 함께 더욱 발전해 나가고 싶습니다.\n\n이를 위해 많은 언어를 배우고 많은 환경에 적응하며 다양한 것을 적용할 수 있는 사람이 되기 위해 혼자, 친구와 함께 프로젝트를 진행 중에 있습니다.\n\n이러한 노력은 최고의 java backend 개발자가 되기 위해 현재까지 계속해서 진행하고 있으며, 앞으로 현대오토에버에 근무하며 지금까지 공부한 지식 위에 더 많은 것들을 쌓을 것입니다.\n그리고 이렇게 쌓은 지식을 바탕으로 더 많은 사람과 교류하며 많은 것을 볼 수 있게 되고, 많은 사람과 함께할 수 있는 개발자가 되어 나가겠습니다.\n글자수 950자\n1,605Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 현대오토에버㈜의 2021년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [지원 직무와 관련하여 어떠한 역량을(지식/기술 등) 강점으로 가지고 있는지, 그 역량을 갖추기 위해 무슨 노력과 경험을 했는지 구체적으로 작성해 주시기 바랍니다. (학내외 활동/프로젝트/교육 이수 과정 등 본인의 경험을 기반으로 작성해 주시기 바랍니다.) (최소 500자, 최대 1,500자 입력 가능)] 답변: [저는 Java를 처음으로 공부하면서 개발자가 되고 싶다는 생각을 하게 되었습니다. 현재는 매일 알고리즘 문제를 풀며 컴퓨터 사고 능력을 키우고 있습니다.\n\nJava를 공부하면서 JSP와 Spring에도 관심을 가지게 되어 학원에서 공부를 시작했고, 간단한 예제를 따라 하며 Spring 프로젝트도 진행해 보았습니다. 이 과정에서 백엔드 개발의 기초적인 개념을 익힐 수 있었습니다.\n\n프론트엔드에도 관심이 있어 JavaScript를 공부했고, 간단한 기능 구현을 위해 Vanilla JS로 프로젝트를 시도해 보았습니다. 또한, 데이터베이스 사용법을 배우기 위해 온라인 문제 풀이 사이트에서 MySQL과 MS-SQL을 사용해 보았으며, 회사에서는 Oracle을 사용하며 경험을 쌓았습니다.\n\n이 외에도 Kotlin, C, C++ 등 다양한 언어를 간단히 공부해 보았으며, 각 언어의 특징을 이해하려고 노력했습니다. 최근에는 스프링 부트를 공부하며 JPA와 Spring Security를 활용한 웹 프로젝트를 진행하고 있습니다.\n\n이런 다양한 경험이 저의 역량을 키우는 데 도움이 되었다고 생각합니다. 하지만 아직 배워야 할 것이 많으며, 현대오토에버에서 더 많은 경험을 쌓고 싶습니다.]"}, {"role": "assistant", "content": "모범 답변: [\"All For One\"\n\n저는 java 개발자가 되기 위해서 자바 언어를 가장 처음으로 공부하였고, 지금도 매일 알고리즘 풀이를 병행하며 컴퓨터 사고를 기르기 위해 노력하고 있습니다.\n기존에 공부했던 JSP에 대해 조금 더 파악하고, spring에 활용하기 전에 배우기 위해 IT OO 학원에 다니며 공부하였고, 여러 예제를 사용한 Spring 프로젝트를 진행했습니다.\n\n백엔드 이외에도 front-end에 활용되는 javascript의 기능 활용을 더 잘 알기 위해, 또 JQuery보다는 document에서의 element 활용이나 변수의 사용법을 확실히 알기 위해 vanilla JS를 사용하여 조금씩 난도를 높여가며 프로젝트를 진행 중입니다.\n\n백엔드의 데이터 활용에 필수적인 DB 사용법을 알기 위해, OOOOOO라는 사이트에서 MySql을 사용하여 모든 문제를 해결하였고, OOOOOO 사이트에 존재하는 MS-Sql 프로시저와 쿼리로 이루어진 다양한 데이터들을 가공하고, 편집하여 보았습니다.\n현재는 OOOOOOOOOOOO 회사에 재직하며 Oracle을 사용 중이며, 여러 Toy Project를 MySql, MS-SQL, Oracle 모든 DB를 사용하여 시도해 보았습니다.\n\n또한 현재 자바 이외에도 여러 분야에서 다양한 스크립트 언어가 사용되고 있으며 이와 java의 차이점을 알고, 장단점을 파악해 적절하게 사용하기 위하여 kotlin을 통한 어플리케이션 제작, C언어를 사용한 리눅스 보드 제어, C++ 언어로 디지털 필터 구현, PHP 웹 게시판 제작 등 많은 활동을 하였습니다.\n이러한 경험들 덕분에 저는 각각의 언어에 장단점이 명확히 존재하며, 사용자 또한 명확한 목적을 갖고 언어를 사용한다면 더욱 효율적인 언어의 사용이 가능하다는 것을 알았습니다.\n\n그리고 back-end와 front-end 간의 기능 부여와 통신을 공부하였습니다.\najax를 사용하여 페이징과 글 순서 변경, 강의 전달 등을 구현하였으며, 이 과정에서 보안 취약 문제 해결 방안들과 속도 개선 등에 대해 알 수 있었습니다.\n\n개인적으로는 현재 스프링 부트를 사용하는 웹 페이지 제작법을 공부하고 있는데, 해당 프로젝트는 spring security를 이용한 여러 보안 처리, JPA의 N+1문제 해결 방법, MVC 패턴의 효율적 사용이나 클린 코드 작성 등 제가 가진 지식을 최대한 활용하고 더디더라도 많은 것을 알 수 있도록 공부하고 있습니다.\n\n또 알고리즘 풀이 방법이나 개인적으로 공부한 내용들은 영상으로, 블로그에 글로 작성해 두었습니다.\n\n이렇게 다양한 공부를 통해 저는 여러 언어나 DB에 대한 기초적인 지식을 쌓을 수 있었고, 이는 자바 개발자로서 발전할 수 있는 밑거름이 되었습니다.\n\n그리고 이러한 여러 활동들과 그것을 통한 배움, 많은 사람과의 소통을 통해 저는 새로운 곳에 적응하고 새로운 것을 배울 때에 잘 해낼 수 있다는 자신감을 갖게 되었습니다.\n\n현대오토에버에서 제가 가진 장점과 지식을 활용할 수 있는 미래를 펼쳐나가겠습니다.\n글자수 1,510자\n2,400Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 엔테크서비스(주)의 2023년 하반기 신입 웹개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [성격의 장단점, 취미활동을 포함하여 자유롭게 자신을 표현해 주세요.] 답변: [저는 한 번 무언가에 빠지면 열심히 노력하는 편입니다. 특히 문제가 발생했을 때 해결책을 찾기 위해 여러 자료를 찾아보며 공부하는 것을 좋아합니다. 프로그래밍을 할 때는 공식 문서를 보며 배우는 것이 보람차다고 느껴집니다.\n\n하지만 문제가 잘 풀리지 않으면 답답함을 느끼거나 스트레스를 받는 경우도 있습니다. 이런 상황에서는 커피를 마시거나, 드라마를 보면서 기분 전환을 하곤 합니다. 그래도 결국 문제를 해결하고 나면 성취감을 느낄 수 있어 좋습니다.\n\n한편, 저는 가끔 일을 시작하기를 미루는 경향이 있습니다. 시작하면 열심히 하지만, 그만큼 준비하는 데 시간이 걸리기도 합니다. 최근에는 알고리즘 문제를 매일 풀며 이런 습관을 고치려고 노력 중입니다.\n\n취미로는 드라마를 보거나 독서를 하는 것을 좋아했지만, 요즘은 바빠서 시간을 많이 내지는 못하고 있습니다. 대신 알고리즘 문제를 푸는 것이 새로운 취미가 된 것 같습니다.]"}, {"role": "assistant", "content": "모범 답변: [무엇인가 한번 빠져들면 해결하거나 성취할 때까지 모든 열정/노력을 쏟아붓는 성격으로, 그 과정에서 큰 어려움이 발생하더라도 포기하지 않고 가능한 방법들을 찾아 해결하고 있습니다. 어떠한 문제가 당면하였을 때 1차적으로 해당 문제 또는 연관된 사항이 기술되어 있을 것이라 기대되는 매뉴얼을 확인하는 것을 중시하고, 매뉴얼을 읽고 스스로 이해한 내용이 맞는지 확인하기 위해 2차적으로 인터넷상에서 찾을 수 있는 아티클을 확인하여 교차 검증하고 있습니다.\n특히 프로그래밍에 있어서는 공식적으로 제공되는 레퍼런스 문서를 보는 것을 좋아하며, 이런 과정을 통해 새로운 지식을 습득하는 것에 보람을 느끼고 있습니다.\n\n물론 문제가 발생하는 상황 자체를 즐기는 것은 아니고, 문제와 관련된 내용을 다루는 문서/아티클이 존재하지 않거나 제시된 대로 따랐을 때 문제가 해결되지 않는다면 답답함을 느끼거나 가벼운 스트레스를 받는 편입니다. 이런 상황이 발생하였을 때 맛있는 커피를 마시거나, 간단한 독서를 하거나, 드라마를 보면서 기분 전환을 하고 있으며, 어떻게든 그 문제를 해결해서 문제를 해결했다는 성취감으로 해결 과정에서 발생하였던 답답함과 스트레스를 날리는 것 같습니다.\n\n무엇인가에 대해 한번 빠져들면 최선의 노력을 하는 것과 반대로, 한번 시작하게 되면 모든 것을 쏟아붓기 때문에 무엇인가 시작하는 것을 최대한 미루는 경향이 있었습니다. 머릿속에서 '할 수 있는가/없는가'와 '할 수 있다면 얼마나 걸릴 것 같은가' 같은 러프한 생각을 통해, 최대한 미루거나 나중에라도 할 수 있다 생각하는 건 넘어가거나 그랬는데, 실제 개발 과정에서는 예기치 않은 문제/버그가 발생할 수 있고 이를 해결하기 위한 추가적인 시간이 필요하고,\n특히 협업에서는 각자 작업한 결과를 기준으로 리뷰하고 진행하는 것이 중요함을 느껴서 작업/해결해야 할 일이 있다면 바로바로 처리하고 있습니다.\n\n또한 당장 지금 하지 않고 나중에라도 할 수 있어 하는 것 자체를 미루던 것 역시 시간이 지나면 까먹고 할 시간이 없어질 수 있다는 것을 깨닫고 바꿔야 되겠다는 생각을 하였으며, 현재로서는 바쁘더라도 알고리즘 문제를 매일 최소 1문제 이상 풀어오는 것을 180일 넘게 해오고 있습니다.\n\n현재 교육받고 있는 OOOOO 과정으로 인해, 깊은 독서나 드라마를 볼 수 있는 시간이 많이 줄어 기존의 취미 활동을 할 시간이 많이 줄었지만, 새로운 것을 배우고, 개발을 하고, 알고리즘 문제를 푸는 과정 자체에 만족/성취감을 느끼고 있으며 알고리즘 문제 푸는 것(Problem Solving)이 새로운 취미가 된 것 같습니다.\n글자수 1,289자\n2,195Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 엔테크서비스(주)의 2023년 하반기 신입 웹개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [본인이 성공적으로 수행한 프로젝트의 성공 요인이 무엇인지, 어려움을 극복하기 위해 어떤 방법을 사용했는지 기술해 주세요.] 답변: [저는 프로젝트를 진행하면서 효율적인 구조에 대해 고민하기보다는 먼저 기능을 구현해보고 나중에 리팩토링하는 방식으로 작업을 했습니다. 처음에는 효율적인 설계가 잘 떠오르지 않아도, 일단 Naive하게 코드를 작성한 뒤, 필요할 때 구조를 바꾸곤 했습니다.\n\n또한 개발 도중에 버그가 발생하면 낙담하기보다는 디버깅을 통해 문제를 해결하려고 노력했습니다. 가끔 예상했던 대로 작동하지 않을 때가 있었는데, 그럴 때는 코드를 블록 단위로 나눠 결과를 확인했습니다. 그래도 문제가 해결되지 않으면, 한 줄씩 코드를 살펴보며 디버깅을 진행했습니다. 디버깅이 어렵긴 했지만, 이 과정을 통해 코드를 개선할 수 있었습니다.\n\n제 경험은 부족하지만, 이러한 노력 덕분에 프로젝트를 마칠 수 있었다고 생각합니다.]"}, {"role": "assistant", "content": "모범 답변: [프로젝트 경험이 부족해서 OOOOO에서 진행한 프로젝트나, 대학 과정에서 과제로 진행했던 프로젝트를 기준으로 돌이켜 생각해 보면 리펙토링하는 것과 디버깅하는 것에 대해 거부감을 갖지 않은 것이 성공 요인이었던 것 같습니다.\n개발하는 과정 속에서 효율적인 구조가 어느 정도 고민해 보아도 당장 떠오르지 않을 경우에는 Naive 하게 구현해 놓고 넘어간 뒤에, 휴식을 취할 때 더 고민해 보거나 이를 해결할 수 있는 효율적인 구조가 존재하는지 찾아본 뒤 Naive 한 구현을 리팩토링하여 전체적인 큰 틀을 잡는 것과 성능을 잡는 것 모두를 신경 쓰고 있습니다. 또한 구현 당시엔 Naive 한 구현이 아니고 괜찮은 구현이라고 생각했을지라도, 나중에라도 더 좋은 구현/구조가 떠오른 경우 리팩토링해주고 있습니다.\n\n또한 처음부터 버그가 생기지 않게 잘 설계하고 구현하는 것이 중요하다는 것에는 공감하고 노력하고 있으나, 프로그래밍을 하는 것이 사람이기 때문에 버그는 언제든 발생할 수 있는 것이라고 생각하며, 버그가 발생하였을 때 낙담하지 않고 디버깅을 해오고 있습니다. 함수 단위나 코드 블록 단위로 예상하는 결과가 잘 나오는지 1차적으로 확인해 주고 그 결과를 보았을 때 유추되는 바가 있다면 바로 수정하고 있지만, 혹시라도 큰 단위로 디버깅을 해보았을 때 정확히 어느 부분에서 어떤 문제가 발생하는 것인지 예측되지 않는다면 라인 단위로 디버깅을 하는 것에도 거부감을 갖지 않습니다. 라인 단위로 디버깅을 하는 과정에 필요하다면 종이와 펜, 그리고 프로그래머 모드의 계산기를 이용하여 비트까지 추적하는 디버깅도 경험을 가지고 있습니다.\n글자수 805자\n1,378Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 엔테크서비스(주)의 2023년 하반기 신입 웹개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [학교 정규 과정 이외에 개발 참여 경험이 있다면 소개해 주세요. (ex. 인턴십, 경진대회, Project 참여, 취업 준비 스터디 등 / 경험, 본인의 역할, 느낀 점 및 개선할 점 포함)] 답변: [저는 대학 시절 방학 중에 OOOOOO에서 현장실습을 하며 간단한 업무를 맡아본 경험이 있습니다. 해당 기업에서 DICOM 프로토콜을 활용해 PACS 서버로 데이터를 전송하는 작업이 필요했는데, 저는 FO-DICOM 라이브러리를 사용해 이미지를 전송하는 것을 맡았습니다. 처음 해보는 일이어서 어려움이 많았지만, 문서를 참고하며 프로토콜을 이해하려고 노력했습니다. 그러나 당시 의료기기와 관련된 지식이 부족해 작업을 완료하는 데 시간이 오래 걸렸고, 결과적으로 완벽히 이해하지 못한 채로 마무리했던 점이 아쉬웠습니다.\n\n또한 OOOOO에서 진행한 협업 프로젝트에서는 다양한 사람들과 협업을 하며 새로운 경험을 했습니다. 백엔드를 주로 맡았지만, 프론트엔드도 경험하며 협업의 중요성을 느꼈습니다. 그러나 협업 문서화가 부족했고, JIRA와 같은 툴을 적극적으로 활용하지 못해 아쉬움이 남았습니다. 이후에는 협업 툴과 문서화를 통해 개선하고자 했습니다.\n\n마지막으로 알고리즘 스터디를 통해 다른 사람들의 코드 스타일을 배우고, 더 읽기 쉬운 코드를 작성하려고 노력했습니다. 하지만 스터디에서 깊이 있는 토론이나 피드백이 부족했던 점은 개선해야 할 부분이라고 생각합니다.]"}, {"role": "assistant", "content": "모범 답변: [대학 생활 중에 의료기기 사업을 영위하는 OOOOOO에서 방학 중에 현장실습을 2회 진행하였었습니다. 해당 기업에서 PDF 리포트를 DICOM 프로토콜을 활용하여 PACS 서버로 전송하는 과정을 필요로 하여, DICOM 프로토콜에 대한 조사/정리와 FO-DICOM 라이브러리를 활용하여 PACS 서버로 이미지 파일을 전송하는 것을 맡아 진행하였습니다. 해당 기업에서도 해보지 않았으나 필요한 일이어서 회사 내에서 도움받을 수 없어서, 프로토콜 자체에 대한 문서를 위주로 보고 동작에 대해 정리해 주고, 라이브러리를 간단하게 사용하는 법에 대해 조사를 해보았었습니다.\n제대로 알지도 못하는 프로토콜에 대해 원문으로 읽고 이해했어야 해서, 당시로서는 최선을 다했다고 생각했었으나 지금 돌이켜 생각해 보면 의료기기와 DICOM/PACS/EMR에 대한 이해가 부족해서 이해하는 과정에 어려움을 겪었던 것 같습니다. 회사 측에 요청해서라도 실제로 해당 프로그램을 사용할 클라이언트인 의료기관에 종사하는 사람을 만나서 전체적인 과정에 대한 이해를 시도했었다면 더 좋은 경험을 할 수 있었을 것 같습니다.\n\n또한 OOOOO에서 진행하였던 협업 프로젝트는, 동일한 주제를 가진 사람끼리 프로젝트 진행 과정 속에서 페어를 바꿔가며 프로젝트를 진행하여 사람들마다 코드를 짜는 방식이나, 협업을 진행하는 방식이 많이 다르다는 점을 느낄 수 있었고, 한 프로젝트를 진행하지만 계속 협업을 하는 대상이 바뀌기 때문에 그때마다 역할을 바꾸기도 하여 주로 백엔드를 담당하였더라도 프론트에 대한 이해와 협업도 해볼 수 있어 좋은 경험이었던 것 같습니다. 다만 협업을 하는 페어는 계속 바뀌었다 하더라도, 동시에 협업하는 대상은 1명이었기 때문에 문서화해서 협업하는 부분은 부족하였던 것 같고, OOOOO에서 2학기 과정을 진행하며 실제 현장과 같이 여러 명이서 문서와 협업 툴(JIRA)을 활용함으로써 채우고자 합니다.\n\n또한 OOOOO 내부 인원들과 알고리즘 스터디를 진행하여 동일한 문제에 대해서도 사람마다 접근하는 방식이나 코드 스타일이 다르다는 것을 확인할 수 있었고, 타인이 보기에 깔끔한 코드 스타일은 무엇인가? 와 반대로 타인이 보았을 때 의미를 유추하기 힘든 코드 또는 반대로 이해할 수 있는 코드는 무엇인가?를 알고리즘 스터디원들의 코드를 보며 느낄 수 있었고, 알고리즘 문제를 풀더라도 타인이 보았을 때 이해하기 쉬운 코드를 짜기 위해 노력했던 것 같습니다.\n글자수 1,208자\n2,040Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 현대캐피탈의 2023년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [자기소개서 내 출신 학교를 기재하거나 유추할 수 있는 문구를 포함하지 않도록 유의해주시기 바랍니다. (올바른 입력 예. OO대학교) 현대캐피탈에 지원하게 된 동기와 지원 직무에 필요한 역량을 기르기 위해 노력했던 경험을 기술해 주십시오. (최소 300자, 최대 500자 입력가능)] 답변: [저는 개발자로서 사람들에게 편리함을 제공하고 싶다는 목표를 가지고 현대캐피탈에 지원하게 되었습니다. 현대캐피탈은 국내 자동차금융 시장에서 중요한 위치를 차지하고 있어, 이곳에서 제가 가진 역량을 발휘할 수 있을 것이라 생각합니다.\n\n저는 학부 시절 전공 과목을 수강하며 개발에 대한 기본적인 지식을 쌓았습니다. 또한, 현장실습을 통해 프로젝트 경험을 조금씩 쌓아갔습니다. 최근에는 교육 과정에 참여하면서 백엔드 개발을 중심으로 다양한 프로젝트에 참여하고 있습니다. 팀 프로젝트에서는 주로 Spring을 사용해 백엔드 개발을 맡았으며, 이를 통해 협업과 문제 해결 능력을 키울 수 있었습니다.\n\n앞으로 현대캐피탈에서 이러한 경험을 바탕으로 더 많은 것을 배우고 기여하고 싶습니다.]"}, {"role": "assistant", "content": "모범 답변: [개발자로서 가지고 있는 목표는 사람들의 삶을 더 편리하게 하는 것입니다. 제가 만든 프로그램으로 인해 사람들의 시간을 절감되거나 삶의 개선을 지켜보는 것이 개발의 원동력입니다. 국내 자동차금융 시장 1위인 현대캐피탈에서 많은 고객들을 대상으로 빠르고 안정적인 서비스를 제공하는데 기여하였을 때,\n많은 고객들의 경험을 개선할 수 있고 회사에 기여할 수 있을 것이라 생각하여 지원하게 되었습니다.\n학부 과정 중 전공 77학점을 이수하였고, 교내 연계 프로그램을 통해 계절학기에 스타트업에서 2회 현장실습하였으나, 프로젝트 경험을 더 쌓기 위해 현재\n삼성 청년 SW아카데미에 입과 하여 교육받고 있습니다. SSAFY 교육과정에서 우수한 성적을 거둬, 1학기 성적 우수상을 수여받았고, 'WebRTC기반 비대면\n단체 클립 사이트'에 Spring/JPA 백엔드 파트 및 Jenkins와 Cloudflare CDN을 비롯한 인프라 담당으로 참여하여 프로젝트 우수상 및 협업 베스트멤버로 선정되었습니다.\n글자수 505자\n835Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 현대캐피탈의 2023년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [실패에 대한 두려움을 극복하고 새로운 일에 도전하여 깨달음을 얻은 경험에 대해 기술해 주십시오. (최소 300자, 최대 500자 입력가능)] 답변: [SSAFY에서 진행한 오픈소스 프로젝트에 참여했던 경험이 있습니다. 당시 Quantization과 PyTorch, Tensorflow 같은 기술을 처음 접하면서 어려움을 느꼈습니다. 특히 학습 자료가 부족해 프로젝트를 시작하기 전부터 큰 부담을 느꼈습니다. 하지만 팀원들과 함께 역할을 나누고 필요한 내용을 공부하며 프로젝트를 마무리할 수 있었습니다.\n\n이 경험을 통해 처음에는 두렵고 막막하더라도, 시도해 보면 해결 방법을 찾을 수 있다는 점을 배웠습니다. 프로젝트가 끝난 뒤에는 오픈소스에 대해 조금 더 자신감을 가질 수 있었습니다. 앞으로도 새로운 도전을 두려워하지 않고 해낼 수 있도록 노력하고 싶습니다.]"}, {"role": "assistant", "content": "모범 답변: [SSAFY에서 우수 교육생으로 선정되어, 삼성리서치 연계 오픈소스 프로젝트 One(On-Device Neural Engine)에 Quantization Parameter Importer라는 모듈 개발에 참여하게 되었습니다. 생소하고 학습할 자료도 부족한 Quantization과, PyTorch, Tensorflow, One과 같은 프레임워크에 대한 지식이 필요하여 프로젝트에 대한 큰 걱정을 하게 되었습니다. 하지만 팀원들과의 학습과 업무 분담을 비롯한 협업을 통하여 주어진 프로젝트 목표를 달성하였고, github에서 오픈소스에 기여하는 것에 대한 막연한 두려움을 벗어나 Issue를 만들고 Pull Request를 통해 실제 기여해 볼 수 있었고, 우수 프로젝트로 선정 될 수 있었습니다. 실패를 두렵더라도 이를 이겨내고 도전한다면, 극복할 수 있는 능력이 주어져있고 목표를 달성할 수 있기 때문에 그 무엇이라도 우선 시도와 도전을 하는 것이 중요하다는 것을 배울 수 있었습니다.\n글자수 495자\n766Byte]"}]}
{"messages": [{"role": "system", "content": "당신은 현대캐피탈의 2023년 하반기 신입 백엔드개발자 파트에 지원한 지원자의 자기소개서를 첨삭하고 피드백하는 일을 해야 합니다."}, {"role": "user", "content": "질문: [가치관이 다른 구성원들과 협업했던 과정에서 본인의 역할은 무엇이었는지, 그 경험을 통해 어떤 역량이 향상되었는지 기술해 주십시오. (최소 300자, 최대 500자 입력가능)] 답변: [SSAFY에서 프로젝트를 진행하면서 팀원과 보안에 대한 관점이 달랐던 경험이 있습니다. 저는 사소한 부분까지 보안을 고려해야 한다고 생각했지만, 팀원은 복잡성이 증가한다고 반대했습니다. 처음에는 의견 차이로 어려움을 겪었지만, 결국 서로 논의하며 절충점을 찾았습니다. 중요한 부분에만 보안을 적용하고 나머지는 주석으로 남겨 나중에 검토하기로 했습니다.\n\n이 경험을 통해 가치관이 다른 사람과 협업할 때 서로의 의견을 존중하고, 논의를 통해 해결책을 찾는 것이 중요하다는 것을 배웠습니다. 하지만 처음부터 논리적으로 설득하지 못한 점은 아쉬움으로 남습니다. 앞으로는 더 논리적으로 자신의 의견을 전달할 수 있도록 노력하고 싶습니다.]"}, {"role": "assistant", "content": "모범 답변: [SSAFY에서 프로젝트를 진행하던 도중 어느 정도까지 보안을 고려해야 하는지에 대한 가치관이 팀원과 달랐던 적이 있습니다. 사소한 부분에서라도 보안적 요소를 고려할 수 있다면 적용해야 한다는 생각이었으나, 모두 고려하였을 때 구성이 너무 복잡해진다는 반론으로 인해 각 요소에 대해 실제 필요한 작업과 생략할 수 있는 부분으로 나눠 생각해 볼 수 있었습니다.\n실제 flow를 생각해 보았을 때 악의적인 공격이 존재할 수 있어 절대 타협할 수 없는 부분과, 흐름 상 이전 작업에 종속되어 있어 악의적인 공격의 가능성이\n낮은 부분으로 나눈 뒤, 후자의 경우 주석으로 실 서비스 시 추가적으로 고려할 보안적 요소를 남기게 되었습니다. 이 과정을 통해 협업에서 가치관이 다른 팀원을 만나더라도 논리적인 사고를 바탕으로 서로 양보하여 맞추는 것과 지켜야 하는 것은 지키는 것을 배우게 되었습니다. 또한 각 요소에 대해 논리적으로 발생할 수 있는 경우를 따지는 능력을 얻게 되었습니다.\n글자수 491자\n840Byte]"}]}
위와 같은 구조를 가질 수 있도록 데이터셋을 가공해준 결과이다.
준비한 데이터셋으로 GPT 파인튜닝하기
일단 테스트용으로 데이터셋의 크기는 12정도로 하고 GPT-4o-mini로 파인튜닝 해보겠다.
Dashboard > Fine-tuning > Create 순서로 클릭하여 새로운 모델을 만든다.
base model을 선택하고 training data를 업로드한다. 하이퍼파라미터들을 오토로 두고 Create를 눌러준다.
파인튜닝이 되고 있는 모습이다.
파인튜닝이 성공적으로 끝난 모습이다. 우측 하단에 있는 Playground를 클릭하면 테스트를 해볼 수 있다.
답변은 나오는데, 데이터가 부족한건지 파인튜닝을 잘못한건지 뭔가 좀 이상하다. 문제의 원인을 파악하고 다시 시도해봐야 할 것 같다.