[build-system] requires = ["hatchling>=1.21"] build-backend = "hatchling.build" [project] name = "korean-privacy-ai-assistant" version = "0.1.0" description = "Korean Privacy Law (개인정보보호법) consultation chatbot for individuals, SMBs, and small clinics" readme = "README.md" license = "MIT" requires-python = ">=3.11" keywords = ["korean-law", "privacy", "개인정보보호법", "rag", "chatbot", "gemma"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: End Users/Desktop", "License :: OSI Approved :: MIT License", "Natural Language :: Korean", "Operating System :: OS Independent", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", ] dependencies = [ "httpx[http2]>=0.27", "pydantic>=2.6", "pydantic-settings>=2.2", "lxml>=5", "diskcache>=5.6", "tenacity>=8", "platformdirs>=4", "fastapi>=0.110", "uvicorn[standard]>=0.27", "python-dotenv>=1", "pyyaml>=6", "huggingface-hub>=0.23", "tqdm>=4.66", "sse-starlette>=2.1", "truststore>=0.10", ] [project.optional-dependencies] llm = ["llama-cpp-python>=0.3"] # HF Spaces (ZeroGPU) 데모 배포용 — 같은 가중치 `google/gemma-4-E2B-it` 를 # transformers + @spaces.GPU 로 돌린다. 로컬 사용자는 설치 불필요. hf = [ "gradio>=5.0", "transformers>=4.45", "torch>=2.4", "accelerate>=0.34", "spaces>=0.30", ] # Hybrid retrieval (BM25 + Dense) + Cross-encoder reranker. # - BGE-M3 임베딩 (1024 dim) + bge-reranker-v2-m3 로 한국어 SOTA급. # - sqlite-vec 로 별도 벡터 DB 서버 없이 임베디드 검색 (data/embeddings.sqlite). # - 노트북·HF Space 양쪽에서 동일 동작. BM25만 쓰는 사용자는 설치 불필요. rag = [ "sentence-transformers>=3.0", "sqlite-vec>=0.1.6", "torch>=2.4", # 주의: python 의 sqlite3 가 extension loading 활성으로 빌드되어 있어야 한다. # macOS python.org 인스톨러 빌드는 비활성 — Homebrew/conda/pyenv-from-source 의 # python 으로 venv 를 만들면 활성. .venv 생성 시 `which python3` 가 # /opt/homebrew/bin/python3 같은 것을 가리키는지 확인. ] # 빌드 타임 docling 의존성 — 두 용도가 같은 패키지 셋을 공유: # 1) PIPC 결정문 별지(이미지) → markdown OCR. 옵트인: # pip install -e ".[pipc-ocr]" # export KPAA_PIPC_OCR=1 # EasyOCR 한국어 모델로 한글 별지 정확도 ↑ (docling 기본 ocrmac 대비). # 2) `kpaa extract-guide` (안내서 PDF → markdown). born-digital 이라 OCR 없이 # 텍스트 직접 추출 → easyocr 가중치 다운로드는 발생하지 않음. 이후 청킹은 # 사용자 + Claude 인터랙티브 큐레이션 → `data/guide/chunks/*.jsonl`. # 런타임(검색·답변)은 sqlite3 만 필요 — 일반 사용자는 이 extra 설치 불필요. pipc-ocr = ["docling>=2.0", "easyocr>=1.7"] dev = [ "pytest>=8", "pytest-asyncio>=0.23", "vcrpy>=6", "ruff>=0.4", "invoke>=2.2", ] [project.scripts] kpaa = "kpaa.cli:main" [project.urls] Homepage = "https://github.com/sz1-kca/korean-privacy-ai-assistant" Issues = "https://github.com/sz1-kca/korean-privacy-ai-assistant/issues" [tool.hatch.build.targets.wheel] packages = ["src/kpaa"] [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "W", "I", "B", "UP"] ignore = ["E501"] # SIM 룰은 가독성 호불호가 갈려서 select에서 제외 (한국어 분기 코드 가독성 우선) [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"]