피드로 돌아가기
Building a Playlist Generator with Sentence Transformers
Hugging Face BlogHugging Face Blog
AI/ML

Sentence Transformers 라이브러리와 Gradio Blocks API를 결합해 텍스트 프롬프트 기반 음악 플레이리스트 생성 시스템 구축

Building a Playlist Generator with Sentence Transformers

2022년 7월 13일9intermediate

Context

전체 곡의 가사를 단일 임베딩으로 변환하려 했을 때 Sentence Transformers의 msmarco-MiniLM-L-6-v3 모델의 최대 시퀀스 길이 512 토큰 제한으로 인해 전체 가사가 잘려나갔다.

Technical Solution

  • 곡 가사를 구절(verse) 단위로 분할: 전체 가사 대신 각 구절을 별도로 임베딩하여 모델의 512 토큰 제한 준수
  • Sentence Transformers .encode() 메서드로 구절 임베딩 생성: 문자열 리스트를 입력받아 임베딩 벡터 생성
  • 생성된 임베딩을 Pickle 형식으로 저장: 임베딩을 pickle.dump()로 직렬화해 재사용 가능한 파일로 보관
  • util.semantic_search() 함수로 의미론적 검색 수행: 사용자 프롬프트의 임베딩과 가사 임베딩들 사이의 코사인 유사도 기반 상위 결과 반환
  • top_k=20으로 설정해 검색 결과 확대: 같은 곡의 여러 구절이 반환되더라도 중복 제거 후 최소 9개의 서로 다른 곡 확보
  • Gradio Blocks API를 사용해 다단계 인터랙티브 앱 구현: fetch_songs 함수가 .update() 메서드로 Radio 컴포넌트의 선택지를 동적으로 업데이트
  • Hugging Face Spaces에 배포: Gradio 프로젝트를 Python 코드만으로 클라우드 호스팅

Key Takeaway

Sentence Transformers의 사전학습 모델과 의미론적 검색 기능을 활용하면 제한된 시퀀스 길이라는 제약을 도메인별 데이터 분할로 해결할 수 있으며, Gradio Blocks의 컴포넌트 동적 제어를 통해 복잡한 멀티스텝 UI를 Python만으로 구현할 수 있다.


텍스트 검색 기능이 필요한 서비스에서 긴 문서를 처리할 때, 모델의 최대 시퀀스 길이를 초과하는 경우 전체 임베딩 대신 의미론적으로 의존적인 단위(문단, 구절, 문장)로 분할한 후 각각 임베딩하면 모델 제약을 우회하면서도 검색 품질을 유지할 수 있다.

원문 읽기