CMDC.Plugin.Builtin.ContentPolicy (cmdc v0.6.1)

Copy Markdown View Source

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 大策略类别

  1. 指令颠覆(越狱)"忽略之前的规则" / 请求暴露内部 prompt
  2. 有害内容:仇恨言论 / 危险活动 / 露骨内容 / 辱骂
  3. 离题/越界:政治 / 宗教 / 体育 / 学术作弊 / 与 Agent 无关的闲聊
  4. 品牌/竞争:诋毁本品牌 / 讨论竞争对手

配置

{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 验证
  • 不合规 → :abort action + emit :content_policy_violated
  • judge 调用失败 → fail_open: true 默认放行(避免 judge service 故障阻塞主流程)

judge 优先级

配置行为
:judge_fnfn/2走自定义函数(最高优先级,常用于测试 mock)
:judge_model 是 binaryReqLLM.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

judge_object_schema()

@spec judge_object_schema() :: keyword()

返回 ContentPolicy LLM-as-judge 的强制输出 schema。供调用方调试 / 审计使用。