课程视频

当前智能体的能力与边界

本文是 CMU 11-768: AI Agents 的第 1 讲,由 Daniel Fried 和 Graham Neubig 于 2026-08-25 授课。Daniel 首先介绍智能体的定义、工具接口和执行循环,Graham 接着讨论了智能体能力、系统工程及课程安排。本文按照原视频的讲授顺序整理,结合官方 slide 补充了概念与图示,如有错误,欢迎指正。

能完成复杂任务,也会丢失重要要求

Daniel 开场介绍了一个多智能体编程实验:16 个智能体在两周内协作,用 Rust 构建了约 10 万行的 C 编译器,并成功编译 Linux 内核。这个案例展示了智能体处理长时间、复杂软件任务的能力,相关实验见 Anthropic 的原文。

随后,课堂展示了另一个案例。用户让 OpenClaw 整理收件箱,并要求删除邮件前先得到批准;智能体却开始批量删除邮件,用户的干预也未能及时阻止它。

OpenClaw 删除邮件的课堂案例

Daniel 推测,这次失控可能与上下文压缩(context compaction)有关:系统为了容纳更多交互,将过去的历史压缩成摘要,却丢失了“删除前需要批准”的要求。这个例子同时引出了课程关心的两个问题:怎样提高智能体的能力,以及怎样让它在长任务中保持约束、可靠地执行操作。

哪些任务适合自主执行

接下来,Daniel 通过六个任务让学生举手选择:完全自主执行(Autonomous)、先询问用户(Ask first),或者交给人来处理(Never)。

六类任务的自主执行讨论

任务课堂讨论的大致倾向
诊断网店结账失败的原因自主执行
起草并向 5 万名客户发送发布邮件先询问用户
收集税表,准备并提交报税材料先询问用户,
也有较多学生选择交给人处理
将支付 API 从 Python 迁移到 Rust,
保持移动端结账可用
自主执行与先询问的意见接近,
课堂归入自主执行
喜欢的乐队在附近演出时购买门票自主执行
根据一周血糖记录调整胰岛素剂量交给人处理

这些分类记录的是课堂中的主观讨论。不同任务涉及的影响范围、可验证程度和用户信任不同,执行边界也需要结合具体场景确定。后续的沙箱、安全、人机交互与监督课程,会继续讨论这些问题。

赞助商

GUI 与编程智能体的演示

在浏览器中完成搜索任务

Daniel 展示了 Jing Yu Koh 制作的 GUI 智能体演示。任务是在匹兹堡寻找一家好的泰国餐厅,要求至少有 200 条评价、评分不低于 4.3,并在满足条件的餐厅中选择评分最高的一家。

GUI 智能体在 Yelp 搜索并浏览餐厅页面

原视频 08:13,slide 第 5 页中的演示。

画面左侧是浏览器,右侧是模型交互记录。智能体在 Yelp 中输入查询、查看搜索结果,再导航到餐厅页面,演示最终打开了 Pusadee’s Garden。这里的行动包括输入文字和操作网页,观察则来自浏览器中的页面内容。

编写应用,再通过浏览器验证

第二个演示来自 OpenHands。智能体接到开发待办事项应用的任务后,创建应用文件、模板、静态资源、依赖文件和 README,随后启动服务,并通过浏览器测试功能。

OpenHands 在浏览器中测试待办事项应用

原视频 10:56,slide 第 6 页中的演示。

运行过程中,智能体从日志发现端口已被占用,继续处理启动问题;页面打开后,它输入待办事项、点击添加按钮,再检查删除功能。这个过程把代码编辑、终端执行和 GUI 操作连接了起来。老师借此说明,智能体能读取执行结果、发现问题,并继续采取行动。后续课程还会介绍 OpenHands 及其 SDK。

课程团队与算力支持

演示之后,课堂介绍了课程团队。两位授课老师分别是 Daniel Fried 和 Graham Neubig,助教包括 Aditya Soni、Andy Liu、Apurva Gandhi、Demi Wang、Jiarui Liu、Saujas Vaduguru、Weiwei Sun 和 Yueqi Song。团队的研究方向涉及智能体训练、奖励设计、多智能体协作以及人与智能体的交互,老师鼓励学生在研究项目阶段利用助教的经验。

