(*) 기존에 자바로하였으나.. 요즘은.. AI 학습에 관심이 생겨 파이썬으로 만들고 학습하면서
포스팅하였습니다.
LangChain과 LLM(대형 언어 모델)을 활용하면 사용자 선호도에 최적화된 추천 시스템을 효율적으로 구축할 수 있습니다.
이 시스템은 RAG(Retrieval-Augmented Generation), 임베딩 기반 검색, LLM 프롬프트 엔지니어링, 벡터 데이터베이스 등 다양한 기술을 종합적으로 활용하여 개인화된 영화 추천 서비스를 구현합니다.
# 예시 아이템 데이터 (영화 제목 및 설명)
items = [
{"id": 1, "title": "인셉션", "desc": "꿈을 조작하는 SF 스릴러"},
{"id": 2, "title": "인터스텔라", "desc": "우주를 탐험하는 과학 드라마"},
{"id": 3, "title": "인디스 밀라", "desc": "우주를 배경으로 한 가족과 희생"},
# ... 더 많은 아이템
]
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 1. 아이템 데이터 전처리 (영화 제목 및 설명)
# 2. 임베딩 생성 및 벡터 DB 저장
embedding_model = OpenAIEmbeddings()
docs = [item["desc"] for item in items]
vector_db = Chroma.from_texts(docs, embedding_model, metadatas=items)
from langchain.chat_models import ChatOpenAI
# 사용자의 최근 시청 기록 예시
user_history = [
"인셉션", "인터스텔라"
]
# LLM에게 선호 장르/키워드 요약 요청
llm = ChatOpenAI(model="gpt-4o")
prompt = f"""
나가 최근에 본 영화는 {', '.join(user_history)}입니다. 나가 좋아할 만한 장르니 키워드, 특질을 요약해줘.
"""
user_profile = llm.invoke(prompt)
print("사용자 프로필 요약:", user_profile)
# 사용자 프로필 임베딩과 아이템 벡터 간 유사도 검색
user_profile_embedding = embedding_model.embed_query(user_profile)
results = vector_db.similarity_search_by_vector(user_embedding, k=5)
# Chroma, Milvus 등 벡터 DB에서 top-N 후보 아이템 추출
# RAG 프레임워크 외부 데이터와 연동 가능
# 후보군과 사용자 프로필을 LLM에 프롬프트로 입력
candidate_titles = [r.metadata["title"] for r in results]
ranking_prompt = f"""
사용자 프로필: {user_profile}
후보 영화: {', '.join(candidate_titles)}
이 중에서 사용자가 가장 좋아할 만한 영화를 3개 추천하고, 그 이유를 각각 설명해줘.
"""
recommendations = llm.invoke(ranking_prompt)
print(recommendations)
코def recommend_movies(user_history, items, embedding_model, vector_db, llm):
# 1. 사용자 프로필 생성
prompt = f"나가 최근에 본 영화는 {', '.join(user_history)}입니다. 나가 좋아할 만한 장르니 키워드, 특질을 요약해줘."
user_profile = llm.invoke(prompt)
# 2. 후보 아이템 검색
user_embedding = embedding_model.embed_query(user_profile)
results = vector_db.similarity_search_by_vector(user_embedding, k=5)
# 3. LLM 기반 랭킹 및 추천
candidate_titles = [r.metadata["title"] for r in results]
ranking_prompt = f"""
사용자 프로필: {user_profile}
후보 영화: {', '.join(candidate_titles)}
이 중에서 사용자가 가장 좋아할 만한 영화를 3개 추천하고, 그 이유를 각각 설명해줘.
"""
recommendations = llm.invoke(ranking_prompt)
return recommendations
# 사용 예시
user_history = ["인셉션", "인터스텔라"]
recommendations = recommend_movies(user_history, items, embedding_model, vector_db, llm)
print(recommendations)
LLM의 환독서에어 벡터 위해 후보 아이템 리스트를 명량히 제공
프롬프트 엔지니어링으로 추천 이유, 사용자 맞춤 설명 등 자연스러운 UX구현
피드백 루프를 통해 추천 품질 지속 개선
LangChain과 LLM, 벡터 DB, RAG 프레임워크를 결합하면 사용자 선호도 기반의 고도화된 추천 시스템을 빠르고 유연하게 구축할 수 있습니다.
특히 자연어 기반의 개인화된 추천 이유 제공과 실시간 대화형 인터페이스를 통해 기존 추천 시스템 대비 월등한 사용자 경험을 제공할 수 있습니다.