사내 문서로 질의응답을 만드는 RAG(검색 증강 생성) 프로젝트를 여러 번 했는데, 답변이 틀릴 때 원인을 추적해 보면 모델 문제인 경우는 생각보다 적었어요. 대부분 검색된 문서 조각이 틀렸거나, 조각이 깨져 있었어요. 오늘은 그 사례들과, 전처리를 어떻게 바꿨는지예요.
RAG는 세 단계고, 앞 단계가 뒤를 제한해요
문서 → [전처리·청크] → [검색] → [생성]
생성 모델은 검색된 조각 안에서만 답해요. 검색은 청크 안에서만 찾아요. 청크는 전처리가 만든 구조 안에서만 나뉘어요. 앞 단계가 못 만든 걸 뒤 단계가 만들어 낼 수는 없어요.
오답 사례 1: 표의 숫자가 다른 행으로
질문: "3년 이상 경과 시 환급률은?" 오답: "70%" (정답은 90%)
원인: 약관 PDF에서 표를 글자 순서대로 뽑으면서 행이 밀렸어요. "3년 이상" 옆에 "70%"가 붙은 조각이 검색됐고, 모델은 그 조각을 충실히 읽었어요. 모델 잘못이 아니에요.
고친 것: 표를 구조 인식으로 뽑고(2월 3일), 표는 통째로 한 청크에 넣고 헤더를 유지했어요(3월 17일). 같은 질문에 정답이 나와요.
오답 사례 2: 조항 번호가 사라져서
질문: "제12조 2항 내용 알려 줘" 오답: 엉뚱한 조항 설명
원인: Markdown으로 바꾸면서 "제12조", "② " 같은 번호가 리스트 기호로 바뀌거나 사라졌어요. 검색에 "제12조"가 걸리는 조각이 없었어요.
고친 것: 번호를 텍스트로 보존하고(1월 27일), 헤딩 경로를 청크 앞에 붙였어요. "제3장 > 제12조 > ②" 가 청크마다 있으니 검색이 바로 걸려요.
오답 사례 3: 개정 전 문서가 섞여서
질문: "현재 수수료율은?" 오답: 2년 전 수수료율
원인: 같은 규정의 여러 버전이 다 색인돼 있었고, 검색은 가장 유사한 조각을 가져왔는데 그게 옛날 버전이었어요.
고친 것: 전처리 단계에서 문서 날짜와 버전을 메타데이터로 뽑아 청크에 붙이고, 검색 시 최신 버전을 우선하거나 "2024년 기준"처럼 질문에 날짜가 있으면 그에 맞춰 필터해요. 이것도 전처리에서 날짜를 못 뽑으면 못 해요.
오답 사례 4: 두 단 레이아웃
질문: 특정 절차 설명 요청 오답: 문장이 섞인 이상한 설명
원인: 두 단으로 된 안내문을 한 줄씩 읽어서 왼쪽 단과 오른쪽 단이 교차로 섞였어요.
고친 것: 레이아웃 검출로 단을 먼저 나누고 단 순서대로 읽어요. 이건 전처리에서 "보는 모델"(6월 16일)이 필요한 이유예요.
오답 사례 5: 각주를 잃어버려서
질문: "이 조건의 예외는?" 오답: "예외 없음"
원인: 예외가 각주에 있었는데, 각주가 문서 끝 청크로 분리돼서 본문 조각과 같이 검색되지 않았어요.
고친 것: 각주를 참조 문단 청크 안에 인라인으로 넣었어요.
공통점
다섯 사례 모두 생성 모델을 바꿔도 해결되지 않아요. 더 좋은 모델은 더 그럴듯하게 틀릴 뿐이에요. 해결은 전부 전처리에 있었어요.
저희가 권하는 RAG 전처리 체크리스트
- 표가 구조(행·열·병합)를 유지한 채 뽑히나요?
- 표가 청크 경계에서 잘리지 않나요?
- 헤딩·조항 번호가 텍스트로 남아 있고, 청크에 상위 경로가 붙나요?
- 각주가 참조 위치 근처에 있나요?
- 다단 레이아웃의 읽기 순서가 맞나요?
- 문서 날짜·버전이 메타데이터로 있나요?
- 청크마다 원본 위치(문서·페이지·블록)가 있나요?
마지막 항목이 있어야 답변에 "출처: ○○규정 제12조 (p.4)"를 붙일 수 있고, 그래야 사용자가 답을 확인해요. 확인 못 하는 답변은 사내에서 안 써요.
평가는 어떻게
질문-정답 쌍을 만들어 두고, "정답 조각이 상위 N개에 들어오는 비율"(검색)과 "최종 답이 맞는 비율"(생성)을 따로 재세요. 둘을 나눠야 어디를 고칠지 알아요. 저희 경험상 검색 쪽 지표를 올리는 게 생성 쪽보다 효과가 컸어요.
다음 주는 PoC 이야기예요. 데모는 성공했는데 도입은 왜 실패하는지요.