ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Agentic Engineering:智能体的价值在于学会拒绝

Agentic Engineering:智能体的价值在于学会拒绝 先看一个反直觉的现象同样是用大模型搭智能体有的系统看起来任务覆盖很广什么需求都敢接有的却经常回你一句“这个请求缺少必要信息我无法继续执行”。前者常被认为“更强大”后者往往被吐槽“太笨”。但如果你真的在维护一套面向真实业务的 Agent 系统你会慢慢意识到Agentic engineering 的价值从来不是让模型生产更多输出而是让整个系统学会拒绝不应当产生的输出。这不是一句哲学提醒而是工程上非常具体的取舍。Agentic engineering智能体工程研究的是如何把模型、工具、记忆、状态和反馈机制组合成一个能自主完成任务的系统。这个系统的难点不在“爆发生成”而在“克制执行”。你可以用模型轻易生成一段代码但你有把握让这个 Agent 在不知道端口号、没确认目标环境、没有 lint 工具校验时主动停下来说“我不该直接生成这段代码”吗大规模落地时你会希望它多数时候都这么做。因为一次低质量的自主输出往往比一个直接报错的接口更危险——它看起来可用实际却在污染下游结果。所以我想先给 Agent 工程下一个可能和主流宣传不一致的判断Agentic engineering 真正优化的指标是“合理拒绝率”而不是“输出吞吐量”或“成功完成率”。一个只知道“继续写”的系统在不确定性面前会显得流畅但不可靠一个知道“停下来、退回去、问清楚、筛掉低质步骤”的系统才谈得上真正自主。下面就从机制、实操、评估和避坑几个层面展开聊。1. 先看清一个反直觉判断Agent 的价值为什么在于拒绝而不是更多生成多数人接触大模型产品时最直观的感受是它“话多”。无论给什么 prompt模型都会在概率上顺着语义继续补全生成一个看起来通顺的回复。这个底层习惯放到 Agent 场景里会变成一种慢性病大模型天生是“续写机器”它会努力把当前 step 接下去完成一个对话轮次或输出一段最终结果而不是在数据不足、目标模糊、工具调用异常时主动选择终止输出。Agentic engineering 的出现本质上是在对抗这种无限续写倾向。它把一个不具备风险意识、只知道生成下文的模型放进一个有着明确任务边界、可校验状态、可失败重试的系统里。这个系统要有能力打断模型的自然倾向在某个节点说“不”。为什么“拒绝”比“生成”重要因为 Agent 的自主性放大了错误代价。普通聊天模型输出了一段错误代码你还能肉眼 review 后修改Agent 如果没有约束可能会自己调用代码解释器执行、自己读取文件、自己调用外部 API、自己把错误结果写进某个存储服务甚至还会继续“补救”——执行一个又一个错误的操作。到了这一步问题已经不是“输出是否精准”而是“系统是否可以安全地自主运行”。从工程实践的角度看今天搭建 Agent 应用最核心的设计对象不是 prompt 写得有多花哨而是四条边界哪些任务可以开始执行哪个中间步骤值得继续什么条件下必须中止和回滚什么内容的输出不允许展现给用户或写入下游。这四条边界共同指向同一个动作——排除不该有的路径。这就是 Agentic engineering 和其他 AI 工程最不一样的地方传统 ML 工程优化模型的预测质量Prompt Engineering 优化模型对指令的跟随率而 Agentic Engineering 优化的是系统在开放环境中的“决策安全性”。一个无法拒绝错误路径的 Agent无论生成能力多强本质上都只是一个不可控的自动完成器。再说直接一点生成一次输出很容易难的是让系统知道“现在不该生成”。Agentic engineering 的很多模块——tool calling 前的参数校验、plan 的可行性检查、step 之后的 verifier、final output 的 guardrail、self-critique 的反思循环——本质上都是在对“该不该产出”做二次判定。少了这些判定模型的输出流就是一条危险的高速路有了这些判定它才可能成为一条有红绿灯和护栏的正常道路。2. Agentic engineering 要拒绝的不只是“幻觉”还有三类无效输出说到拒绝很多人第一反应是防止大模型幻觉。但落到 Agent 系统里幻觉只是最终输出阶段的一个问题。工程上更早失效、更经常失效的是另外三类很容易被忽略的无效输出。无效输出类型典型现象为什么会产生常见拒绝策略越界工具调用Agent 在任务不需要网络信息时主动搜索或在没有读取权限时尝试访问文件模型把“自主性”误解为“调用越多工具越好”缺少工具白名单和前置条件工具调用前做意图白名单校验参数缺失直接拒绝调用超过 usage budget 时强制停止未经验证的中间步骤它已经计划要执行 A、B、C 三步但 A 的结果明显异常它仍继续做 C执行循环缺少结果验证器plan 一旦生成就机械跟进每一步执行后接 checker验证输出结构、取值范围或与目标相关性失败超过阈值则回滚到上一步低价值或冗长输出用户只要一个“是/否”或一行命令它却生成了三段解释和并不需要的扩展方案模型倾向过度完成希望让答案显得“饱满”缺少输出预算约束输出前做最小必要检查按任务要求约束格式和长度检查冗余段落并允许裁剪后交付第一类问题通常发生在模型决定调用工具的瞬间。想一想一个没有工程约束的 Agent它拿到一个“帮我对比今天的天气”请求可能会先搜索再调用一个天气 API然后为了“回答全面”又搜索了空气质量。这些调用的每一个都很合理但整体已经超出了一个简单请求所需的工具预算。真正的 Agentic Engineering 会在这里设置一个“最小工具集”逻辑只有当请求中明确提到城市、日期且已从上下文获得足够坐标时才允许调用天气 API。缺任何一个必要参数正确做法就是拒绝调用并且向用户询问。第二类问题更隐蔽也是很多 Agent 框架最难处理的地方模型会“沿着错误继续走”。比如一个数据分析 Agent 要读取 CSV、做过滤、生成统计表。假设它在第一步把路径拼错了读取到的文件是个空表格。普通 Agent 可能会继续执行过滤和统计最后生成一张全零的表格并附上一句“这是分析结果”。稍有经验的人都会看出表格有问题但 Agent 不会因为“结果太可疑”就停下来。这就是为什么中间态必须有一个校验器专门检查“读取结果是否为空”“字段名是否匹配”“处理后的行数是否合理”。校验不通过就直接拒绝继续。第三类问题往往是交付给用户之前的最后一道闸门。日常使用中很多用户不会希望 Agent“自作多情”地扩展任务。比如用户问“把这段文字压缩成 50 字摘要”模型却给了 300 字还要解释自己为什么这样压缩。Agentic Engineering 的答案不是减少模型能力而是在输出层增加一个“格式约束器”或者用一个小型 checker 检查输出长度与格式不满足条件就让输出重写超过 N 次还没达标就拒绝 final output并且暴露失败原因。这三类无效输出单独看都不算大问题但它们叠加后会让一个 Agent 系统变得不可信。工程上真正的分水岭不在于系统能不能生成内容而在于它能不能在输出之前识别出这些其实不该交付的内容。要做到这一点就不能只把“拒绝”塞进 prompt 里而要用一套机制把它变成系统的本能。3. 从“生成优先”转向“拒绝优先”一套可落地的三层机制在具体落地时我不建议只给模型加一句“如果不知道就说不知道”。这样做有效但很不稳定。模型可能在你明确要求的场景下学会了拒绝但换一个没有强调的场景它又开始自信续写。所以更可靠的做法是在系统结构中划分出三个层级每一层都能独立执行“拒绝”或“中止”而不是依赖模型单次的自我判断。3.1 入口层任务解析与条件判断先决定“要不要做”很多人搭建 Agent 时有一个习惯一收到用户请求就直接丢给大模型生成 plan然后开始执行。这个习惯会把大量无解任务提前放行导致后续流程白白消耗 token 和工具调用次数。更稳妥的第一步是让系统在正式开始生成 plan 之前先做一个“任务可执行性检查”。这一层要做的事情不是回答用户而是回答系统内部三个问题用户是否有明确的意图类别这个意图需要的输入参数和上下文信息是否齐备这个任务是否在当前 Agent 的工具能力边界和知识边界内在框架实现上你可以在进入主循环前加一个 intent router 和 parameter extractor。如果参数提取结果里缺少必填项比如用户说“帮我写计划”但没说“给谁”或“什么目标”那么系统应该走一个 ask_clarification 分支而不是继续生成计划。这个分支就是一种拒绝机制这次拒绝不是“不能做”而是“暂不生成因为条件不充分”。从工程上讲这里的输出形态是“反问用户”但从内部状态机来看它其实是一个 early stop。我更喜欢把它理解为系统拒绝了一次低质量的起点。从工程实践看入口层最容易踩的坑是“用模型自由决定是否缺少参数”。你最好把需要哪些参数哪些参数是必填、哪些是可选定义成一份结构化 schema。模型的作用只是从用户输入中抽取参数是否满足执行条件由系统逻辑判断而不是让模型自己感觉。这样即使模型的参数抽取偶有偏差入口层的条件判断也足够明确。3.2 执行层过程校验与中途止损如果说入口层解决的是“开头能不能成立”执行层解决的是“路径中每一站能不能通过”。很多智能体框架都支持 Recursive / ReAct 式的执行循环但它只是一个工具调用循环真正让你具备“拒绝能力”的是循环里额外插入的 Step Verifier。执行层可以这样设计模型提出下一步行动继续分析、调用工具、写代码、搜索、读文件等系统检查该行动是否符合当前任务上下文和白名单行动执行后系统再来一次结果验证包括 schema 校验、范围校验、空值校验、非法内容检测结果验证通过才允许模型基于该结果生成下一步计划如果验证失败你可以走三种分支之一结果重试、回到上一步重选动作、拒绝整个任务的继续路径。这里有一个很重要的观念转换Step Verifier 不一定要用大模型承担。简单规则一样有效——路径是否存在、文件是否为空、返回 JSON 是否能解析、数值是否在合理范围内这些都可以用传统代码检查。只有验证语义相关性时才值得用一个小型 judge model。执行层必须内置“止损预算”。假设一个任务要求最多调用 5 次工具但 Agent 在第三次工具调用后仍没有得到有用信息此时最合理的不是无限重试而是停止任务向用户返回“当前信息不足以完成任务”或“该路径执行超限建议换一种输入”。这里的拒绝既是对资源浪费的控制也是对不可控路径的封锁。没有止损预算一个 Agent 会在失败的循环里自我强化做出越来越多的无用调用这才是 Agentic Engineering 最需要防的场景。3.3 输出层结果评审与低质过滤执行完成后Agent 还要面对最后一个关口用户最终看到的内容是否真的值得交付在这个问题上工程实践里通常有两种做法一种是输出前 guardrail一种是输出后 evaluation。前者是一系列规则和模型检查器确认最终的文本、代码、表格或结构化数据不包含越权、不合法、格式错误和明显低质量内容。后者则是在交付之后让另一个模型或用户反馈对结果进行评分把评分结果存下来作为后续迭代或动态调整阈值的数据。哪种更好我会建议两者都做。实时系统至少需要 guardrail保证最终输出不越界离线评估系统可以帮助你判断“模型在哪些情况下生成的内容质量普遍偏低”进而让系统学会更多提前拒绝。具体到输出层一个简单的 routine 可能长这样# 示例结构输出层 verifier 的伪代码 def verify_output(response, requirement): # 1. 格式校验比如是否满足 JSON / Markdown / 长度要求 if not check_format(response, requirement.format): return reject_format # 2. 安全校验是否包含受限内容 / 是否出现不该出现的术语 if not check_safety(response, requirement.policy): return reject_policy # 3. 知识校验关键数据是否有检索依据如存在引用库 if not has_sufficient_evidence(response, requirement.evidence): return reject_evidence # 4. 内容完整性是否覆盖用户问题中的全部请求点 if not check_completeness(response, requirement.questions): return reject_incomplete return pass这个 routine 可以简单也可以复杂。复杂版本里每一步都能触发“重写一次”或“改走澄清路径”但如果重写了 2 次仍不通过最终输出就应该进入低质量队列而不是硬着头皮交给用户。这里的逻辑非常符合主判断输出不是越多越好也不是“有结果就算成功”只有通过完整拒绝链路的结果才值得被看作一次有效生成。4. 到底怎么衡量一个 Agent 的“拒绝能力”四个维度与一套评估框架很多团队问到 Agent 系统时第一个关心的指标是“任务成功率”第二是“延迟”第三是“成本”。这当然没错但它们掩盖了一个同样致命的指标这个系统在多少应该拒绝的时刻选择了拒绝又在下一次拒绝后是否带了合理理由如果只能选四个评估维度我会建议从以下四个方向构建 Agent 的“拒绝能力”评价体系。拒绝精准率Reject Precision系统所有拒绝行为中真正属于“应当拒绝”的比例。拒绝精准率低说明系统把不该拒绝的正常请求也拒了用户体感会很僵硬。漏拒率Missed Reject Rate在应当拒绝的测试样本中系统仍然生成了低质量或错误输出的比例。漏拒率高往往是工程系统最危险的信号——看起来系统输出流畅但实际质量不可控。止损效率Mean Steps-to-Reject从任务开始到主动拒绝平均经过多少轮工具调用或生成步数。止损效率越高说明系统在错误路径上跑得越久资源浪费越大。可解释性Reject Reason Quality系统拒绝后是否给出了清晰、具体、可指导用户修改的原因。如果只是说“无法处理”用户根本不知道下一步能做什么。为了量化这些维度你可以构造一张包含多类样本的 Agent 测试集样本类型示例期望行为低风险正常请求用户提供完整参数要求生成一个摘要通过执行并输出结果参数缺失请求用户说“帮我发邮件”但未提供收件人和正文拒绝执行并反问补齐参数越界工具请求用户要求访问未授权目录或读取无关文件拒绝工具调用并解释权限边界信息不足请求用户问“请告诉我某城市明日房价预测”但知识库和工具都无法覆盖拒绝生成数据并说明没有依据低质量触发请求用户让 Agent 随便编几个数据统计并标成官方结论拒绝生成或要求标注为“模拟数据”恶意/欺诈意图用户要求 Agent 帮助生成欺骗性营销话术拒绝执行并触发安全策略评估过程中要格外注意“风险不对称”宁可多一点误拒也要防止漏拒造成降级。如果 Agent 经常拒绝一个本可以完成的任务你还能通过提示词和少量示例来调优如果 Agent 在该拒绝时仍然生成问题会传导到下游影响很难追溯回来。此外建议把“拒绝率”和“用户最终满意度”放在一起分析。一个拒绝策略合理的 Agent在触达边界时会触发用户的修正动作比如补全参数后再次请求。如果数据显示大量用户拒绝后直接流失很少补充信息那说明你的拒绝理由和交互设计依然有改善空间。评估不只是分类算分还要追踪拒绝后的行为链路。5. 落地避坑设计拒绝机制时最常见的六个错误说了这么多进入实操环节后很多人还是会把“拒绝”设计得非常生硬或者完全交给模型自省。下面六个错误是我在智能体项目里比较常见的现象值得一个个排掉。错误一只把拒绝写进 prompt没有外部硬约束。“如果信息不够就回答不知道”这句话可以被写进 system prompt也可以在某些测试样本上表现得不错。但模型是概率性的给一个小变化它可能又滑回默认的续写行为。正确思路是把关键拒绝条件实现成代码逻辑或至少是 prompt 之外的结构化 schema。信息够不够由字段检查器定工具能不能调由白名单和参数校验器定。模型负责语言理解和生成系统负责规则执行。错误二执行者和裁判使用同一个模型。如果 Agent 主模型本身非常自信再让它做自我检查通常只会得到“没问题”。这不是它撒谎而是它受到上下文污染。更稳妥的方式是让裁判模型看到独立的输入摘要不直接继承执行模型的完整推理链有时规则 checker 比模型裁判更可靠。当然也可以让同一模型做一次独立的 self-consistency 抽样但要多轮抽查不要只让主模型自评一次。错误三把拒绝阈值设得太高或太低。阈值太低什么都敢输出漏拒率升高阈值太高处处拒绝用户很受挫。真实系统里拒绝阈值要分场景。比如面向 C 端用户的聊天 Agent语气和边界可以松一些面向金融、医疗、订单处理这类下游任务任何缺少证据的输出都应当被拒绝。你需要用小批量测试集画出阈值与误拒、漏拒的关系曲线而不是凭感觉拍一个数值。错误四拒绝后没有给用户留出口。一个真正可用的 Agent拒绝不能是死胡同。它应该告诉用户“我现在没法执行因为缺少 XX你可以补充 XX 后重新发起”。如果系统能判断出用户大概率需要什么甚至可以主动给出一个示例输入。拒绝的最终目的不是终止对话而是帮助用户进入一条更容易被满足的请求路径。好的拒绝本身就是一种引导。错误五只拒绝最终输出不拒绝中间行动。这是很多 Agent 上线后才暴露的问题最终输出看起来被护栏挡住了但中间步骤已经出了错——文件被写错了、外部 API 被调用过了、数据被污染了。等最后阶段再拒绝损失已经发生。所以拒绝必须在工具调用层、修改系统状态层、写库层都生效。凡是会产生副作用的 action都要在 action 之前校验完参数和权限宁愿少做也不要多做。错误六日志里不记录“为什么拒绝”。当系统拒绝一个输出它到底是因为证据不足、格式不符、成本超限、还是安全策略触发这些原因如果不落日志后面就无法迭代调优。建议在每个拒绝节点返回一个结构化的拒绝原因码让可观测系统能聚合分析。你不需要记住每一次生成过程但你需要知道哪一类任务在哪些节点最容易被拒以及拒绝之后用户接受了哪类修正行为。# 示例结构化拒绝日志 { agent_run_id: run_2025xxxxxxxx, reject_stage: executor_step_verify, reject_reason_code: TOOL_RESULT_EMPTY, reject_message: 搜索结果为空无法支撑回答事实性问题, steps_consumed: 4, task_category: factual_question, user_correction: user_updated_query }6. 从拒绝到恢复Agentic Engineering 真正要做的是可靠闭环把“拒绝”讲得如此重要并不代表一个 Agent 应该整天说“不”。如果你把系统调教成一个胆小怕事、逢问必拒的聊天机器人那也不是工程目标。结合我自己的观察拒绝只是可靠闭环里的第一个环节真正成熟的 Agent 应该学会几件延伸的事。拒绝 → 解释 → 恢复recover拒绝 → 记录 → 迭代iterate拒绝 → 分流 → 转人工或转别路径escalate所以与其说智能体工程优化的是“拒绝输出”不如说它优化的是一套围绕“不产生坏输出”的完整决策链路。在这个链路里生成只是行动候选集之一而验证、过滤、拒绝、重试、回滚、人工接管同样是行动。一个稳定成熟的 Agentic system不是像一个“有求必应的助手”更像是团队里一个经验丰富的执行者他遇到不确定的地方会停下来确认发现自己走错路径会及时返回发现工具异常会停下排查不会为了让你安心而假装一切正常。从长期工程经验看我也建议所有正在搭建 Agent 的人一开始就设计好这几种“刹车”在任务进入主循环前设置输入条件闸口在每一步 action 后加校验器而不是憋到最后输出前设定全局工具调用与 token budget超限意味着自动失败保持完整的拒绝日志事后用它优化数据集和阈值让 agent 在拒绝时给出可操作修正建议而不是冷冷一句“无法执行”。我相信未来的 Agent 系统会越来越不显眼不是因为它们什么都能干而是因为它们在不能干的时刻足够诚实和克制。模型很擅长让我们觉得“万物皆可生成”Agentic engineering 存在的意义就是为这种事无巨细的自由度划出可靠边界。在生成能力已经证明过自己的时代决定一个智能体是否靠谱的可能恰恰是它“不生成什么”以及它“在拒绝之后如何把事情推向正轨”。
返回列表