Skip to content

[FEATURE] rule.Parser ErrNoRule fallback — LLM 자동 규칙 생성 wiring (이슈 #100 follow-up) #149

Description

@juhy0987

어떤 기능인가요?

rule.Parser 가 미지원 사이트에서 ErrNoRule (host 매칭 활성 규칙 없음) 을 반환할 때, 사용자 개입 없이 LLM (이슈 #140 / pkg/llm) 이 selector 를 자동 생성 하여 parsing_rules 테이블에 INSERT 하고 후속 요청부터 정상 파싱되도록 합니다. 이슈 #100 의 마지막 미구현 후속 작업 (PR #145 본문에 명시) 을 완성합니다.

핵심 효과:


진행 순서

본 이슈는 이슈 #134 (Fetcher/Parser worker 분리 + raw_contents Claim Check) 완료 후 진행 합니다. 이유:

  • LLM 호출은 단일 요청당 수초~수십초 소요 (gemini 빠름, claude 느림)
  • 현재 inline fetch+parse 구조에서 LLM 호출을 끼우면 fetcher worker 슬롯이 그동안 점유됨 → 처리량 급감
  • [REFACTOR] Fetcher / Parser worker 분리 + raw_contents Claim Check 패턴 도입 #134 의 parser worker 분리 + raw_contents 보존 구조에서는 LLM 작업이 별도 worker pool 에서 수행 가능 → 자연스러운 분리

무엇을 하나요?

1. LLM provider 와이어링 (cmd/issuetracker/main.go)

2. LLM rule generator 컴포넌트 (internal/crawler/parser/rule/llmgen/)

  • 입력: host + target_type (page/list) + 샘플 RawContent.HTML
  • 프롬프트: HTML 구조 분석 → CSS selector 추출 → JSON 형식으로 SelectorMap 반환
  • LLM 응답 파싱 + storage.SelectorMap 으로 변환
  • 검증: 생성된 selector 로 실제 HTML 매칭 시도 — 0건이면 재시도 또는 폐기
  • 성공 시 ParsingRuleRepository.Insert 호출 + Resolver.Invalidate(host, type) 로 cache flush

3. ErrNoRule fallback 진입점 (internal/crawler/domain/general/chain_handler.go)

  • ParsePage / ParseLinks 에서 errors.Is(err, &rule.Error{Code: rule.ErrNoRule}) 분기
  • LLM generator 호출은 비동기 — 해당 요청은 skip 처리 (warn + nil), 다음 fetch 에서 정상 동작
  • 동일 host 에 대해 in-flight LLM 요청은 1회만 (Redis lock 또는 in-memory dedup) — 동시에 100개 article URL 이 들어와도 LLM 1회 호출

4. 안전망

  • LLM 결과 validation: selector 가 매칭되는 element 수가 일정 임계값 미만이면 enabled=false 로 INSERT (운영자 review 후 enabled=true flip)
  • LLM 비용 cap: 일일 / 시간당 호출 수 제한 (이슈 [FEATURE] LLM 비용/성능 기반 routing 정책 — provider 선택 동적 결정 #144 비용/성능 정책 의존 — 그 PR 머지 후 본격 적용)
  • 호출 결과 audit log: 어떤 host 에 어떤 selector 가 생성됐는지 + LLM 모델명 + token 비용

5. 운영 metric / 로깅

  • parsing_rules 의 LLM 자동 생성 row 카운트 (description 또는 source_name 으로 구분)
  • LLM rule generator 호출 횟수 / 성공률 / 평균 latency
  • cache miss → LLM 호출 → INSERT 시간 분포

6. 테스트

  • 단위 테스트: mock LLM client 로 generator 동작 검증
  • 통합 테스트: 새 host 의 첫 요청이 ErrNoRule + 비동기 LLM 호출 + 다음 요청이 정상 파싱
  • LLM 응답 stub (offline 환경) 으로 CI 통과

의존 / 연관


영향 / 위험 검토

잠재적 효과

  • 새 사이트 추가 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 기본값 + 운영자 승인으로 완화

참고 자료


Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions