1. 从“能跑”到“好用”之间,隔着一条叫调优的河
Vibe Coding 这个词最近在圈子里出现的频率越来越高。简单说,它描述的是一种“跟着感觉走”的编码状态——你有个模糊的想法,打开编辑器,让 Coding Agent 帮你把骨架搭起来,然后你在这个基础上反复调整、迭代,整个过程像在跟一个懂你意图的搭档聊天。听起来很美好,但真正在生产环境里用过 Coding Agent 的人都知道,从“能跑通”到“敢上线”,中间那条路远比想象中长。
我过去大半年一直在折腾华为生态下的 Coding Agent 落地,从最初的兴奋到中间的怀疑,再到后来慢慢摸出一套调优方法,踩过的坑足够写一本小册子。这篇文章不打算讲什么“AI 改变编程”的宏大叙事,就想把我在生产级场景下调优 Coding Agent 的实操经验摊开来聊。核心关键词就几个:Coding Agent、Harness、Vibe Coding、华为、调优。如果你正在用或者准备用 Coding Agent 辅助日常开发,尤其是涉及华为相关技术栈(比如华为 OJ 风格的算法题、华为设备配置脚本、嵌入式场景),那这篇内容应该能帮你省下不少试错时间。
先交代一下背景。我所在的团队主要做企业级工具链开发,日常涉及大量华为设备配置管理、脚本生成、以及内部 OJ 平台的题目维护。去年底开始,我们尝试把 Coding Agent 引入到日常流程里,目标很明确:让 Agent 帮我们生成设备配置模板、补全测试用例、甚至根据自然语言描述直接产出可提交的代码。理想很丰满,现实是——Agent 生成的代码经常“看起来对,跑起来错”,尤其是在华为设备配置这种对语法和参数极度敏感的场景下,一个字符的偏差就可能导致整段配置失效。
这就是“最后一公里”问题的典型表现。Agent 能理解你的意图,能生成结构合理的代码,但距离生产级可用,还差一套系统性的调优方法。这套方法的核心,我把它归纳为Harness 工程——不是简单的“给 Agent 套个壳”,而是从提示词、上下文管理、输出校验、回退机制到批量调优的完整闭环。
提示:本文讨论的 Coding Agent 调优方法适用于任何支持自定义 Harness 的 Agent 框架,不限于特定厂商或平台。文中涉及的华为相关场景仅作为案例参考,具体配置请以官方文档为准。
2. 为什么你的 Coding Agent 总是差一口气
2.1 Coding Agent 和普通代码补全的本质区别
很多人把 Coding Agent 和 IDE 里的代码补全混为一谈,觉得不就是“高级一点的自动补全”吗?这个认知偏差是导致调优方向跑偏的根源。代码补全做的是“根据上下文预测下一个 token”,它的目标是在你打字的时候给你一个还不错的建议,你接受就插入,不接受就继续打。整个过程是无状态、单轮、局部的。
Coding Agent 完全不同。它接收的是一个任务描述,可能是一句话、一段需求文档、甚至一个 issue 链接。它需要理解任务、规划步骤、调用工具(读文件、写文件、执行命令)、根据执行结果调整策略,最终产出一个可交付的结果。这个过程是有状态、多轮、全局的。你可以把它想象成一个刚入职的实习生:聪明、学得快,但对你的代码库不熟、对你们的规范不了解、对边界条件没概念。你不调教他,他就按自己的理解干,干出来的东西自然离你的预期有距离。
这个本质区别决定了调优的方向。代码补全的调优主要是模型层面的——换更大的模型、用更好的训练数据。Coding Agent 的调优则是系统工程——模型只是其中一个变量,Harness 的设计、上下文的组织、工具的定义、校验的严格程度,每一个环节都会显著影响最终效果。
2.2 Harness 到底在调什么
Harness 这个词在 Agent 语境下,指的是包裹在模型外面的那一层“驾驭系统”。它负责把用户的自然语言指令翻译成模型能理解的提示词,管理多轮对话的上下文,定义模型可以调用的工具,处理模型的输出并决定下一步动作。你可以把 Harness 理解为 Agent 的“操作系统”——模型是 CPU,Harness 是内核加驱动。
调优 Harness,本质上是在调这几件事:
- 提示词的结构和内容:同样的任务,提示词怎么写,模型的表现可能天差地别。是直接给需求,还是先给背景再给需求?是要求模型“一步一步思考”,还是直接输出结果?这些选择背后都有讲究。
- 上下文的组织方式:Agent 在多轮交互中会产生大量中间信息——读过的文件、执行过的命令、报错信息、之前的尝试。哪些信息保留、哪些丢弃、以什么顺序呈现给模型,直接决定了模型能不能“记住”关键约束。
- 工具的定义和粒度:Agent 能调用哪些工具?每个工具的参数怎么设计?工具返回的结果怎么格式化?工具太粗,模型不知道怎么用;工具太细,模型会在选择上浪费大量 token。
- 输出的校验和回退:Agent 生成的代码或配置,怎么验证正确性?验证失败后怎么让 Agent 修正?修正几次还不成功怎么办?这套机制决定了 Agent 的“可靠性上限”。
我在华为设备配置场景下最深的一个体会是:Agent 的失败往往不是模型不够聪明,而是 Harness 没有给它足够清晰的约束和足够及时的反馈。举个例子,让 Agent 生成一段华为交换机的 VLAN 配置,如果不告诉它具体的设备型号和软件版本,它可能会用某个版本特有的语法,到了实际设备上直接报错。这不是模型的问题,是 Harness 没有把必要的上下文喂给它。
2.3 Vibe Coding 的边界在哪里
Vibe Coding 的精髓是“跟着感觉走”,快速迭代、快速验证。但生产环境要求的是确定性、可重复、可审计。这两者之间存在天然的张力。我的经验是:Vibe Coding 适合探索阶段,Harness 工程适合收敛阶段。
探索阶段,你可以让 Agent 自由发挥,快速生成多个版本的方案,你从中挑选有潜力的方向。这个阶段不需要太严格的约束,甚至鼓励 Agent “胡思乱想”,因为创新往往来自意想不到的组合。但一旦确定了方向,进入生产化阶段,就必须切换到 Harness 工程模式——定义清晰的输入输出规范、建立严格的校验机制、设计可靠的错误恢复流程。
这个切换时机很关键。切得太早,你会在还没想清楚要做什么的时候就陷入细节;切得太晚,你会积累大量“看起来能用但实际不能用”的代码,清理成本极高。我的判断标准是:当你发现 Agent 生成的代码需要你反复手动修正同一类问题时,就该开始调 Harness 了。
3. 华为场景下的 Harness 调优实战
3.1 场景选择:为什么从设备配置脚本入手
我们团队最终选择华为设备配置脚本生成作为 Coding Agent 调优的切入点,原因有三。第一,这个场景的输入输出边界非常清晰——输入是设备型号、软件版本、业务需求描述,输出是一段可执行的配置命令。第二,正确性验证成本低——我们有现成的华为 eNSP 模拟器和实验室设备,生成的配置可以直接导入验证。第三,失败模式集中——配置脚本的错误类型相对固定,无非是语法错误、参数错误、逻辑顺序错误这几类,便于针对性调优。
这个选择背后有一个更通用的原则:调优 Coding Agent,要从“验证闭环最短”的场景开始。如果你选的场景需要半小时才能验证一次结果,调优效率会极低。设备配置脚本的好处是,从生成到验证,整个循环可以在几分钟内完成,这意味着你可以在同样的时间里做更多的调优实验。
3.2 提示词工程:把“说清楚”做到极致
提示词是 Harness 调优的第一杠杆。我试过很多种提示词结构,最终稳定下来的模板大致是这样的:
[角色定义] 你是一名资深华为网络工程师,熟悉华为交换机、路由器的配置语法,了解不同软件版本的差异。 [任务背景] 当前设备型号:{device_model} 当前软件版本:{software_version} 业务需求:{requirement_description} [约束条件] - 配置命令必须符合当前软件版本的语法规范 - 涉及接口配置时,必须包含接口状态检查命令 - 涉及 VLAN 配置时,必须包含 VLAN 创建和端口加入两个步骤 - 输出格式为纯配置命令,不包含解释性文字 [输出示例] {example_output} [任务] 请根据以上信息生成完整的配置脚本。这个模板有几个关键设计点。角色定义让模型进入正确的“思维模式”——网络工程师和普通程序员的思考方式不同,前者更关注设备状态和命令执行顺序。约束条件是最重要的部分,它把我们在实践中踩过的坑固化成了规则。比如“涉及接口配置时必须包含接口状态检查命令”这一条,就是因为早期 Agent 经常忘记先display interface确认接口状态就直接配 IP,导致配置在接口 down 的情况下静默失败。
输出示例的作用经常被低估。给一个正确的输出样例,比写十条约束条件都管用。模型会从示例中学习格式、风格、详细程度,这些是文字描述很难精确传达的。我通常会准备 2-3 个不同复杂度的示例,让模型理解“简单需求”和“复杂需求”分别应该输出什么粒度。
注意:提示词中的约束条件不是越多越好。我试过写 20 多条约束,结果模型在生成时顾此失彼,反而容易出错。后来精简到 8 条以内,每条都经过实际验证确实必要,效果明显提升。
3.3 上下文管理:让 Agent 记住该记住的
多轮交互中,上下文会迅速膨胀。Agent 读了一个 500 行的配置文件,执行了 3 次命令,每次都有输出,再加上之前的对话历史,很容易就撑爆模型的上下文窗口。更糟糕的是,无关信息会稀释关键信息,让模型“忘记”重要的约束。
我的做法是分层管理上下文。第一层是持久层,存放角色定义、约束条件、输出格式这些贯穿整个任务的信息,每一轮都完整保留。第二层是任务层,存放当前任务的具体描述和已完成的步骤摘要,只保留最近 3-5 轮的相关内容。第三层是临时层,存放工具调用的原始输出,只在当前轮次有效,下一轮就压缩成一句话摘要。
举个例子。Agent 读取了一个华为交换机的当前配置,输出有 300 行。我不会把这 300 行原封不动地塞进下一轮的上下文,而是让 Harness 自动提取关键信息——比如“当前有 VLAN 10、20、30,接口 GigabitEthernet0/0/1 属于 VLAN 10,状态 up”——然后只把这段摘要传给模型。这样既保留了决策所需的信息,又大幅减少了 token 消耗。
这个压缩过程本身也可以让模型来做。我会在 Harness 里加一个“摘要生成”步骤,用一个小模型或者同一个模型但不同的提示词,把工具输出压缩成结构化摘要。实测下来,这种方式比简单的截断或关键词提取效果好得多,因为模型能理解哪些信息对当前任务真正重要。
3.4 工具设计:给 Agent 一把好用的螺丝刀
Agent 能调用的工具,直接决定了它的能力边界。在华为设备配置场景下,我们给 Agent 配了这几个核心工具:
| 工具名称 | 功能 | 关键参数 | 使用场景 |
|---|---|---|---|
read_config | 读取当前设备配置 | 设备 IP、登录凭证 | 任务开始时获取基线 |
validate_syntax | 校验配置语法 | 配置文本、设备型号、版本 | 生成后立即校验 |
simulate_apply | 在模拟器中应用配置 | 配置文本、拓扑文件 | 语法校验通过后验证逻辑 |
diff_config | 对比配置差异 | 旧配置、新配置 | 确认变更范围 |
rollback | 回退到指定配置 | 配置快照 ID | 验证失败时恢复 |
工具设计有几个原则。参数要少而精——每个工具最多 3-4 个参数,参数太多模型容易填错。返回结果要结构化——不要返回一大段原始文本,而是返回 JSON 格式的结构化结果,比如{"status": "success", "errors": [], "warnings": ["VLAN 40 未创建"]}。错误信息要有指导性——不要只说“语法错误”,要说“第 15 行switchport trunk allow-pass vlan 10 20缺少to关键字,正确写法是switchport trunk allow-pass vlan 10 to 20”。
我特别想强调validate_syntax这个工具的价值。在没有它之前,Agent 生成的配置要等到导入模拟器才能发现语法错误,反馈周期长,而且模拟器的报错信息往往不够精确。加上这个工具后,Agent 可以在生成后立即自检,发现错误马上修正,整个循环从“生成-导入-报错-修正”变成了“生成-校验-修正”,效率提升非常明显。
3.5 批量调优:从单点优化到系统提升
单个任务的调优做到一定程度后,边际收益会递减。这时候需要切换到批量调优模式——用一批代表性的任务来评估 Harness 的整体表现,找出系统性的问题。
我们的做法是维护一个调优任务集,包含 50-100 个覆盖不同场景的配置生成任务,从简单的 VLAN 创建到复杂的 ACL 规则、路由策略、QoS 配置。每次修改 Harness 后,跑一遍完整任务集,统计成功率、平均修正次数、平均耗时等指标。这样能避免“改了一个问题引入另一个问题”的情况。
批量调优中最有价值的发现往往来自失败案例的聚类分析。把失败的任务按错误类型分组,看看哪类错误出现频率最高。我们有一次发现,30% 的失败都集中在“接口范围配置”这个场景——Agent 总是搞混interface range和逐个接口配置的语法差异。针对这个问题,我们在提示词里加了一条专门的约束,并在工具集中加了一个expand_interface_range工具,让 Agent 可以把范围表达式展开成具体接口列表再逐个配置。这一处修改让整体成功率提升了近 15 个百分点。
4. 那些只有踩过才知道的坑
4.1 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| Agent 生成的配置语法正确但逻辑顺序错误 | 提示词未明确命令执行顺序 | 检查提示词中是否有顺序约束 | 在约束条件中增加“先创建后引用”类规则 |
| 多轮对话后 Agent “忘记”初始约束 | 上下文窗口溢出或关键信息被稀释 | 检查每轮传给模型的完整上下文 | 实施分层上下文管理,持久层每轮完整保留 |
| 同一类错误反复出现 | 缺少针对性的校验工具或约束 | 统计失败案例的错误类型分布 | 增加专用校验工具或在提示词中固化规则 |
| Agent 在简单任务上过度设计 | 提示词中的示例过于复杂 | 检查示例的复杂度和多样性 | 提供不同复杂度的示例,让模型理解粒度 |
| 工具调用参数格式错误 | 工具参数定义不清晰 | 检查工具 schema 和参数描述 | 简化参数,增加参数说明和示例 |
| 生成速度慢,token 消耗大 | 上下文冗余或工具返回结果过大 | 分析每轮的 token 分布 | 压缩工具输出,精简上下文 |
4.2 三个让我印象最深的踩坑经历
第一个坑:过度依赖模型的自纠错能力。早期我天真地以为,只要让 Agent 看到报错信息,它就能自己修正。实际情况是,Agent 确实会尝试修正,但它经常“修错方向”——比如语法错误它去改逻辑,逻辑错误它去调格式。后来我在 Harness 里加了一个错误分类器,先把错误分成语法类、逻辑类、参数类,然后针对不同类型给不同的修正提示。语法类错误直接给正确写法,逻辑类错误给执行顺序建议,参数类错误给参数取值范围。这样 Agent 的修正成功率从不到 40% 提升到了 75% 以上。
第二个坑:忽略了设备版本的差异性。华为设备的软件版本之间,配置语法可能有细微差别。比如某些版本支持port link-type trunk的简写形式,某些版本必须写全。Agent 不知道当前设备的具体版本,就会随机选择一种写法,导致在部分设备上失败。解决方案是在 Harness 初始化阶段就通过read_config工具获取设备版本信息,然后把这个信息作为持久层上下文的一部分,每轮都传给模型。
第三个坑:没有设计回退机制。有一次 Agent 在修正一个配置错误时,把原本正确的部分也改坏了,而且它没有意识到这个问题,继续在错误的方向上迭代。等我们发现时,已经生成了十几轮无效修改。后来我们在 Harness 里加了配置快照机制——每次 Agent 生成一个“候选版本”,就先存快照,如果后续验证失败且修正超过 3 次仍未通过,就自动回退到上一个通过验证的快照,重新开始。这个机制大大减少了“越改越错”的情况。
4.3 一些不那么显然的经验
经验一:Agent 的“创造力”在调优阶段是负资产。Vibe Coding 阶段我们鼓励 Agent 发挥创造力,但在生产调优阶段,我们需要的是确定性。同样的输入,应该得到同样的输出。为了达到这个目标,我把模型的 temperature 参数调到了接近 0,并且在提示词中明确要求“严格按照示例格式输出,不要添加额外内容”。牺牲一点灵活性,换来的是可预测性和可重复性。
经验二:调优的收益不是线性的。从 60% 成功率提升到 80% 可能只需要几天,但从 80% 到 95% 可能需要几周,从 95% 到 99% 可能需要几个月。你需要判断当前场景对成功率的实际要求。内部工具 90% 可能就够了,生产环境可能要求 99.9%。把精力花在边际收益最高的区间,而不是盲目追求完美。
经验三:人工兜底不是失败,是设计的一部分。无论怎么调优,Agent 总会有搞不定的情况。与其追求 100% 自动化,不如设计一个顺畅的“人机交接”流程——Agent 生成配置后,如果置信度低于阈值,就标记出来让人工确认。这个阈值可以根据实际运行数据动态调整。我们现在的流程是:Agent 生成 → 自动校验 → 置信度高于 95% 直接通过,80%-95% 人工快速确认,低于 80% 人工介入修改。这样既保证了效率,又控制了风险。
5. 从调优实录中提炼的通用方法论
5.1 建立“生成-校验-修正”的快速闭环
这是整个调优工作的核心引擎。闭环的速度决定了调优的效率。闭环中的每一个环节都要尽可能快、尽可能准。生成环节的关键是提示词质量,校验环节的关键是工具能力,修正环节的关键是错误信息的指导性。三个环节中,校验环节的投入产出比最高——一个好的校验工具,能让 Agent 自己发现并修正大部分问题,减少人工介入。
5.2 用数据驱动调优决策
不要凭感觉判断“哪个提示词更好”或“哪个工具更有用”。建立一套评估指标体系,每次修改后跑一遍基准测试,用数据说话。我们用的核心指标包括:首次生成成功率、平均修正次数、平均 token 消耗、人工介入率。这四个指标基本能反映 Harness 的整体健康度。
5.3 把领域知识固化到 Harness 里
Coding Agent 的通用能力已经很强,但在特定领域,它缺乏“老司机”的经验。这些经验包括:常见的坑、最佳实践、版本差异、性能考量等。把这些知识以约束条件、校验规则、工具逻辑的形式固化到 Harness 里,是提升 Agent 在垂直场景下表现的最有效手段。这个过程本质上是在做“领域知识的工程化”——把老师傅脑子里的隐性知识,变成 Agent 能理解和执行的显性规则。
5.4 保持 Harness 的可维护性
Harness 会随着调优不断膨胀,如果不加控制,很快就会变成一团乱麻。我的做法是:模块化——提示词模板、上下文管理策略、工具定义、校验规则分别放在独立的配置文件中,修改时互不影响。版本化——每次修改都记录变更内容和对应的指标变化,方便回溯。文档化——每个约束条件和校验规则都要写清楚“为什么需要它”,避免后人误删。
这套方法论不仅适用于华为设备配置场景,任何需要 Coding Agent 产出生产级代码的场景都可以参考。核心思想是一致的:把 Agent 当成一个需要调教的团队成员,而不是一个即插即用的工具。你投入在 Harness 工程上的每一分精力,都会以 Agent 可靠性的提升回报给你。
我在实际使用中发现,调优到后期,最大的瓶颈往往不是技术问题,而是耐心问题。看着 Agent 在 90% 的成功率上徘徊,每次想突破都要做大量细致的分析和实验,很容易产生“差不多就行了”的想法。但生产环境不会接受“差不多”,一个配置错误可能导致整个网络中断。所以最后一公里的路,再难也得走完。