티스토리 뷰

LLM

업무 관리 시스템 RAG 챗봇

넷오빠 2025. 7. 25. 08:59

RAG 기능 아키텍처 설계서

프로젝트명: 업무 관리 시스템 RAG 챗봇
목적: Streamlit 기반의 웹 인터페이스를 통해 사용자 업로드 문서(Excel, PDF) 및 자산 데이터를 기반으로 질문에 답변하는 RAG(Retrieval-Augmented Generation) 시스템 구현
작성일: 2025년 7월 25일, 오전 08:57 (KST)


1. 시스템 개요

이 시스템은 LangChain, FAISS, SentenceTransformers(BAAI/bge-m3), 및 OpenAI GPT를 활용하여 사용자 문서와 자산 데이터를 벡터화하고, 이를 기반으로 질문에 대한 정확한 답변을 생성하는 RAG 챗봇입니다. Streamlit을 통해 직관적인 UI를 제공하며, 자산 관리 및 업무 학습 기능을 지원합니다.


2. 아키텍처 구성 요소

2.1 프론트엔드

  • 도구: Streamlit
  • 기능:
    • 사용자 인터페이스: 다중 페이지 웹 앱
      • 홈, 자산추가, 자산등록, 자산현황, 데이터 시각화, 백터DB 조회, 업무학습
    • 입력:
      • 문서 업로드(PDF, Excel)
      • 자산 데이터 입력 폼
      • 챗봇 질문 입력
    • 출력:
      • 챗봇 답변
      • 자산 목록
      • 데이터 시각화(Plotly)
      • QR 코드 생성
      • FAISS 데이터 조회
    • 특징:
      • streamlit_chat으로 대화형 UI 구현
      • 다중 컬럼 레이아웃
      • 세션 상태 관리(st.session_state)

2.2 백엔드

  • 도구: Python, LangChain, FAISS, SentenceTransformers, OpenAI API
  • 구성 요소:

2.2.1 문서 처리 및 임베딩

  • 입력 처리:
    • PyPDF2: PDF 텍스트 추출
    • OpenPyXL: Excel 텍스트 추출, 병합 셀 처리
  • 임베딩 모델: BAAI/bge-m3 (SentenceTransformers)
    • 다국어, 다기능, 다중 세분성 지원
    • 최대 입력 토큰: 8192
    • 설정: use_fp16=True로 성능 최적화
  • 텍스트 분할: LangChain RecursiveCharacterTextSplitter
    • 청크 크기: 10,000
    • 오버랩: 1,000

2.2.2 벡터 저장소

  • 도구: FAISS (Facebook AI Similarity Search)
  • 인덱스: IndexFlatL2 (L2 거리 기반 유사도 검색)
  • 저장: 로컬 파일(faiss_index.faiss)로 저장 및 로드
  • 기능: 자산 데이터 및 문서 청크를 벡터화하여 저장, 유사도 검색(similarity_search)

2.2.3 LLM 및 대화 체인

  • LLM: OpenAI gpt-3.5-turbo
    • 인증: 환경 변수 OPENAI_API_KEY
  • LangChain 구성:
    • PromptTemplate: 사용자 질문, 대화 기록, 검색된 컨텍스트를 기반으로 답변 생성
    • ConversationSummaryMemory: 대화 요약 메모리 관리
    • RunnableSequence: 검색(FAISS)과 생성(LLM)을 연결
  • 동작:
    1. 사용자 질문 입력
    2. FAISS에서 관련 문서 검색
    3. LLM으로 문맥 기반 답변 생성

2.2.4 자산 관리

  • 기능:
    • 자산 추가/수정/삭제
    • QR 코드 생성(qrcode 라이브러리)
    • FAISS에 자산 정보 벡터화 및 저장
  • 데이터 구조: 자산번호(필수), 위치, 장비상태, 시리얼, 구분, 모델명, 시스템명, 제조사(선택)

2.3 데이터 흐름

  1. 입력:
    • Streamlit UI를 통해 Excel/PDF 문서 업로드 또는 자산 데이터 입력
    • 문서: PyPDF2/OpenPyXL로 텍스트 추출 → RecursiveCharacterTextSplitter로 청크 분할
    • 자산: 텍스트 포맷팅(ID:{id} | 자산번호:{asset_no} | ...)
  2. 임베딩:
    • BAAI/bge-m3로 텍스트 벡터화(encode, convert_to_tensor=True)
    • FAISS에 벡터 저장(IndexFlatL2)
  3. 검색:
    • 사용자 질문 → BAAI/bge-m3로 질문 임베딩 → FAISS에서 유사도 검색(similarity_search, k=5)
  4. 답변 생성:
    • 검색된 문서와 대화 기록을 PromptTemplate에 입력
    • ChatOpenAI로 답변 생성 → Streamlit UI에 표시
  5. 저장:
    • FAISS 인덱스: faiss_index.faiss 파일
    • 세션 상태: st.session_state로 자산/문서 목록 및 대화 기록 관리

2.4 최적화

  • FAISS: IndexFlatL2로 빠른 검색, 로컬 저장으로 오프라인 지원
  • BAAI/bge-m3: use_fp16=True로 계산 속도 향상, 최대 8192 토큰 지원
  • LangChain: 캐싱 및 모듈화된 체인 설계로 중복 연산 최소화
  • Streamlit: 세션 상태 관리, 비동기 처리(st.rerun)로 반응성 향상

3. 시스템 다이어그램

```plaintext
[사용자]
↓ (Streamlit UI: 문서 업로드, 질문 입력, 자산 입력)
[프론트엔드: Streamlit]
↓ (PyPDF2/OpenPyXL: 텍스트 추출)
[문서 처리: RecursiveCharacterTextSplitter]
↓ (BAAI/bge-m3: 임베딩 생성)
[벡터 저장소: FAISS]
↓ (유사도 검색: similarity_search)
[LangChain: PromptTemplate + ChatOpenAI]
↓ (답변 생성)
[프론트엔드: Streamlit UI 표시]

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/06   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함