feat(harness): 输入护栏升级 —— 归一化反绕过(Tier1) + LLM 越狱分类器(Tier2)
原输入护栏纯正则,空格/编码/同形字一改写即漏,且 bannedTerms 空置。升级为两层: Tier1(网关同步、无 LLM):先归一化再匹配,干掉绕过—— - 小写 + 去零宽字符 + 去变音符 + 同形字折叠(西里尔/希腊→拉丁) + 拆字间隔还原(i g n o r e / i.g.n.o.r.e → ignore) + base64 解码回扫 - 多视图(原文/归一化/紧凑/解码)匹配高精度注入正则,无需穷举变体 - bannedTerms 经 GUARDRAIL_BANNED_TERMS env 落地 - 软信号(jailbreak/developer mode/无限制…)→ 灰区,放行但打 safety_check 标志 Tier2(dispatcher harness LLM 分类器,escalation): - 仅对灰区任务执行前调 LLM 裁决 jailbreak+severity,≥0.7 → rejected - 明确干净/恶意的不付 LLM 成本;模型抖动/解析失败 fail-open 不误锁正常用户 契约新增 MetaSafetyCheck 透传灰区标志;orchestrator 加执行前护栏门控 + SetGuardian。 网关 6 单测 + dispatcher 4 单测,三模块全绿。live:拆字/base64/西里尔同形字均 422 拦, 恶意灰区被 LLM 拒(severity 1)、良性灰区(海盗 roleplay)放行完成。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -31,9 +31,12 @@ func main() {
|
||||
pool := llm.NewPool() // LLM Pool: vLLM / Ollama 集群
|
||||
breaker := harness.NewCircuitBreaker() // Harness: 熔断降级中心
|
||||
// Harness: LLM 自动化评测(规则 + LLM-as-judge,模型就绪时启用)。
|
||||
eval := harness.NewEvaluator(pool.Ready, func(ctx context.Context, sys, user string) (string, error) {
|
||||
llmChat := func(ctx context.Context, sys, user string) (string, error) {
|
||||
return pool.Chat(ctx, []llm.ChatMessage{{Role: "system", Content: sys}, {Role: "user", Content: user}})
|
||||
})
|
||||
}
|
||||
eval := harness.NewEvaluator(pool.Ready, llmChat)
|
||||
// Harness: 输入护栏 Tier2 —— 对网关标记的灰区输入做 LLM 越狱裁决(模型就绪时启用)。
|
||||
guardian := harness.NewClassifier(pool.Ready, llmChat)
|
||||
|
||||
sub := dnats.MustConnect(natsURL)
|
||||
defer sub.Close()
|
||||
@@ -51,6 +54,7 @@ func main() {
|
||||
if err != nil {
|
||||
log.Fatalf("[dispatcher] build eino graph: %v", err)
|
||||
}
|
||||
orch.SetGuardian(guardian) // 输入护栏 Tier2
|
||||
|
||||
// 健康心跳:dispatcher 无 HTTP/工具端点,挂一个 NATS 应答让管理端「服务状态」探到它在线。
|
||||
startedAt := time.Now()
|
||||
|
||||
Reference in New Issue
Block a user