# xueai.miyang.cn 全站课程正文 > 洛小山的 AI 实战课全部课程正文合集。免费章节为全文,受限章节为预览(全文包含在对应页面的 HTML 中)。目录见 https://xueai.miyang.cn/llms.txt ## 先选一条适合你的路(入门与定位) URL: https://xueai.miyang.cn/slides/roadmap.html 466 节课,你不必都学 课程做全是我们的事,学多少是按你的目标算的事。下面五档按目标划好了范围,从 113 节到 466 节:点卡片看每档覆盖哪些篇章、跳过什么、为什么可以跳。选好路线后,课程目录会自动精简成你这条路的内容。目录顶部随时可以换道或切回完整目录,进度都在。 五档学习路线按目标划好范围:只想会用 AI、把 AI 用到专业、做 AI 产品、自己动手搭、全都要。选完课程目录自动精简,随时能改 只想会用 AI 不写代码,也不做 AI 产品,就想让它真的替你省时间。学完你会知道它什么时候靠谱、什么时候在编,以及怎么问才问得出东西。 把 AI 用到专业 不做产品也不写代码,但想把 AI 用成真正的生产力。在会用的基础上补上大模型原理和完整的 Vibe Coding 方法论——知道它为什么会编、怎么立规矩,让它替你干活时稳得住。 做 AI 产品 产品经理、设计师、运营,要跟工程师对齐方案、判断可行性、算成本。学完你在设计评审上说得出取舍依据,不再被一句「技术上做不了」打发。 自己动手搭 工程师或重度玩家,要亲手把 Agent 写出来、部署上线。全部正课一节不落,实战主线的六个里程碑全程跟练,三个硬核源码专题留到有余力再看。 全都要 不做取舍,连三个硬核专题一起吃下:Grok Build 的 Rust 源码、DeepSeek Harness 的 TypeScript 插件内核,以及开源模型的蒸馏与本地部署。看完这三块,市面上的 Coding Agent 你都能拆开看。 实线高亮的整章都要学,虚线的这一章只挑了一部分(后面标着挑了几节),变淡的是这条路明确建议跳过的。那些内容本身没问题,你的目标用不上而已。 为什么这么划 「只想会用」跳过全部原理和工程内容,只学怎么把 AI 用对:它在干什么、为什么会编、怎么问才问得出东西、什么能放心交给它。除了零基础入门篇,Harness 核心篇的上下文工程、Prompt 工程、实用技巧这三个主题也在里面;协作方法论篇挑了三节讲怎么跟 AI 立规矩、长对话怎么不跑偏,不写代码也天天用得上。 「把 AI 用到专业」在会用的基础上补两块:大模型原理整篇——知道它为什么会编、边界在哪,用起来才有判断力;协作方法论整篇——四步流程、验收标准、环境安全这套规矩,是让 AI 稳定替你干活的关键。再带上编程基础篇讲词表与向量的两节,知识库检索为什么会漏,你会有直觉。仍然跳过全部工程实现和产品设计的内容。 「做 AI 产品」在「用到专业」的基础上补齐 Harness 全套、设计模式与评测,加上成本工程和自测中心。跟工程师对齐方案、判断可行性、算成本,靠的就是这几块。跳过代码走查、长运行 Agent、安全容器化和三个硬核专题:动手实战篇只保留产品视角的那部分(生图的产品化清单、角色一致性、模型挂了怎么办),Agent Loop 和 MCP 的实现留给动手路线。 「自己动手搭」把全部正课吃下,包括动手实战篇的完整代码走查和自我改进篇。建议全程跟着实战主线走:每章末尾的「你现在能做什么」按三档任务做完,六个里程碑填满,学完你手上就有一个真能干活的 Agent 和一份自己的协作规范。三个源码专题不在这条路上,它们是读别人的实现,不影响你自己搭。 「全都要」在动手路线之外多三个专题共 63 节。Grok Build 解剖带你把一个生产级 Coding Agent 的 Rust 源码从入口读到工具调用;DeepSeek Harness拆的是一切皆插件的 TypeScript 底座;开源、蒸馏与本地部署讲开源模型到底开了什么、大模型怎么变小、怎么在自己机器上跑起来。这三块难度最高,也最能拉开差距。 选好了就出发 不确定选哪档也没关系,五档都从同一节起步,往下学两节自然就知道自己想走多深。换道零成本,进度不会丢,目录顶部随时能切。 ## 我们在哪里?达克效应(入门与定位) URL: https://xueai.miyang.cn/slides/0-intro.html 我们在哪里?达克效应 达克鲁宁效应 · Dunning-Kruger Effect:AI 产品经理训练营,正式开始之前先定位自己。 用达克曲线定位学员当前位置,明确课程目标:从愚昧之巅走向平稳高原 ## 怎样学,知识才能过脑子(入门与定位) URL: https://xueai.miyang.cn/slides/0-how.html 怎样学,知识才能过脑子? 这门课不缺内容,缺的是你停下来想一想的 30 秒。 看完 ≠ 学到:每个案例都要停下来反思、代入自己的业务场景、尝试输出 先说一个残酷的事实 如果你只是从头刷到尾,看完觉得「嗯,都懂了」,那大概率三天后什么都不记得。 这不是你的问题,是人脑的默认模式:输入 ≠ 理解,理解 ≠ 记住,记住 ≠ 会用。 看完 vs 学到:差在哪? 只是看完 真正学到 看到一个案例 「哦,原来可以这样」 「这个思路,我的场景能不能用?」 看到一个概念 「记住了这个名词」 「它解决的根本问题是什么?」 看到一个踩坑 「别人踩了,我知道了」 「我的项目里有没有类似的坑?」 看完一节课 「下一节」 「等等,让我用自己的话复述一遍」 三步循环:让知识真正长在脑子里 看到:带着问题看,不要无脑刷 每打开一页之前,先问自己:这个主题跟我现在做的事有什么关系?哪怕暂时想不出来,这个问题本身就会让你的注意力聚焦。 反思:每看完一个知识点,停 30 秒 不要急着翻下一页。问自己三个问题: 1. 这个概念解决的根本问题是什么? 2. 如果不知道这个,我之前会怎么做? 3. 知道了之后,我的做法会有什么不同? 迁移:代入你自己的业务场景 这是最关键的一步。课程里的每一个案例、每一个设计决策,都要翻译成你的业务语言。 不同行业、不同产品形态、不同用户群体,同一个技术方案的适用性完全不同。课程教的是思考框架,不是可以照搬的答案。 输出:讲给别人听,或者写下来 费曼学习法的核心:如果你不能用简单的话讲给外行听,说明你自己也没真懂。 不需要写长文,哪怕在微信群里说一句「今天学到一个点:xxx,以前以为 yyy,其实是 zzz」,这个动作就能把知识从短期记忆推入长期记忆。 这四个动作是通用的,换成任何材料都成立。想知道把它们套到 AI 身上具体怎么做,去看 AI 教我学习 这一章:十一节课分别讲提问该带哪四个部件、怎么当场识破它一本正经说错的话、读不下去的长材料怎么拆、怎么让它出题考你,以及怎么判断自己是真学会了。 本页 Takeaway 看完 ≠ 学到:不停下来想,知识不过脑子 每看完一个知识点,停 30 秒:问自己「根本问题是什么」「我的做法会改变吗」 一定要代入自己的业务场景:课程教的是框架,不是答案 输出是最好的学习:讲给别人听、写下来、在群里说一句都算 慢就是快:认真学 10 页,比划水刷完 100 页有用 10 倍 ## 为什么要花时间讲原理(入门与定位) URL: https://xueai.miyang.cn/slides/0-why.html 为什么花这么多时间讲原理? 磨刀不误砍柴工 · 打好基础才能真正做工程化 AI 所有 Harness 操作本质都是对 message list 的处理。理解它,才能看懂所有方案 AI 所有工程化操作,本质上都是对上下文的高效处理 不管是 Prompt Engineering、RAG、Fine-tuning,还是 Agent 工具调用,所有的花活,基本上都围绕着这个 message list 处理。理解它,你才能真正判断方案好不好、问题出在哪里。 Prompt Engineering 精心构造 messages,让模型看到正确的上下文:系统指令、角色定义、少样本示例,全部是往 message list 里塞内容。 RAG 检索增强生成 从外部知识库取回相关文档片段,拼进 message list 再发给模型,本质是在运行时扩充上下文。 Agent 工具调用 模型输出 function call → 执行工具 → 把结果 append 回 message list → 再次推理。每一轮都是在积累上下文。 Fine-tuning / SFT 把大量理想的 message list 烧进模型权重,让模型默认就能按期望方式处理上下文,省去每次都要在 prompt 里说明的成本。 「Prompt 改了没用」 System Prompt 被截断、历史对话占满窗口,问题根本出在上下文管理,跟 Prompt 写得好不好没有关系。 「RAG 效果差,不知道哪环节坏了」 Chunking 粒度、Embedding 模型、相似度阈值,不了解原理就不知道该查哪里,只能瞎试。 「模型答错了,该改 Prompt 还是 Fine-tune?」 是上下文没给对,还是参数里压根没这个知识?两件事的修复方式完全不同,搞错方向浪费大量时间。 我会花比较大的篇幅讲解这部分,不推荐跳过。 理解了 message list 的处理逻辑,后面所有工程化方案你都能一眼看穿它在做什么,为什么有效,局限在哪。 ## 让 AI 帮我判断:这个建议适合我吗(开篇:稀缺的是判断) URL: https://xueai.miyang.cn/slides/learn-1.html 让 AI 帮我判断:这个建议适合我吗 AI 说年卡划算,可能只是对经常去的人划算。把时间、距离和真实习惯说清楚,答案才是在帮你做决定。 AI 说年卡划算,可能只是对经常去的人划算。把时间、距离和真实习惯说清楚,答案才是在帮你做决定。 前台把计算器转向你:年卡 2688 元,今天交钱再送两个月;月卡 399 元。销售已经把收款码放在桌上,说优惠今晚结束。 你先问 AI:「这张健身房年卡值得办吗?」它列出三条理由:平均到每个月更便宜,器械和团课都能用,办卡也更容易督促自己坚持。每句话听着都在理。 如果你准备长期锻炼,每周能去两三次,年卡通常比按月付费划算。固定场地、完整器械和团课安排,也有助于把锻炼变成习惯。 你看完就付了钱。三个月后,App 里的入场记录只有 4 次:工作日常常八点以后下班,健身房离家单程 35 分钟;周末隔一周要回父母家,最想上的团课又在七点半开始。那张「每月只要 224 元」的年卡,算下来每次已经花了 672 元。 AI 那段话没有算错。它回答的是「一个能稳定每周去两三次的人,办年卡划不划算」。你真正想问的是「按我现在的下班时间、距离和锻炼习惯,这 2688 元会不会白花」。最要紧的三条生活情况,一条都没写进问题里。 你问的是「年卡通常有什么好处」,心里想的却是「我这一年到底去得了几次」。前一句查价格、器械和团课就能回答;后一句还要知道你几点下班、来回要多久、过去两个月真正练过几次。问题里没有这些信息,AI 只能借一个常见的人来把空白补上。 答案听起来专业还不够,你的时间、距离和真实习惯也得一起算进去。 年卡平均每月 224 元确实便宜,前提是你到得了那里。漏掉这个前提,越精确的计算越容易让人放心地买错。 AI 能做的,是把同一张价目表放回你的日常里重新算。提问时先补三类信息: 你实际怎么过一周:通常几点下班,周末有多少天在家,过去两个月真正运动过几次。 去一次要付出什么:单程多久,营业时间合不合适,你想上的课能不能赶上。 哪条底线不能碰:年卡能不能退、能不能停,锻炼会不会挤掉睡眠和陪家人的时间。 这些信息不会替你作决定,却能让 AI 的每一句理由都落在真实的一周里。下面切换两种问法,看同一张年卡怎样得到两个答案。 第一句用在提问之前,负责把你的现场交代完整。第二句用在回答之后,逼它逐条说明每个判断依据来自哪里。材料可以换,句子里的四个位置保留。 先带着约束提问我在判断【要不要做什么】。现在是【谁来做、已经会什么】,手里有【现状和材料】,不能出错的是【底线】。请先把可选方案逐条对照这些条件,再给结论;如果信息不足,先问我一个问题。 拿到回答后再核一遍请把刚才的回答分成两列:左边写普遍成立的事实,右边写它在我的场景中是否成立,以及依据了我提供的哪条信息。没有依据的地方标成「还需要确认」。 放进开头那个例子时,可以这样填:工作日常在八点后下班;健身房单程 35 分钟;过去两个月只运动过 3 次;年卡付款后不能退。 第一句里,「先逐条对照这些条件,再给结论」是关键。少了这半句,AI 仍可能先给一份通用优缺点,再把你的背景放在结尾。写上它,「平均每月便宜」就得先经过下班时间、来回距离和过去的锻炼次数。 「如果信息不足,先问我一个问题」也有用。你很难一次想全所有情况,让 AI 先追问,缺口会在给结论前露出来。它问到过去一个月去了几次、最晚几点能到、年卡能不能暂停,你再去查记录和合同,不需要靠想象回答。 情况写全,只是把回答从通用建议拉回你的生活。最终仍要看证据:手机里的运动记录有几次,从公司到健身房实际要多久,想上的课几点开,年卡能不能退或暂停。AI 可以帮你列检查项,也可以指出还缺什么;这些事实要由你补进去。 先问这段话回答了谁,再问它说得对不对。 一段话即使句句正确,只要对应的人、材料和底线换了,结论就可能不能用。约束怎么继续拆成让 AI 按我的情况讲清楚,见 让 AI 按我的情况讲清楚;不涉及 AI 的学习纪律,见 怎样学,知识才能过脑子。 ## 让 AI 帮我找到下一步该问什么(开篇:稀缺的是判断) URL: https://xueai.miyang.cn/slides/learn-2.html 让 AI 帮我找到下一步该问什么 能问出答案、能指出可疑处、能问出下一问,这三层是分界。读完能认出自己停在哪一层,以及下一步写哪一句。 能问出答案、能指出可疑处、能问出下一问,这三层是分界。读完能认出自己停在哪一层。 12 份午餐,预算 800 元,周五中午 12 点送到会议室。行政同事把这行要求转给你的时候是周二上午,来开会的同事名单也一起发了过来。 你把人数、预算和送达时间发给 AI,请它配一份菜单。它很快给出一套组合: 四荤三素加一份主食,人均约 65 元;口味一半清淡、一半偏辣;另外留出 20 元买纸巾和一次性餐具。 这份答案确实有用。数量算得清,预算也留了余量,你照着餐厅页面换了两道售罄的菜,11 点前完成下单。订单截图发进群里,这件事就算办完了。 周五 11 点 58 分,餐盒刚摆上桌,一位同事看见酱汁标签,问里面有没有花生。你这才知道她对花生过敏。餐厅确认其中一道酱汁含花生碎,同一口锅也做过含花生的菜。你临时加订一份,送到时已经 12 点 36 分,她在会议室里等了38 分钟。 你当时会收工,是因为屏幕上的任务都被答上了:人数够、钱没超、时间写了。过敏信息从来没进入问题,答案自然把它当作普通的多人午餐处理。菜单的完整,让那个还没问出的条件更难被看见。 AI 完成的是你交给它的题。你给了人数、预算、送达时间,它就围着这三项优化;你没给谁不能吃什么,它无法从空白里知道现场有一位过敏者。 答案能用,只说明它完成了你已经问出的那部分。真正影响决定的条件,有些写在提问里,有些还藏在你没想到要问的地方。 这时候可以让 AI 换一个角色。先暂停继续推荐,请它检查这份方案依赖哪些尚未确认的条件,再把最要紧的一项改写成下一问。午餐这个场景里,它应当先追问有没有食物过敏、宗教饮食或其他忌口,然后提醒你向餐厅核实配料和后厨处理。 下一问把模糊的担心,变成一件可以马上去问人、查标签、找餐厅确认的事。刚才那份菜单已经能下单了,你会停在拿到答案、看出可疑,还是写出下一问这一层? 拿到一份准备采用的答案后,把它连同自己的场景一起贴回去。下面三句按顺序发,AI 就会从继续给建议,转到帮你找还没确认的条件。 先找没有写出来的条件这是我准备采用的方案:[粘贴方案]。我的场景是:[写明谁、什么时候、要做什么]。请列出这份方案成立所依赖、但我还没有确认的条件,按对结果的影响从大到小排序。先不要替我做假设。 再把最要紧的一项问出来从最关键的条件开始,一次只问我一个问题。我回答以后,你再判断该继续追问,还是进入下一个条件。 最后变成现场可以执行的核对根据我的回答,把仍需核实的事项写成清单。每一项说清该问谁、查什么,以及看到什么结果才能继续采用这份方案。 第一句里的「先不要替我做假设」是关键。少了这半句,AI 可能会自行补上「大家没有忌口」之类的默认条件,未知项又会被一段顺畅的文字盖住。 「这份菜单可能有问题」只是感觉,到了下单那一刻仍然不知道该停在哪里。把它往前推,需要连续回答三件事: 圈出会改变决定的那句话,比如这份菜单默认所有人都能吃。 写明还缺哪个现场条件,这里缺的是 12 个人各自的过敏和忌口信息。 指定核实动作和通过标准,先逐人确认,再让餐厅明确配料与后厨处理,确认能避开相应食材才下单。 这三层是一个经验分界,没有实验数字。翻自己的笔记时,可以在每条答案旁边补一句:「这条建议放到我的场景里,还缺哪个条件没确认?」写不出来,就让 AI 按上面的模板一次问你一个。 下一问需要带哪些信息,见 让 AI 按我的情况讲清楚。想检查自己是否真正理解,见 讲得清那一关。 ## 让 AI 按我的情况讲清楚(提问:把讲义变成考卷) URL: https://xueai.miyang.cn/slides/learn-3.html (以下为免费预览,全文见页面) 让 AI 按我的情况讲清楚 锚点、场景、出题、预警,每缺一个,回答就少一块。四句模板可以直接抄走。 锚点、场景、出题、预警,每缺一个,回答就少一块。四句模板可以直接抄走。 第二件七折,还是两件一起八五折。周末优惠的两个选项并排摆在页面上。你在给书房挑收纳盒,看中的两个标价 120 元和 80 元。 你想先把百分数弄明白,于是打开 AI,打了一句平时很正常的话。 给我讲讲百分数。 它从百分数的定义讲到小数换算,还举了考试正确率的例子。每一步都能看懂。你看见七折对应 70%,八五折对应 85%,顺手选了数字更小的七折,觉得这个方案省得更多。 周六上午 10 点 25 分,你到店里结账。第二件七折要付 176 元;两件一起八五折只要 170 元。你多付了 6 元,才发现七折只落在 80 元的第二件上,八五折落在 200 元的总价上。 当时会选错,有一部分原因在那句提问里。它只写了要学什么,没写你已经会到哪里、准备拿去算哪笔账、讲完怎样检查、哪个地方最容易混。AI 便交付了一篇覆盖知识点的讲义,没有碰到你桌上的两张价签。 「给我讲讲百分数」只给了主题。AI 不知道你已经会小数换算,于是从定义开始;不知道你要比较两种折扣,于是例子去了考试正确率;不知道你想确认自己会不会算,于是讲完就结束;也不知道你会把折扣数字直接比较,于是没有提前指出计算基数不同这个坑。 提问里多写一句,作用是给回答增加一种必须交付的东西。四个部件分别管回答从哪里开始、例子落到哪里、讲完后怎样检查、哪些误解要提前拦住。 先告诉它你已经会到哪里,回答可以越过重复铺垫,从你的起点接着讲。 再写清你准备拿它做什么,例子才会落到两张价签和两种折扣上。 要求它讲完后出题,你得亲手算一次,顺畅阅读会变成一次可核对的回答。 请它提前指出易错处,它会提醒你先找每个折扣乘在哪个价格上。 ## 让 AI 用我熟悉的东西打比方(提问:把讲义变成考卷) URL: https://xueai.miyang.cn/slides/learn-4.html (以下为免费预览,全文见页面) 让 AI 用我熟悉的东西打比方 它不知道你熟悉什么,只能从公共题库里抽一个源领域。在提问里空出这一格,填你已经会的东西,比方才接得住。 它不知道你熟悉什么,只能从公共题库里抽一个源领域。在提问里空出这一格,填你已经会的东西。 「同一笔付款请求就算提交两次,系统也只该记一次。」这句话你盯了两分钟。字都认识,可系统靠什么认出这两次是同一笔,你想不出来。那是晚上八点半,你在看一份防止重复扣款的说明。 你把问题贴给 AI,请它打个比方。它很快回了三句: 把它想成 HTTP 里的 PUT 和 POST。PUT 重复发送多次,结果通常一样;POST 每发一次,可能新建一条记录。 这段话短,前后又对得整齐。PUT 和 POST 你都见过,于是把它们当成两个现成标签,顺手记成「一个重复没事,一个重复就会多一条」。你以为原来的问题已经解释完了。 十分钟后,同事追问:「那用户连点两次付款,系统靠什么判断这是同一笔?」你答不出来,只好另开三个页面查 PUT 和 POST。原来只差一个问题,现在多了两个新词,最初那笔付款为什么不会记两遍仍然悬着。 AI 的比方本身没有错。你当时会点头,是因为两个缩写摆在熟练的对照句里,看起来像答案;可对你来说,它们也是待解释的材料。AI 只看到了你的问题,没有看到你已经熟悉哪些经验。 换个问法,先把你熟悉的参照物交给它。你做过配送,就让它用同一张配送单被派两次来讲;你处理过票据,就让它用同一张支票被交进柜台两次来讲。 先说你已经熟悉什么,让比方从你见过的动作出发。 再说要解释哪个概念,让 AI 只映射与这个问题有关的部分。 最后要求逐项对应,你可以检查每一步有没有对上。 类比能接住你,前提是借来的那个东西已经在你脑子里。下面把同一个概念换三种参照物,看看哪一种能让你自己验证。 ## 让 AI 一次只问我一个问题(提问:把讲义变成考卷) URL: https://xueai.miyang.cn/slides/learn-5.html (以下为免费预览,全文见页面) 让 AI 一次只问我一个问题 把下一步推理变成一个问句交还给你,往下想的活儿留在你这边。读完能让它一次只问一个,并看出自己卡在第几问。 把下一步推理变成一个问句交还给你,往下想的活儿留在你这边。读完能看出自己卡在第几问。 今晚下单,还是等到后天。一台 4800 元的电脑躺在购物车里,你想等下个月工资到账再还这笔钱。信用卡账单日是每月 5 日,还款日 25 日,今天是 5 月 4 日。你问 AI:「今晚买和后天买,免息时间差多少?」 AI 很快回了一整段。账单周期、入账时间、账单日、还款日都解释了,还顺手列了五个自测问题。 免息期由账单周期和还款日共同决定。账单日前入账的消费进入本期账单,账单日后入账的消费通常进入下一期账单。你可以依次想:账单日是哪天?消费何时入账?会进哪期账单?对应的还款日是哪天?两种情况相差多少天?实际结果还要以银行的入账规则为准。 你从第一句读到最后一句,每个词都认识。它连问题都替你列好了,你觉得信息已经很全,便把回答收藏起来,下单前没有再算一次。 第二天中午,同事看见订单,问:「如果这笔消费 5 月 4 日入账和 5 月 6 日入账,最晚还款日期差多少?」你看着两个日期,脱口而出:「只差两天。」实际上一笔进入 5 月账单,另一笔进入 6 月账单,按这个简化例子,最晚还款日分别是 5 月 25 日和 6 月 25 日。你原本留给下个月工资的余地,可能就这样少了一个账单周期。 你当时会判断自己听懂了,是因为那段回答把条件、结论和五个问题一起摆在眼前。眼睛一直能找到下一句,脑子没有独自做过「这笔消费会进哪期账单」这一步。内容很全,只说明屏幕上什么都有。 继续让 AI 换一种说法,它仍会从头讲一遍。账单日、入账和还款日会再次出现,你也会再次觉得熟悉。真正需要检查的是:拿走整段解释以后,你能不能自己推出下一步。 让 AI 暂停讲解,改成一次只问一个问题,过程会变成三步: ## 让 AI 标出最可能编错的五类信息(防幻觉:三道防线) URL: https://xueai.miyang.cn/slides/learn-6.html (以下为免费预览,全文见页面) 让 AI 标出最可能编错的五类信息 一段读起来很顺的回答里,有五个位置默认该当可疑。读完能指出它们在哪。 一段读起来很顺的回答里,有五个位置默认该当可疑。读完能指出它们在哪。 回收员十一点来取旧手机,你还剩四十分钟。手指停在恢复出厂那一栏的时候,你想起扫地机器人是绑在这台手机上的,跑了大半年的地图、划好的禁区、清扫记录,会不会跟着一起没。你把机型名称和那份 32 页说明书交给 AI,问了这一句。 它很快给出一段排得整整齐齐的答复: 答复摘要(教学示意):该机型于 2019 年上市,集尘盒容量为 0.47 升。App 里有「地毯增压」设置,保养手册要求滚刷每 90 天更换一次。设备支持云同步,登录同一账号后,地图、禁区与清扫记录会自动恢复。 年份、小数、设置项、手册要求、功能结论一项不少,语气也没有犹豫。云同步又符合你对联网家电的经验。你照着把旧手机恢复出厂,11:05 把手机交给回收员。 晚上登录新手机,设备还在,地图却是一张空白。你设过的 6 个禁区和 3 个定时任务都没回来,旧手机已经被带走。重新建图之前,机器人不能按原来的房间安排清扫。 你当时会相信,不是因为没看仔细。回答里的具体数字、界面名字和明确结论都像从说明书里摘出来的。这几类细节恰好也最容易被顺手补齐。语气稳、格式整齐、细节具体,都不能证明这句话来自原始材料。 AI 会根据眼前的文字继续生成最像答案的内容。材料写了 0.47 升,它可以照着说;材料没写云同步,它也可能借用常见设计,把材料里的空白补成合理的功能。年份、参数和设置项也会得到格式正确的候选值。 所以第一步不需要推翻整段回答,也不用逐字查完。先把这五类位置圈出来: 数字,包括容量、比例、版本号和阈值。 时间线,包括发布时间和功能更新时间。 设置项、接口名与参数,名字很容易写得像真实界面。 冷门材料里的细节,公开网页上很难找到第二份文本。 有没有某个功能,材料没提到时,空白容易被经验补上。 这五类不等于一定是错的,它们表示「先别直接写进笔记」。 ## 让 AI 的回答先过三道检查(防幻觉:三道防线) URL: https://xueai.miyang.cn/slides/learn-7.html (以下为免费预览,全文见页面) 让 AI 的回答先过三道检查 要出处、交叉验证、标注不确定。同一段回答过三道闸,每开一道筛掉的不一样,三道全开还剩一条得自己翻原文。 要出处、交叉验证、标注不确定。同一段回答过三道闸,每开一道筛掉的不一样,三道全开还剩一条得自己翻原文。 后面还有 6 个人排队。柜台把两页资费说明推过来,你要把每月 129 元的手机套餐换成 59 元的,快下班了。你拍下这两页纸发给 AI:「帮我看看这个套餐,合约多久、提前取消要多少钱、以后能不能在 App 里销户?」 不到半分钟,它给回六条判断。每条都有数字,最后一条还带着看起来很像出处的名字。 回答摘要(教学示意):套餐包含 30GB 流量,合约期 24 个月,提前取消赔 200 元;达到用量后会降速到 1Mbps;国际漫游要另行开通;异地可以在 App 里销户,依据是「服务协议第九条」。 你算了一遍,每月省 70 元,就算提前取消赔 200 元也能接受。更关键的是异地可以线上销户。你在 5 点 47 分点了确认,拿着新套餐离开。 三个月后搬家,你在出发当天早上 8 点 20 分打开 App,里面没有销户入口。客服说需要回号码归属地的营业厅办理,那两页资费说明也没有「App 销户」这句话。你 10 点 05 分的车票已经买好,只能先让套餐继续扣费。 当时会信,是因为 AI 把常见套餐的做法、眼前材料里的数字和一个协议名称排在了同一张清单里。具体到第九条的出处又给了你一种已经核过原文的感觉。你问的是「帮我看看」,它的任务只是生成一份顺畅答案,没有被要求把依据、矛盾和推测分开。 如果当时接着加三句:「每条标出处」「换一种问法再答一次」「把确定和推测分开」,结果会变成三层清单: 先把没有材料依据的两条移出去,降速和国际漫游暂时标成未核实。 再把两次回答不一致的一条移出去,合约期一会儿是 24 个月,一会儿是 12 个月。 最后把从字面推出来的一条单列,「当月有效」推不出赠送流量一定清零。 一句话都不加,六条判断会以同样的口气进入你的笔记;三句话加上去,四条先被停在待核区。 ## 这次回答,我要不要去查原文(防幻觉:三道防线) URL: https://xueai.miyang.cn/slides/learn-8.html (以下为免费预览,全文见页面) 这次回答,我要不要去查原文 按后果决定查不查。越是它答得流畅完整的地方,越值得抽一处去对原文。 按后果决定查不查。越是它答得流畅完整的地方,越值得抽一处去对原文。 确认页上只有一行字:每期手续费率 0.6%。完整规则在下面那个协议链接里,十几页。你在银行 App 里,要把一台 12000 元的电脑分 12 期。你把这行字发给 AI,问总共多付多少,提前还清还要不要继续交手续费。 它算出每期 72 元,12 期一共 864 元,还补了一句:「提前结清后,剩余期数的手续费不再收取。」前半段乘法能对上,后半句也符合「没借那么久就少付一点」的直觉。你觉得这只是算账,没必要再点开十几页协议,于是按下确认。 三个月后奖金到账,你提前结清。页面显示本金之外还要付 648 元,正好是剩下 9 期的手续费。你回到那段对话,发现 AI 给了完整规则,却没有银行名称、协议版本和条款位置。再打开当时跳过的协议,里面写着: 提前结清时,已收取的手续费不予退还,未收取的剩余期数手续费于结清当日一次性收取。 那一步会被放过,是因为正确的乘法替整段回答赢得了信任。72 乘 12 等于 864,只能证明计算没错;提前结清怎么收费,取决于这份协议写了什么。算得对,不能替没出处的规则作证。 继续追问「你确定吗」,得到的仍然是同一场对话里的生成结果。AI 更适合替你缩小范围,让离开对话后的动作从「读完十几页」变成下面三步: 圈出会改变决定的原句,这里就是「剩余手续费不再收取」。 说清该找哪份原始材料,这里要找当前分期产品的协议,不能拿另一家银行的客服问答代替。 给出要搜索的词,打开协议后搜索「提前结清」「剩余手续费」,直接读命中的上下两段。 这样查一次只需核一条规则。可学习时每句话都这样处理,注意力会被来回切走。哪些情况可以留在对话里继续学,哪些情况该马上去查原文?下面把用途和回答的顺畅程度一起拨动。 ## 让 AI 帮我拆开一段看不懂的条款(啃硬材料:从条款到源码) URL: https://xueai.miyang.cn/slides/learn-9.html (以下为免费预览,全文见页面) 让 AI 帮我拆开一段看不懂的条款 先要地图,再定位卡点,补那一层前置,最后回到原文。四步走完,那一句能用没有术语的话说出来。 先要地图,再定位卡点,补那一层前置,最后回到原文。四步走完,那一句能用没有术语的话说出来。 你买过一份重疾险,一年交一次,前两年都按时。 第三年手头紧,想着晚一个月也没事,一晃断了三个月。想起来赶紧打电话,客服说可以补,补完合同接着往下走。钱补上了,确认短信也收到了。这事你觉得翻篇了。 又过一年多,单位体检查出问题,要住院手术。你翻出保单算了一下:第一年买的,现在第四年,等待期 90 天,早过了三年多。材料交上去的时候,你心里是踏实的。 回复是拒赔。理由写着:合同复效之后,90 天等待期从复效那天重新起算,你出险那天距离复效第 47 天。 你把合同翻出来找到那一段。它一直在那儿,签字前你也扫过一眼。 本合同等待期为自本合同生效之日或最后一次复效之日起 90 日,以较迟者为准。 三年多和四十七天的差距,全在这一句里。 这句话每个字你都认识,问题出在复效之日上。它有一个行业内部的定义,可它长得跟普通词一模一样,不会举手说自己是术语。你扫过去的时候,大脑把它当成了「重新生效那天,大概吧」,就滑过去了。旁边的以较迟者为准也一样,它悄悄规定了两个起算点要取靠后的那个。 所以你读完这一句,收到的信息是「等待期 90 天」。而它真正的意思是「等待期 90 天,断交补交过的话,这 90 天从补交那天重新数」。差的那一层,就藏在你以为自己看懂了的那两个词里。 这是缺前置里最难办的一种:你不知道自己缺。碰上明显的生词你会去查,碰上一个伪装成日常词的定义,你连查的念头都不会起。 把这段贴给 AI,问「帮我讲讲这段什么意思」,它会给你一段通顺的解释。你读完点头,然后照样答不上来 47 天为什么不算数。它讲的是整段,你缺的是一个词,整段讲一遍,正好把那个缺口盖了过去。 ## 让 AI 先告诉我必须懂哪五个概念(啃硬材料:从条款到源码) URL: https://xueai.miyang.cn/slides/learn-10.html (以下为免费预览,全文见页面) 让 AI 先告诉我必须懂哪五个概念 按目录、摘要、结论、图表、正文的顺序给它,开工先问要先懂哪五个概念。 按目录、摘要、结论、图表、正文的顺序给它,开工先问要先懂哪五个概念。 跑步群里弹出一个附件,周日半程马拉松的参赛手册,40 页。你要确认的只有三件事:几点存包、自己这一组几点出发、15 公里处几点关门。那天是周五晚上,比赛还有一天半。 你想着既然要参加,就从第一页开始老老实实往下读。封面、主办方名单、赞助商、天气提醒一页页翻过去;遇到「净计时」「分区检录」「强制收容」,你又停下来搜索。顺序很认真,也没有漏字。 到晚上 10 点 25 分,你读到第 8 页,已经停下来查了六次。存包截止时间还没找到,15 公里关门表在第 27 页。你原先按自己越过起点的时间算配速,翻到那里才看到这句: 第 15 公里关门时间为本分区枪声后 2 小时 10 分。迟到出发所耗时间计入关门时限;超过关门时间的选手须停止比赛,乘收容车返回终点。 你在 C 区,鸣枪后 8 分钟才越过起点。原来留给你的时间会少 8 分钟,刚做好的配速表得重算。前面读过的主办方名单和天气提醒没有回答手上这三个问题,45 分钟也用完了。 你会从第一页开始,是因为默认页码顺序就是理解顺序:前面是基础,后面才是细节。参赛手册的编排任务是把所有规则收齐,重要信息会分散在日程、路线图、关门表和名词解释里。你把页码顺序当成了重要性顺序。 把 40 页直接丢给 AI,只问「帮我总结」,它通常会把 40 页压成两页。内容变短了,净计时和枪声时间仍然挤在同一段里,你还是不知道哪个词会改掉自己的配速计划。 更有用的做法,是先让它按材料的目录、摘要、关键结论和图表搭出结构,再问读懂这份材料需要哪五个概念。接着逐个出题:能解释的先划掉,说不清的才补。AI 先替你找出入口和缺口,正文等这两件事清楚以后再读。 先看目录,知道答案散在哪几节,存包看日程,出发看分区,关门看路线表。 再看摘要和关键结论,先抓会改变行动的规则。 接着看图表,把时间、公里点和分区放回同一张地图。 最后进入正文,只细读与你有关的段落和五个前置概念。 ## 让 AI 只根据我贴出的原文回答(啃硬材料:从条款到源码) URL: https://xueai.miyang.cn/slides/learn-11.html (以下为免费预览,全文见页面) 让 AI 只根据我贴出的原文回答 转述会先丢掉限定条件、例外情况、指向别处的定义,而那正是花钱的部分。 转述会先丢掉限定条件、例外情况、指向别处的定义,而那正是花钱的部分。 备忘录里那一行是你自己敲进去的:提前 72 小时可以全额退款。原文你扫过一眼,觉得记住了要点。那门陶艺体验课 698 元,周六下午 3 点开课,你周一晚上报的名。 周三上午 11 点 10 分,主管通知周六加班。离开课还有 75 小时 50 分,你照着备忘录问 AI:「我提前 72 小时申请,能全额退吗?」它按你给的信息算了一遍,回答可以。 你当时觉得自己的转述抓住了重点:72 小时是时间门槛,全额退款是结果。原文里夹在中间的几个字,看起来只是在补充寄送进度。 材料包周二下午已经寄出。退款到账 530 元,少的正好是 168 元材料费。AI 算对了 75 小时 50 分,也准确回答了你写下来的问题。 问题在更早的一步。你把长句压短时,保留了数字和结果,删掉了连接两个条件的「且」,也删掉了材料包尚未寄出。原文要求两个条件同时成立,你的版本只剩时间条件。 AI 看不到你脑中那次删改。你贴「提前 72 小时就能全额退」,它只能把这句话当成规则,再判断现在是否超过 72 小时。它给出了一个针对错误问题的正确回答。 直接贴原文,它就能看见「且」、例外条款和时间口径。它可以替你逐句比对,指出你的转述少了什么,再把结论落回决定金额的原句。 保留全部条件,数字前后的「且」「或」「除外」都会一起进入上下文。 核对你的理解,让 AI 明说转述删掉、合并或改弱了哪一处。 引用决定结论的原句,答案有字可指,你能回到材料自己复核。 ## 让 AI 给每条判断标出原文位置(啃硬材料:从条款到源码) URL: https://xueai.miyang.cn/slides/learn-12.html (以下为免费预览,全文见页面) 让 AI 给每条判断标出原文位置 写下一句判断之前,先让 AI 指出原材料的确切位置。找不到对应原文的内容,先不要拿来做决定。 AI 的每一条判断都要能指回原文的确切位置。指不回去的那几条,先别拿来做决定。 「您提交的 7 月差旅单已退回:网约车费用缺少发票,暂不能报销。」 出差前,你收到一份13 页的差旅费用规定。第二天要去外地,你把文件交给 AI,让它归纳住宿、打车和报销凭证。它列出四条,其中一条写着:晚上 10 点以后从办公地点回酒店可以打车,无须再附发票。 这份总结还准确写出了每晚 500 元的住宿上限、22:00 的时间门槛和不得重复领取交通补贴。三个事实都能在文件里找到,你也就把第四条一起记进了手机备忘录。那晚 11:20,你让酒店代叫了一辆车,支付386 元,手里只有支付截图。 一周后,报销单被退回。你重新打开那 13 页,在相关段落里只找到「网约车费用凭平台行程单及发票据实报销」。那句无须发票,前后两页都没有。酒店代叫的车又开不出你的抬头,这 386 元只能自己承担。 你当时会信,是因为错误被夹在三个准确事实中间,语气、编号和数字都很像原文。AI 给了你一份读起来连贯的总结,却没有交代每句话从哪里来。现在的问题很具体:那句无须发票,到底对应原材料哪一行? 只问「帮我总结这份文件」,任务终点是产出一段好读的话。AI 会合并相邻段落,也可能顺着常见做法补齐一个听起来合理的条件。读者看到的是完整句子,看不到它取材的边界。 把终点改成「每写一个判断,都交出原文位置和原句」,事情就变了。判断写完,证据要同时出现。位置对不上,或者摘录里缺少结论的关键半句,这条判断就先停在待核实状态。 一份长材料可以按同一条路径检查。连续的四个动作适合分开做,避免 AI 在一大段回答末尾只挂一个含糊的出处。 先给原文逐行编号,让后面的每个位置都能直接回看。 把总结拆成单独的判断,一句只放一个可检查的意思。 给每个判断配位置和原句,位置负责找到,摘录负责核对。 明确标出没有出处的内容,不要让 AI 用相近段落代替证据。 下面仍是那份差旅规定。先只读 AI 的总结,再切换到逐条回原文。初始态就检查开头那个疑问:无须发票这句话,材料里有没有。 ## 让 AI 先确认我手上是哪一版(啃硬材料:从条款到源码) URL: https://xueai.miyang.cn/slides/learn-13.html (以下为免费预览,全文见页面) 让 AI 先确认我手上是哪一版 先确认手上材料的来源、日期和版本线索,再让后面的判断只基于这一版。 同一个文件名下可能是两份不同的东西。先确认手上这份的日期和来源,后面的判断只认这一版。 材料被退回了。窗口工作人员把你装好的透明文件袋推回来,在清单第 6 项下面画了一条线:银行流水少了盖章,今天不能收。 十天前,你从签证中心官网打开材料清单,照着它准备了9 项材料。在职证明找人事开,照片重拍一遍,酒店订单打印两份。文件来自官方页面,每一项都打了勾,你没有理由再去找另一份。 预约当天早上 9:10,你排到窗口。工作人员说,清单三天前更新过,银行流水现在要覆盖近 6 个月,并且每页盖章。你带的是3 个月流水,页面上那句话已经变了。 下一次可约的时间在11 天后,机票是 18 天后。你回到走廊,打开手机里的 PDF,又打开官网。两份文件名称都叫「个人旅游签证材料清单.pdf」,旧文件没有发布日期,官网也没有弹窗提醒你它换过。 你当时的判断很自然:官网下来的文件就是现行要求。错位发生在更早的一步,你确认了来源,却没有确认它是哪一版。同一个文件名可以盖住一次更新,收藏夹和下载记录也不会替你标出变化。 把旧 PDF 丢给 AI 问「还缺什么材料」,它只能沿着旧清单继续检查。更稳的用法,是把旧文件和当天官网内容一起给它,先让它找日期、来源和改动;版本说不清时,明确停下来,不许补猜。然后再问:我当时依据的究竟是哪一版,第 6 项什么时候变了? 旧文件第 6 项:近 3 个月银行流水。当前页面第 6 项:近 6 个月银行流水,须逐页加盖银行印章。 AI 很会顺着一份材料往下解释,却不会凭空知道你下载之后网页改过几次。只有一份无日期的 PDF 时,它最多能说「版本无法确认」。让它猜发布日期,得到的只是一个听起来完整的故事。 版本信息至少要回答四个问题: ## 让 AI 改稿时保住关键信息(啃硬材料:从条款到源码) URL: https://xueai.miyang.cn/slides/learn-14.html (以下为免费预览,全文见页面) 让 AI 改稿时保住关键信息 AI 说改稿已经没有问题,可能因为它把最难解释、也最有分量的那段直接删了。 检查项全过,也可能是因为最难解释的那段被直接删掉了。既看留下的,也看少了什么。 你把文件名改成「产品经理简历·最终版.pdf」,点下发送。投递页面显示提交成功,你关掉电脑去洗杯子。 这版是在周日晚上改的。招聘要求里有一条「独立负责过从需求到上线的项目」,你四年里最接近它的,是去年做的新客权益页。原稿写了 6 行,提到你参与需求、协调设计和开发,还写了注册转化率提升 30%,只是没交代这个数字从哪里来。 你把简历和招聘要求一起交给 AI,让它「改到没有问题,每一条都经得住面试追问」。两分钟后,它给出 8 项检查结果:错别字通过、数字有依据通过、经历和岗位匹配通过,最后一行也是绿色。你又看了一眼,页面从两页收成一页,句子也顺了,于是判断这版可以交。 第二天下午,招聘方打来电话,只问了一句:「简历里怎么没有你负责新产品上线的例子?」通话 6 分钟结束。你重新打开两份文件并排看,才发现新客权益页那 6 行整段不见了。AI 没有补上数字来源,也没有把「参与」改准确,它把会引来追问的经历删掉了。 你当时会收工,是因为那张检查表只看改稿里还剩下的句子。删掉「提升 30%」,数字当然都有依据;删掉整段经历,也就找不到职责夸大的地方。每一项都通过了,可招聘方最想看的证据也跟着消失了。 问题变少和材料变好是两件事。只检查留下来的内容,删除会变成一条最省力的通过路径。 AI 可以继续帮你改,只是检查口径要多问一件事:原稿里的关键信息还在不在。先让它列出必须保留的经历、数字和限制,再改句子;收尾逐项对照,任何删除都要说明代价。这样它可以修那句说不清的话,却不能悄悄拿走整段证据。那两种口径跑完同一份简历,会得到什么不同结果? ## 合上材料,让 AI 考我一次(让知识留下来) URL: https://xueai.miyang.cn/slides/learn-15.html (以下为免费预览,全文见页面) 合上材料,让 AI 考我一次 取出来这个动作本身在加固记忆,重读加固的是眼熟。 取出来这个动作本身在加固记忆,重读加固的是眼熟。 「整屋突然没电,先动哪一个闸?」室友举着手机问你。你答得很快:「把各个房间的电器都拔了,再逐路推闸。」 那天晚上 9 点 20 分,你们刚搬进新住处。半小时前,你还坐在客厅里,把物业发来的三条跳闸处理规则连续读了三遍。每句话都短,你第二遍就能顺着往下念,第三遍几乎不用停。 整屋都黑,先看总闸。只有一路黑,把那一路的电器全拔掉再推上去。推上去马上又跳,别反复推。 你当时的判断很自然:三遍都读得这么顺,临时遇到情况肯定能照做。可真正停电时,你把「只有一路黑」的动作套给了「整屋都黑」。两个人拔掉8 个插头,在黑暗里来回走了 12 分钟,最后才发现总闸已经落下。 总闸推上去又立刻跳。室友接着问:「还要再推一次吗?」你记得原文里有一句提醒,却拿不准它说的是再推、别推,还是先等几分钟。刚才读过三遍的内容,此刻只剩下一点熟悉感。 重读时,字一直摆在眼前。上一句会提醒下一句,「整屋都黑」后面紧跟着「先看总闸」。你做的动作主要是辨认:看见这句话,知道自己见过。 停电以后,提示消失了。你得先判断眼前属于哪种情况,再从脑子里找回对应动作,最后说给室友听。这条路需要你主动发起,光靠阅读时的熟悉感带不过去。 往脑子里再塞一遍,和从脑子里往外取一次,是两种不同的练习。 继续让 AI 解释跳闸规则,你会再得到一段放在眼前的文字。一个实际可行的做法是让它暂时停止讲解,改成主持三轮主动回忆。 它先问一个具体情境,例如整屋都黑时先查哪里。 你先完整说出动作和理由,中途不给关键词,也不显示选项。 它等你答完再核对,只指出漏掉或说反的那一步。 你不看原文重新说一遍,把刚才没取出来的内容再走一次。 ## 让 AI 每次换一道没见过的新题(让知识留下来) URL: https://xueai.miyang.cn/slides/learn-16.html (以下为免费预览,全文见页面) 让 AI 每次换一道没见过的新题 固定的旧题会被背熟。AI 的独特价值是能无限次出新题,而复习要放在快忘的时候。 固定的旧题会被背熟。AI 的独特价值是能无限次出新题,而复习要放在快忘的时候。 第六道题问的是自愿退票是什么意思。周日晚上,你坐在书桌前,把一页机票退改签笔记贴给 AI,已经复习了 18 分钟。 笔记里写着: 旅客因为自己的行程变化申请退票,归为自愿退票;航班取消等承运人原因导致的退票,归为非自愿退票。 AI 连着问「自愿退票是什么意思」「非自愿退票是什么意思」。你照着定义答,连续三轮 6 题全对。第三轮时,题目刚出现,你已经能接出整句。你把对话关掉,觉得这两条规则会用了。 两天后早上 7 点 20 分,手机收到通知:你下午的航班被航司取消。订单页同时写着特价票不退不改。你盯着这八个字,判断这张票退不了,准备放弃 780 元票款。 同行的人却点进「非自愿退票」,四分钟后收到申请通过的通知,780 元原路退回。轮到你操作时,你停住了:昨天还会背的两个定义,放到同一个订单里,哪条管航司取消,哪条管你临时改行程,你没有把握。 你会那样判断,是因为旧题已经把要用的名词写在题面上。看到「自愿退票」,只需把对应定义接出来。订单页没有替你标类别,你得先发现航司取消是承运人原因,再把它归到非自愿退票。名词解释答得出来,只说明你认得标签;条件一换,还得自己判断该用哪条规则。 继续让 AI 「再考一遍」,它很可能换个顺序重复那两句定义。分数会越来越高,因为三轮都在找同一张卡片,真实订单里的条件判断仍然没有练到。 AI 更有用的地方,是每轮都换人物、时间和限制条件,让你在没见过的情境里重新选一次规则。它还可以等你作答后再给答案,避免题目刚出现,解释也跟着出现。 可新题为什么会让当场分数变低?复习挤在学完当天,又会制造什么错觉?下面保留同一份机票规则,把出题方式和两轮之间的天数都拨一遍。 ## 让 AI 找出我在哪一步想错了(让知识留下来) URL: https://xueai.miyang.cn/slides/learn-17.html (以下为免费预览,全文见页面) 让 AI 找出我在哪一步想错了 答错之后先别看答案,把当时的想法说给它,让它指出思路在哪一步偏了。读完能定位到自己拐错的那一步,只补那一步。 答错之后先别看答案,把当时的想法说给它,让它指出思路在哪一步偏了。 「路线 A 更快。」周六下午,你在餐桌边做一套练习题,题目说:12 公里的路,A 路线前 6 公里时速 30,后 6 公里时速 60;B 路线全程时速 40。问哪条路线更快。 你在草稿纸上写下 (30+60)÷2=45。45 大于 40,所以选 A。数字很整齐,每一步也都算得出来,你把答案填了上去。 系统判错。解析写着:A 路线前半段要 12 分钟,后半段要 6 分钟,总共 18 分钟;B 路线也是 18 分钟。你看完点点头,记下一句「分段路程要分别算时间」,接着做下一题。 四天后,另一道题把速度换成 40 和 80,另一条路线全程 55。你又算出平均时速 60,再次选了分段那条路线。答案仍然判错。上次记住的那句话就在笔记里,这次却没有拦住你。 因为你直接看见了正确算法,却没有把自己当时的推理留下来。你真正走过的是这条路:两段路一样长,所以两个速度各占一半;把 30 和 60 平均,就得到整段路的平均速度 45。偏差从「两个速度各占一半」开始。慢的那一段占用了更多时间,两个速度在时间里没有各占一半。答案盖住了错误结果,通向错误的那条路还留在原地。 这时可以让 AI 做三件事: 先收下你原来的答案和每一步想法,不让正确答案抢先改写你的记忆。 逐步核对推理,保留前面算对的部分,只标出从哪一步开始偏。 只围绕那一步出新题,看你能不能在换过数字和场景后自己改过来。 究竟是哪一步把你带向了 45?两条路都看过正确答案,为什么几天后的结果会不同?下面的演示从这个疑问开始。 ## 让 AI 在新对话里接着上次聊(让知识留下来) URL: https://xueai.miyang.cn/slides/learn-18.html (以下为免费预览,全文见页面) 让 AI 在新对话里接着上次聊 上下文窗口是这一次会话的工作区,对话一关就空了。留下的那层得写在外面。 上下文窗口是这一次会话的工作区,对话一关就空了。留下的那层得写在外面。 「带着 67 岁的爸爸,每天最多安排三个地点,下午四点前回酒店休息。」 这是你在第 3 轮发给 AI 的要求。周六下午,你在餐桌边排一家人的五天旅行,接着问了酒店和交通。它每次都接得上,你便把这句话当成双方已经说好的事:我已经跟它说过了,它应该记得。 聊到第 18 轮,你让它整理最终行程。第四天被排进了五个地点,最后一项写着晚上 8 点半看演出。你没再逐条核对,直接复制到家庭群。爸爸回了一句:「这天不是说四点回酒店吗?」 你会那样判断,是因为人讨论方案时,一条要求确认过就成了共同前提。AI 的回答也一直连贯,看起来像从头跟到了尾。可它依赖的是眼前还能读到、还能顾及的文字,早先那句要求可能被挤远,也可能被漏掉。说过一次,不等于以后每次都会被执行。 AI 能把说好的要求、做过的决定和淘汰原因抽出来。那份东西还得保存到对话外面,下次开始时再贴回来。到底差在哪儿?先看同一份旅行计划怎么续上。 可以把「上下文窗口」理解成 AI 此刻摊在桌面上的材料。刚说过的目的地还在桌面上,它就能接着谈。桌面有边界,谈得越久,前面的细节越难稳定地参与回答;另开一条对话,新桌面也不会自动带上旧要求。 聊天记录还在界面里,只能说明你以后还能翻到这些字。它和「AI 下一次回答时一定会拿这句话当约束」是两件事。真正需要长期遵守的内容,不能只留在一段聊天的历史里。 准备结束一次重要对话时,让 AI 按下面四类整理。它负责找,你负责核对,再把结果存到笔记或项目文件中。 目标:这次最终想完成什么,例如排出适合一家三口的五天行程。 硬约束:后面每次回答都要遵守什么,例如每天最多三个地点、下午四点回酒店。 已经做出的决定:选了什么,以及依据是什么,例如住在地铁站旁,减少换乘。 排除项和原因:试过什么、为什么不再考虑,免得下一次又推荐回来。 ## 分三层告诉 AI:我是谁、在做什么(让知识留下来) URL: https://xueai.miyang.cn/slides/learn-19.html (以下为免费预览,全文见页面) 分三层告诉 AI:我是谁、在做什么 一句话自我介绍、项目背景、能被检索的笔记,各写什么、写在哪。 一句话自我介绍、项目背景、能被检索的笔记,各写什么、写在哪。 4600 字装修记录、16 条生活要求、3 个文件,你准备一次全发给 AI。 周日下午,你坐在新房的折叠餐桌旁,打开一个新对话。自我介绍、八十平旧房的情况、预算、老人怕凉、狗容易打滑,再加过去半年的装修日记,你全复制过来,最后问:「客厅铺木地板还是瓷砖?」 你想得很顺:AI 手里缺背景才会答得泛,现在把知道的全交代了,细节越多,漏项越少。给得越全,回答越准,听起来也符合平时请人帮忙的经验。 它逐条引用老人、狗和预算,结论是木地板。你把这个选项写进报价单,第二天交了3000 元定金。晚上搜索旧笔记时,才翻到四个月前留下的一行: 上一套房也是南方一楼,回南天以后木地板鼓了一圈边。下次先查地面防潮条件,再谈脚感和价格。 你会相信那份回答,因为它确实引用了多条背景。只是长期个人情况、这次装修的约束、过去的教训挤在同一层;旧笔记里的关键事实只有一行,旁边却有 16 条当前要求。 AI 可以先替你把这堆材料分开:长期固定的信息一直带着,眼前项目单独更新,旧笔记只检索和这次问题有关的几条。外部记忆分层的作用,是让 AI 知道这次该读哪一类、哪几条。可三层分别写什么,又该从哪一层开始加?下面仍问客厅地面这一题,看回答怎么逐层变化。 客厅地面,铺木地板还是瓷砖? ## 让 AI 帮我把笔记写得以后找得到(让知识留下来) URL: https://xueai.miyang.cn/slides/learn-20.html (以下为免费预览,全文见页面) 让 AI 帮我把笔记写得以后找得到 一条笔记一个主题,开头一句话说清结论,带上当时的困惑。读完知道每次该挑哪几条喂进去。 一条笔记一个主题,开头一句话说清结论,带上当时的困惑。读完知道每次该挑哪几条喂进去。 你把笔记应用里的搜索词从「吐司」改成「底部湿」,又改成「没熟」,三次搜索一共翻出 27 条记录,没有一条是你记得的那条。四个月后的周六早上,同样的问题又出现在烤盘里:底部发黏,中间切开还有湿面。 你记得自己处理过这件事。往回翻到 3 月 17 日,终于看到当晚 11 点 26 分写下的那一条: 今天这炉还是不对,温度低一点好像有用。底下湿,可能再烤会儿?下次看情况。 当时你刚称完面团,烤箱面板、食谱和切开的吐司都摆在眼前。你知道「温度低一点」具体低了多少,也知道水加了多少。于是你以为写下现象和大概方向就够了,几个月后的自己自然能接上。 现在这句话确实找到了,你却说不清它指哪一炉,也不知道该调温度、减水,还是延长时间。原因很具体:记笔记时,完整处境还在脑子里,你只写了当时觉得会忘的那一小截。等处境消失,这条笔记就只对当晚的你成立。 把它原样交给 AI,问「这条笔记是什么意思」,AI 只能猜。让它改做整理:一条只留一个主题,把结论提到第一行,再补上当时条件、没想通的问题和下次用途;原文缺的信息标成待补。一条笔记能不能再次派上用场,取决于它有没有把当时的上下文一起带回来。 可同一句随手记,改成什么样,四个月后才能搜得到、看得懂,还能让 AI 接着回答?下面直接拿这 27 条里的三条试一次。 它在本机保存 Markdown 与 SQLite,用关键词和语义两路找回相关段落,只把命中的几段交给 AI。项目用 Python 编写,采用 AGPL-3.0 许可,也提供 Cursor 与 Claude Code 的 skill。 ## 让 AI 像外行一样追问我(自查与避坑) URL: https://xueai.miyang.cn/slides/learn-21.html (以下为免费预览,全文见页面) 让 AI 像外行一样追问我 让它只带初中知识来追问。读完能拿一个概念跑一遍,看自己卡在第几问。 让它只带初中知识来追问。读完能拿一个概念跑一遍,看自己卡在第几问。 「二十年会差这么多,是因为…因为它会指数增长。」话说到这里,你停了下来。 周六下午四点,你坐在餐桌边,给读初二的侄女讲复利。十分钟前,你刚看完一篇六分钟科普,能把定义顺着念下来,还在纸上算出了100 元第一年变成 105 元,第二年变成 110.25 元。两个数字都算对了,你觉得自己已经懂了。 她先问:「第二年多出来的两毛五是谁给的?」你指着第一年那 5 元,解释它留在账上也会生利息。这一问答得很顺。 接着她把计算器推过来:按每年 5% 算,10 年后约 163 元,20 年后约 265 元。她问:「为什么第二个十年多了 102 元,第一个十年只多了 63 元?」你说出了刚才那半句话。 「复利就是利滚利,本金和以前的利息会一起产生新的利息,所以时间越长,复利效应越强,因为这是指数增长。」 她马上追问:「指数增长是什么意思?为什么会让后十年多得更快?」你只好重新打开那篇文章。最后两句和文章里的原话几乎一样,那个关键问题仍然没有答案。你能复述定义,也能照例子算两年,所以刚才才会判断自己已经会了。 复述调用的是刚记住的句子。文章写「时间越长,复利效应越强」,你也能说出同一句。只要原来的词还在,句子就能继续往下走。 解释多了一层工作:你得知道每个词指向什么过程。这里的「指数增长」要落回每一年那笔更大的总数:第二年的 5% 从 105 元上长,第三年又从 110.25 元上长,每一年的起点都带着前面长出来的部分。如果一个词只能把另一个词接回来,听的人仍然拿不到过程。 能复述说明你记住了句子;能解释要求你知道句子里的每个词在指什么。 ## 让 AI 改一个条件,再考我一次(自查与避坑) URL: https://xueai.miyang.cn/slides/learn-22.html (以下为免费预览,全文见页面) 让 AI 改一个条件,再考我一次 一道原题加三种变体,看同一套背下来的步骤在哪一步失去依据。读完能让它出一道改过条件的题,自己先解。 一道原题加三种变体,看同一套背下来的步骤在哪一步失去依据。 上次十分钟就处理好,这次照着做了半个多小时,衣服还是有味道。 上周日下午,你洗完三件棉 T 恤,闻到一股潮味。你照着刚学会的四步做:跑一次筒自洁,把衣服减到半桶,洗完马上晾开,最后再闻。第二桶没有味道,你把这套步骤记进了备忘录。 这个周末,你洗的是一件蓬松的羽绒服。刚开门又闻到同样的味道,你马上判断:毛病一样,照上次的步骤走就行。筒自洁跑了 80 分钟,接着该把投放量减半,可筒里只有这一件,拿掉一半等于不洗。 你还是把四步从头走了一遍,又多洗一次。两个多小时过去,羽绒服仍有味道,备忘录里的第二步也没法执行。同样是洗完有味,上次能走通的步骤,这次为什么会在中间断掉? 做原题时,普通衣物能分成两桶、晴天晾得干、味道当天就能闻出来,这些条件已经替你摆好了。你只练了看到题面之后怎样处理。到了真实场合,条件需要你自己辨认,还要判断每一步依赖的条件有没有变化。难点提前了一段。 只问 AI「羽绒服有味怎么办」,它会再给一串新步骤,你仍然看不见旧步骤为什么失效。更有用的问法,是让它把每一步依赖的条件摊开,再一次只改一个条件,让你判断哪一步还能用。你练熟的是后半段的动作,还没练过前半段的条件识别。 题目只动了衣物能不能继续减量这一处。那第二步依赖的条件到底是什么?条件一变,原来的动作为什么立刻没了依据?下面先让原题走一遍,再把三类条件分别换掉。 ## 让 AI 等我写完三行,再给答案(自查与避坑) URL: https://xueai.miyang.cn/slides/learn-23.html (以下为免费预览,全文见页面) 让 AI 等我写完三行,再给答案 预测它在边界上会怎么走,再让它故意讲错、你来指。 预测它在边界上会怎么走,再让它故意讲错、你来指。 再往下滚一屏,答案就会完整露出来。你的手指停在滚轮上,屏幕正在等这一下。这一秒还能先猜一次,滚过去以后就没有了。 你正在替家里看这个月的电费单:总用电量是 210 度,第一档上限是 200 度。AI 把问题写在答案上方。 超过第一档以后,是 210 度全部换成第二档单价,还是只有多出来的 10 度换价? 你心里模模糊糊偏向后一种,可没有写。你觉得自己只差一个确认,于是手指往下一拨。答案说:只有超出的 10 度按第二档算,前面 200 度仍按第一档。你读了 7 秒,顺手记下一句:「哦,对,我本来也是这么想的。」 吃晚饭时,家人拿着同一张账单问你为什么刚过 200 度就贵了。你脱口而出:「一过档,210 度全按第二档。」账单明细摆在旁边,你才发现自己把刚看过的答案说反了。 你再回去找自己最初的想法,已经找不到了。屏幕上的答案给过方向、用词和结果,回想时脑子会顺着这些现成线索走。于是「我原来就这么想」和「我看完才这么想」混在了一起。 如果刚才停一秒,先写下结果、依据和失效条件,现在就能看见错误落在哪一行。三行的价值,是给答案进来之前的自己留一份证据。那份证据可能写错,写错才正好告诉你下一步该补哪里。 一旦看过答案,你就再也无法知道自己原本能想到多少了。此后写下的每一句,都可能已经借用了答案里的词。那个能检查当前理解的机会,只存在于答案出现之前。 先写下来,纸面上才会留下一个没有被答案改过的版本。等答案揭晓,你可以逐行核对:结果猜对了吗,规则说对了吗,规则的适用范围找到了吗。差在哪一行,下一步就补哪一行。 AI 可以替你出边界题,也可以替你把答案藏好。关键是把顺序写进要求里,让它等你交完三行再揭晓。 先只显示题目,答案、提示和关键词都先收起来。 等你写完三行,中途只确认收到,不顺手纠正。 最后逐行对照,指出预测、依据和失效条件各差在哪里。 ## 让 AI 帮我检查:我是真的懂了吗(自查与避坑) URL: https://xueai.miyang.cn/slides/learn-24.html (以下为免费预览,全文见页面) 让 AI 帮我检查:我是真的懂了吗 好的阅读体验和知识进脑是两件事。盖住那段读得很顺的解释说三个要点,缺的那条就露出来。 好的阅读体验和知识进脑是两件事。盖住那段读得很顺的解释说三个要点,缺的那条就露出来。 「感冒和流感到底怎么分?」家人把社区的流感疫苗预约转给你,顺手问了这么一句。那天晚上十点四十,你没把握,就让 AI 用大白话讲一遍。 它给了四句话。每一句你都认识,每一步也接得上。 感冒通常在一两天里慢慢开始,难受多在鼻子和嗓子。流感常常在几个小时里突然发作,更容易发烧和全身酸痛。流感有专门的抗病毒药和疫苗,感冒没有。 你从头读到尾,点了两次头,还回了一句:「懂了,主要看起病快慢、哪里难受、有没有药和疫苗。」这三点就在眼前,句子又短,你确实觉得自己已经掌握了。 第二天早上 8 点 15 分,家人在早餐桌上追问:「昨晚突然发烧、浑身酸,是感冒还是流感?哪个有疫苗?」你先说「应该是感冒」,停了两秒,又改成「流感吧」。轮到疫苗那句,你只记得其中一个有,说不出是哪一个。 昨晚刚读过的四句话,一夜都没过,你只好重新打开那段对话。这时才看见落差:读的时候每一句都懂,离开原文以后,三条里有一条连方向都拿不准。 读的时候,答案、顺序和提示都摆在眼前。你只要沿着句子往下走,看到「突然发作」就点头,看到「有疫苗」也点头。原句一直在替你提供线索,所以整个过程没有卡顿。 到了早餐桌,原句不在了。你得从脑子里先找出三个比较角度,再把感冒和流感放回正确的一边。这是另一种动作,需要你自己把答案取回来。 能跟上别人写好的句子,只能说明你认得这条路;盖住以后还能自己走,才说明路线在你手里。 继续问「能不能再讲清楚一点」,通常会得到另一段更顺的解释,你还是可以一路点头。一个实际可行的做法是让 AI 暂停讲解,替你把刚才那段话盖住。 ## 让 AI 把推理过程还给我(自查与避坑) URL: https://xueai.miyang.cn/slides/learn-25.html (以下为免费预览,全文见页面) 让 AI 把推理过程还给我 结论可以借,推演借走了下次还得再借。读完能用一句话判断自己刚才是学会了还是只完成了。 结论可以借,推演借走了下次还得再借。读完能用一句话判断自己刚才是学会了还是只完成了。 朋友把续租附件摊在桌上,手指停在那一条上,问你当时为什么接受。 三周前找房时,你把合同贴给 AI。押金是3500 元,原文写得很干脆: 提前退租,押金不退。 AI 建议改成「提前 30 天书面通知则退还押金」。房东答应了,你当天就签了。现在你还记得提前 30 天这个结论,却说不出它当时检查了哪几个条件,也说不出 30 天为什么合适。 朋友又往下指。附件多了一句「房内维修费用由乙方承担」。你看得懂每个字,却判断不了自然老化算不算、费用有没有上限。上次那段回答就在手机里,翻了十几分钟,能搬过来的只有那句修改结果。 房东只把合同留到当天傍晚,你只好再打开 AI,把新条款重新问一遍。事情依然能办完,可那个空洞已经露出来了:我上次到底学到了什么? ## 收藏之前,先用自己的话说一遍(自查与避坑) URL: https://xueai.miyang.cn/slides/learn-26.html (以下为免费预览,全文见页面) 收藏之前,先用自己的话说一遍 拥有信息和拥有能力之间没有自动兑换。读完你会在点星之前多做一步。 拥有信息和拥有能力之间没有自动兑换。读完你会在点星之前多做一步。 864 条收藏,7 条被你打开过第二次。你把收藏夹和最近一年的浏览记录对了一遍,先看到的是这两个数。 里面有理财文章、旅行攻略、健身教程,也有一批空气炸锅菜谱。前几天朋友要来家里吃饭,你说鸡翅交给自己,因为上周刚看过十几条做法,还把有用的全存下来了。 买菜时,朋友问鸡翅要腌多久、炸锅开多少度。你只记得「先腌一下,再放进去烤」。回家搜收藏夹,搜出37 条相关内容,标题都像看过。你来回点开,花了十一分钟才找到当时那条。 原话一直保存得好好的: 「鸡翅擦干水分,腌制 30 分钟。空气炸锅 180℃ 先烤 15 分钟,翻面后再烤 8 分钟。表面水分没擦干,成品容易发软。」 你点收藏的时候确实松了一口气:链接不会丢,周末照着做就行。只是那一下完成的是保存,没要求你说出任何一句,也没要求你做一次选择。点收藏带来的踏实感是真的,它兑换不成会做这件事的能力。 那点星之前多做哪一步,才能让下次被人问到时,脑子里真的有一句可用的话?下面让同样的十二条鸡翅教程走两遍。 ## 让 AI 按我的目标筛掉暂时用不上的材料(给自己设计一门课) URL: https://xueai.miyang.cn/slides/learn-27.html (以下为免费预览,全文见页面) 让 AI 按我的目标筛掉暂时用不上的材料 材料按知识完整性编排,你的时间按自己的目标编排。读完能写出一句别人看得见的目标,拿它筛材料。 材料按知识完整性编排,你的时间按自己的目标编排。读完能写出一句别人看得见的目标,拿它筛材料。 「你学这个想干什么?」 同事在午休时看见你又打开做菜视频,顺口问了这一句。你答了半分钟:买了两本入门书,收藏了二十四节课,刀工看到第三节,火候那章也快学完了。说出来的全是书名、课名和章节名。 他接着问:「所以你想做成哪顿饭?」你停了一会儿,只能说想先系统学学。你原以为自己有目标,因为书已经买了,课也排进了四周计划。可那些东西只说明你准备看什么,没人能从中看见你最后要做成什么。 第二个周末,两个朋友来家里吃饭。你照书练过切丝,也花一下午熬了高汤,真正开火才发现自己没练过四道菜怎样错开下锅。第一盘菜上桌时,最后一道还没切完。十二小时已经花完,饭却没有按时端出来。 问题不在那本书。书要把做饭这件事讲完整,所以会从工具、刀工、火候一路排下去。你的十二小时只够解决眼前的一件事。材料按知识的完整性编排,时间要按你想做成的结果编排。 那句结果该写到多具体,才能从六章内容里筛出这次先学什么、以后再学什么?带着这个问题看下面两条路。 ## 让 AI 用一个成品检查我会不会(给自己设计一门课) URL: https://xueai.miyang.cn/slides/learn-28.html (以下为免费预览,全文见页面) 让 AI 用一个成品检查我会不会 里程碑到期那天要交一个别人看得见的东西,开工之前先跑一次前置自测。 里程碑到期那天要交一个别人看得见的东西,开工之前先跑一次前置自测。 摄影课首页的进度条已经走到68%。曝光、构图、人像用光三个章节全打了勾,每节视频也确实从头看到了结尾。你看着那排绿色对勾,觉得自己已经跨过了入门。 朋友准备在家里办生日聚会,问你能不能帮忙拍几张。你答应下来,还特意把相机从自动挡拨到了手动挡。课程里讲过的光圈、快门、ISO 都认得,可站到窗边以后,第一步该调哪个,你脑子里一片空白。 你先照着印象拨了几个数。拍了27 张,窗边的人脸一会儿发黑,一会儿亮得没了细节;有人一动,照片又糊了。折腾四十分钟,最后还是拨回自动挡。课程进度没有倒退,那三个勾也都还在。 你原先把看完当成了会用,因为平台每播完一节,就替你留下一个完成记录。可它从没要求你独立调一次参数,也没检查你能不能说明为什么这样调。进度百分比只记录你走过多少页面,交不出你已经会做什么。 那接下来的一周该怎么写,才能在周日直接看出自己会没会?还有,怎样在开工之前就发现自己连 f 值都没弄明白,免得等到聚会当天才卡住?带着这两个问题,把下面三条计划换一遍。 ## 让 AI 帮我先留出复习时间(给自己设计一门课) URL: https://xueai.miyang.cn/slides/learn-29.html (以下为免费预览,全文见页面) 让 AI 帮我先留出复习时间 排周历的时候先扣掉复习位,再往剩下的空里放新内容。读完能看出复习位是怎么被新内容一格一格占掉的。 排周历的时候先扣掉复习位,再往剩下的空里放新内容。读完能看出复习位是怎么被一格一格占掉的。 关掉视频的时候,手指还知道下一步该往哪放。C、G、Am 三个和弦,你跟着练了 90 分钟,到最后能连着换八遍,中间一次都没停。那是周一晚上。 你看了一眼接下来六周的课程表,写下这句话: 这三个和弦已经记得挺牢,这周找时间复习就行。 周二临时加班,回家只洗了澡。周三的新视频开始教扫弦,你练了一个小时。周四群里发来一段副歌教程,你跟着试了四十分钟。周五晚上聚餐。到了周日,日历里只剩 45 分钟,你拿它追了下一节课,想着复习下周再补。 第二个周一,视频要求把 C、G、Am 接上扫弦。你按 C 没问题,换到 G 时停了三次,Am 的位置要低头找。上周连续换过的三个和弦,只剩一个能直接按出来。 当时的判断并不奇怪。刚练完时,动作、画面和讲解都还在眼前,很容易把「此刻能跟着做」当成「下周还能自己做」。还有一层,新课程有明确的标题和时长,复习只有一句「找时间」。每天重新排一次,新内容总能先拿到位置。 只对 AI 说「帮我做一份六周练琴计划」,它通常会把新内容排得整整齐齐,再在每周末补一句复习。到了周三时间不够,最先被删掉的还是那句没有具体对象、没有固定时长的复习。 换一种交代方式,AI 就能替你做时间预算: 先算每周的总时间,只用日历里真的能拿出的小时数。 先锁定复习占用的时间,写清要重做哪个动作、用多少分钟。 再排本周的新内容,装不下的课程明确往后推。 这样排完,「这周找时间」会变成日历里看得见的一格,延期的新课也不会被藏起来。 同样是每周 5 小时,先后顺序真的会让六周结果不同吗?下面把两种排法放进同一张周历。 ## 直接指着这一页问 AI(把侧边栏的 Alice 用起来) URL: https://xueai.miyang.cn/slides/learn-30.html (以下为免费预览,全文见页面) 直接指着这一页问 AI 当前页正文会自动带给她,输入框里打六个字就够,不用先把这段复制过去。 当前页正文会自动带给她,输入框里打六个字就够,不用先把这段复制过去。 你正在读这个页面,读到「当前页正文会自动带给她」时停了一下:自动带过去的到底是什么,Alice 怎么知道你问的是哪一句? 照以前的习惯,你会先切出去,打开另一个 AI 对话框,再回来划中那句话。复制、切换、粘贴,然后补一句「这是一篇讲怎么使用 Alice 的课程」。背景不补,对方只看见一句孤零零的原文,不知道「这里」指向哪儿。 等这一套动作做完,你最初想问的已经从「她怎么知道我在问哪一句」,变成了「我该怎样把背景交代完整」。如果贴少了,还要回来找上一句;贴多了,又得重新指出真正卡住的位置。提问前的搬运,正在挤掉提问本身。 在 xueai.miyang.cn 的课程页里,这套搬运动作可以省掉。输入框上方常驻当前页的灰色引用条,当前页正文会自动到 Alice 那边。你直接打「这里我看不懂」,她收到的不只有这六个字,也有这六个字指向的页面内容。 如果卡住的是一小段,就在正文里划选两个字以上。浮层出现后点「问问 Alice」,选中的内容会进入引用 chip。这时问的落点更窄,就是你刚刚划中的那一段。先看一遍演示,右边会把 Alice 实际收到的内容逐层叠出来。 ## 让 AI 现在就考我(把侧边栏的 Alice 用起来) URL: https://xueai.miyang.cn/slides/learn-31.html (以下为免费预览,全文见页面) 让 AI 现在就考我 空态第五道模拟面试围绕本页标题出题,一次一道,由浅入深。读完会用它看出哪一句取不出来。 空态第五道模拟面试围绕本页标题出题,一次一道,由浅入深。读完会用它看出哪一句取不出来。 你刚把这一页从头读到尾。标题看懂了,段落之间也接得上,Alice 的每一句说明都没有把你卡住。鼠标准备去点下一页时,你给了自己一个判断:这一页已经会了。 先别往下翻,试着不看前文回答三个细节:模拟面试从哪里打开,她一次问几道,你答偏以后她先做什么。刚才读到这些话时都很熟,现在要自己说,句子却不一定马上出来。 这里混在一起的是两种状态。跟得上,是文字还在眼前时,你能认出它在说什么。取得出来,是文字离开眼前后,你还能自己说出空态里的第五道「模拟面试」,还能说出她会一次只问一道。 跟得上,不能替你证明取得出来。页面一直把词递到眼前,再读一遍只会让它更熟。你手上仍然没有一个结果,能指出哪一句已经能自己说,哪一句只是看见时点头。 能分开这两种状态的办法,是让问题先出现,再看你能不能从脑子里把答案取出来。答得出来,才有东西可记;答偏了,偏在哪里也会露出来;一句都取不出,补课从哪一段开始也有了位置。 所以方向要反过来。读的时候是 Alice 输出,你接收;考的时候是你输出,她来指。她不替你把答案说得更顺,她先等你说。下面这轮演示把答对、答偏和说不会三条路放在同一道题里,你可以逐条点开看。 ## 让 AI 下次主动想起我摘抄的内容(把侧边栏的 Alice 用起来) URL: https://xueai.miyang.cn/slides/learn-32.html (以下为免费预览,全文见页面) 让 AI 下次主动想起我摘抄的内容 收藏是把那句话挪到另一个地方等你想起来。摘抄进笔记的那条,下一次你问相关的问题,它自己到她手上。 收藏是把那句话挪到另一个地方等你想起来。摘抄进笔记的那条,下一次你问相关的问题,它自己到她手上。 某一页上有一句正好用得上的话:「隔一天再想起来,比当天连着读三遍记得牢。」顺手存进收藏夹,页面提示收藏成功,那一下让人踏实,这事像处理完了。 接下来你问了别的概念,翻过两页,又隔了两天。到第三次对话之后,你已经记不起存过哪一句,也没有东西提醒你去翻。 几天后,你回来问 Alice:「我这周要背的东西太多,时间怎么排?」她建议每天固定一段时间,每块多读几遍,没有用上收藏夹里的原话。 整个过程没有报错。收藏成功了,Alice 也正常回答了。你不会怀疑存过的东西没有生效,只会觉得她给的建议平平无奇:她也就这样。 收藏夹在另一个地方,等你主动打开。这次上下文里没有那句话,Alice 只能给通用建议。收藏的失效是无声的,所以人往往不会去修它。 下面把同一句话存两次。先存进收藏夹,再摘抄进笔记。三次对话后问同一个问题,看 Alice 会不会自己用上原话。 ## 从 32 个动作里选出我的下一步(收尾) URL: https://xueai.miyang.cn/slides/learn-33.html (以下为免费预览,全文见页面) 从 32 个动作里选出我的下一步 前面三十二页各讲一件事。勾出现在最缺的那两三项,这一页给出该走的页码顺序。 前面三十二页各讲一件事。勾出现在最缺的那两三项,这一页给出该走的页码顺序。 前面三十二页,每一页你都点过一次头。合上电脑,到了明早真要开始的时候,眼前却只剩三十二条都像该做的动作:先改提问,先查原文,先做笔记,还是先安排复习?你很难判断第一步落在哪里。 条目一多,挑选本身就会耗掉行动力。更麻烦的是,这些动作有先后依赖:问题还没问清,后面的核查会追着偏掉的回答跑;材料还没读懂,笔记里留下的也只是模糊印象。顺序排反了,前面花的时间可能接不到下一步。 下面这张表用来收口。先在左边勾出最像你现状的两三项,右边会留下相关页面,并按依赖重排。你得到的是一条带页码的回看路线:从第一行开始走,走完一页再点下一页。先处理眼下最缺的几项,再回来选下一批。 ## 今天先完成这三行(收尾) URL: https://xueai.miyang.cn/slides/learn-34.html (以下为免费预览,全文见页面) 今天先完成这三行 三个动作,十分钟以内做得完。这一页不讲新东西,填完带走自己那三行。 三个动作,十分钟以内做得完。这一页不讲新东西,填完带走自己那三行。 这一页很小。你只要填三行,花十分钟以内,不用回头复习,现在就能开始。 这三行各有用途:第一行写完整提问,第二行拿一段材料跑完拆解,第三行把结果写成看得见的动作。填完后,你手上多出一份这周能照做的确认单。 有个诚实的提醒。大部分人会把这一页也读完,然后关掉,前面三十多页也就停在读过。找一件你这周要弄懂的事,把三格样例换成自己的话。三格都有你的内容,这一页才算完成。 ## 用 30 道题找出我没学会的地方(收尾) URL: https://xueai.miyang.cn/slides/learn-35.html (以下为免费预览,全文见页面) 用 30 道题找出我没学会的地方 三十道题覆盖前面三十二页。每一道先自己答一遍再翻答案,没答上的那几条,末尾按页码排成一张补课清单。 三十道题覆盖前面三十二页。每一道先自己答一遍再翻答案,没答上的那几条,末尾按页码排成一张补课清单。 懂了没有,这件事自己说了不算。走到这里,脑子里大概会冒出一句「我应该都懂了吧」,可这个判断没法靠自己点头来验证。内容看着熟、答案读着顺,都可能让人觉得会了,真正要用时却一句也取不出来。读起来熟,不能证明你答得出来。 这一页给你 30 道题,从前面的内容里逐页抽问。规则只有一个:每一道都先停几秒,把自己的答案出声说一遍,再点开右边的答案。说出半句也算,卡住也算,你要留下的是此刻真实能取出来多少。 先回答,再翻答案,这个顺序不能倒。先看到答案,脑子很容易补出「对,我本来也是这么想的」。这种感觉没有告诉你哪里会、哪里不会。刚才没答上的那几条,才是这次自测里真正有用的信息。 翻开后,按「这一道我答上了」或「这一道我没答上」。没答上的题会自动记下出处,全部走完后按页码排成一张补课清单。你不用重读 32 页,只回去补清单里的几页,补完再回来答对应的题。 ## AI 能干哪些神奇的活(AI 是个什么东西) URL: https://xueai.miyang.cn/slides/zero-0.html 先别学原理,看看它能干哪些神奇的活 如果你还没怎么用过 AI,或者只把它当「问答机」用过几次——这一课先看六个真实的使用现场。看完你会明白一件事:这不是又一个新软件,这是软件历史上第一次「反过来」。 六个真实使用现场:整理纪要、看懂报告、给任何人讲任何事、陪练面试、做小工具、生成海报。以前是人学软件,现在是软件听人话 人学软件 计算器、Word、美图秀秀、Excel……每个软件是一堆固定的按钮:功能是提前设计好的,你想干什么,得先学会它的规矩——找按钮在哪、背操作步骤、看说明书、报培训班。 软件听人话 历史上第一次,工具反过来迁就人:你说人话,它来干活。没有按钮要找,没有步骤要背,没有说明书。你怎么跟同事交代工作,就怎么跟它交代。 刚才那六个现场,是同一个东西干的。以前是「一个需求,下载一个 App」;现在是「一个需求,说一句话」。它不是某个功能的升级版——它是第一个通用工具:你能用「说话」布置的活,它都能接。 ✅ 这一课想和你分享的 AI 是软件历史的分水岭:过去 40 年是人学软件,现在是软件听人话 它是通用的:整理、解释、改写、陪练、做工具……一个对话框全包 不用背功能列表:判断标准只有一条——这活能用「说话」布置吗?能,就丢给它试试 神奇但有坑:它会自信地犯错,后面几课我们一起把坑绕开 ## 它其实在玩「接话茬」(AI 是个什么东西) URL: https://xueai.miyang.cn/slides/zero-1.html AI 到底是什么?它其实在玩「接话茬」 别被「人工智能」四个字吓到。ChatGPT、DeepSeek、豆包……不管叫什么名字,它们做的事情本质上只有一件:猜你这句话的下一个词是什么。这一课不需要任何基础,玩两个小游戏你就明白了。 不需要任何基础:AI 每次只做一件事——猜下一个字。两个小游戏,建立你对 AI 的第一个正确直觉 先别管 AI。下面三句话都没说完,点开每一句,看看你心里冒出来的下半句,和大多数人是不是一样的。 选一个开头,点「让 AI 接下去」。下面这个框,是它每往下写一步时脑子里的那道选择题——放慢了给你看。留意两件事:一是它不是一个字一个字往外蹦的,「馄饨」「五花肉」「分钟」都是一整块写出来的,这一块叫词元(token)——有的词元是一个字,有的是一个词,后面的课会讲它是怎么切出来的;二是每个候选后面那根横条的长短——横条越长,说明它越倾向于选这一块;有的一步几乎是被前文摁着写出来的,有的一步它明显在几个选项之间摇摆。同一个开头多跑几遍——在几根横条差不多长的地方,它并不总是挑最长的那根。 你可能会问:接话茬我懂了,可我和 AI 是在一问一答地聊天啊?其实,聊天只是接话茬换了个包装—— 为什么它能写文章? 接话茬接得又长又顺而已。你给个开头(题目和要求),它一个词一个词往下接,接出一整篇。 为什么它会胡说八道? 它只管接得像不像,不管接得对不对。顺口的错话,比笨拙的真话更容易被它选中。这事很重要,后面单独用一课讲。 为什么同一个问题,每次答得不一样? 上面的演示里,它并不总是挑最长的那根横条——在几个候选可能性相近的地方,它按可能性大小掷一次骰子,于是走上不同的句子岔路。横条长到 99% 的地方则怎么掷都是同一个结果,所以差异只出现在它本来就摇摆的那几处。 你可能听说过「AI 连小学数学都会算错」。学完接话茬,这个谜你已经能自己解开了——它从来不是在「算」,它是在接话茬。下面两道题都发给它试试,看看它脑子里的候选有什么不同。 ✅ 这一课想和你分享的 AI = 超级接话机器:它做的事就是不停地猜「下一个词是什么」 聊天只是接话茬的包装:你的话是上半句,它负责接下半句 它没有想法:它有的是从海量文字里统计出来的语言规律 它算数学靠「背」不靠「算」:常见的题背得滚瓜烂熟,没见过的题只能猜个像样的数 接得像 ≠ 接得对:这是用好 AI 最重要的一根弦,下一课展开 ## 它不是搜索引擎(AI 是个什么东西) URL: https://xueai.miyang.cn/slides/zero-2.html 它不是在网上帮你搜答案 关于 AI,新手最常见的误解是:「不就是个更聪明的搜索框吗?」——完全不是一回事。上一课你已经知道它在「接话茬」,这一课看清它和搜索引擎的本质区别,你就知道什么时候该用哪个。 搜索给书架,AI 给结论。理解「凭记忆回答」的三个后果:会记串、知识有截止日期、没有出处可查 搜索引擎 = 图书管理员 你说要找什么,它把你带到书架前,指给你十本可能相关的书(还顺手塞两本广告)。书是别人写的,它自己一个字都没读过,读不读、信不信,是你的事。 AI = 读完了整个图书馆的人 它提前读完了图书馆里几乎所有的书,然后把书全部还了回去。你问它问题时,它手边一本书都没有——全凭消化后的记忆,现场把答案「接」出来。 它可能记串 读过的书太多,两本书的内容在记忆里糊在一起是常有的事:把 A 作者的书安到 B 头上、把两个相似案件的细节混着说。它记错的时候语气和记对的时候一样自信——下一课专门讲这个。 它的知识有「截止日期」 它读书是在过去某个时间点完成的,之后世界上发生的事它一概不知道。问它昨天的新闻、今天的天气、现在的股价,它要么坦白说不知道,要么凭旧记忆瞎接一个——后者更危险。 它给结论,不给书架 搜索结果里每条都有网址,你能点进去核对;AI 给你的是一段现成的话,没有天然的「出处」可查。它说得越流畅,你越容易忘了问一句:这是真的吗? 你想干什么 找谁 为什么 查今天的天气、新闻、股价、营业时间 搜索 / AI 联网 要的是「此刻的事实」,纯凭记忆的 AI 不可能知道 解释一个看不懂的概念、名词、体检报告 问 AI 它读过的解释比任何一个网页都多,还能顺着你的追问讲 改写、润色、翻译、起名字、出主意 问 AI 这类活儿没有「标准答案网页」可搜,是 AI 的独门强项 查一个重要的事实(法条、药量、数据) AI 先答 + 搜索核对 AI 帮你快速搞懂大概,但拍板前要找到原始出处 ✅ 这一课想和你分享的 搜索引擎给书架,AI 给结论:一个帮你找别人写的网页,一个凭消化后的记忆直接回答 凭记忆 = 可能记串:AI 记错时和记对时一样自信 它的知识有截止日期:「此刻的事实」要靠搜索或 AI 的联网功能 重要事实值得核对出处:它答得越流畅,越值得顺手确认一次 ## 它会一本正经地胡说(AI 是个什么东西) URL: https://xueai.miyang.cn/slides/zero-3.html 它会一本正经地胡说八道 前两课你知道了:它在接话茬,而且凭的是「消化后的记忆」。现在到了最关键的一课——接得像,不等于接得对。下面三段 AI 的回答里,每段都藏着一句编造的话。来,亲手抓一次。 三个找茬游戏:亲手从 AI 的回答里抓出编造的句子,再带走三个实用的小习惯 习惯一:具体的事实,核实了再用 看到数字、日期、人名、书名、法条、药量这些「有标准答案」的东西,用之前搜一下原始出处。AI 帮你省的是理解时间,不能帮你省核实时间。 习惯二:多问一句「你确定吗?出处是什么?」 这句追问经常能让它自己改口(「抱歉,刚才的说法不准确……」)。但注意:它给的出处本身也可能是编的——编一个像模像样的论文标题,对接话机器来说毫不费力。出处要自己点开验证。 习惯三:越重要的决定,越值得多一个信息源 健康、金钱、法律相关的事,把 AI 的回答当成「一个消息灵通的朋友的参考意见」——朋友的话有价值,但你不会因为朋友一句话就吃药、签合同、打官司。 ✅ 这一课想和你分享的 接得像 ≠ 接得对:顺口的编造,天然赢过诚实的犹豫 它胡说时不心虚:语气、流畅度和说真话完全一样,凭感觉分不出来 它不知道自己不知道:它也没法主动告诉你「这句是编的」 三个小习惯:事实顺手核实、请它给出处、重要的事多找一个信息源 ## 把它当不了解你的新同事(怎么和它说话) URL: https://xueai.miyang.cn/slides/zero-4.html 把它当一个聪明、但完全不了解你的新同事 为什么别人用 AI 效果惊人,你问它却答得平平?九成的差距不在 AI,在问法。这一课给你一个思维模型和一个公式,立刻就能用。 三档提问对比 + 提示词积木组装器:背景、要求、限制——信息给一分,它答一分 想象公司来了个新同事:名校毕业、什么领域都懂、执行力极强。但今天是他入职第一天——不认识你,不知道你负责什么,不知道你要这个东西给谁看、拿去干什么。你走过去丢下一句「帮我写个请假条」就走了。他能写出什么?只能凭想象瞎写一个。这不是他不聪明,是你什么都没告诉他。AI 就是这个新同事。而且更极端:每次新开对话,都是他的入职第一天。 场景:你想在小区业主群里卖掉一辆二手自行车。从最偷懒的问法开始,依次点亮下面四块信息,看 AI 的输出怎么一步步变好。 我是谁,在什么场景 身份、场合、给谁看、拿去干什么。这是新同事最缺的信息。 我到底要什么 要做的事 + 关键细节。细节给得越实,它编造的空间越小。 什么样算合格 语气、长度、格式、不要什么。给验收标准,一次到位。 ✅ 这一课想和你分享的 AI = 聪明但不了解你的新同事,而且每次新对话都是他入职第一天 它答得平庸,多半是信息还没给够:信息给一分,它答一分 公式:背景 + 要求 + 限制——我是谁、我要什么、什么样算合格 对 AI 啰嗦是免费的:多打三十秒字,省十分钟返工 ## 万能开场白:先问我几个问题(怎么和它说话) URL: https://xueai.miyang.cn/slides/zero-5.html 万能开场白:「先问我几个问题,再开始」 上一课的公式很好,但你可能已经发现一个死结:很多时候,你自己也不知道该交代什么。这一课分享一个小办法:把这个难题原样丢回给 AI——只需要一句话。 说不清需求没关系,让它来问你。点选式对话演示,亲手体验回答质量翻倍的瞬间 比如你想让 AI 帮忙规划一次国庆家庭旅行。按上一课的公式,你该交代背景——可你压根没想过:预算算不算机票?爸妈的体力能走多少路?孩子晕不晕车?专家和新手的区别,往往不是知道答案,而是知道该问什么问题。好消息是:AI 读过无数旅行攻略、方案模板和踩坑帖,它非常清楚「规划一次旅行需要先搞清什么」——前提是,你允许它先问你。 好的!以下是几个国庆出行的热门推荐: 1. 北京:故宫、长城、环球影城,适合亲子游; 2. 三亚:阳光沙滩,度假首选; 3. 成都:大熊猫基地、宽窄巷子,美食之都…… 建议提前预订酒店和车票,国庆期间人流较大,注意错峰出行。 ✅ 这一课想和你分享的 说不清需求很正常:知道该问什么问题,本来就是专家的能力 那就让 AI 来问:「开始前,先问我几个问题」——一句话激活它 它每问一个问题,就是在替你排除一大批不适合你的答案 四个变体拿去就能用:先问我 / 先列大纲 / 先摸底 / 先问需求再推荐 ## 提示词到底怎么写才好?(小白三千问 · 会用篇) URL: https://xueai.miyang.cn/slides/zero-q-prompt.html 提示词到底怎么写才好? 网上流传着各种「神级提示词模板」,动辄几百字。其实真正管用的骨架只有三块,剩下的都是锦上添花。 把「背景、要求、限制」三块说清楚,你的提问就已经超过九成的人——提示词不是咒语,就是一次说清楚的交代。 背景:我是谁,情况是什么 它不认识你。你的行业、对象、场合,说了它才知道往哪个方向答。 要求:我要什么 要一段文字?一个清单?一个方案?动词越具体,结果越对路。 限制:什么样算合格 语气、长度、格式、不要什么。这是你的「验收标准」,给了就少返工。 任务:让 AI 帮你写一条面包店开业的朋友圈文案。每组选一块拼图(也可以不选),看看拼出来的提示词和 AI 回答会怎么变。 技巧一:给一个例子,胜过十句形容 你说「写得活泼一点」,它对「活泼」的理解可能和你差很远。贴一段你喜欢的范文,说「照这个感觉写」,风格立刻对齐。 技巧二:说不清就让它先问你 不知道该交代什么?一句「开始前,先问我几个问题」,让它来采访你。它问的每个问题,都在替你排除不合适的答案。 技巧三:不满意就说「哪里」不满意 第一版不好很正常——别整个推翻重来,指着具体的地方改:「第二段太正式了,改口语些」「开头别用问句」。两三轮就能逼近你要的。 ✅ 这一页想和你分享的 骨架只有三块:背景(我是谁)+ 要求(我要什么)+ 限制(什么样算合格) 例子胜过形容词:贴一段范文,风格立刻对齐 说不清就让它先问:「开始前,先问我几个问题」 改比重写快:指着具体的地方提意见,两三轮就到位 ## 「提示词工程」有什么意义?(小白三千问 · 会用篇) URL: https://xueai.miyang.cn/slides/zero-q-prompt-engineering.html 「提示词工程」是工程师才需要学的吗? 你可能听过「提示词工程师」这个职业,甚至听说过很高的薪水。一个「说话技巧」,凭什么配得上「工程」两个字? 同一个词,两种用法:对普通人,它是把话说清楚的功夫,上一页十分钟就能学会;对做 AI 产品的人,它是写进系统、被调用几百万次的「岗位说明书」——一个字的措辞差异都会被放大百万倍,所以配得上「工程」二字。 一次性的「交代」 你写「帮我把这段话改客气点」,用一次就扔。写得好省几分钟,写得差重问一次就行,试错成本几乎为零。这个层面的提示词,掌握「背景 + 要求 + 限制」就够用了。 系统级的「岗位说明书」 你用的每个 AI 应用(客服、助手、写作工具),背后都藏着一份几千字的提示词,规定 AI 的身份、边界、语气和禁区。它每天被执行几十万到几百万次——差一个字,几十万用户同时受影响,还直接影响每次调用花多少钱。 效果是「调」出来的,不是「写」出来的 专业团队会准备几百个测试问题,改一版提示词就全量跑一遍看效果——像做实验一样反复对比。这套「写→测→改」的循环,和调试代码没有本质区别。 每个字都在花钱 AI 按「词元」(token)计费,系统提示词的每个词元都会在每一次调用里重复计费。把 3000 字的提示词精简到 2000 字而效果不降,对一个日活百万的产品来说就是真金白银。 还要防「坏人」 有用户会故意诱导 AI 说不该说的话(业内叫「提示词注入」)。怎么在说明书里筑好防线,让 AI 面对诱导不越界,也是提示词工程的一部分。 假设你是一个 AI 产品的负责人,系统提示词里多写了一段可有可无的废话。拖动下面两个滑块,看看这段废话一年要花掉多少钱。 ✅ 这一页想和你分享的 日常用:提示词 = 说清楚的交代,掌握骨架就够 做产品:提示词 = 系统的岗位说明书,被调用百万次 「工程」体现在:反复测试调优、控制成本、防注入攻击 对你的意义:理解了这一层,就明白为什么同一个 AI,不同产品用起来差别那么大 ## 模型、Agent、应用是什么关系?(小白三千问 · 会用篇) URL: https://xueai.miyang.cn/slides/zero-q-model-agent-app.html 模型、Agent、AI 应用是什么关系? 新闻里一会儿说「XX 发布新模型」,一会儿说「Agent 元年」,一会儿又是各种 AI App——这三个词到底谁是谁? 拿汽车打比方:模型是发动机(提供能力),Agent 是装上轮子和方向盘的整车(能自己上路干活),AI 应用是你手机里叫到的那辆网约车(包装成普通人能直接用的服务)。 提供「智能」这个原材料 GPT、Claude、DeepSeek、通义千问……这些名字指的都是模型。它只做一件事:你给它文字,它接出文字(见「接话茬」那一课)。发动机很强大,但单独一台发动机放在地上,普通人用不了。 让模型能「动手」,而不只是「动嘴」 给模型接上工具——能查资料、读文件、执行操作、检查结果不对就重来。这一整套装置叫 Agent。区别在于:模型只能告诉你「怎么做」,Agent 能直接「做完」。你说「帮我把这个月的发票整理成报销单」,模型给你方法,Agent 给你结果。 普通人直接用的成品 ChatGPT、豆包、Kimi 这些 App,以及各种 AI 客服、AI 修图、AI 做 PPT 的工具,都是应用层。它们把模型或 Agent 包装好:有界面、有账号、有客服,打开就能用。同一台发动机,可以造出轿车、货车、跑车——同一个模型,也支撑着成百上千个不同的应用。 ✅ 这一页想和你分享的 模型 = 发动机:提供智能,但普通人没法直接用 Agent = 整车:模型 + 工具 + 流程,能动手做完事情 应用 = 网约车:包装成打开就能用的服务 评价要对层:应用不好用,不一定是模型的问题 ## Agent 到底强在哪?(小白三千问 · 会用篇) URL: https://xueai.miyang.cn/slides/zero-q-agent.html Agent 到底强在哪?为什么大家都在说它 上一页说 Agent 是「装上轮子的整车」。这一页看它实际跑起来什么样——同一件事,聊天式 AI 和 Agent 的差距在哪。 聊天式 AI 给你「方法」,Agent 给你「结果」。它强在四个字:把事做完——自己拆任务、自己动手、自己检查、错了自己重来,中间不需要你盯着。 任务:「把我这个月的 23 张发票整理成一张报销单。」 会拆任务 接到大目标,自己拆成小步骤:先干什么、后干什么、哪一步要先确认。 会用工具 能查资料、读文件、算数字、操作软件——接话茬的大脑,配上了能干活的手。 会自查 做完一步会回头看结果对不对:合计不平就重新算,链接打不开就换一个来源。 会坚持 一条路走不通就换条路,直到把事办成或者明确告诉你卡在哪——而不是给一版答案就下班。 ✅ 这一页想和你分享的 核心区别:聊天给方法,Agent 给结果 四个能力:拆任务、用工具、自查、坚持到做完 你的角色变了:从「执行者」变成「验收的人」 老习惯不变:重要结果交出去之前,自己过目一遍 ## 最近很火的 Skill 是什么?(小白三千问 · 会用篇) URL: https://xueai.miyang.cn/slides/zero-q-skill.html 最近很火的 Skill 到底是什么? 刷到过「给 AI 装技能」「Skill 生态爆发」这类说法吗?听着高深,其实这可能是 AI 圈里最容易理解的一个新词——你小时候抄在课本角落的小抄,就是它的全部原理。 Skill 就是一张写给 AI 的「经验小抄」:一个普通的文本文件(通常叫 SKILL.md),用大白话告诉 AI「遇到这类任务时,先做什么、再做什么、注意什么」。它不是什么新技术——但它能让 AI 从「来回问你四趟」变成「一趟全搞完」。 同一个任务:「去阳台把衣服收了」。看看没带小抄和带了小抄的 AI 管家,干起来差多少。点下面切换对比。 刚才「好循环」的秘密全在这个文件里。注意看:没有一行代码,全是大白话——这就是为什么说人人都能写。 大家用上了同一种小抄 Claude、Cursor、Copilot 等主流 AI 工具先后支持了同一个简单格式(就是那个 SKILL.md 文件)。写一张小抄,到处都能用——生态一下就热闹起来了。 人人都能写 它不用编程,就是把你的经验写成大白话。你怎么教新同事做一件事,就怎么写小抄。会写工作交接文档,就会写 Skill。 经验第一次能「装」进 AI 以前老师傅的经验只能口口相传;现在写成小抄,AI 读了就会。你的经验变成了 AI 的能力——这是大家兴奋的真正原因。 ✅ 这一页想和你分享的 Skill = 写给 AI 的经验小抄:一个大白话文本文件,不是新技术 它解决的问题:让 AI 出门前就想清楚,一趟搞完,不来回折腾 火的原因:主流工具统一了格式 + 人人都能写 + 经验能复用 你可能已经在用:各种「智能体模板」背后就是包装好的 Skill ## Vibe Coding 是什么?不会写代码也能做软件吗?(小白三千问 · 会用篇) URL: https://xueai.miyang.cn/slides/zero-q-vibe-coding.html Vibe Coding 是什么?不会写代码也能做软件吗? 最近总刷到「一句话做了个 App」「零基础做出小工具」这类帖子,这种玩法有个名字,叫 Vibe Coding。它到底靠不靠谱?靠谱到什么程度?这一页给你交个底。 Vibe Coding 指用大白话指挥 AI 写代码,你主要负责提需求和试用反馈。不会编程的人真能做出能用的小工具;但要做给很多人用的正经产品,还是需要专业把关。 挑一个你身边真会用到的需求,看看从「说一句话」到「能用了」的全过程。点一张卡片开始回放。 放在几年前,「不会编程做软件」确实是句空话。变化发生在 AI 学会了写代码,而且写得相当熟练。于是分工变了:代码由 AI 来写,你的工作变成说清楚要什么。这正好是普通人擅长的事,你天天都在跟人描述需求:「帮我把这个表格按月份分一下」「这张图帮我调亮一点」。 本站开篇讲过一句话:以前是人学软件,现在是软件听人话。Vibe Coding 就是这句话落到「做软件」这件事上的样子。你甚至会发现,把需求说清楚这件事本身,就是一种新的编程。 交完底也得说清楚:Vibe Coding 做自用小工具很顺手,但有三类软件,出了问题后果不一样,需要专业开发者把关。 碰钱的 收款、转账、算工资…这类软件出一个 bug,损失是真金白银。专业团队会做大量测试和防错设计,这些活 AI 目前替代不了「有人负责」这四个字。 存隐私的 存别人的手机号、住址、健康记录,就有了保护数据的责任。数据怎么加密、泄露了怎么办,这些问题需要懂安全的人来兜底。 很多人同时用的 自己用的工具卡一下无所谓;几千人同时用的服务一崩,就是事故。扛住人多是一门专门的手艺,得让专业的人来。 上手门槛低得出乎意料:打开你常用的 AI 对话工具,用大白话描述一个你真想要的小东西,让它做成一个网页给你。比如「帮我做一个网页,全屏显示距离我女儿高考还有多少天,字要大,背景要好看」。做出来不满意就接着说,改到满意为止。 ✅ 这一页想和你分享的 Vibe Coding = 用大白话指挥 AI 写代码:你提需求、试用、反馈,代码归 AI 把需求说清楚,就是新的编程:这件事普通人本来就擅长 自用小工具随手做:记账表、抽签器、倒计时页,当晚就能用上 上生产要专业把关:碰钱的、存隐私的、很多人用的,交给专业开发者 从玩具开始练手感:今晚就描述一个你真想要的小东西试试 ## 国产大模型有哪些?该怎么选?(小白三千问 · 会用篇) URL: https://xueai.miyang.cn/slides/zero-q-china-models.html 国产大模型有哪些?该怎么选? 先说一个可能让你意外的事实:在全球用户盲测的排行榜上,国产模型早就不是「追赶者」了——好几家排在世界前列。真正的问题不是「哪家最强」,而是「你的场景适合哪家」。 主力玩家有:阿里通义千问、月之暗面 Kimi、DeepSeek、字节豆包、智谱 GLM、百度文心、腾讯混元、MiniMax 等。它们像不同专业的优等生,各有拿手科目——按场景选,比问「谁第一」有用得多。 通义千问 Qwen 综合实力代表:旗舰版在全球文本盲测榜排进前五,和世界最强一档掰手腕;图片生成也在全球前列。开源版本发得多,是全球开发者用得最多的开源系列之一。 Kimi Agent 干活的好手:旗舰版在全球 Agent 榜排进前五——「自己动手做完事」这门科目上很能打;处理长文档也是它的传统强项。 DeepSeek 性价比之王:官方 API 每百万字输入只要一两块钱,价格是同档模型的零头,编程和推理能力扎实。全球开发者圈的宠儿,「花小钱办大事」的代名词。 豆包 / 即梦 全家桶体验好:豆包 App 是国内用户量最大的 AI 应用之一,上手零门槛;生图 Seedream、生视频 Seedance 都在全球榜前列——视频生成排到了全球第二。 GLM 清华系技术流:旗舰版稳居全球榜第一梯队之后的位置,编程和工具调用是强项,开源社区口碑好,企业客户多。 文心 / 混元 / MiniMax… 百度文心搜索整合深;腾讯混元背靠微信生态,视频模型开源;MiniMax 的语音和视频出彩(视频模型开源全球第四);还有小米、美团等也都下场了——这个赛道热闹得很。 ✅ 这一页想和你分享的 国产模型已在全球第一梯队:好几家排进世界前列,不是「将就用」 没有全能冠军:写作、编程、Agent、生图生视频,各家拿手科目不同 普通用户:豆包 / Kimi / 通义 / 元宝的 App 挑顺手的用就好,都免费 选择的心法:先想清楚你要干什么,再看谁这门课分高 ## 还有哪些重要的 AI 公司?(小白三千问 · 会用篇) URL: https://xueai.miyang.cn/slides/zero-q-companies.html 除了 OpenAI,还有哪些重要的 AI 公司? 新闻里的名字太多记不住?其实常出场的主角就那么几位。先玩个配对游戏,把「公司」和「代表作」对上号。 国际上最常出场的是:OpenAI(ChatGPT)、Anthropic(Claude)、Google(Gemini)、Meta、马斯克旗下的 xAI(Grok)、法国 Mistral;再加上上一页认识的国产主力,AI 新闻里九成的名字你就都对得上号了。 OpenAI 把 AI 带进大众视野的公司。ChatGPT 是全球用户量最大的 AI 应用,视频模型 Sora 也出自它家。 Anthropic 由前 OpenAI 研究团队创立,以安全和长文本见长。Claude 在编程和 Agent 场景的口碑尤其好,全球 Agent 盲测榜长期霸榜。 Google AI 研究的老牌豪门(Transformer 架构就出自谷歌论文)。Gemini 全家桶覆盖文字、图片、视频,视频模型 Veo 是全球第一梯队。 Meta Facebook 的母公司,开源路线的旗手——把强模型免费开放给所有人用,深刻改变了行业生态。 xAI 马斯克创办,和 X(原推特)深度绑定,风格生猛,更新极快,生图生视频也都有布局。 Mistral 欧洲的代表选手,小团队做出大能量的典型,开源社区人气很高。 ✅ 这一页想和你分享的 国际主角:OpenAI、Anthropic、Google、Meta、xAI、Mistral 各有性格:有人闭源做产品,有人开源做生态 别忘了卖水人:英伟达、微软、亚马逊是行业的地基 加上国产主力,AI 新闻里的名字你基本都认识了 ## Token 是什么?为什么 AI 按它收费?(小白三千问 · 概念扫盲) URL: https://xueai.miyang.cn/slides/zero-q-token.html Token 是什么?为什么 AI 按它收费? 账单上写着「按 Token 计费」,新闻里动不动「百万 Token」,这颗「Token」到底是个什么东西?这一页带你亲手把一句话切开看看。 Token 是 AI 读写文字的最小单位,大约是一小块词。AI 每读一颗、每写一颗都要消耗算力,所以按颗收费,逻辑和出租车按里程计价一样:跑多远,付多少。 下面有几句现成的话,点一句试试。你会看到它被切成一颗颗彩色的小块,每一块就是一颗 Token,下方的计数器和账单会实时跟着跳。 出租车按里程计价,因为车每跑一公里都实打实地烧油。AI 同理:每读一颗、每吐一颗 Token,机房里的显卡都在做一轮运算、耗一份电。按颗数收费,是最贴近真实成本的计法。而且要注意,账单是两头一起算的: 你发给它的(输入) 你打的每一个字、贴进去的每一段资料,它都要一颗颗读进去。读,也要钱。 它回给你的(输出) 它写的每一个字也是一颗颗算出来的。写,同样要钱,而且单价通常更贵,因为「写」比「读」费劲。 用上面的分词器对比一下中文句和英文句:中文常常一到两个字就要占一颗 Token,英文一个不短的单词往往只占一颗。所以表达同样的意思,中文消耗的 Token 数常常更多。这和模型「认字」的习惯有关:它对英文见得多、切得熟,对汉字只能切得更碎。 ✅ 这一页想和你分享的 Token 是计费的颗粒:AI 读写文字的最小单位,大约一小块词 输入输出都算钱:你发的要钱,它回的也要钱,后者通常更贵 同样的意思,中文往往更费:汉字被切得更碎,颗数更多 提示词写得精炼,就是在直接省钱:每省一颗都是真金白银 ## 为什么聊久了它会「忘事」?(小白三千问 · 概念扫盲) URL: https://xueai.miyang.cn/slides/zero-q-context-window.html 为什么聊久了它会「忘事」? 第 1 轮明明说过的事,第 20 轮它答得像完全没听过。它没坏,也没敷衍你,只是那句话已经不在它眼前了。 AI 没有无限的记性。它每次回答,只能看见「工作台」上放得下的最近内容;台面(术语叫「上下文窗口」)满了,最早的话就被挤掉。被挤掉的那部分,再也参与不了这次回答。 想象 AI 面前有一张桌子。你们每聊一轮,就往桌上放一张纸条,写着这一轮说了什么。AI 回答你时,只低头看桌上现有的纸条。桌子就那么大,纸条放满之后,每来一张新的,最旧的那张就被推下桌。掉在地上的纸条,它看不见,也捡不回来。 台面大小 = 上下文窗口 不同模型的台面有大有小,但都有边界。放满就是放满了,加钱也变不出第九个格子。 一张纸条 = 一轮对话 你说的和它回的都要占台面,长篇大论、大段粘贴的资料占得更多,台面满得更快。 下面是一场模拟对话。你在第 1 轮告诉过它「我对花生过敏」。往右拖动滑块增加对话轮数,看着台面慢慢放满,再看看那张关键纸条掉下去之后,它推荐的晚饭变成了什么。 重要信息,隔段时间重讲一遍 过敏、预算、格式要求这类关键设定,聊了十几轮之后不妨再说一次,等于把纸条重新放回台面最上层。 台面满了,直接开一个新对话 最直接的一招,也最常被忘掉:新对话就是一张空台面,之前挤掉的东西不再占地方。短任务重开就完事;长任务别裸开,先让它总结当前进展,把摘要贴进新对话再接着干。 发现它忘了,别跟它吵 它翻不回去掉在地上的纸条。直接把关键信息重新发一遍,比连问三句「你忘了吗」有用得多。 ✅ 这一页想和你分享的 忘事是容量问题:它没坏,是台面满了,最早的话被挤掉了 每次回答只看窗口内的内容:掉出去的部分等于没说过 重要设定要重申:隔段时间重讲一遍,把纸条放回台面 台面满了就重开:短任务直接开新对话,长任务先要一份摘要带走 ## 「推理模型」「深度思考」是什么?(小白三千问 · 概念扫盲) URL: https://xueai.miyang.cn/slides/zero-q-reasoning.html 「推理模型」「深度思考」是什么? 很多 AI 应用里都藏着一个「深度思考」开关。打开它,回答变慢了、账单变贵了,换来的到底是什么? 推理模型会先在草稿纸上一步步演算,再交答案。慢一点,也贵一点,但复杂问题错得更少。要提醒的是:简单问题也开深度思考,属于高射炮打蚊子。 普通模式像抢答:题目一出,凭第一反应张口就说。深度思考像考试里的大题:先在草稿纸上列条件、试几种解法,发现不对就划掉重来,最后才把答案誊到答题卡上。所谓「思考」,就是多写了几页草稿。草稿也是一个字一个字生成的,所以更慢,也更花钱。 来一道排座位的小逻辑题,点下面两个按钮,看两种模式各自怎么答。建议先看「秒答模式」,再看「深度思考模式」。 判断标准一句话:答案需要一步步推出来的,值得开;查一下或一眼能看出的,不值得。下面四道题,你来判一判,点了就知道对没对。 ✅ 这一页想和你分享的 推理模型 = 先打草稿再交卷:把演算过程写出来,再给答案 更慢也更贵:换来的是复杂问题上明显更稳 复杂开、简单关:高射炮别拿来打蚊子 所谓「思考」并不神秘:就是多生成了几页草稿文字 ## 参数越多越聪明吗?(小白三千问 · 概念扫盲) URL: https://xueai.miyang.cn/slides/zero-q-parameters.html 参数越多越聪明吗? 发布会上动不动「千亿参数」「万亿参数」,数字一个比一个吓人。这个「参数」到底是什么?数字大,就一定更聪明吗? 参数像大脑里旋钮的数量:旋钮多的,通常见识更广。但聪明程度还取决于训练数据的质量和训练方法;日常任务里,小模型常常反而更划算。 训练一个模型,就像调一台带海量旋钮的机器:每喂一批资料,就把一些旋钮拧一点点,让它的回答更像样。等训练结束,这几十亿、几千亿个旋钮的位置,合起来就存下了它学到的一切。所以参数量可以粗略理解成:这台机器有多少个可以拧的旋钮,也就是它能装下多少见识。 拖动滑块换档位,看看每个量级的模型大概像什么、跑起来要什么设备。数字只看量级就好,别纠结精确值。 旋钮多有旋钮多的代价:更慢、更贵、更挑设备。下面三种场景里,小模型经常打赢大块头。 小模型赢在速度 参数少,算得快。实时字幕、输入法联想这类要秒回的场景,大模型再有学问也等不起。 小模型赢在成本 同样一件事,小模型的电费和算力开销低一大截。量大的活儿,一年下来省出的钱很可观。 小模型赢在专精 比如客服系统里判断用户是想退货还是查物流,一个调教好的小模型又快又准,性价比碾压大块头。 选模型像选车:跑长途拉重货,上卡车;市区买个菜,一辆小电驴就够了。先想清楚任务有多难,再决定用多大吨位的模型,账单和体验都会舒服很多。 ✅ 这一页想和你分享的 参数是容量指标:旋钮越多,能装下的见识越多 数据质量和训练方法同样关键:旋钮多,拧得不好也白搭 选模型看任务定吨位:日常活儿,小模型常常更划算 新闻里的参数竞赛听听就好:干得好不好才是你的事 ## 为什么有的 AI 看不懂图片?(小白三千问 · 概念扫盲) URL: https://xueai.miyang.cn/slides/zero-q-multimodal.html 为什么有的 AI「看不懂」图片? 你可能遇到过:给 AI 发照片,它回「抱歉,请用文字描述」。也见过能把照片里的菜谱都认出来的。同样是 AI,差在哪? 因为「会说话」和「会看」是两套独立的本事。语言模型天生只认文字;想让它看图,得额外给它装一双「眼睛」——装了的叫多模态模型,没装的就只能对图片说抱歉。 第一步:把图切碎 「眼睛」(视觉编码器)把图片切成许多小方块,每块转译成模型认识的「词」——一张图就变成了一段特殊的「文字」。 第二步:当话来接 转译完成后,图片对模型来说就和一段话没区别了,照常「接话茬」。所以看图能力的本质,还是那台接话机器。 为什么不都装上? 装眼睛要用海量「图 + 文」配对数据重新训练,成本高、模型更大更贵。很多场景根本用不到看图,纯文本模型反而更快更便宜。 ✅ 这一页想和你分享的 会说话 ≠ 会看:看图需要额外的「眼睛」(视觉编码器) 眼睛的原理:把图切碎、转译成「特殊的文字」,然后照常接话茬 不装眼睛不是落后:更快更便宜,很多场景够用 看图和画图是两回事:全能应用背后是多个模型在分工 ## 微调是什么?和「喂资料」有什么区别?(小白三千问 · 概念扫盲) URL: https://xueai.miyang.cn/slides/zero-q-finetune-vs-rag.html 微调是什么?和「喂资料」有什么区别? 老板说「把公司资料喂给 AI」,供应商说「给你们微调一个专属模型」,听着像一回事,报价能差出几百倍。这一页用「上课」和「开卷考试」两个比方,帮你把这笔账算清楚。 微调是送 AI 重新上课,把知识练进它身体里;喂资料(也叫知识库、RAG)是让它开卷考试,随用随查。多数公司真正需要的,其实是后者。 同一个目标:让 AI 会回答你公司的问题。左边走「微调」这条路,右边走「喂资料」这条路。点下面的按钮,看两条路各要经历什么。 注意一个关键差别:微调改变的是模型本身,像把知识练成了肌肉记忆;喂资料完全没动模型,只是考试时允许它翻书。所以资料一更新,开卷这边换本书就行,上课那边就得重新读一遍。 道理懂了,落到具体事上怎么选?下面四个是企业里最常见的场景,点一个试试,看推荐方案和理由。 公司制度问答 让 AI 回答员工关于考勤、报销、休假制度的提问 固定的写作风格和口吻 让 AI 写出的每一篇文案都像同一个人的手笔 医疗术语理解 让 AI 真正看懂病历和检查报告里的专业表达 每天更新的价格表 让 AI 随时报出最新的产品价格和库存 🏫 微调(上课) 📚 知识库(开卷) 生效速度 几天到几周 当天就能用 成本量级 几万到几十万起步,还要专人伺候 低一到两个量级,普通团队就能搭 知识更新 资料变了要重新训练一遍 换个文件就行,随换随用 各自适合 改风格、改口吻、学专业「语感」 会变的知识:制度、价格、文档问答 给你一个省钱的顺序:先试提示词,再挂知识库,最后才考虑微调。很多「必须微调」的需求,认真写一段提示词就解决了;再不够,挂上知识库让它开卷;两样都试过还差口气,那才轮到花大钱送它上课。顺便提醒:饭局上有人说「我们训了个模型」,多数时候他做的只是前两步,这一页帮你听懂他到底干了啥。 ✅ 这一页想和你分享的 微调 = 上课:知识练进模型身体里,周期以周计、花费以万计 知识库 = 开卷考试:资料放书架随用随查,当天生效,换文件就更新 知识常更新就开卷,改性格、改风格、学专业语感才需要上课 省钱顺序:先试提示词,再挂知识库,都不够再考虑微调 ## 企业都在建的「知识库」是什么?(小白三千问 · 概念扫盲) URL: https://xueai.miyang.cn/slides/zero-q-knowledge-base.html 企业都在建的「知识库」是什么? 开会总听到「我们要建知识库」「接一下 RAG」,听着像什么大工程。其实它就是给 AI 配了一个随用随查的书架:考试可以开卷了,还得把翻到的那页指给你看。 把公司文件切成小块、建好索引,AI 回答前先去里面找出相关的几段,塞进对话里再作答。它拿着你的资料说话,出处也能标给你看。 整个知识库的运转就三步。点「下一步」逐步推进,每一步都用刚才那个书架的比方。 同样问一句「我们的差旅报销上限是多少」,切换下面两个按钮,看 AI 的回答差在哪里。 有人会问:干嘛这么麻烦,把公司几百份文件一股脑发给 AI 得了。两个原因: 台面装不下 AI 一次能「看在眼里」的内容有限,像一张大小固定的工作台,几百份文件根本摊不开。这个台面叫上下文窗口,这一页讲了它为什么会「忘事」。 按字数收费 AI 读进去的每个字都按 Token 计费,每次提问都附上全部文件,等于每次都把整个图书馆搬一遍,钱包先受不了。Token 怎么收费看这页。 所以知识库的思路很聪明:书都留在架上,每次只把最相关的几页带上考场。省钱,还装得下。 知识库让 AI 拿着资料说话,但它分辨真伪的能力有限:书架上的文件过时了,它照着旧文件答;两份文件互相矛盾,它可能各抄一半。它保证的是「有据可查」,管不了「据是否靠谱」。所以建知识库,一半功夫要花在整理文件上:删掉过时的、合并矛盾的,书架干净,答案才干净。 ✅ 这一页想和你分享的 知识库 = 开卷考试的书架:切块、建索引、考试时翻着答,就这三步 能标出处:答案来自哪份文件一目了然,点开原文就能核对 文件质量决定答案质量:书架上放了过时或矛盾的资料,AI 也照答 与训练无关:整个过程不改模型本身,换文件当天生效 ## GPT、LLM、AIGC…这些缩写怎么分?(小白三千问 · 概念扫盲) URL: https://xueai.miyang.cn/slides/zero-q-acronyms.html GPT、LLM、AIGC…这些缩写怎么分? 新闻里一句话能塞四五个缩写,个个都眼熟,个个都说不清。别慌,这一页用一局配对小游戏加一张关系图,帮你把它们各归各位。 AI 是最大的圈,LLM 是其中管文字的大模型,GPT 是造 LLM 的一种主流做法(同时被 OpenAI 用作产品名),AIGC 说的是「用 AI 生成内容」这件事本身。 规则很简单:先点左边一个缩写,再点右边它对应的人话解释。配对成功两边一起变绿锁定,配错了会抖一下。全部配完有奖励。 GPT 原本是一串技术术语的缩写(生成式预训练变换器),指造大模型的一种主流做法;后来 OpenAI 把自家产品直接命名为 GPT 系列,ChatGPT 更是火遍全球。于是新闻里的「GPT」有了两个意思:说技术时指那种做法,说产品时指 OpenAI 家的模型。就像「席梦思」原本是一个床垫品牌,用的人多了,大家把这类床垫都叫席梦思。听到 GPT 时看一眼上下文,就能分清它指哪个。 AI 圈造词速度很快,但好消息是:新缩写多半是上面这几个的组合或变体。遇到生词先问一句「它归哪个圈」: 是一种模型? 归到 LLM 那一层。比如 VLM(视觉语言模型)就是看得懂图的 LLM,落在「多模态」能力上。 是一种应用形态? 归到 Agent 那一层。各种「智能体」「数字员工」,多半是Agent 换了个营销说法。 是一种行为或能力? 归到 AIGC 或多模态那一类。「AI 写作」「AI 绘画」「文生视频」,说的都是拿工具干活这件事。 ✅ 这一页想和你分享的 一张嵌套图记住层级:AI ⊃ NLP ⊃ LLM ⊃ GPT,一圈套一圈 GPT 有双重身份:既是造模型的做法,又是 OpenAI 的产品名 AIGC 是行为,LLM 是工具:一个说「干什么」,一个说「用什么干」 新缩写先问归哪个圈:是模型、是应用形态,还是一种行为能力 ## 英伟达为什么那么值钱?(小白三千问 · 概念扫盲) URL: https://xueai.miyang.cn/slides/zero-q-nvidia-gpu.html 英伟达为什么那么值钱? 一家「卖显卡的」,市值能排进全球最前列,很多人第一反应是看不懂。看懂它只需要两个画面:一场淘金潮,和一场算术比赛。 AI 训练要同时做海量的简单算术,显卡天生擅长人海战术;全世界都在抢算力,英伟达是这轮淘金潮里最大的卖铲人。 当年淘金热有个经典观察:冲进金矿的人未必挖到金子,在路口卖铲子和牛仔裤的人先发了财。今天的 AI 就是新一轮淘金潮: 淘金的人 全世界的公司都冲进来训模型、做应用,都想挖到自己的金子。谁能挖到,现在还说不准。 铲子 挖金子得先有工具。AI 的工具是算力,主要就是一排排装满显卡的机房。没铲子,再好的想法也开不了工。 卖铲人 不管谁最后挖到金子,铲子人人都得买。英伟达卖的就是这把铲子,而且几乎是独一家,想买还得排队。 训练一个大模型,光算力开销就在几十万到上亿的量级,这些钱大头流向了同一家公司。淘金的人越多、越疯狂,卖铲人越值钱。 那为什么非要显卡?电脑里原本的处理器(CPU)也很强啊。因为两者的强法不一样:CPU 像一位博士,什么难题都会,但一次专注做一道;显卡(GPU)像一万名小学生,每人只会简单算术,但能同时开工。AI 训练要算的恰好是海量的简单乘加,正对小学生的胃口。点下面开赛,亲眼看看。 造出性能接近的芯片,别家未必做不到。难追的是另一样东西:多年积累的软件工具链和生态。全世界的 AI 开发者写程序,用的那套工具默认长在英伟达的地基上;换一家的芯片,等于让所有人搬家重装修,光有房子没人愿意来。硬件可以砸钱造,生态只能靠时间长。这就是它的护城河。 关系很直接:算力贵,是所有 AI 服务收费的根源。你每次和 AI 对话,按 Token 计的费里摊着显卡的折旧和机房的电费;生成一张图贵几十倍,也是因为图要算的量比文字大得多。理解了铲子有多贵,就理解了账单为什么长那样。 ✅ 这一页想和你分享的 显卡赢在并行:一万名小学生同时算简单题,完胜一位博士逐题精算 卖铲人逻辑:淘金的人未必赚钱,铲子人人都得买 生态是护城河:开发者都在它的工具链上盖房,搬家成本太高 算力成本最终摊进你的账单:每次对话、每张图,都有铲子的折旧 ## 「我训了个模型」到底训了什么?(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-train-or-prompt.html 『我训了个模型』到底训了什么? 饭局上总有人举着酒杯说「我最近训了个模型」。这句话的水分可以从零到百分之九十九,这一页帮你听出他到底干了什么,顺便学会三句能让全桌安静的追问。 在 AI 圈,训练指的是改变模型本身的参数,成本从几十万到上亿。而绝大多数人说的「训了个模型」,实际是写了段提示词,或者挂了个知识库,那是五分钟和五千万的区别。 大模型里面装着几百亿到上万亿个参数。参数说白了就是一大堆数字,你可以把它们想象成调音台上密密麻麻的旋钮——模型的每一分本事,全都存在这些旋钮拧到了哪个位置上。 训练就是把这几百亿个旋钮一个个拧对,而办法笨得出奇:遮住后半句,让模型猜下一个词。比如给它「今天天气真」,它蒙了个「香」,原文却是「好」——猜错了,就把参与这次判断的旋钮各自拧回来一丁点。一次只挪极小一格,然后换下一句,再来一遍。这个动作要重复上万亿次。冲刷完,旋钮的位置里就沉淀下了「天气后面更可能跟『好』,不太可能跟『香』」这件事。所谓「学会」,全部内容就是这个。 这件事费电、费卡、费钱,跟供一个孩子读完二十年书差不多,属于重资产工程。 而你平时对 AI 说「你是一位资深编辑,帮我润色」,或者给它上传一份公司资料,这些操作一个参数都没动。打个比方:前者是重新培养一个大学生,后者是给现成的大学生递一张便签、发一本手册。便签很有用,但你不能说自己「培养了一个大学生」。 所以下次听到「训了个模型」,第一反应可以是:他动没动参数?动了多少?下面这把梯子帮你把所有情况分成四层。 从下往上,每爬一层,成本和门槛都指数级上升。点击每一层,展开看它的耗时、成本和门槛。饭局上九成的「训了个模型」,都发生在最下面两层。 改提示词 挂知识库(RAG) 微调 从头预训练 来玩个小测:下面五句都是社交场合的高频发言。你来猜猜,每句话说的事大概率发生在哪一层。点选项揭晓答案。 分不清对方在哪一层?不用猜,直接问。这三个问题分别卡住成本、数据、底座三个要害,答不上来的人自己会往下滑层。 「花了多少算力?」 训练是真金白银烧出来的。L3 起步就要租显卡,L4 要烧掉数千万到上亿。说不出成本量级的「训练」,多半没发生过。 「多少条数据?跑了几轮?」 别问「数据从哪来」——挂知识库和微调都会答「公司文档、业务数据」,这一问听不出差别。要问的是量级:几百份文档丢进检索库是 L2,几千上万条标好的问答对、还得跑上几轮才是 L3。说得出条数和轮数的,才是真动了参数。 「底座是什么模型?」 L1 到 L3 都站在别人的底座上,这毫不丢人,但值得说清楚。含糊其辞说「核心技术不便透露」的,可以默认是 L1。 ✅ 这一页想和你分享的 训练 = 改模型参数:写提示词、挂知识库都没动参数,严格说都算「用模型」 四层梯子:改提示词、挂知识库、微调、从头预训练,每上一层,门槛指数级上升 听到「训了个模型」先问成本和数据:答不上来的,自己会往下滑层 改提示词毫不丢人:九成需求它就够了,丢人的是站在 L1 说自己在 L4 ## AI 圈黑话翻译器(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-jargon-translator.html AI 圈黑话翻译器 发布会、朋友圈、新闻稿里的 AI 话术,水分普遍不小。这一页把最常见的八句拿出来逐句翻译成人话,每句配一个含金量档位。看完你会发现:话术并不高深,只是没人给你翻译过。 同一个词在 AI 圈能指完全不同的东西:「自研」可以指从零造大脑,也可以指接了个 API。这一页把常见话术翻译成人话,再给你三个当场问出底细的追问。 下面八张卡片,正面是你在发布会和朋友圈见过的原话,点一下翻个面,看看人话版本。每张卡配一个含金量档位: 提前剧透一句:这组卡里「足金」很少见。这不怪本页选卡偏心,现实中它就是这么少见。 翻译只是第一步。真想知道对方有几斤几两,把下面三个问题记熟,哪个场合都能用。放心问,这三个问题很礼貌,只是答案藏不住。 「模型底座是什么?」 这个问题能问出他站在谁的肩膀上。用开源模型、接商业 API 都是正常操作,但答案决定了「自研」这个词该打几折。支支吾吾的,折扣自动加大。 「训练数据从哪来、花了多少算力?」 这个问题能问出他有没有真的训练过。真做过训练的人,对数据规模和算力开销如数家珍;没做过的人,这两个数字一个都答不上来。 「离开那家的 API,产品还能跑吗?」 这个问题能问出产品的独立性。答「能,换个底座就行」说明工程扎实;答「跑不了」也不丢人,但「核心技术全自研」的说法就该收回去了。 ✅ 这一页想和你分享的 听宣传抓三件事:模型底座、训练数据、成本量级,三个都含糊的可以直接换台 壳不丢人,吹牛才丢人:好产品大多是厚壳,要警惕的是薄壳配大词 口号不含信息量:「深度赋能」「All in」这类词,听到时自动静音即可 追问三连随身带:底座、数据、独立性,三个礼貌问题就够用了 ## 「开源模型」等于免费吗?(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-opensource-free.html 『开源模型』等于免费吗? 新闻里说某模型「开源了」,评论区一片欢呼「免费用上顶级 AI」。先别急着欢呼,AI 圈的「开源」和你理解的免费,中间隔着好几层意思,这一页把它们一层层剥开。 多数「开源模型」只公开了权重,也就是练好的大脑本体;训练数据和训练方法通常不给。下载不要钱,但跑起来要显卡要电费,拿去赚钱还要看许可证。 软件圈的开源,给的是源代码:你能看到每一行怎么写的,能自己改、自己编译,整个制作过程摊开在你面前。菜谱、食材、火候,全套公开。 AI 圈的「开源模型」大多没这么慷慨。它给你的是权重:几百 GB 的数字,是那锅汤炖好之后的成品。汤你随便喝,但配方(训练数据)和炖法(训练方法)通常保密。所以圈内更严谨的叫法是「开放权重」,只是新闻标题懒得区分。 另外别忘了许可证。开源模型附带一份使用协议,有的随便商用,有的限制用途或用户规模。自己玩基本没事,拿去赚钱前务必读一遍,这一步很多人跳过,跳过的代价可能是律师函。 判断一个模型开得有多彻底,看三样东西就够了:权重、数据、方法。点下面两个按钮,看看两种典型情况分别亮几盏灯。 模型权重 训练数据 训练方法 还有一个常见误会:新闻里刷榜的「满血版」,和你在自己电脑上跑起来的那个,多半是两回事。厂商通常会把大模型「蒸馏」成小模型:让大的当老师,教出一个小的,能力保留一部分,体积缩小几十倍。点下面的按钮看对比。 满血版 蒸馏版 「免费下载」和「免费运行」是两件事。模型文件本身不要钱,但它跑起来要占显存:模型越大,需要的显卡越贵,大到一定程度,一张卡装不下,得好几张一起上。电费也是持续开销,虽然家用规模不至于心疼,但服务器规模就是一笔正经账单了。 ✅ 这一页想和你分享的 开源多半只是开权重:汤给你了,配方和炖法保密,严谨叫法是「开放权重」 免费下载和免费运行是两件事:跑起来要显卡要电费,模型越大账单越厚 本地跑的多半是蒸馏小号:新闻里的满血版住在机房里,别拿榜单成绩要求小号 商用先看许可证:自己玩随意,赚钱前把使用协议读一遍 ## 「跑分第一」的模型,为什么用起来不行?(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-benchmark.html 『跑分第一』的模型,为什么用起来不行? 刷到「新模型霸榜」的新闻,兴冲冲换过去,结果写个周报还没原来的顺手。你没用错,榜单也没造假,只是榜单测的和你要的,从来就没对齐过。 榜单测的是考试,你要的是干活。题库会被刷、考纲未必含你的场景,跑分当参考就好。选模型最靠谱的办法是拿自己的活儿去试。 下面是两个虚构的模型:A 跑分 95,B 跑分 88,按榜单选肯定选 A。但是别急,点下面三个真实任务,看看它们各自的表现。 模型 A 模型 B 刷榜 榜单题库在网上流传久了,难免混进模型的训练数据。相当于考前背了答案:分数很好看,能力没那么多。这在圈内有个体面的说法,叫「数据污染」。 过拟合考试 厂商知道大家看榜,就专门朝着考点优化。就像应试教育里的做题家:卷面成绩顶尖,日常交流和动手能力反而可能被牺牲掉。 考纲不含你的场景 榜单考数学、考代码、考知识问答,但不考「懂你们行业」,也不考「安慰人」。你最在意的那门课,考纲里可能压根没有。 也有相对可信的榜:真人盲测投票类。做法是把两个模型的回答摆在一起,隐藏名字,让大量真实用户投票选哪个更好。这种榜没有固定题库可背,考官是活人,刷起来难度大得多。 但它也只是「相对」可信:投票的人未必和你干同一行,大众觉得好的回答风格,未必适合你的场景。想看国产模型在各种真实场景里的实际表现,可以移步国产模型怎么选那一页。 最靠谱的评测机构是你自己。方法很土,但极其有效:从自己的工作里攒 10 个真实问题,存成一个文档。每次想换模型,把 10 道题跑一遍,好不好用一目了然。 私人题库的攒法(示例) 挑最常干的活:周报、方案、邮件,选你每周都要做的 3 件 挑最专业的活:带上行业黑话和内部语境的问题,考它懂不懂你这行 挑翻过车的活:以前 AI 答砸过的问题,最能试出新模型的成色 留一道送分题再留一道刁钻题:送分题都答不好的直接淘汰,刁钻题用来拉开差距 答案好坏你说了算:你比任何榜单都清楚,什么样的输出算「能交差」 ✅ 这一页想和你分享的 跑分是入学考试,你要的是试用期表现:两件事相关,但相关得有限 高分可能是背过题:题库会泄漏进训练数据,考点会被针对性优化 真人盲测投票的榜相对可信:没有固定题库,考官是活人 建一套自己的十题小考卷:换模型跑一遍,五分钟出结论,比追新闻管用 ## AI 越聊越懂我,是它在学习吗?(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-ai-learning.html AI 越聊越懂我,是它在学习吗? 用了一阵子 AI,你可能有过这种感觉:它记得你住哪、爱吃什么,越聊越贴心,像在慢慢了解你。它真的在学习进化吗?答案有点意外:它一个字都没学进去。 没有在学习。对话改变不了模型本身,它的大脑在出厂那一刻就冻结了。所谓越来越懂你,是产品把你的信息记在一个「小本本」上,每次对话开始前悄悄塞回给它看。像一位记性欠佳的老朋友,每次见你之前先翻一遍笔记。 大模型的一生分成两个阶段:训练和聊天。训练像上学,要读海量资料、反复调整脑子里的参数;聊天像毕业后上班,只负责用学到的东西干活。关键在于:上岗那天起,它脑子里的参数就定型了。你跟它聊一万句,这些参数一个都不会动。想看这两个阶段的详细拆解,本站有一节训练与使用的深入版课程。 「它越来越懂我」这件事,很多人脑中的画面和实际发生的画面差得很远。点下面三个按钮,逐个看看。 刚才「实际发生的画面」里那个小本本,就是各家产品宣传的「记忆功能」。它是模型外面挂的一个记事本:你聊天时提到的关键信息(住哪、吃什么、做什么工作)被摘出来存好,每次新对话开始前,产品把这些条目贴进对话的最前面,模型读到了,回答自然显得懂你。这些贴进去的内容占用的空间,就是常说的上下文窗口。 这里有两件事常被混成一件,得分开说。换个产品,记忆确实带不走:小本本存在 A 产品的服务器上,B 产品看不到,你在一边积累多年的「默契」,换个应用直接清零。所以重要的个人偏好,建议你自己也存一份文档,走到哪贴到哪。 但在同一个产品里新开对话,它并不会失忆——小本本挂在你的账号上,不是挂在某一个对话里。豆包、ChatGPT 这类默认开着记忆功能的产品,你新开一个对话,它照样知道你吃素。真正会丢的,是这个对话里聊过、却没被摘进小本本的那些细节:刚才那段长文档、上一轮的具体措辞、你临时改的口径。失忆的是模型,不是产品。 单独训练贵到离谱 训练一次大模型要动用成千上万块专用芯片连跑数周,成本按「亿」的量级算。给几亿用户每人单独练一个专属模型,没有公司付得起这个账。 小本本便宜又够用 相比之下,给每个用户配一个记事本,成本几乎可以忽略。效果上你感觉不出差别:它照样记得你住广州、吃素、养了一只猫。 冻结反而更安全 如果每个人都能靠聊天改写模型,有人教它好话,也会有人教它坏话。参数冻结让它对所有人保持同一个水准,这是特性,也是保护。 ✅ 这一页想和你分享的 模型参数出厂即冻结:聊再多,也改变不了它的大脑 「记忆」是外挂小本本:产品把你的信息存好,每次对话前塞回给它看 觉得它越来越懂你:该夸的是产品设计,模型只是照着念 小本本挂在账号上:同一产品新开对话照样记得你,换个产品才会清零 重要偏好自己留一份:自备一份文档,走到哪贴到哪 ## AI 检测器说「这是 AI 写的」,可信吗?(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-ai-detector.html AI 检测器说「这是 AI 写的」,可信吗? 交了论文被判「AI 生成率过高」,认真写的报告被同事怀疑是机器代笔… 这种检测结果到底值几分信任?先别急着喊冤,玩一局小游戏,你马上就有答案。 不可信,接近玄学。AI 就是照着人类的好文章学出来的,写得工整流畅的人类文字经常被冤枉;目前没有任何检测器能可靠地区分两者。检测分数当参考都勉强,当证据万万不行。 下面有六段文字,有人写的,也有 AI 生成的。你的任务有点特别:猜一猜检测器会怎么判。猜完每一段,我们会揭晓检测器的判决、真实作者,以及它有没有判错。 检测器的思路是找「AI 味」:用词是否太规范、句子是否太通顺、结构是否太整齐。问题来了:AI 当年就是照着人类的好文章学写作的。通顺、规范、结构清楚,这些恰恰是认真写作的人一直在追求的东西。让检测器找「AI 特征」,等于让它找「好学生特征」,结果就是认真写字的人集体中枪。 更尴尬的是反方向:把 AI 生成的文字改几个词、加两个错别字、掺点口语,检测分数立刻大跳水。一个正着抓冤枉好人、反着抓轻易被骗的工具,你说它抓住的到底是什么?说到底它只认表面特征,认不出作者。 检测器不可靠,但被它冤枉的麻烦是真实的。与其事后争辩,平时留好这三样东西,关键时刻拿得出手。 草稿和修改记录 在线文档大多自带编辑历史:什么时候写了哪段、改了几轮,全有时间戳。一篇真人写的文章,历史记录是一点点长出来的,装不出来。 创作过程录屏 重要的稿子(毕业论文、求职作品),写作时顺手开个录屏。占点硬盘空间,换一份没人能反驳的证据,划算。 过程材料留底 大纲、参考资料截图、和同学讨论的聊天记录,都是创作路径的脚印。AI 一秒出稿,脚印可伪造不了这么全。 如果你是拿着检测报告做决定的人,请记住一件事:主流检测工具的官方说明里,都写着结果仅供参考、存在误判可能。工具自己都不敢打包票的事,使用工具的人更不该拿它一票否决一个学生或候选人。 ✅ 这一页想和你分享的 检测分当不了证据:误判是常态,冤枉认真写作的人尤其多 写得越工整越危险:AI 学的就是人类范文,好文章的特征两边重合 平时留好过程:编辑历史、录屏、草稿,关键时刻自证清白 工具自己都标注了「仅供参考」:别替它把话说满 ## 「提示词秘籍」值得买吗?(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-prompt-course.html 「提示词秘籍」值得买吗? 「独家万能模板,限时特价」「学完 AI 副业月入过万」… 刷到过这类广告吗?掏钱之前,我们把一张典型的宣传单逐条拆开,给每个卖点盖个章。 大概率不值。真正有用的骨架半页纸就讲完了,本站免费教过;剩下的功夫在你自己的活儿上多用多改。几百块的秘籍,卖的主要是焦虑。 下面是一张仿制的宣传单,六个卖点都是市面上的常见话术。逐条点击,我们给每一条盖上分类章,并附一句点评。章一共四种,含金量依次递减。 拆归拆,知识付费这件事没有原罪。有体系的课程、有人带练的服务、垂直行业的深度整理,都可能物有所值。掏钱之前,用这三条标准过一遍。 可试听 敢让你先看内容再掏钱的,通常对质量有底气。只给目录和喜报截图、正文全靠想象的,先按住钱包。 可退款 有明确的退款条款,说明卖家把风险分担了一部分。「虚拟商品概不退换」加高价,两个信号叠在一起要警惕。 承诺不夸张 靠谱的课讲方法、讲练习、讲适用范围;只要出现收入承诺,直接关页面。能稳定月入过万的人,很少靠卖这个赚钱。 好消息是,这门手艺的入门是免费的,进阶靠的是你自己的场景。两步就够: 第一步,学骨架。本站零基础入门篇免费讲过提示词的基本骨架(背景、要求、限制),还有让 AI 先反问你再动手的技巧。两页读完,市面上大半「秘籍」的核心内容你就有了。 第二步,在自己的活儿上磨。挑一件你每周都要做的事(周报、方案、邮件),用骨架写一版提示词,结果不满意就改,改三轮存下来。三个月后你手里那套「专属模板」,任何秘籍都卖不了你,因为它长在你的工作里。 ✅ 这一页想和你分享的 骨架免费半页纸:背景、要求、限制,本站零基础入门篇教过 模板的价值是省时间:标价该看它帮你省了多少小时 见到收入承诺直接关页面:这是最省事的避坑口诀 真功夫来自你自己的场景:在每周的活儿上改三轮,胜过买十本秘籍 ## 同一个问题,为什么每次答案不一样?(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-randomness.html 同一个问题,为什么每次答案不一样? 昨天问它给奶茶店起名,回了三个文艺范;今天原封不动再问一遍,画风全变。它是记性差,还是在敷衍你?都没有。点几下按钮,你就能亲眼看到它的每个字是怎么来的。 因为 AI 生成每个字的时候都在掷骰子:从几个高概率的候选词里挑一个。这是有意的设计,让回答自然不死板。需要稳定输出的场合,可以把随机性调低。 下面是一个固定的问题,一个字都不改。点「再问一次」,看看三次回答能差出多远。 AI 写句子的方式是接话茬:每次只决定下一个字。它先给所有候选字打分,分高的中签机会大,分低的机会小,然后抽一个。抽完这个字,再为下一个字重新抽签。一句话几十个字,就是几十次抽签,两次回答一模一样才是小概率事件。 口说无凭,下面就是某一个位置的真实场景:AI 已经写出「店名建议:茉莉奶」,正在决定下一个字。四个候选字的概率条摆在这里,你来替它掷这一次骰子。多掷几次,注意右侧的中签统计。 你可能会问:直接每次都选分数最高的字,答案稳定,多好?试过,效果很糟。永远选最高分,回答会变成死板的复读机:你问十次奶茶店起名,它答十次「茉莉奶茶」;写出来的文案千篇一律,起名、写诗、想创意这类任务直接废掉。允许它抽中第二名、第三名的词,路子一下就宽了,语言也更像活人说话。 创意任务 · 欢迎随机 起名、写文案、头脑风暴,随机性就是灵感来源。多问几次,等于免费多请了几位同事,挑最好的那版就行。 严肃任务 · 调低随机 合同条款、代码、数据处理,答案漂移会出事。很多产品可以调低随机性(常见叫「温度」参数),调到最低时接近每次都选最高分。想深入了解,看温度参数的进阶课。 还有一个实用提醒:随机性也意味着单次回答的可靠度有限。涉及重要事实时,同一个问题换着方式多问几次,答案一致的部分可信度更高,来回变的部分就要去权威来源核实。答案不一致和撒谎是两回事,但对你来说,处理方式一样:都要核实。 ✅ 这一页想和你分享的 随机是特性:答案不一样说明骰子在正常工作,故障另说 每个字都是一次抽签:概率高的常中签,概率低的也有机会 创意任务欢迎随机,严肃任务调低温度:按场合用它 重要事实多问几次交叉验证:一致的更可信,不一致的去核实 ## AI 客服为什么那么蠢?(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-ai-customer-service.html AI 客服为什么那么蠢? 你可能也纳闷过:同一个时代,聊天 AI 已经聪明得像个靠谱同事,可点开购物软件的客服,对面那位还在一本正经地装傻。这事其实说得通,看完你就知道它蠢在哪、怎么治。 你平时聊的智能助手和商家的客服机器人,多半没用同一个脑子。客服要省钱、怕说错话要赔、还有大量老式关键词机器人在冒充新 AI,蠢得各有各的原因。 同一句话:「我上周买的鞋开胶了,想换货但发票丢了」。发给聊天 AI 和发给商家客服机器人,待遇差多少?点下面切换对比。 刚才那位客服机器人,很可能只是在你的话里扫到了「发票」两个字,然后掏出它库存里唯一相关的答案。它蠢,通常出于下面三个原因,而且都挺现实。 省钱 客服每天要接的消息量大得吓人,每一条都要花钱处理。很多商家算完账,选了便宜的小模型或者干脆沿用旧系统。你享受到的聪明程度,和商家愿意付的账单直接挂钩。 护栏锁死 AI 聊天时随口说一句「可以给您全额退款」,商家可能就真得赔。所以很多客服 AI 被规定只准念审核过的稿子,超纲一律装没听见。对商家来说,宁可蠢,不能错。 冒充 还有一大批客服,压根就是上一代的关键词机器人:在你的话里找关键词,命中哪条答哪条。这两年它们纷纷贴上了「AI 智能客服」的标签继续营业,锅却让新 AI 背了。 知道了原理,对付它就有办法了。客服系统里通常留着几条「升级通道」,命中了就会把你转给真人。 这两年,接了大模型的新一代客服确实在变多。分辨方法很简单:换个说法再问一遍。把「发票丢了能换货吗」换成「购物小票找不着了,还能给我换吗」,老式机器人立刻露馅,接了大模型的客服能稳稳接住。 ✅ 这一页想和你分享的 客服蠢多半有原因:老系统冒充、小模型省钱,和你聊天用的 AI 常常压根是两套东西 护栏是商家怕赔:只准念稿的客服,蠢是被规定出来的 召唤人工有技巧:直接说「人工」「投诉」,或者把诉求描述得足够具体 判断新旧看一招:换个说法它还接得住,才是真的接了大模型 别拿客服体验给 AI 下结论:那可能只是商家账本的形状 ## Siri 和 ChatGPT 是一种东西吗?(小白三千问 · 祛魅打假) URL: https://xueai.miyang.cn/slides/zero-q-siri-vs-chatgpt.html Siri 和 ChatGPT 是一种东西吗? 都叫 AI 助手,一个陪了我们十几年,敬业地重复着「抱歉,我没听懂」;一个横空出世,什么都能聊。它们看起来是同行,用的却是两代技术。这一页带你看清差在哪。 老一代语音助手靠命令匹配,只听得懂预先设计好的几百种说法;ChatGPT 这类生成式 AI 什么说法都能接住。前者像电话客服的按键菜单,后者像真人接线员。 来一句稍微复杂点的指令,看看它在两种助手的脑子里分别走了一条什么路。点下面切换播放。 刚才那条老路径,问题出在第二步:去命令库里找匹配。这条技术路线有一个绕不开的天花板:人类的说法无穷无尽,命令库里的条目却是工程师一条条写进去的。「叫我起床」「设个闹钟」「明早喊我」…每一种说法都得有人预先想到、预先登记,漏了哪种,助手就听不懂哪种。 这就是为什么这些年语音助手看起来在原地踏步:工程师再加十倍,也穷举不完人类的说话方式。路线的天花板,加人是顶不破的。它和 ChatGPT 的差距是代差,就像按键电话和智能手机,给按键电话换个铃声,它还是按键电话。 按键菜单:老助手 「查话费请按 1,办业务请按 2」。选项预先定好,你只能在菜单里挑。想说点菜单外的事?它只会礼貌地重播一遍菜单。 真人接线员:生成式 AI 你怎么说都行,绕着弯说、带着条件说、说一半改主意都行。它理解你的意思,再决定怎么办。想知道它为什么能接住任何话茬,可以看这一课讲的接话原理。 好消息是,这两年各家的语音助手陆续开始「换脑子」:把老的命令匹配系统换成大模型,或者两套并用。你可能已经注意到,手机上的助手忽然能多聊几句了。这波升级还在进行中,不同设备、不同地区的进度差别很大,所以你家里可能同时住着新旧两代助手。 音箱要卖得便宜、答得飞快,跑大模型又费算力又慢半拍,所以很多音箱还留着老脑子,这和客服机器人装傻是同一本账。 ✅ 这一页想和你分享的 代差在技术路线:命令匹配和生成式理解是两代技术,账号升级、换个铃声都救不了 一个好记的比喻:老助手是电话按键菜单,生成式 AI 是真人接线员 十年没进步的原因:说法无穷、命令有限,加十倍工程师也穷举不完 音箱还蠢的原因:多半是没换脑子,或者舍不得算力 一招判断新旧:换个说法它还接得住吗 ## 免费的 AI 够用吗?什么时候值得付费?(小白三千问 · 花钱与安全) URL: https://xueai.miyang.cn/slides/zero-q-free-vs-paid.html 免费的 AI 够用吗?什么时候值得付费? 现在打开任何一个 AI 产品,免费就能聊得很开心。那付费版到底多了什么?这一页带你把免费版拆开看一看,再帮你对号入座,算算这笔钱值得花吗。 免费版给的通常是小一号的模型,再加上次数限制;偶尔用完全够。要是每天都靠它干活,付费版的差距会越用越明显。 免费版的界面和付费版长得一模一样,差别全藏在看不见的地方。下面这张产品界面示意图里藏着四个缩水点,挨个点一点,把它们全部找出来。 要付费吗,答案只和一件事有关:你的使用频率。下面三张卡片,点中最像你的那张。 偶尔用一下 查个资料、写封邮件、改改措辞,一周想起来用两三回。 天天当同事用 每天写方案、改文案、整理会议记录,它已经是你的日常工具。 靠它吃饭 自媒体批量产出、写代码、给客户做咨询,产出直接换收入。 记住一条就够:连续一周,只要碰到「今天次数用完了」或者「内容太长放不下」这类提示,就到了该付费的时候。这说明你的用法已经装不进免费版的天花板了。反过来,一个月都没碰到过限制,说明免费版对你绰绰有余,别急着掏钱。 主流 AI 产品的会员费大致在同一个量级:一个月一顿饭到几顿饭的钱。国产产品普遍更便宜,不少还处在免费大放送阶段,可以先看看国产大模型怎么选。要是你听说过「充 key」「调 API」这类说法,那是另一种付钱方式,适合用量特别大或者要接工具的人,API 和会员的区别那一页讲得明白。 ✅ 这一页想和你分享的 免费版是试用装:模型小一号、次数有限、长文放不下、高峰要排队 按使用频率决定:偶尔用免费够了,天天用值得付一档,靠它吃饭上顶配 付费买的是模型档位和稳定性:界面长得一样,里子完全两回事 先把免费版用满再说:连续一周碰到限制,就是该升级的信号 ## API 是什么?和开会员有什么区别?(小白三千问 · 花钱与安全) URL: https://xueai.miyang.cn/slides/zero-q-api-vs-membership.html API 是什么?和开会员有什么区别? 总看到有人说「充 key」「调 API」,听着像圈内黑话。其实它和你每月订的会员一样,都是在给 AI 付钱,只是两种完全不同的付钱方式。这一页用一个买菜的类比讲明白。 会员是包月自助餐,在人家店里随便吃;API 是按克称重的散称食材,买回去自己开火做菜。普通人开会员就够了,接工具、做产品的人才需要 API。 会员 = 包月自助餐 交一次月费,在官方 App 里随便聊。菜是人家做好端上桌的:界面、聊天记录、联网搜索都配齐了,你只管张嘴吃。限制也很像自助餐:只能在店里吃,没法打包带走给别的软件用,吃太猛还会被提示「歇一会儿」。 API = 按克称重的散称食材 按实际用量付钱,用多少称多少。买回来的是生食材:一个接口地址加一把钥匙(key),得自己接进程序或工具里才做得成菜。自由度大,可以随便折腾,代价是你得会「开火」。 两种付法谁更划算,答案随用量变化。下图里横的蓝线是会员(月费固定,吃多吃少一个价),爬坡的橙线是 API(按量计费,用得越多花得越多)。拖动滑块,看看两条线的高低怎么换位。金额只是示意刻度,各家定价不同,看趋势就好。 你在教程里看到的「充 key」,几乎都发生在同一个场景:某个第三方工具要用 AI 的能力。翻译插件、写作软件、自动化脚本,这些工具自己没有 AI,得由你递给它一把钥匙,它拿着钥匙去调用模型,费用记在你的账上。这把钥匙,就是 API key。 key 说白了就是一串密码 谁拿到这串字符,谁就能用你的额度、花你的钱。别把 key 发到群里、贴到帖子里、存进公开的在线文档。万一泄露了,第一时间去官网把它作废,再重新生成一把。 买 key 认准官方渠道:模型厂商的官网,或者大厂云平台。网上那些「三折 key」「无限额度卡」大多来自中转站或灰色渠道,便宜的代价可能是对话被别人看光、余额一夜清零。想了解这里面的门道,可以看API 中转站为什么不太推荐那一页。 ✅ 这一页想和你分享的 会员 = 自助餐,API = 散称食材:一个在店里吃,一个买回家自己做 普通人开会员就够了:省事、配套全,接工具做产品的人才需要 API key 是一串密码:谁拿到谁就能花你的钱,妥善保管,泄露立刻作废重发 买 key 走官方渠道:三折卡的便宜有代价,细节看中转站那一页 ## 生成一张图为什么贵几十倍?(小白三千问 · 花钱与安全) URL: https://xueai.miyang.cn/slides/zero-q-image-cost.html 生成一张图,为什么比聊一次天贵几十倍? 很多 AI 应用聊天随便聊,一到生图就要收费、限次数。不是产品小气——是图片在成本上真的是「另一个物种」。 一次文字问答的成本是几厘到几分钱,一张 AI 图片是两三毛钱——差几十倍。因为图片的信息量大得多、要反复「画」几十遍才成形、期间显卡被它独占。 信息量大得多 一段 100 字的回答就是 100 来个「词」;一张高清图有上百万个像素,哪怕压缩打包后,要处理的数据量也远超一段话。 要「画」几十遍 主流生图方式是从一片雪花噪点开始,一轮一轮地去噪细化,几十步之后图才成形。相当于同一张画反复画几十遍,每一遍都在烧算力。 显卡被独占 文字生成像窗口排队,一台机器同时服务很多人;生图期间显卡被你的任务大块占用好几秒——独占的时间,就是独享的账单。 ✅ 这一页想和你分享的 量级记住就行:问答几厘钱,图片两三毛,差几十倍 三个原因:像素多、要画几十遍、显卡被独占 看懂产品设计:积分制、先预览后高清,都是成本使然 省钱技巧:先用文字把需求打磨清楚,再出图,一次成功省最多 ## AI 视频为什么按秒收费?(小白三千问 · 花钱与安全) URL: https://xueai.miyang.cn/slides/zero-q-video-cost.html AI 生成视频为什么这么贵? 上一页说一张图两三毛。视频呢?按秒计价,一秒一块五到五块钱——生成一条 10 秒的短视频,够你和 AI 聊上万句。为什么? 因为视频不是「一张图」,是每秒二十几张必须连贯的图,还要配上同步的声音、合理的物理运动。生成量是图片的几十倍,难度还不止翻几十倍。 帧和帧必须「记得住彼此」 人物的衣服颜色、背景里的杯子、光线的方向,每一帧都不能变卦。模型要同时「记住」几百帧的内容互相对齐——这比独立画几百张图难得多,也是早期 AI 视频人物走着走着会「变脸」的原因。 物理要合理 苹果要往下掉、水要往低处流、头发要跟着风飘。模型得从海量视频里「悟」出物理规律,才能不穿帮——这部分能力最烧训练成本。 声音还要对上口型 新一代模型(Veo 3、Sora 2 等)直接生成配音和音效,嘴型、脚步声、环境音都要和画面同步——等于同时在做视频和音频两份工作,所以「带声音」的价格比「无声」的贵一截。 ✅ 这一页想和你分享的 视频按秒计价:一秒一块五到五块,10 秒 ≈ 上万次聊天 贵的本质:每秒二十几帧 × 帧间连贯 × 物理合理 × 音画同步 省钱顺序:文字打磨脚本 → 图片定画面 → 最后才生成视频 趋势向好:价格逐年下降,今天的「贵」是暂时的 ## 什么是 API 中转站?(小白三千问 · 花钱与安全) URL: https://xueai.miyang.cn/slides/zero-q-relay.html 什么是 API 中转站?为什么我们不太推荐? 如果你开始折腾 AI 工具,早晚会看到这样的广告:「GPT / Claude API 三折起,即买即用」。它们叫「中转站」。先说清楚:不是说卖家都是坏人——而是这个结构本身,有几个你值得先了解的风险。 中转站是夹在你和 AI 官方之间的「二道贩子」:它批量拿到接口再转卖给你。便宜是真的,但你的每一句话都要先经过它的服务器,模型是不是正品、明天还在不在,都只能靠它自觉。 你的内容对它完全透明 你发的合同、简历、公司数据、私密问题,都会原文经过中转站的服务器。它存不存、看不看、卖不卖,你无从验证。官方大厂有隐私协议和监管约束,中转站往往连主体是谁都查不到。 模型可能被「悄悄换货」 你以为在用旗舰模型,它可能在背后换成便宜好几倍的轻量模型来赚差价——回答变笨了你还以为是自己提示词没写好。社区里这类「掺假」测评屡见不鲜,而普通用户几乎无法分辨。 充值余额可能一夜清零 低价往往来自不可持续的来源(批量注册、盗刷、灰色渠道)。上游一封号,站长一关站,你充的钱没有任何地方可以讨。这个圈子里「跑路」不是小概率事件。 ✅ 这一页想和你分享的 中转站 = 二道贩子:你的每句话都先经过它的服务器 三个结构性风险:内容透明、模型可能掺假、余额可能清零 这与卖家人品无关:是「多一层不可验证的中间人」的必然代价 正路不贵:官方 App 免费,国产官方 API 本来就便宜 ## 「拼车号」「共享号」是什么?(小白三千问 · 花钱与安全) URL: https://xueai.miyang.cn/slides/zero-q-reverse-proxy.html 「反代账号」「共享号」是什么? 「ChatGPT Plus 拼车,9.9 一个月」「Claude 会员共享号,秒发」——比官方价便宜十几倍,听着很香。这一页把「香」背后的账算给你看。 这类服务本质是一个正式账号被拆给几十个人合用(通过共享登录或技术转发实现)。像合租一间单人间:房租确实平摊了,但你的东西别人可能看得到,而且一人违规、全屋清退。 你的聊天记录不只属于你 共享账号里,你的对话历史其他「拼友」和号主都可能看到。你问过的健康问题、贴过的工作文件,都在陌生人眼前。反过来,你也会看到别人的——这本身就说明问题了。 封号是「连坐」的 官方明令禁止账号共享和转售,风控专门识别「一个账号从多地同时登录」这类特征。几十个人里任何一个人违规或触发风控,所有人一起失效——而这类账号本身(批量注册、盗刷信用卡开通的不在少数)就是重点清理对象。 账号的钥匙在别人手里 号主随时可以改密码、看数据、关服务。今天 9.9 明天涨到 19.9,或者直接消失,你没有任何凭据可以维权——这笔交易本身就在官方规则之外。 ✅ 这一页想和你分享的 拼车号 = 合租单人间:便宜的代价是隐私和稳定性 三个问题:记录互相可见、封号连坐、钥匙在别人手里 官方明确禁止:这类交易出了事没有任何维权渠道 更好的选择:国产官方 App 免费够用,海外需求走合规订阅 ## 我的聊天记录会被拿去训练吗?(小白三千问 · 花钱与安全) URL: https://xueai.miyang.cn/slides/zero-q-privacy.html 我的聊天记录会被拿去训练吗? 你和 AI 说过的话,有没有可能变成它的「教材」?这一页用一张流向图讲清数据到底去了哪,再告诉你开关在哪类设置里找、什么内容坚决别发。 可能会,取决于产品和你的设置。不少产品默认用你的对话改进模型,但正规产品都给了关闭开关;免费版更倾向收集,企业版通常承诺不碰你的数据。 你在输入框敲下一句话、点了发送,它就开始了一段旅程。下面这张图模拟了这段旅程,试着切换那个开关,看看流向怎么变;每个节点都可以点,看一句说明。 各家条款五花八门,但按付费档位看,待遇有个大致规律。下表说的是行业里的普遍做法,具体到某个产品,以它自己的隐私条款为准。 档位 默认用于训练? 能不能关 数据保留承诺 免费版 多数默认开启,你的对话更可能被收集 通常可以关,要自己动手找开关 承诺较弱,保留期各家说法不同 付费版 部分默认开启,部分默认关闭 通常可以关,开关更好找 多数写进条款,保留期更明确 企业版 通常承诺完全不用 默认就是关的 有合同约束,出问题可以追责 每家产品的叫法不同,但开关都藏在类似的地方。打开设置,找这几类字眼:「数据控制」「隐私」「改进模型」「模型训练」。网页版和手机 App 里都找得到,一般就是一两个开关的事。实在找不到,就在设置页的搜索框里搜「数据」两个字,八九不离十。 能直接惹祸的号码和凭证 身份证号、银行卡号、各种密码和验证码。这类信息一串数字就能造成损失,任何时候都别发给 AI,问问题时用「某某」代替就行。 公司机密 内部经营数据、没发布的产品方案、核心代码。用 AI 润色文档前先想一想:这份东西登在明天的报纸上,你慌吗。慌,就先把敏感部分删掉再发。 客户和他人的资料 合同、客户名单、别人的聊天记录。这些信息当事人没同意给 AI 看,替别人做主发出去,出了问题责任在你。 处理工作内容,用公司审批过的企业版账号。企业版贵,贵就贵在合同里白纸黑字写着「你的数据只归你」。拿个人免费号处理工作机密,等于把公司文件存进了一个连你自己都说不清条款的地方,出了事很难交代。 ✅ 这一页想和你分享的 默认多半在收集:正规产品都有关闭开关,去设置里找「数据控制」「隐私」这类字眼 敏感信息别进对话框:证件号、公司机密、客户资料,删除对话救不回已经练进模型的内容 免费产品你也是原料:免费的代价之一,往往是你的对话更可能被拿去当训练材料 公司机密用企业版:合同写明不碰你的数据,个人免费号别碰工作内容 ## 放心用,还是要核实?(什么能放心交给它) URL: https://xueai.miyang.cn/slides/zero-6.html 哪些活能放心交给它,哪些最好多确认一步 你已经知道它很能干,也知道它会一本正经地出错。最后一个关键问题:遇到一件具体的事,怎么在三秒内判断能不能交给 AI?先玩 8 道判断题,法则就在你的答案里。 八道判断题小游戏 + 信任四象限:有标准答案吗?错了后果大吗?健康钱法律三条红线 这件事有「标准答案」吗? 没有标准答案的事(起名、文案、点子、清单),它给 10 个你挑 1 个,错了也不叫错——放心用。有标准答案的事(数字、日期、条文、事实),它可能记串——值得多看一眼。 答错了,后果多大? 写文案错了大不了重写,影响小,随便试。涉及健康、金钱、法律的事,错一次可能补不回来——AI 的话当参考就好,拍板前找权威来源或专业人士会更稳妥。 没有标准答案 + 你自己能把关 起名、润色、翻译大意、头脑风暴、列清单、写初稿。它的产出只是「候选」,你是裁判。 帮助理解的知识 解释概念、看懂报告、科普原理。用它「搞懂」,最高效;但要拿去做决定,先核对出处。 有标准答案的具体事实 数字、日期、人名、条文、时效信息。顺手搜一下就能确认,只要十几秒,很值得。 健康 · 金钱 · 法律 它可以帮你听懂医生的话、看懂合同条款,但吃什么药、签不签字、投不投钱——听专业人士的。 ✅ 这一课想和你分享的 遇事先问自己两个小问题:这件事有标准答案吗?答错了影响大吗? 没有标准答案的事,它是很好的帮手:它多给几个选项,最后由你来挑 具体的数字和日期,顺手搜一下更安心:只花十几秒,换一份踏实 健康、金钱、法律这三类事:AI 可以帮忙看懂,最终决定交给专业人士更稳妥 ## 你的下一步(什么能放心交给它) URL: https://xueai.miyang.cn/slides/zero-final.html 六个直觉都在了,接下来去哪? 恭喜你走完零基础入门篇。你现在对 AI 的理解,已经超过了大多数「用了很久但从没想过它是什么」的人。这一页先盘点行囊,再帮你找到最适合你的下一步。 六个直觉行囊盘点 + 三道题分流测试,找到最适合你的学习路径 这门课的正课部分,是讲给 AI 产品经理和从业者的。但零基础入门篇永远免费,欢迎转发给任何一个「还没开始用 AI」的家人朋友——你今天学会的这些直觉,可能就是他们和这个时代之间,缺的那块跳板。 ## AI 的食物:训练数据(基础原理) URL: https://xueai.miyang.cn/slides/training-data.html AI 的食物:训练数据 想让 AI 学会说话,先要喂给它数以万亿计的文字。它读了人类写过的绝大多数内容。 15T Token 是什么概念?语料构成可视化 + 数据规模直觉滑块 ## 训练 vs 推理:两个不同的过程(基础原理) URL: https://xueai.miyang.cn/slides/train-vs-infer.html 训练 vs 推理:两个完全不同的过程 很多人以为 AI 每次回答都在学习。实际上完全不是这么回事。 对话不是学习,参数冻结,按 Token 计费,这些是 AI 产品必懂的底层逻辑 ## 词表与训练(基础原理) URL: https://xueai.miyang.cn/slides/1-2-vocab.html 词表与训练 大模型学习的第一步:读取人类提供的海量文本数据。 从语料到词间矩阵,Token 化 + 注意力权重交互演示 全局词间关联权重矩阵 () ## Base 模型:Token 推 Token 机器(基础原理) URL: https://xueai.miyang.cn/slides/1-2-base.html (以下为免费预览,全文见页面) Base 模型:Token 推 Token 机器 训练结束后得到的原始模型,它只做一件事。 训练结束后得到什么?逐步生成 + 概率分布实时更新 ## GPT 的跃进:PreTraining 改变一切(基础原理) URL: https://xueai.miyang.cn/slides/1-2-gpt.html (以下为免费预览,全文见页面) GPT 的跃进 PreTraining 为什么改变了一切:从 CNN/RNN/BERT 到 GPT,大模型史上最重要的一步。 CNN / RNN / BERT / GPT 四种算法可交互对比,记忆衰减可视化 ## chat/completions 之谜(从补全到对话) URL: https://xueai.miyang.cn/slides/1-2-api.html (以下为免费预览,全文见页面) chat/completions 之谜 明明是在和大模型对话,为什么 OpenAI 的 API 路径里写的是「补全」?这个命名背后,藏着对大模型本质的理解。 明明是对话,为什么 API 叫「补全」?打字机动画解读 明明是「聊天」,为什么叫「补全」? 两家公司,两个截然不同的命名,背后藏着对大模型本质的不同理解。 ## 伪造聊天记录(从补全到对话) URL: https://xueai.miyang.cn/slides/1-2-fake-chat.html (以下为免费预览,全文见页面) 大模型的本质是补全,那如果我伪造一段聊天记录让它补全呢? 你不是只会一个一个字往后吐吗? 那我就构造一个格式:「这是一段没写完的聊天记录,你来续写助理的部分。」 OpenAI 最初的实验:把补全机器变成聊天机器人 ## Chat Template + SFT(从补全到对话) URL: https://xueai.miyang.cn/slides/1-2-sft.html (以下为免费预览,全文见页面) Chat Template + SFT:大模型终于学会「说话」 从补全机器到对话助手,差的就是这套训练范式。 Jinja 格式、指令微调,大模型终于学会说话 ## 上下文窗口是关键(从补全到对话) URL: https://xueai.miyang.cn/slides/1-2-prompt-power.html (以下为免费预览,全文见页面) 为什么用提示词就够了?答案在上下文窗口 PreTraining 之后:不用重新训练,把任务描述喂进去就行。但为什么? 提示词为什么够用?Token 截断可视化,无需重新训练 ## 大模型幻觉演示(幻觉与四种应对) URL: https://xueai.miyang.cn/slides/1-2-hallucination.html (以下为免费预览,全文见页面) 大模型幻觉 (Hallucination) 模型不知道事实,只是在做概率采样。看它如何自信地编造:选择一个案例,点击「开始生成」,观察幻觉如何在逐词生成中产生。 三类典型幻觉:事实错误 / 自信编造 / 知识截止 ## 应对 1:Prompt Engineering(幻觉与四种应对) URL: https://xueai.miyang.cn/slides/1-2-mitigation-prompt.html (以下为免费预览,全文见页面) Prompt 工程:用指令约束幻觉 PM 视角:写需求文档、对接 AI 接口时,如何通过 System Prompt 减少模型编造。 约束指令 + 局限性:模型不知道自己不知道什么 ## 应对 2:RAG 检索增强生成(幻觉与四种应对) URL: https://xueai.miyang.cn/slides/1-2-mitigation-rag.html (以下为免费预览,全文见页面) RAG 检索增强生成:让模型「开卷答题」 PM 视角:什么场景必须上 RAG?如何设计检索流程?落地的坑在哪里。 真实文档注入上下文,5 步交互流程动画,对比有无 RAG 的差异 ## RAG 的代价与优化策略(幻觉与四种应对) URL: https://xueai.miyang.cn/slides/rag-advanced.html (以下为免费预览,全文见页面) RAG 的代价与优化策略 每次 RAG 查询都要额外花钱。不优化,成本会随用量快速失控。 成本分析表 + 关键词触发 / 模型路由 / 语义缓存 / 精准切块四种策略 ## 应对 3:Temperature & Top-P(幻觉与四种应对) URL: https://xueai.miyang.cn/slides/1-2-mitigation-temp.html (以下为免费预览,全文见页面) 应对 3:Temperature & Top-P PM 视角:API 接入时如何配置采样参数,不同业务场景的推荐值与风险边界。手段 03 / 04 · 预防。 拖动滑块,实时看概率分布和输出变化 ## 应对 4:评测 + 人工审核(幻觉与四种应对) URL: https://xueai.miyang.cn/slides/1-2-mitigation-eval.html (以下为免费预览,全文见页面) 应对 4:评测 + 人工审核 PM 视角:如何量化幻觉风险、设计分级审核流程、让「人在回路中」成为产品安全网。手段 04 / 04 · 检测 + 纠正。 外部纠错层,冷启动阶段兜底策略(HITL) ## 汇总(上)· 大模型是什么 + 幻觉(篇章汇总) URL: https://xueai.miyang.cn/slides/summary-1.html (以下为免费预览,全文见页面) 汇总(上)· 大模型是什么 + 幻觉 大模型原理 · 总结回顾 · 上半页:大模型基础:它是什么,为何会幻觉。 训练本质 / Token / Base→SFT→Chat / 四种幻觉类型与根因 ## 汇总(下)· 缓解策略 + 决策框架(篇章汇总) URL: https://xueai.miyang.cn/slides/summary-1b.html (以下为免费预览,全文见页面) 汇总(下)· 缓解策略 + 决策框架 大模型原理 · 总结回顾 · 下半页:如何缓解幻觉,以及 AI PM 该有的决策框架。 四种缓解策略对比 / 常见误区清单 / 方案选择判断矩阵 ## 把那件事定下来(你现在能做什么) URL: https://xueai.miyang.cn/slides/build-1.html (以下为免费预览,全文见页面) 别停在「我懂了」,先把那件事定下来 原理讲完,最容易发生的事是:你觉得学到了很多,但合上电脑,手上什么都没多。所以从这里开始,每章结尾都有这么一页,只回答一个问题:学完这章,你今天能动手做什么。 需求收敛四段演示;三档任务:写四行需求、用五个真实输入试它、划一条人机分界线 大多数人给 AI 布置任务,停在第一段就交卷了:「帮我处理一下周报」。这句话没错,只是它没法验收。你不知道什么样的输出算成功,自然也不知道该不该改提示词。往下推三段,它才变成一个真需求。 从一句愿望到一个能验收的需求 「帮我处理一下周报」,想法有了,但也只是想法 进:一周的零碎记录;出:三段结论加一份下周计划 三段都能直接发给老板,一个字不用改 要引具体数字,那就走 RAG,别让它凭记忆编 ## 大模型基础 · 30 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/interview-1.html (以下为免费预览,全文见页面) 大模型基础 · 30 道灵魂拷问 大模型原理篇学完了,懂了和能讲出来之间还差一场实战。这 30 个问题来自三个真实场景,先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:概率预测 / message list / 幻觉解释 / RAG vs 重训 / Temperature / 上下文窗口 先给本质:大模型是超大型概率预测机器,每次只做一件事,根据已有的所有 Token 预测下一个 Token 出现的概率,逐个生成。 区分训练和推理:训练是在海量文本上学统计规律;你和它对话时参数已经冻结,它没有在学习,只是在计算。 正面回答思考问题:它没有人类意义上的思考,规模够大后又确实表现出类似推理的能力。所以既不要神化,也不要贬低成复读机。 落一个例子:输入「今天天气真」,模型给出好 62% / 差 18% / 冷 9% 这样的分布,按概率采样。整段回答就是这个动作重复几百次。 点破本质:模型底层是续写机器。所谓对话,是把历史包装成聊天记录格式,让模型续写出助手的下一句。 多轮的真相:模型没有记忆。每一轮都是把完整的 message list(system + 历史 user/assistant + 当前提问)重新发一遍。 补上工程环节:模型能听懂对话格式,靠的是 Chat Template + SFT 指令微调,这是 Base 模型学会说话的关键一步。 拔高一层:所有 AI Harness 操作(RAG、记忆、Agent)本质都是对这个 message list 的处理。理解它,就找到了所有方案的入口。 ## 上下文窗口:AI 的工作记忆(上下文工程) URL: https://xueai.miyang.cn/slides/5-1.html 上下文窗口:AI 的工作记忆 模块五 · 上下文工程 · 第 1 页。拖动下方滑块,亲自体验窗口溢出。 窗口构成可视化,拖动模拟溢出效果,主流模型容量对比 上下文窗口(Context Window)是模型一次能看到的所有文字。超出窗口,它就彻底忘了:连模糊的印象都没有,是完全看不见。 一次请求的上下文构成(128K 窗口) ## 上下文溢出:三种处理策略(上下文工程) URL: https://xueai.miyang.cn/slides/5-2.html 上下文溢出:三种处理策略 模块五 · 上下文工程 · 第 2 页。点击策略,下方逐步演示效果。 直接截断 / 摘要压缩 / 选择性保留,可视化对比每种策略的利弊 对话越来越长超出窗口时,工程上有三种主流处理方式,各有利弊。 直接截断 丢掉最早的对话轮次 摘要压缩 历史先总结再存,保留要点 选择性保留 语义检索,只注入相关历史 ## 为什么大模型选择 Markdown(Prompt 工程) URL: https://xueai.miyang.cn/slides/6-0a.html (以下为免费预览,全文见页面) 为什么大模型选择 Markdown 模块六 · Prompt Engineering · 前置。一步步推演 Markdown 为何胜出。 纯文本模型 + 排版需求 = MD 成为首选,逐步推演 HTML/Word/LaTeX 为何不行 大模型是纯文本模型 LLM 逐 Token 输出,每个 Token 就是一段文字。它不懂颜色、不懂字号、不懂对齐。 但用户期望有排版 标题、加粗、列表、代码块、链接…没有排版的纯文本,阅读体验极差。 ## Markdown 语法与渲染 Pipeline(Prompt 工程) URL: https://xueai.miyang.cn/slides/6-0b.html (以下为免费预览,全文见页面) Markdown 语法与工程化渲染 模块六 · Prompt Engineering · 前置。点击语法元素看源码/渲染对比,再看前端渲染方案选型。 常用语法速查 + 实时编辑器 + marked.js / markdown-it 渲染方案 ## 你说什么,它就变什么(Prompt 工程) URL: https://xueai.miyang.cn/slides/6-1.html (以下为免费预览,全文见页面) 你说什么,它就变什么 通过 System Prompt 指定角色,同一个模型可以变成完全不同的助手。角色扮演是最基础也最有效的 Prompt 技巧。点击下面的角色和格式,观察输出如何变化。 五种角色实时切换,输出格式控制,System Prompt 核心原理 ## Prompt 进阶技巧(Prompt 工程) URL: https://xueai.miyang.cn/slides/6-2.html (以下为免费预览,全文见页面) Prompt 进阶技巧 掌握 4 个技巧,让模型回答质量翻倍。点击技巧,下方实时演示好坏对比。 Few-Shot / CoT / 约束条件 / 任务拆解,好坏对比交互演示 少样本示例(Few-Shot) 给几个例子,模型就懂格式和标准 思维链(Chain of Thought) 让模型逐步推理,准确率大幅提升 约束条件(Constraints) 字数、语气、格式、禁用词… 分而治之(Task Decomposition) 复杂任务拆步骤,每步单独优化 ## 输出格式取舍(Prompt 工程) URL: https://xueai.miyang.cn/slides/6-3.html (以下为免费预览,全文见页面) 输出格式取舍 没有最好的格式,只有最适合场景的格式。流式返回时,格式选择的影响格外明显。选一个格式,点击「开始流式演示」,观察 Token 生成的体验差异。 纯文本 / JSON / Markdown / YAML / XML,场景适配度对比与权衡 纯文本 流式直接呈现,最稳定 JSON 结构化 流式时残缺,无法实时解析 Markdown 流式可渲染,结构提取难 YAML 省 Token,流式同样残缺 XML / 自定义标签 流式可增量解析,最友好 ## 流式返回与格式配合(Prompt 工程) URL: https://xueai.miyang.cn/slides/6-4.html (以下为免费预览,全文见页面) 流式返回与格式配合 LLM 是逐 Token 输出的。同一个响应内容,格式不同,流式体验完全不同。选择场景后点击播放,观察三种格式的渲染差异。 JSON 全文才能解析 / MD 逐字显示 / XML 捕获标签即渲染,动态演示 结构化列表输出 3 个工具,包含名称/类型/亮点 多字段结论输出 结论/原因/建议/置信度 ## Prompt Injection:为什么会被攻击(Prompt 安全) URL: https://xueai.miyang.cn/slides/prompt-attack.html (以下为免费预览,全文见页面) Prompt Injection:为什么会被攻击 Prompt 注入是大模型应用面临的最严重安全威胁之一。它和 SQL 注入同源:数据和指令混在同一个通道里。 SQL 注入类比 → Message List 本质 → 缺乏参数化 → 5 大攻击类型概览 用户输入混入了 SQL 命令 用户输入混入了系统指令 ## Prompt Injection:12 个攻击案例(Prompt 安全) URL: https://xueai.miyang.cn/slides/prompt-attack-cases.html Prompt Injection:12 个攻击案例 12 个经过真实验证的攻击案例,分为 5 大类型。选一个案例,切换「中招版 vs 防御版」,观察同样的攻击在有无防护下的两种结局。 越权指令 / 角色扮演 / Few-Shot / 结构注入 / 隐喻伪装,中招版 vs 防御版 ## Prompt 防御:三层拦截实战(Prompt 安全) URL: https://xueai.miyang.cn/slides/prompt-defense.html (以下为免费预览,全文见页面) Prompt 防御:三层拦截实战 以真实产品 MoodVerse 为例,看输入过滤、System Prompt 安全约束、输出泄漏检测三层如何层层拦截 Prompt 注入。点击标签页逐步了解,第三个标签可亲手模拟攻击全链路。 输入层正则 → 提示词层约束 → 输出层泄漏检测 → 二次审核,可模拟攻击全链路 ## AI 安全红线:四条底线(Prompt 安全) URL: https://xueai.miyang.cn/slides/ai-safety-redlines.html (以下为免费预览,全文见页面) AI 安全红线:四条底线 企业使用 AI 的四条不可触碰的底线。记住这四条,就能避开 90% 的安全事故。点击任意红线卡片查看详情。踩到任何一条 = 安全事故。 不能做的事、做了会怎样,产品经理必须守住的四类安全边界 ## 风险分级与责任:谁来管、怎么管(Prompt 安全) URL: https://xueai.miyang.cn/slides/ai-safety-governance.html 风险分级与责任 AI 使用不是能用就行。按风险分级(L1/L2/L3)匹配管控强度,按责任链(使用者/审批人/管理者)明确谁担责。点击左侧任意条目查看详情。 AI 输出的风险分级模型,各角色的责任分工与治理框架 ## Agent:能干活的 AI(Agent 工程) URL: https://xueai.miyang.cn/slides/7-1.html (以下为免费预览,全文见页面) Agent:能干活的 AI 点击能力卡片,右侧逐步演示 Agent 在真实场景中的执行过程 四大能力 Plan / Tool / Memory / Act,点击查看真实案例 本节乃至整个 Agent 工程章节的很多想法,都来自她 2023 年 6 月的博客 《LLM Powered Autonomous Agents》。她是一位令人尊敬的前辈,明确提出了影响深远的 Agent 架构——就是上面这张著名的「螃蟹图」:Agent(LLM)居中当大脑,向四周伸出 Planning 规划、Memory 记忆、Tools 工具、Action 行动。 这张图对整个 AI Agent 行业影响深远,今天几乎所有 Agent 框架都能在里面找到影子。非常推荐关注她的推特。 ## 工具调用的秘密(Agent 工程) URL: https://xueai.miyang.cn/slides/7-2.html (以下为免费预览,全文见页面) 工具调用的秘密 模型不会真的执行代码,它只是输出一段结构化文字,框架代码负责解析并执行。向下滚动,自动追踪完整调用链路。 模型输出 JSON → 框架解析执行 → 结果注回,四步流程可视化 ## 一次对话背后的 5 条消息(Agent 工程) URL: https://xueai.miyang.cn/slides/7-2a.html (以下为免费预览,全文见页面) 一次对话背后的 5 条消息 左边:用户看到的界面 | 右边:API 里真正发生的。向下滚动,自动演示一次查天气背后发生了什么。 拆解 Function Calling 真实链路:用户看到 1 条回复,背后是 5 条 API 消息 ## 工具描述的学问(Agent 工程) URL: https://xueai.miyang.cn/slides/7-2b.html (以下为免费预览,全文见页面) 工具描述的学问 同一个任务,左边失败,右边成功,差别只在描述。选择一个实验场景,点击运行看对比。 同样功能,好描述 vs 坏描述成功率差 3 倍,对比实验 ## 多工具编排:并发 vs 串行(Agent 工程) URL: https://xueai.miyang.cn/slides/7-2c.html (以下为免费预览,全文见页面) 多工具编排:并发 vs 串行 同一轮返回 3 个工具调用,执行顺序怎么选?选择模式,点击演示,观察时间差异。 isConcurrencySafe 决定工具能否并行,调度策略可视化 ## MCP 协议:工具的 USB 接口(Agent 工程) URL: https://xueai.miyang.cn/slides/7-2d.html (以下为免费预览,全文见页面) MCP 协议:工具的 USB 接口 USB 之前每台设备要专属数据线;MCP 之前每个 Agent 要专属对接代码。 stdio / SSE / Streamable HTTP 三种传输方式对比,数据流动画 ## ReAct 实战:查询天气完整链路(Agent 工程) URL: https://xueai.miyang.cn/slides/7-3.html (以下为免费预览,全文见页面) ReAct 实战:当 Agent 卡住了 ReAct 循环:思考 → 行动 → 观察,循环往复。但如果模型对参数格式不了解,它会反复猜测,卡在同一个地方打转。向下滚动,自动追踪真实失败过程。 Thought / Action / Observation 逐步演示,7 步完整 Agent 链路 ## 短期记忆 = 上下文窗口(Agent 工程) URL: https://xueai.miyang.cn/slides/7-3a.html (以下为免费预览,全文见页面) 短期记忆 = 上下文窗口 上下文窗口就是模型的工作台:模型能看到的一切,都必须放在这张桌子上。向下滚动,观察工作台如何被填满。 消息列表可视化,每条消息的 Token 占用和角色标记 ## 上下文压缩:四层防线(Agent 工程) URL: https://xueai.miyang.cn/slides/7-3b.html (以下为免费预览,全文见页面) 上下文压缩:四层防线 拖动滑块模拟对话增长,观察压缩如何延长上下文寿命。 60% 裁剪 → 75% 微压缩 → 85% 折叠 → 95% 紧急,拖动滑块看压缩过程 ## 长期记忆:向量检索(Agent 工程) URL: https://xueai.miyang.cn/slides/7-3c.html (以下为免费预览,全文见页面) 长期记忆:向量检索 让 Agent 记住上个月的事:通过向量检索,把用户偏好、项目配置、历史 Bug 注入当前对话。 Embedding → 向量数据库 → 语义搜索,topK 与 minScore 的设计决策 ## 从 Embedding 到 Milvus(Agent 工程) URL: https://xueai.miyang.cn/slides/vector-db-1.html (以下为免费预览,全文见页面) 从 Embedding 到 Milvus 先建立直觉:模型把含义变成坐标,Milvus 负责在海量坐标中快速找到“意思最接近”的内容。 语义相似度、ANN 与向量数据库的职责边界 原始内容 “退款多久到账?”以及文档、图片等业务数据。 Embedding 同一个模型把内容编码成固定长度的浮点向量。 ANN 搜索 近似最近邻用少量精度换取数量级更高的速度。 业务结果 返回 Top-K 文档,再交给应用或大模型使用。 字面不同,意思相近 “如何退钱”和“退款流程”未必共享关键词,但在语义空间里距离很近。Embedding 捕捉的是统计语义,不是可靠的事实判断。 不能逐条硬算 一百万条向量逐一精确比较成本太高。ANN 索引先缩小候选集,再计算距离;因此需要用 Recall 与延迟共同评测。 ## Milvus 心智模型(Agent 工程) URL: https://xueai.miyang.cn/slides/vector-db-2.html (以下为免费预览,全文见页面) Milvus 心智模型 把新术语映射到熟悉的“表、列、行”,再补上向量索引与内存加载两个关键概念。 Collection、Schema、Entity、Index、Search、Query 与 Load Milvus 可类比为 职责 Collection 表 一组具有同一 Schema 的 Entity Schema / Field 表结构 / 列 约束主键、向量维数与标量类型 Entity 行 一条业务对象;主键必须能稳定定位 Index 索引 加速向量近邻搜索 { "id": 42, # 主键:用于更新、删除、追踪 "vector": [0.12, ...], # 向量字段:用于 Search "text": "退款通常 3 天到账", "category": "refund", # 标量字段:用于 Filter / Query "active": true } ## Milvus 实操(Agent 工程) URL: https://xueai.miyang.cn/slides/vector-db-3.html (以下为免费预览,全文见页面) Milvus 实操 用一套一致的集合名和真实文本 Embedding,跑通写入、检索与删除;代码假定本地 Milvus 已在 19530 端口运行。 连接、建表、批量写入、索引、搜索、查询和删除 from pymilvus import MilvusClient, DataType from sentence_transformers import SentenceTransformer COLLECTION = "support_kb" client = MilvusClient(uri="http://localhost:19530") print(client.list_collections()) # 先确认服务可达;健康检查常见于 9091/healthz RESET_LAB = False # 只有确认可丢弃旧练习数据时才改为 True if client.has_collection(collection_name=COLLECTION): if not RESET_LAB: raise RuntimeError("support_kb 已存在;请换名称,或确认后启用 RESET_LAB") client.drop_collection(collection_name=COLLECTION) # 删除整个集合 encoder = SentenceTransformer("BAAI/bge-m3") docs = [ {"id": 1, "text": "退款通常在三个工作日内到账", "category": "refund"}, {"id": 2, "text": "修改密码后需要重新登录", "category": "account"}, ] vectors = encoder.encode([d["text"] for d in docs], normalize_embeddings=True).tolist() dim = len(vectors[0]) schema = MilvusClient.create_schema(auto_id=False, enable_dynamic_field=False) schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True) schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=dim) schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=1000) schema.add_field(field_name="category", datatype=DataType.VARCHAR, max_length=64) client.create_collection(collection_name=COLLECTION, schema=schema) rows = [{**d, "vector": v} for d, v in zip(docs, vectors)] client.insert(collection_name=COLLECTION, data=rows) # 数据较多时分批写,并记录失败批次 ## 从检索到 RAG(Agent 工程) URL: https://xueai.miyang.cn/slides/vector-db-4.html (以下为免费预览,全文见页面) 从检索到 RAG Search 返回“可能相关的片段”,RAG 还要把它们变成有来源、有边界、能被评测的回答依据。 切分、过滤、混合检索、RRF、重排与评测 Embed Query 用写入时同一个模型编码问题。 Retrieve 租户/权限过滤 + Top-K 向量检索。 Rerank 精排、去重,并控制上下文 Token。 Generate 要求模型只依据证据回答并给出来源。 ## ReAct 循环:思考→行动→观察(Agent 工程) URL: https://xueai.miyang.cn/slides/7-4a.html (以下为免费预览,全文见页面) ReAct 循环:思考 → 行动 → 观察 Reasoning + Acting:Agent 靠循环完成任务,一问一答只是其中一轮。向下滚动,自动演示一个复杂任务如何经历 14 轮循环。 一个删除 console.log 的任务经历 14 轮循环,含自我纠错 ## Agent 卡死的 5 种模式(Agent 工程) URL: https://xueai.miyang.cn/slides/7-4b.html (以下为免费预览,全文见页面) Agent 卡死的 5 种模式 点击下方卡片选择一种故障模式 → 播放故障模拟 → 对比加了防护后的表现。 参数格式错误、幻觉工具、无限递归、信息不足、API 异常 ## 权限与安全(Agent 工程) URL: https://xueai.miyang.cn/slides/7-4c.html (以下为免费预览,全文见页面) 权限与安全 Agent 能做什么、不能做什么?切换三种权限模式,观察同一批操作的不同处理方式。 5 种权限模式 + LLM 风险分级 + Human-in-the-loop 设计 ## Skill:让 Agent 少走弯路(Agent 工程) URL: https://xueai.miyang.cn/slides/7-5.html (以下为免费预览,全文见页面) Skill:让 Agent 少走弯路 选择一个场景,演示自动播放,对比「差循环」和「好循环」的两种执行方式。 Skill = 流程说明 + 工具调用指引,用「阳台收衣服」类比好循环 vs 差循环 ## Skill 的本质(Agent 工程) URL: https://xueai.miyang.cn/slides/7-5a.html (以下为免费预览,全文见页面) Skill 的本质 给 Agent 装上「操作手册」:没有 Skill 的 Agent 像新员工摸索,有 Skill 的 Agent 像老手照章执行。 好循环 vs 差循环升级版,Skill 如何改变 Agent 执行路径 ## 解剖一个真实 Skill(Agent 工程) URL: https://xueai.miyang.cn/slides/7-5b.html (以下为免费预览,全文见页面) 解剖一个真实 Skill 以 Alice 发版助手为例:点击每个区域展开详情,看 Agent 如何读取并执行一个 Skill。 从真实源码学 SKILL.md 的结构设计 ## 脚手架工程:从试验品到产品(Agent 工程) URL: https://xueai.miyang.cn/slides/7-4.html (以下为免费预览,全文见页面) 脚手架工程:从试验品到产品 左侧模拟同一个「查机票 + 订酒店」任务在有无脚手架时的差距,滚动到演示区自动播放;右侧点击查看 5 大能力详解。 模拟 Agent 查机票订酒店,无脚手架 vs 有脚手架完整对比,5 大能力详解 ## 5 道工程护栏(Agent 工程) URL: https://xueai.miyang.cn/slides/7-6a.html (以下为免费预览,全文见页面) 5 道工程护栏 没有护栏的 Agent = 没有刹车的跑车。点击左侧每道护栏,查看场景还原与有无护栏的对比。 迭代上限、输出截断、超时控制、中断恢复、上下文急救 ## 多 Agent 协作(Agent 工程) URL: https://xueai.miyang.cn/slides/7-6b.html (以下为免费预览,全文见页面) 多 Agent 协作:一个人干不完,就派团队 主 Agent 拆任务 → 子 Agent 各司其职 → 汇总交付。只读任务并行加速,写入任务串行保安全。 子 Agent 调度、Worker Thread、并行 vs 串行执行策略 ## 可观测性(Agent 工程) URL: https://xueai.miyang.cn/slides/7-6c.html (以下为免费预览,全文见页面) 可观测性:Agent 在干什么、花了多少钱 事件流 + 统计面板 · 实时监控 Agent 全生命周期。点击「模拟一次任务」,看一个真实任务的完整事件流。 事件流可视化、Token 追踪、OpenTelemetry 集成 ## Agent 工程全景图(Agent 工程) URL: https://xueai.miyang.cn/slides/7-summary.html (以下为免费预览,全文见页面) Agent 工程全景图 工具、记忆、执行、工程四大支柱的完整知识地图 · 共 14 个知识点。 从四大能力到工程落地,一页看清 Agent 的完整知识地图 ## 多轮对话为什么越来越贵(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-1.html (以下为免费预览,全文见页面) 多轮对话为什么越来越贵? LLM 按输入 Token 数计费。每一轮对话,都要把所有历史记录重新发给模型:历史越长,Token 越多,费用越高。拖动滑块模拟费用累积。 Token 累积成本可视化,拖动轮次查看费用如何指数增长 ## KV Cache:用空间换时间(和钱)(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-2.html (以下为免费预览,全文见页面) KV Cache:用空间换时间 每轮对话,模型都要对所有历史 Token 做 Attention 计算。KV Cache 把已算过的 K/V 矩阵缓存下来,下轮只计算新增 Token。 类比理解 + 节省效果计算器,拖动轮次查看节省比例 ## 显式缓存:实战对比(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-2b.html (以下为免费预览,全文见页面) 显式缓存:实战对比 一行代码,保证命中。生产环境必须用显式缓存:隐式缓存在分布式架构下不可靠。 cache_control 写法、缓存命中判断、价格折扣对比,真实省钱效果演示 ⚠️ 隐式缓存为什么在生产环境不可靠? 云端 LLM 跑在多台 GPU 节点上,每次请求随机路由。节点 A 有你的缓存,节点 B/C 没有。命中纯靠运气,实际命中率 <30%。 ✅ 显式缓存:主动标记锚点 在 API 请求里加一行 cache_control,平台保证把请求路由到有缓存的节点。不依赖随机路由,命中率接近 100%。 无需改代码不保证命中折扣:标准价 20%分布式下 MISS 率高 加一行 cache_control平台保证路由命中折扣:标准价 10%省 90% 输入成本 ## 动态时间戳:最贵的 System Prompt(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-3.html (以下为免费预览,全文见页面) 动态时间戳:最贵的 System Prompt 一个小小的设计错误,可以让你的 KV Cache 完全失效,每轮对话成本翻倍:在 System Prompt 里写动态时间。 错误设计 vs 正确设计,三种时间处理方案对比切换 ## 综合成本优化:从系统角度省钱(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-4.html (以下为免费预览,全文见页面) 综合成本优化 单一优化效果有限。分层组合策略可将 AI 成本降低 70–90%。点击下方策略卡片,实时观察成本条的变化。 5 层优化策略,成本构成可视化,节省 70-90% 的系统设计 ## 图片 Token:像素也在烧钱(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-5.html (以下为免费预览,全文见页面) 图片 Token:像素也在烧钱 多模态模型不按「一张图」计费,而是把图片切成像素块换算成 Token。拖动滑块改变分辨率,实时看 Token 成本变化。 图片计费公式、缩放机制、分辨率陷阱、按任务分级策略 ## 按任务匹配分辨率(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-5b.html (以下为免费预览,全文见页面) 图片 Token:按任务匹配分辨率 不同任务对图片细节要求不同,用最低分辨率满足任务 = 最省钱。选一个任务类型,看推荐的分辨率方案。 高/中/低三档分辨率策略,不同场景的 Token 消耗对比与选型建议 ## 语法层优化:写给机器的提示词(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-6.html (以下为免费预览,全文见页面) 语法层优化:写给机器的提示词,不要排版 格式性 Token 最高占提示词 13–20%。提示词是写给机器的指令,不是给人看的文档。那些 **加粗**、JSON 大括号、缩进换行…都是在花钱买格式。 YAML vs JSON、CSV vs 数组、压缩 JSON 输出,格式性 Token 省 10-30% 用缩进代替闭合符号,信噪比更高 字段名重复 N 遍是最大浪费 机器读数据不需要美观,只需要合法 ** 加粗、### 标题占用额外 Token ## 语义层优化:不要把上下文当垃圾桶(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-7.html (以下为免费预览,全文见页面) 语义层优化:不要把上下文窗口当垃圾桶 信息密度越高 → 注意力越集中 → 效果越好。三个语义层策略,让每个 Token 都有价值。 动态 Few-Shot、LLMLingua-2 压缩、关键信息放首尾,提升信息密度 用向量检索,每次只取最相关的 3 条 LLMLingua-2 过滤冗余,保留语义核心 利用模型注意力的首尾偏好特性 ## 输出层 + KV Cache 进阶(成本优化与选型) URL: https://xueai.miyang.cn/slides/8-8.html (以下为免费预览,全文见页面) 输出层 + KV Cache 进阶:控制输出 = 控制成本 输出 Token 比输入贵 3–5 倍。点击下方技巧切换互动演示,体验三个输出层技巧和两个 KV Cache 进阶陷阱。 负向约束、Diff 润色、停止序列;KV Cache 的工具陷阱与滑动窗口问题 明确说不能做什么 不要重写整段 stop 参数精确控制 前缀变了 = 全量重算 FIFO 队列破坏缓存 ## 模型选型:能力 vs 成本(成本优化与选型) URL: https://xueai.miyang.cn/slides/cost-eval.html (以下为免费预览,全文见页面) 模型选型:能力 vs 成本的权衡 优化做完了,还需要选对模型。点击下方问题切换视角,看散点图、月费对比和场景决策框架。 主流模型能力/成本矩阵、选型决策树、不同场景的模型匹配策略 能力与价格不是线性关系 相同 Token 用不同模型 按场景匹配:日常 / 专业 / 极限 ## 大道至简:坚守第一性原理(成本优化与选型) URL: https://xueai.miyang.cn/slides/engineering-philosophy.html (以下为免费预览,全文见页面) 大道至简:坚守第一性原理 AI Harness · 收官思考。四步回到原点,看清一切 Harness 手段的本质。 AI Harness 的本质 / 做 vs 不做的取舍 / 会被时代淘汰的 Harness / 终极问题 ## 人机知识边界:四象限策略(实用技巧) URL: https://xueai.miyang.cn/slides/ai-tips-boundary.html (以下为免费预览,全文见页面) 人机知识边界:四象限策略 先判断问题在哪个区,再决定怎么用 AI。每次用 AI 之前,先想一个问题:这个答案,我能验证吗? 什么交给 AI、什么自己来,用四象限快速判断任务分配 ## 好提问 vs 坏提问(实用技巧) URL: https://xueai.miyang.cn/slides/ai-tips-context.html 好提问 vs 坏提问:上下文决定一切 同一个 AI,提问方式不同,输出天差地别。点击场景切换对比。 上下文决定输出质量,同一个问题好坏对比演示 ## AI 说的能信吗?找出幻觉(实用技巧) URL: https://xueai.miyang.cn/slides/ai-tips-verify.html AI 说的能信吗? 找出 AI 编造的内容。点击你认为有问题的条目,然后揭晓答案。 三种快速验证方法,识别 AI 自信说错的场景 ## 迭代的艺术:知道何时收手(实用技巧) URL: https://xueai.miyang.cn/slides/ai-tips-iterate.html 迭代的艺术:知道何时收手 跟着一个真实的文案迭代过程走 4 轮:前 3 轮质量持续上升,第 4 轮画蛇添足。演示会自动逐轮播放,注意观察质量仪表的变化。 从粗到精的迭代节奏,以及何时该停止追问 AI ## 场景速查:什么时候放心用(实用技巧) URL: https://xueai.miyang.cn/slides/ai-tips-scenarios.html 场景速查:什么时候放心用 9 个常见场景,按风险分成三档。点击左侧场景卡片查看详细指南,也可以按风险等级筛选。 高可信 / 需验证 / 慎用 / 不用,AI 适用场景四分类 ## 汇总(上)· Prompt 工程 + Agent(课程收官) URL: https://xueai.miyang.cn/slides/summary-2.html (以下为免费预览,全文见页面) 汇总(上)· Prompt 工程 + Agent Harness 核心篇总结回顾 · 上半页(1 / 2):设计 Message List 的核心技能,以及让 AI 从"说"到"做"的 Agent 工程。 上下文溢出策略 / Prompt 六要素 / 工具调用真相 / Skill + 脚手架 ## 汇总(下)· 成本优化 + PM 视角(课程收官) URL: https://xueai.miyang.cn/slides/summary-2b.html (以下为免费预览,全文见页面) 汇总(下)· 成本优化 + PM 视角 Harness 核心篇总结回顾 · 下半页(2 / 2):五层成本优化体系,以及 AI PM 带走的完整工程视角。 五层成本体系 / KV Cache 原理 / 图片 Token / 课程完整能力清单 ## 课程总结 · 产品经理的第一节 AI 课(课程收官) URL: https://xueai.miyang.cn/slides/summary-final.html (以下为免费预览,全文见页面) 课程总结 · 产品经理的第一节 AI 课 今天学了什么?带走这四件事:大模型基础、Prompt 工程、Agent 与成本、安全合规。 从大模型原理到工程落地,完整课程一页回顾 ## 总结(上)· 原理 + Harness(课程收官) URL: https://xueai.miyang.cn/slides/summary-final-1.html (以下为免费预览,全文见页面) 总结(上)· 原理 + Harness 课程总结上半页(1 / 2):模块一「大模型是怎么来的」建立认知直觉,模块二「Prompt 怎么写才管用」让 AI 按你要的输出。 大模型认知框架 / 幻觉应对 / Prompt 与 Agent 核心要点 ## 总结(下)· 实战 + 成本(课程收官) URL: https://xueai.miyang.cn/slides/summary-final-2.html (以下为免费预览,全文见页面) 总结(下)· 实战 + 成本 课程总结下半页(2 / 2):模块三「AI 能干什么、多少钱」建立自动化与成本意识,模块四「安全合规与红线意识」知道产品该在哪里设防。 安全防御 / 成本优化 / 用 AI 的正确姿势 / 下一步学习路径 ## 让它连跑五次都能用(你现在能做什么) URL: https://xueai.miyang.cn/slides/build-2.html (以下为免费预览,全文见页面) 写一版提示词,让它连跑五次都能用 这一章你学了上下文、Prompt 技巧、Agent 和成本,知识点是全课最多的。但落到手上,第一件事只有一件:把 M0 定下的那个需求,写成一版稳定的提示词。稳定的意思是不挑运气。 同一输入五连跑演示;三档任务:写第一版提示词、给不稳定归类、加示例与违禁项重跑对比 很多人卡在这一步的表现是:「我试过了,效果时好时坏。」时好时坏,通常是提示词没把要求钉死。模型背这个锅有点冤。同一句话连问五次,你就能看见它到底稳不稳。 同样一句话,问五次 ## AI Harness · 30 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/interview-2.html (以下为免费预览,全文见页面) AI Harness · 30 道灵魂拷问 Harness 核心篇讲的全是工程落地:上下文、Prompt、安全、Agent、成本。这 30 个问题来自三个真实场景,先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:上下文溢出 / Prompt 工程 / 注入防御 / 工具调用 / 成本账单 / KV Cache / 输出格式 先定位根因:上下文窗口是模型一次能看到的全部 Token,超出的部分被截断,模型连模糊的印象都没有。忘事说明早期轮次已经被截掉了。 给三种策略:直接截断(丢掉最早轮次,零成本但信息永久丢失)、摘要压缩(历史先总结再存,保留人名和偏好等要点)、选择性保留(历史向量化,语义检索只注入相关轮次)。 按场景选型:查天气这类单次工具型对话用截断就够;客服和长期学习类对话用摘要,超过 20 轮效果明显;超长对话(100 轮以上)的复杂 Agent 用向量检索,Token 最省、回答最准。 戳破大窗口方案:窗口按 Token 计费,全塞进去成本线性上涨,长上下文还有注意力稀释问题。大窗口是能力上限,管理窗口才是方案。 先给公式:角色 + 任务 + 上下文 + 约束 + 示例 + 格式。缺任何一项,质量就打折扣。核心心态是把 Prompt 当代码写。 挑一个手法讲透:比如 Few-Shot。做文本分类时不加示例,模型回你一段散文;给三个「输入 → 标签」的例子,它直接学会格式和标准,输出一个词,可以直接进程序。 再备一个进阶:复杂推理加思维链,让模型一步步算,推理过程透明、准确率大幅提升;复杂任务拆成多步,每步单独优化,质量比一次全问高好几倍。 落到约束:字数、受众、语气、禁用词写清楚,约束是控制输出最便宜的手段。没有约束的 Prompt 输出全靠运气。 ## 本章从哪来:Alice 开发实录(开篇) URL: https://xueai.miyang.cn/slides/9-0.html 本章从哪来:Alice 开发实录 这一章不是论文综述,也不是教程搬运——它是我开发 AI Agent 桌面应用 Alice 的一手经验总结。接下来每一节课的背后,都有一段真实踩过的坑。 本章是作者开发 AI Agent 桌面应用 Alice 的经验总结:约 50 万行代码、132 个工具、8 大模块与本章 8 个小节一一对应 她会记住你的偏好,帮你处理工作与生活中的任务。需要时,她会召集不同领域的专业 Agent,一起把任务推进到完成。 macOS · Windows · 免费 ## 文生图 vs 垫图:两种完全不同的事(AI 生图) URL: https://xueai.miyang.cn/slides/9-1.html 文生图 vs 垫图:两种完全不同的事 以 Alice(AI Agent 桌面应用)为例:同样是「生成一张 Alice 在书房的图」,有没有参考图,产出的质量天差地别。这是产品经理在设计生图功能时必须搞清的第一个决策。 一个从文字出发,一个从图片出发。产品经理要分清什么时候用哪种 文生图 (Text-to-Image) 模型按文字描述生成,但每次角色长什么样,全靠运气 垫图 (Image-to-Image) 模型根据参考图约束外貌,Alice 每次都长一样 场景 推荐模式 原因 纯背景/环境图 文生图 不涉及角色,纯场景描述即可 食物、物品特写 文生图 无需人物一致性约束 角色出镜(Alice 做某事) 垫图 必须保证还是 Alice,需要参考图锚定 角色换装 垫图 脸不变衣服变,必须有脸部参考 多场景系列图 垫图 一组图里角色外貌需一致 创意发散/概念探索 文生图 不需要锁定形象,越多变越好 ## 用 AI 给 AI 写 Prompt(AI 生图) URL: https://xueai.miyang.cn/slides/9-2.html (以下为免费预览,全文见页面) 用 AI 给 AI 写 Prompt 用户说「Alice 在阳台发呆」。生图模型需要的是一长段精确的视觉描述,光这句话远远不够。中间有一个翻译步骤:用 LLM 把人话翻译成生图语言。 用户说「画个夕阳下的猫」,生图模型需要的是完全不同的描述,解法是用 LLM 做翻译 ## 角色一致性:最难的产品问题(AI 生图) URL: https://xueai.miyang.cn/slides/9-3.html (以下为免费预览,全文见页面) 角色一致性:最难的产品问题 同一个描述「Alice 在不同场景中」,没有参考图时,每次生出来的 Alice 都长得不一样。这是 AI 生图产品最难的问题,也是 Alice 花了最多力气解决的问题。 同一个 IP 每次画都长不一样。为什么难、产品上怎么思考这个问题 同样的文字描述 "Alice, a young woman with dark hair",连续生成四次: 脸型每次都不同 发型和长度在变 体态比例不一致 画风也有偏差 结论:纯靠文字无法锁定一个角色的视觉身份。 同样的 Alice,在四个不同场景中(书房、厨房、阳台、办公): 脸型始终一致 发型和颜色稳定 身材比例不变 只有场景和动作在变 靠的是:每次生图都带上这张参考表 ## 模型会挂,然后呢?(AI 生图) URL: https://xueai.miyang.cn/slides/9-4.html (以下为免费预览,全文见页面) 模型会挂,然后呢? 在 Alice 里,用户说「帮我画一张图」,但背后可能 Gemini 超时了、Seedream 限流了、GPT Image 也出错了。用户不关心哪个模型挂了,他只关心:图到底能不能出来? 多模型降级链的产品逻辑:优先级、白名单、探活、全挂时的体验兜底 ## 生图的产品化清单(AI 生图) URL: https://xueai.miyang.cn/slides/9-5.html (以下为免费预览,全文见页面) 生图的产品化清单 在 Alice 里,调通生图 API 只花了一天。但从那一天到用户真正能用之间,还做了三个月的产品化工作。这张清单展示那 90% 的工作量。 从「调通了 API」到「用户能用」之间还差哪些东西,一张 checklist 数清楚 勾选下方清单项,看完成度如何变化 ## 教科书的 3 步 vs 真实的 N 步(Agent Loop) URL: https://xueai.miyang.cn/slides/9-6.html (以下为免费预览,全文见页面) 教科书的 3 步 vs 真实的 N 步 教科书说 Agent 循环是「想→做→看」三步。但当你真正把 Agent 推上生产环境,每转一圈要做的事比你想象的多得多。 ReAct 不止 Think-Act-Observe 三步,生产环境每轮还要做什么 教科书版 ReAct ⚙️ 真实生产版(单轮) ## 为什么 Agent 会卡死(Agent Loop) URL: https://xueai.miyang.cn/slides/9-7.html (以下为免费预览,全文见页面) 为什么 Agent 会卡死 实验室里的 Agent 死循环很好发现:控制台一刷就看到了。但生产环境的卡死更隐蔽:用户不会说「你的 Agent 死循环了」,他只会说「你的 AI 怎么这么慢」或者「它是不是傻了」。 真实场景中循环挂掉的几种典型模式,以及用户会看到什么 ## 防呆设计:怎么让循环自己停下来(Agent Loop) URL: https://xueai.miyang.cn/slides/9-8.html (以下为免费预览,全文见页面) 防呆设计:怎么让循环自己停下来 知道了 Agent 会怎么卡死,下一步就是设计防护。好的防呆是三层网,让系统既不会失控,又不会轻易放弃。 上限、检测、降级三类策略的思路,产品经理该在哪里画线 ## 流式体验:别让用户干等(Agent Loop) URL: https://xueai.miyang.cn/slides/9-9.html (以下为免费预览,全文见页面) 流式体验:别让用户干等 Agent 在后台跑了 30 秒,用户屏幕上应该看到什么?同样是等 30 秒,有没有进度感,体验天差地别。 工具在后台跑 30 秒,用户看到的应该是什么?进度感设计 ## 一条消息背后的真实成本(Agent Loop) URL: https://xueai.miyang.cn/slides/9-10.html (以下为免费预览,全文见页面) 一条消息背后的真实成本 用户只发了一句话,但底层可能跑了 10+ 轮循环、产生几十条 API 消息。当你打开账单,可能会吓一跳。 用户发一句话,底层可能跑 10+ 轮循环、几十条 API 消息,由此建立成本意识 ## 对话越长越贵、越长越笨(上下文管理) URL: https://xueai.miyang.cn/slides/9-11.html (以下为免费预览,全文见页面) 对话越长越贵、越长越笨 每一轮对话都要把全部历史重新发给模型:对话越长,费用越高、注意力越分散、离窗口上限越近。这三个问题决定了:上下文不能放任不管。 费用递增 + 注意力衰减 + 窗口有限,三个必须管理上下文的理由 ## 压缩是一门取舍的艺术(上下文管理) URL: https://xueai.miyang.cn/slides/9-12.html (以下为免费预览,全文见页面) 压缩是一门取舍的艺术 上下文太长了怎么办?全删或全留都不对:有的能删(旧工具输出)、有的不能删(用户原话)、有的要花钱压(全量摘要)。产品经理需要一个决策框架。 有的能删、有的不能删、有的要花钱压,这是产品经理的决策框架 一段 8 轮对话,试试不同的压缩策略 ## 用户说的话能不能删?(上下文管理) URL: https://xueai.miyang.cn/slides/9-13.html (以下为免费预览,全文见页面) 用户说的话能不能删? AI 的输出可以摘要、工具结果可以截断,但用户的原话删了就回不来了。而且用户一定会发现:「我明明说了 xxx,你怎么忘了?」 「圣物」问题:AI 的输出可以压缩,但用户的原话删了就回不来 ## 本地压缩 vs LLM 压缩(上下文管理) URL: https://xueai.miyang.cn/slides/9-14.html (以下为免费预览,全文见页面) 本地压缩 vs LLM 压缩 压缩上下文有两条路:本地处理(正则替换、截断)零成本但粗糙,LLM 摘要有成本但精准。该怎么选?答案是:都用,但有先后顺序。 零成本快但粗 vs 有成本慢但精,什么时候用哪种 维度 本地压缩 LLM 压缩 原理 正则匹配、字符截断、模板替换 让另一个 LLM 读一遍后写摘要 成本 零(纯本地计算) 要花钱(调用一次 API) 延迟 <1ms 1~5 秒 效果 粗糙,可能丢关键信息 精准,能保留核心语义 适合场景 工具输出、JSON 结果、重复内容 多轮对话摘要、复杂上下文浓缩 ## 上下文 ≠ 记忆(长期记忆) URL: https://xueai.miyang.cn/slides/9-15.html (以下为免费预览,全文见页面) 上下文 ≠ 记忆 上下文窗口像白板:写满了就擦掉,对话结束就清空。长期记忆像笔记本:写下的东西,下次打开还在。AI 产品需要两套系统。 白板(上下文窗口)和笔记本(长期记忆)的区别,为什么需要两套系统 白板(上下文窗口) 笔记本(长期记忆) ## 什么值得记、什么不值得记(长期记忆) URL: https://xueai.miyang.cn/slides/9-16.html (以下为免费预览,全文见页面) 什么值得记、什么不值得记 用户每天和 AI 聊几十上百条消息。「嗯」「好的」「哈哈」占了大半,真正有价值的偏好和事实可能只有几条。记忆系统需要一个守门员。 不是所有对话都有价值:守门员思路与筛选逻辑 ## 记忆冲突:用户改了主意怎么办(长期记忆) URL: https://xueai.miyang.cn/slides/9-17.html (以下为免费预览,全文见页面) 记忆冲突:用户改了主意怎么办 上个月说「喜欢咖啡」,这个月说「改喝茶了」。两条记忆打架了:旧的要不要删?新的怎么存?这背后有四种策略。 新旧记忆冲突的四种处理策略:新增 / 合并 / 冲突标记 / 跳过 ## 记忆注入的成本问题(长期记忆) URL: https://xueai.miyang.cn/slides/9-18.html (以下为免费预览,全文见页面) 记忆注入的成本问题 记了 1000 条记忆,每次对话全塞进 system prompt?还是按需检索相关的几条?全量注入简单但贵且噪声多,按需检索省钱但可能漏。 记了 1000 条,每次全塞进去?还是按需检索?两种策略的代价 ## System Prompt 不是一坨文本(Prompt Harness) URL: https://xueai.miyang.cn/slides/9-19.html (以下为免费预览,全文见页面) System Prompt 不是一坨文本 生产级的 System Prompt 不是想到什么写什么。它是分层管理的:身份层、环境层、工具层、行为层,各管各的,改一层不影响其他层。 分层管理的必要性:身份、环境、工具指引各自独立,互不干扰 常见的混乱写法 点击每层查看它负责什么 ## 不用的东西别给 AI 看(Prompt Harness) URL: https://xueai.miyang.cn/slides/9-20.html (以下为免费预览,全文见页面) 不用的东西别给 AI 看 如果你有 100 个工具,全部描述塞进 System Prompt,光工具描述就占几万 token。AI 和人一样:给太多信息反而找不到重点。 100 个工具全塞 system?Token 爆炸。这就需要按需加载的设计思路 调整工具数量,看 Token 开销变化 ## Skill:可运营的 Prompt 模块(Prompt Harness) URL: https://xueai.miyang.cn/slides/9-21.html (以下为免费预览,全文见页面) Skill:可运营的 Prompt 模块 System Prompt 管我是谁,Tool 管我能做什么,那 Skill 管什么?它管的是遇到某件事,怎么一步一步做好。文件即配置,版本可追溯。 文件即配置、版本可追溯,让 Prompt 也能像代码一样管理 System Prompt Tool Skill 点击每个区块展开说明 ## 提示词和缓存的微妙关系(Prompt Harness) URL: https://xueai.miyang.cn/slides/9-22.html (以下为免费预览,全文见页面) 提示词和缓存的微妙关系 KV Cache 的规则极其简单:前缀一模一样就命中,差一个字就全部重算。所以,往 System Prompt 里插入任何动态内容,都可能让缓存永远打不中。 改一个字 System Prompt,整条 KV Cache 作废。怎么减少手抖的成本 每次请求,系统会对 System Prompt 算一个指纹(hash) 每一秒时间不同 → 指纹不同 → 缓存永远命不中 → 每次都要从头算 → 成本翻倍。这不只是时间戳的问题:任何动态内容插在 System Prompt 里都有同样效果。 ## 什么时候需要多个 Agent(多 Agent) URL: https://xueai.miyang.cn/slides/9-23.html (以下为免费预览,全文见页面) 什么时候需要多个 Agent 不是越多 Agent 越好。大多数时候一个就够了。但确实有三种场景,一个 Agent 独木难支。搞清楚什么时候真的需要分工。 并行加速、角色分工、风险隔离,三种真实场景 ## 并发的代价:谁能同时跑(多 Agent) URL: https://xueai.miyang.cn/slides/9-24.html (以下为免费预览,全文见页面) 并发的代价:谁能同时跑 「看」可以并行:多个搜索同时跑不会冲突。「改」必须排队:两个 Agent 同时改同一个文件会出事。判断一个操作能否并发,关键就一条:它是只读的吗? 「看」可以并行,「改」必须排队,为什么以及怎么判断 这些操作不修改任何东西,多个同时跑互不影响。10 个 Agent 同时搜索不会冲突。 这些操作会改变外部状态。两个 Agent 同时改同一个文件 = 数据覆盖、内容丢失。 ## 脑暴:让多个 AI 吵架(多 Agent) URL: https://xueai.miyang.cn/slides/9-25.html (以下为免费预览,全文见页面) 脑暴:让多个 AI 吵架 和人类开会一样:一个人想到死不如多个人独立思考再汇总。脑暴模式就是把同一个问题扔给多个 Agent,让它们各自回答,最后由主持人整合共识与分歧。 同一问题多角度独立思考,汇总共识与分歧,这是群体智慧的 AI 版 ## 定时任务的成本陷阱(多 Agent) URL: https://xueai.miyang.cn/slides/9-26.html (以下为免费预览,全文见页面) 定时任务的成本陷阱 让 Agent 每小时整理一次新闻,听起来简单。但如果复用旧会话,上下文每次都在增长,24 小时后你的成本会爆炸。一个选择就能让月账单差 10 倍。 Agent 定时跑任务,上下文是累积还是重建?一个选择差 10 倍成本 ## AI 该有多大的自由(权限与安全) URL: https://xueai.miyang.cn/slides/9-27.html (以下为免费预览,全文见页面) AI 该有多大的自由 给 AI 全部权限?它可能搞砸一切。每步都审批?用户会疯掉。权限设计是一条光谱:从完全自主到每步审批,中间还有三种选择。 完全自主 vs 每步审批,五种权限模式和适用场景 ## 弹窗太多用户烦,不弹又不安全(权限与安全) URL: https://xueai.miyang.cn/slides/9-28.html (以下为免费预览,全文见页面) 弹窗太多用户烦,不弹又不安全 如果 Agent 每做一步都弹窗让你确认,你点 5 次「允许」之后就想卸载了。但如果什么都不问就自己执行,删错了文件谁来负责?答案是:风险分级。 Human-in-the-loop 的平衡点:风险分级思路 无分级:每步都弹窗 体验差 有分级:只弹高危 体验好 ## Agent 干了什么你知道吗(权限与安全) URL: https://xueai.miyang.cn/slides/9-29.html (以下为免费预览,全文见页面) Agent 干了什么你知道吗 Agent 在后台跑了 3 分钟:调了几个工具?花了多少 token?中间有没有出错?如果你回答不了这些问题,你的 Agent 就是个黑盒。 事件流与 Token 追踪。不看日志你永远不知道出了什么错 ## MCP 不只是「调工具」(MCP 实战) URL: https://xueai.miyang.cn/slides/9-30.html (以下为免费预览,全文见页面) MCP 不只是「调工具」 大多数人理解 MCP 就是「让 AI 调外部工具」。但 MCP 协议是双向的:Alice 不仅能调别人的工具,也能让 Cursor 等外部客户端来调用 Alice 的能力。 同一个协议两个方向:消费别人的工具 vs 把自己暴露给别人 ## 懒连接:不用别连(MCP 实战) URL: https://xueai.miyang.cn/slides/9-31.html (以下为免费预览,全文见页面) 懒连接:不用别连 你注册了 10 个 MCP 服务,启动时全部连接一遍?如果其中 3 个挂了,启动就卡住了。懒连接的思路很简单:注册 ≠ 连接,用到的时候再连。 注册了 10 个 MCP 服务,启动时全连一遍?还是用到再连? 启动时全连 懒连接 ## AI 自己加工具(MCP 实战) URL: https://xueai.miyang.cn/slides/9-32.html (以下为免费预览,全文见页面) AI 自己加工具 用户说「帮我查日历」,但你还没配日历工具。传统做法:报错说「不支持」。更好的做法:Agent 自己去配,问你一声就行。 Agent 运行时发现需要新工具,自己配置 MCP 连接,这就是自配置思路 ## 实战全景图(实战收官) URL: https://xueai.miyang.cn/slides/9-summary.html (以下为免费预览,全文见页面) 实战全景图 动手实战篇走到这里,八个主题构成了一张完整的 AI 产品实战地图。每个主题都不是孤立的,它们共同回答一个问题:从 Demo 到产品,到底差了什么? 生图、循环、记忆、Prompt、多 Agent、安全、MCP,一张图串起来 ## 聊天套壳 vs 真正的 Agent 产品(实战收官) URL: https://xueai.miyang.cn/slides/9-final.html (以下为免费预览,全文见页面) 聊天套壳 vs 真正的 Agent 产品 用户看到的只是冰山一角:一个聊天框、几次回复。水面之下,是产品经理需要做的 100 个决策。这些决策的总和,就是聊天套壳和真正的 Agent 产品之间的距离。 同一个 Loop 支撑 N 种场景,差异不在代码,在产品决策 ## 接上第一个真工具(你现在能做什么) URL: https://xueai.miyang.cn/slides/build-3.html (以下为免费预览,全文见页面) 让它从「会说」变成「会做」:接上第一个工具 M1 立住之后,你手上是一个很会说话的 AI。但 Alice 那 132 个工具的故事你也看完了。Agent 和聊天机器人的分水岭,就是第一个真正被执行的工具。这一步不需要 132 个,需要 1 个。 工具调用闭环四段演示;三档任务:选定工具、写三行描述、跑通闭环并故意搞一次破坏 「接工具」听起来是技术活,其实链路只有四段,而且模型全程没有执行任何东西,它只是开口要,真正动手的是框架。看懂这四段,你就知道出问题该查哪一段。 从模型开口到结果回喂 输出一段 JSON:调哪个工具、参数是什么 格式对不对、值合不合法,不合法就打回重来 查数据库、发请求、写文件,这一步才碰真实世界 执行结果塞回对话,模型消化后才说人话 ## 实战 · 从 Demo 到产品 · 30 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/interview-3.html (以下为免费预览,全文见页面) 实战 · 从 Demo 到产品 · 30 道灵魂拷问 动手实战篇学完了,你已经知道 Demo 和产品之间隔着什么。这 30 个问题来自三个真实场景,先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:Demo 到上线的差距 / Agent 卡死 / 上下文压缩 / 记忆设计 / 多 Agent / MCP / 成本账单 先给结论:调通 API 只是 10%。真实案例里从调通到上线花了三个月,差的东西可以按四个维度盘点。 体验层:生成进度反馈、失败一键重试、多张结果供选择、历史记录可回看。Demo 里用户干等 30 秒没人管,产品里不行。 质量层与工程层:质量靠 Prompt 优化(用 LLM 把用户的人话翻译成生图模型能懂的描述)加角色一致性锚定;工程靠多模型降级链、超时重试、成本限额、结果持久化。模型一定会挂,挂了之后的体验才是产品。 安全层:输入输出双重内容审核、版权风险、用户参考图的隐私策略。Demo 可以裸奔,产品裸奔会出事故。 先解释根因:生产环境的 Agent 卡死有四种典型模式:同参数死循环(反复用相同参数调同一工具)、收益递减(跑了 50 轮全是边缘动作)、文本复读(上下文过长后开始车轱辘话)、工具连续失败雪崩(一个工具挂了拖垮整条链路)。先定位这次是哪种。 给防护方案:防呆是三层网。硬限制兜底:迭代上限、总超时、单工具调用次数上限,无条件刹车。检测预警:同参数检测、同工具名检测、收益递减检测,发现异常模式就上报。 降级续命:检测到异常先温柔纠正,注入一条「你已经重复了 3 次,请换一种方法」的提示、暂时禁用故障工具、强制总结当前进度带着半成品返回。对用户来说,带着半成品回来比空手而归好得多。 补体验层承诺:就算 Agent 在跑长任务,用户也要看到进度感,展示当前在做什么,可以随时手动停止。用户骂的其实是「等了半小时还不知道它在干嘛」。 ## Workflow vs Agent:先搞清楚你要什么(Agent 设计模式) URL: https://xueai.miyang.cn/slides/10-1.html Workflow vs Agent:先搞清楚你要什么 一个反直觉的观点:最成功的 AI 实现,往往不是最复杂的那个。在动手搭 Agent 框架之前,先搞清楚你真正需要什么。 预定义流程 vs 模型自主决策,Anthropic 定义的两大类 Agent 系统 这句话值得每个 AI 产品经理背下来。行业里充斥着各种 Agent 框架(LangChain、AutoGen、CrewAI...),但生产环境反复验证的规律是:真正跑得好的系统,用的是最朴素的组合模式。 维度 Workflow Agent 控制权 开发者(代码路径固定) 模型(每步动态决定) 可预测性 高 -- 输入确定则输出路径确定 低 -- 同样输入可能走不同路径 适用场景 任务拆解明确、步骤固定 任务开放、需要灵活决策 成本 可控(调用次数固定) 不确定(循环次数未知) 调试难度 低(路径确定,容易复现) 高(行为不确定,难以复现) 典型例子 文案生成管道、数据清洗流水线 Cursor、Claude Code、Devin 1 先试单次 LLM 调用:优化 Prompt、加 Few-shot、调 Temperature 2 不够?加检索增强(RAG):让 LLM 能访问外部知识 3 还不够?用Workflow:把任务拆成多步,用代码控制流程 4 真的需要灵活决策?才上Agent:让模型自主规划执行 ## 五种 Workflow 模式(Agent 设计模式) URL: https://xueai.miyang.cn/slides/10-2.html 五种 Workflow 模式 业界已验证有效的五种 Workflow 编排模式。它们由简到繁,每种解决特定类型的问题。不追求最复杂的,追求最合适的。 Prompt Chaining / Routing / Parallelization / Orchestrator-Workers / Evaluator-Optimizer 模式 核心思想 典型场景 复杂度 Prompt Chaining 顺序串联,逐步处理 文案生成管道 低 Routing 分类导向,专门处理 智能客服分流 低 Parallelization 并行处理,聚合结果 多维度代码审查 中 Orchestrator-Workers 动态拆分,分布执行 跨文件代码修改 中高 Evaluator-Optimizer 生成评判,迭代改进 高质量翻译 中 ## 从 Prompt 工程到上下文工程(Agent 设计模式) URL: https://xueai.miyang.cn/slides/10-3.html (以下为免费预览,全文见页面) 从 Prompt 工程到上下文工程 当我们从单轮对话走向多步 Agent,仅仅优化 Prompt 已经远远不够。真正的挑战是:如何策展每一轮推理时送给模型的全部 Token。 在每一轮推理时策展最优的 Token 组合,写好提示词只是其中一环 Prompt 工程关注的是怎么写指令,而上下文工程关注的是一个更大的问题:模型的输入窗口里放什么、怎么放、放多少。当你的系统有 System Prompt、工具描述、历史消息、RAG 检索结果、用户偏好…这些加起来可能占满大半个上下文窗口。如何管理这些 Token,就是上下文工程。 ## 上下文的三板斧(Agent 设计模式) URL: https://xueai.miyang.cn/slides/10-4.html (以下为免费预览,全文见页面) 上下文的三板斧 当任务跨越多个上下文窗口,每个新窗口都会失忆。生产环境中已验证三种策略来应对这个根本挑战,让 Agent 能在长任务中保持连贯和高效。 Compaction、结构化笔记、子 Agent 架构,长任务的三种上下文管理策略 关键决策:选择什么保留、什么丢弃。这是一个信息论问题:并非所有 Token 都等价,有些信息丢了就无法恢复。 低风险操作:清理旧的 tool call 结果(比如文件列表、搜索输出),这些通常不影响后续推理。 高风险操作:丢弃架构决策的推理过程、未解决的 bug 描述,这些如果丢了,Agent 会重蹈覆辙。 Claude Code 的实践:保留架构决策和未解决的 bug 信息,丢弃冗余的文件内容输出和已完成任务的中间步骤。 ## ACI:Agent-Computer Interface(工具设计的艺术) URL: https://xueai.miyang.cn/slides/10-5.html (以下为免费预览,全文见页面) ACI:Agent-Computer Interface HCI (人-机交互) 领域已经研究了几十年,但 Agent 和计算机之间的交互(ACI)才刚刚开始。实战经验表明:工具设计的质量,直接决定了 Agent 的能力上限。 工具是 Agent 和世界之间的契约。像设计人机界面一样设计 Agent 界面 传统软件开发中,我们花大量精力设计用户界面(HCI):按钮放在哪里、文案怎么写、交互怎么反馈。但当 Agent 成为系统的用户时,界面变成了工具定义。工具的名字、参数、描述,就是 Agent 的用户界面。 HCI 人 → 系统 ACI Agent → 系统 ## Milvus 作为 Agent 知识库工具(工具设计的艺术) URL: https://xueai.miyang.cn/slides/vector-db-5.html (以下为免费预览,全文见页面) Milvus 作为 Agent 知识库工具 让 Agent 自己判断何时需要企业资料;工具负责检索,Agent 负责基于 ToolMessage 组织答案。 把向量检索封成 search_knowledge:ToolMessage、记忆分层与调用/不调用的测试 Agent 决策 问题涉及内部知识,选择 search_knowledge。 Embed + Top-K 工具编码 query,带 ACL filter 搜 Milvus。 ToolMessage 返回片段、来源与分数,不直接编答案。 Agent 回答 引用证据;不足时说明无法确认。 ## Think Tool:让 AI 先想后做(工具设计的艺术) URL: https://xueai.miyang.cn/slides/10-6.html (以下为免费预览,全文见页面) Think Tool:让 AI 先想后做 Agent 在执行长工具链时,经常忘记前面的信息,或者在需要权衡多条规则时犯错。实践证明,给 Agent 一个停下来想一想的工具,就能大幅提升准确率。 在复杂工具链中给 Agent 一个暂停思考的空间,τ-bench 性能提升 54% 信息在工具链中丢失 Agent 调用了 5 个工具后,早期工具返回的关键信息被后续的大量上下文淹没,模型不再关注它。 策略密集型决策 客服场景有 20 条退款政策、6 种例外情况。Agent 需要同时考虑多条规则才能做出正确判断,但它常常只看到了最近的几条。 串行依赖决策 每一步都基于前一步的结果。Agent 在第 3 步做决策时,需要回忆第 1 步的上下文,但那已经在 2000 个 Token 之前了。 Extended Thinking Think Tool Think Tool 的实现简单到令人惊讶:它就是一个只接受一段文字、什么都不做的工具。 ## 用 Agent 优化 Agent 的工具(工具设计的艺术) URL: https://xueai.miyang.cn/slides/10-7.html (以下为免费预览,全文见页面) 用 Agent 优化 Agent 的工具 工具写得好不好,Agent 最有发言权。业界验证了一套「用 Agent 写工具 → 跑评测 → 自动优化」的工作流,让工具设计从手工打磨变成系统化迭代。 Claude Code 实践:用 AI 写工具描述、跑评测、自动迭代优化 Prototype Evaluate Optimize 选对工具:少即是多 命名空间:分组管理 返回有意义的上下文 Token 效率:精简返回 Prompt 工程化工具描述 ## 为什么评测比训练更重要(Agent 评测) URL: https://xueai.miyang.cn/slides/10-8.html (以下为免费预览,全文见页面) 为什么评测比训练更重要 没有评测的 Agent 开发就像蒙眼开飞机。评测是贯穿整个开发周期的核心基础设施,远不止上线前的 checklist。 没有评测,修一个 bug 制造三个。Anthropic 的 Eval 方法论 ## 三种 Grader:代码、模型、人工(Agent 评测) URL: https://xueai.miyang.cn/slides/10-9.html (以下为免费预览,全文见页面) 三种 Grader:代码、模型、人工 Grader 是评测系统的裁判。选错了 Grader,评测结果就不可信。生产环境的经验表明,三种 Grader 组合使用,各取所长。没有银弹,但有最优组合。 静态断言 vs LLM-as-Judge vs 人工校准,每种适合什么场景 代码 Grader 维度 详情 方法 字符串匹配、正则表达式、静态分析(AST)、单元测试 pass/fail、工具调用验证(是否调用了正确的 API 和参数) 优点 速度快(毫秒级)、成本几乎为零、结果完全客观可复现、适合 CI/CD 自动化 缺点 对合理变体过于严格(比如变量名不同就判错)、缺乏语义理解、无法评判主观质量 适用场景 有明确正确答案的任务:代码编译是否通过、API 返回值是否正确、文件格式是否合规、数学计算是否准确 模型 Grader(LLM-as-Judge) 维度 详情 方法 将 Agent 的输出和评分 Rubric 一起交给一个评委 LLM,让它按预设标准给出分数和理由 优点 能评判主观质量(文笔、逻辑性、创造力)、能理解意图而超越字面匹配、灵活适应不同任务类型 缺点 成本较高(每次评判都消耗 token)、可能存在评分偏见、需要精心设计评分标准、结果不完全可复现 适用场景 开放式任务:研究报告的质量评判、代码风格评估、对话的自然度、摘要的完整性和准确性 ## 评测的坑:噪音、作弊与退化(Agent 评测) URL: https://xueai.miyang.cn/slides/10-10.html (以下为免费预览,全文见页面) 评测的坑:噪音、作弊与退化 评测做起来了不等于做对了。生产环境中反复验证的三个隐蔽陷阱:基础设施噪音会扭曲结果,模型会识别考试,一个小改动可能让性能暴跌。 基础设施噪音可造成 6pp 误差、模型会识别考试、改 Prompt 可能让 Eval 掉 3% 基础设施噪音 这意味着什么?如果你的评测环境和生产环境不一致,你在评测里看到的 95 分可能到了线上只有 89 分。你以为模型 A 比模型 B 好,但其实只是模型 A 在你的沙箱配置下跑得更顺。 模型识别考试(Eval Awareness) 模型越强,识别评测的能力越高,传统的固定 benchmark 对前沿模型的区分力在衰减 如果你的评测用公开的 benchmark 题目,成绩可能被严重高估 启示:随着模型变强,评测方式需要进化:用动态生成的测试用例、限制联网、或者用真实业务场景替代公开 benchmark 改 Prompt 导致评测退化 ## 为什么 Agent 跑不了长任务(长运行 Agent) URL: https://xueai.miyang.cn/slides/10-11.html (以下为免费预览,全文见页面) 为什么 Agent 跑不了长任务 让 Agent 构建一个完整 Web 应用看似简单,但现实中充满了交接失败和上下文断裂的陷阱。 一口气做太多、做完就收工,两种典型失败模式 这不是一个小任务。一个完整的聊天应用需要认证系统、对话管理、流式输出、文件上传、Markdown 渲染、多轮历史…加起来可能有 200+ 个独立功能点。让 Agent 从零到一完成这样的项目,会遇到什么问题? Agent 试图在一次会话中完成所有功能,结果: 上下文窗口在实现到一半时被用完 下一个 Agent 接手时,面对半成品代码,只能猜测前任做了什么 大量时间浪费在让基本功能重新跑起来,新功能反而没时间做 即使有 Compaction(上下文压缩)也不够,压缩后的指令不够清晰,新 Agent 依然迷路 ## Initializer + Coding Agent(长运行 Agent) URL: https://xueai.miyang.cn/slides/10-12.html (以下为免费预览,全文见页面) Initializer + Coding Agent 核心思路:把一个 Agent 拆成两个角色,一个负责规划,一个负责执行。每次交接都留下干净的状态。 初始化 Agent 搭环境、编码 Agent 增量推进,双角色 Harness 设计 创建 init.sh 脚本搭建开发环境 写 claude-progress.txt 进度文件 把用户的高级提示展开成详细的功能清单(JSON 格式) 做第一次 git commit,确保仓库状态干净 读 progress 文件,了解当前状态 一次只做一个功能 完成后更新 progress 文件 git commit 并写清楚做了什么 一种验证有效的做法是用 JSON 格式来记录功能清单,Markdown 不适合这个用途。原因是:模型更不容易错误修改结构化的 JSON,而 Markdown 容易被模型顺手重写。 ## Managed Agent:脑手分离(长运行 Agent) URL: https://xueai.miyang.cn/slides/10-13.html (以下为免费预览,全文见页面) Managed Agent:脑手分离 核心洞察:把 Agent 的思考和执行拆成独立组件,让系统在任何部分出错时都能优雅恢复。 把思考和执行拆到不同进程,像操作系统一样虚拟化 Agent ## Session ≠ Context Window(长运行 Agent) URL: https://xueai.miyang.cn/slides/10-14.html (以下为免费预览,全文见页面) Session 不等于 Context Window 两个最容易混淆的概念:Claude 当前能看到的,和所有发生过的事。它们必须分离。 会话日志是持久的事件流、上下文窗口是临时的工作记忆,两者必须分离 1 Compaction(压缩)和 Trimming(裁剪)都是不可逆操作,一旦压缩,原始细节就丢了 2 压缩时很难知道未来哪些 Token 重要,今天看似无关的信息,可能是明天关键决策的依据 3 如果压缩后原始信息丢了,就永远回不来了,这是信息论的基本约束 所以正确的做法是:原始事件永久保存在 Session 里,Context Window 只是从 Session 中临时取景的一个视角。丢了 Context 没关系,因为 Session 还在,随时可以重建。 ## 三类风险:滥用、失控、外部攻击(安全与容器化) URL: https://xueai.miyang.cn/slides/10-15.html (以下为免费预览,全文见页面) 三类风险:滥用、失控、外部攻击 安全不是加一层提示词就够的,需要从架构层面进行结构性设计。这里介绍一套系统化的安全分类框架。 Anthropic 的安全分类框架:用户滥用 / 模型 Misbehavior / Prompt Injection 每种 AI 产品面对的威胁模型不同,但所有风险都可以归入三个类别。理解这三类风险是设计安全架构的第一步。 利用 Agent 生成钓鱼邮件 诱导 Agent 执行恶意代码 利用 Agent 获取未授权的数据 通过越狱攻击绕过安全限制 过度行动:用户只让查看文件,模型却自作主张修改了 幻觉驱动操作:基于虚构信息执行了真实操作 权限越界:模型尝试访问不属于当前任务的资源 停不下来:Agent 进入无限循环 Prompt Injection:网页/文档中嵌入攻击指令 供应链攻击:恶意 MCP 服务器返回篡改数据 数据投毒:训练数据中植入后门 间接注入:通过 Agent 读取的邮件/文件注入指令 ## 沙箱与凭证隔离(安全与容器化) URL: https://xueai.miyang.cn/slides/10-16.html (以下为免费预览,全文见页面) 沙箱与凭证隔离 Agent 生成的代码和用户的密钥永远不能在同一个地方。这是安全架构的硬性要求,不只是最佳实践的建议。 生成的代码和密钥永远不在同一个容器里。结构性安全比靠提示词更可靠 传统架构:一个容器装所有东西 ## Contextual Retrieval:更好的 RAG(进阶收官) URL: https://xueai.miyang.cn/slides/10-17.html (以下为免费预览,全文见页面) Contextual Retrieval:更好的 RAG RAG 的核心假设是「检索到正确的 Chunk 就能给出正确的答案」。但实践中发现了一个根本性问题:切 Chunk 的过程本身就会丢失关键信息。Contextual Retrieval 正是为了解决这个问题。 在检索前先给 Chunk 加上下文,Anthropic 的 RAG 升级方案 传统 RAG 的工作流程是:把文档切成小块(Chunk),对每个 Chunk 做向量化,用户提问时检索最相似的 Chunk,然后把 Chunk 喂给 LLM 生成答案。这个流程有一个致命缺陷: Chunk 脱离上下文后变得模糊不清 ## 进阶全景图(进阶收官) URL: https://xueai.miyang.cn/slides/10-summary.html (以下为免费预览,全文见页面) 进阶全景图 从 Workflow 到 Agent,从 Prompt Engineering 到 Context Engineering,这一篇章覆盖了核心工程实践。让我们把所有主题串起来,形成完整的知识地图。 设计模式、工具、评测、长运行、安全,一张图串起来 七大主题,一个完整的 Agent 知识体系 ## 做最简单的、能跑的东西(进阶收官) URL: https://xueai.miyang.cn/slides/10-final.html (以下为免费预览,全文见页面) 做最简单的、能跑的东西 所有复杂的架构设计、精巧的工程模式,最终都指向同一个朴素的真理。 Anthropic 的核心工程哲学:"Do the simplest thing that works" ## 搭你的第一个评测集(你现在能做什么) URL: https://xueai.miyang.cn/slides/build-4.html (以下为免费预览,全文见页面) 别再「感觉变好了」:搭你的第一个评测集 前三格你都是靠眼睛验收的,量小还行。但你马上会遇到那个经典困境:改了一版提示词,这三个用例变好了,那两个悄悄变差了,你没发现。Anthropic 说「不评测就是在裸奔」。这一格给你的 Agent 穿上衣服。 改动前后跑分对比演示;三档任务:攒十条真实用例、写通过标准跑基线、用分数说话 评测集不神秘,就是一堆固定的输入,各配一条「什么算过」的标准。神奇的地方在于跑分那一刻:你以为的全面提升,往往是三条升两条降。没有评测集,那两条降的你永远看不见。 改提示词前后,跑同一套用例 ## AI 工程设计模式 · 30 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/interview-4.html (以下为免费预览,全文见页面) AI 工程设计模式 · 30 道灵魂拷问 工程进阶篇讲的全是生产级 Agent 的工程判断,这类问题在面试和评审会上出现得越来越频繁。先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:上下文工程 / 长任务 / grep vs RAG / ACI 工具设计 / 评测基建 / LLM-as-Judge / 沙箱隔离 先给定义:Prompt 工程优化指令的写法。上下文工程管理每一轮推理时送给模型的全部 Token:System Prompt、工具定义、对话历史、检索结果、用户状态,全都算。 说清动机:上下文是稀缺资源。三个硬约束:Context Rot(越长检索准确率越低)、注意力预算有限(无关 Token 稀释有用信息)、n 平方复杂度(上下文翻倍,注意力计算量变四倍)。 给目标:找到最小的高信号 Token 集合。每个 Token 都要为推理做贡献,能塞多少塞多少的思路行不通。 落三个抓手:System Prompt 找合适高度(角色加原则,别堆 50 条规则)、工具集精简、Few-shot 精选 2~3 个典型例子,别拿边界 case 刷存在感。 先摆两难:开新窗口,Agent 失忆,会重复已做过的工作;留在旧窗口,Token 越堆越多,注意力被稀释,表现持续下降。Claude Code、Cursor、Devin 每天都在解这个题。 板斧一 Compaction:窗口快满时用一次 LLM 调用做结构化摘要。保留架构决策和未解决的 bug,丢掉冗余的工具输出和已完成任务的中间步骤,选错了 Agent 会重蹈覆辙。 板斧二结构化笔记:把关键信息主动写到外部文件,新窗口读回来恢复记忆。Claude Code 的 TODO 文件、Claude 打宝可梦时维护的游戏笔记,都是这个套路。 板斧三子 Agent:深度探索委派出去。子 Agent 在自己的窗口里烧 3 万 Token 读代码做推理,只向主 Agent 回传 1500 Token 的结论,主上下文始终干净。 ## 从脚手架到自我改进系统(Harness 概论) URL: https://xueai.miyang.cn/slides/11-1.html 从脚手架到自我改进系统 Harness 不只是包裹模型的外壳。它正在成为 AI 递归自我改进的核心引擎。 递归自我改进(RSI)的历史与近期路径:模型改进 Harness,不直接改写权重 一个系统,能用自己当前的智能去改善产生智能的机制本身 ## Harness 三大设计模式(Harness 概论) URL: https://xueai.miyang.cn/slides/11-2.html Harness 的三大设计模式 好的 Harness 有清晰的模式语言,绝非一堆脚本拼起来。三个核心模式,覆盖了当前最强 Agent 系统 90% 的架构决策。 工作流自动化 / 文件系统持久记忆 / 子 Agent 与后台任务,构建 Agent 运行时的三个基石 从循环到记忆,从单体到多体:Harness 的三大基础设施模式 Plan → Execute → Observe/Test → Improve → Execute again:每一轮生成都是下一轮优化的起点。 分析自身轨迹:优秀的 Agent 会回头看自己前几轮做了什么、哪里失败了、为什么失败,然后调整策略,避免重复同一个 Prompt。 强调运行时迭代:改进发生在 Agent 执行过程中,不依赖人类事先写好的静态模板。Agent 在每次执行中学习、适应、优化。 失败是信号,不是终止:测试不通过、命令报错、输出不符合预期,这些都是 Agent 自我纠正的触发条件。 制品种类繁多:实验日志、代码 diff、论文摘要、错误追踪记录、过去的完整执行轨迹,这些都是有价值的状态,但塞不进上下文。 Harness 的正确做法:把持久状态存在文件系统中,让 Agent 学会按需读写。不要试图把全部工作历史压入 Prompt。 文件读写是 LLM 基础技能:读写文件系统不需要复杂的外部工具链,它受益于核心模型能力的提升。模型越聪明,文件管理越高效。 结构化存储:好的 Agent 会自己维护 scratchpad、todo 列表、实验记录,像人类程序员一样管理工作区。 父 Agent 作为进程管理器:启动子任务、检查日志和进度、取消失败的分支、合并成功的结果。这是操作系统层面的思维。 并行性必须显式且可检查:不能「发射后不管」。父 Agent 需要能查看每个子 Agent 的状态、输出和错误。 子 Agent 输出持久化:每个子 Agent 的结果存为文件、日志或状态记录(而不仅是返回到父 Agent 的上下文中),这样即使中断也能恢复。 容错与恢复:后台任务可能超时、崩溃或产出低质量结果。Harness 需要设计重试策略和优雅降级机制。 工具分组 核心能力 典型工具 File System 读、写、搜索、编辑文件;管理工作区状态 Read, Write, Edit, Glob, Grep, StrReplace Shell Execution 执行终端命令、运行测试、安装依赖 Shell, BashExec, RunCommand I/O 与用户交互、确认操作、展示结果 Ask, UserConfirm, ShowResult External Context 获取外部信息、文档、API 响应 WebFetch, ReadURL, DocSearch Web Search 搜索互联网获取最新信息 WebSearch, BingSearch Artifacts 生成、管理和版本化制品 CreateFile, SaveArtifact, VersionControl Backend Processes 后台运行长任务、监控进程状态 BackgroundShell, AwaitProcess, Monitor Agent Delegation 生成子 Agent、分配并行任务、合并结果 Task, Subagent, Fork, ParallelRun ## 上下文工程:从手写到自动进化(Harness 优化) URL: https://xueai.miyang.cn/slides/11-3.html (以下为免费预览,全文见页面) 上下文工程:从手写 Prompt 到自动进化 随着 Agent 任务变长,上下文管理不再是可选项。它正在成为 Harness 优化的核心战场。 ACE → MCE → Meta-Harness:优化对象从 prompt 内容演进到管理机制代码 ## 工作流设计:从手工到自动搜索(Harness 优化) URL: https://xueai.miyang.cn/slides/11-4.html (以下为免费预览,全文见页面) 工作流设计:从手工到自动搜索 工作流的设计空间巨大。我们应该用算法去搜索,只靠手动设计远远不够。 AI Scientist / ADAS / AFlow,用 MCTS 和 Meta-Agent 搜索最优工作流 当工作流本身成为搜索空间,设计就从艺术变成了工程 提出研究想法 → 写代码 → 跑实验 → 分析结果 → 写论文 → 同行评审 ## 让 Harness 改进自己(自我改进与进化) URL: https://xueai.miyang.cn/slides/11-5.html (以下为免费预览,全文见页面) 让 Harness 改进自己 如果 LLM 能优化执行 Agent 的代码,它就能访问比手写 Prompt 大得多的设计空间。 STOP 递归改善器 + Self-Harness 的 propose-evaluate-accept 循环 改善后的改善器自动发现了遗传算法、分解改进、多臂 Prompt Bandit、模拟退火、Beam Search 等经典优化策略,无需人类预设。 GPT-4 能持续改善,但 GPT-3.5 和 Mixtral 反而退化。递归结构本身不够:基座模型必须足够强,才能支撑元级优化。 ## 进化搜索:让最强 Harness 存活(自我改进与进化) URL: https://xueai.miyang.cn/slides/11-6.html (以下为免费预览,全文见页面) 进化搜索:让最强 Harness 存活 进化算法 + 编码 Agent = 在庞大的 Harness 设计空间中自动发现最优解。 AlphaEvolve / DGM / SIA,用进化算法在庞大设计空间中发现最优 Agent 搜索空间太大、梯度不可用,进化是唯一务实的答案 Novikov et al. "AlphaEvolve: A coding agent for scientific and algorithmic discovery." 2025. ## 未来挑战:自我改进的七道关(未来与反思) URL: https://xueai.miyang.cn/slides/11-7.html (以下为免费预览,全文见页面) 未来挑战:自我改进的七道关 研究者取得了真正的进展,但通往完整递归自我改进的路上,还有若干瓶颈。 弱评估器 / 记忆退化 / 奖励黑客 / 多样性坍缩 / 人类角色,通往完整 RSI 的瓶颈 自动研究:能写论文 ≠ 能做科学 六种反复出现的失败模式 Trehan & Chopra (2026) 系统测试了 LLM 从想法到论文的全流程能力,发现了六种反复出现的失败模式。这些是当前自动研究的结构性瓶颈,绝非偶发 Bug。 ## 立三条长跑规矩(你现在能做什么) URL: https://xueai.miyang.cn/slides/build-5.html (以下为免费预览,全文见页面) 它跑十轮很聪明,跑五十轮呢? 这一章讲的是让 Harness 自己进化,听着离你很远。但所有自我改进的前提,是先有一个能长跑的 Harness:知道什么时候压缩、什么东西永不能丢、什么结论要落盘。这三条规矩,你今天就能给自己的 Agent 立起来。 上下文占用曲线与压缩阈值演示;三档任务:找到失忆轮次、写三条规矩、跑通落盘再读回 用户说「它聊着聊着变笨了」,背后是一条很具体的曲线:上下文占用一轮一轮往上爬,爬满之后系统只能悄悄扔东西。扔的往往是最早的消息,也就是你一开始交代的那些最重要的规矩。 连续对话 20 轮,上下文占用怎么走 ## Harness 与自我改进 · 30 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/interview-5.html (以下为免费预览,全文见页面) Harness 与自我改进 · 30 道灵魂拷问 这一章讲的是最前沿的东西,考它的人也最容易分出真假。这 30 个问题来自三个真实场景,先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:Harness 本质 / 设计模式 / 上下文自动进化 / 奖励黑客 / RSI 进展与风险 先给定义:Harness 是围绕基座模型的运行时系统,决定模型如何思考与规划、调用工具与行动、感知与管理上下文、存储制品、评估结果。模型负责智能,Harness 负责让智能落地干活。 给证据:Claude Code、Codex、Cursor 这些成功产品已经证明,Harness 层与原始模型智能同等重要。一个平庸的模型加上优秀的 Harness,往往胜过裸露的更强模型。 说清 PM 视角的含义:换模型很容易,Harness 才是产品真正的护城河。同一个模型,Harness 设计得好坏,用户体验差几个量级。 拔高一层:Harness 正在从工程配角变成优化目标本身。前沿研究让模型改进围绕自己的 Harness,这是递归自我改进的现实路径。 报出三大模式:工作流自动化、文件系统做持久记忆、子 Agent 与后台任务。它们覆盖了当前最强 Agent 系统 90% 的架构决策,是结构性需求,没有可选余地。 模式一讲循环:Agent 是目标导向的循环,Plan → Execute → Observe → Improve → 再执行。失败是自我纠正的触发信号:测试不通过、命令报错,Agent 回头分析轨迹再调整。 模式二讲记忆:长任务的制品会迅速超出上下文窗口。正确做法是把持久状态存进文件系统,让 Agent 按需读写。一句话原则:上下文是工作记忆,文件系统是长期记忆。 模式三讲并行:父 Agent 当进程管理器,启动子 Agent、查进度、取消失败分支、合并结果。子 Agent 输出必须持久化成文件,中断也能恢复。 ## 为什么要给 AI 立规矩(理念与入门) URL: https://xueai.miyang.cn/slides/vibe-1.html 为什么要给 AI 立规矩 Vibe Coding 指靠自然语言让 AI 直接产出代码的开发方式。它的问题出在质量:没有规矩的 AI 会返工、漏改、悄悄删代码、留下永久技术债。这一节先看事故长什么样,再看约束怎么注入才最稳。 Vibe Coding 的四类典型事故,以及 Rule 是最稳上下文注入方式的原理 下面四类事故在 AI 协作中反复出现,根源是同一件事:约束没有进入上下文。 理解偏差返工 AI 拿到需求就开始写,写了 200 行才发现理解有偏差,回滚重来。更糟的情况是改了 7 个文件之后才发现思路错了,逐个 revert 成本极高。 选型漂移 不同对话里 AI 会选不同框架:今天 Express,明天 Fastify。数据库一会儿 MongoDB 一会儿 PostgreSQL。技术栈没有锁定,项目就在漂移中失去一致性。 善意破坏 AI 重构时会清理它认为多余的代码,事后才发现那段代码有用。善意的清理变成了破坏性操作。 永久技术债 要一个完整认证系统,AI 说先做简版登录、后续再加 OAuth。结果后续永远不会来,简版代码成了永久的技术债。 同一句「帮我做个登录」,在无规矩和有规矩两种模式下会走向完全不同的结局。点击「下一步」,两条时间线同步推进。 给 AI 传达约束有三种常见方式。点击切换,看同一条约束(「数据库用 PostgreSQL」)在三个时点是否还生效。 对话里临时交代 「用 PostgreSQL」「记得加日志」 写在 .env 或文档里 让 AI 自己去读配置文件 写进 Cursor Rule 每轮对话开始前自动加载 frontmatter 控制生效方式 --- alwaysApply: true # 所有对话自动生效 --- # 开发约束与配置规范 以下是用户重要的约束,请务必严格遵循。 true 用于全局编码规范;false 用于写作规范这类按需引用的文件,避免污染编码对话的上下文。 xs_vibe_rules 的三个文件 rule-opensource.mdc:主开发规范,14 个章节覆盖全流程 writing-style.mdc:中文写作风格,按需手动引用 secrets.mdc:API Key 与凭据模板,占位符形式 使用时放入项目的 .cursor/rules/ 目录即可。 itshen/xs_vibe_rules · 本专题的开源仓库 整套规则原文全部开源(MIT License)。Fork 一份,放进你项目的 .cursor/rules/ 目录,再按自己的技术栈删改,就是你的第一版 AI 协作规范。 规则的价值不在于多,每条都解决一个真实问题。AI 每反复犯一次错,就把它变成一条规则,这是整个专题的底层方法。约束靠不靠得住,看的是注入机制:写十遍「务必」,都比不过一个每轮自动加载的 Rule 文件。 素材来源:本专题基于作者开源仓库 itshen/xs_vibe_rules,内容为多个真实项目沉淀出的 Cursor Rules 与设计思考。 ## 四步流程:复述、PRD、确认、编码(流程控制) URL: https://xueai.miyang.cn/slides/vibe-2.html 四步流程:复述、PRD、确认、编码 把软件工程的需求确认环节搬进人机协作:AI 动手之前必须复述需求、写出 PRD、拿到明确许可。再加上批量修改断点和查重规则,把爆炸半径控制在动手之前。 把需求确认环节搬进人机协作,批量修改先列计划,新功能先查重 一个真实需求「帮我加一个导出报表功能」,走一遍完整流程。点击「推进一步」,注意第 4 步:你不点「批准」,AI 就不会写代码。 「请先确认理解后再编码」这句话太模糊。AI 会自己判断「我已经理解了」,然后直接动手。写明「写 PRD、等待许可」这类具体动作,AI 才会真的停下来。实际使用中,简单的一行改动 AI 会自己判断不需要 PRD,这套流程主要拦截多文件变更和新功能开发,也就是返工成本最高的那类任务。 规则原文:「修改超过 3 个文件时,必须先列出修改计划并等待用户确认后再动手。」拖动滑块,改变本次要动的文件数,看断点什么时候触发。 要改哪些文件 完整的文件清单。人先看范围对不对,再看内容。清单本身就能暴露「怎么这个需求要动配置文件」这类异常。 每个文件改什么 逐文件写清楚改动内容。避免 AI 借着一次需求「顺手」做无关的重构和清理。 改动之间的依赖关系 先改哪个、后改哪个、谁依赖谁。防止连续改一串文件后发现思路有误,回滚成本过高。 阈值可以按项目调整:3 个文件是作者项目里的经验值,谨慎的项目可以调成 1,快速原型可以放宽到 5。 问题:AI 不知道项目里已经有轮子 AI 的上下文只有当前对话,它看不到三个月前另一个对话里写的工具函数。不加约束,同一个 formatDate 会被写四遍,每遍行为还略有不同。 规则:先搜索,再动手 新增功能前,必须先搜索项目中是否已有类似实现 搜索范围:相关目录的函数名、类名、工具方法 找到已有实现时,优先复用或扩展 断点要设在动手之前。复述和 PRD 拦截理解偏差,修改计划拦截连锁错改,查重拦截重复造轮子,三道关卡都比事后回滚便宜。 素材来源:对应 rule-opensource.mdc 第二章「需求处理与开发流程」,仓库 itshen/xs_vibe_rules。 ## PlayGround:组件的试衣间(流程控制) URL: https://xueai.miyang.cn/slides/vibe-3.html (以下为免费预览,全文见页面) PlayGround:组件的试衣间 UI 功能直接写进页面,改一处影响一片,调一个按钮要把整个页面跑起来。解法是先做独立的组件 PlayGround:每个 UI 元素有单独的 demo,调好了再集成进正式页面。 简化版 Storybook 思路:先做独立 demo 调好再集成,demo 只增不删 下面就是一个最小的 PlayGround:左边是组件的实时预览,右边是参数控制。随便调,这里怎么改都不会影响页面上任何其他东西,这就是「隔离调试」。 在 PlayGround 里调 刚才的每一次调整,影响范围只有这一个 demo。样式和业务逻辑互不干扰,调好的参数直接抄进正式组件,集成时它已经是成品。 直接写进页面会怎样 同样是调这个按钮:先把整个页面跑起来,登录、拉数据、切到目标状态,才能看到它一眼。样式和业务逻辑纠缠在一起,圆角改大了可能挤歪旁边的布局,牵一发动全身。 思路一致,成本不同。Storybook 是行业标准方案,但配置太重,对 AI 辅助的快速原型项目属于 overkill。PlayGround 取其思路:用一个静态页面把所有组件 demo 排在一起,改组件不影响业务逻辑,调业务逻辑不搞乱组件样式,成本几乎为零。 ## 样式收敛:一个按钮不要八套 CSS(质量底线) URL: https://xueai.miyang.cn/slides/vibe-3b.html (以下为免费预览,全文见页面) 样式收敛:一个按钮不要八套 CSS 让 AI 连着做十个功能,你会攒出八个长得差不多的按钮类。它不是不会复用,是每轮对话都不知道你已经有什么。这一节讲样式为什么会增殖、怎么收干净,以及哪些差异该留着。 样式为什么会增殖、怎么分批收进 token,以及哪些差异该留着 下面模拟一个真实项目的迭代。每点一次「再加个功能」,就是你开一轮新对话让 AI 做一个页面。注意看它每次是怎么处理按钮的,以及底下四个数字怎么涨。 项目还是空的。点下面的按钮开始迭代。 八轮之后再看这堆按钮,你分不清该改哪个——这就是「散装」的手感。 重复造样式不是模型偷懒,是三个结构性原因叠出来的。看懂原因,才知道该在哪儿设闸。 你的 CSS 不在它眼前 新开一轮对话,上下文里只有你这次给的几个文件。项目里已经有 .btn-primary 这件事,它无从得知,于是按需求现写一个。 新写比读懂旧的便宜 读懂一套现有样式要把相关文件全看一遍,还得担心改了影响别处。新起一个类名零风险、零阅读成本,这是它的最优解,不是你的。 怕改坏,于是并列一份 需要一个带阴影的按钮时,它宁可写 .btn-primary-new 也不改原来那个——改动别人在用的样式属于高风险操作,它选择了安全但会增殖的做法。 三个原因都指向同一件事:它缺一份「我们已经有什么」的清单。把这份清单写进项目规则文件,它每轮都能看见,增殖才会停。这也是第 8 节把环境事实写进 Rule 的同一个道理,只不过这次写进去的是样式资产。 ## 注释三要素与代码保护(质量底线) URL: https://xueai.miyang.cn/slides/vibe-4.html (以下为免费预览,全文见页面) 注释三要素与代码保护 AI 写的注释多是功能复述,三个月后回来看代码,想不起当初为什么这样实现。这一节给注释立结构,也给「删代码」立规矩。页面里有两个可动手的演示。 背景、设计意图、关键约束缺一不可;禁止静默删除代码与依赖 代码只能表达「做了什么」。为什么存在、为什么这样实现、调用时要注意什么,这些信息只有写进注释才能跨时间留存。「写好注释」四个字 AI 执行不了,必须给出固定结构和示例。 背景 这个函数为了解决什么业务问题、在什么场景下被调用。没有背景,读代码的人只能看到实现,看不到它为什么存在。 设计意图 为什么这样实现,选择这种方案的理由,以及放弃了哪些备选方案。git log 里找不到这些,注释是唯一载体。 关键约束 调用方须知:副作用、依赖关系、边界条件等非显而易见的注意点。少了这条,下一个调用者就会踩坑。 点击切换同一个 merge_chat_history 函数的两种注释写法,对比它们留下的信息量。 功能复述注释 AI 的默认写法,复述函数名 三要素注释 背景 + 设计意图 + 关键约束 ## 调试铁律:先 Log 再改码(质量底线) URL: https://xueai.miyang.cn/slides/vibe-5.html (以下为免费预览,全文见页面) 调试铁律:先 Log 再改码 AI 遇到报错的第一反应是猜一个原因改改看,不行再猜一个。这一节立最核心的一条规矩:禁止猜测性修复。下面两个演示,亲手对比两条修 Bug 路径。 禁止猜测性修复,修复前回答三个问题,改完声明影响范围 禁止猜测性修复。无法确认根因时,必须先通过 Log、断点或测试脚本验证假设,禁止「试着改一下看看」。后端在终端打详细日志,前端在浏览器 Console 打日志,无论什么问题,第一步都是加 Log。 点击一条路径,观察修复过程。右侧计数器记录轮数和累计改动行数。 猜测性修复 猜一个原因,改改看 先 Log 再改 加日志、看证据、定位根因 猜测性修复 · 战绩 先 Log 再改 · 战绩 ## 不接受分期交付(质量底线) URL: https://xueai.miyang.cn/slides/vibe-6.html (以下为免费预览,全文见页面) 不接受分期交付 你要一个完整的认证系统,AI 说「先做一个简版的用户名密码登录,后续再加 OAuth」。后续永远不会来。这一节用两个演示,看清「先做简版」的完整生命周期,并练习正确的回应方式。 AI 爱做「先上简版」的真实原因,以及为什么要打破这个模式 实践中 AI 说「先做简版」往往与复杂度无关,它想快速给你一个能跑的东西来换取正反馈。「先用临时方案」「暂时 Mock」「简单处理一下」背后是同一个模式。打破这个模式后,AI 反而会更认真地分析完整方案。 点击播放,看「先做简版」的登录模块在 90 天里怎么变成永久技术债。上方两个数字会随时间线一起变化。 简版上线 用户名密码登录能跑了,AI 承诺「OAuth 后续再加」,你也觉得挺合理。 后续没有来 新需求源源不断,没人回头补 OAuth。会话、权限、支付、通知 4 个模块开始直接依赖简版接口。 成为永久技术债 想补全时发现依赖已经长死,9 个模块与简版耦合,重构成本高过重写。简版成了永久版。 ## 三份文档与方法论沉淀(文档与沉淀) URL: https://xueai.miyang.cn/slides/vibe-7.html (以下为免费预览,全文见页面) 三份文档与方法论沉淀 做了 30 个功能,三个月后想查「这个功能什么时候加的、当初为什么这样设计、中间改过几次方案」,翻遍 git log 也找不到。解法是让 AI 按严格模板维护三份文档,再加一份自动沉淀的方法论手册。本页两个演示都可以动手操作。 FEATURES / CHANGELOG / RELEASE_NOTES 各管一个维度,METHODOLOGY 沉淀产品品味 核心分工:FEATURES 回答「这个功能怎么来的」,CHANGELOG 回答「这次改了什么」,RELEASE_NOTES 回答「用户得到了什么」,METHODOLOGY 回答「我们是怎么想的」。四个问题各有归处,决策才能跨越对话存活。 功能的完整生命周期 功能点的唯一事实来源。状态流转 🟡 规划中 → 🔵 开发中 → 🟢 已完成 / ⚪ 已取消,每个功能带「历史沿革」,记录初始需求、方案变更及原因、最终实现。取消的功能也不删,标 ⚪ 并注明原因。 每次改动的技术细节 按时间倒序,每条用表格记录问题/需求、根因/方案、改动范围、影响面、状态,类型标签 BUG / FEAT / REFACTOR / PERF / DOCS。写之前必须读系统时间,禁止凭记忆填时间戳,禁止积压补写。 用户能感知的变化 面向真实用户,语言风格与 CHANGELOG 完全不同。每条描述必须能回答「这对我有什么用」。红线:禁写调试功能、技术细节和用户无感知的改动。 产品决策与品味 AI 主动识别对话中的产品思路、决策逻辑和取舍偏好,提炼后直接写入,新对话自动继承。四段结构:产品原则、设计决策记录、用户体验偏好、反模式。 项目里每天都会产生各种信息,分诊能力决定文档体系能不能跑起来。下面逐条给出 8 条真实信息,判断每条该写进哪份文档。 ## 把环境事实写进 Rule(环境与安全) URL: https://xueai.miyang.cn/slides/vibe-8.html (以下为免费预览,全文见页面) 把环境事实写进 Rule 每次新开对话,AI 都不知道该调哪个模型、超时设多少、项目用什么框架。把这些环境事实一次性写死在 Rule 里,相当于给 AI 一份预填好的 .env 说明书,每轮对话自动带入。本页两个演示都可以真实操作。 模型配置、技术栈锁定、数据格式三分法与 isComposing 这类必踩的坑 为什么是 Rule:把配置写在 .env 里让 AI 自己读,它不一定每次都主动读;写在对话里,对话一长就被截断遗忘。Rule 在每轮对话开始前就被加载进上下文,是最稳的注入方式。 中文输入法确认候选词时会触发 Enter,只判断 e.key === 'Enter' 的输入框会把半段内容直接发出去。AI 训练数据里 isComposing 覆盖率不高,不写进 Rule 就一定会忘。切换到中文输入法,在下面的输入框里打几个字试试。 const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing) { e.preventDefault() handleSend() } } isComposing 为 true:输入法正在组合中,回车只确认候选词,不触发发送 isComposing 为 false:普通键盘直接输入,回车正常发送 规则原文:禁止只判断 e.key === 'Enter' 而不检查 isComposing ## 破坏性操作的三道闸(环境与安全) URL: https://xueai.miyang.cn/slides/vibe-9.html (以下为免费预览,全文见页面) 破坏性操作的三道闸 发版时以为只改了 A 功能,实际 diff 里混进了上周调试 B 的临时改动,半成品代码进了生产环境。数据库、配置、部署这些不可逆操作,必须在执行前设闸。下面两个演练都可以动手操作。 数据库先备份、不可逆操作先给回退方案、发版前做 diff 审查 核心原则:不可逆操作的安全感来自闸门。备份拦数据损失,回退方案拦无法恢复,diff 审查拦带病发版,三道闸都设在执行之前。 数据库改动先备份 备份放项目根目录 backups/,命名带时间戳。未备份不得执行任何 migrate、drop、alter、delete 操作。成本是一行命令,赌的是整库数据。 不可逆操作先说回退方案 回退方案要回答三件事:如何恢复到操作前的状态、需要哪些备份文件、预计恢复耗时。说不出这三件事,说明操作还没想清楚。 发版前做 diff 审查 把「我以为我改了什么」和「我实际改了什么」拆开比对。SubAgent 独立分析 diff 与 Release Notes 的偏差,有风险就暂停发版。 你是本次发版的 reviewer。Release Notes 只写了一件事,但实际 diff 有 7 个文件。逐个判断每个文件的改动「符合预期」还是「存在风险」,全部标完后生成审查报告。 ✨ 新增夜间模式:可以在设置里切换暗色界面,长时间使用不再刺眼。 ## 长对话锚定与写作规范(沟通与写作) URL: https://xueai.miyang.cn/slides/vibe-10.html (以下为免费预览,全文见页面) 长对话锚定与写作规范 对话开头说了用 PostgreSQL,聊到 30 轮 AI 突然建议 SQLite,因为早期约定已经被上下文窗口挤掉了。这一节讲两件事:怎么对抗长对话的认知漂移,以及怎么让 AI 写出的中文摆脱 AI 腔。两个交互演示,动手拖一拖、点一点。 超过 10 轮强制复述目标;违禁句式清单让文案摆脱 AI 腔 理解漂移成因 上下文窗口截断和长文本尾部注意力衰减,让 AI 忘掉早期约定。即使是 200K token 的模型,注意力在长文本尾部的衰减也真实存在。 会设 checkpoint 超过 10 轮后,关键操作前强制复述当前目标和关键约束,用周期性锚点对抗遗忘。 消灭 AI 腔 用可搜索的违禁模式清单和自查流程,替代「请写自然流畅的中文」这类空话。 下面是一个模拟对话窗口,假设上下文窗口只装得下最近 20 轮。第 1 轮定了「用 PostgreSQL」的硬约束,拖动滑块增加对话轮数,观察这条约定的命运。然后切换到「开启锚定」,看同样 30 轮之后有什么区别。 无锚定 约定说一次就靠 AI 自觉记住 开启锚定 每 10 轮复述一次目标与约束 灰色划线的消息表示已滑出上下文窗口,AI 看不见它们了。本演示假设窗口容量为最近 20 轮。 ## 规则的价值:每条解决一个真实问题(专题收官) URL: https://xueai.miyang.cn/slides/vibe-final.html (以下为免费预览,全文见页面) 规则的价值:每条解决一个真实问题 14 个章节走完了。这套规则的来源只有一个:每发现一次 AI 反复犯的错误,就加一条规则。收官这节把全景图摊开,再用一个自查向导帮你把它改造成你自己的。 全景图回顾 + 使用方法 + 适配自己项目的四个动作 14 章规则归入五大板块。点击任意板块,展开对应章节明细、一句话说明,以及它在本专题第几节课里讲过。 STEP 1放入 rules 目录 把 .mdc 文件放进项目的 .cursor/rules/ 目录,Cursor 会自动识别。 STEP 2配置生效方式 frontmatter 里的 alwaysApply 设 true 全局生效,设 false 则需手动 @ 引用,写作规范适合后者。 STEP 3替换环境事实 把模型配置、技术栈、端口规则换成你自己的选型,secrets 文件填占位符并排除出 git。 ## 沉淀你自己的协作规范(你现在能做什么) URL: https://xueai.miyang.cn/slides/build-6.html (以下为免费预览,全文见页面) 最后一格:让「你的做法」变成「谁来都行」 前五格你做出了一个能干活的 Agent,但所有的判断都在你脑子里。这一格把它们写成规矩。立住之后,换个人、换个项目、换个模型,这套东西照样跑。这才叫工程,不叫手艺。 四步流程对比演示;三档任务:写第一条 Rule、真需求走一遍流程、导出建造日志整理成规范 v1 这一章的四步流程(复述、PRD、确认、编码)解决的是同一个问题的两副面孔:AI 理解错了需求还闷头猛干,你发现时它已经改了二十个文件。断点必须设在它动手之前,动手之后的纠正都叫返工。 同一个需求,两种交法 用它自己的话讲一遍要做什么,歪了当场就能看见 方案、边界、不做什么,白纸黑字落下来 人工闸门:不点头就不动手 此时才动手,写出来的就是确认过的那个东西 ## Vibe Coding 方法论 · 30 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/interview-7.html (以下为免费预览,全文见页面) Vibe Coding 方法论 · 30 道灵魂拷问 用 AI 写代码这件事,最不缺的就是质疑。这 30 个问题来自三个真实场景:面试官在验证深度,老板在追问责任,技术同事在试探边界。先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:为什么立规矩 / 质量责任 / 代码合入把关 / 拒绝分期 / 决策沉淀 / 安全闸门 先说清 Vibe Coding 是什么:靠自然语言让 AI 直接产出代码的开发方式。它的问题从来出在质量,写得快只是放大了搞砸的速度。 甩出四类典型事故:理解偏差返工(改了 7 个文件才发现思路错了)、选型漂移(今天 Express 明天 Fastify)、善意破坏(重构时清理掉有用的代码)、永久技术债(简版登录再也没升级过)。 点破共同根源:四类事故根源是同一件事,约束没有进入上下文。AI 每轮对话都可能忘掉你交代过的事。 给出解法:把约束写进 Rule 文件,每轮对话开始前自动加载。对话里交代会被截断挤出窗口,写在文档里 AI 未必去读,只有 Rule 是结构上最稳的注入渠道。 先接住责任:bug 永远算人的,AI 是工具。这套规范的目的就是让人在每个关键节点都有拍板的机会,出了问题能追溯到具体哪一关放过去的。 给事前关卡:断点设在动手之前。AI 写代码前必须复述需求、产出 PRD、拿到明确许可;改超过 3 个文件先交修改计划。理解偏差在写第一行代码之前就被拦下。 给交付底线:两道硬性检查。涉及 AI 接口的功能必须真实调用过,禁止 Mock 绕过;核心逻辑单元测试不过,不得交付。 给出事后的修法:真出了 bug,禁止猜测性修复。先加 Log 定位根因,修复前回答三个问题(完整业务流程、影响哪些模块、有没有同类问题),修完声明影响范围,明确该回归测试哪里。 ## 执行免费了,判断力开始涨价(品味成了新瓶颈) URL: https://xueai.miyang.cn/slides/taste-1.html 执行免费了,判断力开始涨价 AI 把执行门槛打掉了:人人都能十分钟做出一个能用的页面、一张能看的图。这一章不教你画图,教两件练了就会的事:看出哪里不对,说清要什么。 当人人都能十分钟做出能用的东西,「能用」就开始贬值。三个界面先凭直觉投一票,学完这章回来再投一次,看你的眼睛变了没有 过去「会做」就值钱:会写代码、会用设计软件、会剪视频,掌握工具本身就是门槛。现在这道门槛被 AI 铲平了,能用的东西满地都是,稀缺的变成了做得对、有品味:十个方案摆在面前,挑出对的那个,说清差在哪、该怎么改。 维度 AI 之前 AI 之后 门槛 会用工具、懂技术栈,学习成本以年计 会说人话就能开工 耗时 一个能上线的页面,以天或周计 十分钟出第一版,一小时出三版 拉开差距的东西 执行力:谁能把东西做出来 判断力:谁能看出哪版对、说清要什么 同一句需求「给一家瑜伽工作室做个预约页」,AI 给了三个方案。先别管理论,凭直觉点一个你觉得最好的。本页不判对错,这一票会存下来,学完本章最后一节请你再投一次,两票对照,你能看见自己眼力的变化。 把「做出一个能用的东西」的耗时从 72 小时拖到 0.2 小时,看两个指数怎么此消彼长。耗时塌下去,「能用」跟着贬值;能用的东西一多,挑出对的那个的溢价就抬起来了。 聊到这里总会撞上一句反驳:品味是天赋,各花入各眼,这怎么教?米莱和萨诺(Kevin Mullet 与 Darrell Sano)在《设计视觉界面》里把这团乱麻拆开了。艺术是艺术家表达自我的方式,约束越少越好,作品越独特越值钱;设计给特定人群做有特定用途的东西,头号任务是清晰沟通。 这句话是全章的地基。评价一件艺术品,问的是「它表达了什么」,没有标准答案,吵到天亮也分不出高下。评价一个设计,问的是「信息传到目标人群了没有」,这可以验证。 Cooper 在《About Face 4》里把这条路线叫目标导向,还补了一句:视觉传达难免掺主观判断,但把体验目标和商业目标说清楚之后,品味差异可以被努力缩小。美学没有被赶出场,只是被装进了目标的框架里。 维度 艺术 设计 回答的问题 我想表达什么 信息传到目标人群了没有 约束 越少越好,独特是加分项 用户、场景、目标全是给定条件 评价方式 各花入各眼,争不出结果 对照目标逐条验证,能分高下 对品味的含义 确实接近天赋,教不了 判断有裁判,练了就会 这张海报挂进美术馆,怎么做都成立,它只对创作者负责。现在它的身份换成下周演出的预告,第一个要回答的问题变成哪个? 光有理论没体感,现场做个实验。三张演出海报,两位评审:设计师小周和主办方老陈。先看没有目标时两人怎么吵,再把目标写上桌,看结论怎么自己浮出来。 执行门槛塌了:十分钟人人都能做出能用的东西,「能用」在贬值。 稀缺的换了位置:从「会做」换到「做得对、有品味」,从一堆方案里挑出对的那个,成了人的核心工作。 审美判断有裁判:艺术管表达,设计管沟通(米莱和萨诺)。目标一明确,品味分歧就收窄成能验证的问题,这是「审美可训练」的理论地基。 本章练两件事:看出哪里不对(第 3~6 节),说清要什么(第 7~9 节)。今天这一票已经存好,学完最后一节回来对答案。 内容来源:小山学堂「审美工程」专题原创;部分设计原则整理自《About Face 4:交互设计精髓》第 17 章。 ## 「AI 味儿」是怎么来的(品味成了新瓶颈) URL: https://xueai.miyang.cn/slides/taste-2.html 「AI 味儿」是怎么来的 让 AI 随便生成一个页面,十有八九是紫色渐变、毛玻璃、居中大标题三件套。这种整齐划一有数学上的原因,看懂了它,你就知道怎么绕开它。 紫色渐变、毛玻璃、圆角卡片三件套:AI 默认输出训练数据的平均值,平均值就是平庸。在一张典型的 AI 生成页面上点出「AI 味」特征,集齐揭晓成因 下面是一张典型的 AI 生成 landing page。它藏着 5 个高频出现的「AI 味」特征,在页面上把它们逐个点出来。每点中一个,会告诉你这个特征为什么成了 AI 的默认动作。 「AI 味」有更早的学名。Cooper 在《About Face 4》第 17 章里管这类东西叫视觉噪音:多余的视觉元素,把注意力从真正传达信息的对象上拽走。他还列了一份七种形式的清单。下面这块「团队周报后台」七种全占,对照体检单逐项确诊。 七种噪音里,「颜色太多」有个专门的名字。《About Face 4》的说法:颜色像调色板一样拥挤在一起,会让用户不堪重负,这叫嘉年华效应;饱和度再拉满,喧闹感加倍,直接和内容抢戏。同一个周末市集的宣传页,两种配色,点你觉得更能让人看进去的那边。 AI 生成设计时,挑的是训练数据里的高概率区域,也就是全网设计的「平均值」。这和语言幻觉是同一个机制:接话的时候,顺的赢过对的;生成设计的时候,常见的赢过好的。它交出紫渐变三件套,正如它一本正经地编出一个不存在的书名:都是在挑「最像会出现在这里」的答案。 好消息是,这个机制留了一扇门:概率分布是随输入变化的。你的描述越具体,模型可选的区域就越窄,窄到一定程度,它就被你拉出了平均值。 同一个需求,三种具体度的说法,看产出怎么变。 AI 味有出处:模型默认输出训练数据的高概率区域,也就是全网设计的平均值,紫渐变三件套是这片区域的门面。 视觉噪音有病理清单:过分装饰、无信息量的 3D、过重分隔、元素拥挤、颜色纹理对比过密、颜色太多、层级无力,七项出自《About Face 4》;颜色挤成调色板还有个学名,嘉年华效应。 机制和幻觉同源:接话时顺的赢过对的,生成设计时常见的赢过好的。没给指令的地方,它一律用最常见的答案填。 解法是拧高具体度:参照物加上可验收的硬约束(一个主色、禁止渐变),每加一档,产出离默认味远一步。下次让 AI 生成页面前,先把这五个特征列进禁用清单。 内容来源:小山学堂「审美工程」专题原创;部分设计原则整理自《About Face 4:交互设计精髓》第 17 章。 ## 层级:一屏只有一个主角(识别美的四个抓手) URL: https://xueai.miyang.cn/slides/taste-3.html (以下为免费预览,全文见页面) 层级:一屏只有一个主角 打开一个页面,视线总得先落在某一处。设计者不安排这个落点,读者的眼睛就会自己乱撞。这一节讲层级:怎么用字号、字重、颜色三根杠杆,把「先看哪」安排明白。 什么都想强调等于什么都没强调。字号、字重、颜色三根杠杆怎么分配注意力,A/B 找茬揪出抢戏的界面 注意力是稀缺资源,界面上每个元素都在抢。加粗、标红、放大,单独看每一下都有道理,叠在一起就互相抵消:五个主角同台,观众谁都记不住。层级的做法反过来,先选出一个主角,再让其余角色按重要程度递减。手里的杠杆就三根: 杠杆 怎么用 常见翻车 字号 主角比配角大一到两档就够,档位拉开、数量克制 三个元素都用最大号,大字互相打架 字重 正文 400、强调 700,两档打天下 满屏加粗,粗就失去了「更重要」的含义 颜色 强调色只给一个动作或一个数字 标红三处,读者不知道哪个红才是真警报 《About Face 4:交互设计精髓》第 17 章讲视觉层级,开头就把用户看界面的第一反应拆成两个下意识的问题:「这里什么重要」,紧接着「这些东西有什么关联」。Cooper 的结论:界面要靠建立层级和关系来回答这两个问题。层级答得好,用户几乎不会留意到它的存在;答得糟,混乱立刻跳出来。 这两个问题就是本节的验收口诀。下面每个案例,你都可以先自问一遍:主角三秒内找得到吗?哪些元素一眼能看出是一伙的? 下面是一张商品卡,三根杠杆都交给你:主标题字号、次要信息颜色、强调色数量。拉动它们,观察卡片的「主角」怎么变。 ## 留白与对齐:大多数丑都丑在间距(识别美的四个抓手) URL: https://xueai.miyang.cn/slides/taste-4.html (以下为免费预览,全文见页面) 留白与对齐:大多数丑都丑在间距 「说不上哪里丑,反正就是丑」,这句评价八成在说间距。颜色字体一处没动,只把间距捋顺,界面就能上一个档次。这一节给你两条规律和一张现成的数字表。 说不上哪里丑的界面,问题多半在间距。拖动滑块看呼吸感怎么来的,再学 8pt 网格这个偷懒神器 间距只有两条规律。亲密性:相关的元素靠近,无关的离远,读者靠距离判断「哪些是一伙的」。一致性:同层级用同间距,卡片和卡片之间是 16,就处处是 16。剩下的问题是「具体填几」,答案是 8pt 网格:间距只从 8、16、24、32 里挑。不必纠结 13 还是 15,选项少了,一致性反而自动达成。这套网格也是给 AI 下指令的好词汇:跟它说「间距全走 8pt 网格」,比说「好看一点」有效得多。 同一张注册表单,内容一个字不改,只动间距。拖动滑块,从 4px 拉到 32px,感受「挤成一团」到「呼吸感」的过程。 亲密性在《About Face 4》里有一笔算得清清楚楚的像素账:工具栏里同组图标相距 4px,组和组之间留 8px,分组就成立了,一条边框都不用画。Cooper 顺带点名了反面做法:很多界面入目之处边框充斥,有时一两个元素也围上一圈。这是笨拙的分组方式,还制造视觉噪音。同一条工具栏,两种分法,自己切换感受。 ## 克制:给颜色和字体做预算(识别美的四个抓手) URL: https://xueai.miyang.cn/slides/taste-5.html (以下为免费预览,全文见页面) 克制:给颜色和字体做预算 好看的界面大多不是加出来的,是省出来的。这一节给你一套预算表:一个主色加中性色、两种字重、一套圆角。超预算的东西再好看也砍。 一个主色、两种字重、一套圆角。往界面里加颜色看它变成年会海报,再一键做减法,感受高级感回来的瞬间 预算制的规则很短:一个主色,其余交给黑白灰的中性色;两种字重,正文一档强调一档;一套圆角,定一个数处处沿用。想加第二种彩色时,先问自己一句「它值不值得动预算」,多数时候答案是省下来。 下面是一张克制版的活动页。连点五次「再加一种颜色」,看它一步步劣化;点满五次后,再一键做减法。 加色器演的是怎么变丑,减法游戏演怎么救回来。《About Face 4》给过一个可执行的办法:删减东西,直到删掉某件破坏了设计为止,再把最后删掉的那件加回来。下面这张促销卡堆了六件装饰,逐件点掉试试,哪件删了页面就破,你自然会知道。 ## 一致性:系统感从哪来(识别美的四个抓手) URL: https://xueai.miyang.cn/slides/taste-6.html (以下为免费预览,全文见页面) 一致性:系统感从哪来 有一种界面,单看每处都还行,合起来却透着一股散装味。它缺的说到底就一样东西:一套大家共同遵守的变量。这一节讲 design token,变量先行,样式跟随。 好看的站点背后都有一套设计变量。拆开本站真实的 CSS:控件高度、圆角、配色为什么全站只有一档,改一处全站生效 散装感的来路很具体:这个按钮高 36,那个高 40;这张卡圆角 8,那张 16;这里的玫红深一点,那里浅一点。每处都是当时随手写的,单看都说得过去,拼起来就露馅。解法是把这些「随手写」收编成变量:先定 token(主色、圆角、控件高度、间距档位),所有样式从 token 取值。写样式的人少做决定,界面自然长得像一家人。 一致性听着像洁癖,其实买的是真金白银的东西。《About Face 4》引尼尔森的账:统一的界面标准靠可预见性提高产出、减少错误,用户在一个地方学会的规律,换个页面还管用,学习成本和培训费用都在降。苹果和微软都乐于让第三方应用长得像自家系统,图的就是用户到哪都不用重新学。 一致,用户赚到什么 不一致,用户赔上什么 按钮长这样、行为就那样,闭着眼预判 每个新页面都要重新试探一遍 学一次,全站通用 「上一页明明是点右上角保存的」 界面退到背景,注意力全给内容 差异不断把注意力拽向界面本身 同一本书也把丑话说在前头:标准管的是外观和感觉这层语法,管不了更深的逻辑,把标准当灵丹妙药,和以为有了格式手册就能写出好小说一样不可取。所以这一节教的是给界面立变量,不是给创造力上锁。 这不是课堂虚构。本站课程列表页 learn.html 的源码里就躺着这样两行变量,原注释一并抄给你: 你正在看的这个网站,顶栏那五个按钮就是被这两个变量管着的:谁也不许自带尺寸,统一读 36px 高、10px 圆角。哪天想全站换风格,改这两行就够了。 ## 「好看」的一百种具体说法(把审美翻译给 AI 听) URL: https://xueai.miyang.cn/slides/taste-7.html (以下为免费预览,全文见页面) 「好看」的一百种具体说法 你对 AI 说「好看一点」,它只能猜;你说「信息密度加一档、视觉噪音降下来」,它立刻知道该动哪里。这一节给你十二个能直接用的审美词、一套拆解一切视觉差异的八变量,外加一台把抱怨翻译成术语的机器。 信息密度、视觉噪音、呼吸感、对比度层级…点选审美词汇看释义与正反案例。说得出名字,才指挥得动 AI 「好看一点」交出去,AI 只能猜:猜你要加渐变,猜你要换字体,猜你要堆动效。「信息密度加一档,视觉噪音降下来」交出去,AI 立刻知道该动哪里:多放两组数据,砍掉一半徽章。词汇是判断力的容器:装得下「视觉噪音」这个词,你才留得住「这页面哪里不对」的那个直觉。 单位面积里装了多少有效信息。密度低是在浪费读者的屏幕;密度高但没层级,才叫挤。 与信息无关的装饰量。徽章、角标、分割线、多余的颜色,都是噪音。 内容和边界、内容和内容之间的空隙。空隙也是设计,挤掉它,内容会打架。 谁最重要,谁最显眼。字号、字重、颜色三根杠杆,一次只捧一个主角。 元素抢注意力的能力,由大小、颜色深浅、实心程度决定。重的名额要留给主操作。 相关的靠近,无关的离远。距离本身就在传递分组信息。 文字和背景拉开多少差距。灰得优雅和灰得看不清,隔着一条可读性的线。 元素的边缘落在同几条隐形直线上。对齐是免费的秩序感。 一个颜色拆成三个旋钮:色调 H 管它是什么颜色,饱和度 S 管它有多鲜艳,色值 V 管它有多深。About Face 4 建议设计师把三个旋钮分开考虑,跟 AI 调色也一样,按旋钮说,别整体抱怨「颜色不好看」。 取值天生分大小的视觉属性。大小、色值、位置有序,适合表达层级、数量、顺序;色调、形状无序,只能管分类。出自 Bertin《图形符号学》,About Face 4 沿用了这套判断。 元素外观发出的「怎么操作我」信号。凸起、阴影、纹理都在说能点能拖;信号乱发,读者就会去点点不动的东西。About Face 4 提到纹理很少用来做对比,本职就是当能供性信号。 眯起一只眼看屏幕:谁还跳得出来,谁糊成一团,谁自动聚成一组。About Face 4 推荐的层级体检法,五秒钟做完,交稿前做一遍。 ## 生 UI:从形容词到规格书(把审美翻译给 AI 听) URL: https://xueai.miyang.cn/slides/taste-8.html (以下为免费预览,全文见页面) 生 UI:从形容词到规格书 给 AI 提 UI 需求,形容词是许愿,规格是指令。同一个落地页需求,三档提示词能差出三个档次的产出;这一节教你把「好看」写成一份 AI 没法跑偏的规格书。 「做个好看的页面」和「参考 Linear 的信息密度、只用一个主色」差出一个档次。三档提示词对比产出,现场看差距 「做个好看的落地页」交出去,AI 会还你一个紫色渐变、居中堆料的大路货。这口锅 AI 只背一半:它没拿到信息,只能输出训练数据的平均值。Prompt 工程篇讲过「信息给一分,它答一分」,生 UI 是这条规律最直观的展台。主色写死、间距锁网格、字重限两级、禁止项列清单,产出立刻换一个档次。 ## 生图:构图、光影、色彩的语言(把审美翻译给 AI 听) URL: https://xueai.miyang.cn/slides/taste-9.html (以下为免费预览,全文见页面) 生图:构图、光影、色彩的语言 生图和生 UI 同一个道理:词汇量决定产出。构图、光影、色彩三件套,每样记三个词;先用三组真图练眼力,再拼一段能直接用的生图提示词。 生图提示词的审美三件套:构图、光影、色彩。三组对比图建立直觉,再从四张候选图里挑出对的那张 你说「一张好看的咖啡海报」,AI 给你训练数据的平均值;你说「三分法构图、黄金时刻侧逆光、低饱和莫兰迪色调」,AI 立刻有了施工图。摄影师练了一百年的语言现成摆在那里,拿来就能用。审美三件套:构图管主体站位,光影管立体感,色彩管情绪。每样记住三个词,够用了。下面的练习都做成两张并排,这是信息设计师 Tufte 的老办法:对比产生情境,好坏摆在一起才看得出来。 ## 怎么看设计才算看进去了(建立自己的参考库) URL: https://xueai.miyang.cn/slides/taste-10.html (以下为免费预览,全文见页面) 怎么看设计才算看进去了 收藏夹在膨胀,眼力没长进,问题出在看的方式。这一节给一套固定的拆解顺序,把「真好看」翻译成能带走的变量,你的参考库从这里开始有复利。 收藏一百个网站没用,要按顺序拆:先看层级,再量间距,最后数颜色。用这套流程现场拆一个好设计 收藏夹里躺着一百个「灵感网站」,真要动手的时候还是找不到方向,这种收藏等于没收藏。打开一个好设计,扫一眼说「真好看」,截图,关掉,这是游客行为:拍了照、发了圈,什么都没带走。 看进去要按固定顺序拆,每层只回答一个问题:先看层级(谁是主角),再量间距(padding 有没有规律),然后数颜色(几种、怎么分工),最后抠细节(圆角、阴影、字重各有几档)。顺序从大到小:先抓骨架,再抠皮肤。 这四步前面还有一个第 0 步:眯眼。睁大眼睛细看之前,先把整页糊成一团看一遍,主次和分组自己会浮出来。这一节把五步全部现场演一遍。 图形设计师有个老手艺叫眯眼测试:闭上一只眼,眯起另一只看屏幕。细节糊掉之后,剩下的只有块面、明暗和分组,这时候哪些元素还跳得出来、哪些看上去是一伙的,一眼就有答案。《About Face 4:交互设计精髓》第 17 章把它列为检验层级和关系的首选工具,还提到换个角度看,常能发现之前没注意到的布局问题。 眯眼在验的是什么?同一章给了答案:人看到一屏东西,下意识会连问两个问题,这里什么重要?这些东西有什么关联?好设计抢在你问出口之前就答完了。把这两问翻成白话,就是本节的拆解口诀。 眯眼答第一遍,睁眼验第二遍。答案一致,层级过硬;眯眼时找不到落点、分组糊成一片,睁眼看再精致也白搭。下面的透视镜里新加了眯眼视图,先切它。 下面这张落地页是用本章的规矩现做的:唯一主角、8pt 间距、一个主色。切换视图,看同一张页面在四层拆解里各自长什么样。 ## 把参考喂给 AI(建立自己的参考库) URL: https://xueai.miyang.cn/slides/taste-11.html (以下为免费预览,全文见页面) 把参考喂给 AI 你能看出好在哪之后,下一步是让 AI 也知道。这一节讲三种把参考喂进对话的姿势:垫图、风格描述、设计变量,配拿来就用的话术模板。 光靠嘴描述风格太低效。垫图、风格描述、设计变量三种喂法的适用场景与话术模板,让 AI 照着你的参考库出活 「温馨一点、再高级一点」,这样的话说十句,九句会在模型那里变形。形容词要经过两次翻译:你把感觉压缩成词,模型再把词展开成画面,两头都有损耗。把参考直接塞给 AI,损耗最小,一次到位。 喂参考有三种姿势,各管一段,对着表选: 喂法 给什么 适合场景 短板 垫图 一到三张参考图 整体气质、构图、风格迁移 容易连版式一起抄走 风格描述 一段规格文字:密度、主色、圆角 能用规则讲清楚的风格 讲不清的气质写不出来 设计变量 token 清单:主色 / 圆角 / 字体 / 间距 让 AI 写 UI 代码 管得住样式,管不住布局与文案 风格描述不必从零开始编,它有现成的方法论。《About Face 4:交互设计精髓》第 17 章记录了 Cooper 公司的做法,叫体验属性:动手设计之前,先和客户一起挑出 3~5 个形容词,描述这个产品的气质和品牌承诺,比如「干净、克制、可信」。词一旦定下来,就成了后续所有视觉决策的裁判:方案拿不准,回头问这几个词答应不答应。 形容词之间还允许打架。书里说「安全」和「灵活」可以同时在场,这种张力值得保留:两个词冲突的地方,正是早期风格稿要优先回答的问题。 这套方法搬到喂 AI 上刚好严丝合缝:先用形容词把气质钉住,再把每个形容词翻译成具体规格。光给形容词,AI 会按平均值理解;翻译这一步做完,风格描述才算写好。翻译工作交给下面的工作台。 ## 验收清单:点头之前过一遍(专题收官) URL: https://xueai.miyang.cn/slides/taste-final.html (以下为免费预览,全文见页面) 验收清单:点头之前过一遍 AI 出稿越来越快,把关的动作要跟上。收官这一节交付一份 15 项验收清单,再回访你在开篇投下的那一票,看看这一章有没有把眼睛练出来。 AI 交付的界面和图片,按清单逐项检查:层级、间距、克制、一致性、细节。交互式清单可勾选,附延伸阅读 AI 十分钟能出一版稿,你花三分钟验收,这笔账怎么算都划算。难缠的对手是「差不多就行」:稿子第一眼过得去,手就想点通过,糙的地方要到上线之后才扎眼。这份清单管住那只手:十五项,每项一个动作,过一遍再点头。勾选进度会存在本地,下次带着新稿子回来接着用。清单里几条判据有出处,勾完往下翻,每条都配了说法和练手题。 克制组新加的那一项有出处。《About Face 4:交互设计精髓》第 17 章的判据:每个元素的存在要有理由,每处差异的存在也要有理由,给不出理由,就删掉元素、抹平差异。配套的手法叫删减测试:把可疑元素去掉,看信息受没受损。书里把话说得更狠:删减东西,直到破坏了设计为止,再把最后去掉的那件加回来。做一道题练手。 细节组那条响应时间判据也有出处。界面舒不舒服,响应速度占一大块,而且门槛是公认的。《About Face 4》第 17 章引尼尔森的划分:0.1 秒内响应,人感觉是即时的;1 秒内完成,思路不断,给个细微线索就够;接近 10 秒,必须给出正在运行的信号,比如转圈加预估;超过 10 秒,要解释慢在哪、给进度更新,做完还要提示一声。三个按钮各踩一道门槛,亲手点一遍找体感。 ## 能跑通了,然后呢?(好用也成了瓶颈) URL: https://xueai.miyang.cn/slides/ixd-1.html 能跑通了,然后呢? 上一章练的是看出「哪里丑」,这一章练看出「哪里难用」。AI 交付的应用功能齐全、点哪都有反应,但用起来处处硌手。这一节先立住全章的地基:交互的病比审美的病更隐蔽,然后拿一张理论清单,亲手抓五个现行。 把「体贴软件」的特质清单反过来用,就是 AI 默认交互的找茬清单。在一个能跑通的应用里逐个点出五处不体贴,看看你平时都默默忍了什么 审美的病暴露得快:页面一打开,配色乱、间距挤,三秒钟就皱眉头。交互的病藏得深:demo 演示那两分钟一切正常,等真实用户删错一条数据、断一次网、第一次打开空荡荡的页面,病才发作。 这就是 Vibe Coding 时代的新坑。AI 把「做出来」变得很容易,它默认交付的交互停在「能跑通」级别:空态一片空白、报错弹 alert、删除不带确认、保存了没动静。你验收时点两下觉得没问题,用户用一周就想卸载。 维度 审美的病 交互的病 暴露时机 页面打开的前三秒 用起来之后:删错数据、断网、第一次打开 谁先发现 你自己扫一眼就能发现 往往是用户替你发现,代价是流失 AI 犯错的样子 五颜六色、字号打架,看着就不对 demo 里一切正常,边界情况全是坑 验收方式 看:截图就能评审 用:把流程走一遍,把坏情况都试一遍 清单从哪来?Alan Cooper 在《About Face 4》第 8 章「数字产品的礼仪」里给过答案。他借了纳斯和里夫斯的研究,把结论落成一条设计原则: Cooper 的观察很扎心:交互产品惹怒我们的原因通常不在缺功能,在不体贴。他列了十几条体贴软件的特质,挑出最适合检查 AI 产出的六条,每一条反过来读,就是一条找茬标准。 体贴的软件… Cooper 的意思 AI 默认产出的反面 有预见 预判你下一步要什么,提前备好 第一次打开一片空白,下一步全靠猜 会及时通知 你关心的进展主动告诉你,不用你问 点了保存没动静,转了圈也没个说法 不因自己的问题烦你 技术故障自己消化,别拿代码味的话甩锅 一断网就把 Error: code 500 端到你脸上 是自信的,但备好退路 照你说的做,不反复质疑;万一你错了,帮你恢复 要么删前问三遍,要么删了就真没了 不问多余的问题 能记住的选择记住,能给默认值的给默认值 每次打开都把同一个问题再问一遍 帮你避免低级错误 看你要犯错,悄悄拉一把,别指责 眼睁睁看你误删,然后弹窗说操作失败 这张表右边那一列,就是接下来找茬的靶子。别背,动手抓一遍就记住了。 顺带说清这一章和前后两章的分工:审美工程管好看,本章管好用,心理学篇管用户的感受。三章各出一张验收清单,配齐了就是「上线前三张清单」。 还有一个好消息:这六条病 AI 都治得好,它只是默认不治。你能说出病名,它就能开药,这也是全章反复练「说清要什么」的原因。 下面是一个 AI 生成的待办应用「今日清单」,功能齐全,能跑通。它藏着五处不体贴,全在这一屏里。觉得哪里不对就点哪里,点中一处,右边立一张病历卡,写清它违反了清单上哪一条、该怎么改。 找茬清单里有一对容易搞混的病:没反馈是病,反馈过度也是病。Cooper 在第 8 章专门点过名:交互产品爱用不必要的通知向我们炫耀,「文档保存成功!」这种弹窗等着被点掉,除了打断你没有别的作用。下面两个编辑器都做了保存反馈,点你认为更体贴的那个。 本周把订单导出功能收了尾,联调通过,周四已经上线。 下周计划:把导出格式扩到 Excel,预计三个工作日… 本周把订单导出功能收了尾,联调通过,周四已经上线。 数据侧补齐了近 30 天的留存看板,口径和产品确认过。 下周计划:把导出格式扩到 Excel,预计三个工作日… 找茬清单看完,回想一下你天天在用的软件,包括你自己让 AI 做的那些。六种不体贴,选一个你被折磨得最狠的,投完看看别人都在忍什么。 找茬清单有了,还差一个使用姿势。审美验收看截图就行,交互验收要动手走流程,而且要走三遍,每遍换一个身份。 第几遍 扮演谁 怎么走 抓什么病 第一遍 老用户 顺着理想路径把主流程走完 存了没动静、问个没完这类日常摩擦 第二遍 倒霉用户 故意犯错:删一条、断个网、输错格式、连点两次提交 报错像甩锅、删了就没、一崩全丢 第三遍 新用户 清掉数据从零开始,第一次打开的每一屏都停下来看 空白空态、下一步全靠猜 第二遍和第三遍最容易被省略,AI 的病恰恰全堆在那里。demo 给你演示的永远是第一遍,网络流畅、数据现成、路径笔直。你替用户把另外两遍走了,病就在上线前被抓住。 走的时候手边放着那张体贴清单,每停一屏问一句:这一屏有预见吗?会通知吗?在甩锅吗?备好退路了吗?在问多余的问题吗?会帮我兜住低级错误吗?六个问号过完,这一屏才算验收完。 交互的病更隐蔽:审美问题三秒暴露,交互问题要等到删错数据、断网、第一次打开才发作,往往是用户替你发现的。 能跑通只是及格线:AI 默认交付的交互停在「能跑通」,惹怒用户的多数时候是不体贴,缺功能反倒排在后面(Cooper,《About Face 4》第 8 章)。 体贴清单反过来就是找茬清单:有预见、会通知、不甩锅、自信但备好退路、不问多余的问题、帮你避免低级错误。六条对着 AI 产出逐条过。 验收交互要用,别只看:把流程走一遍,把坏情况都试一遍:删一条、断个网、开个新账号。接下来四节把找茬的抓手逐个拆开,先从状态三件套开始。 内容来源:小山学堂「交互工程」专题原创;部分交互原则整理自《About Face 4:交互设计精髓》。 ## 状态三件套:loading、空态、错误态(识别好交互的四个抓手) URL: https://xueai.miyang.cn/slides/ixd-2.html 状态三件套:loading、空态、错误态 AI 生成的界面默认只有一种状态:数据齐全、网络流畅、一切正常。可用户遇到的头一屏常常是另外三种:没数据、在等待、出错了。这三种非正常时刻恰恰是体验分水岭,这一节把三件套逐个拆开,每件配一局 A/B 对决。 界面的三种非正常时刻恰恰是体验分水岭。空态该教下一步,loading 该报进度,错误该说人话给出路。三组 A/B 对决亲手挑 给 AI 一句「做个笔记应用」,它交出来的界面永远预装着几条漂亮的假数据。可真实用户的第一屏没有数据,第一次搜索可能超时,第一次同步可能失败。这三种时刻怎么表现,AI 不会主动想,你不提要求,它就一律敷衍。 状态 AI 默认的敷衍版 该有的样子 空态 一片空白,或一行灰字「暂无数据」 教下一步:说明这里是干嘛的,给一个动作入口,最好带示例 loading 一个干转的圈,转多久都是那个样 说进行到哪:内容形状先出来,进度看得见 错误态 alert 弹一串代码,或者干脆没反应 说人话给出路:发生了什么、为什么、怎么办 上一节的体贴清单在这里全用得上:空态考的是有预见,loading 考的是会及时通知,错误态考的是不因自己的问题烦你。三件套一件件来。 Cooper 在《About Face 4》第 8 章讲乐于助人的软件时打过一个比方:向店员问路,好店员除了指路还会顺手告诉你更划算的选择。空态就是用户在问路:我到了,然后呢?一片空白等于店员耸了耸肩。 好空态回答三个问题:这里是干嘛的、我现在能做什么、做出来大概长什么样。前两个用一句话加一个按钮解决,第三个给示例数据或模板。下面两个笔记应用都是第一次打开,点你认为更体贴的那个。 体贴的软件会及时通知:用户关心的进展要让他看得见。一个干转的圈只传达了一个信息「在忙」,转到第五秒,用户开始怀疑是卡死了。骨架屏先把内容的形状画出来,等于告诉用户马上到了、到了以后长这样;再配一条进度说明,焦虑就压下去大半。 等多久该给什么反馈,那套三档决策心理学篇讲过了,这里放一张跳转卡,不重教。 Cooper 在《About Face 4》第 15 章对错误信息的立场很硬:老式错误对话框要么责备用户,要么拿技术故障甩锅,多数根本不该出现。真到了必须说的时候,向用户交代清楚三件事:发生了什么、为什么会这样、现在怎么办。三样齐了才算说人话,缺了「怎么办」的错误信息等于把用户堵在死胡同里。 还有一条底线:措辞不能责备用户。第 15 章的原则是用户视角里没有过错,把「您输入了非法字符」换成「这里只支持字母和数字」,信息一样,态度天差地别。下面两个同步失败的提示,点更体贴的那个。 三要素公式抄下来还不够,得练手感。下面三条错误文案都出自 AI 产出的真实水平,逐条点「改写」,看弱文案怎么按三要素重写,顺便记住每条弱在哪。 三件套讲完,拿一张自查表收口。想着你最近让 AI 生成的那个页面,下面五种状态,做了哪种就勾哪种,覆盖率当场出分。这张表也是给 AI 提需求的模板:第 9 节会教你把它整张写进提示词。 非正常时刻是分水岭:AI 默认只做「一切正常」,空态、loading、错误态三件套你不写进需求,它就全敷衍。 空态要教下一步:说明这里是干嘛的、给动作入口、给示例。空态是新用户的第一屏,一片白等于把人往外推。 loading 要说进行到哪:骨架屏先给内容形状,配进度说明。等待反馈的三档时机在 psy-2,不重教。 错误态三要素:发生了什么、为什么、怎么办,措辞不责备用户(Cooper,《About Face 4》第 15 章)。更进一步的思路是让错误压根发生不了,下一节讲防错与可逆。 内容来源:小山学堂「交互工程」专题原创;部分交互原则整理自《About Face 4:交互设计精髓》。 ## 防错与可逆:让用户敢点(识别好交互的四个抓手) URL: https://xueai.miyang.cn/slides/ixd-3.html (以下为免费预览,全文见页面) 防错与可逆:让用户敢点 上一节教错误怎么说,这一节往前挪一步:让错误压根发生不了,发生了也能一键回头。AI 生成的应用最爱用确认弹窗当保险,但那是最弱的一道防线,你自己动手删两条数据就明白了。 与其事后报错,先让错误发生不了;撤销让探索变安全,确认弹窗是最弱的防错。亲手改造三个危险按钮 Cooper 在《About Face 4》第 15 章有个立场:从用户的心理模型看,没有「错误操作」这回事。人用软件就是在探索,点点这个、试试那个,走进死胡同再退出来,这是学会一个工具的正常方式。把探索标记成错误、动不动弹框拦截的软件,用户会越用越缩手缩脚。 他给撤销打的比方很形象:人进山洞探险,洞口挂一条随时能爬回地面的绳梯,胆子就大得多。撤销就是那条绳梯,它救的次数不多,但它挂在那里,用户才敢往深处走。 敢点的心理机制(防御心理、控制感)在心理学篇有一整节,这里放跳转卡,不重教。 第 15 章的排序很清楚:错误信息写得再好,也比不过让错误发生不了。检查 AI 产出时先看这三板斧用上没有,三样都便宜,AI 也都会做,前提是你提了。 三板斧防住大半,剩下的交给可逆性。于是问题来了:真到删除这种动作上,AI 最常给的方案是确认弹窗,它到底顶不顶用?做个实验。 ## 流程克制:每多一步掉一批人(识别好交互的四个抓手) URL: https://xueai.miyang.cn/slides/ixd-4.html (以下为免费预览,全文见页面) 流程克制:每多一步掉一批人 上一节管住了危险按钮,这一节看整条路:用户从进来到办完事,中间有多少步在伺候软件而没在办他的事。AI 生成的流程有个通病:太完整。你来当一回流程审计员,把一个五步注册砍到两步。 不直接服务目标的操作都是负担。把一个五步注册流程逐步砍到两步,看漏斗里的人怎么留下来 《About Face 4》第 12 章把用户的操作分成两类。一类直接推进目标,比如开车上班这件事里的踩油门、打方向。另一类在伺候工具:开车库门、热车、等红灯,这些动作一步也没让你离办公室更近。第二类,Cooper 叫它负担(excise)。 软件里的负担长这样:你想发一条动态,先登录、找入口、点掉引导气泡、翻过一个升级弹窗。发动态是目标,前面四步都是税。Cooper 把这笔税拆成四种: 判据只有一条,很好记:把这一步删掉,用户的目标还能达成吗?能,它就是负担。带着这条判据,来看 AI 交付的流程。 让 AI 生成一个注册页,它大概率给你一个五步向导:邮箱、手机验证、完善资料、兴趣标签、确认提交,一步不少。它在训练数据里见过太多「规范」的注册流程,就把最全的那套端给你,每一步单看都有道理,合起来是一条收税走廊。 Cooper 对向导这种形式本来就没好话:向导把过程写死成一问一答,用户很快学会只点「下一步」,脑子全程没参与。他给的替代方案是把活直接干完,用合理的默认值兜底,事后允许用户改。放到 AI 时代,这条要由你写进需求里,它自己想不起来。 砍之前先认脸。第 12 章点名的负担源里,有三个在 AI 产出里出现得最密,点开每张卡看病征和给 AI 的话术: ## 习惯用法:别让 AI 发明新交互(识别好交互的四个抓手) URL: https://xueai.miyang.cn/slides/ixd-5.html (以下为免费预览,全文见页面) 习惯用法:别让 AI 发明新交互 流程砍利索了,还有一种病藏得更深:AI 有时会发明看着新颖、没人会用的交互。这一节讲两个词,习惯用法(idiom)和能供性(affordance),学完你能一眼认出哪个控件在装创新,还能说清为什么用户学不会。 用户靠习惯用法操作软件,学一次到处用。识别哪个控件在装创新,哪个长得像按钮的不是按钮 《About Face 4》第 13 章把界面分成三种路数:按程序内部结构长的(实现中心),靠画得像现实物件的(隐喻),还有靠学的(习惯用法)。Cooper 的立场很干脆:现代图形界面基本靠第三种撑着。窗口、滚动条、下拉菜单、超链接,没有一个靠直觉,全是用户一个个学来的。 他举的例子是鼠标:没有人看一眼鼠标就知道它控制屏幕上的光标,得有人教,或者自己摸索半分钟。但学会之后一辈子忘不掉。滚动、双击、拖放、下拉刷新、左滑删除,都是这样:学一次,到处用。 这条对做产品的人来说是天大的便宜:全世界的产品已经替你把用户教好了,你直接用现成的习惯用法,学习成本为零。麻烦在于 AI 有时不领这个情,它把训练数据里的花样拼一拼,就能发明出一个谁也没学过的控件。 顺手把第二条路数也埋了。图形界面刚火起来那几年,功劳被记在「画得像」头上:桌面画成桌面、文件夹画成文件夹,用户看图识意。Cooper 在第 13 章不买账:隐喻界面让用户在图标和功能之间连线猜谜,简单功能还能猜,稍微抽象一点就画不出来了。「批量重命名 50 个文件」,你打算画成什么? 更麻烦的是隐喻会赖着不走。用户学会基本操作之后,那些拟真的皮革纹理、翻页动画就从帮手变成拖累,占地方、限制交互,还把机械时代的规矩带进来。苹果自己也认了:iOS 6 上那本皮质日历,到 iOS 7 被清得干干净净。 所以习惯用法赢在轻装:它没打算让你猜,直接让你学,学起来还快。下面看看这套词汇是怎么搭起来的。 第 13 章里有一张倒金字塔,解释习惯用法为什么容易学:整套图形界面的交互词汇分三层,越往下越少、越简单。点每一层看它装着什么。 用户能把这套词汇从别的产品搬进你的产品,靠的是心智模型:他默认你的界面和他用过的一万个界面遵守同一套规则。模型对不上时用户有多懵,心理学篇讲过了,放跳转卡,不重教。 ## 控件选对了吗:单选、多选、开关与下拉(界面的细节) URL: https://xueai.miyang.cn/slides/ixd-6.html (以下为免费预览,全文见页面) 控件选对了吗:单选、多选、开关与下拉 前面四节看的是流程和状态,这一节钻进界面最小的零件。控件是用户和产品之间的通用语言,用错一个,用户就要多点一次、多猜一次。选用规则四句话就讲完,AI 不知道这四句,你得替它把关。 互斥选一个用单选钮,可勾多个用复选框,立即生效用开关,选项超过一屏才配用下拉。六个场景连连看,配一张能抄进提示词的速查表 让 AI 生成一张表单,控件八成是随手抓的:三个选项也塞进下拉,单选多选看心情,再顺手给每个动作都配一个弹窗。这些毛病单看都不大,叠在一张表单里,用户每一步都在多花力气。 典型病 现场 用户多付的成本 三个选项也用下拉 发票类型就三种,藏进「请选择」里 多点一次才能看见选项,选项之间没法直接比较 单选多选随缘 互斥的选项给了复选框,能多选的给了单选钮 勾出矛盾数据,或者想多选却选不了,只能撞一次错 什么都爱弹框 保存成功弹一个,切换页签也弹一个 每个弹窗都是一次打断,手在页面上,心思被拽走 Cooper 在《About Face 4》第 21 章把这些零件逐个讲过一遍,规则清楚得能背下来。这一节先背口诀,再连连看练手,最后把规则抄成提示词。 第 21 章把选择类控件的分工划得很清楚。单选钮的名字来自老式汽车收音机:司机按下一个电台键,前一个键自动弹起,眼睛不用离开路面。互斥、必选一个,就是它的地盘。四句口诀对应四种控件,先认脸再认规则。 口诀背完练手感。下面六个场景都出自真实表单,每个场景从四种控件里挑一个最对症的。选错有纠错判词,可以继续选到对为止。 ## 界面会说话:用户怎么理解你的文案(界面的细节) URL: https://xueai.miyang.cn/slides/ixd-7.html (以下为免费预览,全文见页面) 界面会说话:用户怎么理解你的文案 控件选对了,界面还得开口说话。按钮上的两个字、弹窗里的一句话,就是产品和用户的全部对话。微文案是交互的一半:写对了,用户不用想;写错了,控件再标准也白搭。AI 写微文案只有一招,逢事「确定」。 「删除这 3 条」比「确定」诚实。按钮动词要说清后果,标签用用户的词,别把数据库字段名端给用户。亲手改写一个弹窗的三处文案 数一数你今天点过多少次「确定」。它出现在删除、提交、退出、覆盖、清空的弹窗里,同一个词替一百种后果背书。问题就出在这:按钮自己不带答案,答案在正文里,用户必须读完整段话,才知道这一下点的是什么。「确定 / 取消」配对是偷懒,把阅读成本推给了用户。 处方是让按钮把后果带在身上:「删除这 3 条」替掉「确定」,「留着」替掉「取消」。这样哪怕正文一个字没读,扫一眼按钮也能安全作答。Cooper 在《About Face 4》第 21 章给功能对话框立过同款规矩:标题要用动词。标题说清在确认什么,按钮说清点了会怎样,两头都不让用户猜。 这条规矩还有一个测试版本:把弹窗正文遮住,只看标题和按钮,能不能安全作答。能,文案就合格;要回头翻正文,就还是「确定 / 取消」的偷懒变体。先看几组对照,找找动词按钮的手感。 场景 偷懒版 携带后果版 清空购物车 确定 / 取消 清空 12 件 / 先留着 退出编辑 是 / 否 保存并退出 / 丢弃改动 解绑手机号 继续 / 返回 解绑 138****2046 / 不解绑 注意「携带后果版」的另一个副产品:数量和对象一并写进按钮(12 件、138****2046),等于替用户做了最后一次核对。误操作大多发生在「我以为选的是另一批」,按钮把对象报出来,这层误会当场消解。 按钮之外,第二个重灾区是名词。界面上写着「字段 user_mobile 校验失败」「违反唯一性约束」,这些词一个用户都不认识,它们是从数据库和日志里直接端出来的。Cooper 在第 14 章把根子挖了出来:开发者把数据库的需求放在用户的需求前面,软件成了替 CPU 服务的,用户反倒像在替软件打工。 第 14 章还有一条被引用得很多的原则:出错可能不是程序的问题,但是程序的责任。手机号少一位、用户名重复,都算用户的「错」,但把错误翻译成用户听得懂、改得动的话,是程序分内的事。连菜单名都逃不过这条:Cooper 认为「文件」这个菜单名都是实现模型的词,发票应用的菜单就该叫「发票」,用户管自己的东西叫什么,界面就叫什么。 系统的词 它其实想说 病根 此操作无法撤销 「此操作」指哪个操作?说出来 系统视角的指代,用户要自己回忆上一步 Error 422 哪里填得不对、怎么改 HTTP 状态码是写给开发者的日志(第 2 节的病历) Session 已过期 登录过期了,重新登录就行 Session 是实现模型的词,用户的词是「登录」 AI 写界面时特别容易犯这个病:它对着数据结构生成文案,字段叫什么,标签就叫什么。你不拦,数据库就直接上台演讲。下面动手改一个弹窗,三处文案逐条换成人话,看 mock 当场变样。 ## 目标导向:用目标描述需求,别用功能清单(把交互翻译给 AI 听) URL: https://xueai.miyang.cn/slides/ixd-8.html (以下为免费预览,全文见页面) 目标导向:用目标描述需求,别用功能清单 前七节教你识别好交互,这两节教你把要求翻译给 AI 听。第一句翻译心法来自《About Face 4》的开篇方法论:先说清用户是谁、要完成什么,功能让 AI 自己推。给它开清单,你会收到一个柜台;给它讲场景,你会收到一个工具。 给 AI「小美要三分钟交完报销单」比给它「要有上传、表单、按钮」产出好得多。两种提示词对决,再练习把功能清单改写成场景 跟 AI 提需求,多数人的第一反应是列功能:「要有上传、要有表单、要有导出」。清单看着专业,其实把最重要的信息漏掉了:这些功能凑在一起,到底要帮谁完成什么。AI 拿到清单只能逐项照做,每一项都做了,合起来却谁的问题都没解决。 《About Face 4》第 1 章把这件事定成方法论的地基:交互设计先研究用户的目标,再从目标推导功能。Cooper 强调目标和任务是两种东西:目标是对最终状态的预期,任务只是达成目标的中间步骤。目标几十年不变(把报销交出去、让老板知道我干完了),任务隔几年就换一茬(从贴发票到拍照识别)。盯着任务提需求,AI 给你的是旧任务的电子版;盯着目标提需求,它才有机会把任务本身省掉。 同一个报销工具,左边把功能清单喂给 AI,右边把人物和场景喂给 AI,下面是两份提示词和它们各自换回的界面。先别看判词,自己选:哪边你愿意每月底用一次? 注意一个细节:B 的提示词里一个控件名都没提,产出里的拖放、自动识别、撤回反而都是 A 清单里没有的。功能是从目标里长出来的,你把土壤给够,AI 自己会结果。 ## 把状态机和边界写进提示词(把交互翻译给 AI 听) URL: https://xueai.miyang.cn/slides/ixd-9.html (以下为免费预览,全文见页面) 把状态机和边界写进提示词 上一节把「要什么」翻译成了目标和场景,这一节补上「别糊弄」的部分。规律很简单:AI 只认真写你提到的状态,没提到的一律按晴天想象。所以状态要列全,边界要说死,防错要写明,这三样合起来就是交互规格。 每个界面把状态列全,把边界情况说死,把防错要求写明。状态机补全器 + 边界轮盘,配可复制的验收话术模板 你说「做一个订单列表页」,AI 脑补的画面永远是:网络通畅、数据正好一屏、用户不会点错。它不是偷懒,是你给的描述里只有晴天。本章第 2 节讲过界面的状态三件套(加载、空、错误),第 3 节讲过防错与可逆,那两节教你识别,这一节教你把识别出的要求变成提示词里白纸黑字的条款。 下面这段提示词是典型的晴天版,右边的状态板上五个格子还全是问号。点下方的状态芯片,逐个把状态写进提示词,看规格一条条长出来。 规格里那句「空态给引导」到底值多少?下面是同一个订单页在新用户眼里的两个版本:左边的提示词没提空态,右边多写了一句。点你觉得留得住新用户的那边。 ## 交互验收清单:上线前的第二张清单(专题收官) URL: https://xueai.miyang.cn/slides/ixd-final.html (以下为免费预览,全文见页面) 交互验收清单:上线前的第二张清单 审美篇收官交付了第一张清单管「好看」,这一章交付第二张管「好用」。好看管第一眼,好用管接下来的每一天,而且交互的病更隐蔽:截图看不出来,要点起来才露馅。14 项,每项一个动作,点头之前过一遍。 状态齐不齐、危险操作可逆吗、流程还能砍吗、控件选对了吗、文案说人话吗。交互式清单可勾选,与审美、心理学两张清单配成一套 审美的验收看截图就行,交互的验收必须上手点:把网络调慢、把列表清空、把危险按钮按下去、把流程从头走到尾。下面 14 项就是这套动作的清单,按本章九节的顺序分组,每项都能直接当打回理由原话发给 AI。勾选进度存在本地,下次带着新产品回来接着用。 最后一项的出处:《About Face 4》第 8 章把好软件比作体贴的人,列了一整张体贴清单,「记性好」是里面最省事也最见效的一条。用户选过一次的城市、填过一次的发票抬头,第二次还要重填,就是软件在装失忆。 ## 工程指标及格了,用户为什么还骂慢?(感知性能) URL: https://xueai.miyang.cn/slides/psy-1.html 工程指标及格了,用户为什么还骂慢? 前面的章节教你把延迟压下来、把成本抠下来、把幻觉率降下来。这一章换一块秒表:用户脑子里那块。它和服务器的秒表走时不同,打分、续费、卸载都跟着它走。第一课先跑个实验,再把这块表的走时怪癖逐个拆开。 同一个 5 秒请求,空白冻结、转圈、流式、步骤外显四种呈现并排跑,亲身体验物理时长相同、体感差三倍;再认识用户秒表的三个走时怪癖 下面四个面板背后是同一次请求:同一个问题,同样 5 秒出完整答案。区别只有一个:这 5 秒里给用户看什么。点按钮让四个同时开跑,留意自己的体感。 方案 A · 空白冻结 方案 B · 转圈等待 方案 C · 流式输出 方案 D · 步骤外显 刚才多数人最难受的是空白面板。空白除了难受,还有个隐藏代价:它会放大你对时长的估计。感知时间研究把「一边等一边关注时间」的计时叫前瞻计时:注意力越多押在时间本身上,主观时长越膨胀,紧张情绪再把它拉长一截。Zakay 与 Block 的注意闸门模型是这条规律最常被引用的解释。结论先放这,你自己测一遍更有说服力。 点「开始」后,左边面板会进入一段没有进度、没有转圈、没有文案的等待。凭体感,觉得过了 8 秒就按停。尽量别在心里数拍子,那是作弊。 这就是空白冻结在数据后台看不见的那笔账:服务器记 5 秒,用户记 6 秒半。无反馈等待的高估误差,实验里两三成很常见。你产品的「体感延迟」比监控面板上的 P99 更糟,且差距由界面决定。 秒表既然开在用户心里,工程预算就要花在他计时的区间。下面这台聊天机器人的总时长锁死 5 秒,你只能动一个参数:首字时间 TTFT(从发送到看见第一个字)。拖滑块,点「重放」,右边按所选 TTFT 重演一次打字流,体感分跟着变。 把前面的体感整理成三条可复用的规律。每一档都有个 mini 演示,三档都切一遍。 用户的开表点在按下发送,收表点在看见第一个字。首字之后他的注意力交给了阅读,边读边到的内容几乎没被记进等待的账本。工程团队盯总时长的 P99,用户只记首字,两块表对不上,差评就从缝里钻出来。实验三里 TTFT 那根杠杆的长度,就是这条怪癖给的。 同一次等待:5 秒后答案落地。切换两种结局,看回忆里的时长怎么变。 物理上都是那一次 5 秒。追记式的时间靠事后重建,情绪越糟,重建出来的等待越长。所以延迟和幻觉在差评里常常挤进同一句话:又慢又蠢。答案质量的问题会连坐到速度头上;反过来,好答案也能替你把慢遮掉一截。第 4 课峰终定律会把这条用在结尾设计上。 AI 产品有三个天生毛病:慢(推理要时间)、会错(幻觉压不净)、不透明(用户看不见它在干嘛)。工程手段短期内只能缓解这三样,但用户的评价由感知产生,感知可以设计。你在前面章节学的流式输出、模型路由、语义缓存、Agent 进度汇报,每一个都还有一重心理学开关的身份,这一章教你什么时候为了心理效果去拨它。 慢、会错、不透明,每个毛病后面都排着几课;再往后是关系和钱。点卡片翻面,看每一课要解决用户的哪句抱怨。 ✅ 这一课想和你分享的 盯两块秒表:服务器计物理时长,用户从发送计到首字,考核指标里给 TTFT 单开一行 别让界面空白:无反馈等待会被放大两三成,超过 1 秒就给反馈,超过 3 秒就给进展 预算先压首字:接流式、先出提纲、分段返回,排期都在升级机器前面 错误当场兜住:时间记忆跟着情绪走,答非所问会把慢一起写进差评 ## 等待心理学:难受的从来不是那 5 秒(等待与过程设计) URL: https://xueai.miyang.cn/slides/psy-2.html 等待心理学:难受的从来不是那 5 秒 第 1 课你已经亲手测过:同样 5 秒,体感能差两三倍。这一课把背后的规律讲透。服务运营研究把排队心理总结成几条定律,条条能翻译成 AI 产品的设计决策,翻译完你会发现:大部分「太慢了」的差评,修的其实是呈现,模型一行都不用动。 排队研究三条定律配迪士尼与休斯顿机场案例;拖动耗时滑块看三档呈现决策:1 秒内直接出、10 秒内必须流式、超 10 秒转异步 人机交互研究里有一组用了几十年的经典阈值,出自 Jakob Nielsen《Usability Engineering》(1993,上溯 Miller 1968):0.1 秒内感觉是瞬间,1 秒内思路不被打断,10 秒是专注等待的极限。三道线切出三档呈现策略。拖动滑块,输入你手头功能的实际耗时,看它落在哪一档、该怎么呈现。 管理学者 David Maister 在 1985 年的《The Psychology of Waiting Lines》里给排队心理立了一组定律,游乐园、银行、机场用了四十年。两个教科书案例,值得逐个数字看。 排队入口的牌子写着「从此处起 40 分钟」,而实际多数时候 30 分钟就排到。游客非但不恼,反而觉得赚了 10 分钟。知道要等多久,大脑就能安排自己;没有刻度,就只能按最坏情况焦虑。 队伍本身也被设计过:蛇形折返让你每隔几十秒就往前挪一步,沿途的布景和预演短片让手里有东西看。同样的物理时长,被拆成了「一直在前进、一直有事干」的体验。 乘客抱怨取行李等太久,机场加人提效,把平均等待压到 8 分钟,投诉照旧。细看数据才发现问题:乘客下机走到转盘只要 1 分钟,剩下 7 分钟全程干站着。 后来的方案没再提速一秒:把到达口改远、行李分到最远的转盘,乘客要多走 6 倍的路,到转盘时行李刚好出来。总时长没变,投诉几乎清零。走路的人觉得自己在推进,干站的人才觉得自己在等。 Maister 那组定律里,对 AI 产品最要命的是三条。每条给你一对界面,亲手切换差的做法和好的做法,盯着焦虑值怎么变。三块面板里的转圈和进度条都是活的,多看几秒,体感更真。 没有刻度,大脑按最坏情况焦虑,第 10 秒左右开始怀疑它挂了。 裸转圈只回答「死没死」,回答不了「在干嘛」,大脑自动脑补最坏剧本。 白屏 3 秒,体感能顶别人 10 秒。眼睛没落点,秒表就走得格外慢。 场景:用户让 Agent 审一份 50 页的采购合同,全程约 25 秒。左边是聊天界面,现在只有一个干巴巴的「分析中」。右边四个设计动作对应刚学的定律,逐个勾上,看界面长出什么、焦虑值掉多少。 按历史耗时的偏高值报「30 秒」,25 秒完成是白赚的惊喜。等待从无底洞变成倒计时。 每换一个阶段说一句在干嘛,沉默变成直播。这些中间态第 3 课还要再用一次:它们本身就在给能力背书。 5 秒先给分析框架,用户边读边确认重点,手里不空,秒表就停了。 给一个随时离开的出口。多数人未必点,但知道能走,等待就有了退路。 Nielsen 那道 10 秒线是产品形态的分界线。超过它还让用户同步干等,注意力必然流失,这不叫体验瑕疵,叫设计事故。正确做法:把同步等待改成后台任务。点下面的按钮,亲眼看这一套怎么运转。 回头盘一盘成本。大模型原理篇讲过 chat/completions 的流式返回,动手实战篇讲过 Agent 的进度外显,它们在这一课的身份是心理学工具。那么问题来了,答完再看账单。 ✅ 这一课想和你分享的 先给任务定档:1 秒内直接出,1〜10 秒必须流式加进度,超 10 秒改后台任务加通知 逐条对照三定律修呈现:给预估、给解释、让手里有东西,焦虑值一条条降 预估宁高勿低:报 40 分钟实际 30 分钟是惊喜,反过来是背叛 先修呈现再修延迟:大部分「太慢」差评,模型一行不用动,账单便宜一个量级 ## 劳动错觉:让 AI 把努力演出来(等待与过程设计) URL: https://xueai.miyang.cn/slides/psy-3.html (以下为免费预览,全文见页面) 劳动错觉:让 AI 把努力演出来 第 2 课说等待要有反馈,这一课的结论更反直觉:有些等待根本没必要消灭。展示工作过程的产品,让用户多等几秒,满意度和信任反而更高。这个效应叫劳动错觉(Labor Illusion)。先做实验,再看研究,最后把边界画清。 哈佛实验:展示工作过程让用户多等反而更满意。秒回 vs 过程外显的 A/B 投票实验,思考外显与检索来源的一鱼三吃,外加三条不能越过的边界 同一个问题同时发给两个客服机器人,答案一字不差,区别只在拿到答案的方式。A 秒回,B 花 3 秒把工作日志逐条亮出来再作答。跑完凭直觉投票。 机器人 A · 秒回 0.3 秒直接给答案 机器人 B · 展示过程 3.5 秒,工作日志逐条亮起 这个效应出自哈佛商学院 Buell 和 Norton 2011 年的实验。被试在模拟的机票搜索网站上查航班:一组秒出结果,另一组要等 30 到 60 秒,但屏幕上滚动着「正在检查 Delta 航空…正在检查 United…」。结果展示劳动的那组满意度反超,部分条件下被试宁愿选等 60 秒但看得见工作的网站。下面把实验搬给你亲手跑。 ## 峰终定律:用户只记得峰值和结尾(等待与过程设计) URL: https://xueai.miyang.cn/slides/psy-4.html (以下为免费预览,全文见页面) 峰终定律:用户只记得峰值和结尾 诺奖得主卡尼曼发现:人对一段体验的记忆评分,几乎只由最强烈的那一刻(峰)和最后一刻(终)决定,和平均水平、持续时长关系不大。这条定律直接回答一个预算问题:最贵的模型、最多的优化精力,该花在会话的哪个位置。这一课五个实验,逐个上手。 四种会话剧本对比平均分与记忆分怎么背离;冷水实验的产品版:旗舰模型花在第一印象、校验前置护住最后一步、中段放心省钱 一次 10 轮的 AI 会话,每轮体验打 0 到 10 分。四个剧本轮流点开,看平均分(工程仪表盘量的)和记忆分(用户脑子里存的,近似算法:峰值与结尾的平均,出自卡尼曼)怎么背离。重点看剧本③:平均分四个里最高,记忆分垫底。 峰终定律的原始证据来自一篇标题就很挑衅的论文:Kahneman、Fredrickson、Schreiber 与 Redelmeier 1993 年发在《Psychological Science》的 When More Pain Is Preferred to Less: Adding a Better End(偏爱更多的痛苦,只因结尾好了一点)。被试要经历两场泡冷水试验,之后回答一个问题:如果必须再来一次,你选哪场。先猜猜多数人怎么选。 一只手泡进 14°C 的冷水里整整 60 秒,然后结束,拿毛巾擦手。 同样 60 秒 14°C,接着再泡 30 秒,水温悄悄升到 15°C:依旧难受,只是没那么刺骨。 这背后是卡尼曼在《思考,快与慢》里反复讲的分工:经验自我承受了每一秒(B 客观上多受 30 秒罪),记忆自我只拿峰值和结尾两帧存档打分。投票时到场的只有后者。1996 年 Redelmeier 与卡尼曼又在真实肠镜病人身上重复了结论:术程从 4 分钟到 69 分钟,事后痛苦评分和时长几乎无关,和峰值疼痛、最后三分钟的疼痛高度相关。这个现象有个专名:时长忽视(duration neglect)。 ## 信任校准:最好的用户是半信半疑的(信任与防御) URL: https://xueai.miyang.cn/slides/psy-5.html (以下为免费预览,全文见页面) 信任校准:最好的用户是半信半疑的 前四课都在给体验挣分,这一课踩一脚刹车:信任这个指标,目标值从来就没定在满分。AI 会出错是改不掉的物理现实,所以健康的用户长这样:该信的场景放心用,该查的场景留个心眼。往哪边偏都要交学费。这一课先看两笔真实学费,再给你三件能亲手拨弄的校准工具。 全信的把编造判例抄进法庭文书,不信的把 AI 变成摆设。六个场景亲手判断信任状态;可点开的引用、置信度代理信号、有条件的警告 2023 年纽约的 Mata v. Avianca 案:执业律师用 ChatGPT 检索判例,把 6 个查无此案的编造判例原样抄进法庭文书,法官逐个核实后律师吃了罚单、上了全球新闻。类似的事故此后接连发生:AI 的输出流畅、自信、格式规范,每一个表面特征都在诱导「它很靠谱」的判断,而这些特征和内容真伪互不相干。 另一头的翻车安静得多:企业买了 AI 工具,员工试了一次撞上错误,从此每条输出都逐句复核,复核成本超过自己写,最后干脆不用了。采购的钱照付,效率一分没涨。信任不足不上新闻,只出现在「AI 工具活跃率 8%」的内部复盘里。 判断口诀先给你:盯着「风险 × 可核验性」看,别盯着「AI 强大与否」看。同样是全盘采纳,用在周报上是校准,用在法庭上是过度。六个场景,你来当校准师。 ## 算法厌恶:AI 犯一次错,就被永久拉黑(信任与防御) URL: https://xueai.miyang.cn/slides/psy-9.html (以下为免费预览,全文见页面) 算法厌恶:AI 犯一次错,就被永久拉黑 上一课讲信任要校准。这一课讲校准路上最大的一块石头:人对 AI 的容错率,远低于对人。同样犯一次错,人类同事会被原谅,AI 会被弃用。这个不对称有实验、有数据、也有解药。 Dietvorst 实验:人看到算法犯一次错就弃用,哪怕它整体比人准。先投票亲测自己的偏心,再玩归因翻译器和微调权开关,看弃用率仪表怎么被四个杠杆拉回来 你是销售 VP,手上有两个销量预测来源,上季度它俩犯了一模一样的错:同样的数字、同样的原因。点你下季度打算继续用的那个。 宾大沃顿商学院,2015 年。Dietvorst、Simmons 和 Massey 让被试预测学生的学业表现,可以自己预测,也可以交给统计模型,预测得准有奖金。关键设计:先让一部分被试亲眼看到模型犯错。结果,看过模型犯错的被试大面积弃用模型,宁可用自己更差的判断,哪怕数据摆在眼前:模型的整体成绩比人高一截。论文标题就叫 Algorithm Aversion,算法厌恶。 偏心的根子在归因方式:同一种错误,用户脑子里给人和给 AI 记的账本不一样。下面六句用户的内心独白,判断每句是在评价人类同事还是AI。判完六句,三个心理根源自己浮出来。 ## 防御心理:用户不是不会用,是不敢用(信任与防御) URL: https://xueai.miyang.cn/slides/psy-6.html (以下为免费预览,全文见页面) 防御心理:用户不是不会用,是不敢用 很多 AI 功能的低使用率,复盘时被归因成「用户教育不够」,再做一轮引导弹窗,还是没人用。真正的原因常常是用户在防御:他看懂了你的功能,然后决定不碰。这一课先测你自己防不防,再拆三种防御的来源,最后把三板斧一把一把拨给你看,五个教具,逐个亲手玩。 数据、能力、责任三种防御,控制感、可逆性、透明三板斧;三个高防御设计亲手改造,小心埋着的安慰剂陷阱;转人工按钮的悖论 讲用户之前,先看看你自己。六道题,凭真实反应作答,答完画出你的防御画像。 刚才那六道题,两道一组,对应三种防御。它们各有心理学出处,也各有一句用户心里的潜台词。共同点:防御的用户往往说不出「我在防」,只会说「不太好用」,然后再也不打开。 越是高价值场景(合同、财报、客户名单),数据越敏感,防御越强。吊诡的是:AI 恰恰在高价值场景才最值钱,数据防御直接卡住了产品价值的兑现。训练开关其实存在,但用户不知道;不知道,就按最坏情况设防。 内部工具的头号杀手。员工把「用 AI」解读成「承认自己可被替代」,把使用数据解读成绩效监控。这种防御不会说出口,只表现为「试了一下,不太好用」。第 12 课认知卸载会展开它的另一半:怕的其实是「显得可替代」。 理性人的算计:用 AI 省 2 小时,出错背整口锅,期望收益为负,不用是对的。责任界面不清晰的 AI 功能,用户防御是理性行为。第 5 课信任校准给过解法:把人签字的环节留在流程里(HITL),谁确认、谁负责写清楚,防御才有得谈。 ## 心智模型:用户拿错了说明书(心智模型与拟人化) URL: https://xueai.miyang.cn/slides/psy-7.html (以下为免费预览,全文见页面) 心智模型:用户拿错了说明书 交互设计有个老概念叫心智模型:用户会带着一套「这东西应该怎么运作」的假设来用你的产品,假设错了,操作就错,然后差评打给产品,账算在你头上。AI 是人类历史上第一个「长得像老产品、内核两样」的东西,心智错配格外严重。这一课先认出四本错误说明书,再亲手玩三个纠正教具。 把 AI 当搜索引擎、当数据库、当会学习的学徒、当计算器,四种错配四类差评。四段对话找茬,再给空状态示例、边界前置、记忆外显三个纠正手段 聊天框长得像搜索框,回答长得像百科,界面像个耐心的客服。用户按外观匹配了四本旧说明书,每一本都会精准地制造一类差评。 四段对话,事故都已经发生。先判断用户拿的是哪本说明书,判完看解析:解析里带产品对策,诊断只是开始。 ## 拟人化的度,与 AI 道歉的艺术(心智模型与拟人化) URL: https://xueai.miyang.cn/slides/psy-8.html (以下为免费预览,全文见页面) 拟人化的度,与 AI 道歉的艺术 上世纪 90 年代,斯坦福的 Reeves 和 Nass 在《媒体等同》里报告了一组反直觉的实验:人会不由自主地对电脑讲礼貌、被电脑夸了会开心,明知对面是机器也照样套用社交规则。这叫 CASA 范式(把计算机当社会行动者)。它意味着拟人化根本由不得你选:用户一定会把你的 AI 当某种人对待,你能决定的只有让它当哪种人,以及它闯祸之后怎么开口。这一课五个实验,全部亲手玩。 CASA 范式:用户必然把 AI 当人,你只能选档位。五类产品对号入座;同一个错误四种道歉文案对比,三要素配方与服务补救悖论 先亲手验一遍 CASA。Nass 的经典实验:被试在电脑 A 上完成一项辅导任务,然后要给电脑 A 的表现打分。一组就在电脑 A 上填问卷,另一组被带到旁边的电脑 B 上填同一份问卷。猜猜哪组给 A 打的分更高。 既然退出无门,拟人化就成了一个连续的旋钮。下面是同一个电商客服,同一件事(包裹延迟两天),拖动滑块换档位,看它的头像、开场白和语气怎么变,再盯住右边两根仪表:用户期望值和伦理风险值跟着档位一起涨。「我不太确定这点」这类自然语言表达不确定的能力是拟人化的收益之一,第 5 课信任校准讲过;这个实验看它的另一面。 档位的选法有规律:任务越严肃、出错代价越高,档位越低;高频工具场景往低了拨;陪伴价值本身就是卖点时才敢开高档。五类产品,逐个选出它该在的档。 档位管平时,道歉管出事。场景:报销助手把用户的差旅报销总额多算了 800 元,被财务打回,用户回来质问。右边是对话现场,左边三个开关对应道歉的三要素,亲手拨开关,看回复怎么拼装、用户消气度怎么走。服务补救研究反复验证过这三件套:认错、解释、补偿,缺一角效果就塌一角。 认具体的错:哪张票、错多少,责任在谁。 一句话讲清为什么错,给用户一个能理解的因果。 修好,并且给一个用户点得开、查得到的证据。 ## 蜜月悬崖:宣传拉高的期望,要用留存来还(长期使用) URL: https://xueai.miyang.cn/slides/psy-10.html (以下为免费预览,全文见页面) 蜜月悬崖:宣传拉高的期望,要用留存来还 发布会上的演示惊为天人,上手第一天很兴奋,第三天开始挑刺,第三十天卸载。这条曲线你在无数 AI 产品上见过。它有两个成因:期望被宣传拉高了,新鲜感又天然会掉。两个都能设计。 期望确认理论:满意度等于体验减期望。先玩抽卡机看懂「演示是 P99、用户拿到 P50」,再拖宣传强度滑块看注册转化和三十日留存此消彼长,最后在期望曲线编辑器上拨三个杠杆 AI 产品在这道减法题上天生吃亏,原因藏在概率里。左边是发布会演示位,右边是用户真实使用。两边连的是同一个模型,点「生成」抽五次,看两边各拿到什么。 ## AI 标签折扣:同样的内容,标上 AI 就掉价(长期使用) URL: https://xueai.miyang.cn/slides/psy-11.html (以下为免费预览,全文见页面) AI 标签折扣:同样的内容,标上 AI 就掉价 内容没变,加四个字「AI 生成」,评价掉一截;工具很好用,用户却不想让同事知道自己在用。这两件事是同一个偏见的两面。做 AI 产品,标签什么时候必须亮、什么时候是自己给自己减分,是一道天天要做的题。 标注 AI 生成后评价系统性下降,用 AI 干活的人还怕被同事看见。双盲评分实验亲测折扣,五个场景判断标签亮不亮,措辞梯子看折扣差,最后选出用户敢分享的导出页 你是市场总监,实习生交来两版新品文案。凭第一感觉给两版各打个分,都打完才揭晓。 标签折扣有真实的研究支撑:多项实验里,同样的诗歌、文案、新闻,标注为 AI 生成后,被试给出的质量、可信度和喜爱度评分系统性走低,哪怕盲测时它们的得分并无差别。归因和第 6 课的算法厌恶同源:人们默认 AI 产出「没有心」,于是折价。 ## 认知卸载:用户一边用你,一边怕自己废掉(长期使用) URL: https://xueai.miyang.cn/slides/psy-12.html (以下为免费预览,全文见页面) 认知卸载:用户一边用你,一边怕自己废掉 你的重度用户里藏着一批矛盾的人:离了你的产品干不了活,又隐隐觉得自己正在废掉。这份焦虑不会写进 NPS 评语,但它决定续费、决定推荐,也决定他会不会在某天突然「戒掉」你。焦虑的名字叫认知卸载,它能被产品设计接住。 谷歌效应证明人会把「能查到的」从脑子里删掉,AI 把外包范围从记忆扩大到思考。选外包清单看哪些卸载危险,拖 Copilot 到 Autopilot 的定位滑块,拨开关把回答从「替你想」改成「带你想」 同一款 AI 代码助手,两版定位文案,功能完全相同。你是买单的工程 VP,点你更愿意给全团队买的那版。 2011 年,Sparrow、Liu 和 Wegner 在《Science》发了个著名实验:让被试往电脑里输入冷知识,告诉一半人「会保存」、另一半人「会被删除」。结果,相信会保存的那组,记住的内容显著更少。大脑很经济:外部存储可靠,内部就不备份了。这叫谷歌效应,认知卸载研究的起点。 卸载不是新鲜事,你早就不背电话号码了。问题是哪些能放心外包、哪些要想清楚。六项认知外包,逐个判断:放心外包,还是想清楚再外包。 ## 情感依恋:用户爱上你的产品之后(长期使用) URL: https://xueai.miyang.cn/slides/psy-13.html (以下为免费预览,全文见页面) 情感依恋:用户爱上你的产品之后 拟人化那课讲过:人会不由自主地把机器当社会角色对待。这一课讲它走到深处的样子:用户对 AI 产生真实的情感依恋。它带来最强的留存曲线,也带来产品经理职业生涯里最重的责任。这不是陪伴类产品的专属课题,任何一个有对话框的产品都躲不开。 依恋是真实的,Replika 2023 事件证明了深度和风险。依恋信号分级器给六条用户消息判级,点开 Replika 四幕时间线,再拨三层安全阀:身份提醒、脆弱话题转介、无常性披露 你是一款 AI 助手的 PM,下面六条来自真实用户会话的消息摆在面前。给每条分级:正常使用、依恋信号(值得关注的情感投射)、需要干预(产品必须有预案的时刻)。 依恋能深到什么程度,2023 年有个完整的天然实验。Replika 是一款 AI 伴侣应用,千万级用户,事件的四幕按顺序点开。 ## 付费心理:为一个概率商品掏钱,痛在哪(付费与定价) URL: https://xueai.miyang.cn/slides/psy-14.html (以下为免费预览,全文见页面) 付费心理:为一个概率商品掏钱,痛在哪 AI 是个奇怪的商品:付同样的钱,这次生成惊艳,下次翻车,成本还在你看不见的地方按 token 跳动。用户口袋里的每一块钱都连着神经,怎么收钱,决定了掏钱疼不疼。这一课讲付费的心理侧,下一课讲定价的数字侧。 打表焦虑模拟器亲手体验按量计费怎么让每次追问都疼一下,切到包月看同一段对话的心情差;心理账户四题看同一笔钱换框架痛感差多少;三个额度开关把免费额度从成本变成转化器 你在用一个按量计费的 AI 助手改方案,右上角是计费表。连点四次「继续追问」,注意两件事:表跳的时候你的眼睛在哪,和下面那条「内心独白」怎么变。然后切到包月,同一段对话再走一遍。 Prelec 和 Loewenstein 1998 年提出「支付疼痛」:付钱这个动作本身激活的是类似生理疼痛的反应,而且付费和消费耦合得越紧,越疼。出租车计价器是教科书案例:你享受服务的每一秒,都在看着钱变少。按 token 计费的 AI 是数字版计价器,用户每次追问前都要先过一道「值得吗」的心理审批,审批多了,人就不问了。 ## 定价心理:锚点、诱饵与体面的价格歧视(付费与定价) URL: https://xueai.miyang.cn/slides/psy-15.html (以下为免费预览,全文见页面) 定价心理:锚点、诱饵与体面的价格歧视 上一课讲怎么收钱不疼,这一课讲收多少。先记住一个反直觉的事实:用户对价格没有客观感受,全部判断来自参照物。参照物是可以摆的,这门手艺有一百年历史,AI 产品还拿到了一件独有的新工具。 复刻经济学人的诱饵实验:没人选的档位撤掉后销量大变;拨开关搭自己的定价页锚点;判断五种价格歧视哪些体面哪些找死;最后选出不挨骂的涨价邮件 这是行为经济学史上最著名的定价实验,《怪诞行为学》开篇就是它。《经济学人》真实刊登过这张订阅价目表,先选你自己会订的那档,选完看 MIT 学生的选择数据。 Economist.com 全年在线阅读权限 纸质杂志全年寄送 纸质杂志全年寄送,外加在线阅读权限 卡尼曼和特沃斯基证明过:人对数字的判断会被先看到的数字拽着走,哪怕那个数字是转轮盘转出来的,这叫锚定。诱饵效应更进一步:往选项里放一个明显不划算的选项,它没人选,却改变了其他选项的相对吸引力。印刷版单独卖 $125 就是诱饵:它唯一的工作,是让「加 $0 送电子版」的套餐显得像捡漏。 ## 反馈心理:用户为什么不点踩(反馈设计) URL: https://xueai.miyang.cn/slides/psy-16.html (以下为免费预览,全文见页面) 反馈心理:用户为什么不点踩 你在回答旁边放了 👍 和 👎,指望用户帮你标数据。一个月后一看:点踩率 0.4%,但流失率在涨。不是产品没问题,是不满的用户根本不点踩,他们直接走。这一课讲反馈的心理成本,和不靠用户开口也能听见的办法。 一千个不满意的用户,点踩的只有十几个。反馈漏斗模拟器看沉默偏差怎么层层吃掉信号,六种用户行为判读隐性信号(重新生成、复制、编辑),点踩后的体验对决:反馈要有即时回报 1000 个用户刚拿到一条糟糕的回答。左边是他们变成「一次点踩」要闯的四关,每关都在漏人。先看清现状,再拨右边三个开关,看漏斗能撑多宽。 客服研究里这叫沉默偏差:经典的 TARP 研究发现,多数不满的客户不投诉,直接换品牌。AI 产品的点踩按钮把门槛降到了一次点击,还是没人点,因为拦路的从来不是操作成本,是心理成本,有三种。无效感:点了有用吗?上次点踩之后什么也没发生,这个按钮八成是摆设。自我否定成本:点踩等于承认「我提问的方式不行」或「我选的这个工具不行」,尤其当初是自己拍板买的(承诺一致,书单课讲过)。关系成本:拟人化是双刃剑,产品越像「他」,点踩越像当面给人差评,CASA 范式的礼貌效应甚至让用户对着问卷都不好意思说 AI 坏话。 ## 九本书,把这一章读厚(延伸书单) URL: https://xueai.miyang.cn/slides/psy-books.html (以下为免费预览,全文见页面) 九本书,把这一章读厚 这一章的每个结论都有出处,课里只给了你压缩版。这一节把原书排上书架:九本书,拆出十九条 PM 必须懂的心理学原理,每条都标注它在 AI 产品上的落点。别按顺序啃,先选你现在最头疼的问题。 卡尼曼、诺曼、西奥迪尼、塞勒到《媒体等同》,九本书拆出十九条 PM 必须懂的心理学原理,每条标注 AI 产品落点与回看课节;按你产品当前的困惑选书,读完做一轮原理连线小测 点一个困惑试试,书架和下面的速查表会一起变。 ## 收官 · 十六个效应一张表,外加上线前十四问(专题收官) URL: https://xueai.miyang.cn/slides/psy-final.html (以下为免费预览,全文见页面) 十六个效应一张表,外加上线前十四问 这一章的每个心理效应都对应一个你早就学过的工程开关。收官把它们排成一张表,再给一份能直接抄进上线流程的检查清单。心理学不玄:它只是把「用户为什么这样反应」从猜测变成了规律。 从感知性能到沉默偏差,十六个心理效应 × 工程杠杆完整对照,右列全是学过的开关;可勾选的上线前十四问检查清单,附十一份延伸阅读 拿你正在做(或正在用)的 AI 产品对照自查,能勾几个?勾不满不丢人,不知道自己缺哪块才丢人。 ## AI 产品心理学 · 40 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/psy-interview.html (以下为免费预览,全文见页面) AI 产品心理学 · 40 道灵魂拷问 心理学章学完了,能不能把「用户为什么这样反应」讲成可执行的方案,一问便知。这 40 个问题来自三个真实场景,先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:感知性能 / 峰终取舍 / 信任校准 / 防御拆除 / 算法厌恶 / 标签折扣 / 情感依恋 / 付费与定价 / 沉默偏差 / 体验指标怎么写进 OKR ## 和用户对赌的生意(定价即架构) URL: https://xueai.miyang.cn/slides/cost-1.html 和用户对赌的生意 不知道你有没有这种感受:我们总想为用户提供更好的 AI 服务,但在商业化层面,是和用户在对赌——产品用得越好,用户用得越多,利润反而越薄。看到消费账单的时候,不知道会不会窒息。 看到消费账单会窒息吗?Token 成本不只是财务账单,更是延迟与吞吐量的直接映射。这一章讲怎么把它抠下来 一个订阅制 AI 产品的简化账本:会员费固定,Token 成本跟着用量走。拖动「人均日调用次数」,看看当用户真的爱上你的产品时,账本发生了什么。 这就是「对赌」的含义:你的最忠诚用户,同时是你成本表上最贵的一行。靠涨价和限流硬顶只是缓兵之计,真正的出路是让每一次调用本身变便宜——这正是后面十二节要干的事。 Token 的价格牌不是财务部门随手定的,它精确反映了推理算力的边际成本曲线:Prefill 与 Decode 的算力差异、KV Cache 的显存占用、长上下文的注意力开销。所以每一条定价规则背后,都藏着一条给工程师的暗语: 💰它是账单 每百万 Token 几块钱,乘上调用量就是月账单。千万级调用下,10% 的浪费就是一个人的工资。 ⚡它是延迟 输入越长,Prefill 越久,首字延迟越高。用户还没看到第一个字,耐心可能已经消磨没了。 🧠它是质量 上下文塞得越满,有效信息越容易被废话淹没。高信噪比 = 高智能,省 Token 常常顺带提升效果。 Token 是怎么数出来的、中文为什么天生贵、报价表怎么读出 T0 / T1 / T2 三个梯队。 GLM 的 200 Token 输出断崖、Qwen 的 32k 输入红线、图片的 32 像素对齐税。价格跳变的边界线,就是架构设计的红线。 循环执行让 Input 累积膨胀,I/O Ratio 高达 62:1;四大成本陷阱与熔断机制。 语法层砍格式税、语义层做双重蒸馏、架构层保 KV Cache 命中、输出层管住模型的嘴。 省 Token 的本质是提高信息密度。附 18 份按主题分类的延伸阅读。 AI 商业化是和用户的对赌。固定收费 + 按量成本的组合下,最忠诚的用户就是最贵的用户。 Token 成本三重身份:账单、延迟、质量。省 Token 不是抠门,是同时优化三件事。 定价即架构。价格牌反映算力成本曲线,读懂它,把应用设计到便宜的那一侧。 内容来源:本章整理自作者的团队内部分享《AI Token 降本增效策略分享》(2026)。文中价格均为作者当时拿到的折后价,仅用于演示计算方法,实际请以各厂商官网实时报价为准。 ## Token 怎么数:BPE 与隐形的 Token 税(定价即架构) URL: https://xueai.miyang.cn/slides/cost-2.html Token 怎么数:BPE 与隐形的「Token 税」 账单按 Token 结算,但 Token 到底是怎么数出来的?它既不是字符,也不是单词,而是基于统计规律生成的「子词」。理解这套规则,你才会明白:同样一句话,中文为什么天生比英文贵 2 倍。 从字符到子词的演进、BPE 的合并规则,以及中文为什么天生贵 2 倍;「给主人留下些什么吧」的诡异合并 早期 NLP 走过两个极端。词级别分词语义明确,但英语几十万个单词加上词形变化(look / looks / looking / looked),词表直接爆炸,还处理不了没见过的新词(OOV 问题)。字符级别分词什么词都拆得开,但序列太长、单个字符信息量太低,推理效率极差。 现代大模型选择了中间路线——子词分词(Subword Tokenization):常见的词保留为完整 Token,不常见的词拆成有意义的片段。词表控制在 32k 到 200k 之间,既不爆炸,又什么都能表示。 GPT 系列、Llama 3 都用 BPE(Byte-Pair Encoding,字节对编码)。它的词表不是人工编的,而是从语料里「合并」出来的: 初始化:把语料库全部拆成最小单位(对 Unicode 文本先做 UTF-8 编码,以字节为单位)。 统计频次:数一数所有相邻字节对在语料库里出现的频率。 合并最频繁的一对:比如 "u" 和 "g" 经常相邻,就合并成新符号 "ug" 加入词表。 迭代:重复第 2、3 步,直到词表达到预设大小——Llama 2 是 32,000,GPT-4 的 cl100k_base 是 100,277。 推理时反过来查:常见词 "hug" 直接是一个 Token;生僻词 "bug" 拆成 ["b", "ug"] 两个。词表越大、你的文本越「常见」,Token 就越少,账单就越薄。这就是为什么 GPT-4 换用 10 万词表后,还专门把多层缩进的空格序列并成单一 Token——代码生成的效率直接翻了几倍。 主流模型的 Tokenizer 训练语料以英文为主,BPE 学到的合并规则高度偏向英语词汇。结果是:非拉丁语系(中文、日文、韩文)在 Token 化时面临严重的效率劣势,业界称之为「Token 税」。 语言 示例 Token 数 比率 现象解释 英语 Donald John Trump 3 ~0.75 Token/词 常见单词直接映射为 1 个 Token 中文 唐纳德·约翰·特朗普 6 ~1.5 – 2.5 Token/字 常见字是 1 个 Token,生僻字被拆成 2–3 个字节 Token 韩语 도널드 존 트럼프 7 ~1.5 – 3.0 Token/字 编码空间覆盖不足,经常回退到字节编码 表达同样的语义,中文用户要消耗比英文用户多 2 倍以上的 Token:既多付了 API 的钱,又变相缩短了上下文窗口。 点选一句话,对比它的中英文版本各要消耗多少 Token(按典型比率估算)。想看精确切分,去 OpenAI Tokenizer 亲手试。 英文有天然的护栏:BPE 合并前先按空格预分词,合并只发生在单词内部,Token 边界基本符合语言学直觉。中文没有空格,BPE 只能完全依赖统计共现频率来决定边界——一段文本(哪怕是一句毫无逻辑的广告语)在语料里重复出现千万次,BPE 就会把它整个合并成一个「不可分割的最小语义单元」。 最有名的例子是「给主人留下些什么吧」:这句网络博客时代的高频留言,在 GPT 的词表里被强行合并成了独立 Token,成了著名的「故障 Token」。这不是段子,是 BPE 统计逻辑的必然产物。 Token 是统计出来的子词,不是字符也不是单词。BPE 按语料频率迭代合并,词表大小是超参数。 中文天生要交 Token 税:同样语义比英文多花 2 倍以上,还变相缩短上下文窗口。估算预算时别按英文经验拍脑袋。 词表决定压缩率。cl100k_base 十万词表 + 空格合并优化,是 GPT-4 代码效率高的直接原因。选模型时 Tokenizer 效率也是成本参数。 内容来源:整理自作者团队内部分享《AI Token 降本增效策略分享》第一部分「Token 的构成」。BPE 细节可参考 OpenAI Tokenizer 与 tiktoken 开源库。想复习分词和词表的底层原理,回看大模型原理 · 词表与训练。 ## 报价表速览与三大梯队(定价即架构) URL: https://xueai.miyang.cn/slides/cost-3.html (以下为免费预览,全文见页面) 报价表速览与三大梯队 把常用模型的定价摊开在一张表上,你会看到三个清晰的梯队。但仅仅知道哪个贵、哪个便宜是远远不够的——真正的成本刺客,藏在那些价格跳变的边界线里。 T0 旗舰 / T1 主力 / T2 走量怎么分工;光知道哪个贵不够,要盯住价格跳变的边界线 下面是作者团队当时主要使用的模型定价(已折算折扣后,单位:元 / 百万 Token)。三列分别是非缓存输入、缓存输入、输出——注意缓存价普遍只有标准价的两成甚至更低,这个巨大的差价就是第 11 节 KV Cache 的伏笔。 模型 档位 输入(非缓存) 输入(缓存) 输出 GLM-4.6(355B A32) Input ≤32k · Output ≤200 1 0.2 4 Input ≤32k · Output >200 1.5 0.3 7 Input 32k–200k 2 0.4 8 Qwen3-Max Input 0–32k 1.6 0.32 6.4 Input 32k–128k 3.2 0.64 12.8 Input 128k–252k 4.8 0.96 19.2 Qwen-Plus(235B A30) 0–128k · 非思考 0.4 0.08 1 0–128k · 思考模式 0.4 0.08 4 Qwen-Flash Input 0–128k 0.075 0.015 0.75 Input 128k–256k 0.3 0.06 3 GLM-4.5V / 4.5-Air Input 0–32k 1 0 3 Input 32k–64k 2 0 6 红色数字是「跳档后」的价格。同一个模型内部,价格能差 2–3 倍——这些边界线是第 4、5、6 节的主角。 ## GLM 的短输出博弈:200 Token 断崖(三大跳档陷阱) URL: https://xueai.miyang.cn/slides/cost-4.html (以下为免费预览,全文见页面) GLM 的短输出博弈:200 Token 断崖 观察 GLM-4.6 的定价结构,会发现一个神奇的设计:它不按输入长度分档,而是按输出长度分档,分界线在 200 个 Token。输出 199 和输出 201,适用完全不同的价格。 输出 199 和 201 是两种价格,连输入都回溯涨价;拖动滑块看账单跳变,四种应对策略 指标 Output ≤ 200 Output > 200 变化幅度 输出单价 4 元/M 7 元/M +75% 输入单价 1 元/M 1.5 元/M +50% 最容易被忽略的一点:只要输出超过 200 Token,前面传入的几千个 Token 的输入也要按更高的价格重新结算。输出多写两个字,整单回溯涨价。 这反映了推理算力的边际成本曲线。短输出(<200 Token)非常轻量:Decode 阶段压力小、KV Cache 占用有限,可能几十毫秒就完成了。但输出一旦变长,每多生成一个 Token,KV Cache 就多占一份显存,Attention 就多算一轮——成本非线性增长。 ## Qwen 的阶梯逃逸:32k 红线(三大跳档陷阱) URL: https://xueai.miyang.cn/slides/cost-5.html (以下为免费预览,全文见页面) Qwen 的阶梯逃逸:32k 红线 Qwen 系列的分档逻辑和智谱完全不同:按输入长度计费,分界线在 32k 和 128k。最容易被忽略的计费细节是——越线后不是「超出部分加价」,而是整个请求全量按高价档结算。 多 1k Token 整单翻倍的全量结算逻辑;预算感知截断,别再为 RAG 垃圾付双倍的钱 输入长度(Qwen3-Max) 单价(元/M,折后) 相对基准 0 – 32k 1.6 1x 32k – 128k 3.2 2x 128k – 252k 4.8 3x 假设你的输入是 33,000 个 Token,仅比 32k 多了 1,000。整个请求的全部 33k Token 都按 3.2 元/M 结算——不是前 32k 按 1.6 元、后 1k 按 3.2 元。多出来的这 1k,直接让整单成本翻倍。 拖动输入长度,注意 32k 和 128k 两条红线附近发生了什么。 在 RAG 场景这个问题尤其尖锐。假设检索回来 5 个文档片段,拼起来刚好 33k。这时候需要问一个问题:第 5 个片段对最终回答的贡献有多大? 如果它是核心的法律条款、关键的技术参数,那可能值得。但如果它只是网页页脚、版权声明、重复的段落,甚至只是格式带来的多余换行符呢?一些粗放的 RAG 策略,正在为垃圾付双倍的钱。 ## 图片 Token:像素也要交税(三大跳档陷阱) URL: https://xueai.miyang.cn/slides/cost-6.html (以下为免费预览,全文见页面) 图片 Token:像素也要交税 文字 BPE 是「合并字符」,图片编码是「切割像素」。你以为传的是原图,其实模型按缩放对齐后的分辨率计费——这里面藏着和文字 32k 红线一模一样的跳档陷阱。 输入分辨率实时算 Token 的计算器;32 像素对齐跳档、分辨率诅咒与图片成本三条红线 视觉模型把图片切成固定大小的像素块,每块对应一个 Token。以通义千问 VL 为例,核心公式是: 变量 含义 说明 h̄ / w̄ 缩放后的高与宽 会被强制对齐到 32(或 28)的整数倍 token_pixels 每个 Token 对应的像素数 Qwen3-VL 是 32×32=1,024;QVQ / Qwen2.5-VL 是 28×28=784 +2 固定开销 视觉起止标记 GPT-4o 和 Gemini 用的是图块(Tile)机制:GPT-4o 每个 512×512 图块约 170 Token,Gemini 1.5 Pro 每个 768×768 图块约 258 Token。类比理解:文字的词表大小决定压缩率,图片的像素块大小决定压缩率——32×32 比 28×28 更省。 选一个常见分辨率,或者自己拖宽高。注意 1000×1000 和 1025×1025 这对「孪生陷阱」。计费假设:Qwen3-VL,token_pixels = 1,024,输入价 1 元/M(32k 内标准档)。 ## 输入主导:62:1 的 I/O Ratio(Agent 的账单) URL: https://xueai.miyang.cn/slides/cost-7.html (以下为免费预览,全文见页面) 输入主导:62:1 的 I/O Ratio 普通 Chatbot 是一问一答;Agent 是「思考 → 行动 → 观察 → 再思考」的循环。关键认知:每一轮的 Input 都包含了全部历史信息——轮次越多,Input 越长,成本累积膨胀。 Agent 每一轮都要重读全部历史。逐轮点开一个 Excel 任务,看 Input 怎么滚到 31,460 Token 普通 Chatbot 问「讲个笑话」(10 Token),答 150 Token——I/O Ratio ≈ 1:15,输出主导。而 Agent 做一个代码修复任务:System Prompt、工具返回、历史输出,全都要在每一轮里重新读一遍。三轮下来,总 Input 16,790、总 Output 270——I/O Ratio 62:1,输入主导。 ## Agent 四大成本陷阱与熔断(Agent 的账单) URL: https://xueai.miyang.cn/slides/cost-8.html (以下为免费预览,全文见页面) Agent 四大成本陷阱与熔断 上一节看到的还只是「一次成功的执行」。真实世界里,Agent 的账单事故来自四个方向:工具返回爆炸、思考税、死循环、历史雪球。每一个都有对应的工程解法。 工具返回爆炸、思考税、死循环、历史雪球:每个陷阱配一个能落地的策略,外加三条红线 用户说「帮我查一下数据库里所有用户的订单」,Agent 调 SQL 工具返回 10,000 条记录 ≈ 500,000 Token。这 50 万 Token 会被塞进下一轮 Input:直接触发高价区、甚至撑爆上下文窗口,模型还会因信息过载而「迷失」,输出质量反而下降。解法是给所有工具套一层截断保护: Qwen-Plus 思考模式、DeepSeek-R1、o1 这类模型会生成「思考过程」:用户可能看不到,但全部按 Output 计费,而且单价还翻 4 倍(Qwen-Plus 非思考输出 2 元/M,思考模式 8 元/M)。同一个 Agent 任务开启思考模式后:可见输出不变(450 Token),思考过程 +2,000 Token,输出费用暴涨 +2,078%。 任务类型 思考模式 理由 简单检索 ❌ 关闭 不需要深度推理 数据清洗 ❌ 关闭 规则明确,不需要「想」 复杂推理 ✅ 开启 值得为准确率付费 代码生成 ⚠️ 视情况 简单函数关闭,复杂架构开启 进阶解法:用 0.6B 级的极小模型做前置分诊,先花几厘钱判断这个请求需不需要深度思考,再决定路由到哪个模式——这就是第 3 节「T2 给 T0 打下手」的具体形态。 ## 语法层:Prompt 是写给机器的(四层实战优化) URL: https://xueai.miyang.cn/slides/cost-9.html (以下为免费预览,全文见页面) 语法层:Prompt 是写给机器的 进入实战四层的第一层。很多产品早期为了调试方便,或者干脆是让 AI 代写的提示词,习惯用 ###、** 加粗、JSON 展示数据。这些对人类友好的排版,在大模型的计费逻辑里全是「词法税」。 加粗的 ** 就吃掉 8.5% Token;复杂对象用 YAML、扁平列表用 CSV、后台输出强制 Minified JSON 作者做了一个 Token 可视化分析工具(yusuan.ai/analyzer),把一段精简版 Lyra 提示词丢进去分析:光是加粗用的 ** 符号,就吃掉了 8.5% 的 Token。算上列表、标题符号、JSON 缩进换行,这份提示词 13% 都是格式性内容。一般产品的 Prompt 里,10%–20% 都是这种装饰性 Token。 ## 语义层:双重蒸馏(四层实战优化) URL: https://xueai.miyang.cn/slides/cost-10.html (以下为免费预览,全文见页面) 语义层:双重蒸馏 格式的税砍完了,往深一层看内容本身。RAG 和长文档场景里最常见的工程错误:把上下文窗口当垃圾桶——Few-Shot 案例、检索文档全怼进去,让模型自己辨识。能用,但不该这样用。 中段迷失效应:塞得越多越抓不住重点。动态 Few-Shot 从 4000 砍到 500,LLMLingua-2 压缩 5-20 倍 第一,贵而且慢。Transformer 自注意力的计算复杂度是 O(N²):提示词长度翻倍,计算量翻四倍。提示词越长,Prefill 越久,首字延迟越高——用户还没看到第一个字,耐心已经消磨没了。 第二,效果可能更差。有效信息被废话淹没后,会产生「中段迷失」效应。就像人读长文章:开头认真看(要搞清楚讲什么),结尾也留意(快出结论了),中间那一大坨——眼睛扫过去,脑子没过去。你精心挑选的参考资料如果不幸落在中段,模型可能根本没认真看。 色条模拟模型对 Prompt 各位置的注意力强度(绿=强,灰=弱)。拖动长度,看中段怎么塌下去。 ## 架构层:KV Cache 的注意事项(四层实战优化) URL: https://xueai.miyang.cn/slides/cost-11.html (以下为免费预览,全文见页面) 架构层:KV Cache 的注意事项 在商业化产品的降本增效中,KV Cache 是最被低估的技术点之一。命中缓存和没命中,最高差 90% 的成本——但里面有几个隐形的坑,不说你可能不知道。 前缀匹配最高省 90%;动态切换工具为什么把缓存全打穿,滑动窗口 vs 章节缓存 大模型的本质是「Token 推 Token」:它不关心你问的是什么问题,只关心前文是什么。这意味着——如果两次请求的前缀相同,模型其实在重复计算同样的内容。KV Cache 就是把算过的中间结果存下来,下次遇到相同前缀直接复用:用廉价的存储换昂贵的实时计算,「空间换时间」。 举个例子:你问「2 + 4 = ?」,它算出 6。再问「3 + 4 = ?」,前缀变了,只能从头算。但如果问的是「2 + 4 + 1 = ?」——前缀「2 + 4」没变,模型直接从 6 开始算出 7。只要前缀不变,缓存就能命中。DeepSeek、Qwen、智谱都支持这个能力(回看第 3 节报价表:缓存价只有标准价的 1/5),这是作者挑选大模型 API 时必看的一项。 上一次请求已经缓存了完整前缀。点下面三种「这一次的请求」,看命中(绿)和重算(红)的部分。 ## 输出层:管住模型的嘴(四层实战优化) URL: https://xueai.miyang.cn/slides/cost-12.html (以下为免费预览,全文见页面) 输出层:管住模型的嘴 实战四层的最后一层。输出 Token 比输入贵好几倍(回看第 3 节报价表),而且直接决定接口返回速度。管住模型的嘴,有三类合适的操作:指令层、代码层、工程层。 明确的负向约束砍掉 30% 废话;润色用 Diff 别重写整段;停止序列做物理截断 很多人知道要求「请简洁回答」,但这是有问题的——「简洁」对模型来说太抽象了,它不知道你要多简洁。有效的写法是把「别干什么」列清楚: 实测下来,Agentic 场景能砍掉 30% 的废话。说白了就是告诉它:别整那些有的没的,直接上结果。 ## 算力时代的极简主义(专题收官) URL: https://xueai.miyang.cn/slides/cost-final.html (以下为免费预览,全文见页面) 算力时代的极简主义 做完这几层优化,你基本上已经跑赢 90% 的粗放型 AI 产品了。收官这一节,把整个专题串成一张清单,再聊聊「省钱」背后的那件更重要的事。 每一个 Token 都在为最终结果贡献价值吗?全景清单回顾 + 十八份按主题分类的延伸阅读 回顾一下,我们聊了 BPE、报价梯队、跳档陷阱、Agent 账单、YAML 格式、压缩算法、KV Cache、停止序列……看起来都是在省钱、抠成本。但往深了想:省 Token 这件事,本质上是在提高信息密度。过滤掉格式噪音、文档废话、重复计算之后,喂给模型的都是干货。密度越高,注意力越不容易分散,幻觉也越少。 还有个副产品:快。Token 少了,首字出得快,端到端延迟短——C 端产品里,这直接决定用户愿不愿意继续用。下次审工程化方案时,用一个标准卡一卡:这里的每一个 Token,都在为最终结果贡献价值吗?如果不是,考虑把它干掉。把算力留给真正的思考——这才是 AI 时代精益计算的美学。 开篇:Token 成本是财务、延迟、质量的三重映射,AI 商业化是和用户的对赌。BPE:中文天生贵 2 倍的 Token 税。报价表:T0/T1/T2 三大梯队,缓存价只有标准价 1/5。 GLM 200 断崖:输出多 2 个 Token,连输入都回溯涨价。Qwen 32k 红线:越线全量结算,预算感知截断。图片税:32 像素对齐 + 分辨率诅咒,按任务分级。 输入主导:每轮重读全部历史,I/O Ratio 62:1,总量平方级膨胀。四大陷阱:工具截断 2k 上限、思考模式分级、三条熔断、历史「固定+摘要+最近 3 轮」。 语法层:装饰 Token 占 10–20%,YAML/CSV/Minified JSON。语义层:动态 Few-Shot 省 87.5%,LLMLingua-2 压 5–20 倍。架构层:前缀稳定命中 KV Cache 省 90%,别动态切工具、别滑动窗口。输出层:负向约束砍 30% 废话、Diff 润色、停止序列。 三条通用红线 阈值 动作 单次输入 < 32k Tokens 预算感知截断(RAG、多图、多轮历史通用) Agent 轮次 < 10 轮 熔断机制兜底 I/O Ratio 监控 > 50:1 Agent 在空转,先查流程 ## 都 2026 年了,为什么还要懂数据结构?(为什么 AI 时代还要懂) URL: https://xueai.miyang.cn/slides/ds-1.html 都 2026 年了,为什么还要懂数据结构? AI 都会写代码了,还要学这个「程序员基本功」吗?先说结论:你可以不写代码,但要会验收 AI 写的代码。这一章不背定义、不手写链表,只给你一副能看穿代码的眼镜。第一课先玩个游戏。 一个贯穿全章的隐喻:数据结构 = 收纳方式。亲手玩一局「找钥匙」,体会选错收纳有多慢;再看不懂结构的人怎么把 AI 写的慢代码直接上线 同样 36 件杂物,左边一股脑塞进大抽屉,右边按类别放进了分格收纳盒。现在钥匙 🔑 不见了——点下面的按钮,看两边各要翻多少次才能找到。 🗄 一只大抽屉 什么都往里塞,找东西只能从头翻到尾 🗃 分格收纳盒 按类别分格:找钥匙?直接开「随身物品」那格 你可能会说:收纳是程序员的事,AI 替我写代码,它收纳去。问题是——AI 两种都可能写。同一句需求「查用户是否在会员名单里」,AI 给出的两个版本都能跑通、界面上看不出任何差别。拖动名单人数,看看差别藏在哪。 8 种收纳方式,每一种都不用背——因为它们全都藏在你已经学过的 AI 概念里。点卡片翻面,看看每种结构在 AI 世界里的真身。 ✅ 这一课想和你分享的 数据结构 = 收纳方式:同样的数据,收纳不同,找起来差一个量级 AI 两种都可能写:能跑通 ≠ 收纳对了,差别要到数据变多才爆发 你的角色是验收:不用会写,但要看得出「这里为什么用大抽屉」 不用背定义:8 种结构全在你学过的 AI 概念里,接下来逐个揭底 ## 数组:你聊的每句话都躺在里面(线性结构:你天天在用) URL: https://xueai.miyang.cn/slides/ds-2.html 数组:你聊的每句话都躺在里面 上一课说好了:数据结构 = 收纳方式。第一种收纳方式你其实天天在喂它数据——你和 AI 的每一段对话,在程序眼里就是一个 message list,而 message list 的真身,是最朴素的收纳方式:一排编了号的格子,叫数组。这一课先把你的对话摊开来看,再顺手回答一个老疑问:为什么聊久了它会忘事。 message list 就是一个数组:对话历史怎么排队、上下文截断为什么掐头不掐尾;顺便看数组中间插一条数据有多贵 下面就是一个 message list:每条消息占一个格子,格子上方是它的索引(编号,从 0 开始数——程序员的老习惯)。点「发一条消息」,看新消息落在哪;再拖「上下文窗口」滑块,留意哪些格子变灰了、哪个格子永远不灰。 数组的格子在内存里是紧挨着排的,中间不许有空位。这带来一个麻烦:想往中间塞一个新元素,右边的所有元素都得挨个往右搬一格给它腾地方。点任意一个格子,在它的位置插入一颗 ⭐,盯着「搬动次数」;再点「在末尾追加」对比一下。 看家本领:按编号直达 想拿第 3 条消息?messages[3],不用从头数,一步到位。因为格子紧挨着排,编号本身就是地址——这叫 O(1),翻译成人话是「不管数组多长,耗时都一样」。按位置取数据,数组是所有收纳方式里最快的,没有之一。 软肋:中间插入贵 你刚才亲手搬过了。顺带认识一个亲戚:链表——它中间插入很便宜(改两根「下一个是谁」的指针就行),代价是失去了按编号直达,找第 100 个得从头挨个走。没有全能的收纳方式,只有取舍。对话这种「只追加、常整段读」的场景,数组完胜,所以 message list 用它。 ✅ 这一课想和你分享的 message list 就是数组:一排编了号的格子,每条消息躺一格,索引从 0 开始 索引直达 O(1):按位置取数据,数组是最快的收纳方式 上下文截断 = 数组切片:留 system + 最近 K 条,「掐头不掐尾」,这就是聊久了忘事的真相 中间插入贵、末尾追加便宜:所以对话历史只往后长(append-only) 收纳方式都是取舍:链表中间插得快但没了直达——场景决定选择 ## 栈:Cmd+Z 和「爆栈」的秘密(线性结构:你天天在用) URL: https://xueai.miyang.cn/slides/ds-3.html (以下为免费预览,全文见页面) 栈:Cmd+Z 和「爆栈」的秘密 第二种收纳方式长得像一摞盘子:只能从最上面放、也只能从最上面拿,这叫栈。听着限制很大?可你每天按的撤销键、程序里每一次函数调用,靠的都是它。这一课先亲手玩坏一个文档再一键撤回来,最后围观一场「爆栈」事故——全球最大的程序员问答网站 Stack Overflow,名字就是从这场事故来的。 后进先出:撤销键、函数调用、Agent 的子任务都靠它。亲手压栈弹栈,再看一次没写终止条件的递归是怎么把栈压爆的 左边是个迷你文档,用四个按钮随便折腾它。留意右边:你的每一步操作都被压成一张牌,叠在「操作栈」上——后做的压在上面。折腾够了,连按几下「Cmd+Z 撤销」,看看它撤的顺序。 📄 迷你文档 随便操作,别心疼 🥞 操作栈 每步操作压一张牌,最上面 = 最近一步 ## 队列:Agent 的活是排着队干的(线性结构:你天天在用) URL: https://xueai.miyang.cn/slides/ds-4.html (以下为免费预览,全文见页面) 队列:Agent 的活是排着队干的 上一课的栈是「后进先出」,这一课把方向掉个头:先进先出,一头进、另一头出——就是食堂打饭的那条队。别嫌它朴素,AI 服务能扛住一万个人同时提问、Agent 能有条不紊地干完一串任务,靠的都是这条队。这一课你来当调度员:亲手开动一条流水线,把它玩到积压、再救回来。 先进先出:任务队列、消息队列、生产者消费者。拖动生产和消费的速度,看队列什么时候积压、什么时候空转 左边的用户不停发请求,请求排进中间的队列,右边的 Agent 工人从出口那头按顺序取走处理(先来的先办)。流水线滚到这里会自己开动。玩法:先把「请求量」拖到最大,看队列多久变红;再把「处理速度」也拉上去,看积压怎么被消化掉。 ## 哈希表:为什么它找东西快到不讲理(哈希与缓存:空间换时间) URL: https://xueai.miyang.cn/slides/ds-5.html (以下为免费预览,全文见页面) 哈希表:为什么它找东西快到不讲理 还记得第一课的伏笔吗?「查会员名单」的版本 B 用了一行 set.has(user),名单从 100 人涨到 1000 万人,耗时纹丝不动。当时说好第五课揭底——今天就把这个「直达」的魔术拆给你看:它根本不翻,它是算出来的。 把 key 亲手塞进桶里,看哈希函数怎么把「翻一遍」变成「直达」;再看两个 key 撞进同一个桶时怎么收场 回到收纳的比喻:大抽屉找东西要挨个翻,是因为你不知道东西在哪。哈希表的思路彻底反过来——放进去的那一刻,就用一条固定的公式算出它该放在几号桶;要找的时候,用同一条公式再算一遍,直接开那个桶。这条公式就叫哈希函数,它是一张「定位公式」:不用翻,一步算出在哪。 下面是 8 个编号 0 到 7 的桶,和 6 个等着入住的名字。点一个名字,看它怎么三步进桶:先把每个字变成电脑里的编码数字并求和,再对 8 求余(因为只有 8 个桶),最后飞进算出来的那个桶。留意:全程没有「挨个对比」这个动作,位置完全是算出来的。 ## 缓存:AI 账单的隐形折扣(哈希与缓存:空间换时间) URL: https://xueai.miyang.cn/slides/ds-6.html (以下为免费预览,全文见页面) 缓存:AI 账单的隐形折扣 上一课的哈希表解决了「怎么瞬间找到」,这一课解决另一个问题:算过的东西,别再算第二遍。你在模型价格表上见过的「缓存命中五折甚至一折」,账单上省下的每一分钱,背后都是同一种收纳方式——把算过的结果存起来,下次直接取。 KV Cache 和语义缓存都是同一招:算过的别再算。拖动命中率滑块实时看账单变化——Harness 核心篇成本优化的底层原理 你算过一次「37 × 89 = 3293」,第二天有人又问你 37 × 89 等于几——你会重新列竖式吗?不会,你直接报答案。缓存就是电脑的这种「直接报答案」:把算过的结果按 key 存进上一课的哈希表,下次遇到同样的 key,一步直达取结果。哈希表管「存哪、怎么找」,缓存管「什么值得存」。两课合起来才是完整的「空间换时间」。 大模型每生成一个字,都要「回头看」前面所有 token,给每个 token 算一份注意力的中间结果。关键在于:只要前缀一模一样,这些中间结果就一模一样——那第二轮对话还重算它干嘛?下面每个小方块是一个 token,先点「播放第一轮」,再点「播放第二轮」。留意第二轮里绿色方块出现的速度:它们没有被计算,是直接从缓存取的。 ## 树:Coding Agent 眼里全是它(树与图:AI 的主场) URL: https://xueai.miyang.cn/slides/ds-7.html (以下为免费预览,全文见页面) 树:Coding Agent 眼里全是它 前面几课的收纳方式都是「一排排」的,这一课换个维度:一层套一层的收纳。衣柜里有格子,格子里有盒子,盒子里有袋子——这种「层级 + 包含」的收纳方式,在编程世界叫「树」。而 Coding Agent 抬眼望去,你的项目里全是树。 文件目录、JSON、网页 DOM、代码语法树——AI 读你的项目时看到的是一棵棵树。点开一段代码,亲眼看它变成 AST 假设你让 AI 帮你做一个「奶茶店小程序」。下面三个标签页,分别是这个项目的文件目录、一笔订单的 JSON 数据、点单页的网页 DOM——三样东西看着完全不同,请你点击带箭头的节点展开收起,留意一件事:它们的形状是不是一模一样?都是一个根往下分叉。 ## 图:从知识图谱到多 Agent 协作(树与图:AI 的主场) URL: https://xueai.miyang.cn/slides/ds-8.html (以下为免费预览,全文见页面) 图:从知识图谱到多 Agent 协作 上一课的树规矩得很:每个节点只有一个爹,永远不绕圈。可现实世界的关系乱多了——你的朋友互相也是朋友,公司和学校和人搅在一起。把「每个节点只能有一个爹」这条规矩撕掉,树就升级成了图:节点 + 关系,想怎么连怎么连。这一课看图在 AI 世界的两大主场。 节点加关系就是图:社交网络、知识图谱、Agent 工作流 DAG。点一个节点,看关系怎么一层层扩散出去 下面是一张迷你知识图谱:圆点是实体(人、公司、学校、产品),连线是关系。点击任意一个节点,看它的关系怎么一圈圈扩散出去——留意扩散的「跳数」:一跳是直接认识的,两跳是「朋友的朋友」。 ## 词表与 Trie:Tokenizer 的切词秘密(大模型肚子里的数据结构) URL: https://xueai.miyang.cn/slides/ds-9.html (以下为免费预览,全文见页面) 词表与 Trie:Tokenizer 的切词秘密 还记得大模型原理篇那个细节吗——分词器把「五花肉」切成一整块词元,而不是三个字。当时我们说「常见组合当一个整体」,这次揭底层:分词器是怎么在几万个词里,瞬间认出「五花肉」该整块拿走的?答案是一种叫 Trie(前缀树)的收纳方式——把词表按「共享开头」挂成一棵树。 大模型原理篇见过分词,这次看底层:一棵前缀树怎么把「五花肉」整块认出来。亲手沿着 Trie 走一次分词 假设词表里有这些词:五、五月、五花肉、今天、天、天气、吃、花、好。按第一个字、第二个字……一层层挂起来,共享开头的词就共享树枝——「五月」和「五花肉」挤同一根「五」枝。带绿色 ✓ 的节点表示「走到这里是一个完整的词」;注意「五→花」那个节点没有 ✓:它只是路过的中转站(「五花」不是词)。 ## 向量:RAG 检索是在「找最近的邻居」(大模型肚子里的数据结构) URL: https://xueai.miyang.cn/slides/ds-10.html (以下为免费预览,全文见页面) 向量:RAG 检索是在「找最近的邻居」 学 RAG 时我们说过:Embedding 把一段话变成一串数字。这串数字到底是什么?答案简单得出奇——是坐标。给每句话发一个「语义地图」上的位置,意思越近、位置越近。于是「检索资料」这件事,就变成了小学生都会的游戏:在地图上找离你最近的邻居。 Embedding 把语义变成坐标,相似度就是距离。在平面上拖动查询点看最近邻怎么变,再看 HNSW 为什么能在亿级向量里瞬间找到 下面是一张迷你语义地图:12 个词已经被 Embedding 安排好了座位,自然聚成三个「街区」。拖动黑色的 ❓ 查询点(或点击地图任意位置放置它),留意:连线永远指向最近的 3 个词,距离实时变化,最近的那个戴 👑。把 ❓ 拖到两个街区中间,看看邻居怎么换人。 ## 汇总 · 八种结构一张决策表(篇章汇总) URL: https://xueai.miyang.cn/slides/ds-summary.html (以下为免费预览,全文见页面) 汇总 · 八种结构一张决策表 十课走完,八种收纳方式全部揭底。这一页不讲新东西,只做一件事:把它们摆上同一张桌子,让你以后看到场景就能报出结构名。先扫一遍决策表,再玩选型器和快问快答,检验自己是不是真的能给 AI 写的代码把关了。 数组/栈/队列/哈希表/缓存/树/图/向量各自的强项弱项与 AI 里的真身;点选场景,看该用哪种收纳方式 每行一种结构:一句话口诀、最亮的强项、最疼的弱项、它在 AI 世界的真身、哪一课讲的。留意「弱项」那一列——选错结构的代价,全写在那里。 结构 一句话口诀 强项 弱项 AI 里的真身 出处 📚数组 排排坐,按号找 按位置直达、末尾追加快 中间插入 / 删除要全体挪位 message list:你和 AI 的每句对话都躺在里面 第 2 课 🥞栈 后进先出 撤销、回溯、原路返回 只能动最上面那一个 Cmd+Z、函数调用、Agent 的子任务;递归失控就「爆栈」 第 3 课 🚶队列 先进先出 排队公平、削峰兜底 不能插队,中间的取不到 任务队列、消息队列:Agent 的活是排着队干的 第 4 课 🗃哈希表 算出位置,一步直达 查找 / 去重快到不讲理 没有顺序,还要多花内存 Set / 字典、session 查找、缓存的键、语料去重 第 5 课 💾缓存 算过的别再算 省时间也省钱 何时作废最难拿捏 KV Cache、语义缓存、浏览器缓存、CDN——账单的隐形折扣 第 6 课 🌳树变体:Trie 前缀树 层层分叉,按层级找 天然表达嵌套与从属 只认父子关系,平级互连表达不了 文件目录、JSON、AST;Trie 是 Tokenizer 切词的秘密 第 7 / 9 课 🕸图 万物皆可连 表达任意多对多关系 容易绕圈,遍历成本高 知识图谱、社交网络、多 Agent 协作的 DAG 工作流 第 8 课 🧭向量 语义变坐标,相似即邻近 按「像不像」找东西 结果是近似的,还得配专门索引 Embedding + RAG 检索:找最近的邻居;HNSW 让亿级瞬答 第 10 课 ## 把 AI 写的代码「验收」一遍(你现在能做什么) URL: https://xueai.miyang.cn/slides/ds-build.html (以下为免费预览,全文见页面) 把 AI 写的代码「验收」一遍 整章都在说「你可以不写代码,但要会验收」——今天就验一次真的。三档任务按投入挑一个:30 分钟能完成最轻的那档,一周能把验收变成你的工作习惯。每档都配了直接可用的提示词。 三档任务:让 AI 解释它选的数据结构、要求换一种实现对比利弊、给你自己的项目挑一次收纳方式 ## 数据结构 · 30 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/ds-interview.html (以下为免费预览,全文见页面) 数据结构 · 30 道灵魂拷问 数据结构篇学完了,收纳方式的直觉建立了没有,一问便知。这 30 个问题来自三个真实场景,先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:数组 vs 链表 / 哈希碰撞 / 树的遍历 / 缓存设计 / 向量检索 / 场景选型 ## Big-O:一眼看穿代码要跑多久(复杂度:一眼看穿代码值不值) URL: https://xueai.miyang.cn/slides/algo-1.html Big-O:一眼看穿代码要跑多久 姊妹篇讲完了「数据结构 = 收纳方式」,这一章讲另一半:算法 = 做事的套路。评价一个套路好不好,程序员有一把统一的尺子,叫 Big-O。别被数学符号吓到——它回答的问题只有一个:数据变多的时候,你的代码会慢多少?今天用三个交互把这把尺子装进你脑子里。 拖动数据量滑块,看 O(1)、O(log n)、O(n)、O(n²) 四条曲线怎么分道扬镳;数据翻十倍,谁不动声色、谁当场爆炸 四种常见「套路」的耗时曲线:O(1) 灰(不管多少数据都一步到位)、O(log n) 绿(每次砍一半)、O(n) 蓝(挨个过一遍)、O(n²) 红(每个都要和每个比)。拖动滑块把数据量从 10 拉到 10 万,右侧是按「1 亿次操作/秒」换算的真实耗时。留意:前半段四条线挤在一起——数据小时啥算法都快,这正是 Demo 骗人的原因。 换个更直接的问法:老板说「用户量要翻十倍」,四种套路各自会慢多少?点「×10」按钮,连点三次,看差距怎么滚雪球。 尺子拿到手了,来验一验。三段伪代码,各选一个复杂度。诀窍:别读懂每一行,只看「数据变多时,它要多干多少活」。 ✅ 这一课想和你分享的 Big-O 只看趋势:它不关心一次跑多快,只关心「数据变多时耗时怎么涨」 常数不重要、趋势要命:慢 2 倍能忍,随 n² 增长等于判死刑 数据小时看不出来:四条曲线在 Demo 阶段挤在一起,差距要到数据变多才爆发 n² 是大部分卡顿事故的元凶:验收代码先找嵌套循环 ## 为什么上下文越长越贵?O(n²) 的账单(复杂度:一眼看穿代码值不值) URL: https://xueai.miyang.cn/slides/algo-2.html 为什么上下文越长越贵?O(n²) 的账单 上一课你拿到了 Big-O 这把尺子,还记得那条起飞的红线吗?今天带你去看大模型里最有名的一个 O(n²)——注意力机制。学完你会突然理解一堆老问题:为什么长对话越来越卡、为什么上下文窗口是「窗口」不是「仓库」、为什么大家拼命做上下文压缩。 注意力机制要让每个 Token 看所有 Token:拖动上下文长度,看计算量和账单按平方往上蹿——长对话变卡变贵的根源 前面的课程讲过:大模型生成每个新词元(token)时,都要「回头看」前面所有的词元,给每个词分配注意力权重,才知道接下来该接什么。一个 token 看一遍所有 token——这句话用上一课的语言翻译一下:n 个 token,每个都要看 n 个,总共 n × n 次「对视」。这就是一张 n×n 的表格。拖滑块画给你看。 下面每一行代表「一个 token 要看所有 token」,深色对角线是它看自己。留意右边的格子总数:滑块只是匀速往右拖,数字却越跳越猛——这就是「平方增长」的手感。 同样问一句「帮我总结一下重点」,一个人先把历史精简到 1 万 token,另一个人把 10 万 token 的完整记录原样塞进去。token 只差 10 倍,看看账单差多少。留意「注意力计算量」那一行:它不是 ×10,是 ×100。 ① 为什么长对话越来越卡 聊得越久,n 越大,每生成一个新 token 要做的「回头看」就越多。卡顿不是网络问题,是 n² 在后台滚雪球。 ② 为什么要做上下文压缩 Compaction 把旧对话摘要成一小段再继续聊。牺牲一点细节,换 n 大幅变小——n 砍一半,计算量砍四分之三,划算。 ③ 为什么 KV Cache 能省钱 前缀部分算过的注意力结果缓存下来、下轮不重算(姊妹篇 ds-6 讲过)。正因为原始计算是 O(n²) 的贵,缓存的折扣才这么值钱。 ✅ 这一课想和你分享的 注意力是 O(n²):每个 token 都要回头看所有 token,n×n 张表逃不掉 上下文不是免费的仓库:塞进去的每个 token 都会被后面所有 token 反复看 翻 10 倍 = 贵 100 倍:计算量按平方涨,这是长对话变卡变贵的根源 精简上下文 = 省钱省时间:压缩、摘要、KV Cache 全是在和这个 n² 搏斗 ## 二分查找:猜数字游戏的最优解(查找与排序) URL: https://xueai.miyang.cn/slides/algo-3.html (以下为免费预览,全文见页面) 二分查找:猜数字游戏的最优解 上一课那条最省心的绿线 O(log n),今天揭开它的真面目。你小时候玩过「我想了个 1 到 100 的数,你猜」吗?猜数字的最优策略,就是计算机科学里最经典的算法之一——二分查找。先玩,再讲理。 玩一局 1 到 100 猜数字,体会每猜一次范围砍一半;十亿条数据 30 次就能找到——log n 快到什么程度 系统已经想好了一个 1 到 100 之间的数。下面的条带就是全部候选:点任意数字开猜,我会告诉你大了还是小了,被排除的数字会自动变灰。先按直觉乱猜一局记下次数,再点「按二分猜」看标准答案。留意:二分每猜一次,亮着的区域正好砍掉一半。 ## 排序:冒泡和快排的赛跑(查找与排序) URL: https://xueai.miyang.cn/slides/algo-4.html (以下为免费预览,全文见页面) 排序:冒泡和快排的赛跑 上一课说了,二分查找的门票是「先排好序」。那排序本身贵不贵?看你用什么套路。今天安排一场公开赛:同一组乱序数据,冒泡排序和快速排序同时开跑,谁先把柱子从矮到高排整齐谁赢。先看小数据,再上 60 根柱子——差距会让你印象深刻。 两种排序同场竞技的可视化动画:看冒泡怎么一步步挪、快排怎么分区跳跃;数据量一大差距有多悬殊 规则:两条泳道、同一组随机柱子、同样的动画节奏(每一步耗时相同),公平竞赛。留意三件事:①黄色 = 正在比较的柱子 ②紫色 = 快排选中的「基准」③绿色 = 已就位。先用 10 根感受节奏,再点 60 根看差距。 🫧 冒泡排序 ⚡️ 快速排序 ## 排序在 AI 里的真身:Rerank(查找与排序) URL: https://xueai.miyang.cn/slides/algo-5.html (以下为免费预览,全文见页面) 排序在 AI 里的真身:Rerank 上一课的排序比的是数字大小,但 AI 世界里排的是「相关性」:RAG 从知识库捞回来一堆段落,谁排前面谁就能挤进上下文——排错了,模型就会一本正经地引用错误资料。这个「打分 + 重排」的环节叫 Rerank。今天你亲自上岗,当一次 Rerank 模型。 RAG 检索回来的段落不能直接用:先粗排再精排。亲手调整权重,看候选段落怎么重新洗牌——推荐流和搜索结果同理 场景:用户在客服机器人里问「你们的退货政策是什么?」,粗排从知识库捞回 5 条候选段落。每条有三项分数:向量相似度(意思相近)、关键词命中(字面匹配)、新鲜度(文档新旧)。你手里有三个权重滑块,总分 = 三项分数加权平均。留意:初始只重相似度,排第一的其实是 2023 年的旧版政策——试试加大「新鲜度」权重,看正确条款怎么登顶。 你刚才干的活,在真实系统里是「精排」——漏斗的最后一层。完整的流程长这样(滚到这里自动播放): ## 递归:把大事拆成同一件小事(递归与分治) URL: https://xueai.miyang.cn/slides/algo-6.html (以下为免费预览,全文见页面) 递归:把大事拆成同一件小事 「做个官网」听着吓人,「写首页的三行文案」谁都会。工程进阶篇里你见过 Coding Agent 接到大需求后自己列小任务清单——它用的思路有个名字:递归。这一课不写一行代码,点一棵任务树、拖一根滑块,你就能拿到这个程序员嘴里最玄的词。 遍历目录、拆解任务、画分形树,套路都一样:自己调用自己。看 Agent 怎么把「做个官网」递归拆成能动手的小任务 老板丢来一句话:「给奶茶店做个官网」。这活没法直接动手——但可以拆。点下面的卡片,把大任务一层层拆开;拆到✋「能直接干了」的小活为止,再点「开工」。留意两件事:拆的时候是自上而下一层层展开;干完的时候,绿色是自下而上「冒泡」汇拢回去的。 递归最神奇的地方是:规则只有一条,结果可以无限复杂。下面这棵树的全部说明书就一句话(写在图下方)。拖动滑块加深「拆解层数」,留意:每根新枝都是上一根的缩小版——规则从头到尾没变过,变的只是规模。 ## 分治:上下文压缩的算法原理(递归与分治) URL: https://xueai.miyang.cn/slides/algo-7.html (以下为免费预览,全文见页面) 分治:上下文压缩的算法原理 动手实战篇讲过:对话太长装不下时,AI 会做一次 Compaction——把旧对话压成摘要。当时说「像搬家前把杂物打包」,这一课揭开包装纸:它是一个有两千年历史的算法套路,叫分治。上一课的递归是「拆」,这一课补上另一半:「拆完再合」。 动手实战篇的 Compaction 其实是分治:把长对话切段、各自摘要、再合并。亲手跑一次递归摘要,看信息怎么被层层压缩 下面是一段你和 AI 讨论装修方案的完整对话,12 条消息约 3600 token,眼看要把上下文窗口塞爆了。点「开始压缩」,留意三幕动作:先切(分成三段)、再治(每段各自收成一条摘要)、最后合(三条摘要并成一条)——顶部的 token 计数器会告诉你压掉了多少。 刚才三幕动作有个正式名字:分治(Divide and Conquer)。教科书里它最出名的代言人是归并排序——把一列数切成小段、每段排好、再两两合并。归并排序排的是数,Compaction 压的是话,骨架一模一样: ## BFS 与 DFS:Agent 在代码库里找文件(搜索与决策) URL: https://xueai.miyang.cn/slides/algo-8.html (以下为免费预览,全文见页面) BFS 与 DFS:Agent 在代码库里找文件 工程进阶篇里,Coding Agent 接到「找出登录报错的原因」后,会在几百个文件夹里翻代码。往哪儿翻?先翻完这层再下去,还是抓住一条线索钻到底?这是两种截然不同的性格——BFS(广度优先)和 DFS(深度优先)。这一课让它们各走一遍同一个迷宫,性格一眼见分晓。 走迷宫动画看两种搜索的性格:一层层扫 vs 一条道走到黑;Coding Agent 的 grep 检索、网络爬虫都是它们的变体 🏁 是起点,🎯 是终点,深灰是墙。两个按钮各代表一种性格,留意三处:染色的形状(BFS 是一圈圈的波纹,DFS 是一条蛇);下方两个计数器;以及最后绿色高亮的路——谁的更短?谁探过的格子更多? ## 贪心与采样:AI 选词时的两种性格(搜索与决策) URL: https://xueai.miyang.cn/slides/algo-9.html (以下为免费预览,全文见页面) 贪心与采样:AI 选词时的两种性格 大模型原理篇你看过 AI 逐词元续写时脑子里的候选概率条,也调过 Temperature 旋钮。当时是「体感」,这一课给它算法学的名字:每步挑最大的叫贪心,按概率掷骰子叫采样。同一个开头,两种性格各生成三次——差别一眼就能看穿。 每步都挑最大的就是贪心解码,按概率掷骰子就是采样——Temperature 背后的算法学。亲手对比两种策略生成的句子 开头固定是「周末的计划是」。先玩上面这台:贪心模式(temperature=0),每步永远选概率条最长的那根。连点三次「再生成」,留意下方堆叠的结果列表——有没有哪怕一个字的不同? 😤 贪心模式 再玩下面这台:采样模式,每步按概率加权掷骰子。先在 0.7 档连点三次,看结果是不是各不相同;再切到 1.2 档试试——留意概率条的形状变化:温度越高,条与条越接近,冷门词翻身的机会就越大。 🎲 采样模式 ## Beam Search:往前多看几步再选(搜索与决策) URL: https://xueai.miyang.cn/slides/algo-10.html (以下为免费预览,全文见页面) Beam Search:往前多看几步再选 上一课留了个坑:贪心每步拿眼前最大的,可能一步错、步步错。填坑的办法朴素得可爱——别急着定,多留几条候选路一起往前走,走完了比总分。这就是 Beam Search(束搜索)。下面这张「词格」,让三种走法同台竞技。 贪心一步错步步错,Beam Search 同时留几条候选路往前探。交互对比两种策略走出的句子,理解「先想再答」的直觉来源 开头固定「这家店的」,往右走 4 步,每步 3 个候选词。按顺序点三个按钮,留意三件事:贪心(红线)第一步就抓住概率 0.5 的「菜」,但后面的路越走越窄;Beam=2(蓝线)同时养两条路,被淘汰的变灰;Beam=3 连第一步只有 0.2 的「装修」都留着——最后谁的累计分最高?右下角的计算量又差多少? ## AI 都会做题了,还要刷 LeetCode 吗?(AI 时代的算法学习观) URL: https://xueai.miyang.cn/slides/algo-11.html (以下为免费预览,全文见页面) AI 都会做题了,还要刷 LeetCode 吗? 这是全章被问得最多的问题。答案不是简单的「要」或「不要」——不同岗位差别很大。这一课不灌鸡汤,把 2026 年的面试行情实话实说:什么岗位还在考、考到什么档位、什么岗位早就不看了。先找到你的位置。 面试现状实话实说:什么岗位还在考、考到什么档位、什么岗位早就不看了。点选你的目标岗位,对号入座 点一张卡,看这个岗位的面试还考不考算法、工作中真正用在哪、以及给你的一句话建议。内容是基于 2026 年行情的经验判断,不同公司差异很大,仅供参考。 ⚠️ 以上是 2026 年主流行情的经验总结,头部大厂、初创公司、外企的口径可能完全不同——面试前一定查目标公司的近期面经。 同一场技术面试,考察重心这几年发生了明显位移。点切换年份,看四块能力的比重怎么变(示意图,非精确统计)。 ## 用 AI 学算法的正确姿势(AI 时代的算法学习观) URL: https://xueai.miyang.cn/slides/algo-12.html (以下为免费预览,全文见页面) 用 AI 学算法的正确姿势 上一课说了「还值得学」,这一课解决「怎么学最快」。关键一步是把角色换过来:你出题它把关,而不是它出手你围观。三个提示词模板直接拿去用,再做 5 组对比题校准一下你的姿势。 让它出题、让它当考官、让它逐行讲复杂度——三个立刻能用的提示词模板,把 AI 从「替你做题」变成「陪你练题」 ## 汇总 · 五类算法思想对照表(篇章汇总) URL: https://xueai.miyang.cn/slides/algo-summary.html (以下为免费预览,全文见页面) 汇总 · 五类算法思想对照表 十二课走完,该收网了。这一章其实只讲了五类思想,每类都在 AI 里有个真身。这一页一张大表带走全章,再用 8 道场景题测测你能不能「一眼定位」——看到问题就知道该动哪类思想。 复杂度/查找排序/递归分治/图搜索/贪心采样,每类对应 AI 里的一个真实机制;一张表带走全章 思想 一句话口诀 AI 里的真身 对应课程 📈复杂度 Big-O 先问「数据翻十倍会怎样」 注意力是 O(n²):上下文越长,计算量按平方涨,账单也是 algo-1algo-2 🔍查找与排序 有序就砍半,乱序先排好 Rerank:RAG 检索回来的段落先粗排再精排,本质就是排序 algo-3algo-4algo-5 🪆递归与分治 大事拆成同一件小事 Compaction:长对话切段、各自摘要、再合并,就是分治 algo-6algo-7 🧭图搜索 BFS/DFS 一层层扫,或一条道走到黑 Coding Agent 找文件:在代码库里遍历目录、顺着引用链深挖 algo-8 🎲贪心与采样 每步挑最大,或按概率掷骰子 Temperature / Beam Search:AI 选词的两种性格与「多看几步」 algo-9algo-10 ## 给 AI 写的代码做一次复杂度体检(你现在能做什么) URL: https://xueai.miyang.cn/slides/algo-build.html (以下为免费预览,全文见页面) 给 AI 写的代码做一次复杂度体检 算法篇的收官实战:拿一段真实的 AI 代码,走一遍自报 → 优化 → 实测的完整体检流程。三档任务按投入挑一个,30 分钟起步;走到第三档,你会亲眼看到 AI 自报的复杂度有没有吹牛。 三档任务:让 AI 自报复杂度、要求优化一档并说清代价、用大数据量实测验证它没吹牛 ## 算法 · 30 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/algo-interview.html (以下为免费预览,全文见页面) 算法 · 30 道灵魂拷问 算法篇学完了,复杂度的直觉建立了没有,一问便知。这 30 个问题来自三个真实场景,先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:Big-O 直觉 / 二分的前提 / 递归的风险 / BFS vs DFS / 采样策略 / AI 时代还考算法吗 ## 79 个 Workspace 成员如何组成产品(系统地图) URL: https://xueai.miyang.cn/slides/12-1.html 79 个 Workspace 成员如何组成产品 根 Cargo.toml 列出 79 个成员,其中 crates/codegen/ 占 62 个。理解这套系统,要沿组合入口、交互界面、Agent 宿主、领域能力、推理状态五条主轴阅读。 按入口、Agent 运行时、工具和基础设施还原 Cargo Workspace 的真实分层 Workspace members 根清单的实际成员数。根文件首行注明它是自动生成的 workspace root。 Codegen members 主体集中在 crates/codegen/,另有 build、common、prod 与 third_party。 阅读主轴 组合入口、TUI、Shell 宿主、领域能力、推理与状态,避免套用虚构的四层目录。 沿依赖定位职责 从 xai-grok-pager-bin/Cargo.toml 出发,分别找出 TUI 库与 Agent 宿主依赖。再到 xai-grok-sampler/src/actor/mod.rs 和 xai-chat-state/src/actor/mod.rs 写下二者各自拥有的状态。 ## Rust 技术选型:事实与推断(系统地图) URL: https://xueai.miyang.cn/slides/12-2.html 为什么 Rust 合适:先分清事实与推断 源码能证明 Rust 2024、Tokio、强类型建模和原生二进制产物。技术选择背后的组织动机没有写入源码,本课只给出有边界的课程推断。 从源码可验证事实出发,分析类型系统、并发安全和分发方式带来的工程取舍 Rust 2024 [workspace.package] 明确设置 edition = "2024"。 Tokio 全功能 workspace 依赖使用 Tokio 1,并启用 full feature。 强类型状态 enum、Result、newtype 与 Actor handle 广泛用于边界建模。 二进制目标 xai-grok-pager-bin 定义一个名为 xai-grok-pager 的 bin target。 仓库直接支持的结论 入口创建 Tokio 多线程 runtime。 会话另建 current-thread runtime 与 LocalSet。 release-dist 配置 panic、LTO、codegen units 等原生发布参数。 类型系统承载 Agent、Session、Sampler、Prompt 等领域边界。 可讨论的工程收益 原生二进制便于把 CLI 与运行时一起交付。 所有权与 Send 边界有助于管理多线程会话。 强类型适合复杂协议、工具参数和状态转换。 代价包括编译时间、生命周期约束与更高学习门槛。 这些是基于代码形态的解释,不代表 xAI 官方披露的选型原因。 Grok Build 与 Claude Code 给每条结论贴标签 判断下列陈述属于「源码事实」还是「课程推断」:使用 Rust 2024、入口采用 Tokio、多线程一定更快、xAI 为降低内存占用选择 Rust。最后两条缺少仓库直接证据。 ## 从真实 main() 到第一轮采样(系统地图) URL: https://xueai.miyang.cn/slides/12-3.html (以下为免费预览,全文见页面) 从真实 main() 到第一轮采样 实际入口位于 xai-grok-pager-bin/src/main.rs。同一个组合入口解析命令与交互模式,再把工作交给 TUI 或 Shell Agent 宿主。 追踪入口、会话创建、提示词渲染、模型采样与流式返回的完整调用链 ## Session Actor:线程、状态与取消边界(Agent 核心循环) URL: https://xueai.miyang.cn/slides/12-4.html (以下为免费预览,全文见页面) Session Actor:线程、状态与取消边界 每个 Session 在独立 OS 线程上运行 current-thread Tokio runtime 与 LocalSet。SessionActor 协调 turn,ChatStateActor 串行拥有对话状态,CancellationToken 负责协作式终止。 梳理会话状态所有权、消息流转、后台任务与 CancellationToken 的中断路径 SessionActor 协调 run_session 同时接收 SessionCommand、ChatStateEvent、SessionEvent 与 turn completion。 maybe_start_running_task 启动待处理 turn。 turn 完成后执行 completion、turn end 和后续通知处理。 ChatStateActor 拥有状态 专属拥有 conversation、token、配置与 persistence。 通过 mpsc::UnboundedReceiver 串行处理命令。 取消 token 触发退出,全部 handle 被丢弃也会结束循环。 ## Compaction:85% 阈值与可选 two-pass(Agent 核心循环) URL: https://xueai.miyang.cn/slides/12-5.html (以下为免费预览,全文见页面) Compaction:85% 阈值与可选 two-pass 默认策略在上下文使用率达到 85% 时允许自动压缩。memory flush 和 two-pass 默认均关闭,启用后才进入对应流程。 核对自动压缩阈值、memory flush、two-pass 和超时预算的真实配置 used × 100 >= context_window × threshold_percent。比较使用饱和乘法,context window 为 0 时返回 false。 自动压缩阈值百分比。 未指定时使用当前 Session 模型。 启用后,压缩前才运行 memory flush turn。 单次压缩的墙钟预算,单位秒。 由配置解析后写入;默认走 single-pass 路径。 ## PromptContext:可检查的渲染输入(Agent 核心循环) URL: https://xueai.miyang.cn/slides/12-6.html (以下为免费预览,全文见页面) PromptContext:可检查的渲染输入 PromptContext 保存 Agent 专属的模板输入。它通过 Serde derive 获得序列化能力,再交给 ToolBridge::render_prompt() 完成渲染。 拆解可序列化上下文、TemplateOverride 和 TemplateRenderer 的模板渲染边界 ## 进程级外部 Toolset Preset 注册表(工具系统) URL: https://xueai.miyang.cn/slides/12-7.html (以下为免费预览,全文见页面) 进程级外部 Toolset Preset 注册表 config.rs 允许 crate 外的扩展代码在当前进程内注册按名称解析的工具集构建函数,并用 Public 与 Internal 控制是否进入公开枚举。 理解构建函数、Public 与 Internal 可见性,以及晚注册对后续解析的影响 ToolsetPresetBuilder = fn() -> ToolServerConfig。注册表保存构建函数,查询时调用函数生成配置。 Public 会进入 preset_names 与公开 preset 集合。Internal 不进入公开枚举,但仍能被 toolset_for_preset 按名称解析。 OnceLock 与 Mutex 包住全局 HashMap,生命周期覆盖当前进程,并支持受锁保护的读写。 ## ToolKind 提供默认只读语义(工具系统) URL: https://xueai.miyang.cn/slides/12-8.html (以下为免费预览,全文见页面) ToolKind 提供默认只读语义 is_read_only() 是工具种类层的默认分类。具体工具可以覆盖它,最终是否执行还要经过规则、沙箱、Hook 与交互批准等控制。 从枚举与 is_read_only() 追踪只读默认值和能力过滤边界 is_read_only() == true 这些 kind 的种类默认值为只读。具体工具仍可通过自己的元数据覆盖默认结果。 is_read_only() == false 此处还包含后台任务、媒体生成、部署等种类。Task 明确位于 false 分支。 ## 实现族、注册表与动态 MCP(工具系统) URL: https://xueai.miyang.cn/slides/12-9.html (以下为免费预览,全文见页面) 实现族、注册表与动态 MCP xai-grok-tools 同时容纳多套内置工具实现与运行时 MCP 工具。ToolBridge 把 registry 接入会话层,SearchTool 与 UseTool 提供发现和调用入口。 区分内置工具实现族、静态注册表与运行时发现的 MCP 工具 主要产品工具族,包含 ReadFile、SearchReplace、Bash、Task 等实现。 精简工具族,目录中包含 read_file、search_replace 与 bash。 带 hashline 语义的 read_file、edit 与 grep 实现。 包含 apply_patch、read_file、list_dir、grep_files 等兼容实现。 包含 read、write、edit、bash、glob、grep、skill 与 todowrite。 按能力拆出的实现模块。namespace 枚举还包含 MCP,用于运行时外部工具。 ## Canonical input 是稳定投影(工具系统) URL: https://xueai.miyang.cn/slides/12-10.html (以下为免费预览,全文见页面) Canonical input 是稳定投影 不同 harness 可以使用不同原始参数名。Grok Build 把少量稳定语义投影到 x.ai/tool 元数据中,让展示、遥测和跨工具分析拥有共同词汇。 用 CanonicalToolMeta 和输入投影解释跨工具实现的稳定合约 文件或搜索路径 归一化起始位置 读取或结果上限 待执行命令 命令描述 工作目录词汇 目录列表目标 搜索模式 ## 估算、百分比与严格阈值(上下文与记忆) URL: https://xueai.miyang.cn/slides/12-11.html (以下为免费预览,全文见页面) 估算、百分比与严格阈值 xai-token-estimation 提供共享算术原语。它既有 bytes/4 的本地粗估,也有对调用方传入 used 与 total 的使用率和阈值判断。 区分 Token 估算、使用率计算和 exceeds_threshold 的严格比较语义 total == 0 时返回 0,其他情况计算百分比,并把结果上限限制为 100。 使用整数饱和乘法,避免浮点舍入改变触发边界。默认自动压缩比例在配置中常见为 85。 在百分比阈值前预留固定 token 空间。减法使用 saturating_sub,窗口为 0 时仍返回 false。 本地估算 estimate_tokens(s) 使用 UTF-8 字节长度除以 4。它可在请求前、工具输出加入后提供快速预测;单张低分辨率图片的固定估值为 765 token。 服务端 usage 观测 服务端 usage 描述已完成请求的实际计量。百分比函数不会获取或判断数据来源,它只处理调用方传入的数值。调用链可在不同阶段使用估算总量或已更新的 usage。 ## 从文件变更到混合排序(上下文与记忆) URL: https://xueai.miyang.cn/slides/12-12.html (以下为免费预览,全文见页面) 从文件变更到混合排序 查询前先同步脏文件,再结合 FTS5 BM25 与可选的 sqlite-vec KNN。合并分数经过时间衰减、来源权重与访问增益,最后可选择启用 MMR 多样性重排。 追踪 FTS、向量检索、时间衰减和 MMR 重排组成的记忆召回流水线 查询前同步 MemoryFileWatcher 累积变化的 Markdown 路径。backend 在 search 开始时重新索引新增或修改文件,并删除已移除文件的旧 chunk。 BM25 候选 先执行普通 FTS,再补充 global 与 workspace 来源查询,降低 session 数量过多造成的挤出。 可选 KNN 仅在 sqlite-vec 与 provider 可用时嵌入 query。embedding 报错会记录 warning,并传入 None 继续 FTS-only。 归一化与合并 BM25 分数与向量 L2 距离分别归一化。双路命中时按权重合并,同时保证结果不低于该 chunk 的 FTS 分数。 时间与来源 session 按半衰期指数衰减,global 与 workspace 视为 evergreen。随后乘 source weight 与适度的 access boost。 可选 MMR 开启后按相关性与 snippet 的 Jaccard 差异做贪心重排。最后截断到 max_results。 ## Dream 的真实机制(上下文与记忆) URL: https://xueai.miyang.cn/slides/12-13.html (以下为免费预览,全文见页面) Dream 的真实机制 Dream 会把近期 session 日志与现有 MEMORY.md 合并成长期记忆。它由会话结束、可选周期检查或手动命令进入,并受门控与最佳努力锁共同约束。 核对空闲门控、DreamLock、后台整理和记忆写回的实际边界 读懂 Dream 从触发到重建索引的完整链路,能解释 DreamGate、幂等要求、锁竞争和写入失败回滚各自解决什么问题。 一次 Dream 的状态机 下图是教学化图示。节点名称来自源码,布局与文字说明经过课程化整理。 ## AgentDefinition 与 Persona 如何合并(子 Agent 与多 Agent) URL: https://xueai.miyang.cn/slides/12-14.html (以下为免费预览,全文见页面) AgentDefinition 与 Persona 如何合并 子 Agent 先解析可执行骨架,再把 spawn 参数、role 默认值和 Persona 默认值折叠为运行时配置。两套结构在不同阶段生效,最终共同决定子会话。 拆解 Agent 定义、Persona 覆盖与最终会话行为的合并顺序 能区分 AgentDefinition、SubagentRole、SubagentPersona 与 EffectiveRuntimeConfig,并按字段准确判断合并优先级。 定义解析与运行时覆盖是两条输入线 图中类型和函数名来自源码,箭头用于讲解数据汇合关系。 AgentDefinition:可版本化的 Agent 合同 从 .grok/agents/*.md 解析,真实字段包括 prompt_mode、tool_config、capability_mode、permission_mode、tools、isolation、model、hooks 与 MCP 继承等。项目定义的发现优先级高于 user 与 bundled。 SubagentRole:按类型命中的运行时预设 role 可给出 capability、model、reasoning effort、prompt file 与默认 isolation。它由 subagent_type 查找,role prompt 在 spawn 时读取。 SubagentPersona:按名称选择的行为层 Persona 有 inline instructions、instructions file、inputs、outputs、model、reasoning effort 与 default isolation。inline 文本在文件内容之前合并,再作为 块进入 prompt。 EffectiveRuntimeConfig:已解析结果 真实字段是 model、reasoning_effort、capability_mode、persona、persona_instructions、role_prompt、role_prompt_warning、role_name、persona_error 与 isolation。源码中没有 temperature、max_tokens 或 tools 字段。 ## 子 Agent 的四个隔离维度(子 Agent 与多 Agent) URL: https://xueai.miyang.cn/slides/12-15.html (以下为免费预览,全文见页面) 子 Agent 的四个隔离维度 上下文来源、身份连续性、工作目录和文件改动空间分别控制不同边界。把它们混成一个「隔离等级」,容易误读恢复和 worktree 的真实行为。 从上下文来源、恢复模式、工作树和任务状态分析隔离边界 能准确解释 ContextSource::New / Resumed、ResumeSourceData、SubagentIsolationMode,并根据任务选择新会话、恢复与 worktree。 隔离是一组正交维度 同一个 Resumed 子 Agent 可以复用 worktree,也可以继承普通 cwd。上下文连续与文件空间隔离要分别判断。 ContextSource::New 新会话不继承历史。spawn 流程建立新的 system prompt 和 prompt context,再接收当前任务输入。它不代表独立文件空间,文件空间仍取决于 isolation 与 cwd。 ContextSource::Resumed 从已完成的 peer subagent 继续。源码复制原始 transcript 与 tool state,模型沿用 source model;system prompt 和 prompt context 根据当前 AgentDefinition 重新渲染。 ## 多 Agent 的组织方式(子 Agent 与多 Agent) URL: https://xueai.miyang.cn/slides/12-16.html (以下为免费预览,全文见页面) 多 Agent 的组织方式 多 Agent 系统要同时解决角色定义、spawn、状态查询、取消、完成通知与资源继承。Grok Build 的源码把这些职责落在定义层与协调事件层。 基于公开证据比较 Agent、Persona、协调者与并行任务的组织方式 从 subagent_coordinator 读出 Grok Build 的实际组织方式,能用任务依赖、上下文需求、文件冲突和结果汇总成本选择组织策略。 父会话通过事件通道管理一组有身份的子 Agent Coordinator 在这里是 Grok Build 源码中的真实组件名。图形布局属于课程表达。 ## 五种沙箱 Profile(权限、沙箱与安全) URL: https://xueai.miyang.cn/slides/12-17.html (以下为免费预览,全文见页面) 五种沙箱 Profile workspace、devbox、read-only、strict、off 定义文件系统和子进程网络的不同能力集合。名称提供方向,真实边界要看解析后的 capability set。 比较 workspace、devbox、read-only、strict、off 与自定义 Profile 的边界 能从 ProfileName 和 SandboxProfile 判断读写与网络边界,能正确配置 custom extends,并识别平台支持与降级条件。 Profile 是多维能力预设 横向位置用于帮助记忆。devbox、workspace、strict 的实际差异同时包含默认读取、可写路径与网络策略。 全文件系统默认可读;workspace、GROK_HOME、临时目录可写;不限制子进程网络。 全文件系统默认可读;枚举根目录,除 /data 与虚拟文件系统外广泛授予写权限;网络不限制。 全文件系统默认可读;workspace 不可写;GROK_HOME、临时目录和必要设备仍可写。 关闭全局默认读,只开放系统运行目录与 workspace;workspace、GROK_HOME、临时目录可写。 跳过 capability set 应用,记录「Sandbox disabled」。它也接受别名 none。 ## 从工具请求到受限执行(权限、沙箱与安全) URL: https://xueai.miyang.cn/slides/12-18.html (以下为免费预览,全文见页面) 从工具请求到受限执行:完整授权链 一次工具调用先被解析成具体访问意图,再经过 plan gate、hooks、策略规则、会话授权、Auto 模式和用户确认。允许执行后,沙箱继续约束操作系统能力。 沿 ToolKind、权限决策和平台沙箱追踪完整授权链 能沿真实调用链定位「谁做了决定」,理解 AccessKind、权限规则、Bash 分段、hooks 与 sandbox 的边界,避免把授权简化成 ToolKind 判断。 授权决定「能否尝试」,沙箱限制「执行时能做到什么」 各阶段名称取自源码。策略内部存在短路与优先级,图中按主路径呈现。 工具输入转 AccessKind ToolInput 会映射为 Read、Edit、Bash、Grep、MCPTool、WebFetch 或 WebSearch,并携带路径、命令、域名或 MCP 名称等细节。决策输入比 ToolKind 更具体。 Plan mode 先设编辑门 plan_mode_edit_gate 可在发送权限请求前拒绝修改。计划文件存在单独的自动批准路径。 PreToolUse 可显式阻断 匹配 hooks 按配置顺序运行。显式 deny 立即停止;timeout、崩溃或格式错误按当前实现 fail-open,并记录到 UI 与日志。随后还可运行 client hook。 加载并评估规则 permission/resolution.rs 合并 requirements、managed settings、managed config、Grok config 与 Claude settings fallback。规则评估与来源顺序无关,优先级为 deny > ask > allow。 多条快速路径或用户确认 管理策略 deny 最先短路。随后依次考虑 yolo pin、session grants、Auto fast path / classifier、sandbox Bash auto、只读安全项、MCP 与域名授权。仍未决定时才进入 prompt。 在沙箱能力内执行 Permission Allow 只放行本次请求。若沙箱实际 active,进程仍受 capability set 与子进程网络策略约束。完成后可触发非阻断的 post_tool_use hooks。 ## Hooks:明确 deny 才阻断(权限、沙箱与安全) URL: https://xueai.miyang.cn/slides/12-19.html (以下为免费预览,全文见页面) Hooks:明确 deny 才阻断 把 Hook 看成事件上的可编程检查点。PreToolUse 可以返回明确拒绝,进程崩溃、超时和不可解析输出则走 fail-open,让工具调用继续。 核对生命周期事件、matcher、PreToolUse 阻断和故障 fail-open 语义 课程目标 分清两类结果 识别显式 Deny 与 Hook 自身执行失败,它们对工具调用产生相反结果。 读懂事件匹配 掌握 matcher 的精确名、正则模式与 Bash 兼容别名。 写出可测试配置 按用户指南的 JSON 结构配置命令 Hook,并设计四条故障测试。 一次 PreToolUse 的决策路径 源码中的事件面 八个主流程检查点 SessionStart、SessionEnd、Stop、StopFailure、PreToolUse、PostToolUse、PostToolUseFailure、PermissionDenied。其中只有 PreToolUse 的 is_blocking() 为真。 七个扩展检查点 UserPromptSubmit、Notification、SubagentStart、SubagentStop、兼容别名 SubagentEnd、PreCompact、PostCompact。 「事件被触发」不等于「能控制主流程」 事件枚举负责定义触发点,is_blocking() 单独声明阻断能力。读取事件列表时,要同时追踪结果如何回到调用方。 ## MCP 连接、发现与恢复(MCP 与生态) URL: https://xueai.miyang.cn/slides/12-20.html (以下为免费预览,全文见页面) MCP:连接只是起点 真正的客户端还要完成配置合并、OAuth、能力发现、命名隔离、模型可见性控制、状态推送和断线恢复。源码将这些责任拆在 MCP crate 与 Session Actor 周边。 确认客户端角色,拆解 OAuth、工具命名、能力发现、状态合并与重连 课程目标 核对协议角色 从调用方向判断客户端与服务端,避免把内部 Hub Server 等同于 MCP Server。 追踪可见性 解释工具如何从 tools/list 进入快照、搜索索引与模型注册表。 设计恢复状态机 把 OAuth、状态合并、客户端身份和重启退避放进同一连接生命周期。 从外部 Server 到模型工具 客户端与服务端:按源码措辞落位 McpClient 启动 stdio 或 Streamable HTTP 连接,执行初始化、list_tools 与 call_tool。Computer Hub MCP Adapter 也描述为把 MCP Server 的工具桥接进 Hub 路由。 xai-grok-workspace 的 Hub Server 属于 xAI Computer Hub 协议。当前快照未找到将 Grok Build 自身通过 MCP 传输暴露给任意 MCP Client 的入口,因此本课只确认客户端角色。 OAuth 与真实凭据落点 配置字段 oauth_client_id oauth_client_secret_env_var oauth_scopes 本地 JSON 文件 let path = grok_home .join("mcp_credentials.json"); // lock + load + insert + atomic save 源码采用该文件存储,并通过文件锁与原子保存处理并发写入。 ## Plugin Marketplace 的发现与信任(MCP 与生态) URL: https://xueai.miyang.cn/slides/12-21.html (以下为免费预览,全文见页面) Marketplace:发现、安装、执行分层 目录能展示插件,安装器能复制或克隆插件,运行时还要判断启用状态与信任。把三层拆开,才能看清插件生态的真实安全边界。 区分目录、安装、运行时发现、启用状态与插件根信任 课程目标 还原发现链 解释索引优先、文件系统回退、manifest 解析与来源优先级。 分开四种状态 区分可发现、已安装、已启用、受信任,避免用一个「已安装」覆盖全部语义。 画出执行边界 判断 skill、agent、hook、MCP 与 script 在未信任状态下的处理差异。 插件从目录走向运行时 Marketplace 与 Plugin 的真实结构 目录负责「有哪些」 marketplace-root/ ├── .grok-plugin/ │ ├── marketplace.json │ └── plugin-index.json ├── plugins/ │ └── sample-plugin/ └── default-skills/ 扫描器先读索引;缺失或无效时扫描 plugins/*/。default-skills 可作为虚拟插件加入结果。 插件负责「包含什么」 sample-plugin/ ├── plugin.json ├── skills/*/SKILL.md ├── commands/ ├── agents/ ├── hooks/hooks.json ├── .mcp.json └── scripts/ plugin.json 是首选 manifest,.grok-plugin/plugin.json 与 .claude-plugin/plugin.json 是后备位置。PluginManifest 可覆盖 skills、commands、agents、hooks、MCP 与 LSP 路径;解析后还要验证路径仍包含在插件根目录内。 ## Grok Build 与 Claude Code 证据化对照(超越源码) URL: https://xueai.miyang.cn/slides/12-22.html (以下为免费预览,全文见页面) 完整对照:先校准证据,再谈取舍 Grok Build 一侧可以下钻源码,Claude Code 一侧只记录官方公开行为。两列证据分辨率不同,因此空白项保留空白,不用推测补齐。 按源码、仓库文档和公开产品行为完成多维比较,保留未知项 课程目标 建立证据等级 区分源码、仓库文档、官方公开文档与本地快照观察。 完成多维对照 从运行时、工具、上下文、安全、恢复与生态比较公开能力。 输出选型条件 把「谁更好」改写为约束、团队能力与交付场景的匹配。 同一问题,两种证据视角 完整证据化对照 维度 Grok Build Claude Code 公开行为 实现与分发 Rust Cargo workspace,功能拆成多个 crate;README 给出源码构建入口。R1 · S1 官方提供终端 CLI、IDE、Desktop 与 Web 使用入口。内部语言与模块边界不在本课结论范围。P1 状态与并发 SessionActor 持有会话历史和工具上下文,运行在 Tokio LocalSet;后台任务可独立回传消息。S2 公开文档描述会话、后台任务、subagent 与 agent teams 的用户行为;不据此推断内部并发模型。P5 工具合约 ToolKind 枚举进入 capability 过滤,新增 variant 有编译期同步断言;MCP 工具映射为 Other。S3 公开权限规则按 Read、Edit、Write、Bash、WebFetch、MCP 等工具名和参数模式控制 allow、ask、deny。P6 工具发现 内建工具直接注册;MCP 元数据进入快照和 BM25 索引,通过 search_tool / use_tool 延迟发现。S4 官方文档说明 Tool Search 可按需加载 MCP 工具,支持延迟连接等待与失败信息反馈。P3 上下文压缩 源码包含 compaction 配置、分段、two-pass、full-replace 与 recap 辅助路径,可测试自动压缩与恢复。S5 官方行为包括自动压缩、/compact 与 compact instructions;本课不描述其内部算法。P4 长期记忆 xai-grok-memory 实现 SQLite 存储、FTS、embedding、MMR 与 Dream 整理流程,并由 session memory state 集成。S6 公开机制包含分层 CLAUDE.md 指令与 auto memory,作用域和加载规则由官方文档说明。P4 Hooks 源码枚举 15 个事件;PreToolUse 可阻断。明确 deny 阻断,Hook 崩溃、超时与失败输出走 fail-open。配置使用 JSON。S7 · R2 官方 Hooks reference 公开多类事件、matcher、if 条件及 command、HTTP、MCP tool、prompt、agent 处理器;PreToolUse 可返回拒绝。P2 MCP 源码确认客户端角色,支持 stdio 与 Streamable HTTP、OAuth、server__tool、动态能力刷新、状态合并与重启。未确认通用 MCP Server 入口。S8 · R3 官方文档公开远程 HTTP、本地 stdio、WebSocket、OAuth、动态 list_changed、Tool Search 与连接管理。P3 权限与沙箱 ToolKind capability 过滤、权限提示与平台沙箱代码共同组成多层控制;Hook 失败策略不承担强制安全保证。S3 · S7 官方公开 allow、ask、deny 规则、managed settings、sandboxed Bash 与文件系统、网络隔离配置。P6 Subagent 源码包含 fork、任务、工作树池与 completed subagent worktree snapshot 配置,可将分支任务放入隔离工作树。S9 官方 subagents 具有独立上下文、工具与权限,可前台或后台运行,也可按配置使用 worktree isolation。P5 插件生态 Marketplace 支持索引与目录回退,安装 registry 保存来源;运行时按 scope、enabled 与 plugin-root trust 控制组件。S10 · R4 官方插件与 marketplace 文档公开 skills、agents、hooks、MCP servers、LSP servers 和安装作用域。P7 恢复与可观测 源码包含会话持久化、MCP 状态通知、50 ms 事件合并、重启退避、telemetry enums 与结构化事件。S11 官方可见行为包含 session resume、verbose / debug、Hooks 状态、MCP 面板与权限诊断;内部持久化拓扑不作推断。P1 · P3 源码与治理 仓库快照公开源码;README 说明定期从 monorepo 同步,根 Cargo.toml 由生成流程产出,外部贡献不接收。R1 · R5 本列依据官方公开产品文档,不将不可见内部实现作为比较事实。P1 ## Grok Build 工程复盘与证据边界(超越源码) URL: https://xueai.miyang.cn/slides/12-23.html (以下为免费预览,全文见页面) 工程复盘:能力与边界一起读 公开源码能证明实现机制,也有明确的解释边界。优点从类型、状态机和测试中找证据,限制从 README、贡献政策、生成流程与本地快照条件中找证据。 用类型、状态机、测试和仓库政策复盘工程优点与适用限制 课程目标 从机制提炼优点 用类型、错误分支、状态机和测试证明工程特征。 从边界识别限制 区分产品限制、公开树限制与本地快照限制。 形成适用判断 说明哪些研究结论可复核,哪些问题仍需产品实测。 四层证据地图 源码支持的工程优点 工具能力变更会触发权限分流 ToolKind 的完整列表有编译期数量断言,capability filter 使用穷尽匹配。新增工具类别时,维护者必须重新作出保留或过滤决策。 连接恢复考虑陈旧事件 MCP dispatcher 合并高频状态,移除客户端前核对 client_id,旧连接的迟到断线不会把替换后的健康客户端误删。 插件发现与执行被拆开 项目插件按 canonical root 授权。未信任插件可提供元数据,但 hooks、MCP servers 与 scripts 被阻断,路径解析失败默认未信任。 记忆拥有独立存储与检索模块 xai-grok-memory 将 schema、storage、FTS、embedding、MMR、Dream 与 lock 拆成明确模块,Session Actor 通过独立 memory state 接入。 同一运行时覆盖交互、自动化与编辑器接入 README 明确列出 full-screen TUI、headless scripting/CI 与 ACP editor embedding。仓库布局将 pager、shell runtime、tools 与 workspace 分开说明,便于按入口定位责任。 ## Coding Agent 设计工作台(超越源码) URL: https://xueai.miyang.cn/slides/12-24.html (以下为免费预览,全文见页面) Coding Agent 设计工作台 结课任务从功能清单升级为可运行的系统设计。你要为九个维度作出明确决定,每个决定都要附合约、故障路径、验证方式和可提交成果。 围绕九个系统维度输出架构决定、故障路径、验证方式和结课成果 课程目标 完成系统边界 定义入口、状态所有权、模型循环与外部扩展的责任边界。 补齐失败设计 为工具、安全、持久化、恢复和状态通知画出失败路径。 产出可评审成果 提交 ADR、合约、威胁模型、测试与最小演示,不停留在概念图。 一张图看完整 Agent 系统 结课项目简报 为一个真实团队设计「仓库级 Coding Agent」。它至少能读取代码、提出计划、修改文件、执行验证并恢复中断会话。你可以实现最小 PoC,架构文档必须覆盖全部九维。 默认最小权限 每个外部动作可追踪 崩溃后可解释恢复 敏感数据有明确落点 扩展代码有信任边界 ## Grok Build 专题 · 30 道灵魂拷问(他们会这样考你) URL: https://xueai.miyang.cn/slides/interview-6.html (以下为免费预览,全文见页面) 解剖 Grok Build · 30 道灵魂拷问 协作方法论篇拆的是真实源码,这章的问题也最硬核。你说自己懂 Coding Agent,这 30 个问题就是照妖镜,先自己开口回答,再看框架。 每题附考察意图、答题框架与加分点:运行时循环 / Compaction / 工具权限 / 记忆检索 / 沙箱安全 / MCP 集成 从入口讲起:用 Grok Build 举例,真实入口在 main(),按运行分支分发(headless、stdio、leader、交互 TUI),最后都汇到同一个 Agent 宿主。 三个 Actor 分工:SessionActor 负责 turn 编排,接收命令、启动待处理 turn、处理完成通知;ChatStateActor 独占对话状态;SamplerActor 负责流式的模型请求。 隔离单位:每个 Session 跑在独立 OS 线程上,带自己的 current-thread Tokio runtime 和 LocalSet。会话之间天然隔离,一个卡死拖不垮别人。 收尾机制:用户点停止靠 CancellationToken 协作式终止,各 Actor 有序退出,这就是取消边界。 先给触发机制:以 Grok Build 为例,默认在上下文使用率达到 85% 时允许自动压缩。判断公式是 used × 100 >= context_window × threshold_percent,纯整数比较。 压缩本身要限时:单次压缩有 300 秒的墙钟预算。压缩是为了救会话,自己耗时失控就本末倒置了。 讲可选能力:memory flush 和 two-pass 默认都关闭。two-pass 开启后,接近阈值时先在后台投机摘要历史前缀,正式压缩时再把摘要和近期尾部合并总结。 拔高一层:这些都收在 CompactionPolicy 一个显式配置对象里,阈值、压缩模型、预算全部可调。生产级系统把策略做成配置,demo 把策略写死在代码里。 ## 一切皆插件:官宣与源码对照(系统地图) URL: https://xueai.miyang.cn/slides/dsh-1.html 一切皆插件:官宣与源码对照 发布文里说的四种模式、插件生态,在 deepseek-harness 仓库里对应哪个文件?本课一条条对上。 把发布文案里的四种模式、会话日志、插件生态逐条对到仓库里的 YAML 预设与包结构 下面的演示把四份插件清单做成了可切换的面板。点上面四个模式按钮,看插件卡片怎么亮、怎么灭:绿色是新增,红色是移除,琥珀色是同名但配置变了。底部字幕会告诉你每一步发生了什么。先玩明白,后面讲的思路都在这块面板里演过一遍。 它解决什么问题。想象你在用一个单体架构的 Agent 产品,想换掉它的会话日志格式。你得 fork 仓库,在几十万行源码里找到日志实现,改完重新构建,之后官方每发一版你都要重新合并一次补丁。这还只是日志这种边角能力,要是想换 agent loop 主循环,基本等于重写产品。能力和产品源码焊死在一起,任何深度定制都会变成长期维护负担。 思路是什么。DSH 把内核缩到最小。vendor 进仓库的 Cordis 框架只做三件事:把插件装进共享上下文、把插件卸下来、把每次注册记成可逆的副作用,插件卸载时自动回滚。业务逻辑一行都没有。然后所有能力搬进 packages/,49 个分组、219 个包,全部以插件形式存在:模型适配器是插件,工具是插件,会话日志是插件,连 agent loop 主循环本身也是插件。根 AGENTS.md 第 3 行用加粗英文写着「everything is a plugin」。官方文档的原话: Cordis 是 dsh 底层的框架:插件向共享上下文贡献服务、类型化事件和可逆的副作用。产品的每一部分都是插件,包括模型适配器、工具注册表、会话日志,以及 agent loop(智能体循环)本身,因此每一部分都可以从配置替换。 不存在需要打补丁的特权内核:扩展 dsh 的方式是把插件挂载到其他插件旁边,而各项注册都是副作用,会在其插件卸载时撤销。 想给 DSH 加能力,也不用碰它的仓库。树外(out-of-tree,指官方仓库之外的)插件用 dsh plugin --profile add 装进 profile,运行时挂载,卸载时注册的副作用自动回滚。README 还约定插件仓库统一打 dsh-plugin 话题标签,方便互相发现。发布文邀请大家共建生态,机制是现成的。 为什么长期成立。微内核思想比这份代码老得多。操作系统课上的 Mach 和 L4,浏览器的扩展体系,VS Code 的插件生态,走的都是同一条路:变化快的能力放外圈,几乎不变的装卸机制放核心。DSH 明年把 agent loop 重写一遍,Cordis 的装卸逻辑一行不用动;换个语言把整个 harness 再写一遍,这个分层照样管用。所以记这门课的结构比记它的代码划算,代码只是这个思路的某一版实现。 它解决什么问题。多数产品的模式是硬编码的:代码里散着一堆类似 if (mode === 'lite') 的分支,模式数量在写代码的那一刻就定死了。想新增一个模式,要改代码、过测试、等发版;想微调某个模式里的一个能力,还是这套流程。用户更没得选,只能在官方给的几个套餐里挑。 思路是什么。DSH 里一个模式就是 apps/cli/config/agent-presets/ 下的一个目录,目录里两个文件。preset.yml 只有 3 行,管 UI 上的展示名和排序;agent.cordis.yml 是插件清单,启动时 Cordis 照着清单逐行挂载,输出一个组装好的 Agent。切换模式就是换一份清单重新组装,源码里没有任何模式分支。四种模式的差异,看四张卡就够了: 标准模式 给谁用 日常写代码的人,这是默认档。 与其他模式的关系 它就是基准:23 个插件全开(macOS 视角),文件编辑、shell、检索、计划、子代理、工作流都在。其余三个模式全部描述成对它的加减。 背后的思路 先定义一个能力齐全的参照系,别的组合才有资格用一句话说清自己。 PTC 模式 给谁用 跑多步长任务、嫌一次一个工具调用往返太慢的人。 比标准多了什么少了什么 standard 一行不动,末尾多挂一个 tool-presentation,配置 mode: code。模型改写一段 TypeScript 小程序,run_code 一次执行原本要五次往返的操作。 背后的思路 改的只是工具的呈现方式,能力本身没变,所以差异只配拥有一行。 极简模式 给谁用 跑模型基准测试的人。 比标准多了什么少了什么 只剩 6 个插件。persona 一句话写死(complete: true,别的插件想追加提示词也加不进去),工具只有持久 bash 和 str_replace_editor,没有 compaction(上下文压缩)。 背后的思路 把 harness 的变量排干净,剩下的表现就是模型本身。 创造模式 给谁用 想让 Agent 造 Agent 的人。 比标准多了什么少了什么 standard 全套之上加 tool-cordis 工具集、一个教组合写法的 skill,persona 也换了版本。Agent 能在运行时检查并挂载自己的插件,写出的组合能存成新 preset。 背后的思路 组装器自己也是插件,所以能开放给 Agent 用。文件头注释提醒把这个模式的会话当 shell 权限对待。 顺带点破一个营销词。code/preset.yml 第 1 行写 name: PTC 模式,但目录叫 code,源码注释和文档里这套机制叫 Code Mode,全仓库找不到名为 PTC 的实现。PTC 只活在 UI 文案层,跟人聊源码时说 Code Mode 才对得上号。 为什么长期成立。这条思路有个通行的名字,配置即架构:把系统之间的行为差异收敛进一份声明式清单,架构问题就降维成文本问题。想知道两个模式差在哪,diff 两份 YAML;想造新模式,复制目录改几行;出了问题,回滚清单就行。Kubernetes 用 YAML 声明集群,Docker 用 Dockerfile 声明镜像,同一个思路在不同层面反复出现。DSH 的插件实现哪天全部重写,清单这层抽象照样成立。 一切皆插件的价值放到同行里才看得清。同一个问题,想给 Agent 加一个新能力,需不需要动它的仓库源码,三家给出三种答案: DSH:插件树 能力就是一个树外 npm 包。dsh plugin --profile add 装进 profile,运行时挂载,卸载时注册副作用自动回滚。模式级差异也只是 YAML 里增删几行。 出处:packages/bundle/README.zh.md 第 13 行;docs/architecture.zh.md 第 13 行 Claude Code:产品单体 还原源码是一棵 TypeScript 单体源码树(restored-src/src/,入口 main.tsx),改内建功能要动产品源码。对外留了 hooks、MCP、Skills 这些扩展口,能加工具和拦截点,换不掉会话日志这类深层实现。基于已公开证据(还原源码目录结构)。 Grok Build:Cargo Workspace 根 Cargo.toml 的 members 数组列了 79 个 workspace 成员(本地计数),能力按 crate 切分、编译期组合。新增能力要新建 crate、改根清单、重新编译。切分细节见 12-1 · 79 个 Workspace 成员如何组成产品。 三家没有绝对优劣。Grok 用编译期组合换 Rust 的类型和性能保证,Claude Code 用单体换产品迭代速度,DSH 用插件树换运行时可拔插。只是如果你想要一个可替换、可审计的运行时,DSH 是三家里唯一让第三方无需 fork 仓库就能替换深层能力的。 从清单推演行为差异 把 standard/agent.cordis.yml 里 id: compaction 的整个 group(第 137 至 155 行)删掉,得到的会话和极简模式在上下文压力下的表现是否等价?再对照 minimal/agent.cordis.yml 的 persona 三个字段(第 8 至 13 行),说出除了压缩之外还差哪两点。 ## Profile / Bundle / Patch:用户能把产品改到什么程度(系统地图) URL: https://xueai.miyang.cn/slides/dsh-6.html Profile / Bundle / Patch:用户能把产品改到什么程度 不改源码也能换掉深层能力:配置由四层 patch 对着空数组叠出来,晚应用的赢,命中同一条就整条替换。 配置三层结构怎么让用户不改源码就换掉深层能力 下面的沙盘把四层配置做成了可开关的卡片,从下往上是应用顺序。点播放,看每一层怎么把自己的改动刷到右边的最终条目上。重点看第三层:它只写了一个字段,结果把下面两层辛苦设好的字段刷没了。玩完可以切到 deep-merge 对照模式,看同一份改动在合并语义下的另一种结局。 先给结论:DSH 没有一个大而全的配置文件。它的产品形态是由一摞一摞的 patch 列表叠出来的,每一摞都有明确的归属方。 Bundle 是发行版默认。它是一个 npm 包,实体就是包里带的那份 patch 列表。内置的三个是 base(共享核心)、web-app(浏览器表层)、headless(一次性任务模式)。 Profile 是用户的一套组装。它是 $DSH_HOME/profiles/ 下的一个目录,manifest 里排好要用哪些 bundle、按什么顺序,旁边放一份用户自己的 patch 文件。首次使用 web 或 headless 这两个名字会自动初始化模板。 Patch 是改动的最小单位。一条 patch 按 id 找到目标条目,改配置、禁用、或者 insert 新条目。树外插件也从这里进来:用 dsh plugin add 装进 profile,之后它就是普通的一层 patch。 出处:三个内置 bundle 与 package.json 里的 bundle 声明方式见 packages/bundle/README.zh.md;profile 模板自动初始化在 apps/cli/src/profile.ts 第 114 至 117 行。 它解决什么问题 想象反面做法:一个大配置文件,发行版默认、这套组装的定制、个人偏好、临时实验全写在里面。三个月后升级发行版,新默认和你的旧改动搅在同一个文件里,你说不清哪一行是谁写的、哪一行能动,升级变成一场手工比对。 还有更日常的翻车:想临时试一个实验模型,顺手改了配置忘了改回来,第二天整套环境跑的都是实验配置。根源是改动没有归属,谁写的、跟着什么走、什么时候该消失,一个文件说不清这三件事。 思路是什么 DSH 把配置拆成四层,每层一个归属方:Bundle 跟着发行版走,Profile 跟着这套组装走,Home 跟着这台机器走,--patch 跟着这一次命令走。启动时对着一个空数组,按固定顺序把四层 patch 依次刷上去,晚应用的赢。 起点真的是空数组:根配置文件的内容就是 [],模板注释直接写着别改这个文件,去改 patch 文件。所有实际内容都由 patch insert 进来,所以最终插件树里的每一行配置都能回答自己从哪层来。 两层用户 patch 的分工也讲究:Profile 层跟着这套组装走,Home 层是机器本地偏好,对每个 profile 都生效,所以排在 Profile 层之后、压过它。两层改同一个 id 时,赢家是 Home 层那条。--patch 排最后,用来做不想写进文件的一次性实验,可以重复传多份,按命令行顺序应用。长会话里两个用户层的文件还被 watch 着,改一下保存,运行中的树就按同样的层序重组一次。 层序在源码里就是一个数组字面量:launcher 把组合好的 profile 摊平成一个 patch 数组,数组顺序就是应用顺序。这段函数短到能当金句看,它证明四层的先后被写死在一个数组里,没有任何条件分支: /** The full patch stack of one composed profile, in application order. */ function allPatches(composed: ComposedProfile): PatchOptions[] { return [ ...composed.bundlePatches, ...composed.profile.patches, ...composed.homePatches, ...composed.overlays, ] } 出处:根配置为空数组与模板注释在 apps/cli/src/profile-boot.ts 第 60 至 64 行;Home 层压过 Profile 层的理由在 packages/boot/app-boot/README.zh.md 第 43 行;--patch 可重复传在 apps/cli/src/args.ts 第 132 行;热重载见同包 watchUserPatches。 为什么长期成立 分层覆盖是配置系统的通则:CSS 的层叠、systemd 的 drop-in 目录、编辑器里用户设置压过默认设置,全是同一个结构。只要一份产品同时被发行方、团队、个人、单次命令四种角色修改,层就必须分开,否则升级和回滚都无从下手。换个语言重写整个 harness,这四层还是这四层。 它解决什么问题 叠层还剩一个关键决定:两层 patch 改到同一个条目时怎么办?直觉答案是 deep-merge,字段级合并,上层只写想改的字段,其余字段自动保留,写起来省事。 省事的代价有两个。第一,合并表达不了删除:下层设了一个字段,上层想把它去掉,merge 语义下没有这个动作,只能覆盖成别的值。第二,最终结果和任何一份文件的字面内容都对不上,排查配置时你得在脑子里把所有层的合并算法跑一遍,才知道现在生效的到底是什么。 思路是什么 DSH 选了整条替换。patch 按 id 命中目标条目后,把 patch 里除 id 之外的每个顶层键直接赋值过去。config 是一个顶层键,所以旧 config 对象被整个换掉,里面的字段一个都不保留。想只改一个字段,也得把要保留的字段重新写一遍,这是官方文档明说的已知限制,原话是「profile 覆盖必须重述需要保留的组合包字段」。 由此产生最容易踩的反直觉结果,就是演示第三层演的那一幕:Home 层只写了 model 一个字段,下面两层设好的 provider 和 temperature 被刷没了,而且没有任何警告,只有结果不对。顺带记三条行为边界:patch 指向不存在的 id 只警告不报错,一行 stderr 提示后跳过;patch 文件内容为空或只有注释会直接抛异常,因为解析结果不是列表;想让某一层什么都不做,写一个 []。 替换语义的回报在可预测性。这个算法全库只有一份:挂载用它,dsh --dump-config 的离线合成也用它,dump 出来的结果和真正启动的内容不可能漂移。算法的输入永远不被改动、结果永远是深拷贝,这样配置热重载时撤掉一条 patch 才能真的还原,早先的值不会被烤进缓存。配套还有一份所见即可改的地图:docs/config-catalog.zh.md,3152 行的生成文档,把每个可加载包的 config 类型原样列出来,想知道某条 patch 能写哪些键,查这份目录就行。 出处:替换语义(顶层键逐个赋值)在 vendor/include/src/index.ts 第 110 至 124 行,唯一算法与不可变输入的承诺在同文件第 43 至 52 行的 JSDoc;整条替换的官方说明在 packages/boot/app-boot/README.zh.md 第 60 行。 为什么长期成立 这是声明式配置里的一道老选择题:merge 的省事,还是 replace 的可读。替换语义让每个条目有唯一的最后作者,出了问题只要找到最后那条 patch,字面内容就是生效内容;代价是写的时候要重述。DSH 把账算在了可预测性这边。只要一个配置系统允许多方叠加、又要求用户能自助排查,这道题就存在,和实现语言没有关系。 DeepSeek Harness 层的单位是插件条目:一条 patch 换掉一整条 config。四层从 Bundle 到 --patch 顺序固定,根配置是空数组,一切内容可溯源到某一层。 换掉深层能力等于换掉一行条目:把 compaction 插件的 config 整条替换,甚至 insert 一个第三方实现。 Claude Code SETTING_SOURCES 排了五层:userSettings、projectSettings、localSettings、flagSettings、policySettings,越靠后越大(settings/constants.ts 第 7 至 22 行)。管理员的 policy 层永远压顶,还有一批字段只在 managed 来源生效。 分层的对象是设置字段,改的是行为参数;插件树本身没有摆上配置台面。 Grok Build xai-grok-config 用 deep_merge_toml 递归合并(loader.rs 第 415 至 426 行):表合并、数组替换、上层字段赢。层序是 system_managed、managed、user,requirements 与 MDM 管控层最后压顶(loader.rs 第 234 至 248 行)。 它选了 DSH 演示里那个 deep-merge 对照:改一个字段不用重述,但上层没法删掉下层的字段。 对比焦点在两处。第一是合并语义:Grok 与 Claude Code 都是字段级合并,写起来省事;DSH 是条目级替换,写起来啰嗦,换来 dump 与文件字面一致的可预测性。第二是分层对象:那两家分的是设置字段,DSH 分的是插件树本身,所以用户能改到的深度不一样,patch 一条 insert 就能把第三方 compaction 实现接进主循环,这在前两家的配置系统里没有对应物。Claude Code 有 DSH 没有的东西也要说:管理员策略层和只在 managed 来源生效的锁定字段,DSH 目前没有等价机制,这一条基于已公开材料。 手推一次两层冲突 Profile 层写 id: conversation-model, config: { provider: deepseek, model: v3.2, temperature: 0.2 },Home 层写 id: conversation-model, config: { temperature: 0 }。 问题一:按整条替换语义写出最终条目的 config,指出哪些字段消失了、会不会有任何警告提示你。 问题二:把这两条 patch 对调所在层,结果变成什么? 问题三:用 dsh --dump-config 的思路说明怎么在不启动的情况下验证你的答案。 ## Model-visible ⟺ logged:一条会崩给你看的不变量(会话与循环) URL: https://xueai.miyang.cn/slides/dsh-2.html (以下为免费预览,全文见页面) Model-visible ⟺ logged:一条会崩给你看的不变量 模型看到的一切都要能从日志重建,发请求前还要现场验一遍,验不过直接崩。 从 invariant.ts 的逐字节比对讲起:为什么模型看到的一切必须能从日志重建 先玩再讲。左边是一条只能往后追加的事件日志,右边是从日志重建出来的消息数组,和即将发给模型的请求。点播放看事件流入。播完你可以当一次坏人:删一条日志,或者绕过日志直接改请求,再点「发起下一次请求」,看比对怎么逐条打钩、在分歧处打红叉、然后当场崩给你看。 实验台的比对顺序与源码一致,红条里的报错保留源码原文:比对逻辑在 packages/core/agent-loop/src/invariant.ts 第 31 至 42 行,报错前缀拼接在 packages/runtime-diagnostics/invariants/src/index.ts 第 62 行。核对日期 2026-08-13。 它解决什么问题。大多数聊天程序都有两份对话:内存里一份数组,磁盘上一份存档,各写各的。某天进程崩了,你从存档恢复会话,恢复出来的历史比模型当时实际看到的少了一条工具结果。模型接下来的回答全对不上号,你还查不出原因,因为两份状态谁也证明不了谁。只要真相有两份,它们迟早漂移。 思路是什么。DSH 把真相压缩到一份。规矩写在仓库根部的 AGENTS.md 第 107 行: 拆开说。会话日志是一份只追加的事件流,任何想让模型看到的内容,必须先变成一条事件写进日志。消息历史从日志派生,官方文档的说法是「从不单独存储」。所以在 DSH 里,日志就是对话本身,系统里没有第二份对话状态。 出处:docs/subsystems/session.zh.md 第 5 行,核对日期 2026-08-13。 然后是标题里那个双向箭头 ⟺。日志推得出请求,请求也必须能被日志解释。光写日志做不到这一点,还得有人在发请求的路口站岗。每次请求出站前,DSH 从日志现场重新派生一份应有的消息数组,和请求里实际带的那份做全量字符串比对;系统提示词、模型名、采样参数、工具清单也要和日志里的请求头快照逐字段对上。全对上才放行。 站岗的核心就四行,短到可以当金句贴墙上。它在证明一件事:每次派发前,DSH 真的会从日志重新派生一份消息,和实际请求做全量字符串比对,对不上就地失败: const expected = session.deriveMessages() if (JSON.stringify(options.messages) !== JSON.stringify(expected)) { fail(`llm request for session "${String(session.id)}" diverges from the dispatch-time durable derivation (log-reconstruction desync)`) } ## followup / steer / inject:双队列 Inbox(会话与循环) URL: https://xueai.miyang.cn/slides/dsh-3.html (以下为免费预览,全文见页面) followup / steer / inject:双队列 Inbox Agent 正在干活时你想说句话,消息该排哪条队、什么时候被处理。三个 API 共用一个 send(),只差两个参数。 拆解 next-turn 与 next-step 两条队列的入队、claim 与唤醒语义,对照 Claude Code 的中断模型 Agent 跑到一半,用户突然说话。工程上有三种处理:打断它重来、排队等它干完、悄悄把话塞给它。大多数 harness 只做前两种。DeepSeek Harness(下称 DSH)把第三种也做成了正式 API,三种语义共用一个入口 send(),只靠两个参数区分。 先玩再学。把一个 Turn(轮次,一轮完整工作)想成一班车,Step(步骤,一次模型请求)是一站一站地开。next-turn 队列是等下一班车的人,next-step 队列是要插进当前这班的人。Agent 运行时随时点下面三个按钮,看消息落进哪条队列、在哪一站被接走。底部字幕会解释每一步在发生什么。 Agent 空闲,两条队列都是空的。点上面的按钮,或点播放看完整流程。 它解决什么问题。只有一条消息队列的 harness 里,用户说话只有两种命运:打断,或者排队。翻车场景很日常:Agent 正在按计划改十个文件,改到第三个你发现方向偏了。打断,前面两个文件的活白干;排队,只能眼睁睁看它把十个文件全改错。你想做的只是补一句话,这两个选项都要你拿当前进度去换。 思路是什么。先把循环拆成两层。Turn 是一轮完整工作,Step 是一次模型请求外加它触发的工具执行,一个 Turn 里通常有好几个 Step。拆开的原因很实际:消息需要一个比整轮更细的投递点,模型下一次能看到新消息的机会,就是下一个 Step 的开头。然后把说话的时机编码成两个参数:target 决定排哪条队(next-turn 等下一班车,next-step 插进当前这班),wakeup 决定要不要叫醒司机(Agent 空闲时是否立刻开工)。三个 API 全是 send() 的参数预设,各自只有三行。 followup下一件事,等这轮干完再说 steer纠正方向,别推倒重来 inject塞条信息,别催它干活 为什么长期成立。这三种语义是中断的分类学,和实现语言无关。任何 agent 系统重写一遍,还是要回答同样两个问题:新消息等当前任务结束,还是插进去?插进去时要不要立刻触发行动?只要模型调用有回合边界,这套三分法就成立。换 Rust、换 Python 重写,参数名会变,分类不会。把分类做成 API,用户补一句话就有了第三种命运,这是把中断粒度当产品能力来做。 ## Esc 之后发生了什么:取消、崩溃恢复与重入(会话与循环) URL: https://xueai.miyang.cn/slides/dsh-7.html (以下为免费预览,全文见页面) Esc 之后发生了什么:取消、崩溃恢复与重入 每轮一个取消信号,中断也要把账记平,kill -9 之后重启还能接着跑,已落盘的劳动成果一条不丢。 每轮一个 AbortSignal,中断也要写回日志,崩溃重启还能接着跑 下面是一条正在干活的轮次:模型流式输出中,还叫了一个长工具。左边是会话日志,右边是运行状态。三个情景按钮对应三种事故:按 Esc、kill -9 后重启、以及一个假想的截断式恢复做对照。点播放,字幕会告诉你每一步日志里多了什么、少了什么。 它解决什么问题 想象取消做成一个全局开关:agent 身上挂一个布尔标志位,谁都能设,各处代码自己抽空看一眼。翻车迟早发生:上一轮注册的某个超时回调半夜苏醒,顺手把正在跑的新一轮取消了;或者取消用 Promise.race 实现,race 输掉的那个工具调用没人善后,还在后台偷偷改文件、写状态,成了僵尸工作。 取消这件事,难点是停得干净、只停该停的。这两样,全局开关都给不了。 思路是什么 DSH 的取消是一根显式传递的线,一头拴在轮次上,另一头拴在每个正在干活的边界上。驱动器每次醒来干活,新建一个 AbortController(取消控制器);一轮跑完、队列里还有活,就再换一个新的。任何时刻最多只有一个控制器有效,取消权的生命周期和轮次一样长。 Esc 只是拉了一下这根线。界面把按键翻译成 agent.cancel({ kind: 'user' }),子 agent 被父级打断则是 { kind: 'parent' },取消自带身份。cancel 的入口小到可以背下来,就两个动作:默认先把 inbox 清空,排队没跑的消息全部作废,想保住排队工作就传 keepInbox,只中断当前活动;然后对当前控制器 abort(cause)。空闲时调 cancel 是空操作,不会给未来的工作预埋取消状态。 同一个 signal 显式地发给 pre-step、提示词组装、模型请求、流式读取、工具执行、审批这些环节,连 bash 工具都能顺着它杀掉整个进程组。传递是协作式的:循环在每个 await 边界前后检查中断,不用 Promise.race 半路丢弃一个还在跑的 Promise,所以不会有僵尸工作偷偷改状态。 最后是权力交接。循环在发布 turn/end 之前就清掉本轮的取消持有者,之后哪怕持久化刷新还没结算完,谁也取消不了已经完成的轮次工作;下一轮拿到的是全新的 signal,旧回调想越权,连把手都摸不到。 出处:每轮新建 AbortController 在 packages/core/agent-loop/src/agent.ts 第 187 行,跑完换新在第 325 行,cancel 入口(可选清 inbox,再 abort 带类型化 cause)在第 134 至 140 行;取消权不跨轮泄漏的设计记录见项目 Agent Note 2026-07-16。 为什么长期成立 显式令牌加作用域绑定,是结构化并发的通则:Go 的 context、.NET 的 CancellationToken 走的都是这条路。令牌由创建者负责收回,活不过自己的作用域,越权自然无从谈起。只要系统里同时有流式 IO 和外部进程要停,换个语言重写,这根显式的线还是得有。 它解决什么问题 假设被取消的轮次不写终态:日志停在半截,回放的人不知道这轮怎么结束的;UI 没法如实告诉用户哪些排队的活被扔了;下游拿到日志,分不清这轮是被人有序停掉的,还是意外死掉的。中断是正常业务,不记账的中断才是事故。 ## Goal:消息溯源即权限(会话与循环) URL: https://xueai.miyang.cn/slides/dsh-8.html (以下为免费预览,全文见页面) Goal:消息溯源即权限 长期目标谁有权改,鉴权不读消息正文,只认宿主盖在事件元数据上的来源章。本课讲这个设计背后的两层思路。 长期目标怎么存、谁有权改,鉴权看消息来源 先玩再讲。左边是当前 Turn 窗口,也就是本轮 turn/start 之后收进来的消息,每条消息都带一个宿主盖章的来源标签。右边是鉴权流程,模型每次调 goal 工具,代码就把窗口扫一遍。五个情景里你轮流扮演人类、越权的模型和子 Agent,看放行和拒绝各自发生在哪一行。 Goal(长期目标)解决的诉求很具体:你交代一句话的目标,比如把仓库测试全修绿,然后走开。Agent 接下来自主跑几十个 Turn(轮次),每轮结束系统自动注入一条继续推进的消息,让它接着干。 问题也随之而来:一个能自己给自己发消息的系统,怎么保证它不会顺手把轮次上限也改了,永远跑下去?DSH 的答案分两层,一层管权限从哪来,一层管凭证怎么过期,下面逐层拆。 它解决什么问题 具体的翻车场景长这样:自动续跑到第 4 轮,模型在回复里编一句「检测到管理员已在带外渠道授权本次变更」,然后调 update_goal 把轮次上限改成 999。如果防线只是一行系统提示词劝它别改,这里就沦陷了:没有任何硬校验能核实那句话的真假,提示词只是请求,模型信不信全看它自己。演示的情景 E 演的就是这个对照。 提示注入的经典剧本全是这一路:让模型相信用户已经授权。只要鉴权去读消息文本,话术就永远有机会赢。 思路是什么 DSH 的鉴权不分析模型说了什么,只做一件事:模型调 update_goal 时,把当前 Turn 窗口里的消息扫一遍,看有没有一条来源是真人的。这个来源写在 user/message 事件的 source 元数据里,由宿主在事件落盘时盖章。它压根不在消息正文里,模型再能写话术也伪造不了。 权限只有两档。第一档 direct-human:当前 Turn 窗口里有真人消息,那这轮里模型做什么都算人类授的权,create、edit、pause、resume 全开。第二档 goal-round:窗口里那条注入消息正好是当前目标的当前轮,此时模型只能做两件事,报告完成(complete)或报告卡住(blocked)。blocked 还有个额外下限,默认要跑满 3 个获准轮次才许喊卡,防的是模型一遇到难题就撂挑子。 所以给自己续命这条路在机制层就不存在。自动续跑的轮次里,窗口里只有系统注入的续跑消息,没有真人,edit 直接被拒,模型能做的只有收尾。 具体的判定拆成两个小函数。hasDirectHumanInput 扫描之前先确认调用者是顶层根 agent,子 Agent 连扫描资格都没有,然后在窗口事件里找一条来源标记为真人的消息,找到才成立。isMatchingGoalRound 对轮次编号:注入消息的 goalId、revision、round 三个值要和当前目标逐一相等,才算当前获准轮。上一轮的旧消息、别的目标的消息、编号跳号的消息,都换不来授权。 两个判定怎么合成最终裁决?这段源码一共 8 行,短到可以整段当金句看。它证明整条判定路径上没有白名单、没有评分、没有语义分析:先问有没有真人,再问是不是当前轮,都不是就抛结构化错误。 ## Compaction 双路径与 replaceGeneration(上下文工程) URL: https://xueai.miyang.cn/slides/dsh-4.html (以下为免费预览,全文见页面) Compaction 双路径与 replaceGeneration 上下文快满了就主动收拾,真撑爆了就先收拾再重试。重试前先对一遍世代号,收拾没起效就不许重试。 压力触发与溢出恢复两条正交路径,以及用世代号证明「压缩确实发生过」才允许重试 把上下文窗口想成一只行李箱:每条消息是一件衣物,虚线是八分满警戒线。左下角的收拾次数就是 replaceGeneration(世代号),只增不减。三个情景对应压缩的三种命运,每一步都有字幕解说。 它解决什么问题 假设只做主动阈值这一条路:每次请求前量一下,超过八成就收拾。听起来够了,实际不够。token 数是估出来的,估算和 provider 的真实计数总有出入。一条超大的工具结果突然塞进来,测量还没到阈值,请求已经超限,provider 直接拒绝。这时候没有任何补救逻辑接手,turn 就地报错终止,用户看到的是一次莫名其妙的失败。 一次算错就直接撞墙,没有第二道防线。这就是单触发器的问题。 思路是什么 DSH 把这件事拆成两个独立的触发器。快满了主动收,撞墙了被动救,两条路挂不同的事件、用不同的条件、有不同的失败语义。 pressure 路径挂在每个 Step(一次模型请求)开始之前。先量总 token,超过容量的 0.8 就动手收拾,收拾时给最近的对话留 16% 的原文尾巴。它的失败语义很松:收拾中途出了错,日志里记一句就继续走,提前收拾失败了天塌不下来。 context-overflow 路径挂在请求报错之后,只认适配器规范化过的错误码 CONTEXT_WINDOW_EXCEEDED,其他错误一律放行。它不看阈值,保留预算直接清零,强制做一次真实的缩减。它的失败语义很严:必须给出决定,要么重试,要么保留原始错误上报。重试上限默认 1 次,每收到一条成功的模型回复就清零计数,正常干活的会话不会被卡住。 ## Token 计量:决策用重放,展示用投影(上下文工程) URL: https://xueai.miyang.cn/slides/dsh-9.html (以下为免费预览,全文见页面) Token 计量:决策用重放,展示用投影 两套计量各干各的,压缩决策从不信 UI 上那个数。核心源码:packages/llm/token-meter/src/usage-projection.ts。 两套计量各干各的,压缩决策从不信 UI 上那个数 先玩再讲。左表是重放实测 measure(),压缩决策读它。右表是 UI 投影 projectedTokens,状态行显示它。一场对话逐步推进:大工具输出、压缩、换模型、新请求。你会看到两表大部分时候贴得很近,然后在换模型那一步公开分叉,还理直气壮。 先给结论:这两个数回答的问题不一样。压缩决策要回答此刻这个会话如果发请求会有多大,答案必须准,可以贵。UI 状态行只要给用户看个占用率,答案必须便宜、持久、重连后立刻能显示,准到小数点没有意义。DSH 干脆各修一条路,谁也不迁就谁。 决策这条路叫重放。ctx.tokenMeter.measure() 每次被调用,都把持久日志的当前尾部折叠成一份不可变快照:最近一次成功请求的 provider usage 若能匹配当前请求信封、且总量不低于它的完整启发式锚点,就拿来当锚;surface(模型可见表面)此后的增减用有符号 delta 重新定价;没有可复用的锚就整体按固定启发式定价。 代价也明明白白:每次调用 O(surface),所以只有压缩这样的决策方在自己的请求边界调它。 出处:docs/subsystems/token-meter.zh.md 对 baseline 两种取值(usage 锚 / estimated 启发式锚)的定义。 展示这条路叫投影。它是普通的持久会话投影状态,只有两个各自后者胜的字段:pressureTokens,最近一次请求报告的提示词侧规模,口径是输入加缓存读写、不含输出(usage-projection.ts 第 70 到 72 行);还有 contextWindow,来自最新一条 request/context 日志记录。分子分母各写各的,从不凑成一次原子观测。 ## Spill:工具输出太大怎么办(上下文工程) URL: https://xueai.miyang.cn/slides/dsh-10.html (以下为免费预览,全文见页面) Spill:工具输出太大怎么办 超限输出落盘存档,给模型留一张取回凭证。核心源码:packages/spill/spill-policy/src/index.ts。 超限输出落盘存档,给模型留一张取回凭证 一条 grep 命中了几万行,或者 web_fetch 抓回一整页文档,结果 2MB。这条结果接下来去哪,只有三个选项。 选项一,整个塞进上下文。下一次模型请求直接被它占满,钱包和上下文窗口一起遭殃。选项二,砍掉超出的部分。省是省了,可万一模型后面要找的正是被砍掉的那行报错,任务就卡死了。选项三是 DSH 的做法:全文落盘存档,上下文里只留首尾预览,外加一句提示,告诉模型全文存在哪个路径、用 read 或 grep 就能捞。丢出去的信息随时找得回来,这就是 Spill(溢写)。 干这件事的插件叫 dsh-spill-policy。它挂在工具执行流水线的 tools/post-execute 事件上,等一条工具结果彻底定稿后才出手。整个决策就五步,Agent Note 2026-07-08 写得很清楚:委托、纯文本检查、字节阈值、saveText、替换。演示里那张清单就是这五步的原样搬运。 结果里混进任何一个非文本块(比如一张截图),flattenPlainText 返回 undefined,整条结果原样保留。策略只认识最终格式化文本,不懂工具内部结构,所以宁可不碰。出处:index.ts 第 80 至 87 行。 模型面向的那一臂明确跳过 read 工具,防止 read 的输出被 spill 成文件、模型再 read、再 spill 的死循环。日志那一臂不跳,因为日志副本进不了模型上下文,循环不成立。出处:第 195 至 197 行与第 219 至 222 行注释。 locator 是不透明句柄:本地后端给的是文件路径,远程后端可以给 URI 或键。消费方不解析它,按后端附带的 retrievalHint 渲染取回话术,不假定 read 永远是正确的取回方式。出处:docs/subsystems/spill.zh.md 第 70 行。 策略的入口是一串放行判断,四条不碰的理由挨个查:下游监听器没接受这条结果、别的插件已经替换过值、这是嵌套子调用或 read 工具、内容混了非文本块,任何一条命中就原样放行。都没命中,再量字节,没超过 maxInlineBytes 也放行。全过了才走 spill。 ## 会话检索与跨会话引用(上下文工程) URL: https://xueai.miyang.cn/slides/dsh-11.html (以下为免费预览,全文见页面) 会话检索与跨会话引用 旧会话是可检索的资料库,引用还能带出处。核心源码:packages/session-query/ 与 packages/context/session-reference/。 旧会话是可检索的资料库,引用还能带出处 你上周和 Agent 修过一个 CI 报错,今天想问「上次那个报错的堆栈是什么」。大多数系统答不上来,因为旧会话只是一堆躺在磁盘上的日志文件,新会话看不见它们。 DSH 的答案分两层。第一层是检索:ctx.sessionQuery 把所有旧会话(活着的和落盘的)合成一个逻辑语料库,SQLite FTS5 做全文索引,searchSessions() 跨会话搜、searchEvents() 在单个会话里搜,命中带片段和出处。第二层是引用:搜到了想拿进当前对话,ctx.sessionReferenceResolver 给源会话拍一张冻结快照,包成一条带警告的消息塞进上下文,出处齐全。 先说检索层最特别的一点:每条事件带一个三态标注。current 表示还在模型上下文里;shadowed 表示被压缩替换掉了,模型已经看不见;log-only 表示从来只活在日志里(比如结构事件)。SQLite 提供方的文档写明「默认可搜索全部三种表层(current、shadowed 和 log-only)。传入表层过滤器可缩小范围」(session-query-sqlite/README.zh.md 第 13 行)。也就是说,压缩丢掉的内容对模型不可见,对检索仍然可见。遗忘和销毁是两回事。 压缩把旧事件从模型上下文里替换掉,但日志原文还在,FTS 默认连 shadowed 一起搜。想只搜模型还看得见的内容,传 surface: ['current'] 过滤器。宿主侧边栏搜索就是这么干的(api-proxy.ts 第 2078 行)。 prepare() 入队前对每个源调一次 readSurface(),之后绝不重读。README 的原话:「后续源变更、压缩或删除都无法改变目标回放」。引用就是一张拍死的照片,没有 fork 语义,也没有订阅语义。 模型拿不到任意翻别人会话的搜索工具。session-reference 假设宿主有权读它公开的每个会话;宿主搜索那头,api-proxy 的注释写明「Host visibility is the authorization boundary」,命中必须落在宿主可见的会话集合里才放行(第 2114 至 2118 行)。 ## 工具执行流水线:三段瀑布与单调 Guard(工具系统) URL: https://xueai.miyang.cn/slides/dsh-12.html (以下为免费预览,全文见页面) 工具执行流水线:三段瀑布与单调 Guard pre-execute 到 post-execute 的三段管线,Guard 只能收紧不能放行。核心源码:packages/core/tools/src/index.ts。 pre-execute 到 post-execute 的三段管线,Guard 只能收紧不能放行 先说清问题。权限检查、人工审批、超时、结果改写、UI 渲染,全都想挂进工具执行这一个动作里。如果让每个工具自己处理,40 个工具就有 40 份权限代码。DSH 的做法是把工具执行做成一条流水线,策略全部住在流水线的固定工位上,工具本体只做一件事:执行并返回值。 流水线的顺序写在 docs/tool-execution-pipeline.zh.md 第 8 行:tools/pre-execute 先跑,随后是单调守卫,然后是 tools/execute 和 tools/post-execute。瀑布(waterfall)是 DSH 的监听器排队模式:每个监听器拿到 (exec, next),可以调 next() 把决定权交给下一位,也可以直接返回一个决定当场定案。 三段的分工很清楚。第 1 段 pre-execute 在工具跑之前表态,返回值只有三种:allow 放行、deny 拒绝、ask 转人工审批。ask 只有拿到审批服务的 allowed-once 才继续,没接审批通道就当 deny 处理。第 2 段 execute 是环绕式包装,超时策略、重试、指标都在这里给真正的执行包一层,它能替换取消信号但动不了调用身份。第 3 段 post-execute 在结果出来之后检查:原样接受、换掉内容、换掉值,或者 block 把结果改写成一条纠正性错误。 被 deny 的调用会物化成 Error: 理由 的 isError 结果,而且照样走 post-execute 和 tools/result。模型能看到自己为什么被拒,循环不会因为一次拒绝卡死。 pre-execute 可以否决但不能改写参数。因为 tool/call 事件在执行前就落了日志,UI 的待执行卡片也已经按原参数渲染,改参数会让历史、界面、执行三方对不上(index.ts 第 583 至 586 行的类型注释写明了这条排除)。 Guard 在 pre-execute 全部表态之后、工具本体之前跑,签名是同步函数:返回字符串就是拒绝理由,返回 undefined 就是弃权。全局 Guard 先问,再沿 agent 的作用域链从远到近问(index.ts 第 1118 至 1127 行)。 先看边界问题:两个 pre-execute 监听器,一个想 allow 一个想 ask,最终听谁的?答案是排在前面的那个。瀑布是短路的,第一个不调 next() 直接返回决定的监听器就定了案。所以 pre-execute 天然顺序敏感,插件加载顺序一变,安全结论就可能跟着变。 ## 工具输出契约:值与展示分离(工具系统) URL: https://xueai.miyang.cn/slides/dsh-13.html (以下为免费预览,全文见页面) 工具输出契约:值与展示分离 同一个结果,模型看的和人看的可以不一样。核心源码:packages/core/tools/src/index.ts 与 presentation.ts。 同一个结果,模型看的和人看的可以不一样 先回答标题里的问题:工具结果到底是字符串还是结构化值?在 DSH 里两个都是,但地位不同。工具的 execute 只返回一个规范 JSON 值(canonical value),这个值必须通过工具自己声明的 output.schema 校验。字符串是后来才有的:注册表拿着校验过的值调用 render(args, value),投影出模型看到的内容块。 所以链路是:execute 产出值,schema 把关,render 投影模型内容,可选的 presentationMeta 投影一份可回放的 UI 数据,presentResult 再把它变成一张卡片。render 和 presentResult 都是纯函数,不做 I/O,因为它们在实时流式输出和会话日志回放两条路径上都要跑,跑出来必须一样。 UI 那边拿到的东西叫渲染意图(render intent):一个带 card 标签的联合类型,值域是 generic、terminal、diff、read、search、web 六种卡片。客户端只需要对 card 做 switch,不需要认识任何工具名。换一个搜索后端 provider,工具实现整个换掉,只要它还产出 search 卡,UI 一行不用改。这就是 UI 契约与工具实现解耦的意思。 持久化的 tool/result 事件只存 content、error 和 meta,规范值从不落盘。回放可以重现每一张卡片和每一段模型文本,却重建不了中间值(docs/subsystems/tools.zh.md「结果仅承载产出」一节)。 值没过 schema、render 抛异常、presentationMeta 产出非 JSON,全部转成 JSON 安全的 isError 结果。模型看到一条错误文本,流水线照常走完,出处在 index.ts 第 1793 行起的 createSuccessResult。 search 卡强制携带 truncated 和 total 两个字段,UI 永远不会把砍过的结果当完整结果画出来(presentation.ts 第 223 至 231 行)。read 卡同理带 offset 和 totalLines,能画出「显示 N 行,共 M 行」。 ## 文件编辑的工程学:先读后写(工具系统) URL: https://xueai.miyang.cn/slides/dsh-14.html (以下为免费预览,全文见页面) 文件编辑的工程学:先读后写 read / edit / write 三件套,没读过的文件不许改。核心源码:packages/fs/fs-observation-policy/src/index.ts。 read / edit / write 三件套,没读过的文件不许改 Agent 改文件的三大翻车现场:改错位置、覆盖没读过的文件、拿着过期内容做编辑。DSH 的对策是三件套加一本账。三件套是面向模型的 read、edit、write 工具(docs/tool-catalog.zh.md):read 窗口化读取带行号的文本,edit 做字面量替换,write 整文件创建或覆盖。账是 fs-observation-policy 插件肚子里的一个弱引用映射:以会话为键,记下每个文件目标的观测状态。 账本只有三种状态。未见:账本里压根没这个文件的条目。present@vN:读到过,而且读到的是版本 vN,版本号是文件系统后端签发的不透明新鲜度凭证。absent:确认过这个路径不存在,比如 read 扑了个空。每次 read、write、edit 成功后,工具会发一个 fs/observed 事件,插件同步记账。 判定发生在动手之前。工具要写或要改时,会分发 fs/write-intent 或 fs/edit-intent 事件,这是单槽瀑布:第一个返回决定的监听器独占决策权,按部署约定就是这个策略插件。它对着账本给出守卫条件,真正的检查由后端在一个原子临界区里完成:先验版本再匹配再替换,中途谁也插不进来。 没读过就 write,守卫是 createIfAbsent:文件不存在就创建,存在就拒绝(FS_NOT_OBSERVED)。读过再 write,守卫是 replaceIfVersion:版本对上才替换。新建文件不用先读,覆盖别人的文件不行。 没读过直接 FS_NOT_OBSERVED,账本记着 absent 就 FS_NOT_FOUND,读过则带版本守卫上路。版本检查排在字面量匹配之前,所以拿过期内容编辑报的是 FS_STALE_VERSION,不会退化成一个误导性的匹配失败。 所有失败都带稳定的 FsError code,工具注册表在错误结果上保留 { name, code }。重试逻辑和 UI 按 code 分支就行,不用解析错误文案(docs/subsystems/filesystem.zh.md「错误分类体系」)。 整个策略插件不到 140 行,核心就是两个查账函数。write 的判定是一个三行的选择:查账发现读到过(present),就返回带版本号的 replaceIfVersion 守卫,版本对上才许替换;账本里没条目或者确认过不存在,就返回 createIfAbsent,文件不存在才许创建。函数头上的注释把这张决策表用两个箭头写完了。这就是「write 永远有路走」的实现:新建文件不用先读,覆盖别人的文件不行。 ## DSH 独有的工具面:terminal / lsp / jobs(工具系统) URL: https://xueai.miyang.cn/slides/dsh-17.html (以下为免费预览,全文见页面) DSH 独有的工具面:terminal / lsp / jobs 别家没有的几个工具各解决什么问题。核心源码:packages/terminal/、packages/lsp/ 与 packages/jobs/,工具描述全文见 docs/tool-catalog.zh.md。 别家没有的几个工具各解决什么问题 同一个任务:起一个 Python REPL,分三步调试一段代码。情景 A 左边只给 bash 单工具,右边给 terminal 六件套,直接看轮数和重复劳动的差距。情景 B 演示 jobs 面板:三种完全不同的后台任务,怎么被同一张列表管起来。 六个工具:terminal_open / send / read / signal / close / list,背后是持久 PTY 会话。 REPL、gdb、ssh 这类有状态程序,跨调用活着。 每个会话归属确切的 Agent 实例,别的 agent 拿到 id 也操作不了。 恰好四类查询:跳定义、找引用、跳实现、hover,闭合联合,加一类就是编译期大改。 故意不开通用 JSON-RPC 逃生口,模型玩不出协议花活。 没有 provider 时 schema 不变,返回结构化 LSP_UNAVAILABLE。 后台 bash、后台 PTY 发送、后台 subagent,全部注册成 -N 任务。 统一 job_list / job_output / job_kill 三个工具管一切。 授权看所有者会话,id 可预测也无所谓;每个 owner 默认最多 10 个并发。 先看最容易被低估的 terminal。一次性 bash 的问题演示里已经看到了:REPL 的变量活不过一次调用,模型只能把旧代码全部重发一遍,轮数和 token 双倍烧。DSH 的解法是把 PTY 会话做成一等资源:terminal_open 建会话拿 id,之后的 send、read、signal、close 全按 id 操作,会话在后端和工具插件热重载期间照样活着(docs/subsystems/terminal.zh.md「归属与持久性」一节)。 工具描述本身就是提示词工程的范本,1878 行的工具目录里 terminal_send 这条把等待语义一句话说清: 「向持久终端发送文本。默认会提交 Enter,并等待提示符、stdin 等待、输出静默、超时或会话退出。后台模式会返回供 job_output/job_kill 使用的 job id。」 然后是并发纪律:一个 PTY 会话同一时刻只接受一个活动 send。两个调用抢同一个终端,第二个直接吃结构化报错,谁都别想把字符插进别人的命令中间。 ## 审批与权限:两个旋钮,一个下拉框(审批与沙箱) URL: https://xueai.miyang.cn/slides/dsh-15.html (以下为免费预览,全文见页面) 审批与权限:两个旋钮,一个下拉框 沙箱模式和审批策略是两个独立旋钮,预设只是常用组合。核心源码:packages/interaction/user-approval 与 packages/interaction/permission-presets。 沙箱模式和审批策略是两个独立旋钮,预设只是常用组合 下面是一个可以拧的权限控制台。左边两个旋钮各管一件事,右边下拉框是预设。先选一个操作,点「播放」看这次工具调用一路闯关的过程;然后随便拧旋钮、换预设,再跑一遍,看同一个操作的命运怎么变。 旋钮一 · 沙箱模式 旋钮二 · 审批策略 预设下拉框 先给结论:DSH 把权限这个大词拆成了两个互不打听的小问题。旋钮一 sandbox/mode 回答的是这条命令的文件效果允许到什么程度,取值 read-only、workspace-write、danger-full-access 三档,只管文件系统,网络和进程可见性都不在它的词汇表里(docs/subsystems/sandbox.zh.md 开头的定义)。旋钮二 approval/policy 回答的是碰到需要人拍板的事问不问,取值 ask、never 两档。 两个旋钮在日志里也是两种独立事件:sandbox/mode 和 approval/policy。执行、提示词、回放,全都只读这两种旋钮事件的折叠结果。这就是正交的实际含义:拧任何一个,另一个纹丝不动。 read-only:后端必须拒绝写入,只保留 /dev/null 这类 shell 必需的接收器。 workspace-write:工作区根目录与后端承诺的临时区可写,界外一律拦。 danger-full-access:绕过隔离。消费方直接 spawn 原始命令,根本不调用 ctx.sandbox。 ask(默认):交给组合的应答者链。一个应答者都没有?链走到头返回 unavailable,照样按拒绝处理。 never:确定性返回 rejected,不分发任何应答者。CI 与无人值守的标准姿势。 唯一的放行值是 allowed-once,且只授权所询问的那一个操作。rejected、cancelled、unavailable 三种结果调用方全部执行拒绝。 然后是那个下拉框。ctx.permissionPresets 维护一张表:名字映射到一个旋钮组合。默认表就两行,workspace-write 对应 workspace-write 加 ask,danger-full-access 对应 danger-full-access 加 never(permission-presets/src/index.ts 第 167 至 176 行的默认配置)。它是可选能力,不在 agent loop 主干上,也不拥有任何强制执行。 切预设时发生什么?三条事件,顺序固定:先追加一条只记日志的 permission/preset 记下你的意图,再通过两个旋钮各自的规范 setter 写 sandbox/mode 和 approval/policy,而且只写生效值真的变了的那个。重新选中当前预设?什么都不追加。回放时执行层只认旋钮事件,preset 事件的唯一作用是当两个预设共享同一组合时,记住你当初选的到底是哪一个名字。 ## 沙箱:从 seatbelt 到执行世界(审批与沙箱) URL: https://xueai.miyang.cn/slides/dsh-16.html (以下为免费预览,全文见页面) 沙箱:从 seatbelt 到执行世界 ctx.fs 和 ctx.subprocess 同享一个路径命名空间,执行环境可以整体换掉。核心源码:packages/sandbox/、packages/e2b/ 与 native/landlock-run/。 ctx.fs 和 ctx.subprocess 同享一个路径命名空间,执行环境可以整体换掉 先玩再讲。情景 A 演示换世界:上排是 bash、PTY、LSP 这些干活的组件,它们只连着中间两个插口。点「切到 E2B」,看插口下面的世界整体换掉时,上面有没有一根线断。再点「反面教材」,看没有插口的架构换世界是什么惨状。情景 B 是拒绝解码器:同一条报错 stderr,怎么区分是沙箱拦了,还是沙箱自己坏了。 先给结论:DSH 把沙箱拆成了三层,各管各的。 ctx.sandbox.confine(argv, policy) 只做一件事:把你要 spawn 的 argv 包一层限制 runner。Linux 用 bwrap 或 Landlock,macOS 用 Seatbelt(sandbox-exec),Windows 用 ACL 受限令牌。前提是子进程与宿主共享文件系统和内核。 read / write / edit 这些操作根本不 spawn 子进程,包 argv 没意义。fs-sandbox 在受信代码里做策略检查:规范化路径、验证包含关系,拒绝时抛结构化的 FS_SANDBOX_DENIED。它自己知道拒绝了什么,不用去猜内核 stderr 的文本。 容器、microVM、远程执行属于整个能力 seam 的同级替换,压根轮不到 ctx.sandbox 出面(docs/subsystems/sandbox.zh.md 第 5 行)。想换到远端,换掉 ctx.fs 和 ctx.subprocess 两个插口的实现就行。 第一层有个容易想错的点:沙箱策略是每次调用随身携带的参数,从来不焊死成提供方的全局状态。ctx.sandboxPolicy.resolve() 为每次能力调用解析一份完整策略(模式 + 工作区根目录 + 会话标识),显式批准的提权模式压过会话设置,会话设置压过部署默认值。所以同一个进程里两个会话,一个 read-only 一个 workspace-write,向同一个提供方要不同的边界,互不干扰;批准过的提权重试也只是一次带更宽策略的新调用,提供方状态一点没变。 Linux 的 Landlock 后端值得单独说一句。DSH 没用现成的包装库,自己写了 landlock-run:约 300 行 C11、musl 静态链接,先在自己身上装好 Landlock 规则集再 exec 目标命令,规则集跨 execve 继承,所以命令拉起的每个子孙进程都在限制下。内核不支持就直接退出,不跑命令。二进制约定(argv 语法、退出码、报告行)锁定在 native/landlock-run/docs/cli-contract.md;probe() 返回 full、partial、unusable 三态,老内核 ABI 只报 partial。还有个细节:启动器失败的约定退出码是 125,但成功 exec 的子进程也可能自己退 125,所以光看退出码永远定不了性,必须同时看到致命诊断行。这就引出了下面两套分类器。 ## Code Mode:一段代码顶多轮工具调用(代码模式) URL: https://xueai.miyang.cn/slides/dsh-5.html (以下为免费预览,全文见页面) Code Mode:一段代码顶多轮工具调用 模型写一段小程序,run_code 把它送进 worker 沙箱,五次工具调用一轮搞定。本课讲这个设计背后的两个思路。 官宣叫 PTC,源码叫 code mode:worker 沙箱的隔离、通信协议与双重记账 先把名字说清楚。官方发布文叫它 PTC,程序化工具调用,preset 元数据也写着 name: PTC 模式(出处:apps/cli/config/agent-presets/code/preset.yml 第 1 行)。去源码里搜 PTC,搜不到。内部命名从头到尾是 code mode:配置项 mode: code、工具名 run_code。两个名字,同一个机制。 原生工具调用像给模型一个遥控器。按一下,读一个文件;结果回来,再按一下。每按一下都是一轮完整采样,模型要把滚大的上下文重新读一遍才能决定下一步。读 3 个日志文件写份报告就是 5 轮,换成 50 个文件,预算和耐心一起烧完。成本瓶颈不在工具本身,在一步一采样的节奏上。 一轮采样里,模型直接写一段 TypeScript 小程序,程序里用 await tools.name(args) 想调几次调几次,循环、分支都行。程序在沙箱里把活干完,中间结果全留在沙箱变量里,跑完只把 print 和 return 的内容送回模型。工具描述的原话是「Only what you print or return comes back — curate it.」(出处:packages/core/tools/src/code-mode.ts 第 52 行)。 这句话有出处,preset 文件头的设计意图注释原话就是「five round trips becomes one」,本课标题就从这来: ## Subagent 是一个 seam:从进程内到委派 Claude Code(编排与子 Agent) URL: https://xueai.miyang.cn/slides/dsh-18.html (以下为免费预览,全文见页面) Subagent 是一个 seam:从进程内到委派 Claude Code 子 Agent 是能力接缝,进程内、远程、别家产品都能接。核心源码:packages/subagent/。 子 Agent 是能力接缝,进程内、远程、别家产品都能接 同一个子任务「调研这个模块并汇报」,切换四个 provider 分别委派一次。观察两件事:接缝两端哪些东西完全不变,哪些东西随实现而变。再打开「附带 persona 要求」开关,看能力门闩怎么把超纲请求拦在启动之前。 启动时能力 spawn outputSchema(结构化输出) 支持 depthLimit(委派深度上限) 支持 toolFilter(限工具) 支持 persona(换人设) 支持 先说结论。DSH 没有做一个单独的子 Agent 功能,它做的是一个叫 ctx.subagents 的注册表:任何实现了 SubagentProvider 约定的传输层,都可以按名字注册进来。官方发行版注册了六个:spawn(进程内新开)、fork(进程内带上下文)、acp(协议桥)、codex、claude-code(各起一个真实的产品 CLI 进程)、sdk(远程 DSH 实例)。出处在 docs/subsystems/subagent.zh.md 第 5 至 7 行。 输入是什么:工具层把模型的委派请求组装成 SubagentStartRequest,带上 prompt、父 Agent、取消信号,外加四个可选项(结构化输出 schema、深度上限、工具过滤、persona)。发生什么:服务先查所选 provider 的静态能力表,四个可选项每一项都要有对应的能力 flag,缺一项就在启动之前抛 UNSUPPORTED_CAPABILITY。输出是什么:一个 SubagentRun 句柄,父 Agent 等它的 result,最后落成一条普通的工具结果。对父 Agent 来说,四种 provider 回来的都是同一种东西。 值得停一下的是 fork 的身份。很多框架把带不带父上下文做成一个布尔参数。DSH 把 fork 做成了一个独立 provider,原因是它俩差的不只是一个开关:fork 要从父日志里切出「已完成轮次的平衡前缀」当种子,切到最后一个 turn/end 为止,进行中的轮次不平衡、回放不了,必须排除。这是会话日志层面的约定,塞进一个 flag 里说不清楚。 ## workflow / schedule / plan / todo:编排原语的取舍(编排与子 Agent) URL: https://xueai.miyang.cn/slides/dsh-19.html (以下为免费预览,全文见页面) workflow / schedule / plan / todo:编排原语的取舍 四种编排原语各管什么,为什么没做成一个大而全。核心文档:docs/subsystems/workflow.zh.md 等四篇。 四种编排原语各管什么,为什么没做成一个大而全 四个真实场景,每个场景选一个原语。选错也没关系,判词会讲清楚为什么。点「播放」可以看自动讲解,自己点卡片可以随时抢答。 先给结论:这四个原语没有共享一个任务引擎,它们连持久化形态都不一样。workflow 是一次性的:模型写一段 JS 脚本,引擎在 node:worker_threads 的 vm 里执行,脚本里的 agent() 打回宿主起子 Agent,跑完只留结果与展示记录,逻辑本身不落成持久状态机。schedule 是持久的:create、dispatch、delete 都是 schedule/change 会话事件,回放日志就能重建全部提醒状态。plan 更轻,就是一个 plan/mode 布尔事件的日志折叠。todo 是快照:每次 todo_write 整表替换,UI 靠投影渲染最新一份。 大纲里那个问题「多步编排应该是模型写脚本还是框架状态机」,DSH 的回答是两个都要,但分工明确。执行编排交给模型写脚本,因为编排逻辑千变万化,框架预设不完;时间、姿态、展示交给框架状态机,因为这三样需要跨轮次甚至跨重启的确定性,模型的脚本给不了。workflow 文档自己说了,它的 meta 字段词汇与 Claude Code 的 dynamic workflows 对齐(workflow.zh.md 第 41、49 行),思路同源,落点不同。 还有一条容易忽略的纪律。workflow 脚本里拼错一个 agent() 选项,抛的是 fatal: true 的 WorkflowError,parallel() 组合器对它直接重抛、终止整个脚本;只有子 Agent 真实的运行失败才映射成逐项的 null(workflow.zh.md 第 116 行)。写错代码和运行失败是两类错误,混在一起脚本就没法调了。 ## Skill、Preset 与自我修改(编排与子 Agent) URL: https://xueai.miyang.cn/slides/dsh-20.html (以下为免费预览,全文见页面) Skill、Preset 与自我修改 cordis_define 让 Agent 在运行时改写自己的运行时。核心目录:packages/extensions/tool-cordis/ 与 apps/cli/config/agent-presets/。 cordis_define 让 Agent 在运行时改写自己的运行时 场景:创造模式(cordis preset)的会话里,用户说「给我做一个统计代码行数的工具」。左边是运行时的实时状态,右边是 Agent 的动作,跟着字幕走一遍。 插件登记簿(Plugin / Package) 工具目录 Agent 的动作 先解发布文那个悬念:标准、代码、极简、创造四种模式,在源码里找不到一行模式分支。apps/cli/config/agent-presets/ 下就是四个目录,每个目录一份 agent.cordis.yml,一份文件描述一种插件组合,给一个会话挂载。极简模式全文 62 行:persona 一句「You are a helpful software engineer assistant.」加 complete: true(拒绝任何后续拼装往提示词里加料),工具只有持久 bash 和编辑器,连压缩都没有,这是拿来跑基准测试的配置。创造模式则是标准模式原封不动,多挂三样:自指工具集 tool-cordis、一个教写组合的 skill、一段教模型分清两个平面的 persona。 两个平面是这套体系的坐标系。HOST 组合放跨会话共享的东西:持久化、沙箱与审批、模型路由、subagent 注册表。AGENT PRESET 放一个会话贡献给这些注册表的东西:它的工具、persona、提示词段落。有个细节能看出边界画得多细:preset 里发布服务的行,要么归 host,要么包进 isolate realm。极简模式想用不带沙箱的本地文件系统,就把 fs-local 包在自己的 realm 里,只遮蔽自己这个会话的 fs,别的会话照旧走沙箱(minimal/agent.cordis.yml 第 46 至 57 行)。 skill 也是分层的。全局层放部署级注册的(仓库插件),preset 层放随 preset 走的,读取时近层同名直接赢,排序权重只在同一层内起作用。创造模式那个 editing-cordis-compositions skill 就住在 preset 目录里,跟着 preset 被复制和编辑,理由写在 yml 注释里:它描述的是这个部署的两个平面,preset 才是被复制的单位(cordis/agent.cordis.yml 第 248 至 254 行)。设计记录里还专门否决过跨层合并排序的方案,遮蔽必须干脆,不然模型看到两个同名 skill 会无所适从(.agents/notes/implemented/architecture/2026-08-09-layered-skill-registry.zh.md)。 ## MCP 与 Extensions:外部工具接入的两条路(模型与外部接入) URL: https://xueai.miyang.cn/slides/dsh-21.html (以下为免费预览,全文见页面) MCP 与 Extensions:外部工具接入的两条路 桥接生态标准与原生扩展怎么分工。核心源码:packages/mcp/mcp-client/ 与 packages/extensions/。 桥接生态标准与原生扩展怎么分工 先玩再讲。同一个外部能力「查天气」,左边走 MCP 桥,右边走原生 Extension,两条路同时接入。看三件事:工具名怎么生成、服务器断线时模型视角发生什么、两条路的能力面差多少。点「播放」自动走完,或用「单步」逐帧看。 先解释名词。MCP(Model Context Protocol)是一个开放协议:任何人写一个工具服务器,任何支持 MCP 的客户端都能连上去用它的工具。DSH 的 dsh-mcp-client 插件就是这个协议的客户端,一个插件实例连一个服务器,stdio 子进程和 streamable-http 两种传输都支持。连接成功后它做的事很直白:listTools() 拉一遍工具清单,把每个工具用公开名注册进 ctx.tools,模型从此把它们当原生工具用。 命名是第一个设计点。每个 MCP 工具有两个名字:原始名只在网线上出现(tools/call 用它),模型看到的公开名是 mcp__服务器名__原始名。这个格式与 Claude Code 和 Codex 一致,mcp-client 的 README 自己点了这一句。名字必须满足 DeepSeek 函数名约定:最长 64 字符、只允许字母数字下划线连字符。要是替换字符或截断改动了名字,就在尾部追加一个 12 位十六进制的 SHA-256 hash,保证两个不同的工具身份绝不会折叠成同一个名字。整个函数是 (serverName, rawName) 的纯函数:连接顺序、重新同步、别的服务器,都改不了一个工具的名字。 export function publicToolName(serverName: string, rawName: string): string { const joined = `mcp__${serverName}__${rawName}` const normalized = joined.replace(INVALID_NAME_CHARS, '_') if (normalized === joined && normalized.length <= MAX_PUBLIC_NAME_LENGTH) return normalized const hash = createHash('sha256').update(`${serverName}\0${rawName}`).digest('hex').slice(0, HASH_LENGTH) return `${normalized.slice(0, MAX_PUBLIC_NAME_LENGTH - HASH_LENGTH - 1)}_${hash}` } 第二个设计点是世代(generation)。服务器的工具清单会变,变了就要重新同步。同步分两阶段:先把下一世代的全部工具定义拉完建好,任何一步失败都不碰注册表,上一世代原样活着;拉完了才做交换,先注销旧世代、再注册新世代。 交换阶段的写法值得讲一下。注册循环里,每注册成功一个工具就把它的注销函数存进一张表。任何一次注册抛了冲突(意味着有外来注册霸占了这台服务器的命名空间),catch 分支就把这张表里已注册的全部注销,一个工具都不留,然后记一条 error 日志。注释把意图写得很直白:回滚是为了让模型看到的要么是完整的一个世代,要么什么都没有,绝不能是半套。 ## LLM 适配层:单次尝试、显式重试、双流持久(模型与外部接入) URL: https://xueai.miyang.cn/slides/dsh-22.html (以下为免费预览,全文见页面) LLM 适配层:单次尝试、显式重试、双流持久 推理流与正文流分开存,重试是显式事件。核心源码:packages/llm/llm/src/assembler.ts 与 packages/core/agent-loop/src/agent.ts。 推理流与正文流分开存,重试是显式事件 先玩再讲。左边是网线上的 SSE 分片(provider 逐帧吐出来的原始数据),右边是会话日志(每个分片立刻落一条 assistant/chunk,流结束再派生一条 assistant/message),上方是用户看到的 UI。三个情景:A 是一次顺利的双流落盘;B 中途断线,看重试怎么以显式事件出现在时间线上;C 是反面教材,SDK 静默重试模式,同一个故障,日志里无迹可查。 先立规矩。DSH 的适配器约定里有一条写得很硬:一次适配器调用就是一次提供方尝试,适配器必须禁用库自带的重试(docs/subsystems/llm-streaming.zh.md 适配器约定一节)。HTTP 库们都爱替你悄悄重试,看起来是贴心,实际是把信息藏起来了:请求为什么慢、重试了几次、每次因为什么失败,全部消失在库的内部循环里。DSH 把这层全部剥掉,适配器只干一件事:发一次请求,把响应转成统一的 StreamChunk 分片吐出来,失败就规范化成一个可序列化的 LlmFailure(带稳定的错误 code),别的不管。 防挂起也在这层解决:两个交付的远程适配器都带 streamIdleTimeoutMs 看门狗,默认五分钟,provider 停顿超时就映射成 TIMEOUT 错误。还有一条容易漏的:空回复算错误。模型返回一个不带任何内容块的 stop,适配器把它映射成 EMPTY_RESPONSE 错误而非静默的成功,这样重试层才有机会救它。 然后看落盘。agent loop 消费分片流的时候干两件事:每个分片原样追加一条 assistant/chunk 事件进会话日志,同时把分片喂给 BlockAssembler(组装器)。流成功结束,组装结果作为一条 assistant/message 事件再落一次盘。这就是双流:chunk 流是原始录像,回放测试靠它逐帧重建当年的响应;message 流是派生历史,下一次请求的对话上下文从它派生。推理块(reasoning,模型的思考过程)和正文块(text)在分片协议里就是不同类型,各自独立组装、各自落盘。 const assembler = new BlockAssembler() const chunkSeqs: number[] = [] const stream = preparedCall?.stream(request) ?? this.loopCtx.llm.stream(request) signal.throwIfAborted() for await (const chunk of stream) { signal.throwIfAborted() chunkSeqs.push(this.session.append('assistant/chunk', { turn, step, chunk }).seq) assembler.push(chunk) } ## 测试一个非确定性系统(模型与外部接入) URL: https://xueai.miyang.cn/slides/dsh-26.html (以下为免费预览,全文见页面) 测试一个非确定性系统 确定性回放、性质测试、专门骗 LLM 客户端的故障服务器。核心材料:docs/testing.zh.md 与 packages/test-support/。 确定性回放、性质测试、专门骗 LLM 客户端的故障服务器 先玩再讲。情景 A 是一台真的 HTTP 故障服务器:行为排成队,每接一个请求消耗一个,看客户端怎么接招。情景 B 是确定性回放:拿一份真实会话日志,一键推导回放脚本重跑,再动手篡改一行,看 diff 怎么当场作证。 测非确定性系统的思路只有一条:把不确定的部分圈起来,让其余一切确定。DSH 的测试分层(docs/testing.zh.md)就是围着这条思路搭的。单元测试盯边界情况、错误路径、事件顺序和并发竞态;CI 的覆盖率门禁对 packages/*/*/src 按文件要求 100%(AGENTS.md 第 65 行 Commands 一节),文档同时把话说死:行覆盖率是必要条件,永远不是充分条件,没跑过的行往往是该删的死代码,而非该补的测试。 带密钥的真实 API 测试是另一层。这里有句很有身份特色的话: 推理对自家便宜,冒烟测试就往真里做:启动真实示例、发一条提示词、检查外部世界。断言也有讲究:e2e 要重新读文件、重跑命令来验证结果,对 agent 自身输出做关键词探测会让作弊的 agent 通过。缺密钥的环境自动跳过,不阻塞任何人。 重头戏是回放。上一课讲过(见 LLM 适配层),每个流式分片都以 assistant/chunk 事件原样落进会话日志。dsh-llm-replay 插件把这件事反过来用:拿一份录好的 session.jsonl,把 chunk 事件按 (turn, step) 分组,每组就是当年一次模型调用的完整分片序列。测试时真实 agent 照常跑,只是模型那头换成回放适配器,逐帧吐回录制的分片。不确定性只存在于录制那一次,之后每次重跑都逐字节一致,不需要 API Key。 这就是日志即测试资产的意思:fixture 不用手写 mock 数据,直接就是生产格式的会话日志本身。快照测试拿它固定整个组装后的行为,改一行代码导致行为分叉,diff 当场标红。还有个精巧的细节在 fork(分叉会话):子会话的日志开头继承了父会话的种子事件,回放推导脚本时必须从 seedLength 边界之后开始切,否则父会话的分片会被误当成子会话的调用重放: const text = readFileSync(childFile, 'utf8') const header = parseSessionHeader(text) // Derive the child's script from its own events only — events AT OR after the seed // boundary. const ownEvents = parseSessionLog(text).slice(header.seedLength) children.push({ recordedId: header.id, createdAt: header.createdAt, entries: deriveReplayScript(ownEvents), primary: false, }) ## 持久化治理:版本、fork 边界与拒绝解读(持久化与基建) URL: https://xueai.miyang.cn/slides/dsh-23.html (以下为免费预览,全文见页面) 持久化治理:版本、fork 边界与拒绝解读 日志格式怎么演进,分叉边界怎么定,读不懂的数据宁可拒绝。 日志格式怎么演进,分叉边界怎么定,读不懂的数据宁可拒绝 先玩再讲。上方是磁盘上的一份会话日志:一行 header 加一串事件。下面两个加载器同时读它:左边是 DSH 的「拒绝解读」式,读不懂就报错;右边是很多系统的惯用做法,「best-effort 跳过」式,读不懂就跳过接着读。三个场景各有一份问题日志,点播放,看同一份数据在两种加载器手里各是什么下场。 背景一句话:DSH 的会话日志是唯一真源,恢复、分叉、回放全从它派生(见 上一课的不变量)。真源要活得比任何一个版本的程序都久,所以格式演进不是小事:今天写的日志,明年的 harness 要能读;反过来,新版本写的日志落到老版本手里,老版本得知道自己读不了。 DSH 的版本方案朴素到只有一个数字:SESSION_FORMAT_VERSION,当前是 0,定义在 packages/core/session/src/types.ts 第 56 行。没有 1.2.3 这种大小版本。设计笔记的理由是:某一步升级能不能自动转换,由那一步的升级器写不写得出来决定,两级编号等于提前承诺了一件设计时根本不知道的事。 升不升版本的标准很明确:当且仅当老版本运行时无法在语义上完全正确地处理新日志时,才必须升。「解析不报错」不算数,能读完但重建出错误的会话,这就是读错了。拿不准就升,因为一个近似恒等的升级器几乎零成本,漏升一次却会让老版本静默读坏数据。 打开一份存储的日志时,先比版本号,三种结果对应三种完全不同的处理: 最值得咂摸的是「拒绝,并说明方向」这一格。早先的 assertVersion 对任何版本不匹配都抛同一条含糊的错误,改动之后报错分方向:日志比你新,明说「由更新的 harness 写入,请升级」,并附上原始日志文件的路径;日志比你旧但升级链断了,就说「本构建没有它的升级路径」。用户看到的永远是「该升级了」,绝不是「文件损坏」。数据明明没坏,报损坏是冤枉它。 往旧读的方向还有个细节。旧日志被新版本打开,升级器链只在内存里逐级转换,看一眼不落盘;只有用户真的继续这个会话,转换结果才原子替换写回磁盘,原文件留备份。设计笔记否决过「查看时自动迁移落盘」:打开即改写等于把读操作变成破坏性写操作,转换器有 bug 会在浏览时损坏日志。 版本号管结构变更,管不了词汇增长:事件的种类由挂了哪些插件决定,一个整数描述不了它。DSH 的方案是逐事件标记。读取器遇到不认识的事件类型,默认整个会话拒绝恢复,除非那条事件的信封上带着写入方声明的 ignorable: true。已知词汇清单 KNOWN_SESSION_EVENT_TYPES 不是手写的,由脚本从全仓库所有事件声明合并生成,共 44 个类型,连同 946 行的持久化事件目录 docs/persistence-catalog.zh.md 一起,有专门的校验脚本保证不过期。 ## 凭据、设置、存储与遥测(持久化与基建) URL: https://xueai.miyang.cn/slides/dsh-24.html (以下为免费预览,全文见页面) 凭据、设置、存储与遥测 不起眼但全是坑:凭据每次现取、配置不落盘。 不起眼但全是坑:凭据每次现取、配置不落盘 先玩再讲。上方是磁盘上的凭据文件,下面两个进程同时在跑请求:左边是 DSH 的做法,每次请求都回文件现取一遍 key;右边是很多程序的惯用做法,启动时读一次,存进内存用到死。脚本会在运行中途轮换一次 key、再把 key 清空,点播放,看两边各是什么下场。 先说清一件事:DSH 的设置文件和 cordis.yml 里没有任何一处写着 API key 的值。它们携带的是引用,一个 POSIX 风格的环境变量名,比如 DEEPSEEK_API_KEY。值归凭据提供方所有,本地提供方按四层来源找:进程环境优先级最高,然后是 $DSH_HOME/.credentials.yaml 文档,最后是项目和用户的 .env。这就是副标题说的「配置不落盘」:落盘的只有名字,机密被挡在配置之外(docs/subsystems/credentials.zh.md 第 5 行)。 然后是本课最重要的一条规则:消费方在每个操作中重新解析引用,绝不跨操作缓存。文档原话说得很直白,这种按操作进行的读取正是热更新机制(同文档第 20 行)。落到 DeepSeek 适配器上,就是 packages/llm/llm-deepseek/src/adapter.ts 第 214 至 222 行:每次 stream() 开头,把连接配置和 key 一起冻成一份快照,这个请求从头到尾用这一份,下一次请求自动重新解析。 大纲里问的边界条件在这里有了答案。请求进行到一半你轮换了 key,本次请求拿旧 key 跑完,新 key 从下一次请求开始生效,中间不会出现半新半旧。而且 key 是从连接快照里解析出来的,端点和发给它的密钥永远来自同一代配置,配置回滚时不会出现新端点配旧 key 的杂交(该处注释写明了这个意图)。 还有两条容易忽视的 seam 级规则。第一,空的存储值在任何地方都视为不存在,把 key 设成空字符串等于没配,下一次请求直接报 MISSING_CREDENTIAL,演示最后一步就是它。第二,配置界面走 describe(ref),只回「配没配、来自哪层、能不能写」,绝不回值;由进程环境供值的引用被报成 writable: false,因为往那里写会表面成功、而解析继续返回环境里的旧值,seam 干脆提前拒绝(同文档第 34 行)。 最能看出这套架构干净的是 credentials/updated 事件(同文档第 50 行)。凭据变更时确实会发事件,但文档专门写了一句:消费方不需要它,它只服务于配置界面刷新「已配置」徽标。热更新靠的是读取时机,压根不靠通知广播,没有失效消息要追、没有订阅要管理。 轮换 key 免重启,下一次请求自动用新值。进行中的请求用同一代快照跑完,端点和密钥永不杂交。 seam 级规则,处处一致。缺 key 报 MISSING_CREDENTIAL 并点名配置入口;describe 回答一切但绝不回显值。 OTel 的 user.id、/feedback 回执、DeepSeek 请求头共用一个 UUID,懒创建:没成功用过就不落盘。 这段在 resolveApiKey 函数体内(第 225 行起),每次模型请求都会走一遍:挂了凭据 seam 就向它现解析,没挂 seam 就退回启动环境变量。注意 else 分支里的注释,没有 seam 时不存在可排序的托管存储,环境就是全部的凭据平面: ## 多入口与 Typert:一个内核,五张面孔(持久化与基建) URL: https://xueai.miyang.cn/slides/dsh-25.html (以下为免费预览,全文见页面) 多入口与 Typert:一个内核,五张面孔 Web、headless、ACP、SDK、HTTP 共享同一个内核。 Web、headless、ACP、SDK、HTTP 共享同一个内核 先玩再讲。下面左边是入口,右边是内核。五个标签是五张面孔,选一个,点播放:看这个入口披着什么皮、发出什么样的报文,再看内核的会话日志里落下什么事件。然后换一个入口重播一遍,盯住右边那排事件,这就是本课要讲的全部。 上一批课讲过,DSH 的一切功能都是 Cordis 插件,进程启动时按一份 cordis.yml 把插件挂成一棵树。这个设计在本课收获回报:所谓「入口」,就是一份不同的 cordis.yml。仓库的 examples/ 目录下躺着现成的三份:headless、JSON-RPC、ACP,翻开对比会发现它们大同小异,DeepSeek 适配器、bash 执行器、JSONL 会话持久化、压缩、文件系统工具这些内核插件三份全有,差异集中在最上面几行:JSON-RPC 入口多挂一个 sdk-jsonrpc-server,ACP 入口多挂一个 acp-demo 协议桥和沙箱策略,headless 干脆什么服务器都不挂,进程本身就是入口。 Web 面孔的皮厚一点,但仍然是插件:host-webserver 是个纯粹的 node:http 载体,文档明说它不属于 agent loop、不了解任何 harness 概念(docs/subsystems/web-server.zh.md);frontend-static 认领回退席位当 SPA 服务器;client-modules 用 tapIndex 往 index.html 里注入启动清单 window.__DSH_BOOT__,浏览器端照单加载各插件的前端模块。HTTP API 面孔则是一条链:api-remotes 做身份解析,api-gateway 做参数解码和方法调用,connection 独占 /api 路由的 RPC 信封,最后落回同一个 webserver(docs/api-gateway.zh.md)。 Python SDK 最能说明「皮」有多薄。pip install deepseek-harness-sdk 会连带装一个平台 wheel,里面是单文件可执行的 dsh-jsonrpc-agent;SDK 启动它当子进程,通过 DSH_CORDIS_CONFIG 注入默认组合,然后在 stdio 上说 JSON-RPC(python/sdk/README.zh.md)。所以 Python SDK 和 JSON-RPC 入口是同一张面孔的两种穿法,Python 这层只是把协议包成了 harness.run("…")。 大纲里那道边界条件题的答案就藏在配置注释里。JSON-RPC 示例的第 2 行写着 stdout 保留给 JSON-RPC,禁止加 console logger 或终端 UI;ACP 示例同样声明整棵树不挂 stdout 日志和 HMR,因为 stdout 载着 ACP 的 JSON-RPC(两份 cordis.yml 的开头注释)。道理一句话:这两种协议把 stdout 当传输线,往上面混打一行日志,对端的解析器就断线了。日志走 ctx.logger 另寻出路,这是协议入口的铁律。 三个示例入口共享同一批内核插件,差异是顶部那几行协议桥。加一张新面孔约等于写一个翻译插件加一份配置。 JSON-RPC 与 ACP 入口的配置明令禁挂 console logger:stdout 是传输线,混入一行日志对端就解析断线。 Typert 只导出 @Remote 标记的方法,未标记的既不进 Client 类型,也无法经 ctx.remote 调用。 ## Agent Notes 与 AGENTS.md:用 AI 开发 AI 的规训(工程方法论) URL: https://xueai.miyang.cn/slides/dsh-27.html (以下为免费预览,全文见页面) Agent Notes 与 AGENTS.md:用 AI 开发 AI 的规训 四状态设计笔记和给 AI 看的编码规范,团队立刻能抄。 四状态设计笔记和给 AI 看的编码规范,团队立刻能抄 先玩再讲。下面是 DSH 仓库 .agents/notes/ 目录的四个文件夹,数字是本地快照里的真实笔记数。点「播放」看一篇真实笔记怎么从 proposed 走到 implemented 再进 archived;切到「被拒路线」看另一篇怎么被否决后冻结。中间那排是格式门禁的体检项,每一步谁在把关看得一清二楚。 DSH 是一个大规模用 AI 写代码的仓库。AI 每次会话都是新的,人也记不住三个月前为什么否决过某个方案。于是同一个坏主意会被反复提出,同一段代码会被反复重构回去。文档写了没人更新,慢慢烂掉。 DSH 的答案是两份东西。一套会流转的设计笔记,叫 Agent Notes,记代码和文档装不下的两件事:为什么这么做,放弃了什么。一份给 AI 看的行为守则,叫 AGENTS.md,把仓库的硬规矩写成 AI 每次会话都会读到的标准指令。 先看笔记。每篇笔记的路径就是它的完整身份:{lifecycle}/{class}/yyyy-mm-dd-topic.md。生命周期是顶层文件夹,proposed、implemented、rejected 三个活跃状态加一个 archived 归档层;类别是嵌套文件夹,feature、bug-fix、simplification、architecture、process、testing 六种,封闭集合,多一种都会被门禁拒绝。本地快照里的数字:25 篇 proposed、506 篇 implemented、11 篇 rejected、142 篇 archived,每篇还配中文对侧文件和一份一致性记录。 然后是那条硬规矩,写在根 AGENTS.md 第 122 行:非平凡变更必须在同一个 PR 里新增或更新至少一篇笔记。什么算非平凡?改了行为、架构、跨包约定、流程工具、磁盘格式、协议格式,或者任何维护者日后可能重新审视的决策。只有纯机械的局部编辑才豁免。笔记跟代码走同一个评审、同一次合并,所以不存在代码先上、文档欠着这回事。 每篇笔记还必须有一节 Alternatives considered,列出每个真实的备选方案和落选原因。.agents/notes/README.zh.md 第 115 行的原话是「记录决策时不记录它击败了什么,就是在邀请反复争论」。这一节是防失忆的核心:下次有人(或 AI)提出同样的方案,翻开笔记就能看到它当年输给了谁、为什么。 笔记换状态就是移动文件加改 Status 行,两件事必须在同一个变更里完成,门禁交叉检查。proposed 转 implemented 时,Proposal 章节要改写成现在时的 Decision。 被否决的提案冻结保存,结论写在 Status 行第一眼就能看到。保留有门槛:只有决策依据还能防住一种诱人且影响重大的错误才留,否则三个文件一起删。 指导价值降低的 implemented 笔记移入归档层后永久冻结:禁止编辑、翻译、移动、删除,manifest 只追加。历史是证据,改过的证据不能作证。 这套体系没有停在文档层面。scripts/verify-agent-note-format.ts 一共 94 行,是 doc-sync 门禁的一环,CI 每次都跑。下面这段是它的规则表:每个生命周期的 Status 行语法和必填章节。 ## KV Cache 是接口(工程方法论) URL: https://xueai.miyang.cn/slides/dsh-28.html (以下为免费预览,全文见页面) KV Cache 是接口 prompt 前缀稳定性当成兼容性承诺来维护。 prompt 前缀稳定性当成兼容性承诺来维护 先玩再讲。下面的色带是一条 system prompt 加工具 schema 的 token 序列(数值为教学化抽象)。点「播放」,演示会依次做几个常见操作:原样重发、改 persona 一个字、加一个工具、追加对话、插件加载顺序抖动。每一步色带上会标出缓存从第几个 token 起失效,右边的计价器累计你多付的重算 token。右上角可以切换 DSH 模式和对照模式,抖动那一步的结果完全不同。 先把 KV Cache 说成人话。模型处理请求时,会为每个 token 算出一堆中间结果(键和值)缓存起来。下一条请求进来,只要开头的 token 序列和上一条逐字相同,这段前缀的计算就能直接复用,provider 按命中给你打折。DeepSeek 的官方定价里,命中缓存的输入 token 比未命中便宜一个数量级(具体倍率以官方价目页为准)。 关键在逐字相同这四个字。缓存按前缀匹配:从第一个不同的 token 起,后面全部作废。而 agent 请求的开头是什么?system prompt 加工具 schema,动辄几千 token,每条请求都带。改 persona 里一个词、换一下工具顺序、在开头塞个当前时间,缓存就从那个位置断掉,之后的每条请求都全价重算。 所以 DSH 得出一个结论:prompt 前缀是模型这个 API 的接口,它的稳定性是一种兼容性承诺,要像维护公开 API 一样维护。落到工程上是三件事。 第一件,写进文档纪律。本地快照里 packages 下 268 个包 README,有 215 个带一个固定的 #### KV Cache effect 小节。任何会出现在模型请求里的东西,文档必须按三段式交代:模型看到什么(What the model sees)、token 成本多少(Token effect)、对缓存有什么影响(KV Cache effect)。以 packages/core/tools/README.md 的工具 schema 一节为例,第 145 行原文: 同一个文件第 186 到 188 行还有一句反向陈述:工具调用的历史和结果是 append-only 的,新内容跟在可复用前缀后面,不会打翻已有的缓存。什么伤缓存、什么不伤,全部写成可查的文档条目。 第二件,工具顺序由中心列表规范化。工具 schema 是前缀的大头,它的顺序原本跟着插件注册顺序走。插件是并发加载的,注册顺序随环境抖动,DSH 在 CI 里实际观察到了不同的请求头(Agent Note 2026-07-06-explicit-tool-order 的问题一节)。顺序影响请求字节,请求字节影响缓存,于是它成了必须显式治理的对象:配置里的 toolOrder 列表统一定序,列表里必须恰好有一个 其余项标记,没配列表就按字典序兜底。规范化发生在 assemble() 内部、waterfall 之前,注册顺序在任何可观测的位置都不再出现。 ## 终章:五种工程观,我们该抄什么(超越源码) URL: https://xueai.miyang.cn/slides/dsh-29.html (以下为免费预览,全文见页面) 终章:五种工程观,我们该抄什么 五家 harness 设计哲学总表,附最小可抄清单和体量陷阱清单。 五家 harness 设计哲学总表,附最小可抄清单和体量陷阱清单 先玩再讲。下面是全专题讲过的主要机制,做成了可勾选的卡片,每张标着它解决的问题和依赖的前置机制。像点菜一样勾出你项目需要的,右边实时生成你的架构清单:缺了依赖会标红警告,勾了体量陷阱会提醒你养不养得起。点「播放」看一遍典型的踩坑加纠正过程。 全专题拆的是 DSH,但每一课都在跟别家对照。收官先把五家摆在一张桌上。三个维度:真源(对话状态的权威副本放哪)、扩展模型(第三方怎么加能力)、安全依靠(防出事靠什么)。 表看完先记住一件事:五家没有对错,只有立场。Claude Code 的断路器数字来自真实账单,Grok 的静态组合换来编译期确定性,Codex 把不信任写进操作系统层,OpenCode 把可换模型放在第一位。DSH 的特殊在于它把可证明排在了好用前面,这是运行时的立场,也是它文档和测试体量的根源。 全专题讲了三十来个机制,大多数和 DSH 的插件框架绑定。但有五件是纯思路,抄走就能用: 事件日志真源。对话状态只存一份 append-only 的事件序列,消息数组永远从它派生。一个 JSONL 文件加一个 fold 函数就是最小实现,恢复和回放白送(机制详解见 Model-visible ⟺ logged 那一课)。 三种输入语义。用户在 agent 干活时发来的消息,明确分成排队、插话、打断三种命运,写成显式的接口语义。没有这一层,输入时机就是薛定谔的状态。 双路径压缩。主动测压和被动溢出恢复分开挂,事件不同、条件不同、失败语义不同(见 Compaction 双路径那一课)。 溯源鉴权。每段进入上下文的内容都带来源标签,高权限操作只认可信来源。工具结果里藏的指令冒充不了用户。 单调 Guard。重试、恢复这类危险放行,一律要求出示单调递增的证据(世代号、计数器),不认插件的口供。 这五件的共同点:都是接口语义层面的决定,跟你用什么语言、什么框架无关。一个周末能搭出毛坯,剩下的是打磨。 反过来,有三件事是 DSH 用专职团队的人力堆出来的,个人和小团队照抄必翻车: ## 新功能先找落脚的 crate,core 是最后一档(治理与循环) URL: https://xueai.miyang.cn/slides/codex-01.html 新功能先找落脚的 crate,core 是最后一档 打开仓库,第一反应是往 core 里加。仓库把这件事写成禁令:先找现有的非 core crate,否则新建一个。依赖方向会把叶子类型挡在核心之外。 打开仓库,第一反应是往 core 里加。仓库把这件事写成禁令:先找现有的非 core crate,否则新建一个。依赖方向会把叶子类型挡在核心之外。 workspace members 是一份显式数组,当前 135 个Cargo.toml L3 目录叫 core,crate 名叫 codex-coreAGENTS.md L4 禁令:resist adding code to codex-coreAGENTS.md L76 先问现有的非 core crate 能不能住AGENTS.md L80 否则新建 workspace crate,并允许重构旧代码AGENTS.md L81 评审对不必要地进 core 的 PR 主动挡AGENTS.md L83 core 已经依赖拆出去的 context-fragmentscore/Cargo.toml L35 非机械改动一次不超过 800 行AGENTS.md L127 你要给这台 agent 加一个小功能:每轮对话开头把当前 git 分支名写进模型上下文。打开仓库,第一反应是往 codex-core 里加。session、context、guardian、tools 都在那儿,新文件放进去最省事。依赖表不用改,调用链不用跨 crate。 过了一周,同样的理由又进来三条。一个截断工具输出的 helper,一个模型供应商适配,一个会话恢复的边角。core/src/lib.rs 顶部又多三个 mod。下游只要写 use codex_core,编译图跟着变宽。有人想单独复用上下文片段那个类型,发现它焊在 core 里。要复用就得把整个 core 拉进来,包括沙箱、MCP、Guardian。 仓库把这件事写成禁令。AGENTS.md 用加粗英文写 resist adding code to codex-core。新概念先问现有的非 core crate 能不能住。再问该不该新建一个 workspace crate,并且允许为此重构旧代码。core 是最后一档。评审遇到往 core 里堆功能的 PR,被要求主动挡回去。 出处:AGENTS.md 第 72 至 83 行 禁令写进文件的日期是 2026-03-26。当时 core 已经是最大 crate。立完之后 workspace 成员从 75 个长到 135 个,core 的生产代码却还是涨了。挡的是默认往核心扔,挡不住核心继续长。 清单是一份显式数组。codex-rs/Cargo.toml 的 members 数一遍是 135。目录名和 crate 名要分开看:目录叫 core,包名叫 codex-core,use 的时候写成 codex_core。 出处:codex-rs/Cargo.toml 第 1 至 20 行;AGENTS.md 第 1 至 5 行;codex-rs/core/Cargo.toml 第 1 至 9 行 按 .rs 行数,少数几个吃掉大半体积。core 33 万行,tui 27 万,app-server 14.8 万。大于等于 1 万行的 24 个,小于 2 千的 77 个。core 去掉测试后剩约 10.3 万行。25 个 workspace 成员直接依赖它。tui 的 Cargo.toml 没有这一行,它依赖 codex-app-server-client,再由 client 拉 core。往 core 加一行,直接下游 25 个要重编,tui 仍会被带上。 出处:codex-rs/cli/Cargo.toml 第 41 至 42 行;codex-rs/tui/Cargo.toml 第 30 至 31 行 上帝包的失败模式是这次很小、先放核心。把默认落点写成明文,让评审有权挡,不依赖某种语言。换个语言重写,最小形态仍是这三问:现有包能不能住,该不该新建包,进核心凭什么拆不出去。 依赖方向反了,编译图会从两边一起胀。core 自己已经依赖 61 个 codex-* crate,包括拆出去的 context-fragments 和 features。如果新的上下文类型再写回 core,想复用它的人必须把沙箱和 Guardian 一起拉进来。叶子依赖核心,核心再依赖叶子,边界就没了。 拆出去的 crate 只带自己需要的那一点。context-fragments 的包清单几乎没有业务依赖,只碰 protocol 和一段字符串工具,对外 re-export 两个片段类型和一个 trait。core 可以依赖它,它不依赖 core。git 分支名这种片段走这条路:类型落在 fragments,core 当调用方。模型供应商适配已经抽到 codex-model-provider。必须摸 session 内部状态的东西,才走到最后一档,评审仍要问为什么拆不出去。 出处:codex-rs/context-fragments/src/lib.rs 第 1 至 6 行;codex-rs/core/Cargo.toml 第 26 至 42 行 旁边还有两把尺子。文件目标 500 行,大约超过 800 行就开新模块。非机械改动一次不超过 800 行,复杂逻辑压到 500。三层一起看,针对的是同一件事:人和 AI 都倾向于把改动写大,写进已经很大的文件。 出处:AGENTS.md 第 49 至 61 行;AGENTS.md 第 125 至 131 行 这条禁令本身没有 lint,没有 CI job。仓库里检索 resist adding code to codex-core,只命中 AGENTS.md 这一处。挡得住的是旁边那几条:依赖没刷 Bazel lock,CI 红;include_str! 没改 BUILD.bazel,Bazel 红。core 禁令挡得住习惯,挡不住有理由的例外,也挡不住漏看。 出处:AGENTS.md 第 37 至 43 行 编译图的方向是物理约束。叶子可以独立编译,被多个中心复用。中心一旦吞下叶子类型,复用成本变成拉进整个中心。这个形状换语言也成立。 DSH:能力全是插件,没有特权内核 DSH 根 AGENTS.md 把原则写成加粗英文:everything is a plugin。Cordis 只收服务、类型化事件和可逆副作用。模型适配器、工具注册表、会话日志、agent loop 都是插件。没有需要打补丁的特权内核。新包落进现有分组时,根 package.json 不用改,glob 会发现它。 Codex 用编译期 crate 换掉了这套装卸器,新能力必须改 members 数组、写 BUILD.bazel、重新编译。能下手的位置只剩评审和 CI。评审管该不该进 core,CI 管两份锁有没有一起改。 Grok Build:清单自动生成,靠目录分层 Grok 根 Cargo.toml 第一行写明这份 workspace 是生成的,人应该改各 crate 自己的清单。members 按同一口径数是 79。组织方式写在根 README:pager 是 TUI,shell 是运行时,tools 和 workspace 是领域能力,common / build 是叶子。 它没有写成给评审看的 core 禁令。切分本身被当成地图,膨胀靠组合入口和抽 crate 消化。Codex 多付的是评审文本和双构建锁。 截断工具输出,该落在哪 又来一个小功能:工具返回太长时先截断,再交给模型。它看起来像 helper,放进 core 的 tools 旁边最省事。按刚才的三问推演:现有非 core crate 有没有更合适的家,该不该新建一个只要字符串工具的小包,进 core 会挡住哪一条依赖边。 写下你会挡哪一条边,以及挡住之后正确的落点。如果选最后一档,补一句评审会问什么。 ## 三层 Turn Loop:谁有资格决定继续(治理与循环) URL: https://xueai.miyang.cn/slides/codex-02.html 三层 Turn Loop:谁有资格决定继续 你看到的是一轮对话。内部叠了任务壳、轮次、采样三层循环。各层只回答自己那一个问题,控制权每次只在一层。 你看到的是一轮对话。内部叠了任务壳、轮次、采样三层循环。各层只回答自己那一个问题,控制权每次只在一层。 任务壳 RegularTask 值班班长。问这一趟还活着吗。 轮次 run_turn 当班司机。问这一轮还要再采吗。 采样 sampling 检票口。问这一条流结束了吗。 空。插话先坐这里,当前采样看不见。 空闲则 spawn RegularTaskturn_input.rs L242 任务壳发 TurnStarted 后进 loopregular.rs L76 轮次开头按开关排 pendingturn.rs L305 采样 run_sampling_requestturn.rs L381 工具当时挂上 futurestream_events_utils.rs L326 Completed 之后再 drainturn.rs L2539 重算 needs_follow_upturn.rs L423 stop hook 带 prompt 则 continueturn.rs L525 任务壳再问 has_pending_inputregular.rs L86 忙碌则 Steered 写入 pendingturn_input.rs L207 你让 coding agent 改一个函数。屏幕上这是一轮对话:你说了一句,它忙了一阵,最后回「改完了」。 忙的时候其实叠了几件事。模型调了工具。你中途补了一句「测试用 pytest」。它写完助手消息后,Stop hook 说还没跑 linter,于是又采了一次样。 这几件事如果塞进同一个 while,就只能靠几个布尔抢出口。谁先检查、谁能打断谁,会变成口头约定。少一层,就少一个干净插口:插话、续跑和流重试会搅在一起。 Codex 拆成三层。任务壳 RegularTask::run 决定这一趟还要不要再开一轮。轮次 run_turn 决定工具续跑、插话和 hook 要不要继续。采样层只把一次模型流收到 Completed。 对外入口 start_or_steer_turn 自己不看会话空不空闲。返回值只表示 Core 接没接住这条输入,不等 hooks,也不等采样。空闲就 spawn RegularTask,忙碌就 Steered 写入 pending。三层循环从任务壳才开始转。 出处:codex-rs/core/src/codex_thread.rs 第 333 至 344 行 · codex-rs/core/src/session/turn_input.rs 第 1 至 9 行 任务壳发一次 TurnStarted,然后只要队列里还有待处理输入,就再调一次 run_turn。第二次进去时 next_input 为空,新消息从 input_queue 取。turn_id 钉死,界面不会再闪一次「新的一轮开始了」。 出处:codex-rs/core/src/tasks/regular.rs 第 76 至 90 行 轮次层把采样回来的两件事合成一个布尔:model_needs_follow_up || has_pending_input。为真就自己 continue。为假才跑 stop hook。hook 带 prompt 拦收工,这一层自己再转,任务壳和采样层都还没退。 出处:codex-rs/core/src/session/turn.rs 第 423 行 · 第 500 至 525 行 采样层自己还有两圈。外圈处理可重试错误。内圈消费一条 SSE 流。工具调用不等 Completed:OutputItemDone 当时就会挂上 future。流收到 Completed,先 drain_in_flight,再把结果交回 run_turn。 出处:codex-rs/core/src/stream_events_utils.rs 第 326 至 327 行 · codex-rs/core/src/session/turn.rs 第 2539 至 2584 行 · 第 2749 行 三层按「谁有资格决定继续」切开。采样层只看见这一次流,能重试,不能收整轮。轮次层看见工具、pending、预算和 hook,能续采样,不能重发 TurnStarted。任务壳看见任务还在、队列里是否还有活。 这不随文件怎么拆而变。换个语言重写,该问的还是三个问题:这一条流结束了吗,这一轮还要再采吗,这一趟任务还活着吗。 RegularTask 和 run_turn 都看 pending。同一句用户话如果两处都取,会转两圈。如果只留一处,就会把 hook 和后到消息挤进同一个出口。 两处问的是两件不同的事。 轮次层在采样刚刚结束时问,问的是「这一轮还要不要再采一次」。任务壳在 run_turn 已经 break 之后问,问的是「这一趟任务还要不要再进一次 run_turn」。前者把插话和工具结果留在同一个 turn_id 里。后者是界面已经可以收工、队列里又来了必须处理的输入。 去掉轮次层那一问:模型写出最终答案后,run_turn 会去跑 stop hook 并 break,中途那句「测试用 pytest」只能等任务壳再进一次 run_turn。功能上还能补上,只是多一次函数返回,stop hook 会在插话进模型之前先跑一轮。 去掉任务壳那一问:run_turn 因 should_stop 返回后,任务直接结束。队列里后到的用户消息要么消失,要么等会话变空闲,由 maybe_start_turn_for_pending_work 换一个 turn_id 新开任务。TurnStarted 会再闪一次,回放里变成两个 turn 桶。 stop hook 返回 block 且带 prompt,控制权留在轮次层。采样层早已返回。任务壳还在等这次 run_turn。block 是轮次层内部续跑。stop 是轮次层把控制权交回任务壳。 出处:codex-rs/core/src/session/turn.rs 第 509 至 537 行 · codex-rs/hooks/src/events/stop.rs 第 67 至 74 行 源码没有单独写「为什么要问两次」,下面从实现反推。hook 续跑时控制权留在轮次层,任务壳看不见。hook 放行后,任务壳才有机会接手「收工瞬间又来的那一句」。两个问题发生在不同时刻,所以要问两次。这跟具体语言、具体 hook 协议无关。 DSH:按语义切成 Turn、Step、Inbox DSH 的外圈是 kick:while (await this.turn()) {}。turn() 自己再套一层 while (true),每一圈先 preStep,再 step()。第三层不是第三条 while。Inbox 是两条数组:next-turn 和 next-step。调用方在入队时选 followup、steer 还是 inject。 两边都叫三层,切分维度不同。DSH 按语义:Turn 是一轮完整工作,Step 是一次模型请求加工具,Inbox 是说话时机。Codex 按生命周期:任务壳问这一趟还活着吗,轮次问这一轮还要再采吗,采样问这一条流结束了吗。DSH 因此能从 session 事件重放两条队列。Codex 因此能把流重试、取消、end_turn 各自关在采样层,TurnStarted 只闪一次。 Claude Code:单层 while 加状态袋 主循环在 query.ts。可变状态放进一个 state 对象,循环体顶部解构,continue 处写回整袋。needsFollowUp 只由助手消息里的 tool_use 块点亮。没有 follow-up 时,同一层接着做压缩、stop hook、进入下一 turn。turnCount 加一,transition 写成 next_turn,回到 while (true) 顶部。 续跑、压缩、stop hook 收成同一袋状态。改一处 continue,要同时核对 stopHookActive、turnCount 和 transition。Codex 把这三件事分给三层,DSH 把插话分给 Inbox,两边都不必在同一个布尔上抢门。 把任务壳那一问改成恒为假 模型开始调工具时,你补了一句「顺便列出当前目录」。先按三层推演:任务壳、轮次、采样各转几圈,这句后续由哪一层取走。 然后把 regular.rs 第 86 行的 has_pending_input 改成恒为假,让任务壳在第一次 run_turn 返回后立刻结束。这句后续是消失、等到下一轮,还是由 maybe_start_turn_for_pending_work 换一个 turn_id。 ## 流还在走,工具已经开工(治理与循环) URL: https://xueai.miyang.cn/slides/codex-03.html (以下为免费预览,全文见页面) 流还在走,工具已经开工 模型还在打字,读文件的声音已经响了。采样循环的时序是:流内建 future,流后统一 drain。先 persist,再等结果。 模型还在打字,读文件的声音已经响了。采样循环的时序是:流内建 future,流后统一 drain。先 persist,再等结果。 SSE 帧先解成通用事件,还没有业务含义responses.rs L164 kind 是 output_item.done,就产出 OutputItemDoneresponses.rs L352 采样循环一到就交给 handle_output_item_doneturn.rs L2384 先把 function_call 写入历史和 rolloutstream_events_utils.rs L316 再 pin 工具,推进有序队列stream_events_utils.rs L320 流结束、断流或取消,都只是离开收流循环turn.rs L2282 drain 按插入顺序把结果写入历史turn.rs L2135 然后才看取消令牌;Stream 可重试turn.rs L2760 你让模型读三个文件再写摘要。屏幕上还在打字,读文件的声音已经响了。然后你按 Esc。界面停了,历史里却留下那次请求,有时还留下结果。你以为取消等于什么都没发生。运行时并不这么记账。 另一头更常见:模型已经发出两个 function_call,第三个还在路上,SSE 在 response.completed 到来之前关掉。下一次重试该看见空历史,还是已经落盘的调用和结果? 若等 Completed 再写入,提前关流会把已经完整的调用一起扔掉。重试让模型再发一遍同样的调用。若取消时跳过写入,历史只剩半截请求,模型和界面都看见一个没闭合的调用。 OutputItemDone 是解析层把一帧 response.output_item.done 收成的业务事件。它一到,采样循环先把这一条写入会话历史和 rollout,再把工具执行包成 future 挂到有序队列上。取消令牌用子令牌,父令牌一亮,这个工具跟着停。取消来得再快,这一条 function_call 已经进历史。最多再多写一条 aborted by user。 出处:codex-rs/core/src/stream_events_utils.rs 第 190 至 192 行;第 316 至 327 行。类型别名上方的注释把合同写死:完成的模型输出要立刻记下来,后面 turn 被取消,历史和 rollout 也保持同步。 ## 中途插话:这句话进本轮、下一轮,还是被拒(治理与循环) URL: https://xueai.miyang.cn/slides/codex-04.html (以下为免费预览,全文见页面) 中途插话:这句话进本轮、下一轮,还是被拒 Agent 正在改第三个文件,你看见方向偏了,补了一句:配置用 YAML。回车之后,这句话是开工、插进当前轮,还是当场被拒,Core 当场拍板,不等模型开口。 Agent 正在改第三个文件,你看见方向偏了,补了一句:配置用 YAML。回车之后,这句话是开工、插进当前轮,还是当场被拒,Core 当场拍板,不等模型开口。 当前轮 下一轮 门口拒收 按 TurnInputMode 分发,默认走 StartOrSteerturn_input.rs L141 先试 steer_input,只有 NoActiveTurn 才开工turn_input.rs L195 Regular 才收,Review 和 Compact 当场拒turn_input.rs L507 空闲则 apply_started,再 spawn_taskturn_input.rs L242 插话写入 pending,并把相位打回 CurrentTurnturn_input.rs L558 最终答案把投递相位 defer 到 NextTurninput_queue.rs L206 工具项把相位 accept 回 CurrentTurnstream_events_utils.rs L302 get_pending_input 看相位,再决定掏不掏信箱input_queue.rs L297 三种日常结局都不好受。立刻打断,前面两个文件的改动可能半成品留在磁盘上。排到下一轮,你只能看着它把剩下的文件按旧方向改完。塞进当前上下文却不叫醒循环,模型要到下一次自己开口才看得到,你补的约束等于迟到。 Codex 把这件事收成一个入口、三种模式。调用方选 StartOrSteer、StartIfIdle 或 Steer,不直接喊 start。Core 按现场忙闲和任务种类判定,立刻回 Started、Steered 或 NotSubmitted。回完决定就结束,不等 user-prompt hook,不等历史落盘,不等模型开始采样。 出处:codex-rs/core/src/session/turn_input.rs 第 1 至 9 行;codex-rs/protocol/src/turn_input.rs 第 127 至 136 行 StartOrSteer 的顺序和函数名一致。先试插话。只有返回 NoActiveTurn,才 apply_started 再 spawn_task。其他拒绝原因原样包装成 NotSubmitted,不会偷偷开工。TUI 实时语音也走这条,和默认入口共用同一套判定。 出处:codex-rs/core/src/session/turn_input.rs 第 141 至 156 行、第 195 至 249 行 设置不能先改再判定。prepare 先预览线程设置,预览失败直接 InvalidRequest。真正写入发生在 apply_started 或 apply_steered。被拒绝的输入连设置都不改。插话成功后只落持久设置,当前轮的 TurnContext 不换。开工专用的选项,比如结构化输出 schema,只在 Started 上用。 ## 按下取消之后,各层怎么收手(治理与循环) URL: https://xueai.miyang.cn/slides/codex-05.html (以下为免费预览,全文见页面) 按下取消之后,各层怎么收手 工具失败回给模型,用户按 Esc 才停 turn。取消令牌从任务传到采样再传到工具。已完成的结果留在历史里,100 毫秒之后的硬拆不可逆。 工具失败回给模型,用户按 Esc 才停 turn。取消令牌从任务传到采样再传到工具。已完成的结果留在历史里,100 毫秒之后的硬拆不可逆。 协议入口是 Interrupt,不杀后台 terminalprotocol.rs L546 任务令牌先 cancel,这是信号还不是硬拆tasks/mod.rs L887 采样用子令牌盯着流,or_cancel 变成 TurnAbortedturn.rs L2273 工具派发再 child 一次,父令牌取消则一起取消stream_events_utils.rs L319 handler 已走完就保留真实结果,没走完才 abortparallel.rs L182 等 100 毫秒,没收完就 task.handle.aborttasks/mod.rs L913 追加 turn_aborted 片段,立刻 flush_rollouttasks/mod.rs L927 最后才发 EventMsg::TurnAbortedtasks/mod.rs L955 你让 Codex 改一个测试文件。模型先跑 cargo test,编译器吐了两屏 rustc 报错,退出码是 1。下一秒对话停了,界面弹出 turn aborted。很多人第一次写 agent 会这么干:工具返回 Err,整轮跟着死。模型还没看见 stderr,会话已经结束。 分诊发生在工具回到对话的那道门上,一共三层门槛。 最浅一层:进程已经跑过。退出码非零、命令超时、沙箱拒绝,都收成工具回执。success 写成 true,意思是 handler 跑完了,回执可以喂给模型。命令成不成功写在正文里。 出处:codex-rs/core/src/tools/context.rs 第 344 至 353 行 中间一层:调用没做成。参数坏了、进程没拉起来、apply_patch 上下文对不上,走 RespondToModel。回执 success 才是 false。模型读到文案,自己改再试。 最深一层:payload 对不上、任务 join 失败,才写 Fatal,升成 CodexErr,停 turn。 工具层自己的枚举只有两档。RespondToModel 把字符串喂回模型。Fatal 才升成引擎错误。默认把非 Fatal 折成 Ok。想停对话,得写出 Fatal 或 CodexErr。 use thiserror::Error; /// Error returned while executing a model-visible tool invocation. #[derive(Debug, Error, PartialEq)] pub enum FunctionCallError { #[error("{0}")] RespondToModel(String), #[error("Fatal error: {0}")] Fatal(String), } ## 往模型上下文里塞东西,先给它造一个类型(上下文) URL: https://xueai.miyang.cn/slides/codex-06.html (以下为免费预览,全文见页面) 往模型上下文里塞东西,先给它造一个类型 批准前缀、工作区、AGENTS.md、被中断的 turn,全是告诉模型一件它自己看不到的事实。Codex 先给每一种注入造一个类型,类型自己知道 role、marker 和 body。 每一种注入都是一个类型,自己知道 role、marker 和 body;组装按字段分拣,事后靠同一对 marker 认回 取 role,决定进 user 还是 developerfragment.rs L15 问要不要单独成条fragment.rs L18 实例要 marker,拿去 renderfragment.rs L22 空 marker 只输出 body,且永不匹配fragment.rs L41 窗口身份在循环前推进单独组session/mod.rs L3661 其余 fragment 按 role 和 marker 分拣session/mod.rs L3677 user 侧按注册表 .any() 认回contextual_user_message.rs L18 developer 侧按前缀表认回event_mapping.rs L40 你给 agent 加过这类功能:用户刚批准了 npm *,下一轮模型还在问要不要跑 npm test。或者压缩刚结束,模型突然忘了工作区在哪、沙箱是只读还是可写。再或者 fork 一条会话,旧的 AGENTS.md 还在,新的目录提示叠上去,模型同时看见两套互相打架的规则。 这三件事的共同来源是同一类操作:运行时往模型上下文里塞了一段文字。批准前缀、工作区、权限档案、被中断的 turn、当前 UTC 时间,全是告诉模型一件它自己看不到的事实。一段 format! 就能写出来。 问题出在事后。这段文字进了历史之后,压缩要不要留它、会话恢复要不要认它、UI 要不要把它藏起来、world state 要不要拿它当模型已经知道了的证据,全都依赖一件事:你还能从纯文本里把它认回来。各处再写一遍 startsWith,过几周四处会漂。未知标签还会漏进用户消息解析。 Codex 把每一种注入收成一个实现 ContextualUserFragment 的类型。trait 不在 codex-core 里,而在独立 crate codex-context-fragments。每个实现必须同时回答:这段以 user 还是 developer 进 Responses API,头尾 marker 是什么,中间 body 怎么写,要不要单独成一条消息。 render() 把头尾 marker 和 body 直接首尾相接,中间不加分隔符。空白和换行算 body 的。空 marker 只输出 body。into() 把渲染结果收成一条 ResponseItem::Message,content 只有一个 InputText。注入的终点是协议对象。 fn render(&self) -> String { let (start_marker, end_marker) = self.markers(); let body = self.body(); if start_marker.is_empty() && end_marker.is_empty() { return body; } format!("{start_marker}{body}{end_marker}") } markers() 带 self,渲染走实例。type_markers() 不带 self,识别走类型。手里只有历史文本、没有原对象时,仍然能问这段像不像某某 fragment。dyn ContextualUserFragment 调不了 matches_text,反向识别必须点到具体类型。 ## 把上下文治理写进 code review(上下文) URL: https://xueai.miyang.cn/slides/codex-07.html (以下为免费预览,全文见页面) 把上下文治理写进 code review 上一章把往上下文里塞东西收成类型。类型过了,这段文字仍然可以合法地又长、又勤、又无界。挡这些后果的,是仓库根十行禁令,外加一份会把同一节再读一遍的评审 skill。 长度、频率、前缀稳定这些编译器证明不了的事,用六条禁令加评审规则守住 注入有没有登记成 ContextualUserFragmentAGENTS.md L100 这一条有没有硬上限AGENTS.md L97 · protocol.rs L3112 单条是否可能超过 10K tokenAGENTS.md L98 · model_info.rs L167 新种类若可能过 1K,标 P0 另审AGENTS.md L99 · additional_context.rs L5 会不会每轮改已经发出去的前缀AGENTS.md L96 · client.rs L272 是追加新行,还是改历史里的旧行AGENTS.md L95 · session/mod.rs L3383 改旧行会不会让已有 rollout 恢复失败AGENTS.md L110 想象四份看起来很负责的 PR。甲给 environment 上下文加一个 git_status 字段,每轮写入完整工作区状态。乙在 turn.rs 里 format 一句 hint,提醒模型跑测试。丙新建一个 fragment,把整个源文件塞进模型可见文本,不写截断。丁在 AGENTS.md 一改时,就地改写历史里那一条说明。 四份都能写出干净的 struct、干净的测试。类型系统会放行。下一轮推理的 cache 前缀会被打掉,token 账单会按轮翻倍,从旧 rollout 恢复时会读到被改过的历史。 ContextualUserFragment 是往模型上下文里塞一段带标记文字的登记口。上一章用它把注入收成类型。编译器从此只接受实现了这个 trait 的 struct。形状对了,成本还可以不合法:又长、又勤、又无界。 Codex 把成本写成六条禁令,放在仓库根 AGENTS.md,标题就叫 Model visible context。同一段原文被抄进 .codex/skills/code-review-context/SKILL.md。评审机器人读到的就是这六条,没有第二套解释。 ### Model visible context Codex maintains a context (history of messages) that is sent to the model in inference requests. 1. No history rewrite - the context must be built up incrementally. 2. Avoid frequent changes to context that cause cache misses. 3. No unbounded items - everything injected in the model context must have a bounded size and a hard cap. 4. No items larger than 10K tokens. 5. Highlight new individual items that can cross >1k tokens as P0. These need an additional manual review. 6. All injected fragments must be defined as structs in `core/context` and implement ContextualUserFragment trait ## 满窗之后,砍哪一段留哪一段(上下文) URL: https://xueai.miyang.cn/slides/codex-08.html (以下为免费预览,全文见页面) 满窗之后,砍哪一段留哪一段 三个时机共用一个分发器,三种实现由开关选中。同一份摘要在中途必须停在历史最后一项。 三个时机共用一个分发器,三种实现由开关选中。同一份摘要在中途必须停在历史最后一项。 看 token_limit_reached,或用户提交 Compactcontext_window.rs L77 采样前走 run_pre_sampling_compactturn.rs L1012 中途走 should_roll_over,还要有 follow-upturn.rs L458 手动拉起 CompactTask,打断当前 turntasks/compact.rs L19 TokenBudget 开则换空窗,远端和本地都被跳过turn.rs L1189 否则按远端 v2 或本地分发turn.rs L1201 远端结果过 should_keep 滤网compact_remote.rs L370 按 InitialContextInjection 决定插不插compact.rs L68 replace_annotated 才把 history_version 加一history.rs L298 你让 coding agent 在同一个线程里改了三十轮。前二十轮还记得工作区在哪、哪几个文件不能动。到第三十轮,它突然问你「当前目录是什么」。再过几轮,已经批准过的 npm test 又被问了一遍。 用量顶到窗口边上之后,系统必须压历史。如果把什么时候压、怎么压写进同一段判断,换提供方或加一种不叫模型的空窗,判定入口都要跟着改。中途压完还要继续采样,发消息前压完则下一轮才会重注,这两件事对摘要位置的要求也不一样。 Codex 把时机写成 CompactionPhase:发消息前的 PreTurn、工具跑完还要续跑的 MidTurn、用户手动的 StandaloneTurn。实现写成 CompactionImplementation:本地再采一次样、旧的 /responses/compact、新的 compaction_trigger。分析事件另有 Trigger 和 Reason 两套标签。自动路径共用 run_auto_compact,手动路径共用 CompactTask。九宫格是乘法表,源码里没有九套并列函数。 三个自动时机都先问同一个函数。token_limit_reached 在缓冲后的 compact 限额或满窗任一触发时为真。中途还要多一道闸:后面还要继续,并且模型刚请求了新窗口或 token 已经到顶。只满不续,这一轮自然结束,下一轮用户消息到来时走预采样。 出处:codex-rs/core/src/session/context_window.rs 第 74 至 91 行;codex-rs/core/src/session/turn.rs 第 458 至 483 行 ## JSONL 是真相,SQLite 是镜像(上下文) URL: https://xueai.miyang.cn/slides/codex-09.html (以下为免费预览,全文见页面) JSONL 是真相,SQLite 是镜像 昨天关了终端,今天列表还在,对话也能接着改。这两件事看起来像同一份存储,落盘时却走两条轨。上轨按行追加,下轨只抄封面。中途拔电之后,能捡回来的永远是已经过了闸门的那几行。 昨天关了终端,今天列表还在,对话也能接着改。这两件事看起来像同一份存储,落盘时却走两条轨。上轨按行追加,下轨只抄封面。中途拔电之后,能捡回来的永远是已经过了闸门的那几行。 Session 把 item 交给 LiveThread,失败只记日志session/mod.rs L3753 LiveThread 把原文切片交给 storelive_thread.rs L203 白名单丢掉瞬时 EventMsg,执行标记一律留下policy.rs L9 一行 JSON 加换行,write_all 后再 flushrecorder.rs L1968 闸门先赢,Paginated 才投影 thread_historylive_writer.rs L337 投影失败只 warn,下次按字节偏移续live_writer.rs L345 观察过滤结果,再打字面 metadata patchlive_thread.rs L212 恢复从文件逐行 decode,不从 threads 表拼历史recorder.rs L1009 列表无库或出错,退回扫 sessions 目录recorder.rs L547 列表要快,恢复要对。一份文件很难同时满足。JSONL 追加便宜,用 jq 就能读。按工作区、置顶、归档去筛,它就不合适。SQLite 擅长这些过滤,却不该成为恢复时拼模型输入的地方。 两件看起来相反的事故,其实指向同一条规则。state_5.sqlite 被删掉,列表空一阵又长回来,对话还在。你用手改库里的标题和 cwd,刷新后有时跟着变,有时又变回去。镜像可以重建,也可以被原文覆盖。原文丢了,镜像救不回来。 Codex 拆成两轨。Session 不直接碰文件,它把已经构造好的 item 交给当前的 LiveThread。没有 live handle,或者 append 失败,turn 本身不因此中断,错误只进日志。 出处:codex-rs/core/src/session/mod.rs 第 3753 至 3759 行 LiveThread 先按策略过滤一份观察用的副本,交给 store 的仍是原始切片。store 自己再跑一遍白名单。流式增量、审批、警告这些瞬时 EventMsg 进不了 JSONL。Compacted、TurnContext、WorldState、SessionMeta 一律留下。 写的顺序固定。先让 JSONL 落盘,再投影到 SQLite。投影失败可以下次重做。JSONL 失败,SQLite 不能顶上去。 ## 模型看见的工具清单,是一次采样算出来的(工具) URL: https://xueai.miyang.cn/slides/codex-10.html (以下为免费预览,全文见页面) 模型看见的工具清单,是一次采样算出来的 同一段对话、同一份配置,下一轮采样却可能多出 MCP 名字、协作入口或 tool_search。变的是这一次允许广告哪些 handler。 同一段对话、同一份配置,下一轮采样却可能多出 MCP 名字、协作入口或 tool_search。变的是这一次允许广告哪些 handler。 解析这一步的 MCP 绑定mcp.rs L310 采集 MCP 目录,交给规划函数turn.rs L1494 按身份决定是否走完整来源spec_plan.rs L889 登记 shell、资源、实用、协作spec_plan.rs L930 追加 MCP 并套上暴露策略spec_plan.rs L148 有 deferred 才挂 tool_searchspec_plan.rs L335 只把 is_direct 的 spec 发给模型spec_plan.rs L484 冻进 StepContext.tool_routerstep_context.rs L44 build_prompt 读取可见表turn.rs L1320 你刚接上 MCP filesystem,模型这一轮还在跑。要是按整轮用户对话冻工具表,新连上的服务器得等下一条用户消息才进菜单。要是每调一次工具冻一次,同一次采样里并行的两次调用可能看见两份不同的表。 广告一份、执行另一份,或者执行到一半表变了,是工具表最常见的翻车。 Codex 把这一次采样的模型、审批、环境、MCP 绑定和已经算完的 tool_router 一起放进 StepContext。注释写明它是 request-scoped:采样请求之间可以变,同一次采样里不变。tool_router 是 this exact sampling request 的计划。 采样进行期间,模型看见的名字和能 dispatch 的 runtime 都读这份快照。MCP 服务器在这次采样中途掉线,改不了已经算完的表。下一次采样会再走 mcp_runtime_for_step,绑定可能复用,也可能换成空绑定。出处:codex-rs/core/src/session/step_context.rs 第 17 至 47 行;codex-rs/core/src/session/mcp.rs 第 348 至 357 行 ## 对模型说随便并行,底下用锁管住(工具) URL: https://xueai.miyang.cn/slides/codex-11.html (以下为免费预览,全文见页面) 对模型说随便并行,底下用锁管住 模型看见的、实际执行的、历史记录的,是三套顺序。一面旗允许一次发多个调用,一把读写锁决定谁能叠着进。 模型看见的、实际执行的、历史记录的,是三套顺序。一面旗允许一次发多个调用,一把读写锁决定谁能叠着进。 build_prompt 把并行旗写成 trueturn.rs L1321 编请求时和 Lite 标记做与client.rs L952 路由查注册表,没有就当 falserouter.rs L137 Hidden 即使自称并行也当串行registry.rs L472 先 spawn,再等就绪,最后拿锁parallel.rs L144 能并行就 read,否则 writeparallel.rs L152 结果按 FuturesOrdered 插入顺序入账turn.rs L2135 你让模型同时读 src/main.rs、读 src/lib.rs,再打一处补丁。屏幕上两份读文件几乎同时出进度,打补丁那一下却停了一拍。 如果运行时把可以并行理解成这些调用叠着跑,两个 apply_patch 会一起改共享的 diff 记账,账会乱。如果这些调用首尾相接,两个读文件也要排队,多耗一轮墙钟。请求侧那面旗只回答模型愿不愿意一次发多个盒子,回答不了盒子落地时谁能重叠。 发给模型的旗写在 Prompt 上。字段默认是 false,采样主路径走 build_prompt,把旗写成 true。编成 Responses 请求体时,再和模型是不是 Responses Lite 做一次与。Lite 上这面旗关掉。压缩那两条组包路径也写死 true,为的是和主采样请求的形状对齐,websocket 复用会逐字段对比,其中就包括这面旗。 出处:codex-rs/core/src/session/turn.rs 第 1312 至 1328 行 · codex-rs/core/src/client.rs 第 946 至 953 行 执行侧另有一张表。ToolExecutor 默认 supports_parallel_tool_calls 返回 false。漏写覆盖就走写锁。exec_command、view_image、tool_search 覆盖成 true。apply_patch 不覆盖。路由先查注册表,查不到当 false。曝光是 Hidden 的,handler 自己返回 true 也没用。MCP 还要服务器开关或只读提示,缺省仍是串行。 出处:codex-rs/tools/src/tool_executor.rs 第 122 至 124 行 · codex-rs/core/src/tools/registry.rs 第 470 至 473 行 模型只看见 parallel_tool_calls 为 true 或 Lite 下的 false。它看不见谁能并行。工具清单也不会因为某个工具其实要拿写锁而少掉一项。 ## 统一入口:一条命令按特征分叉(工具) URL: https://xueai.miyang.cn/slides/codex-12.html (以下为免费预览,全文见页面) 统一入口:一条命令按特征分叉 模型只看见 exec_command 和 write_stdin。进门之后,tty、远程环境和 150 毫秒窗口会把同一条命令送到 PTY、pipe、exec-server,或者送进重试门。 模型只看见 exec_command 和 write_stdin。进门之后,tty、远程环境和 150 毫秒窗口会把同一条命令送到 PTY、pipe、exec-server,或者送进重试门。 构造 command 加 cwd 请求mod.rs L12 编排器审批:bypass、缓存或弹窗mod.rs L14 按档案选沙箱并 transformmod.rs L15 按 tty 和远程环境分到 PTY、pipe 或 exec-serverspawn.rs L97 150 毫秒内退出则检查沙箱拒绝process.rs L349 启发式或执行器旗标成立则标成 Deniedprocess.rs L307 编排器过 escalate 与策略门orchestrator.rs L356 UnlessTrusted 且已批准则不再问orchestrator.rs L411 允许 unsandboxed 则第二次用 Noneorchestrator.rs L459 活过窗口则入库再 yieldprocess_manager.rs L535 迟到拒绝收成 Ok 回执exec_command.rs L384 用户 Esc 只取消 turnprotocol.rs L546 模型要装依赖,发出 npm install。同一轮里又开 vim 改 README。若每种执行各写一套审批和沙箱,Guardian、网络代理和审批缓存会复制三遍,改一处漏两处。 对外只有 exec_command 和 write_stdin。前者开进程,后者往已有进程写,空写就是一次 poll。内部跟踪的是 process_id,模型侧参数名叫 session_id。管理器只准备请求,审批、选沙箱、重试交给编排器。 出处:codex-rs/core/src/unified_exec/mod.rs 第 12 至 17 行 本地拉起按两个开关三选一。tty 为真走 PTY。tty 为假且 stdin 开着,走带 stdin 的 pipe。否则走不带 stdin 的 pipe。远程环境或带 shell snapshot 的请求不走本地 spawn,它们走 exec-server。Windows 受限令牌是单独一条后端。 出处:codex-rs/sandboxing/src/spawn.rs 第 97 至 127 行 默认工具调用常常是 pipe。模块注释里的拉起 PTY,只覆盖 tty=true 那一支。要完整终端能力,模型必须显式打开 tty。环境变量还会钉死 TERM=dumb、PAGER=cat 一批值,交互程序先被削一层。 ## 沙箱管理器:把权限档案编译成一行命令(沙箱) URL: https://xueai.miyang.cn/slides/codex-13.html (以下为免费预览,全文见页面) 沙箱管理器:把权限档案编译成一行命令 工作区可写,网络收紧。同一条 git status,Mac 套上 sandbox-exec,Linux 套上 helper,Windows 可能原样出门。差别出在编译器。 工作区可写,网络收紧。同一条 git status,Mac 套上 sandbox-exec,Linux 套上 helper,Windows 可能原样出门。差别出在编译器。 git status git status git status 还没渲染。 读入 PermissionProfile 三态models.rs L411 叠上 additional permissionspolicy_transforms.rs L525 Auto 则跑 should_require_platform_sandboxpolicy_transforms.rs L541 select_initial 再问 get_platform_sandboxmanager.rs L62 None 则原样传出 argvmanager.rs L366 macOS 前置 /usr/bin/sandbox-execmanager.rs L401 Linux 序列化档案给 helperlandlock.rs L23 Windows 第一拍不改 argvmanager.rs L447 同一份档案渲染进 environment_contextenvironment_context.rs L96 同一份仓库,三台机器,模型发出同一条 git status。配置里写的是同一份权限档案:工作区可写,网络收紧。 排障的人会以为沙箱没生效。日志里档案还在,模型上下文里那份 environment_context 也还在。只是平台这一层没有把档案编译成包装命令。Windows 上开关关着,编译器交出原 argv,策略层还在。 SandboxManager 先问要不要,再问有没有。should_sandbox 只返回一个布尔。Forbid 恒假,Require 恒真,Auto 看档案形状。有托管网络要求,必须上。网络收紧时,除了调用方自己管文件系统,都要上。网络放开且文件系统不受限,才跳过。 出处:codex-rs/sandboxing/src/manager.rs 第 310 至 329 行 · codex-rs/sandboxing/src/policy_transforms.rs 第 541 至 561 行 然后 get_platform_sandbox 按操作系统给类型。macOS 给 Seatbelt,Linux 给 seccomp helper。Windows 多一个开关,关着就是空。空的意思是这台主机没有可派发的实现。 出处:codex-rs/sandboxing/src/manager.rs 第 62 至 76 行 select_initial 先问前者,再把后者的空收成 SandboxType::None。档案说需要,主机给不出,类型仍是 None。 出处:codex-rs/sandboxing/src/manager.rs 第 293 至 306 行 ## macOS:把安全策略拼成一个字符串(沙箱) URL: https://xueai.miyang.cn/slides/codex-14.html (以下为免费预览,全文见页面) macOS:把安全策略拼成一个字符串 Seatbelt 吃的是一段文本。文本由静态基线加现拼的读写网段组成。路径不进这段文本,走旁边的参数表。 Seatbelt 吃的是一段文本。文本由静态基线加现拼的读写网段组成。路径不进这段文本,走旁边的参数表。 权限档案拆成读写网络manager.rs L375 固定使用 /usr/bin/sandbox-execseatbelt.rs L56 装入四份静态 sbplseatbelt.rs L21 按根生成 allow 与 require-notseatbelt.rs L476 可写根钉上 file-write-unlinkseatbelt.rs L508 排除子路径同时写 literal 与 subpathseatbelt.rs L551 拼网络段,managed 无端口走受限seatbelt.rs L309 sections join 成 -p 文本seatbelt.rs L1012 路径写成 -DKEY=valueseatbelt.rs L1024 双短横线后接用户命令seatbelt.rs L1029 同事把仓库设成可写根,让模型在里面改代码。模型执行 mkdir .codex,想在仓库里落一份自己的配置。命令立刻失败,stderr 写着 Operation not permitted。可写根听起来像整棵树,实际不是。 再试一条更绕的路。模型先在仓库里写一个普通文件,再 mv 整个工作区,想把里面的 .codex 一起挪到沙箱外面。这条也失败。错误还是 Operation not permitted。 macOS 上 get_platform_sandbox 直接返回 MacosSeatbelt。那个布尔开关只对 Windows 有意义。包装器不是 Codex 自己的 exe,是系统里固定路径的 /usr/bin/sandbox-exec。PATH 上放一个同名二进制没用。 出处:codex-rs/sandboxing/src/manager.rs 第 62 至 76 行 · codex-rs/sandboxing/src/seatbelt.rs 第 52 至 56 行 策略文本分两层。四份 .sbpl 用 include_str! 编进二进制,当静态基线。动态段按这一次的可读可写根现拼。拼接顺序固定:基线、读、写、网络在前。全盘可读才加 preferences。受限读才加平台默认路径。祖先的 file-write-unlink 放最后,避免前面更宽的 allow 把 rename 用的 unlink 重新打开。 出处:codex-rs/sandboxing/src/seatbelt.rs 第 21 至 27 行 · codex-rs/sandboxing/src/seatbelt.rs 第 985 至 1012 行 基线第一句业务规则是 (deny default)。没写明的事一律拒绝。子进程继承这份底稿,sandbox-exec 拉起的 bash 再 fork 出来的子孙,仍在同一套规则里。 ## Linux:先建视图,再上 seccomp,最后 exec(沙箱) URL: https://xueai.miyang.cn/slides/codex-15.html (以下为免费预览,全文见页面) Linux:先建视图,再上 seccomp,最后 exec 同一条读取,Mac 上回 Operation not permitted,Linux 上回 No such file or directory。差别在于 Linux 先换进程能看见的文件树,再收紧它能调用的系统接口。 同一条读取,Mac 上回 Operation not permitted,Linux 上回 No such file or directory。差别在于 Linux 先换进程能看见的文件树,再收紧它能调用的系统接口。 读入权限档案并做 WSL1 预检manager.rs L413 拼出 helper argv,加上权限档案 JSONlandlock.rs L23 外层 run_main 决定走 bwrap 还是捷径linux_run_main.rs L152 拼内层命令,带上 --apply-seccomp-then-execlinux_run_main.rs L1520 bwrap 按顺序 ro-bind、bind、unsharebwrap.rs L306 exec bwrap 时插入 --as-pid-1launcher.rs L39 内层 capget,确认能力已清零linux_run_main.rs L216 打开 PR_SET_NO_NEW_PRIVS,然后装 seccomplandlock.rs L61 fork 用户命令,父进程 waitpid 收孤儿linux_run_main.rs L243 execvp 接管进程镜像linux_run_main.rs L1565 同事在 Mac 上跑 Codex,agent 去读 ~/.ssh/id_rsa,Seatbelt 立刻回 Operation not permitted。同一份仓库放到 Linux 笔记本上,常见文案变成 No such file or directory。路径常常根本不在挂载里。 如果先打开 PR_SET_NO_NEW_PRIVS,再去调系统自带的 bwrap,不少发行版上的 setuid 二进制会直接起不来。沙箱在装得最全的机器上反而失败。seccomp 是一套内核过滤器,用来规定进程还能调用哪些系统接口;no_new_privs 是它的前置条件,也会挡住 setuid 提权。 默认路径两次进入同一份 helper。外层只拼 bubblewrap,把文件系统换成默认只读,再叠可写根,.git、.agents、.codex 即使落在可写根里也保持只读。内层才打开 no_new_privs、装网络 seccomp,然后 fork、把进程镜像让给用户命令。 函数头把顺序写成三步: /// Entry point for the Linux sandbox helper. /// /// The sequence is: /// 1. When needed, wrap the command with bubblewrap to construct the /// filesystem view. /// 2. Apply in-process restrictions (no_new_privs + seccomp). /// 3. `execvp` into the final command. ## Windows:受限令牌、防火墙过滤器与两个专用系统用户(沙箱) URL: https://xueai.miyang.cn/slides/codex-16.html (以下为免费预览,全文见页面) Windows:受限令牌、防火墙过滤器与两个专用系统用户 没有 seatbelt,也没有 bubblewrap。Windows 上的沙箱是三道关卡叠起来的:令牌管写,专用账户管你是谁,WFP 按这个身份滤网。AppContainer 对不上这份权限模型,整套还默认关着。 没有 seatbelt 和 bubblewrap 的平台怎么叠出沙箱,以及 AppContainer 为什么被否掉 Windows 开关关着,平台沙箱返回空,后面不会包包装器manager.rs L62 需要沙箱时,用自己的 exe 加隐藏参数当包装器wrapper.rs L20 三个标志裁出受限令牌:削特权、LUA、写必须过交叉检查token.rs L480 RestrictedToken 这一档,读检查不看 capability SIDwindows.rs L109 Elevated 先用专用账户登录,再从那个令牌往下裁runner_client.rs L348 两个账户名写死:Offline 与 Onlinesetup.rs L50 网络策略未开或走代理时,选 Offline 身份setup.rs L706 只给离线账户装持久 WFP 过滤器wfp.rs L75 用户配置根默认挖空 .ssh 等目录setup.rs L56 没有后端时,只读档案加 Never,未匹配命令必须 Forbiddenexec_policy_windows_tests.rs L113 同事在 Mac 上跑 Codex,agent 去碰用户目录里的 SSH 私钥路径,立刻被 Seatbelt 拦住,错误写着 Operation not permitted。同一条读取放到 Windows 上,报错变成 Access is denied。再换一台没开 Windows 沙箱的机器,这条命令可能根本走不到 ACL,execpolicy 先把它判成 Forbidden 或 Prompt。 三台机器、同一份意图、三种失败。模型看到的下一句话不一样,下一步也会跟着变。如果 Windows 上假装有和 Unix 一样的默认沙箱,模型会按自己被关着去规划,实际命令裸跑。 macOS 限制这个进程能对哪些路径做哪些操作。Linux 限制这个进程能看见什么、能调哪些系统调用。Windows 没有 namespace,也没有 seccomp。Codex 换成另一套问题:这个身份能碰哪些资源。 令牌决定你是谁。RestrictedToken 档从当前用户令牌裁,Elevated 档先用专用账户登录,再从那个令牌裁。两边最后都进同一组标志:DISABLE_MAX_PRIVILEGE、LUA_TOKEN、WRITE_RESTRICTED。特权被削薄,写必须同时通过普通 ACL 和 restricting SID 的交叉检查。 读在 RestrictedToken 这一档仍然跟当前用户走。源码自己写了:WRITE_RESTRICTED 令牌上的 capability SID deny-read ACE 不参与读检查,所以读限制必须走 Elevated,裸跑会被直接拒绝。出处:codex-rs/windows-sandbox-rs/src/token.rs 第 480 行;codex-rs/sandboxing/src/windows.rs 第 109 至 117 行 主体能做什么,和客体能被谁碰,是两套隔离原语。换语言重写,Windows 上仍然没有 bwrap 可以调用。该问的还是:你有没有一份身份,这份身份被允许碰什么。 ## execpolicy:让策略文件自带测试用例(沙箱) URL: https://xueai.miyang.cn/slides/codex-17.html (以下为免费预览,全文见页面) execpolicy:让策略文件自带测试用例 白名单写错,通常要等线上才知道。Codex 把正反例写进规则本身,加载时就地跑一遍。规则和例子打架,这份策略进不了会话。 正反例写进规则本身,加载期就跑一遍;前缀精确匹配,多规则取最严 读入策略文本,开始 parseparser.rs L57 Starlark 求值 prefix_rule,缺 decision 时默认 allowparser.rs L348 规则和正反例先挂到待校验队列parser.rs L405 先跑反例,命中就报 ExampleDidMatchparser.rs L145 再跑正例,没命中就报 ExampleDidNotMatchparser.rs L147 包装命令先拆成内层 argvexec_policy.rs L831 按第一个 token 精确取规则桶policy.rs L334 多规则或组合命令取最严policy.rs L403 判定映射成 Skip、NeedsApproval 或 Forbiddenexec_policy.rs L375 你给团队写一条禁令,pattern 写成 git 加 reset。本意是拦 --hard。过了一周有人报,--keep 也被拦了。前缀一短,后面跟什么都命中同一条。 再过一周,模型用 bash -lc 包了一层。禁令按字面 argv 去匹 bash,第一条对不上,命令进了启发式通道。 白名单每条都在赌两件事。一是 pattern 刚好覆盖你想拦的。二是它不会误伤你想放的。这两件事通常要等线上才知道。下一次改 pattern 的人,也看不到作者当初怕误伤哪条命令。 Codex 把正反例写进规则本身。match 里是这条规则必须命中的命令,not_match 里是它必须放过的命令。prefix_rule 并不当场跑例子,它先把规则和例子推进待校验队列。整份 Starlark 求值完,parse 再统一校验。 顺序固定。先跑反例,再跑正例。反例误命中,报 ExampleDidMatch。正例一个都没命中,报 ExampleDidNotMatch。两种错都让 parse 返回失败,Policy 不会被 build 出去。出处:codex-rs/execpolicy/src/parser.rs 第 57 至 78 行,以及第 133 至 151 行 ## 审批策略:同一条命令,问不问看哪两颗旋钮(审批与网络) URL: https://xueai.miyang.cn/slides/codex-18.html (以下为免费预览,全文见页面) 审批策略:同一条命令,问不问看哪两颗旋钮 默认问不问跟沙箱种类绑在一起。问过一次之后,记住的是完整命令,还是一段前缀。 默认问不问跟沙箱种类绑在一起。问过一次之后,记住的是完整命令,还是一段前缀。 读当前 turn 的 AskForApprovalprotocol.rs L924 看 FileSystemSandboxKind 是不是 Restrictedpermissions.rs L227 Never 给 Skip,UnlessTrusted 给 NeedsApprovalsandboxing.rs L198 OnRequest 或 Granular 只在 Restricted 时要问sandboxing.rs L200 Granular 要问且关掉沙箱审批则 Forbiddensandboxing.rs L209 execpolicy 的 Prompt 再过第二道闸exec_policy.rs L214 会话缓存只收 ApprovedForSession,认精确 keysandboxing.rs L108 策略改了,给模型的说明书一起改permissions_instructions.rs L271 你把审批留在 on-request,沙箱从 workspace-write 拧到 danger-full-access。十分钟前那条出沙箱命令还会弹窗。现在不弹了。你没改审批旋钮。 审批策略 AskForApproval 是当前 turn 用哪套问人规则,类型里有四个变体。文件系统沙箱种类是三个,默认 Restricted,意思是只读或只能写工作区。这两颗旋钮在同一个判定函数里。改其中一颗,另一颗的行为会跟着走。出处:codex-rs/protocol/src/protocol.rs 第 924 至 947 行,以及 codex-rs/protocol/src/permissions.rs 第 227 至 232 行 一条命令先读审批策略,再看文件系统是不是 Restricted,再让 execpolicy 把 Allow、Prompt、Forbidden 叠上去。execpolicy 是按命令文本给出三态的规则文件。 默认问不问写在 default_exec_approval_requirement。Never 这一层给 Skip。UnlessTrusted 这一层给 NeedsApproval。OnRequest 和 Granular 只在 Restricted 时要问。read-only 和 workspace-write 都是 Restricted,所以这两格的默认结局一样。danger-full-access 把 kind 变成 Unrestricted,默认函数走 Skip。出处:codex-rs/core/src/tools/sandboxing.rs 第 198 至 230 行 Granular 还多一个闸。需要审批、且 sandbox_approval 关掉时,直接 Forbidden。文件系统如果已经是 Unrestricted,needs_approval 先变成假,Forbidden 分支进不去。关掉沙箱审批,只挡住本来就要弹的窗。 ## Guardian:让一个模型去审批另一个模型(审批与网络) URL: https://xueai.miyang.cn/slides/codex-19.html (以下为免费预览,全文见页面) Guardian:让一个模型去审批另一个模型 审批弹窗多到人开始无脑点同意时,Codex 把决定权交给一次锁死的审查会话。超时、坏 JSON、连续拒绝,各有各的收场。 四步法、失败关闸、超时与拒绝分账,以及按 turn 计数的熔断器 判断本轮审批是否交给 Guardianreview.rs L186 扩展若声明接管则不再开审查会话review.rs L313 过滤 transcript,只留用户意图和工具证据prompt.rs L506 按 Full 或 Delta 拼审查材料prompt.rs L89 克隆父配置,锁成只读并写成 Neverreview_session.rs L1407 trunk 空闲则追加,忙碌则 forkreview_session.rs L617 等待 JSON,超时上限 90 秒mod.rs L53 没有合法 JSON 就解析失败,可重试后关闸prompt.rs L714 allow 放行,deny 写上禁止改道的指示review.rs L717 只有显式 Deny 才记入熔断器review.rs L711 达到连续或窗口阈值,就 InterruptTurnmod.rs L176 你开着 Codex 改仓库。模型先跑 git status,再读两个文件,然后要 git push。下一分钟它要 curl,再下一分钟要往 /tmp 写备忘,再下一分钟要删掉那份备忘。弹窗叠弹窗。人开始只看命令头两个词,拇指已经形成肌肉记忆。 这就是审批疲劳。防线还在,判断已经不在。回路退化成一个总是亮绿灯的按钮。这时如果把自动放行交给刚写出这条命令的主模型,申请人兼审批人。如果失败时放行,超时和坏 JSON 就变成免费通行证。 Codex 把该不该自动放行抽成一次专职审查。它不替代沙箱,也不替代网络代理。它只接管一类本来会弹给用户的 on-request 审批。路由很窄:策略必须是 OnRequest 或 Granular,审查员必须是 AutoReview。默认审查员仍是用户。出处:codex-rs/core/src/guardian/review.rs 第 186 至 210 行 模块头把四步写死。 只留用户原话和近期工具痕迹。合成脚手架、普通 developer 消息丢掉。超长内容打上 truncated 标记。 克隆父配置,继承已经建好的 managed network 与 allowlist。审查员必须吐出严格 JSON。 超时、跑崩、坏 JSON,执行一律停住。中间态按拒绝处理。 合同要的是 allow 或 deny。产品要的是可执行判定。 合同只有四个字段。三个轴的枚举写在协议层的 approvals.rs,不在 protocol.rs。outcome 是唯一必填。低风险允许可以只回 {"outcome":"allow"},缺省的风险补成 Low,授权补成 Unknown。 ## 网络与凭据代理:模型看不见的那把钥匙(审批与网络) URL: https://xueai.miyang.cn/slides/codex-20.html (以下为免费预览,全文见页面) 网络与凭据代理:模型看不见的那把钥匙 出站要过几道门。真 token 不进子进程。模型看见的是假值和一句 403。 出站要过几道门。真 token 不进子进程。模型看见的是假值和一句 403。 拉起命令前,把真 token 换成同形状假值credential_broker.rs L92 沙箱只放行代理端口,直连 loopback 到此为止seatbelt.rs L325 解析 host,deny 先判且恒胜runtime.rs L553 本地字面量没有精确允许,按私有地址拦runtime.rs L578 域名解析到非公网,即便在名单里也拦runtime.rs L582 allowlist 为空或未命中,回 NotAllowedruntime.rs L598 只有 NotAllowed 才问决策器network_policy.rs L349 Limited 下非 GET、HEAD、OPTIONS 就拦config.rs L311 HTTPS 要看见内层方法,MITM 缺失就拦http_proxy.rs L312 请求头带着假值,才注入对应的真凭据mitm.rs L301 你让模型去 GitHub 提一个 issue。它写出 curl,环境里有真 token。下一秒域名换成 evil.example,或者打到 169.254.169.254。只拦「不在名单里的域名」,deny 条目和内网地址会漏。空名单若默认放行,忘写配置等于全开。 判定顺序写死。先 deny,再本地或私有,最后 allowlist。空名单和没命中,都拦。决策器只能翻 allowlist 漏掉的案,翻不了 denylist,也翻不了本地网段。 出处:codex-rs/network-proxy/src/runtime.rs 第 549 至 552 行;codex-rs/network-proxy/src/network_policy.rs 第 346 至 378 行;codex-rs/network-proxy/README.md 第 161 至 162 行 *.example.com 不含 apex,**.example.com 才含。解析到私有 IP 的域名,精确写进名单也拦。本地字面量要精确写上 localhost 或 127.0.0.1,通配 * 不算。 ## apply-patch,给模型设计一种 diff(给模型设计的接口) URL: https://xueai.miyang.cn/slides/codex-21.html (以下为免费预览,全文见页面) apply-patch,给模型设计一种 diff 模型填一份没有行号的补丁,人看的是事后算出来的 unified diff。同一处修改,两套格式各自会在哪一步翻车。 一份没有行号的补丁语言:定位靠上下文锚点,应用靠四级匹配,单文件对不上就不写盘 文法里的 @@ 只有锚点,没有起始行和跨度parser.rs L20 更新文件的 chunks 必须按在文件中出现的先后排列parser.rs L74 有 change_context 时,从 line_index 往下搜这一行file_update.rs L99 先整行精确比,再抹掉行尾空白,再两边 trimseek_sequence.rs L40 锚点找不到,立刻报 Failed to find context,不按附近行猜file_update.rs L109 单文件全部 chunk 在内存里算完,才调用 write_filelib.rs L695 跨文件失败时带着已经提交的 delta 返回,没有回滚lib.rs L453 给人看的 unified diff 是事后用 TextDiff 另算的file_update.rs L328 你让模型改一个函数:把 greet 里的 pass 换成 return 123。它吐出标准 unified diff,头一行写成 @@ -47,3 +47,3 @@。 文件刚才被另一处编辑插了两行,greet 已经在第 49 行。模型是在带行号的摘录里数的,写补丁时还要自己加算起始行和跨度。这四个数字一起错,是常态。 patch(1) 会按行号去找,找不到就 fuzz。fuzz 再失败,整份补丁作废。更麻烦的是它可能把变更贴到邻近的另一个函数上。测试还是绿的,只是改错了函数。 Codex 把填写和阅读拆开。模型填的那份没有行号。更新一段时,头一行只写成 @@ def greet():。单独一个 @@ 表示从当前位置继续搜。定位交给运行时的 seek_sequence。 人看变更时,界面上再另外用 similar::TextDiff 生成一份标准 unified diff。工具参数里那份 Codex 格式到这里已经用完了。 这份文法把没有行号写进了产生式。两种 @@ 写法都只带文本锚点: //! change_context: ("@@" | "@@ " /(.+)/) LF //! change_line: ("+" | "-" | " ") /(.+)/ LF //! eof_line: "*** End of File" LF ## exec 与 wait:跑不完的程序怎么收场(给模型设计的接口) URL: https://xueai.miyang.cn/slides/codex-22.html (以下为免费预览,全文见页面) exec 与 wait:跑不完的程序怎么收场 与其让模型发二十次工具调用,不如让它写一段 JavaScript。这段程序在哪跑、能干什么、十秒跑不完又怎么办,本课讲这三个问题背后的两个思路。 能力做减法的 V8 isolate,以及跑不完就让出 cell、用 wait 续跑的长任务协议 模型可以在首行写一句 pragma,声明这次给多少让出时间description.rs L22 执行入口把这个毫秒数换成「跑到点就观察一次」的模式service.rs L77 超过十秒的预算再送一秒宽限,另受服务端上限封顶service.rs L198 定时器到点,把攒下的输出整包交出去,缓冲同时清空cell_actor/mod.rs L242 让出这件事被翻译成一句模型读得懂的话,带上 cell 编号code_mode/mod.rs L283 模型拿编号回来续跑,还能顺手改预算、限长度或直接叫停wait_handler.rs L24 脚本跑完,返回结果并关闭这个 cellruntime.rs L24 读五个文件再汇总,用普通工具调用要走五次完整往返。每次往返把整个文件内容推进上下文,模型下一轮还得把滚大的历史重读一遍。真正贵的地方在往返的节奏上,工具本身不贵。 那让模型写程序不就行了。麻烦在于,这段程序没有任何人审过一行,模型现写现交。给它一个能读文件、能发网络请求的运行时,等于把宿主的全部能力直接交出去。 Codex 给模型两个工具,exec 和 wait。exec 收一段 JavaScript 源码,扔进一个全新的 V8 isolate 当 async module 求值。所有工具挂在全局 tools 对象上,名字被规范化成合法的 JS 标识符,写起来就是 await tools.exec_command(...)。程序里想循环就循环、想分支就分支,中间值留在变量里,只有主动交出去的那部分回到模型。 关键在于这个运行时被削得很薄。工具说明书里对模型直说了它没有什么: - Runs raw JavaScript -- no Node, no file system, no network access, no console. - Accepts raw JavaScript source text, not JSON, quoted strings, or markdown code fences. - You may optionally start the tool input with a first-line pragma like `// @exec: {"yield_time_ms": 10000, "max_output_tokens": 1000}`. - `yield_time_ms` asks `exec` to yield early if the script is still running. Defaults to 10000 ms. - `max_output_tokens` sets the token budget for direct `exec` results. Defaults to 10000 tokens. - When the JS code is fully evaluated, the isolate's lifetime ends and unawaited promises are silently discarded. ## 宿主拆分:程序挂在谁身上(给模型设计的接口) URL: https://xueai.miyang.cn/slides/codex-23.html (以下为免费预览,全文见页面) 宿主拆分:程序挂在谁身上 上一课讲 exec 和 wait 的语义。这一课问另一件事:这段 JavaScript 到底挂在谁身上,挂点换了之后,故障域和状态归属怎么变。 上一课讲 exec 和 wait 的语义。这一课问另一件事:这段 JavaScript 到底挂在谁身上,挂点换了之后,故障域和状态归属怎么变。 thread manager 按特性挑选提供方thread_manager.rs L455 本地提供方检查宿主文件是否存在remote_session.rs L70 spawn 宿主,Unix 上单独进程组connection.rs L217 握手后 session/open,宿主里 new 进程内会话lib.rs L602 嵌套工具经 RemoteDelegate 打回本机delegate.rs L27 app-server 按 URL 方案换成 WS 或 gRPCcode_mode_host.rs L32 gRPC 丢掉 lease 就关会话session.rs L105 重连后 cell ID 加世代前缀generation.rs L49 中断是否 terminate 看特性开关tasks/mod.rs L888 宿主不可用时,工具模式退回 Directtools/mod.rs L79 模型写一段 while (true) {},上一课见过,要靠 isolate 的 terminate 才能打断。这段程序如果和 Codex 事件循环抢同一个进程,卡死会从单个 cell 扩大到整条会话。 V8 的堆、JIT、没有条目上限的 store 表,任意一项在主进程里爆炸,都会带走 TUI 或 app-server。早期资料常把默认路径写成「主进程里直接跑 isolate」。当前特性注释已经把这句话改掉了。 出处:codex-rs/features/src/lib.rs 第 104 至 111 行 Codex 给「跑模型写的代码」留了一个提供方接口。业务层只依赖 CodeModeSession 和 CodeModeSessionProvider,自己不去 new 运行时。协议把会话收成四件事:execute、wait、terminate、shutdown。实现可以进程内,也可以远端。同会话共享 store,异会话隔离。 出处:codex-rs/code-mode-protocol/src/session.rs 第 146 至 167 行 主进程选提供方时,已经没有直接 new InProcessCodeModeSession 这条生产路径。CodeModeHost 打开,或者 disable_in_process_fallback 为真,都走向 ProcessOwnedCodeModeSessionProvider。两条都不成立,走向 DisabledCodeModeSessionProvider。 出处:codex-rs/core/src/thread_manager.rs 第 455 至 462 行 CodeModeHost 已经是 Stable,默认打开。用户看见的默认已经是本地子进程。进程内求值还在,只是沉到宿主进程内部:宿主打开会话时 new 的就是 InProcessCodeModeSession。isolate 活在小屋里,房东换成了独立二进制 codex-code-mode-host。 出处:codex-rs/features/src/lib.rs 第 921 至 925 行 · codex-rs/code-mode-host/src/lib.rs 第 599 至 608 行 ## 多 Agent 是一张要持久化的图(扩展) URL: https://xueai.miyang.cn/slides/codex-24.html (以下为免费预览,全文见页面) 多 Agent 是一张要持久化的图 派出去的是节点,边一出生就是 Open。信先入队,followup 才叫醒。关掉的是边,历史还在。 派出去的是节点,边一出生就是 Open。信先入队,followup 才叫醒。关掉的是边,历史还在。 计算下一层深度,写入 ThreadSpawnregistry.rs L87 用 task_name 拼出绝对路径 /root/explore_authmulti_agents_common.rs L117 从科学家名单抽出外号 Hypatiacontrol/spawn.rs L32 非临时会话立刻 upsert 一条 Open 边control.rs L776 send_message 按 QueueOnly 组包,只入队message_tool.rs L103 信箱是会话级队列,入队后发 Mailbox 活动input_queue.rs L127 followup_task 把 trigger_turn 打开,这才叫醒handlers.rs L98 子 turn 结束,给父发 Result,不叫醒session/mod.rs L1977 关机不改边;关边只标目标自己的入边 Closedlegacy.rs L6 重启只把 Open 后代的身份装回注册表control/spawn.rs L158 你让主会话派一个探索者去查 auth 模块。模型调用 spawn_agent,工具回了一句任务名 /root/explore_auth,外号 Hypatia。过几分钟点 wait_agent,信箱里躺着一份 FINAL_ANSWER。 第二天打开同一条 thread。子会话的运行时已经卸掉了。系统如果只记得昨天发生过一次调用,这条路径就找不到。你再发 send_message,控制面会报 live agent path not found。 Codex 把父子做成有向边。边只有两个值。Open 表示还能当打开的 spawned agent 恢复。Closed 表示从图的视角已经关掉。序列化是 open 和 closed。 出处:codex-rs/agent-graph-store/src/types.rs 第 4 至 12 行 图存在 SQLite 的 thread_spawn_edges 表。child_thread_id 是主键,一个孩子不能挂两个父。同一孩子再 spawn 一次,父和状态都会被新值盖住。会话正文不进这张表。子 agent 的模型上下文仍走自己的 rollout。图只回答谁生了谁,这条边现在开还是关。 出处:codex-rs/state/migrations/0021_thread_spawn_edges.sql 第 1 至 8 行 非临时会话在线程建出来之后立刻 upsert 一条 Open 边。写入失败只打 warn。子 thread 已经在跑,图可以稍后补。补写用 ON CONFLICT DO NOTHING,不会把已经 Closed 的边改回去。 出处:codex-rs/core/src/agent/control.rs 第 767 至 780 行 列后代时,过滤条件作用在走过的每一条边上。Some(Open) 只沿着 Open 走。父边已经 Closed 的子树,就算孙边仍是 Open,也不会被列出来。 出处:codex-rs/agent-graph-store/src/store.rs 第 49 至 54 行 ## 挂钩点能改什么,由事件合同决定(扩展) URL: https://xueai.miyang.cn/slides/codex-25.html (以下为免费预览,全文见页面) 挂钩点能改什么,由事件合同决定 一次 turn 会经过十一个挂钩。协议认四种处理器,运行表只装命令和 MCP。超时默认放行,拆卸期丢掉 stdout。 一次 turn 会经过十一个挂钩。协议认四种处理器,运行表只装命令和 MCP。超时默认放行,拆卸期丢掉 stdout。 协议枚举列出十一个事件名protocol.rs L1510 配置层认四种 type,后两个是空结构体hook_config.rs L183 发现阶段把 Prompt 和 Agent 写成 not supported yetdiscovery.rs L626 运行表只收下 Command 和 McpToolengine/mod.rs L107 只有同步 hook 能施加控制效果engine/mod.rs L146 超时写入 error,should_block 保持 falsecommand_runner.rs L317 退出码 2 加 stderr 才标成 Blockedpre_tool_use.rs L261 Allow 映射成一次性 Approvedapprovals.rs L465 Stop 的 block 带 prompt 才在轮次层 continueturn.rs L509 SessionEnd 退出码 0 即完成,丢掉 stdoutsession_end.rs L109 你刚从 Claude Code 把一份 hooks.json 搬过来。文件里有三条处理器:命令拦危险 shell,提示词让小模型审用户提交,agent 在 Stop 时再起一个子会话跑 linter。Claude 那边三条都能跑。 贴进 Codex,启动会话。命令那条亮了。后两条日志各写一句 not supported yet。协议枚举明明列着 Prompt 和 Agent,配置解析也认这两个 tag。装进运行表的只有命令和 MCP 工具。 内核对外有三张表,宽度不一样。 协议面列出十一个事件名,serde 走 snake_case。旁边四个处理器类型也在:Command、McpTool、Prompt、Agent。 出处:codex-rs/protocol/src/protocol.rs 第 1508 至 1531 行 配置面用 type 标签把这四个名字都接住。后两个是空结构体。解析能过,字段里没有可执行内容。 出处:codex-rs/config/src/hook_config.rs 第 183 至 187 行 发现阶段看见后两个就 continue,文案是 prompt hooks are not supported yet 和 agent hooks are not supported yet。引擎里真正可执行的种类只有命令和 MCP 工具。普通用户配置里,这两条只进 warning,会话继续。托管必选 hook 配了它们,启动会失败。 出处:codex-rs/hooks/src/engine/discovery.rs 第 626 至 645 行 JSON hook 的运行时类型名直接写成 ClaudeHooksEngine。兼容不是注释里的愿望,是类型名。stdin 喂 JSON,stdout 按 schema 解析。旁边还留着一条旧 notify 路,只在 turn 收工时 fire-and-forget 一条命令。两条路不要混。 出处:codex-rs/hooks/src/engine/mod.rs 第 107 至 119 行 ## MCP 接进来:模型看见翻译过的名字(扩展) URL: https://xueai.miyang.cn/slides/codex-26.html (以下为免费预览,全文见页面) MCP 接进来:模型看见翻译过的名字 外部 server 的工具要先过一层翻译才进模型眼睛。skill 目录常在,缺 MCP 时另问人。 外部 server 的工具要先过一层翻译才进模型眼睛。skill 目录常在,缺 MCP 时另问人。 连接集整份发布,已有 binding 继续拿自己那份连接runtime.rs L246 各家 tools/list 汇成一张表,再交给命名翻译tool_catalog.rs L153 给命名空间加上历史前缀 mcp__tools.rs L228 非法字符洗成下划线,只留字母数字和下划线mcp/mod.rs L477 完全相同的原始身份丢掉一份tools.rs L134 清洗后命名空间撞车,末尾加 12 位 SHA-1tools.rs L166 清洗后工具名撞车,同样加 12 位哈希tools.rs L193 合起来超过 128 字节就截断再哈希,协议调用仍走原名tools.rs L226 你把 codex mcp-server 写进 Cursor 的 MCP 配置。Cursor 当 client,Codex 当 server。若这一次 tools/list 把内部 GitHub 工具一并交出去,IDE 调一次就摸到内部能力。权限边界从「调一次 Codex」扩成「直接调内部工具」。 crate 拆成两套。mcp-server 从 stdin 读行,一行一条 JSON。initialize 只打开 tools。tools/list 写死两个名字:codex 和 codex-reply。codex 会 start_thread,nested thread 再起自己的 McpRuntime。codex-mcp 管连接集,外部 server 的工具另做一份目录。 出处:codex-rs/mcp-server/src/lib.rs 第 131 至 152 行;codex-rs/mcp-server/src/codex_tool_runner.rs 第 66 至 90 行;codex-rs/codex-mcp/src/runtime.rs 第 88 至 98 行 同一份 JSON-RPC 线协议,处理器不是同一个。早期资料常把它们画成同一个 runtime 的两张脸。当前源码里它们甚至不共享 MessageProcessor。 出处:codex-rs/mcp-server/src/message_processor.rs 第 274 至 277 行;codex-rs/mcp-server/src/message_processor.rs 第 336 至 348 行 ## 搬家只搬对得上的字段(扩展) URL: https://xueai.miyang.cn/slides/codex-27.html (以下为免费预览,全文见页面) 搬家只搬对得上的字段 换到 Codex 的第一周,最怕去年攒的 hook、MCP 和插件还在不在。检测会列出一份清单。导入只收下能映射的那一部分。 换到 Codex 的第一周,最怕去年攒的 hook、MCP 和插件还在不在。检测会列出一份清单。导入只收下能映射的那一部分。 按字符串选择 Cla 或 Cur,对不上就落到 Claude Codemigration_source.rs L59 先扫用户级配置,仓库范围不跑插件检测detect/mod.rs L330 会话按 30 天和 50 条过滤,太旧的丢掉sessions/common.rs L43 memory 要源支持,还要单独打开特性开关detect/mod.rs L59 hook 只留同步 command,prompt 整条跳过hooks_cla.rs L135 MCP 命令里出现 ${,整台 server 不要mcp.rs L208 市场来源只收 git 家族和本地目录,npm 丢掉source_cla.rs L270 说明文件改名,产品名按词边界改写成 Codexrewrite.rs L39 同步 import 对 Sessions 直接返回成功service.rs L437 后台再写 thread,远程插件后装;开关关则拒绝 memoryprocessor.rs L184 有人告诉你会自动从 Claude Code 搬家。你以为是把整个配置目录拷过来。第二天 hook 少了一条,MCP 少了一台,memory 没出现在清单里。少掉的 hook 用了 type: prompt。少掉的 MCP 命令里写了 ${API_KEY}。 再换一个同事。他用的是 Cursor。Codex 能看见他的 skill 和 hook,看不见他的 memory。仓库里的 Cursor 插件配置会被直接丢掉。 搬家 crate 只负责把外部配置读进来。插件怎么跑,在旁边的 core-plugins。源在类型上只有两个变体:Cla 是 Claude Code,Cur 是 Cursor。字符串对不上 cursor,就落到 Claude Code。调用方漏传源,检测会去翻 ~/.claude。 出处:codex-rs/external-agent-migration/src/migration_source.rs 第 51 至 67 行 一次检测最多产出十种条目。每种后面的导入必须给一个去处。字段先过白名单。Codex 认 11 个 hook 事件,Claude Code 发出 27 个。名字对不上的组,整组消失。单条 hook 的 type 默认当 command,对不上就跳过。MCP 的 command 或 url 里出现 ${,整台不要。市场来源只收 github、git、本地目录。file、url、npm、settings 直接丢掉。 出处:codex-rs/external-agent-migration/src/model.rs 第 53 至 64 行 · codex-rs/hooks/src/lib.rs 第 23 至 35 行 · restored-src/src/entrypoints/sdk/coreSchemas.ts 第 355 至 383 行 · codex-rs/external-agent-migration/src/hooks_cla.rs 第 131 至 137 行 · codex-rs/external-agent-migration/src/mcp.rs 第 204 至 210 行 · codex-rs/external-agent-migration/src/source_cla.rs 第 270 至 274 行 ## SQ 进、EQ 出:同一件事两副面孔(协议与界面) URL: https://xueai.miyang.cn/slides/codex-28.html (以下为免费预览,全文见页面) SQ 进、EQ 出:同一件事两副面孔 命令走进程内的 Submission Queue。事件走能写成 JSON 的 Event Queue。Rust 名叫 TurnStarted,磁盘上仍写 task_started。 命令走进程内的 Submission Queue。事件走能写成 JSON 的 Event Queue。Rust 名叫 TurnStarted,磁盘上仍写 task_started。 生成 UUID7 作为提交 idsession/mod.rs L918 把 Op 包成 Submissionsession/mod.rs L817 送进容量 512 的 SQsession/mod.rs L833 submission_loop 按变体分发handlers.rs L526 send_event 用 sub_id 做 Event.idsession/mod.rs L1952 需要时再发 legacy 副本session/mod.rs L1965 按白名单决定是否写入 rolloutsession/mod.rs L2169 送进 unbounded EQsession/mod.rs L2185 MCP 把整个 Event 序列化成 codex/eventoutgoing_message.rs L117 resume 时坏行计入 parse_errorsrecorder.rs L1046 你给侧栏等 type 等于 turn_started。联调那天字段对得上,type 却写成 task_started。你改成新名,旧夹具里的旧名还能解出来。 然后你加了一个自己的事件。本地和内核一起编,过了。隔壁旧版 MCP 客户端解不出来。再过一周,新版写下的 rollout(会话落盘文件)拿到旧版里 resume。那一行被跳过,parse_errors 加一,会话还能开,少了一段生命周期。 命令里带着 oneshot 回调、审批决定,甚至 realtime 音频帧。事件要进 rollout,要被 MCP 写成 JSON,要被旧客户端按 type 分发。方向、寿命、能不能过网,叠在同一种「消息」上会互相拖累。 模块头只用四行,把说话方式写死:一次会话里,客户端和 agent 用 SQ / EQ 异步通信。 //! Defines the protocol for a Codex session between a client and an agent. //! //! Uses a SQ (Submission Queue) / EQ (Event Queue) pattern to asynchronously communicate //! between user and agent. 下行条目是 Submission。它有关联用的 id,有要执行的 Op(内核动词,当前 28 个),只派生 Debug,没有 serde。上行条目是 Event。它有 serde。id 对上当初那条提交,msg 才是事件本体。 ## 对外协议是投影(协议与界面) URL: https://xueai.miyang.cn/slides/codex-29.html (以下为免费预览,全文见页面) 对外协议是投影 IDE 看见的是 Thread / Turn / Item,不是内核 EventMsg。一次 turn/start 先回响应,再推事件流;审批是反向请求,不回包这一轮就停住。 IDE 看见的是 Thread / Turn / Item,不是内核 EventMsg。一次 turn/start 先回响应,再推事件流;审批是反向请求,不回包这一轮就停住。 你在给编辑器写插件。调试器里已经能看到内核往外抛事件:turn_started、exec_command_begin,字段是 snake_case。第一包数据过来,对不上。方法名是 turn/started,中间是斜杠。字段是 threadId、startedAt。 命令开始时你等的 exec_command_begin 没出现,来的是 item/started,里面塞着一个 type: "commandExecution" 的 item。审批更怪:服务端反向发来一条 request,你得回 response,否则这一轮卡在那儿。 如果编辑器按 81 种 EventMsg 写 switch,每加一种内部事件都是一次客户端升级。deprecated 别名也会从仓内兼容问题变成对外合同。 调度函数 apply_bespoke_event_handling 吃一条内核 Event,按四条规则收成对外消息。 EventMsg 的 snake_case type 变成 turn/started、item/agentMessage/delta 这种资源路径,字段改成 camelCase。 delta 和工具生命周期被收进 ThreadItem,再塞进 item/started 或 item/completed。IDE 按 item 的 type 画卡片。 ExecCommandBegin、ViewImageToolCall、以及 match 末尾的通配臂,线上没有对应通知。旧事件还在给 rollout 扇出。 一条 ItemStarted(DynamicToolCall) 既发通知,又发 item/tool/call 这条 ServerRequest,等客户端执行。 出处:codex-rs/app-server/src/bespoke_event_handling.rs 第 159 至 188 行;codex-rs/app-server/src/bespoke_event_handling.rs 第 880 至 918 行;codex-rs/app-server/src/bespoke_event_handling.rs 第 996 至 1036 行 item_event_to_server_notification 只覆盖一对一、无状态的投影。函数名像总入口,调用点才知道它是助手。ExecCommandBegin 在助手里还能变成 item/started,在调度里却走进 deprecated 空分支。现场命令卡片来自后面的 ItemStarted。以调度为准。 出处:codex-rs/app-server-protocol/src/protocol/event_mapping.rs 第 25 至 37 行;codex-rs/app-server-protocol/src/protocol/item_builders.rs 第 1 至 11 行 ## 流式输出怎么在终端两区之间定稿(协议与界面) URL: https://xueai.miyang.cn/slides/codex-30.html (以下为免费预览,全文见页面) 流式输出怎么在终端两区之间定稿 模型按 token 往外推,终端却是一个写出去就改不了的字符网格。已经不会变的行交给 scrollback,还可能变的尾巴留在活动 cell,表格没闭合之前整段扣住。 模型按 token 往外推,终端却是一个写出去就改不了的字符网格。已经不会变的行交给 scrollback,还可能变的尾巴留在活动 cell,表格没闭合之前整段扣住。 没有换行的 delta 不改可见尾巴streaming.rs L489 收集器等到换行才提交 sourcemarkdown_stream.rs L87 扫描器看上一行是不是表头table_holdback.rs L23 确认表之后从 header 起整段扣在尾巴controller.rs L384 散文行入队,等 tick 写进 scrollbackcontroller.rs L343 tick 把稳定行写成 HistoryCellstreaming.rs L399 insert_history 写进终端 scrollbackinsert_history.rs L3 流结束才把整张表一次定稿controller.rs L160 你盯着终端看模型写答案。散文还好,一行一行往下长。接着它开始吐一张表:先出表头,再出分隔行,再出第一行数据。列宽每来一行就变一次。刚才对齐好的 Description 被挤到下一列,上一帧的竖线还印在屏幕上。 你往上滚想看刚才那句结论,滚轮动了,历史和正在写的尾巴叠在一起。网页换 DOM 时浏览器会保住滚动位置。终端往 stdout 写一个字,光标就往前走一格。想留住旧答案,又想让表跟着新行改列宽,就得先决定哪些格子属于过去,哪些还属于现在。 Codex 把渲染结果切成两区。能确定不再变的行进动画队列,等 commit tick 写成 HistoryCell,用转义序列塞进终端自己的 scrollback。还可能变的行只活在活动 cell 里,下一帧可以整段换掉。 出处:codex-rs/tui/src/streaming/controller.rs 第 1 至 36 行 控制器同时记两套长度。enqueued_stable_len 是交给队列的行数,emitted_stable_len 是写进 scrollback 的行数。尾巴从 enqueue 边界算起。按 emit 切的话,排队还没写出的行会在活动 cell 里再出现一次。三个指针同向移动,已经 emit 的那一截不许回头改。 没换行的 token 连尾巴都不更新。用户看见的最小时间单位是一行 markdown source。半行表格如果先画出来,下一秒结构一对,列会立刻消失再长出来。未结束的 source 进缓冲,不能改可见尾巴。 出处:codex-rs/tui/src/chatwidget/streaming.rs 第 489 至 492 行 这是格子所有权的合同。已经交给终端 scrollback 的字,进程里没有可写副本。用户用滚轮、搜索、复制,用的是终端自己的能力,TUI 不必再做一份完整历史视口。代价是提交之后不能改。换个语言重写,只要界面是终端字符网格,这道题还在。 ## 把架构决策写成 lint(收束) URL: https://xueai.miyang.cn/slides/codex-31.html (以下为免费预览,全文见页面) 把架构决策写成 lint 同一份 AGENTS.md 里,有命令的规则会在三台操作系统上亮红。只有路径的那条,重命名之后没人发现。 同一份 AGENTS.md 里,有命令的规则会在三台操作系统上亮红。只有路径的那条,重命名之后没人发现。 调用点是不是匿名字面量lib.rs L261 注释名字是否等于参数名lib.rs L222 被调方是不是 workspace cratelib.rs L177 CI 是否三平台同时跑rust-ci.yml L174 Markdown 路径是否存在AGENTS.md L35 Feature 是否登记在穷尽表lib.rs L379 开发中特性默认必须关闭tests.rs L18 新人接到任务:改 MCP 工具调用。它打开 AGENTS.md,抄下第 35 行的路径。文件不存在。真实文件叫 connection_manager.rs,就在同一个目录。文档里那个带 mcp_ 前缀的名字,是一次重命名之后没改干净的残留。 出处:AGENTS.md 第 32 至 36 行;codex-rs/codex-mcp/src/connection_manager.rs 第 1 至 15 行 同一份文件里,位置参数少了 /*base_url*/,本地命令会红。改了 Cargo.toml 忘刷 Bazel 锁,CI 会红。第 35 行那条路径没有检查器。Markdown 不会自己核对文件在不在。 先改 API,让调用点自己能读。foo(false) 的读者必须跳到定义才能知道这个 false 管什么。改不了 API,才允许 /*param_name*/。lint 是退路。 出处:AGENTS.md 第 14 至 20 行 实现住在独立的 Dylint 库,当一次 rustc。类型解析完成后,才能拿到被调方的参数名。入口只看函数调用和方法调用,宏展开出来的直接跳过。 检查按这个顺序走。 1. 只查本仓库 crate,std 和 tokio 直接放过。 2. 注释从参数前的空隙、前 64 字节、参数文本自身三处找。 3. 名字不对报 mismatch。错注释不会再落到没写注释那条。 4. 没写时,方法名等于唯一参数名就豁免,例如 .enabled(false)。 5. 剩下的只拦匿名字面量。None、布尔、数字要写,字符串和字符放过。 出处:tools/argument-comment-lint/src/lib.rs 第 165 至 180 行;tools/argument-comment-lint/src/lib.rs 第 261 至 274 行 ## 两种安全视角:同一条命令,两套判词(收束) URL: https://xueai.miyang.cn/slides/codex-32.html (以下为免费预览,全文见页面) 两种安全视角:同一条命令,两套判词 出事之前有没有门可以拒绝,出事之后能不能复原模型当时看见的世界。同一条危险命令上,这两套视角会一致,也会给出相反结论。 出事之前有没有门可以拒绝,出事之后能不能复原模型当时看见的世界。同一条危险命令上,这两套视角会一致,也会给出相反结论。 同一条 argv 同时交给两套视角L场景 可拒绝先看 Decision 三态,用最严的那一档decision.rs L9 审批缓存的 key 带完整 argv,不认前缀unified_exec.rs L92 Guardian 超时或坏输出就关闸guardian/mod.rs L11 平台沙箱三套后端,Windows 关着就是 Nonemanager.rs L37 可回放认 JSONL 原文,SQLite 只是镜像README.md L22 fork 必须撞到真实的 TurnStartedthread_rollout_truncation.rs L187 失败写成观察,success 仍为 truecontext.rs L351 代理 403 回给命令进程,循环继续responses.rs L80 对照两份判词:一致还是相反L验收 周一早上,安全同事把一段聊天记录甩到群里。模型昨晚连了外部 API,请求头带着仓库里的部署令牌。他问:当时模型究竟看见了什么环境变量。你打开会话,标题还在,点进去对不上。SQLite 里有一行元数据,JSONL 缺了半截。 可回放要回答的就是这件事。出事之后,你能不能精确复现模型当时看见的世界。 Codex 把历史写成两份。JSONL 是原文,只追加已经定稿的条目,不从内容里推断元数据。SQLite 是镜像,给列表和检索用。元数据丢了可以再抽。JSONL 丢了,恢复必须读文件。 出处:codex-rs/thread-store/README.md 第 22 至 28 行 然后还有一道筛选。持久化策略会丢掉流式增量、审批弹窗、警告和 MCP 启动进度。TurnStarted 留下。你能回放 turn 边界和完成态,回放不了当时屏幕上闪过的审批文案。 出处:codex-rs/rollout/src/policy.rs 第 86 至 105 行 fork 认的也是这条物理边界。目标 turn 必须在有效历史里,文件里真有一条 TurnStarted,进行中的 turn 直接拒绝。投影出来的合成 ID 不能当切点。 出处:codex-rs/core/src/thread_rollout_truncation.rs 第 187 至 191 行 所以真相也经过筛选。列表能告诉你有过这个线程。只有 JSONL 能告诉你模型当时看见了哪几条消息。 原文和投影拆开,投影坏了可以重建,原文坏了现场就没了。换一套存储,该问的还是谁是原文。这份合同不随语言变。 ## 权重是什么?一个模型的全部本事(开源到底开的是什么) URL: https://xueai.miyang.cn/slides/oss-1.html 权重是什么?一个模型的全部本事 新闻里天天说「某某模型开源了」。开源的到底是什么东西?是代码吗?其实主要是一个文件:权重。搞清楚它是什么,后面所有关于开源的争论你都能自己判断。 训练几个月最后凝结成的那个文件:它长什么样、多大、为什么说拥有权重就是拥有控制权 这一章的例子基本都取自 Qwen,先说清楚为什么。 尺寸铺得最全。Ollama 官方库里 Qwen3.5 一代从 0.8B 一直排到 122B,中间有 2B、4B、9B、27B、35B。本章后面每讲到一档设备,都能对应上一个真能下载下来的文件,不用换品牌凑数。 别人拿它当底座。DeepSeek-R1 放出的六个蒸馏版里有四个用的是 Qwen 底座——这是第三方的选择,不是自家宣传。 它自己就是个反面教材。Qwen2.5 时期的 3B 和 72B 用过非标准许可证,正好拿来讲「开源」这两个字有多不可靠,这一节在第二节。 中文社区里有人管它叫「源神」,开源之神。这是网友的戏称,不是评价标准,也不代表它每一项都最强。本章拿它举例是因为素材齐、方便动手,不是因为它最好。你学完这一章要拿到的是判断标准,不是一个品牌名——同一套标准套到任何一家身上都应该照样能用。 模型内部没有规则、没有知识库、没有 if-else。有的只是一个巨大的数字表格。下面这些格子里的每个数,就是一个权重,颜色深浅表示它的绝对值大小。 上面是 36 个数。一个 Qwen3-8B 模型有 80 亿个这样的数。训练的全部意义,就是把这几十亿个数从随机值一点点调整到合适的值。调完了,参数冻结,模型就定型了。 每个权重占多少字节,取决于存储精度。模型发布时通常用 FP16,也就是每个数占 2 个字节。所以文件体积有一个很好记的估算: 公式记住了,但它到底意味着什么,拖一下就知道了。下面这个滑块从 0.5B 拖到 2.4 万亿,你可以顺手切换存储精度,看同一个模型的文件是怎么胀大和缩小的。 下面用一组真实的模型对比一下。这里选 Qwen 系列做尺子,是因为它的尺寸谱系目前最完整,从 0.6B 一直到 2.4T 都有公开型号,同一个系列内部比较不会掺进架构差异的干扰。 存储体积和运行时占用是两码事。文件 16 GB,不代表 16 GB 显存就能跑起来。模型运行时还要额外开销一块地方存放对话的中间状态,也就是Harness 核心篇讲过的 KV Cache。算下来通常要在参数量的基础上多留三到五成。 这一章最后有一页交互工具,你可以直接选自己的显卡或者 Mac 型号,看能跑哪些模型。这里先记住结论:看文件大小估显存,会低估。 把上面的事情串起来,权重的意义就清楚了。它不只是一个文件,它是控制权。 反过来说,只提供 API 的模型,你租的是使用权。价格、可用性、什么时候下线,都由对方决定。这个区别在做技术选型时会直接变成风险,也是下一节要拆的东西:各家嘴里的「开源」,含义差得非常远。 ## 真开源 vs 假开源:怎么看懂一张许可证(开源到底开的是什么) URL: https://xueai.miyang.cn/slides/oss-2.html 真开源 vs 假开源:怎么看懂一张许可证 几乎每家都说自己「开源」,但这个词在各家嘴里的含义差得很远。有的能随便商用,有的用户量一大就要另外签合同,有的只是发了篇论文。学会自己判断,比记住谁家开源更有用。 三个问题定位开放程度;用同一套尺子横量 Qwen、Mistral、DeepSeek、Llama 与只给 API 的模型 不用读完整份许可证。按顺序问下面三个问题,绝大多数模型的开放程度就定位清楚了。 问题 1权重文件能下载吗? 能下载,才谈得上后面所有事情。只能通过 API 调用的模型,无论宣传里怎么写,你都拿不到上一节说的那个控制权。这一问就能筛掉一大半。 问题 2能商用吗?有没有附加门槛? 这里最容易踩坑。有的许可证允许商用,但加了用户规模上限;有的限定只能用于研究。做产品之前不看清楚,等用户量涨上来才发现要补授权,就很被动了。 问题 3能用它的输出去训练新模型吗? 也就是能不能拿它做蒸馏。这一条决定了你能否在它基础上做出自己的模型,是后面两节要展开讲的事情。各家在这一条上的态度分歧最大。 光看不算掌握,拿一个你手上正在考虑的模型来走一遍。下面这个向导就是上面三问,一次问一个,答完直接告诉你它落在哪一档。 下面对每家问同样四个问题。第四个问题是训练数据是否公开,加进来是为了看清一件事:在大模型这个领域,「开源」这个词已经被重新定义过了。 可下载权重 可商用,无用户量限制 可用于训练新模型 否训练数据未公开 可下载权重 可商用,无用户量限制 可用于训练新模型 否训练数据未公开 可下载权重 可商用,无需申请 可官方明确允许蒸馏 否训练数据未公开 可下载权重 限月活超 7 亿需单独授权 可用于训练新模型 否训练数据未公开 否权重不可下载 否无法本地部署 否无法用于训练 否训练数据未公开 同样值得留意的是,许可证会变。Qwen 在 2.5 那一代用的是分级许可,多数尺寸走 Apache 2.0,3B 和 72B 另有单独条款;到 Qwen3 才统一成全系 Apache 2.0。选型时看的应该是你要用的那个具体版本的许可证,不是这家公司的整体印象。 下次评估一个模型时,按顺序走一遍: 下一节看另一个角度:这些厂商为什么要开源。开源要花钱,权重放出去了就收不回来,没有一家是做慈善。 ## 开源是一门生意:各家在图什么(开源到底开的是什么) URL: https://xueai.miyang.cn/slides/oss-3.html (以下为免费预览,全文见页面) 开源是一门生意:各家在图什么 训练一个旗舰模型要烧掉巨额算力,权重一旦放出去就收不回来。既然如此,为什么还有这么多公司选择开源?答案跟慈善无关。看懂各家的算盘,你的选型判断会稳很多。 六家厂商的开源策略与变现路径;衍生模型数量为什么比下载量更能说明问题 这条规律套在你自己身上是什么结论?选一个最接近你所在公司的赚钱方式看看。 下载量容易刷,榜单排名换个测法就变。行业里更看重的是衍生模型数量,也就是有多少开发者真的拿它的权重再训练出了新模型并发布出来。这个数字造不了假,因为每一个衍生模型背后都是一次真实的算力投入。 ## 涌现:能力为什么会突然出现(大模型如何变小) URL: https://xueai.miyang.cn/slides/oss-4.html (以下为免费预览,全文见页面) 涌现:能力为什么会突然出现 模型越大越强,这句话听起来很自然。真实情况要复杂一点。有些能力在模型小的时候接近零分,参数量跨过某个量级之后,短时间内就有了。这个现象叫涌现,它也是后面几节所有矛盾的起点。 跨过某个规模阈值后能力阶跃式跳升;以及这个现象在学术上尚存的争议 把参数量放在横轴,某项任务的成绩放在纵轴,会看到两种走势。一种随规模稳步抬升,每加一倍参数就多拿一点分。另一种在很长一段区间里贴着地面,然后在某个位置突然抬头。 麻烦的地方在左半段。跳升发生之前,这条曲线和「这条路走不通」看起来一模一样。手里只有前半段数据的时候,没有办法外推出后面会不会抬头,也没有办法预测抬头的位置。目前也没有一套理论能提前算出某项能力会在哪个规模出现。 这件事读起来平淡,拖一遍才有感觉。下面把模型规模交给你,从 0.5B 一路往上推,看六项能力是怎么一项一项亮起来的。 下面这些能力都在公开研究和行业讨论里被当作涌现的例子。括号里的规模只是量级参考。同一项能力换个架构、换批训练数据、换种评测方式,位置就会明显偏移。 ## 为什么要把模型做小(大模型如何变小) URL: https://xueai.miyang.cn/slides/oss-5.html (以下为免费预览,全文见页面) 为什么要把模型做小:蒸馏的动机 上一节刚讲完,模型越大,能力越容易涌现。那为什么整个行业还在拼命把模型做小?因为能力不是唯一的约束条件。成本、延迟、数据能不能出门,这三件事会在真实项目里直接把旗舰模型挡在门外。 成本、速度、私有化三个现实动机,和小模型做不到的那些事 成本差的是数量级,不是几成 参数量小一个量级,一次推理要动用的算力通常也小一个量级。行业里的常见口径是,小模型的推理成本可以比旗舰模型低一到两个数量级。具体差多少,取决于尺寸、量化档位、批量大小和部署方式。别记死数字,记住这是量级上的差距,不是打个折。 速度本地跑省掉整段网络往返 调用远端旗舰模型,要走一次网络往返,还要排队,然后逐字生成。等上几秒是常态。本地跑的小模型省掉了网络这一段,首字出来得快得多。对话类产品对这一段特别敏感,用户等三秒和等零点三秒,是两种体验。 私有化与合规有些数据根本不允许出内网 病历、卷宗、内部代码、未公开的财务数据,这类内容的合规要求是不出内网。这时候对面的模型能力再强也用不上,因为第一步就过不去。本地部署的小模型是唯一一条路。第一节讲权重时说的那个控制权,在这里变成了硬约束。 「差一到两个数量级」这句话,换算成月底那张账单是多少?把你产品的请求量拖进去看看。 「小」是个相对的说法,但判断标准很具体:能不能塞进手上这块显卡。本章后面有一页交互工具专门算这件事,这里先把公式给出来。 按这个口径算几个尺寸。最后一列是 INT4 量化之后,在一块 24 GB 的消费级显卡上能不能跑。 ## 蒸馏是怎么做的:从老师到学生(大模型如何变小) URL: https://xueai.miyang.cn/slides/oss-6.html (以下为免费预览,全文见页面) 蒸馏是怎么做的:从老师到学生 上一节讲了为什么要把模型做小。这一节看具体怎么做。整个过程比想象中朴素:让老师去答题,把答题过程记下来,拿这批材料去训练学生。难点不在流程,在细节。 五步流程、软标签与温度系数;用 DeepSeek-R1 同批开源的六个蒸馏模型做样本 准备问题集 收集覆盖目标领域的问题。问题可以人工整理,也可以让模型自己生成。这一步决定了学生模型能力的上限:没被问到的领域,学生就学不到。 教师模型作答,保留完整推理过程 关键在「完整」两个字。只保留最终答案,学生学到的是背结论;保留中间的推理链条,学生才有机会学到怎么想。这也是推理类模型特别适合当老师的原因,它们本来就会把思考过程写出来。 取出概率分布,而不只是最终答案 模型每输出一个词,内部其实是一整张候选词的概率表。只取排第一的那个会丢掉大量信息,把整张表留下来,传递的信息量完全不同。下一段展开讲。 用这批材料训练学生模型 训练数据由三部分组成:原始问题、教师的完整回答、以及每一步的概率分布。学生模型的目标是让自己的输出分布尽量贴近老师的。 评估并迭代 在测试集上看学生跟老师差多远,再回头调整问题集的覆盖面和训练配置。通常要来回好几轮。 假设有一道图片分类题,正确答案是猫。传统训练的做法是告诉模型:猫对,其他全错。蒸馏的做法是把老师的判断原样交给学生。 实际操作时还有一个小技巧。老师如果太自信,概率分布会非常尖锐,比如 98% / 1% / 1%,这跟硬标签就没多大区别了,软标签的优势体现不出来。 ## 蒸馏的代价:模型正在变得越来越像(大模型如何变小) URL: https://xueai.miyang.cn/slides/oss-7.html (以下为免费预览,全文见页面) 蒸馏的代价:模型正在变得越来越像 上一节说蒸馏是让学生学老师。问题在于,学生学到的是老师的全部:本事、口癖、偏见、甚至对自己身份的认知。当整个行业都在向少数几个老师学习,结果就是大家越来越像。 口癖、格式怪癖与身份混淆的整批继承;为什么多模型交叉验证可能是假的 蒸馏别人家的模型是否越界,目前没有共识,但已经有公开的指控。 Anthropic 曾公开表示,发现有厂商对 Claude 进行「工业级规模」的蒸馏。OpenAI 也曾指控 DeepSeek 通过蒸馏 GPT 系列获取能力。这些都是一方的指控,被指控方并未承认,也没有第三方机构给出裁定。放在这里是为了说明一件事:这个领域的边界还在形成中,各家的服务条款大多禁止用自家输出去训练竞品,但技术上很难取证。 口癖被整批继承 某些句式在一个头部模型上高频出现,之后就在大量模型里同时冒出来,成了识别 AI 写作的指纹。 ## 你的电脑能跑多大的模型(在自己的机器上跑起来) URL: https://xueai.miyang.cn/slides/oss-8.html (以下为免费预览,全文见页面) 你的电脑能跑多大的模型 前面讲的都是概念,这一节动手。选一下你的显卡或者 Mac 型号,直接看结论。看完你会发现,本地跑模型的门槛比大多数人想的低。 选显卡或 Mac 型号实时出结论;显存换算公式、量化档位与 MoE 的显存速度错位 最后一行的 Qwen3.8-Max 无论你怎么选都是红的,这不是列表出错。它就是本章第三节提到的那个宣布要开权重、但还没放出来的模型,2.4 万亿参数按上面的公式算下来要 1560 GB,把设备换成列表里最贵的那台也不够。把它留在列表里,是因为「权重开放」和「你跑得动」是两件事,看到这个数字比读一句「模型很大」有用。 上面的结论不是查表查出来的,就一个乘法: 需要解释的是这个系数。单纯装载权重的话,INT4 每个参数占 0.5 字节,8B 模型只要 4 GB。但模型跑起来还要额外一块地方,用来存放对话过程中积累的中间状态,也就是Harness 核心篇讲过的 KV Cache。系数里已经含了这部分开销,所以不要在外面再乘一次余量,否则会算出没有机器跑得动的结论。 量化就是用更少的位数去存每个参数。位数越少体积越小,代价是精度损失。 你可以在上面的计算器里把精度从 FP16 切到 INT4,看能跑的型号变化。量化是把本地部署门槛拉低最有效的一招,一张 8 GB 的显卡跑不动 FP16 的 8B 模型,换成 INT4 就轻松了。 「位数少了会有损失」这句话谁都会说,但损失究竟发生在哪一步?量化做的事情其实只有一件:把原本连续的权重,四舍五入到有限个档位上。位数决定了有多少个档位可用——4 位就是 16 档,8 位是 256 档。档位越少,每个权重被挪动的距离越远。 ## Ollama 与 LM Studio 怎么上手(在自己的机器上跑起来) URL: https://xueai.miyang.cn/slides/oss-9.html (以下为免费预览,全文见页面) Ollama 与 LM Studio 怎么上手 上一节算出了你能跑什么,这一节把它装起来。两个工具,一个命令行一个图形界面,第一次用十分钟能跑通。 从安装到跑通的完整命令、模型标签的读法、量化档位怎么选,以及三个最常见的坑 Ollama 一条命令下载并运行,没有多余步骤 装好后自动在后台提供服务,可以直接被程序调用 接口兼容 OpenAI 的格式,原来调 API 的代码改个地址就能用 没有图形界面,换模型、调参数都要敲命令 LM Studio 内置模型浏览器,能看到体积和量化档位再决定下不下 会提示当前机器能不能带得动,对新手很友好 也能开本地服务器,同样兼容 OpenAI 格式 在 Apple 芯片上支持 MLX 引擎,比通用格式更快 装好 Ollama 之后,只需要一条命令。以上一节算出你能跑 8B 为例: ollama run qwen3:8b 就这一句。本地没有就先下载,下完自动进入对话。想只下载不运行,把 run 换成 pull。其余常用命令: # 看已经下载了哪些模型,以及各占多少空间 ollama list # 删掉不用的,本地模型很占硬盘 ollama rm qwen3:8b # 看当前正在占用显存的模型 ollama ps 装好后 Ollama 会在本机 11434 端口提供服务,接口格式跟 OpenAI 一致。也就是说你手上现成的 OpenAI 调用代码,把 base_url 指过来就能跑,模型名填标签名即可。 from openai import OpenAI # 本地服务不校验密钥,api_key 随便填一个非空值 client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama") resp = client.chat.completions.create( model="qwen3:8b", messages=[{"role": "user", "content": "用一句话解释什么是量化"}], ) print(resp.choices[0].message.content) 上面那条命令里的 8b 是举例。你自己该敲哪个数字,取决于你的机器。选一下,下面直接给出你能复制走的那条。 ## 自测中心 · 七套篇章自测(怎么用这七套卷) URL: https://xueai.miyang.cn/slides/exam.html 七套篇章自测 · 350 道题 六个正课篇章各一套卷子,Grok Build 专题另有一套,每套 50 道题,全部依据对应内容编写。学完一章就来考一次,比反复重读有用得多。全部考完了,最后还有一份跨全站的综合考。 模拟考试与顺序刷题的差别、七套卷子的考点分布、成绩与薄弱点是怎么记录的 模拟考试 从 50 题里随机抽 25 题,同一考点不重复出题,选项顺序每次打乱。答题过程不提示对错,交卷后 100 分制判分并逐题回顾。刷两遍也不会遇到同一份卷子。 顺序刷题 50 题全量过一遍,每题答完立即判定并展开解析。进度存在本机,随时中断随时接着做。第一次学完建议先刷一遍,再去考。 大模型基础50 题 训练三阶段、Token 与分词、参数冻结、Temperature 采样、幻觉四种类型、RAG 与四种缓解策略 AI Harness50 题 上下文窗口与溢出、Prompt 工程、注入攻防、工具调用与 MCP、KV Cache 与成本优化 实战 · 从 Demo 到产品50 题 生图产品化、Agent 卡死与防呆、上下文压缩、长期记忆、多 Agent 协作、MCP 生态 AI 工程设计模式50 题 Workflow vs Agent、上下文三板斧、ACI 工具设计、评测方法论与三种 Grader、沙箱隔离 Harness 与自我改进50 题 Harness 三大设计模式、上下文工程自动进化、工作流搜索、递归自我改进与七道关 Vibe Coding 方法论50 题 流程控制与人工断点、质量底线、拒绝分期交付、文档沉淀、破坏性操作的三道闸 Grok Build 专题50 题硬核 运行时循环与三 Actor、Compaction、工具审批、双路记忆检索、五种沙箱、MCP 集成 全站综合考抽 35 题 从 350 题里每章均摊抽 5 题。篇章卷考的是单章记没记住,这份卷子考的是跨章节会不会串:压缩与记忆的边界、Workflow 与 Agent 的选型、Harness 和提示词工程的关系 交卷后的对错会按考点记录下来,答错较多的考点会出现在米羊个人中心的薄弱点里,并直接给出回去补课的链接。所以别怕考砸,考砸才知道该补哪一节。 题目全部依据课程正文编写,每题附答案解析。发现题目有问题可以在答题页点「这道题有问题」直接反馈。 ## 大模型基础 · 篇章自测(基础与 Harness) URL: https://xueai.miyang.cn/slides/exam-1.html 大模型基础 · 篇章自测 学完大模型原理篇来验证一下。50 题全部出自本章课程:训练三阶段、Token 与上下文、幻觉的四种类型、四种缓解策略的选择。 50 题:训练三阶段 / Token 与分词 / 参数冻结 / Temperature / 幻觉四型 / RAG 与四种缓解策略 模拟考试 随机抽 25 题(单选 15 · 多选 5 · 判断 5),同一考点不重复出题。答题过程不提示对错,交卷后统一判分 + 错题回顾。 顺序刷题 50 题全量过一遍,每题答完立即判定并给出正确答案。进度自动保存在本机,随时中断随时继续。 训练与生成 Base→SFT→RLHF 三阶段、Token 机制、参数冻结、Temperature 采样 幻觉机制 四种幻觉类型的区分、概率续写的根因、幻觉与创意的关系 缓解策略 RAG、微调、提示词、温度四种手段的原理、边界与选型 题库依据本篇章课程内容编写,共 50 题;模拟考试每次随机抽 25 题,选项顺序每次打乱,刷两遍也不会碰到同一份卷子。 ## AI Harness · 篇章自测(基础与 Harness) URL: https://xueai.miyang.cn/slides/exam-2.html (以下为免费预览,全文见页面) AI Harness · 篇章自测 学完Harness 核心篇来验证一下。50 题全部出自本章课程:上下文窗口、Prompt 工程、注入防御、工具调用、KV Cache 与成本优化。 50 题:上下文溢出 / Prompt 工程 / 注入攻防 / 工具调用与 MCP / KV Cache 与成本优化 模拟考试 随机抽 25 题(单选 15 · 多选 5 · 判断 5),同一考点不重复出题。答题过程不提示对错,交卷后统一判分 + 错题回顾。 顺序刷题 50 题全量过一遍,每题答完立即判定并给出正确答案。进度自动保存在本机,随时中断随时继续。 ## 实战 · 从 Demo 到产品 · 篇章自测(实战与工程设计) URL: https://xueai.miyang.cn/slides/exam-3.html (以下为免费预览,全文见页面) 实战 · 从 Demo 到产品 · 篇章自测 学完动手实战篇来验证一下。50 题全部出自本章课程:生图产品化、Agent 卡死与防呆、上下文压缩、长期记忆、多 Agent 与 MCP。 50 题:生图产品化 / Agent 卡死与防呆 / 上下文压缩 / 长期记忆 / 多 Agent / MCP 生态 模拟考试 随机抽 25 题(单选 15 · 多选 5 · 判断 5),同一考点不重复出题。答题过程不提示对错,交卷后统一判分 + 错题回顾。 顺序刷题 50 题全量过一遍,每题答完立即判定并给出正确答案。进度自动保存在本机,随时中断随时继续。 ## AI 工程设计模式 · 篇章自测(实战与工程设计) URL: https://xueai.miyang.cn/slides/exam-4.html (以下为免费预览,全文见页面) AI 工程设计模式 · 篇章自测 学完工程进阶篇来验证一下。50 题全部出自本章课程:Workflow vs Agent、上下文工程、ACI 工具设计、评测方法论、沙箱与凭证隔离。 50 题:Workflow vs Agent / 上下文三板斧 / ACI 工具设计 / 评测与 Grader / 沙箱隔离 模拟考试 随机抽 25 题(单选 15 · 多选 5 · 判断 5),同一考点不重复出题。答题过程不提示对错,交卷后统一判分 + 错题回顾。 顺序刷题 50 题全量过一遍,每题答完立即判定并给出正确答案。进度自动保存在本机,随时中断随时继续。 ## Harness 与自我改进 · 篇章自测(前沿、方法论与源码专题) URL: https://xueai.miyang.cn/slides/exam-5.html (以下为免费预览,全文见页面) Harness 与自我改进 · 篇章自测 学完自我改进篇来验证一下。50 题全部出自本章课程:Harness 设计模式、上下文自动进化、递归自我改进的机制与七道关。 50 题:Harness 三大模式 / 上下文自动进化 / 工作流搜索 / 递归自我改进与七道关 模拟考试 随机抽 25 题(单选 15 · 多选 5 · 判断 5),同一考点不重复出题。答题过程不提示对错,交卷后统一判分 + 错题回顾。 顺序刷题 50 题全量过一遍,每题答完立即判定并给出正确答案。进度自动保存在本机,随时中断随时继续。 ## Vibe Coding 方法论 · 篇章自测(前沿、方法论与源码专题) URL: https://xueai.miyang.cn/slides/exam-7.html (以下为免费预览,全文见页面) Vibe Coding 方法论 · 篇章自测 学完第七篇章来验证一下。50 题全部出自本章课程:流程控制、质量底线、拒绝分期、文档沉淀、环境与安全闸门。 50 题:流程控制与人工断点 / 质量底线 / 拒绝分期 / 文档沉淀 / 破坏性操作三道闸 模拟考试 随机抽 25 题(单选 15 · 多选 5 · 判断 5),同一考点不重复出题。答题过程不提示对错,交卷后统一判分 + 错题回顾。 顺序刷题 50 题全量过一遍,每题答完立即判定并给出正确答案。进度自动保存在本机,随时中断随时继续。 ## Grok Build 专题 · 篇章自测(前沿、方法论与源码专题) URL: https://xueai.miyang.cn/slides/exam-6.html (以下为免费预览,全文见页面) 解剖 Grok Build · 篇章自测 学完协作方法论篇来验证一下。50 题全部出自本章课程:运行时循环、Compaction、工具系统、记忆检索、沙箱安全与 MCP 集成。 50 题:运行时循环 / Compaction / 工具审批 / 双路记忆检索 / 五种沙箱 / MCP 集成 模拟考试 随机抽 25 题(单选 15 · 多选 5 · 判断 5),同一考点不重复出题。答题过程不提示对错,交卷后统一判分 + 错题回顾。 顺序刷题 50 题全量过一遍,每题答完立即判定并给出正确答案。进度自动保存在本机,随时中断随时继续。 ## 全站综合考 · 七卷抽 35 题(学完整门课再来) URL: https://xueai.miyang.cn/slides/exam-all.html (以下为免费预览,全文见页面) 全站综合考 · 七章抽 35 题 篇章卷检验单章掌握,这份卷子检验的是另一件事:跨章节的概念会不会混。上下文压缩和长期记忆的边界在哪、Workflow 和 Agent 该怎么选、Harness 和提示词工程是什么关系,这些只有把七章放在一起考才暴露得出来。学完整门课再来。 从 350 题里每卷均摊抽 5 题,专考跨章节容易串的概念:压缩与记忆的边界 / Workflow 与 Agent 选型 / Harness 与提示词工程的关系 ## 六种武器:给每样资产配对的锁(确权的地基) URL: https://xueai.miyang.cn/slides/opc-1.html 六种武器:给每样资产配对的锁 你写的代码、起的名字、想出来的算法、发出去的文章,在法律上是完全不同的东西,各有各的锁。拿错锁等于没锁。这一节把六种武器一次认全,后面每一节都会回来用它。 商标锁名字、软著锁代码、专利锁技术方案、商业秘密锁诀窍、著作权锁内容、域名锁入口 ™商标 保护品牌的名字和标志,是品牌唯一合法的「户籍」。按商品和服务类别注册,一类一注册。 ⚙专利 保护技术方案。逻辑是公开换保护:把方案公开给全社会,换一段法定的独占期。 软件著作权 版权在软件领域的登记形式。权利自开发完成就产生,登记拿到的证书是维权时的初步证明。门槛低,OPC 必做。 ✎著作权 / 版权 保护原创的文字、图片、代码、音视频。创作完成自动产生,无需注册。但主动备案等于给维权升级。 🔒商业秘密 保护不公开的技术诀窍:核心配方、工艺、算法。逻辑和专利相反,靠严守秘密换保护。 @域名 品牌的核心数字资产,先到先得,按年续费。它不算传统知识产权,但在商业实践里的分量一点不轻。 发明专利权的期限为二十年,实用新型专利权的期限为十年,外观设计专利权的期限为十五年,均自申请日起计算。 本法所称的商业秘密,是指不为公众所知悉、具有商业价值并经权利人采取相应保密措施的技术信息、经营信息等商业信息。 注意商业秘密的三个要件:不为公众所知悉、有商业价值、你采取了保密措施。第三条最容易翻车。没签保密协议、代码仓库全员可见、配方贴在墙上,法律上这就不叫商业秘密,出了事没得赔。 六样创业路上最常见的资产。挨个点一遍,看每样东西该配哪把锁。有几个答案和直觉不一样。 因为这六把锁互相不能替代。注册了商标,护不住你的代码被整段抄走。登记了软著,护不住别人用完全不同的代码实现同一个技术方案,那是专利管的事。申请了专利,方案就公开了,想靠秘密取胜的部分反而暴露了。 所以正确的动作是盘点:把你手上的资产列出来,一样一样问归谁管。这门课接下来的每一节,就是把每把锁的用法拆开讲:商标怎么拿、被挡了怎么办、域名怎么谈、软著怎么登、专利和商业秘密怎么选。 商标先行:核心类别先注册上,费用是几百块一类的量级,起名阶段就该做。 软著跟上:产品有代码就登记,费用低、流程简单,是维权和融资时最常被要的证书。 著作权备案常态化:核心文章、设计图、视频,养成发布前备案的习惯。 域名把主后缀拿全:一年几百块,买的是以后不被勒索。 专利视技术含量决定:有真方案再上,没有就不用硬凑。 商业秘密的保护是六把锁里唯一不花注册费、但要花管理功夫的。 和外包、合作方签约时带保密条款,这是「采取保密措施」的最低配置。 核心代码仓库设权限,别用公开仓库放核心逻辑。 提示词、数据配比、调度策略这类 AI 时代的新诀窍,同样适用商业秘密的三要件。 六把锁互相不能替代。商标锁名字,专利锁方案,软著和著作权锁表达,商业秘密锁诀窍,域名锁入口。 著作权自动产生,其他都要主动做。自动产生不等于好维权,备案和登记买的是证据。 商业秘密要你先采取保密措施。没签保密协议的诀窍,法律上不是秘密。 先盘点,再配锁。把资产列出来一样一样问归谁管,这是整门课的方法。 法条来源:《中华人民共和国专利法》(2020 年修正,2021 年 6 月 1 日施行)第四十二条,全文见国家知识产权局官网;《中华人民共和国反不正当竞争法》(2025 年 6 月 27 日修订,2025 年 10 月 15 日施行)第十条;《计算机软件保护条例》(2013 年修订)第十四条:软件著作权自软件开发完成之日起产生,法人作品保护期 50 年。本节核验日期 2026-08-10。 ## 确权要趁早:做早了是投入,做晚了是损失(确权的地基) URL: https://xueai.miyang.cn/slides/opc-2.html 确权要趁早:做早了是投入,做晚了是损失 上一节认全了六种武器,这一节讲什么时候动手。答案很短:越早越好。因为确权这件事有个残酷的特点,同一个动作,早做是几百块的投入,晚做是几万块加一两年时间的损失。 两条时间线对照:同一件事早做几百块、晚做几十万,还有些损失根本补不回来 所以确权动作要放在资产产生之前或者同时,而不是等产品做起来了、有人来抢了再说。这些动作不只是合规操作,它们是你商业护城河的地基。 同一个产品,两种做法。左边在每个节点前先确权,右边先跑业务、出事再补。点「下一步」把六个节点走完,注意右边的代价是怎么滚起来的。 对做产品的人来说,最常见也最常被忽视的是这三样。 品牌名字:商标 + 域名。写第一行代码之前,先去中国商标网把候选名字查一遍,近似的、颠倒的、加字的一起查。查询免费,半小时的事。 代码:软著登记 + 仓库权限管理。产品有可运行的版本就可以登记。别等产品火了才登,登记日期本身就是证据的一部分。 原创内容:著作权备案常态化。核心文章、设计图、视频,发布前备案或做可信时间戳。被抄之后再补,证据链就断了。 名字被占:一年起步 上一门课的第 4 节讲过我们自己的经历:名字被在先商标挡住,走撤三加复审拿回来,前后跨了两年。这还是运气好,对方确实没在用。对方在用的话,只能改名或者掏钱买。 方案先公开:永远拿不回 专利最狠。产品发布、参展、发演示视频,都会消耗技术方案的新颖性。先公开再申请,专利大概率被驳回,而且没有任何补救手段。这是六种武器里唯一不可逆的损失。 被抄没证据:赢不了 著作权虽然自动产生,但打官司要证明创作时间和归属。没有备案、没有时间戳,对方反咬一口说你抄他,扯皮能拖到你放弃。 对照:早做的价格 商标几百块一类,软著登记费用低,著作权备案成本更低,域名一年几十到几百块。全套做完,通常不到一次维权律师费的零头。 起名日 = 商标查询日 + 域名注册日。三件事同一天做完。 版本发布日 = 软著材料归档日。每个大版本留一份可提交的代码和文档。 内容发布日 = 备案日。把备案做进发布 SOP,而非想起来才做。 确权要早,但不等于什么都注册。一人公司的钱要花在刀刃上。 还在验证期的点子,先查询、先占域名,商标可以等方向确认再交。 没有真技术方案,不要为了「显得有实力」硬凑专利。 判断标准就一条:这个资产丢了你疼不疼。疼的立刻锁,不疼的先放着。 权利给先动手的人。商标在先注册优先,专利先申请优先,域名先到先得。 确权放在资产产生之前或同时。起名当天查商标占域名,发版当天归档软著材料,发布当天备案。 专利的新颖性损失不可逆。先公开再申请等于亲手把方案送进公有领域。 早做的价格是晚做的零头。全套确权的费用,通常不到一次维权成本的十分之一。 依据说明:商标在先申请规则见《商标法》(2019 年修正)第三十条、第三十一条;专利先申请与新颖性规则见《专利法》(2020 年修正)第九条、第二十二条;著作权自动产生见《著作权法》(2020 年修正)与《计算机软件保护条例》(2013 年修订)第十四条。本节核验日期 2026-08-10。撤三案例细节见本课第 4 节。 ## 商标一个不够:35、42、41 一起拿(商标与域名) URL: https://xueai.miyang.cn/slides/opc-3.html (以下为免费预览,全文见页面) 商标一个不够:35、42、41 一起拿 商标按商品和服务分成 45 个类别,注册哪一类就只在那一类受保护。很多人注册了一个类就觉得万事大吉,结果推广的时候发现推广本身属于另一个类。这一节讲清做互联网产品最要紧的几个类,以及图样一致性这个隐形的坑。 35 类是商业变现的许可证,42 类管软件平台,41 类管课程内容;附类别清单生成器 广告 · 商业管理 覆盖广告、替他人推销、商业管理这些事。无论你做什么业务,只要涉及推广和商业变现,这一类就绕不开。它是后续所有营销动作的入场券,必拿。 软件服务 · 互联网技术 软件设计开发、SaaS、平台技术服务归这里。做软件、做平台、做在线工具,必须申请。你的产品以服务形式在线交付,主战场就是它。 教育 · 培训 · 娱乐 做课程、做内容、办会展、做社群活动归这里。知识付费和内容变现的地盘。做产品的人常顺手做课,这一类要同步申请。 还有一个容易漏的:第 9 类。可下载的软件和 App 在分类里算「商品」,归第 9 类管。也就是说,一个 App 产品的完整覆盖通常是 9 + 42 + 35,有课程业务再加 41。现行商标法允许一份申请勾选多个类别,一次交齐就行。 回头看第 4 节讲过的那个撤三案例,挡路的在先商标就注册在第 35 类。为什么大家都挤在 35 类,因为谁都绕不开它。这也解释了为什么 35 类是囤商标的人最爱下手的地方。 ## 被驳回之后:把挡路的商标拿掉(商标与域名) URL: https://xueai.miyang.cn/slides/opc-4.html (以下为免费预览,全文见页面) 被驳回之后:把挡路的商标拿掉 「米羊数智」第一次提交就被驳回了。挡路的是一个 2015 年就注册、却早已没在使用的在先商标。这一节把从驳回、撤三到复审的完整链路拆开讲清楚,这条路是我们自己走完的一遍。 真实案例复盘:驳回、撤三、复审三步怎么走,举证责任在谁身上,十五日复审期限 2023 年 4 月,同一天到了两份《商标驳回通知书》,理由都是与在先注册商标近似。驳回通知书的格式很固定:告诉你被谁挡了(引证商标的注册号和名称)、依据哪一条法条、以及你还剩多少天可以反应。 第一份 · 同名加了个后缀 一个 2015 年就注册在第 35 类的在先商标,「米羊」后面多一个字,和「米羊数智」在类似服务项上构成近似。它注册得早,这一关就是躲不开。 第二份 · 二字颠倒过来 挡路的是一个把「米羊」倒过来写的在先商标,连字序颠倒都算近似。这是很多人起名时想不到的:你以为换个顺序就避开了,审查员不这么看。 申请注册的商标,凡不符合本法有关规定或者同他人在同一种商品或者类似商品上已经注册的或者初步审定的商标相同或者近似的,由商标局驳回申请,不予公告。 同一份通知书的末尾还写着一句关键的话:不服的,可以自收到通知之日起十五日内申请复审(依当时的第三十四条)。十五日是硬期限,过了就只能重新申请。所以收到驳回通知,第一件事是看日期。文案后面再想。 驳回通知书只给你一个注册号。拿着它去中国商标网把引证商标的档案调出来,四个字段决定你后面怎么走。 决定它满没满三年,这是撤三的门槛。挡我们的那个 2015 年就申请了,到 2023 年早就跨过了这条线。 决定它挡不挡得到你。近似看的是类似群编码,行业直觉靠不住:同名不同类未必冲突,同类不同名也可能近似。 注册商标十年一续展。快到期又没在用的商标,往往到期就不续了。有时候等,比打便宜。 这一栏铺得越宽,越说明它是囤的,不是用的。挡我们的那个,从「替他人推销」一路写到「药品零售」,典型的注而不用。 这条链路一共七步,跨了两年。点「下一步」走一遍,注意第五步球在谁那边。 ## 域名全拿下:十万的报价怎么谈到五千(商标与域名) URL: https://xueai.miyang.cn/slides/opc-5.html (以下为免费预览,全文见页面) 域名全拿下:十万的报价怎么谈到五千 miyang.cn 这个域名,曾经在交易平台上被挂到 102,222 元一口价。最后我们用五千块拿下。中间没有什么谈判魔法,只有一件提前三年做完的事:把这个品牌能用的后缀,几乎全注册在了自己手里。 真实议价过程复盘:手上握着多少后缀,谈判桌上就有多少筹码 点「下一步」复盘这场谈判。留意第四步,那是价格从十万掉到五千的瞬间。 品牌域名的正确姿势是全部拿下(Get Them All)。每个后缀有自己的角色。 主流全球,不可替代。海外用户的默认心智。 中国核心,稳固根基。国内备案和信任感的基本盘。 备用选择,业务拓展。占住它,别人就少一个截胡口。 AI 领域的趋势后缀。做 AI 产品的话分量不输 .com。 在这四个主力之外,.tech、.fun、.games 这类行业后缀和中文域名(比如「品牌名.com」的中文形态),一年也就几十到几百块一个。它们平时是防御,谈判时是筹码。这场谈判里真正起作用的,恰恰是这些不起眼的后缀:对方发现除了他手里那一个,能堵你的口全被你自己占了。 为什么中介敢挂十万 赌的是你没得选。品牌做起来了、后缀在别人手里、公司等着用,三个条件凑齐,报价就是对方说了算。中介的推荐话术都是配好的:「符合贵公司品牌文化」「好域名让您的项目事半功倍」。 为什么我们只出五千 因为这个域名对我们是锦上添花,不是雪中送炭。核心业务跑在自己注册的后缀上,对方这个属于「有更好,没有也行」。谈判里谁更不着急,谁就赢。这份不着急,三年前注册那排域名的时候就买好了。 ## 软著与备案:版权自动产生,证据要自己挣(代码、内容与技术) URL: https://xueai.miyang.cn/slides/opc-6.html (以下为免费预览,全文见页面) 软著与备案:版权自动产生,证据要自己挣 著作权在创作完成那一刻就自动产生了,不用注册。听起来很省心,直到你被抄袭、要打官司的那天才发现:权利是自动的,证据不是。这一节讲软著登记和著作权备案这两件「花小钱买证据」的事,顺带拆一个外包开发的大坑。 软著登记、著作权备案、可信时间戳的分工;外包开发的著作权归属陷阱 软件著作权自软件开发完成之日起产生。 软件著作权人可以向国务院著作权行政管理部门认定的软件登记机构办理登记。软件登记机构发放的登记证明文件是登记事项的初步证明。 注意「初步证明」四个字。软著证书不是权利的来源,是法庭上先手的证据:拿着证书,举证责任就压到了对方那边,他得证明这东西不是你的。没有证书,先自证的人是你。 软著登记在中国版权保护中心办理,线上全流程。门槛低到什么程度:几十行代码的小工具也够格申请,材料主要是源代码节选和说明文档。费用低、流程简单,是六种武器里性价比最高的一把。 我们自己的做法:XSCT 项目把核心评分算法和用例体系做了登记,登记的意义不在于防止别人做测评平台,在于当有人整套搬走我们的算法描述和用例结构时,独创性的证据已经躺在登记机构的档案里了。 ## 专利还是商业秘密:先申请,后公开(代码、内容与技术) URL: https://xueai.miyang.cn/slides/opc-7.html (以下为免费预览,全文见页面) 专利还是商业秘密:先申请,后公开 手里有真技术的人要做一道选择题:申请专利,还是当商业秘密捂着。两条路的逻辑完全相反,选错了代价很大。更要命的是顺序问题:产品发布在专利申请之前,这个专利就永远申请不成了。 公开换独占还是保密换无限期;新颖性一旦丢失不可逆,顺序错了没有补救 专利:公开换保护 把技术方案完整公开给全社会,换一段法定独占期:发明 20 年、实用新型 10 年、外观设计 15 年,都从申请日起算。期限内谁用都得经你同意,期满方案进入公有领域。 商业秘密:保密换保护 什么都不公开,靠严格的保密措施护住核心诀窍。守得住就一直有效,可口可乐的配方捂了一百多年就是极端样本。代价是一旦泄露或被独立做出来,保护就没了。 授予专利权的发明和实用新型,应当具备新颖性、创造性和实用性。新颖性,是指该发明或者实用新型不属于现有技术…… 「不属于现有技术」这七个字,是整节课最贵的知识点。你自己发布的产品、做的宣传、发的演示视频,全都会变成「现有技术」。等你回头申请专利,审查员拿你自己的发布会打你的新颖性,一打一个准。 正确顺序:1 专利申请 → 2 产品上线 上线前申请,新颖性保留。申请日一落定,后面发布、参展、做宣传都随便,你自己的公开打不到自己的申请日之前。 错误顺序:1 产品上线 → 2 专利申请 上线即公开,新颖性丧失。之后再申请,方案已经是「现有技术」了。驳回,且无解。六种武器里唯一完全不可逆的失误。 专利法第二十四条留了一个六个月的宽限期,但只覆盖四种法定情形:国家紧急状态下为公共利益首次公开、在规定的学术会议或技术会议上首次发表、在政府主办或承认的国际展览会上首次展出、他人未经你同意泄露。你自己的产品发布会、公众号推文、融资 BP 流出,一个都不在里面。别赌宽限期。 ## ICP 备案是地基,ICP 证是收费执照(主体与上线合规) URL: https://xueai.miyang.cn/slides/opc-8.html (以下为免费预览,全文见页面) ICP 备案是地基,ICP 证是收费执照 很多人把「ICP 备案」和「ICP 证」当成一回事,其实是两件事,差着一百万注册资本的距离。备案是网站能在国内被访问的前提,人人要办;ICP 证是合法向用户收费的执照,门槛高得多。这一节把两个都讲清,重点是注册公司那天就要做对的一个决定。 备案管能不能开门,ICP 证管能不能收钱:注册资本 100 万加第二类增值电信业务 国家对经营性互联网信息服务实行许可制度;对非经营性互联网信息服务实行备案制度。未取得许可或者未履行备案手续的,不得从事互联网信息服务。 备案的必备条件是域名加国内服务器。流程走完,你的域名才允许指向境内服务器对外提供服务。 主体证件、域名证书、服务器信息 接入商(云厂商)初审,约 3 到 20 个工作日 通信管理部门审核,约 3 到 20 个工作日 拿到备案号,国内用户正常访问 有备案:畅通无阻 备案号挂在页脚,域名解析正常,云厂商不拦你。它是合规运营的地基,后面办 ICP 证、上支付、进应用商店,处处都要用到。 无备案:随时被拦 没备案就把域名指向国内服务器,域名和服务器提供商随时可能强制拦截,用户看到的是 403、404。产品跑得再好,一次拦截就归零。 注意时序:备案是上线之前要完成的事。等被拦截了再补备案,中间那几十天的停摆自己扛。把它排进上线计划表,和开发并行走。 想向用户收费、做经营性的互联网信息服务,就要办 ICP 证。申请时两道门槛同时卡人。 门槛一 · 注册资本 省内经营的增值电信业务,注册资本最低限额 100 万元人民币;跨省经营是 1000 万。这是法定门槛,不是建议值,写 99 万都过不了形式审查。 门槛二 · 必须明确包含 营业执照的经营范围里要有「第二类增值电信业务」这一项。少了这一条,审核直接卡死,先去做工商变更再回来重新排队。 (经营增值电信业务,应当具备下列条件:)……在省、自治区、直辖市范围内经营的,注册资本最低限额为 100 万元人民币;在全国或者跨省、自治区、直辖市范围经营的,注册资本最低限额为 1000 万元人民币。 所以注册公司那天的一个小决定,会在一年后决定你的商业化速度:注册时就把经营范围写全,包含第二类增值电信业务。写了,将来申请 ICP 证直接递材料;漏了,先工商变更、再等流程,时间和钱都是白耗的。 ## 注册资本别乱写:五年内要真金白银缴足(主体与上线合规) URL: https://xueai.miyang.cn/slides/opc-9.html (以下为免费预览,全文见页面) 注册资本别乱写:五年内要真金白银缴足 认缴制时代流行把注册资本写得很威风,反正不用马上掏钱。这个玩法 2024 年 7 月起结束了:新公司法要求认缴的钱五年内缴足。这一节讲注册资本怎么定,顺带拆一人公司最容易炸的两个雷:公私账混同,和贪省事用灰产收款。 新公司法五年实缴;一人公司要能证明公司财产独立于自己的财产,证明不了就连带 有限责任公司的注册资本为在公司登记机关登记的全体股东认缴的出资额。全体股东认缴的出资额由股东按照公司章程的规定自公司成立之日起五年内缴足。 所以数字怎么定?答案在上一节已经出现过一半:业务模式决定金额。走纯服务、咨询、内容变现路线的,量力而行,写一个你真缴得起的数。走平台、SaaS、C 端收费路线的,ICP 证卡着 100 万的法定门槛,那就按 100 万规划,并把五年的实缴节奏排进现金流。 选你的业务路线和想写的数字,看看这个组合会发生什么。 ## 合伙人要互补:能力重叠的两个人别合伙(合伙与股权) URL: https://xueai.miyang.cn/slides/opc-10.html (以下为免费预览,全文见页面) 合伙人要互补:能力重叠的两个人别合伙 一个人跑到某个点,总会撞上自己补不上的短板,这时候才谈合伙人。挑人的第一标准是能力互补,志同道合排在后面。这一节讲两条原则,和一个能省掉很多痛苦的「试婚期」做法。 互补排在志同道合前面;做不到极致互信宁可不合伙;先用项目跑一段试婚期 志同道合当然要紧,它是能一起走下去的前提。只是把它放到第一位来筛人,很容易筛出一个和你能力高度重合的自己。 把公司要做的事摊开,看看两个人各占哪一半。 你:技术与专业 做出来、跑得稳、体验好,这些归你。技术出身的创始人通常在这一侧很强,也通常在另一侧很弱。 合伙人:管理与业务 找到客户、把钱收回来、把人组织起来,这些归他。这一侧的能力和你重叠得越少,合伙的价值越大。 能力重叠的合伙 两个技术合伙,产品做得越来越精致,没人去把它卖出去。而且重叠意味着对同一件事都有强意见,争执成本高,公司决策变慢。 能力互补的合伙 各管一侧,边界清楚,大多数事情不需要开会讨论。对方的领域你不插手,你的领域他不插手,速度是这样来的。 ## 三个人各 1/3 是最贵的公平(合伙与股权) URL: https://xueai.miyang.cn/slides/opc-11.html (以下为免费预览,全文见页面) 三个人各 1/3 是最贵的公平 三个人一起干,股权一人三分之一,谁也不吃亏,谈的时候大家都很舒服。这个结构的代价在半年后才出现:公司做不了决定。这一节用表决权门槛算一遍,再讲核心创始人为什么要拿到 70% 以上。 过半数与三分之二两条表决线;股权结构模拟器算给你看,核心创始人为什么要 70% 公司法把股东会决议分成两档,一档过半数,一档三分之二以上。记住这两个数字,股权结构好不好,自己就能算。 股东会作出决议,应当经代表过半数表决权的股东通过。股东会作出修改公司章程、增加或者减少注册资本的决议,以及公司合并、分立、解散或者变更公司形式的决议,应当经代表三分之二以上表决权的股东通过。 普通决议线 日常经营层面的股东会决议。过了这条线,公司能正常运转。 特别决议线 改章程、增减注册资本、合并、分立、解散、变更公司形式。融资几乎必然要动到这一档,增资就是改章程加增加注册资本。 先把话说准:三个人各三分之一,任意两人加起来正好到三分之二,法定票数是够的。真正的麻烦在「必须凑」这三个字,三个人里没有任何一个人能单独通过任何一项决议,连日常的过半数都过不了。 平均分配的真实运转方式 每一项决议都要至少两个人完全同意。三个人里任何一对闹掰,剩下的组合就凑不出稳定的多数。融资、改章程、增资,全部卡在「先去谈」这一步。 卡住之后会发生什么 公司还在,业务还在,可是不能融资、不能增资、不能引进新股东。停滞本身就是价值归零的过程,等到大家想散,散伙也需要三分之二的决议。 所以平均分配的公平是一次性的,只在分股权那一天成立。之后每一次需要拍板,都在为那天的公平付账。 ## 股权别靠感觉分:五个维度算一遍(合伙与股权) URL: https://xueai.miyang.cn/slides/opc-12.html (以下为免费预览,全文见页面) 股权别靠感觉分:五个维度算一遍 上一节讲了结构,这一节讲比例怎么来。凭感觉谈出来的数字,双方过后都会觉得自己吃亏。把贡献拆成五个维度,各给一个权重,算完再谈,讨论的对象就从「谁更重要」变成「这个维度算谁的」。 综合能力、出资额、机会成本、idea 来源、责任担当;最容易漏掉的两项占四成 这套权重是参考框架,不是标准答案。它的用处是让谈判有一张共同的表。 综合能力 谁能领军。核心技能、把事做成的能力、带人和管事的效率。权重最高的一项,因为它直接决定公司做不做得成。 出资额 真金白银承担风险,给项目提供初始资金。钱重要,但不是最重要的那一项,很多人把它当成唯一标准,这是股权谈崩的常见起点。 机会成本 为了这件事放弃了什么。放掉的高薪稳定工作、错过的窗口期。最容易被忽视的一项,也是判断一个人有多认真的硬指标。 创业 idea 来源 谁发起、谁定义方向、核心创意和战略规划出自谁。占一份,但不该占太多,把 idea 做成产品的门槛已经趋近于零。 责任担当 法律责任由谁背,关键决策由谁拍板、由谁签字、出事由谁承担后果。另一个最容易被忽视的项,也是企业家精神的核心。 机会成本和责任担当这两项,加起来占到四成,恰好是最少被拿到桌面上谈的两项。谈股权时只算钱和 idea,等于把最重的两块砍掉了。 ## 先签代持协议,成熟了再动工商登记(合伙与股权) URL: https://xueai.miyang.cn/slides/opc-13.html (以下为免费预览,全文见页面) 先签代持协议,成熟了再动工商登记 比例谈完了,接下来是怎么给。早期最容易犯的错是结构做得太重:持股平台、期权池、一堆主体,公司还没跑起来,架子先搭好了。这一节讲三条纪律,重点是那句最贵的经验,离职的人不签字,公司会被锁死。 离职不签字为什么能锁死公司;代持协议的效力与边界、分期成熟、退出与回购 过早搭复杂结构的代价 多一个有限合伙主体,就多一套工商年报、税务申报、变更手续。每一次调整都要多跑一遍流程。公司还在验证阶段,精力全花在架构维护上。 先把公司跑起来 结构简单的公司,改起来快。股东只有你的时候,任何调整都是一次签字的事。省下的时间放到产品和客户上。 给出去的股权,先用协议约定,别急着办工商变更。原因在下一段的推演里。先看代持这件事在法律上站不站得住。 有限责任公司的实际出资人与名义出资人订立合同,约定由实际出资人出资并享有投资权益,以名义出资人为名义股东,实际出资人与名义股东对该合同效力发生争议的,如无法律规定的无效情形,人民法院应当认定该合同有效。 协议有效,这是好消息。同一条文的第三款也划了边界:实际出资人未经其他股东半数以上同意,要求公司变更股东、记入股东名册并办理登记的,法院不支持。所以代持是内部的权利安排,对外仍然以登记为准。协议要写细:出资、分红、表决权怎么行使、什么条件下转为登记股东、违约怎么办。 ## 服务器放哪不重要,用户在哪才关键(战略与收官) URL: https://xueai.miyang.cn/slides/opc-14.html (以下为免费预览,全文见页面) 服务器放哪不重要,用户在哪才关键 很多 AI 产品的所谓出海,就是把服务器放到新加坡,套一层境外模型的接口,然后照样给国内用户用。这套操作在合规上是无效的。这一节先把判断标准说清,再讲真出海到底要做哪些事。 假出海躲不掉境内义务,法规看的是向谁提供服务;真出海是一个独立项目 利用生成式人工智能技术向中华人民共和国境内公众提供生成文本、图片、音频、视频等内容的服务(以下称生成式人工智能服务),适用本办法。 条文的锚点是向境内公众提供,全文没有一处把服务器位置当成判断依据。所以「服务器在海外所以不受管」这个推论,从第一步就不成立。 以为绕开了境内备案 直接调用海外服务 用户、收款、推广全在境内 适用范围看的是向谁提供 对来源于中华人民共和国境外向境内提供生成式人工智能服务不符合法律、行政法规和本办法规定的,国家网信部门应当通知有关机构采取技术措施和其他必要措施予以处置。 这一条说的就是境外来源的服务照样能被处置。落到产品上,风险是三件事:访问被阻断、被要求整改、商业计划中断。前两件是技术性的,第三件最疼,用户和收入都在境内,链路一断业务就停。 把合规当成成本 能省就省,能绕就绕。省下的是几周流程,赌上的是整个产品的存续。而且这种产品做不大,越接近有规模,越接近被处置。 把合规当成路线的一部分 服务境内用户,那就按境内的规则来:备案、必要时的安全评估和算法备案,第 8 节讲的 ICP 那一套一并排进计划。做完之后你能光明正大地推广。 ## 大厂看不上的长尾,才是一个人的机会(战略与收官) URL: https://xueai.miyang.cn/slides/opc-15.html (以下为免费预览,全文见页面) 大厂看不上的长尾,才是一个人的机会 大公司立项要过 ROI 门槛,一个市场再真实,规模不够大就不会有人做。这道门槛帮你挡掉了最强的竞争对手。这一节讲国内长尾和海外两条路怎么选,再讲一件直接影响成本的事:模型怎么挑。 ROI 门槛帮你挡掉了最强的对手;国产模型能力差距已小、价格差距还大,按场景选型 所以选市场的时候,不要总去看那些热门赛道有多大。先看两件事:这个需求是不是真实高频,愿不愿意付钱。够真实、够高频、规模又小到大厂看不上,那就是你的位置。 选择 A · 深耕国内长尾 找到属于自己的切口,把体验做到极致。在一个细分场景里成为唯一解,比在大赛道里当第二十名有价值得多。成本低、反馈快、合规路径清楚。 选择 B · 扎实做海外 建立合规主体,遵循当地法律,真实运营当地用户。上一节讲过它是一个独立项目,投入按新创业算。适合目标用户本来就在海外的产品。 选择依据只有一条:自己的能力和真实需求。手上没有海外资源和当地关系,硬做出海会把有限的精力烧在最不擅长的地方。国内长尾做到有稳定现金流,再考虑第二条路,是更稳的顺序。 「国产模型不行」这个印象,很多人是两三年前形成的,之后就没再更新过。用它来做技术选型,代价是真金白银。 能力差距 在一份覆盖逻辑推理、代码生成、中文理解、常识问答的场景化评测里,头部国产模型和头部海外模型的得分差不到 0.2 分。 价格差距 同一组对照下,调用价格差距接近 20 倍。同样的效果,成本差一个数量级,这对一个人的公司是决定性的。 这两个数字来自一次具体的场景化对照,不是所有任务的通用结论。用法是把它当成一个提醒:选型之前先测,别凭印象。你的产品只跑那几个固定场景,就用那几个场景的真实输入去测,测出来的排名才对你有意义。 ## 新创业公式:先找买单的人,再用 AI 做出来(战略与收官) URL: https://xueai.miyang.cn/slides/opc-final.html (以下为免费预览,全文见页面) 新创业公式:先找买单的人,再用 AI 做出来 前面十五节讲的是不踩坑:商标、软著、专利、备案、注册资本、股权。这一节讲往哪走。旧的创业公式已经失效,因为它的第一步押的是技术门槛,而技术门槛现在接近于零。收官这节把新公式讲清,把十五节摊成一张图,再给一份能勾的自查清单。 15 节全景图、确权合规自查十五条、七字真言与止损,以及本周就做的三件事 旧创业公式(已失效) 有个好 idea 找外包把产品开发出来 花钱买流量 失效的原因:Vibe Coding 普及之后,把 idea 做成产品这件事的门槛趋近于零,人人都能在几小时内撸出一个 Demo。技术本身不再是护城河,所以这条路的第一步和第二步都不再构成优势。 新创业公式 先找到一定有人买单的利基市场 快速验证 最后才用 AI 把产品做出来 顺序变了:做出来从第一步变成最后一步。稀缺的东西从「能不能做」变成「有没有人买」。这一节之前的所有合规功课,保护的正是这个已经被验证过的位置。 先找利基市场 两个判断标准:真实高频痛点,加上付费意愿强。少一个都不算。第 15 节讲过大厂的 ROI 门槛,够不上门槛的小市场就是你的位置。 再快速验证 原型开发、拿用户反馈、小规模试错,循环跑。验证的目标是有人愿意付钱,不是有人说好。免费用户的赞美不构成验证。 最后用 AI 做出来 确认有人买单之后,AI 工具的价值才被放到最大。它是效率放大器,不是方向发现器。方向没找到的时候,做得越快错得越远。 这个顺序还有一个附带好处:验证过再做,前面十五节的合规投入才花得值。方向没验证就把商标、软著、ICP 全办一轮,钱和时间都可能是空转。 ## 做出来了,为什么没人来(先搞清被发现这件事) URL: https://xueai.miyang.cn/slides/seo-1.html 做出来了,为什么没人来 前面的课把产品做出来了,OPC 把它确了权。然后是一个更朴素的问题:做完不等于有人来。这一节先把「被发现」这件事拆开:流量从哪三条路来、各自什么脾气,再用一个五层漏斗,找到你的产品卡在哪一层。 三条流量入口各有各的脾气:搜索引擎主动搜、AI 引擎直接问、社交传播替你说。先玩一遍收录漏斗,看你的产品卡在哪一层 Vibe Coding 把「做出来」的成本打到很低,这件事有个少被提起的另一面:你能十分钟做一个产品,别人也能。做出来的东西以肉眼可见的速度变多,用户的注意力入口却还是那几个。竞争没有消失,只是从「能不能做」挪到了「会不会被看见」。 很多独立开发者的路径是这样的:憋一个月上线,发个朋友圈,来了三十个访客,一周后归零。然后得出结论「产品不行」。多数时候这个结论下早了,产品可能没问题,问题是它压根没有进入任何一条被发现的通道。 用户发现一个新产品,路径基本逃不出三条。三张卡各写了一条,点开看它的脾气:谁在主导、多久见效、你能控制多少。 用户带着问题主动来找。点开看它的脾气。 用户不搜了,直接问。答案里有没有你,AI 说了算。 别人替你说。来得快,去得也快。 「没人来」是个笼统的抱怨,拆开是五层:做出来了、能被抓取、被收录了、被展示了、被点击了。每一层都会漏掉一批。下面四个开关对应四个常见病,试着关掉再打开,看每层的数字怎么变。 玩完应该能看出一个规律:四个开关分别修四个不同的层,谁也替代不了谁。正文可见修「能被抓」,sitemap 修「被收录」,title 修「被点击」,选题修「被展示」。抱怨没流量之前,先搞清自己漏在哪一层,后面几节按层给药。 不用装任何工具,三个动作就能给自己的站做一次粗诊。如果你现在手上有产品,边读边做;没有的话,拿你常用的某个小工具站试也行。做完一项点一项。 一个合理的质疑:用户都去问 AI 了,搜索引擎优化是不是过时手艺?拆开看恰好相反。第一,搜索没死:大量「找到某个网站」的需求仍然走搜索框,尤其是带交易意图的(查价格、找工具、比服务)。第二,也是更关键的:AI 引擎回答问题前,自己也要先「搜」一遍,它的检索源就是搜索引擎的索引和你站上的内容。SEO 做的能被抓、能被读懂那套基本功,恰好是被 AI 引用的入场券。 你做的事 对搜索引擎的作用 对 AI 引擎的作用 正文进 HTML 能被收录 能被读到,多数 AI 爬虫不执行 JS title 说人话 搜索结果里有人点 AI 判断这页答什么问题的第一依据 提交 sitemap 收录变快变全 进了索引才可能进 AI 的检索源 所以这一章把 SEO 和 GEO 放在一起讲:不是两门课,是同一套基本功的两个出口。第 2 节讲共用的地基,第 3 节讲 AI 特有的部分。 接下来五节按漏斗从上往下走,每节收一层: 第 2 节修「能被抓、被收录」:SEO 最低可行清单,十项全是一次性动作。 第 3 节修「能被 AI 引用」:GEO 四杠杆,答案块、FAQ、llms.txt、日期。 第 4 节看一台真实手术:本站 2026 年 8 月的审计和改造全记录。 第 5 节打持久战:选题排序、真实经历换可信度、黑帽避雷。 第 6 节收口:12 项验收清单加四个度量口径,进度存在本地。 做完不等于有人来:执行成本塌了之后,做出来的东西变多,被发现的入口没变多。没人来的产品和没做的产品,在市场眼里是同一个。 三条入口三种脾气:社交传播管引爆但控制力最弱,搜索引擎慢但你说了算,AI 引擎是正在长大的新入口。本章只讲后两条。 「没流量」要拆成五层看:做出来了、能被抓、被收录、被展示、被点击,每层的病不一样,药也不一样。先定位漏在哪层,再对症下药。 三分钟粗诊随时能做:site: 查收录、问一次 AI、搜自己品牌名。记下今天的结果,学完全章回来对比。 SEO 和 GEO 是同一套基本功的两个出口:AI 引擎回答前也要先检索,能被抓、能被读懂的功课两边通用。 内容来源:小山学堂「被搜到」专题原创,方法与案例来自本站 2026 年 8 月的真实 SEO / GEO 改造记录(第 4 节整节复盘)。 ## SEO 最低可行清单:能被抓、能被读懂、能被收录(两个战场) URL: https://xueai.miyang.cn/slides/seo-2.html SEO 最低可行清单:能被抓、能被读懂、能被收录 SEO 这个词被各种「秘籍」搞得神神叨叨,其实对一个人的小站来说,值得做的部分很小、很明确:让爬虫抓得到、让引擎读得懂、让收录查得着。这一节只讲做了就有效、不做就归零的部分,每一条都能自己动手核对。 只讲做了就有效的部分:一页一个主题、title 说人话、正文别全靠 JS 渲染、sitemap 与站长平台提交。抓取模拟器亲手切两态,看爬虫到底拿到了什么 传统 SEO 是个大行业:外链建设、竞品词库、站群、老域名…那套东西面向有团队有预算的公司。一个人做产品,学那些是浪费生命。好消息是,搜索引擎这些年一直在把游戏往一个方向推:把内容做好、把技术障碍清掉的站,自然会被善待。 所以最低可行清单的逻辑是:只做那些不做就直接出局的事。按照上一节漏斗的分层,它们正好分成三组:能被抓(抓取层)、能被读懂(理解层)、能被收录(索引层)。三组都通了,剩下的交给内容质量,那是第 5 节的事。 分组 解决什么 不做的后果 能被抓 爬虫来了能拿到正文 抓到空壳,后面全归零 能被读懂 引擎知道每页在讲什么 收录了也不知道该在什么问题下展示你 能被收录 引擎知道你存在、有哪些页 收录靠随缘,快慢不可观测 先治最要命的病。AI 生成的前端偏爱单页应用:页面打开先是个空壳,内容由 JS 请求数据再渲染出来。用户看到的一切正常,爬虫拿到的是另一回事。下面同一个产品页,切换两种实现方式,右边是爬虫实际抓到的源码。 上传合同,自动生成合规的发票申请单。支持增值税普票和专票,三分钟搞定过去要跑一下午的事。 主流引擎宣称能执行 JS,但执行有配额、有延迟,小站排不上优先队列;多数 AI 爬虫干脆不执行 JS,抓到什么算什么。对策不用推翻架构:关键页面(首页、功能页、文章页)保证 HTML 源码里就有正文,交互部分继续用 JS 没问题。用 AI 写页面时把这句放进提示词,成本为零。 能被抓之后,第二件事是让引擎读懂每一页。原则只有一条:一页回答一个问题。什么都讲的页面,引擎不知道该在什么问题下展示它,最后哪个问题都轮不到。主题定了,title 和 description 就是这页在搜索结果里的脸:用户扫一眼这两行字,决定点不点。 下面是一个工具站在搜索结果页里的三条真实病例,点一条,看它怎么改。 拍一张体检单,自动存档并设置下次提醒。支持多宠家庭,数据可导出给兽医。 这局对决顺便回答一个常见纠结:炫和被搜到冲突吗?不冲突,有先后。先保证 HTML 里有完整正文,动画和交互往上叠加,本章这些课件页自己就是这么做的:你现在读的每一个字都在源码里,交互组件全是额外加的。 抓得到、读得懂之后,最后一组动作是主动把站送到引擎面前。四样东西,一个下午能全部做完,做完收录从玄学变成一个能看数字的过程。 动作 做什么 为什么值得 sitemap.xml 一个 XML 文件列出你全部页面的地址,放在站点根目录。多语言站每个 URL 还要用 hreflang 互指各语言版本 引擎照着清单抓,不用自己摸索你的站有几页。本站 2026 年 8 月补上英韩页面后,sitemap 条目从约 330 涨到约 950 robots.txt 根目录下的一个文本文件,声明哪些路径欢迎抓、哪些别抓,末尾指向 sitemap 的地址 它是爬虫进站看的第一个文件。写错一行 Disallow 能把全站封掉,改完务必用站长工具验证 canonical 每页 head 里一行 ,声明这页的正式地址 带参数的地址、多个入口指向同一页时,引擎知道该把权重记在谁头上,不会自己人分自己人的票 站长平台提交 Google Search Console 和 Bing Webmaster 各注册一次,验证域名、提交 sitemap。Bing 顺手开通 IndexNow:发版后把变更页面的地址推给它 从此收录数、抓取错误、展示次数全部有报表。别只提交 Google:下一节的 GEO 会讲为什么 Bing 同样重要 这四样都不需要每天维护。sitemap 让构建脚本自动生成,站长平台每周看一眼报表,就够了。 这一节讲的东西全部收进十项清单。对照你的站逐项点亮做到的,没有站就先收藏,上线那天回来过一遍。 这一节的多数要求,可以在让 AI 写页面时一次性说清。下面这段拿去就能用,贴在你的项目提示词或规则文件里: 一段话的成本,换来每个新页面天生合格。这也是本章反复出现的模式:能进提示词和脚本的要求,就别放进记忆和自觉里。 最低可行三组:能被抓(正文进 HTML)、能被读懂(一页一主题,title 说人话)、能被收录(sitemap、robots、canonical、站长平台)。只做不做就出局的事。 JS 空壳是 AI 前端的头号病:用户看着正常,爬虫抓到空白。给 AI 提需求时写明「关键页面正文要在 HTML 源码里」,零成本。 title 和 description 是搜索结果页里唯一的开口机会:title 写用户会搜的问题,description 写这页帮他做什么。 提交平台把收录变成可观测:Google 和 Bing 都要提交,从此有报表有基线。十项清单打完分,缺哪补哪。 能进提示词和脚本的要求,别放进记忆和自觉:那段固定提示词贴进项目规则,每个新页面天生合格。 内容来源:小山学堂「被搜到」专题原创。文中 sitemap 条目数(约 330 → 约 950)为本站 2026 年 8 月改造的真实数据,详见第 4 节完整复盘。 ## GEO:让 AI 引擎愿意引用你(两个战场) URL: https://xueai.miyang.cn/slides/seo-3.html (以下为免费预览,全文见页面) GEO:让 AI 引擎愿意引用你 越来越多的用户跳过搜索框,直接把问题丢给 ChatGPT、Kimi 或豆包。答案由 AI 组织,你的站在不在答案里,成了新的生死线。这门手艺有个名字:GEO(Generative Engine Optimization)。这一节讲它的四个杠杆,每个都配一个当场能玩的教具。 用户不再只搜,还在问。自包含段落、FAQ 结构化数据、llms.txt 与新鲜度信号,四个杠杆各配一个当场能玩的教具,附 AI 爬虫点名册 SEO 和 GEO 争的东西不一样。搜索引擎给用户十条蓝色链接,你争的是排位;AI 引擎直接给一段组织好的答案,你争的是答案里的一句引用、一个署名。用户可能永远不点进你的站,但「据某某站」这几个字就是新时代的曝光。 维度 SEO(搜索引擎) GEO(AI 引擎) 用户看到什么 一排链接,自己挑 一段答案,AI 已经替他挑完了 你争什么 排名和点击 被引用、被推荐、被当作出处 内容被怎么消费 用户进站读全文 AI 摘走能独立成立的那一段 基础设施 sitemap、robots、结构化数据 全都要,再加 llms.txt 和可引用的段落写法 好消息是两者不冲突:上一节的最低可行清单是 GEO 的地基,AI 引擎同样从抓取和索引开始。这一节讲的是在那之上,AI 特有的四个杠杆。 AI 引擎回答问题前,检索回来一堆候选段落,从里面挑能直接用的。你来当一次 AI:用户问「个人开发者的产品怎么定价」,检索回来三段内容,逐段点开,看它们的命运和理由。 自包含段落最省力的落法:每页 H1 下面,先用两三句话把这页的问题直接答掉。是什么、为什么重要、一句话记住。剩下的正文再展开细节。用户扫一眼有收获,AI 摘一段能引用,双赢。 下面这页讲「API 限流」,开头写得很典型。点两个按钮,看两种改法怎么把它救活。 这个「答案前置」的写法和第 2 节的 description 是一对:description 给搜索结果页看,一句话答案块给 AI 和赶时间的读者看。本站每个课程页 H1 下面那行「一句话速览」就是这个杠杆的落地,全站由构建脚本批量注入。 ## 拆本站:Google 收录 693 页,Bing 只有 50 页(拆一个真实案例) URL: https://xueai.miyang.cn/slides/seo-4.html (以下为免费预览,全文见页面) 拆本站:Google 收录 693 页,Bing 只有 50 页 前两节的清单和杠杆,这一节全部落在一个真实病人身上:小山学堂自己。2026 年 8 月 10 日我们给全站做了一次 SEO / GEO 审计,查出十个缺口,当周修完一轮。这一节挑五个最有代表性的,每个讲清怎么发现的、改了什么、拿什么验收。 小山学堂 2026 年 8 月真实审计复盘:sitemap 漏了全部英韩页、Q&A 页白扔了 FAQ 引用、日志把爬虫全丢弃。每个缺口讲清怎么发现、改了什么、拿什么验收 审计那天的本站是这样的:759 个 HTML 页面,中英韩三语,绝大多数页面有 description(743 页)和 JSON-LD(741 页)2026-08-10 实测。也就是说,上一节那张最低可行清单,它大部分是过关的。按很多教程的标准,这已经算「SEO 做得不错的站」了。 但一做实测就露馅了。这正是本章反复强调「自己动手核对」的原因:清单过了不代表没病,数字才是诊断书。第一项实测就查出了全场最大的病。 第 1 节教的三分钟粗诊,第一步就是 site: 查收录。给本站跑这一步,结果如下。点按钮跑一次。 复盘这个病的成因很典型:站长平台只注册了 Google,Bing 全靠自然爬。Google 的爬虫勤快、配额大,慢慢也能爬全;Bing 对没提交的小站爬得很保守。不是内容有差别,是你根本没跟 Bing 打过招呼。 十个缺口里挑五个最有教学价值的。每条点开,按「怎么发现、改了什么、拿什么验收」三段看。注意每条的「发现」都是一个可复制的动作,你可以原样用在自己站上。 ## 一个人的优先级:先写能被搜到的问题(优先级与收官) URL: https://xueai.miyang.cn/slides/seo-5.html (以下为免费预览,全文见页面) 一个人的优先级:先写能被搜到的问题 技术清单前面三节讲完了,全是一次性动作。真正日复一日的仗在内容:写什么、先写什么。一人公司没有 SEO 团队、没有词库工具的预算,你唯一的武器是排序能力:把力气花在有人搜的问题上,用真实经历换可信度,离歪路远一点。 先写用户真的会打出来的那句问题,再堆功能;用真实经历换可信度。反面清单也在这一节:买外链、关键词堆砌、AI 批量灌水页,哪些是找死 独立开发者的内容通病是「功能视角」:更新日志、功能介绍、版本对比,写得勤快,全是没人搜的东西。用户不搜「XX 工具 v2.3 更新了什么」,他搜的是自己的麻烦:「发票专票普票区别」「猫疫苗过期了怎么办」。选题的第一原则:写用户真的会打进搜索框和 AI 对话框的那句话。 好选题只看两个维度:意图强度(搜这句话的人离用你的产品有多近)和竞争度(这个问题已经有多少人答得不错)。意图强、竞争弱的就是金矿,一人公司专挖这种,大词让大厂去卷。 还是那个给自由职业者做开票工具的例子。站主列了四个候选选题,点开逐个体检,看意图和竞争两条仪表怎么走。 同一篇内容,标题的写法决定它有没有入口。点你认为更容易被搜到的那篇。 我们重构了提醒系统,支持按疫苗类型、宠物年龄自定义提醒规则… 先说结论:过期两周内通常补一针就行,超过一个月要重新起免… 功能句思维改成问题句思维,有个机械可行的练习:拿一个功能,写出五句用户可能打进搜索框的问话,每句就是一篇内容的选题。下面拿开票工具的「合同识别」功能做示范,点五个空位逐个揭晓。 ## 被搜到验收清单:上线前再过一遍(优先级与收官) URL: https://xueai.miyang.cn/slides/seo-final.html (以下为免费预览,全文见页面) 被搜到验收清单:上线前再过一遍 全章收官。前五节的东西全部收进一张 12 项清单,每项都是一个能当场核对的动作:查源码、数条目、贴地址、看日志。勾选进度存在本地,每次上线新产品回来过一遍。清单之后是四个度量口径,回答那个最重要的问题:怎么知道这些活儿有没有白干。 十二项可勾选清单:一页一主题、正文服务端可见、sitemap、一句话答案块、FAQ 结构化数据、llms.txt。附「怎么知道有效」的四个度量口径 和审美、交互两张清单一样,它的正确用法是验收,不是备忘:产品要上线了,按组过一遍,没过的项就是待办。四组正好对应全章的四个层:能被抓与收录、能被读懂、能被 AI 引用、能被度量。多数项是一次性动作,做完长期有效,这也是 SEO 对一人公司友好的地方。 诚实声明:本章 6 个页面自己就是按这张清单验收的,包括「正文服务端可见」那条。教被搜到的课自己搜不到,是这一章能想到的最丢人的死法。 清单做完只是「动作完成」,效果要看仪表。四个口径按见效快慢排序,点开每张卡看它在哪看、多久看一次、什么样算健康。再强调一次第 4 节的教训:所有数字都要记下日期,没有口径的数字聊胜于无。 ## 谁适合创业:莫名其妙的自信(创业者的自我修养) URL: https://xueai.miyang.cn/slides/lei-1.html 谁适合创业:莫名其妙的自信 什么样的人适合创业?雷军的回答从一句玩笑开始:「创业不是人干的事情,是阿猫阿狗干的事情。」这一节讲创业者需要的三种能力,以及 1996 年金山陷入绝境时,他靠什么撑过来。 创业不是人干的事:面对困难的勇气、描绘蓝图的能力,与金山对抗微软十六年的信念 「创业不是人干的事情,是阿猫阿狗干的事情。所以一般的人,最好不要去创业。」这句玩笑背后是雷军的真实判断:最重要的不是能力,是你有没有创业的决心和勇气。没有这两样,后面都不用谈。 决心之后,雷军列了三种能力。他特别强调:三者里最难的是第三个。 面对困难的勇气 创业路上困境是常态。产品被打、同事离职、账上没钱,每一样都会真实发生,勇气是消耗品。 描绘蓝图的能力 你得能讲清楚要去哪里、为什么值得去。蓝图不是给投资人看的 PPT,是团队低谷时唯一的燃料。 组织一帮人实现梦想 雷军原话:「最难的是你能不能够召集一大帮人来实现你的梦想和抱负。」一个人信没用,得让一群人信。 对照雷军的标准,逐条点选你已经具备的项,下方实时给出雷军式点评。诚实作答,这个测验没有正确答案,只有真实答案。 创业的决心 不是「想试试」,是想清楚了非干不可,愿意押上几年时间。 面对困难的勇气 公司陷入困境、核心成员离职时,你还能不能第二天照常上班。 描绘蓝图的能力 能用几句话讲清楚这件事三年后的样子,并让听的人眼睛发亮。 组织一帮人的能力 能召集一群比你强的人,跟你一起干一件前途未卜的事。 金山早期开发了 WPS,产品非常对路,很受用户欢迎,「金山一夜之间就成功了」。然后微软进入中国市场:他们的软件没有加密,凭借盗版的方式推广速度非常快。 很快,金山在微软加盗版的双重夹击之下陷入了困境。雷军说,陷入困境以后最难的是两件事:怎么说服自己这件事值得干,怎么说服所有的同事这件事有希望。 下面是 1996 年双方的牌面。先看清实力差距,再点击卡片翻面,看雷军自己怎么解这道无解题。 金山软件 在中国,十来个人,七八条枪 账上十来万人民币 主力产品 WPS 正被盗版侵蚀 微软 当时的世界霸主 软件不加密,借盗版极速铺开市场 资金、人才、生态全面碾压 用逻辑,你是根本不可能赢的 雷军回望:「我今天回想十六年前,我不知道我怎么就能相信金山能击败微软。有时候用逻辑是没办法解释你为什么能赢的。」十六年过去,WPS 取得了长足进展,离击败微软还差十万八千里。「但这不改变我当时相信我能赢。如果九六年我不认为我能赢,我有什么可能坚持到今天?」逻辑推演的结论是必输,所以能让你留在牌桌上的只剩一样东西:信念。 再点一下翻回牌面 点击卡片翻面 → 说服自己只是第一步,第二步要说服所有同事支持你。雷军描述的是他真实经历过的公司负循环: 「创业其实需要信仰。你首先得相信这件事情能发生,你才有足够的自信去说服那个跟你一起干的人。」雷军管这叫「莫名其妙的自信」:你要不自信,这个是绝对没戏的。信仰不是给外人表演的,是负循环里唯一止跌的东西。 一人公司没有同事可以说服,负循环全部发生在你脑子里。金山的负循环是骨干接连离职;独立开发者的版本是:产品上线三个月没人付费 → 开始怀疑方向 → 更新频率下降 → 数据更差。 雷军的解法照样适用:先说服自己这件事值得干,而且要在数据最难看的时候说服。 组织力:「组织一帮人」变成了组织一队 Agent:把蓝图写成清晰的 PRD 和规则,让 Cursor、外包、协作者在没有你盯着的时候,仍朝同一个方向干活。 莫名其妙的自信:金山对微软是逻辑上必输的仗,一个人对一个团队齐整的竞品同样是。逻辑帮你选战场,但让你留在战场上的,从来不是逻辑。 创业先问决心和勇气:没有这两样,能力都不用谈。 三种能力:面对困难的勇气、描绘蓝图的能力、组织一帮人实现梦想,最难的是第三个。 负循环里靠「莫名其妙的自信」坚持:用逻辑推演必输的时候,能让你留在牌桌上的只有它。 创业需要信仰:你先信,才能让别人信。 素材来源:雷军创业公开课口述整理 ## 心理准备:第一天就想好怎么死(创业者的自我修养) URL: https://xueai.miyang.cn/slides/lei-2.html 心理准备:第一天就想好怎么死 大多数创业者第一天想的是公司会多成功,雷军创办小米的第一天想的是公司会怎么死。这一节讲他 40 岁再创业的动机、对失败率的清醒认知,以及三条具体的保命策略。 90% 的创业公司都会死;静悄悄地干、早死早超生、只给自己四年。危机感才是护身符 1987 年,大学一年级的雷军在图书馆看了一本《硅谷之火》,书里讲乔布斯这样的硅谷英雄怎么创业、怎么引领一个时代,「看得让你热血沸腾」。带着办一家世界一流公司的念头,他创办了金山。 到 40 岁,该做的事都做得差不多了,他发现小时候的梦想还没实现。「我这一生算基本快结束了,在快结束的时候,我可不可以去试一点与众不同的东西?」 「你可以说我狂妄,但是哪个创业者在内心不是狂妄的呢?他们不狂妄,怎么能自信呢?」小米的最初动力就一条:办一家世界一流的公司。 做了几年天使投资之后,雷军说:「我觉得创业一点都不好。而且我几乎可以肯定百分之九十以上的创业公司都会死掉。」所以他跟绝大部分创业者相反:「我在创业的第一天就在想,我们的公司会怎么死。我说我们一定会出问题的。」动员团队时他不讲宏图,他说的是:你能不能信任我,跟我一起干四年,如果输了,咱们就散摊。 这和他做金山时完全相反。当年他把思想工作做得「极其透彻」,有人离开就觉得是背叛,「背叛了我们伟大的事业」,所有人都活得无比纠结。后来他想明白了:你不能把你的事业,变成每一个人矢志不渝的终身事业。 想清楚「一定会死」之后,怎么才能不死?雷军给小米定了三条。逐条点开,看原话和背后的算计。 静悄悄地干 听着像玩笑,实际是精神防御工事:不官宣、不造势,失败的成本里就少了一项「颜面扫地」。雷军说你的精神要无比强大才行,要有一整套逻辑说服自己。这套逻辑的第一条,就是把退路先修好。 方向不对,早死早超生,动作要快 死不可怕,慢慢死才可怕。方向错了硬撑,烧掉的不只是钱,是你最值钱的东西:时间。关门重来不是失败,是把子弹省下来打下一枪。 只给自己四年 给项目设死线不是不坚持,是承认时间有机会成本。四年是雷军 40 岁时给自己的预算:「也许我没有四十年时间了」。下面的滑块可以看他对不同年龄的算法。 三条看完了。结果小米「运气好到罕见」,从大的战略点来说几乎一步没错。但雷军的总结里没有庆幸,他接着问的是:我们未来还会不会遇到什么样的坎坷?保命策略的尽头,是永远保持危机感。 雷军的时间预算跟年龄挂钩:「如果我二十岁创业,我会坚持告诉你们,坚持干四十年。如果我到了四十岁创业,我说你干四年就够了。」拖动滑块,换成你的年龄算一遍。 「我看过很多很多二次创业失败的案例。有过第一次成功的经验,再创业的时候,失败的概率其实比第一次更高。为什么?因为你觉得你自己了不起。往往你很得意的时候,你就离死不远了。像我这样觉得自己创业挺牛的、还经常当所谓创业导师的人,我觉得死起来更容易。所以在我创办小米的时候,我就提醒我自己:我一定会死的。」 雷军非常喜欢任正非的一句话:一个企业只有死过三次才能叫真正的成功,「烧不死的鸟叫凤凰」。人生有顺境就一定有逆境,而在高度竞争的互联网行业,每个企业最重要的就是危机感。他举的两个「血淋淋、活生生」的例子: 雅虎 「我们谁能够想象当年的雅虎如日中天,会遇到今天的困境?」曾经定义了互联网门户时代的公司,几年之间从标杆变成了教训。 诺基亚 「谁想过短短几年前,诺基亚在今天会遇到压力?」功能机时代的绝对霸主,倒在了它自己看不上的智能机浪潮里。 静悄悄地干:产品没跑通之前不必到处官宣 build in public,失败成本里最贵的一项,是当众失败带来的自我怀疑。 早死早超生:AI 时代重写一个 MVP 可能只要一两周,砍项目的合理门槛比雷军当年低得多:数据证明方向不对,就砍,千万不要将就。 只给自己四年:给每个产品设验证死线,比如三个月内没有第一批付费用户就换方向,把「再坚持一下」从一种情绪,变成有截止日期的决定。 危机感的一人公司版本是平台依赖。雅虎和诺基亚死于看不见的浪潮;独立开发者的雅虎时刻是:模型 API 涨价十倍、平台改推荐算法、某天大厂把你的功能做成了免费标配。 第一天就想好「我的产品会怎么死」:答案往往就是你该分散的那个单点。 热血是入场券,清醒才是保命符:90% 以上的创业公司会死,所以第一天就要想好怎么死。 三条保命策略:静悄悄地干、方向不对早死早超生、只给自己四年。 成功过的人更危险:「你很得意的时候,你就离死不远了。」 烧不死的鸟是凤凰:危机感本身就是创业成功的关键。 素材来源:雷军创业公开课口述整理 ## 选方向:Go Big Market(方向与起点) URL: https://xueai.miyang.cn/slides/lei-3.html 选方向:Go Big Market 「你们干的事情,都不一定是你们能干的最大的事情。」这一节是雷军办金山最大的后悔和总结:方向怎么选、天花板怎么算,以及一句他用得比发明人还多的话:Go Big Market,做最肥的市场。 兴趣是第一驱动力,但天花板由市场决定:毒霸与词霸、多玩与 YY 的两次教训 雷军特别喜欢问从零开始的创业者三个问题:你喜欢什么?你能干什么?你认为哪个事情足够大、你能干得了?选方向就是在这三个圈的交集里找答案。他说自己做小米「运气很好,做了一件我喜欢干、我能干,而且市场规模足够大的事」。 第一问为什么排在最前面?雷军试过反着来。柳传志说「要把需要变成爱好」,他拿来激励自己,后来发现「把需要变成爱好挺难的,这有点违背人性了」。 金山转型做网络游戏时,他号召所有同事必须玩游戏,不玩扣发年终奖,逼着所有人游戏过关。多年下来的结果:还是有很多人骨子里不喜欢玩游戏,只是在大浪潮下违心地说「我爱玩游戏」。「你说他不喜欢玩游戏,他怎么可能把游戏做好呢?」 拿一个你正在考虑的方向,点击回答三问,看雷军的判定。 你喜欢这件事吗? 你能干得了吗? 市场足够大吗? 「选择自己喜欢干的、自己能干的,在这个领域里面找大的」,这句总结的背后是两笔真实的账。 第一笔是雷军自己的:当年在毒霸和词霸之间,他因为「做毒霸需要跟公安部门打交道,有点烦」选了词霸,可毒霸的市场是词霸的一百倍以上。等金山毒霸推出,已经比词霸晚了四年,「一场血战,打到今天还是第二名」。 第二笔是李学凌的:先做多玩游戏门户,雷军提醒他「撑死了一亿美金的价值」,拼命干了三年,发现真的是一亿美金;改做 YY 之后,从 2008 年 7 月 28 日发布算起,两年四个月估值过十亿美金,头上还压着一个叫腾讯的大哥。 点击切换两组案例,对比条按市场规模等比缩放。注意小的那根有多短。 词霸 vs 毒霸 雷军办金山最大的后悔 多玩 vs YY 李学凌的换战场实验 「Go big market,做最肥的市场」,雷军说这话是陈一舟发明的,「我觉得他讲得特好,所以我用的次数比他用的次数更多」。 小米值钱的原因不神秘:智能手机的市场值那么多钱。iPhone 发布五年,收入可能到一千亿美金规模;全球一年卖十六亿部手机,都在把功能机换成智能机。雷军给中国市场算的账: 「如果我不是做这个市场的话,我怎么可能第一年开始卖产品就是一百亿人民币呢?如果我今天还是做 WPS,在中国加上微软,加起来才十亿人民币。」方向足够大的时候,你的机会就足够大。如果你干了一个很小的方向,你再干死干活,都干不了多大规模。规模,受限于你所处的市场。 市场再大,还有最后一关:你是不是干这件事的人。这是雷军见过的一个真实创业者。点击「下一句」听完对话,然后做出你的投资决定。 对话结束。如果你是投资人,你投谁? 雷军当场问的就是这句:「我是投资你,还是投资你太太?」他的结论:「当你是这个公司最重要的人的时候,你一定要想清楚,你是不是这个公司的核心价值,你能不能做你懂的东西。如果这都是你太太懂的东西,能不能让你太太创业,你帮你太太打下手?这个公司会更容易成功。」三问筛出来的方向,最后还要过这一关:做自己懂的事。 独立开发者最常犯的错,恰好就是「选了词霸」。会写代码的人天然爱做开发者工具:熟悉、顺手、不用跟公安部门打交道,但那往往就是「词霸市场」;同样的技术栈换个人群(给外贸商家、给宝妈、给自媒体作者),可能就是一百倍的盘子。AI 应用尤其如此:模型能力是通用的,天花板几乎完全由你选的人群和场景决定。 动手之前先算一笔多玩式的账:这个方向撑死了值多少?如果答案是「一个不错的副业」,而你想要的不止于此,学李学凌,换战场要趁早。 「投你还是投你太太」对一人公司是个更狠的问题,因为没有太太可以让贤。你就是全部团队,所以「做自己懂的东西」是硬约束:不懂电商就别做选品工具,不懂医疗就别碰问诊产品,哪怕市场再肥。 可行的路径是雷军那条的变体:要么先把自己变成目标用户(真金白银地用半年),要么找一个「懂的人」深度绑定。三问的完整版是四问:喜欢、能干、市场大,以及这事的核心价值在不在你身上。 选方向三问:你喜欢什么、你能干什么、哪个事情足够大。 兴趣排第一:「把需要变成爱好」违背人性,不喜欢的事做不好。 在喜欢且能干的领域里选最大的市场:词霸和毒霸差一百倍,多玩和 YY 差十倍,天花板在动手之前就定了。 Go Big Market,最后再自问一句:这家公司的核心价值,是不是你。 素材来源:雷军创业公开课口述整理 ## 起名:赢在起跑线(方向与起点) URL: https://xueai.miyang.cn/slides/lei-4.html 起名:赢在起跑线 雷军看到的创业者里,99.9% 的公司名是随便起的。而联想、百度、腾讯、华为,这些成功公司的名字全都很好听。这不是巧合:「你在名字上花多少时间,就意味着你会花多少时间在它的业务上」。这一节看小米这个名字是怎么磨出来的。 有商标、有域名、含义不错、朗朗上口;从大米到小米的取名全过程 雷军真的琢磨过:为什么成功的公司名字都很好听?难道是因为叫多了吗?冷静想想,不是。它们的名字就是很好。 互联网浪潮开始之后,是「去高大全」的开始。金山、卓越这类名字在当年很好,但在新时代显得不亲民。名字的好坏,是随时代变的。 雷军给「好名字」下过一个定义:有商标、有域名、含义不错、朗朗上口。选一个名字,看它逐关过检的结果(依口述素材整理的推演)。 金山 雷军的老东家 卓越 十几年前的电商 紫米 候选之一 小米 最终选择 有商标 … 有域名 … 含义不错 … 朗朗上口 … 小米这个名字不是灵光一现,是一步一步磨出来的。点「下一步」,走完这条取名之路。 买不到域名,就不用这个名字 「你可不可以买到小米拼音的域名?如果我买不到,我不用。因为我们要办一个世界级的伟大的公司。你能想象小米 .com 是个阿猫阿狗公司吗?那你不死定了嘛。」出发的时候就要有域名,这条是硬杠杠。 给外国人留条活路 小米唯一的遗憾:外国人念不出 xiaomi 的拼音。「我们还有一个巨大的工作是教全世界人民念什么叫小米。」回头看,紫米(zimi)四个字母,工作量会低一点。起名时尽量取外国人念得出的名字。 一人公司没有品牌预算,名字就是你最便宜的营销资产。雷军投资公司时「总是不厌其烦地逼他们取最好的名字」,独立开发者更该逼自己一把。 四关照抄,工具都是现成的:域名去注册商查 .com / .app,商标查中国商标网和 USPTO,半小时能过完前两关。查完再动手写代码,顺序别反。 花一个周末不亏:你在名字上花多少时间,就意味着你会在这个产品上花多少时间。随手起的名字,往往对应随手做的产品。 你没有市场部帮你解释名字,名字必须自己会传播。 AI 时代的第五关:用户现在会直接问 ChatGPT「那个做 XX 的工具叫什么」。名字如果是生造的怪拼写,AI 拼不对、搜不到,等于把免费的推荐渠道堵死了。 「白米饭」标准:独立产品的名字要每天都见、喜闻乐见,让用户口头转述时不打磕巴。发布前找三个说不同语言的朋友念一遍,念不顺就换。 好名字四标准:有商标、有域名、含义不错、朗朗上口。 最关键的是下功夫:怎么起一个好名字?最最关键的问题,是你下了多少功夫。 笨功夫就是诚意:红米、黑米、蓝米、紫米挨个查域名商标,才换来一个「小米加步枪」;名字上的笨功夫,就是对业务的第一份诚意。 素材来源:雷军创业公开课口述整理 ## 互联网七字诀(产品与口碑) URL: https://xueai.miyang.cn/slides/lei-5.html 互联网七字诀 「互联网实际上是一种思想,一种做事的方法。这个方法就是七个字:专注、极致、口碑、快。」雷军说琢磨透这七个字去做事是攻无不克的。它的恐怖之处在于,你要真做到。 一年只出一款手机的自信、把自己逼疯的极致,与一夜应战价格战的快 四个词都听过,难的是做到什么程度才算数。点击每个字,看雷军给出的刻度。 小米 1S 本可以「简单降降价就行了,把小米 1 代降到 1999 一样卖」。但雷军最后改了十几处,一处不少。点手机上的亮点,找出那些几乎没人注意到的改动。 耳机孔 · 里面全改成黑的 小米 1 代的耳机孔里面能看得见结构。「有几款手机注意过耳机孔里面好不好看?至少我注意到了。」他把这个也改了。 按键 · 改成独立按键 屏幕下方的按键改成了独立按键。刚上来的时候不懂、犯了一些小错误,1S 就是把它们一处处做得更好的机会。 USB 插口 · 改成方形 理由只有一个:因为更好看。这种改动用户几乎不会发现,但雷军坚持改。 其余十几处 · 一处不少 「我最后改了十几处,一处不少。我完全可以不干这件事情的,对吗?但这不是我的风格。」 Google 收购摩托那天 去年 8 月 16 号要开发布会,结果 Google 收购了摩托罗拉。雷军说自己运气好得惊人:当天发布小米手机,居然把小米做成了第二天的头条,Google 收购摩托变成第二条。 京东价格战的一个通宵 精心准备要发小米 2 代,「东哥」突然想打价格战。雷军坐了好几个小时,想明白自己也应该「莫名其妙地高兴、兴奋」。十点多想到主意,问同事明早九点能不能干,答复是能干。很多同事回办公室干了一个通宵。价格战只打了半天,他自嘲反应过激;但如果真打三天呢?所有人都在看实时战报、都在比价,你不快,就发不出任何声音。 七字诀对一人公司不是鸡汤,是资源约束下的最优解。你只有一份时间,四个字每个都指向同一件事:把有限的力气押在一个点上。 专注:同时养五个 side project 就是独立开发者的机海战术。「一年只出一款手机是一种自信」:砍掉四个,把那一个做到能收钱,比五个半成品加起来值钱。 极致:你的「耳机孔」是空状态文案、报错提示、加载动画这些没人要求你做的细节。一百处努力总有一两处被用户发到社交媒体上,那就是你的免费获客。 大公司可以用机海战术赌概率,你赌不起。但决策链只有你自己,这是对大公司唯一的结构性优势。 口碑:没有投放预算,口碑是你唯一的增长渠道,「营销是伪命题」对你比对小米更成立:写十篇推广文,不如把产品改到用户愿意替你转发。 快:热点当天出功能、用户反馈当晚修上线,AI 编程工具把「一个通宵」压缩成了两小时,别浪费这个优势。 互联网七字诀:专注、极致、口碑、快,恐怖之处在于你要真做到。 做到的刻度:专注到一年只出一款手机,极致到把自己逼到吐血,快到一个通宵改写发布计划。 口碑不用单独做:它是前三个字的结果。 素材来源:雷军创业公开课口述整理 ## 口碑的本质是超出预期(产品与口碑) URL: https://xueai.miyang.cn/slides/lei-6.html 口碑的本质是超出预期 互联网让口碑传播变得极快:东西好,很快就会被消费者传开。但什么东西才有口碑?雷军花了很长时间琢磨透这个问题,答案来自两次亲身消费:一趟失望的帆船酒店,和一顿被感动的海底捞。 金碧辉煌的帆船酒店为什么输给海底捞:预期管理,与用心可以被用户感知 问题不在酒店本身。帆船酒店的服务其实非常好,坏就坏在「想了好几年」:预期已经被抬到了天上。 口碑不是体验的函数,是「体验减预期」的函数。拖两个滑块,看同样的体验在不同预期下,口碑怎么变。 两个预设的体验值是同一档,差的只是预期。这就是雷军那句「当预期非常之高的时候,你是永远不可能获得真正口碑的」。 点击卡片翻面,看两家店的表面印象和雷军亲历的真相。 帆船酒店 七星级 · 金碧辉煌 · 想了好几年才去成 · 听过无数赞不绝口的表扬 服务其实非常之好 进餐厅先问「您是哪里人」,答中国人,马上换来一位会中文的服务员;第一次来有礼品,卡片带照片请你签名;介绍世界各地的餐食,还有专门从中国苏州来的厨师,请你跟厨师长聊聊天。 海底捞 一家火锅店 · 服务品质真比五星级好吗?不一定吧 一样东西五星级酒店没法模仿 服务员发自内心深处的微笑。酒店和空姐的笑是培训出来的、虚假的;海底捞的笑装不出来。雷军问服务员怎么这么高兴,她说:「我一下岗女工,还有海底捞愿意要我,一个月给我四千块钱,你觉得我不笑吗?」那一瞬间他被感动了。 独立开发者手里有一张大公司永远拿不到的牌:低预期。没人指望一个个人开发者的产品有多完美。这不是劣势,这是海底捞的起跑位置。 别抬预期:「最强」「颠覆」「重新定义」每写一个词,就把自己往帆船酒店的位置推一步。把话说到八分,留两分给用户自己发现。 心思看得见,和小米 1S 的耳机孔一个道理:不是每处用心都被发现,但用户发现的那一刻,就是「哦,原来如此」的口碑时刻。 用户带着「随便试试」的心态进来,你每一分用心都在超出预期。 真人感,你的「发自内心的微笑」:反馈邮件由你本人回、报 bug 的用户修好后主动告诉他、更新日志写人话,别写「优化了若干体验」。这些大公司流程做不出来,正如五星级酒店模仿不了海底捞。 便宜的惊喜:付费用户收到一句手写感谢、深夜提的需求第二天出现在版本里,成本几乎为零,但用户会截图发出去。互联网口碑传播极快,这句话对一人公司同样生效。 口碑 = 体验 − 预期:口碑就是超出预期;当预期非常之高的时候,永远不可能获得真正的口碑。 两家店的对照:帆船酒店输在预期被抬到天上,海底捞赢在一个装不出来的微笑。 超出预期不难:难的是真的花心思;各行各业都还有超出预期的空间,就看你做不做。 素材来源:雷军创业公开课口述整理 ## 第一笔钱:从身边人开始(找钱与融资) URL: https://xueai.miyang.cn/slides/lei-7.html 第一笔钱:从身边人开始 办公司第一件事就是需要钱。雷军的答案很朴素:天使投资在美国就是凑份子,真正的问题是人家凭什么相信你。这一节讲第一笔钱从哪来、信用怎么攒,以及为什么几百页的商业计划书没人看。 天使投资的本质是熟人信用;商业计划书没那么重要,一句话说清生意才重要 天使投资就是凑份子 雷军前年看到一家美国公司,融了二十个天使投资人,总共几十万美金,一个人一两万美金凑起来的。中国民间一定凑得出这么多钱,只会多不会少。缺的从来不是钱。 真正的问题是凭什么相信你 跟你不够熟,凭什么给你几万块?千万不要把融资当成孤立的事情:你先得交朋友,先让别人相信你。连父母、兄弟姐妹、死党都说服不了,去找薛蛮子、找雷军要钱,「他们不有病吗」。 只投熟人,和熟人的熟人 雷军旗帜鲜明「我只投熟人」:真正的天使投资人就是熟人。扩展一层:一个靠谱朋友的靠谱朋友,基本九成靠谱,90% 靠谱的事情他也投,因为创业本来就没有百分之百靠谱。 别指望在会上拦住薛蛮子 会上拦人递简历,薛老会不会给钱?可能有,但那是他收的一万份简历中的一个。没有天上掉馅饼的运气,就从身边开始。信用的导入期,在找钱很久很久以前就开始了。 雷军生平投的第二家公司是李学凌的 YY。这笔 2005 年的 830 万,是十年交往攒出来的。点击「下一步」,看信用怎么一步步积累成一张支票。 雷军说他基本不怎么看商业计划书,而且绝大部分 VC 都不怎么看,这跟商学院讲的很不一致。当年做卓越网,他也「傻乎乎地写了几百页的商业计划书,中英文对照」,印刷精美,至少干了三个月,拜访了几十家投资人,没人投钱,差点绝望。原因有两个:VC 都很忙,而且他们会假定这些东西都是编出来的。 一个靠谱的人的推荐和信用,在整个投资领域里是决定性的东西。VC 有兴趣之后才会要材料。材料不是敲门砖,信用才是。 下面是一份典型商业计划书的目录。逐项点击,看在 VC 眼里哪些真的有人看、哪些没用、哪些还会减分。 一人公司的「天使轮」,同样从身边人开始。独立开发者的第一批付费用户,几乎都来自朋友、社群和关注你很久的读者。他们买的不是产品,是对你这个人的信用。 信用要提前很多年攒:公开 build、把每个 side project 做完不烂尾、在社区认真回答问题,都是「不收车马费」式的信用存款。 别指望大 V 救活:指望产品被一条转发救活,跟在会上拦住薛蛮子是同一件事:你只是他刷到的一万条动态之一。 OPC 的 BP 就是 Landing Page,规律完全一样:没人读你的长文档,一句话说清你解决什么问题才是全部。 写「基于大模型的智能化知识管理解决方案」等于什么都没说,写「把微信收藏夹变成能搜索的笔记」才有人付钱。一句话讲不清的产品,多半是还没想透。 融资的全过程就是做人:「我平时很认真地做人,很认真地工作,赢得了这么多人信任。当我要创业的时候,他们愿意赌我能不能赢。其实就这么简单。」 第一笔钱从身边找:天使投资就是凑份子,缺的从来不是钱,是别人凭什么相信你。 信用在找钱之前很多年就开始攒:信用的导入期有多长,支票就有多大。 把人说清楚、把生意用一两句话说清楚,比几百页 BP 有用得多。 素材来源:雷军创业公开课口述整理 ## 融资时机:有钱才能融到钱(找钱与融资) URL: https://xueai.miyang.cn/slides/lei-8.html 融资时机:有钱才能融到钱 这个世界很纠结:只有有钱才能融到钱。账上留足现金、钱花一半就启动、让投资人来找你。再看懂 VC 的账本,明白他要赚十倍为什么不是贪婪,你就知道该在什么时候、用什么姿态谈钱。 钱花掉一半就启动融资;让投资人来找你;VC 凭什么要赚十倍 留足账面现金 不缺钱的情况下,融资会很轻松。职业 VC 和 PE 的钱是要投出去的,这是他们的工作,每天都在寻找赚钱的机会。所以让他们来找你,比你去找他们容易得多。 钱花一半就要启动 第一轮拿了一百万,花了五十万就要赶紧去融下一轮。千万别花完,「花完了一点戏都没有」。账面没钱的时候是融资最痛苦的时候:他明天不给你钱,你后天就死了,还有什么议价能力? 四小时谈定四十亿美金 小米上一轮作价十亿美金融了九千万,只过了五个月就有人上门。「要不要融钱?」不需要。「下一轮什么时候?」年底再考虑。「什么价?」最少四十亿美金。「我今天给你四十亿美金,做还是不做?」公司被市场证明、账上不缺钱,谈判才会这么从容。 谦和地表达自信 交流和谈判的过程中,怎么在很谦和、很愿意沟通的前提下表达你的自信,很关键。底气来自业务和现金,不是来自嗓门。 假设你第一轮融了 100 万。拖动滑块模拟钱花掉的比例,看你的谈判筹码怎么随着账面现金流走。 账上现金 投一个公司希望挣十倍,听起来很贪心。但雷军替 VC 算过账:他投的是创业公司,百分之八九十都会死。投十家,成功的那家挣了十倍,其他九家全死光,不才刚打平吗。而且从创办到 IPO 再到 VC 能卖掉股份,平均最少八到十年。游戏规则就是「赢的人赚十倍,输的人全死光」,正因为这样他们才愿意冒险,这个结构对整个国家的自主创新都有巨大推动。 一支基金投了 10 家公司,每家 1 份本金,9 家死光,只有 1 家活下来。拖动滑块设定这家活下来的公司的回报倍数,看整支基金是亏是赚。 所以 VC 最想知道的,是你怎么能帮他挣十倍,特别是 A 轮的早期 VC。你要帮他算明白能挣十倍,让他相信,还要让他回去能说服投资委员会。还有一条底线:钱可以输,人不能输。公司搞砸了,也要维护好投资者的关系。他们不会认为输钱丢人,他们每天都在干输钱的事情,最重要的是让他相信你这个人值得信赖。 雷军几乎每天都听到这样的故事:「我的目标是做手机,但在做手机之前,我先要做电话机。」他每次都问:你为什么不直接做手机?对方说,做手机竞争激烈,需要很多钱。可今天的资本市场真的不缺钱:全球的资本都在发了疯地挖掘赚钱的机会,只要有一丝机会,钱就像水一样涌过来。缺的是能帮他们挣钱的人。 「我先做电话机,做好了再做手机」 投资人听到的是:你自己都不敢赌这个目标。迂回路线消耗的是时间和信心,争取不到资源时,该想的是拿什么换资源,而不是把目标降级。 「我要做手机」 投资者并不关心你现在值多少钱,只关心你未来几年能不能帮他挣一倍、三倍、五倍。小米创办两年作价四十亿美金融了 2.16 亿。投资者做了两个月 DD,最后只说了一句话:「没有任何外部因素阻碍你们成为下一个一千亿美金的公司。」干不到,就是你的问题。 一人公司的「账上现金」是你的跑道:订阅收入加积蓄。「花一半就启动」翻译过来是:当存款加月收入只够撑六个月,就要动手开新的收入线、谈 sponsor、接顾问单。 别等断粮才找活:那时候接什么单都没底气,报价直接对折。雷军说毫无议价能力的创业者「他明天不给你钱,你后天就死了」,缺钱的独立开发者面对甲方是一模一样的处境。 「让投资人来找你」的 OPC 版本,是让机会来找你。产品数据拿得出手、公开 build 有持续声量,sponsor 和客户会主动上门,这时候谈条件从容得多。 谈的时候记住 VC 账本的逻辑:对方想听的不是你多需要这笔钱,是你怎么帮他挣钱:sponsor 买的是转化,客户买的是省下的时间。把这笔账替他算明白,比任何恳求都有效。 「找钱的诀窍是账上有钱才能找到钱。」钱花一半就启动融资,千万别等花完。 让投资人来找你:专注把业务做好,谈判时谦和地表达自信。 看懂 VC 的账本:十倍回报背后是九死一生的游戏规则,把「怎么帮他挣钱」替他算清楚。 目标直接说:资本不缺钱,缺能帮他们挣钱的人。 素材来源:雷军创业公开课口述整理 ## 估值的艺术:融资卖的是信心(找钱与融资) URL: https://xueai.miyang.cn/slides/lei-9.html 估值的艺术:融资卖的是信心 做价越高越好?雷军的结论正相反:做价高,出售的是一个更高的预期,达不成就要付出代价。这一节讲怎么定价(先做市场调查,从中间价往上走),以及融资这件事的本质:销售信心。 先找不可能投你的人问价、从中间价往上走;做价过高的三种副作用 做价高不是好事 高做价出售的是更高的预期。达不成,投资者会很沮丧,会通过各种方式给你施压,让你的动作变形。单方面追求很高的做价,是一个非常错误的观点。 泡沫期的后遗症 去年上半年互联网泡沫,所有公司做价都偏高,闹不好高了接近一倍。现在无数董事会在解决扯皮:做得特别好的没问题,特别差的公司已经死了,最难办的是大多数不好不坏的公司。 下一轮没人敢进 用很高的价钱融来的钱花完之后,下一轮投资人一看:「你这么贵,我怎么进呢?」高估值不是荣誉,是给未来的自己挖坑。 最重要的是选谁投你 这个人进来以后意味着五到十年,你不想见也不得不见:董事会、来公司看看,躲都躲不掉。雷军要求自己的投资经理「学会跟创业者谈恋爱」:投了就要同生共死很多年,不是发自内心喜欢,就别投。反过来,创业者挑投资人也是同一个道理。 雷军的定价诀窍:先找三五家投你可能性近乎为零的基金问价,摸清市场感觉,然后从中间价往上走。点击「下一步」,对比这条路和「先定高价再往下砍」的结局。 因为投资是个信心的活。你要让人相信一家啥都没有的公司能做到十亿美金,靠的就是一点点信心。这个东西说它有就有,说没有,一瞬间就没了。可能因为某件小事多一点信心,又因为某件小事没了信心,分分钟就会改变。 所以只能做一件事:让他不断增强信心。5000 万有信心,5500 万继续有信心,可能一路加到 1 亿;反过来 1 亿他信心不足,明天看这个不足、后天看那个不足,他就不做了。降价本身就是最伤信心的信号。 投资人正在观察你。点击下面的创业者动作(每个只能用一次),看信心值怎么涨跌。注意涨得多慢,跌得多快。 一人公司的「估值」是你的定价。雷军的市场调查法直接可用:定订阅价或报价之前,先找几个几乎不可能付费的潜在用户问「这东西你觉得值多少钱」,摸到市场感觉后从中间价往上走。 千万别对标头部产品定个高价再打折促销。降价对独立产品是同样的信号:连你自己都不信它值这个钱。 「出售更高的预期」这个坑,OPC 版本是公开立 flag。Roadmap 吹得越满,跳票一次伤得越重;说了每周更新就每周更新,你的 changelog 就是用户的信心温度计:小步兑现涨一点,跳票一次跌一截。 选客户也像选投资人:一个愿意陪你五年的订阅用户,好过十个逼你动作变形的定制大单。融资卖的是信心,做产品卖的也是。 「融资、创业这些东西,销售的都是信心。」信心只能不断增强,没有回头路。 追求合理做价,合理不等于最高:做价高出售的是更高的预期,达不成就要付出代价。 定价先做市场调查:找最不可能投你的人问价,从中间往上走,千万别定高价往下砍。 比价格更重要的是选谁投你:这个人你要见五到十年。 素材来源:雷军创业公开课口述整理 ## 股权就是拼图:切忌均分(股权与合伙人) URL: https://xueai.miyang.cn/slides/lei-10.html 股权就是拼图:切忌均分 刚开始创业的时候,那 100% 的股份其实是个梦想。创业的过程,就是拿这 100% 的梦想去跟钱 share、跟最优秀的工程师 share、跟最好的 marketing 和资源 share。雷军的原话:创业就是拼图。这一节看拼图怎么拼,以及极左、极右、均分这三种拼法为什么都会死。 50/50 的隐患、三人各 1/3 的死局;极左极右都不行,团队里必须有权威 在初期创业的时候,创业者唯一的资产就是那 100% 的股份。它值多少钱,取决于有没有人信。雷军的算法很直接:你真的想办一个伟大的公司,就要想「我要办一个十亿美金的公司,我的 1% 就是一千万美元,我能换多少东西」。你要不相信自己的公司能做大,公司怎么可能成功呢? 下面这 100 个格子就是你 100% 的梦想。按雷军举的例子,把股份一块一块分出去,看每一块换回了什么。这就是拼图游戏。 雷军见过的创业者,在股权问题上「要不是极左,要不就极右」。两个真实例子。 50/50 给一个挂名合伙人 有朋友找了个「很厉害」的人合伙,对半分。雷军认识那个人:自己有五家公司、三五百人规模的 CEO,怎么可能全职来跟你创业?「他至多起到一个 Angel investor 的作用,甚至我经常觉得他还不掏钱。那哪个投资者敢投你这个五十对五十?」 还有个海归博士,注册公司五万块,一个「有点社会资源」的人掏三万占 30%。问他那人能帮什么?「他帮我注册公司。」还能帮什么?说不出来了。你一上来把 50% 的梦想贱卖了,换到的资源不够,后面就没得拼了。 100% 全是我的,我一个人干 「公司未来七嘴八舌的,还是我一个人做决定就好。」雷军的判断毫不留情:在今天的互联网创业里,你 100% 持有股权,想把公司做成的概率近乎等于零。 看看过去五年所有成功的创业公司,都是很好地完成了这场拼图的。像陈天桥、丁磊那样股权高度集中的成功,今天已经很难很难,他们也都有 partner 一起干。 股份「分」出去是对的,「均分」就掉进另一个坑。雷军自己就踩过。 四个人,每人 25% 雷军大学创业时「被绑票拉去创业」,四个人一人 25%。结果六个月之内选了两次谁当董事长、谁当总经理。还有一次,一家公司的几个合伙人来见他,递上名片一看:全是 CEO。四个人,每人 25%。第一个问题就来了:你们公司到底谁负责? 争执不下的时候,听谁的? 两人对半在美国有很成功的先例:Google、Yahoo、HP 当年都是一人一半。好处是不用比贡献、不用讲制衡。坏处是出现原则性争执时没有人调解。美国大家都按规则来,所以成得多;在中国,初期一人一半的很多,最后成功的不多。要用这个结构,「意见不同时听谁的」必须在创业之初就说清楚。 三个人或四个人均分,这个不用谈了,三个和尚肯定没水吃。一定要有人在股份上、在整个小组里有领导力、有说话权、声音比较大。必须有权威存在,才能组织好这个团队。 四种常见的股权方案,点击任意一种,看雷军会怎么诊断。 50 / 50 25 × 4 100% 独占 65 + 25 + 10 点击上方任意方案,开始体检。 一人公司的「100%」,是你的时间和产品收入,拼图逻辑一模一样。有人找你联合做 AI 产品、开口就是「五五开」时,先问雷军那三个问题: 全职还是挂名:他是真投入进来干,还是只出一个名字? 听谁的:争执不下的时候,谁说了算? 拼上哪块图:他补的是你缺的哪一块?如果答案是「我认识很多人、能帮你介绍资源」,那是渠道分成或顾问费的价钱,不是一半。 独立开发者最容易犯的是极右:设计、增长、渠道全自己扛,什么都不肯分。你完全可以拿收入的 15% 换一个真正带流量的发行渠道,拿 10% 换一个把产品体验拉高一档的设计师。但不要拿 50% 换一句「我看好你」。 分出去的每一个百分点,都要能指着它说清换回了什么。 创业就是拼图:100% 的股份是你唯一的资产,也只是个梦想。 每一块都要换回真东西:拿 15% 换钱、10% 换最优秀的工程师、5% 换最好的设计师。 极左贱卖、极右独占,成功概率都近乎为零,三四人均分更是三个和尚没水吃。 必须有权威:两人对半要先回答:争执不下时听谁的。 素材来源:雷军创业公开课口述整理 ## 合伙人:先分梦想,再分股份(股权与合伙人) URL: https://xueai.miyang.cn/slides/lei-11.html 合伙人:先分梦想,再分股份 股份的分配是相对的,不是绝对的:公司做到十亿美金,1% 就是一千万美元。所以找 co-founder 的顺序不能反:先 share 梦想,他不 buy in,给他 100% 也没用;然后才是角色、贡献和分饼;最后把最难开口的事谈完:锁定四年,退出机制。 股份锁定四年、退出机制提前谈;换合伙人的概率高达三分之一 如果公司做成,作为 co-founder 拿多少都是很多钱。公司做到十亿美金,1% 就是一千万美元;不小心办成腾讯那样,1% 是多少?所以谈判桌上真正的问题,是对面这个人信不信你们能一起干成一件伟大的事,「我拿 20 还是 25」排在这之后。他要不信,你给他 100% 又有什么用呢? 雷军找六个 partner 的谈法,可以整理成五步。点「下一步」,把一场合伙人谈判从头走到尾。 同样是小米的 co-founder,谈判的样子可以完全不同。共同点只有一个:让对方有足够的拥有感:他们是公司的主人,不是被雇来的 key person。 黎万强 · 十年同事的信任 金山词霸事业部总经理,离职后说要去做商业摄影。雷军说「你别瞎扯了,我准备创业,你来跟我干」。他猜出雷军要干手机,就来了,不知道拿多少工资、多少股份。因为十年同事,「我相信他相信我的这种判断」。 林斌 · 一个无法拒绝的条件 认识两年,交流了很多次,不是一次两次。对方工作很好,来创业几乎一分钱工资没有。雷军琢磨了好久:「我要拿林斌来创业,而且要干一辈子,我怎么开个价让他理解我的真心真意,让他无法拒绝?」条件开出去,他接受了。 讨论好几轮也很重要:讨论的过程就是每个人在对表。但要注意那些很微妙的东西,千万不要因为讨论伤了感情,伤了感情再合作就很困难了。这比一般的生意复杂,你要时刻注意对面这个人的感受。 雷军参与创办二十多家公司后给所有人的建议:co-founder 的股份锁定四年,干不满四年就没有。「创业者的股份是一辈子的,公司真做成百年基业那是一百年的事情,你不在乎这四年。」 没锁定的代价:银行行长 CFO 一家三五个人的创业公司请一位大银行支行行长做 CFO,分了 10% 的股份。雷军问能不能谈四年锁定,对方说「跟朋友谈这个条件,太不仗义了」。半年后不合适,行长要离职,10% 的股份不退,最后花一大笔钱才买回来。雷军对那位创业者说:如果你的梦想是 one billion 的,今天无论什么价买回都是便宜的。万一拖到融了 A 轮、B 轮,那就是天文数字。 同一个合伙人,在不同时间点离开,股份怎么处理?点击时间点,看有锁定和没锁定的差别。 干满半年离开 干满三年半离开 干满四年 没设锁定,半年就散 退股一定不是愉快的过程:人家干得好好的,半年后要出局。雷军的谈法有三个要点。 先统一价值观 最重要的是统一语言:我们在干一件什么样的事,用什么逻辑去干。有了这套「公理系统」,讨论就容易,真正扯皮的地方很少。这套逻辑必须对所有人有效:他出去再办新公司,也得遵守同一套。 股份对应未来的贡献 给你 10% 或 20% 的股份,是基于你未来三年、五年、十年对公司的贡献,不是你掏几万块跟我一起注册了公司。今天的创业是靠智慧创业的。你只干了半年,我还得再找一个人来拼这块图,他的股份从哪来?你不让出来,怎么给? 请外人传话 有经验的 angel investor 不带感情,讲的就是整个创业市场的公理系统。让他出面说「这是我的要求」,比创始人自己开口好谈得多,因为这在逻辑上是讲得通的,想创业的人都明白这个道理。 在雷军投过的公司里,合伙人合不来、换过 co-founder 的概率大约有三分之一。这个概率不算低。所以退出机制不是「万一」的预案,是大概率要用上的条款。亲兄弟明算账,创业之前一定要把退出机制谈好。碍于面子不谈,最后真正伤害的是你的事业。 一人公司照样有合伙问题,只是换了名字:合作分成。和朋友合做一个 AI 产品、和设计师约定「上线后收入三七开」、和博主谈联合推广,这些都是 co-founder 问题的缩小版。 同样有三分之一左右会散伙。散伙前没谈退出的,散伙时全靠撕。 把雷军的做法按比例缩小:开工前用一页纸写清三件事。 退出折算:做到一半退出,已完成的部分怎么折算。 成果归属:代码、素材、账号归谁。 分成规则:从哪一刻开始计、干满整个周期才拿满,这就是你的「四年锁定」,只不过周期可能是六个月。 真到要散的时候,找一个双方都服的第三方来传话,别自己红着脸谈。这页纸在关系最好的时候写,才写得下去。 顺序不能反:先 share 梦想,揭示足够的风险(否则就是忽悠)。 再谈角色贡献和分饼:最后对期望值,「一对就差不多了」。 所有 co-founder 股份锁定四年:退出机制创业之前谈好,亲兄弟明算账。 丑话说在最前面:开不了口的那个条款,往往就是日后最贵的那个坑。 素材来源:雷军创业公开课口述整理 ## 现金流与报酬包(经营基本功) URL: https://xueai.miyang.cn/slides/lei-12.html 现金流与报酬包 对早期创业公司来说,最重要的数字是账上还有多少现金:假如没有任何收入,你能活多少个月?这是创业公司每天都要想的问题。这一节讲雷军的三笔账:现金跑道、现金流,和给最优秀的人算的那笔「报酬包」。 没有收入你能活几个月;工资股票自选的 package 制度让报酬不再攀比 「假如没有任何收入,你能活多少个月?」最安全的说法是要活十八个月,但其实做不到。雷军的现实版标准:你要想说我没有任何收入,能不能活一年?能活一年,已经很了不起了。 拖动两个滑块,输入你账上的现金和每月支出,看你的跑道有多长,以及雷军会怎么判断。 营业额很高,照样完蛋 完全不担心钱的公司,担心的是 cash flow:今天进来多少钱、出去多少钱,到月底是挣的还是负的。有应收、有应付、有在建工程:你做了很高的营业额,结果客户都没给你钱,全是应收款,最后账全黄了,其实你还是没有。要盯的是钱有没有真正进来。 老板都是孙子,技术大拿才是爷 怎么跟最优秀的人谈?雷军的诀窍很简单:如果这个人真是你要找的人,只有一个原则:以搞定为原则,不能算「我公司账上有多少钱、我怎么才雇得起」。高科技公司里人才最重要,「老板都是孙子,这些技术大拿才是爷。当不好孙子的老板,都不是好老板。」 创办小米时,雷军给每个 key person 出了一道选择题:工资和股票是一个 package,不能全要。假设你拿到 offer,选一档试试。 A · 100% 工资 B · 2/3 工资 C · 1/3 或不要工资 为什么这套办法有效:在金山,工资、股票、奖金三样都给,总数跟同行比绝对不少,但每个员工都不 happy。在小米,报酬是自己选的。选了,就不存在攀比,「你的工资高我的工资低、你的股份多我的股份少」这些话没有了。这是雷军自认创办小米时跟过去最大的一次创新。 一人公司更要盯现金跑道,因为没有人会替你融资。辞职做独立开发之前,先算「存款 ÷ 月开销」,这就是你的账上现金和 burn rate。 低于 12 个月,别裸辞,用下班时间先把产品跑起来。雷军说创业公司能活一年已经很了不起,你的容错只会更少。 应收款的坑对个体户同样成立:接企业单常见 45 到 90 天账期,「这月赚了三万」和「这月到账三万」是两回事。 把账期折进报价,或者要求预付一部分,盯的是钱有没有真正进来。 给自己设一个报酬包:每月固定接多少活当「工资」保底,剩下的时间全部押给自己的产品当「股票」。 比例自己定,选完就别抱怨:三七也好五五也好,关键是像小米员工一样是你自己选的,别再抱怨接活占了做产品的时间。 每天都要想的问题:没有收入能活几个月?能活一年已经很了不起。 有规模后看现金流:应收款不是钱,进了账的才是。 找最优秀的人以搞定为原则:不能算「我账上有多少钱、怎么才雇得起」。 报酬是选出来的:工资股票打成 package 让他自己选,因为是自己选的,所以不抱怨、不攀比。 素材来源:雷军创业公开课口述整理 ## 写给 AI 时代的一人公司(专题收官) URL: https://xueai.miyang.cn/slides/lei-final.html 写给 AI 时代的一人公司 22 段口述讲完了。雷军讲的是办公司,但 AI 时代一个人就是一家公司:你自己是 CEO,也是那个技术大拿;你的存款是账上现金,你的时间是 100% 的股份。收官这节把 12 节课摊成一张全景图,再把它变成一份属于 OPC(One Person Company)的自查清单和行动清单。 22 段口述的全景回顾,映射成 OPC 创业自查清单:方向、口碑、现金、股权 回头看,这门课其实是按一家公司的生命顺序讲的:先修人,再选路,然后做产品、找钱、分股份,最后守住经营的基本盘。 自我修养 方向起点 产品口碑 找钱融资 股权合伙 经营基本功 点击任意一节,弹出这节课最值得带走的那句话;再点标题可以回看整节课。 把雷军的观点翻译到一个人的公司上,是这 12 条。诚实地勾:勾的是「已经做到」,不是「打算做到」。评语会跟着变。 🧭方向 我做的市场足够大,天花板不是第一天就看得见(Go Big Market) 我在做自己懂、也真心喜欢的事,扛得住四年没有掌声 我能用一句话说清我的生意,说完对方能复述 📱产品 我只专注做一款产品,没有同时铺三个摊子 我抠过产品细节,抠到把自己逼疯的程度 我清楚用户的预期在哪,并且交付超出预期,口碑就是这么来的 💰钱 我算过现金跑道:没有任何收入,我知道自己能活几个月 我分得清「收入」和「到账的钱」,应收款不算数 我在持续积累信用:按时交付、说到做到,信用是找钱的全部前提 🧩合伙 手上每一个合作分成,都在开工前谈好了退出机制(亲兄弟明算账) 分成比例对得上真实贡献,没有碍于面子的均分 每个合作里「争执不下时听谁的」都有明确答案 算一次跑道 打开记账软件,算出「存款 ÷ 月开销」,把那个月数写在便签上贴到屏幕边。低于 12,这个数字就是你接下来所有决策的第一约束。 写一句话生意 用一句话说清你在做什么、卖给谁、凭什么是你,发给三个朋友。有人复述不出来,就改到能复述为止。说不清的生意,也融不到钱。 补一段退出条款 翻出手上任何一个正在进行的合作(外包、分成、联合开发),补一页纸:中途退出怎么折算、成果归谁、分成从哪天起算。趁关系好的时候写。 AI 改变的是一个人能干多少活,没改变生意的逻辑。方向要大、产品要极致、现金要盯着、合伙要谈清。雷军这些话说给几十人的创业公司,也一字不差地适用于一个人的公司。工具越强,基本功越值钱;剩下的,交给专注、极致、口碑、快。 素材来源:雷军创业公开课口述整理 ## 测一测你的 AI 创业成功率(专题收官) URL: https://xueai.miyang.cn/slides/lei-test.html 测一测你的 AI 创业成功率 13 节课讲完了,现在轮到你。12 道题,全部来自前面课程里雷军的核心判断:心态、方向、产品、现金、合伙、AI 杠杆。凭直觉选,别猜「标准答案」,测的是你现在真实的样子。 12 道题综合全篇章的核心判断,算出成功率、六维雷达画像和回炉处方 你的 AI 创业,成功率有多少? 雷军说 90% 以上的创业公司都会死,所以这个测试的满分只有 66%:剩下那 34%,他管它叫「罕见的运气」。答完 12 题,看看你把可控的部分做到了几成。 * 满分 66%:可控的部分给你打分,剩下 34% 是雷军说的「罕见的运气」。 这个分数不是命运,是清单。雷军 40 岁创办小米之前,在金山打了 16 年「用逻辑没办法解释你为什么能赢」的仗。分数低说明可控项还没做完,一项一项补就是了。创业需要信仰,但保命靠的是清醒。 素材来源:雷军创业公开课口述整理 · 题目综合本篇章 13 节课的核心观点