课程还获得了 Fireworks AI、Modal、Prime Intellect 和 Sail 的算力支持,用于作业与研究项目。对应内容见 slide 第 7–8 页。

什么是智能体

从视频 15:22开始,Daniel 介绍智能体的基础概念。Russell 与 Norvig 在《Artificial Intelligence: A Modern Approach》中将智能体定义为:通过传感器感知环境,并通过执行器作用于环境的对象。这个概念已有较长的研究历史,搜索、强化学习等方法也能用于今天的语言模型智能体。

将这个定义放到软件任务中,slide 第 9 页给出了如下对应关系:

概念软件智能体中的含义例子
环境(environment)交互的外部对象代码仓库、网站
计算机应用、工作流
状态(state)环境的实际情况仓库文件、网页状态
应用运行情况
观察(observation)模型获得的环境信息用户消息、文件内容
网页、截图、工具结果
行动(action)智能体执行的操作回复用户、编辑文件
shell 命令、API 调用
鼠标或键盘操作
奖励(reward)评价结果的数值信号测试通过情况
LLM 评判结果、用户反馈

这里需要区分状态和观察。仓库中全部文件、依赖及运行进程共同构成环境状态,模型读取 test.py 后得到的观察,只是其中一个文件的内容。它还需要通过其他工具调用获取更多信息。行动会作用于环境,例如修改文件改变仓库内容,执行命令产生新的输出。

Daniel 用测试结果解释奖励:代码通过测试时可以记为 1,未通过时记为 0。有些任务很难通过程序直接判定成功与否,这时可能使用语言模型作为评判者(LLM-as-a-judge),或收集用户反馈。观察提供下一步决策所需的信息,奖励则用于评价行为或结果。 同一份测试输出可以同时为这两种用途提供依据。

从语言模型到工具调用

下一 token 预测与思维链

介绍工具之前,老师先回顾语言模型的生成过程:模型根据当前上下文预测下一个 token 的概率分布,选择一个 token,将它追加到上下文,再重复预测。生成回答和生成工具调用,都建立在这个过程之上。

思维链(chain of thought,CoT)让模型在最终答案之前生成中间推理内容,这些内容也会成为后续生成的上下文。slide 第 10 页用 2 × (3 + 4) 得到 14 的过程说明这一点。此时,模型主要围绕输入的提示生成文本;要让它与外部环境交互,还需要提供工具接口。

工具定义怎样进入模型输入

工具为模型提供了访问环境的接口。例如,查询天气可以调用天气 API,编程智能体则可以通过 read_file 读取仓库文件。slide 第 11 页采用了如下工具定义:

1
2
3
4
5
6
7
8
9
{
"name": "read_file",
"description": "Read a UTF-8 file.",
"parameters": {
"type": "object",
"properties": { "path": { "type": "string" } },
"required": ["path"]
}
}

name 指定工具名称,description 用自然语言描述用途,parameters 通过 JSON Schema 描述参数结构。这个工具要求传入一个字符串类型的 path,表示要读取的文件路径。

定义好接口后,还需要通过聊天模板(chat template)把工具说明转换成模型能够读取的文本,再转换成 token。课件用 apply_chat_template 展示这个过程:工具定义被放入 <tools> 等标记之间,随模型输入一起提供。模型通过训练或上下文中的示例,学习怎样使用这些接口。

工具调用与工具结果

模型生成的调用需要包含工具名称和参数,执行结果则通过工具消息返回。slide 第 12 页还展示了调用标识 call_7,用来关联一次调用及其结果。把课件中的格式简化成对话,过程如下:

1
2
3
4
5
6
用户:test.py 定义了什么?
模型 → Harness:read_file({"path":"test.py"}) [id: call_7]
Harness → 文件系统:读取 test.py
文件系统 → Harness:def add(a, b): ...
Harness → 模型:工具结果 [tool_call_id: call_7],内容为文件文本
模型 → 用户:test.py 定义了 add(a, b)。

调用消息中的角色是 assistant,工具结果的角色是 tool。聊天模板还会把它们转换成 <tool_call>、<tool_response> 等文本表示。上述标记与消息结构是课程中的接口示意,实际接入需要遵循所用模型和 API 的格式。

