본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 27. 23:49

나의 자율 에이전트가 프랑스 임차인들의 실제 질문 35개를 스크래핑하여 우리 홈페이지를 다시 작성했다

요약

자율 에이전트가 Reddit 데이터를 스크래핑하여 프랑스 주거 권리 SaaS의 홈페이지 카피를 실제 사용자 질문 기반으로 자동 교체한 사례를 소개합니다. Anthropic Claude API와 Critic/Executor 패턴을 활용하여 인간의 개입 없이 데이터 수집부터 웹사이트 업데이트까지 완료했습니다.

핵심 포인트

  • Anthropic Claude API 기반의 Critic/Executor 패턴 활용
  • Reddit 스크래핑을 통한 가설 기반 카피를 실제 데이터로 대체
  • 데이터 품질을 위한 엄격한 필터링 및 노이즈 제거 프로세스
  • 인간의 개입 없는 자율적 제품 결정 및 실행 파이프라인 구축

내가 본 모든 제품 랜딩 페이지(Landing page) — 내 페이지를 포함하여 — 는 "임대차 계약, 보증금, DPE 등급에 대해 걱정하실 수도 있습니다"와 같은 섹션을 가지고 있었습니다. 이는 순전히 카피라이터의 가설이었습니다. 이번 주, 나의 자율 에이전트(Autonomous agent)는 Reddit에서 스크래핑한 데이터로 그 모든 문구를 대체했습니다. 정확한 파이프라인(Pipeline)은 다음과 같습니다.

배경: 370회의 자율 사이클, 하나의 프랑스 주거 권리 도구

BailleurVérif는 내가 혼자 운영하는 프랑스 주거 권리 SaaS입니다. 에이전트는 cron을 통해 2시간마다 깨어나고, 12시간마다 전략적 비평 감사(Strategic critic audit)를 읽으며, 자율적으로 처방(Prescriptions)을 실행합니다 — 각 깨어남 사이클(Wake cycle)마다 인간의 개입(Human in the loop)은 없습니다. 현재 기준으로: 370회의 깨어남, 27/27개의 전략적 처방 준수, 0회의 ScheduleWakeup 호출(외부 cron이 속도 조절을 담당함).

스택(Stack): Python + 비평가/실행가(Critic/executor) 패턴을 위한 Anthropic Claude API + SQLite 퍼널 트래커(Funnel tracker) + 정적 HTML 서버. 에이전트는 GitHub에 커밋하고, Indexing API에 핑을 보내며, data.gouv.fr에 데이터셋을 게시합니다. 이번 주에 에이전트는 내가 몇 주 동안 미뤄왔던 제품 결정을 내렸습니다.

문제: 우리 홈페이지 카피는 전적으로 가설에 기반했다

전략적 비평 감사-26(2026-05-26T21:55Z)에서 이를 직접 지적했습니다:

"홈페이지 카피가 100% 가설적입니다 — '임대료가 합법적인지 궁금하실 수도 있습니다...' — 반면 Reddit에는 공개적으로 접근 가능한 수천 개의 실제 임차인 질문이 있습니다."

처방: 프랑스 서브레딧(Subreddits)에서 30개 이상의 질문을 스크래핑하고, 데이터 기반 페이지를 구축하며, JSON 데이터셋을 CC-BY 4.0으로 게시한 다음, 해당 코퍼스(Corpus)를 사용하여 홈페이지 히어로(Hero) 섹션을 교체하십시오. 빌더(Builder) 전용. 나로부터의 인간적 행동은 전혀 필요하지 않습니다.

스크래핑 파이프라인

에이전트는 scrape_reddit_locataires_run367.py를 작성했습니다. 요청당 2초의 속도 제한(Rate-limited)이 적용된 두 차례의 라운드를 거쳤으며, 식별된 봇 UA(User Agent)를 사용했습니다:

import urllib.request, urllib.parse, json, time

SUBREDDITS = "france+paris+immobilier+vosfinances+AskFrance"
...

1라운드에서 50개의 원시 결과(Raw results)가 생성되었습니다. 2라운드에서는 r/Locataires를 추가하고 쿼리(Queries)를 강화했습니다. 최종 데이터셋: 35개의 질문.

품질 필터: 50개에서 35개로 줄이는 것이 중요한 이유

스크래핑(Scrape) 양보다 필터링 단계가 더 중요했습니다:

  • 제목 앵커(Title-anchor) 필수: 특정 태그 단어(loyer, DPE, caution, garantie, encadrement)가 반드시 포함되어야 함
  • 임차인 범위 한정: 자신의 부동산에 대해 묻는 임대인(Landlord)의 질문은 제외
  • 노이즈 방지 블랙리스트: "copropriété", "syndic", "locaux commerciaux" — 인접한 주제이므로 범위(Scope)에서 제외

제외된 항목: 임대인 질문 8개, 상업용 임대차 질문 4개, 주택 소유자 리노베이션 질문 3개.

최종 분포: loyer-abusif(부당 임대료): 26 / dpe-invalide(무효한 DPE): 6 / depot-garantie(보증금): 3.

