Skip to main content
智能体执行的关键节点进行内容验证和过滤,以帮助您构建安全、合规的AI应用。它们可以检测敏感信息、执行内容策略、验证输出,并在它们造成问题之前防止不安全行为。 常见用例包括:
  • 防止个人身份信息(PII)泄露
  • 检测并阻止提示注入攻击
  • 阻止不适当或有害内容
  • 执行业务规则和合规性要求
  • 验证输出质量和准确性
您可以使用中间件来实现守卫,在关键点拦截执行 - 在智能体开始之前、完成之后,或者在模型和工具调用周围。
Middleware流程图
围栏可以通过两种互补的方法实现:

Deterministic guardrails

使用基于规则的逻辑,如正则表达式模式、关键字匹配或显式检查。快速、可预测且成本低,但可能会错过细微的违规行为。

Model-based guardrails

使用LLMs或分类器通过语义理解评估内容。捕捉规则遗漏的微妙问题,但速度较慢且成本更高。
LangChain提供了内置的防护措施(例如,个人身份信息检测人工干预),以及一个灵活的中间件系统,用于使用任一方法构建自定义防护措施。

内置安全措施

个人信息识别

LangChain 提供了用于检测和处理对话中个人身份信息(PII)的内置中间件。此中间件可以检测常见的 PII 类型,如电子邮件、信用卡、IP 地址等。 个人身份信息检测中间件对于需要合规性要求的医疗保健和金融应用、需要清理日志的客户服务代理以及处理敏感用户数据的任何应用程序都非常有用。 PII 中间件支持多种处理检测到的个人身份信息的策略:
策略描述示例
redact替换为 [REDACTED_TYPE][REDACTED_EMAIL]
mask部分隐藏(例如,最后4位数字)****-****-****-1234
hash替换为确定性哈希a8f5f167...
block检测到时抛出异常抛出错误
import { createAgent, piiRedactionMiddleware } from "langchain";

const agent = createAgent({
  model: "openai:gpt-4o",
  tools: [customerServiceTool, emailTool],
  middleware: [
    // Redact emails in user input before sending to model
    piiRedactionMiddleware({
      piiType: "email",
      strategy: "redact",
      applyToInput: true,
    }),
    // Mask credit cards in user input
    piiRedactionMiddleware({
      piiType: "credit_card",
      strategy: "mask",
      applyToInput: true,
    }),
    // Block API keys - raise error if detected
    piiRedactionMiddleware({
      piiType: "api_key",
      detector: /sk-[a-zA-Z0-9]{32}/,
      strategy: "block",
      applyToInput: true,
    }),
  ],
});

// When user provides PII, it will be handled according to the strategy
const result = await agent.invoke({
  messages: [{
    role: "user",
    content: "My email is john.doe@example.com and card is 4532-1234-5678-9010"
  }]
});
内置PII类型:
  • email - 电子邮件地址
  • credit_card - 信用卡号码(Luhn验证)
  • ip - IP地址
  • mac_address - MAC地址
  • url - 网址
