AI 建议了过时依赖:3 个原因 + 修复路径

让加个库它给了一个 4 年前停更的——训练截止 + 不查 registry。

你让 Claude Code / Cursor / Codex “加个库做 X”,它信心满满给了一个名字,等你 npm install 完才发现:GitHub 仓库三年没动、issues 堆了 200 个、最后一个 release 是 2021。AI 不是在骗你,而是它的训练快照里这个库还活着——它不会主动去查 registry 现状。这篇讲怎么让它停止推荐”考古级”依赖,以及发现以后怎么快速换掉。

常见原因

按命中率从高到低排序。

1. 模型训练数据有截止日期

每个模型都有 knowledge cutoff,cutoff 之后的 npm release、deprecation、所有权变更它都看不见。Claude / GPT / Gemini 给的”主流推荐”经常是 1-2 年前的主流,现在已经被 fork 取代了。典型案例:

你:帮我加个 React 拖拽库
AI:用 react-beautiful-dnd
现实:Atlassian 2024 年已经 archive,社区迁移到 @dnd-kit

如何判断:把 AI 给的包名贴到 https://www.npmjs.com/package/<name>,看 “Last publish” 是否 > 12 个月、README 顶部是否有 “DEPRECATED / archived” 横幅。

2. 没让它先查 registry

默认 prompt”推荐一个库做 X”会触发记忆检索,而不是工具调用。Cursor / Claude Code 即便有 web 搜索能力,没明说也不会用。Aider 和裸 Codex 更是完全离线推理。

如何判断:看 AI 的回答里有没有引用 npm 页面链接、最近一次 release 日期、weekly downloads——三样都没有就是凭记忆。

3. 过时的 Stack Overflow / 博客答案被反复训练

热门库被旧博客反复提到,权重比新 fork 高。即使新 fork 已经是事实标准(如 node-fetch → 原生 fetchmomentdayjs / date-fns),AI 还是先想到老的。

如何判断:搜 <旧库名> alternative 2026<旧库名> deprecated,如果 reddit / GitHub discussion 第一页全是迁移帖,就是这种情况。

4. 包名相似导致误推

request 已 deprecated 但 AI 还在推;crypto 是 Node 内置但 AI 推 crypto-jsuuid v9 改了 API 但 AI 用 v3 写法。同名包的版本断代是高频坑。

如何判断:让 AI 同时给出 import 语句和 package.json 版本号,如果版本号是 ^1.x^2.x 而该包当前主版本已经到 9.x,几乎一定有 breaking change。

5. 推荐了已经被并入主分支 / 内置的能力

Node 18+ 有原生 fetchstructuredClone、test runner;现代浏览器有 crypto.randomUUID()。AI 仍可能给你装 node-fetchuuidlodash.clonedeep,多一份依赖、多一次安全审计。

如何判断:runtime 升级后 review AI 加的依赖,问”这个能力 Node/浏览器/框架原生有吗?“

最短修复路径

按收益从高到低。前 3 步通常就把”AI 推荐烂库”的问题解决掉。

Step 1:用 npm view 三秒判定是否过时

拿到 AI 推荐的包名先跑:

npm view react-beautiful-dnd time.modified
npm view react-beautiful-dnd deprecated
npm view react-beautiful-dnd maintainers
  • time.modified 显示最后一次发布时间,> 12 个月就警惕
  • deprecated 有内容代表官方挂了停更标记
  • maintainers 数量降到 1 且名字是个人 GitHub,长期风险高

Python 用 pip index versions <pkg> 或直接看 PyPI 页面的 “Last release”。

Step 2:让 AI 重新查、附上证据

把 prompt 改成强制工具调用 / 强制引用:

我要一个 React 拖拽库。请:
1. 列出 npm 上最近 12 个月内仍有 release 的 3 个候选
2. 每个给出:weekly downloads、最近 release 日期、GitHub stars、最近一次 issue 活动
3. 不要推荐已经 archived 或 deprecated 的包
如果你无法访问 npm,明确说"我无法验证,请人工核对",不要凭记忆给答案

Claude Code 里加 web 搜索权限,Cursor 里用 @Web 触发联网;裸 LLM 没工具就要求它显式说”无法验证”。

Step 3:用 npm-check-updates 修掉 AI 写死的旧版本号

AI 经常把版本号也写死成训练时的版本。一次性扫描升级:

npx npm-check-updates -u           # 把 package.json 全部升到最新
npm install
npm test

如果 minor / patch 即可解决就锁到 ~;major 升级要逐个看 changelog。Python 用 pip list --outdated + pip-review --auto

Step 4:常见”AI 偏爱但已过时”对照表

直接替换,省得每次都查:

AI 常推(过时)现代替代
request原生 fetch (Node 18+) / undici
momentdate-fns / dayjs / Temporal polyfill
node-fetch原生 fetch
lodash 整包lodash-es 按需 / 原生 ES
uuid v3 写法crypto.randomUUID() (Node 19+ / 浏览器)
react-beautiful-dnd@dnd-kit/core
enzyme@testing-library/react
tslinteslint + @typescript-eslint
node-sasssass (Dart Sass)
formikreact-hook-form

Step 5:把”必须查 registry”写进 AI 的常驻指令

CLAUDE.md / .cursorrules / AGENTS.md 里加一条 hard rule:

推荐任何第三方依赖前,必须:
- 检查 npm/PyPI 上的最后发布日期(要求 ≤ 12 个月)
- 检查 package.json 的 deprecated 字段
- 如果没有联网工具,明确告诉用户"无法验证现状",不要凭训练记忆给名字
- 优先用 runtime 内置能力(Node fetch / crypto.randomUUID 等)

预防建议

  • 所有 AI 建议的依赖在 install 之前,先 npm view <pkg> time deprecated 看一眼
  • CLAUDE.md / .cursorrules 里强制”推荐依赖必须附最近 release 日期”
  • 在 CI 加 npm audit --audit-level=highnpx depcheck,拦截无人维护的包
  • 季度跑一次 npx npm-check-updates -u + 测试套件,主动淘汰老依赖
  • 优先用 runtime 内置(原生 fetch、crypto.randomUUID、structuredClone),少装一个就少一个隐患
  • 关键依赖在 package.json 里精确 pin(不带 ^),升级走 Renovate / Dependabot PR 而不是 AI 自由发挥

相关阅读

标签: #AI 编程 #排查 #排查