原创实测 · 付费知识库

晓峰·AI 小白避坑图鉴

10 年新媒体老运营,半路 All in AI 踩过的坑
帮你少走 6 个月弯路
11 条精选经验4 大场景持续更新
晓峰AI增长实验室 · 稳定版 v1

装工具

命令行找不到工具就以为没装?当心白装一个根本不需要的

现象

教程让你用某个 AI 工具(命令行调用的那种),你在终端敲 which 工具名(Mac/Linux)或 where 工具名(Windows)或 PowerShell 的 Get-Command 工具名,结果返回"找不到"。你心想"没装啊",于是去 npm install -g 全局装一个。可装完发现还是用不对,甚至装错版本、跑偏了整个方案。

根因

关键认知:which/where 找不到,只代表"这个名字没注册成全局命令",不代表"工具没装、不能用"。

很多现代工具根本不注册全局命令,而是靠别的方式调用,最典型的两种:

  1. npx 临时拉取:工具通过 npx --package 某包 工具名 调用,npx 会临时下载/缓存到本地来跑,通常不往全局 PATH 注册命令。所以 which 工具名 找不到不能直接说明它不能用。
  2. Python 模块入口:工具是 python -m 某模块 这种方式调,也没有独立的全局命令名。

你拿"全局命令名"去探测一个"本来就没有全局命令名"的工具,当然找不到——但这是探测方法的错,不是工具没装。

先判断(动手前先确认)

别一看到"找不到"就动手装。先用 30 秒确认工具到底是哪一种调用方式:

一句话:which 去探测 npx/python 模块类工具,方法本身就是错的。

一步一步做

  1. 翻工具的安装说明 / 配置文件,确认它真实的调用方式(npx 包名python -m 模块?某个包装脚本?)。
  2. 用文档里的原始命令直接跑一次,不要自己改写成全局命令名。
  3. 如果工具是被某个框架/执行器内部调用的,去翻该框架的运行结果记录(执行日志),看历史上有没有成功调用过这个工具——有成功记录 = 工具能用。
  4. 命令能正常返回结果 → 工具能用,不用装;命令本身报错 → 按报错信息排查,仍然不是"没装"。
  5. 只有当:文档规定的调用方式也对、历史也从没成功过,才考虑"真没装"——这时再严格按文档装。

常见误区

交给 AI 助手时怎么说

"我要用 <工具名>,命令行 which/where <工具名> 显示找不到。但教程里它的调用命令是 <粘贴原始命令,比如 npx xxx 或 python -m xxx>。请帮我判断:这个工具是不是本来就不需要全局命令名?我该怎么用文档里的原始方式直接验证它能不能用,而不是去全局安装?"

适用 · 通用判别式

判别要点which/where/Get-Command 找不到某工具 ≠ 工具没装。

验收标准

AI 助手执行步骤
  1. 用户报 which/where 某工具 not found,先别下"没装"结论。
  2. 让用户给出工具的实际调用方式:文档里是 npx --package ... 还是 python -m ... 还是包装脚本?这是判定关键。
  3. 若调用方式是 npx/python 模块 → 告知用户"这类工具通常不依赖全局命令名,which 失败不能证明没装;先按原始命令验证"。
  4. 让用户用原始命令直接跑一次验证;若工具在框架内部调用,让用户翻运行记录看历史有无成功调用。
  5. 确认能用则明确告知"无需全局安装",避免白装;只有调用方式对、历史也从没成功,才建议按文档安装。
Codex 总用英文回你?先用 AGENTS.md 把回复语言固定住

现象

很多小白第一次用 Codex,会把两件事混在一起:

最常见的坑是:明明想让 AI 用中文回复,却一直去找“界面语言设置”;或者在项目里临时说了一句“用中文”,下一次开新会话又变回英文。

这两件事要分开处理:界面语言归产品设置,回复语言归指令文件。

根因

关键认知:AGENTS.md 控制的是 Codex 做事和回复的指导原则,不等于 UI 语言包。

OpenAI Codex 官方 manual 里明确写了几件事:

所以,如果你要解决“AI 回复英文”,最稳的是写一条持久中文回复规则,而不是反复在每次对话里提醒。

先判断(动手前先确认)

先看你到底要改哪一种“英文”:

一句话:想改“AI 怎么说话”,写 AGENTS.md;想改“界面怎么显示”,找产品设置。

一步一步做

### A. 让所有 Codex 会话默认中文回复

  1. 找到你的 Codex home 目录:
  1. 新建或编辑 AGENTS.md
  2. 写入:
## Communication

- Always respond in Chinese.
- 默认用中文解释、总结和写代码注释。
- 命令、API 名称、错误原文和文件路径保持原样,不要硬翻译。
  1. 重新打开 Codex 会话,让它重新加载指导文件。
  2. 问一句:“请总结你当前加载的沟通规则。”如果它能用中文说出规则,就说明生效。

### B. 只让某个项目默认中文

如果你只想让某个项目用中文回复,就在项目根目录AGENTS.md,写同样的 Communication 规则。

项目级 AGENTS.md 适合团队协作,因为它跟着仓库走;全局 ~/.codex/AGENTS.md 适合你个人所有项目默认中文。

### C. Codex App 里怎么改

如果你用 Codex App,可以在 Settings 里写 custom instructions。官方 manual 说明:编辑 custom instructions 会更新你的个人 AGENTS.md

适合写:

默认用中文回复。解释、总结、代码注释用中文;命令、API 名称、错误原文和文件路径保留原文。

### D. IDE 扩展界面语言不要和回复语言混在一起

Codex IDE extension 有一个 chatgpt.localeOverride 设置,官方说明它是“Codex UI 的首选语言”;留空则自动检测。

注意:这类 UI 设置影响的是界面显示,不等于强制 AI 回复中文。AI 回复语言仍然建议用 AGENTS.md 固定。

常见误区

交给 AI 助手时怎么说

"我想让 Codex 默认用中文回复。请先判断我应该改全局 ~/.codex/AGENTS.md,还是只改当前项目的 AGENTS.md。请帮我写一个最小规则:解释、总结和代码注释默认中文,但命令、API 名称、错误原文、文件路径保留原文。不要修改密钥或系统设置。"

适用 · 通用判别式

判别要点:先分清 UI 语言和回复语言。

验收标准

参考来源

本条为公开官方文档的脱壳重写;UI 设置名称可能随版本变化,实际操作以当前 Codex App / IDE extension 界面为准。

AI 助手执行步骤
  1. 先问清用户要改的是“AI 回复语言”还是“界面显示语言”。
  2. 如果是 AI 回复英文:
  • 说明用 AGENTS.md 固定回复语言;
  • 判断全局还是项目级;
  • 给出最小中文回复规则;
  • 提醒重开会话验证。
  1. 如果是 UI 英文:
  • 说明 AGENTS.md 不负责 UI 语言;
  • 引导用户查看当前 App / IDE extension 的设置;
  • 不代删缓存、不代改系统语言、不代做高风险配置。
  1. 验证时让用户问:“请总结当前沟通规则。”如果 Codex 用中文回答且保留命令/API/错误原文,算通过。
装 AI 工具总卡住?npm 超时一招搞定

现象

跟着教程装 AI 工具,命令行敲 npm installnpm install -g 某个包,进度条卡死,最后报:

npm ERR! network context deadline exceeded

或者干脆挂在那儿十几分钟不动。明明开着科学上网,浏览器能打开网页,偏偏 npm 装不上。这是国内玩 AI 工具的头号拦路虎——Cursor、Claude Code、飞书 lark-cli、小程序自动化工具,装的时候几乎都会撞上。

根因

关键认知:npm 默认根本不走你的系统代理。

所以"我明明开了代理"≠"npm 走了代理"。这是两回事。

先判断(动手前先确认)

国内 npm install 卡住 / 超时,很常见的原因是 npm 没走代理,而不是包本身有问题。先做两个确认:

一句话:只要在国内 npm 卡住,先按"代理没走"排查,通常最快定位。

一步一步做

  1. 看一下本地代理地址和端口(在代理软件界面里看,形如 <你的代理地址:端口>;不要照抄别人的端口)。
  2. 给这次安装显式带上代理参数重跑(把端口换成你自己的):
npm install -g <包名>@latest --proxy http://<你的代理地址:端口> --https-proxy http://<你的代理地址:端口>
  1. 带代理后如果秒装成功 → 确认就是代理问题,收工。
  2. 一劳永逸(不想每次都带参数)→ 换国内镜像源:
npm config set registry https://registry.npmmirror.com
  1. 换完后普通的 npm install 不再需要代理参数(镜像源在国内,直连就快)。

常见误区

交给 AI 助手时怎么说

"我在国内用 npm install -g <包名>,报 context deadline exceeded / 一直卡住装不上。我开了代理(地址和端口是 <你的代理地址:端口>),浏览器能正常上网。请帮我生成一条带 --proxy 参数的安装命令,并说明怎么一劳永逸换成国内镜像源(registry.npmmirror.com)。"

