상세한 프롬프트가 답은 아니었다 — AI 영상 주제 다양화 자동화 회고 (3편)

1편에서 AI 숏폼 자동화 파이프라인을 구축했고, 2편에서는 영상 길이를 늘리며 세척 장면의 연속성을 개선했다. 그 실험과 병행해 “주제를 다양화하면 조회수가 오를까?”라는 가설도 시험했다. 이 글은 주제 확장을 지원한 프롬프트 자동화와 그 결과를 돌아보며 숏폼 시리즈를 마무리한다.

1. 문제 정의

영상 품질을 개선하는 동안 다른 주제로도 시청자층을 넓혀 보고 싶었다. PC 부품 청소 외에 유리 과일 절단, 보석이나 행성의 단면처럼 시각적 만족감을 주는 소재를 후보로 삼았다.

당시에는 조회수를 높이고 파이프라인을 개선하고 싶었지만 무엇부터 바꿔야 할지 명확하지 않았다. 그래서 구현하기 쉬운 주제 확장부터 시작했다. 돌아보면 주제를 늘리는 일이 조회수를 높일 것이라는 근거는 부족했다. 이 판단은 5장에서 다시 짚는다.

기술적 문제는 분명했다. PC 부품 청소에 쓰던 생성 흐름을 다른 주제에도 적용하되, 영상마다 긴 프롬프트를 다시 쓰는 일을 줄여야 했다. 주제별 템플릿과 변수를 준비하고, 같은 주제 안에서 표현을 바꾸는 작업을 자동화하기로 했다.

2. 접근

주제 선정 — 시장조사와 감

MCP(Model Context Protocol, 모델에 외부 도구를 연결하는 규약) 검색으로 satisfying 영상의 소재를 조사하고 내 판단을 더해 후보를 골랐다. 청소에서 절단으로 범위를 넓혀 유리 과일, 보석, 행성, 디저트, 음료 등을 다뤘다. 검색은 후보 선정에 활용했으며 내 채널에서의 수요를 검증한 것은 아니었다.

형식의 발견 — 상세함의 함정

처음에는 더 상세하게 쓸수록 원하는 영상이 나올 것이라고 생각했다. 하지만 긴 묘사를 넣어도 장면이 갑자기 바뀌거나 비현실적으로 표현되는 결과가 나왔다. 2편에서도 다섯 단계의 세척 과정을 자세히 적었지만 원하는 순서로 생성되지 않았다.

이후 MCP 검색으로 프롬프트 작성 방식을 조사하고, 피사체와 동작, 카메라, 재질, 소리를 구분해 적는 형식으로 바꿨다. 이렇게 정리한 프롬프트에서 더 나은 결과를 얻었다. Google의 Veo 프롬프트 가이드도 피사체, 동작, 촬영 방식 등을 구분해 명시하도록 안내한다. 다만 이 결과만으로 특정 형식이 모델의 학습 방식과 일치한다고 말할 수는 없다. 글자 수만 줄인 비교 실험도 아니어서 짧게 쓰는 것 자체가 개선 원인이라고 단정할 수는 없다. 실제 템플릿에는 Subject, Action, Camera, Audio처럼 요소별 항목을 두었다.

자동화 문제 — 주제 확장과 표현 변형

주제 확장과 표현 변형은 역할이 달랐다. PromptGenerator는 선택한 주제의 템플릿에 변수를 채워 프롬프트를 만들었다. 그다음 PromptDiversifier가 LLM을 호출해 문장 구조와 수식어를 바꿨다. 주제나 핵심 동작을 바꾸는 일은 금지했다. 즉, 청소 프롬프트를 절단 프롬프트로 바꾸는 기능이 아니라 각 주제 안에서 표현의 반복을 줄이는 기능이었다.

3. 구현 — PromptDiversifier

구현은 보존 조건, 결과 검사, 원본 복귀의 세 부분으로 나뉜다. 아래 코드는 사이드 프로젝트의 핵심 동작을 추린 재구성 예제다. Prompt 모델과 로깅 설정은 생략했다.

(1) 보존/변형 계약

시스템 프롬프트에 유지할 요소와 바꿔도 되는 요소를 명시했다. 여기서 계약은 LLM에 주는 지시이며, 지시만으로 결과가 보장되는 것은 아니다.

REPHRASE_SYSTEM_PROMPT = """\
You are a video-prompt rephrasing assistant.
MUST preserve: main subject, core action, macro lens, 9:16 aspect ratio,
  slow motion, ASMR audio, material names (glass, crystal).
NEVER change the action type (cutting -> cleaning, or vice versa).
VARY: sentence structure, adjectives, descriptive order.
Keep a similar length and the same language as the input.
{topic_rules}
"""

{topic_rules}에는 주제별 보존 조건을 채웠다. 예를 들어 유리 과일 절단에서는 칼, 유리 재질, 절단 동작, 단면 공개를 유지하도록 지시했다. 템플릿의 모든 단어나 서술 순서를 고정하는 방식은 아니었다.

(2) 검증 게이트

변형 결과에서 주제별 필수 키워드를 검사하고, 하나라도 빠지면 원본을 사용했다. 아래에는 두 주제의 규칙만 넣었다. _call_llm은 LLM 호출을 감싼 함수이며, API 오류나 빈 응답을 받으면 예외를 발생시킨다.

TOPIC_PRESERVE_RULES = {
    "satisfying_clean": "Keep pressure washing and grime removal by water.",
    "satisfying_cut": "Keep knife, glass, cutting, and cross-section reveal.",
}
TOPIC_REQUIRED_KEYWORDS = {
    "satisfying_clean": ["water", "jet"],
    "satisfying_cut": ["knife", "glass", "cut"],
}

