사내 LLM RAG 구축 ③ 실패 뒤에 RAG를 단계별로 뜯어본 공부
②편의 로컬 시험은 어디서 막혔는지 볼 수 없어서 멈췄습니다. 모든 단계가 한 도구 안에 묶여 있었기 때문입니다. 그래서 1월 초 저는 도구를 바꾸기보다 RAG를 단계별로 직접 나눠 보는 공부를 했습니다.
학습 계획, 요구사항 정의서(PRD), 단계별 코드 골격을 만들었습니다. 이 단계에서 사내 문서로 끝까지 돌려 잰 결과는 없습니다. 이 공부는 이후 설계(①편)의 바탕이 됐습니다.
연재 순서: ① 개략도와 주의사항 · ② 로컬 시험 실패기 · ③ 실패 뒤에 한 공부 · ④ 문서 처리와 검색(예정)
먼저 결론
- 평가 없이 개선할 수 없습니다. 검색이 잘 됐는지와 답이 문서에 충실한지는 따로 잽니다.
- 답하기 전에 찾은 내용이 충분한지 묻고, 다시 찾기는 최대 3회로 막았습니다.
- AI가 만든 코드는 계획과 맞춰 봐야 합니다. 계획에 없던 "웹 검색으로 넘어가기"가 코드에 들어가 있었습니다.
단계마다 파일을 따로 두었다
| 만든 것 | 내용 |
|---|---|
| 학습 계획 | LangChain과 RAG를 12주로 나눈 학습 계획. 문서 불러오기·자르기 → 벡터 저장 → 검색 평가 → 답변 평가 → 실전 프로젝트 순서 |
| 요구사항 정의서 | 외부 API 없이 100% 로컬로 도는 문서 질의응답 시스템. 검색 결과를 평가하고 부족하면 다시 찾는 구조 |
| 코드 골격 | 문서 처리(PDF·표·이미지), 벡터 저장, 하이브리드 검색, 검색 평가 에이전트를 모듈로 나눈 구조 |
②편과 가장 다른 점은 단계마다 파일이 따로 있다는 것입니다. 문서를 읽는 코드, 표를 꺼내는 코드, 검색하는 코드, 결과를 평가하는 코드가 나뉘어 있습니다. 어느 단계의 결과든 따로 꺼내 확인할 수 있습니다.
검색과 답변은 따로 재야 했다
학습 계획에서 ②편의 실패와 가장 직접 이어지는 부분은 평가였습니다. ②편에서는 문서 자르는 크기를 감으로 바꾸다 하루를 썼습니다.
RAG는 두 군데를 따로 잽니다.
| 어디를 | 무엇을 보나 | 예 |
|---|---|---|
| 검색 | 찾아온 조각이 질문과 관련 있는가, 답에 필요한 조각을 빠짐없이 찾았는가 | 정답 문서가 상위 5개 안에 있는가 |
| 답변 | 답이 찾아온 조각에만 근거했는가(지어내지 않았는가), 질문에 맞는 답인가, 정답과 같은가 | 답의 문장마다 근거 조각이 있는가 |
이 표로 ②편을 다시 보면, 검색은 통과했고 답변 쪽에서 막혔습니다.
답변이 찾아온 내용을 쓰지 못한 것입니다. 그때 두 칸을 따로 재는 방법을 알았다면 원인을 더 빨리 좁혔을 것입니다.
검색을 좋게 만드는 방법도 두 가지 정리했습니다. 하나는 하이브리드 검색입니다. 의미 검색(벡터)과 단어 검색(BM25)을 섞습니다. 의미 검색은 제도 이름이나 번호처럼 글자 그대로 찾아야 하는 말에 약하기 때문입니다.
다른 하나는 **다시 정렬하기(리랭킹)**입니다. 넓게 찾아온 결과를 질문과 한 번 더 맞춰 보고 상위 몇 개만 남깁니다.
답하기 전에 "충분한가"를 묻게 했다
요구사항 정의서에서 정한 흐름은 이렇습니다.
질문 → 검색 → [평가] 찾은 내용이 답하기에 충분한가?
├─ 예 → 답변 생성 → 출처(파일명·쪽) 표시
└─ 아니오 → 질문을 고쳐 다시 검색 (최대 3회)
└─ 3회 넘으면 "관련 정보를 찾을 수 없습니다"
안전장치는 두 가지를 넣었습니다. 다시 찾기를 무한히 반복하지 않게 재시도는 최대 3회로 막았습니다. 그리고 "주어진 문서에 없는 내용은 지어내지 말고 모르겠다고 답하라"를 지침에 넣었습니다.
AI가 만든 코드는 계획과 달랐다
코드 골격은 AI 코딩 도구로 만들었습니다. 정의서에 단계별 지시문까지 적어 두고 시작했습니다. 그런데 만들어진 검색 평가 에이전트를 읽어 보니 흐름이 달랐습니다.
| 계획(정의서) | 만들어진 코드 | |
|---|---|---|
| 찾은 내용이 부족할 때 | 질문을 고쳐 사내 문서를 다시 검색, 최대 3회 | 웹 검색으로 넘어감 |
| 외부 연결 | 없음(100% 로컬) | 기본 설정에 외부 AI 모델로 바꾸는 선택지도 있음 |
일반 질문 챗봇이라면 웹 검색으로 넘어가는 것이 친절한 기능입니다. 사내 규정을 묻는 챗봇에서는 문제가 됩니다. 사내 문서에 없는 내용을 인터넷에서 가져와 답하면, 틀린 규정을 회사 답처럼 말하게 됩니다.
질문 자체가 외부로 나가는 것도 보안상 따져 봐야 합니다.
AI는 흔히 쓰이는 구조를 잘 만들어 줍니다. 하지만 흔한 구조가 내 업무의 조건과 맞는지는 사람이 계획과 대조해야 합니다. 저는 AI에게 코드를 받으면 "정의서의 요구사항과 다른 부분을 표로 정리해 줘"라고 먼저 물어보는 것을 권합니다.
사내 문서로 끝까지 돌리지는 못했다
사내 문서로 끝까지 돌려 평가 점수를 낸 기록은 없습니다. 코드 골격의 시험 문서는 공개된 기술 소개 글 하나였습니다. 표와 이미지 처리, 그래프 기반 검색 같은 고급 기능은 골격만 만들었습니다.
작업은 공부와 골격에서 멈췄습니다. 실제 구축 계획은 회사 환경(서버, GPU 유무, 보안 등급)을 확인한 9월 설계로 이어졌습니다.
1월 공부 중 일부는 설계에 남고 일부는 바뀌었다
| 1월 공부 | 2026년 9월 설계에서 |
|---|---|
| 하이브리드 검색 + 다시 정렬하기 | 그대로 유지. 단어 검색과 의미 검색을 한 검색 엔진(OpenSearch)에서 처리 |
| 검색·답변을 따로 평가 | 평가 질문 30개를 먼저 만들고 모든 설정을 점수로 결정 |
| 단계별 모듈 | 변환 → 자르기 → 색인 → 검색 → 답변을 나누고 단계별 결과를 저장 |
| 100% 로컬 | 바꿈. ②편에서 답변 하나에 50~60초 → 문서 벡터는 서버 안에서, 답변 생성만 외부 LLM API로(공개·사내일반 등급 문서 발췌만) |
| 같은 길이로 자르기 | 바꿈. 규정은 조항, FAQ는 문답 단위로 |
| 간단한 PDF 텍스트 추출 | 바꿈. 표와 목차 구조를 살리는 변환기(Docling) |
| 부족하면 웹 검색 | 넣지 않음. 사내 문서에 없으면 "못 찾음"으로 답 |
이 공부에서 가장 쓸모 있었던 일은 AI가 만든 코드를 계획과 대조해 읽은 것이었습니다. ④편에서는 설계대로 문서 변환·자르기·검색을 단계별로 만들고, 평가 질문으로 측정한 결과를 정리할 예정입니다.