AI 도구
Jev로 블로그 내부 링크 자동화: 비싼 모델은 후보만 읽게 하는 클로드 코드 프롬프트
지금 다 못 읽겠다면 · 이 가이드 링크를 메일로 받기
목차 · 9개 섹션
블로그 글이 수십 개를 넘어가면 내부 링크 작업이 갑자기 무거워집니다. 새 글 하나를 쓸 때마다 옛날 글을 전부 다시 훑어야 하니까요.
이걸 클로드 같은 비싼 모델에 통째로 맡기면 시간도 돈도 많이 듭니다. 영상에서 소개한 방법은 일을 둘로 나누는 겁니다.
- Jev가 “이 글과 저 글, 이어줄 만한가?”를 예·아니오로 빠르게 걸러내고
- 비싼 모델은 걸러진 몇 개만 읽고 실제 링크 문장을 넣습니다
이 글에는 클로드 코드에 그대로 붙여넣을 문장, 직접 돌려본 스크립트, 그리고 내 블로그에서 효과를 재는 방법까지 정리했습니다.
내부 링크가 뭐고, 왜 신경 써야 하나요
내부 링크는 내 사이트 안의 글끼리 서로 이어주는 링크입니다. “Jev 설치는 이 글을 보세요”처럼 같은 블로그의 다른 글로 보내는 링크요.
검색 로봇이 이 링크를 따라 다닙니다. 네이버 서치어드바이저 웹마스터 가이드에는 이렇게 적혀 있습니다.
네이버 검색로봇은
<a>에 href 속성으로 사이트내 다른 페이지 URL을 발견하고 수집하여 확장해 나갑니다.
다른 글에서 링크가 하나도 안 걸린 글은 로봇이 찾아갈 길이 그만큼 좁아집니다. 읽는 사람도 마찬가지예요. 링크를 따라 다음 글로 넘어갑니다.
함정 — 같은 가이드에서 href 에 자바스크립트 호출(<a href="createLink(1, news)">)을 넣으면 정상 링크로 인식되지 않아 수집량이 줄 수 있다고 경고합니다. 링크는 https://... 주소를 그대로 넣으세요.
586개 글로 비교한 결과 (만든 사람이 잰 수치)
borja(@borjafat)가 2026년 9월 18일 X에 올린 비교입니다. 같은 글에서 이 기능을 SEO 도구 Distribb에 곧 붙인다고 밝혔습니다. 같은 586페이지, 같은 시간을 주고 Jev와 클로드 Opus 5에 내부 링크 작업을 시켰습니다.
| Jev | 클로드 Opus 5 | |
|---|---|---|
| 처리한 페이지 | 586개 전부 (45.1초) | 21개 (같은 시간 안) |
| 쓴 돈 | $0.21 (약 3백 원) | $1.43 (약 2천 원) |
- 페이지당 비용으로 보면 약 190배 차이입니다 (원문 “~190x”, 표 숫자로 다시 계산해도 190.0배).
- 링크 584개를 걸었고, 139페이지에는 링크를 걸지 않았습니다. 원문 표현은 “nothing honestly fit”, 이어줄 만한 글이 없다는 판단입니다.
- 원문은 이 작업을 “글쓰기가 아니라 예/아니오 판단 8,790번”이라고 설명합니다. 이 페이지가 저 페이지로 링크할 진짜 이유가 있는지, 본문에 링크 걸 문구가 이미 있는지요.
주의 — 이 수치는 만든 사람이 직접 잰 것이고, 다른 사람이 검증한 결과가 아닙니다. 데모 화면에는 “8790 page pairs · simulated run”이라는 표기도 보입니다. 앞서 말한 대로 자기가 관련된 제품의 홍보이기도 합니다. 원화는 환율 1,400원 안팎으로 어림한 값입니다.
그래서 숫자를 믿기보다, 아래 방법으로 내 블로그에서 직접 재보는 쪽을 권합니다.
왜 이 일이 Jev에 맞나요
Jev는 TypeSafe AI가 만든, 글을 쓰지 않는 AI 모델입니다. 예/아니오, 분류, 점수 세 가지만 답하고, 답마다 확률을 붙입니다.
내부 링크에서 가장 오래 걸리는 부분은 링크 문장을 쓰는 게 아닙니다. “새 글이랑 옛날 글 수백 개 중에 어디랑 이어지나”를 하나하나 따져보는 겁니다. 이게 정확히 예/아니오 판단이에요.
| 단계 | 누가 | 하는 일 |
|---|---|---|
| 1. 거르기 | Jev | 새 글 × 기존 글 전부, “이어줄 만한가?” 확률 |
| 2. 고르기 | 코드 | 확률이 문턱을 넘는 것 중 상위 몇 개만 |
| 3. 넣기 | 클로드 | 고른 글만 읽고, 본문의 자연스러운 자리에 링크 |
비싼 모델이 읽는 양이 “기존 글 전부”에서 “후보 몇 개”로 줄어드는 게 핵심입니다. 후보가 0개면 링크를 안 거는 것도 이 구조의 일부입니다.
준비물
- Jev 스킬 설치와 OpenRouter API 키 — 설치는 젭(Jev) 설치 가이드에 순서대로 있습니다.
jev.py check마지막 줄에READY가 뜨면 됩니다. - 클로드 코드
- 내 블로그 글 목록 — 글마다 주소(또는 slug), 제목, 한두 줄 요약이 있으면 됩니다. 마크다운 폴더, CMS 내보내기, 사이트맵 어느 쪽이든 괜찮습니다.
클로드 코드에 붙여넣을 문장
블로그 원본(마크다운 폴더나 리포)이 있는 곳에서 클로드 코드를 열고 아래를 그대로 붙여넣으세요.
[새 글] 자리만 내 글 제목이나 파일명으로 바꾸면 됩니다.
내 블로그에 내부 링크를 걸어줘. 단, 비싼 판단은 아끼고 Jev 스킬을 먼저 써.
[새 글]: 여기에 새 글 제목이나 파일 경로
1) 글 목록 만들기
- 이 프로젝트의 블로그 글을 전부 찾아서 posts.json 으로 정리해.
항목: slug, title, description(없으면 본문 첫 두 문장), url
- 글이 몇 개인지 먼저 알려줘.
2) Jev 로 거르기 (본문은 읽지 마)
- [새 글]과 나머지 글 하나하나를 짝지어 jev 스킬의 jev.py ask 로 물어봐.
- 넘길 내용은 두 글의 제목과 요약만:
"Post A: {새 글 제목}\n{요약}\n\nPost B: {기존 글 제목}\n{요약}"
- 질문은 이걸 그대로 써:
--noul 'link=Post A and Post B cover the same tool or topic, so a reader of A would benefit from a link to B'
- 동시에 8개씩 병렬로 돌리고, 전체 판단 수·걸린 시간·실패 수를 기록해.
- 확률 0.6 이상인 것 중 상위 3개만 후보로 남겨. 0.6을 넘는 게 없으면 링크를 걸지 마.
3) 후보만 읽고 링크 넣기
- [새 글] 본문과 후보 글 본문만 읽어.
- 새 글 본문에 이미 있는 문구 중 후보 글을 가리킬 만한 곳에 링크를 걸어.
문장을 새로 지어내거나 내용을 바꾸지 마. 자연스러운 자리가 없으면 그 후보는 건너뛰어.
- 링크는 https:// 로 시작하는 실제 주소나 사이트 상대경로로. 자바스크립트 링크 금지.
4) 보고하고 멈추기
- Jev 판단 수, 걸린 시간, 후보 목록(확률 포함), 건너뛴 후보와 이유,
실제로 넣은 링크를 표로 보여줘.
- 변경은 diff 로만 보여주고, 커밋·배포·발행은 하지 마. 내가 확인할게.
요령 — 새 글 하나가 아니라 블로그 전체를 한 번 정리하고 싶으면 2)번을 “모든 글에 대해 반복해”로 바꾸면 됩니다. 비싼 모델은 여전히 후보만 읽습니다.
함정 — 3)번의 “문장을 새로 지어내지 마”를 빼면 클로드가 링크를 넣으려고 문장을 덧붙이는 경우가 있습니다. 억지 링크는 읽는 사람에게도 검색에도 도움이 안 됩니다.
직접 돌려본 스크립트 (2026-10-11)
위 2)번 단계를 클로드 코드 없이 바로 돌려보고 싶다면 이 스크립트를 쓰면 됩니다.
파이썬 표준 라이브러리만 쓰고, 설치해둔 Jev 스킬의 jev.py를 부릅니다.
#!/usr/bin/env python3
"""jev_links.py — 새 글 하나와 기존 글 목록을 Jev 에 넘겨, 링크할 만한 후보만 골라낸다.
python3 jev_links.py posts.json <새 글 slug> [--top 3] [--min 0.6]
posts.json: [{"slug": ..., "title": ..., "description": ...}, ...]
결과: candidates.json (Jev 확률 순) + 화면 요약
"""
import argparse, json, os, subprocess, sys, time
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
JEV = os.path.expanduser(os.environ.get("JEV_PY", "~/.claude/skills/jev/scripts/jev.py"))
def ask(source, target):
# 제목+요약만 넘긴다
state = (f"Post A: {source['title']}\n{source.get('description', '')}\n\n"
f"Post B: {target['title']}\n{target.get('description', '')}")
cmd = ["python3", JEV, "ask", "-", "--compact", "--noul",
"link=Post A and Post B cover the same tool or topic, "
"so a reader of A would benefit from a link to B"]
out = subprocess.run(cmd, input=state, capture_output=True, text=True)
if out.returncode != 0:
return target["slug"], None, out.stderr.strip()[-200:]
return target["slug"], {"link": json.loads(out.stdout)["answers"]["link"]["noul"]}, None
def main():
p = argparse.ArgumentParser()
p.add_argument("posts"); p.add_argument("slug")
p.add_argument("--top", type=int, default=3); p.add_argument("--min", type=float, default=0.6)
p.add_argument("--workers", type=int, default=8)
a = p.parse_args()
posts = json.loads(Path(a.posts).read_text())
src = next(x for x in posts if x["slug"] == a.slug)
others = [x for x in posts if x["slug"] != a.slug]
t0 = time.time()
with ThreadPoolExecutor(a.workers) as ex:
rows = list(ex.map(lambda t: ask(src, t), others))
secs = time.time() - t0
errs = [r for r in rows if r[1] is None]
ok = sorted([(s, sc) for s, sc, _ in rows if sc], key=lambda r: -r[1]["link"])
picked = [(s, sc) for s, sc in ok if sc["link"] >= a.min][: a.top]
Path("candidates.json").write_text(json.dumps(
{"source": a.slug, "picked": [dict(slug=s, **sc) for s, sc in picked],
"all": [dict(slug=s, **sc) for s, sc in ok]}, ensure_ascii=False, indent=2))
print(f"Jev 판단 {len(others)}건 · {secs:.1f}초 · 실패 {len(errs)}건")
print(f"문턱 {a.min} 넘은 후보 {sum(1 for _, sc in ok if sc['link'] >= a.min)}개 → 상위 {len(picked)}개")
for s, sc in picked:
print(f" {sc['link']:.2f} {s}")
if not picked:
print(" 이어줄 글 없음 — 억지로 링크를 걸지 않는다")
for e in errs[:3]:
print(" 실패:", e[0], e[2], file=sys.stderr)
if __name__ == "__main__":
main()
플러그인으로 설치해서 jev.py가 다른 곳에 있다면 경로를 알려주세요.
export JEV_PY=~/내/경로/jev/scripts/jev.py # 기본값과 다를 때만
python3 jev_links.py posts.json jev-decision-model-claude-code-codex-skill
이 사이트(sdk-kim-builds.com)의 공개 가이드 47개로 돌린 실제 출력입니다.
Jev 판단 46건 · 3.6초 · 실패 0건
문턱 0.6 넘은 후보 1개 → 상위 1개
0.78 jev-browser-claude-code-codex-skill
Jev 설치 가이드에 대해 같은 Jev 시리즈인 브라우저 스킬 가이드 하나만 골랐습니다.
블로그 전체로 돌렸을 때
47개 글 전부를 한 번씩 “새 글”로 놓고 돌렸습니다 (글마다 8개 병렬, 글끼리는 차례로).
| 항목 | 결과 |
|---|---|
| Jev 판단 수 | 2,162번 (47 × 46) |
| 걸린 시간 | 159~165초 (두 번 돌림) |
| 고른 링크 후보 | 92~94개 (글당 최대 3개) |
| 후보 0개인 글 | 9개 — 이어줄 글이 없다고 본 글 |
| Jev 비용 | 약 $0.04 |
비용은 OpenRouter 키 사용량을 돌리기 전후로 비교한 값이라, 같은 키로 다른 호출이 섞였다면 조금 다를 수 있습니다. 두 번 돌렸을 때 후보 수가 2개 달랐습니다. 문턱(0.6) 근처의 확률이 실행마다 조금씩 흔들리기 때문입니다.
함정 — 질문 문장이 결과를 크게 바꿉니다. 처음엔 본문 4천 자와 함께 “링크가 실제로 도움이 된다”고 물었더니, 바로 짝이 되는 Jev 가이드 두 개 사이 확률이 0.22로 나왔고, 시험한 글 세 개 모두 후보가 0개였습니다. 제목과 요약만 넘기고 “같은 도구나 주제를 다룬다”고 묻도록 바꾸자 같은 짝이 0.78로 올라갔습니다. 내 블로그에 처음 돌릴 땐 당연히 이어져야 할 짝 몇 개와, 절대 안 이어져야 할 짝 몇 개를 먼저 넣어보고 문장과 문턱을 맞추세요.
내 블로그에서 효과 재는 법
남이 잰 숫자 대신 내 숫자를 남겨두면 다음 판단이 쉬워집니다. 세 가지만 기록하세요.
1. 시간과 판단 수 — 스크립트 첫 줄(Jev 판단 N건 · N초)이 그대로 기록입니다.
2. 비용 — OpenRouter 키의 누적 사용량을 돌리기 전과 후에 한 번씩 봅니다.
curl -s -H "Authorization: Bearer $OPENROUTER_API_KEY" https://openrouter.ai/api/v1/key
응답의 usage 값(달러) 차이가 이번 실행 비용입니다. 정확히 재려면 그 사이 같은 키로 다른 걸 돌리지 마세요.
3. 비싼 모델이 읽은 양 — 클로드 코드 보고서의 후보 목록이 곧 “비싼 모델이 읽은 글 수”입니다. 전체 글 수와 나란히 적어두면 얼마나 줄었는지 바로 보입니다.
링크를 넣은 뒤 검색 쪽 효과는 네이버 서치어드바이저 웹마스터 도구의 수집 현황에서 시간을 두고 지켜보세요. 내부 링크를 걸었다고 바로 순위가 오르는 건 아닙니다.
한계와 주의
- Jev는 판단만 합니다. 링크 문장을 쓰거나 위치를 정하는 건 3단계의 클로드 몫입니다.
- 확률이 문턱 근처인 후보는 실행마다 들어갔다 빠졌다 합니다. 최종 링크는 diff로 사람이 확인하고 넣으세요.
- 제목과 요약이 부실한 글은 Jev도 판단할 근거가 없습니다. 요약이 비어 있으면 본문 첫 두 문장이라도 넣으세요.
- 586개 비교 수치는 만든 사람의 데모 기준입니다. 내 블로그 결과와 다를 수 있습니다.
- Jev와 TypeSafe는 TypeSafe AI의 상표입니다. 위 스킬은 TypeSafe와 관련 없는 개인 프로젝트입니다.
출처
- borja(@borjafat), Jev is WILD for SEO audit — X, 2026-09-18
- 네이버 서치어드바이저, 리소스와 링크 관리
- TypeSafe AI, Introducing System One models and Jev
- OpenRouter, typesafe/jev-1.13
2026년 10월 11일, 이 사이트의 공개 가이드 47개로 직접 돌려 확인한 내용입니다.
FOR TEAMS
이 가이드, 우리 팀에 적용하려면?
회사명과 업무 한 줄만 남겨주시면 널포인터스튜디오가 직접 검토해 회신드립니다.