← 课程地图
第 01 章 · 概念骨架

一个 PR 的旅程

从一段真实的代码改动,到 Agent 解题与评估——整个课程最核心的骨架,一条线讲完。每个环节都能点进讲义深挖。

按 → 开始 · 一次只看一件事 · 节点可点击直达

赶时间?直接进实战篇 · 真实 PR 全程 →
第 1 站 · 题从哪来

一个 PR 是什么

1
一次「请把我的代码改动合并进去」的提议 开发者不直接写主干,而是请维护者审查后再合并——开源协作的最小单元
2
代码进入主干前的一道审查关卡 review 通过、CI 变绿才 merge——代码质量由流程保证,不靠自觉
3
里面装着 commits + diff + 讨论与审批 后来造题要用的三个「宝贝」——题面、答案、测试——全都藏在 PR 里
4
不会自动合并——review 通过、CI 变绿才 merge 这保证了每道「真题」背后都有人类维护者把关

每一个 PR,都自带 4 个「题目元素」——下一屏见

第 1 站 · 题从哪来

PR 里藏着一套完整考题

ISSUE BODY 题面 用户报告的问题原文——Agent 将读到的一切背景信息
PR DIFF 答案 开发者写下的修复——评分时的标准对照
TEST 改动 评测 判对错的测试——通过与否由它说了算
BASE COMMIT 起点 从哪个仓库状态开始改——环境快照,hash 锁死

题面、答案、评测、起点——正好是一道题的 4 个字段

第 1 站 · 题从哪来

为什么用 PR 造题

1
题面真实——issue 是真用户写的 真实场景、真实报错、真实表达——不是出题人坐在办公室编的
2
答案独立——报 bug 的人 ≠ 写修复的人 避免了「自问自答」:题面不知道答案长什么样
3
评测独立——测试是 PR 自带的,不是事后编的 测试先于题目存在,且经过维护者 review,难以被「应试」
4
不可篡改——commit hash 锁死了事实 任何人、任何时候都能检出同一快照,复现同一道题

这样的题才够格当 Agent 的「真题」——看它长什么样

第 2 站 · 题长什么样

一道题的 4 个字段

字段角色来自 PR 的哪里
problem_statement题面issue 正文——Agent 读到的问题原文
patch答案PR 的代码 diff——评分时的标准对照
test_patch评测PR 的测试 diff——判分合约
base_commit起点PR 的合并基点——仓库快照

其中 test_patch 定义了两组测试——判分的全部秘密

第 2 站 · 题长什么样

F2P 与 P2P

1
F2P:修好前挂、修好后必须过——证明「修对了」 如实战篇 sympy 题新增的 test_immutable:修复前必然失败,修复后必须通过
2
P2P:本来就要过、修完不能挂——证明「没改坏」 全部原有测试防回归——改了 A 处弄坏 B 处,照样判负
3
两组全过,这道题才记 FULL %Resolved = FULL 题数 ÷ 总题数——整个基准的计分方式

合约有了——谁来解题?下一站认识 Agent

第 3 站 · 谁来解

Agent = 大脑 + 身体

1
LLM 是大脑——思考、决策下一步 读什么文件、改哪一行、先跑哪个测试——每一步都是它在判断
2
harness 是身体——跑工具、记历史、驱动循环 Claude Code、DeepSeek Harness 都是 harness——模型之外的整个工程系统
3
Agent ≠ LLM——光有大脑,不会动手 模型不会自己读文件、跑命令;这些能力由 harness 的工具层提供

大脑和身体怎么配合?一个循环讲清

第 3 站 · 谁来解

解题循环:看 → 想 → 做

1
observe 观察——读文件、看报错 收集证据:代码结构、错误栈、测试输出
2
think 思考——LLM 决定下一步 定位问题、提出假设、规划行动——推理发生在这一步
3
act 行动——改代码、跑测试 验证假设:改完立刻测,测试结果回流成下一轮的观察
4
循环往复,直到问题解决 测试全绿 → 结束;步数/预算用尽 → 强制停止

循环的每一步,底层都在和 LLM「说话」——下一站拆开看

第 4 站 · 怎么解

LLM 对话的核心字段

字段含义为什么重要
model用哪个模型决定能力上限与调用成本
messages全部对话历史「记忆」都在这——最关键的一个
choices模型回给你的话含文本回复与工具调用请求
finish_reason它为什么停下stop = 说完了;tool_calls = 等你执行工具

其余字段都是加料——4 个里 messages 最关键

第 4 站 · 怎么解

messages 的 3 种角色

SYSTEM 设定 你是谁、守什么规则、有哪些工具可用——一次设定,全程生效
USER 指令 任务与上下文——SWE-bench 的题面就装在这一条里
ASSISTANT 回复 文本 + tool_calls——模型解题的每一步都记在这里

会说话还不够——Agent 真正动手,靠工具调用

第 4 站 · 怎么解

工具调用 3 步

1
你声明 tools——告诉模型「能做什么」 名称 + 功能描述 + 参数 schema——像一份菜单
2
模型回 tool_calls——它决定「要做这个」 点菜:给出函数名与实参,等待执行
3
你执行、结果塞回对话——它接着想 结果以 tool 角色消息回传,进入下一轮思考

一道题往往嵌着几十次工具调用——历史怎么延续?

第 4 站 · 怎么解

多轮对话的真相

1
服务端不保存对话——每次都像初次见面 API 是无状态的:没有对话 ID,没有服务端记忆
2
每轮把整个 messages 重发一遍——记忆全靠客户端 第 40 轮的请求里包含前 39 轮的全部内容
3
历史越长 token 越贵——「模型失忆」多半是截断没做好 上下文窗口有限,塞不下就得裁剪——裁错地方就丢关键信息

会说话、会动手——解完题,怎么判它做得好不好?

第 5 站 · 解得怎样

%Resolved:做对了没有

1
FULL = F2P 全过 ∧ P2P 全过 单题通过标准:修对新测试,且不弄坏任何旧测试
2
%Resolved = FULL 题数 ÷ 总题数 比如 300 题做出 87 题 → 29%——一个数字概括整个基准的成绩
3
单题 100% 只代表这一道做对 泛化能力要靠大量互不相同的题来检验

但做对了,就等于做得好吗?

第 5 站 · 解得怎样

做对了 ≠ 做得好

1
结果维度只回答「对不对」 测试绿了就是绿了——一个布尔值
2
同样做对——可能直给,也可能绕十条弯路蒙对 结果维度完全无法区分这两种过程
3
过程维度回答「怎么做出的」——弯路、浪费都要抓 步数、token、重复度、无效动作——可量化、可比较、可改进

过程,就藏在 Agent 解题的轨迹里

第 5 站 · 解得怎样

过程,藏在轨迹里

1
一条轨迹 = 一串「读 → 想 → 改 → 测」的循环 Agent 解题的完整时间线——append-only,只增不改
2
看节奏——循环是否高效推进 每步的工具选择、步与步之间的推进逻辑
3
抓弯路——重复、无效、绕路都是浪费 可分类、可计数、可折算成 token 成本

至此闭环:题从哪来 → 长什么样 → 谁来解 → 怎么解 → 解得怎样 · 按 ← 回看

进入实战篇 · 一个真实 PR 的三段旅程 →
1 / 15 ← → 翻页 · 深挖 ↗ 新标签 · Esc 退出
专注模式 · 第 01 章 概念骨架 · 生成时间:2026-09-11(v2.1 章节化重构) · agentsoft-research-platform teaching-web-platform