IT기술/랭체인 (langchain)

LangChain과 LLM을 활용한 사용자 선호도 기반 추천 시스템 구축 가이드

후스파 2025. 7. 16. 07:58
반응형

LangChain과 LLM(대형 언어 모델)을 활용하면 사용자 선호도에 최적화된 추천 시스템을 효율적으로 구축할 수 있습니다. 최근에는 RAG(Retrieval-Augmented Generation), 임베딩 기반 검색, LLM 프롬프트 엔지니어링, 벡터 데이터베이스 등 다양한 기술이 결합되어 추천 시스템의 정확도와 사용자 경험이 크게 향상되고 있습니다.


아키텍처 개요

LangChain 기반 추천 시스템은 다음과 같은 단계로 설계됩니다:
1. 사용자 행동 데이터 수집
클릭, 구매, 평점 등 사용자-아이템 상호작용 기록을 저장합니다.
2. 사용자 프로필 생성
LLM을 활용해 사용자 행동 이력으로부터 자연어 기반 프로필(선호 장르, 특징 키워드 등)을 추출합니다.
3. 후보 아이템 검색(Candidate Retrieval)
임베딩 벡터 DB(예: Chroma, Milvus 등)에서 유사한 아이템을 빠르게 검색합니다.
4. LLM 기반 랭킹 및 추천
후보 아이템과 사용자 프로필을 프롬프트로 LLM에 입력, reasoning을 통해 최적의 추천 리스트를 생성합니다.
5. 추천 결과 제공 및 피드백 수집
추천 결과를 사용자에게 제공하고, 실제 행동 피드백을 다시 데이터로 수집해 모델을 지속적으로 개선합니다.


핵심 설계 및 구현 방법

데이터 준비 및 임베딩

사용자-아이템 상호작용 데이터를 CSV, DB 등으로 준비하고, 아이템(예: 영화, 음악, 상품 등) 설명을 임베딩하여 벡터 DB에 저장합니다. LangChain의 임베딩 툴과 벡터 DB 연동 기능을 활용합니다.

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# 1. 아이템 데이터 예시 (영화 제목 및 설명)
items = [
    {"id": 1, "title": "인셉션", "desc": "꿈을 조종하는 SF 스릴러"},
    {"id": 2, "title": "라라랜드", "desc": "음악과 사랑의 로맨스"},
    {"id": 3, "title": "인터스텔라", "desc": "우주를 배경으로 한 가족과 희생"},
    # ... 더 많은 아이템
]

# 2. 임베딩 생성 및 벡터 DB 저장
embedding_model = OpenAIEmbeddings()
docs = [item["desc"] for item in items]
vector_db = Chroma.from_texts(docs, embedding_model, metadatas=items)

사용자 프로필 생성 (LLM 활용)

LLM에 사용자 행동 이력(예: 최근 시청/구매 목록)을 프롬프트로 입력하여 "이 사용자가 선호할 만한 장르, 특징 키워드를 요약해줘"와 같은 자연어 요청을 통해 사용자 프로필을 생성합니다.

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)

후보 아이템 검색 (Retrieval)

사용자 프로필 임베딩과 아이템 벡터 간 유사도 검색을 통해 Chroma, Milvus 등 벡터 DB에서 top-N 후보 아이템을 추출합니다. RAG 프레임워크로 외부 데이터와 연동도 가능합니다.

# LLM이 추출한 사용자 프로필을 임베딩
user_embedding = embedding_model.embed_query(user_profile)

# 벡터 DB에서 유사 아이템 5개 검색
results = vector_db.similarity_search_by_vector(user_embedding, k=5)
for r in results:
    print(r.metadata["title"], r.metadata["desc"])

LLM 기반 랭킹 및 추천

후보 아이템, 사용자 프로필, 최근 행동 등을 하나의 프롬프트로 LLM에 입력하여 "이 사용자가 다음에 좋아할 만한 아이템을 추천해줘. 이유도 함께 설명해줘."와 같은 요청을 통해 최종 추천 리스트와 설명을 생성합니다.

# 후보군과 사용자 프로필을 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)

피드백 루프 및 지속적 개선

추천 결과에 대한 사용자 반응(클릭, 구매, 평가 등)을 지속적으로 수집하여 LLM 파인튜닝 및 임베딩 업데이트에 활용합니다.

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

# 사용 예시
recommendations = recommend_movies(user_history, items, embedding_model, vector_db, llm)
print(recommendations)

LangChain의 역할과 장점

모듈화: 데이터 수집, 임베딩, 검색, LLM 프롬프트, 결과 생성 등 각 단계를 체인/에이전트로 분리해 관리할 수 있습니다.
다양한 데이터 소스 통합: DB, API, 실시간 로그 등 다양한 소스 연동이 용이합니다.
대화형 추천: 사용자의 자연어 질의에 맞춰 맞춤형 추천 및 설명을 제공합니다.
확장성: LLM, 임베딩 모델, 벡터 DB 등 다양한 백엔드와 손쉽게 연동할 수 있습니다.


예시 워크플로우 (영화 추천 기준)

  1. 사용자가 "최근에 본 영화와 비슷한 코미디 영화 추천해줘"라고 요청
  2. LangChain이 사용자 행동 이력과 요청을 LLM에 전달, 선호 장르/키워드 추출
  3. 벡터 DB에서 유사 코미디 영화 후보군 검색
  4. 후보군과 사용자 프로필을 LLM 프롬프트에 입력, 최적 추천 리스트 생성
  5. 결과와 추천 이유를 사용자에게 자연어로 제공

실전 팁

LLM의 할루시네이션 방지를 위해 후보 아이템 리스트를 명확히 제공하고, 프롬프트 엔지니어링으로 추천 이유, 사용자 맞춤 설명 등 자연스러운 대화형 UX를 구현합니다. 또한 피드백 루프를 통해 추천 품질을 지속적으로 개선해야 합니다.


마무리

LangChain과 LLM, 벡터 DB, RAG 프레임워크를 결합하면 사용자 선호도 기반의 고도화된 추천 시스템을 빠르고 유연하게 구축할 수 있습니다. 이러한 시스템은 기존의 협업 필터링이나 콘텐츠 기반 필터링의 한계를 극복하고, 자연어 기반의 직관적인 추천 경험을 제공합니다.

반응형