当工具返回400错误时,如何让Agent自动重试并修改参数?
解读
400 属于客户端错误,通常意味着参数格式、必填字段、取值范围或业务规则校验失败。与国内常见网关(阿里云 API 网关、腾讯云 API 网关、公司自研 BFF)行为一致:返回 400 时不会触发重试,需要调用方自行修正参数后重新发起请求。
因此,Agent 必须在本地决策环内完成“错误语义理解 → 参数修正 → 安全重试”的闭环,而不是简单依赖指数退避重试。
知识点
-
400 错误分类表(仅文字描述)
A. 结构错误:缺失必填字段、JSON 模式不符、Content-Type 错误。
B. 业务错误:枚举值越界、日期格式不符合、外键 ID 不存在。
C. 安全错误:签名缺失、Token 作用域不足、IP 白名单拦截。 -
重试策略设计
- 可重试白名单:仅对 A、B 类错误进行参数修正;C 类错误直接熔断并上报。
- 最大自修正轮次:建议 ≤2 次,防止无限循环;超过阈值后转为人工标注队列。
- 退避策略:参数修正成功后,使用线性退避 200 ms + 随机 jitter 重新调用,避免惊群。
-
参数修正链路
- 错误解析器:用正则 + 轻量 DSL 抽取字段名、错误码、提示文案;对大模型返回的“message”字段做中文关键词匹配(如“不能为空”“格式错误”)。
- 知识库检索:将字段名映射到领域知识图谱节点,读取“取值范围”“单位”“正则模板”元数据。
- LLM 重写器:把“原始参数 + 错误信息 + 知识库元数据”拼成 Prompt,调用本地 7B 轻量模型(如 ChatGLM3-6B)生成修正后的 JSON;为保安全,输出通过Pydantic 模型二次校验。
-
安全与对齐
- 参数沙箱:重写后的参数先走静态规则引擎(黑名单字典、SQL 注入特征),拦截敏感字符。
- 可解释性日志:记录“错误原文→抽取字段→知识节点→重写差异”,方便后续人工审计与RLHF 数据回收。
-
工程落地细节
- 在 Python 侧使用tenacity框架,自定义 retry_if_exception 判断函数,仅对自定义 ToolException(code=400 & 可修正类型)触发重试。
- 对高并发场景,把“参数重写”步骤拆成独立微服务,内部用缓存 + 布隆过滤器防止相同错误重复调用 LLM,降低 GPU 成本。
- 与阿里云 SLS或腾讯云 CLS对接,统一上报“修正成功率、平均重写耗时、Top 错误字段”,作为SLO 指标看板。
答案
给出一个可直接落地的最小可运行方案(基于国内主流技术栈):
- 定义异常类
class Tool400Exception(ToolException):
def __init__(self, error_type, field, msg):
super().__init__(400, f"{field}:{msg}")
self.error_type = error_type # 'struct' or 'biz'
self.field = field
- 在工具调用层统一拦截 400
@retry(
stop=stop_after_attempt(3),
wait=wait_fixed(0.2),
retry=retry_if_exception_type(Tool400Exception)
)
def safe_call_tool(tool, params: dict) -> dict:
try:
return tool.invoke(params)
except Tool400Exception as e:
if e.error_type == 'struct' or e.error_type == 'biz':
params = rewrite_params(params, e) # 核心修正函数
raise e # 触发 tenacity 重试
else:
raise # 不可修正,直接抛
- rewrite_params 实现
def rewrite_params(params: dict, exc: Tool400Exception) -> dict:
# 1) 知识图谱查询
meta = kg.get_field_meta(exc.field)
# 2) 轻量 LLM 重写
prompt = f"字段{exc.field}当前值{params.get(exc.field)},错误信息:{exc},取值要求:{meta},请仅返回修正后的 JSON 片段。"
delta = llm_rewrite(prompt, format="json")
# 3) 安全校验
if not validate_by_pydantic(delta, meta.schema):
raise NonRetryableError("rewrite invalid")
# 4) 合并回参数
return {**params, **delta}
- 上线后观察修正成功率与平均延迟;成功率 <85% 或延迟 >300 ms 时,触发知识库热更新或模型微调。
拓展思考
- 多工具级联场景:若 400 错误源于上游工具 A 的输出被下游工具 B 拒绝,Agent 需要逆向追溯并修正 A 的参数,这要求维护跨工具数据血缘图,并在图节点上注册“参数影响面”元数据。
- 强化学习微调:把“参数修正”建模为序列决策问题,状态=错误信息+当前参数,动作=字段级增量,奖励=调用成功节省的时间成本;用离线 RL(Decision Transformer 方案)在脱敏日志上训练,减少对大模型在线调用的依赖。
- 合规审计:国内金融、医疗客户要求可解释性报告,需要把每一次自动重试的“旧参数→新参数→错误码”三元组写入只读区块链存证或蚂蚁链可信存储,确保事后可追溯。
- 边缘部署:在华为昇腾 310或寒武纪 MLU220边缘盒子上运行 Agent 时,LLM 推理能力受限,可预先生成参数修正决策树并编译成TVM指令集,实现毫秒级本地重写,无需回云。