Agent 终态判定:何时该停止思考、给出最终回复

发布时间:2026/7/22 0:01:35
Agent 终态判定:何时该停止思考、给出最终回复 Agent 终态判定何时该停止思考、给出最终回复一、你的 Agent 在再想想的循环里绕了 12 轮用户已经关窗口了Agent 与人最大的区别是人知道什么时候该停下来给答案Agent 会一直想下去。你给 Agent 接了搜索引擎 API它第一轮搜了一下觉得信息不够全第二轮换了关键词再搜第三轮觉得 还有 3 篇相关文章没读第四轮读了之后发现这篇文章引用了另一篇——我再搜一下……十二轮后用户早就不在了。Agent 的终止判定是一个比想象中更复杂的问题。不是因为怎么停止很难而是什么情况下应该停止需要几个维度的判断信息完备度够不够、用户是否有明确的时间预期、本轮回答的质量是否已经够好。当前大多数 Agent 框架的终止逻辑极其简单。要么是固定步数限制最多调用 5 步就停要么是 LLM 自己说了算它觉得该停了就停了。固定步数太硬——复杂任务 5 步不够简单任务 1 步就够了。LLM 自己判断太软——它可能永远不觉得信息够了。二、底层机制与原理剖析Agent 终态判定的多维度决策模型四个判定维度信息增益Information Gain每一步工具调用都会带回新的信息。衡量这一步带来的信息增量——如果新信息与已收集信息的语义重复度超过 95%说明再搜下去也不会获得新信息了边际收益递减。计算方法新信息的嵌入向量 vs 已收集信息的嵌入向量之间的余弦相似度。步数预算不是固定上限如 5 步而是动态预算。简单问题如今天天气怎么样1-2 步足够复杂问题如分析 A 公司财报并做竞品对比给 8-10 步。LLM 在初始阶段评估任务复杂度生成预算值。置信度阈值每一步后让 LLM 自评当前答案的置信度0-100%。超过阈值如 85%就输出答案未超过就继续。这比固定步数更弹性——有时 1 步就能高置信度回答有时 8 步才能。用户显式信号最高优先级的停止信号。用户的任何结束意图的表达可以了够了先这样吧明白了都应该立即停止推理并输出最终回答。三、生产级代码实现 Agent 终态判定器 四个维度信息增益、步数预算、置信度阈值、用户显式信号 from dataclasses import dataclass, field from typing import List, Dict, Optional, Tuple import numpy as np from enum import Enum class StopReason(Enum): INFORMATION_SATURATED info_saturated # 信息饱和 BUDGET_EXCEEDED budget_exceeded # 步数预算耗尽 CONFIDENCE_REACHED confidence_reached # 置信度达标 USER_SIGNAL user_signal # 用户显式终止 MAX_STEPS_FORCED max_steps_forced # 硬上限强制终止 dataclass class StopDecision: 终态判定结果 should_stop: bool reason: StopReason confidence: float # 当前置信度 information_gain: float # 最后一步的信息增益 steps_used: int # 已用步数 steps_budget: int # 总步数预算 detail: str # 人类可读的决策说明 dataclass class AgentContext: Agent 当前步骤的上下文 steps_taken: int steps_budget: int collected_info: List[str] # 已收集的信息片段 last_action_result: str # 最后一步动作的结果 current_confidence: float # 当前置信度 (0-100) user_last_message: str # 用户最后一条消息 class TerminationJudge: Agent 终态判定器 def __init__( self, embed_fn, confidence_threshold: float 85.0, information_gain_threshold: float 0.05, max_steps_fallback: int 15, # 绝对硬上限 ): self.embed_fn embed_fn self.confidence_threshold confidence_threshold self.information_gain_threshold information_gain_threshold self.max_steps_fallback max_steps_fallback # 用户终止信号词 self.stop_signals [ 可以了, 够了, 先这样, 明白了, 清楚了, 不用了, 够了谢谢, 就这样吧, 好的谢谢, ok, got it, thats enough, stop, ] def judge(self, context: AgentContext) - StopDecision: 判定是否应该停止 判定优先级用户信号 信息饱和 置信度达标 步数预算 硬上限 # 优先级 1: 用户显式信号 for signal in self.stop_signals: if signal in context.user_last_message.lower(): return StopDecision( should_stopTrue, reasonStopReason.USER_SIGNAL, confidencecontext.current_confidence, information_gain0, steps_usedcontext.steps_taken, steps_budgetcontext.steps_budget, detailf用户发出了终止信号: {signal}, ) # 优先级 2: 信息饱和最后一步的信息增益太低 info_gain self._calculate_information_gain( context.last_action_result, context.collected_info, ) if context.steps_taken 2 and info_gain self.information_gain_threshold: return StopDecision( should_stopTrue, reasonStopReason.INFORMATION_SATURATED, confidencecontext.current_confidence, information_gaininfo_gain, steps_usedcontext.steps_taken, steps_budgetcontext.steps_budget, detailf信息增益 {info_gain:.3f} 低于阈值 {self.information_gain_threshold}继续搜索收益递减, ) # 优先级 3: 置信度达标 if context.current_confidence self.confidence_threshold: return StopDecision( should_stopTrue, reasonStopReason.CONFIDENCE_REACHED, confidencecontext.current_confidence, information_gaininfo_gain, steps_usedcontext.steps_taken, steps_budgetcontext.steps_budget, detailf置信度 {context.current_confidence}% 阈值 {self.confidence_threshold}%, ) # 优先级 4: 步数预算耗尽 if context.steps_taken context.steps_budget: return StopDecision( should_stopTrue, reasonStopReason.BUDGET_EXCEEDED, confidencecontext.current_confidence, information_gaininfo_gain, steps_usedcontext.steps_taken, steps_budgetcontext.steps_budget, detailf已用 {context.steps_taken}/{context.steps_budget} 步预算耗尽, ) # 优先级 5: 绝对硬上限 if context.steps_taken self.max_steps_fallback: return StopDecision( should_stopTrue, reasonStopReason.MAX_STEPS_FORCED, confidencecontext.current_confidence, information_gaininfo_gain, steps_usedcontext.steps_taken, steps_budgetself.max_steps_fallback, detailf达到绝对上限 {self.max_steps_fallback} 步强制终止, ) # 继续 return StopDecision( should_stopFalse, reasonStopReason.INFORMATION_SATURATED, # 实际未触发 confidencecontext.current_confidence, information_gaininfo_gain, steps_usedcontext.steps_taken, steps_budgetcontext.steps_budget, detail继续下一步推理, ) def _calculate_information_gain( self, new_info: str, existing_info: List[str] ) - float: 计算新信息相对于已有信息的信息增益 方法计算新信息向量与已有信息向量的最大余弦相似度。 1 - 最大相似度 信息增益。 新信息与已有信息越相似增益越低。 if not existing_info or not new_info: return 1.0 # 没有旧信息新信息的增益是 100% try: new_embed self.embed_fn(new_info) # 计算与每条已有信息的相似度取最大值 max_similarity 0.0 for info in existing_info[-5:]: # 只比较最近 5 条降低计算量 try: info_embed self.embed_fn(info) sim self._cosine_sim(new_embed, info_embed) max_similarity max(max_similarity, sim) except Exception: continue # 增益 1 - 最大相似度 gain 1.0 - max_similarity return max(0.0, gain) except Exception: return 0.5 # 计算失败时返回中性值 staticmethod def _cosine_sim(a, b): return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b) 1e-8) def estimate_budget(self, user_query: str) - int: 根据用户问题复杂度估算步数预算 简单启发式生产环境应用 LLM 估计复杂度 - 短问题 20 字2-3 步 - 中等问题20-50 字4-6 步 - 长问题 50 字7-10 步 length len(user_query) if length 20: return 3 elif length 50: return 6 elif length 100: return 8 else: return 10 def build_stop_message(self, decision: StopDecision) - str: 根据终止原因构建给用户的说明 if decision.reason StopReason.BUDGET_EXCEEDED: return ( f已进行 {decision.steps_used} 步分析 f当前置信度{decision.confidence:.0f}%。 f如需更深入的分析可以提出更具体的问题。 ) elif decision.reason StopReason.CONFIDENCE_REACHED: return elif decision.reason StopReason.INFORMATION_SATURATED: return ( f搜索到的信息开始重复 f当前置信度{decision.confidence:.0f}%。 f如需更多信息源可以指定方向。 ) else: return 四、边界分析与架构权衡信息增益的准确性用 embedding 向量计算语义相似度作为信息增益的代理变量会产生误判。两段文字在语义上相似但包含了关键的差异信息如两个不同城市的人口数据——结构相同但数据不同——语义相似度高但信息增益应该高。这是当前方法的盲区。置信度评分的可靠性让 LLM 自己评估自己的置信度存在过度自信或不自信的偏差。模型的置信度评估本身就是不可靠的——它可能对错误答案给出 90% 的置信度。可以用 Self-Consistency 方法让模型多次回答同一问题统计答案的一致程度来增加置信度评分的可信度。适用边界最适合多步推理的 Agent如研究助手、数据分析 Agent、代码调试 Agent。任务步数在 3-15 步之间、需要多轮信息检索或分析的场景。禁用场景不适合单轮问答的 Agent——不需要多步推理的场景不存在终止判定的问题。也不适合实时对话——用户应该在任意时刻都能打断 Agent。五、总结Agent 终态判定不是简单的最大步数限制。四个维度的综合决策——用户显式信号优先级最高、信息增益边际收益判断、置信度阈值答案质量判断、步数预算资源边界。当任一维度触发时Agent 应在回答中附上置信度和停止理由让用户知道这个回答是经过几轮推理得出的可信度如何。关键是让 Agent 能在过度推理和草率给出答案之间找到平衡。