你让 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 → 原生 fetch、moment → dayjs / date-fns),AI 还是先想到老的。
如何判断:搜 <旧库名> alternative 2026 或 <旧库名> deprecated,如果 reddit / GitHub discussion 第一页全是迁移帖,就是这种情况。
4. 包名相似导致误推
request 已 deprecated 但 AI 还在推;crypto 是 Node 内置但 AI 推 crypto-js;uuid v9 改了 API 但 AI 用 v3 写法。同名包的版本断代是高频坑。
如何判断:让 AI 同时给出 import 语句和 package.json 版本号,如果版本号是 ^1.x 或 ^2.x 而该包当前主版本已经到 9.x,几乎一定有 breaking change。
5. 推荐了已经被并入主分支 / 内置的能力
Node 18+ 有原生 fetch、structuredClone、test runner;现代浏览器有 crypto.randomUUID()。AI 仍可能给你装 node-fetch、uuid、lodash.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 |
moment | date-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 |
tslint | eslint + @typescript-eslint |
node-sass | sass (Dart Sass) |
formik | react-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=high和npx depcheck,拦截无人维护的包 - 季度跑一次
npx npm-check-updates -u+ 测试套件,主动淘汰老依赖 - 优先用 runtime 内置(原生 fetch、crypto.randomUUID、structuredClone),少装一个就少一个隐患
- 关键依赖在
package.json里精确 pin(不带^),升级走 Renovate / Dependabot PR 而不是 AI 自由发挥