IceBlogation 개발일지 — 광고가 아니라 '읽을거리'를 만들기까지
자동 생성 글이 죄다 광고전단이었다. 글의 80%는 이야기·20%만 상품으로 규칙을 바꾸고, 모델을 갈아끼우는 설정과 빠진 이미지·링크를 채우는 풀백을 붙였다. 다음 목표는 설치파일.
지난번에 IceBlogation의 뼈대를 세웠다면, 오늘은 그걸 '제품'에 가깝게 다듬은 날이다. 가장 크게 손본 건 의외로 새 기능이 아니라 글의 품질이었다.
자동 생성 글이 광고전단이었다
테스트로 글을 몇 편 뽑아보고 한숨이 나왔다. 블로그마다 '정체성'(누가, 누구에게, 어떤 톤으로 쓰는지)을 정해뒀는데도 결과물은 죄다 쇼핑호스트 멘트였다. 알고 보니 코드가 "✅", "최저가 보러가기" 같은 문구를 자동으로 박아넣고 있었고, 프롬프트는 "이 상품들을 소개하는 글을 써라"라고 시키고 있었다. 그러니 누가 써도 전단지가 나올 수밖에 없었다.
사람들은 광고를 보러 블로그에 오지 않는다. 정보나 재미를 보러 왔다가, 신뢰가 생기면 그제야 추천에 마음이 움직인다. 그래서 규칙을 바꿨다.
- 글의 80%는 페르소나의 경험과 정보, 20%만 상품 이야기. 상품은 주인공이 아니라 조연으로 둔다.
- "너는 이 사람이다. 1인칭으로 네 경험과 솔직한 의견을 써라." 장점만이 아니라 한계와 안 맞는 사람도 한 줄씩 넣게 했다.
- 한 글에 쿠팡 상품은 1~2개로 제한하고, 과장어("최저가", "강력추천", "대박"…)는 아예 차단했다.
다시 뽑아보니 글이 달라졌다. 출근길 이야기로 시작해 영양제 고를 때 따지는 기준(균주, 흡수율, 산패)을 풀고, "이건 이런 사람한테는 안 맞을 수도 있어요"라고 솔직하게 덧붙인 뒤 자연스럽게 추천으로 넘어가는 글. 같은 엔진인데 프롬프트 한 장으로 이렇게 바뀐다는 게 새삼 신기했다.
모델을 갈아끼울 수 있게
본문은 내 PC에서 도는 로컬 모델(gemma4)이 쓴다. 공짜고 약관 걱정도 없다. 그래도 나중에 더 싸고 좋은 클라우드 모델을 쓰고 싶어질 수 있어서, 설정을 코드에서 꺼내 화면에서 관리하도록 했다.
- ⚙ 설정 창에서 LLM 제공자(로컬 / OpenAI 호환 / Gemini / Claude)와 API 키를 직접 넣는다.
- 'OpenAI 호환' 슬롯 하나면 GLM·DeepSeek 같은 저가 고성능 모델이 대부분 그대로 꽂힌다.
- 키는 계정 비밀번호와 같은 방식으로 암호화해서 저장한다. 더 이상 설정 파일을 손으로 고칠 필요가 없다.
깜깜이를 없애고, 빠진 곳을 채우다
대량 작업은 시간이 걸린다. 그동안 화면이 깜깜하면 불안하다. 그래서 진행 상황(몇 개 중 몇 번째인지, 완료·실패 수, 실시간 로그)과 중지 버튼을 붙였다.
그리고 현실적인 문제 하나. 이미지를 만드는 도구는 하루 한도가 있다. 대량으로 돌리다 한도가 끝나면 그 뒤 글들은 이미지가 비거나 가짜로 채워지고, 링크가 부족하면 글이 '링크 대기' 상태로 남는다. 그래서 풀백(보강) 기능을 만들었다. 나중에 빠진 곳만 순회하면서 이미지를 다시 생성하고, 새 링크가 들어오면 대기 중이던 글에 자동으로 채워 넣는다.
이 밖에 화면도 손봤다. 생성 패널을 한 단으로 펴고, 블로그를 카드 그리드로 골라 클릭하면 선택되게 했다. 각 카드에는 그 블로그의 정체성(주제·톤·키워드)을 한눈에 띄웠다. 글 미리보기는 새 창으로 띄워 실제 발행본처럼 보이게 했다.
정직하게, 그리고 남은 일
도구를 만들면서 계속 떠올린 건 '선'이다. 개인 구독을 자동화로 돌려 대량 상업 콘텐츠를 찍어내는 건 약관상 회색지대다. 그래서 대량은 무료 로컬 모델로 가는 길을 기본에 뒀다. 양산 자체가 목적이 되지 않도록, 80/20 규칙처럼 '읽을 만한 글'의 하한선을 기계로 강제하는 것도 같은 맥락이다.
오늘 회귀 테스트는 54개가 전부 통과했다. 이제 남은 건 하나, 설치파일이다. 지금은 폴더째 실행하는 형태인데, 더블클릭 한 번으로 설치되는 진짜 배포본으로 만들면 비로소 '제품'이라 부를 수 있을 것 같다. 거기까지가 다음 목표다.