适用 · 通用判别式

判别要点:只要你在国内用 npm install 出现 context deadline exceeded 或长时间卡住 → 优先怀疑 npm 没走代理。

验收标准

AI 助手执行步骤
  1. 检查用户报错是否含 context deadline exceeded / ETIMEDOUT / npm 长时间卡住等关键词 → 命中即按代理问题处理。
  2. 询问/检测用户本地代理地址和端口,生成带 --proxy http://<你的代理地址:端口> --https-proxy http://<你的代理地址:端口> 的安装命令。
  3. 若用户希望一劳永逸,建议执行 npm config set registry https://registry.npmmirror.com 换国内镜像。
  4. 重跑安装命令验证:成功(不再超时)即解决;仍失败则排查代理本身是否开启、端口是否正确、或镜像源是否可达。

配音/数字人

数字人脸部变形口型对不上?查一下音频是不是被裁短了

现象

用音频驱动口型的数字人方案(Musetalk / Wav2Lip / SadTalker 这类),生成出来的视频要么音频嘈杂、要么人物脸部变形扭曲、要么嘴巴动的跟说的话对不上。源视频明明是好的,配音也是好的,合在一起就崩了。

根因

关键认知:这类数字人是"音频驱动"的——它按音频的时长和节奏去驱动嘴型。 一旦音频时长和视频时长对不上,整个口型同步就会错乱。

最常见的情况:原始音频(比如 39 秒)在某个环节被裁剪 / 压缩成了很短的一段(比如 6 秒),而源视频是 64 秒。短音频去驱动长视频,引擎为了凑时长就会拉伸 / 错位,结果就是口型对不上、脸部变形、音频变质。

换句话说:不是模型不行,是你喂给它的音频被悄悄"瘦身"了。

先判断(动手前先确认)

所有"音频驱动口型"的数字人,只要出现口型错位 / 脸部变形 / 音频嘈杂,第一怀疑是音频时长 vs 视频时长不匹配,而不是模型参数或源视频质量。一条命令定性——分别取两边时长:

ffprobe -i <音频>
ffprobe -i <视频>

一句话:口型崩了,先 ffprobe 对一下两边时长,别先调模型。

一步一步做

核心一条:保证驱动音频的时长完整,覆盖视频需要口型的整段,不要被裁剪。

  1. 生成前先确认音频时长和视频时长:用 ffprobe 看一下两边各是多少秒。
  2. 音频时长应≥ 视频里需要口型的段落时长,缺失部分口型会错位。
  3. 如果发现音频被前面的流程(TTS 截断、转码压缩、格式转换)裁短了 → 回去修那个环节,把完整音频拿出来再用。
  4. 不要为了省事手动把音频剪到很短再合成——短音频驱动长视频,很容易被拉伸 / 错位。

常见误区

交给 AI 助手时怎么说

"我用音频驱动口型的数字人(Musetalk / Wav2Lip / SadTalker 这类)生成视频,出现口型对不上、脸部变形、音频嘈杂。请帮我用 ffprobe 分别查看驱动音频和源视频的时长,判断是不是音频被裁短了;如果是,告诉我怎么回溯上游(TTS 是否截断、转码是否压缩)取完整音频重新合成。"

适用 · 通用判别式

判别要点:所有"音频驱动口型"的数字人,只要出现口型错位 / 脸部变形 / 音频嘈杂,第一怀疑音频时长 vs 视频时长不匹配,而不是模型参数或源视频质量。

验收标准

本条截至发布日有效(音频驱动口型是这类方案的通用原理,长期稳定)。

AI 助手执行步骤
  1. ffprobe -i <音频>ffprobe -i <视频> 分别取两边时长。
  2. 比对:若音频时长 < 视频口型段时长 → 判定命中本坑,向用户说明"音频被裁短导致驱动错乱"。
  3. 回溯音频来源(TTS 是否截断、转码是否压缩、格式转换是否裁短),取完整音频重新生成。
  4. 复查合成后视频:口型与语音对齐、无脸部变形、音频清晰即解决;若时长本就匹配,再查采样率 / 格式 / 源视频质量。
AI 配音长文案生成失败?多半是超长被截断了

现象

把一篇长文章(比如几千上万字的讲稿)一次性丢给 AI 配音,结果要么直接报错生成失败,要么"生成成功了"但听下来发现后半段内容没了——音频莫名其妙变短,结尾内容丢失。更坑的是有些接口不报错,直接静默裁剪,你以为成功了,其实交付的音频已经缺斤短两。

根因

