
글을 많이 찍어내다 보면 가장 먼저 막히는 지점은 “이 글이 예전에 쓴 글과 얼마나 겹치나?”입니다. 결론부터 말하면, 제목·본문을 임베딩으로 바꾼 뒤 코사인 유사도 기준값을 두면 워드프레스 발행 전 중복 가능성이 높은 초안을 꽤 빠르게 걸러낼 수 있습니다.
이 글에는 제휴(어필리에이트) 링크가 포함될 수 있으며, 링크를 통해 가입·구매 시 소정의 수수료를 받을 수 있습니다. 추천은 실제 사용 경험에 기반합니다.
기존 글 30개를 먼저 벡터화해 새 초안과 유사도 상위 5개를 확인해보세요.
제가 monstereae 글 관리용으로 잡은 기본 흐름은 간단합니다. WordPress REST API로 기존 글을 가져오고, OpenAI Embeddings 또는 로컬 임베딩 모델로 벡터를 만들고, SQLite나 Supabase pgvector에 저장한 뒤 새 초안과의 유사도를 계산합니다. 완전 자동 삭제가 아니라 “검토 큐로 보내기”가 핵심입니다.
기존 글 30개만 먼저 벡터화하고, 새 초안 1개를 넣어 유사도 상위 5개를 확인해보세요.
왜 단순 키워드 매칭보다 임베딩이 낫나
중복 글은 같은 문장을 복사한 경우만 문제가 아닙니다. “Claude Code 설치 방법”과 “클로드 코드 세팅 가이드”처럼 표현은 달라도 의도와 구조가 거의 같은 글이 더 자주 생깁니다.
임베딩은 문장을 숫자 벡터로 바꾸기 때문에 단어가 달라도 의미가 비슷하면 가까운 값이 나옵니다. 여기에 코사인 유사도를 붙이면 두 글이 같은 방향을 보고 있는지 0~1에 가까운 점수로 볼 수 있습니다.
제가 쓴 최소 셋업
처음부터 큰 검색 인프라를 붙일 필요는 없었습니다. 100~1,000개 글 규모라면 Python 스크립트와 SQLite만으로도 충분히 테스트가 됩니다.
- 수집: WordPress REST API로 제목, 슬러그, 본문 텍스트 추출
- 정리: HTML 태그, 목차, CTA, 면책문구처럼 반복되는 영역 제거
- 임베딩: OpenAI text-embedding-3-small 또는 SentenceTransformers 계열 모델 사용
- 저장: SQLite JSON 컬럼, Supabase pgvector, PostgreSQL 중 선택
- 판정: 새 초안과 기존 글 전체의 코사인 유사도 계산 후 상위 결과 표시
자동화는 n8n으로 붙이기 좋습니다. 새 글 초안이 Airtable이나 Notion에 들어오면 n8n이 웹훅을 받아 임베딩 함수를 호출하고, 유사한 글이 있으면 Slack으로 알림을 보내는 식입니다.
기준값은 0.85부터 시작했다
처음부터 “몇 점 이상이면 중복”이라고 고정하면 실수가 납니다. 제 테스트에서는 0.90 이상은 거의 같은 주제·구성인 경우가 많았고, 0.82~0.88은 겹치는 섹션이 있지만 다른 각도로 살릴 수 있는 글이 섞였습니다.
예를 들어 가상의 초안 “Cursor로 블로그 자동 리팩터링하기”를 넣었을 때 기존 글 “Claude Code로 워드프레스 글 구조 정리하기”가 0.79라면 참고 링크 후보로 남깁니다. 반대로 “Cursor AI 설치와 설정”이 0.91로 나오면 새 글을 합치거나 제목 각도를 바꾸는 편이 낫습니다. 실제 결과는 본문 길이, 전처리 방식, 모델에 따라 달라집니다.
도구 조합 비교: 작게 시작할지, 운영형으로 갈지
| 구성 | 추천 상황 | 장점 | 주의할 점 |
|---|---|---|---|
| Python + SQLite | 개인 블로그, 초기 검증 | 설치가 가볍고 비용 관리가 쉽다 | 글 수가 많아지면 검색 속도 튜닝 필요 |
| Supabase pgvector | SaaS형 워크플로, 팀 운영 | DB에서 벡터 검색과 메타데이터 관리를 함께 처리 | 요금제와 인덱스 설정을 확인해야 한다 |
| n8n + OpenAI API | 노코드에 가까운 자동화 | Notion, Slack, WordPress 연결이 편하다 | 긴 본문 처리 시 토큰 비용과 실패 재시도 설계 필요 |
| Cursor 또는 Claude Code | 직접 스크립트를 빠르게 만들 때 | 전처리·배치 작업 코드를 빨리 수정 가능 | 생성 코드 검증과 로그 처리는 사람이 봐야 한다 |
실전에서 가장 많이 틀리는 부분
본문 전체를 그대로 넣으면 반복 요소가 점수를 흐린다
워드프레스 글에는 공통 CTA, 면책문구, 목차, 관련 글 박스가 들어갑니다. 이것까지 임베딩하면 서로 다른 글도 비슷하게 보일 수 있습니다. 그래서 저는 본문에서 반복 블록을 먼저 제거하고, 제목·도입·H2·핵심 문단 중심으로 벡터를 만들었습니다.
또 하나는 카테고리별 기준값을 다르게 보는 것입니다. 설치 가이드는 구조가 비슷해서 유사도가 높게 나오기 쉽고, 리뷰 글은 제품명만 달라도 문장 패턴이 겹칩니다. AI 코딩 에이전트 글은 “설치, 설정, 예제, 장단점” 구조가 반복되므로 0.88 이상만 경고로 두는 식의 조정이 필요했습니다.
추천 대상: 이런 운영자에게 특히 맞다
이 방식은 하루에 여러 개의 초안을 다루는 블로그, AI 에이전트로 글 초안을 생성하는 팀, SaaS 비교 글처럼 비슷한 형식의 콘텐츠가 많은 사이트에 잘 맞습니다. 반대로 글이 20개 미만이면 먼저 스프레드시트로 주제 맵을 만드는 편이 더 빠를 수 있습니다.
개발자라면 Python 스크립트로 시작하고, 운영자가 함께 보는 환경이면 Airtable이나 Notion에 “중복 후보 URL, 유사도, 처리 상태” 컬럼을 두면 관리가 쉽습니다. 자동 발행 전에 검토 단계 하나만 넣어도 같은 검색 의도를 반복해서 잡아먹는 일을 줄일 수 있습니다.
바로 해볼 수 있는 구현 순서
- 최근 발행 글 30~50개의 제목, URL, 본문 첫 1,500~3,000자를 추출합니다.
- 공통 문구와 HTML 태그를 제거합니다.
- OpenAI Embeddings나 로컬 모델로 벡터를 생성합니다.
- 새 초안 벡터와 기존 벡터의 코사인 유사도를 계산합니다.
- 상위 5개 결과를 보고 0.85 이상이면 병합·각도 변경·내부링크 전환 중 하나를 선택합니다.
처음 목표는 완벽한 판정기가 아닙니다. “발행 버튼 누르기 전 30초 안에 중복 후보를 보는 도구”를 만드는 것이 현실적인 출발점입니다.
FAQ
코사인 유사도 0.8이면 중복인가요?
바로 중복이라고 보기는 어렵습니다. 같은 제품군이나 같은 튜토리얼 구조라면 0.8대가 자연스럽게 나올 수 있습니다. 0.85 이상은 검토, 0.90 이상은 병합 후보처럼 단계로 나누는 편이 안전합니다.
ChatGPT로도 중복 검사를 할 수 있나요?
짧은 글 몇 개를 비교하는 용도라면 가능합니다. 다만 글이 많아지면 매번 전체 본문을 넣기 어렵기 때문에 임베딩 DB를 만들어두는 방식이 더 안정적입니다.
SEO에서 중복 글을 모두 없애야 하나요?
같은 검색 의도를 겨냥한 글이 여러 개 있으면 내부 경쟁이 생길 수 있습니다. 다만 관점, 대상, 사용 단계가 다르면 별도 글로 살릴 수 있으므로 유사도 점수와 검색 의도를 같이 봐야 합니다.
마무리 액션: 오늘은 전체 자동화까지 가지 말고, 기존 글 30개와 새 초안 1개만 비교해보세요. 그 결과에서 “합칠 글”, “내부링크로 돌릴 글”, “새 각도로 살릴 글”이 보이면 이 시스템은 이미 제 역할을 시작한 것입니다.
관련 링크
- claude code artifacts, 웹 미리보기 대신 파일로 남기는 실전 작업법
- Claude Code 서브에이전트 만들기: 실전 셋업과 바로 쓸 수 있는 워크플로
- codex skills, 코딩 에이전트에 ‘반복 작업 기억’을 붙이는 실전 방식
- 관련 태그 더 보기
- 카테고리 더 보기
- 검색 결과 더 보기
- 참고 링크
