前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
返回 AI 情报前线
All News · 全部资讯8485
  • MCP生产运行复盘:14条经验与教训
  • AI Agent无停机Credential轮换方案
  • Mobileye 基于 AWS Bedrock AgentCore 的客服 Agent 实践
  • Meta让数千名工程师「修Bug」来训练AI编码工具
  • 2026企业AI架构转型:从免费套餐到成本敏感的工程现实
  • AWS实战:通过MCP桥接让云端Agent安全调用本地工具
  • n8n集成Bedrock AgentCore:零基础设施搭建生产级AI Agent
  • AI Evals 入门:如何真正评估你的 AI 系统效果
  • 通过 MCP 协议让 AI Agent 完全控制真实 iOS/Android 设备
  • 深度推理模型生产部署实战指南
  • 深度推理模型性能监控实战指南
  • Agent系统最可怕的bug不是崩溃,而是静默失败
  • Vercel域名购买后可一站式配置部署、代理和邮箱
  • AI编程时代:代码审查员的核心价值与实操框架
  • AI Agent伪装身份欺骗开源维护者:安全沙箱已失效
  • Mistral 开源 3B 安全模型 Shieldstral:本地内容审核新选择
  • 自研 Agent 流水线的实战复盘
  • 自建内部 AI 平台成本远超预期:工程团队需谨慎决策
  • 自适应测试时计算:告别均匀分配推理预算
  • 分离Prefill/Decode:避免长Prompt阻塞所有Token
  • Agent难复现Bug的克星:确定性模拟测试
  • Agent工具调用分支预测:消除等待空档
  • Agent上下文窗口即RAM:引入分页机制
  • 停止让工具流经LLM:2026年代码模式转型
  • SparseSpec-L:无训练稀疏 KV 缓存让长上下文 LLM 推理提速 2.79 倍
  • 三秒延迟排查手记:API 和数据库不在同一区域引发的血案
  • Kotro:用 Rust 构建的本地 AI 编码 Agent 控制平面(MCP + LLM)
  • 我用skill.md约束文件对抗AI生成平庸UI
  • Markdown比HTML在LLM上下文中价值高10倍
  • 我做了个小CLI让AI编程工具不再失忆
  • 英国 AI 安全研究院报告:AI Agent 在提示词范围内主动攻击真实系统
  • 阿里2026云栖大会定档:聚焦Agentic AI全栈技术
  • 廉价模型生产级Prompt调优实录:四次迭代仍失败的经验
  • OpenAI 和 Anthropic 旗下 Agent 曾尝试入侵真实系统
  • LLM路由实操:同一批请求节省78.5%账单
  • Cloudflare开源Cloudflare OS:面向AI Agent的企业协作平台
  • 语义分块:修复RAG检索质量的关键在意义边界而非固定长度
  • MCP检索在小仓库反而多花4倍token:33文件vs249文件的真实对比
  • Cloudflare 推出 Durable Object 原生虚拟文件系统
  • addyosmani/agent-skills:AI 编程 Agent 的生产级工程规范
  • LoopX:AI Agent 长任务状态内核,支持跨运行时接力
  • LLM 调用的枯燥周边:FastAPI 生产级实战笔记
  • AI花钱智能体的四大安全关卡实战
  • Anthropic正在组建自研AI芯片设计团队
  • Stryker MCP Reporter:让 AI 编程助手做变异测试
  • MiniMax H3刚发布即陷价格战,推理成本降至几分钱
  • CrowdStrike推出10万美元AI安全挑战赛:用提示词注入"策反"智能体
  • Stryker MCP Reporter v1.8.2: 让AI编程助手自主完成突变测试并达到100%突变覆盖率
  • MCP over HTTP 安全重设计:去同步与请求头泄露风险
  • AGENTS.md:给 AI 编程工具的工程化指南
  • README 服务人类,AGENTS.md 服务 AI Agent
  • 已加载 51 / 8485
8.0
热点
AI SCORE
技术实践2026-08-06 00:21

Agent难复现Bug的克星:确定性模拟测试

dev.to · AI#Agent测试#可靠性
Editor brief · 编辑速览

通过单一种子驱动故障/时钟/随机,使偶发Agent Bug变为可精确定位到单步的可重现artifacts。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

确定性模拟测试通过一个种子驱动每一次故障、时钟和随机选择——这样,一个只在生产环境中出现一次的 Agent flaky bug,就变成了可以复现的产物,并且可以收缩到仅一行。

TL;DR:最棘手的 Agent bug 只在特定的故障交织情况下才会出现——工具在副作用之后刚好失败、重试触发、资金被扣两次。Happy-path 测试发现不了它,而一旦进入生产环境你就无法复现。确定性模拟测试(DST)——FoundationDB、TigerBeetle 和 Antithesis 背后的技术——使得故障、时序和随机性成为一个种子的纯函数,这样任何失败都可以精确回放,并且可以收缩到其最小根因。在一个可运行的 Python 演示中,happy path 通过了, seeded fuzzing 捕获到一次双重扣款,精确回放,并将一个包含 4 个故障的调度收缩到唯一重要的那个故障。

心智模型:一台带有录制按钮的飞行模拟器。与其等待暴风雨击中真飞机,不如按需召唤暴风雨——当暴风雨导致飞机坠毁时,你可以逐帧回放那场暴风雨直到理解它,然后剥离出造成损害的那一阵风。

