【每日一题】LLM 用例结果校验器(附参考答案)

题目:你让大模型批量生成测试用例,要求它输出 JSON 数组,但模型偶尔会漏字段、混入解释性文字。请实现函数 validate_cases:输入 LLM 返回的字符串,解析出 JSON 数组,只保留同时含有 title(非空字符串)、steps(非空列表)、expected(非空字符串)三个字段的用例,返回合法用例列表。解析失败时返回空列表。

代码框架:

import json

def validate_cases(text):
    """
    text: LLM 返回的字符串,理想情况是 '[{"title":..., "steps":[...], "expected":...}, ...]'
    返回合法用例组成的列表
    """
    # 请在此处补全
    pass


assert validate_cases(
    '[{"title": "登录成功", "steps": ["输入账号", "点击登录"], "expected": "跳转首页"}]'
) == [{"title": "登录成功", "steps": ["输入账号", "点击登录"], "expected": "跳转首页"}]

assert validate_cases(
    '[{"title": "缺步骤", "expected": "报错"}, {"title": "完整", "steps": ["s"], "expected": "e"}]'
) == [{"title": "完整", "steps": ["s"], "expected": "e"}]

assert validate_cases("抱歉,我无法完成该任务") == []

难度:中级
题型:笔试(编程题)

:point_right:参考答案/答题要点:

参考题解:

import json

def validate_cases(text):
    try:
        data = json.loads(text)
    except (json.JSONDecodeError, TypeError):
        return []
    if not isinstance(data, list):
        return []
    valid = []
    for case in data:
        if (
            isinstance(case, dict)
            and isinstance(case.get("title"), str) and case["title"].strip()
            and isinstance(case.get("steps"), list) and len(case["steps"]) > 0
            and isinstance(case.get("expected"), str) and case["expected"].strip()
        ):
            valid.append(case)
    return valid

思路2:结构化输出从源头治理(加分项)

# 与其事后校验,不如让模型直接输出可解析格式
prompt = "只输出 JSON 数组,不要任何解释文字,格式:[...]"
# 进一步可接 JSON Schema / function calling 强约束

采分点:①try/except 兜住解析失败;②字段校验要"类型+非空"双查;③steps 单独要求非空列表;④加分项:提"结构化输出/Prompt 约束/schema 校验从源头减少脏数据"以及"收集非法样本做 badcase 分析"。