关键认知:几乎所有 TTS 接口对"单次请求的文本长度"都有硬上限,超过就失败或被截断。

先判断(动手前先确认)

TTS 处理长文本,凡是"失败"或"音频比预期短 / 内容缺失",第一怀疑对象是超长被截断,而不是网络或模型问题。两个动作就能定性:

一句话:长文本一次性塞必失败或残缺,先量长度,别赌一次成功。

一步一步做

生成前先量一下文本有多长,超限就分段,不要赌一次性成功。

  1. 先算字数:len(text)
  2. 超过你所用接口的上限(查官方文档,常见 1 万字符左右)→ 主动切成几段,每段单独生成一个音频,最后拼接。
  3. 切分时尽量在句号 / 段落处切,别从半句话中间切断,否则拼接处不自然。
  4. 每段生成后核对:该段音频时长是否与文本长度匹配(防静默裁剪),缺失则补生成。

伪代码思路:

MAX = 10000  # 你所用接口的字符上限
if len(text) > MAX:
    chunks = split_at_sentence(text, MAX)  # 按句号切,每段不超 MAX
    audios = [tts(c) for c in chunks]
    final = concat(audios)
else:
    final = tts(text)

常见误区

交给 AI 助手时怎么说

"我有一篇约 <字数> 字的讲稿要 AI 配音,用的 TTS 接口单次上限约 <上限字数> 字。请帮我写一段 Python:先 len(text) 判断是否超限,超限就按句号切成每段不超过上限的小段、逐段生成、最后拼接音频;并在每段生成后核对音频时长与文本长度是否匹配,以防静默截断。"

适用 · 通用判别式

判别要点:TTS 处理长文本时,凡是"失败"或"音频比预期短 / 内容缺失",第一怀疑对象就是超长被截断,而不是网络或模型问题。

验收标准

本条截至发布日有效(各 TTS 接口都有长度上限,具体数值以官方文档为准)。

AI 助手执行步骤
  1. 获取待生成文本,len(text) 算字符数。
  2. 查 / 确认当前 TTS 接口的单次字符上限(默认按 10000 估算,提示以官方文档为准)。
  3. 判断:未超限 → 直接生成;超限 → 按句号 / 段落切分成 ≤ 上限的多段。
  4. 逐段生成,并在每段后核对:该段音频时长是否与文本长度匹配(防静默裁剪),缺失则补生成。
  5. 全部段音频按原文顺序拼接,复查整体内容完整、拼接顺畅。
AI 配音停顿太长不自然?改几个标点就好了

现象

用 AI 配音(TTS)把文案转成语音,听下来总觉得"一顿一顿的"——每句话之间停特别久,整个音频拖沓、不连贯。明明文案读着挺顺,生成出来却像机器人一句一句往外蹦。更迷惑的是:同样一段话,只是换了个排版(比如把"一句一行"改成"一段连写")重新生成,节奏居然差了一大截,停顿从十几秒缩到几秒。

根因

关键认知:TTS 引擎是按你文本里的"换行符"和"标点"来决定停顿时长的,不是按语义。 你以为只是排版好不好看,对引擎来说每个符号都是一条"停几秒"的指令:

坑就在这:如果你习惯每写一句就敲回车(一句一行),6 个换行 = 累计约 12 秒的停顿堆在音频里。文案"看起来"很整齐,听起来却稀碎。

先判断(动手前先确认)

AI 配音出现"停顿过长 / 不连贯",第一件事不是换模型、不是调参数,而是回去看文案的换行和标点。两个动作就能定性:

一句话:只要停顿怪,先查换行,别先怪模型。

一步一步做

记住一个排版原则:段落之间才空行,段落内部坚决不换行。

  1. 段落和段落之间用空行(\n\n)隔开。
  2. 段落内部一口气写完,不要每句一回车。
  3. 冒号后面直接跟内容,不要再换行(很多人爱在"提示:\n"后换行,这就是停顿元凶)。
  4. 并列的词用顿号代替逗号,节奏更紧凑("苹果、香蕉、橘子"比"苹果,香蕉,橘子"快)。

如果想程序化批量优化,一句话搞定(把多余换行压成标点):

optimized = raw_text.replace('\n\n', '。').replace('\n', ',')

改完后用新文案重新生成一遍 TTS,对比停顿时长。

常见误区

交给 AI 助手时怎么说

"我有一段要 AI 配音的文案,生成出来停顿太长、一顿一顿的。请帮我按'段落之间空行、段落内部不换行、冒号后不换行、并列词用顿号'的规则重排这段文案,并给出一个 Python 一行命令把多余换行压成标点(\n\n\n)。文案是:<贴你的文案>"

