본문으로 건너뛰기
r/LangChain조회 2

스마트 파서 실패 후 인도 헌법용 환각 방지 RAG 시스템 구축 사례

정규표현식 기반 청킹·메타데이터 필터링·해시 기반 이던포턴시로 헌법 문서의 RAG 환각을 제거한 실무 사례이다.

이 요약은 AI가 원문을 분석해 생성했습니다. 정확한 내용은 원문 기준으로 확인하세요.

TL;DR

작성자는 LlamaParse가 인도 헌법처럼 각주가 많고 조문 경계가 중요한 문서에서 대규모 청크 병합과 각주 흡수로 인해 환각을 유발했다고 진단했고, PyMuPDF로 원시 텍스트를 추출해 각주 구분선 정규표현식으로 하단을 제거하고 Article 경계 기반으로 청킹해 3,248개의 정밀 청크를 생성했다고 보고했다. 각 청크에 article_number 메타데이터를 주입하고 LangGraph가 질의에서 특정 Article을 감지하면 Pinecone에 정확한 메타데이터 필터({"article_number": {"$eq": "19"}})를 적용해 벡터 검색을 우회하는 방식을 도입해 환각을 근본적으로 차단했다. 운영 안정성을 위해 파일 수준 SHA-256 해시와 결정론적 MD5 청크 ID를 도입해 변경된 파일만 재처리하고 upsert로 덮어쓰게 설계했으며, 이로써 재동기화 시 중복과 불일치 없이 안전하게 운영할 수 있다고 보고되었다.

실용적 조언

  • 법률·헌법처럼 조문 경계와 각주가 중요한 문서는 범용 LLM 기반 파서를 신뢰하면 안 된다는 경험이 반복됐다. 원문 텍스트를 PyMuPDF로 직접 추출하고 문서 고유의 표식을 정규표현식으로 분할해 각주를 배제하는 전처리 파이프라인이 실무에서 효과를 냈다. 또한 질의 의도에서 특정 조문을 판별할 수 있다면 메타데이터 필터를 활용해 벡터 검색을 우회하는 것이 환각을 줄이는 실전적 방법이다.

섹션별 상세

01
원문 작성자는 LlamaParse가 인도 헌법처럼 각주가 많고 조문 경계가 중요한 문서에서 전혀 적합하지 않음을 보고했다. LlamaParse는 페이지들을 거대한 청크로 병합해 Article 경계를 무시하고 각주까지 흡수했으며 그 결과 624개의 매우 큰 청크가 생성되었다. 이로 인해 숫자 '19' 같은 토큰이 단순 의미적 유사도로 높은 점수를 받아 페이지 200의 각주가 검색되었고, 그 컨텍스트를 바탕으로 LLM이 환각적인 답변을 생성했다. 이 사례는 문서 구조를 무시한 범용 파서가 법률·헌법 문서처럼 구조적 표식이 중요한 자료에서는 심각한 오탐을 낸다는 실증적 증거로 제시되었다.
02
작성자는 PyMuPDF로 원시 텍스트를 직접 추출한 뒤 정규표현식을 이용해 각주 구분선("______")에서 하단을 잘라내는 방식으로 각주 유입을 원천 차단했다. 이 처리 흐름은 페이지 텍스트 추출 → 각주 구분선 기준 분리 → 하단 폐기라는 입력→처리→출력 단계로 구성되며 이로 인해 각주가 인덱스에 전혀 포함되지 않았다. 적용 결과로 '0 footnotes ingested'라는 정량적 상태가 도출되었고, 각주로 인한 노이즈가 제거되면서 검색 정확도가 크게 개선되었다는 실무적 효과가 보고되었다.
03
문서 분할 시 RecursiveCharacterTextSplitter 대신 문서 내 Article 경계 정규표현식을 통해 부모·자식 청크를 생성하는 전략이 채택되었다. 이 방식은 문장을 기준으로 길이 기반 청킹을 하는 대신 Article 번호(정규표현식 매칭)를 입력으로 받아 3,248개의 정밀한 parent/child 청크를 생성했으며 그 결과 조문 단위의 검색 단위가 보장되었다. 정밀 청킹은 이후 단계에서 메타데이터 기반 필터링과 결합되어 의도한 조문만을 대상으로 하는 정확한 검색을 가능하게 했다.
04
검색 단계에서는 LangGraph 라우터가 질의에서 특정 Article을 감지하면 해당 article_number를 retriever로 전달하고, retriever는 Pinecone에 엄격한 메타데이터 필터({"article_number": {"$eq": "19"}})를 적용해 벡터 검색을 우회했다. 이 처리 흐름은 질의 의도 판별 → 메타데이터 전달 → 메타데이터 필터 적용 → 문서 반환으로 구성되며, 그 결과 수치적으로는 여러 테스트에서 환각이 소거되어 Article 31C·20·34 관련 질의에서 정확한 텍스트만 반환되었다. 작성자는 이 접근이 문서 내 숫자·참조로 인한 오탐을 근본적으로 차단했다고 결론지었다.
05
운영 관점에서는 파일 수준의 SHA-256 해시를 도입해 동일한 파일은 재처리 없이 건너뛰고 변경된 파일만 다시 처리하도록 설계했다. 파일 변경 시에는 기존 Pinecone 벡터를 삭제하고 파일을 재처리하며 청크 ID는 MD5(filename + page + parent_idx + child_idx)로 결정론적으로 생성되어 upsert 시 중복 삽입 대신 덮어쓰기가 발생하도록 유도되었다. 이 이던포턴시 계층으로 인해 25개 이상의 파일을 재동기화할 때도 불필요한 API 호출과 중복 데이터가 발생하지 않아 운영 비용과 데이터 정합성 문제가 해결되었다.

