Community影像github.com

wxyz199/local-only-file-analysis

在本機上嚴格分析試算表、Word/PowerPoint 文件、PDF、圖片與文字檔案,並在所有模式中強制遮罩個人資料(姓名、電話、地址、身分證與護照號碼、銀行卡、電子郵件、車牌、帳號),確保零上傳至雲端文件、雲端硬碟、知識庫、線上轉換器、OCR 服務或外部搜尋。

local-only-file-analysis 是什麼?

這個 AI 助手技能(Local-Only File Analysis)專為需要處理敏感或個人資料的開發者與使用者設計,確保所有檔案分析完全在本機執行,絕不將檔案內容上傳至任何雲端服務。它支援多種檔案格式,包括 Excel、Word、PowerPoint、PDF、CSV、純文字、圖片等,並內建強制性的個人資料遮罩機制,涵蓋姓名、電話、地址、身分證號碼、銀行卡號、車牌等,且會產生穩定的假名以便計數與去重。使用者可選擇「一般模式」(含遮罩預覽與統計)或「嚴格模式」(僅提供彙總指標,不顯示任何原文),以符合不同隱私安全需求。此技能支援 Claude Code、Cursor、Codex 等 AI 編碼助手平台,透過本機 Python 腳本執行擷取、遮罩與稽核,並產出詳細的報告與稽核單,確保來源檔案唯讀且未被修改。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wxyz199/local-only-file-analysis/tree/HEAD

Installed? Explore more 影像 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

本機專屬檔案分析

目標

在不將檔案或其內容傳送至任何雲端服務的情況下,分析表格、文件、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 列、內文摘錄)僅提供彙總指標:列數/欄數、型別、非空值率、不重複計數、範圍、平均值
原始文字遮罩後的文字會進入報告,可供模型檢視絕不出現;模型僅能看到指標
適用情境一般內部資料、語意解讀、書面結論客戶記錄、薪資、醫療資料、合約、機密資料
成本遮罩內容進入推論上下文無法進行語意判斷,僅能提供統計為基礎的回答

說詞:

請選擇模式:① 一般模式 — 結構、統計與遮罩預覽,讓我能讀取內容並得出結論;② 嚴格模式 — 僅提供指標,報告中不會出現任何原始文字。預設為一般模式。

強制遮罩 (所有模式皆適用,無法關閉)

遮罩不是選項,而是預設行為。腳本沒有關閉開關,--mode strict 也不代表「遮罩是選用的」— 嚴格模式是在遮罩之上再疊加「不顯示原始文字」。