适用 · 通用判别式

判别要点:只要 AI 配音出现"停顿过长 / 不连贯",第一件事不是换模型、不是调参数,而是回去看文案的换行和标点

验收标准

本条截至发布日有效(标点 / 换行决定停顿是各 TTS 引擎的通用机制,长期稳定)。

AI 助手执行步骤
  1. 获取用户文案原文,先看排版:若是"一句一行"(换行密集,每句一行)→ 高概率命中"换行导致长停顿"。
  2. 数换行符 \n 数量,向用户说明根因:换行被引擎当成"长停顿指令",越密累计停顿越长。
  3. 按"段落间空行、段内不换行、冒号后不换行、并列词用顿号"规则重排文案,输出给用户。
  4. 若需批量处理,套用 raw_text.replace('\n\n', '。').replace('\n', ','),并提示边界:段落之间仍应保留空行区分层次。
  5. 指引用户用重排后的文案重新生成 TTS,对比停顿时长验证(应明显缩短、更自然)。

电脑/Windows

双击 .bat 黑框一闪就没了?换行和编码的坑

现象

写了个 .bat 批处理脚本(比如一键启动某个程序),双击它,黑色命令行窗口"闪"一下就消失了,脚本根本没执行。你反复检查命令没写错,可就是跑不起来。用编辑器打开看内容明明好好的。

根因

关键认知:Windows 的 cmd 命令行对 .bat 文件有两个硬要求,现代编辑器默认都不满足。

  1. 换行必须是 CRLF(\r\n,不能是 LF(\n)。
  1. 中文内容必须是 GBK 编码,不能是 UTF-8。

两个坑任意一个都会让 .bat 双击秒退。

先判断(动手前先确认)

双击 .bat 黑框一闪就没,高频原因是换行或编码问题,也可能是命令本身报错。先做一步排除:

一句话:手动敲能跑、双击闪退 → 别改命令,去修换行和编码。

一步一步做

  1. .bat 里的命令行整理成一个列表(Python 的 lines),方便一次性生成。
  2. 用 Python 强制 GBK 编码 + CRLF 换行重新生成,覆盖原文件:
lines = [
       "@echo off",
       "echo 正在启动...",
       "node 你的程序.js",
       "pause",
   ]
   content = ('\r\n'.join(lines) + '\r\n').encode('gbk')
   open('启动.bat', 'wb').write(content)
  1. 抓两个关键点:'\r\n'.join(...) 让每行用 CRLF 换行;.encode('gbk') 让中文按 GBK 编码,wb 二进制写入(别用文本模式,否则又会被改回)。
  2. 双击重新生成的 .bat,黑框应正常停留、命令执行、中文不乱码。
  3. 不想写代码 → 在编辑器里手动把换行改 CRLF、编码改 GBK/GB2312 再保存(容易忘、下次保存又被打回,不推荐)。

常见误区

交给 AI 助手时怎么说

"我写了个 Windows .bat 脚本,双击黑框一闪就退、没执行。命令内容是这几行:<粘贴每行命令>。请用 Python 帮我生成一个强制 GBK 编码 + CRLF 换行的版本(wb 二进制写入覆盖原文件),保证中文不乱码、能正常双击运行。"

适用 · 通用判别式

判别要点:Windows 下双击 .bat 黑框一闪就没,常见原因是换行(LF vs CRLF)或编码(UTF-8 vs GBK)问题,但仍要先排除命令本身报错。

验收标准

AI 助手执行步骤
  1. 用户报 .bat 双击闪退,先让其把命令逐行在 cmd 手动敲一遍:能跑 → 判定为换行/编码问题,不是命令错。
  2. 取用户原 .bat 的命令行内容(整理成 lines 列表)。
  3. ('\r\n'.join(lines) + '\r\n').encode('gbk') + wb 重新生成 .bat,覆盖原文件。
  4. 让用户重新双击验证:黑框停留、命令执行、中文不乱码即解决;若仍闪退则检查是否漏了 CRLF 或用了文本模式写入。
改了配置'重启'却没生效?你可能根本没真重启

现象

你改了某个服务的配置,或者装了东西要求"重启生效",于是关机、再开机。结果发现:服务还是老样子、配置没读进去、问题依旧。你以为重启没用,甚至怀疑是配置写错了,反复折腾。查一下系统的"上次启动时间",居然还是好几天前——根本没更新。

根因

关键认知:Windows 8 以后的"关机再开机",其实不是真正的重启,而是"混合休眠"。

简单说:关机再开 ≈ 睡一觉醒来接着干;重启 ≈ 彻底重新开始。 它俩对系统来说不是一回事。

先判断(动手前先确认)

"重启后该生效却没生效",先怀疑根本没真重启,而不是配置或软件问题。一条命令就能定性——查上次启动时间有没有更新到"刚才":

(Get-CimInstance Win32_OperatingSystem).LastBootUpTime

一句话:先看 LastBootUpTime 有没有更新,没更新就是快速启动的锅。

一步一步做

  1. LastBootUpTime(上面命令),确认系统到底有没有真启动过。
  2. 若没更新 → 做真正的重启:开始菜单点"重启"(不是"关机"),或命令行执行:
shutdown /r /f /t 0

/r = 重启,/s 才是快速启动式关机,别搞混。)

  1. 如果不想重启整台机器,只想刷新某一个服务:用管理员 PowerShell 执行 Restart-Service <服务名>(需要管理员权限)。
  2. 一劳永逸关掉快速启动:控制面板 → 电源选项 → 选择电源按钮的功能 → 更改当前不可用的设置 → 取消勾选"启用快速启动"。之后关机再开就是真重启了。
  3. 重启后再查一次 LastBootUpTime,应已更新为当前时间,服务/配置随即生效。

