문서 QA 시스템 프로젝트
사내 문서나 PDF 파일의 내용을 기반으로 질문에 답변하는 시스템을 구축하는 프로젝트입니다. 문서 로딩부터 청크 분할, 임베딩 생성, 벡터 저장소 구축, 검색 기반 질의응답, Gradio UI 배포까지 전체 파이프라인을 경험합니다.이 프로젝트는 RAG(Retrieval-Augmented Generation) 탭의 미리보기입니다. RAG의 핵심 개념을 체험하는 데 초점을 맞추며, 고급 검색 전략(Hybrid Search, Reranking 등)은 RAG 탭에서 심화 학습합니다.
사전 준비
실습
청크 분할 (Chunking)
긴 문서를 적절한 크기의 청크로 분할합니다. 의미 단위를 유지하면서 분할하는 것이 중요합니다.청크 파라미터 가이드:
| 파라미터 | 권장 값 | 설명 |
|---|---|---|
chunk_size | 200~500자 | 임베딩 모델의 입력 제한 고려 |
chunk_overlap | chunk_size의 10~20% | 문맥 연속성 유지 |
separators | 단락 → 문장 → 단어 | 의미 단위 분할 우선 |
임베딩 생성
각 청크를 벡터(임베딩)로 변환합니다. 이 벡터가 의미적 유사도 검색의 기반이 됩니다.임베딩 모델 비교:
| 모델 | 차원 | 가격 (1M 토큰) | 성능 | 용도 |
|---|---|---|---|---|
text-embedding-3-small | 1536 | $0.02 | 양호 | 일반적인 검색, 분류 |
text-embedding-3-large | 3072 | $0.13 | 우수 | 높은 정밀도 요구 |
벡터 저장 (ChromaDB)
생성된 임베딩을 ChromaDB에 저장하여 빠른 유사도 검색이 가능하도록 합니다.
ChromaDB는 로컬 환경에서 간편하게 사용할 수 있는 벡터 데이터베이스입니다. 프로덕션 환경에서는 Milvus, Pinecone, Weaviate 등의 관리형 벡터 DB를 고려하세요. 자세한 내용은 RAG 탭에서 다룹니다.
트러블슈팅
ChromaDB에서 'sqlite3.OperationalError' 발생
ChromaDB에서 'sqlite3.OperationalError' 발생
Python 내장 sqlite3 버전이 낮을 때 발생합니다.그리고
chromadb import 전에 다음 코드를 추가하세요:PDF에서 텍스트가 추출되지 않습니다
PDF에서 텍스트가 추출되지 않습니다
이미지 기반 PDF(스캔 문서)는 텍스트 추출이 되지 않습니다.
- OCR이 필요한 경우
pytesseract와pdf2image를 사용하세요 unstructured라이브러리가 다양한 문서 형식을 지원합니다:
검색 결과의 품질이 낮습니다
검색 결과의 품질이 낮습니다
chunk_size를 조절해 보세요 (너무 크면 노이즈, 너무 작으면 문맥 부족)chunk_overlap을 늘려 문맥 연속성을 개선하세요k값을 늘려 더 많은 문서를 검색하세요- 임베딩 모델을
text-embedding-3-large로 변경하세요 - 쿼리를 구체적으로 작성하도록 사용자에게 안내하세요
LLM이 문서에 없는 내용을 답변합니다
LLM이 문서에 없는 내용을 답변합니다
환각(Hallucination) 문제입니다.
temperature를 0.0~0.3으로 낮추세요- 시스템 프롬프트에 “문서에 없는 정보는 답하지 마세요”를 강조하세요
- 검색된 문맥이 질문과 관련 있는지 유사도 점수 임계값을 설정하세요
- 환각 검증 파이프라인을 추가하세요 (안전장치 참고)

