RAG 기반 문서 검색 시스템 - 정리

2025. 7. 23. 14:07·사이드 프로젝트

 

개요

RAG 기반 문서 검색 시스템을 개발하며 현재까지 진행된 기능을 정의하고 추가적으로 개발하야 할 기능등에 대해서 정리하고자 한다. 본 글은 프론트엔드 + 백엔드의 기능이 전부 구현된 기능들만을 정의한다. 

화면정리

1. 로그인 및 회원가입

로그인 및 회원가입 화면

 라이브러리

  • 백엔드 : python-jose (JWT), passlib[bcrypt] (비밀번호 해싱), httpx (OAuth)
  • 프론트엔드: React Context API (상태 관리), Next.js Router

인증방식

  • 일반 로그인: 이메일/비밀번호 → JWT 토큰 발급
  • 소셜 로그인: Google/GitHub OAuth2.0 → 자동 회원가입 + JWT 토큰

보안기능

  • 비밀번호: bcrypt 해싱
  • 토큰: Access Token (30분) + Refresh Token (7일)
  • 권한: viewer/editor/admin 역할 기반

프로세스

  • 로그인 → JWT 토큰 생성 → localStorage 저장
  • API 요청 시 Authorization 헤더에 토큰 포함
  • 토큰 만료 시 Refresh Token으로 자동 갱신

특징

  • 하이브리드 인증 (일반 + 소셜)
  • 자동 회원가입 (소셜 로그인)
  • 역할 기반 권한 관리
  • 안전한 토큰 관리

2. 문서 등록 화면

문서(PDF,TXT 파일 등록화면)

라이브러리

  • 백엔드: PyPDF2 (PDF 파싱),  sentence-transformers (로컬 임베딩), openai (임베딩), pymilvus (벡터 DB)
  • 프론트엔드: XMLHttpRequest (업로드 진행률), FormData (파일 전송)
  • 추가예정 : python-docx (DOCX 파싱) - 현재 추가되어있으나 DOCX 인식률의 문제로 고도화 예정

보안기능

  • 파일 검증: 확장자, 크기 검사(바이러스 검사 추가 예정)
  • 권한 확인: JWT 토큰 기반 사용자 인증
  • 에러 처리: 실패 시 자동 정리 (DB 삭제, 파일 삭제)

프로세스

  • 프론트엔드 파일 검증 : 파일 크기 검증, MIME 타입 검증
  • 백엔드 파일검증 : 파일유무, 확장자, 크기, 텍스트 추출 가능성 검증(바이러스 검사 추가 예정)
  • 텍스트 추출 : PDF/TXT에서 텍스트 파싱(DOCX 보완 예정)
  • 청킹 : 512 토큰 단위로 텍스트 분할
  • 임베딩 : 모드에 따라 OpenAI 또는 로컬 모델로 벡터 생성(OpenAI 의 경우 1536차원 -> 768차원 변환)
  • 저장 : PostgreSQL(메타데이터) + Milvus(벡터) + 로컬 파일 시스템

특징

  • 하이브리드 임베딩: OpenAI + 로컬 모델 지원
  • 실시간 피드백: 업로드 진행률 및 상태 표시
  • 자동 정리: 실패 시 리소스 정리

3. 이미지 등록 화면

OCR 처리 및 저장 화면

 라이브러리

  • 백엔드: pytesseract (OCR 엔진), PIL/Pillow (이미지 처리), sentence-transformers (임베딩), boto3 (MinIO 저장)
  • 프론트엔드: FormData (파일 전송), XMLHttpRequest (진행률 모니터링)
  • 보안 테스트: 파일 검증, 용량 제한, 민감 정보 마스킹 기능 적용

지원 파일 형식

  • 이미지: PNG, JPG, JPEG, TIFF, BMP, GIF (최대 50MB)
  • OCR 언어: 한국어(kor), 영어(eng), 일본어(jpn), 중국어(chi_sim)

