활발한 커뮤니티의 콘텐츠를 따라가기란 쉽지 않습니다. 커뮤니티에서 생성된 모든 것을 읽는 것 외에, 멤버들에게 가장 큰 공감을 얻고 있는 콘텐츠를 읽고 있는지 어떻게 확인할 수 있을까요?
최근의 좋아요와 활발한 토론을 기반으로 커뮤니티에서 현재 트렌드가 되고 있는 것을 발견하는 데 도움을 주는 최신 주제 정렬 옵션인 Hot을 소개합니다. 신뢰할 수 있는 Latest 필터를 생각하되, 조금 더 스마트하다고 보시면 됩니다. Hot은 커뮤니티 멤버들과 잘 어울리는 최근의 콘텐츠를 발견하는 데 도움을 줍니다.
Hot 정렬은 어떻게 작동하나요?
Hot 정렬 알고리즘은 주제가 처음 생성된 이후의 전체 인기(좋아요, 반응, 또는 댓글 기반)와 멤버들이 주제와 상호작용하는 방식에 기반한 최근의 인기가 결합되어 작동합니다. 이는 Hot이 오래되고 인기 있는 주제와 함께 더 새로운 주제와 활발하게 논의 중인 주제를 함께 표시한다는 것을 의미합니다. Hot 정렬은 현재 트렌드가 되고 있는 대화, 즉 참여하고 싶은 대화를 찾고자 하는 대규모 활성 커뮤니티의 멤버들에게 이상적입니다.
Top과 어떻게 다른가요?
전체 인기와 최근 인기를 조합하여 보는 Hot 정렬과 달리, Top 정렬은 선택된 시간 범위(예: 주, 월 등)의 전체 인기만 고려합니다. Top은 커뮤니티를 오랜 기간 떠나 있다가 무슨 일이 있었는지 파악하고 싶을 때 가장 유용합니다.
내 커뮤니티에서 Hot 정렬을 어떻게 활성화하나요?
커뮤니티에서 Hot 정렬을 사용하려면 Admin > Settings로 이동하여 "top menu"로 필터링하세요. 그런 다음 드롭다운 메뉴에서 hot을 선택하여 상단 메뉴 탐색 옵션에 추가할 수 있습니다.
네! 관리자로서 커뮤니티의 기본 정렬 옵션으로 Hot을 설정할 수 있으며, Meta에서 그렇게 하고 있습니다. 이 설정을 하려면 top menu 설정(Admin > Settings > Basic Setup, 위 섹션에 표시된 바와 같이)으로 이동하여 화살표를 사용하여 hot을 정렬 옵션 목록의 맨 위로 이동시키세요.
일반 사용자로서는 Preferences > Interface로 이동하여 Default Home Page 설정을 원하는 옵션으로 업데이트하여 기본 홈 페이지를 변경할 수 있습니다.
@simon_tomes@dfabulich 이제 각자의 사이트에서 인기 있는 주제(hot topics)를 확인하실 수 있습니다. 이 기능은 처음에는 숨겨진 플래그(비공개 옵션) 뒤에 있었는데, 지난주에 해당 플래그가 제거되었습니다. 따라서 인스턴스에 업데이트가 필요했습니다.
음, 최소한 어떤 공지나 준비가 있을 때까지 이 뷰를 기본으로 설정하지 않는 것을 권장합니다. 일부 포럼에서는 사용자가 무엇이 새로운지 확인하고 싶어 할 수 있습니다. 예를 들어, 새로운 쿼리나 새로 도착한 항목을 보고 싶어 할 수 있죠. 새로운 ‘핫’ 뷰는 엔터테인먼트나 인기 추적을 위해 유용하지만, 새로운 콘텐츠를 표면에 올리는 데 즉시 문제를 일으킵니다.
사람들은 익숙한 곳에서 변화가 예상되지 않을 때 꽤나 눈이 먼 채로 보지 않는 경우가 많습니다. 제 경우에도 그렇고요.
즉, /latest가 어딘가에서 깨진 것이라고 확신하고 제가 받아야 할 것을 받지 못해서 여기에서 무엇이 잘못되었는지 궁금해하고 있었습니다.
그것이 신경은 쓰였지만, 당장 큰 문제는 아니었습니다.
아니요, 제 시작점/홈페이지가 /hot으로 변경된 것을 보고 인식하지 못했습니다. 이제 제 쪽에서는 수정했지만, 큰 문제는 아닙니다. 다만 제 약점은 포럼 토론에서, 심지어 공지사항까지도 무언가가 변경될 때 그 변화가 드러난다는 점입니다. 그리고 제 개인 설정을 건드리고 변경하는 것, 그것이 포럼 기본 설정의 문제이더라도, 역시 그런 종류의 변화입니다.
다시 업무에 복귀합니다.
hot에 대해서는, 누가 어떤 이유로 사용할지 완전히 확신하지는 못합니다. 물론 또 다른 옵션이고 아무것도 깨뜨리지 않지만, 제가 보는 바로는 여기서/latest와 매우 유사하지만… 최신은 없습니다.
한번 시도해 보겠습니다. 그리고… 제가 유용하다고 느끼지 못하더라도 다른 사람은 다르게 볼 수 있고, 그 두 가지는 서로 충돌하지 않습니다.
하지만 궁금한 점이 있습니다… /hot이 무작위 방문자에게 보여주기 위한 작동 가능한 해결책이 될 수 있을까요? 하지만 그러면 구글은 깨지거나, 사이트맵으로 완전히 만족할까요?
그에 대해 한 가지 생각만 하겠습니다. Discourse 포럼의 인터넷 아카이브 웨이백 머신(Wayback Machine) 커버리지는 이미 다소 불규칙합니다. 해당 에이전트나 사용 사례에 대해 hot을 기본값으로 설정하는 것이 상황을 더 악화시킬 수 있다고 추측합니다. 물론 더 좋아질 수도 있겠지만, 좀 더 숙고가 필요할 것 같습니다.
누군가가 사이드킥(Sidekiq) 작업이 과도하게 생성되는 문제를 보고했고, 다시 보고까지 했는데, 제 답변 외에 다른 반응은 없었습니다. 게다가 해당 스레드는 현재 기본 ‘Hot’ 정렬 기준에서 약 100번째 정도로 내려가 있습니다. 지원 포럼으로서 별로 좋지 않다고 생각합니다.
“hot” 설정을 기본값으로 사용하는 것이 매우 효과적이라고 생각합니다. 주요 주제들의 스냅샷을 제공하여, 첫 방문자나 가끔만 사용하는 사용자에게 유용합니다. 지원 포럼에도 적용할 수 있는데, 해당 사용자에게는 단일 사용자의 지원 질문보다 공지사항이 더 중요할 수 있기 때문입니다.
모든 정보를 빠짐없이 확인하고 싶은 사용자는 ‘latest’ 옵션을 계속 사용할 수 있습니다. 개인 홈 페이지를 'latest’로 전환할 수도 있습니다. 또한 ‘new’, ‘unread’, 그리고 추적 설정을 활용하면 관심 있는 주제에 대한 업데이트를 놓치지 않고 확인할 수 있습니다.
나에게는 이것이 다소 불공평한 비판이라고 생각한다. 어려운 주제이니까. Support 토픽 중에도 '충분한’이라는 기준이 어떻게 정의되든, 충분한 관심을 받지 못하는 경우가 많다.
이것은 실험이다. 메타 포럼의 기본 정렬 방식으로 'hot’을 싫어한다는 것은 하나의 데이터 포인트일 뿐이다. 우리는 더 많은 데이터를 수집할 것이다.
알고리즘에 대해 말하자면:
중력(gravity)을 조정하여 현재처럼 토픽이 너무 빨리 ‘내려앉지(pull down)’ 않도록 할 수 있다. 또한 “마지막 답변” 기반의 항목에 아주 작은 부스트를 주는 방식도 생각해 볼 수 있다.
현재 알고리즘은 다음과 같다:
AI 봇이 hot에 대해 설명AI
sam:
DB.exec(<<~SQL, args)
INSERT INTO topic_hot_scores (
topic_id,
score,
recent_likes,
recent_posters,
created_at,
updated_at
)
SELECT
topics.id,
0.0,
0,
0,
:now,
:now
FROM topics
LEFT OUTER JOIN topic_hot_scores ON topic_hot_scores.topic_id = topics.id
WHERE topic_hot_scores.topic_id IS NULL
AND topics.deleted_at IS NULL
AND topics.archetype <> :private_message
AND topics.created_at <= :now
ORDER BY
CASE WHEN topics.pinned_at IS NOT NULL THEN 0 ELSE 1 END ASC,
topics.bumped_at desc
LIMIT :max
SQL
# update recent counts for batch
DB.exec(<<~SQL, args)
UPDATE topic_hot_scores thsOrig
SET
recent_likes = COALESCE(new_values.likes_count, 0),
recent_posters = COALESCE(new_values.unique_participants, 0),
recent_first_bumped_at = COALESCE(new_values.first_bumped_at, ths.recent_first_bumped_at)
FROM
topic_hot_scores ths
LEFT OUTER JOIN
(
SELECT
t.id AS topic_id,
COUNT(DISTINCT p.user_id) AS unique_participants,
(
SELECT COUNT(distinct pa.user_id)
FROM post_actions pa
JOIN posts p2 ON p2.id = pa.post_id
WHERE p2.topic_id = t.id
AND p2.post_type = :regular
AND p2.deleted_at IS NULL
AND p2.user_deleted = false
AND pa.post_action_type_id = 2 -- action_type for 'like'
AND pa.created_at >= :recent_cutoff
AND pa.deleted_at IS NULL
) AS likes_count,
MIN(p.created_at) AS first_bumped_at
FROM
topics t
JOIN
posts p ON t.id = p.topic_id
WHERE
p.created_at >= :recent_cutoff
AND t.archetype <> 'private_message'
AND t.deleted_at IS NULL
AND p.deleted_at IS NULL
AND p.user_deleted = false
AND t.created_at <= :now
AND t.bumped_at >= :recent_cutoff
AND p.created_at < :now
AND p.created_at >= :recent_cutoff
AND p.post_type = :regular
GROUP BY
t.id
) AS new_values
ON ths.topic_id = new_values.topic_id
WHERE thsOrig.topic_id = ths.topic_id
SQL
# we may end up update 2x batch size, this is ok
# we need to update 1 batch of high scoring topics
# we need to update a second batch of recently bumped topics
sql = <<~SQL
WITH topic_ids AS (
SELECT topic_id FROM (
SELECT th3.topic_id FROM topic_hot_scores th3
JOIN topics t3 on t3.id = th3.topic_id
ORDER BY t3.bumped_at DESC
LIMIT :max
) Y
UNION ALL
SELECT topic_id FROM (
SELECT th2.topic_id FROM topic_hot_scores th2
ORDER BY th2.score DESC, th2.recent_first_bumped_at DESC NULLS LAST
LIMIT :max
) X
)
UPDATE topic_hot_scores ths
SET score = (
CASE WHEN topics.created_at > :recent_cutoff
THEN ths.recent_likes ELSE topics.like_count END
) /
(EXTRACT(EPOCH FROM (:now - topics.created_at)) / 3600 + 2) ^ :gravity
+
CASE WHEN ths.recent_first_bumped_at IS NULL THEN 0 ELSE
(ths.recent_likes + ths.recent_posters - 1) /
(EXTRACT(EPOCH FROM (:now - recent_first_bumped_at)) / 3600 + 2) ^ :gravity
END
,
updated_at = :now
FROM topics
WHERE topics.id IN (
SELECT topic_id FROM topic_ids
) AND ths.topic_id = topics.id
SQL
DB.exec(sql, args)
hot 스코어링 알고리즘을 주의 깊고, 정확하게, 그리고 명확하게 설명해 주세요.
gpt4_bot:
제공된 SQL 스크립트에 구현된 hot 스코어링 알고리즘은 특정 시점에서 토픽이 얼마나 흥미롭거나 인기 있는지를 나타내는 지표인 "hotness"를 기반으로 토픽을 순위 매기도록 설계되어 있습니다. 이는 최근 좋아요 수와 고유한 최근 게시자 수, 그리고 토픽의 생성 및 업데이트 시점을 고려하여 달성됩니다. 프로세스의 세부 내용은 다음과 같습니다:
초기 삽입
첫 번째 부분: 기존 레코드가 없는 토픽에 대해 topic_hot_scores 테이블에 새 레코드를 삽입하는 것으로 시작합니다. 이는 삭제되지 않고, 개인 메시지가 아니며, 현재 타임스탬프(:now)까지 생성된 토픽을 선택하여 수행됩니다. 초기 점수는 0으로 설정되며, 최근 좋아요나 게시자는 없습니다.
필터 조건: 고정되지 않은 토픽(또는 고정된 토픽에 대한 강조가 덜한 경우)에 초점을 맞추며, 최신 활동(bumped_at 내림차순)으로 정렬합니다.
최근 카운트 업데이트
두 번째 부분: 이어서 topic_hot_scores 테이블을 최근 활동 데이터로 업데이트합니다. 여기에는 다음이 포함됩니다:
기준 날짜(:recent_cutoff) 이후 토픽의 고유 참여자 수.
:recent_cutoff 이후 토픽 내 게시물의 좋아요 수.
각 토픽에 대해 "최근"으로 간주되는 가장 초기 게시물의 타임스탬프.
이 프로세스 부분은 :recent_cutoff 시점 이후에 발생한 새로운 좋아요, 게시자 또는 활동을 포착하여 각 토픽의 가장 최근 참여 지표를 반영하는 것을 목표로 합니다.
Hotness 기반 재점수화
세 번째 부분: 마지막으로, 업데이트된 지표를 기반으로 토픽의 점수를 다시 계산합니다. 토픽은 먼저 다음을 포함하는 집합으로 필터링됩니다:
가장 최근에 bumped된 토픽 배치(새로운 콘텐츠가 고려되도록 보장하기 위해).
기존 점수가 가장 높은 토픽을 기준으로 한 또 다른 배치(높은 참여도를 가진 토픽이 시야에 머물도록 하기 위해).
Hot 점수 계산: hotness 점수는 다음 공식을 사용하여 다시 계산됩니다:
:recent_cutoff 이후에 생성된 토픽의 경우, 점수는 recent_likes를 기반으로 합니다.
그렇지 않은 경우, 토픽 시작부터의 총 like_count를 기반으로 합니다.
이 값은 생성 시간(시간 단위)에 2를 더한 값의 :gravity 거듭제곱으로 나눕니다. :gravity는 토픽이 시간에 따라 얼마나 빨리 퇴색하는지를 제어하는 매개변수입니다.
또한, 기록된 최근 활동(recent_first_bumped_at이 null이 아닌 경우)이 있으면 점수에 보조 구성 요소가 추가됩니다. 이 구성 요소는 최근 좋아요와 게시자의 합(이중 계산을 상쇄하기 위해 1을 뺀 값)을 recent_first_bumped_at 이후의 시간(다시 시간 단위)에 2를 더한 값의 :gravity 거듭제곱으로 나눈 값입니다.
업데이트된 점수는 현재 타임스탬프를 updated_at으로 저장됩니다.
결론: 이 알고리즘의 본질은 단순히 활발한 참여(좋아요와 게시자)가 있는 토픽뿐만 아니라, 상대적으로 새로운 토픽을 우선시하는 것입니다. 감쇠 인자(:gravity)의 사용은 이러한 상호작용의 중요성이 시간에 따라 감소하도록 보장하여, 더 새로운 또는 최근에 활동이 있었던 토픽이 부각될 수 있게 합니다. 총 활동과 최근 활동을 모두 고려하는 혼합 방식은 장기적으로 인기 있는 토픽과 신선하고 흥미로운 토론 사이의 균형을 맞추도록 알고리즘을 설계합니다.
죄송합니다. 누군가의 감정을 상하게 하려는 의도는 아니었습니다. 리더십은 새로운 기능이 완료된 것을 보고 기뻐할 것이며, 구현을 맡은 팀도 이를 출시한 것에 만족할 것이라고 확신합니다.
건설적인 비판에 대한 공간이 남아 있기를 바랍니다.
제 이해로는, 이 기능의 동기가 되는 예시가 소셜 미디어 피드입니다. 무관하지는 않지만, 아마도 Hacker News의 첫 페이지를 살펴볼 수 있을 것입니다. 그곳의 이상적인 상태는 새로운 주제와 활발하며 인기 있는 주제 모두에게 어느 정도의 가시성을 부여하는 것입니다. 둘 다 시간이 지나면 흐려져야 합니다. HN은 이를 잘 수행하고 있는 것 같습니다.
하지만 제 관찰에 따르면, 지원 포럼은 쇼케이스나 소셜 미디어 피드와는 다른 성격의 것입니다.
위쪽 글에서 ‘Hot’ 탭이 새로운 미가입 방문객이나 검색 결과에 적합할 수 있다는 아이디어를 볼 수 있습니다. 그 아이디어의 타당성은 이해할 수 있습니다.
하지만 저는 메타(Meta)가 주로 지원 포럼이라는 점을 유지하고 싶습니다.
물론입니다.
물론 동의합니다. 하지만 'Hot’이 이를 해결한다고 생각하지는 않습니다. 고정된 주제(Pinned topics)가 이 역할을 꽤 잘 수행하고 있습니다.