前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
返回 AI 情报前线
All News · 全部资讯9654
  • 测 LLM 接口延迟,别只报平均数
  • 用 TypeScript 拦住格式正确的错误数据
  • 微软在 Foundry 推出 Qwen 决策模型
  • 大模型故障切换也要守住能力边界
  • 弱网下如何保住大模型流式响应
  • 用 CI 硬约束控制 AI 代码膨胀
  • Agent 上线前,先验证工具权限边界
  • steadysdk 降低接口客户端再生成风险
  • 生产 Agent 的权限不能照搬人类账号
  • 递归生成可验证的终端 Agent 难题
  • 用缺陷风险排序分配代码审查预算
  • 用真实几何验证模型修复代码的能力
  • 用 Hooks 强制执行 AI 编码质量检查
  • TeamAI 用 Git 同步团队 Agent 配置
  • 为编码助手补充 SwiftUI 开发规范
  • LiteLLM 统一多家模型接口与调用治理
  • 20 个编程智能体并行,构建缓存成关键
  • 按用途配置 AI 爬虫访问规则
  • TFD-Bench 用多轮测试反馈评估编程智能体
  • Clef-omni用单次调用完成多模态决策
  • 让AI先复现故障,再用证据定位根因
  • 微软推出面向Agent控制的概率评分模型
  • Stepfork 将智能体故障变成回归测试
  • Claude 托管智能体支持千路并行协作
  • 用程序校验揭穿Agent评测假成功
  • 用小型本地模型压测桌面编程 Agent
  • Drex 1.5 开源,以单次推理为选项评分
  • 双栏论文解析错序,先用版面几何修复
  • ML Drift统一多平台端侧GPU计算
  • 单台虚拟机搭建 Claude 多代理工作流
  • 用父提交对照区分测试波动与回归
  • Saluki 将 27B 智能体模型压至 7.89GB
  • 通义图像 Turbo 将去噪压至 8 步
  • OpenAI 新 API 面向概率与评分输出
  • AI 编程提速为何卡在人工审查
  • 向量数据库六雄横评:pgvector到Milvus选型指南
  • 路由模式省60%token成本:智能选择Agent模型
  • AI 代码审查自动化的前置条件与风险分级
  • AI 写代码比人理解还快:工程瓶颈已转向代码审查
  • Claude 支持千个 Agent 并行:多 Agent 查 Bug 覆盖率达 94%
  • Anthropic 推出免费开源漏洞扫描服务
  • Claude Code CLI 2.1:Haiku 5.5原生集成+确定性Hook+Mesh
  • AI Agent 权限失控:邮箱被批量清空的技术根因
  • AI通话实时督导系统:边听边干预的架构设计
  • 九大AI Agent代码库扫描:证据驱动注册表发现了什么
  • Postman 如何在 Bedrock 上为 4000 万开发者运行 AI Agent 模式
  • Firecrawl vs Tavily评测: 事实召回率97% vs 82%
  • 1200个隔离AI Agent自发建群聊天,OpenAI安全测试意外翻车
  • 我用语音对话 AI 编程工具完整开发了一个博客功能
  • AI agent写的代码,运行前必查的五个安全检查点
  • LLM访问控制与监控:防线应设在何处
  • 已加载 51 / 9654
8.0
热点
AI SCORE
编程提效2026-10-10 14:07

让AI先复现故障,再用证据定位根因

dev.to · AI#AI调试#提示词#竞态条件
Editor brief · 编辑速览

文章建议先要求AI复现失败并收集根因证据,再修改代码。搜索结果被旧请求覆盖的案例说明,防抖可能降低故障频率,却不能解决响应乱序。

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

完整中文译文

你把一条报错粘贴给 AI 助手。

它修改了一个条件,加了一次空值检查,又把某段代码包进 try/catch。

报错消失了。

但你知道它为什么会发生吗?又能确定这次修改真的解决了问题吗?

这就是让症状消失与理解 bug 之间的区别。

更好的起手 prompt 是:

“先不要改代码。帮我复现故障,并找到能证明其原因的证据。”

下面,我们把这个思路变成一套实用的调试流程。

再有说服力的解释,也仍然只是猜测

假设用户输入新的搜索词后,你的应用偶尔会显示旧的搜索结果。

你让 AI 修复它。

它建议加上 debounce。

这听起来很合理。搜索输入框经常会用 debounce。减少请求次数,甚至可能让问题看起来没那么容易出现。

但看看下面这个执行顺序:

User searches for "react"
Request A starts

User searches for "react testing"
Request B starts

Request B finishes → correct results appear
Request A finishes → old results overwrite them

问题在于,响应没有按请求发起的顺序返回。

debounce 减少的是请求发起的频率。它并不能保证最新发起的请求最后完成。

一个看似合理的修复,可能让真正的 bug 原封不动地留在那里。

1. 先描述故障,再提供代码

“搜索坏了”给助手留下了太多猜测空间。

先说清楚你观察到的现象:

Expected:
Results should match the current search query.

Actual:
Sometimes results from an earlier query replace the latest results.

Trigger:
Type one query, then quickly change it.

Frequency:
Intermittent. Easier to reproduce with a slow connection.

然后提供相关代码,并提出要求:

Do not edit anything yet.

Using the observed behavior and this code:
1. List up to three possible causes.
2. Separate observed facts from assumptions.
3. Explain what evidence would support or reject each cause.
4. Suggest the smallest reproduction.

这样,你得到的是有待调查的假设,而不是一个需要你直接相信的补丁。

2. 让故障能够稳定复现

间歇性 bug 难处理,是因为你无法可靠地比较修改前后的表现。

