很多团队用 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 应用加安全护栏,不建议一开始就追求完整平台。

更合理的顺序是:

  1. 先接入输入检测和输出审查两个关键节点
  2. 再沉淀统一日志结构
  3. 再按应用和场景拆策略
  4. 最后再做报表、工作台和自动化复盘

第一版最重要的不是功能多,而是链路清楚:请求从哪里来,经过哪些检测,命中什么策略,采取什么动作,日志能不能追溯。

只要这条链路建立起来,后续才有持续迭代的空间。

八、什么时候需要接入这类中间层

不是所有 Dify 应用一开始都需要复杂安全护栏。

如果只是个人实验、内部低频测试、无敏感数据场景,基础 prompt、权限控制和人工检查可能已经够用。

但如果满足下面任意几条,就应该认真考虑中间层方案:

  • 应用接入真实用户
  • 知识库包含内部资料
  • Agent 会调用工具或触发流程
  • 输出内容会影响用户决策
  • 行业涉及金融、政务、医疗、教育等敏感场景
  • 团队需要保留日志用于复盘或审计

这些情况里,AI 安全已经不是“内容审核功能”,而是生产链路的一部分。

九、总结

给 Dify 应用加安全护栏,本质上是在补齐生产环境里的运行时治理。

它不替代 Dify 的应用编排能力,也不替代模型能力,而是把输入检测、输出审查、场景策略和日志审计放进一条可维护的工程链路里。

对开发团队来说,最值得先做的不是设计一个完整安全平台,而是把中间层的边界想清楚:在哪里检测,怎么决策,如何处理,如何记录,如何迭代。

注:本文为架构设计思路,不涉及具体采购建议。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