常见误区

交给 AI 助手时怎么说

"我在 Windows 上改了 <服务/配置名> 的配置,按要求重启后没生效。请帮我用 PowerShell 查 LastBootUpTime 确认到底有没有真的重启,并告诉我怎么真正重启(shutdown /r)或只刷新这一个服务(Restart-Service),以及怎么永久关掉快速启动。"

适用 · 通用判别式

判别要点:凡是"重启后应该生效却没生效",先怀疑根本没真重启(快速启动捣鬼),而不是配置或软件问题。

验收标准

AI 助手执行步骤
  1. 用户报"重启没生效",先查 LastBootUpTime:PowerShell (Get-CimInstance Win32_OperatingSystem).LastBootUpTime
  2. 若该时间未更新到最近 → 判定是快速启动,用户做了"关机再开"而非"重启"。
  3. 指引用户执行真正的重启:shutdown /r /f /t 0,或管理员 Restart-Service <服务名>(仅刷单个服务);可选建议永久关掉快速启动。
  4. 重启后再查 LastBootUpTime 应已更新,确认服务/配置生效。
电脑突然卡死只能断电?先别急着送修,九成是内存满了

现象

电脑用着用着突然画面冻结、鼠标键盘全无反应,只能长按电源键强制断电重启。而且会反复发作。第一反应往往是:"是不是 CPU 坏了?内存条故障?电源不行?过热?"于是跑去跑内存诊断、换驱动、刷 BIOS,折腾一圈没用。

根因

关键认知:这类"硬死机"(无蓝屏、只能断电)里,内存耗尽是很常见、也最值得先排查的原因之一。

典型元凶(尤其在装了一堆 AI 工具的电脑上):

先判断(动手前先确认)

第一步建议先做"定性":先区分硬件证据和内存耗尽证据,别盲目送修。 硬件故障通常会留下一些线索,先排三项:

三项全没有 → 硬件故障概率下降,转去查内存耗尽。一句话:无蓝屏的硬死机,先查内存,别急着判硬件、别急着送修。

一步一步做

  1. 先排硬件三项:蓝屏 minidump(C:\Windows\Minidump\ 是否空)、显卡 TDR(Event 4101)、WHEA 硬件错误。
  2. 三项全无 → 查内存耗尽诊断(这条命令会直接点名是谁吃了最多内存):
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-Resource-Exhaustion-Detector'} -MaxEvents 4 | Format-List TimeCreated,Message
事件 ID 2004 = 内存耗尽诊断,消息里会直接写出"某某进程占了多少字节",一眼定位元凶。
  1. 按 Event 2004 点名的进程,关掉或限制它(限 WSL2 内存、卸载不用的语言服务器扩展、给开发工具限内存)。
  2. 装个内存看门狗(可用内存低于阈值时告警 / 自动清理大进程),防止再次悄悄吃满。
  3. 治本:让后台服务改成"一个进程服务多个客户端"的形态,别每个客户端各起一份、留孤儿进程。

常见误区

交给 AI 助手时怎么说

