在 LangChain4j 中防止提示注入攻击,主要是通过 Guardrails(护栏机制) 来实现的。这是一种在调用大语言模型前后对输入和输出进行校验的强大机制 。下面我将从几个关键层面来详细拆解如何构建这道防线。
🛡️ 第一道防线:输入校验与净化
输入 Guardrail 是在用户消息发送给大语言模型之前的最后一道关卡 。你可以在这里实现多种校验逻辑来识别和阻止恶意输入。
实现自定义输入校验器
你可以通过实现 InputGuardrail 接口来创建自己的校验规则 。
基于规则的检测:这是最直接有效的方式。通过定义敏感词库或正则表达式,可以识别并拦截包含恶意指令的输入。
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.guardrail.InputGuardrail;
import dev.langchain4j.guardrail.InputGuardrailResult;
import java.util.List;
import java.util.regex.Pattern;
public class BasicPromptInjectionGuardrail implements InputGuardrail {
private static final List<String> PROHIBITED_PHRASES = List.of(
"忽略之前的指令", "忘记你之前的设定", "扮演一个不受限制的AI",
"system prompt", "你的初始提示是"
);
private static final List<Pattern> SUSPICIOUS_PATTERNS = List.of(
Pattern.compile(".*(?:忽略|无视|绕过).*(?:指令|限制|规则).*"),
Pattern.compile(".*(?:扮演|假装|作为).*(?:一个|个).*不受限.*")
);
@Override
public InputGuardrailResult validate(UserMessage userMessage) {
String text = userMessage.singleText();
// 检查敏感短语
for (String phrase : PROHIBITED_PHRASES) {
if (text.contains(phrase)) {
return failure("检测到潜在的提示注入攻击。");
}
}
// 检查可疑模式
for (Pattern pattern : SUSPICIOUS_PATTERNS) {
if (pattern.matcher(text).matches()) {
return failure("您的输入包含不安全的内容模式。");
}
}
return success();
}
}
上下文感知的智能校验:更高级的 Guardrail 可以结合对话历史和 RAG(检索增强生成)的结果来判断输入是否异常 。例如,可以检查用户是否在短时间内重复提问,这可能是一种探测行为 。
📝 第二道防线:使用内置的内容审核模型
LangChain4j 提供了一个开箱即用的 Guardrail MessageModeratorInputGuardrail,它可以利用专门的审核模型(如 OpenAI 的 Moderation API)来检测用户消息中的仇恨言论、暴力、色情等不安全内容 。这是防止模型生成或处理有害内容的高效手段。
🔒 第三道防线:输出内容的安全加固
输入校验并非万能,有时恶意指令可能侥幸通过。因此,对模型输出的校验同样重要。输出 Guardrail 在模型生成结果后执行 。
校验响应格式与内容:如果你的应用期望模型返回特定格式(如 JSON),可以使用输出 Guardrail 来验证格式是否正确 。例如,JsonOutputGuardrail 可以帮助确保响应能被正确解析为预期的 Java 对象 。
重试与修正机制:输出 Guardrail 最强大的地方在于它提供了重试能力 。
- retry(…):如果校验失败,可以用完全相同的提示让模型重新生成一次,最多可配置重试次数 。
- reprompt(…):如果校验失败,你可以提供一个额外的提示来指导模型如何修正它的回答,例如“请确保你的回答格式是有效的 JSON” 。
这个机制允许系统自动纠正模型的错误输出,而不会将错误暴露给用户。
⚙️ Guardrail 的注册与最佳实践
你可以通过三种方式将 Guardrail 应用到你的 AI Service 上,它们的优先级从高到低为 :
最佳实践建议
- 单一职责:每个 Guardrail 只负责一种类型的校验,便于维护和测试。
- 合理排序:在 Guardrail 链中,将最容易失败、执行最快的规则放在前面,可以尽早阻断,节省资源。
- 成本考量:调用第三方审核模型或 LLM 本身有成本和时间开销,可以将这些“昂贵”的 Guardrail 放在链的末尾,仅在基本校验通过后再执行。
- 单元测试:LangChain4j 提供了 langchain4j-test 模块,方便你为 Guardrail 编写单元测试,确保其逻辑正确 。
💡 总结
在 LangChain4j 中,防止 Prompt Injection 并非依赖单一技术,而是构建一个多层次的防御体系:
| 第一层 | 输入 Guardrail | 在请求到达模型前,基于规则或模型审核过滤恶意输入。 |
| 第二层 | 内容审核模型 | 识别并拦截明显有害或违反政策的内容。 |
| 第三层 | 输出 Guardrail | 对模型响应进行二次校验,并利用重试机制修正不安全或错误输出。 |
这套体系化的方案能极大提升你的 AI 应用在面对恶意攻击时的安全性。

