智能体不需要直接操作 PyTorch 对象。更稳妥的做法是把模型放在受控服务里,暴露一个只读 classify 工具;工具负责预处理、推理和标签映射,Agent 只传业务输入并读取结构化结果。 本文基于 PyTorch inference_mode 与模型保存加载教程说明封装,未运行你的模型;预处理、阈值、校准、偏差和适用场景必须以模型训练与评估资料为准。
本篇验收要点:工具固定接收 text 或受控文件标识,只执行预处理和模型前向,不允许客户端提供模型路径、Python 代码或任意设备参数。 结果包含 label、probability、model_version 和 input_id;低于已验证阈值时返回 uncertain,而不是强行选择标签。

开始前准备
- 已评估的 PyTorch 分类模型
- 与训练一致的模型结构、标签表和预处理
- 安全保存的 state_dict 与版本号
- 包含已知、边界和异常输入的测试集
按顺序搭建
- 服务启动时创建模型结构,使用 torch.load 的安全参数和 map_location 加载 state_dict,核对键并调用 model.eval()。
- 实现固定 preprocess,限制文本长度或文件大小;客户端不能传本地路径和序列化对象。
- 在 torch.inference_mode() 内执行前向,使用 softmax 或模型既定输出解释得到概率;阈值来自验证集。
- 返回 label、probability、uncertain、model_version、input_id,不向 Agent 暴露张量和内部路径。
- 为 Agent 工具写清适用任务和失败状态;用正常、空输入、超长、低置信和模型不可用用例测试。
可复制的最小示例
工具函数可以保持如下边界,具体模型和 tokenizer 需替换:
@torch.inference_mode()
def classify(text: str, input_id: str) -> dict:
if not text or len(text) > MAX_LEN:
return {"ok": False, "error": "invalid_input"}
x = preprocess(text).to(device)
logits = model(x)
probs = torch.softmax(logits, dim=-1)[0]
p, idx = probs.max(dim=-1)
return {
"ok": True, "label": labels[idx.item()],
"probability": float(p), "uncertain": float(p) < THRESHOLD,
"model_version": MODEL_VERSION, "input_id": input_id
}
怎样验收结果
验证标准是同一模型版本和输入得到稳定结果,model.eval 与 inference_mode 已启用,异常输入不执行模型,低置信度返回 uncertain,Agent 不把失败或 uncertain 改写成确定结论。
- state_dict 与模型结构匹配
- 预处理与训练一致
- 阈值有验证集依据
- 输出包含模型版本和输入 ID
常见失败与处理
- 加载键不匹配:核对模型结构和权重版本,不使用 strict=False 掩盖问题。
- 每次请求都加载模型:改为服务启动加载并监控内存。
- 概率很高但错误:检查校准和数据分布,概率不等于真实正确率。
读者下一步是先把现有模型封装成脱离 Agent 可调用的 classify 函数,用固定测试集验证后再注册为工具。
相关问答
inference_mode 与 eval 是一回事吗?
不是。eval 切换 Dropout/BatchNorm 等行为,inference_mode 关闭部分自动求导开销,推理通常需要两者。
概率能直接作为业务置信度吗?
不能默认。阈值和校准要用独立验证集确定,并监控上线数据分布。
官方资料与适用边界
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32496.html