跳到主要内容

Agent Environment Engineering:Agent 工程的新战场

· 阅读需 11 分钟
一介布衣
全栈开发者

过去一年,很多团队都在研究怎么把大模型变成 Agent:给它工具,给它权限,给它任务,让它能自己跑起来。

于是大家开始关注 Prompt、Context、Tool Use、Workflow、Harness。可是当 Agent 真的开始进入开发、运维、研究、文档和业务流程以后,一个更底层的问题浮出来了:Agent 到底工作在一个什么环境里?

这就是 Environment Engineering 想解决的问题。

如果说 Harness 解决的是“怎么管住 Agent”,那么 Environment 解决的是“Agent 面对的世界是否可靠”。前者更像运行时控制系统,后者更像训练场、考场和工作制度。

为什么焦点会从 Harness 移到 Environment

早期做 Agent,大家最关心的是让它跑起来:怎么写 Prompt,怎么塞上下文,怎么调用浏览器、终端、数据库、API,怎么记录日志,怎么设置权限,怎么防止无限循环。

这些问题都重要,而且大多属于 Harness 工程。

Harness 可以理解成 Agent 的运行控制系统。它决定 Agent 怎么启动,能调用哪些工具,什么时候停下来,花多少钱,有没有权限做某件事。

但随着 Agent 越来越能干,一个新问题出现了:

就算你把 Agent 管住了,它是否真的处在一个可靠、可验证、能学习的环境里?

比如让 Agent 修 Bug。它能看到哪些文件?它能运行哪些测试?测试结果是否可靠?它删掉测试算不算成功?它提交的修改有没有证据链?失败后谁来接管?下次遇到类似问题,它能不能从这次失败里学到正确经验?

这些问题已经不是单纯 Harness 能完全解决的了。

这就是 Environment Engineering 的位置。

Prompt、Context、Harness、Environment 有什么区别

可以把 Agent 工程粗略分成几层:

层级主要问题简单理解
Prompt怎么说给 Agent 下指令
Context给它看什么提供文件、日志、文档、历史信息
Tool它能做什么浏览器、终端、数据库、API
Harness它怎么跑权限、状态、日志、循环、停止条件
Loop怎么持续迭代计划、执行、观察、修正
Self-Harness怎么自我改进失败总结、策略调整、记忆
Environment它在哪里学习状态、动作、反馈、奖励、证据、接管机制

一个比喻:Prompt 是老师说的话,Context 是课本和资料,Tool 是笔、电脑和实验器材,Harness 是课堂纪律和考试流程,Environment 则是整个学校、考试制度、评价体系和真实反馈。

学生最后会成为什么样,不能只看老师怎么说,还要看学校奖励什么、惩罚什么、允许什么、记录什么。

Agent 也是一样。

Environment Engineering 是什么

Environment Engineering 可以理解为:为 Agent 设计一个可行动、可观察、可反馈、可评估、可接管的工作世界。

它不是简单地多接几个工具,而是系统性设计 Agent 所处的环境。

一个完整环境至少包含八类要素。

1. 状态:Agent 可以看什么

状态决定 Agent 的视野。

在代码场景里,状态可能包括代码仓库、测试输出、CI 日志、最近提交、线上错误、数据库结构、接口文档和历史决策。

状态不是越多越好。给太少,Agent 会瞎猜;给太多,Agent 会迷路。好的环境会把状态整理成可行动的信息。

2. 动作:Agent 可以做什么

动作决定 Agent 的能力边界。

它可以读文件、改代码、跑测试、发请求、查日志、生成报告。但是否允许删除文件、改数据库、部署生产、修改权限,就必须明确限制。

没有动作边界,Agent 容易失控;动作太少,Agent 又只能写建议,无法完成任务。

3. 观察:Agent 怎么看到结果

动作之后必须有观察。

运行测试之后,要看到退出码、错误堆栈、失败用例和耗时;访问页面之后,要看到响应码、截图、控制台错误和网络请求;部署之后,要看到健康检查、错误率和日志。