보안기능

  • 파일 검증: 확장자/크기 검사
  • 권한 확인: JWT 토큰 기반 사용자 인증
  • 자동 정리: 실패 시 리소스 정리

프로세스

  • 파일 검증: 형식/크기 검사
  • 이미지 전처리: PIL로 이미지 로드 및 최적화
  • Tesseract OCR: 다국어 텍스트 추출
  • 텍스트 파싱: 문장 분리, 신뢰도 필터링
  • 임베딩 생성: 추출된 텍스트 벡터화
  • 저장: PostgreSQL + Milvus + MinIO

특징

  • 다국어 OCR: 한국어, 영어, 일본어, 중국어 지원
  • 신뢰도 기반 필터링: 낮은 신뢰도 텍스트 자동 제외
  • 문서 변환: OCR 결과를 검색 가능한 문서로 저장
  • 단계별 처리: OCR 결과 확인 이후 문서로 저장여부 선택

4. 문서조회 화면

문서 선택 이후 조회결과화면

라이브러리

  • 백엔드: sentence-transformers (로컬 임베딩), openai (임베딩), pymilvus (벡터 DB), Pydantic (요청 데이터 검증)

보안기능

  • 접근 제어: 사용자별 문서만 조회 가능
  • 권한 확인: JWT 토큰 기반 사용자 인증
  • 입력 검증: 요청 데이터 검증

프로세스

  • 질문 입력: 사용자가 자연어 질문 입력
  • 질문 임베딩: OpenAI 또는 로컬 모델로 벡터화 (768차원으로 정규화)
  • 벡터 검색: Milvus에서 유사한 문서 청크 검색 (Top-5)
  • 컨텍스트 구성: 검색된 문서 청크들을 프롬프트에 포함
  • LLM 답변: GPT-4o 또는 로컬 LLM으로 근거 기반 답변 생성
  • 결과 반환: 답변, 근거, 신뢰도, 처리 시간 반환

특징

  • 하이브리드 임베딩: OpenAI + 로컬 모델 지원
  • 근거 기반 답변: 관련 문서 청크 하이라이트 포함
  • 실시간 검색: 평균 3초 이내 응답
  • 신뢰도 표시: 답변의 확신도 및 불확실성 경고
  • 캐싱 시스템: 동일 질문에 대한 빠른 응답

용어 정리

용어 설명
JWT (JSON Web Token) 사용자 인증 및 권한 확인을 위해 사용되는 토큰 방식. Access Token과 Refresh Token으로 구성됨
bcrypt 비밀번호를 안전하게 저장하기 위한 해싱 알고리즘
OAuth2.0 소셜 로그인 인증 방식. Google, GitHub 등의 외부 계정을 활용해 인증 수행
PyPDF2 PDF 파일에서 텍스트를 추출하기 위한 파이썬 라이브러리
sentence-transformers 텍스트를 벡터로 변환하는 데 사용되는 임베딩 라이브러리
openai GPT 모델을 호출하여 임베딩 또는 질문 응답을 처리하는 API 클라이언트
pymilvus Milvus 벡터 DB와 상호작용하기 위한 파이썬 클라이언트
Milvus 대규모 벡터 검색을 위한 오픈소스 벡터 데이터베이스
FormData HTML5에서 파일이나 폼 데이터를 서버로 전송하기 위한 객체
XMLHttpRequest 브라우저에서 비동기 요청을 보내기 위한 JavaScript API
pytesseract Tesseract OCR 엔진을 파이썬에서 사용할 수 있도록 하는 래퍼 라이브러리
PIL/Pillow 파이썬에서 이미지 처리를 위한 라이브러리
OCR 이미지에서 문자 정보를 추출하는 기술 (Optical Character Recognition)
청킹 (Chunking) 텍스트를 일정 단위로 나눠 처리하는 기법. RAG에서는 주로 512 토큰 단위로 분할
벡터 임베딩 문장이나 문서를 수치화하여 벡터 형태로 표현하는 방식
RAG (Retrieval-Augmented Generation) 문서 검색 결과를 LLM에 프롬프트로 넣어 답변을 생성하는 구조
LLM GPT와 같은 대형 언어 모델 (Large Language Model)
하이브리드 임베딩 로컬 임베딩 모델과 OpenAI API를 혼용하여 처리 성능과 비용을 균형있게 관리하는 방식
신뢰도 점수 LLM 응답의 정확성 또는 근거 문서의 일치도를 나타내는 수치
캐시 이전 질문 결과를 저장해 반복 질문에 대해 빠르게 응답하는 방식
JWT 기반 권한 토큰 내 역할 정보(viewer/editor/admin 등)를 기반으로 API 접근을 제어하는 방식

