PDF 기반 로컬 RAG 앱 개발, 완전 오프라인 구동
Built a local RAG app that answers questions from your own PDFs, fully offline
핵심 요약
Ollama, ChromaDB, Flask를 사용하여 외부 API 호출 없이 로컬에서만 작동하는 PDF 질의응답 RAG 앱을 개발함.
- 로컬 RAG 구현 — Ollama와 ChromaDB를 활용해 외부 데이터 없이 PDF 내용만으로 답변함
- 기술 스택 구성 — Flask를 백엔드로 사용하고 임베딩과 벡터 저장소를 로컬에서 처리함
- 데이터 처리 방식 — 문장 끊김 방지를 위해 PDF를 중첩 청크로 분할하여 저장함
- 오프라인 작동 검증 — 와이파이를 끄고 테스트해도 모델이 정확히 답변함을 확인함
오랫동안 만들고 싶었던 건데, 드디어 시간을 내서 완성했습니다. PDF를 업로드하면 청크로 나누고 임베딩한 뒤, 모델의 학습 데이터가 아닌 해당 문서에서만 답변을 추출해 질문할 수 있는 Flask 앱입니다.
스택은 꽤 간단합니다: 채팅 모델과 임베딩 모델은 Ollama, 벡터 저장소는 ChromaDB, 그리고 이들을 연결하는 Flask를 사용했습니다. 특별한 건 없습니다.
대략적인 작동 방식은 다음과 같습니다:
- PDF를 중첩된 청크로 분할하여 문장이 조각 사이에서 잘리지 않도록 함
- 각 청크를 임베딩으로 변환하여 Chroma의 PersistentClient에 저장, 앱을 재시작해도 데이터가 사라지지 않고 디스크에 보존됨
- 질문을 하면 질문도 임베딩되고, Chroma가 가장 유사한 청크를 찾아 모델에 컨텍스트로 전달함
- 프롬프트에 모델이 해당 컨텍스트만 사용하도록 명시하고, 답변이 없으면 모른다고 답하게 함. 그렇지 않으면 모델이 자신의 기억을 바탕으로 지어낼 수 있음
PDF에 없는 내용을 질문해서 테스트해 봤는데, 추측하지 않고 올바르게 모른다고 답변했습니다. 와이파이를 끄고도 테스트해 봤는데, 모델과 임베딩, 벡터 저장소가 모두 로컬에서 실행되고 루프 내에 외부 API 호출이 없기 때문에 계속 잘 작동했습니다.


