"한방식권이 무엇이요?"에 답해주는 카톡봇 만들기 도전기 💬

소개

기존에 만들어본 모바일 카톡봇 시스템을
구청의 실제 정책 환경 및 민원 응답 프로젝트에 적용해보고 싶어서
첫 번째 후속 사례로 도전하게 되었습니다.

“한방식권 정책이 뭐예요?”
“정산은 어떤 시간에 하나요?”
“식권을 분실했는데 다시 받을 수 있나요?”

이런 질문들을 카톡 오픈채팅방에서 실시간으로 안내해주는 Q&A 챗봇을 만들어보자는 목표였어요.

💡 한방식권이란? 바이브 코딩으로 웹앱을 만들었어요~ㅎ(제가 만든것은 아님)

QR 코드 스캐너 - 스크린샷
  • 구청이 시행하는 디지털 식권 정책으로, QR코드 기반 식권을 활용

    • 직원은 식권을 그냥 사용만 하면 되고,

    • 식당은 QR만 스캔하면 자동으로 팀별 사용량 정리가 되며,

    • 점심담당자는 수기 집계나 보고 없이 바로 점심 통계 확인이 가능한 효율적인 시스템입니다.


진행 방법

(1) 사전작업 및 계획 수립 💡

Claude + Codex 병행 전략

  • 우선 문서가 있어야. DB를 만들죠~노트북 lm 활용해서 기존의 자료 넣고 만들라고 했어요

  • Claude에게는 구조 설계를, Codex에게는 구현 가능성과 리스크 점검을 맡기고

  • 각자의 제안을 서로에게 재검토시키는 것을 통해 균형적인 조합 아키텍처 도출

  • 특히 DB 구조, 보안 인증, FTS5 사용 유무 등을 논의하며 최적화

사용 프롬프트

@/c:/Users/user/Documents/KaTokBot/한방 쿠폰 Q&A.md 이문서의 내용을 바탕으로 FastAPi서버에 DB로 내용을 넣어서, CatBot_Multiturn을 통해 질문, 답변에 해당하는 자료를 줄테니, 비슷한 내용를 찾아서 답변을 만드는 로직을 파이선으로 구축하는것을 검토해. 개발은 시작하지 말고 구현계획을 잘 만들자. 우리 환경에 맞게 아키텍처를 만들어라.
컴퓨터 화면에 표시된 한국어 텍스트 스크린샷

최종 결정 요약

항목

Codex 우려

해결책

동시성 잠금

✅ High

WAL 모드 + Reload 시간 분리

스키마 오염

✅ High

화이트리스트 + 명시적 테이블명 검증

백업 전략

✅ Medium

Reload 시 자동 백업

보안 리스크

⚠️ Medium

API 키 인증 포함


(2) 초기 챗봇 및 서버 구성 🧱

  • 휴대폰에 구버전 Google Play 앱 대신 메신저R 최신 APK 직접 설치

  • CatBot_Multiturn.js에 QA context 삽입 기능 추가

  • FastAPI 서버를 GCP VM에 구성

    • /api/qa/reload: Q&A 마크다운 DB 적재

    • /api/qa/search: 사용자 질의 → 유사 Q&A 반환 (FTS5 기반)

(3) RAG 전환 및 운영 고도화 🔁

RAG 방식으로 전환한 이유

  • 키워드 기반 FTS5는 정확도 한계 존재

  • 의미 기반 검색을 위해 sentence-transformers (ko-sbert-sts) 적용

  • 벡터DB로 Chroma 사용 (data/chroma_db)

전환 해결 과정 후 핵심 요약

항목

전환 내용

검색 정확도

FTS5 → ko-sbert-sts 의미 검색 전환

구조 설계

Chroma DB, SIMILARITY_THRESHOLD=0.7 적용

응답 포맷

QA 외 추가/추론 금지, 답변 없을 시 “모르겠습니다” 응답

프롬프트

상위 등수 (top_k=1), temperature=0.2, 히스토리 무시

안정성 확보

numpy==1.26.4, torch-CPU 포함

서버 적용 절차

  1. 가상환경 활성화

source .venv/bin/activate
  1. 서버 재시작

pkill -f "python run.py"
nohup python run.py > output.log 2>&1 &
  1. 벡터 DB 재구축

curl -X POST http://localhost:9000/api/qa/reload \
 -H "X-Api-Key: your admin key"
  1. 검색 테스트

curl -X POST http://localhost:9000/api/qa/search \
 -H "Content-Type: application/json" \
 -d '{"query":"식당 점심 방법","top_k":1}'

특정 환경 모듈 업데이트==vm에서 의존성 설치시 버전 및 용량 한계가 있는 이슈 발생

  • NumPy 에러 해결:

pip uninstall -y numpy && pip install numpy==1.26.4
  • CUDA 크기 업데이트:

pip install --no-cache-dir torch==2.2.2 --index-url https://download.pytorch.org/whl/cpu

운영 팁

  • QA 정확도 조정 원하면 SIMILARITY_THRESHOLD 수정 후 reload

  • 로그 모니터링: tail -f output.log, 오류는 grep -i "error" output.log


결과화면

유사도로만 구현했을때

백터DB로 구현했을때

화살표가 가리키는 한국 웹사이트의 스크린샷

배우며 느낀점들 ✨

  • 다시 말하자면, LLM에게 코드를 물어보는 것보다 “협업 구조를 구성하는 것”이 훨씬 효과적

  • 서버에서 로그기록을 보면서 디버그 하면 좋음

  • RAG 방식의 의미 기반 검색이 실제 사용자 질문에 훨씬 유연하게 대응

  • 작은 프로젝트지만 실무에서 바로 쓸 수 있는 실용적인 시스템 완성


도움 받은 글

카톡봇 스터디~질의응답~!!!!

rag로 넘어가는 과정에서 복받어김현우양재민 님의 도움이 있었습니다.

1
2개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요