前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
AI 热点
开发者导航
基础篇
进阶篇
高频篇
精选篇
手写篇
原理篇
面经篇
AI 面试
自检篇
每日一题
  • 综合
    • 综合题型
    • 其他问题
    • 设计模式
    • 思维导图
    • 学习路线
  • 前端基础
    • HTTP
    • 浏览器
    • 计算机基础
  • 进阶学习
    • NPM工作流
    • Docker
    • Canvas
    • Node学习指南
    • 前端综合文章
  • 其他
    • Handbook
    • 职场话题
    • CSS可视化
小程序题库
公众号动态
博客动态
AI 热点
开发者导航
返回 AI 情报前线
All News · 全部资讯5473
  • 别把数据库连接串发给AI工具:正确做法在此
  • Claude Code周报:可靠性工程与工具链实践
  • 用HyperNexus消除MCP配置碎片化:企业级RBAC实践
  • dbctx:将PostgreSQL编译为LLM友好上下文的Go工具
  • AI写令牌桶限流器的评测方法:假时钟+真实HTTP验证
  • AI改配置文件的变更账本:merge前的回滚保障机制
  • AI声称C++锁多余但竞态检测器打脸:真实案例分析
  • 免费模型输出必须加Schema校验层
  • 用toolcontract检测模型更新是否破坏Agent工具调用
  • 模型没变笨,是你的Agent技能指令过时了
  • SharePoint CVE-2026-55040认证绕过漏洞正被活跃利用
  • 本地跑大模型需要多少VRAM:2026硬件实战指南
  • AI代码助手缺上下文的根因与修复方法
  • 高级后端工程师必知的安全问答
  • ChatGPT桌面版新功能:记录你的点击和按键
  • agent-authz:AI Agent工具调用的最小权限授权引擎
  • 从提示工程到上下文工程:AI应用开发的核心技能转变
  • YouTube转技术博客的AI流水线实现
  • 给AI编码Agent装上眼睛:UI工作的截图反馈循环方案
  • GEO实战:让你的品牌进入AI回答本身
  • Claude Mythos 5自主发起开源供应链攻击
  • SkillGuard:扫描AI Agent技能文件中的提示注入漏洞
  • AI 自主研究:Codex 迭代优化实现 CUDA 内核 232 倍加速
  • GLM-5.3:同基座模型代码能力跃升 50%
  • AI 时代真正的瓶颈是「理解」
  • Cerebras将GPT-5.6 Sol推理速度提升10倍,AI部署成本结构生变
  • Claude Code十个悄悄烧掉Token的坏习惯
  • MCP 服务器「已连接」不代表 Agent 能用它
  • AI 编程 Agent 凭证访问的结构化审计日志设计
  • Zed 编辑器 2026 评测:速度优先,AI 为辅
  • GPT-4o vs Claude vs Mistral:真实任务视角的LLM评测
  • Anthropic发布Claude系统提示词官方文档
  • LLM画图从不碰像素:图表渲染架构设计
  • Rust实现MCP Server实战:内存与启动速度的量化对比
  • 用Rust手把手构建MCP服务器:rmcp官方SDK教程
  • AI测试数据生成器对比:有关系 schema 才有意义
  • AI 生成关联测试数据而不破坏数据库约束
  • 测试免费模型 API 真实并发能力的方法
  • 已加载 38 / 5473
8.0
热点
AI SCORE
编程提效2026-08-16 23:40

免费模型输出必须加Schema校验层

dev.to · AI#LLM输出#Schema校验#工程实践
Editor brief · 编辑速览

免费模型API返回的JSON结构可能每次不同,仅解析成功不能证明字段符合预期,应在输出进入配置文件、linter或shell命令前加Schema契约校验。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

免费模型输出需要一个 Schema 门控,而不仅仅是 JSON 解析。

免费模型 API 每次调用都可能返回结构不同的有效 JSON。

解析只能证明这些字节是 JSON 格式。它无法证明键、类型和必需字段是否与你的处理流程相匹配。

缺失的 line 字段,或 severity 字段从 high 变成 'high'(字符串与枚举值不符),都可能悄无声息地导致下游消费者出错。

在任何模型输出进入配置文件、linter 或 shell 命令之前,应该运行一个小的契约门控。

