회사에서 문서 기반 챗봇을 만들어야 해서 RAG 공부하면서 직접 프로토타입을 만들어봤습니다. 처음엔 벡터DB에 문서 임베딩하고 쿼리 때 유사도 검색해서 프롬프트에 넣으면 되겠지 했는데... 생각보다 난관이 많더라고요.
일단 가장 큰 문제가 청킹이었어요. 문서를 어떻게 쪼갤지가 정말 중요한데, 너무 작게 나누면 맥락이 손실되고 크게 나누면 관련 없는 내용까지 포함되더라고요. 처음엔 고정 크기로 나눴는데 나중에 의미 단위로 나누는 게 훨씬 낫다는 걸 알게 됐습니다. 지금은 문장 경계나 제목 기준으로 쪼개고 있는데 여전히 튜닝 중입니다.
그 다음 문제가 검색 결과의 랭킹이었어요. 코사인 유사도만으로는 부족한 경우가 많거든요. 관련성은 높은데 정확도가 낮은 문서들이 계속 상위에 올라오더라고요. 지금은 하이브리드 검색(벡터 + 키워드)으로 조정 중인데, 이게 가장 큰 개선가 되었습니다. BM25 같은 전통 검색도 함께 쓰니까 훨씬 낫더라고요.
마지막으로는 할루시네이션 문제가 있었어요. 관련 문서를 제대로 가져와도 모델이 가끔 엉뚱한 답변을 하는 경우가 있거든요. 문서에 명확히 없는 내용을 있다고 말하는 거 말이에요. 이건 프롬프트 엔지니어링으로 어느 정도 완화할 수 있더라고요. "다음 문서에 답이 없으면 모른다고 말하세요" 이런 식으로 명확하게 지시하니까 나아졌습니다.
지금까지의 경험으로는 RAG가 생각보다 훨씬 섬세한 작업이 필요한 것 같습니다. 단순히 임베딩과 검색만으로는 부족하고, 청킹, 검색 알고리즘, 프롬프트 등 여러 부분을 함께 최적화해야 좋은 결과가 나오더라고요. 혹시 RAG 시스템 만들어본 분들이 계시면 팁 좀 공유해주시면 감사하겠습니다.