MLOps 부트캠프 by 한경+토스뱅크

금융 데이터 AI 챗봇 개발기: 3) 추천 알고리즘, 개인 선호도를 반영한 레포트 추천 기능 만들기

나니니 2025. 1. 20. 23:33
👇 이전 포스팅은 아래에서 확인할 수 있습니다. 👇 
 금융 데이터 AI 챗봇 개발기: 1) 그래서 PDF를 어떻게 분석할건데? (기획부터 데이터 전처리까지) 
   - 출처: https://nanini.tistory.com/90
금융 데이터 AI 챗봇 개발기: 2) LLM 모델을 통한 챗봇 만들기 (RAG부터 Chain까지)
   - 출처: https://nanini.tistory.com/91 

 
LLM은 마무리 되었으니!
이제 추천 알고리즘을 만들어보자. 
 

구현 배경

여기서 짚고 넘어가야 할 부분이
추천 알고리즘? 추천 모델? 추천 시스템? 헷갈리는 부분이 있어
개념을 다시한번 정리해보면 아래와 같다. 

  • 추천 시스템 > 추천 알고리즘 > 추천 모델
    • 추천 모델: 알고리즘을 구현한 구체적인 형태
    • 추천 알고리즘: 추천을 생성하는 방법론/로직
    • 추천 시스템: 전체 추천 서비스 인프라 (*아래 관계도 참고)
추천 시스템 (Recommendation System)
├── 데이터 파이프라인
├── 추천 알고리즘들 (Recommendation Algorithms)
│   ├── 추천 모델 1 (예: 협업 필터링 모델)
│   ├── 추천 모델 2 (예: 콘텐츠 기반 모델)
│   └── 추천 모델 3 (예: 하이브리드 모델)
├── 평가 시스템
├── 모니터링
└── API/서비스 인터페이스

 
 
고로 내가 만든 코드를 claude에 물어보니
모델의 특징과 학습 과정이 없어서 '간단한 규칙 기반 추천 알고리즘'이라고 한다. 
 
맞다.

하지만 초기에는 이 서비스의 핵심 기능으로써, 개인의 선호도에 따른 추천 알고리즘을 구현하고자 했었다. 
예를 들어, 넷플릭스 추천 시스템처럼 로그인을 하면 유저의 행동에 기반해 성별, 연령대별, 시간대별, 선호 기업 및 산업군별, 검색 기록에 의한 콘텐츠 유사도 등을 고려하여 자동 갱신되는 추천 알고리즘을 구현하는 것이 목표였다.
만약 구현된다면 서비스의 핵심 강점으로 내세울 수 있었을 것이다.
 
그러나
왕왕 발생하는 한정적인 리소스(시간, 자원, 기술력)의 한계에 부딪혀
매우 심플한 추천 알고리즘이 탄생했다. 
 

기본 원리 - 콘텐츠 기반 필터링

먼저 아래 ERD의 '유저 리포트 테이블'에서 아래 정보들을 가져온다. 

  • preferredIndustries: 선호하는 산업 목록
  • preferredCompanies: 선호하는 기업 목록
  • bookmark: 북마크한 리포트 목록
  • downLoad: 다운로드한 리포트 목록
  • recentReports: 최근 본 리포트 목록
RePick ERD

그런 다음 이 정보들을 조합해서 레포트를 추천하게 되는데
1. 선호도 정보가 없는 경우 2. 선호도 정보가 있는 경우 로 나뉘게 된다. 
 
1. 선호도 정보가 없는 경우는, 
해당 사이트에 막 가입한, 선호도와 관련된 그 어떠한 데이터도 쌓이지 않은 '신규 사용자'에 해당한다. 
이때 콜드 스타트 문제가 발생하기 때문에 어떤 정보를 추천해주면 좋을 지 고민하다가, 
'최신순을 기준으로 한 레포트'와 '북마크/다운로드를 시도한 레포트'와 유사한 레포트를 추천해주는 것으로 구현했다. 
여기서 '유사한 레포트'는 '같은 증권사'로 한정했다.
 
왜 '유사한 레포트' = '같은 증권사'로 한정했는가?

레포트 DB에 저장되는 필드값은 각각 '기업명, 레포트 제목, 발행 증권사, 발행일자', '산업군, 레포트 제목, 발행 증권사, 발행일자'이다. 
추천 알고리즘은 유저의 선호도에 따른 '기업/산업별' 레포트를 추천하게 되는데, 이때 기업과 산업에 공통되는 필드가 '발행 증권사'였다.
이러한 결과로
'유사한 레포트'는 같은 증권사에서 발행한 레포트로 한정했다. 
 