老师在视频 21:54提出了一个问题:除了 JSON,还能怎样让模型调用工具?学生给出的答案是直接生成代码,例如 bash 命令,或者用 Python 语法调用函数。Daniel 说明,这种方式在一些场景中很有效,课程会进一步讨论不同表示方式的取舍。

行动也是模型生成的 token 序列

语言模型生成工具调用,Harness 执行并返回观察

原视频 23:50,slide 第 13 页。

图中,语言模型生成一段包含工具名与参数的 token 序列,Harness 负责解析、校验并执行调用,再把结果交回模型。Harness 是模型外部的执行框架,承担模型与环境之间的协调工作。多模态模型还可能读取图像等输入,工具执行的职责仍由外部系统承担。

老师在这里提到了 Toolformer:它展示了训练模型使用工具,并根据工具结果继续生成内容的一种方法。下一步,把这样的调用与反馈放入循环,就能形成多步的智能体执行过程。

智能体的执行循环

将工具结果加入历史

slide 第 14 页用“a model in a loop”解释智能体,并引用了 ReAct。ReAct 将推理(reasoning)和行动(acting)交替组织,模型根据已有上下文考虑下一步,再执行操作、读取观察。

一次模型请求的上下文包含任务要求、可用工具,以及过去的行动和观察。课件继续使用读取 test.py 的例子:模型生成 read_file("test.py"),环境执行读取,返回 add(a, b) 的文件内容,并将结果加入历史。

读取文件并将结果写入历史的智能体循环

原视频 25:50,slide 第 14 页的中间动画状态。

下一轮请求使用更新后的历史,模型据此选择新的行动。对于这个短任务,它已经掌握文件内容,于是通过 send_message 向用户回复,并结束任务。

模型根据文件内容回复用户并结束任务

原视频 26:12,slide 第 14 页的结束状态。

执行结果进入历史,是前后两次行动能够衔接起来的基础。 模型何时应当判断任务完成,老师在此只作了简要介绍,后续的规划课程会继续讨论。下面按消息传递过程整理这一循环:

sequenceDiagram
    participant U as 用户
    participant H as Harness
    participant M as 模型
    participant T as 工具与环境
    U->>H: 提交任务
    H->>M: 任务、工具说明和历史
    M->>H: 生成工具调用
    H->>T: 解析、校验并执行
    T-->>H: 返回观察或错误
    H->>H: 将调用与结果加入历史
    H->>M: 更新后的上下文
    M->>H: 继续调用工具,或结束任务
    H-->>U: 返回结果

一个最小实现

slide 第 15 页展示了 mini-swe-agent 的循环实现。run 先初始化系统消息和用户任务,再反复调用 step;step 通过 query 请求模型,并将生成的消息追加到历史,随后通过 execute_actions 执行动作、收集观察。

Daniel 推荐阅读这个项目,因为它用较简单的控制流程展示了智能体的基础结构。第 1 次作业也要求实现并扩展类似的 ReAct 循环,创建工具,并用于棋类应用仓库中的编程任务。

下面保留一段补充伪代码,便于理解历史管理与循环退出。max_steps、权限校验和隔离执行是这里补充的实现约束,代码省略了实际会话格式与异常处理细节:

1
2
3
4
5
6
7
8
9
10
11
12
13
history = [system_instruction, user_task]
for step in range(max_steps):
message = model.generate(history, tools=allowed_tools)
history.append(message)

if message.is_final_answer():
return message.content

action = validate(message.tool_call, permissions, schema)
observation = execute_in_sandbox(action)
history.append(tool_result(action.id, observation))

return report_incomplete(history)

history.append(tool_result(...)) 把工具结果加入下一轮输入。文件不存在、参数不合法或执行超时,都需要返回足够的信息,供模型选择后续行动;达到调用预算、上下文限制,或用户中止任务时,框架也需要结束循环并报告进展。

补充一个错误恢复的例子:假设框架还提供了 list_files,读取失败后,模型可以先查找正确路径,再继续读取。

1
2
3
4
5
模型 → Harness:read_file({"path":"test.py"})
Harness → 模型:文件不存在:test.py
模型 → Harness:list_files({"path":"."})
Harness → 模型:tests/test.py、src/example.py
模型 → Harness:read_file({"path":"tests/test.py"})