async def diversify_prompt(self, prompt: Prompt) -> Prompt:
    """같은 주제 안에서 표현을 바꾸고, 실패하면 원본을 반환한다."""
    if not self.enabled:
        return prompt

    try:
        topic_id = prompt.template_id or ""
        system_prompt = REPHRASE_SYSTEM_PROMPT.format(
            topic_rules=TOPIC_PRESERVE_RULES.get(topic_id, "")
        )
        rephrased = await self._call_llm(system_prompt, prompt.text)

        required = TOPIC_REQUIRED_KEYWORDS.get(topic_id, [])
        if any(kw not in rephrased.lower() for kw in required):
            logger.warning("필수 키워드 누락 → 원본 유지")
            return prompt

        return Prompt(
            text=rephrased,
            template_id=prompt.template_id,
            variables=prompt.variables,
            original_text=prompt.text,
        )
    except Exception as exc:
        logger.warning(f"프롬프트 변형 실패 → 원본 유지: {exc}")
        return prompt

이 검사는 문자열에 필수 키워드가 포함됐는지만 확인한다. 예를 들어 유리 절단 결과에서 knife가 빠지면 원본으로 돌아간다. 반면 세 키워드가 남아 있다면 매크로나 ASMR 지시가 빠져도 이 검사는 통과한다. 동작의 의미나 영상 품질까지 검증하는 장치는 아니다.

규칙의 적용 범위도 제한적이었다. 확인한 구현에는 실행 기록에 등장하는 거품 세척 주제(satisfying_foam)의 필수 키워드 목록이 없다. 이 주제는 빈 목록을 받아 키워드 검사 없이 통과한다. 위 예제에서도 등록되지 않은 주제에 get(..., [])를 적용하면 같은 결과가 나온다.

(3) 실패 시 원본 복귀

다양화 기능이 꺼져 있거나 API 호출 또는 결과 검사가 실패하면 원본 프롬프트를 반환하도록 했다. 표현 변형을 하지 못해도 원본으로 영상 생성을 시도할 수 있게 한 것이다. 이 복귀 경로가 영상 생성이나 업로드 단계의 실패까지 처리하는 것은 아니다.

주제별 템플릿, 변수 치환, 표현 변형을 조합해 여러 주제를 같은 파이프라인에서 처리했다. 주제를 추가할 때는 템플릿과 규칙을 준비해야 했지만, 실행할 때마다 프롬프트 전체를 다시 쓸 필요는 줄었다.

같은 파이프라인으로 만든 네 주제(유리 행성, 보석, 디저트, 음료 단면)를 모은 영상이다. 비교용으로 합성한 무음 영상이므로 소리의 품질은 확인할 수 없다.

4. 결과

실행 기록에 저장된 프롬프트는 13개 주제 200건이었다. PC 부품 청소 113건에 초음파, 레이저, 먼지 제거, 거품 세척, 금속 복원과 절단 계열 7개 주제가 더해졌다. 이 수치는 저장된 프롬프트 항목 수이며, 생성이 완료되거나 업로드된 영상 수가 아니다.

기술적으로는 서로 다른 주제를 같은 파이프라인에서 처리할 수 있었다. 하지만 당시 체감한 노출은 주제를 늘리기 전과 비슷했다. 남아 있는 기록만으로는 주제별 조회수와 추천 노출을 같은 조건에서 비교하기 어렵다. 주제 다양화의 효과나 노출이 늘지 않은 원인을 분리해 판단할 수는 없었다.

5. 학습

이 시도에서 세 가지를 배웠다.

첫째, 묘사를 늘리기 전에 지시할 요소를 정리해야 한다. 이 실험에서는 설명을 길게 쓰는 것만으로 원하는 장면을 얻지 못했다. 피사체와 동작, 카메라, 소리를 구분해 적는 편이 프롬프트를 수정하고 결과를 비교하기에도 나았다. 예를 들어 카메라를 고정할지, 어떤 소리를 넣을지를 해당 항목에서 확인할 수 있었다.

둘째, 보존 지시와 실제 검사 범위를 구분해야 한다. LLM에 핵심 내용을 유지하라고 지시하고, 필수 키워드가 빠지면 원본으로 돌아가도록 구성했다. 다만 키워드가 있다고 의미까지 보존되는 것은 아니며, 규칙이 없는 주제는 검사하지 않았다. 이 패턴을 재사용할 때는 무엇을 지시했는지와 무엇을 코드로 검사하는지를 함께 적어야 한다.

셋째, 자동화 범위가 늘어도 성장 효과는 따로 확인해야 한다. 주제를 늘리는 일은 구현하기 쉬웠지만, 조회수를 높일 것이라는 근거는 부족했다. 업로드 양이나 채널 신뢰도가 원인이라고 볼 자료도 없었다. 13개 주제를 처리하게 됐다는 기술적 성과와 시청자 반응이 개선됐는지는 별개의 결과였다.

숏폼 파이프라인은 여기서 일단락한다. 제작 자동화를 구현하고 품질, 길이, 주제를 바꿔 봤지만 기대한 반응을 얻지는 못했다. 이 실험과 병행해 운영하던 롱폼 영상 파이프라인에 점차 무게를 실었다. 숏폼을 마친 뒤 새로 롱폼을 시작한 것은 아니었다.

세 편을 거치며 남은 자산은 주제별 템플릿을 재사용하고, 표현 변형이 실패하면 원본으로 돌아가는 구조다. 다음 시리즈에서는 병행하던 풀스택 롱폼 파이프라인을 다룬다.

← 전체 글 목록