AI로 진짜 '댓글 부대' 를 만들어버렸다.

 

 

AI로 진짜 사람 같은 '댓글 부대' 를 만들어보자.

초창기 서비스의 *콜드 스타트 단계는 모든 스타트업에게 난제일 것이다.이직 시기에 면접을 볼 때면, PM으로서 커뮤니티 혹은 커머스의 콜드 스타트 단계를 어떻게 돌파하고, 액티브 유저를 어

imjaden.tistory.com

결국 AI 댓글부대 50명을 만들어버렸다.

내 애착 모델, Gemini 2.5 API로 50명의 페르소나를 구현했고

그 결과, 내가 자는 동안에도 Bot이 돌아가면서 사이좋게 댓글을 달고 있다.

 

지금 1/26 월요일 밤 9시 30분인데

지금 잘 작성하고 있나 한번 체크해보자.

 

아주 잘하고 있다.

그래서 이걸 어떻게 만들었는지

 

지난번 내용과 함께 같이

이번 댓글부대 프로젝트를 Wrap-Up 해보자.


댓글 부대 - AI 에이전트 기반 커뮤니티 활성화 시스템

 

WHY: 왜 이걸 시작했는가?

1. 콜드 스타트 문제

모든 신생 커뮤니티가 겪는 가장 큰 문제는 '유저가 없어서 콘텐츠가 없고, 콘텐츠가 없어서 유저가 들어오지 않는' 악순환이다.

초기 레딧 창업자 스티브 호프만과 알렉시스 오하니안조차도 서비스 초기에는 수백 개의 가짜 계정을 직접 운영하며 커뮤니티가 활발한 것처럼 연기했다.

2026년, 내가 선택한 방식 -> "Fake it till you make it" with AI

과거에는 창업자가 밤새도록 다중이 놀이를 해야 했지만

2026년 현재는 LLM과 자동화 스크립트를 통해 이를 훨씬 정교하고, 인간적이며, 지속 가능하게 구현할 수 있다.

 

목표

  1. 조회수 : 인기 없는 글도 사람들이 보는 것처럼 보이게 함
  2. 여론 형성 : 다양한 페르소나(성격)를 가진 AI가 댓글을 달아 논쟁과 공감을 유도
  3. 무인 자동화: 내가 잠든 사이에도 24시간 돌아가는 시스템 구축

WHAT: 무엇을 만들었는가?

1. 시스템 아키텍처

기술 스택

  • Core Logic : Python
  • DB : Supabase SQL
  • AI : Google Gemini 2.5 Flash
  • Infra: Google Cloud Platform (GCP) Compute Engine (e2-micro, Free Tier)
  • Process: tmux

2. 핵심 기능

  • 무작위 스케줄링 - 60초~1200초 사이의 불규칙한 간격으로 실행되어 봇 탐지를 회피
  • 조회수 다변화 - 게시글마다 조회수를 2~120회 사이로 랜덤하게 증가시켜 자연스러운 트래픽 패턴 모사
  • 컨텍스트 인지 - 게시글 본문뿐만 아니라, 기존에 달린 댓글의 컨텍스트/문맥을 읽고 대화에 참여
  • 중복 방지 - 한 번 댓글을 단 페르소나는 해당 글에서 제외, 최근 활동한 5명 제외 등 중복 방지 로직 탑재

HOW: 디테일한 개발 및 트러블슈팅 로그

Phase 1. 로컬 환경 구성과 초기 혼란

1.1. 선택 >>  Python 스크립트 vs 주피터 노트북

처음에는 단순 .py 스크립트로 시작하려 했으나, 데이터베이스 연결 테스트와 프롬프트 결과를 즉시 확인하기 위해 주피터 노트북(Jupyter Notebook)으로 전환했다.

1.2. 선택 >> 가상환경(venv) vs 시스템 패키지

Mac OS의 Python 3.12 환경에서 pip install 시 "Externally Managed Environment" 에러 발생.

해결책은 단순하게 가상환경하면 되는데 그놈의 귀찮음이....

 

venv를 만들고 source activate 하는 과정이 자동화 스크립트 작성에 번거로움을 줌.

어차피 로컬에서 테스트니까 과감하게 --break-system-packages로 시스템 파이썬에 라이브러리를 강제 설치함. (단일 목적 봇이므로 의존성 충돌 우려가 적다고 판단)

 

Phase 2. Supabase DB 연결

로컬 로직은 완벽했으나 DB 연동이 꽤나 귀찮았다.

2.1. Supabse >> IPv6 vs IPv4

문제 : OperationalError: could not translate host name... 에러 발생. Supabase가 제공한 기본 연결 문자열(Direct Connection, Port 5432)을 사용했으나 Mac 로컬 환경에서 호스트를 찾지 못함.

 

원인 : Supabase의 Direct 주소는 IPv6를 기반으로 하는데, 현재 사용 중인 네트워크 환경(Wi-Fi 등)이 IPv6를 제대로 지원하지 못해 DNS 해석 실패.

 

해결: IPv4를 지원하는 Transaction Pooler (Port 6543) 주소(aws-0-ap-northeast-2.pooler...)로 변경하여 해결.

 

2.2. "로그는 뜨는데 DB는 비어있다"

문제 : 스크립트 실행 로그에는 댓글 작성 완료가 뜨는데, 실제 Supabase 테이블은 텅 비어있음.

원인: Python의 psycopg2 라이브러리는 기본적으로 트

