昨天,我们用异常处理让程序在失败时给出清楚提示。今天再解决一个关键问题:Agent 怎样准确知道“要调用什么工具、参数是什么”?
答案常常是 JSON。它不是某个 AI 专属格式,而是一种通用的数据表示方式。网页接口、大模型工具调用、配置文件和运行记录,都经常用它传递结构化信息。
今天完成 4 件事
1|看懂 JSON 的基本结构
2|分清 JSON 文本和 Python 字典
3|掌握 loads 与 dumps
4|完成结构化任务 Agent
task_json = '''
{
"tool": "add",
"args": {
"a": 12,
"b": 8
}
}
'''
print(task_json)JSON 使用“键—值”保存信息。这里的 tool 表示工具名称,args 表示参数集合,a 和 b 是两个具体参数。
这时 task_json 仍然只是字符串,程序不能直接写 task_json["tool"] 来读取工具名。必须先把 JSON 文本解析成 Python 对象。
import json
task_json = '{"tool": "add", "args": {"a": 12, "b": 8}}'
task = json.loads(task_json)
print(type(task))
print(task["tool"])
print(task["args"]["a"])执行顺序是:
1.import json 导入 Python 标准库中的 JSON 模块;
2.json.loads(task_json) 读取字符串并返回字典;
3.task["tool"] 取出字符串 add;
4.task["args"]["a"] 先进入 args 字典,再取出整数 12。
json 是模块名,不能随意改;loads 是模块提供的函数名,也不能乱改;task_json 和 task 是变量名,可以换成有意义的名字。
JSON 和 Python 字典长得很像,但并不是同一个类型。JSON 是跨系统传输的文本,Python 字典是程序运行时可直接操作的数据。
三、用 json.dumps() 把字典变回 JSONimport json
result = {
"ok": True,
"answer": 20,
"message": "计算完成"
}
result_json = json.dumps(result, ensure_ascii=False, indent=2)
print(result_json)dumps() 返回字符串。参数 ensure_ascii=False 让中文正常显示,indent=2 负责缩进,让结果更容易阅读。
注意:Python 里的布尔值是 True,转换为 JSON 后会变成小写的 true。这是两种格式各自的固定语法,并不是程序写错了。
可以把方向记成一句话:外部 JSON 用 loads 读进 Python,Python 结果用 dumps 变成 JSON 发出去。
新建 day12_json_agent.py,复制下面的完整代码:
import json
def add(a, b):
return a + b
def multiply(a, b):
return a * b
def run_agent(task_json):
try:
task = json.loads(task_json)
tool_name = task.get("tool")
args = task.get("args", {})
tools = {
"add": add,
"multiply": multiply
}
tool = tools.get(tool_name)
if tool is None:
result = {
"ok": False,
"error": f"未知工具:{tool_name}"
}
else:
answer = tool(args["a"], args["b"])
result = {
"ok": True,
"tool": tool_name,
"answer": answer
}
except json.JSONDecodeError:
result = {
"ok": False,
"error": "JSON 格式不正确"
}
except KeyError as error:
result = {
"ok": False,
"error": f"缺少参数:{error}"
}
except TypeError:
result = {
"ok": False,
"error": "参数类型不正确"
}
return json.dumps(result, ensure_ascii=False, indent=2)
task_text = '''
{
"tool": "multiply",
"args": {
"a": 6,
"b": 7
}
}
'''
print(run_agent(task_text))在终端运行:
python day12_json_agent.py你会看到 answer 为 42。程序真正执行的路线是:JSON 文本 → Python 字典 → 找到 multiply 函数 → 传入 6 和 7 → 把结果重新转换成 JSON。
请分别把 tool 改成 add、search,再删除参数 b。观察程序分别走成功、未知工具和缺少参数三条路线。
• JSON 少逗号、使用单引号等格式问题,会在解析时触发 JSONDecodeError;
• 变量名写错,例如写成 tasks 而实际只有 task,会触发 NameError;
• 字典里缺少必须的键,直接用中括号读取时会触发 KeyError;
• JSON 格式正确但工具名称不受支持,程序仍能运行,却属于逻辑问题。
“语法可以运行”和“业务逻辑正确”要分开判断。一个合法 JSON 也可能表达了 Agent 不支持的任务。
真正的 Agent 通常不会只返回一整段模糊文字。大模型可以给出工具名称和参数,程序把它解析成字典,再调用对应函数;工具结果也可以转成 JSON,交给大模型继续判断。
今天掌握的是一条非常重要的数据链路:模型做决定,JSON 传递决定,Python 执行决定。
• JSON 是跨系统传递结构化数据的文本格式;
• json.loads() 把 JSON 字符串解析成 Python 对象;
• json.dumps() 把 Python 对象转换成 JSON 字符串;
• 完整项目已经能根据 JSON 选择工具、执行参数并返回标准结果。
下一篇,我们学习文件读写:让 Agent 的数据在程序关闭后仍然保留下来。
完成练习后,欢迎留言:第 12 天完成。