점수 범위: 추천(Upvotes) 8개에서 347개. 에이전트(Agent)는 각 태그 내에서 점수순으로 정렬한 뒤, 홈페이지 히어로(Hero) 섹션에 사용할 상위 3개를 선정했습니다.

결과물: 776줄의 HTML + CC-BY 4.0 JSON 데이터셋

build_questions_reelles_page_run367.py는 다음과 같은 내용을 포함한 /questions-reelles-locataires-fr.html을 생성했습니다:

  • JSON-LD: WebPage + BreadcrumbList + FAQPage (법률 질문 3개) + Dataset + Organization
  • 카테고리별 35개 질문, 익명화 처리됨 (id_hash만 사용, subreddit + 점수 표시)
  • 각 질문 태그와 일치하는 법률 템플릿(Legal templates)으로의 직접 링크
  • CC-BY 4.0 다운로드 가능한 JSON 데이터셋 (27 KB)

데이터셋 스키마(Dataset schema):

{
  "metadata": {
    "title": "Questions réelles de locataires FR — Reddit 2026-05",
...

홈페이지 히어로 교체 — 12시간 후

다음 날 오전 10:00Z에 Strategic audit-27이 단 하나의 처방을 가지고 도착했습니다: 가상의 홈페이지 인트로(Intro)를 이 코퍼스(Corpus)로 교체할 것. 에이전트는 3개의 질문(태그당 하나씩, 가장 높은 점수)을 선정하고, 인용 배지(Citation badges)를 추가했으며, index.html의 22줄을 수정했습니다.

변경 전:

<p>Vous vous demandez peut-être si votre loyer respecte l'encadrement légal,
si votre DPE est valide, si votre propriétaire peut garder votre caution...</p>

변경 후: r/paris · 93 votes 배지가 달린 3개의 실제 질문. 35개 질문 전체로 연결되는 CTA(Call to Action). 커밋(Commit) 47404ed, curl -s https://bailleurverif.fr/ | grep "loyer abusif"를 통해 스모크 테스트(Smoke-tested) 완료 ✅.

전체 사이클 — audit-26 지시, 에이전트 구축 및 배포, audit-27 홈페이지 교체 지시, 에이전트 배포 — 이 모든 과정이 제가 보낸 메시지 하나 없이 16시간 이내에 완료되었습니다.

부수적인 발견: "직접(direct)" 방문의 60%는 봇이었다

이번 주에 퍼널 (Funnel)을 감사(Auditing)하는 동안, 에이전트는 visits.jsonl에 있는 원시 UA (User Agent) 문자열과 세션 ID (Session ID)를 교차 참조했습니다. 결과는 다음과 같습니다: 159개의 원시 "직접(direct)" 세션 → UA 필터링 후 실제 인간일 가능성이 높은 세션은 63개.

필터:

import re

BOT_UA_PATTERNS = [
...

에이전트가 이전 실행에서 "인간일 가능성이 높음"으로 분류했던 두 건의 방문은 Googlebot Nexus 5X와 YandexRenderResourcesBot으로 밝혀졌습니다. 이제 에이전트는 원시 방문 횟수와 별개의 지표로 direct_humans_after_ua_filter_lifetime = 63을 추적합니다.

40%의 노이즈 추정치는 아마도 보수적인 수치일 것입니다. sessionId=null 방문(JS가 실행되지 않음)은 에이전트가 현재 확인 중인 또 다른 봇 신호 계층을 추가합니다.

이번 사이클의 교훈

  • Reddit의 공개 JSON은 사용자 조사에 충분히 활용되지 않고 있습니다. 인증이 필요 없고, 요청당 2초의 속도 제한 (Rate limit)은 수용 가능한 수준이며, 참여도의 대리 지표(Proxy)로서 점수와 댓글 수를 무료로 얻을 수 있습니다. 랜딩 페이지 카피를 작성하기 전에 이를 쿼리(Query)하세요.

  • 스크래핑(Scraping)하는 것보다 더 강력하게 필터링하세요. 엄격한 제목-앵커(Title-anchor) 및 범위(Scope) 기준을 적용하여 50개에서 35개로 줄였습니다. 제거된 15개는 페이지 신호를 희석시키고 홈페이지 교체 효과를 약화시켰을 것입니다. 양보다 질입니다.

  • 실제 사용자의 질문은 카피라이터의 가설을 매번 이깁니다. 우리는 설문조사도, 사용자 인터뷰도 진행하지 않았습니다. 하지만 점수가 8에서 347 사이인 loyer-abusif 태그가 달린 26개의 질문은 "혹시 ~가 궁금하실 수도 있습니다..."와 같은 문구보다 훨씬 더 실행 가능한(Actionable) 정보를 제공합니다.

  • 첫날부터 humans_after_ua_filter를 추적하세요. 원시 방문 횟수는 노이즈가 많습니다. UA 문자열을 교차 참조하세요. 파생된 카운터(Derived counter)를 조기에 배포하세요.

🔗 Code source MIT github.com/Creariax5/bailleurverif · Site bailleurverif.fr · Wikidata Q139857638

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0