안녕하세요. :)
Team. KHTP입니다!
저희 팀은 취업 정보 수집에 대한 어려움을 ChatGPT API와 사람인 API를 활용하여 chatGPT 대화 주도 방식을 통해 사용자에게 정보를 수집해 사용자 맞춤형 기업을 추천해주는 서비스를 개발했습니다 !
Github 주소
https://github.com/Team-KHPT/Project_Kim
서비스 주소 (4월 29일 배포완료)
서비스 소개
‘김비서’는 채팅을 통해 사용자가 보유하고 있는 기술과 희망하는 직종, 스펙 등을 분석해 사용자에 맞는 회사를 추천해 주는 대화형 인공지능입니다.
제작 배경
저희는 현재 특성화 고등학교에 다니며 이제 취업을 준비하는 시기가 왔습니다. 현재 저희의 가장 큰 관심사인 '취업'과 가장 핫한 ‘ChatGPT’를 결합한 결과물이 바로 이 김비서 프로젝트 입니다.

<취업 정보 찾기 어려워요!!>
사용자층
- 특성화고등학교 학생들
- 마이스터고등학교 학생들
- 취업 담당 선생님들
- 취업 준비생들
목표
‘김비서는’ 국내 직업계고 학생들과 취준생 등 직장을 찾는 사람들이 시간 낭비 없이 본인과 어울리는 직장을 찾을 수 있도록 최고의 서포트를 하는 것을 목표로 합니다.
기대 효과
- 사용자가 선택할 수 있는 회사의 폭이 늘어나 실업률이 낮아진다.
- 좋은 조건을 가지고 있는 중소기업들의 구인이 쉬워진다.
- 취업계 고등학교를 다니고 있는 고등학생과 사회초년생들의 취업 고민을 덜어준다.
향후 계획(발전 가능성)
- 데이터를 추가하여 초,중,고등학생들을 위한 진로 상담 AI 개발
- 챗봇 형식으로 변형하여 사람인, 잡코리아 등과 같은 메이저 취업 사이트에 취업 상담 챗봇으로 탑재
- 사용자의 피드백을 받아 GPT Fine-tuning
팀소개
Team. KHPT
| 팀장 | KKH | @kanghyun3130 |
| 팀원 | KDH | @kimd0nghyuk |
| 팀원 | KYH | @yunhyeon05 |
서비스
OpenAI API, 사람인 API를 탑재한 Django 웹서버를 제작하였습니다.

