배경
discovery 후보 풀이 ORDER BY trending_score DESC LIMIT 80 전역 top-N이라, 최다 아티스트(제니)가 풀을 독식 → 저볼륨 멤버(로제/지수)가 80 컷 아래로 밀려 LLM 메뉴에 아예 안 들어옴. LLM은 편중된 메뉴에서 판단할 수밖에 없다 (artist_frequency도 편중된 값을 봄).
위치: packages/ai-server/src/services/editorial_discovery/repository.py gather_discovery_input (L164–188).
목표
후보 풀에 아티스트/멤버 다양성 확보 — 출력 강제가 아니라 LLM이 판단할 "공정한 메뉴"만 보장. 최종 구성(누구를/몇 명/순서)은 그대로 모델 판단.
옵션
- (a) 아티스트별 천장 —
row_number() OVER (PARTITION BY artist_name ORDER BY trending_score DESC) <= K 후 LIMIT 80. 트렌딩 유지 + 멤버당 상한(예 12). 각 멤버의 베스트 K장이 풀에 진입.
- (b) 2-tier — 상위 60 순수 트렌딩(바이럴 신호 보존) + 20 저평가 멤버 베스트 fill.
- (선택) 프롬프트 넛지 — 그룹 앵글이면 멤버 레인지 고려(모델 판단, 하드코딩 X).
우선순위 (후순위)
person angle_type 제거로 그룹 완결성 계약이 사라지면 급하지 않음 — item/style은 멤버 완결성이 없어 제니만 나와도 "밋밋"할 뿐 "깨진" 게 아님. 일반 다양성 향상 목적으로 후순위. person 전용 agent 부활 시 필수화.
배경
discovery 후보 풀이
ORDER BY trending_score DESC LIMIT 80전역 top-N이라, 최다 아티스트(제니)가 풀을 독식 → 저볼륨 멤버(로제/지수)가 80 컷 아래로 밀려 LLM 메뉴에 아예 안 들어옴. LLM은 편중된 메뉴에서 판단할 수밖에 없다 (artist_frequency도 편중된 값을 봄).위치:
packages/ai-server/src/services/editorial_discovery/repository.pygather_discovery_input(L164–188).목표
후보 풀에 아티스트/멤버 다양성 확보 — 출력 강제가 아니라 LLM이 판단할 "공정한 메뉴"만 보장. 최종 구성(누구를/몇 명/순서)은 그대로 모델 판단.
옵션
row_number() OVER (PARTITION BY artist_name ORDER BY trending_score DESC) <= K후LIMIT 80. 트렌딩 유지 + 멤버당 상한(예 12). 각 멤버의 베스트 K장이 풀에 진입.우선순위 (후순위)
personangle_type 제거로 그룹 완결성 계약이 사라지면 급하지 않음 — item/style은 멤버 완결성이 없어 제니만 나와도 "밋밋"할 뿐 "깨진" 게 아님. 일반 다양성 향상 목적으로 후순위. person 전용 agent 부활 시 필수화.