본문 바로가기

[14] 자기소개서 도우미 - 프롬프트 엔지니어링

들어가며

🏫 전체 강의 영상 youtube

🧑‍💼 자기소개서 도우미 사용해보기

 ▶️  강의 영상 유튜브

 

이번 챕터에서는 자소서 도우미 프로젝트의 프롬프트를 작성해보겠습니다.

chatGPT API 사용

jupyter notebook을 열어주고, 환경변수를 이용해서 api key를 설정해주겠습니다.

import openai
import os

openai.api_key = os.environ["OPENAI_API_KEY"]

그 다음 common.py에 작성해놓은 함수를 import 해서 간단한 요청을 날려보겠습니다.

from common import request_chat_completion, print_streaming_response

prompt = "안녕하세요!"
response = request_chat_completion(prompt, stream=True)
print_streaming_response(response)

>>
안녕하세요! 무엇을 도와드릴까요?

훨씬 간결하게 chatGPT API를 사용할 수 있게 되었습니다. 이제 오로지 프롬프트 엔지니어링에만 집중할 수 있게 되었습니다.

 

프롬프트 템플릿 작성

먼저 기본 프롬프트 템플릿을 작성해보겠습니다. 지원하는 회사와 직무, 자소서의 문항, 그리고 지원자의 경험을 입력으로 받아서 자기소개서를 작성하도록 작성해보겠습니다.

prompt_template_v1 = """
기업 입사용 자기소개서를 작성해야합니다.
답변해야하는 질문과 이에 관련된 유저의 경험을 참고해서 자기소개서를 작성해주세요.
반드시 {max_length}자 이내로 작성해주세요.
---
지원 회사: {company}
지원 직무: {position}
질문: {question}
관련 경험: {experience}
---
""".strip()

예시로 사용할 데이터를 만들어주겠습니다.

example = {
    "company": "LG uplus",
    "position": "기업부문 B2B 국내영업",
    "max_length": 500,
    "question": "소속된 조직의 공동과업을 달성하는 과정에서 발생했던 어려움과 그 어려움을 극복하기 위해 기울인 노력에 대해 구체적인 사례를 바탕으로 기술해 주십시오.",
    "experience": "대학교 3학년 때 축구부 주장 역임.\n총장배 대회 우승이라는 공동의 목표로 함께 노력.\n주전 선수진 부상으로 어려움 겪었으나, 극복하고 8강 진출이라는 성과 달성"
}

예시 데이터로 프롬프트를 작성해보겠습니다.

prompt = propmt_template_v1.format(
    company=example["company"], 
    position=example["position"], 
    question=example["question"], 
    experience=example["experience"],
    max_length=example["max_length"]
)
print(prompt)

>>
기업 입사용 자기소개서를 작성해야합니다.
답변해야하는 질문과 이에 관련된 유저의 경험을 참고해서 자기소개서를 작성해주세요.
반드시 500자 이내로 작성해주세요.
---
지원 회사: LG uplus
지원 직무: 기업부문 B2B 국내영업
질문: 소속된 조직의 공동과업을 달성하는 과정에서 발생했던 어려움과 그 어려움을 극복하기 위해 기울인 노력에 대해 구체적인 사례를 바탕으로 기술해 주십시오.
관련 경험: 대학교 3학년 때 축구부 주장 역임.
총장배 대회 우승이라는 공동의 목표로 함께 노력.
주전 선수진 부상으로 어려움 겪었으나, 극복하고 8강 진출이라는 성과 달성
---

프롬프트로 텍스트를 생성해보겠습니다. 자소서는 글자 수 제한도 있으므로, 생성된 텍스트 길이도 출력해보겠습니다.

response = request_chat_completion(prompt, stream=True)
message = print_streaming_response(response) 
print(f"\n\n공백 포함 {len(message)}자")

>>
저는 대학교 3학년 때 축구부에서 주장으로 역임하며 소속된 조직과 함께 공동의 목표를 달성하는 과정에서 어려움을 겪었습니다. 그 당시에 저희 팀은 총장배 대회에서 우승이라는 큰 목표를 가지고 있었고, 이를 위해 모두가 열심히 노력하고 있었습니다.
...

공백 포함 927자

길이 제한

최대 길이를 제한했음에도 잘 지켜지지 않습니다. 한국어의 경우에는 "몇글자 이내로 써줘" 보다는 "몇 단어 이내로 써줘"가 텍스트의 길이를 제한할 때 훨씬 효과적입니다. 한 단어에 6글자라고 가정하고, 생성되는 텍스트의 길이를 제한해보겠습니다.

