
如何为聊天机器人或 AI Agent 接入内容审核

为聊天机器人或 AI Agent 加入内容审核,远不止是"屏蔽敏感词"那么简单。一个生产级工作流需要同时检查用户输入、模型输出,以及 Agent 被允许执行的操作。
最清晰的思维模型是:
input moderation
-> model or agent reasoning
-> tool-call validation
-> output moderation
-> allow / review / block要点速览
- 在用户消息到达聊天机器人或 Agent 之前进行审核。
- 在模型输出展示给用户之前进行审核。
- 在 Agent 执行操作之前校验工具调用。
- 不要把内容审核当作完整的 Prompt 注入防御。
- 对中等风险或高影响操作启用人工审核。
- EvoLink 的
evolink_summary.risk_level可以简化 放行 / 人审 / 拦截 逻辑。
内容审核 ≠ Agent 安全
内容审核的作用是识别有害文本或图片,降低不安全 Prompt、有害输出和违规用户内容的风险。
Agent 安全的范畴更广,包括 Prompt 注入防护、工具权限管控、数据访问控制、人工审批、结构化输出、评测、日志记录和工作流设计。
OpenAI 的 Agent 安全指南建议综合使用护栏、工具审批、链路评分、评测和结构化工作流等手段。OWASP 则将 Prompt 注入列为独立的 LLM 安全风险类别,可能导致数据泄露、意外操作或工具滥用。
参考资料:
结论:审核是护栏之一,但不应是唯一的护栏。
第 1 层:输入审核
输入审核在用户消息到达模型之前进行检查。
适用场景:
- 明显的有害请求
- 违反平台政策的用户消息
- 辱骂或骚扰性文本
- 不安全的图片上传
- 要求生成违规内容的 Prompt
输入审核的价值在于,它能在最前端拦截明显不安全的请求,使其根本不会进入模型工作流。
def handle_user_message(user_input: str):
input_check = client.moderations.create(
model="evolink-moderation-1.0",
input=user_input
)
if input_check.evolink_summary.risk_level == "high":
return {
"status": "blocked",
"message": "I can't help with that request."
}
return run_chatbot(user_input)重要局限:输入审核不是完整的 Prompt 注入防御。攻击者可以通过间接 Prompt、编码文本、图片、外部文档或工具输出,在工作流的后续环节影响 Agent 行为。
第 2 层:输出审核
输出审核在模型响应展示给用户之前进行检查。
适用场景:
- 不安全的生成内容
- 违反政策的回复
- 在敏感领域给出的有害建议
- 输入看似安全但仍产生的问题回复
def safe_chat(user_input: str):
input_check = moderate(user_input)
if input_check.evolink_summary.risk_level == "high":
return "I can't help with that request."
answer = llm.generate(user_input)
output_check = moderate(answer)
if output_check.evolink_summary.risk_level == "high":
return "I generated a response that needs to be revised. Please try rephrasing."
return answer输出审核对公开聊天机器人、AI 副驾以及生成内容直接面向用户的工作流尤其重要。
第 3 层:工具调用校验
对 AI Agent 而言,工具调用往往是风险最高的环节。
如果 Agent 能发送邮件、查询数据库、更新工单、调用 API 或写入文件,那么工具调用在执行前必须经过校验。这不仅仅是内容审核,更是权限控制和策略执行。
校验要点:
- 工具名称
- 允许的用户或账户范围
- 是否需要人工审批
- 允许的参数值
- 读操作 vs 写操作
- 外部收件人
- 破坏性操作
- 数据外泄风险
def validate_tool_call(tool_name: str, args: dict, user_context: dict):
if tool_name == "send_email":
if not args["to"].endswith("@company.com"):
return False, "External email requires approval."
if tool_name == "database_query":
query = args.get("query", "")
forbidden = ["DROP ", "DELETE ", "TRUNCATE "]
if any(word in query.upper() for word in forbidden):
return False, "Destructive database operation blocked."
if tool_name == "refund_customer":
if args["amount"] > user_context["approval_limit"]:
return False, "Refund amount requires human approval."
return True, NoneOpenAI 的 Agent 安全指南同样建议对 MCP 工具保持审批开启,以便终端用户能够审查和确认操作。
第 4 层:放行 / 人审 / 拦截 路由
二元的"安全/不安全"判定通常过于粗暴。更实用的生产模式是:
| 风险等级 | 动作 |
|---|---|
| 低 | 放行 |
| 中 | 排队人审、发出警告或限制分发 |
| 高 | 拦截或要求申诉 |
evolink_summary.risk_level 字段就是为这种路由设计的。def route_by_risk(content: str):
result = client.moderations.create(
model="evolink-moderation-1.0",
input=content
)
risk = result.evolink_summary.risk_level
if risk == "high":
log_block(result)
return {"action": "block"}
if risk == "medium":
queue_for_review(content, result)
return {"action": "review"}
return {"action": "allow"}完整的聊天机器人审核模式
以下是一个实用的端到端结构:
def handle_chatbot_turn(user_input: str, user_context: dict):
# 1. Moderate input
input_route = route_by_risk(user_input)
if input_route["action"] == "block":
return "I can't help with that request."
if input_route["action"] == "review":
log_review_event("input", user_input)
# 2. Generate model response and proposed tool calls
agent_result = agent.run(user_input, user_context)
# 3. Validate tool calls before execution
for call in agent_result.tool_calls:
ok, reason = validate_tool_call(call.name, call.args, user_context)
if not ok:
log_security_event(call, reason)
return "That action requires additional review."
# 4. Execute approved tools
tool_outputs = execute_tool_calls(agent_result.tool_calls)
# 5. Generate final response
final_answer = agent.format_response(tool_outputs)
# 6. Moderate output
output_route = route_by_risk(final_answer)
if output_route["action"] == "block":
return "I need to revise that response."
if output_route["action"] == "review":
queue_for_review(final_answer, output_route)
return final_answer具体实现因项目而异,但整体结构是稳定的:检查输入、约束操作、检查输出、记录决策。
处理误报
误报不可避免。目标是在减少伤害的同时,不过度拦截正常用户。
以下场景应进入人审队列:
- 中等风险内容
- 上下文不明确的内容
- 政策敏感类别
- 高价值用户或高影响操作
- 申诉请求
每次审核决策都应记录足够的上下文以便后续排查:
- 内容哈希
- 用户 ID 或账户 ID
- 风险等级
- 触发的审核类别
- 执行的动作
- 人审覆写结果
- 时间戳
除非有明确的数据保留和隐私政策,否则避免记录原始敏感内容。
对内部的合理承诺
不要承诺审核能让聊天机器人"100% 安全"。
更务实的承诺是:
- 有害输入在模型执行前会被检查
- 模型输出在展示给用户前会被检查
- Agent 工具调用在执行前会被校验
- 高风险或模糊的情况可以路由给人工处理
- 日志和人审结果会用于持续优化阈值
这才是现实的生产安全姿态。
常见错误
错误 1:只审核输入
输入检查有用,但模型仍然可能生成不安全的内容。在展示给用户之前,务必审核输出。
错误 2:把 Prompt 当安全边界
系统 Prompt 能引导模型行为,但不应作为唯一的安全层。应结合工具权限、结构化工作流和审批机制。
错误 3:让 Agent 不经校验就执行工具调用
务必在模型之外校验工具调用。模型应该提议操作,而你的应用来决定该操作是否被允许。
错误 4:凡是不确定就全部拦截
过于严格的系统会造成用户挫败感。对不确定的内容,应该送人审而不是一律拦截。
错误 5:不记录日志
没有日志,你无法调优阈值、调查事故或理解误报。
上线检查清单
- 在模型调用前审核用户输入。
- 在展示给用户前审核模型输出。
- 在执行前校验 Agent 工具调用。
- 使用 放行 / 人审 / 拦截 路由策略。
- 将中等风险内容排入人审队列。
- 在需要时提供用户举报和申诉通道。
- 记录风险等级、触发类别、执行动作和人审覆写。
- 除非必要,避免存储原始敏感内容。
- 用产品中的真实案例进行测试。
- 上线后根据生产数据重新审视阈值。
FAQ
聊天机器人应该审核输入还是输出?
都要。输入审核在不安全的请求到达模型之前就将其拦截;输出审核在用户看到之前捕获不安全的生成内容。
内容审核能防止 Prompt 注入吗?
不能。审核可以捕获部分不安全或可疑内容,但 Prompt 注入需要更全面的防御手段,包括工具调用校验、结构化输出、最小权限原则、人工审批和工作流隔离。
AI Agent 中应该在哪里部署审核?
在模型处理之前对用户输入做审核,在展示之前对模型输出做审核,同时结合工具调用校验来覆盖 Agent 执行的每一个操作。
EvoLink 如何帮助聊天机器人审核?
evolink_summary.risk_level 字段让你更方便地将聊天内容路由到 放行、人审 或 拦截 流程。还需要人工审核吗?
对于生产系统,是的。人工审核在申诉处理、中等风险判定、政策变更和高影响决策中不可或缺。
相关审核指南
- OpenAI Moderation API 定价:到底免不免费?限制与替代方案
- 图片审核 API 指南:如何过滤不安全的用户上传图片
- omni-moderation-latest 详解:OpenAI Moderation API 指南
- 最佳内容审核 API 与工具推荐


