我最早把 Agent 当成会调 API 的聊天框,后来做长任务才明白,难的是循环怎么停、权限怎么控、崩了怎么恢复。
Q1: Agent 的历史?为什么要有它?
2022 年末: ChatGPT 引爆对话范式
2023 年初: AutoGPT 引爆 Agent 概念
2023 年中: 框架和生态成熟
2024-2025: 企业级 Agent 落地
没有 Agent
引入 Agent
AGENT.md 的历史与概念
随着 AI 编程工具的爆发,每个工具都引入了自己的 Agent 配置文件格式——Anthropic 的 CLAUDE.md、OpenAI 的 AGENTS.md、社区的 AGENT.md。理解这些配置文件的来龙去脉,是理解 Agent 工程化的关键一环。2023-2024: AI 编程工具兴起,配置文件各自为政
2025: Anthropic Claude Code 引入 CLAUDE.md
CLAUDE.md 作为 Agent 的配置文件。它放在项目根目录,定义了 Agent 的角色、可用工具、行为约束和项目上下文。CLAUDE.md 是最早被广泛使用的 Agent 配置文件格式,但它绑定在 Anthropic 的 Claude Code 生态中,是专有格式。2025: OpenAI Codex 引入 AGENTS.md
AGENTS.md 作为 Agent 配置文件,功能类似 CLAUDE.md——定义 Agent 的角色和行为规范。AGENTS.md 是 OpenAI 生态的专有格式,与 CLAUDE.md 互不兼容。2025: Sourcegraph Amp 推动 AGENT.md 标准化
AGENT.md 作为通用的 Agent 配置文件格式。AGENT.md 不绑定任何特定厂商,目标是成为跨工具的通用标准。社区开始推动 AGENT.md 的标准化,希望不同 AI 编程工具都能识别同一份配置文件。Q2: Agent 的核心原理
Agent 的本质是 LLM + Tools + Memory + Planning 的组合,核心逻辑通过 ReAct 模式驱动循环执行。Anthropic 在《Building Effective Agents》中提出了五种核心构建模式:Prompt Chaining(串联)、Routing(路由)、Parallelization(并行)、Orchestrator-Workers(编排-工人)、Evaluator-Optimizer(评估-优化),这些模式可以组合成任意复杂的 Agent 架构。[1]工具调用(Function Calling / Tool Use)
工具调用是 Agent “做事”的核心能力。LLM 本身只能生成文本,但通过 Function Calling,LLM 可以”选择”要调用的工具并传入参数。记忆系统(短期记忆、长期记忆)
Agent 的记忆系统决定了它能处理多复杂的任务、能记住多少上下文。Planning(规划能力)
Planning 是 Agent 区别于简单工具调用的关键——Agent 能把复杂任务拆解为可执行的步骤。Anthropic 的五种 Agent 构建模式
Anthropic 在《Building Effective Agents》中提出了五种可以组合使用的构建模式,这是目前最权威的 Agent 架构设计指南:Q3: 如何实现企业级 Agent
企业级 Agent(Enterprise-grade Agent)和”玩具级 Agent”的核心区别在于:可控性、安全性、可审计性。权限收敛(最小权限原则)
Agent 只拥有完成当前任务所需的最小权限。不同角色的 Agent 配置不同的工具集。审计日志(Audit Logging)
企业级 Agent 的每一次操作都必须留痕,支持事后追溯和合规审计。容错降级(Fallback)
Agent 必须有完善的降级策略,确保在 LLM 调用失败、工具不可用时仍能提供基本服务。确定性边界(Deterministic Boundaries)
LLM 的输出天然是不确定的,但企业级系统需要确定性。解决方案是分层架构。成本控制(Token 预算管理)
企业级 Agent 必须严格控制 Token 消耗,避免成本失控。企业级 Agent 的设计原则
Anthropic 在《Building Effective Agents》中强调了三个关键设计原则:- 保持简单:不要过度设计。大多数场景用 Prompt Chaining 或 Routing 就够了,只有真正需要动态决策的场景才用完整的 Agent Loop。
- 透明性:Agent 的每一步决策都应该可观察、可调试。用 LangSmith 等工具追踪 Agent 的完整执行轨迹。
- 工具设计优先:工具的描述质量直接影响 Agent 的调用准确率。工具名称要直观,参数描述要清晰,返回值要结构化。[1]
Q4: 长时间运行 Agent(5小时+)设计
长时间运行 Agent(Long-running Agent / Autonomous Agent)是指需要持续执行数小时甚至数天的 Agent 任务,例如大规模数据迁移、持续代码重构、自动化运维巡检等。异步执行(Asynchronous Execution)
长时间运行的 Agent 不能阻塞主线程,必须用异步架构。状态快照与恢复(Checkpointing & Recovery)
Checkpoint 是长时间运行 Agent 的生命线——中断后必须能从断点恢复,而不是从头开始。长期记忆(Long-term Memory)
长时间运行的 Agent 会积累大量上下文,必须定期压缩记忆。进度追踪与断点续传
长时间运行的 Agent 必须有完善的进度追踪和人工干预机制。长时间运行 Agent 的工程挑战
长时间运行 Agent(5 小时+)面临三个独特的工程挑战,这些是普通 Agent 不会遇到的问题:- 上下文窗口溢出:随着对话历史越来越长,128K/200K tokens 的上下文窗口会被耗尽。解决方案是”记忆分层”——近期对话保留完整内容,更早的对话用小模型压缩为摘要。
- 状态一致性:Agent 执行过程中可能遇到网络中断、服务重启等异常。Checkpoint 机制让 Agent 能从断点恢复,而不是从头开始。LangGraph 原生支持 Checkpoint。
- 成本失控:长时间运行的 Agent 可能消耗大量 Token。必须设置 Token 预算上限,超出时自动降级到更便宜的模型或暂停执行。[4]
Q5: Human-in-the-Loop 详解
Human-in-the-Loop(人机协同)是企业级 Agent 的关键机制——不是所有操作都能让 Agent 自主执行,高风险操作必须暂停等待人类审批。LangGraph 提供了原生的interrupt + Command + Checkpoint 机制来实现这一模式。[3]
LangGraph interrupt 机制
LangGraph 的interrupt() 函数是 Human-in-the-Loop 的核心——它在 Agent 执行过程中暂停,把当前状态持久化到 Checkpoint,等待人类输入后用 Command(resume=...) 恢复执行。
审批流设计:哪些操作需要人工审批
不是所有操作都需要人工审批——审批过多会拖慢系统,审批过少会增加风险。核心原则是按风险等级分级。暂停/恢复实现:interrupt + Command + Checkpoint 三件套
LangGraph 的 Human-in-the-Loop 依赖三个核心组件的协作:审批通知与多渠道集成
生产环境中,审批请求需要通过多种渠道通知人类(前端界面、Slack、邮件、飞书),并支持在任意渠道审批后恢复执行。interrupt() + Command(resume=...) + Checkpoint 三件套,在 Agent 执行高风险操作时暂停等待人类审批,审批后无缝恢复执行。核心设计原则是按风险等级分级:低风险自动执行、中风险异步通知、高风险暂停审批、禁止操作硬编码拒绝。Q6: Agent Skills vs RAG 区别
RAG(Retrieval-Augmented Generation,检索增强生成)和 Agent Skills(工具调用)是两种完全不同的技术,解决不同的问题。基础梳理
专家视角深度剖析
很多人会混淆 RAG 和 Skills,但它们是正交的两个维度。RAG 解决”知不知道”的问题,Skills 解决”做不做得到”的问题。 一个完整的 Agent 系统通常同时需要两者。RAG 和 Skills 的协同
Q7: n8n 和 Dify 在 Agent 中的应用
n8n:工作流编排平台
n8n 是一个开源的工作流自动化平台,用节点式 UI 编排复杂的工作流,天然适合 Agent 的任务编排。- 节点式编排:拖拽节点构建 Agent 工作流,无需写代码
- 外部 API 集成:内置 400+ 集成(Slack、GitHub、Google Sheets 等)
- 触发方式多样:Webhook、定时触发(Cron)、事件触发、手动触发
- 错误处理:内置重试、错误分支、超时控制
Dify:Agent 应用平台
Dify 是一个开源的 LLM 应用开发平台,内置了 Agent 能力,适合快速构建 Agent 应用。- 内置 Agent 能力:支持 Function Calling、ReAct 等 Agent 模式
- 可视化工具配置:拖拽添加工具,配置参数和认证
- 多轮对话管理:内置对话记忆、上下文窗口管理
- RAG 集成:内置文档上传、向量化、检索能力
- 一键发布:生成 API 端点或嵌入式 Web 组件
LangGraph vs n8n vs Dify 对比
Q8: Agent 的错误处理与稳定性
生产环境的 Agent 必须有完善的错误处理机制,否则一个 LLM 调用失败就可能导致整个任务崩溃。重试策略(指数退避)
降级策略(Fallback)
死循环检测
超时控制
Token 消耗优化
Q9: 高频面试题
问题:“Agent 和 RAG 的区别?如何设计一个企业级 Agent?”
及格回答(60-70分):“RAG 是检索增强生成,给模型注入外部知识。Agent 是自主执行,让模型调用工具做事。企业级 Agent 需要权限控制和审计日志。”问题出在:知道概念但不理解工程细节。 满分回答(90-100分):
“RAG 和 Agent 是正交的两个维度。RAG 解决’知不知道’——通过向量检索把相关文档注入 Prompt,让模型基于真实数据回答,减少幻觉。Agent 解决’做不做得到’——通过 Function Calling 让模型调用工具执行操作。一个完整的 Agent 系统通常同时需要 RAG(注入领域知识)和 Skills(执行操作)。[1]”
“企业级 Agent 的核心设计有五个维度:权限收敛(不同角色的 Agent 配置不同的工具集,代码审查 Agent 只有读权限没有写权限)、审计日志(每次工具调用记录输入/输出/token 消耗/耗时,支持事后追溯)、容错降级(主模型失败降级到备用模型,再失败降级到规则引擎,最后人工兜底)、确定性边界(LLM 只做理解和路由,执行层用规则引擎保证确定性)、成本控制(Token 预算管理 + 模型分级 + Prompt Cache)。[2]”
“长时间运行 Agent(5 小时+)还需要额外的工程保障:异步执行(不阻塞主线程)、状态快照(每步保存 Checkpoint,中断后从断点恢复,不需要从头开始)、长期记忆压缩(定期用小模型把 100K tokens 压缩为 5K 摘要)、进度追踪(实时汇报进度 + Human-in-the-Loop 高风险操作人工审批)。[3]“
常见追问
Agent 和 RAG 的区别?
Agent 和 RAG 的区别?
如何设计一个企业级 Agent?
如何设计一个企业级 Agent?
- 权限收敛:最小权限原则,不同角色的 Agent 配置不同的工具集。代码审查 Agent 只有 readFileTool,没有 writeFileTool。高风险操作(删除数据、部署生产)必须 Human-in-the-Loop 审批。
- 审计日志:每次工具调用记录完整上下文——agentId、toolName、input、output、tokenUsage、duration、status。用 runId 关联同一次执行的所有操作,支持事后追溯。
- 容错降级:四层降级策略——主模型 → 备用模型 → 规则引擎 → 人工处理。不可重试的错误(参数错误)直接降级,可重试的错误(网络超时)指数退避重试。
- 确定性边界:LLM 只做理解和路由(不确定性),Schema 校验输出格式(半确定性),规则引擎执行操作(确定性)。不确定性被限制在理解层。
- 成本控制:Token 预算管理(每日/每请求/每 Agent 限额)+ 模型分级(简单任务用 gpt-4o-mini,复杂任务用 gpt-4o)+ Prompt Cache(节省 90% 输入 token)。”
长时间运行 Agent 怎么设计?
长时间运行 Agent 怎么设计?
- 异步执行:Agent 运行在独立的 Worker 进程中,不阻塞主线程。通过事件系统(task.started、task.progress、task.completed)通知前端进度。
- 状态快照(Checkpointing):每个关键步骤后保存状态快照到 PostgreSQL/Redis。中断后从最近的 checkpoint 恢复,不需要从头开始。LangGraph 原生支持 Checkpoint。
- 长期记忆压缩:上下文窗口有限(128K/200K tokens),长任务会溢出。定期用小模型把旧记忆压缩为摘要(100K → 5K),保留近期记忆的完整性。
-
进度追踪 + Human-in-the-Loop:实时汇报进度。高风险操作、Token 预算阈值、错误重试失败时暂停执行,等待人工审批。用
interrupt节点实现。”
n8n 和 Dify 的区别?
n8n 和 Dify 的区别?
如何控制 Agent 的 Token 消耗?
如何控制 Agent 的 Token 消耗?
- 模型分级:大部分简单任务用 gpt-4o-mini(小模型单价显著更低),关键的决策任务用 gpt-4o。在 LangGraph 中,不同节点可以用不同模型。
- Token 预算:设置三级限额——每日全局预算(100 万 tokens)、单次请求预算(1 万 tokens)、单 Agent 预算(5 万 tokens)。超出预算时降级到更简单的处理方式。
- Prompt Cache:Anthropic 的 Prompt Cache 可以节省 90% 的输入 token 费用。把稳定的 System Prompt 放在前面,变化的用户输入放在后面。相同前缀的请求复用缓存的 KV Cache。
- 上下文压缩:定期压缩历史对话。用小模型把 100K tokens 的历史压缩为 5K tokens 的摘要。只保留近期 5 轮对话的完整内容,更早的对话用摘要替代。”
Agent 的工具调用失败怎么办?
Agent 的工具调用失败怎么办?
isRetryable 和 nonRetryable 错误。在错误对象上标记 retryable: true/false,Agent 的重试逻辑根据这个标记决定是否重试。”Agent 的 LLM 输出不可控怎么办?
Agent 的 LLM 输出不可控怎么办?
- 理解层(LLM,不确定性):LLM 只负责理解用户意图、提取结构化信息。这是不确定性的唯一来源,但影响范围被限制在理解层。
- 验证层(Schema,半确定性):LLM 的输出经过 JSON Schema 校验。如果输出不符合预期格式(如缺少必要字段、类型错误),触发重试或降级。用 Zod 做运行时校验。
-
执行层(规则引擎,确定性):具体的工具调用、数据操作、业务逻辑由规则引擎执行,不依赖 LLM 的输出。例如:LLM 输出
{"action": "delete", "target": "production"},规则引擎检查到 production 环境,自动拦截。
Agent 在生产环境出过什么问题?
Agent 在生产环境出过什么问题?
- 死循环消耗 Token:Agent 在两个工具之间无限循环——调用工具 A 得到结果后,认为应该调用工具 B,B 的结果又让它调用 A。解决:设置最大循环次数(maxIterations: 10)+ 状态变化检测(连续 3 步输出相同则强制终止)。
- 工具调用参数错误:LLM 生成的工具参数格式错误(如日期格式不对、必填字段缺失),导致工具执行失败。解决:用 Zod Schema 校验参数,校验失败时让 LLM 重新生成。
- 上下文窗口溢出:长时间运行的 Agent 对话历史越来越长,超出上下文窗口限制。解决:定期压缩历史对话(用小模型生成摘要),只保留近期对话的完整内容。
- 成本爆炸:Agent 的循环次数过多或工具调用过于频繁,Token 消耗远超预期。解决:Token 预算管理 + 模型分级 + 循环次数限制。每次调用记录 token 消耗,设置告警阈值。“
Q10: Harness Engineering 到底是什么?(先纠正一个流行误读)
中文技术圈长期流传一种说法:OpenAI 发布了一个叫 “Harness Engineering” 的声明式多 Agent 编排框架,用defineHarness({ agents, flow }) 描述 Agent 协作。这个说法不准确。 截至 2026 年 11 月,OpenAI 没有发布过名为 Harness Engineering 的编排框架,也没有 defineHarness 这个 API。把「Harness Engineering」当成一个 SDK,会在面试里直接暴露事实错误。
准确的说法是:Harness Engineering 是一套工程方法论的名字,指围绕模型设计执行环境——工具、上下文、约束、反馈回路——让 Agent 在无人监督下可靠工作。 它不是运行时,也不是编排 DSL。
事实时间线(均可核对)
OpenAI 实验真正做对的五件事
1. AGENTS.md 是目录,不是手册。 他们先试了”一个大 AGENTS.md”,失败得很典型:上下文是稀缺资源,巨型指令文件会挤掉任务本身;什么都标”重要”等于没有重点;单体手册会迅速腐烂成过时规则;而且无法机械校验。最终 AGENTS.md 压到约 100 行,只做地图,真正的知识库放在结构化docs/ 目录,配套 linter 和 CI 校验交叉链接与新鲜度,还有定期的 “doc-gardening” Agent 提交修复 PR。这叫渐进式披露(progressive disclosure)。
2. 约束机械化,而不是写进 Prompt。 每个业务域只能沿固定层次向前依赖:Types → Config → Repo → Service → Runtime → UI;鉴权、连接器、遥测、Feature Flag 等横切关注点只能通过单一 Providers 接口进入。违反规则由自定义 linter 和结构化测试报错,错误信息里直接写入修复指令,等于把”怎么改”喂回模型上下文。
3. 让应用本身对 Agent 可读。 每个 git worktree 都能独立启动一份应用实例,接入 Chrome DevTools Protocol,让 Agent 自己截屏、取 DOM、跑导航;每个 worktree 配一套临时的日志/指标/Trace 栈,Agent 可以用 LogQL、PromQL 查询。于是验收标准从”看起来对”变成可判定的”服务启动小于 800ms""四条关键链路的 span 不超过 2 秒”。
4. Agent 审 Agent。 让 Codex 先本地自审,再请求其他 Agent 在本地和云端审查,读完反馈后继续迭代,直到所有 Agent reviewer 满意;人类 review 从必需项变成可选项。这就是社区说的 Ralph Wiggum Loop:不追求一次做对,而是把”改到通过”做成循环。
5. 熵治理(garbage collection)。 Agent 会复制仓库里已有的模式,包括坏模式。OpenAI 最初每周五花 20% 时间人工清理 “AI slop”,不可扩展;后来把 “golden principles” 编码进仓库,用周期性后台 Codex 任务扫描偏差、更新质量评级、提交定向重构 PR,多数一分钟内可审完并自动合并。技术债像高利贷,持续小额偿还比集中爆发更便宜。
必须一起说出口的代价与边界
- 不可直接照搬。 OpenAI 自己在文末强调:这套行为高度依赖该仓库的结构与工具链,“不应假设在没有同等投入的情况下可以泛化”。
- 吞吐改变合并哲学。 他们的 PR 短命、阻塞性门禁极少、flake 用重跑而不是阻塞处理。作者同时承认这在低吞吐环境是”不负责任的”。照抄流程而不具备吞吐,只会放大事故。
- 早期反而更慢。 进展慢的原因不是模型不行,而是环境未定义:缺工具、缺抽象、缺内部结构。harness 工程的前期投入是纯成本。
- 基础设施不是免费的。 每 worktree 一套应用和一套可观测栈,意味着显著的计算与运维开销。
- 安全边界要单独设计。 生成的代码所在的沙箱不能触达凭据;否则一次 Prompt Injection 就能拿到 token 并派生新的无限制会话。
- 人的判断没有消失。 人负责排优先级、把用户反馈翻译成验收标准、验证结果;只是工作层级上移了。
三个容易混淆的概念
defineHarness 配置。Q11: OpenClaw 和 Hermes 是什么?
OpenClaw:可本地部署的个人 AI 助手
OpenClaw 是一个开源的个人 AI 助手 / 本地网关(MIT 协议),它并不是一个”可组合的 Agent 框架”。按公开信息的描述,它大致由四块组成:Gateway(接入各类消息渠道、负责收发的本地网关)、Agent(实际执行任务的主体)、Skills(可插拔的能力扩展)和 Memory(会话与长期记忆)。用户把它部署在自己的机器上,通过熟悉的聊天渠道与它交互。 需要克制:公开资料对它的内部分层和编排细节披露有限,并不存在 SearchClaw、CodeClaw、FileClaw 这类公开子模块,也没有openclaw 这样的 npm 编程 API。面试时不要把这些名字当作事实讲出来。
Hermes:Nous Research 的开源 LLM
Hermes 是 Nous Research 推出的开源大语言模型系列,专注于 Agent 场景的优化。和通用模型不同,Hermes 在训练时特别强化了工具调用、多轮对话、指令遵循等 Agent 核心能力。 Hermes 的特点:- 工具调用优化:原生支持 Function Calling,参数生成准确率高
- 长上下文支持:支持 128K+ tokens 上下文窗口,适合长对话 Agent
- 指令遵循:对 System Prompt 的遵循度高,适合 Agent 角色设定
- 开源可部署:可以在本地部署,数据不出企业网络
OpenClaw vs Hermes 区别
Q12: AI 编码工具的原理与多 Agent 协作
AI 编码工具正在从”代码补全插件”进化为”自主编程 Agent”。理解 Codex 和 Claude Code 的底层原理、以及多 Agent 协作的设计方法论,是 2025 年前端工程师的核心竞争力。Codex 的原理
OpenAI Engineering 团队在 2021 年推出的 Codex 是代码生成大模型的开创性底座。Codex 基于 GPT-3 微调,在 159 GB 的 GitHub 开源代码上训练,专门为代码生成任务优化。它最直接的产物就是 GitHub Copilot——Codex 负责理解上下文并生成代码补全,Copilot 负责 IDE 集成和用户体验。- 训练数据:从 GitHub 筛选 179 种编程语言的开源代码,去重后 159 GB
- 上下文窗口:4096 tokens,通过”前缀拼接”把光标前后的代码都喂给模型
- 沙箱执行:Codex CLI 用 OS 级沙箱执行模型生成的命令(macOS Seatbelt、Linux bubblewrap + Landlock、Windows 受限令牌/DACL),再叠加审批策略;这是 Agent 自主执行而不失控的工程基础,与「Harness Engineering」方法论不是同一个概念
- 评测体系:HumanEval 基准测试(164 道编程题),定义了代码生成能力的行业标准
Claude Code 的原理
Anthropic Claude Code 团队打造的 Claude Code 是深度集成在终端 CLI 中的现代自主编程 Agent,与传统的 IDE 插件有本质区别。传统插件(如 Copilot)只能被动补全,而 Claude Code 能自主读写文件、执行命令、搜索代码库、管理 Git 操作。- MCP 集成:通过 Model Context Protocol 连接外部工具和数据源,让 Agent 能访问数据库、API、文件系统等任意资源
- Skills 系统:赋予 Agent 特定的主动执行能力(区别于被动的 RAG 知识检索),比如”自动写测试""自动重构”
- Hooks 机制:在 Agent 执行的关键节点插入自定义逻辑(如执行前校验、执行后审计),实现企业级可控性
多 Agent 角色分工设计
Andrew Ng(吴恩达)在 Agentic Workflow 方法论中定义了四种核心设计模式:Reflection(自我反思)、Tool Use(工具调用)、Planning(任务规划)、Multi-Agent Collaboration(多 Agent 协作)。[2] 他的核心思想是:复杂任务不应该由单个 Agent 包办,而应该拆分为多个专业 Agent,各司其职,通过协作完成。 即使是较弱的模型,通过 Agentic 模式设计也能获得显著的性能提升。企业级多 Agent 设计
多 Agent 系统在生产环境中面临四大核心挑战: 1. 权限边界收敛 不同 Agent 必须有严格的权限隔离。Code Agent 可以读写代码,但不能部署;Deploy Agent 可以部署,但只能操作 staging 环境,生产环境需要人工审批。实战:用 Claude Code 实现多 Agent 协作
以一个真实的”代码重构 + 测试 + 审查”流水线为例,展示如何用 Claude Code 的 Skills 系统实现多 Agent 协作:Codex 和 Claude Code 的本质区别是什么?
Codex 和 Claude Code 的本质区别是什么?
Claude Code 的 MCP、Skills、Hooks 分别解决什么问题?
Claude Code 的 MCP、Skills、Hooks 分别解决什么问题?
Andrew Ng 的多 Agent 协作方法论具体怎么落地?
Andrew Ng 的多 Agent 协作方法论具体怎么落地?
多 Agent 系统中如何处理 Agent 之间的通信?
多 Agent 系统中如何处理 Agent 之间的通信?
多 Agent 系统的成本如何控制?
多 Agent 系统的成本如何控制?
如何用 Claude Code 实现一个完整的开发流水线?
如何用 Claude Code 实现一个完整的开发流水线?
多 Agent 系统在生产环境出过什么问题?
多 Agent 系统在生产环境出过什么问题?
AI 编码工具会取代前端工程师吗?
AI 编码工具会取代前端工程师吗?
Q13: Harness 运行时:状态机、事件与崩溃恢复怎么做?
前面的章节讲的是”Agent 应该具备什么能力”,这一节讲”这些能力靠什么运行时结构撑住”。如果被追问”你说的 Agent Loop 到底怎么落地”,答不上状态机、事件和恢复,就还是概念层。一次 run 的四层状态
事件要分”耐久”和”瞬时”两类
这是很多自研 Harness 会踩的坑:把所有东西都塞进一个事件流,结果回放时被流式 token 淹没。id / parentId 组成树,条目类型包括会话头、消息、模型切换、思考等级切换、压缩、分支摘要和自定义条目[18]。
事件溯源:状态是事件的折叠
回放不是重跑:区分 record-replay 与 re-execute
模型调用和工具副作用都不是确定性的。同一个 Prompt 重跑,模型可能给出不同答案;bash 重跑可能重复写文件。所以生产级回放必须区分两种模式:
- record-replay(审计/调试):只读日志,复用记录下来的模型输出和工具结果,不再真正调用外部系统。适合复现”当时到底看到了什么”。
- re-execute(回归/评测):模型重新推理,但工具执行打上
replay_mode=strict,对写操作返回replayed而不是真的执行;或整体切到隔离沙箱。
Checkpoint 应该存在哪一层
thread_id 持久化图状态快照,支持对话连续性、Human-in-the-Loop、time travel 和容错;MemorySaver 只存在内存,生产必须换 PostgresSaver 或 SqliteSaver,并且要设保留策略,否则 checkpoint 无界增长[19]。事件日志方案则更适合需要审计和跨 Agent 共享的场景。
崩溃恢复协议(最容易被忽略的部分)
一个可用的恢复流程至少要回答四个问题:- 谁有权恢复? 用租约(lease)+ fencing token。旧 worker 即使还活着,写事件时 token 过期也会被拒绝,避免两个 harness 同时跑同一个 run。
- pending tool call 怎么办? 恢复时先查工具侧账本(按
idempotency_key),已完成的直接补写tool/completed,未完成的重新执行或标记为失败。 - 半写文件怎么办? 产物先写临时路径再原子 rename,并用 checksum 校验;沙箱崩溃后不信任任何未提交的产物。
- 从哪条事件继续? 记录
last_applied_event_id,恢复时只重放其后的事件;快照作为加速,不作为真相。
Q14: 上下文工程:预算、压缩和 Prompt Cache 怎么一起设计?
上下文工程不是”把资料塞进 Prompt”,而是在有限窗口里做资源分配,并且让分配结果对缓存友好。组装顺序与预算
一个可解释的组装顺序(顺序本身就是契约):四种上下文操作,不要只会”压缩”
Anthropic 的上下文工程文章把操作分为 write、select、compress、isolate 四类[20]。落到 Harness 上:前缀稳定与 Prompt Cache 的真实影响
Prompt Cache 的命中条件是前缀逐字节一致。几个容易踩的细节(以 Anthropic 公开文档为例):- 缓存默认 5 分钟 TTL,可选用 1 小时;命中读取按基础输入价的约 0.1 倍计费,写入按约 1.25 倍计费[22]。
- 最多 4 个显式断点;缓存读取会向前回看最多 20 个内容块,找不到就 miss[22]。
- 在断点之前插入时间戳、随机 ID、动态排序的工具数组,会让整个前缀哈希变化,每次都在写缓存却永远读不到。
cache_read_input_tokens / cache_creation_input_tokens(或 Provider 等价指标),计算缓存命中率与单任务成本;做 A/B:固定前缀 vs 动态前缀,对比同一任务集的 token 账单;把”前缀哈希”作为回归测试断言。
Q15: 工具运行时与产物:怎么让 Agent 的动作可控、可重放、可交接?
工具是 Harness 的”手”。手的设计决定了三件事:模型会不会用错、出错后能不能恢复、产物能不能被下一步消费。工具注册与动态挂载
unregisterTool,但可以通过 pi.getAllTools() / getActiveTools() / setActiveTools(names) 切换模型可见的子集,切换在下一轮生效[23]。这避免了”运行时删除工具”带来的状态不一致,代价是注册表只增不减,需要额外的治理。
并发、超时与取消
Promise.race 超时而不真正取消子进程,会留下僵尸进程继续写文件;bash 工具必须杀进程组,而不是只杀父进程。
结果截断:不要丢掉”被截断”这个事实
一个cat 可能输出几十万字符。正确做法不是简单截断,而是截断 + 溢出到产物 + 返回指针:
head 和 tail 也有用,但模型经常需要中间那段;产物指针把”看多少”的决定权交回给模型,同时保证信息不丢。Pi 的示例扩展里对 ripgrep 输出做了 50KB / 2000 行的截断[24],可以作为量级参考。
错误契约:错误是写给模型看的
Retry-After。错误信息要可执行,例如”路径不在允许的 workspace 内,请改用相对路径 src/...”,而不是”操作失败”。
幂等:副作用工具的生命线
key -> result 账本,命中直接返回旧结果。没有幂等键,恢复重试就可能重复发邮件、重复扣款、重复创建工单。
沙箱:三层边界,不要混为一谈
.git、.codex 等元数据目录强制只读[26]。OpenAI 在生产中强调”沙箱与审批配合”:沙箱定义技术边界,审批策略决定何时必须停下来问人,凭据存放在 OS keyring 而不是沙箱内[27]。
Anthropic Managed Agents 还补了一个结构性教训:不要把凭据和模型生成的代码放在同一个容器里。 他们的做法是仓库访问令牌只在沙箱初始化时用于 clone 并写入本地 git remote,Agent 全程不接触 token;MCP 的 OAuth token 放在 vault,由沙箱外的代理代取[16]。
产物:从会话落到工作区,再被下一个 Agent 读取
Agent 在会话里生成的文件,不能只留在沙箱磁盘上。一个可用的产物链路是:Q16: 模型路由、降级与可观测性接点怎么设计?
路由不是一个 if-else,而是一张能力表
降级阶梯
可观测性接点:Harness 应该暴露什么
Harness 不需要自己实现完整观测,但必须把事件暴露得足够细。建议的最小事件集:- OpenTelemetry:把 run 作为 root span,step 作为 child span,tool 作为更深一层;模型调用记录 GenAI 语义约定字段(模型名、token 用量、TTFT)。DeepSeek Harness 已有社区插件把原生事件转成 OTLP Trace/Metric[28],说明”事件流 → Span 投影”是可行路径。
- Langfuse:走 OTLP 或 SDK,把 observation 映射到 generation/span,重点是保留
runId、stepId、toolCallId作为关联键。 - 日志 vs Trace:日志回答”发生了什么”,Trace 回答”时间花在哪、调用关系是什么”。只有日志时,很难回答”这 47 秒是模型慢还是工具慢”。
Q17: 横向对比与”自研 vs 采用”决策树
决策树
Q18: 深度面试追问(Harness 运行时方向)
一次 run 跑到一半进程崩了,你怎么保证不重复执行工具?
一次 run 跑到一半进程崩了,你怎么保证不重复执行工具?
事件溯源的回放和"重新跑一遍"有什么区别?
事件溯源的回放和"重新跑一遍"有什么区别?
上下文快满了,你选压缩、裁剪还是重置?
上下文快满了,你选压缩、裁剪还是重置?
工具输出 20 万字符,直接截断有什么问题?
工具输出 20 万字符,直接截断有什么问题?
artifact://id 和读取方式,让模型按需读取行范围。同时标记 truncated: true,并在错误/成功契约里说明。还要注意截断发生在工具层还是上下文组装层:工具层截断会影响后续重试和审计,所以完整结果必须落盘。”沙箱和权限系统,有一个是不是就够了?
沙箱和权限系统,有一个是不是就够了?
Prefix Cache 为什么会影响 Harness 设计?
Prefix Cache 为什么会影响 Harness 设计?
Agent 生成的产物怎么交给下一个 Agent?
Agent 生成的产物怎么交给下一个 Agent?
artifact_read 按 id 和范围读取,鉴权按租户和 visibility 做,读取时校验 checksum。路径只在同一个 workspace 内可信,跨 Agent 用 URI 更安全。还要有生命周期:TTL、引用计数、合规保留,以及 GC 时’被引用的产物不能删’的约束。”你怎么证明换 Harness 之后 Agent 真的变强了?
你怎么证明换 Harness 之后 Agent 真的变强了?
延伸阅读与引用参考
- Anthropic: Building Effective Agents:Anthropic 官方对 Agent 架构设计的最佳实践指南,提出五种核心构建模式(Prompt Chaining、Routing、Parallelization、Orchestrator-Workers、Evaluator-Optimizer),强调”从简单开始”的设计哲学。 [1]
- Andrew Ng: Agentic Design Patterns:Andrew Ng 对 Agentic Workflow 的系统性总结,定义 Reflection、Tool Use、Planning、Multi-Agent 四种设计模式,是多 Agent 协作的方法论基础。 [2]
- LangGraph 官方文档:LangGraph 的完整文档,Agent 编排、Checkpoint、Multi-Agent 的核心框架。 [3]
- Lilian Weng - LLM Agents:OpenAI 应用研究主管对 Agent 架构的深度分析,涵盖 Planning(任务分解)、Memory(记忆管理)、Tool Use(工具调用)三大核心组件。 [4]
- OpenAI Function Calling 文档:OpenAI 官方对 Function Calling 的详细说明,Agent 工具调用的底层规范。 [5]
- Chip Huyen - AI Engineering (2025):系统性梳理 Agent 的工程化落地方法论,涵盖评估体系、成本控制、生产部署等核心主题。 [6]
- OpenAI: Harness engineering: leveraging Codex in an agent-first world:Ryan Lopopolo,2026-02-11。零手写代码实验的完整复盘:AGENTS.md 作为目录、机械化架构约束、可被 Agent 读取的应用与可观测性、Agent 互审、熵治理。注意:这是方法论文章,不是编排框架。 [7]
- InfoQ: OpenAI Introduces Harness Engineering:对上述实验的第三方整理,便于核对规模数字与关键做法。 [7]
- Anthropic Claude Code 官方文档:Anthropic Claude Code 团队对终端 Agent 的完整文档,包括 MCP 集成、Skills 系统和 Hooks 机制。 [8]
- OpenAI: Codex - Evaluating Large Language Models Trained on Code:OpenAI Engineering 团队对 Codex 代码生成底座的原始论文,定义了 HumanEval 评测基准。 [9]
- n8n 官方文档:n8n 工作流自动化平台的完整文档,节点式 Agent 编排指南。 [10]
- Dify 官方文档:Dify LLM 应用开发平台的完整文档,Agent 应用构建指南。 [11]
- Yohei Nakajima: BabyAGI:BabyAGI 源码,理解 Agent Loop 的最简实现。 [12]
- 字节跳动 Coze / 阿里百炼:国内”企业级 Agent”编排的先驱平台,深谙权限收敛、审计容错、复杂 RAG 知识检索与 Skill 调度。 [13]
- Nous Research Hermes:Nous Research 的开源 LLM 系列,专注 Agent 场景优化(工具调用、长上下文、指令遵循)。 [14]
- OpenClaw:开源的个人 AI 助手 / 本地网关(Gateway + Agent + Skills + Memory,MIT)。 [15]
- LangGraph Human-in-the-Loop 文档:LangGraph 官方对 Human-in-the-Loop 的概念文档,涵盖 interrupt、Command、Checkpoint 三件套的完整说明。 [3]
- Anthropic: Scaling Managed Agents: Decoupling the brain from the hands:2026-04-08。把 session(只追加事件日志)、harness(循环)、sandbox(执行环境)拆成可独立替换的接口;崩溃后用
wake(sessionId)+getSession(id)恢复,emitEvent(id, event)落事件;凭据不进入沙箱。 [16] - Inside DeepSeek Harness: Cordis, Session Events, Tool Pipelines, and Permission Boundaries:对 DSH 的 turn/step、session events 与 agent events、工具管线与权限边界的源码级整理。 [17]
- Pi session file format(JSONL 树、id/parentId、条目类型):Pi 官方文档的中文整理,说明会话以 JSONL 存储、树形结构与上下文构建算法。 [18]
- LangGraph Persistence 文档:checkpointer 按 thread_id 持久化图状态,用于对话连续性、Human-in-the-Loop、time travel 与容错;生产需持久化 checkpointer 并设保留策略。 [19]
- Anthropic: Effective context engineering for AI agents:把上下文操作归纳为 write / select / compress / isolate,并讨论上下文退化(context rot)与长任务策略。 [20]
- Anthropic: Harness design for long-running application development:2026-03-24。planner / generator / evaluator 三角色;compaction 与 context reset 的区别;自我评估偏差与”把主观质量变成可评分标准”。 [21]
- Anthropic Prompt Caching 文档:最多 4 个断点、20 块回看窗口、默认 5 分钟 TTL(可选 1 小时)、写入约 1.25 倍与读取约 0.1 倍计费。 [22]
- pi-capability-index 开发文档(Pi 工具/事件 API 摘要):记录
pi.registerTool、getAllTools/getActiveTools/setActiveTools、无unregisterTool、tool_result事件字段等实现细节。 [23] - Pi extension examples:官方示例清单,含 permission-gate、protected-paths、sandbox、gondolin、subagent、truncated-tool(ripgrep 输出 50KB / 2000 行截断)等。 [24]
- Anthropic: Beyond permission prompts: making Claude Code more secure and autonomous:2025-10-20。基于 OS 原语(Linux bubblewrap、macOS seatbelt)的文件系统隔离与网络隔离;网络经沙箱外代理做域名白名单。 [25]
- Codex sandboxing implementation(DeepWiki):策略映射到 Seatbelt、bubblewrap + Landlock/seccomp、Windows 受限令牌;
.git、.codex等元数据目录强制只读。 [26] - OpenAI: Running Codex safely at OpenAI:2026-05-08。沙箱与审批配合、网络策略、凭据存 OS keyring、规则化命令白名单、Agent 原生遥测。 [27]
- DeepSeek Harness: A Practical Guide to Comprehensive Observability:把 append-only session 事件流转成 OTLP Trace/Metric 的社区实践,说明日志与 Trace 的分工。 [28]
