어떤 기능인가요?
rule.Parser 가 미지원 사이트에서 ErrNoRule (host 매칭 활성 규칙 없음) 을 반환할 때, 사용자 개입 없이 LLM (이슈 #140 / pkg/llm) 이 selector 를 자동 생성 하여 parsing_rules 테이블에 INSERT 하고 후속 요청부터 정상 파싱되도록 합니다. 이슈 #100 의 마지막 미구현 후속 작업 (PR #145 본문에 명시) 을 완성합니다.
핵심 효과:
진행 순서
본 이슈는 이슈 #134 (Fetcher/Parser worker 분리 + raw_contents Claim Check) 완료 후 진행 합니다. 이유:
무엇을 하나요?
1. LLM provider 와이어링 (cmd/issuetracker/main.go)
2. LLM rule generator 컴포넌트 (internal/crawler/parser/rule/llmgen/)
3. ErrNoRule fallback 진입점 (internal/crawler/domain/general/chain_handler.go)
4. 안전망
5. 운영 metric / 로깅
6. 테스트
의존 / 연관
영향 / 위험 검토
잠재적 효과
- 새 사이트 추가 cost ~ 0 (코드 변경 0 + 운영자 spot-check 만)
- ErrNoRule 로 인한 fetch 낭비 0
- 사이트 구조 변경 (selector stale) 시 자동 재생성 흐름으로도 확장 가능 (별도 이슈)
잠재적 위험
- LLM 비용 폭주 — 미지원 host 가 카테고리 페이지에서 무한 발견되면 LLM 호출 N배 → in-flight dedup + 일일 cap 으로 흡수
- LLM 환각 (hallucination) — 존재하지 않는 selector 생성 → validation 단계에서 reject
- LLM provider 외부 의존 — 모든 provider 장애 시 새 host 진입 차단 → 기존 host 는 영향 없음 (rule cache hit)
- 자동 생성된 selector 의 quality 가 hand-tuned 보다 낮을 수 있음 —
enabled=false 기본값 + 운영자 승인으로 완화
참고 자료
- 본 이슈 작업의 배경:
- 활용할 기존 모듈:
pkg/llm/chain — fallback chain
pkg/llm/providers — gemini/chatgpt/claude 어댑터
internal/crawler/parser/rule/resolver.go — Invalidate(host, type) 메소드 이미 존재
internal/storage/parsing_rule.go — Insert 인터페이스 이미 존재
- 라이브 검증 (2026-04-29) 시 발견된 selector stale 케이스 (naver mnews
#dic_area p) — 본 기능이 있었다면 자동 재생성 가능했을 시나리오
어떤 기능인가요?
핵심 효과:
진행 순서
본 이슈는 이슈 #134 (Fetcher/Parser worker 분리 + raw_contents Claim Check) 완료 후 진행 합니다. 이유:
무엇을 하나요?
1. LLM provider 와이어링 (
cmd/issuetracker/main.go)pkg/llm/providers로 gemini/chatgpt/claude API key 로드 (config/env)pkg/llm/chain으로 fallback chain 조립 (이슈 [FEATURE] LLM ChainProvider — Chain-of-Responsibility 기반 fallback 합성 #142 의 chain-of-responsibility)2. LLM rule generator 컴포넌트 (
internal/crawler/parser/rule/llmgen/)host+target_type(page/list) + 샘플 RawContent.HTMLstorage.SelectorMap으로 변환ParsingRuleRepository.Insert호출 +Resolver.Invalidate(host, type)로 cache flush3. ErrNoRule fallback 진입점 (
internal/crawler/domain/general/chain_handler.go)errors.Is(err, &rule.Error{Code: rule.ErrNoRule})분기4. 안전망
enabled=false로 INSERT (운영자 review 후 enabled=true flip)5. 운영 metric / 로깅
parsing_rules의 LLM 자동 생성 row 카운트 (description 또는 source_name 으로 구분)6. 테스트
의존 / 연관
영향 / 위험 검토
잠재적 효과
잠재적 위험
enabled=false기본값 + 운영자 승인으로 완화참고 자료
pkg/llm/chain— fallback chainpkg/llm/providers— gemini/chatgpt/claude 어댑터internal/crawler/parser/rule/resolver.go—Invalidate(host, type)메소드 이미 존재internal/storage/parsing_rule.go— Insert 인터페이스 이미 존재#dic_area p) — 본 기능이 있었다면 자동 재생성 가능했을 시나리오