配置选项:
参数描述默认值
piiType要检测的PII类型(内置或自定义)必需
strategy如何处理检测到的PII("block""redact""mask""hash""redact"
detector自定义检测器正则表达式模式undefined(使用内置)
applyToInput在模型调用前检查用户消息true
applyToOutput在模型调用后检查AI消息false
applyToToolResults在执行后检查工具结果消息false
查看中间件文档以获取关于PII检测功能的完整详细信息。

人工增强循环

LangChain 提供了内置的中间件,用于在执行敏感操作前要求人工审核。这是对高风险决策最有效的防护措施之一。 人机交互中间件对于金融交易和转账、删除或修改生产数据、向外部发送通讯以及任何具有重大业务影响的操作等情况非常有帮助。
import { createAgent, humanInTheLoopMiddleware } from "langchain";
import { MemorySaver, Command } from "@langchain/langgraph";

const agent = createAgent({
  model: "openai:gpt-4o",
  tools: [searchTool, sendEmailTool, deleteDatabaseTool],
  middleware: [
    humanInTheLoopMiddleware({
      interruptOn: {
        // Require approval for sensitive operations
        send_email: { allowAccept: true, allowEdit: true, allowRespond: true },
        delete_database: { allowAccept: true, allowEdit: true, allowRespond: true },
        // Auto-approve safe operations
        search: false,
      }
    }),
  ],
  checkpointer: new MemorySaver(),
});

// Human-in-the-loop requires a thread ID for persistence
const config = { configurable: { thread_id: "some_id" } };

// Agent will pause and wait for approval before executing sensitive tools
let result = await agent.invoke(
  { messages: [{ role: "user", content: "Send an email to the team" }] },
  config
);

result = await agent.invoke(
  new Command({ resume: { decisions: [{ type: "approve" }] } }),
  config  // Same thread ID to resume the paused conversation
);
查看人机协同工作流程文档以获取关于实现审批工作流程的完整详细信息。

自定义护栏

为了实现更复杂的防护措施,您可以在智能体执行前后创建自定义中间件。这使您能够完全控制验证逻辑、内容过滤和安全检查。

在智能体约束之前

使用“在智能体之前”的钩子在每个调用开始时验证请求一次。这对于会话级别的检查很有用,例如身份验证、速率限制或阻止不适当的请求,在开始任何处理之前。
import { createMiddleware, AIMessage } from "langchain";

const contentFilterMiddleware = (bannedKeywords: string[]) => {
  const keywords = bannedKeywords.map(kw => kw.toLowerCase());

  return createMiddleware({
    name: "ContentFilterMiddleware",
    beforeAgent: (state) => {
      // Get the first user message
      if (!state.messages || state.messages.length === 0) {
        return;
      }

      const firstMessage = state.messages[0];
      if (firstMessage._getType() !== "human") {
        return;
      }

      const content = firstMessage.content.toString().toLowerCase();

      // Check for banned keywords
      for (const keyword of keywords) {
        if (content.includes(keyword)) {
          // Block execution before any processing
          return {
            messages: [
              new AIMessage(
                "I cannot process requests containing inappropriate content. Please rephrase your request."
              )
            ],
            jumpTo: "end",
          };
        }
      }

      return;
    },
  });
};

// Use the custom guardrail
import { createAgent } from "langchain";

const agent = createAgent({
  model: "openai:gpt-4o",
  tools: [searchTool, calculatorTool],
  middleware: [
    contentFilterMiddleware(["hack", "exploit", "malware"]),
  ],
});

// This request will be blocked before any processing
const result = await agent.invoke({
  messages: [{ role: "user", content: "How do I hack into a database?" }]
});

智能体安全限制之后

使用“智能体之后”钩子来在返回给用户之前验证最终输出。这对于基于模型的安全性检查、质量验证或对完整智能体响应的最终合规性扫描非常有用。
import { createMiddleware, AIMessage, initChatModel } from "langchain";

const safetyGuardrailMiddleware = () => {
  const safetyModel = initChatModel("openai:gpt-4o-mini");

  return createMiddleware({
    name: "SafetyGuardrailMiddleware",
    afterAgent: async (state) => {
      // Get the final AI response
      if (!state.messages || state.messages.length === 0) {
        return;
      }

      const lastMessage = state.messages[state.messages.length - 1];
      if (lastMessage._getType() !== "ai") {
        return;
      }

      // Use a model to evaluate safety
      const safetyPrompt = `Evaluate if this response is safe and appropriate.
      Respond with only 'SAFE' or 'UNSAFE'.

      Response: ${lastMessage.content.toString()}`;

      const result = await safetyModel.invoke([
        { role: "user", content: safetyPrompt }
      ]);

      if (result.content.toString().includes("UNSAFE")) {
        return {
          messages: [
            new AIMessage(
              "I cannot provide that response. Please rephrase your request."
            )
          ],
          jumpTo: "end",
        };
      }

      return;
    },
  });
};

// Use the safety guardrail
import { createAgent } from "langchain";

const agent = createAgent({
  model: "openai:gpt-4o",
  tools: [searchTool, calculatorTool],
  middleware: [safetyGuardrailMiddleware()],
});

const result = await agent.invoke({
  messages: [{ role: "user", content: "How do I make explosives?" }]
});

组合多个安全栏

您可以通过将它们添加到中间件数组中来堆叠多个安全栏。它们按顺序执行,让您能够构建分层保护:
import { createAgent, piiRedactionMiddleware, humanInTheLoopMiddleware } from "langchain";

const agent = createAgent({
  model: "openai:gpt-4o",
  tools: [searchTool, sendEmailTool],
  middleware: [
    // Layer 1: Deterministic input filter (before agent)
    contentFilterMiddleware(["hack", "exploit"]),

    // Layer 2: PII protection (before and after model)
    piiRedactionMiddleware({
      piiType: "email",
      strategy: "redact",
      applyToInput: true,
    }),
    piiRedactionMiddleware({
      piiType: "email",
      strategy: "redact",
      applyToOutput: true,
    }),

    // Layer 3: Human approval for sensitive tools
    humanInTheLoopMiddleware({
      interruptOn: {
        send_email: { allowAccept: true, allowEdit: true, allowRespond: true },
      }
    }),

    // Layer 4: Model-based safety check (after agent)
    safetyGuardrailMiddleware(),
  ],
});

其他资源