查看一条实际执行轨迹

从视频 28:14开始,Daniel 打开 SWE-bench 的示例轨迹,展示模型实际收到的系统消息、用户任务、生成的调用及工具结果。这些消息和操作构成了执行轨迹(trajectory),能够帮助我们了解智能体怎样完成任务。

课堂现场打开的是 GPT-OSS 的一条 Django 任务:当 APPEND_SLASH=True 时,AdminSite.catch_all_view() 的重定向丢失了查询参数。例如,请求 /admin/auth/foo?id=123,期望跳转到 /admin/auth/foo/?id=123,实际跳转结果却缺少 ?id=123。

Django 重定向问题的用户任务描述

原视频 29:10,slide 第 16 页之后的现场演示。

模型先收到可与 shell 交互的系统说明,再读取具体任务。它生成的第一条命令是 ls -R,用于查看仓库结构、定位 Django admin 的实现;命令由环境执行,工具消息返回退出码 0,表示这次命令执行成功。

轨迹中的第一条 bash 调用及工具结果

原视频 29:45。

这个演示也回应了前面关于工具表示方式的讨论:模型直接生成 bash 命令,框架执行后把结果交回。退出码描述的是一次命令执行的结果,后续仍需要通过读取、修改和测试判断修复任务是否完成。

官方 PDF 第 16 页保留的是另一条 SymPy 轨迹截图,问题为 parse_expr 在 evaluate=False 时仍然计算关系表达式。两处材料展示了同一种消息循环,具体任务不同;上面的过程按视频现场演示记录。

好的智能体需要哪些能力

视频约 30:17 处,Daniel 将讲授交给 Graham。Graham 先让学生列举使用智能体时遇到的问题:运行缓慢、回答冗长、遗忘历史、误解要求、访问不该访问的资源,以及简单修改却产生大量代码等。

从这些使用体验出发,slide 第 17 页列出了六类能力:

  1. 准确调用工具(accurate tool calling):选择合适的工具,生成正确的调用与参数。
  2. 长上下文一致性(coherence over long context):在长任务和历史交互中保留要求,持续一致地行动。
  3. 可定制性(customizability):适应不同用户、课程或项目的偏好与规则。
  4. 复杂任务管理(complex task management):分解任务,处理长周期、多步骤的工作。
  5. 环境理解(environment understanding):理解代码仓库、网页及其他任务环境中的信息。
  6. 安全(safety):遵守约束,在用户能够信任的边界内执行。

Graham 特别提醒,准确调用工具的能力需要通过训练或系统设计获得,课程中自己构建模型时尤其需要关注。他还把安全视为智能体能力的一部分:如果系统会执行用户明确禁止的操作,就会影响用户是否愿意把实际任务交给它。

模型训练与 Harness 工程

两种改进途径

介绍六类能力之后,老师讨论怎样实现这些能力。slide 第 18 页将改进途径分为模型训练和 Harness 工程。

通过模型训练与 Harness 工程改进智能体

原视频 37:20,slide 第 18 页。

途径改进的对象主要做法
模型训练
LLM training
模型自身的行为与策略通过预训练、SFT 或 RL
学习推理、工具使用与错误恢复
Harness 工程
Harness engineering
模型外部的系统调整提示、工具、记忆与控制流程
提供上下文、校验、重试与执行边界

Graham 认为两者都重要。实际工作中,经常先在 Harness 中解决发现的问题,因为调整系统的周期较短;当问题足够普遍时,模型训练再让模型学习相应能力,部分外部补救机制也能随之简化。他个人更倾向于把训练视为一种基础性的解决途径,前提是有条件进行训练。

哪些工作会持续留在 Harness 中

学生接着问:如果模型训练持续改进,哪些能力仍需要 Harness 提供?Graham 以长上下文为例回答,这里既有准确性问题,也有计算效率问题。在当前模型范式下,保存和处理很长的历史仍然需要上下文管理;可定制性也常适合通过场景相关的脚本或指令提供。

另一位学生问,在推理时延很重要时,针对问题设计 Harness 是否更有效。老师指出,两条途径都需要考虑。当时延或算力限制要求使用较小的模型时,往往还需要更仔细地设计任务适配和外部约束。模型、任务与系统限制共同影响方案选择。

