本地纯文件分析 是做什么的?
目标
分析表格、文档、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] |
三个实现原则,可在交付说明中引用:
- 稳定假名。 同一源值在单次运行中始终映射到同一假名。“张三出现 3 次”变为“
[NAME#1]出现 3 次”——计数、去重和连接仍然有效,但身份信息不被保留。 - 磁盘上无映射。 值到假名的映射仅存在于内存中。
report.md和manifest.json都不包含它;仅写入命中计数。 - 自由文本的启发式规则。 结构化表格按列标题分类并进行列级屏蔽。正文、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
控制台打印每个文件的类型、大小、屏蔽字段、命中计数和“网络请求: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、云文件存储 |
| 知识库 | 写入库、摄入 URL | 知识库上传、ima 知识库 |
| 外部搜索 | 使用源文本或片段作为查询 | 网络搜索、页面抓取 |
| 在线转换/OCR | 在线 PDF 转换、在线解压、在线图像识别 | 任何在线工具、图像理解 API |
| 向外发送 | 将文件或摘要发布到聊天、邮件、机器人 | 企业微信消息、电子邮件、会议纪要上传 |
只有一个例外:用户明确说“这个可以上传/发送”。即便如此,也要重申并获取第二次确认后再执行。
每种文件类型的本地路径
| 类型 | 首选本地方式 | 备注 |
|---|---|---|
.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,坦诚说明差距——不要通过云端路由 |
特别是图像:如果没有 tesseract,仅将其视为元数据,并说明“未识别图像内容”,提供两种本地途径(安装 OCR 并重新运行 / 用户描述图像内容)。不要通过视觉模型“看一看”——这会将图像推入推理路径,与用户的请求相悖。
降级规则
- 本地脚本可解析 → 使用脚本的输出。
- 无可提取文本(扫描件、旧格式、加密) → 解释原因,提供本地替代方案(本地重新保存、本地 OCR、用户口述)。
- 用户催促“现在就出结果” → 回到模式问题:“鉴于当前状态,我只能给出统计答案——可以接受吗?”
常见错误
- 跳过路径请求,直接分析聊天附件:违反步骤 1。
- 将整个
report.md粘贴到答案中:报告是工作底稿;答案应包含结论和关键数字。 - 认为严格模式使屏蔽变得多余:这两个维度是独立的。
- 将未屏蔽的值打印到控制台或临时文件“以便查看数据”:屏蔽必须在写入任何内容之前完成。
- 估算而不是本地计算:在全量数据规模下,估算几乎总是错误的。
- 将
.xls发送到云端转换器“为了方便”:违反红线;应改为本地重新保存。 - 忽略编码:以 UTF-8 读取 GB18030 编码的 CSV 会产生乱码,污染列轮廓。脚本会处理编码;手写代码也必须处理。
关于语言的说明
检测规则针对中文数据格式(身份证号码、省/市地址、中文姓氏)以及通用模式(电子邮件、电话号码、银行卡、车牌号)。报告和控制台输出目前为中文;检测逻辑在模式允许的情况下是与语言无关的。对于纯英文文档,结构化表格屏蔽仍然有效(通过列标题),但自由文本姓名检测较弱——请坦诚说明,不要过度承诺。