语义筛查安全护栏
语义筛查安全护栏按语义应用内容策略。你提供若干示例文本,AISIX 会阻断语义与之接近的流量,即使措辞完全不含相同的关键词。
关键词安全护栏匹配调用方输入的字面内容,语义筛查安全护栏匹配调用方想表达的意思,因此能应对为绕过固定模式列表而改写的尝试。它是关键词安全护栏的补充:关键词匹配保持精确、低成本且行为可预期,而语义筛查会在每个已筛查钩子中使用配置的 embedding 模型。
本指南将创建一个语义筛查安全护栏,通过 AISIX 发送命中和无关的流量,并验证 AISIX 会在调用上游模型前拒绝命 中的请求。
准备工作
开始前,请准备以下内容:
- 阅读安全护栏行为,了解钩子点、执行模式和失败策略。
- 与安全护栏位于同一环境的 embedding 模型。AISIX 会用它为每一段被筛查的文本打分。参见资源模型了解
embedding配置块,以及 Embeddings 了解它对外提供的端点。 - 以下配置路径之一:
- AISIX Cloud,其中包含环境、已接入的网关和具有写权限范围的 Admin Token。对于 On-Premises,请按照 AISIX Cloud 快速入门操作。如需申请混合云访问权限,请联系 API7。
- 加载声明式
resources.yaml文件的开源 AISIX 网关。
- 可以发送 Chat Completions 请求的模型别名和调用方 API Key。
curl。AISIX Cloud 路径还会使用jq。
筛查如何做出判定
每一段被筛查的文本都会被转成向量,并与你提供的示例比较,得到一个 -1 到 1 之间的相似度分数,1 表示语义完全相同。
| 条件 | 结果 |
|---|---|
文本对任一拒绝示例的分数达到或超过 deny_threshold | 阻断 |
配置了 allow_examples,且文本对每个允许示例的分数都低于 allow_threshold | 阻断 |
| 以上都不满足 | 放行 |
**拒绝优先于允许。**同时命中两个列表的文本会被拒绝,因此即使某条允许示例恰好与拒绝示例语义相近,也不会让流量绕过拒绝列表。
两种使用方式:
- 只用拒绝列表:除与拒绝示例相近的文本外,其余内容均放行。
- 使用允许列表:只放行与允许示例相近的文本,从而把安全护栏覆盖的流量限制在特定话题范围内。
在输入钩子中,AISIX 会从最新一条开始,分别筛查每条非空用户消息。把整段对话作为一个整体筛查会稀释分数:夹在长篇日常对话中的一句简短尝试会被当作噪声。text_source 默认为 user_messages;设为 all_messages 可同时包括 system、developer、assistant 和 tool 消息。
input_messages 会先选择会话窗口,然后 text_source 再从中筛选角色。使用 latest_turn 时,AISIX 首先移除 system 和 developer 消息,以及模型已回答的历史记录。默认的 user_messages 随后只筛查窗口中的 user 消息;all_messages 还会筛查当前轮次的工具结果,以及调用方为模型提供、让模型继续生成的结尾 assistant 消息。应用这两层筛选后,AISIX 会跳过空消息,并从最新一条开始筛查其余文本。参见选择输入消息窗口。
max_screened_texts 默认为 8,用于限制输入钩子上单次请求筛查的消息数;输出钩子始终把整条回复作为一段文本筛查,该上限在那里不起作用。超出上限的消息不会在该请求中接受评估。请根据必须筛查的最长对话历史设置该上限,尤其是客户端可能首次向 AISIX 提交既有对话时。
创建语义筛查安全护栏
以下示例会阻断让模型忽略自身指令的尝试。请选择一种配置路径,再使用通用验证步骤。
导出两种路径都会使用的网关参数:
# AISIX_PROXY 不含尾部斜杠或端点路径
# 本地快速入门使用 http://127.0.0.1:3000。
export AISIX_PROXY="YOUR_AISIX_GATEWAY_URL"
export AISIX_API_KEY="YOUR_CALLER_API_KEY"
export AISIX_MODEL="gpt-4o-mini"
# 同一环境中 embedding 模型的别名。
export AISIX_EMBEDDING_MODEL="text-embedding-3-small"
AISIX Cloud
导出控制面连接参数:
# AISIX_CP 包含 /api,且不含尾部斜杠
# 本地私有化部署快速入门使用 http://localhost:8080/api
export AISIX_CP="YOUR_AISIX_CLOUD_ADMIN_API_URL"
export AISIX_TOKEN="YOUR_ADMIN_TOKEN"
export ENV_ID="YOUR_ENVIRONMENT_ID"