공급망 규제 모니터링을 ‘판단 가능한 보고서’로 바꿔 본 기록

소개

시도하고자 했던 것과 그 이유를 알려주세요.

SCM에서는 중국 수출통제, 미국 관세·수출통제·FEOC·PFE 같은 정책 변화가 공급사, 통관, 선적, 원산지 판단에 영향을 줄 수 있습니다.

그런데 공개 정책문서를 매번 사람이 찾아 읽고, 엑셀이나 메신저에 따로 정리하다 보니 다음 문제가 반복됐습니다.

- 어떤 정책이 실제로 발효 중인지 한눈에 보기 어려움
- 발표일·시행일·유예 종료일이 섞임
- 공식 원문과 뉴스 보도가 구분되지 않음
- 정책의 법적 상태와 우리 회사에 미칠 가능성이 섞여서 해석됨
- 같은 내용이 반복 수집돼도 무엇이 바뀌었는지 알기 어려움
- 보고서를 만들 때는 근거를 많이 넣다 보니 정작 핵심 판단이 묻힘

그래서 공개 공식자료만 사용해 규제 신호를 구조화하고, 최종적으로는 SCM·구매 담당자가 짧은 시간 안에 다음 질문에 답할 수 있는 형태를 만들고자 했습니다.

지금 큰 이슈가 있는가?
무엇을 확인해야 하는가?
아직 무엇을 결정하면 안 되는가?


프로젝트 이름은 RegRadar입니다. 제조업 관련 원자재 공급망과 관련된 공개 정책문서를 수집·검증하고, 산업 수준의 영향과 확인 과제를 보여주는 웹 애플리케이션입니다.

중요한 원칙도 처음부터 정했습니다.

- 회사명, 공급사, 계약, 가격, 재고, 선적, 생산계획 데이터는 사용하지 않음
- 공개 정책문서와 범용 산업정보만 사용
- AI가 경보 등급이나 구매 행동을 최종 결정하지 않음
- 법적 상태와 산업 영향 가능성을 분리
- 공식 원문이 확인되지 않으면 판단 보류 또는 추가 검증으로 표시
- 구매·선적·통관을 자동으로 실행하지 않음

---

진행 방법

어떤 도구를 사용했고, 어떻게 활용하셨나요?

처음에는 Streamlit과 Python으로 공개 정책 브리프를 보여주는 화면부터 만들었습니다.

이후 다음 도구를 조합했습니다.

- Python
- 정책 데이터 모델
- 날짜·시행일·카운트다운 계산
- 우선순위 정렬
- 공식 소스 점검 상태 집계
- PDF·Word·Markdown 보고서 생성

- Pydantic
- 정책 신호와 최종 규제 레코드의 입력 구조 검증
- 필수 필드와 날짜·상태·출처 형식 검증
- 회사 데이터 필드가 들어오지 않도록 경계 설정

- Streamlit
- 규제 브리프 화면
- 국가·품목·시행 상태 필터
- 공식 소스 점검 화면
- 중간 리포트와 PDF 다운로드

- SQLite
- 분석 이력
- 원문 스냅샷
- 중복·변경 여부
- 수집 실행 원장 저장

- YAML
- 공식 소스 목록
- 정책 규칙
- 산업별 설정
- 샘플 브리프와 시나리오 관리

- ReportLab
- Word 변환에 의존하지 않고 한글 PDF 직접 생성
- 1페이지 의사결정용 보고서 출력
- 맑은 고딕 글꼴 임베딩

- python-docx
- 근거와 상세 설명을 보존한 Word 보고서 생성

- Hermes Agent
- 파일 탐색과 코드 수정
- 실패 테스트 작성
- 브라우저에서 Streamlit 화면 확인
- PDF 시각 검증
- 전체 회귀 테스트 실행

활용한 프롬프트

이번 프로젝트에서 AI에게 정책 사실을 추출하게 할 때는, 처음부터 역할과 금지 범위를 매우 구체적으로 정했습니다.

1. 공개 정책 사실 추출 프롬프트

You are a public-policy fact extraction agent for RegRadar.

Your only output is one PolicySignal JSON object that validates against:
schemas/policy_signal.schema.json

Hard boundaries:
- Use public policy, official notice, customs, enforcement, or reputable public reporting only.
- Never request, accept, infer, or output company names, suppliers, inventory, shipments,
  contracts, prices, costs, profit, internal item codes, customers, or production plans.
