
자동으로 블로그를 계속 업데이트하는 시스템 만들기
요약
AI를 활용한 자동 블로그 포스팅 시스템 구축 과정에서 겪은 매너리즘 문제와 그 해결 방안을 다룹니다. 단순 키워드 기반 생성의 한계를 지적하며, 페르소나의 연속성과 프로젝트 관리 개념이 결여된 시스템의 문제점을 분석합니다.
핵심 포인트
- 키워드 기반 뉴스 수집 방식의 매너리즘 및 무한 루프 문제
- 과거 문맥과 인생의 목표(프로젝트)가 결여된 AI의 한계
- 단순 기사 생성기를 넘어 살아있는 페르소나 구현의 필요성
- 장기적 관점의 마일스톤과 내면의 변화를 반영하는 설계의 중요성
거의 1년에 걸쳐 자동화해 온 AI 블로그 포스팅 시스템
타겟 블로그
기사 단체의 완성도는 어느 정도 높지만, 이른바 스팸 기사의 양산이 되어버려, 블로그로서의 가치 같은 것을 전혀 느낄 수 없게 되어버렸다.
blogs.yml에 다음과 같은 설정(페르소나와 키워드)을 정의하고 있다.
travel_adventure:
blog_name: 아저씨의 방랑기: 산과 여행과 카메라야!
category: travel
...
시스템의 심장부인 BlogMasterAgent는 매일 이 키워드를 바탕으로 Google News RSS 등을 호출하여 최신 트렌드를 수집한다. 그리고 AI (Gemini)에게 다음과 같이 지시를 내린다.
"이 페르소나 설정과 오늘의 트렌드 뉴스를 사용해서, 재미있는 기사 테마를 생각해 줘"라고.
결과적으로, 훌륭한 "아저씨의 블로그 기사"가 자동 생성되었다.
하지만, 불과 며칠 운용한 것만으로 우리는 **AI 블로그 특유의 치명적인 "실태(버그)"**에 직면하게 된다.
어느 날, AI는 "차박" 뉴스를 포착하여 훌륭한 차박 기사를 작성했다.
여기까지는 좋다. 하지만 다음 날도, 그다음 날도, AI는 **"차박 온천 여행의 편리한 도구, 이거 진짜 필요한 거야?"**와 같은, 비슷한 차박 기사만을 계속해서 쓰기 시작했다.
왜 이렇게 되는 것일까?
원인은 단순했다. blogs.yml에 등록된 몇 개의 keywords를 기점으로 뉴스를 가져오기만 하는 로직이었기 때문이다. 과거의 문맥을 가지지 못하는 AI는 "등산", "차박", "기어"라는 좁은 장르의 룰렛을 영원히 돌리는 **"매너리즘 로직"**에 빠져 있었다.
인간이라면 "어제 차박 기사를 썼으니까, 오늘은 산의 날씨 이야기를 하자"라고 생각한다. 하지만 당시 시스템에는 "어제 무엇을 썼는가"라는 개념이 없다. 항상 제로 베이스에서 키워드로부터 기사를 생성했기 때문에, 같은 장르에 고착되는 "무한 루프"가 발생하고 말았다.
매너리즘을 타파하기 위해, 우리는 일시적으로 "Serendipity(우연성)를 높여서, 지난번과 다른 테마를 골라라"라는 프롬프트를 추가했다.
하지만 이것도 근본적인 해결책은 되지 못했다. "등산화", "텐트", "로컬 명봉"과 같이 랜덤하게 화제가 흩어질 뿐, 이번에는 블로그로서의 축이 흔들려 버렸다.
여기서 우리는 근본적인 문제에 깨닫는다.
"페르소나는 인물이며, 독자도 인물이다"
만약 정말로 56세 아저씨가 블로그를 쓰고 있다면, "오늘은 등산 뉴스가 있었으니까 이것을 쓰자"라는 수동적인 움직임은 하지 않을 것이다.
- "6월에 신슈의 산에 오른다"라는 커다란 목표(프로젝트)가 있다.
- 그래서 지금은 그것을 위한 "체력 단련의 경과"나 "새로운 등산화 리뷰"를 쓴다.
- 독자도 "이 아저씨는 최종적으로 신슈의 산을 등정할 수 있을까?"라는 마일스톤의 행방을 기대하며 블로그를 읽는다.
하지만 당시의 AI에는 이 "인생의 현재 위치"와 "프로젝트 관리"의 개념이 완전히 빠져 있었다. 그저 흘러나오는 뉴스를 번역하여 감상을 말할 뿐인 "기사 생성 머신"으로 전락해 있었다.
최대의 벽은 "인간 내면의 변화"를 그릴 수 없다는 점이었다.
처음에는 "딸에게 캠핑 요리를 칭찬받고 싶다"라고 생각하며 블로그를 시작한 아저씨도, 반년 후에는 "산에서 만난 동료들과의 교류"에 흥미가 옮겨갈 수도 있고, 부상을 입어 "건강 수명을 늘리는 법"으로 테마가 바뀔 수도 있다.
당시 시스템에서는 아무리 blogs.yml의 설정을 치밀하게 만들어도, 그것을 "초기 설정으로서 매번 읽히게 하는 것"에 머물러 있었다.
AI는 "딸이 있는 56세"라는 설정을 연기할 수는 있어도, "어제 딸에게 차갑게 대해져서 낙담하고 있는 56세"가 될 수는 없다. 기사를 쓸 때마다 리셋되어, 항상 일정한 텐션으로 등산 뉴스를 이야기하는 "무감정한 사이코패스" 같은 기괴함이 감돌기 시작했다.
"장르 특화 자동 생성기"에서 "살아있는 블로그"로.
그저 기사를 뱉어내기만 하는 시스템을 버리고, 과거의 기억을 계승하며, 인생의 목표(아크)가 옮겨가는 시스템을 만들어야만 한다.
이 한계점에서의 브레이크스루(Breakthrough)가, 후에 "4층 가상 인격 데이터베이스"라는 전대미문의 아키텍처를 탄생시키게 되었다.
그럼, 후반부인 "해결책(4층 아키텍처)"부터 "마치며"까지의 파트를 계속하겠습니다.
앞서 언급한 톤("~이다"를 배제하고, 사실과 깨달음을 담담하면서도 열정 있게 이야기하는 문체)을 이어받아 작성했습니다.
프롬프트를 만지작거리는 것을 그만두었다. LLM이 '알아서 잘' 문맥을 해석하고 인격을 유지해 줄 것이라는 달콤한 기대는 버리고, 데이터 모델(Data Model)과 상태 전이(State Machine)를 아주 단단하게 고정하는 접근 방식으로 전환했다.
실운영에서 가장 많이 망가지는 것이 바로 그 'AI의 똑똑함에 대한 의존'이기 때문이다.
우리가 도달한 아키텍처(Architecture)는 다음과 같은 4층 구조로 구성되어 있다.
Layer 1: 인격의 토대 (Identity Foundation)
절대로 시스템에서 다시 쓰지 않는, 인격의 토대. 여기는 YAML로 정적으로 유지한다.
id: travel_adventure
demographics:
age: 56
...
이것을 매번 프롬프트의 선두에 '절대적인 진실'로서 주입하여, AI가 '최근에 만남이 있었으니 나는 독신 프리랜서다'라고 환각(Hallucination)을 보는 것을 물리적으로 방지한다.
Layer 2: 현재 상태 (Current Status)
매일의 기사 생성에 직접 로드되는 현재의 상태 (JSON). 인간으로 치면 '요즘 나의 관심사나 기분'에 해당한다.
{
"current_arc": {
"topic": "딸을 감탄하게 만드는 캠핑 요리",
...
여기서 중요한 것은, '진척도가 100이 되면 다음 테마로'와 같은 게임의 퀘스트 같은 단순한 전이로 만들지 않는 것이다. 상태(Status)에 abandoned (질림·좌절함)나 stalled (정체 중) 등을 갖게 하는 것이 인간다운 리얼리티로 직결된다.
Layer 3: 사건 기록 (Event Log)
매일의 사건을 기록하는 층. 여기서 구현해야 할 것은 '망각 정책(Forgetfulness Policy)'이다. 단순히 배열에 기억을 집어넣고 오래된 순서대로 지우는 (FIFO) 방식으로는 인간의 기억 메커니즘과는 거리가 멀다.
{
"event_text": "베란다에서 만든 훈제 요리를 딸이 '맛있다'고 해주었다",
"type": "episodic",
...
Salience(현저성) = (중요도 + 감정) - 시간 감쇠 + 회상 횟수라는 망각 곡선을 수식화하여, 점수가 낮은 것부터 아카이브(Archive)해 나간다. 이렇게 하면 '어제 점심 메뉴는 3일이면 잊어버리지만, 딸에게 칭찬받은 일은 몇 년 후에도 문득 떠오른다'는 뇌의 시뮬레이션이 가능해진다.
Layer 4: 신념 형성 (Belief Formation)
이것이 이 아키텍처의 가장 큰 핵심이다. 인간은 '사건' 그 자체가 아니라, 그로부터 얻은 '의미'의 축적에 의해 인격을 형성한다.
매일 밤 '심야 배치 처리(Batch Processing, 즉 수면)'를 돌려, 그날의 사건(Layer 2)을 재평가하게 한다. 예를 들어 '딸에게 칭찬받았다'는 기억이 10건 모이면, 시스템은 다음과 같은 노드(Node)를 자동으로 생성하고 강화해 나간다.
{
"belief_statement": "딸과의 공유 시간은 그 어떤 취미보다 가치가 있다",
"strength": 88,
...
운영을 계속하다 보면, 이 Layer 3에서 반드시 '모순'이 발생한다.
예를 들어 '가족 제일(strength: 90)'이라는 신념과 '가끔은 혼자 산속에 박히고 싶다(strength: 85)'라는 신념이 격렬하게 충돌하는 타이밍이 온다.
시스템적으로 어느 한쪽을 감쇠시켜 AI의 사고의 일관성을 맞춰야 할까?
아니, 일부러 모순을 품은 채로 둔다.
왜냐하면, 그것이야말로 '인간 특유의 갈등'이기 때문이다. 상반된 신념을 품은 채로 글을 쓰게 함으로써, '주말에는 가족을 위해 최선을 다했지만, 한밤중에 문득 솔로 텐트 카탈로그를 쳐다보고 만다'와 같은, 매우 해상도 높은 리얼한 인간 드라마가 탄생한다.
그리고 특정 신념이 임계치를 계속 넘었을 때, 비로소 장기 목표(Layer 1의 Arc)가 다시 쓰여진다. 처음에는 '백 명산 제패'를 꿈꾸던 남자가, 몇 년 후에는 자연스럽게 '손주와 산을 걷기 위한 체력 만들기'로 목표를 바꾸고 있는 식이다. 본인은 자신이 자연스럽게 변했다고 믿고 있는 것이다.
이 단계에 이르면, 이제 더 이상 블로그 기사 자동 생성 도구가 아니라, '56세 아저씨가 인터넷상에서 계속 살아가는 시뮬레이션'이라고 해도 좋다.
LLM의 진화는 놀랍다. 하지만 모든 것을 프롬프트에 통째로 맡기는 접근 방식은 언젠가 반드시 파탄 난다. '데이터 구조', '상태 전이', '평가 함수'를 엔지니어링으로 확실히 정의해야 비로소 AI는 '일관된 인생'을 걷기 시작할 수 있다.
AI에 생명을 불어넣으려고 프롬프트를 만지작거리기 전에, 우선 JSON Schema와 상태 전이도를 그려보는 것은 어떨까.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기