Show HN: Jevcrawl – LLM을 사용하지 않고 크롤링 루프를 갖는 AI 에이전트를 위한 웹 크롤러
요약
Jevcrawl은 LLM을 사용하지 않고도 웹 크롤링 루프를 갖춘 AI 에이전트를 위한 웹 크롤러입니다. 이 도구는 의사 결정 모델을 활용하여 질문에 답하는 데 필요한 특정 내용만 효율적으로 크롤링하며, 기존 방식 대비 비용과 시간을 크게 절감합니다.
핵심 포인트
- LLM 없이도 작동하는 AI 에이전트용 웹 크롤러입니다.
- 질문에 답변할 핵심 정보만 선별적으로 크롤링하여 효율적입니다.
- 기존 방식 대비 비용(예: $0.194 -> $0.025)과 시간을 대폭 절감합니다.
- WebWalkerQA 벤치마크에서 높은 정확도와 발견율을 보여줍니다.
페이지가 아닌 답을 찾는 AI 에이전트를 위한 웹 크롤러.
A 작은 의사 결정 모델(decision model)이 모든 링크와 모든 구절을 선택하여, 여러분의 에이전트 LLM은 질문에 답하는 내용만 몇 센트로 크롤링할 때마다 읽게 합니다.
Quick start · Benchmarks · Tools ·
How it works · Configuration
Why jevcrawl
사이트를 탐색하는 에이전트는 두 가지 좋지 않은 선택지에 직면합니다. 크롤러가 가져온 모든 것을 읽는 방식은 답변을 내비게이션과 형식적인 내용 속에 묻어버리고 토큰을 소모하게 만듭니다. 또는 LLM에게 각 링크를 선택하도록 하는 방식은 느리고 질문당 비용이 많이 듭니다. jevcrawl은 이 두 가지 중 어느 것도 하지 않습니다:
- 🎯 답변 페이지를 더 자주 찾습니다. Claude가 링크를 선택했을 때 대비 작업 성공률이 54% 대 33%이며, Crawl4AI의 목표 지향적 크롤링보다 2배 더 높은 수치입니다.
- 💸 작업당 비용은 약 8배 저렴하고, 정확한 답변 하나당은 10배 저렴합니다. 크롤링 결정에 드는 비용은 약 1센트입니다.
- ⚡ LLM 기반 크롤링보다 2배 빠릅니다. 한 번에 네 페이지를 처리하며, 페이지당 단 하나의 결정 요청만 합니다.
- 📜 출처와 함께 원문 그대로 제공합니다. 모든 구절은 URL, 제목 경로(heading path), 문자 오프셋과 함께 해당 페이지에서 복사됩니다. 따라서 결정 모델은 점수만 매길 수 있어 텍스트를 지어낼 수 없습니다.
- 🛡️ 설계상 프롬프트 주입 공격에 안전합니다. 페이지의 텍스트는 오직 점수를 매기는 데만 사용되며, 절대 따라가지는 않습니다.
- 🔌 MCP가 작동하는 모든 곳에서 작동합니다: Claude Code, Claude Desktop, Cursor 또는 CLI.
빠른 시작
console.typesafe.ai에서 Jev API 키와 uv가 필요합니다.
Claude Code
claude mcp add jevcrawl -e TYPESAFE_API_KEY=<your key> -- uvx jevcrawl
Claude Desktop, Cursor 및 기타 MCP 클라이언트 (mcpServers를 클라이언트 설정 파일에서 사용)
{
claude mcp add jevcrawl -e TYPESAFE_API_KEY=<your key> -- uvx --from "jevcrawl[js]" jevcrawl
uvx --from "jevcrawl[js]" playwright install chromium
(mcpServers에서 "args": ["--from", "jevcrawl[js]", "jevcrawl"]를 사용하십시오.) JavaScript 셸로 감지된 페이지만 브라우저에서 열리며, 호출당 최대 다섯 개까지 가능하고 stats.js_rendered_urls에 나열됩니다. 나머지 모든 내용은 여전히 일반 HTML로 가져옵니다.
벤치마크
모든 시스템은 동일한 30페이지 예산과 동일한 질문을 가지고 웹사이트의 홈 페이지에서 시작합니다. 각 시스템이 수집하는 내용은 동일한 답변 생성 LLM으로 전송되며, 동일한 심사위원이 답변을 평가하므로 크롤러만이 유일하게 변경되는 부분입니다.
<picture> <source media="(prefers-color-scheme: dark)" srcset="assets/cost-dark.svg"> <img alt="하나의 정답을 찾는 비용: jevcrawl $0.06, Claude가 모든 링크를 선택할 경우 $0.65, 너비 우선 탐색(breadth-first crawl) $2.85." src="https://raw.githubusercontent.com/RayenMlayeh/jevcrawl/HEAD/assets/cost-light.svg" width="100%"> </picture>jevcrawl 대 Crawl4AI
Crawl4AI는 LLM을 위한 가장 인기 있는 오픈 소스 크롤러 중 하나입니다. 키워드 스코어러가 결합된 BestFirstCrawlingStrategy를 사용하여 LLM 없이 질문으로 접근하는 방식이므로, 우리는 두 가지 도구가 답변이 포함된 페이지를 가져오는지 여부를 비교했습니다.
수치가 나온 출처
과제 (Tasks)
| WebWalkerQA | WebWalker: Benchmarking LLMs in Web Traversal (Wu 외 et al., Alibaba Tongyi Lab, ACL 2025)에서 가져온 데이터셋: 실제 웹사이트(컨퍼런스, 대학, 기관, 게임) 깊숙한 곳에 답이 있는 질문들로, 영어와 중국어로 제공됩니다. |
| ... |
The 벤치마크 코드 및 모든 숫자를 재현하는 방법: bench/.
도구 (Tools)
| 도구 (Tool) | 용도 (Use it for) |
|---|---|
crawl(goal, start_url, max_pages=30, max_seconds=120, return_tokens=4000, max_decision_usd=0.05) | 답이 여러 페이지 깊이에 있을 수 있습니다. 관련 구절을 반환합니다. |
| ... | <details> |
jevcrawl crawl https://docs.python.org/3/ --goal "What does the walrus operator do?" [--json]
jevcrawl scrape https://example.com/help/returns [--goal "..."] [--json]
jevcrawl map https://example.com --goal "..." [--limit 20]
...
작동 방식 (How it works)
<picture> <source media="(prefers-color-scheme: dark)" srcset="assets/how-dark.svg"> <img alt="사이트맵에서 시드(seed)를 가져오고, 최고의 4개 페이지를 가져와서, 이를 구절로 분할하고, 불필요한 내용을 필터링하며, Jev가 한 요청으로 모든 구절과 링크에 점수를 매기고, Jev가 보존된 구절이 목표에 답하는지 확인합니다. 그렇지 않다면 다음 최고의 링크를 따라갑니다. docs.python.org 예제는 80,034 토큰의 페이지를 1,873 토큰으로 줄였으며 비용은 $0.0069, 시간은 8.3초였습니다." src="https://raw.githubusercontent.com/RayenMlayeh/jevcrawl/HEAD/assets/how-light.svg" width="100%"> </picture>- Jev는 결정할 뿐, 작성하지 않습니다. Jev는 예/아니오 질문당 확률을 반환하므로 텍스트를 생성할 수 없습니다. 사용자가 받는 모든 것은 페이지에서 복사된 것입니다.
- 페이지 텍스트는 데이터이며, 절대 지침이 아닙니다. 이는 오직 질문의 데이터 필드 내에서만 이동하며, 모든 질문 문장은 jevcrawl에 의해 작성된 고정 문자열입니다. 주입된 "이전 지침 무시"는 기껏해야 점수에 편향을 줄 수 있습니다.
- 우선순위 하한(priority floor) 이하의 링크는 버려지지 않고 예비로 보존됩니다. 따라서 크롤링은 페이지 예산이 남아 있어도 일찍 멈추지 않습니다.
- 실패는 숨기지 않고 점진적으로 저하됩니다. Jev 요청 실패가 세 번 발생해도 크롤링은 너비 우선 탐색(breadth-first)으로 계속되며, 모든 블록을 점수 없이
uncertain에 반환하고stats.degraded를 설정합니다. - 반복은 무료입니다. Jev의 답변은 로컬(
~/.jevcrawl/cache)에 캐시되므로, 동일한 페이지에서 같은 목표를 사용하는 것은 비용이 들지 않습니다.
설정 (Configuration)
| 환경 변수 | 의미 | 기본값 |
|---|---|---|
TYPESAFE_API_KEY | Jev API 키 (필수) | none |
| ... | ||
다른 모든 설정(임계값, 페이지당 링크 수, 동시성)은 jevcrawl/config.py에 측정된 기본값이 있으며, Python 호출자는 자체 Config를 전달할 수 있습니다. |
비용 및 개인 정보 보호 (Cost and privacy)
Jev는 입력 토큰에 대해서만 요금을 부과하며, jev-1.13.0의 경우 백만 토큰당 $0.042입니다. 벤치마크에서 크롤링 비용은 평균 $0.011이었습니다. max_decision_usd는 하드 제한값입니다: 이 값을 통과할 수 있는 요청은 절대 전송되지 않으며, 크롤링은 budget으로 중단됩니다. 모든 결과는 jev_cost_usd와 tokens_raw(일반적인 크롤링이 LLM에 제공할 내용)를 tokens_returned와 함께 보고합니다.
페이지 텍스트는 TypeSafe로 전송되어 (블록, 링크 레이블 및 URL) 점수가 매겨집니다. API 키는 환경 변수에서 읽어오며 디스크나 로그에 절대 기록되지 않습니다.
책임 있는 크롤링 (Crawling responsibly)
jevcrawl은 기본적으로 각 사이트의 robots.txt를 따르며(이를 비활성화하려면 JEVCRAWL_RESPECT_ROBOTS=0을 설정) 한 번에 네 페이지를 가져오는 것 이상의 속도 제한을 하지 않습니다. 크롤링하는 사이트, 해당 서비스 약관 및 적용되는 법률은 사용자 책임입니다. 로그인하거나 페이월 또는 CAPTCHA를 우회하려고 시도하지 않습니다. js 추가 기능 없이는 JavaScript를 실행하지 않습니다(필요한 페이지는 stats.needs_js_urls에 나열되어 있습니다). 모든 호출은 max_pages, max_seconds, max_decision_usd, 그리고 return_tokens에 의해 제한됩니다.
기여 (Contributing)
uv sync
uv run ruff check . && uv run ruff format --check . && uv run mypy --strict jevcrawl
uv run pytest # 오프라인: 모든 HTTP는 모의(mocked)됩니다
...```
테스트는 네트워크에 접근하거나 돈을 쓰지 않습니다. 무언가 비용이 발생하는 경우 `live`로 표시됩니다. README 차트는 측정된 수치로부터 [`assets/build.py`](assets/build.py)에 의해 그려집니다. 이슈 및 풀 리퀘스트를 환영하며, 보안 문제는 [SECURITY.md](SECURITY.md)에 설명된 대로 보고해 주십시오.
## 감사의 글 (Acknowledgments)
- Alibaba의 Tongyi Lab에서 개발한, 크롤링이 정말 필요한 질문들을 위한 벤치마크인 [WebWalkerQA](https://github.com/Alibaba-NLP/WebAgent).
- 우리가 측정 기준으로 삼는 베이스라인인 [Crawl4AI](https://github.com/unclecode/crawl4ai).
- [Model Context Protocol](https://modelcontextprotocol.io), [selectolax](https://github.com/rushter/selectolax) 및 [httpx](https://www.python-httpx.org/).
## 라이선스
[Apache-2.0](LICENSE)
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Show HN (AI)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기