当前位置: 首页 > news >正文

再探 Harness Engineering 该做点什么?

最近在搞 Agent 或 AI Coding 的同学,基本都绕不开一个词 —— Harness。很多人第一反应是 “是不是又一个新概念”,但你真在业务里踩过坑就会发现,这玩意儿不是锦上添花,是救命用的。

前几天看到 Lychee Technology 的一篇文章《Your AI Isn't "Stupid" — It Just Needs a Better Harness》,讲得挺实在。

今天我们就结合 Go 工程视角,把这件事拆开聊清楚:怎么用工程化手段把大模型驾驭住。

一个现实例子

在写 Agent 的时候,很多人都遇到过类似场景:给模型安排一个长链路任务,前面几步执行得非常漂亮,甚至让你觉得 “这波稳了”。

但是很无奈的是,一旦跑到中后段,它开始逐渐失控: 要么胡说八道,要么输出结构开始漂移,最后直接给你吐一个少括号的 JSON。

然后你的 Go 服务一接:

var resp PriceResponse _ = json.Unmarshal(raw, &resp) // boom

直接 panic。

这类问题本质上就是:长链路的不确定性累积爆炸

很多同学第一反应是改 Prompt:

  • “必须返回合法 JSON”
  • “绝对不能省略字段”
  • “请严格遵守格式”

说实话,这套在短链路还行,一旦链路变长,基本就是玄学。

这时候思路就得变了:从 Prompt 工程 → RAG → Harness 工程。

核心思想一句话总结:不要指望模型变聪明,要让系统变严格。

什么是 Harness 工程

简单来说,Harness 就是一层包在 LLM 外面的 “执行壳”。

在这个体系下:

  • 模型不能直接对用户说话
  • 模型不能直接调用外部系统
  • 所有输入输出必须经过 “检查点”

可以理解为: 模型只是一个 “函数”,而 Harness 才是 “运行时”。

约束大于指导(强契约与校验)

这个点在 Go 里特别好理解。

与其在 Prompt 里祈求模型 “返回正确格式”,不如直接用结构体 + 校验兜底。