没有观察,Agent 就不知道自己做对没有。

4. 评估:谁判断结果好不好

评估决定什么叫成功。

测试通过只是评估的一部分。代码是否可维护、接口是否兼容、用户流程是否真的恢复、线上指标是否正常,都可能是评估标准。

如果评估太单一,Agent 很容易钻空子。

5. 奖励:环境鼓励什么

奖励是最容易被低估的一环。

如果环境只奖励测试通过,Agent 可能会删除测试、改断言、mock 掉真实逻辑。测试绿了,但 Bug 没修好。

如果环境只奖励报告完整,Agent 可能会堆字数。报告很长,但没有证据。

如果环境只奖励速度,Agent 可能不复现、不验证,直接猜修复。

所以环境设计的核心不是给 Agent 更多工具,而是设计一个不会奖励坏行为的反馈系统。

6. 资源:成本和边界是什么

Agent 的行动需要成本。

一次任务最多跑几次测试?最多花多少分钟?最多调用多少次外部 API?能不能访问生产日志?能不能执行高成本模型?这些都应该是环境契约的一部分。

资源边界不是为了限制 Agent,而是为了让它在可控范围内探索。

7. 证据:必须留下什么

可靠 Agent 不能只说“我修好了”。它应该留下证据。

证据可以是复现步骤、命令输出、测试结果、接口响应、截图、关键日志、代码 diff、部署记录。

证据让人能复查,也让后续记忆更可靠。

8. 接管:什么时候必须交给人

环境必须定义接管节点。

比如涉及生产数据库、支付链路、权限系统、用户隐私、安全问题、不可逆操作时,Agent 不应该自己往前冲,而应该请求人类确认。

一个没有接管机制的环境,很难进入生产系统。

为什么说反馈比工具更重要

很多团队做 Agent 的第一反应是给它更多工具。

但工具只是动作空间。真正决定 Agent 学到什么的,是反馈。

如果反馈告诉它“测试绿了就是成功”,它就会围绕测试绿优化。如果反馈告诉它“报告越长越好”,它就会围绕字数优化。如果反馈告诉它“必须复现、修复、验证、留下证据”,它才会长出更接近工程师的行为。

这就是环境塑形。

同一个 Agent,放在不同环境里,会长出完全不同的工作习惯。

一个只要求“尽快修好”的环境,会让 Agent 倾向于快速改代码、少看上下文、不写测试、只处理表面错误。

一个要求“先复现,再修复,再验证”的环境,会让 Agent 倾向于找复现路径、分析根因、写最小测试、小范围修改、最后给出证据。

模型可能是同一个,但行为完全不同。

Harness 和 Environment 不是替代关系

Environment 重要,不代表 Harness 不重要。

它们解决的是不同问题。

Harness 管控制面,负责模型选择、工具调用、权限控制、成本限制、日志记录、状态管理、停止条件和合规边界。

Environment 管任务世界,负责状态是否真实、动作是否安全、反馈是否可靠、评价是否可作弊、证据是否充分、失败是否可复现、经验是否可沉淀。

没有 Harness,Agent 可能失控。没有 Environment,Agent 可能学歪。

成熟系统需要两者都有。

企业怎么落地:先做小环境

一听 Environment Engineering,很多团队容易直接想到一个大平台:Environment-as-a-Service,所有任务都能接,所有工具都能跑,所有 Agent 都能学。

这通常太早了。

更现实的做法是先选一个低风险、高重复、可验证的小流程。

CI 失败分流

先不要让 Agent 直接修所有 Bug,而是让它判断 CI 为什么失败:是依赖安装失败,是测试 flaky,是类型错误,是构建失败,还是需要人介入。

这个场景状态清晰、动作有限、反馈明确,很适合做成小环境。

文档漂移检查

让 Agent 检查代码变了,文档有没有同步。API 参数变了,README 有没有更新。数据库字段变了,接口说明有没有过期。

