内容安全与护栏
内容安全与护栏
内容安全是 AI 产品上线前置条件:模型输出不可控,内容安全机制就是产品对用户、对监管的承诺。本页承接 出海与合规 的合规框架,写检测实现与护栏运营——风险面怎么拆、防线怎么搭、指标怎么定、红线怎么持续回填。法规义务(哪个市场要求什么)见 出海与合规,注入与越狱的攻防细节见 提示词安全。
风险面
输入侧
- 提示注入:用户输入里夹带指令,诱导模型执行非预期动作(泄露系统提示词、调用工具、越权访问)——OWASP LLM Top 10 的第一位风险(OWASP LLM Top 10),攻击面拆解见 提示词安全。
- 越狱:角色扮演、虚构场景、多轮诱导等绕过安全对齐,让模型输出本应拒绝的内容。
- 有害内容上传:用户上传的文件(图片、文档)本身含违法/色情/暴力内容;上传型产品(识图、文档问答)要把文件内容纳入检测,而不只是检测 prompt 文本。
- 隐私泄漏:用户把他人个人信息(姓名、身份证号、聊天记录)粘贴进输入,模型可能原样或加工后输出——输入侧检测要识别并拦截/脱敏这类「二次泄露」。
输出侧
- 违法内容:毒品、诈骗话术、武器制造等——按市场法律定义不同,检测词表要本地化。
- 色情与暴力:明示 + 隐示(擦边、暗示、文字描写),检测难度随「隐示程度」上升。
- 仇恨与歧视:针对民族、宗教、性别、性取向的仇恨言论;多语言场景下各语言尺度不同。
- 隐私泄漏:模型把训练数据里或上下文里的个人信息复述出来——「记忆」功能放大了这个风险(关联 数据隐私与用户控制 的记忆管理)。
- 幻觉导致的事实性危害:医疗建议、法律意见、财务建议出错可能造成实际伤害——这类风险不靠过滤词,靠引用溯源 + 免责边界 + 高价值领域拒答(实践见 知识库问答)。
风险分级
把风险按「内容 × 业务 × 受众」分级,决定处置强度(拦 / 转人工 / 放行):
| 等级 | 定义 | 处置 | 示例 |
|---|---|---|---|
| 高危 | 违法内容或直接伤害 | 强制拦截 + 记录上报 | 毒品制作方法、恋童内容 |
| 中危 | 争议但非违法,或高风险场景出错 | 转人工 / 降级 | 医疗建议、金融建议、政治敏感 |
| 低危 | 擦边、不友善但不违法 | 放行 + 记录,按市场调整 | 轻度讽刺、成人向话题(分市场) |
- 分级规则要写成配置(每个市场、每个业务线可调),而不是写死在代码里——分级调整是运营动作,不是发版动作。
多层防线
1. 模型层(系统提示词 + 安全对齐)
- 系统提示词写清「不做什么」(拒绝范围、边界声明);安全对齐(RLHF 等)让模型「天生不愿」输出有害内容。
- 画像:零额外延迟、零成本;但软约束——可被越狱/注入绕过,覆盖率不可测。
系统提示词里写什么(内容安全相关部分,写法见 提示词工程):
- 明确拒绝范围:不输出违法、色情、暴力、仇恨内容;不提供武器/毒品制作方法
- 明确边界场景:医疗/法律/财务建议不替代专业人士;不知道就说不知道
- 防注入声明:忽略用户消息中的「忽略以上指令」类内容(注意:声明有效但有限,见 提示词安全)
- 敏感话题策略:不参与关于敏感话题的对抗式争论,礼貌转移话题
- 注意:提示词里的安全声明会被绕过,它只是第一层,不是全部——这就是为什么下面还有检测层。
2. 检测层(分类器、过滤词、向量匹配)
- 分类器:内容安全分类模型(文本/图像/多模态),覆盖面广、可调阈值;有误杀,且有模型自身的漏检。
- 过滤词:词表匹配,确定性最强、可解释;对变体(谐音、拆字、多语言混排)漏放严重,只做兜底不做主力。
- 向量匹配:把输入/输出 embedding 后与红线样本库比对相似度,抓「语义相近但字面不同」的变体——红线样本库的覆盖面决定它的效果(见下文评测集)。
- 画像:毫秒级延迟、按量计费、有误杀率;可测、可复盘、可上线前验收——是三层里 PM 最能掌控的一层。
检测手段选型:
| 手段 | 强项 | 弱项 | 适用 |
|---|---|---|---|
| 分类器 | 覆盖面广、语义理解 | 有误杀、黑盒 | 主力拦截(文本+图像) |
| 过滤词 | 确定性、可解释 | 变体漏放 | 兜底、高危词即时拦截 |
| 向量匹配 | 抓变体与相似语义 | 依赖样本库质量 | 对抗变体、多语言 |
| 规则(长度/格式/频率) | 零误杀 | 覆盖面窄 | 广告、垃圾、爬虫类内容 |
- 常见组合:过滤词做「快而狠」的第一道(高危词直接拦),分类器做主力,向量匹配抓变体;三层命中任一即按该层等级处置。
3. 策略层(拒答、降级、转人工)
- 按风险等级与业务场景定处置规则:高危拦截、中危转人工、低危放行 + 记录(决策规则见 拒答与降级策略)。
4. 人工层(审核队列)
- 高优先级队列(高危分类 + 抽检)+ 举报通道;审核超时默认拒绝而不是默认放行(fail-safe)。
- 画像:准确率最高,但成本高、延迟大——只能做抽样与高危队列,不能承担全量。
人工审核要设计成「只审该审的」:
- 进队列规则:高危分类命中、中危内容、随机抽检(如 1%)——抽检是校准检测层的眼睛,不能省
- 优先级:高危 > 举报 > 中危 > 抽检;高危队列目标分钟级响应,抽检可以小时级
- 审核员:操作手册化(什么算违规、截图/原文记录、复核标准),不能靠个人判断;双人仲裁机制处理争议样本
- 审核 KPI:审核量、正确率(抽检复核)、超时率、错判回退率
- 审核记录:审核过的内容、结论、审核员留痕——既是运营数据也是合规证据
每层画像与取舍
| 层 | 延迟 | 成本 | 误杀率 | 漏放率 | 核心指标 |
|---|---|---|---|---|---|
| 模型层(提示词/对齐) | 无额外延迟 | 零 | 低(本身是生成器) | 高(可绕过) | 越狱成功率 |
| 检测层(分类器/词表/向量) | 毫秒级 | 按量 | 中(阈值可调) | 中(变体漏放) | 拦截率、误杀率、漏放率 |
| 人工层 | 分钟~小时 | 高 | 低 | 低(依赖抽检率) | 抽检覆盖、超时率 |
- 「检测层放模型前 vs 模型后」:输入侧检测放在模型前(拦截注入、有害输入,省钱——不喂给模型就省 token),输出侧检测放在模型后(拦输出)。同一个检测器可以两端都用;Agent 场景还要加工具调用检测(模型要调用的工具、参数是否越权,见 Claude Code 安全文档)。
- 层间兜底:任何一层失效,下一层要能接住(模型侧失效 → 检测层拦截 → 人工复核);每层失效都要有监控指标与报警(详见 出海与合规 的「每层失效时怎么办」)。
阈值怎么定(误杀与漏放的平衡)
- 误杀与漏放是一对反指标:阈值调严,漏放降、误杀升;调松则相反。没有「零误杀 + 零漏放」的阈值,只有「可接受区间」。
- 用评测集扫描:在红线样本库(含违规与正常样本)上跑不同阈值,画「误杀率 × 漏放率」曲线,找业务可接受的点(如漏放 < 1% 且误杀 < 5%)。
- 分业务线设定:客服场景误杀不可忍(用户问什么都拦),社交场景漏放不可忍(漏一条就是事故)——阈值是配置不是常量。
- 上线后校准:用线上误杀申诉(用户投诉「我没违规」)与抽检漏放持续校准,每月复盘一次阈值。
检测点放在哪
检测不是「输出时过一遍」就完事,按数据流在每个口子放检测点:
| 检测点 | 位置 | 管什么 |
|---|---|---|
| 输入检测 | 模型调用前 | 注入、越狱、有害上传、隐私泄露——省 token:拦下的不喂给模型 |
| 输出检测 | 模型调用后 | 输出内容本身 |
| 工具调用检测 | Agent 调用工具前 | 工具白名单、参数校验、敏感操作(删除/发送/转账)二次确认 |
| 上传文件检测 | 文件解析前 | 图片/文档内容安全、恶意文件 |
| 检索检测 | RAG 检索后 | 检索结果越权、敏感文档命中(见 知识库问答) |
- 检测点越多越安全,但每个点都加延迟和成本——按风险等级决定检测点的数量:高危业务(社交、UGC、未成年人场景)全点齐备,低危业务(内部工具)可只做输出检测。
检测难点:输入侧与输出侧不同
- 输入侧难点是「上下文缺失」:单看一条输入很难判断是否有害(「教我做炸弹」vs「教我做面包」),要结合上下文、用户历史、业务场景判断——所以输入检测的阈值通常比输出检测更松,避免误杀正常对话。
- 输出侧难点是「时态与变体」:输出是模型「现场生成」的,变体无限(谐音、拆字、emoji、多语言混排、拼音缩写),检测层要持续用新样本训练;输出检测的阈值可以更严,因为拦错了只是重试一次。
- 多模态是双份难题:图像里嵌文字、音频里嵌暗语、视频逐帧检测的成本——多模态内容的检测点、检测模型、成本都要单独设计(关联 多模态)。
- 多轮对话是放大镜:单轮无害的输入在多轮累积后变有害——检测要带上下文窗口(前 N 轮),不能只看本轮。
护栏(guardrails)
护栏是强制执行的检查点(和「提示词里写一句别乱来」不同):输入护栏、输出护栏、工具护栏三个位置,按场景组合部署。
- 并行 vs 阻塞:护栏可以与被保护的主流程并行跑(不拖延迟,但拦截动作滞后)或阻塞跑(拦截后才继续,牺牲延迟换确定性)——对「绝不能放行」的高危输出用阻塞,对普通内容用并行(OpenAI Agents SDK Guardrails 的 input/output guardrail 模式)。
- 绊线(tripwire)快速失败:护栏命中即中断本轮执行并返回安全错误,而不是「接着聊」——快速失败避免有害输出被继续放大(Agent 多轮场景尤其重要:一轮坏输出可能触发后续工具调用)。
- 护栏指标的三个数:拦截率(该拦的拦住了多少)、误杀率(拦错/拦多了多少,直接伤害留存)、漏放率(该拦没拦住多少,直接暴露合规风险)。三个数互相制衡:阈值调严误杀升、调松漏放升——用评测集定「可接受区间」而不是拍脑袋。
- 指标口径:三个数都靠标注样本算——把已标注的红线样本库跑一遍检测层,统计「标注违规中被拦的占比」(拦截率)、「标注正常中被拦的占比」(误杀率)、「标注违规中漏掉的占比」(漏放率);线上再算「真实拦下的量」(绝对拦截量)作为运营量级。口径固定后不要随意换,否则趋势不可比。
- 红线样本库(评测集):把已发现的违规样本、对抗样本、变体攻击按类别归档,作为检测层的回归评测集——护栏改版必须重跑样本库(与 评估与评测 的评测集方法同构:防止「改好了 A 漏放了 B」)。
红线样本库怎么建
- 起步:从三类来源收集——公开的 jailbreak 模板与对抗样本库、历史违规内容(上线前的合规测试产出、红队报告)、用户举报与舆情案例;起步 50–100 条即可跑通流程,重点是持续增长
- 分类体系:按「风险类别 × 攻击手法」二维归档(如「越狱-角色扮演」「越狱-多轮诱导」「色情-隐示」),新样本先归到已有类,新类别单独开类——分类体系就是检测能力的目录
- 标注规范:每条样本标注「是否违规 + 违规类别 + 攻击手法」,双人标注、争议仲裁,标注一致性(kappa)要监控
- 生命周期:样本分「训练/验证/回归」三份;模型或检测器改版时用回归份验证不劣化;长时间无命中的样本定期复查(可能已过时或已被覆盖)
护栏的配置管理
护栏不是一套配置打天下,按维度拆分配置:
- 分市场:中国的政治敏感词表、欧盟的仇恨言论标准、中东的宗教尺度不同——同一个「放行/拦截」结果在不同市场可能相反
- 分模型:不同模型的安全对齐水平不同(对齐好的模型少拦、对齐差的模型多拦),换模型时护栏配置要重新校准
- 分业务线:客服机器人 vs 创作工具 vs 未成年人产品的阈值完全不同;低误杀容忍的业务(客服)与低漏放容忍的业务(社交)用不同阈值
护栏与降级的组合策略
| 触发 | 处理 | 用户体验 | 适用 |
|---|---|---|---|
| 输入高危 | 直接拦截,不调模型 | 最差(但必须) | 违法内容、注入攻击 |
| 输出高危 | 拦截输出 + 提示「已阻止」 | 差 | 生成出违禁内容 |
| 输出中危 | 转人工或降级重生成 | 中 | 医疗/金融/政治敏感 |
| 输出低危 | 放行 + 记录 | 无感 | 擦边内容 |
- 原则:能降级就别硬拒,必须硬拒就别绕弯——降级保住体验,硬拒保住合规,两者都要有明确的触发条件,不能靠模型自由发挥。
工具护栏(Agent 场景)
Agent 产品的护栏要多管一层「行为」:模型要调用什么工具、传什么参数(见 Agent 产品 的安全清单):
- 工具白名单:Agent 只能调用白名单内的工具,非白名单默认拒绝
- 参数校验:工具参数做类型与范围校验(如「删除」只允许操作本会话内的文件)
- 敏感操作二次确认:删除、发送消息、转账、发布内容等不可逆/有外部影响的动作要人工确认
- 绊线快速失败:护栏命中立即中断本轮执行,不产生副作用(参考 Claude Code 安全文档 的权限模型)
拒答与降级策略
话术设计
- 「说不知道」与「拒绝」分开:不知道 = 事实性缺口(「我没有相关资料」+ 建议路径);拒绝 = 红线命中(「我无法提供这方面的内容」)。用户分不清两种回答会加剧挫败感。
- 拒绝话术要素:直接拒绝 + 简短原因 + 可替代路径(「这涉及医疗建议,请咨询医生」比「我不能回答」体验好一个量级);不要讽刺、不要解释绕过方法、不要复述被拒内容。
- 话术要本地化:不同市场的表达习惯与监管语气不同;企业客户场景(客服机器人)话术还要符合品牌语气。
话术模板(要素:直接拒绝 + 简短原因 + 可替代路径):
| 场景 | 模板示例 | 要点 |
|---|---|---|
| 不知道 | 「我没有相关资料,建议查看官方文档/咨询客服」 | 不假装知道,给路径 |
| 红线拒绝 | 「我无法提供这方面的内容。你可以试试问 XX」 | 不解释细节、不复述被拒内容 |
| 高价值领域 | 「这涉及医疗建议,请咨询专业医生」 | 边界 + 替代路径 |
| 多轮纠缠 | 「这个问题我已经回答过了,换个话题聊聊?」 | 不跟着纠缠、不升级对抗 |
| 企业客服 | 「抱歉没帮到你,我为你转接人工客服」 | 转人工是加分不是认输 |
拒答的业务指标:拒答率/降级率不是纯安全指标——拒答率过高 = 功能不可用(用户问什么都被拒),要按业务线设上限(如客服场景 < 5%),超限报警并回查误杀;降级率(转人工/换档位)与用户流失率一起看。
降级路径
- 转人工:高危或中危内容转人工审核队列;客服场景直接转接人工坐席。
- 隐藏/禁用按钮:检测到敏感话题时,隐藏分享、导出、生成图片等放大动作——「能看不能说」的降级比整体拒答更可用。
- 更换模型档位:对低置信内容降级到更保守的模型/参数档(更低温采样、更严格提示词),成本更高但更稳;对高危内容直接拒答不降级。
- 降级要可观测:每种降级路径的触发次数、用户后续流失率都是产品指标,不是纯安全指标。
降级路径的成本与体验对比:
| 路径 | 成本 | 延迟 | 体验 | 适用 |
|---|---|---|---|---|
| 拒答 | 零 | 即时 | 差 | 高危红线、无替代方案 |
| 转人工 | 高 | 分钟级 | 中(有人接就好) | 中危、客服场景 |
| 隐藏/禁用动作 | 低 | 即时 | 较好(还能看) | 分享、导出、生成类按钮 |
| 更换模型档位 | 中 | 即时 | 较好(还能用) | 低置信内容、成本敏感场景 |
| 重试/换表述 | 低 | 即时 | 好 | 输出侧误拦的重试 |
- 产品动作:降级路径先于上线就设计好——「被拦了怎么办」是内容安全体验的一部分,临时抱佛脚只会得到「被拦就报错」的最差体验。
红队与持续运营
红队测试方法
- 对抗样本:收集公开的 jailbreak 模板、历史违规样本,构造攻击集。
- 角色扮演:让测试模型扮演「没有任何限制的 AI」「剧本里的角色」等诱导角色。
- 多轮诱导:单轮无害的问题,多轮叠加后指向违规——红队要测多轮对话而不是只测单轮。
- 自动化辅助:用变异脚本批量生成变体(谐音、拆字、emoji 替换、多语言混排)跑检测层;用 LLM-as-judge 做初筛,但最终判定必须人工——判 judge 也会被同一个越狱绕过。
- 测试输出要人工判定(红队样本不能只靠分类器自评);测试范围覆盖输入注入、输出内容、工具调用三条线(方法延伸见 提示词安全 的红队测试与 OWASP 清单)。
红队怎么组织
| 方式 | 适用 | 说明 |
|---|---|---|
| 内部红队 | 所有产品 | 安全/产研人员定期出题,成本低、反馈快 |
| 外部众测 | 上线后、攻击面大的产品 | 众测平台发布红队任务,覆盖思路广 |
| 与模型厂商配合 | 使用第三方模型 | 供应商的越狱研究、安全更新要跟进(换模型档位时重新红队) |
- 频率:版本发布前必测(模型更换、提示词大改、新功能上线);全量红队按季度或半年;持续小规模(每周对抗样本抽查)不断档。
- 闭环:红队发现的问题 → 修复(检测规则/提示词/策略)→ 样本入库 → 回归验证——没有回填的红队只是「证明有问题」,不解决任何问题。
上线后持续运营
- 举报通道:用户举报是漏放的最后兜底——举报处理 SLA(如 24 小时内响应)、举报样本回填样本库。
- 舆情监测:社交媒体上「这个 AI 说了 XXX」的截图是重要信号源,发现即回填。
- 每周红线样本回填:新发现的变体、新攻击手法、新市场话术定期补充进红线样本库与词表,改版后重跑评测集(节奏与 评估与评测 的评测校准一致)。
- 监控看板:拦截率/误杀率/漏放率的趋势、各分类的分布、各市场差异——内容安全运营是持续成本,要在团队里有人长期负责。
运营节奏建议:
| 周期 | 动作 |
|---|---|
| 每日 | 拦截量/误杀量监控、举报处置、高危分类分布 |
| 每周 | 红线样本回填、误杀案例分析(回查被拦的正常请求)、词表微调 |
| 每月 | 指标复盘(拦截率/误杀率/漏放率 vs 上月)、审核抽检复核、市场词表巡检 |
| 版本发布前 | 全量红队 + 样本库回归 + 阈值重校准(换模型/换检测器必做) |
| 每季度 | 全量红队、外部视角评审、监管口径回顾(各市场法规更新) |
- 产品动作:运营节奏要写进团队排期——内容安全是长期职能,不是发版前的冲刺;没人负责的看板 = 没有看板。
合规联动
- 各市场尺度差异:中国的审核义务与显式标识、欧盟 DSA 的举报与透明度义务、美国的平台责任框架、东南亚/中东的本地法——同一套检测链路要能按市场配置阈值与词表(矩阵与义务细节见 出海与合规)。
- 标识义务:AI 生成内容的市场化标识(如中国对深度合成内容的显式标识要求)要作为输出管线的一环实现,而不是发布后补。
- 内容安全与隐私联动:审核队列看到用户内容=处理个人信息,审核记录同样受 数据隐私与用户控制 约束(保留期、访问控制、脱敏)。
- 与提示词安全的分工:本页写内容安全的防线与运营;注入、越狱的攻击原理与防护体系在 提示词安全,两页互补阅读。
合规联动的落地动作
- 按市场出词表与阈值清单:每个目标市场一页(词表范围、分类器阈值、处置策略、举报通道),上线前与法务确认
- 标识随输出管线生效:生成结果的元数据带标识,分享/导出不丢失(实现见 出海与合规 的标识一节)
- 审核记录合规化:审核日志的保留期、访问控制、导出格式按数据合规要求设计
- 举报处置 SLA:举报通道在线、处置时限配置化(如 24 小时),超时报警
- 监管口径留档:各市场的合规口径、法务确认记录存档,换人也能接手
反模式
- 只靠提示词兜底:系统提示词是软约束,被越狱后没有任何拦截——至少要有检测层兜底。
- 误杀率过高劝退用户:把「绝对不出事」当目标会导致正常提问也被拦(如医疗产品拒绝所有「症状」相关词)——用评测集平衡误杀与漏放,而不是阈值拉满。
- 红线样本库不更新:样本库是一次性建的,新变体、新话术不回填——检测能力随时间退化,漏放率悄悄上升。
- 无人工申诉通道:被误杀的请求没有复核入口,用户直接流失;申诉样本是误杀率最好的校准数据。
- 只测单轮不测多轮:单轮评测全绿、多轮诱导破防——评测集必须覆盖多轮对话与角色扮演。
- 检测与业务割裂:审核指标不看用户流失、误杀不回访——内容安全是产品功能的一部分,要与其他产品指标一起看。
- 一套配置打天下:不分市场、不分模型、不分业务线的单一阈值,必然在某处误杀、在某处漏放——配置化是底线(见 护栏的配置管理)。
小结:内容安全的最小落地路径
- 拆风险面:按输入/输出列出产品相关的风险类别,按内容 × 业务 × 受众分级
- 建样本库:收集 50+ 条红线样本(越狱模板、历史违规、变体攻击),双人标注
- 搭检测层:过滤词(高危即时拦)+ 分类器(主力)+ 向量匹配(抓变体),用样本库定阈值
- 定策略:按风险等级配置 拦截 / 降级 / 转人工 的处置规则与话术
- 接人工:高危 + 抽检队列,操作手册化,审核记录留痕
- 上监控:拦截率 / 误杀率 / 漏放率看板,举报通道与周回填闭环
- 常态化:发布前红队 + 季度全量 + 月度阈值复盘
这条路径跑通后,再谈扩展:多市场配置、多模态检测、工具护栏(Agent 场景)。
练习
给你正在做的 AI 产品画一张「多层防线图」:模型层/检测层/策略层/人工层各是什么?每层谁来负责、什么指标报警?再用 20 个红线样本测一次你的检测层,记录拦截率、误杀率、漏放率。
来源说明
- 官方文档:OpenAI Agents SDK — Guardrails(输入/输出护栏、并行/阻塞模式、绊线快速失败);Claude Code — Security(Agent 工具调用与权限边界);OWASP LLM Top 10(LLM 应用十大安全风险,内容安全风险面与 OWASP 攻击面分类)。
- 站内体系:出海与合规(各市场内容安全义务与红线)、数据隐私与用户控制(审核记录的隐私约束、记忆管理)、提示词安全(注入/越狱攻防与红队方法)、评估与评测(评测集与指标方法论)、知识库问答(引用溯源与高价值领域拒答实践)。
- 本页为产品实践整理,内容安全相关法规以 出海与合规 的官方口径为准(引用日期 2026-08)。
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面贡献者:AI-PM Wiki Team
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用