RAG 시스템 프로토타입 구축하며 배운 것들

배경

사내 위키와 문서가 늘어나면서 검색 품질에 대한 불만이 쌓였다. 키워드 매칭만으로는 한계가 명확했고, GPT-4가 좋은 답변을 생성할 수 있다는 걸 알고 있었기에 RAG 시스템을 시도해보기로 했다.

기술 스택

  • OpenAI API (text-embedding-ada-002, GPT-4)
  • Pinecone (벡터 DB)
  • LangChain (초기 구조 파악용)
  • Next.js + TypeScript

주요 이슈

1. 청킹 전략

처음엔 단순히 1000자 단위로 잘랐는데, 문맥이 끊겨서 검색 품질이 떨어졌다. 마크다운 헤더 기준으로 나누되, 너무 작으면 병합하는 방식으로 변경했다.

function chunkByHeaders(markdown: string, minSize: number = 500) {
  const sections = markdown.split(/^#{1,3} /m);
  const chunks = [];
  let buffer = '';

  for (const section of sections) {
    if (buffer.length + section.length < minSize) {
      buffer += section;
    } else {
      if (buffer) chunks.push(buffer);
      buffer = section;
    }
  }
  if (buffer) chunks.push(buffer);
  return chunks;
}

2. 메타데이터 활용

임베딩만으로는 부족했다. 문서 작성일, 작성자, 카테고리 같은 메타데이터를 함께 저장하고 필터링에 활용하니 정확도가 올라갔다.

3. 프롬프트 엔지니어링

검색된 문서를 그대로 GPT-4에 넘기면 hallucination이 발생했다. "제공된 문서에 없는 내용이면 '문서에서 찾을 수 없습니다'라고 답변하라"는 명시적 지시가 필요했다.

성과 및 한계

프로토타입 수준에서 80% 정도 만족스러운 답변을 받았다. 다만 비용(임베딩 + GPT-4 호출)과 응답 속도(3-5초)가 과제로 남았다. 내년에는 캐싱 전략과 streaming 응답을 추가할 예정이다.

참고

  • LangChain은 빠르게 구조를 이해하는 데는 도움이 됐지만, 프로덕션에서는 직접 구현하는 게 나을 것 같다는 판단이었다.
  • Pinecone 무료 티어로 충분히 테스트 가능했다.
RAG 시스템 프로토타입 구축하며 배운 것들