RAG와 임베딩 · 글 11편
RAG와 임베딩이 글에서 다루는 것HWP, PDF, 엑셀 같은 사무 문서를 검색 가능한 상태로 만드는 준비 작업입니다. 텍스트 추출에서 생기는 문제, 표 처리, 문서 목록과 버전 관리, 폴더 규칙을 정리합니다.
폴더에 넣는 것으로 끝나지 않는다
문서 검색은 PDF나 HWPX 파일을 폴더에 넣는 것만으로 완성되지 않습니다. 검색 프로그램이 읽는 것은 파일이 아니라 파일에서 뽑은 텍스트입니다. 텍스트가 잘못 뽑히면 그 뒤의 청크, 임베딩, 검색이 모두 틀어집니다.
RAG 품질 문제의 상당수는 모델이 아니라 이 준비 단계에서 생깁니다. 순서는 이렇습니다.
- 문서 목록을 만들고 쓸 수 있는 자료인지 확인합니다.
- 텍스트를 추출합니다.
- 추출본을 사람이 열어 봅니다.
- 문서 번호, 제목, 버전, 위치를 붙입니다.
- 조각으로 나눕니다.
1. 문서 목록부터
파일을 모으기 전에 목록을 표로 만듭니다.
| 항목 | 예시 | 이유 |
|---|---|---|
| 문서 번호 | DOC-001 | 조각과 답변에서 문서를 가리킬 이름 |
| 제목 | 복무규정 | 출처 표기 |
| 파일 형식 | HWPX | 추출 방법이 형식마다 다름 |
| 기준일 | 2026-03-01 개정 | 어느 시점의 내용인지 |
| 출처 | 내부 규정집 | 원본을 다시 찾을 곳 |
| 공개 범위 | 내부용 | 색인해도 되는 자료인지 |
문서가 많다고 검색 품질이 좋아지지 않습니다. 같은 내용의 중복본이나 오래된 자료가 섞이면 오히려 답을 확인하기 어려워집니다. 첫 범위는 질문 몇 개를 검증할 수 있을 만큼만 잡습니다. 문서 10~30건으로 시작해도 됩니다.
만들고 싶은 화면이 아니라 답하고 싶은 질문에서 출발합니다. 질문을 먼저 적으면 어떤 문서가 필요한지, 문서 검색이 필요한지 숫자 조회가 필요한지가 정해집니다.
2. 형식별 추출과 문제
| 형식 | 추출 도구 예시 | 자주 생기는 문제 |
|---|---|---|
| PDF(글자가 들어 있는 것) | PyMuPDF | 다단 편집의 읽는 순서가 뒤섞임, 머리글·바닥글이 본문에 끼어듦 |
| PDF(스캔본) | 문자 인식(OCR) 도구 | 글자가 아예 안 뽑힘, 인식 오류 |
| HWP, HWPX | LibreOffice 변환, HWPX의 XML 직접 읽기, 변환 도구 | 표, 글상자, 각주가 빠지거나 순서가 바뀜 |
| DOCX | python-docx | 표와 본문이 따로 뽑혀 순서를 잃음 |
| PPTX | 변환 도구 | 글상자 순서가 뒤섞임, 그림 속 글자는 안 뽑힘 |
| XLSX | 표로 읽기 | 병합 셀, 여러 줄 머리글, 숨은 시트 |
스캔본 PDF
화면에서 글자가 보여도 파일 안에는 그림만 들어 있는 경우가 있습니다. 확인 방법은 간단합니다. PDF를 열어 글자를 마우스로 끌어 선택해 봅니다. 선택되지 않으면 스캔본입니다.
스캔본은 문자 인식을 거쳐야 합니다. 인식 결과에는 오류가 섞이므로 숫자와 날짜, 고유명사를 원본과 대조합니다. 강의 실습에서는 스캔 문서 대신 미리 검수해 둔 추출본을 씁니다.
HWP와 HWPX
한글 문서는 두 형식이 있습니다. HWPX는 압축 파일 안에 XML이 들어 있는 구조여서 프로그램으로 본문을 읽기 쉽습니다. 구형 HWP는 다루기 더 어렵습니다. 가능하면 HWPX나 PDF로 다시 저장한 뒤 추출합니다.
강사의 LLM Wiki 작업 공간은 한글 문서와 구형 오피스 파일을 처리하려고 LibreOffice를 설치해 변환에 씁니다. 한글 문서를 마크다운으로 바꿔 주는 공개 도구도 있습니다. 어느 방법이든 표와 글상자, 각주가 제대로 나왔는지는 결과를 열어 봐야 압니다.
표
표는 일반 본문 추출에서 가장 자주 깨집니다. 행과 열의 관계가 사라지고 숫자만 한 줄로 이어집니다.
- 표 제목과 단위가 표 내용과 함께 남아 있는지 봅니다.
- 병합된 칸은 풀어서 칸마다 값을 채웁니다. “상반기”가 한 번만 적혀 있고 아래 여섯 줄이 비어 있으면, 프로그램은 어느 줄이 상반기인지 모릅니다.
- 머리글이 두 줄 이상이면 한 줄로 합칩니다. “예산 / 집행액”처럼 위아래를 이어 붙입니다.
- 중요한 표는 CSV나 JSON으로 따로 저장합니다. 검색용 텍스트와 구조화 자료를 둘 다 보관합니다.
- 합계나 비교를 묻는 질문은 표를 데이터베이스에 넣고 조회해 풉니다.
3. 추출본을 열어 본다
추출이 끝나면 텍스트 파일을 직접 엽니다. 확인할 항목입니다.
| 확인 | 방법 |
|---|---|
| 값이 맞는가 | 첫 쪽, 중간 쪽, 마지막 쪽의 문장을 원본과 대조 |
| 빠진 것이 없는가 | 원본의 표, 각주, 글상자 위치를 찾아 추출본에 있는지 확인 |
| 순서가 맞는가 | 다단 편집 쪽에서 문장이 이어지는지 확인 |
| 쓸데없는 것이 섞였는가 | 쪽 번호, 머리글, 바닥글이 쪽마다 반복되는지 확인 |
| 글자가 깨졌는가 | 한글이 이상한 기호로 바뀌지 않았는지 확인. UTF-8로 저장 |
쪽마다 반복되는 머리글과 바닥글은 지웁니다. 모든 조각에 같은 문구가 들어가면 검색이 그 문구에 끌려갑니다.
4. 하나의 문서를 여러 형태로
좋은 준비는 문서 하나를 여러 표현으로 보관하는 것입니다.
원본 파일 PDF, HWPX, DOCX (고치지 않음)
전체 텍스트 추출본
구조화 자료 JSON, 표
검색 색인 키워드 색인, 임베딩 벡터
문서를 넣을 때 문서 종류, 기관, 날짜, 주요 항목을 JSON으로 미리 뽑아 두면 조건 검색에 쓸 수 있습니다. “2025년 이후 문서만”처럼 범위를 먼저 좁히고 그 안에서 본문을 검색합니다.
다만 구조화 자료만 남기고 원문을 버리면 안 됩니다. 미리 뽑지 않은 항목은 답할 수 없기 때문입니다. 기관, 일자, 금액만 뽑아 둔 상태에서 “이 교육의 운영상 문제는 무엇이었나”를 물으면 찾을 곳이 없습니다. 원문과 구조화 자료를 함께 보관합니다.
5. 폴더 규칙
강의 실습에서 쓰는 폴더 구성입니다.
| 폴더 | 담는 것 |
|---|---|
input |
원본의 작업용 복사본 |
work |
변환, 정제, 검색 중간 파일 |
output |
완성 파일과 검증표 |
logs |
실행 결과, 오류와 수정 기록 |
규칙은 세 가지입니다.
- 원본을 덮어쓰지 않습니다. 복사본으로 작업합니다.
- 변환한 결과는 다른 파일로 저장합니다.
- 중간 파일을 임의로 지우거나 이름을 바꾸지 않습니다. 앞 단계의 결과가 다음 단계의 입력입니다.
6. 버전과 갱신
문서는 개정됩니다. 준비 단계에서 정해 둘 것입니다.
- 같은 파일의 여러 버전을 덮어쓰지 않고, 버전마다 유효 기간을 기록합니다.
- 새 문서가 들어오면 기존 문서와 같은 버전인지 먼저 확인합니다.
- 내용이 바뀌었으면 그 문서의 조각과 색인을 다시 만듭니다.
- 갱신 기록에 원문의 버전과 색인의 버전을 함께 남깁니다.
문서 파일만 바꾸고 색인을 그대로 두는 실수가 흔합니다. 화면에는 새 버전이 있는데 답변은 예전 내용으로 나옵니다.
문서를 만드는 쪽에서 할 수 있는 일
앞으로 만드는 문서는 검색하기 쉽게 쓸 수 있습니다.
- 제목 스타일을 씁니다. 글자만 크게 키운 제목은 프로그램이 제목으로 알아보지 못합니다.
- 내용을 그림으로 붙이지 않습니다. 표를 캡처해 붙이면 글자가 추출되지 않습니다.
- 표의 칸 병합을 줄입니다.
- 조항 번호와 소제목을 일정한 형식으로 씁니다.
- 파일 이름에 문서 종류와 날짜를 넣습니다.
- 약어는 처음 나올 때 풀어 씁니다.
점검표
- 문서 목록에 번호, 기준일, 출처, 공개 범위가 있다
- 스캔본 PDF를 가려냈다
- 추출본을 열어 원본과 대조했다
- 표가 읽을 수 있는 상태다
- 머리글, 바닥글, 쪽 번호를 지웠다
- 원본을 따로 보관하고 있다
- 중복본과 구버전을 정리했다