RAG를 활용한 코드 Q&A 봇 구축기: 성공한 것과 실패한 것
개발자들이 마이크로서비스를 이해하기 위해 Slack과 오래된 문서들을 뒤지며 며칠을 허비하곤 했습니다. 그래서 저는 RAG를 사용하여 이러한 질문에 답할 수 있는 챗봇을 만들기로 했습니다.
그 과정에서 많은 실수를 했습니다. 제가 배운 점들을 공유합니다.
실패 사례
- 모든 문서를 하나의 프롬프트에 넣으려고 시도했습니다. 그 결과 토큰 제한에 걸렸고, 환각(hallucination) 현상이 발생했으며, 비용도 너무 많이 들었습니다.
- 기본적인 TF-IDF 인덱스를 사용했습니다. 사용자가 유의어나 다른 용어를 사용할 때 제대로 작동하지 않았습니다.
- 단순히 500자 단위로 청킹(chunking)을 시도했습니다. 청크가 문장 중간에서 끊기는 경우가 많아 결과가 무작위로 나왔습니다.
해결책
LLM을 검색 엔진처럼 다루는 것을 그만두었습니다. 대신 전용 검색 인덱스를 위한 '읽기 엔진'으로 전환했습니다.
성공적이었던 파이프라인은 다음과 같습니다:
- 문서를 50토큰의 오버랩(overlap)을 포함하여 300토큰 단위의 청크로 나눕니다.
- 각 청크를 벡터로 임베딩합니다.
- 벡터를 유사도 검색 인덱스에 저장합니다.
- 쿼리 시점에 가장 유사한 상위 5개의 청크를 찾습니다.
- 해당 청크들만 LLM에 입력하여 답변을 생성합니다.
이 변화를 통해 환각 현상을 80% 줄였고, 쿼리당 비용을 0.01달러 미만으로 낮췄습니다.
**핵심