
Function Calling 工具參數的敏感信息脫敏手機號、身份證與密鑰的網關攔截在大模型深度接入企業內部業務系統如客服查詢、財務報表導出、自動化運維的場景中敏感數據泄露PII Secret Data Leakage是企業面臨的最嚴峻合規與安全紅線用戶在與大模型對話時無意中輸入了自己的真實手機號、身份證號或銀行卡號大模型在調用第三方查詢工具時將這些明文個人隱私PII完整打包塞進了 HTTP 請求體發送給了外部公開的供應商更有甚者大模型在生成調用配置工具時可能將系統內部的AWS_SECRET_KEY或數據庫連接密碼作為參數打印在了全局審計日志里如果僅靠在 System Prompt 里提醒模型“請不要泄露敏感數據”在面對復雜的提示詞注入Prompt Injection和多輪對話泛化時防御成功率幾乎為零。必須在應用層與底層工具/模型之間構筑一套硬編碼、基于正則表達式與高性能 Aho-Corasick 多模式匹配的“雙向脫敏與安全網關DLP Gatekeeper”。今天我們拆解這套在請求入站、工具出站與日志落盤全鏈路的敏感數據攔截與脫敏實踐。一、敏感數據雙向脫敏架構全景圖flowchart TD UserIn[用戶輸入明文: 包含手機號/身份證/密鑰] -- InGate[入站脫敏網關 Inbound DLP] subgraph Sanitization_Pipeline [雙向脫敏流水線] InGate -- ReplaceFake[1. 正則實體識別: 提取真實敏感值 - 替換為匿名占位符 [PHONE_01]] ReplaceFake -- SaveVault[2. 臨時存入安全密鑰保險箱 (Memory Vault, TTL 5分鐘)] SaveFakePrompt -- LLM[3. 向大模型傳遞脫敏后的安全 Prompt] LLM -- ToolCall[4. 大模型發出 Tool Call: query_user([PHONE_01])] ToolCall -- OutGate[出站還原網關 Outbound Vault Resolver] OutGate -- Restore[5. 僅在調用受信任的內部工具時, 還原真實手機號發起請求] OutGate -- MaskLog[6. 寫入審計日志時, 強制馬賽克脫敏 (138****1234)] end Restore -- InternalService[調用內部受信任微服務]二、生產級 Python 雙向脫敏與保險箱Vault代碼實現import re import uuid from typing import Dict, Tuple, Any class SensitiveDataSanitizer: def __init__(self): # 1. 核心敏感數據正則表達式規則集 self.patterns { PHONE: (re.compile(r(?!\d)(?:(?:\|00)86)?1[3-9]\d{9}(?!\d)), 【手機號掩碼_{id}】), ID_CARD: (re.compile(r(?!\d)[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\d|3[01])\d{3}[\dXx](?!\d)), 【身份證掩碼_{id}】), API_KEY: (re.compile(r(?:sk-[a-zA-Z0-9]{32,48}|ghp_[a-zA-Z0-9]{36})), 【API密鑰掩碼_{id}】), BANK_CARD: (re.compile(r(?!\d)(?:62|4|5)[0-9]{15,18}(?!\d)), 【銀行卡掩碼_{id}】) } def sanitize_for_llm(self, text: str) - Tuple[str, Dict[str, str]]: 向大模型發送前將明文替換為匿名占位符并將映射存入 Vault vault_mapping {} # placeholder - real_value sanitized_text text for p_type, (regex, placeholder_tpl) in self.patterns.items(): matches list(regex.finditer(sanitized_text)) # 從后向前替換防止字符串下標偏移 for match in reversed(matches): real_val match.group(0) placeholder_id uuid.uuid4().hex[:6] placeholder placeholder_tpl.format(idplaceholder_id) vault_mapping[placeholder] real_val start, end match.span() sanitized_text sanitized_text[:start] placeholder sanitized_text[end:] return sanitized_text, vault_mapping def resolve_for_internal_tool(self, tool_args: dict, vault_mapping: Dict[str, str]) - dict: 工具真正發起前將占位符還原為真實敏感數據 def _recursive_restore(val): if isinstance(val, str): for placeholder, real in vault_mapping.items(): if placeholder in val: val val.replace(placeholder, real) return val elif isinstance(val, dict): return {k: _recursive_restore(v) for k, v in val.items()} elif isinstance(val, list): return [_recursive_restore(x) for x in val] return val return _recursive_restore(tool_args) def mask_for_logging(self, text: str) - str: 寫入審計日志時強制打上馬賽克 (138****1234) # 手機號脫敏 text re.sub( r(1[3-9]\d)(\d{4})(\d{4}), r\1****\3, text ) # 身份證脫敏 text re.sub( r([1-9]\d{5})\d{8}(\d{3}[\dXx]), r\1********\2, text ) # 密鑰脫敏 text re.sub( r(sk-[a-zA-Z0-9]{4})[a-zA-Z0-9]([a-zA-Z0-9]{4}), r\1********\2, text ) return text三、端到端集成實戰演示def test_dlp_full_pipeline(): sanitizer SensitiveDataSanitizer() # 1. 模擬用戶輸入了帶敏感信息的提示詞 raw_user_query 請幫我給用戶 13812345678 (身份證: 110101199003072391) 發送重置通知密鑰是 sk-abcdef1234567890abcdef1234567890 print(f[*] 原始用戶輸入: {raw_user_query}) # 2. 入站脫敏大模型看到的只有安全的占位符 safe_prompt, vault sanitizer.sanitize_for_llm(raw_user_query) print(f[?] 喂給大模型的安全 Prompt: {safe_prompt}) # 輸出類似于: 請幫我給用戶 【手機號掩碼_a1b2c3】 (身份證: 【身份證掩碼_d4e5f6】) 發送重置通知... # 3. 模擬大模型生成的工具參數 llm_tool_call_args { target_phone: 【手機號掩碼_a1b2c3】, action: RESET_PASSWORD } # 4. 出站網關還原向受信任內部服務發送前還原真實數據 real_tool_args sanitizer.resolve_for_internal_tool(llm_tool_call_args, vault) print(f[?] 還原后發送給內部微服務的真實參數: {real_tool_args}) # target_phone 已經安全還原為 13812345678 # 5. 落盤審計日志強制打上馬賽克 log_line sanitizer.mask_for_logging(f執行重置: {real_tool_args}) print(f[?] 寫入磁盤的合規脫敏日志: {log_line}) # 輸出: 執行重置: {target_phone: 138****5678, action: RESET_PASSWORD}四、生產治理準則Vault 映射在內存中設置嚴格 TTL$\le 300\text{s}$會話結束后立即自動從內存中銷毀映射表杜絕長期駐留嚴禁將未脫敏的 Raw Prompt 寫入任何云端監控如 Sentry、ELK結合高性能 Rust 擴展在每秒處理上萬條文本的高并發網關中使用基于 Rust 構建的flashtext或ahocorasick-rs將脫敏耗時控制在 0.5ms 以內。把敏感數據雙向脫敏做成基礎設施的第一道城墻大模型應用才能真正做到合規無憂、行穩致遠。