给 Agent 装上护栏——harness 层设计
给 Agent 装上护栏——harness 层设计这是「Agent 工程化」系列的第九篇。前面八篇把 Agent 的能力讲完了会动手、记性好、懂业务、有经验、还会拆任务。但能力越强越让人害怕——它跑飞了怎么办这篇讲护栏harness预算、白名单、重试、断点恢复让能干的 Agent 也听话。跑飞现场上线第一天钱花光了还在跑Agent 上线第一天的真实场景用户帮我查一下这个行业的最新动态 Agent调用搜索工具第 1 次搜到 10 条结果 Agent第 2 次嗯再搜下另一个关键词…… Agent第 30 次…… Agent第 200 次还没完再搜搜……用户早走了Agent 还在自己循环搜索工具被调了几百次token 费用哗哗涨但没人能叫停它。为什么会这样回看第二篇那个核心循环while任务未完成:# ← 问题在这llm 输出{思考,行动}执行工具循环的条件是任务未完成——谁来判断完成LLM 自己。而 LLM 可能陷入再搜一次也许有结果的死循环。循环是油门没有刹车。护栏要做的就是给这个循环装上刹车。专业点说在 Agent 循环外面包一层 harness缰绳它不管 Agent 怎么想只管不许越过这些线。护栏的整体结构循环外的一层壳是否用户提问harness 前置检查预算还有吗 工具在名单里吗Agent 循环思考 行动 观察harness 后置检查超预算了吗 死循环了吗一切正常强制收尾告知用户已达上限harness 不管怎么完成任务只管四件事预算、白名单、重试、断点。逐个拆。核心一三层预算——先定义多少钱算完跑飞的本质是没有成本上限。解法是给循环套三层预算任何一层超了都强制收尾层级管什么例子每次调用单次工具调用的开销上限单次返回最多 2000 token每轮循环单轮思考行动的 token单轮最多 1500 token整个会话总调用次数 / 总 token / 总费用最多 20 次工具调用总费用 0.5 元classBudget:def__init__(self):self.max_calls20# 整个会话最多调 20 次工具self.max_cost0.5# 最多花 0.5 元self.calls0self.cost0.0defcheck(self)-bool:循环每轮开始时检查超了就刹车returnself.callsself.max_callsandself.costself.max_cost循环每轮都问一句预算还够吗budgetBudget()whilenottask_doneandbudget.check():# 刹车在这里...# Agent 循环本体budget.calls1budget.costround_cost(...)else:ifnottask_done:finish_gracefully(已达本次会话上限先到这里)# 优雅收尾优雅收尾是关键预算耗尽不是硬中断而是告诉用户已达上限需要的话可以继续。核心二工具白名单——只允许它碰该碰的Agent 能力越强越要给它的工具划定范围方式说明风险黑名单默认都可用禁止某些漏一个就出事白名单默认都不可用只放行名单内的最安全写操作天然受限生产里两个原则白名单 按场景下发查资料任务只下发搜索工具订票任务才下发下单工具——每个 Agent 看到的工具是这个任务该有的写操作强制人工确认下单、付款、删数据这类工具执行前必须过人工确认闸第三篇讲过两道闸harness 在这里落地WHITELIST{research_task:[web_search,read_url],# 研究任务只给查询工具booking_task:[search_flight,book_ticket],# 订票任务才给下单工具}defallowed_tools(task_type:str)-list:return[tfortinALL_TOOLSift.nameinWHITELIST[task_type]]白名单 不给模型做坏事的机会比事后追责便宜得多。核心三重试——什么时候重来什么时候别重来工具调用会失败但失败要分类——有的值得重试有的重试等于烧钱失败类型例子重试网络抖动连接超时、服务 503重试退避重试限流429 请求过多重试等几秒参数错误4xx、必填参数缺失不重试重试也一样错逻辑错误业务校验不通过不重试改参数才行importtimedefcall_with_retry(fn,*args,max_retries3):foriinrange(max_retries):try:returnfn(*args)exceptNetworkErrorase:# 5xx/429退避重试time.sleep(2**i)# 1s, 2s, 4s 退避exceptParameterErrorase:# 4xx参数错了重试没用returnf参数错误:{e}# 把错误反馈给模型让它改return多次重试仍失败一条判断口诀网络层的问题重试业务层的问题反馈给模型改。把错误信息以工具结果形式喂回模型第三篇讲过反馈修正让模型自己改参数——这比重试高效得多。核心四断点恢复——聊到一半崩了能接着聊生产环境进程可能随时重启发布、OOM、宕机。用户聊到一半会话就没了这是最伤体验的事。断点恢复 会话状态持久化会话进行中每轮结束把状态落库messages 已完成步骤 预算剩余进程崩溃 / 用户离开重启后从库恢复重建上下文接着上一轮继续defsave_checkpoint(session_id,messages,budget):db.save(session_id,{messages:messages,budget:budget})defrestore(session_id):statedb.load(session_id)returnstate[messages],state[budget]# 重建上下文继续跑注意持久化的不只是 messages还有预算剩余和已完成步骤——恢复后不能白跑一遍那会重复扣费、重复下单。踩坑Agent 死循环怎么都停不下来最经典的护栏翻车场景场景工具返回了一个错误Agent 觉得我没调好再调一次结果同一个错误循环重试了几十次——步数没超限但轮次全部浪费在重试同一个注定失败的调用上。根因步数上限只防无限循环防不了低效循环。解法加一层连续失败检测——连续 N 次比如 3 次工具调用都失败或结果相同就认定卡住了CONSECUTIVE_FAIL_LIMIT3defshould_stop(history)-bool:fails0forhinhistory[-CONSECUTIVE_FAIL_LIMIT:]:ifh.is_errororh.resulthistory[-1].result:fails1returnfailsCONSECUTIVE_FAIL_LIMIT卡住后的收尾方式也有讲究不是沉默硬停而是强制提示一次 标记未解决助手抱歉我连续尝试了几次都未能完成标记为未解决 可能是接口暂时不可用。建议稍后再试或联系人工客服。把未解决状态记录下来——这是第 11 篇评测的数据来源哪些问题 Agent 搞不定比哪些问题它搞定了更有价值。小结护栏 循环外的壳不管怎么干只管不许越线三层预算每次 / 每轮 / 整个会话超了就优雅收尾工具白名单按场景下发写操作人工确认不给做坏事的机会重试分两类网络层问题重试退避业务层问题反馈给模型改断点恢复messages 预算 已完成步骤都持久化崩溃了接着聊死循环连续失败检测 强制提示一次 标记未解决下篇预告护栏装好了Agent 终于敢放心上线了。但上线只是开始——线上 Agent 出了岔子你怎么知道它调用了几次工具、花了多少钱、哪一步答错了这些必须有记录。下一篇讲生产部署与可观测日志、trace、指标、告警让线上 Agent 的一举一动都在掌握之中。本系列路线从 0 到 1Agent 是什么 → 手写最小 ReAct → Function Calling 与工具设计 → 上下文管理 → Memory 记忆系统 → RAG 知识库 → Skill 自学习 → 编排模式与多 Agent → 给 Agent 装护栏 → 生产部署与可观测 → 评测与回归

