수출 문서 자동화 · 오프라인 RAG 챗봇
프로젝트 10

수출 문서 자동화 · 오프라인 RAG 챗봇

2026.07

대표 프로젝트

먼저 볼 핵심

회사 양식에 값을 채워 수출 서류 생성

폐쇄망에서 도는 문서 자동화와 RAG 챗봇을 6인 팀 총괄로 개발했습니다.

화장품 제조사가 의뢰한 기업 연계 과제. 사내 PC에서 인터넷 없이 동작하며, 회사가 제공한 수출·GMP 양식에 제품 데이터를 자동 기입해 Excel·PDF로 출력합니다. 6인 팀에서 개발 총괄과 문서 파싱 모듈을 맡았습니다.

문제

규정 문서 1건을 승인할 때마다 쌓인 전체 문서를 처음부터 다시 청크·임베딩해, 문서가 늘수록 승인 1건에 걸리는 시간이 계속 증가했습니다.

내 역할

  • 개발 총괄과 전체 일정 관리
  • 문서 파싱 모듈 개발
  • 데이터 수신 이후 정제·벡터화·검색·문서 생성 전 과정

확인 결과

  • 6인 팀에서 개발 총괄
  • 재인덱싱 13.4초 → 0.031초
  • 백엔드 테스트 212개 작성

내 역할 · 규모

  • 개발 총괄과 전체 일정 관리
  • 문서 파싱 모듈 개발
  • 데이터 수신 이후 정제·벡터화·검색·문서 생성 전 과정

기술 스택

PythonFastAPIReactSQLitesqlite-vecPostgreSQLpgvectorLlamaIndex로컬 GGUF LLMbge-m3PaddleOCRpytest

문제 · 해결 · 결과

핵심 성과

  • 6인 팀에서 개발 총괄
  • 재인덱싱 13.4초 → 0.031초
  • 백엔드 테스트 212개 작성

문제

규정 문서 1건을 승인할 때마다 쌓인 전체 문서를 처음부터 다시 청크·임베딩해, 문서가 늘수록 승인 1건에 걸리는 시간이 계속 증가했습니다.

해결

인덱스 생성 함수가 전량 재생성 구조였습니다. 문서 단위 upsert와 단건 재인덱싱 함수를 신설해 승인된 문서 1건만 다시 처리하도록 교체했습니다.

결과

누적 문서 142건(청크 800개) 기준 13.4초에서 0.031초로 줄었고, 문서 수와 무관하게 일정한 처리 시간을 확보했습니다. 소요 시간은 해당 문서의 길이에만 비례합니다.

설계 / 문서

아키텍처

폐쇄망 제약에 맞춰 벡터DB 서버 대신 SQLite 한 파일에 관계형 데이터와 벡터를 함께 저장했습니다. 수치는 코드가 DB에서 가져오고 LLM은 문장만 작성하도록 나눠 환각을 구조로 차단했습니다.

트러블슈팅

  • Windows에서만 서버가 죽던 문제 · 폴더명에 쓰인 금지 문자 하나가 원인이었고, DB 키로 쓰이는 값은 건드리지 않고 경로 정리 규칙만 수정했습니다.
  • 팀원 파서 정확도를 20개 샘플로 직접 측정 · 원인 3가지를 찾아 검증 로직을 일반화하고 추출값이 전부 원문에 있는지 대조했습니다.

검증 / 운영 기록

보안 체크

회사 실데이터는 저장소에 올리지 않았고, 화면 캡처의 회사 식별 정보는 가림 처리했습니다. 회사명·제품명·실측값은 공개하지 않습니다.

주요 기능

회사 원본 양식에 값만 채워 Excel·PDF 출력
대화형 국가별 서류 생성 (제품·국가 인식 후 묶음 출력)
docx·xlsx·PDF·hwp·이미지 OCR 다형식 문서 파싱
문장 단위 청킹과 로컬 임베딩 기반 하이브리드 검색
생성 결과를 JSON으로 내보내 수정 후 재생성
규정 자동 수집 후 관리자 승인 시에만 반영
Windows 오프라인 배포 자동화

문제 해결 과정

문제 상황

승인할수록 재인덱싱이 느려짐 (10건 2.9초 / 100건 5.4초 / 142건 13.4초)

해결 과정

전량 재생성 대신 문서 단위 증분 재인덱싱으로 교체

결과: 조건별 5회 중앙값 재측정에서 0.030~0.031초로 일정

프로젝트에서 배운 것

01

폐쇄망 제약이 아키텍처 선택을 결정한다

02

전량 재생성 구조는 데이터가 쌓이면 반드시 병목이 된다

03

수치는 코드가, 문장은 LLM이 담당해야 환각을 막을 수 있다

04

OS별 배포 차이는 문자 하나에서도 발생한다

스크린샷