- Never assign an alert level, urgency, business action, shipment instruction, or execution decision.
- Set company_data_used=false and llm_execution_decision_used=false.
- Do not invent dates, HS codes, document numbers, product scope, legal effect, or source authority.
- Preserve dates, numbers, units, HS codes, and document numbers exactly.
- Every material and HS-code claim must reference an evidence_id.
- Use the canonical public HTTPS URL and a SHA-256 hash of the captured source content.
- Separate official final/enforcement evidence, official precursor evidence, reputable secondary
  reporting, and unverified claims through source_tier and authority_role.
- A corroborated_signal candidate requires at least two independent origin_group values.
- For Critical Watch eligibility, use only source_id, origin_group, and canonical_url values
  that match config/trusted_secondary_sources.yaml. Do not claim that an unregistered source
  is approved or reputable.
- Syndicated, copied, or republished articles derived from the same original report share one
  origin_group and count as one source, even when different websites display the article.
- If sources conflict, set conflict_detected=true. If an authority denies the claim, set
  official_denial=true.
- Unknown values remain null, false, an empty list, or an explicit uncertainty. Never guess.

RegRadar will validate this object and recompute the final deterministic AlertDecision.
An agent-supplied decision is never trusted.



이 프롬프트의 핵심은 AI에게 판단을 맡기지 않는 것입니다.

AI는 공개 문서에서 날짜, 대상 품목, 통제 유형, 근거 문장 같은 사실 후보만 추출합니다. 이후 최종 우선순위와 허용 행동은 Python 규칙엔진이 다시 계산합니다.

2. 산업 영향 브리프 생성 프롬프트
(1/3)

You are a regulatory intelligence analyst for Korean import and export supply
chains, with first priority on Chinese export controls and second priority on
U.S. tariffs, export controls, sanctions, FEOC, and PFE policy.

Analyze only:
- the supplied public policy document, and
- the supplied generic, public industry profile.

Never request, infer, or output non-public company data. The input must not
contain real supplier, customer, contract, price, inventory, shipment,
production-plan, factory, or profit data. Publicly named regulated entities in
an official policy document are not internal company data and may be extracted
as document facts.

Return a structured Korean RegulatoryIndustryReport matching the provided
schema.

Rules:
1. Preserve the full supplied document exactly in source_text_original.
2. Translate Chinese or English content into Korean without changing dates,
   numbers, currencies, units, HS codes, CAS numbers, notice numbers, legal
   references, or publicly named entities.
3. Do not invent publication dates, effective dates, products, codes,
   technical thresholds, entities, legal duties, exclusions, or transition
   rules. Use null, empty lists, unknown, or a review item when absent.
4. Separate explicit document facts from inferred industry impacts.
5. Every explicit fact, requirement, and recommended check must cite evidence
   excerpts that directly support the entire cited statement.
6. Evidence original_text must be an exact, short quotation from the supplied
   document.
7. Describe impacts only at industry, material, trade-flow, or supply-chain
   stage level.
8. Never issue company-specific commands such as ship now, clear customs now,
   hold a transaction, buy inventory, or switch a named supplier.
9. Distinguish a prohibition from a licensing, reporting, documentation, or
   inspection requirement.
10. Treat FEOC and PFE as different legal concepts.
11. Classify Section 301 or other duty-rate changes as tariff_change.
12. Distinguish an investigation, proposal, interim rule, final rule, and
    effective rule.
13. For BIS or OFAC material, distinguish list inclusion, item scope, license
    requirement, end-user/end-use conditions, and legal effect.
14. Distinguish publication date, effective date, expiry date, and transition
    provisions.
15. Treat source tier, extraction confidence, translation confidence, and
    industry urgency as separate concepts.
16. Prioritize explicit prohibitions, license requirements, effective dates,
    technical scope, exceptions, and end-use or end-user conditions.
17. If an industry impact requires knowledge beyond the supplied document and
    generic industry profile, state the assumption and lower confidence.
18. Do not make final legal, customs-classification, FEOC, or PFE eligibility
    determinations.
19. Write concise Korean suitable for a procurement, SCM, customs, or legal
    screening brief.
20. Set industry_impact.days_to_effective to null. The application calculates
    and overwrites this value deterministically from the effective date.
21. Use expected_policy_jurisdiction from the public analysis context as a
    classification hint.

The result is an industry-level regulatory screening brief, not legal or
customs advice and not a company-specific operational instruction.

진행 과정

처음에는 보고서를 Markdown으로 만들었습니다. Markdown은 근거와 감사 추적을 남기기에는 좋았지만, 경영진이나 구매 담당자가 바로 읽기에는 정보가 많았습니다.

