챗봇이 목록을 자꾸 틀린다면: 생성이 아니라 조회를 시키세요
왜 이 주제가 중요한가
사내 데이터에 AI 챗봇을 붙이면 누구나 한 번쯤 이런 질문을 던지게 됩니다.
"이케아 철재장에 있는 물건 전부 표로 정리해줘"
그리고 대부분 이런 답을 받습니다. 목록이 40개여야 하는데 30개만 나오거나, 있지도 않은 물건 이름이 섞여 있거나, 실행할 때마다 개수가 달라집니다. 이쯤 되면 "우리 모델이 작아서 그런가, 더 좋은 LLM을 쓰면 해결되나?"라는 고민으로 이어집니다.
결론부터 말하면, 이 문제는 모델 성능의 문제가 아니라 설계의 문제입니다. 최상위 모델을 붙여도 이 구조로는 보장이 안 되고, 반대로 구조를 바꾸면 소형 오픈소스 모델로도, 심지어 LLM 없이도 100% 정확해집니다.
핵심 개념: 왜 "생성"은 목록에 약한가
일반적인 RAG 챗봇은 이렇게 동작합니다.
질문 → 벡터 검색(상위 k개 조각) → LLM이 조각을 읽고 답 생성이 구조가 목록 질문에서 무너지는 지점은 두 곳입니다.
1. 검색 단계에서 이미 샙니다. 벡터 검색은 질문과 유사한 상위 k개 조각만 가져옵니다. 물건 48개가 여러 조각에 흩어져 있다면, 그중 일부만 LLM에게 전달됩니다. 애초에 모델이 전체 목록을 본 적이 없으니 전체를 답할 수 없습니다.
2. 모델은 전사(轉寫)에 약합니다. 전체 데이터를 컨텍스트에 다 넣어줘도 문제는 남습니다. 수십 개 항목을 하나도 빠뜨리지 않고, 이름을 한 글자도 바꾸지 않고 옮겨 적는 것은 확률적 생성 모델의 약점입니다. 모델이 클수록 나아지긴 하지만 "정확히 48개"를 보장하는 모델은 없습니다. 목록·개수·집계는 확률과 상성이 가장 나쁜 과제입니다.
실제 적용 포인트: 정형 질문은 DB가 답하게
저희가 사내 도구에 적용한 구조는 간단합니다. 재고처럼 정형화된 질문은 LLM을 거치지 않고 DB가 직접 답하게 하고, LLM은 비정형 지식 질문만 담당합니다.
질문
├─ 재고 인텐트 감지됨 → DB 쿼리 → 코드가 표 생성 (LLM 미사용)
└─ 그 외 → 기존 RAG 파이프라인구현은 세 단계입니다.
1. 인텐트 감지는 가볍게. 위치 이름 사전(구역·가구·칸 등)을 DB에서 읽어 질문과 대조하고, "뭐가, 목록, 표로, 몇 개" 같은 목록 의도 단어가 함께 있는지만 봅니다. 이 정도는 LLM 없이 규칙으로 충분하고, 결정적이라 오늘 되던 게 내일 안 되는 일이 없습니다.
2. 오타는 편집 거리로 흡수. 사용자는 "철재장"을 "철제장"으로 쓰기 마련입니다. 위치명 매칭에 레벤슈타인 거리 1~2를 허용하면 표기 흔들림 대부분이 잡힙니다. 사전이 100여 개 수준이면 전수 비교해도 비용은 무시할 만합니다.
3. 표는 코드가 만듭니다. 인텐트가 확정되면 ORM으로 해당 위치의 아이템을 전부 조회해서, 마크다운 표를 문자열로 직접 조립합니다. 46종이면 정확히 46행이 나옵니다. LLM이 데이터를 거치지 않으므로 개수도 이름도 수량도 틀릴 수가 없습니다.
역방향 질문("건전지 어디 있어?")도 같은 원리로 처리합니다. 이름 키워드로 아이템을 찾아 위치 경로를 표로 돌려주면 됩니다.
부수 효과도 큽니다. 이 경로는 모델 서버를 아예 호출하지 않으므로 응답이 사실상 즉시이고, AI 서버가 내려가 있어도 재고 질문은 계속 동작합니다.
주의할 점
- 가로채기 오탐을 경계하세요. "철재장 정리하는 방법 추천해줘"는 재고 질문이 아니라 지식 질문입니다. "방법, 팁, 추천, 왜, 비교" 같은 단어가 있으면 인텐트를 포기하고 RAG로 넘기는 부정 규칙이 필요합니다.
- 표가 무한정 길어지지 않게 행 수 상한을 두고, 잘렸다는 사실을 답변에 명시하세요. 조용한 절단은 "전부 보여줬다"로 읽힙니다.
- 답변에 출처 성격을 밝히세요. "DB를 직접 조회한 결과"라고 적어두면 사용자가 생성 답변과 신뢰 수준을 구분할 수 있습니다.
- 이 패턴은 재고에만 국한되지 않습니다. 매출 집계, 일정 목록, 회원 수처럼 정답이 DB에 이미 있는 질문은 전부 같은 방식이 맞습니다. LLM에게는 "말"을 시키고, "사실"은 시스템이 대야 합니다.
듀오랩스가 보는 관점
"AI 도입 = 좋은 모델 고르기"로 접근하면 이런 문제 앞에서 비용만 커집니다. 저희는 반대로 봅니다. 모델이 잘하는 일(비정형 텍스트 이해와 요약)과 시스템이 잘하는 일(정확한 조회와 집계)을 나누는 설계가 먼저고, 모델 선택은 그다음입니다. 실제로 위 구조는 사내 GPU에서 도는 소형 오픈소스 모델과 조합해도 상용 최상위 모델 못지않은 체감을 냅니다. 정확해야 하는 부분이 모델 밖으로 나갔기 때문입니다.
업무 시스템에 AI를 붙이고 싶은데 "챗봇이 자꾸 틀려서" 망설이고 계시다면, 모델 교체보다 이런 라우팅 설계를 먼저 검토해 보시길 권합니다.
함께 읽기
- RAG는 데이터가 쌓이면 멍청해질까: top-k와 검색 품질 이야기사내 문서에 AI 챗봇을 붙이면 도입 첫 달이 제일 똑똑합니다. 문서 열 개짜리 인덱스에서는 뭘 물어도 정답 문서가 걸리니까요. 그런데 반년쯤 지나 문서가 수백 개로 불어나면 슬슬 이상한 답이 늘어납니다. "데이터를 더 넣었는데 왜 더 멍청해지지?"라는 질문은 RAG를 운영해 본 팀이라면 반드시 만나는 질문입니다.
- RAG 챗봇이 "그건 언제 바뀐 거야?"에 답하게 만들기사내 문서를 근거로 답하는 RAG 챗봇을 도입하면 대부분 비슷한 지점에서 막힙니다. 첫 질문에는 그럴듯하게 답하는데, 이어서 "그럼 그건 언제 바뀐 거야?" 같은 질문을 던지면 갑자기 엉뚱한 문서를 근거로 들고 옵니다. 사용자는 "AI가 헛소리를 한다"고 느끼고, 도입은 거기서 멈춥니다.
- 로컬 LLM으로 업무 자동화를 만들 때, 모델을 몇 개 써야 할까사내에 AI를 도입하려는 회사가 가장 먼저 부딪히는 질문이 있습니다. "모델 하나면 되는 것 아닌가요?"
- 그 챗봇 설계, 이름이 다 있습니다: 쿼리 라우팅부터 Agentic RAG까지지난 글(챗봇이 목록을 자꾸 틀린다면: 생성이 아니라 조회를 시키세요)에서 "재고 질문은 LLM이 아니라 DB가 답하게 하라"는 구조를 소개했습니다. 그런데 이 구조, 저희가 발명한 게 아닙니다. 부품 하나하나에 이미 정식 이름이 있고, 수십 년 된 것도 있습니다.
- 작은 모델은 규칙을 지키지 않습니다 — 프롬프트 대신 출력을 검증하는 법사내 문서 RAG 챗봇처럼 비용을 아껴야 하는 환경에서는 작은 모델을 쓰게 됩니다. 그런데 작은 모델은 시스템 프롬프트의 금지 규칙을 자주 어깁니다. 이때 흔히 하는 대응이 프롬프트를 더 강하게 쓰는 것입니다. "절대 하지 마세요", "반드시" 같은 말을 덧붙이고, 예시를 추가하고, 규칙 번호를 매깁니다.