Spring AI + Typesense로 사내 문의 자동 답변 구축
무신사 글로벌 개발자가 1,400명 사내 문의 채널의 수동 답변을 Spring AI·Bedrock·Typesense Hybrid Search 챗봇으로 옮긴 사례.
요약
무신사가 1,400명 사내 문의 채널의 수동 답변을 Spring AI + AWS Bedrock 기반 Slack Bot 촤비스(choavis)로 옮김. AWS Kendra로 첫 구현했다 월 100만 원+ 비용 부담으로 오픈소스 Typesense + Titan Embed Text V2로 전환, 짧은 질문에 약한 벡터 검색은 Hybrid Search(벡터 70% + 키워드 30%)로 보완. 현재 450명 사용, 기존 채널 대비 질문 횟수·업무 시간 외 질문 증가.
내용
사내 슬랙 "문의-무물보" 채널은 1,400명이 모인 회사 생활 전반(업무 프로세스·정책·복지·시설) 질문 공간. 답변자는 People & Culture·회계·IT솔루션 담당자 5명 정도뿐, 답변 대부분은 이미 Confluence "생활백서" 스페이스에 문서로 존재. 담당자가 자리를 비우면 답변이 멈추는 실시간성 부재 + 이미 존재하는 정보를 사람이 반복 전달하는 비효율이 동시에 발생. 작성자는 사내 AI 생산성 프로젝트 촤비스의 컨트리뷰터로 이 문제를 풀기 시작.
선택한 도구는 두 갈래. AWS Bedrock — Claude Sonnet·Amazon Titan 등 파운데이션 모델을 사내 데이터와 결합할 때 프롬프트·응답을 모델 학습에 쓰지 않는 보안 특성으로 채택. Spring AI — @Tool 어노테이션으로 AI가 사용할 도구를 정의하면 모델이 직접 도구 선택. 검색 함수는 결과만 반환하고 최종 답변 생성은 Spring AI + Bedrock이 담당. 본문은 Kendra → Typesense → Hybrid Search 세 단계의 구현 변천 정리.
해결 / 접근
1단계 — AWS Kendra
- Confluence Datasource connector로 API Token + 크롤링 정책만 세팅하면 Crawling·Indexing 자동
- 의미 검색(semantic search) 내장
- @Tool로 KendraSearchTool 정의 — 채널 권한 확인 후 cf_labels="choavis" 필터로 최대 20개 결과 반환
- ChatClient에 SystemMessage(페르소나) + UserMessage(질문) + 채널별 가용 Tool 목록을 주입해 호출
- 결과: 첫날 200명+ 입장, 사용 활발
- 한계: 운영 며칠 만에 월 100만 원+ 비용 발생, 사이드 프로젝트로는 부담
2단계 — Typesense (오픈소스 검색엔진)
- 비용은 사실상 무료, 공식 문서가 버전별 정리돼 도입 장벽 낮음
- Confluence 페이지·첨부파일 메타데이터가 달라 Collection을 둘로 분리 (CONFLUENCE_CONTENT_VECTOR_COLLECTION / CONFLUENCE_ATTACHMENT_VECTOR_COLLECTION)
- 필드: id·title·space_key·page_id·chunk_text·chunk_embedding(1024차원)·web_url 등
- Typesense는 Built-in 임베딩 모델이 없고 Bedrock 미지원 → 직접 임베딩
- Slack 사용량이 적은 밤 12시 스케줄러로 Confluence 크롤링
- Amazon Titan Text Embeddings V2 (1,024차원) 사용
- 한국어 1,024차원 적정 글자수 약 2,000~2,500자 → chunk 2,500자 단위로 분할
- PDF 첨부파일은 Apache PDFBox(PDFTextStripper)로 텍스트 추출 후 동일 벡터화
- 결과: 일반 질문은 양호, 짧은 질문(예: "노트북 신청")에서 답변 품질 저하
- 원인: chunk 2,500자 안에서 "노트북" 같은 핵심 단어의 의미 비중이 희미해짐
3단계 — Hybrid Search
- Kendra GenAI Enterprise가 hybrid search를 사용한다는 점에서 힌트 — vector + keyword를 각자 점수로 매기고 종합 순위 결정
- Typesense도 hybrid 지원, 기본 비율 Vector 70% / Keyword 30% (조정 가능)
- @Tool 안에서 사용자 질문에서 키워드 2~3개 추출 → q에 키워드, queryBy에 title·chunk_text, vectorQuery에 임베딩 동시 사용
- 키워드 추출 프롬프트 핵심
- 고유명사·시스템명·서비스명 우선
- 조사·어미·의문사 제외
- "한글로 입력된 단어는 한글 그대로, 영어로 입력된 단어는 영어 그대로 유지. 절대 번역·변환 금지"
- 복합어는 의미 단위 띄어쓰기, 단일 고유명사·전문용어는 붙여쓰기
- 명시적 프롬프트가 필요했던 이유: "로아이"(law.ai) 같은 솔루션명을 LOAI·ROAI 같이 임의 번역하는 사례 발생, 사용자가 영어/한글로 쓴 의도를 보존
- 검색 결과 page·attachment 합쳐 최대 25개로 제한, AI가 종합해 최종 답변 생성
결과 / 참고
- 현재 약 450명이 사용
- 기존 채널 대비 질문 횟수 증가, 업무 시간 외 질문도 늘어 정보 접근 장벽이 낮아짐
- 비용: Kendra 월 100만 원+ → Typesense 사실상 무료
- 임베딩: Amazon Titan Text Embeddings V2 1,024차원, chunk 2,500자
- 짧은 질문 대응: 벡터 단독 검색 미흡 → Hybrid Search 도입으로 단어 나열형 질문도 처리 가능
- 작성자: 무신사 글로벌 개발 하수종, 사내 프로젝트 촤비스(choavis) 컨트리뷰터
- 출처: 무신사 테크 (Medium)