서류 자동 생성 — RAG + Hallucination 방어
기반 ADR: 0005 서류 자동 생성 아키텍처 · 0006 판례 DB·승소 판단
개요
변호사 서류 (내용증명·지급명령·소장·답변서·준비서면) 초안을 RAG (검색 증강 생성) 방식으로 자동 생성. 사무소 기억 + 공공 판례 + 법령 컨텍스트 조합. 모든 AI 출력은 Hallucination 방어 3단 + 변호사 서명 게이트 통과.
Pack 1 출력 서류 유형
- 내용증명 — 변제 청구·시효 중단 통지
- 지급명령 신청서 — 소액재판 자동화 대안
- 소장 — 대여금 청구·청구원인·별지 계산서 첨부
- 답변서 — 피고 대응
- 준비서면 — 쟁점별 추가 주장
사용자 스토리
변호사
As a 민사 변호사 I want 사건 정보 입력 후 AI 가 소장 초안을 만들어주되, 모든 판례 인용이 실제 존재하는지 자동 검증되기 So that Mata v. Avianca 같은 사고 없이 30분 안에 제출본을 만든다.
사무원
As a 사무원 I want 내용증명·지급명령 신청서를 반복 입력 없이 자동 생성 So that 변호사 결재까지의 시간을 절반 이하로 줄인다.
기능 상세
1. 입력 → RAG → 생성 파이프라인
[사용자 질의: "이 사건 소장 초안"]
↓
[사건 컨텍스트 추출: 당사자·금액·이행기·증거·충당 스냅샷]
↓
[PII 마스킹 — 기존 maskPII 재사용]
↓
[쿼리 확장 — 법률 용어 동의어 사전]
↓
[Vector Search — top-K 10]
docType=memory(내 사무소) K=3
docType=publicCase(대법원·하급심) K=5
docType=statute(법령) K=2
↓
[Rerank — Gemini Flash cross-encoder (Phase 1+)]
↓
[Context 조립 — 사무소 기억 + 판례 요지 + 참조 조문]
↓
[Gemini Flash 생성 — structured JSON, Zod 검증]
↓
[Hallucination 방어 3단]
1. 사건번호 대법원 HEAD 검증 (자동 삭제)
2. 조문 국가법령정보 API 검증 (하이라이트 경고)
3. 변호사 체크리스트 (제출 전 강제)
↓
[워터마크 고정: "AI 초안 · 변호사 검토 필수"]
↓
[Audit 로그 — prompt hash·response hash·cost·latency·retrieved docIds]
↓
출력: { text, citations: [{ start, end, refId, verified }], referencedLegacyDocIds }
2. UI 뱃지 3종 분리 (ADR 0006 non-negotiable)
생성문 옆에 인용 출처 뱃지:
- 🏠 "내 사무소 자료" (주황) — 사무소 기억 참조
- ⚖️ "대법원 판례" · "하급심" (파랑) — 공공 판례
- 📖 "법령" (회색) — 국가법령정보
사용자가 출처 식별 못하면 hallucination 책임 전가 발생 → 뱃지 분리 필수.
3. Hallucination 방어 3단
| 단계 | 검증 | 구현 | Latency | UX |
|---|---|---|---|---|
| 1. 사건번호 재조회 | 정규식 \d{4}(가|다|나|고)(단|합|정)\d+ → 대법원 HEAD 병렬 | +200~400ms | 자동 삭제 + inline 경고 "AI 생성 사건번호 미확인" | |
| 2. 조문 실재 확인 | 국가법령정보 OpenAPI + 24h 캐시 (hit 95%+) | +50~100ms | 하이라이트 경고 (개정 false positive 대비 자동 삭제 ✗) | |
| 3. 변호사 서명 전 체크리스트 | DocSignGate 컴포넌트 — 인용 3종 체크 안 하면 제출 불가 | UX ~15초 | 미체크 강조, 제출 버튼 disabled |
4. Citation Traceability (역추적)
- 생성 응답에 span-level citation:
{ text, citations: [{start, end, refId}] } - 문장 hover 시
CitationPopover(2초 내 원문 로드) - 사무소 기억:
referencedLegacyDocIds→/legacy/{docId}내부 링크 - 공개 판례: 대법원 종합법률정보 deep link
- 1-click 원문 확인 — 새 탭 → 변호사가 제출 전 "원문 확인 완료" 체크박스
5. DocSignGate 컴포넌트
위치: 생성 서류 상단 고정
UX:
┌─ 서류 제출 전 확인 ──────────────────────────┐
│ │
│ ⚠️ AI 초안 · 변호사 검토 필수 │
│ │
│ □ 판례 인용 10건 모두 원문 확인 완료 │
│ □ 조문 인용 3건 모두 current 버전 확인 │
│ □ 당사자·금액·기일 정확성 검증 │
│ │
│ [ 제출 ] ← 3개 체크 전까지 disabled │
└──────────────────────────────────────────────┘
제약:
- 변호사 계정 (owner) 2FA 통과 필요 (사무장 권한 차단)
- 3개 체크 미완료 시 외부 송출 (이메일·포털·PDF 다운로드) 전면 차단
- 체크 로그 Firestore
tenants/{tid}/auditLog/docSign/5년 보존
6. 워터마크 고정
- 화면 상단 배너 (dismiss 불가): "AI 초안 · 변호사 검토 필수 · 법적 판단 아님"
- PDF export 하단 footer 자동 삽입
- 로그
auditLog/watermark에 노출 이벤트 기록 (감사 대응)
7. 의뢰인 포털 격리 (변호사법 §109)
- Server Action 에서 승소 관련 필드 스트리핑
- 의뢰인 포털 (
app/(portal)/) 에 AI 초안 렌더 금지 - 변호사가 "의뢰인 공유" 명시 토글 후만 공유 (변호사 최종 검토본)
8. weight 분류
| 서류 유형 | weight | 이유 |
|---|---|---|
| 내용증명·지급명령 (템플릿 위주) | 1 | 단순 생성 |
| 소장·답변서 (RAG 참조) | 2 | top-20 → rerank top-5 → 생성 |
| 전략 보고서 (쟁점·반대 주장·유사 판례 통계) | 3 | 복합 RAG + 구조화 JSON |
사무소당 월 200 weight · 일 40 soft cap (ADR 0005 §2).
9. 엣지 케이스
| 케이스 | 처리 |
|---|---|
| AI 가 생성한 사건번호 실재 X | 자동 삭제 + "인용 미확인" 경고 배지 |
| 조문 개정 (API HEAD 실패) | 3초 재시도 1회 → 경고만 (자동 삭제 ✗) |
폐지 조문 status=repealed | 배지 표시, 생성 허용 |
| 관리자 화이트리스트 | config/citationOverrides/{key} 수동 승인 |
| AI 가 "승소 확률 65%" 생성 | compliance-filter.ts 정규식 차단 → 500 에러 |
| 변호사가 체크리스트 미완료 제출 시도 | 버튼 disabled, 감사 로그 기록 |
품질 목표 (ADR 0005 §4)
| 지표 | Phase 0 | Phase 1 | Phase 2 | 소버린 Go |
|---|---|---|---|---|
| Faithfulness | 0.85 | 0.92 | 0.95 | 0.90+ |
| Citation Precision | 0.95 (hard, non-negotiable) | 0.97 | 0.98 | 0.95+ |
| Citation Recall | 0.75 | 0.85 | 0.90 | 0.80+ |
| Ko-LegalQA F1 | 0.70 | 0.80 | 0.88 | 0.80+ |
| 변호사 editRatio 중앙값 | <0.35 | <0.20 | <0.12 | <0.20 |
회귀 탐지:
- rolling 7일 editRatio +15%p 상승 → Slack 알림
citationChanges.removed > 0비율 5% 초과 → hallucination 회귀 경보- fullReplace rate 10% 초과 → 프롬프트 롤백
API (Server Action)
위치: apps/web/app/(workspace)/docs/_actions/doc-gen-actions.ts
export async function generateLegalDocument(
caseId: string,
params: {
docType: "demandLetter" | "paymentOrder" | "complaint" | "response" | "brief";
userHint?: string;
weight?: 1 | 2 | 3; // 기본 2 (RAG 참조)
}
): Promise<ActionResult<{
draftId: string;
text: string;
citations: Citation[];
referencedLegacyDocIds: string[];
unverifiedCitations: string[]; // 방어 1·2단계 실패한 인용
}>>;
// 변호사 서명 게이트
export async function signAndReleaseDocument(
draftId: string,
checklistResults: {
citationsVerified: boolean;
statutesVerified: boolean;
partiesVerified: boolean;
}
): Promise<ActionResult<{ released: boolean }>>;
executeAiAction 래퍼 재사용
const result = await executeAiAction({
tenantId, userId,
feature: "docGeneration",
weight: 2,
fn: async () => {
const context = await assembleRagContext(caseId, docType);
return generateDocument(context, provider);
},
classifyRefund: defaultClassifyRefund, // Gemini 빈 JSON 환불 포함
});
환불 조건 (ADR 0005):
parse_fail(Zod 검증 실패)timeout(30초 초과)upstream_5xx(Gemini 500 대)/Unexpected (end of JSON|token)/i(빈 응답)
테스트
- 단위: 프롬프트 템플릿 변환 · citation 파싱 · 환불 분류
- 통합: RAG 파이프라인 E2E (테스트 tenant · 샘플 판례 5건)
- 품질: Ragas CI (PR 라벨
needs-rag-eval시 실행, 회귀 -3%p 시 머지 차단)
관련 기능
- 인용 실재성 검증 3단 — 방어 상세
- 사무소 기억 — RAG K=3 소스
- 채권 계산 — 청구취지 결정론 템플릿 (AI 금지)