기업용 LinkedIn 페이지를 위한 멀티 에이전트 AI 구축 - 파트 7: Hook Agent 구축하기
요약
LinkedIn 콘텐츠 생성을 위한 멀티 에이전트 시스템 중 Hook Agent 구축 방법을 다룹니다. Content Brief를 입력받아 대담한 주장, 통계 등 5가지 유형의 매력적인 도입부를 생성하고 검증하는 과정을 설명합니다.
핵심 포인트
- Content Brief를 기반으로 5가지 다양한 Hook 변형 생성
- 시스템 프롬프트를 통한 출력 형식(JSON) 및 순서 강제
- 모델의 출력 오류를 방지하기 위한 재시도(Retry) 및 검증 로직 구현
- 구조화된 데이터 처리를 위한 model_dump() 활용
이제 우리의 시스템은 주제를 분류하고, 조사를 수행하며, 사례를 뒷받침하고, 취약한 가정과 근거 없는 주장을 식별하며, 모든 것을 콘텐츠 브리프 (Content Brief)로 구조화하여 작성 에이전트 (Writing Agents)에게 전달할 수 있습니다.
작성 에이전트가 전체 게시물을 생성하기 전에, 사람들의 스크롤을 멈추게 할 만큼 매력적인 도입부가 필요합니다.
그것이 바로 우리가 Hook Agent를 구축한 이유입니다.
이전의 에이전트들과 달리, 이 에이전트는 주제, 조사 내용, 사례 또는 비판을 직접 소비하지 않습니다. 대신, Brief Agent가 생성한 ContentBrief만을 입력으로 받습니다.
Content Brief
│
▼
...
우리 대부분은 처음 얻은 Hook(갈고리/도입부)에 만족하지 못합니다. 그래서 저는 단 하나의 도입부를 생성하는 대신, 다섯 가지의 서로 다른 Hook 변형을 생성합니다.
Draft Agent는 나중에 이 중 어느 것이든 사용하여 완전한 게시물을 생성할 수 있습니다. 하나의 Hook 형식이 모든 게시물에 통용되지는 않으므로, 우리는 Bold Claim (대담한 주장), Statistic (통계), Confession (고백), Question (질문), One-liner (한 줄 문구)와 같은 다양한 유형의 Hook 변형을 사용합니다.
단 한 줄의 코드도 쓰기 전에, 시스템 프롬프트 (System Prompt)부터 시작하겠습니다. 저는 정확히 5개의 Hook을 생성하도록 명시적으로 지시하고, 예시와 함께 Hook 형식을 정의하며, 고정된 순서를 강제하고, 유효한 JSON을 반환하도록 설정했습니다.
SYSTEM_PROMPT = """
Generate exactly 5 hooks.
...
실제 운영 환경의 프롬프트는 훨씬 더 길지만, 핵심 규칙을 강조하기 위해 여기서는 축약했습니다.
따라서 JSON 응답은 Hook을 정확한 순서대로 반환하며, 이를 통해 비교가 용이해지고 다운스트림 에이전트 (Downstream Agents)가 결정론적으로 이를 참조할 수 있게 합니다. 예를 들어, hooks[0]은 항상 Bold Claim입니다.
0 -> Bold Claim
1 -> Stat
...
프롬프트를 수동으로 구성하는 대신, model_dump()를 사용하여 ContentBrief 객체를 딕셔너리 (Dictionary)로 변환하고 이를 구조화된 사용자 메시지 (User Message)로 직렬화합니다.
brief_dict = brief.model_dump()
user_message = "\n".join(
...
Critic Agent와 마찬가지로, Hook Agent는 모델이 잘못된 형식의 JSON을 반환하거나 5개 미만의 Hook을 반환할 경우 최대 3번까지 생성을 재시도합니다.
for attempt in range(max_retries):
응답을 반환하기 전에, 정확히 5개의 Hook이 생성되었는지 검증합니다. 저는 5개보다 적은 Hook을 반환하느니 차라리 아무것도 반환하지 않는 쪽을 택하겠습니다. Draft Agent는 5개의 Hook 형식을 모두 기대하므로, 부분적인 출력은 실패로 간주됩니다.
if len(parsed) == 5:
return parsed
코드를 작성하기 전에, 함수 내부에서 어떤 일이 일어나는지 분석해 보겠습니다. 이 함수는 ContentBrief 객체를 입력으로 받아, model_dump()를 사용하여 이를 딕셔너리 (dictionary)로 변환하고, 사용자 메시지 (user message)를 구축하며, LLM을 호출하고, 마크다운 펜스 (markdown fences)를 제거하고, JSON 응답을 파싱 (parsing)하며, 정확히 5개의 Hook이 반환되었는지 검증합니다.
def generate_hooks(brief: ContentBrief, max_retries = 3) -> list[str]:
brief_dict = brief.model_dump()
user_message = "\n".join([f"{key}:{value}" for key, value in brief_dict.items()])
...
이 시점에서 우리의 시스템은 주제를 이해하고, 뒷받침할 수 있는 조사 자료를 수집하며, 실제 사례를 찾고, 이를 비판적으로 검토하고, 모든 것을 콘텐츠 브리프 (content brief)로 구조화하며, 단 하나의 포스트를 작성하기 전에 5개의 구조화된 Hook 변형을 생성할 수 있습니다.
다음 기사에서는 이 Hook 중 하나를 가져와 사용자가 선택할 수 있는 완전한 LinkedIn 포스트 초안으로 변환하는 Draft Agent를 구축할 것입니다.
Github Repo: https://github.com/Manav-N4/linkedin-agent#linkedin-agent
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기