6.6 如何学习 Harness 工程
方法论:用 AI 读框架源码
前面 5 节讲了 Harness 工程的问题、设计清单和产品实现。你可能会问:其他框架是怎么做的?我怎么学习它们的设计?
答案是:让 AI 帮你读源码。
四大 Agent 框架(LangGraph、MAF、AgentScope、Hermes)都是开源的。你不需要逐行读完几万个文件——你只需要让 Qoder 带着具体问题去读特定的代码段。
读源码的正确姿势
错误做法
❌ "帮我分析一下 LangGraph 的源码"
这个提问太大了。LangGraph 有几千个文件,AI 不知道你要看什么,只能给你一个泛泛的概述。
正确做法
✅ "LangGraph 怎么实现条件边(conditional edge)的?找到核心代码,解释它怎么在节点执行后做校验并决定走哪条路"
带着具体问题、具体概念去读,AI 能精准定位到关键代码,给你解释设计思路。
四大框架的阅读清单
按 6.2 的设计清单,每个维度该看哪个框架的什么代码:
1. 约束与边界(Rule + AGENTS.md)
| 框架 | 看什么 | 具体问题 |
|---|---|---|
| LangGraph | 图结构定义 | 节点和边怎么定义?Agent 的行为如何被图结构约束? |
| MAF | 装饰器管道 | 装饰器怎么叠加?每个装饰器做什么?怎么组合? |
| Hermes | Skill 系统 | Skill 文件怎么加载?怎么按场景触发? |
2. 输出校验(EvalCheck)
| 框架 | 看什么 | 具体问题 |
|---|---|---|
| LangGraph | 条件边(Conditional Edge) | 检查不通过时怎么走另一条路? |
| MAF | EvalCheck 模块 | 校验函数怎么定义?怎么组合?失败怎么处理? |
| AgentScope | 安全中断机制 | 发现危险操作怎么立即停止? |
3. 监控与追踪(Monitor)
| 框架 | 看什么 | 具体问题 |
|---|---|---|
| MAF | 可观测性模块 | 怎么记录 Agent 执行过程?怎么对接 OpenTelemetry? |
| LangGraph | 状态检查点 | 怎么保存执行状态?怎么恢复? |
| Hermes | 日志系统 | 怎么追踪 Agent 的决策过程? |
4. 多 Agent 编排
| 框架 | 看什么 | 具体问题 |
|---|---|---|
| LangGraph | 子图(Subgraph) | 怎么嵌套子流程?父子图怎么通信? |
| MAF | Agent 编排器 | 多个 Agent 怎么协调?谁控制流程? |
| Hermes | 插件系统 | 怎么动态加载 Agent 能力? |
实操示例:用 Qoder 读 MAF 的 EvalCheck
以下是一次真实的读代码过程:
第一步:定位代码
问 Qoder:"在 agent-framework 仓库里,EvalCheck 相关的代码在哪个文件?
找到定义 EvalCheck delegate 或接口的地方。"Qoder 会搜索代码库,定位到类似 src/lib/evaluation/EvalCheck.cs 的文件。
第二步:理解设计
"读一下这个文件,告诉我:
1. EvalCheck 的输入输出是什么?
2. 它怎么跟 Agent 的执行流程串起来的?
3. 校验失败后怎么处理?"第三步:对比自己的实现
"我的 EvalCheck 是这样实现的:[贴你的代码]
MAF 的实现和我的有什么区别?各自的好处是什么?"第四步:提炼可借鉴的点
"从 MAF 的实现中,有哪些设计是我可以借鉴的?
列出 3 个具体的改进建议。"对比学习的模板
读完多个框架后,用这个表格做对比:
| 维度 | LangGraph | MAF | AgentScope | Hermes | 我的实现 |
|---|---|---|---|---|---|
| 约束方式 | 图结构 | 装饰器 | 运行时干预 | Skill 文件 | Tool 权限 |
| 输出校验 | 条件边 | EvalCheck | 安全中断 | 无 | Checker Agent |
| 监控 | 状态检查点 | OpenTelemetry | 日志 | 日志 | 事件总线 |
| 多 Agent | 子图 | 编排器 | 安全检查 | 插件 | TaskTool 派发 |
| 错误恢复 | 回退边 | 重试装饰器 | 优雅取消 | 无 | 修正循环 |
这张表不是让你背框架特性,而是让你看清:同一个问题,不同框架给出了不同的答案。你的答案是什么?为什么?
学习建议
不要试图读完整个框架。每个框架都有几万行代码,你只需要读跟你当前问题相关的部分。
带着问题读。先有具体问题("怎么做输出校验?"),再去找代码。不要漫无目的地浏览。
对比着读。读完 MAF 的 EvalCheck,再读 LangGraph 的条件边。同一个问题的不同解法,比单一解法更有启发性。
读完就改。每读完一个框架的某个设计,立刻问自己:"我的代码可以怎么改?"然后动手改。不实践等于没读。
让 AI 做翻译。框架源码通常是英文的,设计思路可能藏在注释和命名里。让 AI 帮你"翻译"——不是翻译成中文,而是把代码翻译成设计意图。
关键认知
Harness 工程不是学出来的,是做出来的。
你可以读遍所有框架的源码,但如果自己没有做过一个 Agent 系统,读完也只是"知道了"。
这本书讲的 Harness 工程,不是"理论上的最佳实践",而是"我做过的真实决策"——从问题到方案到代码到踩坑到改进。
你可以参考我的决策,但不要照搬。你的场景不同,问题不同,答案也应该不同。
重要的是:知道要解决什么问题,知道有哪些可选方案,知道怎么选。
这就是 Harness 工程的全部。