시작하며
채용 시장의 경쟁이 더욱 치열해지면서, 기업들이 적합한 인재를 신속하고 효율적으로 찾는 것이 중요해지고 있습니다. 기존의 채용 방식은 많은 시간과 자원을 소모할 뿐만 아니라, 그 과정에서 실수가 발생하기 쉽습니다. 인공지능(AI) 기술의 발전은 이러한 문제를 해결할 수 있는 새로운 가능성을 보여주고 있습니다. 특히 SBERT(Sentence-BERT) 같은 자연어 처리 모델을 이용한 AI 기반 인재 소싱은 채용 프로세스에 혁신적인 변화를 가져오고 있습니다.
SBERT는 이력서와 직무 설명 간의 유사도를 정확하게 분석하여 기업이 필요로 하는 포지션에 가장 적합한 인재를 추천할 수 있습니다. 이번 글에서는 간단한 예제를 통해 SBERT가 채용 과정에서 어떻게 활용될 수 있는지 알아보겠습니다.
자연어 처리(NLP)란
자연어 처리(NLP, Natural Language Processing)는 컴퓨터가 인간의 언어를 이해하고 처리할 수 있도록 하는 기술입니다. NLP는 텍스트나 음성 데이터를 기계가 이해할 수 있는 형식으로 변환하는 작업을 포함하며, 언어의 의미를 분석하여 다양한 응용 프로그램에 활용됩니다. 예를 들어, 문서 분류, 감정 분석, 기계 번역 등이 NLP의 대표적인 응용 분야입니다. 인재 소싱에서도, NLP는 이력서나 직무 설명과 같은 텍스트 데이터를 분석하여 적합한 후보자를 선별하는 데 중요한 역할을 합니다.
임베딩(Embedding)
임베딩(Embedding)은 자연어 데이터를 고차원의 벡터로 변환하는 기술입니다. 인간의 언어는 매우 복잡하고 다양하지만, 컴퓨터는 숫자 데이터를 더 잘 처리할 수 있습니다. 이를 해결하기 위해 텍스트를 고차원의 벡터로 변환하여 의미를 보존할 수 있습니다. 이러한 벡터는 단어의 의미적 유사도를 계산할 수 있게 해주며, 같은 의미를 가진 단어들이 비슷한 벡터 공간에 위치하도록 학습됩니다.
코사인 유사도(Cosine Similarity)
코사인 유사도는 두 벡터 간의 유사도를 측정하는 방법으로, 벡터의 방향이 얼마나 유사한지를 나타냅니다. 벡터의 크기는 무시하고, 오직 벡터 간의 각도로 유사도를 계산하는 방식입니다. 두 벡터가 이루는 각이 0도에 가까울수록 유사도가 높고, 90도에 가까울수록 유사도가 낮다는 개념에 기반합니다.
코사인 유사도는 일반적으로 다음과 같은 수식으로 계산됩니다:
여기서:
•
와 는 비교할 두 벡터입니다.
•
는 두 벡터의 내적(inner product)입니다.
•
와 는 각각 벡터의 크기(벡터의 L2 노름)입니다.
SBERT (Sentence-BERT)
SBERT는 BERT 모델을 기반으로 한 문장 수준의 임베딩을 생성하는 모델로, 문장 간의 유사도 계산을 보다 빠르고 효율적으로 할 수 있도록 설계되었습니다. BERT는 단어 수준에서 의미를 포착하는 데 탁월하지만, 문장 수준에서의 비교나 유사도를 측정하기 위해서는 여러 번의 계산이 필요하여 처리 속도가 느려질 수 있습니다.
반면, SBERT는 BERT의 기본 아키텍처를 활용하면서 문장 입력을 받아 고정된 크기의 벡터로 변환합니다. 이를 통해 각 문장은 고유한 벡터로 표현되며, 이후 이 벡터들을 사용해 문장 간 유사도를 빠르고 효과적으로 계산할 수 있습니다. SBERT는 문장 임베딩을 생성하는 데 최적화되어 있어 대규모 텍스트 데이터에서 문장 간 유사도를 빠르게 계산하는 데 유리합니다.
SBERT는 특히 텍스트 검색이나 문서 분류 같은 작업에서 뛰어난 성능을 발휘하며, 유사도 기반의 추천 시스템 또는 인재 소싱에서 문장 수준의 유사도를 빠르고 정확하게 계산할 수 있도록 지원합니다.
코드 예시: BERT를 활용한 인재 소싱
이제, SBERT 모델을 활용하여 이력서와 직무 설명 간의 유사도를 계산하는 간단한 Python 코드 예시를 살펴보겠습니다. 이 코드는 sentence-transformers 라이브러리를 사용하여 SBERT 모델을 로드하고, 이력서와 직무 설명을 임베딩 벡터로 변환한 뒤, 두 벡터 간의 코사인 유사도를 계산합니다.
1단계: 필요한 라이브러리 로드
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import torc
Python
복사
•
SentenceTransformer는 SBERT 모델을 사용할 수 있도록 해주는 라이브러리입니다.
•
cosine_similarity는 두 벡터 간의 유사도를 계산할 때 사용됩니다.
•
torch는 PyTorch를 사용할 때 필요한 라이브러리입니다.
2단계: 모델 로드
model = SentenceTransformer('bert-base-multilingual-cased')
Python
복사
•
bert-base-multilingual-cased는 여러 언어를 처리할 수 있는 BERT 모델로, 한국어도 포함됩니다.
3단계: 이력서와 직무 설명 텍스트 정의
job_description_text = "이 직무는 데이터 분석을 수행하고, 고객 데이터를 분석하여 비즈니스 결정을 지원하는 역할입니다."
resumes = [
"데이터 분석을 통해 비즈니스 성과를 최적화한 경험이 있습니다.",
"고객 데이터를 분석하고, 마케팅 전략을 수립하여 매출 증가를 이끌었습니다.",
"프로그래밍 및 데이터 분석에 대한 전문 지식을 가지고 있으며, 복잡한 데이터를 해석할 수 있습니다."
]
Python
복사
4단계: 텍스트 임베딩 생성
job_description_embedding = model.encode(job_description_text)
resume_embeddings = model.encode(resumes)
Python
복사
•
model.encode() 함수는 텍스트를 임베딩 벡터로 변환합니다.
•
job_description_embedding은 직무 설명의 임베딩 벡터이고, resume_embeddings는 이력서들의 임베딩 벡터입니다.
5단계: 코사인 유사도 계산
cosine_similarities = [cosine_similarity([job_description_embedding], [resume_embedding])[0][0]
for resume_embedding in resume_embeddings]
Python
복사
•
cosine_similarity 함수는 두 벡터 간의 유사도를 계산합니다.
•
각 이력서에 대해 직무 설명과의 유사도를 계산하여 cosine_similarities 리스트에 저장합니다.
6단계: 유사도에 따른 이력서 순위 출력
ranked_resumes = sorted(zip(cosine_similarities, resumes), reverse=True, key=lambda x: x[0])
for rank, (similarity, resume) in enumerate(ranked_resumes, start=1):
print(f"순위 {rank}: 유사도 {similarity:.4f} - {resume}")
Python
복사
•
zip을 사용하여 유사도와 이력서를 묶고, sorted로 유사도 기준 내림차순 정렬합니다.
•
enumerate를 사용하여 각 이력서에 대한 순위를 출력합니다.
최종 출력 예시
순위 1: 유사도 0.8234 - 데이터 분석을 통해 비즈니스 성과를 최적화한 경험이 있습니다.
순위 2: 유사도 0.7625 - 고객 데이터를 분석하고, 마케팅 전략을 수립하여 매출 증가를 이끌었습니다.
순위 3: 유사도 0.6547 - 프로그래밍 및 데이터 분석에 대한 전문 지식을 가지고 있으며, 복잡한 데이터를 해석할 수 있습니다.
Shell
복사
마치며
AI를 활용한 인재 소싱은 전통적인 방법에 비해 더욱 정교하고 효율적인 결과를 제공합니다. 자연어 처리 기술을 통해 맞춤형 인재 검색이 가능해지면서, 기업은 필요한 인재를 보다 신속하고 정확하게 발굴할 수 있습니다.
Talent Seeker를 통해 AI 기반 인재 소싱 솔루션을 직접 경험해 보세요.
참고문헌
•
Reimers, N. (2019). Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks. arXiv preprint arXiv:1908.10084.
•
Devlin, J. (2018). Bert: Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805.
•
Vaswani, A. (2017). Attention is all you need. Advances in Neural Information Processing Systems.
•
Mikolov, T. (2013). Efficient estimation of word representations in vector space. arXiv preprint arXiv:1301.3781, 3781.



