일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- GCP
- top_k
- youtube data
- gather_nd
- GenericGBQException
- Counterfactual Explanations
- 공분산
- BigQuery
- XAI
- correlation
- requests
- spark udf
- Airflow
- chatGPT
- API Gateway
- TensorFlow
- flask
- 유튜브 API
- hadoop
- integrated gradient
- airflow subdag
- API
- grad-cam
- tensorflow text
- UDF
- subdag
- Retry
- session 유지
- login crawling
- 상관관계
- Today
- Total
데이터과학 삼학년
LLM을 활용한 추천 시스템 본문
LLM을 활용한 추천 시스템: 넷플릭스 데이터셋 사례
추천 시스템은 방대한 콘텐츠 속에서 사용자들이 적합한 항목을 찾을 수 있도록 돕는 중요한 역할을 하고 있습니다. 여러분이 이 글을 발견한 것도 추천 시스템 덕분일 가능성이 높습니다.
기존의 추천 시스템은 주로 협업 필터링과 콘텐츠 기반 필터링에 의존해 왔습니다. 하지만 최근 등장한 **대규모 언어 모델(LLMs)**은 이 분야에 새로운 가능성을 열어주고 있습니다. 이번 글에서는 넷플릭스 데이터셋을 활용하여 LLM 기반 추천 시스템을 구축하는 과정을 소개하고, 이 기술이 추천 시스템을 어떻게 혁신하는지 알아보겠습니다.
LLM이 추천 시스템에서 게임 체인저가 되는 이유
LLM은 기존 추천 시스템과 비교해 여러 가지 독특한 강점을 제공합니다.
1. 풍부한 세계 지식
LLM은 방대한 데이터 학습을 통해 축적된 세계 지식을 내포하고 있어, 보다 세부적이고 문맥적으로 적합한 추천이 가능합니다.
2. 제로샷 및 퓨샷 학습 능력
사전 학습된 모델로도 새로운 추천 시나리오에 빠르게 적응할 수 있습니다.
3. 고품질 텍스트 표현 생성
텍스트를 이해하고 표현하는 데 강점을 가져, 더 정교한 콘텐츠 기반 추천이 가능합니다.
시스템 개념과 설계
이 시스템의 핵심은 LLM을 활용해 영화 설명을 임베딩(embedding)으로 변환하는 것입니다. 이 임베딩은 영화의 의미적 정보를 내포하며, 이를 기반으로 유사한 영화를 빠르게 찾을 수 있습니다. 유사성 검색은 FAISS(Facebook AI Similarity Search) 라이브러리를 활용해 효율적으로 수행됩니다.
구현 과정
1. 데이터 준비
먼저 넷플릭스 데이터셋을 불러와 각 영화의 다양한 정보를 텍스트로 결합합니다.
import pandas as pd
df = pd.read_csv("netflix_titles.csv")
def create_textual_representation(row):
return f"""Type: {row['type']}, Title: {row['title']}, Director: {row['director']}, Cast: {row['cast']}, Released: {row['release_year']}, Genres: {row['listed_in']}, Description: {row['description']}"""
df['textual_representation'] = df.apply(create_textual_representation, axis=1)
이 과정은 영화의 타입, 제목, 감독, 배우, 장르, 설명 등의 정보를 하나의 텍스트로 결합합니다. 이렇게 생성된 텍스트는 LLM의 입력값으로 사용됩니다.
2. 임베딩 생성
LLM(LLaMA 2)을 활용하여 각 텍스트의 임베딩을 생성합니다. 아래는 로컬 API를 사용하여 임베딩을 생성하는 예제입니다.
import requests
def get_embedding(text):
res = requests.post('http://localhost:11434/api/embeddings', json={'model': 'llama2', 'prompt': text})
return res.json()['embedding']
최적화 팁
- 임베딩 캐싱: 반복 작업을 줄이기 위해 생성된 임베딩은 로컬 파일에 저장합니다.
- 병렬 처리: 데이터가 클 경우, ThreadPoolExecutor를 사용해 병렬로 임베딩을 생성하여 처리 속도를 높입니다.
3. FAISS 인덱스 생성
FAISS를 사용해 임베딩 기반 유사성 검색을 위한 인덱스를 생성합니다.
import faiss
index = faiss.IndexFlatL2(4096) # 임베딩 차원 크기
index.add(X) # X는 생성된 임베딩 배열
FAISS는 대규모 데이터셋에서도 빠른 유사성 검색이 가능하며, 확장성 있는 구조를 제공합니다.
4. 추천 생성
특정 영화와 유사한 영화를 추천하려면 해당 영화의 임베딩을 기준으로 인덱스에서 가장 가까운 임베딩을 찾습니다.
def get_recommendations(movie_index, num_recommendations=5):
movie_embedding = X[movie_index].reshape(1, -1)
D, I = index.search(movie_embedding, num_recommendations + 1)
return df.iloc[I[0][1:]] # 입력 영화는 제외
예를 들어, favorite_movie_index = 1358로 설정하면, 해당 영화와 유사한 영화 목록을 출력할 수 있습니다.
이 접근법의 장점
1. 의미적 이해
LLM을 통해 설명, 장르, 캐스트 등 다양한 정보를 학습하여 영화 간의 미묘한 관계를 이해할 수 있습니다.
2. 유연성
새로운 특성(feature)을 쉽게 추가하거나, 텍스트 외 다른 콘텐츠로도 확장 가능합니다.
3. 확장성
FAISS를 통해 수백만 개 이상의 항목을 효율적으로 처리할 수 있습니다.
4. 콜드 스타트 문제 해결
사용자 기록이 없는 경우에도 콘텐츠 기반 추천이 가능해 초기 사용자 경험을 개선할 수 있습니다.
한계점 및 개선 방향
1. 텍스트 품질 의존성
영화 설명이나 메타데이터가 부실할 경우, 추천 품질이 낮아질 수 있습니다.
2. 개인화 부족
사용자 선호도와 시청 기록을 반영하지 않아 개인화된 추천이 어렵습니다.
3. 모델 성능 의존성
사용하는 LLM과 임베딩 품질에 따라 시스템 성능이 크게 좌우됩니다.
4. 실시간 응답성
대규모 데이터에서 실시간으로 작동하려면 추가적인 최적화가 필요합니다.
결론
LLM을 활용한 추천 시스템은 기존 방식과는 다른 차원의 추천 경험을 제공합니다. 텍스트 데이터를 보다 깊이 이해하고 활용할 수 있어 더 정교한 추천이 가능하며, 특히 콘텐츠 기반 추천에 강점을 보입니다.
이 글에서 소개한 구현은 비교적 간단한 예제지만, LLM과 FAISS의 결합을 통해 고도화된 추천 시스템 구축의 가능성을 보여줍니다. 앞으로 LLM 기술이 더욱 발전하면서 추천 시스템의 새로운 패러다임이 열릴 것으로 기대됩니다.
참고 자료
- Netflix Titles Dataset: Kaggle
- FAISS Documentation: FAISS GitHub
'Recommendation System' 카테고리의 다른 글
MAB(Multi-Armed Bandit), 톰슨 샘플링 (0) | 2025.01.24 |
---|---|
Learning to Rank :: Pointwise, Pairwise, Listwise (2) | 2024.09.05 |
추천시스템 :: Retrieval, Ranking (1) | 2024.09.02 |
추천 메트릭 :: Precision@k, Recall@k, MAP, MRR, NDCG , AP, F1-Score, Coverage, Diversity, Novelty (0) | 2024.08.28 |
추천 Ranking 알고리즘 관련 metric :: NDCG (0) | 2024.08.23 |