1、有了ReAct循环,为什么还需要Harness?
在上一节虽然我们知道LLM通过ReAct循环在上下文的辅助下使用工具完成任务,但也产生了问题:模型可能产生幻觉 、选错工具 ,或者遇到错误时无法自我恢复。
从 Harness 工程的视角看,可以把 LLM 抽象为核心组件 Model,把 Agent 边界内负责支撑模型运行及模型与环境交互的代码、配置和服务统称为 Harness。准确来说,Harness是Agent边界内、模型之外的运行与治理层。通过Harness的接入就能使Agent在生产环境中尽量可靠运行。
2、Harness到底负责什么?
首先看一下Harness的数学方程式:Harness = 上下文管理 + 工具接口 + 约束 + 验证 + 纠正
前两个在上一节内容已经有提及了,主要看一下后三个的职责:
①约束:主要作用是设定行为边界,采用故障安全默认值,所有能力默认关闭然后按需开放;
②验证:自动判断操作结果的对错,检查Agent做的对不对;
③纠正:发现问题时自动修正或回退,确认无法恢复之前不暴露中间态结果。
以CC为例,他的Harness中绝大部分代码都是约束、验证和纠正,说明围绕着上下文以及工具使用所构建的保障机制才是真正的核心所在。Harness工程成为了Agent系统的核心竞争力。
3、工作流与自主Agent有什么区别?
(1)工作流Workflow
通过预定义的代码路径来编排LLM和工具,执行路径是确定性的。两个核心优势:严格的流程控制 (开发者确保关键步骤不被跳过或乱序执行);安全性 (因为路径是确定的,提示注入或者模型犯错最多只影响当前节点内部)。但是工作流的局限是缺乏变通(出现预设流程之外的情况无法灵活应对,只能降级到异常处理分支或者直接把控制权还给人)
(2)自主Agent
他与工作流的核心区别就在于执行路径不是预先定义的,而是Agent根据环境反馈实时决定的。
自主Agent需要具备自主规划能力:自主决定执行步骤,还需要能够识别失败、调整策略,同时得设置明确的停止条件(也就是任务的执行预算)包括任务完成、达到最大迭代次数或遇到不可恢复的错误,否则Agent容易陷入死循环或过度执行。
自主Agent执行循环
4、什么时候选工作流,什么时候增加自主性?
通常来说工作流适合流程确定或者有明确安全要求的场景,而自主Agent特别适用于开放式的问题(比如coding agent解决SWE-bench任务)。实际业务需求中会选择混合使用两种模式:关键的、有严格合规要求的流程用工作流确保可靠性,要灵活决策的部分就使用自主模式。
另一种混合方式:先由自主Agent把工作流写出来,再由工作流去执行。Agent读完任务要求后自行决定拓扑并生成一段编排代码,代码生成后执行阶段就交给工作流的确定性操作。既能保留自主Agent面向未知任务的灵活,又不必让模型在每一次调度上都参与决策。
5、护栏和人工干预放在哪里?
(1)护栏
它构成了保障Agent行为安全可控的分层防线,用于管理数据隐私风险。按照护栏的防护位置可以分为三层:上下文层、执行层以及数据层。
①上下文层护栏
这一层管的是模型能看到什么,在内容进入上下文之前拦截,包含四种机制:相关性分类器 (标记偏离主题的查询,比如专门做编程的智能体收到用户询问今天周几?)、安全分类器 (检测越狱攻击和提示注入等)、内容审核 (标记不当的输入例如暴力)、基于规则的保护(采用确定性措施,包括黑名单等)
②执行层护栏
管的是模型能做什么,在动作真正生效之前验证。核心是工具风险评估(根据标注的风险等级确认是否需要额外审查或人工确认)
③数据层护栏
管的是最终能被改成什么样,该层不依赖上面两层是否正确。即使上面两层全被注入,越权操作仍会在数据层被拒绝。
(2)人工干预
实行人工干预机制可以使得Agent在无法完成任务时平稳移交控制权,比如客服系统中转人工就将问题升级到了人工客服,对于编程智能体意味着把控制权还给开发者。
触发人工干预:超过失败阈值 (为Agent的重试次数或操作次数设置上限)、高风险操作(涉及敏感、不可逆或高风险操作时)