용어 해설

검색 증강 생성(RAG)
RAG는 외부 문서에서 관련 컨텍스트를 검색해 LLM의 입력으로 주입한 뒤 답변을 생성하는 파이프라인이다. 이 방식은 검색 단계에서 불필요한 노이즈가 줄어들면 정확도가 크게 개선되지만, 검색 결과가 부정확하거나 메타데이터 필터링이 없으면 LLM이 잘못된 문맥을 근거로 환각을 생성한다. 본문에서는 RAG에서 정확한 청킹과 메타데이터 기반 필터링이 환각 방지에 핵심임을 전제로 삼는다.
PyMuPDF
PyMuPDF는 PDF에서 텍스트와 페이지 구조를 직접 추출하는 경량 파서 라이브러리이다. 본문에서는 LLM 기반 파서 대신 PyMuPDF로 원문 텍스트를 얻어 정규표현식으로 페이지 내 구획(예: 각주 구분선)을 자르고 불필요 구간을 제거하는 데 사용되었다. 직접 텍스트를 제어하면 청킹 기준을 더 엄격하고 결정론적으로 만들 수 있다.
메타데이터 필터링(Metadata Filtering)
메타데이터 필터링은 벡터 검색 이전에 메타데이터 조건(예: article_number)을 적용해 후보 문서를 선별하는 기법이다. 본문에서는 질의 의도에서 특정 조문을 감지하면 Pinecone 쿼리에 엄격한 article_number 일치 필터를 적용해 벡터 검색을 우회하고 정확한 문서만 반환하도록 설계했다. 이 방식은 숫자·표식 기반의 오탐지를 효과적으로 차단한다.
결정론적 청킹(Deterministic Chunking)
결정론적 청킹은 같은 입력에서 항상 동일한 청크 ID와 분할 결과가 나오도록 해 재처리·동기화 시 중복을 방지하는 전략이다. 본문에서는 chunk ID를 MD5(filename + page + parent_idx + child_idx)로 생성하고 파일 해시(SHA-256)를 기록해 변경이 없으면 전처리를 건너뛰는 방식으로 구현되었다. 이 방식은 Pinecone upsert가 덮어쓰기 동작을 하도록 유도해 데이터 중복과 불일치를 제거한다.

언급된 도구

LlamaParse비추천

범용 LLM 기반 문서 파싱 도구로 사용되었으나 각주·조문 분할에서 실패했다.

PyMuPDF추천

PDF에서 원시 텍스트와 페이지 구조를 직접 추출하는 라이브러리로 각주 제거와 정규표현식 기반 분할에 사용되었다.

Pinecone추천

벡터 인덱스에 청크를 저장하고 메타데이터 필터를 적용해 조문 단위 검색을 수행하는 벡터 데이터베이스로 사용되었다.

LangGraph중립

질의의 의도를 판별해 retriever로 메타데이터를 전달하는 라우터 역할을 수행했다.

Supabase추천

파일의 SHA-256 해시를 저장해 변경 검사를 수행하고 이던포턴시를 관리하는 저장소로 사용되었다.

AI 분석 전체 내용 보기

AI 요약 · 북마크 · 개인 피드 설정 — 무료

출처 · 인용 안내

원문 발행 2026. 07. 01.수집 2026. 07. 01.출처 타입 REDDIT

인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.