ローカル専用ファイル分析
目標
表形式ファイル、文書ファイル、PDFファイル、画像ファイルをクラウドサービスに送信せずに分析し、すべてのモードで個人データ(氏名、連絡先、住所、ID番号)をマスキングします。ソースファイルはローカルマシン上で読み取り専用として開かれ、抽出と統計はローカルスクリプトを通じて実行され、すべての成果物はローカルの作業ディレクトリ内に留まります。
ステップ1 — 最初にローカルパスを尋ねる(必須、スキップ禁止)
このスキルが起動した後の最初の文は、分析を開始するのではなく、ローカルパスを尋ねるものでなければなりません。以下の文言をコンテキストに合わせて使用し、4つのポイントを保持してください:何もアップロードされないこと、絶対パスが必要なこと、パスのコピー方法、オプションのファイルピッカー。
このファイルはこのマシン上でのみ分析します。いかなるクラウドサービスにも送信されず、レポート内の氏名、電話番号、住所、ID番号はマスキングされます。 絶対ローカルパスを指定してください。例:
/Users/you/Documents/ledger.xlsxまたはD:\data\ledger.xlsx。複数のファイルは改行で区切ってください。 パスをコピーするには:ファイルを右クリックし、「パスとしてコピー」(Windows)、またはファイルをターミナルにドラッグするか、Finderで⌥⌘C(macOS)を使用します。 「ファイルを選択して」と言っていただければ、ローカルファイルダイアログを開きます。
フォロースルー:
- ユーザーが「選択/ダイアログを表示」と言った場合 →
python "<skill_dir>/scripts/pick_path.py"(複数選択可)または--singleを実行します。出力されたパスを入力として使用します。終了コード2はGUIセッションがないことを意味し、ユーザーにパスを貼り付けるよう依頼します。 - ユーザーが「添付されています」と言ったが、パスのない添付カードのみの場合 → 次のセクションに従って処理します。添付ファイルを黙って読み取らないでください。
- パスを受け取った後、検証:パスが存在すること、拡張子がサポートされていること、ファイル数が妥当であること(約10ファイルを超える場合はタイプごとにグループ化)。
ユーザーがすでに添付ファイルをドロップした場合
何かを受け入れる前にリスクを明示します。
一つ注意点です:チャットにドロップされたファイルは、プラットフォームのサーバーにすでに保存されている可能性があり、そのパスはもはや完全にローカルとは言えません。 このファイルが機密情報や個人データを含む場合は、代わりにローカルパスを送信してください。そうすれば、このマシンからディスク上で読み取り、何も外部に出ることはありません。
ユーザーがそれでも添付ファイルを希望する場合、処理を進めますが、配信方法を正直に「入力はチャット添付からであり、プラットフォームのサーバーに到達した可能性があります」とラベル付けし、添付ファイルを「完全にローカル」とは決して呼ばないでください。
ステップ2 — ユーザーにモードを選択させる
2つのオプションからユーザーが選択する必要があります。指定がない場合は、通常モードを使用し、回答の最初の行でそのモードを明示します。
| 通常(デフォルト) | 厳格 | |
|---|---|---|
| レポートの内容 | 構造 + 統計 + マスキングされた値のプレビュー(最初のN行、本文抜粋) | 集計メトリクスのみ:行/列、型、非NULL率、個別値の数、範囲、平均 |
| 生テキスト | マスキングされたテキストがレポートに入り、モデルに表示される | 一切表示されない;モデルはメトリクスのみを見る |
| 適した用途 | 一般的な内部データ、意味解釈、文章による結論 | 顧客レコード、給与、医療データ、契約書、機密資料 |
| コスト | マスキングされた内容が推論コンテキストに入る | 意味判断不可、統計のみの回答 |
文言:
モードを選択してください:① 通常 — 構造、統計、マスキングされたプレビューを表示し、内容を読んで結論を導き出せます;② 厳格 — メトリクスのみ、レポート内に元のテキストは一切ありません。デフォルトは通常です。
必須のマスキング(すべてのモード、無効化不可)
マスキングはオプションではなく、デフォルトの動作です。スクリプトにはオフスイッチがなく、--mode strict は「マスキングがオプション」を意味しません — 厳格モードは、マスキングの上に「元のテキストなし」を追加するものです。
| カテゴリ | 対象フィールド | 結果 |
|---|---|---|
| 氏名 | 名前、口座名義人、連絡先、法定代理人、所有者、担当者、アカウントマネージャー、申請者、受取人、カード名義人、株主 | [NAME#1] |
| 連絡先 | 携帯電話、固定電話(市外局番含む)、FAX、メール | [PHONE#1] / [EMAIL#1] |
| 住所 | 住所、居住地、送付先住所、登録住所、本籍地 | 都道府県/市区町村は保持、残りは [ADDRESS#1];--mask-region で地域も非表示 |
| 身分証明 | 国民ID(18/15桁)、パスポート、渡航許可証、職員ID、統一社会信用コード | [ID#1] |
| 金融 | 銀行カード、口座番号、カード番号 | [ACCOUNT#1] |
| その他識別子 | ナンバープレート、顧客番号、従業員番号、会員番号、学生番号、社会保障番号、保険証券番号 | [PLATE#1] / [IDNO#1] |
3つの実装原則。配信ノートに引用可能:
- 安定した仮名。 同一のソース値は、同一実行内では常に同じ仮名にマッピングされます。「張三が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
コンソールにはファイルごとのタイプ、サイズ、マスキングフィールド、ヒット数、「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 "processed locally, nothing uploaded"
監査シートは5つのパートで構成されます:ソースファイルの整合性(ハッシュ再チェックによる読み取り専用、コピーなしの証明)、マスキング実行(スイッチ状態、カテゴリ、今回の実行のヒット数)、成果物目録、行ごとのレッドラインチェック、結論。終了コード0 = 合格、1 = 処理中にソースファイルが変更された。
ステップ6 — レポート
結論を最初に、データを次に、締めくくりの一文:
この分析はこのマシン上でのみ実行され、クラウドサービスは一切関与していません。ソースファイルは読み取り専用で変更されておらず、レポートは氏名、電話番号、住所、ID番号をマスキングしています(安定した仮名)。成果物は
.local_analysis/に、監査シートはaudit.mdにあります。
レッドライン(絶対にトリガーしてはいけない)
| カテゴリ | 禁止行為 | 代表的なツール |
|---|---|---|
| クラウド文書 | オンラインシート/ドキュメントを作成、インポート、「編集」 | Tencent Docs, Kingsoft Docs, Feishu Docs コネクタ |
| クラウドドライブ / オブジェクトストレージ | ファイルや成果物をアップロード | Tencent Drive, WeDrive, クラウドファイルストレージ |
| 知識ベース | ライブラリに書き込む、URLを取り込む | ライブラリアップロード, ima 知識ベース |
| 外部検索 | ソーステキストや断片をクエリとして使用 | Web検索、ページスクレイピング |
| オンライン変換 / OCR | オンラインPDF変換、オンライン解凍、オンライン画像認識 | 任意のオンラインツール、画像認識API |
| 外部送信 | ファイルやサマリーをチャット、メール、ボットに送信 | WeComメッセージ、メール、会議ノートのアップロード |
唯一の例外:ユーザーが明示的に「これはアップロード/送信してもよい」と言った場合。その場合でも、再表明し、行動する前に2回目の確認を得ます。
ファイルタイプごとのローカルパス
| タイプ | 推奨ローカル方法 | 注意事項 |
|---|---|---|
.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 | フォーマット、寸法、ハッシュのみ;ローカルOCRはtesseractが存在する場合のみ |
.xls .doc .ppt レガシーバイナリ | ユーザーにローカルで再保存、またはローカルエディターで開くよう依頼 | 内容を抽出するためにオンラインコンバーターに送信しない |
| スキャンPDF / テキスト内の画像 | ローカルOCR、またはユーザーに内容を口述してもらう | OCRがない場合、ギャップを正直に述べる — クラウドにルーティングしない |
特に画像:tesseractがない場合、メタデータとしてのみ扱い、「画像内容は認識されませんでした」と述べ、2つのローカルオプション(OCRをインストールして再実行、ユーザーが説明)を提供します。ビジョンモデルで「見る」ことはしないでください — それは画像を推論パスに送り込み、ユーザーの要求に反します。
デグレーションルール
- ローカルスクリプトで解析可能 → スクリプトの出力を使用。
- 抽出可能なテキストがない(スキャン、レガシーフォーマット、暗号化) → 理由を説明し、ローカルでの代替手段(ローカル再保存、ローカルOCR、ユーザーによる口述)を提供。
- ユーザーが「すぐに結果を」と要求 → モードの質問に戻る:「現在の状態では統計的にしか回答できませんが、よろしいですか?」
よくある間違い
- パスの要求をスキップして、チャット添付ファイルを直接分析する:ステップ1に違反。
report.md全体を回答に貼り付ける:レポートはワーキングペーパーであり、回答には結論と主要な数値が含まれます。- 厳格モードがマスキングを不要にすると信じること:2つの次元は独立しています。
- マスキングされていない値をコンソールや一時ファイルに出力して「データを見る」:マスキングは何かを書き出す前に行われなければなりません。
- ローカルで計算する代わりに推定する:推定は全データスケールではほとんどの場合間違っています。
- 「便利だから」と
.xlsをクラウドコンバーターに送信する:レッドラインに違反します;代わりにローカルで再保存してください。 - エンコーディングを無視する:GB18030のCSVをUTF-8として読み取ると、文字化けが発生し列プロファイルが汚染されます。スクリプトは処理しますが、手書きコードも同様に処理する必要があります。
言語に関する注意事項
検出ルールは、中国語データ形式(国民ID番号、省/市の住所、中国の姓)に加え、一般的なパターン(メール、電話、銀行カード、ナンバープレート)を対象としています。レポートとコンソール出力は現在中国語です;検出ロジックは、パターンが許す限り言語に依存しません。英語のみの文書の場合、構造化テーブルのマスキングは列ヘッダーを介して機能しますが、自由文の名前検出は弱いです — 過剰に約束するのではなく、そのように述べてください。