📝 한줄 요약
LLM Wiki에 논문 29편을 넣은 뒤, 검색과 OpenViking 연결을 준비하려고 먼저 chunking trial을 했다. 처음엔 “마크다운 섹션 제목 기준으로 자르면 되겠지”에 가까웠지만, 리뷰 논문·일반 원저·H2 중제목만 줄줄이 나열된 구조·OCR 논문을 거치며 규칙이 바뀌었다. 최종적으로는 출판사별 전용 파서를 만들지 않고, strict anchor(엄격한 기준 중제목 판정) + methods/results 같은 단계 제목 흡수(sibling absorb) + H3 soft split 조합을 채택했다.
🎯 이런 분들이 참고하실 수 있어요
논문 PDF나 마크다운 원문을 LLM Wiki, RAG, 검색 시스템에 넣고 싶은 분
문서를 “어디서 잘라야 검색이 잘 되는지” 고민하는 분
😫 문제 상황: 논문을 통째로 넣으면 검색이 뭉개진다
LLM Wiki의 정본 원문 레이어에는 시험용 논문 29편이 들어가 있었다. 다음 단계는 이 원문 위에 검색 가능한 retrieval layer를 얹는 것이었다. 여기서 retrieval layer란, 사용자가 질문했을 때 관련 논문 조각을 다시 찾아오는 검색·회수 계층을 말한다.
그런데 논문을 통째로 검색 대상으로 넣으면 결과가 너무 크고 흐릿해진다. 반대로 너무 잘게 자르면 문맥이 사라진다. 그래서 먼저 해야 할 일은 논문을 적당한 의미 단위로 나누는 것이었다.
이 작업에서 그 의미 단위를 chunk라고 불렀다. chunk는 검색이나 임베딩에 넣기 위해 문서를 나눈 조각이다. 예를 들어 논문 전체가 아니라 “Methods 중 MRI scanning 부분”만 하나의 chunk가 될 수 있다.
🔎 먼저 용어부터 짚기
이번 실험을 이해하려면 네 가지 용어만 알면 된다.
H2, H3
H2와 H3는 마크다운 문서의 섹션 제목 단계다. 이 글에서는 H2를 중제목, H3를 소제목처럼 설명한다.
## Materials and Methods ← H2 중제목
### Patient cohort ← H3 소제목
### MRI scanning ← H3 소제목H2는 큰 장 제목이고, H3는 그 아래 소제목이다. 논문을 마크다운으로 바꾸면 이런 제목 계층을 기준으로 본문을 나눌 수 있다.
다만 실제 추출 결과에서는 이 계층이 항상 예쁘게 유지되지 않았다. 출판사마다 HTML 구조가 다르고, PDF를 OCR로 뽑는 방식도 달라서, 소제목이어야 할 항목까지 전부 H2 중제목으로 나오는 경우가 있었다. 이 글에서는 그런 상태를 H2 중제목만 줄줄이 나열된 구조라고 부른다.
IMRaD
IMRaD는 많은 학술 논문에서 쓰는 기본 구조다.
Introduction
Methods
Results
Discussion
원저 논문은 대체로 이 구조를 따르지만, 리뷰 논문이나 가이드라인 논문은 꼭 그렇지 않다.
휴리스 틱
휴리스틱은 완벽한 정답 규칙이 아니라, 여러 케이스에서 대체로 잘 작동하는 실용적 판단 규칙이다. 이번 작업에서는 “출판사별 전용 파서를 만들지 않고도, 대부분의 논문 구조를 버티는 규칙”을 찾는 것이 목표였다.
기준 중제목(anchor), regex, 흡수(absorb)
이번 chunker에서는 Methods, Results처럼 뒤따르는 소제목들을 묶어줄 수 있는 제목을 기준 중제목(anchor)이라고 봤다. 예를 들어 Methods가 기준 중제목이면, 그 뒤에 나오는 Patient cohort, MRI scanning 같은 항목은 Methods 아래 내용으로 묶일 수 있다.
이 기준 중제목을 찾을 때는 regex(정규표현식)를 썼다. regex는 글자 패턴을 찾는 규칙이다. 여기서는 “이 제목이 정확히 Methods나 Materials and Methods 같은 기준 중제목인가?”를 판정하는 데 썼다.
예를 들어 이런 식이다.
제목이 "Materials and Methods"이면 → 기준 중제목으로 인정
제목이 "MRI scanning"이면 → methods 관련 제목으로 분류할 수는 있지만, 기준 중제목으로는 인정하지 않음그리고 어떤 논문은 소제목이 H3가 아니라 같은 단계의 H2 중제목으로 펼쳐져 있었다. 이때 Patient cohort, MRI scanning 같은 다음 H2들을 앞의 Methods 아래로 묶어주는 과정을 흡수(absorb)라고 불렀다.
🛠️ 사용한 도구와 역할
LLM Wiki 정본 원문 레이어: 논문 원문이 들어 있는 기준 자료 저장소
Python chunker script: 논문 마크다운을 chunk로 나누는 스크립트
🔧 작업 과정
1. 기본 방침: H2는 hard split, H3는 soft split
처음 채택한 기본 규칙은 단순했다.
H1/H2는 무조건 큰 분리점으로 본다.
H3는 부모 H2의 크기에 따라 나눌 수도 있고 합칠 수도 있다.
목표 chunk 크기는 500–800 words.
1200 words는 넘기지 않는 hard max로 본다.
section_type은
intro,methods,results,discussion,conclusion,meta,figure_caption,other로 분류한다.단, 모든 섹션을 억지로 IMRaD에 끼워 넣지 않는다.
마지막 규칙이 중요했다. 리뷰 논문이나 가이드라인 논문은 애초에 Methods/Results 구조가 아닐 수 있다. 이런 논문을 억지로 methods나 results로 분류하면 검색 결과가 오히려 거짓으로 정돈된다.
그래서 other가 많이 나오는 것을 실패로만 보지 않았다. 문서 구조가 실제로 그렇다면 other로 남기는 쪽이 더 안전했다.
2. 첫 trial: 리뷰 논문은 IMRaD에 억지로 맞추면 안 된다
첫 trial은 리뷰/가이드라인 성격의 논문이었다. 이 논문은 일반 원저처럼 Introduction, Methods, Results, Discussion이 깔끔하게 나뉘지 않았다.
처 음 결과에서는 other가 많이 나왔다. 숫자만 보면 분류가 덜 된 것처럼 보일 수 있다. 하지만 이 논문은 애초에 IMRaD 구조가 아니었다. 따라서 “모든 것을 Methods/Results로 강제 매핑하지 않는다”는 기존 결정과 잘 맞았다.
이 trial에서 얻은 결론은 이랬다.
리뷰 논문에서
other는 실패 신호가 아닐 수 있다. 문서가 실제로 IMRaD 구조가 아니라면, 억지 분류보다 보수적 분류가 낫다.
3. 두 번째 trial: 일반 IMRaD 논문에서는 긴 Methods/Results를 잘라야 했다
다음은 H3 계층이 잘 살아 있는 일반 IMRaD 논문이었다. 여기서는 Abstract, Introduction, Methods, Results, Discussion, Conclusion 매핑이 깔끔했다.
하지만 새로운 문제가 나왔다. Methods와 Results가 하나의 chunk로는 너무 컸다.
Methods가 1000 words 이상
Results도 1000 words 이상
Discussion도 목표치보다 큼
검색 결과로 돌아왔을 때 사람이 읽기엔 너무 큰 덩어리였다.
여기서 사용자는 “method 등이 길어지면 적절히 자르고 싶다”고 방향을 줬다. 그래서 H3 soft split을 강화했다.
채택한 규칙은 이렇다.
H2 섹션이 800 words를 넘고 H3 하위 제목이 있으면, H3 단위로 나눈다. 단, section_type은 부모 H2에서 상속한다.
예를 들어 Methods 아래의 Patient cohort, Image acquisition, Statistical analysis 같은 H3는 각각 chunk가 되지만, 모두 methods 성격을 유지한다.
이 규칙 덕분에 큰 Methods/Results를 검색 가능한 크기로 나눌 수 있었다.
4. 세 번째 trial: H2 중제목만 줄줄이 나열된 구조가 나왔다
세 번째 논문에서 더 까다로운 문제가 나왔다. 보통은 Methods라는 H2 중제목 아래에 Patient cohort, MRI scanning 같은 H3 소제목이 들어가길 기대한다. 그런데 어떤 논문은 소제목이어야 할 항목까지 전부 H2 중제목으로 나열돼 있었다.
예를 들면 이런 식이다.