feat:트렌드 키워드를 건강 채널용으로 필터링
건강 채널 전용 트렌딩 시스템: - Gemini로 실시간 트렌드에서 건강 관련 키워드만 필터링 - 간접적 키워드도 건강 앵글로 리프레이밍 (예: 김치 → 장건강) - 필터 결과 30분 캐싱 (Gemini 호출 최소화) - 필터 실패 시 원본 키워드 폴백 제목 생성 건강 앵글 반영: - generateTrendingHookTitles 프롬프트에 건강 채널 명시 - trending_context에 health_angle, suggested_topic 추가 - 모든 제목이 건강/웰빙 관점으로 생성되도록 가이드 UI 건강 테마 적용: - 버튼/칩 색상: orange/indigo → green 테마 - 칩에 건강 앵글 태그 배지 표시 - 칩 클릭 시 건강 주제(suggested_topic)가 인풋에 채워짐 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,73 @@ public function __construct(GoogleCloudService $googleCloud)
|
||||
$this->config = AiConfig::getActiveGemini();
|
||||
}
|
||||
|
||||
/**
|
||||
* 실시간 트렌딩 키워드 → 건강 채널용 필터링/리프레이밍
|
||||
*/
|
||||
public function filterHealthTrending(array $trendingKeywords): array
|
||||
{
|
||||
if (empty($trendingKeywords)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$keywordList = collect($trendingKeywords)->map(function ($item, $i) {
|
||||
$news = ! empty($item['news_title']) ? " (뉴스: {$item['news_title']})" : '';
|
||||
|
||||
return ($i + 1) . ". {$item['keyword']}{$news}";
|
||||
})->implode("\n");
|
||||
|
||||
$prompt = <<<PROMPT
|
||||
당신은 건강/웰빙 전문 YouTube Shorts 채널 기획자입니다.
|
||||
|
||||
아래는 오늘의 한국 실시간 급상승 키워드 목록입니다:
|
||||
{$keywordList}
|
||||
|
||||
이 중에서 건강/웰빙/의료/다이어트/운동/영양/정신건강/수면/스트레스 관련 YouTube Shorts 콘텐츠를 만들 수 있는 키워드를 골라주세요.
|
||||
|
||||
선택 기준:
|
||||
- 직접적으로 건강 관련인 키워드는 반드시 포함
|
||||
- 간접적이라도 건강 관점의 콘텐츠로 연결 가능하면 포함 (예: "김치" → "김치 유산균의 장 건강 효과")
|
||||
- 최소 3개, 최대 8개 선택
|
||||
- 건강과 전혀 연결할 수 없는 키워드(정치, 스포츠 결과, 연예 등)는 제외
|
||||
- health_angle은 10자 이내 핵심 태그 (예: "장건강", "면역력", "다이어트")
|
||||
|
||||
반드시 아래 JSON 형식으로만 응답하세요 (다른 텍스트 없이):
|
||||
{
|
||||
"keywords": [
|
||||
{"keyword": "원본 키워드", "health_angle": "건강 태그 10자 이내", "suggested_topic": "건강 채널에서 다룰 구체적 주제 20자 이내"}
|
||||
]
|
||||
}
|
||||
PROMPT;
|
||||
|
||||
$result = $this->callGemini($prompt);
|
||||
|
||||
if (! $result) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$parsed = $this->parseJsonResponse($result);
|
||||
|
||||
if (! $parsed || empty($parsed['keywords'])) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// 원본 트렌딩 데이터와 매칭하여 traffic 등 보존
|
||||
$trendingMap = collect($trendingKeywords)->keyBy('keyword');
|
||||
|
||||
return collect($parsed['keywords'])->map(function ($item) use ($trendingMap) {
|
||||
$original = $trendingMap->get($item['keyword']);
|
||||
|
||||
return [
|
||||
'keyword' => $item['keyword'],
|
||||
'health_angle' => $item['health_angle'] ?? '',
|
||||
'suggested_topic' => $item['suggested_topic'] ?? $item['keyword'],
|
||||
'traffic' => $original['traffic'] ?? '',
|
||||
'news_title' => $original['news_title'] ?? '',
|
||||
'pub_date' => $original['pub_date'] ?? null,
|
||||
];
|
||||
})->values()->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* 키워드 → 트렌딩 제목 5개 생성 (기본)
|
||||
*/
|
||||
@@ -68,21 +135,27 @@ public function generateTrendingHookTitles(string $keyword, array $context = [])
|
||||
if (! empty($context)) {
|
||||
$newsTitle = $context['news_title'] ?? '';
|
||||
$traffic = $context['traffic'] ?? '';
|
||||
$healthAngle = $context['health_angle'] ?? '';
|
||||
$suggestedTopic = $context['suggested_topic'] ?? '';
|
||||
$contextBlock = <<<CTX
|
||||
|
||||
[실시간 트렌딩 정보]
|
||||
- 이 키워드는 지금 한국에서 실시간 급상승 중입니다
|
||||
- 검색량: {$traffic}
|
||||
- 관련 뉴스: {$newsTitle}
|
||||
- 건강 관점: {$healthAngle}
|
||||
- 건강 주제 제안: {$suggestedTopic}
|
||||
CTX;
|
||||
}
|
||||
|
||||
$prompt = <<<PROMPT
|
||||
당신은 YouTube Shorts 조회수 1000만 전문 크리에이터입니다.
|
||||
당신은 건강/웰빙 전문 YouTube Shorts 조회수 1000만 크리에이터입니다.
|
||||
이 채널은 "건강 채널"입니다. 모든 제목은 반드시 건강/웰빙/의료/영양/운동 관점이어야 합니다.
|
||||
|
||||
키워드: "{$keyword}"
|
||||
{$contextBlock}
|
||||
|
||||
이 키워드로 YouTube Shorts에서 조회수를 폭발시킬 후킹 제목 5개를 생성해주세요.
|
||||
이 키워드를 건강 관점에서 YouTube Shorts 조회수를 폭발시킬 후킹 제목 5개를 생성해주세요.
|
||||
|
||||
반드시 아래 5가지 패턴을 각각 1개씩 사용:
|
||||
1. 충격형: "이거 실화임?" / "소름 돋는 진실" 스타일
|
||||
|
||||
Reference in New Issue
Block a user