提示

返回博客列表

用户把兑换码贴进来了

客服在群里发了张截图,问"这算不算要处理一下"。

截图里用户一口气贴了三样东西:一个兑换码、一个手机号、还有半段 Cookie 似的长字符串。原话大意是"我按你们说的填了,还是提示无效,你帮我看下是不是这串"。

很自然的一句话。用户以为自己在跟人说话,把能提供的都提供了。可对面是模型,这段文本会原样进请求体,发到外面的服务商去。

先看清走到哪几处

我把那条链路从头捋了一遍:

def _maybe_ai_reply(request, session, content, history):
    if not is_ai_online_available():
        return None
    text = ai_chat.generate_reply(user_content=content, history=history)
    return text

content 是用户原话。进 generate_reply 之前有一句 user_content[:1000],裁的是长度,不是内容。所以手机号、兑换码、那半段长字符串,只要在前一千字里,就全在 messages 里。

再往后还有两处会留痕:一是我们后来加的回复内容日志(截断 200 字),二是 ChatMessage 表里那条原始消息——这个本来就该存,客服得靠它看上下文。

所以问题不是"要不要存",是"哪些副本要脱敏"。发给模型和写进审计日志的那两份可以处理,聊天记录本身不能动。一开始就有人提议直接在入库前全局替换,被客服否了:兑换码被人改成了 [CODE],他们拿什么帮用户查。

分两份存

最后的做法是在发送侧单独做一遍,不动原消息:

MASK_RULES = [
    (re.compile(r'1[3-9]\d{9}'), '[PHONE]'),
    (re.compile(r'\b[A-Z0-9]{4}(-[A-Z0-9]{4}){2,}\b'), '[CODE]'),
    (re.compile(r'[\w.+-]+@[\w-]+\.[\w.]+'), '[EMAIL]'),
    (re.compile(r'(?i)(cookie|token|authorization)\s*[:=]\s*\S{12,}'), '[SECRET]'),
]

def mask_for_model(text):
    for pat, repl in MASK_RULES:
        text = pat.sub(repl, text)
    return text[:1000]

generate_reply 里改成用 mask_for_model(content),会话表里仍是原文。模型看到的是「我按你们说的填了,还是提示无效,你帮我看下是不是 [CODE]」,够它判断这是兑换码问题,能正常答。

这个取舍我想了挺久:脱敏会不会让模型答不准?实测大部分情况不会,因为它需要的是意图,不是具体码值。真需要查某个码的状态时,本来也该转人工,模型查不了。

日志那份更严格一些,连用户原话都只留前 200 字,而且是脱敏后的版本。审计要用的时候能看出"这轮涉及兑换码",看不到码本身。

规则越加越多

上线第一周就补了四条。

有人把兑换码写成一串没分隔符的纯数字,正则没盖住;有人贴邮箱时中间加了空格防自动识别;有人写「密码是 abc123」——这是最麻烦的一类,因为"密码"后面那串东西没有固定格式,你没法穷举。

还有误伤。订单号是 12 位纯数字,被其中一条规则当成了可疑串替换掉,模型收到后少了一条关键信息,答非所问。查了半天才发现是脱敏干的好事,不是模型不行。

现在 MASK_RULES 里有九条。函数上面挂着一行注释,是我同事写的:「别再加第十条了」。上周我自己加了第十条,没改注释。

没解决的部分

自定义格式基本防不住。用户把密钥拆成几段发,或者用拼音、用截图,正则全瞎。截图这条尤其没辙——我们客服窗口能收图片,但 AI 那路只处理文本,图片直接走人工,算是歪打正着避开了。

另外脱敏规则本身放在代码里,改一次要发一次版。有人提过挪到配置里热更新,我觉得对,一直没做,因为要顺带处理"改了规则之后历史日志怎么解释"。

还有件事说不清楚边界:用户贴了别人的手机号算不算我们要负责的敏感信息?现在一律脱敏,宁可多此一举。真要较真,得先定义什么叫"用户主动提供",这已经不是技术活了。

VidDown 上兑换码那套规则也是被各种输入磨出来的,另一篇写过。

那条消息后来被新消息刷上去了,没人再回。倒是那个兑换码的格式我记到了现在,第十条正则就是照着它写的。

想亲手试试?用 VidDown 一键解析下载

粘贴视频链接即可解析,多平台支持、网页端即用;下载桌面客户端解锁海外平台本地解析,开通会员更享不限次下载。

顶部