LLM-as-Judge 内容安全拦截 Plugin。
用低成本 LLM(如 GPT-mini / Gemini Flash)在 :before_request 评估用户输入,
拦截越狱 / 有害指令 / 离题等不合规内容。
与 cmdc_gateway denylist 的关系
- cmdc_gateway denylist:HTTP 层 string 匹配,快速、防显式词
- ContentPolicy LLM-judge:Plugin 层语义判断,防多轮越狱 / 绕过 denylist
- 推荐双层使用:denylist 拦显式、ContentPolicy 拦语义
4 大策略类别
- 指令颠覆(越狱):
"忽略之前的规则"/ 请求暴露内部 prompt - 有害内容:仇恨言论 / 危险活动 / 露骨内容 / 辱骂
- 离题/越界:政治 / 宗教 / 体育 / 学术作弊 / 与 Agent 无关的闲聊
- 品牌/竞争:诋毁本品牌 / 讨论竞争对手
配置
{ContentPolicy, [
judge_model: "anthropic:claude-haiku-4-5", # 低成本 judge model(req_llm 标识)
judge_provider_opts: [temperature: 0.0], # 推荐 deterministic
judge_timeout: 8_000, # judge 调用超时(默认 8s)
custom_rubric: "...", # 可选自定义评估准则
brand_keywords: ["MyProduct"], # 可选品牌词
competitor_keywords: ["CompetitorX"], # 可选竞争对手
fail_open: true, # judge 失败时是否放行(默认 true)
judge_fn: fn input, state -> {:ok, ...} end # 可选 mock 注入点(测试 / 自定义评估器)
]}行为
:before_request取最新 user message → 调 judge → JSON schema 验证- 不合规 →
:abortaction + emit:content_policy_violated - judge 调用失败 →
fail_open: true默认放行(避免 judge service 故障阻塞主流程)
judge 优先级
| 配置 | 行为 |
|---|---|
:judge_fn 是 fn/2 | 走自定义函数(最高优先级,常用于测试 mock) |
:judge_model 是 binary | 走 ReqLLM.generate_object/4 默认实现(推荐生产用) |
| 都未配置 | 走启发式 fallback(仅检查越狱关键词 + competitor_keywords) |
v0.5.4 实现说明
默认 judge 走 ReqLLM.generate_object/4 结构化 JSON 输出(schema 强制三字段:
compliance_status / evaluation_summary / triggered_policies),调用通过
Task.async/await 隔离 + judge_timeout 超时控制 + try/rescue/catch 防 judge
service 崩溃影响主 Agent。
与主 Agent 的 CMDC.Provider.stream/4 不同,judge 是同步一次性调用,不走
StreamBridge,因此 judge_model 配置独立于主 Agent model,可任意切换低成本 judge。
Summary
Functions
返回 ContentPolicy LLM-as-judge 的强制输出 schema。供调用方调试 / 审计使用。
Functions
@spec judge_object_schema() :: keyword()
返回 ContentPolicy LLM-as-judge 的强制输出 schema。供调用方调试 / 审计使用。