모두콘2024 쩝쩝LAB
취향과 상황에 따른 맛집 추천 시스템 개발기
다양한 맛집 추천 서비스가 있지만, 정작 “나”에게 꼭 맞는, 내 취향과 상황을 반영한 맞춤형 맛집을 찾는 일은 여전히 쉽지 않습니다. 맛있는 음식을 먹고 싶어서 애써 뒤져봐도, 결국은 모두가 비슷한 리스트를 보고 선택하는 상황이 반복되죠. 이 글에서는 저희 쩝쩝 LAB이 어떤 계기로 개인화된 맛집 추천 시스템을 연구하게 되었는지, 그리고 그 과정에서 마주한 문제와 솔루션을 소개하고자 합니다.
연구를 시작하게 된 계기
평소 저는 새로운 맛집을 찾는 일에 많은 공을 들입니다. 맛있고, 서비스가 좋고, 분위기나 청결도, 위치, 가격, 메뉴 구성 등 복합적인 요소를 모두 충족하는 ‘맛집’을 찾아내는 데 집착할 정도로요. 그러다 보니 자연스럽게 제가 검증한 맛집들을 ‘보물’처럼 모아두고 있습니다. 반대로 맛집 리스트를 보유하고 있지 않은 곳에 가면 밥을 먹을 시기가 아닌데도 일단 불안합니다. 그래서 찾고 또 찾습니다. 저는 주로 카카오맵을 쓰는데 이전까지 제가 맛집을 찾고 저장하면서 무수히 쌓인 데이터가 활용되지 않은, 누구나 똑같은 리스트에서 찾습니다.
주로 사용하는 지도 앱이나 맛집 검색 서비스를 통해 레스토랑을 찾아보면, 결국 모두가 볼 수 있는 똑같은 랭킹 리스트가 제시됩니다. 그렇게 모처럼 쌓아둔 저의 행동 데이터가 전혀 활용되지 않는 모습을 보며, “내가 찾아낸 이 소중한 맛집 데이터로 나만의 추천을 받을 수 있으면 얼마나 좋을까?”라는 생각을 하게 되었습니다. 바로 이 아쉬움에서 연구가 시작되었습니다.
기존 맛집 추천 시스템의 한계
일반적인 맛집 추천 시스템은 불특정 다수에게 인기 있는, 어느 정도 평균 이상의 만족도를 보이는 음식점을 추천하는 방식이 대다수입니다. 예를 들어, 지역별 인기 맛집, 전체 평점 상위 랭킹처럼요. 하지만 이는 모두에게 똑같은 정보를 던져줄 뿐, 개개인의 고유한 취향이나 상황은 전혀 반영하지 못합니다.
저희는 여기서 ‘불특정 다수’라는 한계를 인식했습니다. 우리가 목표로 해야 할 것은 ‘특정 다수’, 즉 취향이나 상황이 유사한 사용자 그룹을 선별해, 그들에게 최적화된 맛집을 제안하는 방식입니다. 이는 곧 개인화, 더 나아가 세분화된 맞춤 추천을 의미합니다.
두 가지 개념의 결합: 취향과 상황에 맞게 + 선별된 맛집
저희 쩝쩝랩이 고민한 새로운 맛집 추천 시스템은 크게 두 가지 개념의 결합을 목표로 합니다.
취향과 상황에 맞게: 특정 다수가 만족하기 위해서는 그 특정 다수의 취향과 상황을 잘 고려한 음식점을 추천해주어야 됩니다.
만족할 만한 맛집: 맛집이 되기 위한 복합적인 요소가 평균 이상이고 다수가 이용해보고 만족한 경험이 많은 선별된 음식점이어야 합니다.
예시로 보는 개인화 맛집 추천
첫 번째 개념인 특정 다수가 만족하기 위한 개인화 음식 추천을 실현하기 위해 저희 쩝쩝랩이 어떻게 접근하고 있는지 예시를 통해 설명드리겠습니다.
상황: A 유저는 연인과 데이트를 위해 삼겹살집을 찾고 있습니다. B 유저는 막내로서 팀 회식 장소를 정해야 하는 상황입니다. C 유저는 아이와 함께 찌개류를 즐길 수 있는 식당을 찾고 있습니다. 기본 추천 시스템의 결과: 음식점 A, B, C, D, E가 유저들에게 추천되었습니다.
A 유저에게는 데이트 하기 좋은 분위기의 삼겹살집으로 음식점 A 추천 B 유저에게는 회식에 적합한 시끌벅적한 횟집인 음식점 B 추천 C 유저에게는 놀이방이 있는 감자탕집인 음식점 E 추천 C 유저는 만족했지만, A와 B 유저는 기본 추천 결과가 만족스럽지 않았습니다. 이를 저희 쩝쩝랩의 개인화 추천 시스템으로 다시 분석하면 다음과 같은 결과를 얻을 수 있습니다.
개인화 추천 시스템의 결과:
A 유저: 기존 추천된 음식점 A(조용한 데이트 삼겹살집)가 아닌, 연인이 함께 즐길 수 있는 노포 스타일의 시끌벅적한 삼겹살집인 음식점 B가 추천됩니다. 이는 A 유저가 과거 리뷰에서 시끌벅적한 분위기를 선호하고, 노포 스타일 삼겹살집을 긍정적으로 평가했기 때문에 가능했습니다.A 유저가 시끌벅적한 삼겹살집 중에서도 전통주가 다양하게 구비된 곳을 선호한다는 데이터를 반영해, B와 함께 전통주가 특화된 음식점 B를 추가 추천할 수 있습니다.
B 유저: 시끌벅적한 회식 분위기를 선호하지 않는 팀의 성격에 맞게, 조용히 대화할 수 있는 개별 룸이 있는 참치 전문점 음식점 D가 추천됩니다. 이는 B 유저의 과거 회식 리뷰 데이터에서 “조용한 곳”과 “개별 공간”이라는 키워드를 선호한 점이 반영된 결과입니다.
C 유저: 기존 추천과 동일하게 놀이방이 있는 감자탕집 음식점 E가 추천됩니다. 다만, 추천 이유로 ‘놀이방’뿐만 아니라 “아이들이 좋아하는 간편한 메뉴 제공”과 같은 세부적인 요소도 함께 고려되어, C 유저의 신뢰를 더 높이는 추천 결과를 제공합니다.
개인화 추천을 위한 데이터 표현: 유저와 음식점의 그래프
개인화 추천을 실현하기 위해서는 사용자와 음식점 사이의 관계를 어떻게 정의하고 모델링할지 고민해야 합니다. 저희는 이를 그래프(knowledge graph) 형태로 표현하고자 합니다. 유저와 음식점 사이의 모든 상호작용을 그래프 상의 노드와 엣지로 표현하는 것이죠.
- 유저 노드의 특성: 선호 음식 카테고리, 즐겨 찾는 지역, 선호 분위기, 평소 방문하는 식당 스타일, 이전 방문 기록, 작성 리뷰의 키워드, 평가 성향 등.
- 음식점 노드의 특성: 맛, 분위기, 메뉴 특징, 서비스 품질, 청결도, 가격대, 위치, 테마 등.
이러한 정보를 벡터화(임베딩)하여 유저와 음식점 사이의 유사도나 연관성을 쉽게 계산할 수 있습니다. 또한 유저의 새로운 행동(리뷰 작성, 평점 부여, 즐겨찾기 추가)이 일어날 때마다 실시간으로 벡터를 업데이트해, 점점 더 정교한 추천이 가능해집니다.
사용자와 음식점의 연결: 행동 데이터 기반
사용자와 음식점을 연결하기 위해 다양한 행동 데이터를 분석하고 활용합니다. 이러한 데이터는 사용자의 의도를 파악하는 데 중요한 역할을 합니다. 아래는 활용 가능한 주요 행동 데이터입니다:
- 클릭: 사용자가 특정 음식점을 클릭한 기록
- 검색: 특정 키워드나 음식점을 검색한 기록
- 위치 로그: 사용자가 방문한 위치를 기반으로 한 기록
- 공유: 음식점을 다른 사람과 공유한 기록
- 즐겨찾기 저장: 사용자가 음식점을 즐겨찾기에 추가한 기록
- 평점: 음식점에 대해 매긴 점수
- 리뷰: 음식점에 남긴 텍스트 리뷰
이 중, 저희 쩝쩝랩은 현재 평점과 리뷰 데이터를 우선적으로 활용하고 있습니다. 이는 수집이 용이하고 가장 명확하게 사용자의 의도를 반영하는 데이터로, 추천 모델을 고도화하는 데 핵심적인 역할을 합니다.
리뷰 데이터 분석: Qwen 2.5로부터의 인사이트
음식점의 특성을 추출하기 위해서는 단순히 평점만 보는 것이 아니라, 리뷰 텍스트에서 풍부한 정보를 끌어내는 것이 중요합니다. 맛뿐만 아니라 화장실 청결도, 조명 상태, 특정 메뉴의 강점 등은 사용자의 만족도에 크게 영향을 미칩니다.
저희는 이를 위해 다양한 텍스트 분석 기법(형태소 분석, 토픽 모델링, 감성 분석)을 시도했지만, 결국 대규모 언어 모델(LLM)을 활용하는 접근이 효과적임을 확인했습니다. 그 중에서도 아시아권 언어에 대한 이해도가 높은 Qwen 2.5 모델을 활용해 리뷰를 분석하고 있습니다. Qwen 2.5에 프롬프트를 구성해 키워드 추출, 감성 분석, 키워드에 대한 간단한 설명 등을 도출합니다. 맛은 긍정적이지만 화장실의 위치와 청결도에 대해 불만이 있었어요. 저는 음식점 만족 여부에서 화장실을 되게 중요한 요소로 생각합니다. 여의도에 위치한 라케이즈라는 와인바인데 음식 플레이팅도 좋고 분위기가 좋은 곳에 화장실이 아쉬우면 만족하기엔 더 어려워집니다.
초기 실패와 교훈: 평점 예측의 함정
그래프 신경망(GNN)을 활용해 모델을 구축하는 과정에서 초기에는 리뷰 평점을 직접 예측하는 방식을 시도했습니다. 하지만 평점만을 y값으로 삼아 예측하는 것은 주관적 편향성이 존재하고, 그로 인해 만족스러운 결과를 내기 어렵다는 점을 깨달았습니다. 또한 리뷰를 한 번만 남기고 떠나는 사용자가 많다 보니, 평점 데이터만으로는 안정적인 학습이 어려웠습니다.
이러한 실패를 통해, 저희는 다시 두 가지 개념—취향과 상황—에 주목하게 되었습니다. GNN 모델로 모든 문제를 단번에 해결하려는 접근에서 벗어나, 투 스테이지(Two-Stage) 모델로 방향을 전환했습니다. 먼저 GNN 기반 모델을 통해 특정 취향과 상황에 부합하는 음식점 후보군을 추출한 뒤, 그 중에서 랭킹화 과정을 거쳐 최종적인 맛집 리스트를 추천하는 방식입니다.
선별된 맛집 추천 방법: 카카오맵 리뷰 데이터를 활용한 랭킹화
선별된 맛집 즉 랭킹화가 필요한 단계였습니다. 카카오맵 평점 데이터를 활용하여 음식점 랭킹화를 진행하였던 What2Eat을 활용하였습니다. What2Eat는 단순히 점수를 집계하는 기존 방식에서 벗어나, 리뷰어 개개인의 만족도를 분석하고 집계한 방식입니다.
선별된 맛집 추천 방법으로는 카카오맵 평점데이터 분석으로 음식점 랭킹화 포스팅을 참조해주세요.
마무리
투 스테이지(Two-Stage) 모델
- Stage 1. 취향과 상황에 맞는 음식점은 GNN 기반 모델로 후보를 받습니다.
- Stage 2. 단순 음식점이 아닌 맛집 추천은 평점데이터를 분석한 방안으로 머먹의 지표를 이용하여 취향과 상황에 맞는 음식점 후보를 랭킹모델을 활용하여 선별할 것입니다.