声明:本文是 MonkeyCode 产品推广的一部分。

MonkeyCode 的免费模型访问和免费服务器选项使得运行重复的非生产调用变得实用,无需按 token 付费。但这不会改变规则:不受信任的输出仍然需要 schema 契约。

复现检查器

安装一个依赖:

pip install jsonschema

为代码审查输出定义一个契约。该示例拒绝未知字段,要求四个键,并约束 severity 的取值范围。

import json
from jsonschema import Draft202012Validator

CONTRACT = {
  'type': 'object',
  'required': ['finding', 'severity', 'file', 'line'],
  'additionalProperties': False,
  'properties': {
    'finding': {'type': 'string', 'minLength': 1},
    'severity': {'enum': ['low', 'medium', 'high', 'critical']},
    'file': {'type': 'string', 'minLength': 1},
    'line': {'type': 'integer', 'minimum': 1}
  }
}

def check(payload: dict) -> dict:
    errors = sorted(
        Draft202012Validator(CONTRACT).iter_errors(payload),
        key=lambda e: list(e.path),
    )
    return {
        'ok': not errors,
        'errors': [
            {'path': list(e.path), 'message': e.message}
            for e in errors[:5]
        ],
    }

sample = {'finding': 'unchecked egress', 'severity': 'medium', 'file': 'run.sh', 'line': 12}
print(check(sample))

在每次使用输出之前,对每个缓冲的响应运行此检查。

面向免费端点的批量检查器

此版本读取换行符分隔的 JSON,应用 schema,并在遇到速率限制时重试一次(而不是围绕限制反复重试)。

import json
import time
from pathlib import Path

def run_gate(file_path: str, call_model_same_prompt) -> list:
    results = []
    for raw in Path(file_path).read_text().splitlines():
        if not raw.strip():
            continue
        payload = json.loads(raw)
        ok, errors = check(payload)
        attempts = 0
        while not ok and attempts < 1:
            time.sleep(1)
            payload = call_model_same_prompt()  # pseudocode: replace with your client
            ok, errors = check(payload)
            attempts += 1
        results.append({'ok': ok, 'errors': errors, 'attempts': attempts})
    return results

将 call_model_same_prompt 替换为你自己的客户端。sleep 和单次重试是刻意为之的:遇到 429 时暂停,不要狂敲端点。

使用此方案来捕获漂移而不消耗配额。

冻结 20 个相同的提示词用于一个狭窄的任务。

通过免费模型端点运行它们。

在解析前缓冲每个完整响应,而不是流式处理。

根据 schema 检查每个解析后的 payload。

记录通过率、字段漂移和每次调用的延迟。

将结果记录到表格中:

不要复制上面的数字。它们是占位符。运行你自己的测试。

重试规则很窄:一次重试,相同提示词,不进行静默自动修复。

门控捕获的内容

缺失必需字段。

字段的 JSON 类型错误。

可能隐藏新行为的未知字段。

超出允许枚举范围的 severity 值。

看起来有效但实际无用的空 finding 文本。

Schema 门控检查的是形状,而不是正确性。形状有效的 finding 仍然可能是错误的。

免费端点可能很慢或受到速率限制。测试计划应该在遇到 429 时暂停,而不是在限制周围重试。

模型可能在一天内发生漂移。昨天通过的契约不能作为今天的证明。

这不是沙箱。它不会阻止有效形状的命令造成损害。

在生成命令获得更多访问权限之前,在受限环境中进行试运行。

谁不应该使用此方案

需要模型输出的认证 SLA 的团队不应依赖免费端点。

任何处理 secrets、生产凭证或不可逆操作的人都不应该将这些输入提供给免费模型。

如果无法让人工审查高严重性的发现,不要让模型输出进入自动合并路径。

如果预期的 schema 仍在变化,在构建门控之前先完成 schema 设计。

解析检查语法。Schema 检查契约。当免费模型输出很便宜但你的下游信任不应该便宜时,添加一个 schema 门控。

在下一次非生产模型响应上尝试检查器,并在将其连接到任何重要内容之前记录漂移。


Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
AI声称C++锁多余但竞态检测器打脸:真实案例分析
下一篇
用toolcontract检测模型更新是否破坏Agent工具调用