새로운 WhatsApp 기반 RAG(검색 증강 생성) 어시스턴트가 모든 답변에 JSON 인코딩된 인용을 포함하도록 요구함으로써 환각(hallucination) 현상을 멈췄습니다. 모델이 특정 청크(chunk)를 지목할 수 없을 때 "그 질문에 답변할 충분한 정보가 없습니다"라고 답변하게 함으로써, 자신만만하게 거짓말을 하던 시스템을 신뢰할 수 있는 "모름" 시스템으로 탈바꿈시켰습니다.

RAG에서 신뢰가 중요한 이유

대부분의 RAG 튜토리얼은 임베딩 선택, 문서를 청크로 나누기, 결과 재순위화(re-ranking)와 같은 검색(retrieval) 과정에만 집착합니다. 이들은 관련 텍스트를 찾은 이후에 어떤 일이 일어나는지는 간과하곤 합니다. 사용자는 어시스턴트가 검색된 컨텍스트가 실제로 뒷받침하지 않는 확정적인 답변을 내놓을 때 신뢰를 잃습니다.

자신감의 격차

PostgreSQL과 pgvector 확장을 사용하여 구축한 프로토타입에서는 검색 파이프라인이 단순했습니다. 진짜 문제는 운영 환경에서 나타났습니다. 검색된 스니펫(snippet)에 필요한 정보가 부족함에도 불구하고 언어 모델은 마치 확신이 있는 것처럼 말했습니다. 데모에서는 문제를 숨길 수 있었지만, 실제 사용자는 자신감 있게 말하는 것과 실제로 정확한 것 사이의 격차를 드러냈습니다.

JSON을 통한 인용 강제

"컨텍스트가 있는 경우에만 답변하세요"와 같은 프롬프트로 모델을 달래는 대신, 저자는 출력 형식을 변경했습니다. 이제 시스템은 각 주장에 대해 이를 뒷받침하는 정확한 청크에 대한 참조를 포함하는 JSON 객체를 요구합니다. 모델이 인용을 첨부할 수 없으면 응답은 거부되며, 사용자는 명확한 "모릅니다" 메시지를 보게 됩니다.

강제 방식이 자연어 지침에서 스키마 검증(schema validation)으로 이동했습니다. 모델은 여전히 텍스트를 생성하지만, 주변 코드가 사용자에게 전달되기 전에 JSON이 요구된 구조와 일치하는지 확인합니다.

변경된 사항

  • 청킹(Chunking)이 보수적으로 변했습니다. 모호하거나 지나치게 광범위한 청크는 이제 인용 없이 주장을 생성하며, 이는 "모릅니다"라는 폴백(fallback)을 트리거합니다.
  • 시스템 프롬프트가 축소되었습니다. 모델의 행동을 통제하려던 과도한 프롬프트 대신 짧은 지침 세트로 대체되었으며, 스키마가 핵심적인 역할을 수행하도록 했습니다.
  • 실패가 가시화되었습니다. 검색 결과가 관련 없는 내용을 반환할 때, 어시스턴트는 더 이상 자신감 있지만 틀린 답변으로 오류를 숨기지 않고 불확실성을 솔직하게 인정합니다.

시사점: RAG 어시스턴트의 경우, 모든 주장이 검색된 소스로 추적 가능하다는 것을 보장하는 것이 검색 단계만 개선하는 것보다 훨씬 더 확실하게 사용자의 신뢰를 구축합니다. 인용이 누락된 경우 이를 눈에 보이는 "모릅니다"로 전환함으로써, 개발자는 시스템이 답변을 꾸며내는 대신 자신의 한계를 인정하도록 만들 수 있습니다.