devlog.md

[블로그, 인스타 업로드_자동화] 바이브코딩 블로그 자동화, 콘텐츠 중복 방지 구현기_04

경제 블로그 자동화 파이프라인에 "콘텐츠 중복 방지" 로직을 얹었다. 모킹 테스트는 다 통과해서 편하게 끝날 줄 알았는데, 실제 API와 실제 로컬 모델로 돌려보니 로직을 통째로 무력화시킬 뻔한 버그부터 HTML이 깨지는 버그까지 줄줄이 터졌다.

왜 중복 방지가 필요했나

FRED·ECOS 지표는 CPI 월별, GDP 분기별로만 갱신되는데 파이프라인은 매일 07시에 미국/한국 × 영/한 4개 조합을 자동 생성한다. 데이터가 안 바뀐 날엔 사실상 같은 글이 반복될 수밖에 없어서 SEO·애드센스 심사에 불리하다. "직전 실행값과 비교해서 스킵하거나 대체 콘텐츠로 바꾸자"는 결정은 나 있었는데 코드는 아직 없었다.

11_dedup.py로 구현

topic×language 조합별로 직전 지표 스냅샷을 저장·비교하는 모듈을 새로 만들었다. .env의 DEDUP_MODE로 off/skip/substitute 세 가지를 켜고 끌 수 있게 했다 — off는 항상 생성, skip은 안 바뀐 조합을 건너뜀, substitute는 시황 글 대신 "이 지표가 뭔지" 설명하는 개념형 글로 대체한다. 외부 호출을 전부 가짜로 채운 테스트로 다섯 시나리오를 통과시키고 문서까지 갱신했다.

실 API로 돌리자마자 터진 스냅샷 오염

같은 topic인데 언어만 다르게 돌려봤더니 스냅샷이 서로 달랐다. GDP 값에 언어별 단위 라벨("USD Trillion" vs "조 달러")을 붙인 채로 그대로 저장하고 있었던 것. 이대로면 데이터가 그대로여도 언어가 다르면 매번 "바뀜"으로 오판해서 중복 방지가 무력화될 뻔했다. FRED가 같이 주는 개정 시점 메타데이터까지 섞여 있어서, 스냅샷은 date·value만, 그것도 단위 환산 전 원본값으로 담게 고쳤다.

실제 Ollama로 뽑아보니 HTML이 깨진다

개념 설명형 글을 생성해보니 <p><h2>제목</h2>본문</p> 같은 잘못된 중첩이 나왔다. 모델이 h2만 쓰고 p는 빼먹으면 기존 폴백이 블록을 통째로 p로 감싸버리던 구조였는데, 기존 시황 글 파서에도 똑같이 있던 버그였다. 블록 단위로 헤딩 분리, 마크다운 목록을 ul/ol로, 굵게를 strong으로 바꾸는 함수를 추가했다. 다시 돌려보니 이번엔 모델이 HTML 헤딩을 마크다운 굵게로 또 감싸서 나왔고, 고치고 나니 마크다운 헤딩과 굵게가 섞인 변형까지 나왔다. 세 번 연속 새 변형이 터지는 걸 보며 로컬 소형 모델의 출력 형식은 끝까지 못 믿는다는 걸 다시 느꼈다.

한글 생성에서 또 — 메타 설명 누출

한글로도 돌려보니 메타 설명 끝에 분량 지시 문구가 그대로 붙어 나왔다. 기존 필터는 "약 850자"처럼 수식어+단위 조합만 잡고 있어서 "길이:" 라벨이 붙는 신형은 못 걸렀다. 라벨이 있으면 단위 없이도 잡고, 없으면 단위를 반드시 요구하도록 규칙을 나눠 고쳤다 — 안 그러면 정상 괄호 표기까지 지워버리기 때문이다. 메타를 150자로 자르는 함수가 실제론 151자를 뱉던 자리수 실수도 이 참에 잡았다.

Ollama 자동 기동 + 토큰 갱신 자동화

Ollama 앱이 로그인 항목에 없어서, 맥북을 켰을 때 수동으로 안 띄워두면 07시 예약 실행이 전부 실패할 수 있는 상황이었다. 파이프라인 시작 시 서버 상태를 확인하고 꺼져 있으면 직접 띄우는 함수를 넣었다. 인스타그램 장기 토큰도 60일마다 만료되는데 갱신 자동화가 안 돼 있길래, 30일 주기로 돌리는 launchd 작업을 새로 만들어 등록까지 마쳤다(첫 등록 시 입출력 에러가 났는데 이미 로드된 상태와 충돌한 것이라 해제 후 재등록으로 해결).

Trouble Shooting

증상원인해결
언어만 바꾸면 스냅샷이 달라짐GDP 스냅샷에 언어별 단위 라벨·FRED 메타데이터 혼입date·value만, 환산 전 원본값으로 저장
본문에 p·h2 잘못된 중첩모델이 h2만 쓰면 폴백이 블록 전체를 p로 감쌈블록 단위 HTML 정규화 함수 추가
**<h2>..</h2>** 형태로 잔존모델이 HTML 헤딩을 마크다운 굵게로 재차 감쌈굵게로 감싼 태그를 먼저 벗기는 정규식 추가
메타 끝에 "(길이: 약 1950자)" 잔존누출 필터가 라벨 붙은 신형 변형을 예상 못함라벨 유무로 규칙 분리(라벨 있으면 단위 생략 허용)
Ollama 미기동 시 예약 실행 전멸 위험Ollama가 로그인 항목에 미등록파이프라인이 스스로 서버를 깨우는 프리플라이트 추가

느낀 점 / 다음에 할 일

오늘 가장 크게 느낀 건, 모킹 테스트는 "로직이 맞다"는 것만 증명하지 실제 API 응답 구조나 로컬 모델의 실제 출력까지는 보장해주지 않는다는 점이다. 스냅샷 오염 버그는 모킹만으로는 끝까지 못 잡았을 버그였다. 다음 세션에서는 Blogger에 초안이 실제로 저장되는지, 하루 이틀 뒤 진짜로 스킵이 발동하는지를 확인해야 한다.

댓글