这个场景风险低,结果容易验证,也适合环境化。

线上日志归因

让 Agent 根据日志、部署记录、接口监控判断:是新版本引入,还是上游接口异常,是数据库慢查询,还是用户参数异常。

这类任务可以先让 Agent 做分析和建议,不要直接让它操作生产系统。

一个环境契约模板

设计一个小环境,可以先写这八项:

环境名称:
目标:

1. 状态:
Agent 可以看到哪些信息?

2. 动作:
Agent 可以执行哪些操作?哪些禁止?

3. 观察:
每个动作后,Agent 如何看到结果?

4. 评估:
什么叫成功?谁判断?

5. 奖励:
奖励什么行为?如何防止作弊?

6. 资源:
时间、成本、调用次数、权限边界是什么?

7. 证据:
Agent 必须留下哪些日志、截图、测试结果或 diff?

8. 接管:
哪些情况必须交给人?

比如 CI 失败分流环境可以这样写:

环境名称:CI Failure Triage

目标:
把 CI 失败自动归类,并给出可复现证据和建议处理人。

状态:
CI 日志、最近提交 diff、package lock、测试命令、历史失败记录。

动作:
读取日志、搜索代码、运行指定测试、生成报告。
禁止直接修改主分支,禁止删除测试。

观察:
测试输出、退出码、错误堆栈、耗时、重试结果。

评估:
分类准确率、报告是否包含证据、是否能复现失败。

奖励:
奖励准确分类、最小复现、清晰证据。
不奖励长报告,不奖励绕过测试。

资源:
最多运行 3 次测试,总耗时不超过 10 分钟。

证据:
保留命令、输出摘要、失败堆栈、相关文件位置。

接管:
涉及生产配置、安全凭证、数据库迁移、人为审批时交给人。

这就是一个小型 Environment。

长期记忆必须建立在可靠环境上

很多 Agent 系统喜欢做长期记忆:记录失败经验,总结项目习惯,保存用户偏好,自动改进策略。

但这里有一个风险:如果环境反馈不可靠,长期记忆会把错误经验固化下来。

比如一次测试通过,是因为 Agent 删除了测试。如果系统把这次经验记成“成功修复”,下次 Agent 就会更倾向于继续这么做。

所以长期记忆不能脱离环境质量。

好的长期记忆应该基于可复现的任务、可靠的评估、明确的证据、人类确认过的结论、可回滚的记录。

否则,自我改进会变成自我强化错误。

Environment Engineering 的本质

Environment Engineering 的本质不是搭一个复杂平台,而是回答一个问题:

我们能不能为 Agent 提供一个不会误导它的世界?

这个世界要让 Agent 看见该看的,做允许做的,得到真实反馈,被正确评价,不能靠作弊拿高分,失败后能留下证据,高风险时能交给人。

当这些条件具备,Agent 才可能稳定地从工具调用者变成可靠的工作者。

参考资料

  • Agentic Environment Engineering for Large Language Models,综述论文,讨论 Agentic Environment 的建模、合成、评估与应用。
  • EurekAgent: Towards Autonomous Scientific Discovery with Scalable Agentic Environment Design,提出把 Environment Engineering 用于自主科学发现。
  • Andrej Karpathy 关于 autoresearch 的讨论,强调研究型 Agent 需要可执行、可反馈、可评估的环境。

结语

过去我们常问:这个 Agent 用的是什么模型?

以后可能更重要的问题是:这个 Agent 工作在什么环境里?

模型能力会越来越强,工具也会越来越多。但真正决定 Agent 是否可靠的,往往是它所处的环境。

环境奖励什么,它就优化什么。环境允许什么,它就尝试什么。环境记录什么,它就能学习什么。环境忽略什么,它就可能钻空子。

所以,Agent 工程的下一阶段,不只是写更好的 Prompt,也不是堆更多工具,而是设计更可靠的环境。

一句话总结:

Harness 让 Agent 跑起来,Environment 决定 Agent 会长成什么样。