Agent 实现方法论
From Scratch
学习地图
练习
术语表
← 返回首页
本章教程
本章练习
第 07 章测验
第 07 章测验
对应章节:最小 Agent Loop
共 8 题,答对率 ≥ 80% 即通过。请完成全部题目后点击「提交」。
Q1
为什么一次单独的 LLM 调用「不是」一个 Agent?
因为单次调用没有 API key 就无法工作
因为单次调用只能回答,不能为了完成目标连续行动(要工具、看结果、再决定)
因为单次调用返回的文本长度有限
因为单次调用不支持流式输出
Q2
最小 Agent Loop 中,谁负责「执行工具」?
模型自己(LLM 直接运行工具代码)
harness(我们手写的循环代码)
用户手动执行
操作系统内核
Q3
循环在什么条件下会「继续下一轮」?
模型返回了一段文本 content
模型返回了 tool_calls(要求调用工具)
用户又发来一条新消息
iterations 是奇数
Q4
判断循环是否继续时,为什么「看有没有 tool_calls」比看厂商的 stop_reason / finish_reason 更可靠?
因为 stop_reason 字段在所有厂商里都不存在
因为两家厂商的枚举语义不同('tool_calls' vs 'tool_use'),且流式响应里 stop_reason 可能还没更新
因为 tool_calls 解析起来更快
因为 stop_reason 一定是字符串,无法比较
Q5
代码阅读:下面这个循环为什么可能永远停不下来? ```ts async function loop(messages) { while (true) { const r = await callLlm(messages); const out = await runTool(r.toolCalls); messages.push(r.message); messages.push({ role: 'tool', content: out }); } } ```
因为 runTool 每次执行都会失败
因为没有 stop 条件:只要模型每轮都返回 tool_calls,循环就永不退出
因为 messages.push 会抛出异常
因为 callLlm 只能被调用一次
Q6
代码阅读:让上一题的循环停下来,最直接的做法是?
把 while (true) 改成 while (iterations < maxIterations),每轮迭代计数、超限即停
删掉 messages.push 那两行
把 runTool 换成异步版本
在每次 callLlm 之前加一段 sleep
Q7
与 ReAct 提示式(文本协议)相比,原生 tool calling(结构化协议)的优势是哪一项?
任意文本模型都能用,不要求模型厂商支持 tool calling
[object Object]
不需要在请求里声明工具的 JSON Schema
不需要把工具结果回填给模型
Q8
工具执行结果必须回填成什么形状,模型下一轮才能正确配对?
{ role: 'tool', tool_call_id: <对应 tool_calls[].id>, content: 输出 }
{ role: 'assistant', content: 输出 }
{ role: 'user', content: 输出 }
{ role: 'system', content: 输出 }
提交