피드로 돌아가기
Claude returned ```json blocks 14% of the time. Here is the Rust crate I wish I had earlier.
Dev.toDev.to
AI/ML

LLM JSON 파싱 실패율 14%를 해결한 3단계 로컬 클린업 파이프라인

Claude returned ```json blocks 14% of the time. Here is the Rust crate I wish I had earlier.

Mukunda Rao Katta2026년 5월 21일4intermediate

Context

System Prompt를 통한 JSON 출력 강제에도 불구하고 Claude 모델에서 약 14%의 파싱 실패 발생. Code Fences, 전후방 Prose, Trailing Comma 등 LLM 특유의 비정형 텍스트 삽입으로 인한 serde_json 파싱 에러가 주요 병목 지점임.

Technical Solution

  • 추가 API 호출 없는 로컬 Cleanup 레이어를 통한 비용 최적화 및 지연 시간 최소화 설계
  • Pass 1: 최외곽 수준의 Code Fences를 식별하여 제거함으로써 JSON 본문만 추출하는 Strip Fences 로직 구현
  • Pass 2: 중첩 카운팅 기반의 Balanced Extraction을 통해 Leading/Trailing Prose를 제거하고 최초의 완전한 JSON 객체만 추출하는 O(n) 알고리즘 적용
  • Pass 3: String Literal 외부의 Trailing Comma를 정규식/상태 추적으로 제거하여 JSON 표준 규격 준수 보장
  • Pass 1-3의 순차적 적용을 통해 LLM 재호출 없이 parseability를 복구하는 Pipeline 구조 채택
  • 내부 상태 관리 및 에러 전파를 위해 Result 기반의 try_repair 인터페이스 제공

Impact

  • LLM 응답 중 14%의 파싱 실패 사례(특히 9.3%의 Code Fence 포함 건)를 로컬에서 복구 가능
  • 4KB 응답 기준 Pass 2 처리 속도 약 30 microseconds 달성
  • 불필요한 LLM Retry API 호출 제거를 통한 추론 비용 및 Latency 절감

Key Takeaway

LLM의 확률적 출력 특성으로 인한 비정형성을 모델 튜닝이나 프롬프트 수정으로만 해결하려 하기보다, 결정론적인 로컬 후처리(Post-processing) 레이어를 통해 시스템 안정성을 확보하는 설계 전략이 효율적임.


- LLM 출력 파싱 실패 시 무조건적인 Retry 대신 로컬 정규화 단계 검토 - JSON 파싱 전 Code Fence 제거 -> 중괄호 밸런싱 추출 -> 구문 오류 수정 순의 파이프라인 적용 - 텍스트 내 특수 문자(`) 포함 가능성을 고려한 최외곽 경계 기반의 Strip 로직 설계 - 파싱 실패 지점에 따른 차등 대응(단순 구문 오류는 로컬 수정, 데이터 누락은 모델 Retry)

원문 읽기