그래서 Word 보고서를 별도로 만들고 다음 순서로 재구성했습니다.

1. 한 줄 판단
2. 현재 상태와 카운트다운
3. 지금 할 일
4. 아직 결정하지 말 것
5. 공식 근거
6. 판단 경계

그다음 PDF를 만들면서 시행착오를 겪었습니다.

처음 PDF는 Markdown 표를 그대로 PDF에 옮겼습니다. 결과는 좋지 않았습니다.

- 표의 열이 무너짐
- 구분선이 일반 문장처럼 출력됨
- 글자가 작아짐
- 감사용 세부 내용이 본문을 압도함

그래서 PDF는 Markdown을 단순 변환하지 않고, 별도의 1페이지 의사결정용 양식으로 다시 설계했습니다.

최종 PDF 구성은 다음과 같습니다.

- 상단 상태 카드
- 한 줄 판단
- 핵심 사실
- 지금 할 일
- 아직 결정하지 말 것
- 메일링 정책
- 현재 발효·감시 중인 정책 우선순위
- 근거와 판단 경계

현재 우선순위 리스트는 브리프 데이터에서 자동으로 가져옵니다. 수기로 목록을 작성하지 않기 때문에 대시보드와 PDF의 정책 목록이 서로 달라지는 문제를 줄였습니다.

활용 이미지와 캡처 화면

최종 PDF 캡처 화면입니다.
(2/3)

한국어와 중국어가 적힌 종이 한 장

결과와 배운 점

결과

RegRadar는 현재 다음 기능을 제공합니다.

- 중국·미국 규제 정책 브리프 조회
- 국가·품목·시행 상태별 필터링
- 공식 소스 점검 상태 표시
- 정책별 법적 상태와 산업 영향 분리
- 정책 시행일·유예 종료일 카운트다운
- 정책 우선순위 정렬
- 우선순위 리스트의 신규·변경·종료 감지
- Markdown·Word·PDF 보고서 생성
- PDF 1페이지 의사결정 브리프
- 공개 공식자료와 회사 데이터의 경계 표시
- 자동 구매·선적·통관·메일 발송 차단

현재 공식 소스 점검 원장에서는 다음 상태를 보수적으로 표시합니다.

- P0 공식 소스: 12곳
- 확인 완료: 0곳
- 추가 검증: 11곳
- 접근 문제: 1곳
- 운영 상태: 주의
- 완료율: 0%

이 상태에서 중요한 것은 시스템이 정책 변화 없음이라고 말하지 않는 것입니다. 공식 소스가 완전히 확인되지 않았다면, 시스템은 추가 검증 필요로 남겨야 합니다.

현재 전체 테스트는 309건 통과했습니다.

배운 점

1. 보고서는 정보를 많이 넣는다고 좋아지지 않았습니다

처음에는 근거를 빠짐없이 넣는 것이 좋은 보고서라고 생각했습니다. 하지만 실제로는 핵심 판단이 묻혔습니다.

감사 추적용 문서와 의사결정용 문서는 목적이 다릅니다.

- Markdown: 근거·원문·감사 추적
- Word: 설명과 검토용
- PDF: 짧은 판단과 실행 우선순위

이 세 가지를 한 문서에 모두 넣으려 하면서 PDF가 복잡해졌습니다.

2. 표는 데이터에는 좋지만 PDF에서는 조심해야 합니다

표는 화면에서는 정보를 정리해 보여주지만, PDF로 변환할 때는 열 너비와 줄바꿈을 직접 설계해야 합니다.

특히 긴 한국어 정책명과 확인 과제가 들어가면 표가 쉽게 깨집니다.

이번에는 PDF에서 표를 제거하고, 다음처럼 행 단위의 짧은 리스트로 바꿨습니다.

CRITICAL   미국 10개 기업 수출통제 관리목록 추가       변동·조치 주시
HIGH       리튬전지·양극재 수출통제 정지 종료 감시     유예 종료 주시
MEDIUM     공급망 세액공제 관련 지침                  상시 감시



3. 색상은 장식이 아니라 판단 보조 수단이어야 합니다

처음에는 색상을 거의 없앴고, 그다음에는 색상을 다시 넣었습니다.

최종적으로는 카드 전체를 색칠하지 않고 다음 부분에만 색상을 사용했습니다.

- 우선순위 표시
- 변동·특이사항 주시 문구
- 한 줄 판단의 경고선

