본문으로 건너뛰기

ADR 0033 — 일간 법률 뉴스 AI 큐레이션

Context

대시보드 일간 브리핑 (tenants/{tid}/dailyBriefings/{YYYY-MM-DD}) 은 그 사무소의 사건·기일·메시지에 한정된 "내 일정 요약". 외부 법률 동향 (판례, 법령 개정, 입법 동향) 은 변호사가 별도 채널 (법률신문, 법률저널, 인링크 등) 을 매일 직접 모니터링해야 했고, 우리 제품 안에는 채널이 없었다.

요구사항:

  1. AI 가 매일 한 번 한국 법률 관련 동향을 자동 수집·요약해 사무소에 노출
  2. 운영자가 결과 품질을 즉시 검증 (24h Cloud Scheduler 대기 금지) → ops 콘솔 버튼 클릭 → 즉시 fetch
  3. Phase 별 출시: Phase 1 ops 검증 도구 → Phase 2 Cloud Scheduler 자동화 → Phase 3 web 노출 (일간 브리핑 통합 또는 /library/news 별도 메뉴)

Decision

데이터 모델

legalNewsDaily/{YYYY-MM-DD} — 전 사용자 공유 (tenant 경로 밖, masterAdmin write · 인증 사용자 read).

interface LegalNewsDailyDoc {
dateKey: string; // KST yyyy-MM-dd
fetchedAt: Timestamp; // 수집 시각
fetchedBy: string; // ops uid (수동) 또는 "scheduler" (Phase 2)
status: "draft" | "approved" | "rejected";
// draft: 수집만 완료, web 노출 X
// approved: ops 검증 통과, web 노출 가능 (Phase 3)
// rejected: 품질 미달, 재수집 필요

headline: string; // "오늘의 법률 동향 한 줄 요약"
items: Array<{
id: string; // 결정적 (slug 기반)
title: string;
summary: string; // 2-3 문장
url: string; // grounding citation
publishedHint: string; // "최근" 또는 "2026-04-28" — LLM 판단
packTags: Array<"debt" | "divorce" | "property" | "inheritance" | "contract">;
severity: "high" | "medium" | "low";
}>;

model: string; // "gemini-2.0-flash-001"
retrievalMs: number; // Vertex 호출 시간 (성능 추적)

// Phase 2 후속 — RSS 보강 시 출처 메타 추가
sources?: Array<{ name: string; url: string; itemCount: number }>;
}

수집 파이프라인 (Phase 1)

책임 분리 (ADR 0004 §4 / CLAUDE.md "Gemini 호출은 클라이언트 전용" 정합):

레이어책임위치
Client componentLLM 호출 (firebase/ai SDK + Google Search grounding)apps/ops/app/(ops)/scenarios/_components/cards/legal-news/FetchLegalNewsScenarioCard.tsx
Pure 함수프롬프트 빌더 + JSON 응답 파서 + URL → 결정적 idpackages/business-logic/src/legal-news/llm-prompt.ts
Server Action인증 + Firestore write 위임apps/ops/app/(ops)/scenarios/_actions/run-fetch-legal-news-scenario.ts
MutationZod 재검증 + Firestore writepackages/business-logic/src/legal-news/fetch-news.ts (saveLegalNewsDailyDoc)
모델 SSoT모델 ID 단일 참조점apps/ops/lib/ai/model.ts (AI_MODEL)