類別涵蓋欄位結果
姓名姓名、帳戶持有人、聯絡人、法定代理人、負責人、處理者、帳戶管理員、申請人、收款人、持卡人、股東[NAME#1]
聯絡方式手機、市話 (含區碼)、傳真、電子郵件[PHONE#1] / [EMAIL#1]
地址地址、居住地、郵寄地址、註冊地址、戶籍地址保留省市,其餘變成 [ADDRESS#1];--mask-region 會連同區域一起隱藏
身分證明身分證號碼 (18/15 碼)、護照、旅行證件、軍人證、統一社會信用代碼[ID#1]
金融銀行卡、帳號、卡號[ACCOUNT#1]
其他識別碼車牌、客戶編號、員工編號、會員編號、學號、社會安全號碼、保單號碼[PLATE#1] / [IDNO#1]

三項實作原則,可在交付記錄中引用:

  1. 穩定的假名。 相同的來源值在同一執行中永遠對應到相同的假名。「張三出現 3 次」會變成「[NAME#1] 出現 3 次」— 計數、去重與合併仍然可行,但身分無法保留。
  2. 磁碟上無對應表。 值與假名的對應表僅存在記憶體中。report.md 或 manifest.json 都不會包含它;只會寫入命中計數。
  3. 自由文字的啟發式規則。 結構化表格會依據欄位標題進行分類並進行整欄遮罩。文件內文、PDF 與投影片中的自由文字則依賴正規表示法加上姓氏辭典(「聯絡人:張三」、「張先生」)。啟發式規則會有遺漏 — 特別是在沒有上下文線索的孤立姓名。請清楚說明;絕不能聲稱「已偵測到所有內容」。

保留省市是刻意的設計:支援區域層級的分析,同時不暴露街道地址。當區域本身也屬於敏感資訊時,請使用 --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

主控台會印出每個檔案的類型、大小、遮罩欄位、命中計數以及「network requests: 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。

紅線 (絕不可觸發)

類別禁止行為常見工具
雲端文件建立、匯入或「編輯」線上試算表/文件騰訊文檔、金山文檔、飛書文檔連接器
雲端硬碟 / 物件儲存上傳檔案或產出物騰訊雲端硬碟、WeDrive、雲端檔案儲存
知識庫寫入知識庫、匯入網址知識庫上傳、知識庫輸入
外部搜尋使用來源文字或片段作為查詢網頁搜尋、頁面抓取
線上轉換 / OCR線上 PDF 轉換、線上解壓縮、線上圖片辨識任何線上工具、圖片理解 API
向外發送將檔案或摘要傳送至聊天、郵件、機器人WeCom 訊息、電子郵件、會議記錄上傳

僅有一個例外:使用者明確表示「這個可以上傳 / 傳送」。即便如此,仍要重申並取得第二次確認後才能行動。

各檔案類型的本機路徑

類型建議的本機處理方式備註
.xlsx .xlsmlocal_extract.py (直接處理 zip + XML)多工作表、欄位層級遮罩;日期可能顯示為序列數字
.csv .tsv .txt .md .json .htmllocal_extract.py自動偵測 UTF-8 / GB18030 編碼及分隔符;CSV 依標題進行遮罩
.docx .pptxlocal_extract.py (直接處理 zip + XML)段落、標題大綱、表格、每張投影片要點;內文透過自由文字遮罩處理
.pdflocal_extract.py當有安裝本機的 workbuddy-pdf CLI 時使用,否則使用內建的 zlib 備援方案
.png .jpg .gif .bmp .webplocal_extract.py僅擷取格式、尺寸、雜湊值;僅在存在 tesseract 時進行本機 OCR
.xls .doc .ppt 舊版二進位格式要求使用者在本機重新儲存,或在本機編輯器中開啟絕對不能傳送至線上轉換器來擷取內容
掃描 PDF / 圖片中的文字本機 OCR,或由使用者口述內容若無 OCR,請誠實說明限制 — 不要透過雲端處理

特別是圖片:若無 tesseract,則僅將其視為中繼資料處理,並說明「無法辨識圖片內容」,提供兩種本機處理方式 (安裝 OCR 重新執行 / 使用者描述內容)。請勿使用視覺模型「看一看」— 這會將圖片送入推論路徑,違反使用者的要求。

降級規則

  1. 本機腳本可解析 → 使用腳本的輸出。
  2. 無可擷取的文字 (掃描檔、舊版格式、加密) → 說明原因,提供本機替代方案 (在本機重新儲存、本機 OCR、使用者口述)。
  3. 使用者急著要「立刻看到結果」 → 回到模式問題:「鑑於目前狀態,我只能提供統計性的回答 — 可以接受嗎?」

常見錯誤

  • 略過路徑請求,直接分析聊天附件:違反步驟 1。
  • 將整個 report.md 貼入回答中:報告是工作文件;回答應包含結論與關鍵數字。
  • 認為嚴格模式就不需要遮罩:這兩個維度是彼此獨立的。
  • 將未遮罩的值輸出到主控台或暫存檔「以便查看資料」:遮罩必須在寫入任何內容之前完成。
  • 用估計取代本機計算:在完整資料規模下,估計幾乎總是錯誤的。
  • 「為了方便」將 .xls 送到雲端轉換器:違反紅線;請改為在本機重新儲存。
  • 忽略編碼:將 GB18030 的 CSV 以 UTF-8 讀取會產生亂碼,進而污染欄位描述。腳本會處理編碼;手寫程式碼也必須注意。

語言說明

偵測規則主要針對中文資料格式 (身分證號碼、省/市地址、中文姓氏) 加上通用模式 (電子郵件、電話、銀行卡、車牌)。報告與主控台輸出目前為中文;在模式允許的情況下,偵測邏輯與語言無關。對於純英文文件,結構化表格遮罩仍可透過欄位標題運作,但自由文字的名稱偵測效果較弱 — 請誠實說明,不要過度承諾。

相關技能