"我的 Windows 电脑经常硬死机(画面冻结、鼠标键盘无反应,只能断电重启),没有蓝屏。装了不少 AI 工具和 Docker/WSL2。请帮我用 PowerShell 先排除硬件故障(查 C:\Windows\Minidump\ 蓝屏、显卡 TDR、WHEA 错误),再查 Event 2004 内存耗尽诊断,定位是哪个进程吃满了内存,并给出限制 WSL2 内存和清理后台孤儿进程的具体办法。"

适用 · 通用判别式

判别要点:电脑硬死机(无蓝屏、强制断电才恢复),先查内存耗尽(Event 2004),别急着判硬件

验收标准

AI 助手执行步骤
  1. 用户报硬死机,先排硬件三项:查蓝屏 minidump(C:\Windows\Minidump\ 是否空)、显卡 TDR(Event 4101)、WHEA 错误。
  2. 三项全无或没有明显硬件证据 → 跑 Event 2004 命令,读出吃内存最多的进程名 + 字节数。
  3. 据此指引用户:关掉/限制元凶进程(WSL2 限内存、卸无用扩展、给开发工具限内存)。
  4. 建议装内存看门狗(低内存告警/清理),治本建议后台服务改单进程多客户端形态;跟踪内存占用是否稳定在 90% 以下、死机是否不再复发。

进阶

用代码调 AI 大模型慢得离谱?可能是被系统代理绕了远路

现象

你用代码(Python 的 openai SDK / httpx)调用国内的大模型接口(智谱 GLM、通义、百度等,服务器都在国内,本来该很快),结果一次调用要等好几分钟,甚至等到连接超时被中断。但你用命令行 curl 直接调同一个接口,明明是秒回的。代码里也没设奇怪的超时,就是莫名其妙地慢。

根因

关键认知:openai SDK 底层用 httpx,httpx 默认会读系统的代理环境变量(HTTP_PROXY / HTTPS_PROXY)。

换句话说:不是大模型慢,是你的请求被系统代理"绑架"去绕了一圈。

先判断(动手前先确认)

用 openai / httpx SDK 调国内大模型,凡是"代码慢、curl 快",第一怀疑是被系统代理绕路。两个动作定性:

一句话:curl 快、SDK 慢,先查 httpx 是不是偷偷走了系统代理。

一步一步做

一行代码解决:让 httpx 忽略系统代理、直连国内大模型接口。

import os
import httpx
from openai import OpenAI

# 关键:trust_env=False → 不读系统代理,直连
http_client = httpx.Client(trust_env=False, timeout=60.0)
client = OpenAI(
    api_key=os.environ["MODEL_API_KEY"],  # 密钥只放本机环境变量,示例不写明文
    base_url="https://open.bigmodel.com/api/paas/v4",  # 以智谱为例
    http_client=http_client,
)

两个要点:

常见误区

交给 AI 助手时怎么说

"我用 Python 的 openai SDK(底层 httpx)调用国内大模型接口,一次调用要等好几分钟甚至超时,但命令行 curl 同一个接口是秒回。程序跑在 <带系统代理的 Windows / 服务 / 容器>。请帮我写一段代码:用 httpx.Client(trust_env=False, timeout=60.0) 忽略系统代理直连,传给 OpenAI(http_client=...),并解释为什么 curl 快而 SDK 慢。"

适用 · 通用判别式

判别要点:用 openai / httpx SDK 调国内大模型,凡是"代码慢、curl 快",第一怀疑被系统代理绕路

验收标准

本条截至发布日有效(httpx 默认 trust_env=True 是其长期行为)。

AI 助手执行步骤
  1. 用户报"SDK 调国内大模型慢、curl 快" → 判定系统代理绕路。
  2. 确认程序运行环境是否设了 HTTP_PROXY / HTTPS_PROXY(Windows 服务继承系统环境、容器、开发机代理)。
  3. 给出修复:构造 httpx.Client(trust_env=False, timeout=60.0) 传给 OpenAI(http_client=...)
  4. 重跑验证:调用时长应从分钟级降到秒 / 十几秒级,无超时 drop;若仍慢,再查 base_url 是否指向国内直连地址。
AI 工具接自己的大模型,怎么总走错通道、烧错额度?

现象

你在某个 AI 编程工具里配置了自己的大模型(比如想用智谱 GLM 的套餐,便宜),结果出现怪事:要么配置完根本看不到自己加的模型;要么看到了但用的是工具内置的那个(走的是工具官方额度,不是你买的套餐,钱白花);要么一调用上游就报"模型不存在"。明明填得没错,就是拧不到一起去。

根因

