로컬 전용 파일 분석
목표
표(테이블) 형식, 문서, PDF 및 이미지 파일을 어떤 클라우드 서비스로도 파일이나 내용을 보내지 않고 분석하며, 모든 모드에서 개인 데이터(이름, 연락처, 주소, 신분증 번호)를 마스킹합니다. 원본 파일은 로컬 머신에서 읽기 전용으로 열리며, 추출 및 통계는 로컬 스크립트를 통해 실행되고, 모든 결과물은 로컬 작업 디렉터리 안에 보관됩니다.
1단계 — 먼저 로컬 경로 요청 (필수, 절대 생략 불가)
이 스킬이 활성화된 후 첫 문장은 분석을 시작하지 않고 로컬 경로를 요청해야 합니다. 문맥에 맞게 아래 표현을 사용하며, 네 가지 사항을 포함하세요: 아무것도 업로드되지 않음, 절대 경로 필요, 경로 복사 방법, 파일 선택기 선택 사항.
이 파일을 이 머신에서만 분석합니다. 어떤 클라우드 서비스로도 전송되지 않으며, 보고서에는 이름, 전화번호, 주소 및 신분증 번호가 마스킹됩니다. 절대 로컬 경로를 알려주세요. 예:
/Users/you/Documents/ledger.xlsx또는D:\data\ledger.xlsx. 여러 파일은 새 줄로 구분해 주세요. 경로 복사 방법: 파일을 마우스 오른쪽 버튼으로 클릭 → "경로로 복사" (Windows), 또는 터미널에 파일을 드래그 / Finder에서 ⌥⌘C 사용 (macOS). 또는 "파일을 선택해 주세요"라고 말씀하시면 로컬 파일 대화상자를 열어 드립니다.
후속 처리:
- 사용자가 "선택해 줘 / 대화상자 보여 줘"라고 말하면
python "<skill_dir>/scripts/pick_path.py"(다중 선택) 또는--single옵션을 실행합니다. 출력된 경로를 입력으로 사용합니다. 종료 코드 2는 그래픽 세션이 없음을 의미하므로 사용자에게 경로를 붙여넣도록 요청합니다. - 사용자가 "첨부파일이에요"라고 말하지만 경로 없이 첨부파일 카드만 있는 경우 → 다음 섹션에 따라 처리합니다. 첨부파일을 조용히 읽지 마십시오.
- 경로를 받은 후 검증: 경로 존재, 지원되는 확장자, 적절한 파일 수 (약 10개 이상의 파일을 유형별로 그룹화).
사용자가 이미 첨부파일을 드롭한 경우
어떤 것이든 수락하기 전에 위험을 명시합니다.
한 가지 알려드리자면, 채팅에 드롭된 파일은 이미 플랫폼 서버에 저장되어 있을 수 있으므로 더 이상 완전히 로컬 경로가 아닙니다. 이 파일이 기밀 정보나 개인 데이터를 포함하는 경우, 대신 로컬 경로를 보내 주시면 디스크에서 읽어서 분석하겠습니다. 어떤 것도 이 머신을 떠나지 않습니다.
사용자가 여전히 첨부파일을 원한다면 진행하되, 전달 방식을 정직하게 표시합니다: "입력은 채팅 첨부파일에서 왔으며, 플랫폼 서버에 도달했을 수 있습니다" — 첨부파일을 "완전히 로컬"이라고 절대 말하지 마십시오.
2단계 — 사용자가 모드를 선택하도록 함
두 가지 옵션; 사용자가 선택해야 합니다. 지정되지 않은 경우 일반 모드를 사용하고 답변의 첫 줄에 모드를 명시합니다.
| 일반 (기본값) | 엄격 | |
|---|---|---|
| 보고서 내용 | 구조 + 통계 + 마스킹된 값 미리보기 (처음 N개 행, 본문 발췌) | 집계 지표만: 행/열 수, 유형, null이 아닌 비율, 고유 개수, 범위, 평균 |
| 원시 텍스트 | 마스킹된 텍스트가 보고서에 포함되어 모델에 표시됨 | 절대 표시되지 않음; 모델은 지표만 봄 |
| 적합 대상 | 일반 내부 데이터, 의미 해석, 서면 결론 | 고객 기록, 급여, 의료 데이터, 계약서, 기밀 자료 |
| 비용 | 마스킹된 내용이 추론 컨텍스트에 포함됨 | 의미 판단 불가, 통계 기반 답변만 가능 |
표현:
모드를 선택해 주세요: ① 일반 — 구조, 통계 및 마스킹된 미리보기를 통해 내용을 읽고 결론을 도출할 수 있습니다. ② 엄격 — 지표만 포함되며, 보고서 어디에도 원본 텍스트가 없습니다. 기본값은 일반입니다.
필수 마스킹 (모든 모드, 비활성화 불가)
마스킹은 선택 사항이 아니라 기본 동작입니다. 스크립트에는 끄기 스위치가 없으며 --mode strict는 "마스킹이 선택 사항"을 의미하지 않습니다. 엄격 모드는 마스킹 위에 "원본 텍스트 없음"을 추가로 적용합니다.
| 범주 | 포함 필드 | 결과 |
|---|---|---|
| 이름 | 이름, 계좌 소유자, 연락처, 법정 대리인, 소유자, 담당자, 계정 관리자, 신청자, 수취인, 카드 소지자, 주주 | [NAME#1] |
| 연락처 | 휴대폰, 유선전화(지역 번호 포함), 팩스, 이메일 | [PHONE#1] / [EMAIL#1] |
| 주소 | 주소, 거주지, 우편 주소, 등록 주소, 소재지 | 시/도는 유지, 나머지는 [ADDRESS#1]로; --mask-region은 지역도 숨김 |
| 신분증 | 주민등록번호(18/15자리), 여권, 여행 허가증, 공무원증, 통일사회신용코드 | [ID#1] |
| 금융 | 은행 카드, 계좌 번호, 카드 번호 | [ACCOUNT#1] |
| 기타 식별자 | 자동차 번호판, 고객 번호, 직원 번호, 회원 번호, 학생 번호, 사회보장번호, 보험 증권 번호 | [PLATE#1] / [IDNO#1] |
전달 메모에서 인용할 수 있는 세 가지 구현 원칙:
- 안정적인 가명(Pseudonyms). 동일한 소스 값은 항상 동일한 실행 내에서 동일한 가명으로 매핑됩니다. "Zhang이 3번 나타납니다"는 "
[NAME#1]이 3번 나타납니다"가 됩니다. 카운팅, 중복 제거 및 조인은 여전히 작동하지만, 신원은 유지되지 않습니다. - 디스크에 매핑 없음. 값-가명 매핑은 메모리에만 존재합니다.
report.md나manifest.json에는 포함되지 않으며, 히트 횟수만 기록됩니다. - 자유 텍스트에 대한 휴리스틱. 구조화된 테이블은 열 헤더로 분류되어 열 전체가 마스킹됩니다. 본문, PDF 및 슬라이드의 자유 텍스트는 정규 표현식과 성(last name) 어휘 사전을 사용합니다 ("연락처: 홍길동", "김철수 씨"). 휴리스틱은 놓칠 수 있습니다. 특히 문맥적 단서가 없는 고립된 이름의 경우 그렇습니다. 솔직하게 말하고, 절대 "모든 것이 감지됩니다"라고 주장하지 마십시오.
시/도를 유지하는 것은 의도적입니다: 거리 주소를 노출하지 않고 지역 수준의 분석을 지원합니다. 지역 자체가 민감한 경우 --mask-region을 사용하십시오.
3단계 — 로컬에서 추출
python "<skill_dir>/scripts/local_extract.py" "/path/to/ledger.xlsx" "/path/to/report.docx" \
--workspace ".local_analysis"
엄격 모드에는 --mode strict를 추가하고, 지역을 숨기려면 --mask-region을, 사용자 정의 패턴에는 --redact "EMP\\d{6}" (반복 가능)을 추가합니다.
출력물 (모두 --workspace 내부):
report.md— 마스킹된 구조 프로필 + 통계 + 미리보기; 이후 분석을 위한 유일한 입력manifest.json— 파일 목록, SHA-256, 모드,masking.enabled=true, 마스킹 히트 횟수,network_used: false
콘솔에는 파일별 유형, 크기, 마스킹된 필드, 히트 횟수 및 "네트워크 요청: 0"이 출력됩니다. 그 후 로컬 파일 리더로 report.md를 읽으십시오. 스크린샷이나 온라인 OCR로 대체하지 마십시오.
4단계 — 로컬에서 계산하고, 절대 머리로 계산하지 않음
합계, 비율, 고유 개수, 정렬, 그룹화, 기간 대비 변화: 항상 로컬 스크립트로 계산합니다. 전체 데이터를 보지 않고 모델이 추정하는 것은 거의 항상 틀립니다. local_extract.py의 parse_xlsx / parse_delimited / Masker를 일회성 스크립트에서 재사용하여 계산한 후 숫자를 보고서에 작성하십시오. 가명은 그룹화하고 직접 계산할 수 있습니다. 역으로 되돌릴 필요가 없습니다.
5단계 — 감사 시트 생성
python "<skill_dir>/scripts/local_audit.py" ".local_analysis" --note "로컬에서 처리, 업로드 없음"
감사 시트는 다섯 부분으로 구성됩니다: 소스 파일 무결성(해시 재확인으로 읽기 전용, 복사본 없음 증명), 마스킹 실행(스위치 상태, 범주, 이 실행의 히트 수), 작업 산출물 목록, 라인별 적색선 검사, 결론. 종료 코드 0 = 통과, 1 = 처리 중 소스 파일 변경됨.
6단계 — 보고
결론을 먼저, 데이터를 다음에, 하나의 마무리 문장:
이 분석은 클라우드 서비스 없이 이 머신에서만 완전히 실행되었습니다. 소스 파일은 읽기 전용으로 변경되지 않았으며, 보고서는 이름, 전화번호, 주소 및 신분증 번호를 마스킹합니다(안정적인 가명). 결과물은
.local_analysis/에, 감사 시트는audit.md에 있습니다.
적색선 (절대 트리거되지 않음)
| 범주 | 금지 | 일반적인 도구 |
|---|---|---|
| 클라우드 문서 | 온라인 시트/문서 생성, 가져오기 또는 "편집" | Tencent Docs, Kingsoft Docs, Feishu Docs 커넥터 |
| 클라우드 드라이브 / 객체 스토리지 | 파일 또는 결과물 업로드 | Tencent Drive, WeDrive, 클라우드 파일 스토리지 |
| 지식 베이스 | 라이브러리에 쓰기, URL 수집 | 라이브러리 업로드, ima 지식 베이스 |
| 외부 검색 | 소스 텍스트 또는 조각을 쿼리로 사용 | 웹 검색, 페이지 스크래핑 |
| 온라인 변환 / OCR | 온라인 PDF 변환, 온라인 압축 풀기, 온라인 이미지 인식 | 모든 온라인 도구, 이미지 이해 API |
| 외부 전송 | 파일 또는 요약을 채팅, 메일, 봇에 게시 | WeCom 메시지, 이메일, 회의록 업로드 |
예외는 단 하나: 사용자가 명시적으로 "이것은 업로드/전송되어도 괜찮습니다"라고 말한 경우입니다. 그래도 다시 한 번 확인하고 두 번째 승인을 받은 후에만 행동하십시오.
파일 유형별 로컬 경로
| 유형 | 권장 로컬 경로 | 참고 사항 |
|---|---|---|
.xlsx .xlsm | local_extract.py (zip + XML 직접) | 다중 시트, 열 수준 마스킹; 날짜가 일련 번호로 표시될 수 있음 |
.csv .tsv .txt .md .json .html | local_extract.py | UTF-8 / GB18030 및 구분자 감지; CSV는 헤더로 마스킹 |
.docx .pptx | local_extract.py (zip + XML 직접) | 단락, 제목 개요, 테이블, 슬라이드별 글머리 기호; 본문은 자유 텍스트 마스킹을 통해 처리 |
.pdf | local_extract.py | 로컬 workbuddy-pdf CLI가 있으면 사용, 그렇지 않으면 내장 zlib 대체 방식 사용 |
.png .jpg .gif .bmp .webp | local_extract.py | 형식, 크기, 해시만; tesseract가 있는 경우에만 로컬 OCR |
.xls .doc .ppt 레거시 바이너리 | 사용자에게 로컬에서 다시 저장하거나 로컬 편집기에서 열도록 요청 | 내용을 추출하기 위해 온라인 변환기로 절대 보내지 않음 |
| 스캔된 PDF / 이미지 내 텍스트 | 로컬 OCR, 또는 사용자가 내용을 받아쓰기 | OCR이 없으면 솔직하게 "이미지 내용을 인식할 수 없습니다"라고 말하고 두 가지 로컬 경로(OCR 설치 및 재실행 / 사용자 설명)를 제시. "비전 모델로 살펴보겠다"고 하지 마십시오. 이미지가 추론 경로에 들어가 사용자의 요청을 위반하게 됩니다. |
성능 저하 규칙
- 로컬 스크립트가 구문 분석 가능 → 스크립트 출력 사용.
- 추출 가능한 텍스트 없음(스캔, 레거시 형식, 암호화됨) → 이유를 설명하고 로컬 대안(로컬에 다시 저장, 로컬 OCR, 사용자 받아쓰기) 제시.
- 사용자가 "지금 결과를 원해요"라고 강요 → 모드 질문으로 돌아갑니다: "현재 상태로는 통계적으로만 답변할 수 있습니다. 괜찮으신가요?"
흔한 실수
- 경로 요청을 생략하고 채팅 첨부파일을 직접 분석: 1단계 위반.
report.md전체를 답변에 붙여넣기: 보고서는 작업 문서입니다. 답변에는 결론과 핵심 숫자가 포함됩니다.- 엄격 모드가 마스킹을 불필요하게 만든다고 믿음: 두 차원은 독립적입니다.
- 마스킹되지 않은 값을 콘솔이나 임시 파일에 출력하여 "데이터 보기": 어떤 것이든 기록되기 전에 마스킹이 이루어져야 합니다.
- 머리로 계산하는 대신 로컬에서 계산하지 않음: 추정은 전체 데이터 규모에서 거의 항상 틀립니다.
- "편의를 위해"
.xls를 클라우드 변환기로 보냄: 적색선 위반; 대신 로컬에 다시 저장하십시오. - 인코딩 무시: GB18030 CSV를 UTF-8로 읽으면 깨진 글자(mojibake)가 발생하여 열 프로필을 오염시킵니다. 스크립트는 처리하지만, 직접 작성한 코드도 처리해야 합니다.
언어 참고 사항
감지 규칙은 중국어 데이터 형식(주민등록번호, 省/市 주소, 중국어 성)과 일반 패턴(이메일, 전화, 은행 카드, 번호판)을 대상으로 합니다. 보고서와 콘솔 출력은 현재 중국어입니다. 패턴이 허용하는 경우 감지 로직은 언어에 구애받지 않습니다. 영어 전용 문서의 경우, 구조화된 테이블 마스킹은 열 헤더를 통해 여전히 작동하지만 자유 텍스트 이름 감지는 약합니다. 과장하지 말고 솔직하게 말하십시오.