콘텐츠 플랫폼에서 일하다 보니, 사용자 눈에는 절대 보이지 않는 질문 하나를 남들보다 오래 붙잡고 삽니다. 피드는 언제쯤 이 콘텐츠를 그만 보여줘야 할까?
콘텐츠는 낡습니다. 사람들은 새로운 게 뭔지 보려고 앱을 열고, 피드는 거기에 답해야 하죠. 그렇다고 지난달의 훌륭한 글이 단지 새롭지 않다는 이유로 사라져야 하는 것도 아닙니다. 이 트레이드오프를 모델링하는 표준적인 방법이 감쇠 함수인데, 이름에서 풍기는 것보다 훨씬 단순합니다.
신선도는 중요하다, 어디서나는 아니지만#
뉴스 사이트든 소셜 피드든, 열어 볼 때 우리가 찾는 건 대개 가장 최신 소식입니다. 뉴스나 금융 시장처럼 빠르게 움직이는 영역에서 지난주 콘텐츠는 그냥 짐이라, 그런 곳의 랭킹은 최신성에 크게 기울어 있습니다.
하지만 모든 영역이 그렇지는 않습니다. 학술 자료나 롱폼 저널리즘은 시간이 지나도 가치가 유지되고, 오히려 올라가기도 하죠. 콘텐츠의 나이는 대부분의 랭킹 시스템에서 의미가 있지만, 얼마나 큰 가중치를 줘야 하는지는 전적으로 무엇을 랭킹하느냐에 달렸습니다.
지수 감쇠로 퇴색을 모델링하기#
관련성이 흐려지는 과정을 모델링하는 정석은 지수 감쇠입니다. 오래될수록 체감 가치가 가속도가 붙어 떨어진다는 거죠. 가장 단순한 형태는 이렇습니다.
relevance = e^(-decay_rate × age)
여기서 relevance는 콘텐츠의 현재 가치, decay_rate(감쇠율)는 가치를 잃는 속도, age는 보통 게시 후 경과 일수입니다.
이 모델이 마음에 드는 이유는 손잡이가 하나뿐이라는 점입니다. 감쇠율만 조절하면 콘텐츠의 유효기간을 몇 시간으로 할지, 며칠로 할지, 몇 주로 할지 정할 수 있습니다. 설정할 게 그게 전부예요.
좋은 콘텐츠를 살려두는 건 참여도#
나이는 그림의 절반일 뿐입니다. 조회수, 좋아요, 댓글은 사람들이 실제로 관심 있어 하는지를 알려주는 신호고, 이걸 무시하는 랭킹은 좋은 글까지 나쁜 글과 함께 묻어버립니다. 해결책은 단순하게 둘을 곱하는 겁니다.
score = engagement × e^(-decay_rate × age)
이렇게 하면 참여도가 높은 오래된 글이 평범한 새 글보다 위에 있을 수 있습니다. 다만 감쇠 항이 밑에서 계속 줄어들기 때문에, 자리를 지키려면 점점 더 많은 참여가 필요해지죠.
실제 라이프사이클은 이렇게 흘러갑니다. 새 글은 신선도 부스트를 받아 노출될 기회를 얻습니다. 사람들이 보고, 좋아요를 누르고, 댓글을 달면 점수가 오릅니다. 날이 지날수록 감쇠가 점수를 갉아먹고, 참여가 꾸준히 이어지는 글만 상위에 남습니다. 새 콘텐츠는 기회를 얻고, 정말 좋은 콘텐츠는 제 힘으로 자리를 지키는 구조입니다.
솔직히 이게 전부입니다. 지수 함수 하나, 참여도 항 하나, 돌릴 손잡이 하나. 어려운 건 우리 콘텐츠에 맞는 감쇠율을 정하는 일인데, 그 부분은 순전히 판단의 영역입니다.