相关新闻

STM32CubeMX与Keil5搭建HAL库工程:从零构建规范嵌入式开发框架

STM32CubeMX与Keil5搭建HAL库工程:从零构建规范嵌入式开发框架

1. 从零到一:为什么需要一个规范的工程起点如果你刚开始接触STM32,或者刚从标准库转向HAL库,最让你头疼的恐怕不是某个外设怎么用,而是“这个工程该怎么建”。我见过太多新手,包括几年前的我自己,直接从网上…

2026/8/7 7:41:19 阅读更多 →
基于MCP协议构建.NET智能体:从工具连接到企业级应用实战

基于MCP协议构建.NET智能体:从工具连接到企业级应用实战

上周,一个刚接触AI应用开发的朋友跑来问我:“我想用C#和.NET给我的团队做个能自动处理工单、查数据库、还能调用内部API的智能助手,网上都说Agent框架是未来,但我看了半天,感觉概念一堆,代码无从下手。从La…

2026/8/6 2:08:53 阅读更多 →
树的直径:概念、算法与应用全解析

树的直径:概念、算法与应用全解析

1. 项目概述:从“最远距离”到核心算法在数据结构与算法的世界里,“树”是一种无处不在的抽象模型。无论是计算机网络的路由拓扑、社交网络的好友关系,还是文件系统的目录结构,都可以用树来优雅地表示。当我们研究一棵树时&#x…