색상은 많지 않아야 하지만, 상태 차이를 구분할 정도는 있어야 했습니다.

4. AI에게 최종 판단을 맡기면 안 됩니다

AI는 문서를 읽고 구조화하는 데는 도움이 되지만, 다음과 같은 판단을 혼자 맡기면 안 된다고 느꼈습니다.

- Critical인지 여부
- 실제 회사 적용 여부
- 구매 중단 여부
- 공급사 변경 여부
- 선적·통관 실행 여부

그래서 AI는 사실 후보를 만들고, Python 규칙엔진이 결정론적으로 다시 계산하도록 설계했습니다.

5. 공식 소스에 접근했다고 해서 정책이 확인된 것은 아닙니다

공식 사이트가 열렸다는 것과 정책 변동을 확인했다는 것은 다른 문제였습니다.

- 페이지는 열렸지만 관련 공고가 없을 수 있음
- 공고가 있어도 시행일과 유예기간이 다를 수 있음
- 원문은 확인했지만 미국 HTS나 CBP 집행자료가 연결되지 않을 수 있음
- 중국 공식 사이트는 인증서 문제로 접근이 불안정할 수 있음

이 때문에 시스템에는 다음 상태를 따로 두었습니다.

- 확인 완료
- 추가 검증
- 접근 문제
- 판단 보류

겪었던 시행착오

가장 큰 시행착오는 PDF였습니다.

처음에는 기존 Markdown 보고서를 PDF로 변환하면 된다고 생각했습니다. 하지만 결과적으로 다음 문제가 생겼습니다.

1. Markdown 표가 깨짐
2. 문서가 너무 길어짐
3. 글자 크기를 줄여야만 1페이지에 들어감
4. 핵심 판단보다 근거가 더 눈에 띔
5. 색상과 카드가 많아지면서 오히려 산만해짐

이후 PDF를 별도 설계했습니다.

- 표 대신 카드와 리스트 사용
- 1페이지 고정
- 핵심 판단을 상단 배치
- 긴 근거는 Markdown으로 이동
- 색상은 상태선과 우선순위에만 적용
- 정책 우선순위 리스트는 데이터에서 자동 생성

또 다른 시행착오는 메일링 기준이었습니다.

처음에는 High 이상 변동 시 메일을 생각했지만, High 등급 자체는 변하지 않아도 정책의 제목, 시행 상태, 종료 여부, 공식 확인 상태가 바뀔 수 있습니다.

그래서 메일링 기준을 다음처럼 바꿨습니다.

우선순위 리스트에 신규·변경·종료 항목이 있을 때만 발송


동일한 리스트가 유지되면 반복 발송하지 않도록 이전 스냅샷과 현재 리스트를 비교하게 했습니다.

도움이 필요한 부분

현재 가장 도움이 필요한 부분은 기능 추가보다는 외부 공개용 운영 패키지 정리입니다.

현재는 내부 검토용으로 기능이 충분히 갖춰졌지만, 외부 공개를 위해서는 다음을 정리해야 합니다.

- 개발용 파일과 공개용 파일 분리
- 원본 스냅샷과 공개 데모 데이터 구분
- 자격증명·내부 경로·개발 로그 비노출 확인
- 처음 설치하는 사람이 따라 할 수 있는 실행 문서
- 외부 공개용 읽기 전용 모드
- 장애 발생 시 미확인과 접근 문제를 표시하는 운영 규칙

실제 SMTP·Outlook 메일 발송과 예약 수집은 아직 연결하지 않았습니다. 외부 공개 초기에는 읽기 전용 데모로 공개하고, 이후 운영 자동화를 별도 단계로 진행하는 것이 안전하다고 판단했습니다.

앞으로의 계획

다음 단계는 검증을 더 늘리는 것이 아니라 외부 공개 준비입니다.

1. 공개용 데이터와 내부 개발 파일 분리
2. 공개 저장소에 포함하면 안 되는 파일 점검
3. 설치·실행 안내 정리
4. 읽기 전용 외부 데모 패키지 생성
5. 공개 환경에서 Streamlit 실행 확인
6. 공식 소스 상태와 PDF 다운로드를 실제 사용 흐름으로 점검
7. 이후에만 예약 수집과 메일 발송 검토

자동 구매·선적·통관 판단은 앞으로도 시스템에 넣지 않을 계획입니다.

감사합니다.


1
1개의 답글
지피터스 뉴스레터

이번 주 AI, 딱 쓸 것만

매주 월요일 오후,
읽고 바로 써먹을 AI 소식만