题目:你让大模型批量生成测试用例,要求它输出 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("抱歉,我无法完成该任务") == []
难度:中级
题型:笔试(编程题)
参考答案/答题要点:
参考题解:
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 分析"。