给 Dify 应用加一层 AI 安全护栏:一个中间层的工程设计思路
很多团队用 Dify 搭 AI 应用时,第一阶段会把注意力放在应用编排上:知识库怎么接,工作流怎么拆,Agent 怎么调工具,模型效果怎么调。
这很正常。Dify 的价值就在于把 AI 应用搭建门槛降下来。
但应用一旦从 Demo 走向生产,另一个问题会冒出来:这个系统的安全边界在哪里?
用户输入可能污染上下文,模型输出可能越过业务边界,知识库可能暴露内部资料,Agent 可能因为一段恶意指令触发错误工具调用。这个时候,仅靠 prompt 约束模型,通常不够稳定。
一种更工程化的做法,是在 Dify 应用链路旁边增加一个 AI 安全护栏中间层。
一、为什么安全护栏更适合做成中间层
安全逻辑如果直接散落在业务代码、prompt、Dify 节点和模型调用里,短期看起来快,长期会变得很难维护。
常见问题是:
- 每个应用各写一套过滤逻辑,策略无法复用
- prompt 里堆了大量安全约束,效果却不可观测
- 输出异常后只能查业务日志,很难知道是哪条策略没有命中
- Agent 工具调用链路变长后,输入风险很难统一管理
- 不同业务场景的安全边界混在一起,误判和漏判都难排查
把安全护栏抽成中间层,核心目的不是“多加一层系统”,而是把安全策略、检测逻辑、审计日志和处理动作集中管理。
它可以独立于业务应用迭代,也可以服务多个 Dify 应用。
二、一个最小可用架构
可以先从一个最小架构开始:
Client
-> Guardrail Gateway
-> Dify App
-> Model Provider
-> Guardrail Output Review
-> Client
再展开一点:
┌────────────┐
│ Client │
└─────┬──────┘
│
┌─────▼────────────────┐
│ Guardrail Gateway │
│ - input detection │
│ - policy matching │
│ - request metadata │
└─────┬────────────────┘
│
┌─────▼────────────────┐
│ Dify App / Workflow │
│ - RAG │
│ - Agent │
│ - Tool calling │
└─────┬────────────────┘
│
┌─────▼────────────────┐
│ Output Review │
│ - sensitive data │
│ - unsafe response │
│ - business rules │
└─────┬────────────────┘
│
┌─────▼────────────────┐
│ Audit & Metrics │
│ - trace id │
│ - risk type │
│ - action │
│ - latency │
└──────────────────────┘
这个结构有几个好处。
第一,业务应用不需要理解所有安全规则,只要把请求交给中间层处理。
第二,策略可以集中配置,多个 Dify 应用可以共享底层检测能力。
第三,日志结构更统一,后续做审计、复盘、报表和策略优化会更容易。
三、输入侧:不要等风险进入模型上下文
输入检测应该发生在请求进入 Dify 应用之前。
它要解决的问题是:这条请求是否应该进入后续链路?
可以按风险类型拆成几类:
input_risk:
- prompt_injection
- jailbreak
- sensitive_data
- privilege_escalation
- malicious_instruction
- business_policy_violation
处理动作也不一定只有 block。
更合理的动作集合可能是:
action:
- allow
- block
- mask
- rewrite
- require_confirmation
- route_to_human
比如用户输入里包含手机号,不一定要直接拒绝,可以脱敏后继续;用户试图让模型忽略系统规则,可以直接拦截;用户触发了高风险工具调用,则可以要求二次确认。
这比简单的“命中词表就拒绝”更适合企业应用。
四、输出侧:审查的不只是文本
输出审查很容易被低估。
很多人会把它理解成内容审核,但 LLM 应用里的输出风险更复杂。模型返回的可能是 Markdown、表格、代码、链接、引用来源、工具调用结果,甚至是多轮上下文综合后的结论。
输出审查至少要看几类问题:
- 是否泄露敏感信息
- 是否给出业务规则之外的承诺
- 是否包含不应该出现的链接或操作建议
- 是否引用了越权资料
- 是否把不确定结论写成确定结论
- 是否触发行业场景里的特殊限制
在工程实现上,输出审查最好不要只在最终响应结束后执行。对于流式输出,系统需要在 chunk 级别做增量检测。
伪代码可以这样理解:
async function streamWithGuardrail(modelStream, context) {
for await (const chunk of modelStream) {
const decision = await outputGuardrail.check({
chunk,
context,
});
if (decision.action === "block") {
yield "当前回答存在风险,已停止输出。";
break;
}
if (decision.action === "mask") {
yield maskSensitiveContent(chunk);
continue;
}
yield chunk;
}
}
真实生产环境里还需要考虑缓冲窗口、跨 chunk 实体识别、低延迟返回和误判兜底,但核心思想是:输出审查要进入流式链路,而不是只做最终结果扫描。
五、策略层:规则要跟业务场景绑定
安全策略不能只按“全局规则”设计。
同样一句回答,在不同业务场景里风险不同。客服场景里的错误承诺、知识库场景里的越权引用、Agent 场景里的工具调用风险,本质上不是同一种问题。
一个更可维护的策略结构可以是:
policy:
app_id: customer_service_bot
scene: customer_support
role: external_user
rules:
- type: sensitive_data
direction: output
action: mask
- type: unsupported_commitment
direction: output
action: block
- type: prompt_injection
direction: input
action: block
这里有几个关键字段:
app_id:区分不同 Dify 应用scene:区分客服、知识库、Agent、Copilot 等场景role:区分外部用户、内部员工、管理员等角色direction:区分输入侧和输出侧action:定义命中规则后的动作
这样做的好处是,安全策略可以跟应用一起迭代,而不是堆在一个全局黑名单里。
六、日志层:没有审计就没有迭代
安全护栏如果没有日志,就很难长期维护。
一次检测至少应该记录这些字段:
{
"trace_id": "req_20260604_001",
"app_id": "knowledge_base_bot",
"scene": "internal_knowledge_base",
"direction": "input",
"risk_type": "prompt_injection",
"risk_level": "high",
"action": "block",
"policy_id": "policy_knowledge_001",
"latency_ms": 42,
"created_at": "2026-06-04T10:00:00+08:00"
}
这些日志有三个用途。
第一,用来排查问题。某次异常输出到底是输入诱导、知识库引用、策略漏配,还是输出审查没有命中。
第二,用来优化策略。哪些规则误判高,哪些风险经常出现,哪些应用需要单独配置策略。
第三,用来支撑治理。对于企业内部安全、合规或审计团队来说,没有日志就很难证明系统做过什么处理。
七、工程取舍:别一开始就做成“大而全”
如果团队第一次给 Dify 应用加安全护栏,不建议一开始就追求完整平台。
更合理的顺序是:
- 先接入输入检测和输出审查两个关键节点
- 再沉淀统一日志结构
- 再按应用和场景拆策略
- 最后再做报表、工作台和自动化复盘
第一版最重要的不是功能多,而是链路清楚:请求从哪里来,经过哪些检测,命中什么策略,采取什么动作,日志能不能追溯。
只要这条链路建立起来,后续才有持续迭代的空间。
八、什么时候需要接入这类中间层
不是所有 Dify 应用一开始都需要复杂安全护栏。
如果只是个人实验、内部低频测试、无敏感数据场景,基础 prompt、权限控制和人工检查可能已经够用。
但如果满足下面任意几条,就应该认真考虑中间层方案:
- 应用接入真实用户
- 知识库包含内部资料
- Agent 会调用工具或触发流程
- 输出内容会影响用户决策
- 行业涉及金融、政务、医疗、教育等敏感场景
- 团队需要保留日志用于复盘或审计
这些情况里,AI 安全已经不是“内容审核功能”,而是生产链路的一部分。
九、总结
给 Dify 应用加安全护栏,本质上是在补齐生产环境里的运行时治理。
它不替代 Dify 的应用编排能力,也不替代模型能力,而是把输入检测、输出审查、场景策略和日志审计放进一条可维护的工程链路里。
对开发团队来说,最值得先做的不是设计一个完整安全平台,而是把中间层的边界想清楚:在哪里检测,怎么决策,如何处理,如何记录,如何迭代。
注:本文为架构设计思路,不涉及具体采购建议。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)