应用场景 / JevModel

表单与评论的垃圾内容检测 API:Turnstile、Akismet 还是 Jev 判断层

面对联系表单、评论和注册垃圾内容,挑战验证(Cloudflare Turnstile)、垃圾信誉服务(Akismet)与类型化 Jev Choice/Noul 判断各自该放在哪一层;用隔离队列代替静默删除。

最近更新:

速读:分三层,Jev 只是最后一层

  • 表单和评论垃圾内容分三类:自动化机器人提交、已知的垃圾模式,以及人写的、但你仍不想要的内容(跑题推销、发链接)。每类需要不同的工具。
  • 挑战层:Cloudflare Turnstile 只有在服务端用 Siteverify API 校验每个 token 时才真正保护表单;token 有效期 300 秒,只能校验一次。
  • 信誉层:Akismet 的 comment-check 需要 api_key、blog、user_ip(必填),再加上内容和作者字段,返回 "true"(垃圾)或 "false";其他任何响应体都是错误,不是判定。
  • 判断层:JevModel 只读取你发送的文本,返回类型化答案,例如在 real_inquiry / sales_pitch / spam 之间的 Choice,以及“是否需要人工看一眼”的 Noul 概率。它没有 IP 信誉,也没有共享垃圾库,所以放在前两层之后,并且隔离而不是删除。

表单与评论垃圾内容的三种类型

“垃圾内容检测 API”其实涵盖不同的问题,混为一谈正是真实线索被误删的原因。第一类是自动化提交:脚本见表单就填。最好在读取文本之前就拦下,用 Cloudflare Turnstile 这类挑战验证。第二类是已知垃圾:与大量网站上见过的模式相符的消息和发送者,这正是 Akismet 这类信誉服务的用途。第三类是人写的、但你仍不想要的消息:从联系表单发来的冷推销、博客文章下的 SEO 代运营广告、简介里只有一个链接的注册用户。它们由真人发出,能通过挑战,也不一定像典型垃圾,所以判断取决于你自己的规则。只有这第三类,Jev 这样的文本判断模型才有额外价值。本文讨论表单、评论和注册;收件箱里的垃圾邮件请交给邮件服务商过滤,邮件分类指南里有说明。

用 Jev 辅助内容审核用 AI 做邮件分类:入站邮件该用规则、LLM 提示还是类型化决策 API用清晰量表评估线索

第一层:用 Cloudflare Turnstile 拦截自动化提交

Turnstile 在表单上放一个组件来生成 token,Cloudflare 文档明确写着服务端校验是必须的:仅有前端组件并不能保护任何东西。你的处理程序向 https://challenges.cloudflare.com/turnstile/v0/siteverify 发送 POST,带上密钥和 token(访客 IP 可选),读取 JSON 里的 success 字段。token 有效期 300 秒,只能校验一次(重复使用会返回 timeout-or-duplicate),最长 2048 个字符。校验失败就直接拒绝提交,别再为它花费任何别的成本。这一层不关心消息说了什么,只回答一个浏览器会话是否通过了挑战。

第二层:用 Akismet 检查已知垃圾

Akismet 的 comment-check 接口是 POST https://rest.akismet.com/1.1/comment-check,使用表单编码字段。api_key、blog(你的网站 URL)和 user_ip 是必填;comment_content、comment_author、comment_author_email、user_agent、comment_type 可选,Akismet 文档说数据越多通常越准确。comment_type 不只是博客评论:文档列出的值包括 comment、forum-post、reply、contact-form、signup 和 message。响应体是字面字符串 "true"(垃圾)或 "false"(非垃圾);其他任何值(如 "invalid")都是错误,而且可能以 HTTP 200 返回,所以不要把它当成判定。响应头 X-akismet-pro-tip: discard 表示明显垃圾,可以不经复核直接丢弃。测试时,Akismet 文档给出 comment_author 为 akismet-guaranteed-spam(必为垃圾)、user_role 为 administrator(必非垃圾),以及用 is_test=1 标记测试调用。

评估 Jev 工作流

第三层:对“真人写但不想要”的消息做 Jev 判断

经过第一、二层后剩下的,大多是规则问题:按你的定义,这是真实咨询、推销,还是垃圾?JevModel 用类型化输出回答。你把消息作为 state 发送,并提出具名问题:一个 Choice,criteria 用你自己的话定义 real_inquiry、sales_pitch 和 spam;再加一个 Noul(是/否)问题,例如“丢弃前应由人看一眼”。响应包含所选标签、每个标签的概率,以及 Noul 的概率,你可以据此路由。也要讲清这一层不是什么:Jev 只读你发送的 state,没有 IP 或发送者信誉,没有其他网站见过的共享垃圾库,JevModel 也不会用你的举报训练模型,并且不提供定制训练。它不能替代挑战验证或 Akismet,也不应成为删除一条消息的唯一理由。

Choice、Score 与 NoulJev 概率、置信度与人工复核阈值产品与客服文本的意图分类:规则、LLM 与类型化 API

Turnstile、Akismet 与 Jev 对比:每层回答什么问题

下表比较的是各家文档中的输入与输出契约,不是准确率基准;任何一层都请用你自己的提交数据来衡量。

Jev 与规则引擎怎么选?如何用 JevModel API 分类文本
Turnstile、Akismet 与 Jev 对比:每层回答什么问题
维度Cloudflare TurnstileAkismetJevModel(Jev)
回答的问题这个浏览器会话通过挑战了吗?内容与发送者像已知垃圾吗?按你的定义,这段文本属于哪个标签?
输入组件 token + 密钥(访客 IP 可选)必填 api_key、blog、user_ip;内容、作者、类型可选只有你发送的 state 和具名问题
输出含 success 与错误码的 JSON"true" / "false";其他响应体是错误;可能附带 discard 提示类型化答案:带逐标签概率的 Choice、Noul 概率、Score
使用文本以外的信号是,浏览器挑战信号是,你传入的 IP 与发送者字段否,state 之外一概不用
在流程中的最佳位置最前:读取前就拒绝第二:丢弃或标记已知垃圾最后:把剩下的分到你自己的队列

代码示例:带 Jev 判断的联系表单处理程序

下面的示意代码在 Turnstile 和 Akismet 都放行之后运行。它把消息作为对象形式的 state 发送,让模型看清每个字段是什么,并在一次请求里问两个问题:一个 Choice 判断消息类型,一个 Noul 判断是否需要人工复核。它遵循文档化的契约:用已验证邮箱账号的 Bearer 密钥 POST /api/v1/systemone,发送 state 和具名问题,响应里 code 为 0 并带 data.answers。没有 model 字段,因为本站始终通过 OpenRouter 调用 typesafe/jev-1.13。API 不支持幂等键,可能已成功的请求不要重试;失败的运行会退款。只发送判断需要的字段:姓名、邮箱、电话通常对“这是不是推销”毫无帮助。

JevModel API:请求与响应Choice、Score 与 NoulJev AI 决策流与人工复核分支
// Illustrative only. Runs after Turnstile and Akismet have passed the submission.
// JEVMODEL_API_KEY comes from JevModel Console -> API keys (verified account).
async function decide(form) {
  const res = await fetch("https://jevmodel.app/api/v1/systemone", {
    method: "POST",
    headers: {
      Authorization: "Bearer " + process.env.JEVMODEL_API_KEY,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      // Send only what the decision needs; no name, email or phone.
      state: { form: "contact", subject: form.subject, message: form.message },
      questions: {
        kind: {
          type: "choice",
          instructions: "What kind of contact-form message is this, by our definitions?",
          criteria: {
            real_inquiry: "A person asking about our product, an order, or working with us as a customer.",
            sales_pitch: "Someone selling us a service: SEO, leads, development, marketing.",
            spam: "Gibberish, link dropping, scams, or text unrelated to any business purpose.",
          },
        },
        review: {
          type: "noul",
          instructions: "Should a person read this before it is moved out of the inbox?",
          criteria: {
            true: "It might be a real customer or partner, or the intent is unclear.",
            false: "It is clearly an unsolicited pitch or spam.",
          },
        },
      },
    }),
  });
  const body = await res.json();
  if (body.code !== 0) return { route: "inbox", reason: body.message }; // fail open
  const { kind, review } = body.data.answers;
  return {
    kind: kind.choice,
    probabilities: kind.probabilities,
    needsReview: review.noul, // probability that the answer is true
  };
}