prompt_template_v2 = """
기업 입사용 자기소개서를 작성해야합니다.
답변해야하는 질문과 이에 관련된 유저의 경험을 참고해서 자기소개서를 작성해주세요.
반드시 {max_length} 단어 이내로 작성해야 합니다.
---
지원 회사: {company}
지원 직무: {position}
질문: {question}
관련 경험: {experience}
---
""".strip()
prompt = prompt_template_v2.format(
    company=example["company"], 
    position=example["position"], 
    question=example["question"], 
    experience=example["experience"],
    max_length=example["max_length"] // 6
)
print(prompt)

>>
기업 입사용 자기소개서를 작성해야합니다.
답변해야하는 질문과 이에 관련된 유저의 경험을 참고해서 자기소개서를 작성해주세요.
반드시 83 단어 이내로 작성해야 합니다.
---
지원 회사: LG uplus
지원 직무: 기업부문 B2B 국내영업
질문: 소속된 조직의 공동과업을 달성하는 과정에서 발생했던 어려움과 그 어려움을 극복하기 위해 기울인 노력에 대해 구체적인 사례를 바탕으로 기술해 주십시오.
관련 경험: 대학교 3학년 때 축구부 주장 역임.
총장배 대회 우승이라는 공동의 목표로 함께 노력.
주전 선수진 부상으로 어려움 겪었으나, 극복하고 8강 진출이라는 성과 달성
---

새로 만든 프롬프트로 텍스트를 생성해보겠습니다. 단순히 글자 수로 제한 했을 때보다 훨씬 잘 동작합니다.

response = request_chat_completion(prompt, stream=True)
message = print_streaming_response(response) 
print(f"\n\n공백 포함 {len(message)}자")

>>
LG Uplus에 지원하게 되어 매우 기쁩니다. 저는 기업부문 B2B 국내영업 직무에 흥미를 가지고 있으며, 조직의 공통 목표를 달성하기 위해 어려움에 직면했을 때 어떻게 극복하는지에 대해 경험을 소개하고자 합니다.
...
공백 포함 612자

소제목 추가

모범 자소서 예시들을 보면 한 문항에 대한 답변을 쓸 때에도 문단별로 소제목을 달아줍니다. 이를 프롬프트에 추가해보겠습니다.

propmt_template_v3 = """
기업 입사용 자기소개서를 작성해야합니다.
답변해야하는 질문과 이에 관련된 유저의 경험을 참고해서 자기소개서를 작성해주세요.
문단별로 소제목을 작성해주세요.
반드시 {max_length} 단어 이내로 작성해야 합니다.
---
지원 회사: {company}
지원 직무: {position}
질문: {question}
관련 경험: {experience}
---
""".strip()
prompt = template_v3.format(
    company=example["company"], 
    position=example["position"], 
    question=example["question"], 
    experience=example["experience"],
    max_length=example["max_length"] // 5
)
print(prompt)

>>
기업 입사용 자기소개서를 작성해야합니다.
답변해야하는 질문과 이에 관련된 유저의 경험을 참고해서 자기소개서를 작성해주세요.
문단별로 소제목을 작성해주세요.
반드시 100 단어 이내로 작성해야 합니다.
---
지원 회사: LG uplus
지원 직무: 기업부문 B2B 국내영업
질문: 소속된 조직의 공동과업을 달성하는 과정에서 발생했던 어려움과 그 어려움을 극복하기 위해 기울인 노력에 대해 구체적인 사례를 바탕으로 기술해 주십시오.
관련 경험: 대학교 3학년 때 축구부 주장 역임.
총장배 대회 우승이라는 공동의 목표로 함께 노력.
주전 선수진 부상으로 어려움 겪었으나, 극복하고 8강 진출이라는 성과 달성
---

소제목 스타일까지 추가한 프롬프트로 텍스트를 생성해보겠습니다.

response = request_chat_completion(prompt, stream=True)
message = print_streaming_response(response) 
print(f"\n\n공백 포함 {len(message)}자")

>>
[공동의 목표를 위한 노력]

서울대학교에 재학 중인 학생으로서 학교 축구부에서 주장 역할을 하며, 지난 대학교 총장배 대회에서 주어진 공동의 목표를 달성하기 위해 힘썼습니다. 이 대회에서는 제가 이끄는 팀이 우승을 차지하는 것이 목표였습니다. 그러나 도중에 주전 선수들의 부상으로 인해 어려움을 겪었고, 이로 인해 팀원들의 동기부여와 역할 배정에 어려움을 겪었습니다.
...

>>
공백 포함 828자

마치며

이상으로 프롬프트 엔지니어링은 마치겠습니다. 추가적으로 원하는 조건이 있다면 프롬프트를 살짝 수정하고, 결과를 확인하고, 다시 수정하는 과정을 반복하면 됩니다. 이어지는 강의에서는 streamlit을 이용해서 웹 UI를 개발하고, chatGPT API를 연동해보겠습니다.