预训练、SFT 与强化学习

slide 第 19 页将训练过程概括为预训练(pretraining)、中期训练(mid-training)/ 监督微调(supervised fine-tuning,SFT),以及强化学习(reinforcement learning,RL)。

智能体行为的三个训练阶段

原视频 42:32,slide 第 19 页。

阶段主要材料关注的能力
预训练文本、代码、多模态数据基础表示与数据中的规律
中期训练 / SFT指令、示范轨迹、工具调用调用格式与示范中的行为
RL奖励或偏好多步轨迹层面的行为

Graham 说明,课程的算力不会用于互联网规模的预训练,重点会放在中期训练、SFT 和 RL。SFT 使用已有的任务示范,通常通过最大似然训练学习这些行为;课程更关注怎样为智能体构造这种训练数据。RL 则需要处理多步环境交互,课程会投入更多时间讨论如何完成训练。

对于代码修复,奖励往往在多次搜索、读取和修改之后才出现。最后测试通过或失败,需要与前面的行动联系起来分析,因此训练系统需要记录完整轨迹,并提供与任务目标对应的评价信号。

六类能力的实现方式

准确调用工具

slide 第 20 页介绍了两种做法。Harness 侧可以采用语法约束解码(grammar-constrained decoding),让生成的调用符合指定结构;训练侧则通过工具调用轨迹进行 SFT,让模型学习调用格式与参数用法。

补充说明:格式约束解决的是调用结构是否合法。工具是否适合当前任务、参数值是否符合用户要求,还需要结合接口语义和任务结果判断。

长上下文一致性

slide 第 21 页列出上下文压缩、动态记忆查找和子智能体委派。上下文压缩将过去的内容整理成摘要,动态记忆按需取回有关信息,委派则让子智能体处理局部任务及其上下文,再将所需结果交回。

训练侧可以进行长上下文 SFT。开场的邮件案例也说明,压缩历史时需要关注关键要求能否保留下来;历史压缩方法与模型利用长上下文的能力,共同影响长任务表现。

可定制性

slide 第 22 页将记忆、技能(skills)和自定义工具列为 Harness 侧的方法。Graham 将技能解释为围绕某类任务组织的提示,有时还包含脚本,在需要时加载;记忆则帮助系统保留与用户持续交互得到的信息。

训练侧可以利用用户反馈进行 RL,例如根据某个用户的认可或否定调整行为。老师指出,这在当时仍属于较早期的研究方向,可定制性也是 Harness 工程很有价值的应用场景。

复杂任务管理

slide 第 23 页介绍规划与任务分解工具,以及将子任务委派给其他智能体。课堂还举例说明,规划模式可以先通过提示要求模型制定计划、暂缓执行;更复杂的系统可以进一步组织任务分解和协作。

训练侧则让模型在复杂、长周期任务上进行 RL。这里既要能生成计划,也要能根据任务进展继续执行和调整,最终回到用户目标判断完成情况。

环境理解

slide 第 24 页讨论模型怎样理解实际接收到的信息。GUI 智能体需要理解网页和界面截图,处理时间序列或实验图像的智能体,也需要相应领域的表示和知识。老师以“本来只需两行修改,却生成上千行代码”为例,说明对仓库环境理解不足也会影响行动选择。

Harness 侧可以提供包含领域知识的技能;训练侧则使用符合预期观察形式的数据进行 SFT,或在特定领域环境中进行 RL。Graham 强调,能力提升依赖于人们设计合适的训练数据、环境和方法,构建可交互的领域环境本身就是重要工作。

安全

slide 第 25 页列出工具沙箱、凭证访问限制、轨迹监控,以及考虑安全的 RL。Graham 随后用 OpenAI 模型在网络安全评测中越过环境边界、访问 Hugging Face 系统获取测试答案的事件,说明执行隔离、访问控制、行为监控和模型训练都需要参与安全设计。事件本身见 OpenAI 的官方说明。

课堂关心的是各项机制怎样共同发挥作用:沙箱限制行动能够影响的范围,凭证管理限制访问能力,监控记录并发现异常行为,训练则影响模型如何选择行动。实际任务中,需要把这些边界落实到执行系统。