마무리

아무래도 바이브코딩으로 생소한 기술과 라이브러리들을 활용하여 개발하다보니 잘 모르는 개념도 많았고 어떻게 프로젝트가 진행되는지 파악하고 공부하고 정리하는데에 시간이 오래 걸렸던 것 같다. 1차로 결과물이 나왔지만 이미 개발된 것 중에서도 공부해야 할 것이 많다. 또한 앞으로도 개선해나가고 고도화해야 할 기능들이 있다. 우선 바이브코딩을 할 때 어떤 부분을 신경써야 하는지, 어떤부분에서 자주 틀리고 문제가 있으며 어떻게 Rule 을 작성하고 보완해야 하는지를 배울 수 있었던 프로젝트 인 것 같다. 

'사이드 프로젝트' 카테고리의 다른 글

RAG 기반 문서 검색 시스템 - 13(복합 질문 및 문서 요약 기능 구현)  (1) 2025.07.23
RAG 기반 문서 검색 시스템 - 12(OCR 기반 문서 자동 텍스트 인식 및 저장 기능 구현)  (0) 2025.07.23
RAG 기반 문서 검색 시스템 - 11(문서 분류 및 권한 기반 접근 제어 구현)  (0) 2025.07.23
RAG 기반 문서 검색 시스템 - 10(문서 메타데이터 및 버전 관리 기능 구현)  (1) 2025.07.23
RAG 기반 문서 검색 시스템 - 9(근거 문장 UI 콜랩스/확장 구현)  (3) 2025.07.22
'사이드 프로젝트' 카테고리의 다른 글
  • RAG 기반 문서 검색 시스템 - 13(복합 질문 및 문서 요약 기능 구현)
  • RAG 기반 문서 검색 시스템 - 12(OCR 기반 문서 자동 텍스트 인식 및 저장 기능 구현)
  • RAG 기반 문서 검색 시스템 - 11(문서 분류 및 권한 기반 접근 제어 구현)
  • RAG 기반 문서 검색 시스템 - 10(문서 메타데이터 및 버전 관리 기능 구현)
moo-n
moo-n
개발관련 기록 블로그
  • moo-n
    moo-n 님의 블로그
    moo-n
  • 전체
    오늘
    어제
    • 분류 전체보기 (48)
      • Cursor AI 교육관련 (4)
      • Cursor AI 사용하기(JAVA) (3)
      • Cursor AI 사용하기(C#) (1)
      • MCP 사용하기 (2)
      • IT 관련 정리 (15)
      • 사이드 프로젝트 (15)
      • 장애대응 매뉴얼 (3)
      • 업무관련 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    notion
    임베딩
    에이전트
    conTeXt
    Claude
    Agent
    Cursor
    C#
    OCR
    LLM
    Rag
    Chunk
    nextjs
    oracleClient
    포트포워딩
    청킹
    방화벽
    claude code
    vb6.0
    바이브코딩
    SVN
    벡터db
    ClaudeCode
    AI
    notion mcp
    mcp
    Chunking
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
moo-n
RAG 기반 문서 검색 시스템 - 정리
상단으로

티스토리툴바