RAG는 데이터가 쌓이면 멍청해질까: top-k와 검색 품질 이야기
사내 문서에 AI 챗봇을 붙이면 도입 첫 달이 제일 똑똑합니다. 문서 열 개짜리 인덱스에서는 뭘 물어도 정답 문서가 걸리니까요. 그런데 반년쯤 지나 문서가 수백 개로 불어나면 슬슬 이상한 답이 늘어납니다. "데이터를 더 넣었는데 왜 더 멍청해지지?"라는 질문은 RAG를 운영해 본 팀이라면 반드시 만나는 질문입니다.
사내 문서에 AI 챗봇을 붙이면 도입 첫 달이 제일 똑똑합니다. 문서 열 개짜리 인덱스에서는 뭘 물어도 정답 문서가 걸리니까요. 그런데 반년쯤 지나 문서가 수백 개로 불어나면 슬슬 이상한 답이 늘어납니다. "데이터를 더 넣었는데 왜 더 멍청해지지?"라는 질문은 RAG를 운영해 본 팀이라면 반드시 만나는 질문입니다.
지난 글(챗봇이 목록을 자꾸 틀린다면: 생성이 아니라 조회를 시키세요)에서 "재고 질문은 LLM이 아니라 DB가 답하게 하라"는 구조를 소개했습니다. 그런데 이 구조, 저희가 발명한 게 아닙니다. 부품 하나하나에 이미 정식 이름이 있고, 수십 년 된 것도 있습니다.
사내 데이터에 AI 챗봇을 붙이면 누구나 한 번쯤 이런 질문을 던지게 됩니다.
사내 문서 RAG 챗봇처럼 비용을 아껴야 하는 환경에서는 작은 모델을 쓰게 됩니다. 그런데 작은 모델은 시스템 프롬프트의 금지 규칙을 자주 어깁니다. 이때 흔히 하는 대응이 프롬프트를 더 강하게 쓰는 것입니다. "절대 하지 마세요", "반드시" 같은 말을 덧붙이고, 예시를 추가하고, 규칙 번호를 매깁니다.
사내 문서를 근거로 답하는 RAG 챗봇을 도입하면 대부분 비슷한 지점에서 막힙니다. 첫 질문에는 그럴듯하게 답하는데, 이어서 "그럼 그건 언제 바뀐 거야?" 같은 질문을 던지면 갑자기 엉뚱한 문서를 근거로 들고 옵니다. 사용자는 "AI가 헛소리를 한다"고 느끼고, 도입은 거기서 멈춥니다.
문서 질의응답 기능은 검색과 답변 생성을 함께 수행하기 때문에 일반 API보다 처리 비용이 큽니다. 그런데 모바일 화면에서 제공하는 질문이 미리 준비된 여덟 개로 고정되어 있다면 캐시 대상은 매우 작아집니다.
사내에 AI를 도입하려는 회사가 가장 먼저 부딪히는 질문이 있습니다. "모델 하나면 되는 것 아닌가요?"
서버가 멀면 응답이 느린 건 어쩔 수 없습니다. 제 경우 오리진 응답 지연에 CDN 우회 경로까지 겹쳐 페이지 응답에 1초 가까이 걸리는 상황이었고, 네트워크 쪽은 당장 손댈 수 없었습니다. 그래서 응답 속도 대신 "눌렀을 때 반응하는 속도"를 올리는 쪽으로 방향을 잡았습니다. 느린 것과 느리게 느껴지는 것은 생각보다 …
한국 사용자를 대상으로 운영 중인 데모 사이트에서 응답 지연을 점검했습니다. 도메인은 Cloudflare 프록시를 거치게 해뒀고, 원본 IP와 오리진을 보호하기 위해 켜둔 상태였습니다. 그러다 사이트를 손보는 중에 "버튼이 한 박자 늦게 눌리는 것 같다"는 얘기가 나왔고, 확인해 보니 앱 코드가 아니라 이 프록시 경로가…
오래 운영한 코드베이스를 점검하다 보면 비슷하게 생긴 코드 뭉치를 발견하고 "이거 중복이네, 합치자"라는 충동이 듭니다. 중복 제거는 리팩토링의 기본이라고 배우기도 했고, 지우는 작업은 손도 빠릅니다. 저는 얼마 전 그 충동대로 갔다가 큰일 날 뻔했습니다.
혼자 운영하는 서비스는 점검을 자꾸 미루게 됩니다. 기능이 돌아가고 있으면 코드를 다시 들여다볼 이유가 생기지 않고, 그 사이에 같은 패턴이 계속 복사됩니다. 저도 얼마 전 하루를 잡고 운영 중인 서비스 코드를 전체 점검했는데, 관리자 API 라우트 파일 70개에 완전히 똑같은 인증 가드 한 줄이 131번 반복되고 있었…