본문으로 건너뛰기

서류 자동 생성 — RAG + Hallucination 방어

기반 ADR: 0005 서류 자동 생성 아키텍처 · 0006 판례 DB·승소 판단

개요

변호사 서류 (내용증명·지급명령·소장·답변서·준비서면) 초안을 RAG (검색 증강 생성) 방식으로 자동 생성. 사무소 기억 + 공공 판례 + 법령 컨텍스트 조합. 모든 AI 출력은 Hallucination 방어 3단 + 변호사 서명 게이트 통과.

Pack 1 출력 서류 유형

  1. 내용증명 — 변제 청구·시효 중단 통지
  2. 지급명령 신청서 — 소액재판 자동화 대안
  3. 소장 — 대여금 청구·청구원인·별지 계산서 첨부
  4. 답변서 — 피고 대응
  5. 준비서면 — 쟁점별 추가 주장

사용자 스토리

변호사

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단

단계검증구현LatencyUX
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 참조)2top-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 0Phase 1Phase 2소버린 Go
Faithfulness0.850.920.950.90+
Citation Precision0.95 (hard, non-negotiable)0.970.980.95+
Citation Recall0.750.850.900.80+
Ko-LegalQA F10.700.800.880.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 시 머지 차단)

관련 기능

관련 ADR