需要将模型输出字符串解析为 Python 对象。请选择正确实现:
材料题 1:智能体⼯具调⽤ JSON 校验器
在⼯具调⽤型智能体中,模型输出通常需要被解析为结构化 JSON,再根据⼯具 schema 校验⼯具名和参
数是否合法。下⾯的代码实现了⼀个简化版⼯具调⽤校验器:它读取模型输出字符串,检查⼯具名、参数
字段和参数类型,并返回标准化后的⼯具调⽤对象。
请阅读代码,并根据描述完成空缺部分。
import json
from typing import Any
TOOL_SCHEMAS = {
"weather": {
"required": {"city": str, "date": str},
"optional": {"unit": str},
},
"calculator": {
"required": {"expression": str},
"optional": {},
},
}
def load_tool_call(raw: str) -> dict[str, Any]:
"""将模型输出字符串解析为工具调用对象。"""
try:
obj = ____[1]____
except json.JSONDecodeError as exc:
raise ValueError("invalid json") from exc
if not isinstance(obj, dict):
raise ValueError("tool call must be a JSON object")
if set(obj.keys()) != {"tool_name", "arguments"}:
raise ValueError("tool call must contain exactly tool_name and arguments")
if obj["tool_name"] not in TOOL_SCHEMAS:
raise ValueError("unknown tool")
if not isinstance(obj["arguments"], dict):
raise ValueError("arguments must be an object")
return obj
def validate_arguments(tool_name: str, arguments: dict[str, Any]) -> bool:
"""根据 schema 校验参数字段和参数类型。"""
spec = TOOL_SCHEMAS[tool_name]
required = spec["required"]
optional = spec["optional"]
allowed_keys = ____[2]____
missing_keys = ____[3]____
extra_keys = set(arguments) - allowed_keys
if missing_keys or extra_keys:
return False
type_rules = {**required, **optional}
for name, expected_type in type_rules.items():
if name in arguments and ____[4]____:
return False
return True
def normalize_tool_call(raw: str) -> dict[str, Any]:
obj = load_tool_call(raw)
tool_name = obj["tool_name"]
arguments = obj["arguments"]
if not validate_arguments(tool_name, arguments):
raise ValueError("bad arguments")
return {"tool_name": tool_name, "arguments": arguments}
json.dumps(raw)
json.loads(raw)
dict(raw)
raw.split(",")