Agent 实现方法论
From Scratch
学习地图
练习
术语表
← 返回首页
本章教程
本章练习
第 08 章测验
第 08 章测验
对应章节:工具系统工程化
共 8 题,答对率 ≥ 80% 即通过。请完成全部题目后点击「提交」。
Q1
工具从 1 个长到 50 个时,if/elif 分发(如 `if (name === 'get_time') ... else if (name === 'add') ...`)最核心的问题是什么?
执行速度变慢,每个分支都要判断一次
分发逻辑与工具列表耦合在同一个函数里,加一个工具就要改一遍分发代码
if/elif 只能处理同步工具,处理不了异步
工具名写错时无法被发现
Q2
注册表(name 到 spec 加实现的映射)让 Agent 循环「不认识任何具体工具」,这句话的含义是?
循环里不能写工具名,否则报错
循环只面向 list()/get() 等注册表接口,新增工具不修改循环代码
工具实现不能访问循环的变量
注册表必须放在单独的进程里运行
Q3
手写 JSON Schema 发给模型,最阴险的故障是?
写错了会直接报语法错误,测试立刻发现
schema 与实现各自维护一份契约拷贝,参数改了只改一处,线上偶发按旧契约调用才炸
schema 太长,模型读不完
模型不遵守 schema 调用工具
Q4
为什么 smolagents(Python)的 @tool 装饰器能直接读函数类型注解生成 schema,而 TS 不行?
Python 的类型注解在运行时是对象,TS 的 interface/type 在编译后被擦除、运行时拿不到
TS 的类型注解语法比 Python 复杂
smolagents 使用了收费的商业编译器
只有 Python 支持 JSON Schema
Q5
代码阅读——执行器用 try/catch 包住工具调用,成功返回 {ok:true, result},工具抛错则返回 {ok:false, error}。现在工具 add 的实现抛了 TypeError,执行器返回什么?
直接向外抛 TypeError,调用方要自己 try/catch
返回 {ok:false, error:"add() expects numeric a"} 这样的错误字符串结果
返回 undefined,表示执行没有结果
返回 {ok:true, result:undefined} 这样的成功结果
Q6
代码阅读——模型第一次调 add('abc', 2),工具返回一条错误字符串;第二次调 add(2, 3),工具返回结果。为什么第一次失败后循环没有中断、模型还能据此纠正?
模型有魔法,能自动修好任何参数
错误字符串带着工具名、非法值、期望类型,模型据此知道错在哪并重发正确参数;若无信息(如只写 failed)则无从纠正
工具系统会自动重试三次直到成功
模型不会犯错,是测试写错了
Q7
工具失败时,错误字符串里通常应该包含哪三样信息?
完整堆栈、内存地址、请求头
工具名、非法值、期望(如 add() expects numeric a, got "abc")
API key、内部路径、环境变量
时间戳、日志级别、进程 PID
Q8
内置工具集的「可用性过滤」(如 Hermes 的 check_fn)指的是?
工具使用太频繁时自动限流
注册时挂一个检查条件,条件不满足(如没配 SEARCH_API_KEY)的工具不出现在发给模型的 tools 数组里
过滤掉执行时间超过 1 秒的工具
只允许白名单里的工具被模型调用
提交