한국 법령·판례·자율규약을 자연어로 물어보는 RAG 기반 챗봇. Ouroboros 패턴(사실관계 수렴 후 분석) + 6체인 문서 검토 + 인용 검증 루프.
📊 프로젝트 포트폴리오 보기 ← 디자인·아키텍처 시각화
| Layer | Stack |
|---|---|
| Web | Next.js 15 (App Router) |
| API | FastAPI on Cloud Run |
| LLM | Google Gemini (via google-genai) |
| Search | SQLite + 자체 임베딩 매트릭스 (벡터 + lexical + exact) |
| Data | 법령(법제처 DRF API) + 판례(국가법령정보 공동활용) + 자율규약 |
- Ouroboros 모드 (대화형) — 질문이 들어오면 모델이 사실관계 충분성부터 판단. 부족하면 객관식 후속질문, 충분하면 RAG → 구조화 분석.
- 전문 분석 모드 (문서 검토) — 계약서·약관 입력 시 6단계 체인: 전체 스캔 → 외부 제도 프레임 매핑 → 축별 RAG → 조항 검토 → 병렬 분석(목적-수단·제도·리스크) → verdict.
- 인용 검증 루프 — LLM이 단 인용을 검색 hit과 대조해, 존재하지 않는 인용은 응답에서 제거.
- 3종 데이터 동일 풀 — 법령 + 판례 + 자율규약을 같은 벡터 공간에. 도메인 분기 코드 0건.
apps/
api/ FastAPI entrypoint (apps/api/main.py)
web/ Next.js web app
worker/ Data ingest wrapper
packages/
python/ parser, ingest, retrieval, chat orchestration
data/
sample/ Sample markdown laws for quick start
migrations/ SQL schema migrations
docs/ Portfolio (GitHub Pages)
scripts/ Ingest, collect, deploy helpers
본 저장소에는 시크릿·운영 데이터가 포함되지 않습니다. 직접 발급받은 키를 .env에 채워야 동작합니다.
- Node.js 20+, pnpm 9+
- Python 3.11+
- (필수) Google AI Studio API key
- (선택, 판례 검색 시) 국가법령정보 공동활용 OC
최소 동작에 필요한 키는 4개입니다:
| 변수 | 용도 | 위치 |
|---|---|---|
GEMINI_API_KEY |
LLM 호출 | BE .env |
ADMIN_API_KEY |
관리자 엔드포인트 보호 | BE .env |
JWT_SECRET |
토큰 서명 (현재 로그인 비활성화라도 코드 의존) | BE .env |
NEXT_PUBLIC_API_BASE_URL |
FE가 호출할 BE 주소 | FE .env (또는 같은 .env에) |
판례 검색까지 쓰려면 LAW_API_KEY 1개 추가. 로그인은 비활성화 상태라 카카오 키는 비워둬도 됩니다.
- Google AI Studio 접속 (Google 계정 필요)
- "Create API key" 클릭
- 생성된 키 복사 (
AIza...39자) - 무료 한도: 분당 15회, 일별 1,500회 (
gemini-2.5-flash-lite기준). 데모용으로 충분. .env의GEMINI_API_KEY=에 값 채우기
- 국가법령정보 공동활용 접속, 회원가입
- "OPEN API 활용신청" → 사용 신청 작성
- 중요: 호출할 서버의 IP 또는 도메인을 등록해야 합니다. 로컬 개발이면 본인 공인 IP, Cloud Run이면 고정 IP 등록 필요.
- 발급받은 OC 값(보통 본인 ID와 동일)을
.env의LAW_API_KEY=에 채우기 - OC 미설정 시 판례 검색만 비활성화되고 법령 검색은 정상 동작
랜덤 32바이트로 직접 생성:
openssl rand -hex 32생성된 64자 hex를 .env의 ADMIN_API_KEY, JWT_SECRET에 각각 넣기 (두 값은 달라야 함).
git clone https://github.com/maantano/lemini-pub.git
cd lemini-pub
# .env 만들기
cp .env.example .env
# 위 2번 가이드에 따라 .env의 <your-...> 부분을 본인 값으로 채우기
# JS 의존성
pnpm install
# Python 의존성
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"pnpm run ingest:sampledata/sample/의 노동법·산업안전보건법 마크다운으로 data/artifacts/laws.sqlite 와 임베딩 파일 생성.
# Terminal 1 — API
pnpm run api:dev # → http://localhost:8000
# Terminal 2 — Web
pnpm --filter @kr-law-rag/web dev # → http://localhost:3000http://localhost:3000 접속해서 "근로기준법 위반시 어떻게 해요?" 같은 질문 던져보세요.
# 법령 동기화 (전체 한국 법령)
python -m worker.sync.run --type laws
# 판례 동기화 (등록 IP에서만 호출 가능)
python -m worker.sync.run --type precedents자세한 방법은 data/voluntary-raw/README.md 참고.
# 공정거래위원회 표준약관 자동 수집
python scripts/collect_ftc_standard_terms.py
# 협회 자율규약 Playwright 수집
python scripts/voluntary_playwright_collector.py본 저장소는 Cloud Run 배포 스크립트(scripts/, cloudbuild.*.yaml)와 GitHub Actions 워크플로(.github/workflows/)를 포함합니다.
본인의 GCP 프로젝트·버킷·서비스 계정을 GitHub Repository Variables / Secrets에 등록하면 자동 배포됩니다.
기본 환경:
- 백엔드: Cloud Run (
asia-northeast3권장) - 프론트: Vercel 또는 Cloudflare Pages
- 데이터: GCS 버킷 (SQLite + 임베딩)
- 동기화: Cloud Run Job + Cloud Scheduler
비용은 본인 GCP 결제 페이지에서 직접 확인하세요. Cloud Run
min-instances=0권장.
ENABLE_SERVER_CHAT_HISTORY=false기본값 — 서버 DB에 대화 저장 안 함- 현재 로그인 UI 비활성화 — 회원가입·로그인 없이 데모 가능. 카카오 로그인 코드는 남아있으나 UI에서 차단됨
- Stateless 요청 — 클라이언트가 history를 매 요청에 동봉
- IP는 rate limit용 in-memory 버킷에만 사용
- 원본 markdown은 artifact DB에 복제되지 않음 (FTS index에만)
시스템 아키텍처와 디자인을 한 페이지로 정리한 시각 자료:
👉 https://maantano.github.io/lemini-pub/
MIT — 자유롭게 fork·수정·재배포 가능. 저작권 표시만 유지.
본 프로젝트는 법률 자문 도구가 아닙니다. 출력은 일반적인 법령·판례 정보 검색·분석 결과이며, 중요한 사안은 반드시 원문 법령과 변호사·노무사 등 전문가 검토가 필요합니다.
수집한 법령·판례·자율규약 원본의 사용 책임은 수집자(사용자) 본인에게 있습니다.