问题:真正重要的 bug 是那些你无法复现的

Agent 运行在一个充满敌意的世界里。工具超时、API 返回错误、重试触发、步骤竞态。大多数时候一切正常。但在故障具体落在哪一步的空间里,隐藏着一个 bug——一个不是幂等的重试、一个假设调用成功的状态更新、一个运行两次的补偿逻辑。它只出现一次,在生产环境里,涉及真实资金,然后就消失了:你用同样的输入重新运行,它却正常工作,因为这次时序不同。

传统测试帮不上忙。基于示例的测试只会走 Happy Path。即使是随机测试,如果真的触发了 bug,也无法告诉你是怎么触发的——触发它的随机性已经消失了。

模式:把非确定性变成种子的函数

DST 翻转了模型。每个非确定性来源——故障注入、时钟、线程调度、RNG——都通过一个单一种子路由。这带来了三样东西:

可复现性。同样的种子总是产生同样的运行。一次失败是一个永久的产物。

探索性。扫描数千个种子(在模拟时间中快速进行)以探索人类永远不会想到手工编写的故障交织方式。

收缩性。一旦你有一个失败的场景,机械地移除各个部分,直到只留下最小的触发因素——把一个混沌的失败变成一行可复现的代码。

这里"故障调度"就是那些在第一次尝试时就会失败的步骤集合——整个非确定性的来源,被明确化和可种子化。工作流中有一个真正的 bug:confirm 的重试会重新运行 charge,且没有幂等性保护。

for step in PLAN:
    if step == "confirm":
        for t in range(2):
            try:
                attempt("confirm", t); break
            except Fault:
                attempt("charge", 1)   # <-- the bug: a second, unguarded charge on retry
    else:
        for t in range(2):            # every other step has a safe, idempotent retry
            try:
                attempt(step, t); break
            except Fault:
                continue

因为运行是其调度的纯函数,fuzzing、回放和收缩都是平凡的:

def fuzz(seeds):
    for seed in range(seeds):
        schedule = random_schedule(random.Random(seed))
        if not invariant_holds(run_agent(schedule)):   # property: charges ≤ 1
            return seed, schedule

def shrink(schedule):
    minimal = set(schedule)
    for step in list(minimal):
        if not invariant_holds(run_agent(minimal - {step})):
            minimal -= {step}       # drop faults that aren't needed to trigger the failure
    return minimal
1. happy-path test (no faults):      PASS  <- the bug is invisible here

2. fuzzing seeded fault schedules:   FAIL on seed 1
      schedule = ['analyze', 'confirm', 'notify', 'plan']  ->  charged the customer 2x

3. replay same schedule twice:       2x and 2x charges  ->  identical (reproducible)

4. shrink to the minimal cause:      ['confirm']
      one fault at 'confirm' is all it takes to double-charge.

Happy Path 通过了——这就是这个 bug 会被发布的原因。Fuzzing 找到了一个包含四个故障的失败调度,其中三个是无关的噪音。回放证明它可以精确复现。收缩剥离了噪音,变成一行可复现的代码:confirm 处的一个单一故障就导致了双重扣款。这是一个开发者可以在几分钟内修复的 bug 报告,而不是一个令人困扰的"在我机器上能工作"。

为什么这是 2026 年的方向

DST 正在迎来它的时刻。FoundationDB 首创了它;TigerBeetle 的 VOPR"可以任意加速时间——一分钟的模拟等于数天的真实测试";Antithesis 融了一大笔钱,卖的是一个确定性虚拟机,可以回放每条指令以复现失败。几乎每个严肃的数据库公司现在都在使用或评估它。

Agent 是下一个明显的目标,而且可以说更适合:Agent 的 think→act→observe 循环本身就是一系列离散的、可 mock 的步骤,有着良好定义的失败点(工具错误、超时、部分写入)。工程上的转变是让 Agent 的非确定性可注入——时钟、重试和工具故障都在你控制的接缝之后——然后让模拟器制造混乱。你断言的属性("charges ≤ 1"、"没有孤立的预订"、"计划永不退化")成为故障下正确行为的规格。

这个 demo 的可信度如何?

它是一个最小模型——非确定性只是"哪些步骤先出错",状态空间很小。真实的 DST 在两个方面更难:确定性是一种纪律(每次时钟读取和交织都必须通过种子路由,这就是 Antithesis 为什么要构建虚拟机来强制执行它),而探索是真正的问题(巨大的状态空间意味着 DST 与基于属性的测试和引导式 fuzzing 配对)。从小处着手:让一个 Agent 的故障和时钟可注入,然后跨多个种子断言一个不变量。

python3 demo.py   # standard library only

Sources & further reading

Platforms & write-ups

Antithesis — Deterministic simulation testing: how it works and when to use it — seeds, fault injection, time-travel debugging, and why DST pairs with property-based testing.

TigerBeetle — the VOPR simulator — stubs out clock/network/disk, injects partitions and corruption, and replays any failure from (seed, commit).

FoundationDB — simulation testing — the origin of the approach.

Phil Eaton — What's the big deal about Deterministic Simulation Testing? — an approachable tour of controlling clocks and randomness.

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
分离Prefill/Decode:避免长Prompt阻塞所有Token
下一篇
Agent工具调用分支预测:消除等待空档