From 0f162d1df905b93b761c854624bca6625775e3e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=B3=B4=EA=B3=A4?= Date: Sun, 15 Feb 2026 14:39:58 +0900 Subject: [PATCH] =?UTF-8?q?fix:=EA=B1=B4=EA=B0=95=20=ED=8A=B8=EB=A0=8C?= =?UTF-8?q?=EB=93=9C=20=ED=95=84=ED=84=B0=EC=97=90=EC=84=9C=20=EC=97=B0?= =?UTF-8?q?=EC=98=88=EC=9D=B8/=EC=9D=B8=EB=AC=BC=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 프롬프트에 엄격한 제외 규칙 추가 (연예인/정치인/스포츠선수/드라마 등) - "간접 연결 가능하면 포함" 조건 삭제 (억지 건강 앵글 방지) - 컨트롤러: 필터 결과가 비면 원본 대신 빈 배열 반환 Co-Authored-By: Claude Opus 4.6 --- app/Http/Controllers/Video/Veo3Controller.php | 4 +- app/Services/Video/GeminiScriptService.php | 37 +++++++++++++++---- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/Video/Veo3Controller.php b/app/Http/Controllers/Video/Veo3Controller.php index eb69308f..a7958528 100644 --- a/app/Http/Controllers/Video/Veo3Controller.php +++ b/app/Http/Controllers/Video/Veo3Controller.php @@ -46,8 +46,8 @@ public function fetchTrending(): JsonResponse $healthKeywords = $this->geminiService->filterHealthTrending($rawKeywords); - // Gemini 필터링 실패 시 원본 반환 - return ! empty($healthKeywords) ? $healthKeywords : $rawKeywords; + // Gemini 필터링 결과 반환 (빈 배열이면 빈 배열 — 원본 노출 안 함) + return $healthKeywords; }); return response()->json([ diff --git a/app/Services/Video/GeminiScriptService.php b/app/Services/Video/GeminiScriptService.php index e4cbd43b..92650a32 100644 --- a/app/Services/Video/GeminiScriptService.php +++ b/app/Services/Video/GeminiScriptService.php @@ -40,14 +40,35 @@ public function filterHealthTrending(array $trendingKeywords): array 아래는 오늘의 한국 실시간 급상승 키워드 목록입니다: {$keywordList} -이 중에서 건강/웰빙/의료/다이어트/운동/영양/정신건강/수면/스트레스 관련 YouTube Shorts 콘텐츠를 만들 수 있는 키워드를 골라주세요. +이 중에서 건강/웰빙/의료/다이어트/운동/영양/수면/스트레스 관련 키워드만 선택하세요. -선택 기준: -- 직접적으로 건강 관련인 키워드는 반드시 포함 -- 간접적이라도 건강 관점의 콘텐츠로 연결 가능하면 포함 (예: "김치" → "김치 유산균의 장 건강 효과") -- 최소 3개, 최대 8개 선택 -- 건강과 전혀 연결할 수 없는 키워드(정치, 스포츠 결과, 연예 등)는 제외 -- health_angle은 10자 이내 핵심 태그 (예: "장건강", "면역력", "다이어트") +=== 엄격한 선택 기준 === +- 키워드 자체가 건강/의료/음식/영양/운동/질병/신체 관련일 때만 포함 +- 최소 1개, 최대 8개 선택 (해당 없으면 0개 가능) + +=== 절대 제외 대상 (아무리 건강과 연결하려 해도 제외) === +- 연예인/아이돌/배우/가수 이름 (예: 아이유, 신세경, BTS 등) +- 정치인/정당/선거/정치 이슈 +- 스포츠 경기 결과/선수 이름 +- 드라마/영화/예능 프로그램명 +- 사건/사고/범죄 뉴스 +- 게임/IT기기/앱 이름 +- 인물 이름이 키워드인 경우 무조건 제외 + +=== 포함 가능 예시 === +- "다이어트" → 직접 건강 관련 → 포함 +- "김치" → 음식/영양 → 포함 가능 +- "수면" → 건강 → 포함 +- "설날" → 명절 건강/음식 관련 → 포함 가능 +- "미세먼지" → 건강 영향 → 포함 가능 + +=== 제외 예시 === +- "아이유" → 가수 이름 → 제외 +- "신세경" → 배우 이름 → 제외 +- "손흥민" → 축구선수 → 제외 +- "더글로리" → 드라마 → 제외 + +health_angle은 10자 이내 핵심 태그 (예: "장건강", "면역력", "다이어트") 반드시 아래 JSON 형식으로만 응답하세요 (다른 텍스트 없이): { @@ -55,6 +76,8 @@ public function filterHealthTrending(array $trendingKeywords): array {"keyword": "원본 키워드", "health_angle": "건강 태그 10자 이내", "suggested_topic": "건강 채널에서 다룰 구체적 주제 20자 이내"} ] } + +해당하는 키워드가 없으면 빈 배열을 반환하세요: {"keywords": []} PROMPT; $result = $this->callGemini($prompt);