Development··6 min read

RAG로 사내 문서 검색 만든 삽질기

Confluence에 쌓인 3,000개 문서를 AI로 검색 가능하게 만들려다 벌어진 일

"컨플에서 찾아보세요"를 하루에 세 번은 들었다

누군가 슬랙에서 뭘 물어보면 돌아오는 대답은 항상 같았다. "컨플에 있어요." 근데 그 컨플루언스에서 원하는 문서를 찾는 게 보물찾기 수준이다. 검색하면 3년 전 문서가 먼저 뜨고, 같은 주제의 문서가 다섯 개씩 있는데 어느 게 최신인지 모르겠고. 진짜 매일 이러고 있었다.

"RAG로 사내 문서 검색 챗봇 만들면 되겠다." 2주면 될 거라고 생각했다. 6주가 걸렸다.

1주차: 여기까진 순조로웠다

Confluence API로 문서 3,247개를 크롤링하고, 텍스트를 청크로 잘라서 임베딩 벡터로 변환하는 것까진 좋았다. OpenAI의 text-embedding-3-large로 변환, Pinecone에 저장. 이틀이면 됐다.

간단한 시맨틱 검색도 잘 됐다. "배포 프로세스"라고 물어보면 관련 문서 5개를 뽑아주고, LLM이 요약해서 답변해줬다. "와 이거 대박이다" 싶었다. (여기서 끝났어야 했다.)

2주차: "이거 거짓말하는데요?"

기쁨은 오래가지 않았다. QA 팀에서 시험 삼아 써보더니 피드백이 왔다. "연차 신청은 어떻게 해요?"라고 물었을 때, 2023년에 작성된 구 프로세스를 기반으로 답변을 생성한 거다. 시스템이 바뀌어서 완전히 다른 방법으로 신청해야 하는데. 문서에 날짜가 있어도 LLM은 최신 문서를 우선하지 않았다.

RAG에서 가장 무서운 건 "그럴듯한 거짓말"이다. 아예 모르겠다고 하면 다시 찾아보기라도 하지, 자신 있게 틀린 답을 하면 그대로 따라하게 된다. 이거 때문에 신규 입사자 한 명이 연차를 잘못 넣었다. 내 잘못이다.

3~4주차: 청크를 어떻게 자를 것인가

처음에는 500토큰 단위로 기계적으로 잘랐는데, 맥락이 끊기는 게 문제였다. 표가 중간에 잘리고, 코드 블록이 반으로 쪼개지고. 결국 문서 구조를 분석해서 h2 태그 기준으로 섹션을 나누고, 각 섹션에 문서 제목과 작성일을 메타데이터로 붙이는 방식으로 바꿨다. 이 작업만 일주일.

그리고 리랭킹을 도입했다. 벡터 검색으로 후보 20개를 뽑고, Cross-Encoder로 재정렬해서 상위 5개만 LLM에 넘기는 방식. 이거 하나로 답변 정확도가 체감상 꽤 올라갔다. 정확한 수치는 모르겠다. 측정하기 애매하니까.

5주차: 보안팀에서 전화가 왔다

거의 다 됐다 싶었는데. "인사 관련 문서는 권한 있는 사람만 봐야 하는데, 챗봇이 아무한테나 보여주면 안 됩니다." 맞는 말이다. Confluence의 페이지 권한 체계를 RAG에도 반영해야 했다. 사용자별로 접근 가능한 문서만 검색 대상에 포함시키는 필터링. 이것도 3일.

6주차: 드디어 나갔다

슬랙 봇으로 배포했다. /ask 명령어로 질문하면 3초 안에 답변이 온다. 출처 문서 링크도 같이 보여준다. 배포 후 2주 통계를 보니, 하루 평균 질문 45건, 만족도 기준 정확도가 체감상 8할 정도. 완벽하진 않지만 컨플 검색창보다는 확실히 낫다는 평가.

솔직히 후회하는 부분

"2주면 된다"고 말해버린 거. 6주 걸린 건 내 예측 실패다. 임베딩이랑 벡터 검색은 전체의 2할도 안 되고, 나머지 8할은 청킹, 리랭킹, 권한 관리, 환각 방지 같은 지루한 작업들이다. 데모 수준의 RAG는 하루면 만든다. 사람들이 실제로 쓸 수 있는 RAG는 다른 문제다.

관련 글