고용노동부 어시스턴트 API 개발 및 테스트
이번 포스팅에 할거
- Pinecone에 OCR로 바뀐 샘플링된 텍스트 넣기 - python scripts/upload_vectors_langchain.py
- 백엔드 API 구성하고 샘플링된 텍스트데이터로 잘 되나 테스트
- LLM 만들기
- 추천시스템 만들기
파인콘에 샘플링 데이터 넣기
python scripts/upload_vectors_langchain.py
잘 들어간다. 자꾸 오류나서 langchain을 거치는 방식으로 수정해서 넣었다.
백엔드 API 개발
Fast api를 사용해서 우선 GPT에게 1차 초안을 맡기고 필요한 부분을 추가하거나 필요없는 부분을 제거해가면서 개발하려고 한다.
cd backend
python -m app.main
http://localhost:8000/docs 에 들어가면 손쉽게 API를 테스트해볼 수 있다. 역시 Fastapi가 좋긴하다.
인증
회원가입
회원가입 정상작동
로그인
로그인 정상 작동
현재 사용자 정보 가져오기
로그인 인증을 완료하면, Swagger UI는 백그라운드에서 인증 토큰(JWT)을 받아옴.
이후 모든 API 호출에 자동으로 인증 토큰이 Authorization 헤더에 포함되어 보안이 필요한 API 사용가능
정책
mysql에 정책데이터 집어넣기
# scripts/import_policies.py
import re
import os
import mysql.connector
# OCR 텍스트 파일 읽기
ocr_file_path = "work_labor_sample_naver/labor_sample_text.txt"
try:
with open(ocr_file_path, "r", encoding="utf-8") as f:
content = f.read()
except FileNotFoundError:
print(f"파일을 찾을 수 없습니다: {ocr_file_path}")
exit(1)
# MySQL 연결 설정
db_config = {
"host": "localhost",
"user": "root",
"password": "password",
"database": "labor_policy",
"port": 3306
}
# 데이터베이스 연결
try:
connection = mysql.connector.connect(**db_config)
cursor = connection.cursor()
print("MySQL 데이터베이스에 연결되었습니다.")
except mysql.connector.Error as err:
print(f"MySQL 연결 오류: {err}")
exit(1)
# 테이블 구조 확인
try:
cursor.execute("DESCRIBE policies")
columns = cursor.fetchall()
print("테이블 구조:")
for column in columns:
print(column)
except mysql.connector.Error as err:
print(f"테이블 구조 조회 오류: {err}")
# 페이지별로 분리
pages = content.split("--- Page ")
pages = [page.strip() for page in pages if page.strip()]
# 정책 목록 파싱 (목차에서)
policy_titles = {}
contents_pattern = re.compile(r"\((\d+)\) (.+?) (\d+)")
for page in pages:
matches = contents_pattern.findall(page)
for match in matches:
policy_id, title, page_num = match
policy_titles[policy_id] = {"title": title, "page": int(page_num)}
# 각 정책 상세 내용 파싱 및 저장
insert_count = 0
for policy_id, policy_info in policy_titles.items():
title = policy_info["title"]
page_num = policy_info["page"]
# 해당 페이지 내용 가져오기
page_content = ""
for page in pages:
if page.startswith(f"{page_num} ---"):
page_content = page
break
# 카테고리 추정
category = "기타"
if "청년" in title:
category = "청년"
elif "고령자" in title or "신중년" in title:
category = "고령자"
elif "장애인" in title:
category = "장애인"
elif "여성" in title or "육아" in title:
category = "여성/육아"
elif "외국인" in title:
category = "외국인"
# 타겟 추정
target_age_min = None
target_age_max = None
target_gender = "ALL"
if "청년" in title:
target_age_min = 18
target_age_max = 34
elif "고령자" in title or "신중년" in title:
target_age_min = 50
if "여성" in title:
target_gender = "F"
# SQL 쿼리 작성
description = f"정책 ID {policy_id}: {title}에 대한 설명입니다."
sql = """
INSERT INTO policies (title, description, category, target_age_min, target_age_max, target_gender, source_page)
VALUES (%s, %s, %s, %s, %s, %s, %s)
"""
values = (
title,
description,
category,
target_age_min,
target_age_max,
target_gender,
page_num
)
try:
cursor.execute(sql, values)
insert_count += 1
except mysql.connector.Error as err:
print(f"삽입 오류 (정책 ID {policy_id}): {err}")
# 변경사항 저장
connection.commit()
print(f"정책 데이터 {insert_count}개를 MySQL에 저장했습니다.")
# 연결 종료
cursor.close()
connection.close()
우선 최대한 카테고리를 다양하게 나이, 성별, 지역 등 매칭이 되게 해놨다. 나중에 필요한거 있음 카테고리를 더 만들거나 필요없는건 지워야지.
정책 목록 조회
음. 잘 나온다. null 값이 거슬리기도 하고 나중에 하나하나 정책마다 카테고리 처리할 생각에 골치아프긴 한데 우선 테스트가 정상작동함에 의의를 두자.
특정 정책 상세 조회
정책 검색 (타이틀 및 설명 기반)
사실 검색들은 잘 되고 설명할것도 별로 없으니 패스
사용자 프로필기반 벡터 검색 정책 추천
얘는 .json형식으로 사진과 같이 입력해주면 다음과 같이 값이 return된다.
지금은 목차만 데이터로 들어가서 저렇게 목차 페이지들만 나오는데 나중에 실제 내용 데이터들이 들어간다면 더 정확한 추천을 해줄것 같다.
{
"recommendations": [
{
"text": "Contents \n01 취업 취약계층 고용안정 및 취업지원 \n1 청년 \n(1) 청년일자리도약장려금 사업 2 \n(2) 청년미래플러스 사업 3 \n(3) 청년도전지원사업 4 \n(4) 청년성장프로젝트 5 \n(5) 직장적응 지원 6 \n(6) 일학습병행 7 \n(7) 청년일경험지원 9 \n(8) 대학일자리플러스센터 운영 10 \n(9) 해외취업지원 11 \n(10) 능력중심의 투명한 공정채용문화 확산 14 \n(11) 채용절차의 공정성 제고 15 \n(12) 대학 재학생 맞춤형 고용서비스 16 \n(13) 미래유망분야 고졸인력양성 17 \n(14) 고교 재학생 맞춤형 고용서비스 19 \n(15) 졸업생 특화프로그램 20 \n(16) 폴리텍 하이테크과정 21 \n2 고령자(신중년) \n(17) 고령자 계속고용장려금 22 \n(18) 고령자 고용지원금 23 \n(19) 중장년 경력지원제 24 \n(20) 중장년내일센터 25",
"page": "2",
"score": 0.483547747,
"policy_keywords": "취업준비중, IT 산업, 창업, 취업지원, 대졸, 서울, 28세"
},
{
"text": "Contents \n(44) 직장어린이집 지원 61 \n(45) 경력단절여성취업지원 63 \n(46) 폴리텍 여성재취업과정 64 \n02 외국인력 제도 운영 및 지원 \n(47) 고용허가제도 66 \n(48) 외국인근로자 사업장 변경제도 68 \n(49) 재입국 특례 외국인근로자 취업 제도 70 \n(50) 특별한국어시험 재취업 제도 72 \n(51) 외국인근로자 체류 지원 73 \n(52) 외국인력 상담센터 운영 74 \n(53) 외국인근로자 지역정착 지원 75 \n03 맞춤형 취업 및 채용지원 서비스 \n(54) 고용복지+센터 78 \n(55) 구직자 취업지원 서비스 81 \n(56) 구직자. 기업 도약보장 패키지 82 \n(57) 심리안정지원 프로그램 84 \n(58) 구직자 취업역량강화 프로그램 85 \n(59) 국민취업지원제도 87",
"page": "4",
"score": 0.454954922,
"policy_keywords": "취업준비중, IT 산업, 창업, 취업지원, 대졸, 서울, 28세"
},
{
"text": "한권으로 통(배)하는 \n고용노동정책 \n(21) 폴리텍 신중년 특화과정 29 \n(22) 생애경력설계서비스 30 \n(23) 재취업지원서비스 시행지원 32 \n3 장애인 \n(24) 장애인 고용장려금 33 \n(25) 장애인 신규고용장려금 34 \n(26) 장애인 표준사업장 설립 지원 35 \n(27) 자회사형 표준사업장 설립 지원 37 \n(28) 장애인 보조공학기기 지원 38 \n(29) 근로지원비용 지원 39 \n(30) 장애인 근로지원인 제도 40 \n(31) 장애인고용시설자금 융자 41 \n(32) 장애인고용시설·장비 무상지원 42 \n(33) 중증장애인지원고용 43 \n(34) 장애인 직업능력개발 지원 44 \n(35) 장애인 인턴제 47 \n(36) 장애인 취업성공패키지 48 \n(37) 중증장애인근로자 출·퇴근비용 지원 49 \n(38) 근로장애인 전환지원 50 \n(39) 고용지원 필요도 결정 51 \n4 여성(육아지원) \n(40) 출산 육아 지원 52 \n(41) 출산육아기 고용안정 지원 57 \n(42) 대체인력 채용지원서비스 59 \n(43) 고용보험 미적용자 출산급여 지원 60",
"page": "3",
"score": 0.372830153,
"policy_keywords": "취업준비중, IT 산업, 창업, 취업지원, 대졸, 서울, 28세"
},
{
"text": "한권으로 통(배)하는 \n고용노동정책 \n04 사업주 지원 장려금 \n1 고용장려금 \n(60) 고용촉진장려금 90 \n2 고용안정 및 일생활 균형 장려금 \n(61) 고용유지지원금 92 \n(62) 고용안정장려금(총괄) 94 \n(63) 워라밸일자리 장려금(소정근로시간단축제) 96 \n(64) 워라밸일자리 장려금(실근로시간단축제) 98 \n(65) 일·가정 양립 환경개선 지원 100 \n(66) 출산육아기 고용안정 지원 104 \n3 사회적기업 \n(67) 사회적기업 육성 106 \n4 지역고용 \n(68) 지역산업맞춤형 일자리 창출 지원 109 \n(69) 지역고용촉진 지원금 110 \n(70) 지역일자리 공시제 111 \n(71) 고용위기지역 지정 112 \n(72) 특별고용지원업종 지정 114 \n(73) 산업·일자리전환 지원금 116 \n5 기타 \n(74) 고용영향평가제도 117 \n(75) 고용형태공시제도 118 \n(76) 고용노동통계조사 120 \n(77) 인력수급전망 122",
"page": "5",
"score": 0.366481125,
"policy_keywords": "취업준비중, IT 산업, 창업, 취업지원, 대졸, 서울, 28세"
},
{
"text": "발간등록번호 \nMinistry of \n11-1494914-100002-10 Employment and Labor \n2025.02 \n2025 \n한 권으로 \n통(im)하는 \n고용노동 정책 \n고용노동부 사업 및 제도 \n고용노동부",
"page": "1",
"score": 0.32723102,
"policy_keywords": "취업준비중, IT 산업, 창업, 취업지원, 대졸, 서울, 28세"
}
],
"profile_summary": "age: 28\ngender: M\neducation: 대졸\nemployment_status: 취업준비중\nindustry: IT\nregion: 서울\ninterests: ['창업', '취업지원']"
}
사용자 프로필 기반 정책 추천(DB기반)
마지막으로 얘만 테스트하면 되는데 프로필이 없넹. 프로필 만들고 다시 테스트 하도록 하자.
프로필
프로필 생성 및 업데이트
.json형식으로 입력했다. 나중에 프론트단에서는 버튼형식으로 값 보내줄듯.
프로필 조회
프로필 API 끝.
다시 사용자 프로필 기반 정책 추천 (DB 기반)을 테스트해보자.
잘나온다. 이러면 정책이랑 프로필 부분 API test도 모두 마쳤다.
챗봇
{
"answer": "임신부를 위한 지원정책으로는 \"출산 육아 지원\"과 \"출산육아기 고용안정 지원\"이 있습니다. \"출산 육아 지원\"은 출산을 앞둔 임신부에게 출산 전후 지원을 제공하고, \"출산육아기 고용안정 지원\"은 출산 후 일자리 유지를 도와주는 정책입니다. \n따라서, 임신 중인 사용자에게는 출산 전후의 지원 및 일자리 유지를 위한 정책을 활용할 것을 추천드립니다. (출처: 한권으로 통(배)하는 고용노동정책, 4 여성(육아지원) - 출산 육아 지원, 출산육아기 고용안정 지원)",
"sources": [
{
"page": "3",
"text": "한권으로 통(배)하는 \n고용노동정책 \n(21) 폴리텍 신중년 특화과정 29 \n(22) 생애경력설계서비스 30 \n(23) 재취업지원서비스 시행지원 32 \n3 장애인 \n(24) 장애인 고용장려금 33 \n(25) 장애인 신규고용장려금 34 \n(26) 장애인 표준사업장 설립 지원 35 \n(27) 자회사형 표준사업장 설립 지원 37 \n(28) 장애인 보조공학기기 지...",
"similarity": null
},
{
"page": "5",
"text": "한권으로 통(배)하는 \n고용노동정책 \n04 사업주 지원 장려금 \n1 고용장려금 \n(60) 고용촉진장려금 90 \n2 고용안정 및 일생활 균형 장려금 \n(61) 고용유지지원금 92 \n(62) 고용안정장려금(총괄) 94 \n(63) 워라밸일자리 장려금(소정근로시간단축제) 96 \n(64) 워라밸일자리 장려금(실근로시간단축제) 98 \n(65) 일·가정 양립 환경개선 ...",
"similarity": null
},
{
"page": "2",
"text": "Contents \n01 취업 취약계층 고용안정 및 취업지원 \n1 청년 \n(1) 청년일자리도약장려금 사업 2 \n(2) 청년미래플러스 사업 3 \n(3) 청년도전지원사업 4 \n(4) 청년성장프로젝트 5 \n(5) 직장적응 지원 6 \n(6) 일학습병행 7 \n(7) 청년일경험지원 9 \n(8) 대학일자리플러스센터 운영 10 \n(9) 해외취업지원 11 \n(10) 능력중심...",
"similarity": null
},
{
"page": "4",
"text": "Contents \n(44) 직장어린이집 지원 61 \n(45) 경력단절여성취업지원 63 \n(46) 폴리텍 여성재취업과정 64 \n02 외국인력 제도 운영 및 지원 \n(47) 고용허가제도 66 \n(48) 외국인근로자 사업장 변경제도 68 \n(49) 재입국 특례 외국인근로자 취업 제도 70 \n(50) 특별한국어시험 재취업 제도 72 \n(51) 외국인근로자 체류 지...",
"similarity": null
},
{
"page": "1",
"text": "발간등록번호 \nMinistry of \n11-1494914-100002-10 Employment and Labor \n2025.02 \n2025 \n한 권으로 \n통(im)하는 \n고용노동 정책 \n고용노동부 사업 및 제도 \n고용노동부...",
"similarity": null
}
]
}
이것도 아직까지는 목차만 있어서 좀 아쉽긴하다. 본 내용을 더 추가해서 테스트 해야댈듯. 그래도 정상작동확인
이로써 모든 API 개발 및 테스트가 완료되었다.
약간 프로필이나 질문할때 기존 프로필을 쓸건지 질문하면서 내 정보를 알려줄지 이거 두개가 약간 고민인데 한번 생각해보고 진행해야겠다.
다음에 진행할 일
우선 파이프라인은 완성되었고 이제 5개페이지를 테스트해봤으니 100장 데이터를 넣어보자.
지금은 목차밖에 없어서 약간 테스트가 잘되는지 안되는지 불안한 감이 있다.
100장을 넣고나서 테스트하고나서 잘 작동되면 모든 319페이지를 집어넣고 테스트가 완료되면 이제 프론트작업으로 들어가면 되겠다.
프론트는 금방하니까 뭐. 솔직히 어려운 작업 다 끝낫다고 생각한다.