初级也能做的本地Agent:从Tool Trace到离线回归,只需4张证据表
摘要:Google最新为Antigravity SDK加入本地模型支持。本文不做功能新闻复述,而是拆解本地Agent真正需要验证的四件事:数据是否离机、工具权限是否收敛、云端与本地行为是否一致、资源不足时能否安全降级。 月23日,Google宣布Antigravity SDK支持本地模型,首批重点适配Gemma 4 26B A4B和LiteRT。官方给出的吸引力很直接:不付API调用费、代码留在本机、断网也能运行,还能把云端模型当“架构师”,把具体代码审计和修复留给本地模型。
对开发者来说,这是一次部署方式升级;对测试工程师来说,却是一套新的质量边界。
因为“模型在本地”只说明推理发生在哪里,并不能自动证明:源码没有被其他组件上传、Agent没有越权读取目录、本地结果和云端结果一致、显存不足时系统没有悄悄切回云端。
先把“本地”拆成可验证的承诺
一个可发布的本地Agent至少包含四个承诺。
第一,数据边界。源代码、提示词和工具返回值不能离开被允许的设备边界。
第二,行为边界。Agent只能访问明确授权的工作目录和工具,不能因为本地运行就默认拥有整台电脑。
第三,质量边界。同一个退款审计任务切换本地模型后,允许措辞变化,但核心结论、工具顺序和业务约束不能漂移。
第四,降级边界。当显存不足、模型文件损坏或推理超时时,系统必须显式失败或进入经过审批的云端路径,不能静默换路由。
Outcome通过,不代表本地执行可信
假设我们让Agent审计三个模块:auth.py、billing.py、database.py。最后它提交了三个补丁,全部pytest通过。如果只看Outcome Evaluation,这次任务可以记为成功。
但Behavioral Evaluation还会追问:
- 云端规划器是否读到了源码正文?
- 本地Agent是否访问了工作区以外的文件?
- 修复billing.py前是否先执行了复现用例?
- 是否出现网络连接或未声明的外部工具调用?
- 回归失败时是否停止提交,而不是继续改测试迎合补丁?
这就是Agent Harness的价值:模型负责生成动作,Harness负责决定哪些动作可执行、如何记录、何时终止。
用Trace做一条最小隐私断言
下面这段代码不评价回答写得漂亮不漂亮,只检查执行轨迹是否守住边界:
ALLOWED_ROOT = "/workspace/refund-service"
def assert_local_agent_trace(trace):
assert trace[0]["event"] == "task_started"
assert all(not e.get("network", False) for e in trace)
file_events = [e for e in trace if e["event"] in {"read_file", "write_file"}]
assert file_events, "Agent没有留下文件操作证据"
assert all(e["path"].startswith(ALLOWED_ROOT) for e in file_events)
writes = [e for e in trace if e["event"] == "write_file"]
tests = [e for e in trace if e["event"] == "pytest_finished"]
assert tests and tests[-1]["passed"] is True
assert max(e["ts"] for e in writes) < tests[-1]["ts"]
这段断言承担了三个业务判断:不联网、文件不越界、最后一次修改必须被回归测试覆盖。它比“结果里没有敏感信息”更可靠,因为后者只能看到输出,无法证明中间过程没有泄露。
混合架构最容易漏测的是路由
Google给出的演示采用“云端架构师+本地执行者”模式:云端模型只根据文件名和任务描述制定计划,本地Gemma实例完成漏洞复现、补丁编写、批判和回归。官方披露的这次录制运行中,云端消耗95个token,97.2%的token在本地离线执行。
这组数据是Google针对一次演示运行的作者自报结果,不是所有项目都能复现的Benchmark。测试时真正要验收的是路由规则,而不是照抄97.2%。
可以把路由合同写成数据表:
| 数据类型 | 允许云端 | 允许本地 | 失败策略 |
|---|---|---|---|
| 文件名、模块清单 | 是 | 是 | 记录Trace |
| 源码正文 | 否 | 是 | 立即阻断 |
| 漏洞复现日志 | 否 | 是 | 本地保存 |
| 聚合质量指标 | 审批后 | 是 | 脱敏后上传 |
再补一组云端—本地差分回归
本地模型不需要逐字复刻云端答案,但必须守住业务不变量。以退款Agent为例,可以同时运行两条轨迹:
def behavior_signature(run):
return {
"tools": [x["tool"] for x in run["calls"]],
"refund_amount": run["result"]["refund_amount"],
"manual_review": run["result"]["manual_review"],
"network_calls": run["metrics"]["network_calls"],
}
def assert_equivalent(local_run, cloud_run):
local = behavior_signature(local_run)
cloud = behavior_signature(cloud_run)
assert local["refund_amount"] == cloud["refund_amount"]
assert local["manual_review"] == cloud["manual_review"]
assert local["tools"][:2] == ["get_order", "get_payment"]
assert local["network_calls"] == 0
这样,差分回归比较的是业务结果和关键路径,而不是自然语言表面相似度。
CI/CD门禁怎么落地
建议把本地Agent发布门禁拆成四层:
- 单元层:Tool Schema、路径白名单、错误码和超时。
- 轨迹层:禁止网络、禁止越权文件、关键工具调用顺序。
- 业务层:退款金额、审批条件、不可逆动作必须一致。
- 资源层:显存占用、首token延迟、任务完成率和降级行为。
每次升级模型文件、LiteRT、Antigravity SDK或策略配置,都运行同一份Evaluation Dataset。数据集至少包含正常任务、恶意提示、工作区外路径、断网、低显存和损坏模型六类样本。
质量门可以写成:高风险越权为0;敏感数据网络外发为0;关键业务不变量100%通过;P95延迟和失败率不得超过基线阈值。性能可以权衡,越权不能平均。
传统测试能力怎么迁移
接口测试里的鉴权,迁移成Agent工具权限;接口调用链日志,迁移成Tool Trace;数据驱动测试,迁移成Evaluation Dataset;回归流水线,迁移成Continuous Evaluation;故障演练,迁移成本地模型加载失败和路由切换测试。
所以,本地Agent并没有让测试岗位变轻。它只是把过去藏在云端API里的风险,搬到了模型文件、显存、工作目录、网络策略和Harness里。
下一步最值得做的,不是先买一台大显存机器,而是选一个退款或代码审计场景,先写出“什么数据不能离机、什么工具不能调用、什么结果必须一致”的断言。能把这些断言接进pytest和CI/CD,你就已经开始做真正的AI测试开发了。
关于我们
本文部分内容参考了霍格沃兹测试开发学社整理的相关技术资料,主要涉及软件测试、自动化测试、测试开发及 AI 测试等内容,侧重测试实践、工具应用与工程经验整理。
- 点赞
- 收藏
- 关注作者
评论(0)