RAG 근거 선택 - 충족률 66.25% → 91.25% 개선과 Jev 최적화로 처리시간 87% 단축
Fruition은 사용자가 올린 문서를 근거로 답하는 서비스라, 근거가 틀리면 답변 전체를 믿을 수 없게 됩니다. 기존 검색이 놓치던 근거를 판단 전용 모델 Jev가 다시 고르도록 바꿔, 답변 근거 충족률을 66.25%에서 91.25%로 높였습니다. 늘어난 처리 시간은 후보 수와 병렬 처리를 조정해 줄였습니다.
01 배경
기존 검색은 근거를 놓치거나 답이 없는 질문에도 근거를 붙여, 잘못된 답변으로 이어질 수 있었습니다. 정확한 정보를 찾아 전달하는 것이 이 서비스의 핵심이라 단계별 실행 결과를 분석했고, 정답 근거는 처음 후보에 모두 있었지만 검사 대상을 앞 8개 페이지로 제한하는 단계에서 90문항 중 76문항의 근거가 빠지고 있음을 확인했습니다. 후보에서 필요한 근거를 고르고, 없으면 없다고 판단하는 단계가 필요했습니다.
근거가 틀리면 답변 전체를 믿을 수 없고, 신뢰를 잃은 사용자는 다시 쓰지 않습니다. 프로젝트의 핵심이 사용자에게 필요한 정보를 정확한 근거를 골라 제공한다는 점이기 때문에, 높은 정확도가 곧 사용자가 우리 제품을 신뢰하며, 계속 쓰고 다시 결제할 이유가 됩니다.
02 실험과 개선 과정
요청 분류 성능 비교와 RAG 적용 결정
문제 상황 질문을 문서 편집으로 분류하는 등 요청과 다른 작업으로 이어지는 문제가 있었습니다. 서비스의 신뢰성과 직결되는 문제라고 판단해, 작업 종류와 부가 조건을 더 정확하고 빠르게 고를 방법이 필요했습니다.
시도와 결과 9월 14일 출시된 선택형 판단 모델 Jev를, 사용자 요청을 질문·문서 편집·문서 생성·폴더 정리 등으로 나누는 라우팅에 적용했습니다. Jev의 벤치마크와 공식 Discord에 공유된 활용 사례를 보고, 우리 서비스에서도 라우팅 정확도를 높이고 비용과 시간을 줄일 수 있다고 판단했기 때문입니다. 모델이 판단한 98개 요청에서 작업 종류와 부가 조건을 모두 맞힌 수는 기존 JSON 방식 77개, 같은 선택지를 받은 GPT-5-nano 63개, Jev 81개였습니다. 판단시간 중앙값은 8.967초에서 0.658초로 줄였고, 같은 100문항의 API 비용은 GPT 방식 약 $0.1027, Jev 약 $0.0408이었습니다.
판단 정확도·속도·비용 모두에서 가능성을 확인해, 기존 검색이 풀지 못한 답변 근거 선택에도 적용하기로 했습니다. Jev를 고른 이유는 두 가지입니다. 첫번째는 GPT에게 근거를 고르게 하면 같은 선택지를 줘도 비용이 약 2.5배였고 판단 시간도 길었습니다. 질문마다 수백 개 후보를 검사하는 단계에는 부담이 컸습니다. 검색 점수를 조정해 순위를 다시 매기는 쪽은, 하이브리드 가중치와 RRF를 여러 값으로 실험해도 점수가 비슷한 수준에 머물렀습니다. 두번째로는 임베딩이 한국어 표현의 차이를 충분히 구분하지 못하는 경우가 있어, 분야마다 다른 질문에 하나의 가중치를 맞추는 것으로는 개선 폭이 작다고 봤습니다. 그래서 순위를 더 다듬기보다, 모아 온 후보에서 필요한 근거를 직접 판단하게 했습니다.
전체 근거 검사로 평가 질문 90건의 근거 충족
문제 상황 질문 원문으로 검색하고 의미 점수 비중을 높여, 질문 110개에서 정답 자료가 첫 번째에 오는 경우를 50개에서 57개로 늘렸습니다. 다만 편향이 있는 실험이었고, 새로운 질문에서도 필요한 근거를 안정적으로 고르는 문제가 남아 있었습니다. 범용적인 질문에서 안정적인 답변을 내보내주는 것이 프로젝트의 핵심이여서 해당 부분의 품질을 올릴 필요가 있었습니다.
시도와 결과 Jev가 검색이 놓친 근거도 찾을 수 있는지 확인하려고, 테스트 위키의 근거 2,020개를 거르지 않고 모두 Jev로 검사했습니다. 근거 충족률을 26.7%에서 100%로 높였지만, 처리 시간 중앙값이 1.511초에서 5.338초로 늘었고 질문마다 모든 근거를 검사해야 했습니다. 차이가 너무 커서 기존 검색의 탈락 단계를 추적했고, 정답 페이지가 앞 8개 페이지 제한에서 90문항 중 76문항이나 빠지고 있었음을 확인했습니다.
판단 기존 검색은 고르기도 전에 정답을 버리고 있어, 이 차이를 같은 후보에서의 선택 능력 차이로만 볼 수는 없었습니다. 또 질문마다 모든 근거를 검사하면 문서가 늘수록 호출 비용도 함께 늘어, 사용자가 비용을 선결제하는 서비스에 그대로 쓸 수 없었습니다. 그래서 검색으로 후보를 먼저 줄이고 Jev가 근거를 고르는 구조로 바꾸기로 했습니다.
동일 500개 후보 비교에서 근거 충족률 87.50% 달성
문제 상황 전체 근거 검사는 비용이 커서 서비스에 그대로 쓸 수 없었고, 평가 질문도 특정 문서에 몰려 있었으며 질문에 문서 제목까지 들어 있었습니다. 기존 검색은 일부 페이지만, Jev는 전체 근거를 보고 판단했기 때문에, 정확도 차이가 판단력 때문인지, 볼 수 있는 범위 때문인지를 판정하기가 어려웠습니다. 후보를 줄이면서 비교 조건도 맞춰야 했습니다.
시도와 결과 논문 9편으로 질문 100개(답이 있는 질문 80개, 없는 질문 20개)를 새로 만들어 실행 전에 고정했습니다. 두 방식에 같은 후보 500개를 주고 반환 개수를 8개로 맞췄으며, 정답은 입력에서 빼고 GPT와 Gemini가 방식 이름을 모른 채 채점했습니다. 그 결과, 근거 충족률을 66.25%에서 87.50%로 높였지만, 후보를 순차 처리해 처리 시간 중앙값은 기존 0.431초에서 9.090초로 늘었습니다.
판단 같은 조건에서도 Jev가 근거를 더 잘 골라, 검색은 후보 수집, Jev는 최종 근거 판단을 맡는 구조를 유지했습니다. 다만 공개 논문과 직접 만든 질문의 결과라 일반적인 정확도로 단정하지 않았고, 순차 처리로 늘어난 대기 시간을 줄이는 것을 다음 과제로 정했습니다.
300개 후보와 병렬 수 비교로 대기 시간 단축
문제 상황 근거 선택이 끝나야 답변이 시작되므로 처리 시간은 곧 사용자의 대기 시간입니다. 500개 순차 처리 중앙값 9.090초는 기존 0.431초보다 너무 길어 사용이 불가능하다 판단되었습니다. 하지만, 높은 정확도를 포기하긴 아까워 처리시간을 줄이고자 했습니다.
시도와 결과 후보 갯수가 비용과 처리속도에 영향을 주므로, 후보를 상위 500개에서 300개로 줄이고 최대 4개 묶음을 병렬 처리했습니다. 시간을 2.251초로 줄였고, 필요한 근거를 모두 고른 질문도 70개에서 73개로 늘렸습니다. 병렬 수는 근거 없이 정한 값이라, 같은 100문항에서 병렬 수만 4·6·8·10으로 바꿔 다시 측정했습니다. 선택 시간 중앙값은 2.066·1.165·0.945·0.886초였고, 선택이 달라진 42문항을 블라인드로 채점한 근거 충족은 37·38·36·37개로 차이가 없었습니다.
판단 8병렬 이후로는 시간 이득이 0.06초로 작았고, 운영에서는 동시 요청이 작업자 수 × 병렬 수로 늘어나 8병렬을 골랐습니다. 후보 추리기 포함 1.137초로 기존 0.431초보다는 여전히 느리고, 후보를 더 줄이는 안은 필요한 근거가 250위 밖에 있는 사례가 있어 접었습니다. 처리 시간이 늘어나는 것은 감수하고, 정확한 근거 전달이 이 서비스의 핵심이라고 판단해 Jev를 채택했습니다.
후보 생성 방식 비교로 운영 설정의 한계 확인
문제 상황 Jev가 잘 골라도 필요한 근거가 후보에 없으면 답변에 쓸 수 없습니다. 현재 후보 생성 방식이 정답 근거를 어디까지 남기는지 확인해야 했습니다.
시도와 결과 운영 중인 혼합 방식(임베딩 0.75 + 정규화 BM25 0.25)과 BGE-M3 단독, RRF, 교대 합집합을 저장된 점수로 다시 비교했습니다. 후보 100개 안에 정답 인용을 모두 남긴 문항은 BGE-M3 단독 74/80, 운영 혼합 63/80이었고, 후보를 300개 이상으로 늘리면 차이가 79/80과 78/80으로 좁아졌습니다.
판단 운영 중인 혼합 가중치가 BGE-M3 단독보다 정답 근거를 후순위로 매깁니다. 후보 300개인 현재 구성에서는 차이가 작아 운영 설정은 그대로 두고, 후보를 더 줄일 때 먼저 해결할 조건으로 남겼습니다.
03 개선한 처리 흐름
flowchart TD
Q[사용자 질문] --> S[의미·키워드 검색으로 후보 수집]
S --> C[상위 300개 후보]
C --> J[Jev로 질문에 필요한 근거 선택 · 최대 8병렬]
J --> E{충분한 근거가 있는가}
E -->|있음| A[선택한 근거를 답변 단계에 전달]
E -->|없음| N[근거 없음]
검증한 근거 선택 개선안입니다. 정답은 검색이나 모델 입력에 넣지 않고, 선택 결과를 평가할 때만 사용했습니다.
Mermaid 원문 보기
flowchart TD
Q[사용자 질문] --> S[의미·키워드 검색으로 후보 수집]
S --> C[상위 300개 후보]
C --> J[Jev로 질문에 필요한 근거 선택 · 최대 8병렬]
J --> E{충분한 근거가 있는가}
E -->|있음| A[선택한 근거를 답변 단계에 전달]
E -->|없음| N[근거 없음]
04 결과와 배운 점
근거 충족 건수 53/80 → 73/80, 총 처리시간 1.137초
자체 제작 평가셋에서 답이 있는 80개 질문의 근거 충족률을 66.25%에서 91.25%로 높였고, 답이 없는 질문 20개에 근거를 잘못 붙인 경우는 20건에서 0건으로 줄였습니다. 처리 시간은 기존 선택기보다 길지만, 정확한 근거 전달이 이 서비스의 핵심이라고 판단해 Jev를 채택했습니다. 같은 뜻의 표현을 묶는 판단에도 시험해, 정답 수는 기존 71개·Jev 72개로 유지하면서 판단시간 중앙값을 8.162초에서 0.254초로 줄일 수 있음을 확인했습니다.
검색은 의미·키워드 검색과 Wiki 그래프 탐색으로 원문 근거를 모으는 고정 파이프라인으로 두고, 답변과 근거·관련 페이지·탐색 경로를 나눠 보여 주도록 설계했습니다. 검색 전략을 스스로 세우는 Query Agent는 비용과 할루시네이션 위험 때문에 보류하고, 한 질문이 여러 번의 검색 계획과 재계획을 요구할 때 도입하기로 기준을 정했습니다. 그 전까지는 고정 파이프라인이 더 적은 호출로 같은 근거를 모으고 실패 지점도 추적하기 쉽습니다. 시간 단축은 Jev 설정을 바꾸기 전후의 비교이며, 개선 후에도 기존 선택기보다 느립니다. 근거 선택은 답변 전에 끝나야 해서 1.137초는 사용자 대기로 남고, 이 구간을 줄이는 일은 과제로 남겼습니다. 검색은 후보 수집, Jev는 최종 근거 판단을 맡도록 단계를 나눠 선택 방식만 바꿔 끼울 수 있게 했습니다.