2026/8/7 3:17:45 阅读更多 →

最新新闻

Apache DolphinScheduler 2023技术演进与云原生实践

Apache DolphinScheduler 2023技术演进与云原生实践

1. Apache DolphinScheduler年度发展全景 作为分布式易扩展的可视化DAG工作流任务调度系统,Apache DolphinScheduler在2023年迎来了里程碑式的版本迭代与生态扩张。从年初的3.1.0版本到年末的3.2.0版本发布,项目不仅完成了核心架构的重构升级&#xff0c…

2026/8/7 7:48:30 阅读更多 →
逛完 ChinaJoy「与 AI 同游」,我回家真用一句话做了个小游戏——AI+游戏到底怎么结合?

逛完 ChinaJoy「与 AI 同游」,我回家真用一句话做了个小游戏——AI+游戏到底怎么结合?

这不是横评,是一篇实战手记。从 ChinaJoy 2026 现场那些「一句话生成游戏」的演示说起,聊聊 AI 和游戏结合的几种真实姿势,再把我自己用一句话做小游戏的完整过程、翻车点、和想明白的东西记下来。一、ChinaJoy 现场,我被什么戳到…

2026/8/7 7:48:30 阅读更多 →
Databricks 在阿里云上对应什么产品?AnalyticDB MySQL 湖仓版对标方案(含 DDI 停服说明)

Databricks 在阿里云上对应什么产品?AnalyticDB MySQL 湖仓版对标方案(含 DDI 停服说明)

⚠️ 本文性能、成本、TCO 数据均为【数据示意】,具体以阿里云官方公布的 Benchmark 与官方定价为准。DDI 停服信息请以阿里云官方公告为准。Databricks 湖仓平台在阿里云上,当前推荐的对标产品是阿里云 AnalyticDB MySQL 湖仓版(Lakehouse E…

2026/8/7 7:48:30 阅读更多 →
Mixamo动画UE4转换指南:解决滑步与根骨骼问题

Mixamo动画UE4转换指南:解决滑步与根骨骼问题

1. 项目概述:为什么我们需要一个专门的转换器? 如果你在Unreal Engine 4里用过从Mixamo下载的角色动画,大概率踩过这个坑:直接把FBX文件拖进引擎,角色要么原地滑步,要么根骨骼(Root Bone&#x…

2026/8/7 7:48:30 阅读更多 →
CUDA版本兼容性难题:技术演进、商业逻辑与开发者应对策略

CUDA版本兼容性难题:技术演进、商业逻辑与开发者应对策略

1. 从一次痛苦的CUDA版本升级说起 最近在复现一个基于PyTorch 2.0的视觉模型时,我遇到了一个经典的“版本地狱”问题。我的开发环境是Ubuntu 22.04,系统里装的是CUDA 11.7,而PyTorch 2.0官方预编译版本要求CUDA 11.8。这看似只是一个小版本号…

2026/8/7 7:48:29 阅读更多 →
从逆向工程历史学视角:先秦两汉传统工艺集群对现代科技的整体启示

从逆向工程历史学视角:先秦两汉传统工艺集群对现代科技的整体启示

摘要 中国先秦至两汉大量手工业遗存,长期被简单归为“古代手工艺、传统美学”。但借助逆向工程历史学方法重新解构可以发现:水排、青铜冰鉴、筒车、错金银、百炼钢、铜壶滴漏等一大批器物,并不是零散的奇技淫巧,而是一整套成熟的经…

2026/8/7 7:47:29 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →