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 무료 티어로 충분히 테스트 가능했다.