랜잭션을 자동 커밋하지 않음. INSERT 쿼리를 날렸지만 commit()을 안 해서 프로그램 종료와 함께 롤백됨.

 

해결: conn.commit() 명령어를 추가하여 트랜잭션 확정


Phase 3. 콘텐츠 엔지니어링 (Persona & Prompt)

사실 환경구축은 그나마 매끄러웠다.

이제 진짜가 문제였다. 가장 문제인 "얼마나 사람 같으냐"의 문제였다.

3.1. "AI스러운" 말투 제거 >>>> Few-Shot Prompting

초기 상태는 AI가 "이 시계의 파란 다이얼이 정말 인상적이네요!" 같은 번역투의, 지나치게 예의 바르고 설명조인 댓글을 작성. 

 

열받아서 프롬프트를 뜯어고침. 프롬프트에 Few-Shot 기법 적용. 실제 수많은 커뮤니티(디시인사이드, 펨코 등)에서 볼 법한 댓글 예시("ㄹㅇㅋㅋ", "주작 아님?", "좌표 좀")를 30개 이상 주입하고, "건조하게", "단답형으로", "맞춤법 틀려도 됨" 등의 제약 조건을 걸어 인간미(?) 확보.

3.2. 페르소나 다양화 및 중복 방지

기존 문제, 20명의 페르소나로는 부족함을 느낌. 같은 아이디가 계속 댓글을 다는 현상 발생.

이를 해결하기 위해 페르소나를 50명으로 대폭 늘림. 정치적 성향(좌/우), 경제적 상황(영끌이/코인러), 성격(비관적/낙천적)을 다양하게 부여

그리고 로직 추가,

  1. ai_personas.json 파일로 관리.
  2. SQL 조회 시 recent_user_ids (최근 활동자)와 issue_user_ids (해당 글 작성자)를 가져와 후보군에서 제외(Set 연산)하는 로직 구현했다.

3.2. 멀티모달(이미지 인식)은 포기했다..

최초에는 AI가 게시글의 썸네일을 인식해 "이 사진 속 음식 맛있겠다"는 식의 댓글을 달려고 시도

실제로) '아 정말 사진처럼 무려 금리가 8.2%나 오르고 있어! 젠장할!' -> 이런 댓글을 쓰기 시작했다..

 

썸네일 URL 파싱 로직(json.loads vs string)이 복잡했고, 결정적으로 AI가 이미지를 너무 구체적으로 묘사("접시 위에 놓인 빨간 소스가...")하여 오히려 AI 티가 남. HTTP 400 에러도 빈번함.

 

이미지 인식 기능을 전면 제거(Deprecate)하고, 텍스트(제목+본문+기존댓글) 문맥 분석에만 집중하기로 결정. 결과적으로 속도 향상과 자연스러움을 동시에 얻었다.


Phase 4. GCP 클라우드 배포와 무한 실행

맥북을 계속 켜둘 수 없어 구글 클라우드(GCP)로 이전을 결심했다. 여기서 또 다른 차원의 삽질이 시작되었다.

4.1. GCP 콘솔 UI 헤매다가 무료 티어 설정 실패할 뻔

2026년 GCP 콘솔 UI 개편으로 인해 무료 티어 조건인 '디스크' 선택 메뉴가 숨겨져 있었음. 기본값인 '균형 있는 디스크'로 만들면 월 $1~2가 과금됨

 

웹 UI에서 헤매는 것을 멈추고, Cloud Shell을 열어 gcloud CLI 명령어로 인스턴스를 생성함.이 명령어로 리전(us-central1), 사양(e2-micro), 디스크(30GB Standard) 조건을 정확히 맞춰 0원 서버 생성 성공

gcloud compute instances create issue-wiki-bot --machine-type=e2-micro --boot-disk-type=pd-standard ...

4.2. 환경변수 업로드 실패

SSH 창의 파일 업로드 기능을 사용했으나, .env.local 파일이 업로드 목록에 보이지 않거나 업로드 후에도 ls로 보이지 않음.

-> Unix 계열에서 .으로 시작하는 파일은 숨김 파일이다. (까먹고 있었다.)

Mac Finder에서 Cmd + Shift + . 단축키로 숨김 파일 표시해서 찾았다.

4.3. 프로세스 관리 (tmux)

automation.py 실행 > 단축키 대신 새로운 SSH 창을 하나 더 띄움 > tmux detach 명령어를 입력하여 강제로 세션을 분리


최종 결과

현재 상태

  • 안정성: GCP e2-micro 서버(Ubuntu 24.04 LTS)에서 while True 루프를 통해 중단 없이 가동 중.
  • 비용: $0.00. (Google Cloud Free Tier 적용 확인)
  • 퍼포먼스:
    • 평균 10분~20분(random.randint(60, 1200))마다 한 번씩 활동.
    • 조회수 2~120회 증가 + 자연스러운 댓글 1개 작성.
    • 50명의 페르소나가 돌아가며 활동하여 중복 느낌 없음.

"기술적으로 가능한가?"를 넘어 "어떻게 하면 실제 커뮤니티처럼 보이는가?"에 집중했다.

초기의 복잡했던 구상(멀티모달, 아키텍처)을 버리고, 단순한 텍스트 기반의 확률적 자동화로 선회해서 성공적으로 세팅했다.

이제 이 에이전트가 우리 서비스를 드라이브 걸어주고 있다.

 

제발 잘 부탁해 Gemini야!