type PriceResponse struct { Price float64`json:"price"` Currency string`json:"currency"` } func ValidateLLMOutput(rawJSON []byte) (*PriceResponse, error) { var resp PriceResponse // 结构校验 if err := json.Unmarshal(rawJSON, &resp); err != nil { returnnil, fmt.Errorf("契约校验失败: %v", err) } // 业务校验 if resp.Currency == "" { returnnil, errors.New("缺少必须的 Currency 字段") } return &resp, nil }

可以看到,这其实就是经典的 Go 风格:写死规则,不信任输入。

如果失败怎么办?

  • 本地重试(Fail locally)
  • 不让脏数据进入后续链路

这比你在 Prompt 里写 10 行 “请务必返回 currency 字段” 靠谱多了。

状态外置(记忆与持久化)

很多人刚写 Agent 会踩一个坑:把状态全放在上下文里。

问题在于:

  • Context Window 是有限的
  • Token 一旦超了,前面的信息直接被截断

也就是说,你的 “记忆” 是会丢的。

工程上正确做法是:状态外置

type AgentState struct { TaskID string `json:"task_id"` Completed []string `json:"completed"` InProgress string `json:"in_progress"` } func SaveState(ctx context.Context, state AgentState) error { data, err := json.Marshal(state) if err != nil { return err } return os.WriteFile("state.json", data, 0644) }

每完成一个步骤就落一次状态。

这样即使:API 超时、进程崩溃、模型抽风等。

都可以从断点继续。这其实就是把 Agent 当成 “分布式任务系统” 来做。

应对上下文焦虑

这里有个很有意思的现象:上下文焦虑

当 Token 使用接近上限(比如 70% 以上),模型会出现:

  • 开始省略步骤
  • 回答变短
  • 逻辑变乱

这时候很多人会做摘要压缩,但效果有限。

更硬核的做法是:直接重启上下文

if float64(tokensUsed)/float64(maxContext) > 0.7 { // 保存状态 SaveState(ctx, currentState) // 终止当前 Agent cancelCurrentAgent() // 拉起新实例 StartNewAgentInstance(currentState) }

简单粗暴但有效:kill → restore → continue

这在 Go 服务里实现成本很低,但收益非常高。

利用外部工具(Tool,而不是纯靠模型)

这里有一个很多人一开始都会踩的坑:把大模型当成万能执行器。

比如:

  • 查数据 → 让模型“猜”
  • 计算 → 让模型“推”
  • 调 API → 让模型“编参数”

问题在于:模型本质上是在“生成”,不是在“执行”。一旦信息不完整,它就会开始“补全”,说白了就是编。

所以 Harness 的一个关键转变是:让模型负责决策,让工具负责执行。

工具层,本质是一个“受控执行环境”在一个健康的 Harness 架构里:

  • 模型:决定要不要调用工具
  • Harness:校验 + 调用工具
  • 工具:返回确定性结果

但有一个很关键的点:工具的输出,不能直接喂回模型。

因为数据可能过大(爆 Token),内容可能重复,可能包含噪音。

所以必须经过一层处理,例如:排序(只保留关键结果),去重(避免信息膨胀),截断(控制上下文大小)等操作。

这样通过工具调用的结果,就算更准确,更有效,更省 token。

社区观点

关于大模型怎么用,社区一直是 “各打各的”:搞微调,卷 Prompt,做 RAG。

但一旦进入长链路 + 工程化落地,这些方案都会遇到同一个问题:不可控性无法被彻底消除

这时候,Harness 派的思路就很明确了:用工程手段把 “不确定性” 压缩到局部。

这就是为什么有了驾驭工程这一说法的缘来。

总结

可以看到,AI 开发正在发生一个很明显的转变:

  • 早期:谁 Prompt 写得好
  • 中期:谁 RAG 做得全
  • 现在:谁 Harness 做得稳

哪怕刚开始写 Agent,也建议优先把这几件事做好:

  • 状态外置
  • Schema 校验
  • 重试 + backoff
  • Token 控制
  • 工具调用

剩下的再慢慢优化。至于未来会怎么发展?

大概率不是模型 “无限变强”,而是 Harness 越来越标准化。甚至不排除未来会出现类似 “LLM Runtime” 的基础设施层。

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!​

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示

​因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

四、AI大模型商业化落地方案

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

http://www.cnnetsun.cn/news/2015190.html

相关文章:

  • 3步解锁:如何快速解密RPG Maker加密资源文件?
  • 实测5款降AI率工具:2026最值得选的工具排行
  • 高数小白必看!3种不定积分解法+经典例题详解(附李林880同款练习题)
  • 一劳永逸解决Windows和Office激活难题:KMS_VL_ALL_AIO终极指南
  • 软件工程 3.0:大模型驱动的研发新范式,重塑软件全生命周期
  • 服务器磁盘告急?手把手教你用Conda Clean和镜像源给Miniconda安装包‘瘦身’
  • 终极指南:3步为Android Studio安装中文语言包,彻底告别英文界面困扰
  • 别再为相位差发愁了!手把手教你用STM32F103的ADC1和ADC3实现精准同步采样
  • ComfyUI_TensorRT:NVIDIA GPU的AI推理加速引擎
  • 超级结MOSFET栅极驱动回路PCB优化指南
  • OOD检测的指标到底该怎么看?手把手教你解读FPR95、AUROC和AUPR
  • Vue Router 路由懒加载的最佳实践:让首屏加载速度提升 50%
  • AI背景去除终极指南:3分钟制作专业级透明视频的完整教程
  • VisualCppRedist AIO:终极Windows运行库一站式解决方案的5大核心技术解析
  • 告别鼠标!在Ubuntu 22.04上用Touchegg打造MacBook级触控板手势(附详细配置文件)
  • egergergeeert惊艳效果集:10组高质量anime风格插画生成结果真实展示
  • 手把手教你将MACD顶底背离指标导入通达信(附源码及实战验证)
  • 为什么90%的团队不敢在金融核心系统启用Java 25虚拟线程?揭开3大未公开的JVM安全缺陷(含CVE-2024-XXXX临时缓解补丁)
  • Scrcpy Mask:将安卓设备变成你的电脑游戏手柄 [特殊字符]
  • 想用CVAE做可控图像生成?从Fashion-MNIST到动漫头像,我的踩坑与调参实录
  • DeerFlow基础教程:MCP系统与Python代码执行环境配置
  • 机器人城市应用-室外总坪清扫
  • 告别关联失败!详解Abaqus调用Intel Fortran编译器的两种环境配置方法
  • FUXA实战指南:如何7天构建工业级可视化监控系统
  • B站直播推流码获取终极指南:解放专业直播的完整解决方案
  • 物联网时代的“连接者”:解码西安摩高互动的软硬一体化开发实践
  • 告别OFD兼容烦恼:3分钟掌握Ofd2Pdf轻松转换技巧
  • 河流/湖泊浮标式水质监测系统
  • 手把手调试FPGA的GTX收发器:利用四种回环模式快速定位硬件问题
  • 你的USB转串口稳定吗?聊聊CH9101、FT232R那些影响信号质量和下载的隐藏细节