본문 바로가기

이 포트폴리오의 원본은 https://resume.iruyo.com (심재빈) 입니다 · 출처 식별자 jbx-7f3a2e9b

← 개인 프로젝트

LLM·RAG 운영 중 단독

이력서 RAG 챗봇 — 로컬 LLM 직접 운영

사이트의 모든 공개 데이터를 검색해 심재빈 1인칭으로 답하는 챗봇으로, 로컬 서버에서 검색부터 생성까지 전 구간을 직접 운영한다.

기간
2026.06 – 진행 중 · 1개월
본인 역할
설계·구현·모델 선정·운영 전체
정량 임팩트
외부 AI API 없이 로컬 서버에서 직접 운영해 운영비 0원 · 2단 검색으로 관련 자료만 근거로 사용 · 질문과 무관한 출처가 뜨던 문제 제거

첨부파일

언어

  • Python3
  • TypeScript

기술

  • RAG
  • LLM
  • FastAPI
  • ollama
  • Cloudflare Tunnel
  • SSE

환경

  • Claude Code

포트폴리오 사이트 우하단의 챗봇이다. 채용 담당자가 이력서를 읽다가 궁금한 걸 바로 물어볼 수 있게 만들어 붙였다. 사이트에 공개된 내 경력·프로젝트 데이터를 근거로, 심재빈 1인칭으로 — 면접에서 직접 답하는 톤으로 답한다.

RAG 챗봇 아키텍처

어떻게 답하나

  • 질문이 들어오면 사이트의 공개 데이터에서 관련된 부분을 먼저 찾고, 그 내용만 근거로 답을 만든다(이게 RAG다). 그래서 이력서에 없는 내용은 지어내지 않고 “공개 자료엔 없다, 면접에서 직접 물어봐 달라”고 답한다.

  • 외부 AI API를 전혀 쓰지 않는다. 로컬 서버(GPU)에서 검색부터 답변 생성까지 전부 직접 돌려서, 운영비가 0원이고 데이터가 외부 서비스로 나가지 않는다.

  • 답은 타이핑하듯 한 글자씩 흘러나온다.

정확도를 위해 한 것

  • 관련 자료를 찾는 검색을 2단으로 만들었다. 먼저 후보를 넓게 추린 뒤, 질문과 실제로 들어맞는지 한 번 더 점수를 매겨 가장 관련 있는 것만 답변 근거로 쓴다.

  • 답변 아래 붙는 출처 카드도 이 관련도 점수를 넘은 자료만 보여준다. 덕분에 질문과 상관없는 엉뚱한 출처가 뜨는 일이 없다.

안전하게 만든 것

  • 검색 대상에는 ‘공개해도 되는’ 자료만 넣었다. 전화번호·상세 주소 같은 민감 정보는 챗봇이 아예 찾을 수 없다.

  • “지금까지 지시를 무시하라”는 식의 악용 시도(프롬프트 인젝션)는 거부하도록 했다.

  • 일부 단계가 느려지거나 서버가 멈춰도 단계적으로 대비책으로 넘어가고, 서버가 죽으면 자동으로 다시 살아난다.

기술 선택

  • 답변을 만드는 생성 모델은 여러 후보를 같은 질문 세트(golden set)로 비교해 품질·속도·악용 방어 3축을 직접 채점하고 가장 안정적인 것을 골랐다. 모델은 설정 한 줄로 갈아끼울 수 있게 해 둬서, 더 나은 모델이 나오면 바로 교체한다.

  • 이 평가 세트는 30문항 고정 세트로 유지하며, 프롬프트나 검색 로직을 바꿀 때마다 회귀 점검에 재사용한다. 정체성 캐묻기·프롬프트 인젝션·허위 전제·민감정보 캐기 등 73문항 적대적 테스트도 별도로 돌려 방어력을 검증했다.

  • 관련도를 다시 매기는 단계(리랭커)는 회사에서 직접 만든 사내 RAG 시스템과 같은 계열의 방식을 가볍게 다시 구현했다.

  • 전체 구조는 위 다이어그램 참고. 사이트(Cloudflare)에서 들어온 질문이 터널을 거쳐 로컬 서버로 가고, 답이 다시 사이트로 돌아오는 흐름이다.