2. 선호도 정보가 있는 경우는, 
회원가입 또는 마이페이지에서 선호하는 기업과 산업을 선택한 경우에 해당한다. 
이때, '유저 리포트 테이블'에서 가져온 북마크, 다운로드 기록, 선호 산업 및 기업 정보, 최근 조회한 리포트에
가중치를 차등 부여하여 각 항목에 대한 추천 순위를 매겼다. 
 
가중치는 다음과 같이 설정했는데, 
유저가 직접 관심을 표현한 것인, '북마크된 레포트 기업과 동일한 기업의 다른 레포트'는 3점으로 했고, 
북마크된 레포트에서 증권사가 동일한 것은 1점, 그리고 유저가 선호한다고 지정한 기업들의 레포트에는 2점을 설정하여
유저의 행동에 가중치를 두었다. 

단,
이미 북마크 또는 다운로드했거나
최근에 본 레포트는 추천하지 않도록 설정하여
기존 정보와 추천 결과가 중복되지 않도록 했다. 

  • 북마크된 리포트와 동일한 기업의 다른 레포트: 3점
    • 이유: 유저가 직접 관심을 표현한 가장 확실한 선호도 지표
  • 사용자가 선호하는 기업최신 리포트: 2점
    • 이유: 명시적으로 선호한다고 표현한 기업 관련 정보
  • 동일한 증권사의 레포트: 1점
    • 이유: 간접적인 연관성을 가진 정보

 

구현 결과

 
이제 두근대는 마음으로 랜덤 생성한 유저 데이터에
기업별, 산업별 각각 5개씩 추천 레포트가 생성되도록 추천 알고리즘을 적용해보았다.
 

recoommendations

 
아래에 추천 알고리즘에 따른 추천레포트가 각각 생성된 것을 확인할 수 있었다. 
(*레포트는 레포트ID로 구분됨)

추천 알고리즘 결과

 
이렇게 구현된 부분은
마이페이지와 메인페이지에 보여지게되는데, 
특히
메인페이지에서 로그인 전/후에 따른 레포트가 다르게 나타난다.
 
1) 로그인 전에는 모든 레포트가 '최신순'으로 노출된다. 
 
 

로그인 전 - 최신순 정렬

2) 로그인 후에는 개인의 선호도가 반영된 '추천' 레포트로 변경된다.

 
 일단 부랴부랴 구현은 했는데....
 
만들고보니
초기 기획했던 추천 알고리즘에 비해서는
너무 단순하게 콘텐츠 추천 기반 알고리즘만 적용되다보니

이렇게 단순한 추천 알고리즘을 적용하는 것이 맞는가? 하는 의구심이 들었다. 
 
그래서
나의 파트너 claude에게 물어보았다.
역시 말 잘하는 claude답게
현 추천 알고리즘에 대한 문제점과 한계를 알려주었다. 
 

문제점 및 한계점


위에서 설정한 '가중치'는
유저의 실제 행동에 기반한 검증이 이루어지지 않은, 임의적으로 설정된 문제가 있다고 한다.
 
즉, A/B 테스트를 통해 최적화도 하고, 검증도 해야 하는데 구체적인 설정 근거가 없다는 것이다. 
 
그리고 또,
발생 가능한 상황별 차별화가 부족했다고 한다. 
'시간' 요소를 고려하여 시간에 따른 가중치 감소를 적용하거나,
유저의 활동 빈도 고려한 내용이 없다는 것이다.
 
아쉽지만 너무 공감하는 포인트다..!

'가중치'를 설정한 구체적, 수치적 근거가 없고, 
유저의 다양한 정보들을 종합적으로 고려하지 못했다는 한계가 있었다. 
 
다만, A/B 테스트를 통해 지속적으로 추천 알고리즘을 개선하면서 검증해야하는 부분은
현재 유저 DB가 특정 시점만 반영된 상태였으므로
시간에 따른 사용자 행동 변화를 추적하지 못한다는 문제는 알면서도 어쩔 수 없는(?) 문제로 남겨둘 수 밖에 없었다. 


이렇게 MLOps 파트 중에서, 
ML부분의 작업은 모두 마무리 되었다. 
이후에 docker랑 Jenkins로 모델의 자동 배포를 구현하긴 했지만
모델의 Ops 부분이 조금 부족했던 건 아직도 아쉬움이 남는다. 
 
그래도 모델은 완성되었으니
다음 포스팅에서는 완성된 전체 서비스의 소개와 각 기능에 대해 적어보고자 한다.