페이지 디자인 (시연은 아래에..)
사용한 프롬프트들
사용자와 채팅을 위한 프롬프트
# Project_Kim/chat/magic/chatting.py
chatting_prompts = [
{
'role': 'system',
'content': '''
너는 취업 상담사야.
사용자가 원하는 직무를 물어봐.
직무를 알았다면 사용자가 원하는 근무형태를 물어봐. 상세하게 물어보지는 않아도 돼.
근무형태를 알았다면 사용자의 학력을 물어봐.
학력을 알았다면 취업을 원하는 지역을 물어봐.
모두 알게 되었다면 계속 대화를 이끌어 나가며 적극적으로 상대방에게 질문해야 해.
'''
},
{'role': 'assistant', 'content': "안녕하세요. 저는 사용자님께 알맞은 취업 정보를 제공해 드릴 김비서 입니다."}
]
# ...ChatGPT가 사용자에게 적극적으로 질문하도록 프롬프트를 작성하였습니다. 또한 assistant의 말을 미리 추가함으로써 사용자와의 대화에서 주제를 벗어나지 않게 함과 동시에 대화 말투를 지정해줄 수 있었습니다.
대화에서 정보 추출
# Project_Kim/chat/magic/convert_chatting_to_info.py
chatting_to_info_prompt = {
'role': 'user',
'content': '''
지금까지 알아낸 정보를 아래와 같은 형식으로 말해줘. 모르는 값은 none 이라고 해줘.
info: [
직무: {직무},
근무형태: {근무형태},
학력: {학력},
지역: {지역}
]
'''
}
# ...사용자가 채팅 중에 ‘분석하기’ 버튼을 누르면 실행되는 코드의 프롬프트 입니다. 현재까지의 대화를 받은 뒤 user의 역할로 ChatGPT에게 물어보아 대답을 얻어냅니다. 이렇게 추출한 데이터는 가공을 거쳐 취업 정보를 불러오는데 사용됩니다.
추출한 정보를 취업 정보 API 요청 파라미터로 변환
# Project_Kim/chat/magic/convert_info_to_code.py
info_to_code_prompts = [
{
'role': 'system',
'content': f'''
아래의 테이블을 참고해서 하나 이상의 코드로 바꿔줘. 해당하는 코드가 없다면 비슷한 것을 골라서 코드로 바꿔줘.
코드만 답변해줘.
none은 -1 이라고 출력해줘.
근무 형태 테이블.
{get_job_type_data()}
지역 테이블.
{get_loc_mcd_data()}
직무 테이블.
{get_job_cd_data()}
학력 테이블.
{get_edu_lvl_data()}
'''
},
{
'role': 'user',
'content': '''
info: [
직무: IT,
근무형태: 안정적인 형태,
학력: 고등학교 졸업 예정,
지역: none
]
'''
},
{
'role': 'assistant',
'content': '''
직무: 2,
근무형태: 1,
학력: 1,
지역: -1
'''
}
]
# ...위에서 추출한 정보를 사람인 취업정보 API 요청 파라미터로 변환 합니다. 이번에도 user와 assistant의 대화를 미리 추가해 줌으로써 답변 형식을 확실하게 정해줄 수 있었습니다.
직무 코드(API 파라미터) 세분화
# Project_Kim/chat/magic/convert_job_to_detailed.py
def get_prompts(job_cd: int) -> list:
prompts = [
{
'role': 'system',
'content': f'''Based on the below table, pick one or more codes that is related to keyword.
If you picked multiple codes, please separate them with commas.
If you can't answer, say error.
Table
{get_detailed_job_cd_with(job_cd)}
'''
},
{'role': 'user', 'content': '''백엔드 개발자'''},
{'role': 'assistant', 'content': '''84'''},
{'role': 'user', 'content': '''Unity 게임 개발자'''},
{'role': 'assistant', 'content': '''80,304'''},
{'role': 'user', 'content': '''ㄹㄷㅈㄹㄷㄹㅈㄷ'''},
{'role': 'assistant', 'content': '''error'''},
{'role': 'user', 'content': '''dsff'''},
{'role': 'assistant', 'content': '''error'''},
]
return prompts사람인 API에는 직무 상위 코드와 그 아래 하위 직무 코드가 있습니다.
예를 들어 직무 상위 코드가 ‘IT개발·데이터’ 라면
‘딥러닝’, ‘데이터분석가’ 등의 직무 키워드가 그 아래에 있습니다. (참고: https://oapi.saramin.co.kr/guide/code-table5?mcode=2)
위 과정은 사용자가 원하는 직무와 관련된 하위 직무 코드를 모두 찾아내는 것 입니다.
이번 프롬프트에서도 답변 예시를 추가해 주어 원하는 형식으로 답을 얻어낼 수 있게 하였습니다.
(이 부분은 한글보다 영어를 잘 알아듣길래 영어로 프롬프트 작성했습니다 ㅎ..)
위에 작성한 프롬프트들 총 집합
# Project_Kim/chat/views.py
# ...
def analyze(messages: list): # 1.
exported_data = magic.convert_chatting_to_info(messages) # 2.
converted_data = magic.convert_info_to_code([{'role': 'user', 'content': exported_data}]) # 3.
job_cd = converted_data.split("직무: ")[1].split(",\n")[0]
job_type = converted_data.split("근무형태: ")[1].split(",\n")[0]
edu_lv = converted_data.split("학력: ")[1].split(",\n")[0]
loc_mcd = converted_data.split("지역: ")[1].split("\n")[0]
exported_job_data = exported_data.split("직무: ")[1].split(",")[0]
detailed_job_code = magic.convert_job_to_detailed(job_cd, [{'role': 'user', 'content': exported_job_data}]) # 4.
response = utils.job_info_request(detailed_job_code, job_type, edu_lv, loc_mcd) # 5.
return response['jobs']['job']
# ...- 채팅 내역이 함수에 전달됩니다.
- 채팅 내역에서 정보를 추출
- 추출한 정보를 취업 정보 API 파라미터 코드로 변경
- 직무 세분화. 직무 상위 코드 → 직무 코드 (참고: https://oapi.saramin.co.kr/guide/code-table5?mcode=2)
- 취업 정보 요청
시연
채팅을 입력하면 답변을 스트림으로 제공합니다

대화

계속 대화..

분석하기! (하나 밖에 안나오넹..)

이번에는 지역을 서울로 바꿔서 재시도!

이번에는 여러개가 나왔네요..!
분석 결과에 있는 링크를 누르면 사람인 채용 공고 페이지가 새 탭에 열리게 됩니다.
서비스 흐름도
1. 서비스 흐름
(Analyze Process는 아래에.)

2. 채팅 분석 흐름 1 (Analyze Process)

3. 채팅 분석 흐름 2 ( + 향후 계획)

본래 계획으로는 취업 정보 API를 통해 얻은 취업 정보를 다시 한번 ChatGPT로 분류할 계획이었지만
현재로썬 취업 정보 API로 얻은 결과를 출력하는 기능만 구현되었습니다.
계속 업데이트 해나가도록 하겠습니다. 감사합니다 :)
