PDF GPT Indexer: 로컬에서 동작하는, PDF 문서 인덱싱 및 자연어 질의가 가능한 RAG 프로젝트

PDF GPT Indexer 소개

PDF GPT Indexer는 개인 로컬 환경에서 PDF 문서를 인덱싱하고 자연어로 질의할 수 있는 완전 독립형 RAG(Retrieval-Augmented Generation) 시스템입니다. 이 도구는 외부 API 키나 클라우드 서비스 없이, 모든 처리를 사용자의 로컬 머신에서 직접 수행합니다. AI 모델, 임베딩, 검색 인덱스 모두가 로컬에서 작동하므로 데이터 보안이 중요한 환경에서 유용합니다.

최근 많은 개발자와 연구자들이 다양한 LLM 기반의 PDF 요약 혹은 문서 질의 시스템을 만들고자 하지만, 대부분 HuggingFace, OpenAI, LangChain 등의 외부 API 호출을 포함하는 구조를 사용합니다. 이런 방식은 개인 정보 보호 이슈와 비용 부담, 인터넷 연결 의존성이라는 문제를 동반합니다. 이와 달리 PDF GPT Indexer는 처음 설치 시 인터넷 연결만 요구하며, 이후엔 완전히 오프라인에서도 사용이 가능합니다.

이 프로젝트의 핵심 장점은 오픈소스 기반의 LLM 엔진인 OllamaFAISS 벡터 검색, 그리고 HuggingFace 임베딩 모델을 조합하여, 클라우드 없이도 충분히 강력한 성능을 제공하는 점입니다. 실제로는 로컬 환경에서 LangChain의 텍스트 분할 기능을 사용해 문서를 조각내고, Sentence Transformers를 통해 임베딩한 후, FAISS로 벡터 인덱싱을 수행하여 검색 기반 QA 기능을 구현합니다.

LangChain, LlamaIndex 등과 비교

기존의 RAG 파이프라인 중 가장 널리 알려진 것은 LangChain 기반 워크플로우입니다. 하지만 LangChain은 다양한 외부 서비스와의 통합을 염두에 두고 설계되었기 때문에, 로컬 독립형으로 구성하기에 복잡성이 큽니다. 반면 PDF GPT Indexer는 RAG의 최소 구성 요소에 집중하여 가볍고 단순한 로컬 전용 구조로 설계되었습니다.

LlamaIndex와 비교하면, PDF GPT Indexer는 텍스트 추출 및 벡터 인덱싱이 더욱 직관적이며, Ollama를 통해 LLM을 직접 로컬에서 실행함으로써 의존성이 줄어듭니다. 대신에 복잡한 기능(예: 다양한 노드 타입, 하이브리드 검색 등)은 제공하지 않지만, 단순 문서 QA 환경에서는 충분한 기능을 지원합니다.

PDF GPT Indexer의 주요 구성요소

  • 텍스트 추출: PyMuPDF를 이용해 PDF로부터 텍스트를 추출합니다.
  • 텍스트 분할: LangChain의 RecursiveCharacterTextSplitter를 활용해 문서를 쪼갭니다.
  • 임베딩 생성: HuggingFace Sentence Transformers를 로컬에서 불러와 각 텍스트 청크를 벡터로 변환합니다.
  • 벡터 저장소: FAISS를 이용해 유사도 기반 검색 인덱스를 구성합니다.
  • LLM 응답 생성: Ollama를 통해 로컬에서 LLM을 호출해 답변을 생성합니다.

이 구조 덕분에 대용량 문서를 다루더라도 API 호출 없이 처리 속도와 보안성을 확보할 수 있습니다.

설치 및 사용법

PDF GPT Indexer를 실행하기 위해서는 최소 8GB (16GB 권장) 이상의 RAM, 5GB 이상의 디스크 여유공간이 필요합니다. Python 3.8 이상에서 실행 가능하며, 초기 설치 시에만 인터넷 연결이 필요합니다.

먼저, 프로젝트 저장소를 복제(clone)합니다:

git clone https://github.com/raghavan/pdfgptindexer-offline.git
cd pdfgptindexer-offline

이후, Python 가상환경 생성/활성화 및 의존성을 설치합니다:

# 가상환경 생성
python -m venv venv
# 가상환경 활성화
source venv/bin/activate
# 의존성 설치
pip install -r requirements.txt

ollama가 설치되어 있지 않은 경우 이를 설치합니다. Ollama 공식 사이트에서 설치 파일을 다운로드 후 실행하거나, Linux의 경우 다음과 같은 명령어로 설치 가능합니다:

curl -fsSL https://ollama.com/install.sh | sh

Ollama 설치가 완료되었다면, Ollama를 실행 중인 상태에서 원하는 LLM을 다운로드합니다:

# 작고 빠르게 실행 가능한 Phi3 모델 다운로드
ollama pull phi3

# 크기가 더 크지만 더 나은 성능의 Qwen 2.5 모델 다운로드
ollama pull qwen2.5

이제 .env에서 사용할 임베딩 모델을 설정합니다:

# .env에서 임베딩 모델 설정
EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2  # 빠르고 작은 기본 모델
EMBEDDING_MODEL=intfloat/e5-large-v2                                    # 더 나은 성능의 더 큰 모델

모든 준비가 완료되었습니다. 인덱서(indexer.py)를 사용하여 PDF 문서들을 인덱싱합니다. 다음은 ./pdf 디렉토리로부터 PDF 문서들을 읽어 ./faiss_index 디렉토리에 인덱싱 결과를 생성하는 명령어입니다:

# PDF 인덱싱
python indexer.py ./pdf ./faiss_index

인덱싱이 완료된 후, 인덱싱된 디렉토리에서 질의를 수행할 수 있습니다:

python chatbot.py ./faiss_index

설정 파일 및 고급 설정

.env 파일을 통해 다음과 같은 설정이 가능합니다:

  • OLLAMA_MODEL: phi3, llama3, mistral 등 다양한 로컬 LLM 선택
  • EMBEDDING_MODEL: 다양한 Sentence Transformers 지원
  • TOP_K: 검색 결과로 가져올 문서 청크 수

임베딩 모델을 바꾸는 경우에는 반드시 기존 생성된 인덱스를 삭제하고, 다시 생성해야 합니다:

rm -rf faiss_index && python indexer.py

문제 해결 팁

  • ollama server not responding: ollama serve 명령으로 서버를 시작하세요.
  • Index not found: 인덱스를 먼저 생성하세요.
  • GPU 가속 사용 시: indexer.pychatbot.py 파일 내의 device를 'cuda'로 변경하세요.

라이선스

PDF GPT Indexer 프로젝트는 MIT 라이선스로 공개 및 배포되고 있습니다. 상업적 사용과 수정에 제약이 없습니다.

:github: PDF GPT Indexer 프로젝트 GitHub 저장소




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck:

1개의 좋아요