智能体系统的工程组件

从视频 51:51开始,Graham 介绍系统组成。slide 第 26 页展示了模型、推理服务、Harness、沙箱、监控和训练之间的关系。

智能体系统中的模型、Harness、沙箱、推理、监控与训练

原视频 53:15,slide 第 26 页。

模型通过推理服务生成下一步,Harness 组织任务、状态及工具,沙箱为执行提供隔离环境,监控记录过程,训练系统利用数据改进行为。老师提醒,智能体工程涉及多部分软件与系统工作,各部分的职责需要分别理解。

Harness

slide 第 27 页列出状态、工具、记忆与控制流程管理,以及动作校验、错误处理、权限和执行边界。课堂将相关软件分成编程智能体与编排框架两类。

类别课堂中的例子Graham 讨论的侧重点
编程智能体Claude Code、Codex
OpenHands、OpenCode、Pi
行动空间较丰富,
可以写代码、操作网页等;
智能体间的组织方式可能较简单
编排框架
orchestrators
LangGraph、CrewAI用较明确的工作流
组织功能受限的智能体

Slide 写的是 LangChain,Graham 在讲解时表示这里用 LangGraph 更合适。他对这两类系统的比较是课程中的概括,用于说明设计思路;一款实际软件也可能承担多种功能。

沙箱

slide 第 28 页强调隔离代码和工具执行,限制计算、网络及文件系统访问,同时创建可复现的环境。课堂列举了 Docker、Apptainer,以及 Modal、Sail 等云端环境。

沙箱还服务于评测和训练。例如,SWE-bench 的每个问题都有相应环境,智能体从规定的初始状态开始运行,才能比较不同方案的结果。前面所说的“环境”是智能体操作的对象,沙箱则为这些操作提供隔离与复现条件。

语言模型推理

slide 第 29 页讨论可靠提供模型生成、批量处理请求、复用 KV cache,以及流式输出、并发与吞吐。课堂列举了 vLLM、SGLang,也提到了模型推理服务提供商。

Graham 特别强调缓存:智能体每执行一步,历史中的行动与观察就会增加,后续请求往往包含大量相同前缀。复用已经计算过的内容,对长轨迹推理效率很重要。多个智能体同时请求模型时,还需要考虑请求批处理和服务并发。

训练系统

slide 第 30 页列出准备数据、收集交互轨迹(rollouts)、协调分布式 worker,以及保存检查点、评测和复现实验。课堂中的软件例子是 SkyRL 和 Miles。

训练系统既要更新模型参数,也要协调环境交互与数据收集。对于智能体 RL,生成完整轨迹、计算奖励,再将数据用于训练,是这些系统需要连接起来的工作。

可观测性与监控

slide 第 31 页介绍轨迹及指标采集,记录质量、时延、成本和失败情况,并比较不同轨迹与评测。课堂列举了 Laminar、MLflow,Graham 还补充提到了前面演示所用的 Transluce。

查看记录时,需要知道模型读取了什么、选择了哪些行动、工具返回了什么,以及任务最终是否完成。命令选错、工具超时和依赖缺失是不同的问题,完整记录有助于确定应当改进模型行为、Harness 还是运行环境。

课程目标与作业安排

学完课程需要掌握什么

介绍系统组件之后,slide 第 32 页列出了五项学习目标:

  1. 在开源 LLM 之上,从零实现一个智能体。
  2. 为多步骤任务设计评测。
  3. 训练智能体,提高其能力。
  4. 分析安全与可靠性的取舍。
  5. 围绕智能体开展一个开放的研究问题。

Graham 特别说明,评测能力与训练密切相关:如果能够设计任务、判断结果,并扩展评测规模,就能为 RL 提供训练所需的环境和信号。

作业与研究项目

slide 第 33 页安排了三次个人作业和一个小组研究项目:

项目主要内容Slide 中的暂定截止日期
Assignment 1:Harness构建基础执行框架,
建立可复现的基线
2026-09-10
Assignment 2:Evaluation测量行为、报告失败案例,
将演示与实证区分清楚
2026-09-24
Assignment 3:Training训练或适配组件,
分析行为、成本与鲁棒性
2026-10-22
Research Project结合具体任务、环境与评测,
完成一个研究问题
按项目说明安排