흐름:

  1. Client → getGenerativeModel(ai, { model: AI_MODEL, tools: [{ googleSearch: {} }] }).generateContent(prompt) (firebase/ai SDK)
  2. 응답 텍스트 → parseLegalNewsLlmResponse (pure, ```json fence 추출 + Zod 검증)
  3. parsed 결과 → Server Action 으로 전송 (model · retrievalMs 포함)
  4. Server Action → saveLegalNewsDailyDoclegalNewsDaily/{YYYY-MM-DD} write

모델 hardcode 정책:

호출부 (ops 카드 / business-logic mutation) 에 모델명을 적지 않는다. 모델은 SSoT 1곳 (apps/ops/lib/ai/model.ts) 에서만 변경. 향후 packages/ai 패키지 승격 시 web 의 apps/web/lib/ai/providers/gemini.ts 와 통합.

ADR 0028 패턴 — 비즈니스 로직은 packages, Server Action 은 thin wrapper (auth + Firestore write).

검증 UX (Phase 1)

ops 시나리오 페이지에 신규 카테고리 legal-news:

  • fetchLegalNewsToday 카드 — 버튼 클릭 → 즉시 fetch + Firestore write + 결과 카드에 표시 (headline + items 5건 + citation URL). 24h 대기 X.
  • (후속) regenerateSummary (raw 보존된 날짜 LLM 만 재호출), approveLegalNews (status 전이) 는 PR-2/PR-3.

Phase 2 — Cloud Scheduler 자동화

검증 끝나면 functions/src/scheduled-fetch-legal-news.ts 추가, 매일 06:00 KST 실행. ops 수동 트리거와 같은 함수 (fetchAndSummarizeLegalNews) 호출 — drift 0.

Phase 3 — web 노출

옵션 (1차 = 통합, 양립 가능):

  • (a) 일간 브리핑 통합apps/web/app/(workspace)/dashboard 의 브리핑 카드 하단 "오늘의 법률 동향 3건" 섹션 추가. 사용자 별도 진입 0.
  • (b) /library/news 별도 메뉴 — 컨텐츠 양 늘어나면 검색·필터·즐겨찾기 가능한 별도 화면. (a) 와 양립.

출처 신뢰성 (Phase 3 노출 전)

Gemini Grounding 만으론 출처가 블로그 등 신뢰성 낮을 수 있음. Phase 3 web 노출 전 다음 보강:

  • Phase 2 후반: RSS 1차 소스 (대법원 보도자료, 법무부) 보강 → sources 메타 채움
  • ops 검증 카드에서 severity: "high" 항목은 사람이 reviewed 한 항목만 노출

Consequences

Pros:

  • 변호사가 매일 외부 채널 모니터링 시간 절감 (≥ 30분/일)
  • 우리 제품의 일간 진입 가치 ↑ (사무소 일정 + 외부 동향 한 화면)
  • ADR 0028 / 0032 인프라 재사용 — 신규 패턴 0
  • Phase 1 = ops 도구만, web 영향 0 → 검증 이전 사용자 노출 사고 차단

Cons:

  • Gemini Grounding 토큰비 (1일 1회 약 $0.005-0.01, 무시 가능)
  • 출처 신뢰성 검증 필요 — Phase 3 전 RSS 보강 또는 사람 review gate 필수
  • LLM 비결정성 — 같은 날 다른 시간 호출 시 일부 다른 결과 (Phase 2 자동화에서는 06:00 1회 고정)

Flag/rollback: Phase 3 노출은 config/appMetadata.features.ai.dailyLegalNews (기본 false) 로 감싸 1-click 끄기.

Alternatives considered

  1. RSS only — 안정적·결정적이지만 한국 법률 사이트 RSS 빈약 (대법원·법무부 등 일부만, 법률신문은 없음). 큐레이션 비용 > Grounding.
  2. News API (NewsAPI.org 등) — 한국 법률 컨텐츠 빈약, 영문 뉴스 위주. 부적합.
  3. Tenant 별 큐레이션 — 사무소 사건 (recoveryType) 에 매칭되는 뉴스만 필터. Phase 1 에서는 비용·복잡도 over-engineering. 전 사용자 공유 1 doc + 클라이언트 packTags 필터로 충분.
  • ADR 0028 (비즈니스 로직 추출) — 동일 패턴 재사용
  • ADR 0032 (RAG 평가) — Vertex AI Gemini 호출 인프라 공유
  • CLAUDE.md "Firebase AI Logic" — 클라이언트 호출 정책. 본 기능은 server-only (Vertex REST), 클라이언트 호출 0.