关键认知:这类问题往往是三个条件叠加造成的死结,工具配置层怎么调都解不开:

  1. 工具把你填的"模型 id"直接当成 API 请求里的 model 名发出去,没有"id 不等于 API 名"的映射机制。
  2. 工具的云端已经内置了一个同名的模型 id(比如内置名叫 <套餐方精确模型名>),优先级还高于你自定义的——你自定义的同名 id 会被云端压制。
  3. 你的模型套餐方只认精确的 model 名(比如只认 <套餐方精确模型名>,你填个 <随手改的显示名> 它就说"模型不存在")。

三者一对:id 不能跟内置重名(否则被压制),但又必须发套餐方认的精确名(否则报不存在)——矛盾,配置层无解。

先判断(动手前先确认)

在 AI 工具里配自定义大模型,凡是"看不到 / 看到内置的 / 走错额度 / 上游报模型不存在",先查这四问:

前三个同时命中 → 配置层无解,直接上本地中转,别在配置里死磕。

一步一步做

破解办法是加一层本地中转,把矛盾转移到中转层解决:

  1. 写一个零依赖的本地中转脚本(Node / Python 都行),监听一个只在本机访问的中转地址(文档里写 <你的本机中转地址> 占位,不写真实端口)。
  2. 工具里自定义模型 id 起个不跟内置重名的名字(比如 <不重名的显示ID>),URL 指向 <你的本机中转地址>
  3. 中转脚本收到请求后,把 model 名改写回套餐方认的精确名(<套餐方精确模型名>),注入只保存在本地的套餐 key,再转发给套餐方,结果原样流式返回。
  4. 套餐 key 只写在本地中转脚本或本机环境变量里,工具的配置里用占位符(local-proxy 之类)。

这样:工具看到的是不重名的 id(不被压制),套餐方收到的是精确名(不报错),key 只留在本机中转层(安全)。

中转脚本核心逻辑(示意,key、地址与端口都用占位符,换成你自己的):

# 仅示意:收到工具请求 → 改写 model 名 → 注入本地套餐 key → 转发 → 流式返回
LOCAL_KEY  = "<你的套餐KEY占位符>"        # 只放本机脚本或环境变量,不上传到工具配置
REAL_MODEL = "<套餐方精确模型名>"         # 套餐方认的精确名
UPSTREAM   = "https://<套餐方域名>/v1"    # 套餐方真实地址

def handle(request):
    request["model"] = REAL_MODEL        # 把显示 ID 改回套餐方精确模型名
    request.headers["Authorization"] = "Bearer " + LOCAL_KEY
    return stream_forward(UPSTREAM, request)  # 原样流式返回

常见误区

交给 AI 助手时怎么说

"我在 AI 编程工具里配自定义大模型,出现 <看不到 / 看到内置 / 走错额度 / 上游报模型不存在>。套餐方只认精确 model 名 <精确名>,但工具云端已内置同名 id 会压制我。请帮我写一个零依赖的本地中转脚本(Python / Node):监听 <你的本机中转地址>,把工具发来的 model 名改写回 <精确名>,注入本地套餐 key(只放本机脚本或环境变量里),转发到套餐方并原样流式返回;并告诉我工具里自定义 id 起什么不重名的名字、URL 怎么填。"

适用 · 通用判别式

判别要点:在 AI 工具里配自定义大模型,凡是"看不到 / 看到内置的 / 走错额度 / 上游报模型不存在",先查这四问:

适用于所有"AI 工具接自定义 / 第三方大模型"撞内置 id 的场景。

验收标准

本条截至发布日有效(各工具的模型配置机制会迭代,核心判别式长期适用)。

AI 助手执行步骤
  1. 确认症状:自定义模型看不到 / 看到内置 / 走错额度 / 上游报不存在 → 进入判别。
  2. 四问核对:显示 id 是否 = API model 名、云端是否内置同名、套餐方是否只认精确名、key 是否直接填在工具配置里。
  3. 前三问同时命中 → 指引用户写本地中转脚本:监听本机中转地址、model 名改写回精确名、注入本地 key、流式转发(key、地址与端口都用占位符)。
  4. 工具配置改指中转 URL + 不重名的 id;套餐 key 只放本地脚本或本机环境变量,工具配置用占位符。
  5. 验证:调用走自己套餐额度、无"模型不存在"报错、key 未泄露即解决。

想让 AI 助手自动用这些经验?

「晓峰·AI 工具技能卡包」— 你的 AI 助手能直接调用的技能卡

小红书搜「晓峰AI增长实验室」或在豆包搜「晓峰AI避坑助手」

想持续更新 + 全量经验 + 答疑 → 升级「晓峰AI工具库」订阅