这些日期是课堂 slide 中的暂定安排,实际要求与截止时间以正式作业说明和 Canvas 为准。第 1 次作业的代码及要求见 Build an Agent Harness。

课程前半段通过作业学习构建、评测和训练,后半段将这些能力用于一个感兴趣的研究方向。研究项目由 2–3 人组成小组。下面根据课程安排整理它们之间的关系:

flowchart LR
    A["构建 Harness
工具与控制循环"] --> B["设计评测
任务集与失败案例"] B --> C["训练与改进
SFT、RL"] C --> D["研究项目
实验与分析"] D -. "发现新的失败模式" .-> A

后续课程主题

slide 第 34 页把学期内容分成以下阶段:

时间范围主题
08-25 至 09-08智能体能力:定义、工具、上下文、记忆与规划
09-10 至 09-15应用领域:编程与 GUI 智能体
09-17 至 10-01训练与应用:SFT、RL、深度研究等
10-06 至 10-22框架与安全:沙箱、OpenHands、LangGraph
10-12 至 10-16 为秋假
10-27 至 11-05人机交互、多智能体及项目讨论
11-10 至 12-03进阶主题、搜索与项目展示
11-25 至 11-27 为感恩节假期

老师还介绍了邀请领域研究者授课的安排。具体讲次、训练系统、监控等专题及日期,见课程目录与官方课程安排。

修读要求与课程规则

前置经验与评分

从视频 01:01:39开始,Graham 介绍修读要求。课程包含较多机器学习实现工作,要求学生已有较认真、完整的语言模型训练经验。相关课程的语言模型训练作业可以作为依据,产业界的实际训练经历也可提交说明;老师用约 4B–7B 及以上规模的模型训练经历举例。

Slide 第 35 页要求通过 Piazza 提供的表单说明课程、训练作业链接、学期与成绩,或相当的训练经历,当时安排在 08-27 前提交。

Slide 第 36 页给出了评分构成:

项目分值占比完成方式
三次作业合计 40%个人完成
课堂学习要点
lecture highlights
10%个人完成,课后 24 小时内提交
从周四的课程开始
研究项目50%2–3 人小组完成
提案 5%、中期检查 5%
展示 10%、最终报告 30%

课堂学习要点可以简短,记录自己学到或认为有价值的内容。老师希望通过这种反馈了解学生的学习情况,也了解哪些内容学生已经掌握。

使用 AI 工具

Slide 第 37 页说明,课程通常允许使用 AI 工具,具体作业或项目另有规定时遵循对应要求;课堂学习要点需要由学生本人书写。学生需要对提交的观点、引用、结果和代码负责,并能在作业测验中解释自己的实现。

Graham 在讲解中强调,使用智能体时仍需理解实现中的细节。对于课程学习,提交自己能够解释的简洁代码,有助于掌握构建和评测智能体所需的能力。

截止时间与宽限天数

Slide 第 38 页为三次作业各提供两天、每次 24 小时的宽限时间(slack days)。宽限天数附属于对应作业,不能转移或共享;用完后,每多迟交一天或不足一天,扣除该作业分数的 5%。项目提案与报告也各有两天宽限时间,项目展示没有。

本讲在课程规则之后结束,下一讲是工具使用(Tool Use)。

补充练习:实现文件读取循环

为了动手理解前面的消息循环,可以准备一个只有两个文件的仓库,让模型回答“哪个文件中的函数实现了 add(a, b)”。提供 list_files 和 read_file 两个工具,限制调用步数,并记录每次调用和返回结果。这个练习是基于课堂机制整理的扩展示例。

先验证正常读取与回答,再模拟“文件不存在”,检查错误是否进入下一轮上下文、模型是否重新查找文件;随后将步数上限设低,检查框架是否结束循环并报告尚未完成的进展。

文件读取走通后,再加入修改文件和执行测试的工具。修复代码时,先搜索并读取实现、复现问题,再修改并运行对应测试;出现新报错时,根据返回的观察继续调查。最后将补丁和测试输出与原始要求对照,检查任务是否完成,并保留完整轨迹作为评测和后续改进的材料。

参考资料