路由规则:隔离,不要删除

联系表单上的一次误判,就是一个你永远不会知道的流失客户,所以路由要围绕这一点设计。一个可行的规则:real_inquiry 照常进收件箱或 CRM;复核概率低的 spam 进隔离文件夹,由人定期浏览;sales_pitch 进单独文件夹而不是垃圾箱;复核概率高、或没有标签明显胜出的,进收件箱并打标签。如果 Jev 调用失败(非零 code、超时、INSUFFICIENT_TOKENS),就放行并投递消息;一个宕机时会吞掉线索的垃圾过滤器,比没有更糟。阈值要用你自己的数据来定:人工标注几百条历史提交,用同样的问题跑一遍,选在误隔离少到你能接受的位置。TypeSafe 描述的 Choice 置信度 (p − 1/n)/(1 − 1/n) 会按标签数量做调整,但并不是校准后的准确率。改了定义后要重新检查。

Jev 概率、置信度与人工复核阈值评估 Jev 工作流Jev AI 决策流与人工复核分支

上线前的检查清单

1)每次提交都在服务端校验 Turnstile token,绝不只信任前端组件。2)Akismet 返回 "true" 或 "false" 以外的任何内容都当作错误处理;开发时使用 is_test=1 和文档中的测试值。3)用你自己的话写 Jev 的 criteria,附上你不想要的真实推销例子,并让“真实咨询”标签至少同样具体。4)去掉判断不需要的个人字段。5)隔离而不是删除;任何一层不可用时放行。6)人工标注一批样本,衡量误隔离,修改后重新衡量;没有实测过的准确率不要对外公布。7)预算 Token:进入第三层的每条提交都是一次普通请求,验证邮箱的账号先获赠 100,000 免费 Token。用户发帖审核与复核队列见 content-moderation;对真实销售线索打分见 lead-scoring。

用 Jev 辅助内容审核用清晰量表评估线索JevModel 价格与 Jev 免费额度运行记录与隐私用 AI 做邮件分类:入站邮件该用规则、LLM 提示还是类型化决策 API产品与客服文本的意图分类:规则、LLM 与类型化 APIJev 概率、置信度与人工复核阈值评估 Jev 工作流JevModel API:请求与响应

常见问题

Jev 能替代 Akismet 作为垃圾检测 API 吗?

不能。Akismet 会使用你传入的 IP 和发送者字段,以及它在大量网站上见到的垃圾模式;Jev 只读你发送的文本,没有共享垃圾库,也没有 IP 信誉。请把 Jev 放在挑战验证和信誉检查之后,用来回答规则问题:按你的定义,一条真人写的消息是真实咨询、推销还是垃圾。

要用 Jev 过滤垃圾邮件吗?

不要。收件箱的垃圾邮件过滤请交给邮件服务商,它能看到发件人认证和信誉信号,而 Jev 看不到。Jev 适合在投递之后,把正常邮件路由到你自己的队列;见邮件分类指南。

怎样避免误删真实线索?

用隔离代替删除,给推销单独建文件夹,复核概率高的交给人,任何一层出错时放行。阈值用你自己历史提交的人工标注样本来定,修改定义后重新检查。

JevModel 会看到访客 IP,或从我的垃圾举报中学习吗?

它只能看到你发送的 state。你不放 IP、邮箱或姓名,JevModel 就没有这些信息。没有提交垃圾举报的反馈接口,也没有定制训练;要改进结果,请优化标签定义。运行记录会保存在你的历史中,隐私指南说明了如何删除。

JevModel 为独立项目,与 TypeSafe AI 无关联。