对于搜索这个例子,可以强制让较早发起的请求更晚完成:

const delay = (ms) =>
  new Promise((resolve) => setTimeout(resolve, ms));

async function fakeSearch(query) {
  await delay(query === "react" ? 800 : 100);

  return [`Result for ${query}`];
}

先搜索 "react",稍后再搜索 "react testing"。

如果你的 UI 在每个响应到达时都直接应用结果,旧结果就会覆盖新结果。

现在,你有了一个可控的复现案例。

Help me create a minimal reproduction.

Control timing or inputs where necessary.
Keep the suspected failure mechanism intact.
Explain what this reproduction demonstrates
and what it does not establish.

复现案例说明,某种机制能够导致这个故障。但要把它与你实际遇到的问题联系起来,你仍然需要真实应用中的证据。

3. 收集能够区分不同原因的证据

随意添加日志只会制造噪声。

有用的日志应该回答一个具体问题。

对于这个 bug,在每次请求发起、完成以及更新 UI 时,记录搜索词和请求 ID:

START  id=41 query="react"
START  id=42 query="react testing"
FINISH id=42 query="react testing"
APPLY  id=42 query="react testing"
FINISH id=41 query="react"
APPLY  id=41 query="react"

这段记录支持一个具体解释:较旧的响应在较新的响应之后更新了 UI。

What is the smallest amount of instrumentation
needed to distinguish these hypotheses?

For each log or measurement, explain:
- What question it answers
- Which hypothesis it could reject

Avoid logging secrets or personal data.

目标是减少不确定性,而不是把控制台塞满。

4. 要求 AI 说明因果链

接受补丁之前,让助手把证据与故障联系起来。

Explain the causal chain using the reproduction,
logs, and relevant code.

Identify:
1. The triggering event
2. The incorrect behavior
3. The missing safeguard
4. How that produces the visible failure

State anything that remains uncertain.

用户发起了两次搜索。

两个请求都还在执行。

较早发起的请求最后完成。

代码没有检查这个请求是否仍对应当前搜索,就直接应用了它的结果。

UI 显示了过时的结果。

这个解释为修复指明了目标。

“API 很慢”还不够。慢 API 让问题暴露出来;缺少响应顺序保护,才让问题得以发生。

5. 修复问题机制,再挑战这个修复

在一个简化的搜索控制器中,请求计数器可以阻止过时的响应更新结果:

let latestRequestId = 0;

async function search(query) {
  const requestId = ++latestRequestId;
  const results = await fakeSearch(query);

  if (requestId !== latestRequestId) {
    return;
  }

  renderResults(results);
}

只有最新一次搜索才能应用自己的结果。

在真实应用中,应把这个计数器放在相关组件或控制器内部。同时检查加载状态、错误处理、清空输入框以及组件清理等情况。

现在,给 AI 换一个任务:

Try to find a counterexample to this fix.

Check:
- An older request finishing last
- The latest request failing
- The input being cleared during a request
- The component being destroyed during a request

Explain which cases the patch handles
and which still need work.

这正是 AI 特别有用的地方:帮助你挑战一个方案,而不只是生成一个方案。

6. 写一个能暴露原始 bug 的测试

修改后能够通过的测试是有用的。

一个修改前失败、修改后通过的测试,则能提供更有力的证据,说明你确实解决了已经复现的故障。

对于这个例子,测试应该:

  • 发起第一次搜索。
  • 发起第二次搜索。
  • 先让第二个请求完成。
  • 再让第一个请求完成。
  • 断言界面仍然显示第二次搜索的结果。

测试中应使用可控的 Promise,而不是随意设置延迟。

并且,由你自己定义预期行为:

Write a regression test for this requirement:

Once a newer search starts, an older response
must not replace its results.

Control request completion order explicitly.
The test must fail against the original implementation
and pass against the proposed fix.

测试应该由需求驱动。什么才算“正确”,不应该由实现来定义。

值得保存的 prompt

下次某个 bug 让你陷入反复应用 AI 生成补丁的循环时,可以使用这个 prompt:

Help me investigate this bug. Do not modify code yet.

Expected behavior:
[describe]

Actual behavior:
[describe]

Reproduction steps:
[list]

Relevant code and evidence:
[paste]

Please:
1. Separate facts from assumptions.
2. Rank up to three hypotheses and explain why.
3. Propose the smallest experiment to distinguish them.
4. Identify any missing evidence.
5. Explain the causal chain once evidence supports it.
6. Then suggest the smallest fix and a regression test.

Do not claim the cause is confirmed without evidence.
If you cannot run an experiment, say so.

调试就是减少不确定性

你不需要为每一个拼写错误或明显的语法错误都做一番漫长调查。

但当一个 bug 偶发、反复出现,或者影响重要功能时,再打一个快速补丁的成本,可能比做一个小实验更高。

接受下一个 AI 修复之前,先问自己:

  • 我能复现这个故障吗?
  • 有什么证据支持这个解释?
  • 补丁解决了导致故障的机制吗?
  • 回归测试能捕获原始 bug 吗?

让 AI 帮你建立对修复的信心,而这份信心要有依据。

你遇到过什么 bug,最初那个“显而易见的修复”最后却被证明是错的?欢迎在评论区分享它的症状,以及真正的原因。

部分评论可能仅对已登录的访客可见。登录后即可查看全部评论。

如果需要进一步采取措施,你可以考虑屏蔽此人和/或举报滥用行为。

Original source

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

阅读英文原文
上一篇
Clef-omni用单次调用完成多模态决策
下一篇
微软推出面向Agent控制的概率评分模型