Fix README frontmatter: backend entry = app_backend.py (was incorrectly app.py — UI launched instead of backend)
Browse files
README.md
CHANGED
|
@@ -1,266 +1,56 @@
|
|
| 1 |
---
|
| 2 |
-
title: 개인정보보호법
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
sdk_version: "5.20.0"
|
| 8 |
-
app_file:
|
| 9 |
pinned: false
|
| 10 |
-
short_description:
|
| 11 |
hardware: zero-a10g
|
| 12 |
license: mit
|
| 13 |
---
|
| 14 |
|
| 15 |
-
#
|
| 16 |
|
| 17 |
-
|
| 18 |
-
> 법제처 OPEN API + 개인정보보호위원회 상담사례 1,745건을 근거로
|
| 19 |
-
> 작은 모델(Gemma 4 E2B)이 한국어 평문으로 답합니다.
|
| 20 |
|
| 21 |
-
|
| 22 |
-
- **개인정보보호위원회 상담사례** 1,745건 로컬 SQLite FTS5 인덱스
|
| 23 |
-
- **RAG 사전조회** — 룰 라우터로 법조문/사례/PIPC결정/해석례 병렬 fan-out → Gemma는 그 컨텍스트만 보고 답변
|
| 24 |
-
- **모든 답변에 인용 + 면책 자동 부착**
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
## 두 가지 사용 경로
|
| 29 |
-
|
| 30 |
-
### 🤗 한 번 클릭으로 체험 — Hugging Face Spaces 데모
|
| 31 |
-
|
| 32 |
-
배포된 Space 링크에 접속해서 바로 채팅. 별도 설치·키 발급 불필요.
|
| 33 |
-
ZeroGPU(A100) 가속으로 빠른 응답.
|
| 34 |
-
|
| 35 |
-
> Space 가 잠시 휴면(sleep) 상태일 수 있습니다 — 첫 방문 시 wake-up 5–10초 대기.
|
| 36 |
-
|
| 37 |
-
### 💻 노트북에서 직접 돌리기 (권장 — SMB·장기 사용자)
|
| 38 |
-
|
| 39 |
-
GitHub clone → `pip install` → 자기 데이터/키로 운영. 외부 의존 없음 (법제처
|
| 40 |
-
OPEN API 호출 외 모든 것이 로컬). 아래 "사전 조건" 부터 따라가세요.
|
| 41 |
-
|
| 42 |
-
---
|
| 43 |
-
|
| 44 |
-
## 사전 조건
|
| 45 |
-
|
| 46 |
-
- Python **3.11 이상** (Win/Mac/Linux 공통) — 또는 Docker Desktop
|
| 47 |
-
- 8GB 이상 여유 RAM (Gemma 4 E2B Q4_K_M ~3.2GB + KV cache + 백엔드)
|
| 48 |
-
- **법제처 OPEN API 키 (LAW_OC) 무료 발급** — https://open.law.go.kr 가입 후 마이페이지에서 ID(이메일 @ 앞부분) 확인
|
| 49 |
-
|
| 50 |
-
---
|
| 51 |
-
|
| 52 |
-
## 빠른 시작
|
| 53 |
-
|
| 54 |
-
`.env`에 OC 키부터 입력:
|
| 55 |
-
|
| 56 |
-
```bash
|
| 57 |
-
git clone https://github.com/sz1-kca/korean-privacy-ai-assistant
|
| 58 |
-
cd korean-privacy-ai-assistant
|
| 59 |
-
|
| 60 |
-
# Mac/Linux
|
| 61 |
-
cp .env.example .env
|
| 62 |
-
# Windows PowerShell
|
| 63 |
-
copy .env.example .env
|
| 64 |
-
|
| 65 |
-
# 편집기로 .env 열어 LAW_OC=<발급받은_id> 입력
|
| 66 |
-
```
|
| 67 |
-
|
| 68 |
-
이후 두 가지 경로 중 하나.
|
| 69 |
-
|
| 70 |
-
### 경로 A — 네이티브 (권장, Docker 불필요)
|
| 71 |
-
|
| 72 |
-
```bash
|
| 73 |
-
# 의존성 + 패키지 설치
|
| 74 |
-
pip install -e ".[dev,llm]"
|
| 75 |
-
|
| 76 |
-
# (1) 백엔드 — RAG + LLM (FastAPI :8000)
|
| 77 |
-
python -m kpaa serve
|
| 78 |
-
|
| 79 |
-
# (2) 새 터미널에서 Open WebUI (한 번만 설치)
|
| 80 |
-
pip install open-webui
|
| 81 |
-
open-webui serve # http://localhost:8080
|
| 82 |
-
```
|
| 83 |
-
|
| 84 |
-
Open WebUI에서 Settings → Connections → **OpenAI API** → `+ Add Connection`:
|
| 85 |
-
- URL: `http://localhost:8000/v1`
|
| 86 |
-
- Key: `local`
|
| 87 |
-
- 모델 드롭다운에서 **`kpaa-privacy-ko`** 선택
|
| 88 |
-
|
| 89 |
-
첫 `kpaa serve` 실행 시 Gemma 4 E2B GGUF (~3.2GB)을 자동 다운로드합니다 (~5–15분, 한 번만).
|
| 90 |
-
|
| 91 |
-
### 경로 B — Docker Compose
|
| 92 |
-
|
| 93 |
-
```bash
|
| 94 |
-
docker compose up -d
|
| 95 |
-
# → http://localhost:3000 (Open WebUI 자동 연결)
|
| 96 |
-
# 첫 가동 시 backend가 모델 다운로드, 5–15분 소요
|
| 97 |
-
docker compose logs -f backend # 진행 확인
|
| 98 |
-
```
|
| 99 |
-
|
| 100 |
-
`docker-compose.yml`이 Open WebUI에 OpenAI 커넥션을 미리 주입하므로 UI에서 별도 설정 없이 즉시 `kpaa-privacy-ko` 모델로 채팅 가능합니다.
|
| 101 |
-
|
| 102 |
-
---
|
| 103 |
-
|
| 104 |
-
## 🔐 인증 모드 (개인용 vs 다중 사용자)
|
| 105 |
-
|
| 106 |
-
**기본값 — 즉시 사용 모드 (`WEBUI_AUTH=false`).** `manage.sh` / `Dockerfile.ui` / `docker-compose.yml` 모두 이 값을 주입하므로 첫 부팅 시 `admin@localhost`/`admin` 관리자 계정이 자동 생성되어 가입·로그인 화면 없이 바로 채팅 화면이 뜹니다. **개인 PC 로컬 (`127.0.0.1`) 단독 사용 가정**.
|
| 107 |
-
|
| 108 |
-
⚠️ **공용/원격 노출 시 위험**: 이 모드에서는 호스트:포트에 접근 가능한 누구나 admin 권한으로 들어옵니다. LAN/공용 서버로 노출(0.0.0.0 바인딩, 포워딩, 리버스 프록시) 시 반드시 아래 인증 모드로 전환하세요.
|
| 109 |
|
| 110 |
-
**인증 모드 — 본인 이메일/비밀번호 사용.** 환경변수만 바꾸고 재시작:
|
| 111 |
-
|
| 112 |
-
```bash
|
| 113 |
-
# 네이티브 (manage.sh):
|
| 114 |
-
export KPAA_OPENWEBUI_WEBUI_AUTH=true
|
| 115 |
-
./manage.sh restart
|
| 116 |
```
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
| `WEBUI_AUTH=false` (기본) | 0 (즉시 채팅) | 고정 `admin/admin` | 개인 PC 로컬 |
|
| 125 |
-
| `WEBUI_AUTH=true` | 매 세션 로그인 | 자유 | LAN/공용 서버 |
|
| 126 |
-
|
| 127 |
-
---
|
| 128 |
-
|
| 129 |
-
## 사용 예 (CLI)
|
| 130 |
-
|
| 131 |
-
```bash
|
| 132 |
-
# 법제처 SDK 단독 호출 (LLM 없음)
|
| 133 |
-
python -m kpaa law search "개인정보보호법"
|
| 134 |
-
python -m kpaa law text 270351 --jo "24의2"
|
| 135 |
-
python -m kpaa pipc search "동의 철회"
|
| 136 |
-
python -m kpaa expc search "개인정보 수집"
|
| 137 |
-
|
| 138 |
-
# 상담사례 검색 (로컬 SQLite, ms 단위)
|
| 139 |
-
python -m kpaa cases search "병원 환자 동의"
|
| 140 |
-
|
| 141 |
-
# RAG 컨텍스트만 빌드 (LLM 호출 없음, 빠름)
|
| 142 |
-
python -m kpaa retrieve "매장 CCTV 안내문구 어떻게 써요?"
|
| 143 |
-
|
| 144 |
-
# RAG + LLM 종단
|
| 145 |
-
python -m kpaa smoke "매장 CCTV 안내문구 어떻게 써요?"
|
| 146 |
-
|
| 147 |
-
# 상담사례 갱신 (privacy.go.kr 재스크래이프 ~2분)
|
| 148 |
-
python -m kpaa refresh-cases
|
| 149 |
-
python -m kpaa refresh-cases --since 2025-01-01 # 증분
|
| 150 |
```
|
| 151 |
|
| 152 |
-
|
| 153 |
-
|
| 154 |
-
## OS별 주의사항
|
| 155 |
-
|
| 156 |
-
KPAA 는 *장비별 자동 선택* 으로 GPU 가속 여부를 결정합니다.
|
| 157 |
-
사용자가 `KPAA_N_GPU_LAYERS` 를 명시하지 않으면 다음 규칙:
|
| 158 |
|
| 159 |
-
|
|
| 160 |
|---|---|---|
|
| 161 |
-
|
|
| 162 |
-
|
|
| 163 |
-
|
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
- PowerShell 한글 깨짐 방지: `chcp 65001` + `PYTHONUTF8=1` (CLI 진입 시 자동 UTF-8 reconfigure 적용)
|
| 167 |
-
- NVIDIA GPU 사용 시 (CUDA Toolkit 설치 후):
|
| 168 |
-
```powershell
|
| 169 |
-
$env:CMAKE_ARGS = "-DGGML_CUDA=on"
|
| 170 |
-
pip install --force-reinstall --no-cache-dir llama-cpp-python
|
| 171 |
-
```
|
| 172 |
-
재설치 후엔 자동으로 GPU 모드로 동작 (`KPAA_N_GPU_LAYERS` 명시 불필요).
|
| 173 |
|
| 174 |
-
##
|
| 175 |
-
- **기본 CPU 추론** — Gemma 4 E2B Q4_K_M + Metal 조합 segfault 회귀 회피
|
| 176 |
-
(라이브 검증 2026-05-01: `n_gpu_layers=-1` 시 모델 로드 직후 프로세스
|
| 177 |
-
silently die, `n_gpu_layers=12` 시 응답 hang. 안정성 미확정).
|
| 178 |
-
- 노트북 *팬 소음* 이 거슬리면 스레드 수를 더 줄이세요:
|
| 179 |
-
```bash
|
| 180 |
-
KPAA_N_THREADS=4 python -m kpaa serve # 16코어 M3 Max → 4 만 사용
|
| 181 |
-
```
|
| 182 |
-
반대로 빠른 추론을 원하면 늘리거나 (속도 ↑ 발열·소음 ↑):
|
| 183 |
-
```bash
|
| 184 |
-
KPAA_N_THREADS=12 python -m kpaa serve
|
| 185 |
-
```
|
| 186 |
-
- Apple Silicon Metal GPU 가속 *opt-in* (segfault 우려, 자기 책임):
|
| 187 |
-
```bash
|
| 188 |
-
KPAA_N_GPU_LAYERS=-1 python -m kpaa serve
|
| 189 |
-
```
|
| 190 |
-
segfault 등 호환성 이슈가 보이면 변수 제거 (자동 CPU 환원).
|
| 191 |
-
- 정부 사이트 SSL 인증서: `truststore` 가 시스템 신뢰 저장소 자동 사용 (별도 설정 불필요).
|
| 192 |
|
| 193 |
-
### Linux
|
| 194 |
-
- NVIDIA GPU 사용 시:
|
| 195 |
-
```bash
|
| 196 |
-
CMAKE_ARGS="-DGGML_CUDA=on" pip install --force-reinstall --no-cache-dir llama-cpp-python
|
| 197 |
-
```
|
| 198 |
-
재설치 후 자동 감지. `KPAA_N_GPU_LAYERS` 명시 불필요.
|
| 199 |
-
- ROCm: `CMAKE_ARGS="-DGGML_HIPBLAS=on"`, Vulkan: `CMAKE_ARGS="-DGGML_VULKAN=on"` — 동일 패턴.
|
| 200 |
-
|
| 201 |
-
---
|
| 202 |
-
|
| 203 |
-
## 환경변수 (`.env`)
|
| 204 |
-
|
| 205 |
-
| 변수 | 기본 | 설명 |
|
| 206 |
-
|---|---|---|
|
| 207 |
-
| `LAW_OC` | (필수) | 법제처 OPEN API 인증 ID (이메일 @ 앞부분) |
|
| 208 |
-
| `KPAA_N_GPU_LAYERS` | (자동) | GPU offload 레이어 수 — 미지정 시 *플랫폼·빌드 자동 감지* (위 표). 강제 override: `-1`=모두 / `0`=CPU / 정수=일부 |
|
| 209 |
-
| `KPAA_N_THREADS` | (자동) | CPU 추론 스레드 수 — *플랫폼별 자동*: macOS=`cpu/3` (4~6 cap, 노트북 발열·소음 절제), Linux/Win=`cpu/2` (4~8 cap). 빠른 추론 원하면 늘리고 더 조용히 원하면 줄임 |
|
| 210 |
-
| `KPAA_MODEL_DIR` | (자동) | GGUF 캐시 경로 — 미지정 시 `platformdirs.user_cache_dir/kpaa/models` |
|
| 211 |
-
| `KPAA_HOST` / `KPAA_PORT` | `127.0.0.1` / `8000` | FastAPI 바인딩 |
|
| 212 |
-
| `KPAA_LLM_BACKEND` | (자동) | LLM 백엔드 선택 — `llama_cpp`(로컬 GGUF) 또는 `zerogpu`(HF Spaces transformers). 미지정 시 `SPACE_ID` 환경변수로 자동 분기 |
|
| 213 |
-
| `KPAA_HF_MODEL_REPO` | `google/gemma-4-E2B-it` | ZeroGPU 백엔드용 transformers repo |
|
| 214 |
-
| `KPAA_HF_GPU_DURATION` | `120` | `@spaces.GPU` 함수당 GPU 점유 한도(초) |
|
| 215 |
-
| `KPAA_OPENWEBUI_WEBUI_AUTH` | `false` | `true` 로 두면 OpenWebUI 가입/로그인 화면 활성화 (본인 이메일·비밀번호). 자세히는 위 "🔐 인증 모드" |
|
| 216 |
-
|
| 217 |
-
---
|
| 218 |
-
|
| 219 |
-
## 🤗 Hugging Face Spaces 직접 배포하기
|
| 220 |
-
|
| 221 |
-
본 리포는 **HF Spaces 의 Gradio + ZeroGPU 환경에서 그대로 동작**한다.
|
| 222 |
-
저장소를 fork 하거나 자체 Space 에 클론해 자기 도메인으로 운영 가능.
|
| 223 |
-
|
| 224 |
-
### 절차
|
| 225 |
-
1. https://huggingface.co/new-space — Space 생성. SDK = **Gradio**, Hardware = **ZeroGPU** (Pro 무료) 또는 CPU upgrade.
|
| 226 |
-
2. **Persistent Storage** 활성화 (Pro: 20GB 무료) — transformers 모델이 한 번만 받아짐.
|
| 227 |
-
3. **Settings → Variables and secrets**:
|
| 228 |
-
- Secret: `LAW_OC` = 본인 법제처 OPEN API ID
|
| 229 |
-
- Variable: `HF_HOME=/data/.huggingface` (persistent storage 위에 모델 캐시)
|
| 230 |
-
4. 본 리포를 Space 에 push (`git remote add hf https://huggingface.co/spaces/<user>/<space>` → `git push hf main`).
|
| 231 |
-
5. 첫 빌드 10–15분 (torch + transformers + 모델 다운로드). 이후 재시작 즉시 부팅.
|
| 232 |
-
6. 채팅 테스트.
|
| 233 |
-
|
| 234 |
-
### 로컬에서 Gradio UI 미리보기
|
| 235 |
```bash
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
```
|
| 240 |
|
| 241 |
-
##
|
| 242 |
-
|
| 243 |
-
|
| 244 |
-
|---|---|---|---|
|
| 245 |
-
| 로컬 노트북 (장기 사용·SMB) | `python -m kpaa serve` | `llama_cpp` (GGUF, CPU/Metal/CUDA) | FastAPI `/chat` (자체 SSE) 또는 Open WebUI |
|
| 246 |
-
| HF Spaces 데모 (대중 체험) | `python app.py` (자동) | `zerogpu` (transformers + `@spaces.GPU`) | Gradio Blocks |
|
| 247 |
-
| 로컬 Gradio 미리보기 | `KPAA_LLM_BACKEND=llama_cpp python app.py` | `llama_cpp` (강제) | Gradio Blocks |
|
| 248 |
-
|
| 249 |
-
같은 RAG 파이프라인(법제처 호출, 라우팅, 인용·면책 부착) 을 양쪽이 공유.
|
| 250 |
-
|
| 251 |
-
---
|
| 252 |
-
|
| 253 |
-
## 데이터 출처 / 라이선스
|
| 254 |
-
|
| 255 |
-
- **법제처 OPEN API** (https://open.law.go.kr) — 1인 1키 무료. 응답 데이터는 공공누리 표시 후 사용 가능.
|
| 256 |
-
- **개인정보 상담사례** (https://www.privacy.go.kr) — 약 1,745건, 공공누리 제1유형 추정. 본 리포의 [`data/cases.sqlite`](data/cases.sqlite)는 시점 스냅샷이며 갱신은 `kpaa refresh-cases` 또는 월 1회 GitHub Actions 자동 PR.
|
| 257 |
-
- **Gemma 4** — [Gemma Terms of Use](https://ai.google.dev/gemma/terms) + Apache 2.0. GGUF (로컬용): [`bartowski/google_gemma-4-E2B-it-GGUF`](https://huggingface.co/bartowski/google_gemma-4-E2B-it-GGUF). transformers (HF Spaces 용, 같은 가중치): [`google/gemma-4-E2B-it`](https://huggingface.co/google/gemma-4-E2B-it).
|
| 258 |
-
- 본 프로젝트 코드: **MIT** ([LICENSE](LICENSE), [NOTICE](NOTICE))
|
| 259 |
-
|
| 260 |
-
로컬 사용자: 채팅 기록은 Open WebUI 로컬 SQLite 또는 자체 `/chat` UI 의 브라우저 메모리에만. HF Spaces 데모: Gradio 세션 종료 시 휘발. 외부 텔레메트리 없음.
|
| 261 |
-
|
| 262 |
-
---
|
| 263 |
-
|
| 264 |
-
## 면책
|
| 265 |
|
| 266 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: KPAA Backend - 개인정보보호법 RAG 추론 API
|
| 3 |
+
emoji: 🧠
|
| 4 |
+
colorFrom: green
|
| 5 |
+
colorTo: blue
|
| 6 |
sdk: gradio
|
| 7 |
sdk_version: "5.20.0"
|
| 8 |
+
app_file: app_backend.py
|
| 9 |
pinned: false
|
| 10 |
+
short_description: KPAA RAG 추론 백엔드 (OpenAI 호환 API)
|
| 11 |
hardware: zero-a10g
|
| 12 |
license: mit
|
| 13 |
---
|
| 14 |
|
| 15 |
+
# KPAA Backend
|
| 16 |
|
| 17 |
+
한국 개인정보보호법 RAG 백엔드. **OpenAI 호환 API**를 노출합니다.
|
|
|
|
|
|
|
| 18 |
|
| 19 |
+
이 Space는 **추론 백엔드 전용**입니다. UI는 별도 Space([scvcoder/korean-privacy-ai-assistant](https://huggingface.co/spaces/scvcoder/korean-privacy-ai-assistant))에서 Open WebUI로 제공됩니다.
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
+
## 아키텍처
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
```
|
| 24 |
+
사용자 브라우저
|
| 25 |
+
↓ (UI 접속)
|
| 26 |
+
[Open WebUI Space]
|
| 27 |
+
↓ (OpenAI API 호출)
|
| 28 |
+
[이 Space — KPAA Backend]
|
| 29 |
+
↓ (RAG 검색 + Gemma 4 추론)
|
| 30 |
+
법제처 OPEN API + 상담사례 SQLite + ZeroGPU
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
```
|
| 32 |
|
| 33 |
+
## Endpoints
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
|
| 35 |
+
| Method | Path | 설명 |
|
| 36 |
|---|---|---|
|
| 37 |
+
| POST | `/v1/chat/completions` | OpenAI 호환 chat (`stream=true` 지원) |
|
| 38 |
+
| GET | `/v1/models` | 사용 가능 모델 (`kpaa-privacy-ko`) |
|
| 39 |
+
| GET | `/healthz` | liveness check |
|
| 40 |
+
| GET | `/info` | 상세 정보 + Swagger UI |
|
| 41 |
+
| GET | `/gradio` | Gradio 상태 페이지 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
|
| 43 |
+
## Open WebUI 연결 (UI Space에서 자동 설정)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
```bash
|
| 46 |
+
OPENAI_API_BASE_URL=https://scvcoder-kpaa.hf.space/v1
|
| 47 |
+
OPENAI_API_KEY=any-value
|
| 48 |
+
DEFAULT_MODELS=kpaa-privacy-ko
|
| 49 |
```
|
| 50 |
|
| 51 |
+
## Secrets / Hardware
|
| 52 |
+
- **Secret** `LAW_OC` — 법제처 OPEN API ID (필수)
|
| 53 |
+
- **Hardware** ZeroGPU (zero-a10g) — Pro 무료
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
|
| 55 |
+
## 라이선스
|
| 56 |
+
MIT (코드) · 답변 데이터는 PIPC/privacy.go.kr 출처표시
|