안녕하세요. 드디어 본격적인 개발 후기로 찾아뵙니다. 제가 개발단계에 들어가면서 가장 처음으로 개발했던 내용인데요.
개발 배경
Squadify는 가상의 회사 홈페이지에서 SSO 로그인을 통해 바로 이용할 수 있는 서비스입니다. 추가적으로 기획 단계에서 Squadify 최초 실행 시 기존의 ERP 인사 데이터를 바로 한 번에 가져올 수 있으면 좋겠다는 이야기가 있었습니다. 따라서 가상의 회사 내부의 ERP 인사 데이터가 있을 것이고, 우리 Squadify를 최초 실행을 했을 때 우리 서비스에 맞게 데이터를 가공하고, 사원들의 역량을 분석하는 최초 실행 작업이 필요해집니다.
기존 ERP 인사 데이터
그럼 첫 번째로 나올 수 있는 질문이 "가상 ERP 인사 데이터를 어떻게 확보했는가?" 입니다. 바로 시뮬레이션으로 해결했습니다. 실제 회사처럼 입사, 퇴사, 프로젝트 진행, 프로젝트 완료, 동료평가 등 이벤트가 존재하고, 사원들의 감정지수, 성격 같은 여러가지 요소를 반영하였습니다. 시간이 흐르는 것 또한 존재하기 때문에 시간이 갈수록 데이터가 쌓이는 식입니다. 본격적인 개발을 들어가기 위해서 mock-up 데이터 확보가 우선이고, 시연 단계에서도 활용할 수 있을 것 같아서 먼저 작업을 진행하게 되었네요!
최초 실행 로직
최초 실행 로직 파이프라인은 다음과 같은 단계를 거칩니다.
- 가상 ERP 인사 데이터는 .db 데이터베이스 파일로 구성이 되어있습니다. 사용할 ERP 테이블을 모두 긁어옵니다.
- 사원들의 동료평가 데이터를 저장할 GraphDB 동기화를 시작합니다. GraphDB는 neo4j를 사용하였습니다.
- 본격적인 ERP 인사 데이터들을 Squadify의 데이터베이스에 저장합니다.
- ERP 인사 데이터들 중 이력서, 포트폴리오, 프로젝트 경험 이력 등을 청킹하여 벡터 임베딩을 진행한 뒤, 데이터베이스에 저장합니다.벡터 데이터베이스는 따로 구성하지 않았고 PostgreSQL의 RDB에 pgvector 플러그 인을 사용하여 벡터 데이터를 저장하도록 구성했습니다. 임베딩 모델은 OpenAI의 text-embbeding-3를 사용하였습니다.
- 모든 데이터 저장이 완료되어 Squadify를 사용할 수 있습니다. 역량 수치화 에이전트를 호출하여 사원들의 데이터를 바탕으로 모든 사원들의 역량을 수치화합니다.
생각했던 부분들
- 저희 Squadify는 MSA입니다. 따라서 처음에는 초기 데이터 저장을 진행할 때도 MSA 원칙을 지키며 각 서비스의 API 호출을 통해 데이터베이스를 접근하려고 했습니다. 그러나 초기화 로직이 진행되는 부분은 말 그대로 초기 단계이기 때문에, SQL문을 통해 직접 데이터베이스에 접근하는 식으로 구성하였습니다. 실제 서비스에서도 이렇게 대규모 DB 작업이 이루어지는 경우 잠시 서비스를 내리고 진행한다고 하네요!
- 벡터 임베딩을 진행할 때 청킹은 1000자마다 청킹, overlap 되는 부분은 100자로 진행하였습니다. 추후 사원 검색 기능의 정확도가 낮아질 경우 다른 전략을 사용하려 했습니다만 정확도에 큰 문제가 없었습니다.

자세한 코드는 아래 깃허브 링크에서 확인하실 수 있습니다.
ai/app/services/erp_sync_service.py at dev · lgcns-squadify/ai
Contribute to lgcns-squadify/ai development by creating an account on GitHub.
github.com