<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>CycleUser</title><link href="https://blog.cycleuser.org/" rel="alternate"/><link href="https://blog.cycleuser.org/feeds/all.atom.xml" rel="self"/><id>https://blog.cycleuser.org/</id><updated>2026-10-03T12:00:00+08:00</updated><entry><title>「对人不对事」是大学生听讲座提高学习效率的必备智慧</title><link href="https://blog.cycleuser.org/dui-ren-bu-dui-shi-shi-da-xue-sheng-ting-jiang-zuo-ti-gao-xue-xi-xiao-lu-de-bi-bei-zhi-hui.html" rel="alternate"/><published>2026-10-03T12:00:00+08:00</published><updated>2026-10-03T12:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-10-03:/dui-ren-bu-dui-shi-shi-da-xue-sheng-ting-jiang-zuo-ti-gao-xue-xi-xiao-lu-de-bi-bei-zhi-hui.html</id><summary type="html">&lt;h1&gt;「对人不对事」是大学生听讲座提高学习效率的必备智慧&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;前几日做了一个梦，梦见自己仍在上学，被请去听一场「自愿」参加的 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1&gt;「对人不对事」是大学生听讲座提高学习效率的必备智慧&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;前几日做了一个梦，梦见自己仍在上学，被请去听一场「自愿」参加的讲座。醒来以后想了想，大学里这样的场合其实不少。既然去了，不如把台上那一位看得清楚些——这本身，也是一门功课。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;梦里被「自愿」了一回&lt;/h2&gt;
&lt;p&gt;梦里我还是学生的时候，收到一份通知，说是请大家自愿参加某场讲座，只在末尾轻轻地叮嘱了一句，尽量不要缺席。话说得其实很客气。&lt;/p&gt;
&lt;p&gt;到了地方才知道，未必是哪位名师的高论，而是外面一家机构来做宣讲，大约是考研或者四六级辅导之类，只是被安了一个讲座的名头。&lt;/p&gt;
&lt;p&gt;台上那一位讲得还不坏。只是梦里既已这般「自愿」地来了，心里总有些许不自在，听着听着，便容易多想一些。&lt;/p&gt;
&lt;h2&gt;对人不对事&lt;/h2&gt;
&lt;p&gt;我这里有一个还算不错的习惯，姑且称之为「对人不对事」。但凡一件事让我认真起来，我第一件想弄明白的，往往不是这件事本身如何，而是背后究竟是谁将它促成如此。这习惯大约从念书时便养下了，至今未改。&lt;/p&gt;
&lt;p&gt;所以梦里既已被那样客气地请到座位上，我便索性把台上那一位讲座之人的情况利用搜索引擎详细了解了一遍：他身后是家怎样的机构，注册情形如何，各类公开信息里逐一看来；他出自哪一所学校，学的什么，师承何人，毕业论文与刊发的文章又都写了些什么；那些文章里的数据与图表可还端正，有没有人为修整过的分布，有没有数据误用、图片误用；如此之余，也顺带看看那家机构在宣传时的措辞可有越界，别处可有不合规矩的地方。凡此种种，都一一安静记下；再出于一份关心，转呈相关监管部门留意。&lt;/p&gt;
&lt;p&gt;这些事，我在梦里做得格外顺手，因为平日里本就喜欢如此。数据到了手中，总忍不住要分析、要画成图，看看这一堆数字背后，是不是还藏着些别的。至于查重，或是查看图表里的重复与裁剪，也都算不得难事。&lt;/p&gt;
&lt;h2&gt;醒来才想起来，我已经毕业了&lt;/h2&gt;
&lt;p&gt;后来便醒了。&lt;/p&gt;
&lt;p&gt;醒来想的第一件事，是自己早已毕业，再不必被人那样客气地请去，听一场以讲座为名的宣讲了。念及此处，竟还有几分轻松。&lt;/p&gt;
&lt;p&gt;静了一会儿，又觉得，纵然是真心情愿去的，似乎也不该听过便走。&lt;/p&gt;
&lt;h2&gt;去了，就得记住讲的人是谁&lt;/h2&gt;
&lt;p&gt;我的建议是：讲座也好，活动也好，既去了，总该记下这一回讲的人是谁。&lt;/p&gt;
&lt;p&gt;倒不是非要去替人家查文章，把一个人的论文都翻检一遍，连「图片误用」「数据误用」也一并看过，再顺带把他门下师友都了解一圈——这般成人之美的事，愿意做自然好，却也不必时时都做，更不是非做不可的。&lt;/p&gt;
&lt;p&gt;要紧的是，总得知道，这一回自己见到的人是谁。&lt;/p&gt;
&lt;p&gt;万一人家确有建树，可学之处不少，那便该设法留一个联系方式，平日里多留意人家的学问。这对我们自己，是只有益处、没有坏处的。&lt;/p&gt;
&lt;p&gt;就像耿同学那样，这本是再寻常不过的事。&lt;/p&gt;
&lt;h2&gt;江湖上的人，都经得起风吹雨打&lt;/h2&gt;
&lt;p&gt;换一个角度想，能在世间行走的人，总要经得起一些风雨。&lt;/p&gt;
&lt;p&gt;做学问的人，多少都有一份修为。内里的功夫与外面的体面，大约都还过得去。若连旁人了解一下他、读一读他的文章这种事也经不起，那又何以出来见人。&lt;/p&gt;
&lt;p&gt;所以，多与人学，去了解人家在做什么学问，原是一门必备的功课。&lt;/p&gt;
&lt;h2&gt;大学里，有机会就多听讲座&lt;/h2&gt;
&lt;p&gt;到了大学，有机会便多去听讲座。纵使无人强迫你必须「自愿」去，你其实也可以自己去。&lt;/p&gt;
&lt;p&gt;去了之后，把讲的人了解清楚，把他的文章收拾齐整，做成一座小小的知识库，请 AI 细细分析一番，这些都可以做，甚至也都应当做。不为别的，只为把这个人看得明白些，看看有没有值得学的地方。&lt;/p&gt;
&lt;p&gt;记得当年某位沈姓学者的讲座上，我曾问过一个问题：若以石笋中的纹层计数为参照来理解「年」这一时间概念，那么以生物周期所作的记载，是否会受到地质历史时期行星绕日周期变化的影响，从而难以与同位素测年严格对应。他当时说未曾想过这一点，然后表示记下了，但并未作答；文章刊出时，也未曾提及帝都讲座上对他提问的人，更未有一句致谢。&lt;/p&gt;
&lt;p&gt;总之，愿各位都能把大学生活，过得充实一些。&lt;/p&gt;</content><category term="Story"/><category term="大学"/><category term="讲座"/><category term="学习"/><category term="学术"/><category term="随笔"/></entry><entry><title>大模型已成日常刚需：当在线服务存在不稳定性，我们或许该考虑本地部署的时机、路线与成本</title><link href="https://blog.cycleuser.org/local-llm-deployment.html" rel="alternate"/><published>2026-10-03T10:00:00+08:00</published><updated>2026-10-03T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-10-03:/local-llm-deployment.html</id><summary type="html">&lt;p&gt;当做地球科学的同学也开始关心模型的价格，大概说明大模型已经成了很多人日常工作的一部分。而这段时间在线服务 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;当做地球科学的同学也开始关心模型的价格，大概说明大模型已经成了很多人日常工作的一部分。而这段时间在线服务接连中断的报道说明，这种依赖的可用性并不掌握在自己手里。这篇以我这段时间重度使用的Qwen3.8-Flash-Next为例，聊一下本地部署的两条代表性的路线，以及当前的大致成本。&lt;/p&gt;
&lt;h2&gt;大模型正在成为越来越多人的日常刚需&lt;/h2&gt;
&lt;p&gt;前些天有一位大学时期的同学问我，最近用模型是不是成本挺高的，他感觉有一段时间以来，几家在线服务商好像都涨价了。&lt;/p&gt;
&lt;p&gt;这位同学是做地球科学研究的，日常工作跟数据科学关系不大。连他这样背景的人，都开始关注模型的价格了，这大概能说明一个趋势：很多人的日常工作和生活已经离不开大模型了。大模型成了很多人的常用工具，某种程度上已经成了类似基础设施的东西。很多人已经习惯了它，甚至没法想象没有它的日子——就像很多人习惯了微信和支付宝这样的在线支付一样，一旦深度绑定，再想抽身就不那么容易了。&lt;/p&gt;
&lt;p&gt;既然习惯到了这种程度，那么有一个问题就值得想一想：如果有一天离开了在线服务，我们是不是就什么都做不了了？打个比方，现在的经济活动很依赖在线支付，要是没有了在线支付，很多东西都会受影响；同样地，要是没有了在线大模型，或者在线大模型涨价了、服务不稳定了，我们该怎么办？&lt;/p&gt;
&lt;h2&gt;在线大模型的可用性与价格，都不掌握在自己手里&lt;/h2&gt;
&lt;p&gt;要回答这个问题，先得看看在线大模型是不是真的存在不稳定和涨价的情况。答案是，这方面的公开报道并不少，而且不是哪一家的问题。&lt;/p&gt;
&lt;p&gt;先看时间线。2026 年 3 月底，DeepSeek 在 3 月 29 日晚出现一次持续约 12 小时的宕机，3 月 31 日下午又一次中断约 1 小时 [1][2][3]；当时抖音豆包公开评价说，DeepSeek 的频繁故障是「爆发式增长下的必经阶段」，并且自己也承认，大模型推理对算力消耗巨大、硬件供应链紧张制约了扩容速度 [4]。这段话从同行的角度，说出了行业共同的处境。4 月，Anthropic 旗下的 Claude 在半个月内出现了 7 次服务中断，4 月 16 日那次故障前后持续近 3 小时，高峰期有超过 6000 名用户同时提交报错；按照官方状态页的数据，截至 4 月 8 日的 90 天里，Claude API 的正常运行率只有 98.95%，明显低于企业级标准的 99.99% [5]。到了 7 月 25 日，轮到 OpenAI：ChatGPT、API、Codex 全线瘫痪，故障持续超过 8 个小时，没有任何预警，官方状态页只确认错误率升高、不给恢复时间 [6]；钛媒体的统计说，OpenAI 每一年都会发生重大事故，但从未公开披露过根本原因 [6]。9 月 3 日则是规模更大的一次：ChatGPT、Claude、Grok 在相同时段集体宕机，持续约 3 小时 40 分，谷歌 Gemini 和微软 Copilot 也收到大量中断报告，AI 编程工具 Cursor 因为依赖这三家的接口被一并波及 [7][6]。再看同年 5 月 DeepSeek 的情况，也就是开头同学提问时我查证的那批报道：5 月 8 日新版本上线流量激增，网页端和 API 整体停摆了几个小时；5 月 24 日大规模宕机，官方状态页红色告警持续一整夜，抢修了十几个小时 [8]；5 月 28 日上午 10 点 21 分网页和 API 同时不可用，10 点 50 分恢复，前后约 29 分钟，是当月第五次、年内第 18 次性能异常 [9][10][11]。&lt;/p&gt;
&lt;p&gt;把这些报道汇总成一张表，各个平台的记录大致如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;时间&lt;/th&gt;
&lt;th&gt;服务方&lt;/th&gt;
&lt;th&gt;事件&lt;/th&gt;
&lt;th&gt;影响与持续&lt;/th&gt;
&lt;th&gt;出处&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-01 至 04-16&lt;/td&gt;
&lt;td&gt;Anthropic（Claude / Claude Code / API）&lt;/td&gt;
&lt;td&gt;半个月 7 次中断；16 日故障近 3 小时，6000+ 用户报错&lt;/td&gt;
&lt;td&gt;90 天正常运行率 98.95%，低于 99.99% 的企业标准&lt;/td&gt;
&lt;td&gt;[2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-03-29 至 03-31&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;29 日晚宕机约 12 小时；31 日午后再度中断约 1 小时&lt;/td&gt;
&lt;td&gt;两日两次，网页与 API 均受影响&lt;/td&gt;
&lt;td&gt;[12][3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-05-08&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;新版上线流量激增，网页与 API 全线停摆&lt;/td&gt;
&lt;td&gt;数小时&lt;/td&gt;
&lt;td&gt;[9]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-05-24&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;大规模宕机，网页端与 App 全部无法访问&lt;/td&gt;
&lt;td&gt;约 13 小时&lt;/td&gt;
&lt;td&gt;[8]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-05-28&lt;/td&gt;
&lt;td&gt;DeepSeek&lt;/td&gt;
&lt;td&gt;网页与 API 同时不可用，提示「服务器繁忙」&lt;/td&gt;
&lt;td&gt;约 29 分钟；年内第 18 次异常&lt;/td&gt;
&lt;td&gt;[9][10][11]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-07-25&lt;/td&gt;
&lt;td&gt;OpenAI（ChatGPT / API / Codex / Sora）&lt;/td&gt;
&lt;td&gt;全球性宕机，全线瘫痪，无预警&lt;/td&gt;
&lt;td&gt;超过 8 小时，覆盖北美、欧洲、亚洲主要市场&lt;/td&gt;
&lt;td&gt;[6]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-09-03&lt;/td&gt;
&lt;td&gt;OpenAI / Anthropic / xAI&lt;/td&gt;
&lt;td&gt;集体宕机，Gemini、Copilot 收到大量中断报告，Cursor 被波及&lt;/td&gt;
&lt;td&gt;约 3 小时 40 分&lt;/td&gt;
&lt;td&gt;[7][6][13]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这份时间线里有两个细节，比表中任何单独一次故障本身更值得琢磨。一是 9 月 3 日的集体中断：ChatGPT、Claude、Grok 三家在同一个时段一起出问题，不是巧合——业内人士的分析指向微软 Azure、Cloudflare 这类多家大模型公司共享的云算力基础设施 [7]。也就是说，各家在线大模型虽然彼此是竞争关系，底层却可能建在同一批云设施上；故障的时候可能会一起故障，用户想靠「换一家服务」来避开，未必躲得开。二是 3 月底豆包的那次表态：当 DeepSeek 因频繁故障受到批评时，抖音豆包公开说这是「爆发式增长下的必经阶段」，并且自己也承认，大模型推理对算力消耗巨大、硬件供应链紧张制约了扩容速度 [4]。竞争对手承认整个行业都在面对同样的算力缺口，这比任何局外人的批评都更能说明问题。&lt;/p&gt;
&lt;p&gt;至于涨价，同学的感觉也不是错觉：免费的服务在收紧、付费的额度在变贵，而且这背后有一层更硬的逻辑。时代周报引用的数据显示，2026 年 5 月中旬那一周，全球大模型总调用量攀升到 28.9 万亿 token，其中中国大模型占 9.22 万亿、环比增长接近 20%；与互联网产品「边际成本趋近于零」的经典模式不同，大模型每一次对话都要消耗实实在在的算力，用户越活跃，成本越刚性 [11]。业内因此有一个共识：单纯靠免费获客的 C 端模式很难持久 [11]——涨价与服务收紧，大概就是这个判断在现实中的样子。&lt;/p&gt;
&lt;p&gt;我自己前几天也遇到一次突然中断，正好是在工作过程中，手上正在进行的步骤就停在那里，只能等。原因方面，业内人士的分析是，用户规模增长过快，服务器算力扩张难以匹配激增的流量需求 [14]，这个缺口恐怕短期内补不上。&lt;/p&gt;
&lt;p&gt;这些事实摆在一起，结论就比较清楚了：在线大模型的可用性与价格，两样都不掌握在自己手里。所以大概从两三周前开始，我做事的时候基本都以本地大模型为主了。&lt;/p&gt;
&lt;h2&gt;千问 3.8 Flash Next 的规格：125B 参数、全量权重需要上百 G 显存&lt;/h2&gt;
&lt;p&gt;我用的是千问 3.8 Flash Next（Qwen3.8-Flash-Next），先介绍一下这个模型大概是什么规格。&lt;/p&gt;
&lt;p&gt;它是一个 125B 参数的模型，也就是总参数量一千二百五十亿（模型主页见文末 [15]）。不过它不是稠密模型，而是混合专家（mixture of experts，MoE）模型：模型里有 24576 个专家网络，模型每处理一个词元（token），只从这里面选择激活 10 个专家参与计算 [2]。这个机制对部署的意义在于，虽然全部权重都要驻留在存储里，但每次推理实际参与的参数只有一小部分，计算的开销主要由被激活的那部分专家决定。&lt;/p&gt;
&lt;p&gt;对本地部署来说，关键数字是显存需求。这个模型如果按 16 位精度存放，权重就需要大约 250GB 显存；按 8 位是大约 125GB；按常见的 4 位量化，也要大约 62GB——再加上上下文占用的键值缓存，一张普通的 24G 显卡无论怎么样都放不下整个模型，必须想办法把权重分散到显存、内存、磁盘这些不同的存储层级里去。&lt;/p&gt;
&lt;h2&gt;两条路线：一台高性能机器跑多个模型，或多台设备合跑一个模型&lt;/h2&gt;
&lt;p&gt;要把这样的模型在本地跑起来，现在有两个比较有代表性的方向。&lt;/p&gt;
&lt;p&gt;第一个方向，是把一台机器上的显存和统一内存尽量全部利用起来，分给几个大模型同时运行。这一类里 Halogen 是个典型：它由 Peonist 开发，专门为某一款统一内存芯片平台编写，每个 kernel 都只为这一块 GPU 和一个模型家族优化，不追求通用，也没有回退路径 [12]。这类平台的特点是统一内存大，某些配置可以达到 128GB [12]，Halogen 把这部分尽量利用起来，本地就可以同时放置多个模型。适合的场景大概是：存储、内存、显存都不紧张，同时对速度或者并行有一定要求。&lt;/p&gt;
&lt;p&gt;第二个方向，是把所有可以使用的设备放到一起，运行一个模型。Strata 是这一类里的代表：开源，MIT 许可，底层使用 llama.cpp / ggml 那一套 [2]。具体说，它把最常用的专家放在显卡显存里，全部专家放在系统内存里，处理器同时计算其余部分，SSD 上再放一张大的查找表 [2]。这样一来，显存的缺口就由内存来补。仓库的实测机器是一张 12G 显存的显卡加 64GB 内存 [2]；对内存的要求写得很明白：最少 32GB 也能跑，但只能装下砍掉一半专家的 Coder 专用版，64GB 才能把所有尺寸都跑全 [2]。要是有两三张卡，还可以一起分担同一个模型 [2]。&lt;/p&gt;
&lt;p&gt;这两个方向并不冲突，往后看，大概也会是本地部署的两个主流方向。&lt;/p&gt;
&lt;p&gt;前者是机器规格高，同时运行几个模型；后者是设备比较分散，合起来运行一个大的。&lt;/p&gt;
&lt;p&gt;选哪一种，主要看你手头的硬件和要处理的事情。&lt;/p&gt;
&lt;h2&gt;12G 显存加 64GB 内存的实测速度：这个配置已经能够流畅运行&lt;/h2&gt;
&lt;p&gt;第二个方向，现在已经可以在具体设备上运行了。&lt;/p&gt;
&lt;p&gt;12G 以上显存的设备，用 Strata 就可以流畅运行千问 3.8 Flash Next。Strata 项目上实测的是一张 12G 显存的显卡加 64GB 内存的机器，在 Q2_0 量化下可以达到 94 tokens/s [4]；24G 显存的显卡大约 100 到 140 tokens/s [2]。作为参照，我前几篇实测文章里那些跑本地模型的机器，日常对话能稳定用的一般在十几到二十几个 tokens/s；这个速度已经明显高出一截，日常对话、工具调用这类场景完全够用，跟不少在线服务比也不处于下风。&lt;/p&gt;
&lt;p&gt;这里显存和内存要配合着看：12G 显存只是下限，权重里放不进显存的那部分靠内存装着，所以想把这个尺寸跑全，内存应当以 64GB 为宜——仓库对硬件要求的原话是「64GB 运行所有尺寸」，32GB 只能装下砍掉一半专家的 Coder 版 [4]。&lt;/p&gt;
&lt;p&gt;再往后，8G 显存的设备应该也可以运行对应的 MoE 模型，比如 35B-A3B 这种：总参数量 35B，每个词元（token）只激活约 3B 的参数，4 位量化下权重约 20GB [4]，其中放不进 8G 显存的部分要靠内存装着，所以内存同样不能省，参照上面 12G 显存配 64GB 内存的比例，8G 显存的机器至少应当 32GB 起步、最好也是 64GB——这一条是按 Strata「内存多少决定能装哪个尺寸」的规则推的，它文档里没有直接写 8G 的组合，真要上手就以实际测试为准。
MoE 在这种场合其实正好帮了本地部署的忙：每次前向计算只激活少数专家，推理时需要读取的参数量比同等总参数的稠密模型低，几台设备合在一起运行，速度反而可能有所提高。&lt;/p&gt;
&lt;h2&gt;本地模型的合理定位：工具调用、信息检索与代码翻译&lt;/h2&gt;
&lt;p&gt;本地大模型的能力，未必有在线旗舰模型那么强，不过这更多是定位的问题。&lt;/p&gt;
&lt;p&gt;对于能力有限的模型，比较推荐的用法是：让人掌握方向，让模型执行细节。把需求分析、方案设计这类决定成败的环节留在人这一侧；交给模型的工作，则尽量是边界清楚、步骤明确的任务——工具调用、信息检索，以及代码翻译：思路由人讲清楚，每一步怎么做由人交代明白，模型照着写出来。&lt;/p&gt;
&lt;p&gt;这种分工的好处有两个。一是模型的能力要求降低了，本地模型够用；二是过程可控——模型没有被要求去推测需求、做设计，它自行发挥的空间被压到了最小，产出的不确定性也就随之降低。用能力较弱的模型做事，关键就是不让它失控：不要让它猜，而让它照做。&lt;/p&gt;
&lt;p&gt;反过来，如果让本地模型自己去推测需求、设计架构，那它确实还有明显差距。这不是本地模型的独有问题，能力越强的模型在这种失控模式下不确定性越大；只是在本地模型这里，更应当从一开始就避开这种用法。&lt;/p&gt;
&lt;h2&gt;从 kiwix 的离线归档习惯说起：本地部署是一份备份&lt;/h2&gt;
&lt;p&gt;这个习惯可以交代一下来历。开头提到的那位同学是学地球科学的，我也是——我读的博士就是地球科学方向。做这一行经常要出野外，一进山区可能就没有信号了，如果路线深入，甚至要到没有网络覆盖的无人区。但野外的很多时候又需要查资料、查文档：地层划分的规范、岩石矿物的鉴定特征、前人的区域地质报告，这些都不会因为你进了无人区就不再需要。所以很早就接触到了 kiwix 以及它对应的 ZIM 格式——一种把整个网站打包成单文件、可以完全离线检索的归档格式，维基百科、 Stack Exchange、不少文档站都有现成的 ZIM 包可以下载。硬盘里存了一批离线维基和文档，到现在还保持这个习惯。&lt;/p&gt;
&lt;p&gt;平时这些归档可能看不出什么用处，等到需要断开网络、或者无法访问外部服务的时候，就知道有用了。&lt;/p&gt;
&lt;p&gt;大模型大概也是类似的情况。习惯了有问题就问模型的人，如果某一天网络中断、服务关闭或者账号出了问题，再想做事就缺少了一个环节。在本地部署一个大模型，相当于给自己的工作方式留一个备用的选项：能力未必是最好的，但是它随时都在。对野外或者没有网络的环境来说，这一份「随时都在」可能不只是备用，而是唯一能用的那份。&lt;/p&gt;
&lt;h2&gt;成本估算：一万出头有机会起步，常见的组合在两万上下，几万的也有对应选项&lt;/h2&gt;
&lt;p&gt;新的本地推理框架逐渐流行之后，把有一定能力的大模型在本地流畅运行，成本门槛比过去低了不少。但具体要花多少钱，得按路线分开算，而且得按现在的行情算——这一轮硬件的价格一直在往上走。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;统一内存小主机&lt;/strong&gt;：这是走 Halogen 路线最直接的一台整机，CPU 与 GPU 共享一块 128GB 的统一内存，不需要再单独配显卡 [16]。价格方面，以搭载 128GB 统一内存的整机来算是，媒体评测期在 1.5 万元上下，现在普遍涨到 2 万元左右，部分机型到 2.6 万 [17]；入门的 64G 内存版本，行情价也从前一年的 1.07 万元左右涨到了 1.5 万元上下，一年涨了 4300 元 [18]。不过对跑本文讨论的这类 125B 模型来说，64G 内存装不下 4 位量化后的全部权重（约 62GB），真正可用的是 128GB 内存的版本 [4]——所以说现在这类小主机的实际入手价位就是两万上下：比之前涨了近一倍，但按它承载的能力算，还可以接受。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CUDA 生态的统一内存个人工作站&lt;/strong&gt;：统一内存同为 128GB。英国创世版官价已从 3999 美元上调到 4699 美元，国内整机从「3 万出头」涨到了接近 4 万 [17]。单机跑大模型的论坛评价并不高——带宽偏低、单机偏弱，它的设计用法本来就是几台互联组一个小集群。它的价值要按集群来算账：本地跑 DeepSeek 上一代的 V4 Flash（总参 284B），两台 128GB 机器合计 256GB 统一内存正好装下权重 [19]；而今年 9 月开源的 V4.1 Flash 尺寸翻上去了，总参 748B、开源权重实测约 510GB，其中 MoE 与主模型权重约 306GB 必须驻留在内存里、另有约 204GB 的 Engram 知识权重可以下沉到 SSD [19]。按每台 128GB、扣除约 20 多 GB 的系统与框架开销来算，两台合计约 230GB 余量，装不下这 306GB 的核心权重；三台合计 384GB，扣掉开销后约 360GB，装下核心权重还有约 54GB 留给长上下文与多会话——所以跑 V4.1 Flash 要三台起，单条生成 40 到 60 tokens/s、prefill 2500 到 3000 tokens/s [19]。买台数按「将来想跑到哪一代」来定：两台这一档对应的是 V4 Flash，三台对应 V4.1 Flash，而这类工作站官方支持四台互联，这个规模内互联效率不打折扣 [19]。但是成本实在是太高了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;24G 或 32G 显存的显卡 + DDR4 ECC 服务器平台 + 拆机大内存&lt;/strong&gt;：这是 Strata 支持、走「多台设备合跑一个模型」路线里性价比比较突出的组合 [4]。显卡一侧，24G 显存这一档可选面比较广，预算充裕一些可以上 32G 显存的高端卡 [20]。以 24G 这一档为例，二手价在我 9 月初写显卡行情那篇时查到的是 4800 到 6400 元、典型 5000 到 5600 元 [20]；最近这轮行情上来之后，成色好的二手普遍涨到了八九千。32G 显存这一档的价格也在同一条曲线上：上个月还是 1.1 万出头，现在已经报到了 1.4 万左右 [20]——也就是选 32G 这一步的溢价本身，一个月内就抬高了约三千元。内存与平台一侧，不买全新 DDR5：一是贵，二是有带宽上的顾虑——DDR4 的频率原本就低于 DDR5，而本文这类 MoE 推理恰恰是访存受限的负载（前文算过 8G 显存也要靠内存装专家，生成速度基本由内存带宽决定），消费级主板常见的双通道四条内存对这种负载可能就不够了，往往要上四通道甚至八通道才能把带宽喂足；而多通道、大内存、带纠错，这些恰好就是服务器平台的属性。所以用 DDR4 ECC 服务器平台（带纠错内存的服务器主板）加拆机的 ECC 内存条便宜得多——这一轮涨价的源头是 AI 数据中心在抢内存产能，主要厂商把先进产能转去做 HBM 和 DDR5，DDR4 与 DDR3 的产线缩到原来的四分之一左右，但存量市场仍在换新和扩容 [21]；64GB DDR5 RDIMM 服务器条的合约价半年翻倍，而 DDR4 的拆机 ECC 条虽然也涨，仍有现货流通、价格低一个档 [21][22]。整机算下来，显卡 6000 到 9000、服务器平台加内存 3000 到 5000、机箱电源等若干，24G 卡配置大约 1 万到 1.5 万元可以起步；若上 32G 显存这一档，仅显卡一项就比 24G 档高出五千到七千元，整机要按两万三左右的预算来打算。这一路的代价也要说清楚，而且要想在前面：服务器平台是多通道加多核的设计，功耗高，满载电费不少；噪音也大——机架式的风扇是按机房环境设计的，放书房或者卧室里，那声音跟台式机完全不是一个量级，长期放在自己每天活动的房间里，使用体验是实实在在要考虑的问题（真要用，建议放在阳台、储物间，或者干脆是隔层的机房）。&lt;/p&gt;
&lt;p&gt;汇总一下当前行情：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;路线&lt;/th&gt;
&lt;th&gt;当前价位（2026 年 10 月行情）&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;24G 显存显卡 + DDR4 ECC 服务器平台 + 拆机 ECC 大内存&lt;/td&gt;
&lt;td&gt;Strata 合跑一个模型&lt;/td&gt;
&lt;td&gt;约 1 万-1.5 万起步&lt;/td&gt;
&lt;td&gt;性价比路线，A 卡生态需折腾，二手行情浮动大 [4][20][21][22]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32G 显存显卡 + 服务器平台大内存&lt;/td&gt;
&lt;td&gt;Strata 合跑一个模型&lt;/td&gt;
&lt;td&gt;约 2.3 万（32G 档已从 1.1 万涨至 1.4 万）&lt;/td&gt;
&lt;td&gt;显存更大，长上下文与更高精度有空间；显卡单月涨约三千 [20]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;统一内存小主机（128GB 统一内存）&lt;/td&gt;
&lt;td&gt;Halogen 一机多模型&lt;/td&gt;
&lt;td&gt;约 2 万（部分机型 2.6 万）&lt;/td&gt;
&lt;td&gt;不用单独配显卡，一年从 1.07 万涨到现在 [18][17]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA 生态的统一内存工作站&lt;/td&gt;
&lt;td&gt;Halogen 一机多模型（CUDA）&lt;/td&gt;
&lt;td&gt;3 万多，接近 4 万&lt;/td&gt;
&lt;td&gt;官价 3999→4699 美元；单机速度一般，组集群才有意义 [17]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt="跑千问 3.8 Flash Next 的配置对照：整机价格、生成速度与显存容量（气泡面积 = 显存；数据来源见参考文献 [4][20][22]）" src="images/qwen38-price-speed.png"&gt;&lt;/p&gt;
&lt;p&gt;上图中横轴是整机价格（2026 年 10 月行情），纵轴是跑千问 3.8 Flash Next 的生成速度，气泡面积代表显存或统一内存的容量，颜色越偏红价格越高。几个配置的位置值得留意：12G 与 22G 显存的两档在起步区，速度 90 tokens/s 上下，是入门最低的两档；两个 24G 档落在主流区，速度更高、价格也只贵了一截，是图上「价格 - 速度」性价比最好的区域；32G 显存档价格上一大步（2 万+），买它图的不是速度，是把权重多装一些在显存里换长上下文与更高精度的余量；最右侧两台 128G 统一内存整机气泡最大、价格最贵，速度按各自带宽折算（一台 256GB/s、另一台 273GB/s）在 60 到 70 tokens/s 一档，其中 256GB/s 那台略慢一点——没有独显那一路快，但靠统一内存不用拼装、开箱即整台。要快而省钱，24G 显卡这一档是最优区域；要省心且内存大，统一内存整机是另一个方向的答案。&lt;/p&gt;
&lt;p&gt;也就是说，一万出头有机会起步，比较舒服的配置在两万上下，预算到几万可以买到 CUDA 生态的整机或者多卡平台。在线大模型是按月付费、价格还在上行的流动成本，本地硬件是一次性的固定支出；前者随用量与调价浮动，后者配置一次之后就不再受调价影响。&lt;/p&gt;
&lt;h2&gt;开支随用量分摊：某些任务只有本地跑得起&lt;/h2&gt;
&lt;p&gt;换个角度算，这一两万的硬件支出用来支付在线服务，也许够用好几年。所以本地部署的意义不是「省钱」，至少不光是省钱——它的意义是：有了本地模型，在线模型就从「唯一的依靠」变成了「可选的补充」，不再是谁涨价、谁断服都没有替代品的那种局面。&lt;/p&gt;
&lt;p&gt;所以，单看一次性的投入，一两万不算便宜，但有的场景，可能只有本地模型来做才比较划算，不过只要使用的时间足够长、用量足够大，这笔钱是可以慢慢分摊的，说到底就是规模效应。比如批量整理知识库，又或者是涉及到不便联网的数据（地学领域常有这种情况）。&lt;/p&gt;
&lt;p&gt;前一段时间，我想对自己积累下来的所有代码做一次处理：先从中提炼技能，顺路整理成知识库。这件事用在线大模型来跑，结果是花了将近 700 美元才做完。之后我还打算把所有的参考文献也用类似的方法处理一遍——这件事用在线模型恐怕就很不现实了：太贵，光预印本网站就有几万篇文章，就算单篇的处理费用比代码那次低很多，乘上几万篇也是一笔相当可观的支出。&lt;/p&gt;
&lt;p&gt;这种规模大、重复性高的整理工作，可能正是本地大模型的用武之地。机器购置一次，之后运行多少次都不会再产生按量的费用，用得越多，单次成本就越低。私有知识库这类事情，或许本来就比较适合在自己的机器上运行。&lt;/p&gt;
&lt;p&gt;经过这几周的过渡，我现在日常的所有任务——工具调用、信息检索、代码翻译——全部都用本地模型了。在线服务我可能还会用，只是作为备选了，用哪一家的、用多少、什么时候用，现在就很灵活了。&lt;/p&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;中华网：《DeepSeek上次崩还是1天前 服务再度异常引发关注》　&lt;a href="https://news.china.com/socialgd/10000169/20260401/49374515.html"&gt;https://news.china.com/socialgd/10000169/20260401/49374515.html&lt;/a&gt;（2026-03-31，「服务器繁忙」报错；3 月 29 至 30 日近 12 小时中断的回顾）&lt;/li&gt;
&lt;li&gt;DoNews：《DeepSeek一日内两次服务中断，3月31日宕机一小时后恢复》　&lt;a href="https://www.donews.com/news/detail/4/6492239.html"&gt;https://www.donews.com/news/detail/4/6492239.html&lt;/a&gt;（2026-03-31 17:02 异常、18:05 恢复，约 1 小时）&lt;/li&gt;
&lt;li&gt;游侠网：《豆包点评DeepSeek频繁宕机 爆发式增长下的必经阶段》　&lt;a href="https://www.ali213.net/news/html/2026-3/1004159.html"&gt;https://www.ali213.net/news/html/2026-3/1004159.html&lt;/a&gt;（2026-03-30，大模型推理算力消耗巨大、硬件供应链紧张制约扩容速度）&lt;/li&gt;
&lt;li&gt;Strata 开源项目仓库与文档（多档消费级显卡的实测速度、混合专家激活机制、显存与内存与处理器协同的分层放置、最小内存要求）　&lt;a href="https://github.com/Niko1221/Strata"&gt;https://github.com/Niko1221/Strata&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;快科技（转自凤凰网科技）：《半个月崩7次！估值3800亿AI顶流算力告急：6000人集体哀嚎》　&lt;a href="https://tech.ifeng.com/c/8sMu5IZFGPt"&gt;https://tech.ifeng.com/c/8sMu5IZFGPt&lt;/a&gt;（2026-04-16，Anthropic 半月 7 次中断明细、90 天正常运行率 98.95% 对企业级 99.99%）&lt;/li&gt;
&lt;li&gt;DoNews：《美国主流AI服务集体宕机：ChatGPT、Claude、Grok等均异常》　&lt;a href="https://www.donews.com/news/detail/4/6697106.html"&gt;https://www.donews.com/news/detail/4/6697106.html&lt;/a&gt;（2026-09-03/04，持续约 3 小时 40 分，编程工具因依赖三家接口被波及）&lt;/li&gt;
&lt;li&gt;东方财富网（转自21世纪经济报道）：《黑色星期四！GPT、Claude、Grok出现历史级集体宕机》　&lt;a href="https://finance.eastmoney.com/a/202609043864546436.html"&gt;https://finance.eastmoney.com/a/202609043864546436.html&lt;/a&gt;（2026-09-03/04，三家公司状态页确认；业内指多家公司共享的云基础设施可能是原因；Downdetector 故障报告：OpenAI 超 1.2 万份、另两家约千份）&lt;/li&gt;
&lt;li&gt;36氪：《DeepSeek史诗级宕机13小时，一夜崩上热搜，网页版更新》　&lt;a href="https://36kr.com/p/3746701577372168"&gt;https://36kr.com/p/3746701577372168&lt;/a&gt;（2026-05-24，网页端与 App 全部无法访问、官方状态页红色告警、抢修一整夜）&lt;/li&gt;
&lt;li&gt;快科技：《本月第四次！DeepSeek又崩了约半小时 现已修复》　&lt;a href="https://m.mydrivers.com/newsview/1125563.html"&gt;https://m.mydrivers.com/newsview/1125563.html&lt;/a&gt;（2026-05-28，10 时 21 分起中断、10 时 50 分恢复，约 29 分钟）&lt;/li&gt;
&lt;li&gt;澎湃新闻：《DeepSeek崩了》　&lt;a href="https://baijiahao.baidu.com/s?id=1866419420998691474"&gt;https://baijiahao.baidu.com/s?id=1866419420998691474&lt;/a&gt;（2026-05-28，用户在社交平台的反馈与官方状态页信息）&lt;/li&gt;
&lt;li&gt;东方财富网（来源：时代周报）：《DeepSeek又崩了，年内18次异常，大模型C端免费模式走到十字路口》　&lt;a href="https://finance.eastmoney.com/a/202605283753063011.html"&gt;https://finance.eastmoney.com/a/202605283753063011.html&lt;/a&gt;（2026 年内第 18 次部分性能异常；OpenRouter 数据：全球周调用 28.9 万亿 token、中国 9.22 万亿、免费模式难持久）&lt;/li&gt;
&lt;li&gt;北方网：《DeepSeek恢复服务！豆包：频繁崩溃是成长代价》　&lt;a href="http://it.enorth.com.cn/system/2026/03/30/059272852.shtml"&gt;http://it.enorth.com.cn/system/2026/03/30/059272852.shtml&lt;/a&gt;（2026-03-30，同行评价频繁故障为「爆发式增长下的必经阶段」）&lt;/li&gt;
&lt;li&gt;钛媒体：《Codex也断了：OpenAI三线齐崩，Agent时代的宕机账单怎么算》《OpenAI全球宕机8小时未完：当9亿人的AI依赖成为单点故障》　&lt;a href="https://www.tmtpost.com/agent/ai-article/19383"&gt;https://www.tmtpost.com/agent/ai-article/19383&lt;/a&gt;（2026-07-25，对话、API、编程工具全线瘫痪超 8 小时、无预警）&lt;/li&gt;
&lt;li&gt;东方财富网：《DeepSeek为何总是"崩"？》　&lt;a href="https://finance.eastmoney.com/a/202605293753451713.html"&gt;https://finance.eastmoney.com/a/202605293753451713.html&lt;/a&gt;（业内人士归因：用户规模增长过快，服务器算力扩张难以匹配激增的流量需求）&lt;/li&gt;
&lt;li&gt;千问 3.8 Flash Next 模型主页　&lt;a href="https://huggingface.co/Qwen/Qwen3.8-Flash-Next"&gt;https://huggingface.co/Qwen/Qwen3.8-Flash-Next&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Halogen 开源项目仓库（面向统一内存芯片平台，文档给出长文本预填充速度等指标）　&lt;a href="https://github.com/peonist-ai/halogen-flash-server"&gt;https://github.com/peonist-ai/halogen-flash-server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;什么值得买：一篇本地 AI 小型主机与个人 AI 工作站涨价的追踪帖　&lt;a href="https://post.smzdm.com/p/awwr2xlk/"&gt;https://post.smzdm.com/p/awwr2xlk/&lt;/a&gt;（2026-08-16；记录相关设备一年内价格上行幅度，归因于 AI 数据中心争抢内存与 HBM 产能）&lt;/li&gt;
&lt;li&gt;什么值得买：一篇统一内存小主机一年价格变化的追踪帖　&lt;a href="https://post.smzdm.com/p/aqrmepek/"&gt;https://post.smzdm.com/p/aqrmepek/&lt;/a&gt;（2026 年 9 月；从去年 1.4 万元涨到 2.2 万元且缺货）&lt;/li&gt;
&lt;li&gt;抡锤者论坛：关于某超大混合专家模型开源权重与多机部署的一篇帖子　&lt;a href="https://lcz.me/topic/1611"&gt;https://lcz.me/topic/1611&lt;/a&gt;（2026-09-11；权重分层构成、机台数与部署可行性、单条与并发生成速度）&lt;/li&gt;
&lt;li&gt;本文作者此前的文章：《本地跑模型的显卡怎么选？从2000到2万的价位全景指南》　&lt;a href="https://mp.weixin.qq.com/s/MPnQmPaWOy_RMt29gJ-a7w?token=379900131&amp;amp;lang=zh_CN"&gt;https://mp.weixin.qq.com/s/MPnQmPaWOy_RMt29gJ-a7w?token=379900131&amp;amp;lang=zh_CN&lt;/a&gt;（2026-09-13 行情）&lt;/li&gt;
&lt;li&gt;什么值得买：一篇服务器内存价格半年变化的追踪帖　&lt;a href="https://post.smzdm.com/p/ae6vk73z/"&gt;https://post.smzdm.com/p/ae6vk73z/&lt;/a&gt;（2026-09-19；服务器内存合约价半年翻倍、交期大幅拉长）&lt;/li&gt;
&lt;li&gt;什么值得买：一篇旧代内存价格变动的追踪帖　&lt;a href="https://post.smzdm.com/p/al3xg7mg/"&gt;https://post.smzdm.com/p/al3xg7mg/&lt;/a&gt;（2026-08-23；旧代拆机服务器内存仍有现货流通、比新一代便宜）&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="本地部署"/><category term="大模型"/><category term="千问"/><category term="Qwen"/><category term="显卡"/><category term="显存"/><category term="MoE"/><category term="DeepSeek"/><category term="离线"/><category term="成本"/></entry><entry><title>谷歌把太空数据中心送上天了：散热怎么解、算力有多少、适合什么场景</title><link href="https://blog.cycleuser.org/gu-ge-ba-tai-kong-shu-ju-zhong-xin-song-shang-tian-liao-san-re-zen-yao-jie-suan-li-you-duo-shao-gua-he-shi-yao-chang-jing.html" rel="alternate"/><published>2026-10-03T00:00:00+08:00</published><updated>2026-10-03T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-10-03:/gu-ge-ba-tai-kong-shu-ju-zhong-xin-song-shang-tian-liao-san-re-zen-yao-jie-suan-li-you-duo-shao-gua-he-shi-yao-chang-jing.html</id><summary type="html">&lt;p&gt;谷歌的 Project Suncatcher 把 AI 芯片送上了天。这篇拿论文评审版给的数据重建了一个两节点散热模型，算清三件事：散热怎么解、算力有多少、适合什么场景，最后说说那篇论文还能往哪儿改。&lt;/p&gt;</summary><content type="html">&lt;h1&gt;谷歌把太空数据中心送上天了：散热怎么解、算力有多少、适合什么场景&lt;/h1&gt;
&lt;p&gt;10 月 1 号，美国太空探索技术公司 SpaceX 用猎鹰九号（Falcon 9）火箭执行了 Transporter-18 任务，从美国加州的范登堡太空军基地把一批卫星送入轨道。其中一颗是商业卫星公司 Planet Labs 造的，载荷是谷歌的 TPU（张量处理单元，Tensor Processing Unit，谷歌自研的 AI 加速芯片），这是谷歌 Project Suncatcher 计划的首次入轨 [1][2][3][4][5]。群里当天也讨论起来了，一个朋友问，太空散热的问题谷歌要怎么解决；另一个朋友引了句中文转述，说真空里只能靠辐射散热，芯片连着跑十五到二十分钟就得关机冷却，"只能靠关机辐射散热了"。&lt;/p&gt;
&lt;p&gt;我的想法跟这位朋友差不多，真空里散热是真难。但"只能靠关机"不全对，散热可以靠调度绕过去，不一定非得跟它硬碰。这篇文章要提出并验证的就是一套"轮班"办法：让设备轮流运行，任意时刻保证有一两台在跑，跑着的负责散热，停下的负责降温，互相别烤着，接成一个连续的接力。这套轮班思路是本文提出来的，论文和官方材料里都没有，群里那两句讨论只是起了个头。下面拿谷歌论文评审版给的散热口径 [6]，把它认真算一遍。&lt;/p&gt;
&lt;p&gt;先把出处核一下，再建两节点的热模型，跑五组模拟，然后往外推：功耗和面积的通用相图、降功耗、热缓冲，以及真实推理任务的算力和数据流。最后说说那篇论文还能往哪儿改。&lt;/p&gt;
&lt;h2&gt;一、原始出处都写了啥&lt;/h2&gt;
&lt;p&gt;中文里传的说法有几处跟原文不一样，先澄清一下。&lt;/p&gt;
&lt;p&gt;一个常见的说法是这次上了四颗，其实就一颗。Google 官方博客的原话是 "our prototype satellite for Project Suncatcher, built in partnership with Planet, launched into orbit aboard the Transporter-18 rideshare mission with SpaceX"（我们 Project Suncatcher 的原型卫星，与 Planet 合作建造，已随 SpaceX 的 Transporter-18 拼车任务入轨），单数 [1]。美国财经媒体 CNBC 同一天的报道也确认了范登堡的发射窗口和入轨后联系正常 [2]。&lt;/p&gt;
&lt;p&gt;"15-20 分钟"这个数也不是原文。科技媒体 TechCrunch 写的是 "the satellite will fire up its TPU in 15-minute bursts to avoid straining the satellite's power and thermal management systems"（卫星会以 15 分钟一档的突发方式启动 TPU，以免压垮卫星的电源和热管理系统），15 分钟一档，怕的是电源和热管理两套系统一起吃紧 [3]。多出来的"20 分钟"是转述时加的，但方向没错，确实是间歇工作、要冷下来再跑。&lt;/p&gt;
&lt;p&gt;"2027 年再发两颗、测星间激光组网"这句倒是对的。谷歌 2025 年 11 月 4 号在 research.google 博客上说要 "launch two prototype satellites by early 2027 ... validate the use of optical inter-satellite links for distributed ML tasks"（2027 年初发射两颗原型卫星……验证用星间激光链做分布式机器学习任务），那两颗是为算力专门造的平台 [7]，Planet Labs 公司的官宣里也提到了这个 2027 年初的时间点 [4]。&lt;/p&gt;
&lt;p&gt;"约 1 千瓦"出自 TechCrunch 同一句 "supplying a kilowatt of continuous power"（提供一千瓦的连续功率）[3]。"太阳能是地面 8 倍"出自论文，原话 "receive up to 8x more solar energy per year than a panel located on Earth at mid-latitude"（一年接收的太阳能是地球上中纬度地区太阳能板的 8 倍）[6][8]。太阳同步晨昏轨道（沿着地球昼夜分界线飞行、几乎全程都晒得到太阳的轨道）、650 公里、81 颗卫星、半径 1 公里编队这几个数字，也都是论文里的 [6][8]。&lt;/p&gt;
&lt;p&gt;论文后来出了同行评审版，登在能源领域期刊 Joule 上（Joule 11, 102678，2027 年 2 月 17 日刊出，在线 2026 年）[6]，预印本是预印本平台 arXiv 上的 2511.19468 [8]。评审版比预印本多了一大段散热参数，这次的模型就是冲那段去的。原文是 "A published ballpark figure for contemporary GPU/TPU power density is 90 W/cm² for Nvidia's H100, and ideally, silicon junction temperatures should be kept below 90°C, while near a satellite radiator temperature of 50°C, blackbody radiation decreases by about 1.2% per K of lower temperature..."（据公开数据，当下 GPU/TPU 的典型功率密度是英伟达 H100 的 90 W/cm²；芯片结温最好保持在 90 摄氏度以下；在辐射板温度 50 摄氏度附近，温度每低 1 K，黑体辐射能力下降约 1.2%……）。这里的芯片结温（junction temperature，芯片里晶体管工作时的温度，整颗芯片最怕过热的地方）就是这次的硬约束 [6][9]。论文说散热靠热管（一种靠工质相变、把热从一头搬到另一头的被动器件），航天上常用铝-氨或铜-水做工质，还推荐了 Silk 的《Introduction to Spacecraft Thermal Design》（《航天器热设计导论》）当入门 [6][10]。&lt;/p&gt;
&lt;p&gt;论文自己的散热结论很干脆：热管加辐射板，被动式，全靠辐射把热丢给深空 [6][8]。Facts 页说得更直接，"In a vacuum, you can only diffuse heat via radiators, which requires a totally different approach to cooling electronics."（真空中只能靠辐射板散热，这需要一套完全不同的电子设备冷却思路）[11] 论文也把散热列进了 "significant engineering challenges remain"（仍存在重大工程挑战）那张名单，说后续任务还得继续交作业 [6][8]。&lt;/p&gt;
&lt;p&gt;这次要算的事说清楚：拿论文给的散热口径（结温上限 90 摄氏度，芯片到板热阻 0.04 K/W）建一个两节点的热模型，回答四个问题——原型星为什么只能 15 分钟一档、1 kW 芯片连续运行要多大辐射板、芯片到板的热阻有多关键、以及本文提出的轮班接力需要几颗星。结果先摆出来：单看散热，原型星能连跑 47 分钟，15 分钟其实是电池先见底；1 kW 要连续，得配大约 2 平方米辐射板；热阻从 0.04 涨到 0.06，可用率就从 0.53 掉到 0.37；轮班方案 5 颗星能把 2 台常开覆盖到 100%，但每颗星平均只出 469 W。这些数下面逐个算。&lt;/p&gt;
&lt;p&gt;论文这段话正好补齐了上一版模型缺的两样：一个是芯片结温这个真正的约束，另一个是芯片到板之间的温度梯度，论文原话是 "needs to be engineered to be small"（这个温差要设计得尽量小）[6]。所以这一版模型升级成两节点。&lt;/p&gt;
&lt;h2&gt;二、真空里的热为什么难散&lt;/h2&gt;
&lt;p&gt;黑体表面的辐射功率是&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[P = \varepsilon \sigma A (T^4 - T_{sink}^4)\]&lt;/div&gt;
&lt;p&gt;&lt;span class="arithmatex"&gt;\(\sigma = 5.67 \times 10^{-8}\,\mathrm{W/(m^2 \cdot K^4)}\)&lt;/span&gt; 是斯特藩-玻尔兹曼常数，&lt;span class="arithmatex"&gt;\(\varepsilon\)&lt;/span&gt; 是表面发射率，热控涂层一般能到 0.85-0.92 [12]，&lt;span class="arithmatex"&gt;\(A\)&lt;/span&gt; 是辐射板面积，&lt;span class="arithmatex"&gt;\(T_{sink}\)&lt;/span&gt; 是等效热沉温度。&lt;/p&gt;
&lt;p&gt;太空的热沉有两块来源。一块是 3 K 的宇宙微波背景，另一块是地球，地球往外散红外（约 240 W/m²），还反射太阳光（反照率约 0.3）。650 公里的太阳同步轨道，两边合起来等效热沉温度大概落在 250-270 K，本文取 260 K，依据是 Gilmore 主编的《Spacecraft Thermal Control Handbook》（航天器热控制手册）[12]。&lt;/p&gt;
&lt;p&gt;关键在 &lt;span class="arithmatex"&gt;\(T^4\)&lt;/span&gt; 这个四次方。它的相对灵敏度是&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[\frac{1}{P}\frac{dP}{dT} = \frac{4}{T}\]&lt;/div&gt;
&lt;p&gt;50 摄氏度（323 K）处，4/323 = 1.24%/K，跟论文的"约 1.2% per K"对上了 [6]。也正因为这个四次方，空间站的辐射板敢跑到六七十摄氏度，烫一点散热能力涨很多，美国航天局 NASA 国际空间站的主动热控系统就是靠大面积板子排热的 [12]。芯片不行，结温过 90 摄氏度就出毛病 [6]。论文给的这组数（结温&amp;lt;90℃、辐射板~50℃）意味着一件事：1 kW 功率下，芯片到板面要压掉大约 40 K 温差，折合总热阻 0.04 K/W 上下。这 0.04 就是这次模型里的关键参数 &lt;span class="arithmatex"&gt;\(R\)&lt;/span&gt;。&lt;/p&gt;
&lt;h2&gt;三、两节点模型&lt;/h2&gt;
&lt;p&gt;老版本把整颗星当成一个温度节点，太粗糙。这一版拆成两个：芯片结温 &lt;span class="arithmatex"&gt;\(T_J\)&lt;/span&gt; 和辐射板温度 &lt;span class="arithmatex"&gt;\(T_R\)&lt;/span&gt;，中间用热阻 &lt;span class="arithmatex"&gt;\(R\)&lt;/span&gt; 连起来，这 &lt;span class="arithmatex"&gt;\(R\)&lt;/span&gt; 是热管、安装面、界面材料加在一起的总和 [6][10]。&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[C_J \frac{dT_J}{dt} = P(t) - \frac{T_J - T_R}{R}\]&lt;/div&gt;
&lt;div class="arithmatex"&gt;\[C_R \frac{dT_R}{dt} = \frac{T_J - T_R}{R} + P_{bus} - \varepsilon \sigma A_{eff} \left( T_R^4 - T_{sink}^4 \right)\]&lt;/div&gt;
&lt;p&gt;&lt;span class="arithmatex"&gt;\(C_J\)&lt;/span&gt; 是芯片加封装加均热板的热容，&lt;span class="arithmatex"&gt;\(C_R\)&lt;/span&gt; 是星体和板的热容，&lt;span class="arithmatex"&gt;\(P(t)\)&lt;/span&gt; 是芯片功率，&lt;span class="arithmatex"&gt;\(P_{bus}\)&lt;/span&gt; 是待机总线功耗，&lt;span class="arithmatex"&gt;\(A_{eff} = 2 A_{rad} \times 0.85\)&lt;/span&gt;。约束从"辐射板温度"换成了"芯片结温"：&lt;span class="arithmatex"&gt;\(T_J \le 90\,^\circ\mathrm{C}\)&lt;/span&gt; [6]。&lt;/p&gt;
&lt;p&gt;稳态下有 &lt;span class="arithmatex"&gt;\(T_J = T_R + P R\)&lt;/span&gt;。代进约束，辐射板实际能到的温度上限就是 &lt;span class="arithmatex"&gt;\(T_{R,max} = 90\,^\circ\mathrm{C} - P R\)&lt;/span&gt;。这一步是关键：结温是硬上限，热阻越大，留给辐射板的额度越小。要是 &lt;span class="arithmatex"&gt;\(P R\)&lt;/span&gt; 大到逼近"90 摄氏度减热沉温度"那个差，板子再大也没用，芯片自己先过热了。&lt;/p&gt;
&lt;p&gt;参数表：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;取值&lt;/th&gt;
&lt;th&gt;出处&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;芯片结温上限&lt;/td&gt;
&lt;td&gt;90 ℃（363 K）&lt;/td&gt;
&lt;td&gt;Joule 评审版 [6]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;芯片到板总热阻 R&lt;/td&gt;
&lt;td&gt;0.04 K/W&lt;/td&gt;
&lt;td&gt;由 40 K @ 1 kW 反推 [6]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU/TPU 热流密度&lt;/td&gt;
&lt;td&gt;90 W/cm²（H100）&lt;/td&gt;
&lt;td&gt;评审版引 NVIDIA Hopper [6][9]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;太阳能（LEO 低地球轨道晨昏轨）&lt;/td&gt;
&lt;td&gt;地面中纬度的约 8 倍&lt;/td&gt;
&lt;td&gt;论文 [6][8]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;原型星功率&lt;/td&gt;
&lt;td&gt;1 kW&lt;/td&gt;
&lt;td&gt;TechCrunch [3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;原型星辐射板 A_rad&lt;/td&gt;
&lt;td&gt;1.5 m²&lt;/td&gt;
&lt;td&gt;本文假设&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;芯片节点热容 C_J&lt;/td&gt;
&lt;td&gt;2×10³ J/K&lt;/td&gt;
&lt;td&gt;本文假设&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;星体热容 C_R&lt;/td&gt;
&lt;td&gt;4×10⁴（单机）/6×10⁴（集群节点）J/K&lt;/td&gt;
&lt;td&gt;本文假设&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;辐射面发射率 ε&lt;/td&gt;
&lt;td&gt;0.9&lt;/td&gt;
&lt;td&gt;热控涂层典型值 [12]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;等效热沉温度&lt;/td&gt;
&lt;td&gt;260 K&lt;/td&gt;
&lt;td&gt;综合地球红外与反照 [12]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;待机总线功耗&lt;/td&gt;
&lt;td&gt;80 W&lt;/td&gt;
&lt;td&gt;本文假设&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 分钟突发档位&lt;/td&gt;
&lt;td&gt;电池容量限制&lt;/td&gt;
&lt;td&gt;TechCrunch [3]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;谷歌没公开原型星的板面积、热容和热阻，这几个是按量级推的。模型的价值不在复刻原型，而在把参数机制摊开，看改哪个会翻盘。&lt;/p&gt;
&lt;h2&gt;四、15 分钟一档，到底是不是热卡住的&lt;/h2&gt;
&lt;p&gt;原型星平时是这样工作的：从 22 摄氏度（295 K）起跑，满负荷 1 kW，15 分钟后电池见底强制停机，这时候芯片结温 72.2 摄氏度，辐射板才 33.2 摄氏度。然后待机 80 W 慢慢散，24.8 分钟后结温回到 22 摄氏度，进入下一轮。一个周期 39.8 分钟，占空比 38%。&lt;/p&gt;
&lt;p&gt;算出来一个反直觉的数：热学能撑的热重启窗口是 47.4 分钟，比 15 分钟长得多。也就是说光看散热，这颗星还能多跑半个多小时，15 分钟一档的真正瓶颈是电池和电源，不是热。TechCrunch 原话把 "power and thermal management"（电源和热管理）两个都点了 [3]，模型正好把两条约束拆开：热学给 47 分钟，电池给 15 分钟。原型星的结温峰值离 90 摄氏度还差 18 K，散热在原型阶段绰绰有余。&lt;/p&gt;
&lt;p&gt;要是电池不管硬跑，稳态下辐射板爬到 64 摄氏度、结温爬到 104 摄氏度，越过红线。所以"原型星连续跑不了满负荷"这话还成立，只是卡点从板温换成了结温。&lt;/p&gt;
&lt;p&gt;&lt;img alt="原型星 15 分钟突发的结温/板温节律" src="images/suncatcher-thermal-1-single.png"&gt;&lt;/p&gt;
&lt;p&gt;图里是原型星四个连续周期的温度曲线，红的是芯片结温，蓝的是辐射板温度。几个点值得看：结温峰值 72 摄氏度，离 90 摄氏度还差 18 K，15 分钟一档不是热卡的；辐射板这时候才 33 摄氏度，一半的散热本事都没使出来；待机那 25 分钟里结温掉得比板温快，因为芯片节点热容小，温度基本跟着板走。&lt;/p&gt;
&lt;h2&gt;五、辐射板加到多大才够&lt;/h2&gt;
&lt;p&gt;15 分钟一档既然是电池卡的，那板子要多大才能撑住连续满负荷？把面积从 1.2 试到 3.0 平方米，看连续运行时的结温和板温：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A_rad (m²)&lt;/th&gt;
&lt;th&gt;连续运行结温&lt;/th&gt;
&lt;th&gt;连续运行板温&lt;/th&gt;
&lt;th&gt;结论&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.2&lt;/td&gt;
&lt;td&gt;116 ℃&lt;/td&gt;
&lt;td&gt;77 ℃&lt;/td&gt;
&lt;td&gt;结温超限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;104 ℃&lt;/td&gt;
&lt;td&gt;64 ℃&lt;/td&gt;
&lt;td&gt;结温超限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.8&lt;/td&gt;
&lt;td&gt;94 ℃&lt;/td&gt;
&lt;td&gt;54 ℃&lt;/td&gt;
&lt;td&gt;单机最长 101 分钟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;89 ℃&lt;/td&gt;
&lt;td&gt;49 ℃&lt;/td&gt;
&lt;td&gt;刚够连续&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;81 ℃&lt;/td&gt;
&lt;td&gt;41 ℃&lt;/td&gt;
&lt;td&gt;连续有余量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;72 ℃&lt;/td&gt;
&lt;td&gt;32 ℃&lt;/td&gt;
&lt;td&gt;连续很宽松&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;按评审版结温&amp;lt;90 摄氏度的口径 [6]，每 kW 算力大概要 2.0 平方米板才能连续。原型星实际多大谷歌没说，但它在 15 分钟档上跑、结温还剩 18 K 余量，板面积估计在 1.5-2 平方米之间。&lt;/p&gt;
&lt;h2&gt;六、热管才是那个隐藏的坎&lt;/h2&gt;
&lt;p&gt;论文那句 "temperature differential ... needs to be engineered to be small"（芯片到板的温差要设计得尽量小）[6]，翻成模型的话就是热阻 &lt;span class="arithmatex"&gt;\(R\)&lt;/span&gt; 必须小。把 &lt;span class="arithmatex"&gt;\(R\)&lt;/span&gt; 从 0.02 试到 0.12 K/W，看单机占空比和需要的节点个数（周期稳态，跑 50 个周期取后 30 个平均）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;R (K/W)&lt;/th&gt;
&lt;th&gt;运行时长&lt;/th&gt;
&lt;th&gt;停机时长&lt;/th&gt;
&lt;th&gt;占空比 η&lt;/th&gt;
&lt;th&gt;保 2 台常开需 N≥&lt;/th&gt;
&lt;th&gt;辐射板温度区间&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.02&lt;/td&gt;
&lt;td&gt;连续&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;22-58 ℃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;0.04（论文口径）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;43 min&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;38 min&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.53&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;21-42 ℃&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.06&lt;/td&gt;
&lt;td&gt;6 min&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;td&gt;0.37&lt;/td&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;td&gt;21-23 ℃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.08&lt;/td&gt;
&lt;td&gt;4 min&lt;/td&gt;
&lt;td&gt;8 min&lt;/td&gt;
&lt;td&gt;0.31&lt;/td&gt;
&lt;td&gt;6.4&lt;/td&gt;
&lt;td&gt;18-18 ℃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.12&lt;/td&gt;
&lt;td&gt;3 min&lt;/td&gt;
&lt;td&gt;9 min&lt;/td&gt;
&lt;td&gt;0.24&lt;/td&gt;
&lt;td&gt;8.2&lt;/td&gt;
&lt;td&gt;13-13 ℃&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;热阻从 0.02 涨到 0.06，占空比从连续一路掉到 0.37，中间 0.04 是 0.53。道理不复杂：&lt;span class="arithmatex"&gt;\(R\)&lt;/span&gt; 一大，结温很快顶到 90 摄氏度，辐射板还没热起来就被迫停机。&lt;span class="arithmatex"&gt;\(R=0.12\)&lt;/span&gt; 时板子基本停在 13 摄氏度，一块本来能排几百瓦的板，实际只排几十瓦。热管做不好，散热板再大也白搭。&lt;/p&gt;
&lt;p&gt;&lt;img alt="芯片到辐射板热阻 R 对占空比与节点个数的影响" src="images/suncatcher-thermal-3-resistance.png"&gt;&lt;/p&gt;
&lt;p&gt;图里横轴是热阻，红线（左轴）是单机占空比，紫线（右轴）是保两台常开的最小节点个数。&lt;span class="arithmatex"&gt;\(R=0.02\)&lt;/span&gt; 时结温稳态就在 90 摄氏度以下，能连续跑，两台够；&lt;span class="arithmatex"&gt;\(R=0.04\)&lt;/span&gt; 掉到 0.53，要四台；&lt;span class="arithmatex"&gt;\(R=0.12\)&lt;/span&gt; 要八台以上。这就是"梯度必须做小"的量化意思。&lt;/p&gt;
&lt;p&gt;再往下推，&lt;span class="arithmatex"&gt;\(R\)&lt;/span&gt; 还给单芯片功率封了顶。结温上限 90 摄氏度、热沉 260 K，差 103 K，每瓦功率吃掉 &lt;span class="arithmatex"&gt;\(R\)&lt;/span&gt; 那么多温差：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[P_{max} = \frac{90\,^\circ\mathrm{C} - T_{sink}}{R}\]&lt;/div&gt;
&lt;p&gt;&lt;span class="arithmatex"&gt;\(R=0.04\)&lt;/span&gt; 是 2.6 kW，&lt;span class="arithmatex"&gt;\(R=0.08\)&lt;/span&gt; 只剩 1.3 kW。过了这个数，板子再大也没用，芯片自己烧穿。所以太空算力的单芯片功率不是被板子卡住的，是被芯片到板那段热阻卡住的。&lt;/p&gt;
&lt;h2&gt;七、轮班接力到底要多少颗星&lt;/h2&gt;
&lt;p&gt;我们还可以设计一种轮班方案：设备轮流运行，停下来的负责散热。把它写成调度规则：每颗星 1.2 kW、2 平方米板、&lt;span class="arithmatex"&gt;\(R=0.04\)&lt;/span&gt;，结温到 90 摄氏度强制停机，回到 22 摄氏度才能再次开机；最多两台同时跑；优先选累计运行时间短的。编队里其他星的板会互相照面，用一个邻居互烤系数 &lt;span class="arithmatex"&gt;\(f=0.15\)&lt;/span&gt; 表示。跑 48 小时，前 24 小时当过渡期扔掉：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;节点数 N&lt;/th&gt;
&lt;th&gt;至少 1 个节点在跑&lt;/th&gt;
&lt;th&gt;平均并发&lt;/th&gt;
&lt;th&gt;每台平均运行 (h/24h)&lt;/th&gt;
&lt;th&gt;等效满负荷&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;td&gt;0.47&lt;/td&gt;
&lt;td&gt;11.3&lt;/td&gt;
&lt;td&gt;0.57 kW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;48%&lt;/td&gt;
&lt;td&gt;0.95&lt;/td&gt;
&lt;td&gt;11.4&lt;/td&gt;
&lt;td&gt;1.14 kW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;89%&lt;/td&gt;
&lt;td&gt;1.33&lt;/td&gt;
&lt;td&gt;10.6&lt;/td&gt;
&lt;td&gt;1.60 kW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;88%&lt;/td&gt;
&lt;td&gt;1.77&lt;/td&gt;
&lt;td&gt;10.6&lt;/td&gt;
&lt;td&gt;2.12 kW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;1.95&lt;/td&gt;
&lt;td&gt;9.4&lt;/td&gt;
&lt;td&gt;2.35 kW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;4.8&lt;/td&gt;
&lt;td&gt;2.40 kW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;td&gt;1.9&lt;/td&gt;
&lt;td&gt;2.40 kW&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;N=1 和 N=2 的覆盖率都卡在 47% 左右，是锁步共振：两个节点一起运行、一起升温、一起停机，错不开。单机占空比 0.53，双星轮换也只有一半出头。节点数至少要有并发上限的两倍才错得开，N=5 覆盖率到 100%，每颗星平均一天运行 9.4 小时。&lt;/p&gt;
&lt;p&gt;&lt;img alt="5 颗卫星轮班甘特图：任意时刻约 2 台在跑" src="images/suncatcher-thermal-2-fleet.png"&gt;&lt;/p&gt;
&lt;p&gt;图里是 5 颗星同一时间段的排班，一行一颗，有颜色的条就是它在跑。任意时刻大概两条重叠，这就是接力：某个节点结温顶到 90 度停机，另一个正好凉透顶上来。每个节点运行四十来分钟、停机四十来分钟，5 个错峰，凑出差不多两台的连续算力。&lt;/p&gt;
&lt;p&gt;邻居互烤也有敏感度：&lt;span class="arithmatex"&gt;\(f=0.15\)&lt;/span&gt; 没事，加到 0.3 等效负荷掉约 14%，到 0.6 覆盖率掉到 74%。论文自己提过 "would have to pay attention to occlusion of outgoing 'rejected heat' IR radiation between satellites"（得留意卫星之间排出的废热红外辐射互相遮挡的问题）[6]，注意到了，但还没交作业。&lt;/p&gt;
&lt;h2&gt;八、汇总&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;数值&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;原型星（本次发射）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15 分钟突发后结温&lt;/td&gt;
&lt;td&gt;72 ℃&lt;/td&gt;
&lt;td&gt;离 90 ℃ 上限还有 18 K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;热学允许的热重启窗口&lt;/td&gt;
&lt;td&gt;47 min&lt;/td&gt;
&lt;td&gt;远大于电池给的 15 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实际 15 分钟档位&lt;/td&gt;
&lt;td&gt;电池限制&lt;/td&gt;
&lt;td&gt;占空比 38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;连续满负荷结温&lt;/td&gt;
&lt;td&gt;104 ℃&lt;/td&gt;
&lt;td&gt;超限，必须间歇&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;辐射板需求（1 kW）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;连续运行所需面积&lt;/td&gt;
&lt;td&gt;约 2.0 m²/kW&lt;/td&gt;
&lt;td&gt;结温&amp;lt;90 ℃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;热阻敏感性（1.2 kW，2 m²）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R=0.02 / 0.04 / 0.06 / 0.08 K/W&lt;/td&gt;
&lt;td&gt;η=1.00 / 0.53 / 0.37 / 0.31&lt;/td&gt;
&lt;td&gt;断崖在 0.04-0.06 之间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单芯片功率天花板&lt;/td&gt;
&lt;td&gt;2.6 kW（R=0.04）&lt;/td&gt;
&lt;td&gt;板再大也越不过&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;节点轮班（1.2 kW，2 m²，R=0.04）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;最小节点个数&lt;/td&gt;
&lt;td&gt;N≥m/η≈3.8&lt;/td&gt;
&lt;td&gt;N=5 实现全天 2 台常开&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每颗星平均输出&lt;/td&gt;
&lt;td&gt;469 W&lt;/td&gt;
&lt;td&gt;冗余比约 2.5 倍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 MW（兆瓦）等效算力&lt;/td&gt;
&lt;td&gt;约 213,000 颗星&lt;/td&gt;
&lt;td&gt;每颗 469 W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;对应入轨质量 / 发射费&lt;/td&gt;
&lt;td&gt;约 1.49 万吨 / 约 30 亿美元&lt;/td&gt;
&lt;td&gt;按 $200/kg、5 年摊销 5,970 $/kW/y&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;地面电费参照&lt;/td&gt;
&lt;td&gt;570-3,000 $/kW/y&lt;/td&gt;
&lt;td&gt;论文给的区间 [6]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;通用场景与降功耗&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;连续运行的单芯片功率上限&lt;/td&gt;
&lt;td&gt;363 / 646 / 1010 / 1409 W&lt;/td&gt;
&lt;td&gt;对应板面积 0.5 / 1.0 / 2.0 / 4.0 m²&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;推荐低功耗点&lt;/td&gt;
&lt;td&gt;400 W + 1.0 m² 板&lt;/td&gt;
&lt;td&gt;结温 60 ℃，可连续，无需轮班&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;热缓冲&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.0 kW / 1.5 m²&lt;/td&gt;
&lt;td&gt;η 0.49 → 0.74&lt;/td&gt;
&lt;td&gt;可回收 0.25 可用率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.2 kW / 2.0 m²&lt;/td&gt;
&lt;td&gt;η 0.53 → 0.70&lt;/td&gt;
&lt;td&gt;可回收 0.17 可用率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;真实任务（70B 推理，量级）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4-bit 权重&lt;/td&gt;
&lt;td&gt;35 GB/模型&lt;/td&gt;
&lt;td&gt;每颗参与推理的星存一份或一份分片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单芯片吞吐&lt;/td&gt;
&lt;td&gt;约 28 tokens/s（满速）/ 约 15（轮班 0.53）&lt;/td&gt;
&lt;td&gt;HBM 1 TB/s、带宽受限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;权重上行&lt;/td&gt;
&lt;td&gt;约 1.4 s/星&lt;/td&gt;
&lt;td&gt;TBIRD 200 Gbps [13]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;星间分发&lt;/td&gt;
&lt;td&gt;&amp;lt;0.1 s&lt;/td&gt;
&lt;td&gt;单口径 9.6 Tbps [6][8]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;九、通用场景，和怎么把功耗降下来&lt;/h2&gt;
&lt;p&gt;前面都是按 1 kW 单芯片、2 平方米板这一套算的。换个功率、换个板面积会怎样？把单芯片功率从 200 W 试到 3000 W，板面积从 0.5 试到 4 平方米，画出占空比相图：&lt;/p&gt;
&lt;p&gt;&lt;img alt="通用场景：不同芯片功率和辐射板面积下的可用率相图" src="images/suncatcher-thermal-4-scenario.png"&gt;&lt;/p&gt;
&lt;p&gt;绿色是能连续跑的，红黄是必须轮班的。几个数直接读：单芯片 200 W，什么板都能连续，根本不用轮班；400 W，板子 0.8 平方米以上就连续；1 kW，要 2.0 平方米才算连续，这就是原型星上不去的原因；3 kW，板子再大都到不了连续，占空比最高 0.26。&lt;/p&gt;
&lt;p&gt;连续运行的单芯片功率上限（板面积固定）大致是：0.5 平方米 363 W，1.0 平方米 646 W，2.0 平方米 1010 W，4.0 平方米 1409 W。加面积越来越不划算，因为 &lt;span class="arithmatex"&gt;\(T^4\)&lt;/span&gt; 那项：板子越大温度越低，单位面积能排的热掉得越快。&lt;/p&gt;
&lt;p&gt;所以"降功耗"这条路是通的。把单芯片从 1 kW 压到 400 W 左右、配 1 平方米板，结温才 60 摄氏度，直接连续跑，根本不需要轮班。轮班这套调度本来就是给"高功耗密度挤进小散热板"打的补丁，回到低功耗连续运行，补丁就不需要了。&lt;/p&gt;
&lt;h2&gt;十、还有个方案：热缓冲&lt;/h2&gt;
&lt;p&gt;不想降功率的话，还有条路叫热缓冲：在芯片和板之间加一层相变材料（Phase Change Material，PCM，一种受热熔化时能把大量热量吸进去、自身温度却几乎不升的材料）。有它兜着，板子能更久地待在允许的最高温度附近，把散热能力用足。&lt;/p&gt;
&lt;p&gt;这条路的理论上限也能算：假设缓冲够大，板子一直稳在 &lt;span class="arithmatex"&gt;\(T_{R,max} = 90\,^\circ\mathrm{C} - P R\)&lt;/span&gt; 不上下晃，占空比就是 &lt;span class="arithmatex"&gt;\(η_{ideal} = [k(T_{R,max}^4 - T_{sink}^4) - P_{bus}] / P\)&lt;/span&gt;。拿它跟当前模型的实际占空比比，差的就是热缓冲能捞回来的可用率：&lt;/p&gt;
&lt;p&gt;&lt;img alt="热缓冲能回收多少可用率" src="images/suncatcher-thermal-5-buffer.png"&gt;&lt;/p&gt;
&lt;p&gt;1.0 kW / 1.5 m² 这组，实际 0.49，上限 0.74，能捞回 0.25；1.2 kW / 2.0 m² 这组，实际 0.53，上限 0.70，能捞回 0.17。&lt;/p&gt;
&lt;p&gt;换句话说，加了合适的热缓冲，同样硬件，可用率能提 0.17-0.25，等于所需节点个数砍掉两三成。代价是相变材料的重量：一次运行窗口要吸掉 &lt;span class="arithmatex"&gt;\(P \times t_{on}\)&lt;/span&gt; 的热，1 kW 跑 40 分钟就是约 2.4 MJ，按石蜡类相变焙 200 kJ/kg 算，得配十几公斤。所以这是拿重量换可用率，跟"加大板子""加卫星冗余"是同一杆秤上的三个砝码，哪个划算要看发射成本和质量预算。&lt;/p&gt;
&lt;h2&gt;十一、真实任务怎么跑：算力、传递、存储、共享&lt;/h2&gt;
&lt;p&gt;前面都在算热，这节把热接回真实任务。在一颗星上跑一个 70B 级大模型推理，绕不开四件事。&lt;/p&gt;
&lt;p&gt;先说算力。推理是带宽受限的：生成一个 token 要把权重整个读一遍，所以单芯片速度大概是 &lt;code&gt;tokens/s ≈ HBM带宽 / 权重字节数&lt;/code&gt;。70B 模型 4-bit 量化后权重约 35 GB，配 1 TB/s 的 HBM，满速约 28 tokens/s。套上轮班的 0.53 占空比，实际只剩约 15 tokens/s；走低功耗连续（400 W）就能拿回满速。这是降功耗的第二个好处，不光不用轮班，吞吐还更高。&lt;/p&gt;
&lt;p&gt;传递这块，地面训好的权重得先传上去。美国航天局 NASA 的 TBIRD（TeraByte InfraRed Delivery，太字节红外传输，星地激光通信实验）演示过 200 Gbps 的星地激光通信 [13]，35 GB 传一颗星约 1.4 秒；要在整个编队分发，靠论文说的星间链路（单口径 9.6 Tbps [6][8]），一派发不到 0.1 秒。上行慢、横向快，所以合理的做法是地面先传给少数几颗，再靠星间链路铺开。&lt;/p&gt;
&lt;p&gt;存储麻烦的不是容量，是辐射。每颗参与推理的星都得存一份权重（数据并行），或者存一部分（流水线/张量并行），35 GB 的 4-bit 权重本身不大。论文辐照测试里，HBM 累积 2 krad(Si)（千拉德，辐射剂量的单位，Si 指硅）后才出异常，五年任务剂量约 750 rad(Si)，没到硬失效 [6][8]；软错误率约每 17 rad 一次，折算大概三百万次推理错一次 [6][8]。这个量级推理能接受，但要配 ECC（纠错码，Error Correcting Code，能自动发现并纠正存储里的位翻转）加定期校验重载 [6]。权重不能当静态文件丢在 NAND（一种闪存）里，得有后台巡检把被打翻的位纠回来。&lt;/p&gt;
&lt;p&gt;最后是共享。单颗星跑不动大模型，就把模型切开：流水线并行把不同层分到不同星上，激活值靠星间链路在层间传，论文那个近距离编队（最近邻 100-200 米 [6][8]）就是为了让这种高带宽低时延的链路成立。但这里有个跟散热直接冲突的地方：流水线并行要求参与的星长期同时在线，而轮班的本质是"同一刻只有少数几颗在跑"。所以轮班跟大模型并行训练/推理是冲突的，轮班天生适合异步、松耦合的活（各干各的推理），不适合几千颗芯片同步跑几个月的训练。论文辐照测试自己也认了，训练场景 "requires further study"（还需要进一步研究）[6]。太空算力先从推理做起，这个判断在热模型和任务模型里是一致的。&lt;/p&gt;
&lt;h2&gt;十二、可能要做改进的方向&lt;/h2&gt;
&lt;p&gt;散热和功耗这块，论文把边界交代得很清楚，结温压到 90 摄氏度以下、板子大约 50 摄氏度、H100 级热流密度 90 W/cm² [6][9]，但停在了参数上，没给出一个能算占空比、轮班规模、节点个数的模型。补上两节点模型之后才看清，真正卡脖子的是芯片到板那段热阻，它既给单芯片功率封了顶，又直接决定可用率。通用场景论文也没铺，它默认的是热管加辐射板的稳态散热一种思路，没回答"换个功率、换个板面积会怎样"。相图那节补了这块，结论是单芯片压到几百瓦、小面积板就能连续，比硬扛高功耗省事得多，这条路论文没展开。&lt;/p&gt;
&lt;p&gt;算力、数据存储、训练还是推理，这一组论文也没串起来。它讲了星间带宽、辐照、发射成本 [6][8]，但没回答一个 70B 推理在轨上怎么跑、权重怎么传上去、怎么存、怎么在编队里共享，这次补了量级估算。更要紧的是训练和推理的岔路：论文辐照测试自己承认软错误对大规模训练的影响还需进一步研究 [6]，把训练往后放了，这跟本文热模型和任务模型的结论一致，轮班适合异步松耦合的推理，跟几千颗芯片同步跑几个月的训练是矛盾的。太空算力先做推理，不是保守，是物理和调度一起定的。&lt;/p&gt;
&lt;p&gt;环境和寿命、还有实测数据，是论文留白最多的部分。评审版新增了生命周期评估、火箭再入、卫星残骸的段落，但明说完整的生命周期评估（Life Cycle Assessment，LCA）不在本文范围内 [6][14]，把环境账留给了以后；辐照和材料退化也只给了剂量和软错误率，没算五年寿命末期发射率和电池还剩多少余量。最后这些结论都还没有在轨数据背书，这次原型星刚上天 [1][2]，热设计、辐照、编队控制都要等真飞数据来校，论文的散热参数是从地面真空罐和辐照台架推的 [6][11]，在轨会不会打折，只能等。&lt;/p&gt;
&lt;h2&gt;十三、作为一道数学建模例题&lt;/h2&gt;
&lt;p&gt;把它当一道例题收一下。已知功率 P、辐射板面积 A、发射率 ε、热沉温度 T_sink、结温上限 T_J_max、芯片到板热阻 R、两节点热容；求单机连续运行所需面积、占空比、单芯片功率上限、轮班实现 m 台常开所需的最小节点个数、热缓冲可回收的可用率、通用场景相图。&lt;/p&gt;
&lt;p&gt;解法走四步。第一步建模型，两节点热网络，&lt;span class="arithmatex"&gt;\(C_J\,dT_J/dt = P - (T_J-T_R)/R\)&lt;/span&gt;，&lt;span class="arithmatex"&gt;\(C_R\,dT_R/dt = (T_J-T_R)/R + P_{bus} - k(T_R^4 - T_{sink}^4)\)&lt;/span&gt;，&lt;span class="arithmatex"&gt;\(k = 2\varepsilon\sigma A F\)&lt;/span&gt;，约束 &lt;span class="arithmatex"&gt;\(T_J \le 90\,^\circ\mathrm{C}\)&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;第二步用准稳态把约束从结温换到板温，&lt;span class="arithmatex"&gt;\(T_J = T_R + PR\)&lt;/span&gt;，得 &lt;span class="arithmatex"&gt;\(T_{R,max} = 90\,^\circ\mathrm{C} - PR\)&lt;/span&gt;，由此得到三个闭式：连续运行所需面积、单芯片功率天花板 &lt;span class="arithmatex"&gt;\(P_{max} = (90\,^\circ\mathrm{C} - T_{sink})/R\)&lt;/span&gt;、热缓冲上限 &lt;span class="arithmatex"&gt;\(η_{ideal}\)&lt;/span&gt;。&lt;/p&gt;
&lt;p&gt;第三步数值积分并做互验：辐射板方程做精确积分再加结温充电时间，跟 RK 自适应格式对照，偏差 6.3%。&lt;/p&gt;
&lt;p&gt;第四步离散事件仿真：把调度规则（&lt;span class="arithmatex"&gt;\(m=2\)&lt;/span&gt;、公平轮换、返回温度线、邻居互烤）写进循环，每步 5 秒，统计最后 24 小时。锁步共振（N=2 覆盖 47%）和 N=5 接力闭环，都是调度规则直接推出来的。&lt;/p&gt;
&lt;p&gt;局限也明摆着，都是我自己的简化：芯片到板就一个集中热阻，真实是芯片内部温度分布加分段热管；姿态只取一个系数，真实卫星迎阳受晒、背阳辐射，温度随轨道周期性起伏；编队互烤用均值场，真实近邻遮挡是几何问题；发射率和太阳能电池效率设成常数，没算涂层退化、原子氧、微流星体这些寿命问题。模型给的是量级和机制，不是设计图纸。&lt;/p&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Beals, T. "Our Project Suncatcher prototype satellite is in orbit." Google Blog, 2026-10-01. https://blog.google/innovation-and-ai/models-and-research/google-research/project-suncatcher-prototype/&lt;/li&gt;
&lt;li&gt;Kolodny, L. "SpaceX launches Google AI chips into orbit in push toward space-based data centers." CNBC, 2026-10-01. https://www.cnbc.com/2026/10/01/spacex-to-launch-google-ai-chips-to-orbit-with-planet-labs-satellites.html&lt;/li&gt;
&lt;li&gt;Fernholz, T. "Google thinks SpaceX's Starship has to launch 1,800 times before space data centers get off the ground." TechCrunch, 2026-10-01. https://techcrunch.com/2026/10/01/google-thinks-spacexs-starship-has-to-launch-1600-times-before-space-data-centers-get-off-the-ground/&lt;/li&gt;
&lt;li&gt;Schingler, R. "Planet to Build and Operate Advanced Space Platform for Google's Project Suncatcher Moonshot." Planet Pulse, 2025-11-04. https://www.planet.com/pulse/planet-to-build-and-operate-advanced-space-platform-for-google-s-project-suncatcher-moonshot/&lt;/li&gt;
&lt;li&gt;Foust, J. "SpaceX launches Transporter-18 rideshare mission." SpaceNews, 2026-10-01. https://spacenews.com/spacex-launches-transporter-18-rideshare-mission/&lt;/li&gt;
&lt;li&gt;Agüera y Arcas, B., Beals, T., Biggs, M., Bloom, J. V., Fischbacher, T., Gromov, K., Köster, U., Pravahan, R., Manyika, J. "Toward a future space-based, highly scalable AI infrastructure system design." Joule 11, 102678 (2027-02-17). DOI: 10.1016/j.joule.2026.102678. https://doi.org/10.1016/j.joule.2026.102678&lt;/li&gt;
&lt;li&gt;Beals, T. "Exploring a space-based, scalable AI infrastructure system design." Google Research Blog, 2025-11-04. https://research.google/blog/exploring-a-space-based-scalable-ai-infrastructure-system-design/&lt;/li&gt;
&lt;li&gt;同文预印本：arXiv:2511.19468 (v2, 2026-06-17). https://arxiv.org/abs/2511.19468&lt;/li&gt;
&lt;li&gt;Palmer, G., Krashinsky, R., Stam, N., Mehta, V., Brito, G., Ramaswamy, S. "NVIDIA Hopper Architecture In-Depth." NVIDIA Technical Blog, 2022.（评审版引用的 H100 热流密度 90 W/cm² 出处）&lt;/li&gt;
&lt;li&gt;Silk, E. A. &lt;em&gt;Introduction to Spacecraft Thermal Design&lt;/em&gt;. Cambridge University Press, 2020.（论文评审版推荐的航天热设计入门；热管、辐射器、界面热阻）&lt;/li&gt;
&lt;li&gt;Beals, T. "Behind Project Suncatcher, our moonshot to put AI in space." Google Blog, 2026-09-24. https://blog.google/innovation-and-ai/models-and-research/google-research/google-project-suncatcher-facts/&lt;/li&gt;
&lt;li&gt;Gilmore, D. G. (ed.) &lt;em&gt;Spacecraft Thermal Control Handbook, Volume I: Fundamental Technologies&lt;/em&gt;. AIAA, 2002.（辐射换热、等效热沉温度取值；ISS EATCS 辐射器）&lt;/li&gt;
&lt;li&gt;Riesing, K. et al. "Operations and results from the 200 Gbps TBIRD laser communication mission." NASA NTRS, 2023.（论文提到的星地光通信演示）&lt;/li&gt;
&lt;li&gt;Barker, C. R., Marais, E. A., McDowell, J. C. "Global 3D rocket launch and re-entry air pollutant and CO2 emissions at the onset of the megaconstellation era." Sci. Data 11, 1079 (2024).（评审版新增的发射/再入环境影响）&lt;/li&gt;
&lt;/ol&gt;</content><category term="Modeling"/><category term="AI"/><category term="LLM"/><category term="数据中心"/><category term="太空"/><category term="谷歌"/><category term="SpaceX"/><category term="TPU"/><category term="传热"/><category term="热辐射"/><category term="数学建模"/><category term="模拟"/></entry><entry><title>本地部署Qwen3.8-Flash-Next模型的两条路线：halogen（AI Max+ 395+128G 统一内存）对比 Strata（CUDA 12G 显存 + 64G 内存）</title><link href="https://blog.cycleuser.org/ben-di-bu-shu-qwen38-flash-nextmo-xing-de-liang-tiao-lu-xian-halogenai-max-395128g-tong-yi-nei-cun-dui-bi-stratacuda-12g-xian-cun-64g-nei-cun.html" rel="alternate"/><published>2026-10-02T22:10:00+08:00</published><updated>2026-10-02T22:10:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-10-02:/ben-di-bu-shu-qwen38-flash-nextmo-xing-de-liang-tiao-lu-xian-halogenai-max-395128g-tong-yi-nei-cun-dui-bi-stratacuda-12g-xian-cun-64g-nei-cun.html</id><summary type="html">&lt;h1&gt;本地部署Qwen3.8-Flash-Next模型的两条路线：halogen（AI Max+ 395+128G 统一内存）对比 Strata（CUDA 12G 显存 + 64G 内存）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;阿里的 Qwen3.8-Flash-Next 开源之后，社区里想在自己机器上把它跑起来的 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1&gt;本地部署Qwen3.8-Flash-Next模型的两条路线：halogen（AI Max+ 395+128G 统一内存）对比 Strata（CUDA 12G 显存 + 64G 内存）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;阿里的 Qwen3.8-Flash-Next 开源之后，社区里想在自己机器上把它跑起来的人不少。先有人做了 halogen，专门在 AMD 的 AI Max+ 395（Strix Halo，128G 统一内存）上跑这个模型，速度能到 30 多 tokens/s；后来又有人做了 Strata，用一张 12G 显存的 CUDA 卡加 64G 内存，把这个 125B 的模型跑到了 60 多 tokens/s。同一个模型，两条硬件路线，本文根据两个项目各自的文档，把它们放在一起对比。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;先说清楚这两份材料是什么。halogen 叫 halogen-flash-server，引擎本身闭源，只发布容器镜像，GitHub 上的仓库是部署说明、文档、启动脚本和基准工具。Strata 是一个开源的推理引擎，C++ 和 CUDA 写成，源码都在仓库里，可以自己编译。&lt;/p&gt;
&lt;p&gt;同样是针对 Qwen3.8-Flash-Next，halogen 是"把模型整个放进大统一内存，再把 kernel 打磨到只贴合这一颗 APU"，Strata 是"把模型拆成分层结构，去迁就小显存和一台普通 PC"。前者精度和稳定性更好但绑硬件，后者更通用、更开源、峰值更快但精度有取舍。&lt;/p&gt;
&lt;h2&gt;两个项目分别是什么&lt;/h2&gt;
&lt;p&gt;halogen-flash-server 的目标写得很窄：一台 AMD Strix Halo、一个模型家族。它不用通用运行时，也没有可移植层和回退路径，每段 kernel 都是为 gfx1151 这一颗 GPU 写的。也正因为只针对一颗芯片和一个模型，它能做一些通用引擎做不到的事，代价是只能跑在这一种硬件上。&lt;/p&gt;
&lt;p&gt;Strata 是通用的做法。它支持从 RTX 20 系到 50 系的多张 NVIDIA 卡，也有一套实验性的 AMD HIP 后端，覆盖 RDNA2/3/4 的离散显卡。模型方面，除了原版 Qwen3.8-Flash-Next，它还支持 ISTA-DASLab 的量化版、剪枝过的 Coder 版、Swift 1.5 微调版，以及 Unsloth 的 4bit 版。&lt;/p&gt;
&lt;p&gt;简单说，这两者方向正好相对，一个把范围压到最小换取速度和确定性，一个把范围放开换取适配能力。&lt;/p&gt;
&lt;h2&gt;硬件形态决定了各自的走法&lt;/h2&gt;
&lt;p&gt;这个模型的体量是关键：125B 参数，外加一张 51B 参数的 n-gram 表。按 halogen 文档的换算，这套东西在 BF16 下是 335 GiB，FP8 下是 173 GiB，而 AI Max+ 395 能用的统一内存只有 124 GB 左右。也就是说，哪怕用 FP8 也放不下，没有"不量化直接装进去"这条路，两个项目都必须先量化。&lt;/p&gt;
&lt;p&gt;在必须量化的前提下，halogen 的办法是压到 4 到 6 bit（具体档位见下一节），让 checkpoint 小到能整个放进统一内存。它对主机的要求和常见做法相反：BIOS 里给 iGPU 的专用显存（UMA frame buffer）切到最小（参考机约 512 MiB），同时把 GTT 开到约 124 GiB（文档给的参数是 &lt;code&gt;amdgpu.gttsize=126976&lt;/code&gt;、&lt;code&gt;ttm.pages_limit=32505856&lt;/code&gt;，两者换算都是 124 GiB），也就是把几乎全部 128G 内存通过 GTT 交给 GPU 用。62 GiB 的权重就常驻在这块共享内存里，n-gram 表单独放磁盘分页读，KV 池在启动时一次性预留。这样它不需要在显存和内存之间搬专家，优化点落在 kernel 是否贴合这颗 APU、矩阵库的调优表、以及内存带宽和功耗上。代价在别处：加载完之后留给其他大程序的空间不多，文档说大约剩十几 GiB，这样这台机器就建议只用来运行模型。&lt;/p&gt;
&lt;p&gt;12G 显存搭配 64G 内存的情况下，预算就更紧了，所以 Strata 量化得更狠（专家低到 2 到 3 bit 的 IQ2_XS、IQ3_XXS、IQ3_S 等），而且即便如此也装不下，只能把模型拆开：注意力、门控残差、路由器、共享专家、输出头、KV cache 和一块按路由热度排序的"专家缓存"留在显存；全部专家放内存由 CPU 就地算没命中的部分；那张 n-gram 表放 SSD，每个 token 只读几行。项目文档里提到，专家的分层（显存、内存、SSD）和缓存命中率都是拿真实路由数据先量过再定的。它的瓶颈因此更多在显存与内存之间的搬运、以及 CPU 这一侧的耗时上。&lt;/p&gt;
&lt;p&gt;两个项目都得量化，区别在于 halogen 负担得起更高的精度、能让模型整体驻留，而 Strata 得压得更低、并且不断在显存、内存和 SSD 之间搬数据。后面所有的差别，基本都是从这里派生出来的。&lt;/p&gt;
&lt;h2&gt;精度和内存占用&lt;/h2&gt;
&lt;p&gt;因为内存形态不同，两边选择的量化精度也不同，这点在对比速度时要注意。&lt;/p&gt;
&lt;p&gt;halogen 文档里报了整体 5.53 bpw（按 checkpoint 的 tensor 表算出来的）。新版 checkpoint 一个文件 62.1 GiB，平均每个权重 4.16 bit：专家和主体 4 bit，中间那些混合层 6 bit，模型自带的 MTP 草稿头（multi-token prediction，多 token 预测，也就是投机解码里负责"猜"下一个词的那个模块，不是单独的草稿模型）的稠密投影 8 bit；n-gram 表单独一个 FP8 文件 47.7 GiB，是分页读的，不常驻。它特意说明 4bit 不是"优化"而是"能装下的前提"，并且把每个 tensor 家族用了多少位写进了文档，方便用算术核对。旧版 w4b 更占地方，基础文件 115.55 GiB 再加一个 2.31 GiB 的精度 sidecar。&lt;/p&gt;
&lt;p&gt;Strata 按量化档位分：Q2_0 大约占 37.6G（内存加显存），IQ2_XS 约 39.2G，IQ3_XXS 约 47G，IQ3_S 约 54.8G。Coder 版砍掉一半专家，分片只有 29.6G，32G 内存的机器就能跑。还有一个实验性的 Unsloth UD-Q4_K_XL，111G，专家读不动就靠 SSD。可以看到 Strata 的专家量化压得比 halogen 低，因为它要在 12G 显存加 64G 内存这个更紧的预算里放下同一套权重。&lt;/p&gt;
&lt;h2&gt;性能对比&lt;/h2&gt;
&lt;p&gt;两边的机器、量化、上下文条件都不一样，数字不能直接相等地比，但放在一起能看出各自的位置。&lt;/p&gt;
&lt;p&gt;Strata 公布的是 RTX 5070（12G）、Ryzen 5 7600、64G 内存上的结果：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;档位&lt;/th&gt;
&lt;th style="text-align: right;"&gt;短对话输出&lt;/th&gt;
&lt;th style="text-align: right;"&gt;128K 上下文输出&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Q2_0&lt;/td&gt;
&lt;td style="text-align: right;"&gt;93 tok/s&lt;/td&gt;
&lt;td style="text-align: right;"&gt;74 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ2_XS&lt;/td&gt;
&lt;td style="text-align: right;"&gt;79 tok/s&lt;/td&gt;
&lt;td style="text-align: right;"&gt;63 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ3_XXS&lt;/td&gt;
&lt;td style="text-align: right;"&gt;62 tok/s&lt;/td&gt;
&lt;td style="text-align: right;"&gt;49 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ3_S&lt;/td&gt;
&lt;td style="text-align: right;"&gt;53 tok/s&lt;/td&gt;
&lt;td style="text-align: right;"&gt;46 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coder&lt;/td&gt;
&lt;td style="text-align: right;"&gt;55 tok/s&lt;/td&gt;
&lt;td style="text-align: right;"&gt;43 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;读提示词的速度按它给的数字，32K 的提示约 15 秒，换算下来 2000 多 tok/s；3090（24G）估计能到 100 到 140 tok/s。也就是说，"60+ tokens/s"对应的是它快档的短对话场景。&lt;/p&gt;
&lt;p&gt;halogen 公布的是 Ryzen AI Max+ 395、128G 统一内存、ROCm 7.14、大约 85W 持续功耗上的结果：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th style="text-align: right;"&gt;halogen-flash&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;prefill 8192 tokens&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1584 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prefill 32768 tokens&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1567 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prefill 131072 tokens&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1517 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;decode 串行贪心，1.5K / 32K 上下文&lt;/td&gt;
&lt;td style="text-align: right;"&gt;37.6 / 34.1 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;decode 带 MTP 投机，散文 / 代码&lt;/td&gt;
&lt;td style="text-align: right;"&gt;44.8 / 49.9 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;decode 带草稿，服务端 32K（十个提示的均值）&lt;/td&gt;
&lt;td style="text-align: right;"&gt;46.0 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;编程 agent 回合，草稿加 prompt lookup&lt;/td&gt;
&lt;td style="text-align: right;"&gt;55.7 到 56.3 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;它有一个特点：prefill 随上下文衰减很小，131072 tokens 还有 32768 的 97%。decode 随深度也稳，从 1.5K 到 32K 只降了约 7%。另外它说 100000 tokens 的多轮对话，第一轮约 88 秒，之后每轮约 2 秒，靠的是默认开的 prompt cache。&lt;/p&gt;
&lt;p&gt;把两张表放一起看，方向是清楚的：Strata 用更小、更便宜的显卡拿到了更高的 decode 峰值，代价是更低的量化精度和更吃内存/SSD 的分层搬运；halogen 用统一内存换来了整体更高的精度和更平稳的长上下文表现，峰值 decode 反而略低，而且这台机器的功耗和价格都明显更高。&lt;/p&gt;
&lt;h2&gt;两边相同的地方&lt;/h2&gt;
&lt;p&gt;虽然硬件路线差很多，有几件事两边都做了，而且思路接近。&lt;/p&gt;
&lt;p&gt;都用投机解码，而且都用两个草稿来源：模型自带的 MTP 草稿头，加上从请求自身文本里找重复片段的 prompt lookup。Strata 文档里叫 prompt lookup，halogen 也一样，编程场景里大约一半的生成 token 是这种"抄前面出现过的话"。两边都强调：草稿只负责猜，真正输出的每个 token 都由完整模型验证，所以 temperature 为 0 时结果和串行贪心逐字节一致，投机只是加速，不牺牲质量。&lt;/p&gt;
&lt;p&gt;都默认或强烈依赖前缀缓存。halogen 的 prompt cache 默认开，多轮对话只读新增部分。Strata 也维护会话和检查点缓存，新对话若共享同一段系统提示，就从那段之后开始读。&lt;/p&gt;
&lt;p&gt;都提供 OpenAI 兼容的接口，halogen 还提供 Anthropic Messages 接口给 Claude Code 用，Strata 同样两个都给。两边都有 thinking 档位，都能接 agent 类客户端。&lt;/p&gt;
&lt;p&gt;还都用同一个模型的 n-gram/PLE 表，当然了，因为用的都是同一个 qwen3.8-flash-next。&lt;/p&gt;
&lt;h2&gt;两边不同的地方&lt;/h2&gt;
&lt;p&gt;第一是开放性。Strata 是 MIT 协议，引擎源码公开，可以自己编译、改、看实现。halogen 的引擎是闭源的，以编译好的二进制放进容器镜像发布，仓库里只有部署说明、文档和基准工具，项目自己也写明引擎源码不在仓库里。&lt;/p&gt;
&lt;p&gt;不过 halogen 的授权并不苛刻。它的 LICENSE.md 是一份最终用户许可（EULA），标注版权所有，但给出的权利很宽：免费使用、允许商用和量产、允许把未修改的镜像原样再分发（包括镜像到自己的 registry）、明确允许跑基准并公布结果，也明确不禁止逆向工程，没有遥测、默认不联外网。唯一实质限制是不能把修改过的版本当作 halogen 分发。所以它是闭源、不给源码，但不是不能用。仓库之所以说不接受 pull request，是因为补丁进不到那个闭源引擎里。&lt;/p&gt;
&lt;p&gt;第二是部署门槛。Strata 是在自己机器上装好、下模型、直接跑，Windows 和 Linux 都行。halogen 是一台 AMD Strix Halo 上跑容器，文档对主机有明确要求：内核要有 gfx1151 的修复、要开 SVM、原生 Linux（不支持 WSL2）、还要独占整机；甚至 IOMMU 关闭与否都会影响 prefill，文档说关了在参考机上值 13 到 16%。&lt;/p&gt;
&lt;p&gt;第三是并发。Strata 文档里写的是同一时间处理一个请求。halogen 有一个 KV 池和多个 slot，默认支持几个会话轮流生成，槽位数在启动时固定（最多 64，但文档说超过四个流的吞吐增长很慢），批量请求和单请求输出一致。&lt;/p&gt;
&lt;p&gt;第四是 NPU。AI Max+ 395 带 NPU，halogen 可以把小模型（一个 0.8B 分类器、0.6B 的 embedding、0.6B 的 rerank）放在 NPU 上，和主模型共用一个端口。Strata 没有这个能力。&lt;/p&gt;
&lt;p&gt;第五是可移植性和量化自由度。Strata 支持多代 NVIDIA 卡，还有若干 AMD 卡（RDNA2/3/4）的 HIP 后端，量化档位多，能按自己的显存挑。halogen 只能用 AI Max+ 395 的 gfx1151 这一颗，精度也是固定的几套 checkpoint。&lt;/p&gt;
&lt;h2&gt;各自适合谁&lt;/h2&gt;
&lt;p&gt;如果你手上已经有一张 12G 或 24G 的 NVIDIA 卡，配 64G 内存，想在这个预算里把模型跑快一点，Strata 是对路的选择，而且能自己编译、自己调量化。它的代价是量化压得低、长上下文和内存/SSD 搬运更吃资源，项目文档也坦白长上下文和质量这块还有没验证的部分。&lt;/p&gt;
&lt;p&gt;如果你有一台 Strix Halo（AI Max+ 395、128G 统一内存）并且可以独占它做本地模型服务，halogen 是更省心的方案：精度更高、长上下文更稳、部署就是一条容器命令，还顺带能用 NPU 跑小模型。它的代价是绑死在这一颗芯片上、引擎闭源、而且这台机器基本得专门给它用。&lt;/p&gt;
&lt;h2&gt;全面对比&lt;/h2&gt;
&lt;p&gt;把前面提到的各个维度放到一张表里：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;对比项&lt;/th&gt;
&lt;th&gt;halogen&lt;/th&gt;
&lt;th&gt;Strata&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;定位&lt;/td&gt;
&lt;td&gt;单芯片、单模型家族的专用引擎&lt;/td&gt;
&lt;td&gt;通用推理引擎，支持多种模型变体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;目标硬件&lt;/td&gt;
&lt;td&gt;AMD Strix Halo（AI Max+ 395，gfx1151），128G 统一内存&lt;/td&gt;
&lt;td&gt;NVIDIA RTX 20–50 系（12–24G 显存）+ 64G 内存；另有实验性 AMD HIP 后端（RDNA2/3/4 离散卡）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统与部署&lt;/td&gt;
&lt;td&gt;原生 Linux + 容器镜像；要求特定内核（gfx1151 修复、SVM），不支持 WSL2&lt;/td&gt;
&lt;td&gt;Windows / Linux；本地安装或自行编译&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;发布精度&lt;/td&gt;
&lt;td&gt;整体 5.53 bpw；checkpoint 4.16 bpw（专家与主体 4bit、混合层 6bit、MTP 头 8bit）&lt;/td&gt;
&lt;td&gt;多档量化：Q2_0 / IQ2_XS / IQ3_XXS / IQ3_S，另有 Coder、Swift 1.5、Unsloth 4bit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;权重内存占用&lt;/td&gt;
&lt;td&gt;62.1 GiB 常驻；n-gram 表 47.7 GiB 磁盘分页&lt;/td&gt;
&lt;td&gt;37.6–54.8 GiB（内存+显存）；Coder 29.6 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;专家处理&lt;/td&gt;
&lt;td&gt;全部常驻统一内存，不搬专家&lt;/td&gt;
&lt;td&gt;三层：显存专家缓存 / 内存全部专家（CPU 算未命中）/ SSD n-gram 表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;预填充速度&lt;/td&gt;
&lt;td&gt;1517–1584 tok/s，随深度几乎不衰减&lt;/td&gt;
&lt;td&gt;约 2171 tok/s（Q2_0，32K 提示）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单流解码速度&lt;/td&gt;
&lt;td&gt;串行 37.6 / MTP 46.0 / 编程 agent 56.3 tok/s&lt;/td&gt;
&lt;td&gt;53–93 tok/s（按量化档）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;投机解码&lt;/td&gt;
&lt;td&gt;MTP 头 + prompt lookup&lt;/td&gt;
&lt;td&gt;MTP 层 + prompt lookup（在线性价比策略）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;前缀缓存&lt;/td&gt;
&lt;td&gt;默认开，续聊只处理新增&lt;/td&gt;
&lt;td&gt;会话 + 检查点缓存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;并发&lt;/td&gt;
&lt;td&gt;KV 池 + 多 slot，默认几个会话轮流生成&lt;/td&gt;
&lt;td&gt;一次处理一个请求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图片（视觉）&lt;/td&gt;
&lt;td&gt;支持（编码器可跑 GPU/CPU）&lt;/td&gt;
&lt;td&gt;支持（可选 vision；AMD 后端目前仅 CPU）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NPU&lt;/td&gt;
&lt;td&gt;可把分类/embedding/rerank 小模型放 NPU&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;OpenAI + Anthropic + Responses&lt;/td&gt;
&lt;td&gt;OpenAI + Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;开源&lt;/td&gt;
&lt;td&gt;引擎闭源（EULA：免费用、可商用、可原样再分发，不禁止逆向）&lt;/td&gt;
&lt;td&gt;MIT 开源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可移植性&lt;/td&gt;
&lt;td&gt;仅 gfx1151 一颗&lt;/td&gt;
&lt;td&gt;多代 NVIDIA + 离散 AMD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;可复现性&lt;/td&gt;
&lt;td&gt;temp 0 与串行贪心逐字节一致；批量与单请求一致&lt;/td&gt;
&lt;td&gt;temp 0 投机可复现（需关闭自适应层）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适合场景&lt;/td&gt;
&lt;td&gt;有 Strix Halo 且能独占做本地服务&lt;/td&gt;
&lt;td&gt;有小显存 N 卡 + 大内存，想省钱、可自定制&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;可视化对比&lt;/h2&gt;
&lt;p&gt;&lt;img alt="halogen 与 Strata 的多维对比雷达图（0–10）" src="images/qwen38-radar.svg"&gt;&lt;/p&gt;
&lt;p&gt;雷达图把八个维度放在一起看：解码速度、预填充速度、模型精度、长上下文稳定性、硬件可及性、开源开放度、并发/多会话、附加能力（NPU 等）。其中速度两项按各自文档的实测值归一化，其余是按文档整理的定性评分，只用于对照，不是统一标准下的跑分。同一张图也导出了高清 PNG：&lt;code&gt;images/qwen38-radar.png&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;模型：Qwen3.8-Flash-Next（阿里 Qwen 团队）&lt;a href="https://modelscope.cn/models/Qwen/Qwen3.8-Flash-Next"&gt;https://modelscope.cn/models/Qwen/Qwen3.8-Flash-Next&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;halogen-flash-server（Peonist）&lt;a href="https://github.com/peonist-ai/halogen-flash-server"&gt;https://github.com/peonist-ai/halogen-flash-server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Strata（Niko1221）&lt;a href="https://github.com/Niko1221/Strata"&gt;https://github.com/Niko1221/Strata&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="LLM"/><category term="Qwen3.8-Flash-Next"/><category term="halogen"/><category term="Strata"/><category term="AMD"/><category term="AI Max 395"/><category term="Strix Halo"/><category term="gfx1151"/><category term="CUDA"/><category term="本地模型"/><category term="推理引擎"/><category term="MoE"/><category term="统一内存"/><category term="投机解码"/></entry><entry><title>本地跑大模型：各种参数和速度到底该怎么看</title><link href="https://blog.cycleuser.org/ben-di-pao-mo-xing-su-du-zen-me-kan.html" rel="alternate"/><published>2026-10-01T00:00:00+08:00</published><updated>2026-10-01T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-10-01:/ben-di-pao-mo-xing-su-du-zen-me-kan.html</id><summary type="html">&lt;h1&gt;本地跑大模型：各种参数和速度到底该怎么看&lt;/h1&gt;
&lt;p&gt;经常有人问，我这台机器能不能跑某个模型。回答到最后往往会变成一个数 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;本地跑大模型：各种参数和速度到底该怎么看&lt;/h1&gt;
&lt;p&gt;经常有人问，我这台机器能不能跑某个模型。回答到最后往往会变成一个数字：每秒多少 token。可这个数字得看是哪个阶段的速度。同一台机器、同一个模型，你把一整段文档灌进去的时候，它能到两百多 token/s；等它一个字一个字往下写，就只剩十几 token/s 了。差了十几倍。这不是机器抽风，是这两件事根本不是一个活儿。&lt;/p&gt;
&lt;p&gt;我在写优化器那篇的时候说过，公式看不明白不要紧，脑子里大概知道这个过程是怎么回事，心里就有底了。这篇也差不多，不推公式，就顺着一次生成的流水线从头走一遍，说清楚每一段在干什么，哪一段决定你要等多久，哪一段决定它写多快，以及本地这些硬件到底卡在哪。&lt;/p&gt;
&lt;h2&gt;一次生成都经历了什么&lt;/h2&gt;
&lt;p&gt;按了回车之后，机器干的活大概是这么一串：&lt;/p&gt;
&lt;p&gt;你的输入先被切成 token，查成向量（embedding），然后送进一层层的 Transformer[1]。每一层里面主要是两件事：注意力（attention）和前馈网络（feed-forward network，FFN），现在不少模型会把 FFN 换成混合专家（mixture of experts，MoE）[2]。跑完最后一层，拿最后一个位置的输出送进 lm_head，得到一个在词表上的分数向量，也就是 logits。采样器从 logits 里挑出一个 token，如果开了流式，就先把这一个字吐给你看。然后把这个 token 接回输入，回到刚才那一层层里接着算，直到遇到结束符，或者撞上长度上限。&lt;/p&gt;
&lt;p&gt;这里有一个关键的分界。第一次进入那些层的时候，喂进去的是你整段提示词，几百上千个 token 一起铺开算，这一步叫 prefill，预填充。从第二次开始，每一轮只喂一个新 token 进去，这一步叫 decode，解码。除了这两个名字，剩下的东西都是围着它们转的。&lt;/p&gt;
&lt;h2&gt;Prefill：把提示词一次性读完&lt;/h2&gt;
&lt;p&gt;prefill 最大的特点是并行。你那一段话里的所有 token 是一起进去的，模型对它们做的是矩阵乘矩阵那种运算，行话叫通用矩阵乘（general matrix multiplication，GEMM）。GPU（graphics processing unit，图形处理器）最喜欢这种活，因为一大块算力可以被完全填满。衡量这件事有个指标叫算术强度，也就是每读一个字节的数据能干多少次浮点运算。GEMM 的算术强度高，所以 prefill 通常是计算受限的，瓶颈在算力上[3-4]。&lt;/p&gt;
&lt;p&gt;prefill 决定的是第一个字什么时候出来，也就是首 token 延迟（time to first token，TTFT）。这也是本地跑长文档问答时最难受的地方：你贴进去一篇几万字的材料，它不是慢慢来，而是先一动不动，等把整篇读完才开口。&lt;/p&gt;
&lt;p&gt;还有一处成本容易被忽略。注意力要算所有 token 两两之间的关系，这部分大致是序列长度的平方。序列长度翻一倍，注意力那部分的工作量差不多翻四倍。所以提示词越长，prefill 的成本涨得比线性还快。&lt;/p&gt;
&lt;p&gt;针对 prefill 最出名的优化是 FlashAttention[5]。它的做法是把注意力切成小块，在芯片上的高速存储里算完就丢，不把整张 n×n 的分数矩阵写回显存。结果是显存占得少了，速度还快了，因为少了一大堆来回搬数据的动作。FlashAttention-2[6] 又改了并行和工作划分，把 GPU 的利用率进一步拉高。这两篇值得一读，它们也顺便说明了，很多性能问题不是算得慢，是数据搬得多。&lt;/p&gt;
&lt;h2&gt;Decode：一次只往前走一个字&lt;/h2&gt;
&lt;p&gt;decode 的最大特点是串行，这一轮必须等上一轮出结果才能开始。更要命的是，每生成一个 token，都得把整个模型的权重从显存里读一遍，做一次乘加。&lt;/p&gt;
&lt;p&gt;这就导致 decode 的算术强度极低：每读一个字节，可能就做一两次运算。于是瓶颈从算力换到了显存带宽，decode 是访存受限的[3,7-8]。&lt;/p&gt;
&lt;p&gt;拿数字感受一下。一个 7B（7 billion，70 亿参数）的 fp16（16 位半精度浮点数）模型，权重是 14GB（gigabyte，吉字节）。如果显卡的显存带宽是 900GB/s，那么理论上限是 900 除以 14，大约每秒 64 个 token。按经验，实际能跑到六成就算不错了[9]。这个算法也能解释一个反直觉的现象：把权重从 fp16 压到 4bit[10-11]，字节数变成大约四分之一，同一个卡上 decode 理论上能快四倍左右，代价是质量可能掉一点。所以本地跑模型，显存带宽比商家广告上的 FLOPS（floating-point operations per second，每秒浮点运算次数）更值得看。算力再高，数据读不进来也是干等着，这就是当年说的内存墙[12]。&lt;/p&gt;
&lt;p&gt;还有个地方容易搞混：服务器上之所以能同时服务很多人，靠的是批处理。一次读进来的权重，可以同时给一批请求里的每个 token 用[13-15]，算术强度上去了，吞吐也跟着上去，但单条请求的延迟会被拉长。本地一个人用，批大小基本就是 1，你永远待在访存受限的那一头。&lt;/p&gt;
&lt;h2&gt;键值缓存（key-value cache，KV cache）：本地跑长上下文的真正成本&lt;/h2&gt;
&lt;p&gt;模型在算当前 token 的时候，要用到之前所有 token 的键值对（key 和 value，写作 K 和 V）。每算一步就重算一遍前面所有位置是不现实的，所以要把它们存下来，这就是键值缓存（key-value cache，KV cache）[16]。&lt;/p&gt;
&lt;p&gt;它的大小可以这么估：2（K 和 V 两份，也就是 key 和 value）乘以层数，乘以 KV 的头数，乘以每个头的维度，乘以每个元素占的字节数，再乘以上下文长度。如果同时跑多条请求，还要再乘一个批大小。&lt;/p&gt;
&lt;p&gt;拿一个 7B、32 层、32 个头、每头 128 维、fp16 的模型算，每个 token 的 KV 是 2 乘 32 乘 32 乘 128 乘 2 字节，等于 512KB（kilobyte，千字节）。跑到 32K（即 32768）上下文，光 KV 就是 16GB，比 4bit 的权重还大。这就是为什么上下文一拉长就爆显存，跟参数多少没关系，是这段算术决定的。&lt;/p&gt;
&lt;p&gt;围绕这几十个 G，大家都在想办法：&lt;/p&gt;
&lt;p&gt;分组查询注意力（grouped-query attention，GQA）和多查询注意力（multi-query attention，MQA）是让多个 query 头共享同一组 KV 头，直接把公式里的「KV 头数」降下来[17-18]。现在开源模型基本都用 GQA，更激进的是多头潜在注意力（multi-head latent attention，MLA）[19]，比如 DeepSeek-V2 那样，把 K 和 V 压成一个潜在向量，缓存里存的是压缩后的东西。&lt;/p&gt;
&lt;p&gt;PagedAttention 是另一条路。它像操作系统的虚拟内存分页那样管理 KV，按块分配、按需映射。vLLM 就是靠这个把显存碎片压到很低，从而塞下更多并发请求[20-21]。&lt;/p&gt;
&lt;p&gt;再狠一点就是量化或者丢弃。KIVI[22] 把 KV 压到 2bit；H2O（Heavy-Hitter Oracle）[23]、StreamingLLM[24] 这类干脆只保留一部分 token 的 KV，靠注意力汇聚点的现象撑住。这些都会牺牲一部分质量，属于拿精度换显存和带宽。&lt;/p&gt;
&lt;p&gt;还有一层影响是隐性的：上下文越长，decode 本身也会越来越慢。因为每步要读的 KV 变多了，注意力那部分开销从「可以忽略」变成「不能忽略」[25]。下面我自己的实测里就能看到这个趋势。&lt;/p&gt;
&lt;h2&gt;采样：最后挑字那一步&lt;/h2&gt;
&lt;p&gt;logits 出来之后，一般不会直接取分数最高的那个（那叫贪心解码），而是先做一串处理：temperature 缩放、top-k、top-p（也就是 nucleus 采样）、min-p[26]、重复惩罚，最后按概率抽一个。&lt;/p&gt;
&lt;p&gt;这些名字听着乱，其实是在回答两个问题：要不要稳，要不要新。温度低就稳，容易复读；温度高就活，也容易跑偏。Holtzman 那篇 The Curious Case of Neural Text Degeneration 讲的就是为什么纯贪心和纯 top-k 都会退化，以及 nucleus 采样是怎么缓解的[27]。现在到处都能看到的 repetition_penalty，最早来自 CTRL（Conditional Transformer Language Model）那篇[28]。&lt;/p&gt;
&lt;p&gt;采样本身几乎不耗时，但它直接决定了体验。同一段提示词，参数调得不一样，出来的是两个脾气完全不同的助手。&lt;/p&gt;
&lt;p&gt;还有一类东西也发生在这一步：结构化输出。你让它必须按某个 JSON（JavaScript Object Notation，一种数据交换格式）格式或者某种语法生成，引擎就在解码时把那些不合法的 token 直接屏蔽掉。XGrammar 这类引擎把语法编译成下推自动机的形式，把每个 token 上的额外开销压得很小[29]。代价是解码的并行度受一点影响，换来的是确定性和不用事后擦屁股。&lt;/p&gt;
&lt;h2&gt;几个指标别看错&lt;/h2&gt;
&lt;p&gt;TTFT，首 token 延迟，主要看 prefill。流式对话、文档问答里，这个数字最影响「手感」。&lt;/p&gt;
&lt;p&gt;TPOT（time per output token）或者 ITL（inter-token latency），也就是相邻两个 token 的间隔，看 decode。人眼阅读大概每秒十到二十个 token 就比较舒服，低于这个数就会明显感觉一顿一顿的。&lt;/p&gt;
&lt;p&gt;吞吐，整台机器每秒产出多少 token，只有在批处理、多用户场景里才有意义。&lt;/p&gt;
&lt;p&gt;goodput，是在满足延迟要求的前提下能服务多少请求。服务器上的目标往往是这个，而不是单纯的吞吐，因为把延迟拖坏了，吞吐再高也没用。DistServe 那篇[30]就是专攻这个指标的。&lt;/p&gt;
&lt;p&gt;顺便说一句，评价这套东西，业界已经有相对标准的方法了，比如 MLPerf（Machine Learning Performance）Inference，它把 TTFT 和 TPOT 这类指标明确写进了生成式模型的测量里[31]。自己在家测的时候，至少也要说清楚是哪个阶段的数字，不然很容易拿苹果比梨。&lt;/p&gt;
&lt;h2&gt;各种优化分别作用在哪一段&lt;/h2&gt;
&lt;p&gt;把常见的招数按环节摆一下[8,32]，会清楚很多：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;手段&lt;/th&gt;
&lt;th&gt;作用环节&lt;/th&gt;
&lt;th&gt;主要改善&lt;/th&gt;
&lt;th&gt;代价&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;连续批处理，Orca 那套迭代级调度[13-15]&lt;/td&gt;
&lt;td&gt;调度&lt;/td&gt;
&lt;td&gt;吞吐&lt;/td&gt;
&lt;td&gt;单条延迟升高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;chunked prefill，把长提示词切段[33]&lt;/td&gt;
&lt;td&gt;prefill 与 decode 混跑&lt;/td&gt;
&lt;td&gt;长短请求混在一起时的稳定性和吞吐&lt;/td&gt;
&lt;td&gt;实现复杂&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;前后分离，DistServe / Splitwise[30,34-35]&lt;/td&gt;
&lt;td&gt;调度&lt;/td&gt;
&lt;td&gt;goodput、各自用合适的资源&lt;/td&gt;
&lt;td&gt;要更多机器或显存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;前缀缓存，SGLang 的 RadixAttention、vLLM 的自动前缀缓存[36-37]&lt;/td&gt;
&lt;td&gt;prefill&lt;/td&gt;
&lt;td&gt;TTFT&lt;/td&gt;
&lt;td&gt;拿显存换&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FlashAttention[5-6,25]&lt;/td&gt;
&lt;td&gt;注意力&lt;/td&gt;
&lt;td&gt;显存与速度&lt;/td&gt;
&lt;td&gt;要有对应 kernel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GQA[18]、MQA[17]、MLA[19]&lt;/td&gt;
&lt;td&gt;KV 与 decode&lt;/td&gt;
&lt;td&gt;显存、带宽&lt;/td&gt;
&lt;td&gt;模型结构决定，改不了&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PagedAttention[20-21]&lt;/td&gt;
&lt;td&gt;KV 管理&lt;/td&gt;
&lt;td&gt;并发数&lt;/td&gt;
&lt;td&gt;调度复杂&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;量化，权重或 KV[10,38-41]&lt;/td&gt;
&lt;td&gt;权重与 KV&lt;/td&gt;
&lt;td&gt;显存、带宽&lt;/td&gt;
&lt;td&gt;质量下降&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;投机解码[42-46]&lt;/td&gt;
&lt;td&gt;decode&lt;/td&gt;
&lt;td&gt;速度&lt;/td&gt;
&lt;td&gt;草稿模型占资源，接受率有限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoE[2,47]&lt;/td&gt;
&lt;td&gt;计算&lt;/td&gt;
&lt;td&gt;每个 token 激活的参数少&lt;/td&gt;
&lt;td&gt;显存总量和路由抖动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;offload 到内存或硬盘[48-51]&lt;/td&gt;
&lt;td&gt;显存不够时的兜底&lt;/td&gt;
&lt;td&gt;能跑起来&lt;/td&gt;
&lt;td&gt;decode 慢一个数量级&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;张量并行[52]&lt;/td&gt;
&lt;td&gt;显存与计算&lt;/td&gt;
&lt;td&gt;能跑更大的模型&lt;/td&gt;
&lt;td&gt;卡间互联带宽&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;其中 chunked prefill 值得单独说一句。它不是减少 prefill 的总工作量，而是把一大段 prefill 拆成几小段，跟正在解码的请求交替着算。这样长提示词不会把别人的 decode 卡住，整体的 TTFT 分布也平滑得多。SARATHI[33] 就是干这个的。&lt;/p&gt;
&lt;p&gt;投机解码也值得说。它的思路是先用一个小的草稿模型（或者模型自带的小头）一次猜好几个 token，再让主模型一次并行验证，猜对的照单全收，猜错的退回。注意它不改变最终输出的分布，是精确加速，不是玄学[42-43]。代价是要额外养一个草稿模型，而且提速倍率被接受率卡着，接受率低就白忙。Medusa[44] 和 EAGLE[45] 就是在这条路上换了几种实现。对本地这种访存受限的场景，投机解码往往比堆算力更有效，因为它把「一次读权重只算一个 token」变成了「一次读权重算好几个 token」。&lt;/p&gt;
&lt;h2&gt;本地机器的三个硬约束&lt;/h2&gt;
&lt;p&gt;说回本地，绕来绕去就是三样东西：&lt;/p&gt;
&lt;p&gt;显存容量，决定你能不能装下权重、上下文能开多大、能并发几个请求。&lt;/p&gt;
&lt;p&gt;显存带宽，决定 decode 有多快。这是本地体验里最要紧的一条，因为权重每个 token 都要读一遍。&lt;/p&gt;
&lt;p&gt;算力，决定 prefill 有多快，也决定批处理时的吞吐上限。&lt;/p&gt;
&lt;p&gt;三样都想要，往往只能选两样。模型大一点，容量先告急；上下文长一点，KV 先告急；量化到极限，容量和速度都好了，质量开始告急。&lt;/p&gt;
&lt;p&gt;显存不够的时候，就只能 offload，把一部分层、专家或者 KV 放到内存甚至硬盘上。FlexGen[48] 是这套思路里比较有代表性的，它明确是拿吞吐换延迟、为了离线批处理设计的。PowerInfer[49] 利用激活的局部性，把经常被用到的神经元留在 GPU 上，热的算 GPU、冷的算 CPU（central processing unit，中央处理器）。LLM in a flash[50] 更直接，从闪存里流式读权重。这些方案[48-51]都能让你把原本跑不动的模型跑起来，但共同点是 decode 会掉到另一个数量级，而且速度被内存带宽、PCIe 带宽或者硬盘速度按着。顺便一提，普通内存的带宽往往只有显卡显存的几分之一到十几分之一，这个落差是补不回来的。&lt;/p&gt;
&lt;p&gt;多卡是另一条路。Megatron-LM 那套张量并行[52]把权重切开放在几张卡上，但每一层、每一轮都要卡间通信。消费级卡大多没有 NVLink，只能走 PCIe（Peripheral Component Interconnect Express，一种高速外设互连标准），decode 本来就是访存受限，再叠上通信，两张卡不一定等于一张快一倍的卡。&lt;/p&gt;
&lt;p&gt;最后还有两个容易被忘掉的环节。一个是冷启动，第一次跑模型要把几个 G 的权重从磁盘读进显存，这段时间也是用户实实在在在等的。另一个是散热，笔记本上连续生成，前几分钟和后十几分钟经常不是一个速度。&lt;/p&gt;
&lt;h2&gt;我在这台 M4/16G 上测了一组数&lt;/h2&gt;
&lt;p&gt;光说原理没意思，我在手头的机器上量了一组。机器是 Apple M4、16GB 统一内存，模型是 qwen3.5:2b（ollama 0.35.0）[53]，ollama ps 里显示 2.5GB、百分之百在 GPU 上。温度设成 0，上下文窗口 8192，每次请求固定生成大约 200 个 token。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;提示词 token 数&lt;/th&gt;
&lt;th&gt;prefill&lt;/th&gt;
&lt;th&gt;decode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;736&lt;/td&gt;
&lt;td&gt;262.5 token/s&lt;/td&gt;
&lt;td&gt;17.7 token/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3720&lt;/td&gt;
&lt;td&gt;184.8 token/s&lt;/td&gt;
&lt;td&gt;14.5 token/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7377&lt;/td&gt;
&lt;td&gt;185.8 token/s&lt;/td&gt;
&lt;td&gt;12.5 token/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;另外测了一次流式输出：3716 个 token 的提示词，TTFT 是 20.3 秒，对应的 prefill 速度是 185.6 token/s。&lt;/p&gt;
&lt;p&gt;这几个数字能对上前面讲的东西。decode 只有 prefill 的十分之一上下，这就是访存受限和计算受限的差别。上下文从七百多涨到七千多，decode 从 17.7 掉到 12.5，这是每步要多读 KV 的代价。至于那个 20 秒的 TTFT，就是本地跑长文档问答难受的根源——不是模型不行，是它得先把整篇读完。&lt;/p&gt;
&lt;p&gt;这里必须补一句，免得误导。上表都是单次测量，同一台机器在不同时刻会飘，散热、后台负载都会影响。而且我测的过程中撞上过一个现象：同一个前缀重复请求时，prefill 会「消失」，我见过 3812 个 token 只花 0.12 秒的情况，那是前缀缓存命中了。这事对 agent 场景反而是好消息：反复带着同一段系统提示词去调用，第二次几乎不用再花 prefill 的钱。&lt;/p&gt;
&lt;h2&gt;那到底该看什么&lt;/h2&gt;
&lt;p&gt;如果只是聊天、写东西，decode 速率最要紧，每秒十几到二十个 token 人就能接受。这种场景下，选一个小一点、别压到极限的模型，往往比选个大模型再量化到 2bit 舒服。&lt;/p&gt;
&lt;p&gt;如果是长文档问答、代码库问答，那 prefill 和 KV 才是重点。先看显存够不够放下那么长的 KV，再看那几十秒的 TTFT 你能不能忍。另外也得记住，上下文塞得越长，模型对中间内容的使用往往越差[54]。&lt;/p&gt;
&lt;p&gt;如果是多用户，或者要拿它当服务跑，就得看吞吐和 goodput，考虑连续批处理和前后分离那一套。&lt;/p&gt;
&lt;p&gt;如果是 agent 那种反复调用、上下文高度重复的用法，前缀缓存能救命[36-37]。&lt;/p&gt;
&lt;p&gt;说到底，本地跑模型不是一道「能不能跑」的是非题，而是「哪一段慢、你受不受得了」的取舍题。prefill、decode和KV都要关注，重要的是要根据场景来具体衡量。&lt;/p&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Transformer 原始架构&lt;/strong&gt;：Vaswani, A. et al. "Attention Is All You Need." NeurIPS（Neural Information Processing Systems）2017. arXiv:1706.03762. https://arxiv.org/abs/1706.03762&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MoE（mixture of experts）&lt;/strong&gt;：Fedus, W., Zoph, B., Shazeer, N. "Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity." JMLR（Journal of Machine Learning Research）2022. arXiv:2101.03961. https://arxiv.org/abs/2101.03961&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;prefill 与 decode 的算力/带宽分析&lt;/strong&gt;：Pope, R. et al. "Efficiently Scaling Transformer Inference." MLSys（Conference on Machine Learning and Systems）2023. arXiv:2211.05102. https://arxiv.org/abs/2211.05102&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;算术强度与屋顶线模型&lt;/strong&gt;：Williams, S., Waterman, A., Patterson, D. "Roofline: An Insightful Visual Performance Model for Multicore Architectures." Communications of the ACM（Association for Computing Machinery）, 52(4):65–76, 2009. DOI（Digital Object Identifier）: 10.1145/1498765.1498785&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FlashAttention&lt;/strong&gt;：Dao, T. et al. "FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness." NeurIPS 2022. arXiv:2205.14135. https://arxiv.org/abs/2205.14135&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FlashAttention-2&lt;/strong&gt;：Dao, T. "FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning." arXiv:2307.08691. https://arxiv.org/abs/2307.08691&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM（large language model）推理的屋顶线综述&lt;/strong&gt;：Yuan, Z. et al. "LLM Inference Unveiled: Survey and Roofline Model Insights." arXiv:2402.16363. https://arxiv.org/abs/2402.16363&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高效推理综述&lt;/strong&gt;：Zhou, Z. et al. "A Survey on Efficient Inference for Large Language Models." arXiv:2404.14294. https://arxiv.org/abs/2404.14294&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推理性能调优实务&lt;/strong&gt;：Databricks. "LLM Inference Performance Engineering: Best Practices." https://www.databricks.com/blog/llm-inference-performance-engineering-best-practices&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GGUF（GPT-Generated Unified Format）量化格式&lt;/strong&gt;：ggml 项目文档, "GGUF." https://raw.githubusercontent.com/ggml-org/ggml/master/docs/gguf.md&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;llama.cpp&lt;/strong&gt;：https://github.com/ggml-org/llama.cpp&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存墙&lt;/strong&gt;：Wulf, W. A., McKee, S. A. "Hitting the Memory Wall: Implications of the Obvious." ACM SIGARCH（Special Interest Group on Computer Architecture）Computer Architecture News, 23(1):20–24, 1995. DOI: 10.1145/216585.216588&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续批处理（迭代级调度）&lt;/strong&gt;：Yu, G.-I. et al. "Orca: A Distributed Serving System for Transformer-Based Generative Models." OSDI（Operating Systems Design and Implementation）2022. https://www.usenix.org/system/files/osdi22-yu.pdf&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;连续批处理的科普说明&lt;/strong&gt;：Anyscale. "Achieve 23x LLM Inference Throughput &amp;amp; Reduce p50 Latency"（continuous batching 那一篇）. https://www.anyscale.com/blog/continuous-batching-llm-inference&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TensorRT-LLM（Tensor Runtime for Large Language Model，含 in-flight batching 与 kernel 实现）&lt;/strong&gt;：https://github.com/NVIDIA/TensorRT-LLM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KV（key-value）cache 的工程说明&lt;/strong&gt;：Hugging Face Transformers Documentation, "KV cache." https://huggingface.co/docs/transformers/en/kv_cache&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MQA（multi-query attention）&lt;/strong&gt;：Shazeer, N. "Fast Transformer Decoding: One Write-Head is All You Need." arXiv:1911.02150. https://arxiv.org/abs/1911.02150&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GQA（grouped-query attention）&lt;/strong&gt;：Ainslie, J. et al. "GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints." EMNLP（Conference on Empirical Methods in Natural Language Processing）2023. arXiv:2305.13245. https://arxiv.org/abs/2305.13245&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MLA（multi-head latent attention）与 KV（key-value）压缩&lt;/strong&gt;：DeepSeek-AI. "DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model." arXiv:2405.04434. https://arxiv.org/abs/2405.04434&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PagedAttention 与 vLLM&lt;/strong&gt;：Kwon, W. et al. "Efficient Memory Management for Large Language Model Serving with PagedAttention." SOSP（Symposium on Operating Systems Principles）2023. arXiv:2309.06180. https://arxiv.org/abs/2309.06180&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vLLM 的分页注意力实现说明&lt;/strong&gt;：vLLM Documentation, "Paged Attention." https://docs.vllm.ai/en/latest/design/paged_attention/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KV（key-value）量化&lt;/strong&gt;：Liu, Z. et al. "KIVI: A Tuning-Free Asymmetric 2bit Quantization for KV Cache." ICML 2024. arXiv:2402.02750. https://arxiv.org/abs/2402.02750&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KV（key-value）淘汰（H2O，Heavy-Hitter Oracle）&lt;/strong&gt;：Zhang, Z. et al. "H2O: Heavy-Hitter Oracle for Efficient Generative Inference of Large Language Models." NeurIPS 2023. arXiv:2306.14048. https://arxiv.org/abs/2306.14048&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注意力汇聚与 StreamingLLM&lt;/strong&gt;：Xiao, G. et al. "Efficient Streaming Language Models with Attention Sinks." ICLR 2024. arXiv:2309.17453. https://arxiv.org/abs/2309.17453&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flash-Decoding&lt;/strong&gt;：Dao, T. et al. "Flash-Decoding for Long-Context Inference." PyTorch Blog, 2023. https://pytorch.org/blog/flash-decoding/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;min-p 采样&lt;/strong&gt;：Nguyen, M. N. et al. "Turning Up the Heat: Min-p Sampling for Creative and Coherent LLM Outputs." ICLR 2025. arXiv:2407.01082. https://arxiv.org/abs/2407.01082&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核采样&lt;/strong&gt;：Holtzman, A. et al. "The Curious Case of Neural Text Degeneration." ICLR 2020. arXiv:1904.09751. https://arxiv.org/abs/1904.09751&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重复惩罚的来源&lt;/strong&gt;：Keskar, N. S. et al. "CTRL: A Conditional Transformer Language Model for Controllable Generation." arXiv:1909.05858. https://arxiv.org/abs/1909.05858&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化输出（XGrammar）&lt;/strong&gt;：Dong, Y. et al. "XGrammar: Flexible and Efficient Structured Generation Engine for Large Language Models." arXiv:2411.15100. https://arxiv.org/abs/2411.15100&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;以 goodput 为目标的分离式服务&lt;/strong&gt;：Zhong, Y. et al. "DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving." OSDI 2024. arXiv:2401.09670. https://arxiv.org/abs/2401.09670&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推理基准测试方法&lt;/strong&gt;：MLCommons. MLPerf（Machine Learning Performance）Inference. https://mlcommons.org/benchmarks/inference-datacenter/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推理优化技术综述（NVIDIA）&lt;/strong&gt;：NVIDIA. "Mastering LLM Techniques: Inference Optimization." https://developer.nvidia.com/blog/mastering-llm-techniques-inference-optimization/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;chunked prefill&lt;/strong&gt;：Agrawal, A. et al. "SARATHI: Efficient LLM Inference by Piggybacking Decodes with Chunked Prefills." arXiv:2308.16369. https://arxiv.org/abs/2308.16369&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前后分离&lt;/strong&gt;：Patel, P. et al. "Splitwise: Efficient Generative LLM Inference Using Phase Splitting." ISCA（International Symposium on Computer Architecture）2024. arXiv:2311.18677. https://arxiv.org/abs/2311.18677&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vLLM 的分离式预填充&lt;/strong&gt;：vLLM Documentation, "Disaggregated Prefill." https://docs.vllm.ai/en/latest/features/disagg_prefill/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前缀缓存与 RadixAttention&lt;/strong&gt;：Zheng, L. et al. "SGLang: Efficient Execution of Structured Language Model Programs." NeurIPS 2024. arXiv:2312.07104. https://arxiv.org/abs/2312.07104&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vLLM 的自动前缀缓存&lt;/strong&gt;：vLLM Documentation, "Automatic Prefix Caching." https://docs.vllm.ai/en/latest/features/automatic_prefix_caching/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPTQ&lt;/strong&gt;：Frantar, E. et al. "GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers." ICLR（International Conference on Learning Representations）2023. arXiv:2210.17323. https://arxiv.org/abs/2210.17323&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AWQ&lt;/strong&gt;：Lin, J. et al. "AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration." MLSys 2024. arXiv:2306.00978. https://arxiv.org/abs/2306.00978&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLM（large language model）.int8()&lt;/strong&gt;：Dettmers, T. et al. "LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale." NeurIPS 2022. arXiv:2208.07339. https://arxiv.org/abs/2208.07339&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SmoothQuant&lt;/strong&gt;：Xiao, G. et al. "SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models." ICML 2023. arXiv:2211.10438. https://arxiv.org/abs/2211.10438&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;投机解码&lt;/strong&gt;：Leviathan, Y., Kalman, M., Matias, Y. "Fast Inference from Transformers via Speculative Decoding." ICML（International Conference on Machine Learning）2023. arXiv:2211.17192. https://arxiv.org/abs/2211.17192&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;投机采样&lt;/strong&gt;：Chen, C. et al. "Accelerating Large Language Model Decoding with Speculative Sampling." arXiv:2302.01318. https://arxiv.org/abs/2302.01318&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medusa&lt;/strong&gt;：Cai, T. et al. "Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads." ICML 2024. arXiv:2401.10774. https://arxiv.org/abs/2401.10774&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EAGLE&lt;/strong&gt;：Li, Y. et al. "EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty." ICML 2024. arXiv:2401.15077. https://arxiv.org/abs/2401.15077&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;vLLM 的投机解码&lt;/strong&gt;：vLLM Documentation, "Speculative Decoding." https://docs.vllm.ai/en/latest/features/speculative_decoding/&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mixtral&lt;/strong&gt;：Jiang, A. Q. et al. "Mixtral of Experts." arXiv:2401.04088. https://arxiv.org/abs/2401.04088&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单卡 offload 的吞吐型方案（FlexGen）&lt;/strong&gt;：Sheng, Y. et al. "FlexGen: High-Throughput Generative Inference of Large Language Models with a Single GPU." ICML 2023. arXiv:2303.06865. https://arxiv.org/abs/2303.06865&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;激活局部性与 CPU（central processing unit）/GPU（graphics processing unit）协作（PowerInfer）&lt;/strong&gt;：Song, Y. et al. "PowerInfer: Fast Large Language Model Serving with a Consumer-grade GPU." SOSP 2024. arXiv:2312.12456. https://arxiv.org/abs/2312.12456&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;从闪存流式推理（LLM in a flash）&lt;/strong&gt;：Alizadeh, K. et al. "LLM in a Flash: Efficient Large Language Model Inference with Limited Memory." ACL（Association for Computational Linguistics）2024. arXiv:2312.11514. https://arxiv.org/abs/2312.11514&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多卡推理与 offload&lt;/strong&gt;：Aminabadi, R. Y. et al. "DeepSpeed Inference: Enabling Efficient Inference of Transformer Models at Unprecedented Scale." SC（Supercomputing Conference）2022. arXiv:2207.00032. https://arxiv.org/abs/2207.00032&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;张量并行&lt;/strong&gt;：Shoeybi, M. et al. "Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism." arXiv:1909.08053. https://arxiv.org/abs/1909.08053&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ollama（本地运行的默认参数与行为）&lt;/strong&gt;：https://github.com/ollama/ollama&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长上下文中的位置效应&lt;/strong&gt;：Liu, N. F. et al. "Lost in the Middle: How Language Models Use Long Contexts." TACL（Transactions of the Association for Computational Linguistics）2024. arXiv:2307.03172. https://arxiv.org/abs/2307.03172&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="LLM"/><category term="本地模型"/><category term="推理"/><category term="prefill"/><category term="decode"/><category term="KV cache"/><category term="显存"/></entry><entry><title>想让小孩不沉迷手机，大人自己得先做得到</title><link href="https://blog.cycleuser.org/xiang-rang-xiao-hai-bu-chen-mi-shou-ji.html" rel="alternate"/><published>2026-09-29T00:00:00+08:00</published><updated>2026-09-29T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-29:/xiang-rang-xiao-hai-bu-chen-mi-shou-ji.html</id><summary type="html">&lt;h1&gt;想让小孩不沉迷手机，大人自己得先做得到&lt;/h1&gt;
&lt;p&gt;我留意到，不少家长自己闲下来的时候，手里总是拿着部手机刷短视频。陪孩子 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;想让小孩不沉迷手机，大人自己得先做得到&lt;/h1&gt;
&lt;p&gt;我留意到，不少家长自己闲下来的时候，手里总是拿着部手机刷短视频。陪孩子的时候呢，参与得其实不算多，好像一时也拿不出什么别的给孩子玩儿，最后就让孩子也一起看手机。小朋友见惯了，可能就只觉得这一个东西是最好玩儿的了。&lt;/p&gt;
&lt;p&gt;今天上午我跟二儿子玩的时候，其实也不能说是我在陪他玩，而是我在给我大儿子用乐高拼城墙和赛车，然后二儿子就在旁边拿点「边角料」之类的在那玩，相当于气氛组吧。他动不动就拿着一个拼好的车说「it is beautiful」之类的，然后拿一个小车去一边玩。中午大儿子跟着玩了一会，二儿子在旁边要捣乱，我就拿了一个他说 beautiful 的车，弄了个硬纸板，跟他跑到另一个屋子，摆了一个斜坡，教他把小车从坡顶上滚下来，他就开心得不得了。我问他「are you happy」，他就说 yes。&lt;/p&gt;
&lt;p&gt;如果成年人自己的娱乐，也就是看看手机、刷刷短视频这一种，大概也会觉得陪孩子摆积木，或者拿纸壳板子搭个坡道，是件挺费事的事情。想让小朋友不去沉迷于小屏幕，或许大人得自己能做得到才行。&lt;/p&gt;
&lt;p&gt;我们上一代人当年所喜欢的，大概是打麻将打牌，又或者抽烟喝酒等等。这些爱好，我们这代人多少也继承了一些，如今在十几岁的孩子身上，偶尔也能见到。前几天我爱人带我去看望她师傅师娘，师傅一听我不吸烟不喝酒不嚼槟榔还表示很赞赏，然后我说我非常爱打游戏，而且带着孩子一起玩赛车（其实我主要是老滚资深潜行双持，骑砍老牌弓骑兵，以及地平线和尘埃资深菜鸟级驾驶爱好者），老师傅脸上的表情，有一闪而过的尴尬。可能在他们那代人眼里，打游戏也许还是一个不太好的爱好。&lt;/p&gt;
&lt;p&gt;我又想起来，在大概十多年前，曾经发生过一幕名场面，叫做《看你妹之网瘾战争》。如果以我如今每天上网的频率和时长来看，大概也会被当时的雷电法王羊较瘦记成「重度网瘾」，说不定还得被建议电一电。&lt;/p&gt;
&lt;p&gt;记得大概是七年前在某院校遇到的一位同事，就曾经说他自己的家长将他的电脑硬盘全都砸碎了，认为他在家里「天天玩电脑是不务正业」，而他其实是从事艺术设计专业的，因此他的代表作的原稿、草稿等等都没能恢复。当时他已经接近四十岁了，好像本来是准备用这些未发表的原稿去申请罗德岛的博士后机会来着什么的来着，反正是付诸流水，而家里长辈大概一直觉得自己是对的。&lt;/p&gt;
&lt;p&gt;现在大学生的家长群体大概都是我这一辈人了，或许不至于那么执拗了。不过上半年也听说有某所谓「报考机构」的「传承人」，与他自家祖师「建议大学生一定要有电脑」的遗训反着来，建议家长不要给大学新生准备电脑，还说手机也能剪辑视频。每一代人里，大概都会冒出几个让人意外的主张，这种事总归是有概率的。&lt;/p&gt;
&lt;p&gt;我大儿子打游戏，大概也就是最开始沉迷 2048，然后借着这个机会教了他二进制和指数与对数的基础知识，他能够从 2 一直翻倍到 262144，后来更是能到 524288，乃至 1048576。而我带的很多大一新生，大概也就算到 65536 了。当然这没什么可炫耀的，只是足够有噱头，可以用来忽悠大一的小朋友们，给他们一点小小的压力。&lt;/p&gt;
&lt;p&gt;后来我大儿子长大一些，主要玩的就是地平线 4 和地平线 5。地平线 6 刚出的时候，我们那台 RX580 显卡的机器跑不动，后来是用 SteamDeck 之后才买的，最近他就玩地平线 6 了。英国和日本靠左开车，墨西哥则是和咱们大陆地区一样右侧开车，然后一些底盘低的车在草地或者砂石路面会出现底盘剐蹭的情况，所以我大儿子也特别喜欢 SUV 或者更高底盘的硬派越野了。另外他还发现速度超过 150 在有些比较小半径的弯道就容易转向不足，而且他还发现路上有交通参与的时候车速太快容易和其他车辆磕碰，所以他现在日常赶路开车都控制车速在 120 以内，有的窄路甚至会降低到 80 以下，感觉完全成了一个老司机了。最开始他时不时地陷车了或者走错了还要让我帮忙开出来，后来他基本都能自己找到地方了。而且改装的时候，他开始主动控制车辆参数评级，就比如尽量不动发动机和变速箱，而只是改进其他部件，这样和同级别的车型比赛的时候就会有很大优势；而如果冒然升级到更高评级，反而可能跑不过人家了。有一辆 EVO 我给改成了 X 级了，他就很不满意。这类游戏里的这些体验，似乎都不是简单的「充值变强」，而是需要自己去试、去琢磨。&lt;/p&gt;
&lt;p&gt;我觉得，能够反思可能是学习中最重要的事情了。如果从来不反思，也不知道自己错在哪里，那每次都可能是要么就寄希望于侥幸不要碰到自己不会的东西，要么就是下次重复上一次的错误，怎么可能有改进呢？&lt;/p&gt;
&lt;p&gt;游戏大概也算不上什么洪水猛兽，说是事实上的第九艺术，也不算太离谱，如今还衍生出了专门的电子竞技。也许很多体育运动当年最开始的时候也就是一种游戏，逐渐地成了流行的项目，甚至也被冠以「为 XXXX 争光」之类的额外信息量，结果一旦输了，不少人跟着心里就过不去，甚至去责怪运动员。输不起的人，赢来的或许也未必守得住；只盯着输赢而不在意事情本身，大概也长久不了。&lt;/p&gt;
&lt;p&gt;我一直不太能接受吸烟和饮酒，说到底，大概是我自己的偏执。我总觉得，光合作用和耕种的土壤都是有限的，拿来种植烟草，别的作物就要少一些；而烟草烧过之后，不过是让人摄入些焦油、尼古丁之类。酒精饮料又会牵出各种各样的社会问题，而酒精本身本来可以拿去做燃料、做化工原材料或者消毒，酿酒用的粮食，本来也有机会送到饥饿的人群手里。&lt;/p&gt;
&lt;p&gt;反正越来越发觉，很多事情很多问题，咱们祖先确实是都发现了，正所谓「不患寡而患不均」。这个均，我倒不觉得一定要解读成机械的平均，甚至未必是物质资料上的平均，或许更可以指机会上的均等。&lt;/p&gt;
&lt;p&gt;可是机会真的均等么？一涉及到价值判断，大概处处都是难题。一样的一所学校，有的地方要比其他地方高几十分甚至接近一百分，才能考入，自从洪武年间的「南北榜」以来，问题是否真的完全解决了呢？&lt;/p&gt;
&lt;p&gt;我身上若干关节患有伤病，现代医疗技术只能避免相关位置的症状恶化，只要不恶化，对付着能走路，就还不至于太严重，也就对付了。那我是不是就知足了，是不是就不用去考虑其他的，也根本不抱着任何治愈的希望了呢？人类未必不能彻底治愈这类疾病，可投入到一种病上的精力，不见得能挪去研究别的病，于是大概总有些病，一时半会儿是攻不下来的。&lt;/p&gt;
&lt;p&gt;想当年，有学外语的朋友跟我说，「存在即合理」这句话好像是当年一些走狗文人为了给当时的反动势力辩护而强行歪曲翻译的。我倒是觉得，那样的说法，可能还是尖锐了些。 &lt;/p&gt;</content><category term="Story"/><category term="育儿"/><category term="教育"/><category term="游戏"/><category term="反思"/></entry><entry><title>给儿子买了一台 609 元的二手 MacBook Air</title><link href="https://blog.cycleuser.org/gei-er-zi-mai-liao-yi-tai-609-yuan-de-er-shou-macbook-air.html" rel="alternate"/><published>2026-09-27T10:00:00+08:00</published><updated>2026-09-27T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-27:/gei-er-zi-mai-liao-yi-tai-609-yuan-de-er-shou-macbook-air.html</id><summary type="html">&lt;p&gt;我家大儿子今年开始对编程有点兴趣。作为父亲，我自然想给他弄个能写代码的工具。跟很多家长一样，我也有点纠结：买性 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我家大儿子今年开始对编程有点兴趣。作为父亲，我自然想给他弄个能写代码的工具。跟很多家长一样，我也有点纠结：买性能太强的吧，一是浪费钱，二是怕他沉迷游戏。我自己也玩游戏，不过平时也不完全禁止孩子玩，只是每次只让他玩 20 分钟，比如父子俩一起跑个赛车。这样能控制时间，不至于长时间盯着屏幕。他遗传了我的近视，而且也是眼睛容易累，这点我太清楚了。我自己眼睛就容易干、容易累，平时只能用直流调光的 LCD 屏，LED 屏完全没法看。所以给他选机器，屏幕也得考虑。&lt;/p&gt;
&lt;p&gt;当然，最根本的原因还是穷。预算有限，只能省。最后我在二手平台上买了一台 MacBook Air 13 英寸（2017 年中款）。加上一个第三方的 PD 充电器转接，一共花了 609 块。其中机器 559，转接头 50。&lt;/p&gt;
&lt;p&gt;说实话，609 块在电脑没涨价的年头，能买到配置比这高得多的二手笔记本。但后来想来想去，还是选了这台。一是噪音小，二是现在 macOS 最新版本只到 12.7，虽然老，但很多工具软件还能跑，尤其是编程用的那些，基本上都能用到最新版，给他用也还行。再一个，是在正规二手渠道买的，有一定质保，心里踏实点。还有一点，这种 Intel 处理器的 x86_64 平台的老 MacBook，除了用过时的 macOS 之外，还可以方便地安装 Linux 操作系统。哪天这种旧版本的 macOS 彻底跟不上新软件了，装个主流发行版照样能接着干活，所以也是个好处。&lt;/p&gt;
&lt;p&gt;最近总有学生和家长问我，要不要买电脑、买什么电脑。我觉得现在的电脑价格跟以前不一样了。去年这会儿，最低可能只有五千多，最高顶多也就是七八千块，能买到 4060、5060 显卡加上7845、7945 处理器的机器。当时看着很一般，现在居然要一万多甚至快两万。这时候就没必要花那么多钱了，除非你真有需求。如果没有运行本地模型或机器学习的需求，一般场景，也不剪视频，不是那种专业用途，这种老机器也能对付。但我建议孩子最好还是别用这种东西。质保是个问题，系统环境旧，软件安装容易遇到各种坑，整体就很不推荐。不过有时候预算实在低，又需要一个轻薄长续航的笔记本，只做文本处理和简单的 Python 脚本，而且不用本地模型、用在线模型，配合 opencode、workbuddy 或者 pi agent 这类工具，那倒是可以考虑。&lt;/p&gt;
&lt;p&gt;这台机器的配置大概是：i7-5650U 双核四线程，8GB 内存，128GB SSD，13.3 英寸 1440x900 屏幕，电池 54Wh，重 1.35kg。系统是 macOS Monterey 12.7.6。对于写代码来说，这个配置不算强，但跑轻量级的 Python、前端开发、写文档都够用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="系统截图" src="images/macbook_air_2017_system.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="购买价格" src="images/macbook_air_2017_price.jpg"&gt;&lt;/p&gt;
&lt;p&gt;下面我把这台机器上装的工具和版本都列一下，顺便查了查最新的版本，看看差多少。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;文档中记录版本&lt;/th&gt;
&lt;th&gt;最新版本&lt;/th&gt;
&lt;th&gt;是否最新&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visual Studio Code&lt;/td&gt;
&lt;td&gt;1.139.1&lt;/td&gt;
&lt;td&gt;1.139.1&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Chrome&lt;/td&gt;
&lt;td&gt;150.0.7871.125&lt;/td&gt;
&lt;td&gt;154.0.8037.57&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefox&lt;/td&gt;
&lt;td&gt;156.0.1&lt;/td&gt;
&lt;td&gt;156.0.1&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;v22.14.0 (LTS)&lt;/td&gt;
&lt;td&gt;v24.21.0 (LTS)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Git&lt;/td&gt;
&lt;td&gt;2.37.1 (Apple Git-137.1)&lt;/td&gt;
&lt;td&gt;2.55.0&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python (系统)&lt;/td&gt;
&lt;td&gt;3.7.3&lt;/td&gt;
&lt;td&gt;3.14.7&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python (conda base)&lt;/td&gt;
&lt;td&gt;3.7.3&lt;/td&gt;
&lt;td&gt;3.14.7&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python (conda dev)&lt;/td&gt;
&lt;td&gt;3.12.9&lt;/td&gt;
&lt;td&gt;3.14.7&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenCode&lt;/td&gt;
&lt;td&gt;v2.0.18&lt;/td&gt;
&lt;td&gt;v1.18.32&lt;/td&gt;
&lt;td&gt;beta版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pi Agent&lt;/td&gt;
&lt;td&gt;0.87.1&lt;/td&gt;
&lt;td&gt;0.87.1&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conda&lt;/td&gt;
&lt;td&gt;4.6.14&lt;/td&gt;
&lt;td&gt;26.7.2&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;微信&lt;/td&gt;
&lt;td&gt;4.1.15&lt;/td&gt;
&lt;td&gt;4.1.15&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WPS Office&lt;/td&gt;
&lt;td&gt;12.1.29166&lt;/td&gt;
&lt;td&gt;12.1.29166&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WorkBuddy&lt;/td&gt;
&lt;td&gt;5.6.2&lt;/td&gt;
&lt;td&gt;5.6.2&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UU远程&lt;/td&gt;
&lt;td&gt;4.42.0&lt;/td&gt;
&lt;td&gt;4.42.0&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;说几个有意思的地方。&lt;/p&gt;
&lt;p&gt;虽然这 macOS 12.7 已经很老了，可依然还是能安装很多最新版的软件，比如 VS Code、Firefox 、WPS 、微信、UU远程等等。Chrome 差了几个大版本，不过日常上网也感觉不出来。Node.js 的 LTS 已经从 22 升到 24 了，Git 也差得比较多，系统自带的 Python 3.7.3 更是老古董，conda 那个 4.6.14 也是老得不行。&lt;/p&gt;
&lt;p&gt;比较关键的，可能还是 WorkBuddy 和 OpenCode，前者方便远程登录用手机操控本地应用和文件，而后者本身是个很好用的 AI 编程助手，这俩装上之后配合在线模型，写点小脚本、改改代码都很顺手，而且在这种老设备的老系统上，前者能安装最新版，后者的 beta 版本还能安装。&lt;/p&gt;
&lt;p&gt;Pi Agent 的版本 0.87.1 跟最新一致，这个没问题，也是个很方便的 AI 编程助手了。&lt;/p&gt;
&lt;p&gt;这台机器装的东西不多，够用就行。Python 用的是 conda 里的 dev 环境，3.12.9，虽然比最新的 3.14.7 旧，但跑一般脚本没问题。VS Code 是最新版，配上 Python 插件和 AI 辅助工具，给小孩入门编程足够了。浏览器主力是 Firefox，日常打开视频网站或者查资料足够了。&lt;/p&gt;
&lt;p&gt;这回买二手老机器，图的就是便宜。但便宜有便宜的代价：系统老、软件装不上、电池可能不耐用、质保基本靠运气。如果预算实在紧，又只是给孩子学学 Python、写点简单代码，那这种几百块的机器确实能顶一阵子。但如果要重度使用计算机，不只是学学敲代码，还要做模型、写项目、跑本地模型、剪视频等等，那还是攒攒钱买台更高配置一点的。毕竟机会和时间都是更高成本的，折腾环境的时间多了，学习热情容易消磨掉，而且有的事情，配置低了就是做不了。&lt;/p&gt;
&lt;p&gt;给我儿子买的这台二手机器，除了简单敲敲代码，也就是用来连接他的MIDI键盘以及声卡等等，新版本M4芯片的机器上我试了当年的MIDI键盘和旧声卡就无法识别了，还好用十来年前老机器能连接，这样给他玩Garageband也好哄他弟弟玩。我大儿子最近开始尝试听音记谱了，只不过还是有时候不太熟练不太准确，这回有了Garageband，或许他能玩得更开心一些。&lt;/p&gt;</content><category term="随笔"/><category term="二手"/><category term="MacBook"/><category term="编程环境"/><category term="Python"/><category term="VSCode"/><category term="opencode"/><category term="pi agent"/></entry><entry><title>BianQue（扁鹊）：一个纯 Python 的硬件验机工具，顺便给孩子们当 Python 案例</title><link href="https://blog.cycleuser.org/bianquebian-que-yi-ge-chun-python-de-ying-jian-yan-ji-gong-ju-shun-bian-gei-hai-zi-men-dang-python-an-li.html" rel="alternate"/><published>2026-09-26T15:30:00+08:00</published><updated>2026-09-26T15:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-26:/bianquebian-que-yi-ge-chun-python-de-ying-jian-yan-ji-gong-ju-shun-bian-gei-hai-zi-men-dang-python-an-li.html</id><summary type="html">&lt;p&gt;我最近越来越懒，也越来越想把手里那些零零碎碎的工作流，尽量都用 Python 来实现。倒不是说 Python 有多好，主要是它什么都有现 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我最近越来越懒，也越来越想把手里那些零零碎碎的工作流，尽量都用 Python 来实现。倒不是说 Python 有多好，主要是它什么都有现成的库，写起来快，改起来也快，跑到哪儿都行。之前弄过命令行的邮件工具 FengTang，弄过给论文 PDF 改名的 Chou，这回轮到验机了。&lt;/p&gt;
&lt;p&gt;事情是这样的，现在电脑也都比较贵，有的老师和同学甚至准备考虑买二手电脑，反正不管是新电脑还是二手电脑，到手第一件事得验机——屏幕有没有坏点，摄像头能不能成像，麦克风扬声器灵不灵，键盘每个键是不是都响，散热会不会过热降频，电池健康度怎么样，固态硬盘读写速度达不达标。&lt;/p&gt;
&lt;p&gt;这些东西去网上找一圈，要么是收费软件，要么是那种绿色单文件但塞了一堆广告的，要么就只支持 Windows。我们专业的同学可能用Linux多一些，那我就想，这玩意儿咱们用 Python 攒一个不行吗。&lt;/p&gt;
&lt;p&gt;名字我起叫 BianQue，扁鹊。扁鹊是神医，望闻问切四诊法。你发现没有，验机其实也是这四个字：望，看屏幕看摄像头；闻，听扬声器听麦克风；问，把 CPU、内存、显卡、磁盘的信息都问出来；切，给 CPU 加压摸摸它热不热。所以叫扁鹊，我觉得挺贴切。&lt;/p&gt;
&lt;p&gt;这个是用 PySide6 做的界面，其实还是沿袭了我这么多年的老一套 GUI 开发的套路，左边一列导航，右边十三个检测页：硬件总览、屏幕、摄像头、麦克风、扬声器、键盘、鼠标、散热、电池、磁盘、内存、网络、报告。&lt;/p&gt;
&lt;p&gt;&lt;img alt="BianQue 硬件总览" src="images/bianque-硬件总览.png"&gt;&lt;/p&gt;
&lt;p&gt;有几个地方做得有点呆，比如是屏幕坏点检测，点进去会全屏显示纯色，红绿蓝白黑灰六种颜色轮着来，你盯着看有没有亮点暗点就行。这里有个小细节：提示文字要是固定停在屏幕一个角，那那个角的坏点你就永远看不见了，所以我让它沿着屏幕边缘慢慢漂移，不挡任何地方。再一个是键盘检测，画了个虚拟键盘在屏幕上，你按哪个键它就变绿，全按绿了就说明都灵。这里头 Tab 键是个坑，Qt 默认拿它来切焦点，一开始死活映射不到，后来是重写了焦点切换的方法才搞定。麦克风那页显示一个实时电平表，你对着说话它就跳，还能录三秒回放给你听。扬声器是分开测左右声道的，先放一个只有左声道有声音的音，再放一个只有右声道的，你一听就知道喇叭接反没有。&lt;/p&gt;
&lt;p&gt;&lt;img alt="BianQue 屏幕检测" src="images/bianque-屏幕检测.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="BianQue 散热压力测试" src="images/bianque-散热.png"&gt;&lt;/p&gt;
&lt;p&gt;信息采集这块也尽量往深里挖。CPU 能读到每核心的占用率，Apple Silicon 上还能分出性能核和能效核各几个；内存能读到每根内存的厂商、类型、容量，Windows 上还能读速度和通道数；显卡能读到芯片型号和它支持的图形接口，我这台读出来是 Metal 4；磁盘能分辨固态还是机械，读 SMART 健康状态。这些在 macOS 上有些拿不到——比如 Apple Silicon 的内存时序和频率，系统根本不暴露——读不到的我就不硬编，直接标个 N/A。&lt;/p&gt;
&lt;p&gt;界面做了十种语言，中英日法俄德葡西韩意，菜单栏一换，整个界面和导出的报告都跟着换。&lt;/p&gt;
&lt;p&gt;&lt;img alt="BianQue 英文界面" src="images/bianque-英文界面.png"&gt;&lt;/p&gt;
&lt;p&gt;我琢磨着，这东西还有个用处，就是上课。给大一的新生讲 Python，最怕的就是例子太抽象，什么"计算 1 到 100 的和"，写出来中规中矩，但是我自己都觉得困啊，而且这么抽象，可能学生不知道这玩意儿到底能干嘛。这个工具就不一样：读硬件信息用的是 psutil 和系统命令，界面是 PySide6，生成测试音是 numpy 算正弦波，录音是 sounddevice，全是真实的东西，跑起来立刻能看到结果——屏幕上真的出来你自己的摄像头画面，麦克风电平真的在跳。跟学生说"你们现在学的这些库，就能做出一个完整的验机软件"，比讲一百遍"Python 能做什么"都管用。&lt;/p&gt;
&lt;p&gt;安装就一行：&lt;code&gt;pip install bianque&lt;/code&gt;，然后敲 &lt;code&gt;bianque&lt;/code&gt; 就起来了。代码在 GitHub 上，地址是 https://github.com/cycleuser/BianQue ，PyPI 上是 https://pypi.org/project/bianque/ ，协议用的 GPL。&lt;/p&gt;
&lt;p&gt;当然这东西也糙，很多边界情况没处理，温度在 macOS 上读不到我也就摆烂了。但自己用、验个机、给学生当个例子，对付着也够了。有兴趣的可以克隆代码下来玩玩，有想加的检测项也欢迎提交改进。&lt;/p&gt;</content><category term="Tool"/><category term="Python"/><category term="硬件"/><category term="验机"/><category term="工具"/><category term="PySide6"/><category term="教学"/><category term="BianQue"/></entry><entry><title>FengTang（冯唐）：命令行下的邮件管理小工具，可以发邮件跟远程设备的智能体通信</title><link href="https://blog.cycleuser.org/fengtangfeng-tang-ming-ling-xing-xia-de-you-jian-guan-li-xiao-gong-ju-ke-yi-fa-you-jian-gen-yuan-cheng-she-bei-de-zhi-neng-ti-tong-xin.html" rel="alternate"/><published>2026-09-25T15:20:00+08:00</published><updated>2026-09-25T15:20:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-25:/fengtangfeng-tang-ming-ling-xing-xia-de-you-jian-guan-li-xiao-gong-ju-ke-yi-fa-you-jian-gen-yuan-cheng-she-bei-de-zhi-neng-ti-tong-xin.html</id><summary type="html">&lt;p&gt;作为敲代码的人，机器是有好几台了，比如宿舍一台台式机，家里一台常年开着的小机器，还有台云上的。平时想看看它们怎 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;作为敲代码的人，机器是有好几台了，比如宿舍一台台式机，家里一台常年开着的小机器，还有台云上的。平时想看看它们怎么样了，或者让它们顺手做点小事，正经办法当然是 SSH、远程桌面、或者搭个内网穿透。&lt;/p&gt;
&lt;p&gt;可这些SSH我嫌麻烦，自组远程局域网有时候特别慢，而UU远程好像不支持Linux，而向日葵好像不太支持Wayland，Workbuddy虽然能支持手机访问，但是毕竟要经过人家的服务器，方便倒是方便了，但还是感觉长文本情况下用着不够顺，尤其在外面拿手机的时候，敲不了命令行，用语音输入虽然方便，但不方便加图和王智登登，而且最重要的是我特别懒，也不想为了连一下去装一堆东西。&lt;/p&gt;
&lt;p&gt;后来我想，有件事是所有机器都能干、而且几乎不花钱的：发邮件。只要机器能上网，它就能往出发、也能往回收，中间隔着 NAT 也好、防火墙也好，都不碍事，因为它连出去是主动的。那我就顺着这个思路，给自己写了个命令行的小邮件工具，叫 FengTang。&lt;/p&gt;
&lt;p&gt;这东西不复杂，也没啥新鲜创意。就是把 SMTP、IMAP、POP3 三样都做了，能发能收，常见的认证方式都支持，Gmail 和 Outlook 那种 OAuth 也能登，这部分完全参考了 Thunderbird 的实现；收发的邮件存在本地一个 SQLite 库里，可以离线搜、打标记、做整理。它自己还带了个很小的邮件服务器，没配现成邮箱的时候，也能在本机把收发先跑通。另外我给智能体单独留了一整套接口，就是那种 function calling 的工具定义，模型能直接调它来读信、发信、搜索、标记。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;fengtang
fengtang
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;开源地址：https://github.com/cycleuser/FengTang.git&lt;/p&gt;
&lt;p&gt;我真正想要的用法其实很简单。在够不着的那台机器上挂一个智能体，让它隔一阵子看一眼信箱。有新邮件就照着里面的意思干活，干完回一封。我这边只要拿手机或者笔记本发一封出去，过一阵子就能收到回信。全程不用公网 IP，不用端口映射，路由器上啥也不用动。只要网络通，两边就能互相够得着。&lt;/p&gt;
&lt;p&gt;比如我发一封“看看磁盘还剩多少”，它回我一段 df 的结果；或者“把这个仓库拉下来跑一下测试”，它跑完把日志贴回来。它能主动发信回来这一点挺关键，说明这条线是双向的，不是只能我单方面下命令。&lt;/p&gt;
&lt;p&gt;登录这块也顺手做了。工具里有个交互式的 OAuth 登录，会弹浏览器让你点一下授权，token 自己存好；也支持把账号导出、导入，换机器的时候搬过去就行。所以给一台新机器配好这个信箱，并不算费事。&lt;/p&gt;
&lt;p&gt;需要注意的是，这事情本质上是对智能体友好的邮件通信，而并不是远程控制。邮件的往返是异步的，靠轮询，慢的时候得等上一会儿，交互性的事儿干不了，你没法拿它开个 shell 看实时输出。它也不像那些在线 AI 对话服务，能你一句我一句地实时聊；这边就是你发一封、等一封，节奏慢得多。再就是它靠不靠谱，很大程度看邮箱服务商，大厂对直投的信卡得很严，所以我一般拿一个已经能登录的邮箱当中转，就图个稳。&lt;/p&gt;
&lt;p&gt;安全上也得上心。能收信的那个邮箱，某种意义就是那台机器的钥匙，谁能发指令它就听谁的。所以我把凭据只放在本地配置文件里，权限收到 0600，导出去的时候默认用口令加密。这些都得自己注意，工具帮不上太多忙。&lt;/p&gt;
&lt;p&gt;说白了，这远不是给大家用的产品，就是我自己图方便捣鼓出来的。好处也就那么一点：只要能上网，就能跟一台远程机器保持来往，而且基本不花钱。做不到实时，也做不到直接控制，但好歹多了一条路。&lt;/p&gt;
&lt;p&gt;如果手里也有那种懒得搭环境的机器，不妨试试这个最土的办法——两边都拿邮件当传话筒。&lt;/p&gt;</content><category term="Tool"/><category term="邮件"/><category term="智能体"/><category term="远程"/><category term="自动化"/><category term="FengTang"/><category term="Python"/></entry><entry><title>AI 到底是不是泡沫？顺便说说显卡、内存、硬盘短期内还会不会降价</title><link href="https://blog.cycleuser.org/ai-dao-di-shi-bu-shi-pao-mo-shun-bian-shuo-shuo-xian-qia-nei-cun-ying-pan-duan-qi-nei-huan-hui-bu-hui-jiang-jie.html" rel="alternate"/><published>2026-09-23T00:00:00+08:00</published><updated>2026-09-23T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-23:/ai-dao-di-shi-bu-shi-pao-mo-shun-bian-shuo-shuo-xian-qia-nei-cun-ying-pan-duan-qi-nei-huan-hui-bu-hui-jiang-jie.html</id><summary type="html">&lt;h1&gt;AI 到底是不是泡沫？顺便说说显卡、内存、硬盘短期内还会不会降价&lt;/h1&gt;
&lt;p&gt;千问（Qwen）发布 27B 模型之后，其实就已经露出一个趋势了：本 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;AI 到底是不是泡沫？顺便说说显卡、内存、硬盘短期内还会不会降价&lt;/h1&gt;
&lt;p&gt;千问（Qwen）发布 27B 模型之后，其实就已经露出一个趋势了：本地模型不再只是玩具，也不再只是尝个鲜，而是成了一种能力虽然偏低、但可控性和安全性都很好的生产力工具。&lt;/p&gt;
&lt;p&gt;等到 MiniMax、H3 这类视频生成模型一出来，AI 到底还是不是泡沫，就更值得商榷和讨论了。用在生产场景里的工具调用，现在确实能用了——尤其是做讲义、做格式转换这些活。再有一个热点就是 AI 视频生成。B 站上有个《是，魏王》系列，是参考《是，首相》做的一个纯 AI 短剧，文本写得非常棒。在 AI 的帮助下，以前那些有很好剧本创作能力的人，就能脱离拍摄成本的限制，自己来做更多东西了。&lt;/p&gt;
&lt;h2&gt;需求涨得很快，而且还在数量级地涨&lt;/h2&gt;
&lt;p&gt;随着文娱产业的需求越来越旺盛，相关模型的应用会带出一个领域的扩展，那这些物料的成本价格就不会往下掉。为什么这么说？最近我们这儿这一帮同学，他们接到的一些兼职——尤其是数据标注和长链任务处理上的兼职——那个数量级，明显能看出市场上对这类需求增长了，而且增长得很厉害。&lt;/p&gt;
&lt;p&gt;这些需求增长的背后，对应的是显存、显卡、芯片、内存、存储这一整条链上成本需求的增长。而每年这些物料的上游供货量是有限的：人的开采能力有限，加工能力有限，市场的运输流转也有限度。需求却以数量级的规模在往上涨，那就会挤压民用产品的市场空间。按这个趋势推测，短期内价格大概是不会回调的。&lt;/p&gt;
&lt;h2&gt;内容创作的成本，被进一步压低了&lt;/h2&gt;
&lt;p&gt;再说内容这一头。以前各种自媒体平台的出现，是降低了会做内容的人制作内容的成本，但其实还是有不小的成本：要拍摄、要做分镜、要做稿、要呈现出来，还得考虑躲避审查这些事。现在这个成本被进一步压低了。&lt;/p&gt;
&lt;p&gt;未来平台上的内容多样性会迎来井喷式的发展，这个爆发会带来更多新形态的全民自媒体创作，甚至全民影视创作——甚至不再需要用市场行为去评估了，而是自己想看什么就做什么，完全为自己做。改作业也好，生成教辅内容也好，这些根本不是市场行为，而是一种生活刚需。&lt;/p&gt;
&lt;h2&gt;所以，AI 到底是不是泡沫？&lt;/h2&gt;
&lt;p&gt;我的判断是，AI 正在逐渐颠覆曾经的传媒秩序，把更多的自主权和话语权交到普通人手里。而相对的，这个市场繁荣也会带来产业格局的变化。相关民用产品的价格，恐怕要受到这些日益增长的需求的挤压——厂商肯定优先满足那些大批量供货的商用场景和数据中心，民用的价格未必会降，很可能就退回到 16G，或者顶多 32G，很难再像以前那样，两千块就能加一根单条 64G。这个状态会持续几年。&lt;/p&gt;
&lt;p&gt;但市场应该会调整。只靠数据中心一条腿，其实是有风险的；民用市场的稳定性、这种需求，反而是能起到抗风险作用的。所以回调的过程可能会相对漫长。甚至曾经被看作数据中心场景的一些产品，可能逐渐的会进入到民用的市场当中。这就像当年的那个微型机，以及笔记本电脑等，最开始也不是希望着能进入千家万户的，但最终它成了很多都使用的一种常见工具。&lt;/p&gt;
&lt;p&gt;历史上有过的剧情，可能还是会重演的。另外在这个过程里，还会刺激到一些二手交易平台的兴盛。因为新设备价格实在太高了，有一些性能不是高优先级刚需的场景，可以对付对付就算了。&lt;/p&gt;</content><category term="LLM"/><category term="AI"/><category term="LLM"/><category term="视频生成"/><category term="显卡"/><category term="显存"/><category term="内存"/><category term="硬盘"/><category term="本地模型"/><category term="泡沫"/></entry><entry><title>老登常谈（双语版）</title><link href="https://blog.cycleuser.org/lao-deng-chang-tan.html" rel="alternate"/><published>2026-09-23T00:00:00+08:00</published><updated>2026-09-23T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-23:/lao-deng-chang-tan.html</id><summary type="html">&lt;h1&gt;老登常谈（双语版）&lt;/h1&gt;
&lt;p&gt;我把这些年翻来覆去跟学生讲的那几套话，提炼出来、总结成 12 个系列、共 51 段，是为以后双语授课、甚至纯 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;老登常谈（双语版）&lt;/h1&gt;
&lt;p&gt;我把这些年翻来覆去跟学生讲的那几套话，提炼出来、总结成 12 个系列、共 51 段，是为以后双语授课、甚至纯英语授课做准备。&lt;/p&gt;
&lt;p&gt;说实在的，这些话用中文，我张嘴就能说出来；可一换成英语，表达起来就费劲。好在以前我在斯坦福大学的 Code in Place 上，2024 年、2025 年两次给人讲过 Python——讲咱们专业相关的内容我倒还撑得住，顺便也把英语练熟了点。&lt;/p&gt;
&lt;p&gt;有时候孩子们在路上撞见我在背英语，其实不是那么回事：我不是在背英语，而是在准备一些讲课也用得上的东西。&lt;/p&gt;
&lt;p&gt;每段先给英文、后给中文，都是三四句的完整段落，一分钟左右能读完、能背下来；末尾标了出处，尽量用公众号文章链接，没发公众号的给了博客链接。用法很简单：照着英文开口练，用中文核对意思，需要查原文就点出处链接。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列一：心态与节奏&lt;/h2&gt;
&lt;h4&gt;1. 徐徐图之&lt;/h4&gt;
&lt;p&gt;英：Don't chase quick results — take it slow, step by step you go. When you move at a steady pace, you stay calm and bring out your best. Slow and steady wins the day; rushing only gets in the way.&lt;/p&gt;
&lt;p&gt;中：做事情不要急功近利，要徐徐图之——慢慢来，一步一步谋划。你慢慢做，人就从容、不紧张，反而能把实力发挥得更好。急不来、催不得，稳扎稳打才靠得住。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/xu-xu-tu-zhi.html"&gt;《建议大学生朋友们做事情要徐徐图之，不要急功近利》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;h4&gt;2. 不能走极端&lt;/h4&gt;
&lt;p&gt;英：Too much hope and too much fear are the same trap — both are extremes. Quick victory or quick defeat, the mistake is the same. Stay in the middle, keep your balance, and you can still think straight.&lt;/p&gt;
&lt;p&gt;中：不管是"速胜论"还是"速败论"，极端的乐观和极端的悲观，本质都一样——都是极端。所有的事儿都相似，不能走极端。保持在中间，才留得住思考的余地。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/xu-xu-tu-zhi.html"&gt;《建议大学生朋友们做事情要徐徐图之，不要急功近利》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;h4&gt;3. 慢不是磨洋工&lt;/h4&gt;
&lt;p&gt;英：Going slow is not being lazy, and it's not stalling on purpose. It means a steady rhythm, a clear order, real results. Slow is not weak; slow is steady and sure.&lt;/p&gt;
&lt;p&gt;中：慢不是磨洋工，不是故意拖沓，而是张弛有度、工作有序、成果有效。这个"慢"是稳，不是懒；是节奏，不是拖延。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/xu-xu-tu-zhi.html"&gt;《建议大学生朋友们做事情要徐徐图之，不要急功近利》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;h4&gt;4. 心态最重要&lt;/h4&gt;
&lt;p&gt;英：Nothing matters more than a calm mind and a cheerful heart. The moment you panic, your rhythm falls apart, and your ability slips away. Stay calm and keep smiling — that's where real strength starts.&lt;/p&gt;
&lt;p&gt;中：心态好、心情好，天天乐呵呵，比什么都重要。心态一慌，节奏就乱了，原本能发挥出来的实力也发挥不出来。稳住神、笑一笑，比什么都值钱。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/xu-xu-tu-zhi.html"&gt;《建议大学生朋友们做事情要徐徐图之，不要急功近利》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;h4&gt;5. 将以有为也&lt;/h4&gt;
&lt;p&gt;英：When trouble comes, keep your strength — that leaves a way out. Some things simply can't be hurried. Hold on, stay alive, and one day you can still make something of it. As an ancient general said: I meant to do something with this later.&lt;/p&gt;
&lt;p&gt;中：遇到困难，保存有生力量，就总留得一线生机。有些事情急不来，要徐徐图之，留得青山在，才能"将以有为也"。南霁云那句话，说的就是这个道理。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/xu-xu-tu-zhi.html"&gt;《建议大学生朋友们做事情要徐徐图之，不要急功近利》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列二：认知与谦逊&lt;/h2&gt;
&lt;h4&gt;1. 心有外物而不化&lt;/h4&gt;
&lt;p&gt;英：General Qi Jiguang, in his book on training soldiers, warned: people cling to what they already know, and call their old ways the best. Once your mind is full of old habits, you naturally push away the new. Let go of the old, and you start to grow.&lt;/p&gt;
&lt;p&gt;中：戚继光在《纪效新书》里说，人容易"心有外物而不化，自恃旧习以为佳"——心里装了旧东西，就不愿接受新的，还总觉得自己那套旧经验最好。不肯放下旧的，就学不进新的。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563883&amp;amp;idx=1&amp;amp;sn=1f5c2043d59ff426567c7b93c62ee250&amp;amp;chksm=8fe84b67b89fc271a0444873bf0a98d48a6a8446ab1fa8098866ba01665f526749563eb4b436#rd"&gt;《读〈纪效新书〉有感》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. 别被已有认知束缚&lt;/h4&gt;
&lt;p&gt;英：Don't let what you already know lock you in. The real danger is not that you know too little — it's thinking that what you know is everything. A closed mind hurts more than an empty one.&lt;/p&gt;
&lt;p&gt;中：人不能被自己已有的认知给束缚住。最要命的不是知道得少，而是觉得自己知道的就已经是全部，再没有别的可能。这种自以为"全知道了"，比无知更害人。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563883&amp;amp;idx=1&amp;amp;sn=1f5c2043d59ff426567c7b93c62ee250&amp;amp;chksm=8fe84b67b89fc271a0444873bf0a98d48a6a8446ab1fa8098866ba01665f526749563eb4b436#rd"&gt;《读〈纪效新书〉有感》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. 知道自己知道得太少&lt;/h4&gt;
&lt;p&gt;英：After years of study and years of real life, the one thing I'm sure of is that I still know far too little. The more I learn, the more I see how small my corner is. Being humble isn't weakness — it's the plain truth.&lt;/p&gt;
&lt;p&gt;中：念了些年书，闯了几年江湖，我大概能确定知道的，就是自己知道的实在太少了。越学越觉得自己那点认知小得可怜。这种谦卑不是示弱，是实话。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563883&amp;amp;idx=1&amp;amp;sn=1f5c2043d59ff426567c7b93c62ee250&amp;amp;chksm=8fe84b67b89fc271a0444873bf0a98d48a6a8446ab1fa8098866ba01665f526749563eb4b436#rd"&gt;《读〈纪效新书〉有感》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;4. 别急着否定&lt;/h4&gt;
&lt;p&gt;英：When someone says you're wrong, the reflex to argue back is just an animal guarding itself. We reject first and nitpick later. Rise above it — listen first, then judge. That's what lifts you above the animal.&lt;/p&gt;
&lt;p&gt;中：看见别人否定自己，第一反应是反驳、挑刺，这其实是动物性的自我保护。遇事先否定、见什么都挑刺，是本能在作怪。能超脱一点，先听听、再想想，才高级。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563883&amp;amp;idx=1&amp;amp;sn=1f5c2043d59ff426567c7b93c62ee250&amp;amp;chksm=8fe84b67b89fc271a0444873bf0a98d48a6a8446ab1fa8098866ba01665f526749563eb4b436#rd"&gt;《读〈纪效新书〉有感》&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列三：提问与沟通&lt;/h2&gt;
&lt;h4&gt;1. 别问"在吗"&lt;/h4&gt;
&lt;p&gt;英：Don't send a message that only says "Are you there?" — it wastes everyone's time and makes the other person guess. Say what you need, straight and clear. Clear beats polite, every time.&lt;/p&gt;
&lt;p&gt;中：发消息别只丢一句"在吗"，那是对双方时间的双重消耗，还让人家猜你要干什么。有事直接说，把话说清楚，就是最大的得体。清楚，比客气更管用。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/just-say-what-you-need.html"&gt;《高校教师建议大学新生：有事直接说，别问在吗》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;h4&gt;2. 三句话说清楚&lt;/h4&gt;
&lt;p&gt;英：When you ask for help or report something, three things are enough: what it is, how it touches you, and why you ask this person. You don't need to be fancy — just don't leave people guessing. Say it plainly, then move on.&lt;/p&gt;
&lt;p&gt;中：找人帮忙、问问题、汇报事情，说清三件事就够：什么事、跟你什么关系、为什么找到对方。不怕说得不够好，就怕什么都不说、让人猜。说清楚，就走人。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/just-say-what-you-need.html"&gt;《高校教师建议大学新生：有事直接说，别问在吗》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;h4&gt;3. 先搜再问&lt;/h4&gt;
&lt;p&gt;英：Before you ask, search first — or ask an AI — and sort out the basics. Then bring that first understanding to the table. If you open your mouth before you lift a finger, people will wonder why you didn't even bother to look.&lt;/p&gt;
&lt;p&gt;中：遇到不懂的，先自己搜，先问大模型，把信息理一理，再拿着初步认知去问人。你不动手先张嘴，人家会想：你连搜都懒得搜？自己先走一步，再开口。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566756&amp;amp;idx=1&amp;amp;sn=cbe2a6bbe20712db020b93e70eefee29&amp;amp;scene=124"&gt;《高校教师建议大学新生先掌握「提问的智慧」》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;4. 效率优先&lt;/h4&gt;
&lt;p&gt;英：When we talk, efficiency first, polish second. Get your point across, and everyone feels better. A short, clear word beats a long, flowery one.&lt;/p&gt;
&lt;p&gt;中：沟通这件事，效率优先，得体其次。先把事说清楚，效率上来了，大家都舒服。快而清楚的一句话，胜过绕来绕去的客套。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/just-say-what-you-need.html"&gt;《高校教师建议大学新生：有事直接说，别问在吗》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;h4&gt;5. 想说不敢说，不是内向&lt;/h4&gt;
&lt;p&gt;英：An introvert can speak when needed — they just don't want to when it's not necessary. If you want to speak but dare not, that's not your personality; you just haven't learned how. Don't hide behind a label.&lt;/p&gt;
&lt;p&gt;中：内向的人需要表达时照样能说，只是不需要时不想说。如果你是想说却不敢说，那可能不是性格，是还没学会开口。别拿"我内向"当挡箭牌。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566757&amp;amp;idx=1&amp;amp;sn=6be823896e9f6483d36dcc05d4ecdebe&amp;amp;chksm=8fe85e29b89fd73f6d6e0451f27beab258a4a32ea6c4e25bf63f8242e5398afe8a050899728e#rd"&gt;《高校教师建议大学新生不要用内向的标签影响自己的沟通效率》&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列四：对自己诚实&lt;/h2&gt;
&lt;h4&gt;1. 别把听话当必然&lt;/h4&gt;
&lt;p&gt;英：Don't assume the rules are always fair, that grown-ups are always right, or that obedience always pays. Growing past the student mindset doesn't mean turning cold — it means not being naive. Keep your warm heart; drop the innocence.&lt;/p&gt;
&lt;p&gt;中：别以为规则一定公平，别以为大人一定对，别以为听话就一定有回报。去掉一些学生气，不是变冷漠，而是别太天真。该有的古道热肠还要有，只是别再傻乎乎。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566819&amp;amp;idx=1&amp;amp;sn=1bbdcf5144fc5e29a52e7f398b466af3&amp;amp;chksm=8fe85eefb89fd7f915b88c0514af360c71e7daca6caee490ae21c9493aae299d43d6be627740#rd"&gt;《高校教师希望大一新生尽快摆脱学生气的一些建议》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. 大人不见得更有智慧&lt;/h4&gt;
&lt;p&gt;英：Most adults are not wiser than children — they just have more experience and habits, and know better how the world runs. That's all. So don't take every word they say as sacred.&lt;/p&gt;
&lt;p&gt;中：大多数大人不见得比孩子更有智慧，只是有更多经验和习惯，对社会的运行逻辑更熟。如此而已。所以别把大人的每句话都当圣旨。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566819&amp;amp;idx=1&amp;amp;sn=1bbdcf5144fc5e29a52e7f398b466af3&amp;amp;chksm=8fe85eefb89fd7f915b88c0514af360c71e7daca6caee490ae21c9493aae299d43d6be627740#rd"&gt;《高校教师希望大一新生尽快摆脱学生气的一些建议》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. 幻想和期待&lt;/h4&gt;
&lt;p&gt;英：A fantasy is believing things will get better by themselves. An expectation is knowing you must do something to make them better. College is full of things worth expecting — just don't let expectation quietly turn into fantasy.&lt;/p&gt;
&lt;p&gt;中：幻想是以为事情会自动变好，期待是知道自己要去做些什么让它变好。大学里值得期待的东西很多，但别把期待过成了幻想——等着天上掉馅饼，是掉不下来的。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566819&amp;amp;idx=1&amp;amp;sn=1bbdcf5144fc5e29a52e7f398b466af3&amp;amp;chksm=8fe85eefb89fd7f915b88c0514af360c71e7daca6caee490ae21c9493aae299d43d6be627740#rd"&gt;《高校教师希望大一新生尽快摆脱学生气的一些建议》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;4. 真热爱，还是只想赢&lt;/h4&gt;
&lt;p&gt;英：Ask yourself clearly: do you truly love this thing, or do you just want to win through it and feel you belong? Letting someone else win for you is cheap joy. Real love lasts; borrowed victory doesn't.&lt;/p&gt;
&lt;p&gt;中：分清楚你是真的热爱一件事，还是只想通过它赢、想要一种归属感。让别人替你赢，那种快乐来得廉价。真正的热爱撑得久，借来的胜利撑不久。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566783&amp;amp;idx=1&amp;amp;sn=fe1edd2567e16b685291cef5cf948517&amp;amp;scene=124"&gt;《高校教师建议大学生朋友能对自己诚实负责地度过大学生活》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;5. 大学是起点，不是终点&lt;/h4&gt;
&lt;p&gt;英："Once you get into college, you can relax" is one of the biggest lies you'll ever hear. College is where the competition is sharpest and the free time is most — that's where the gap widens. This is a starting line, not a finish line.&lt;/p&gt;
&lt;p&gt;中："到了大学就轻松了"是你可能听过的最大的谎。大学里竞争最激烈、可支配时间最多，你和别人的差距，很多是在大学拉开的。这是起点，不是终点。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566819&amp;amp;idx=1&amp;amp;sn=1bbdcf5144fc5e29a52e7f398b466af3&amp;amp;chksm=8fe85eefb89fd7f915b88c0514af360c71e7daca6caee490ae21c9493aae299d43d6be627740#rd"&gt;《高校教师希望大一新生尽快摆脱学生气的一些建议》&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列五：情绪与决定&lt;/h2&gt;
&lt;h4&gt;1. 别把赌气当决定&lt;/h4&gt;
&lt;p&gt;英：Before you decide, ask yourself: do I really want this, or am I just acting out of spite? Every time you stop yourself from turning a feeling into a choice, you take charge of your life. That one question saves a lot of regret.&lt;/p&gt;
&lt;p&gt;中：做决定之前问自己一句：我到底是真的想这么选，还是只是在赌气。每一次能拦住自己把情绪当成决定，都是对自己负责。这一句话，能省掉很多后悔。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566805&amp;amp;idx=1&amp;amp;sn=bd12b3a65918ae45400cb5f76ca98e51&amp;amp;scene=124"&gt;《高校教师建议大学新生尽量避免赌气-学会基于判断而不是情绪来做决定》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. 赌气不划算&lt;/h4&gt;
&lt;p&gt;英：Failing a subject and then quitting isn't "I tried and couldn't" — it's "I didn't try, so I couldn't." The second excuse is easier to swallow, but it costs far more. You're not protecting your pride; you're paying for it.&lt;/p&gt;
&lt;p&gt;中：一门课没考好就索性不学，那不是"努力了还不行"，而是"没努力所以不行"。后一个说法好接受，但代价其实更大。你不是在保面子，是在为面子付账。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566805&amp;amp;idx=1&amp;amp;sn=bd12b3a65918ae45400cb5f76ca98e51&amp;amp;scene=124"&gt;《高校教师建议大学新生尽量避免赌气-学会基于判断而不是情绪来做决定》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. 别把自己架起来&lt;/h4&gt;
&lt;p&gt;英：If you dig in out of spite, the homework still has to be done and the juice will still be there — but you've already boxed yourself in. Stubborn pride only locks you into a worse corner. Choose the better path, not the prouder one.&lt;/p&gt;
&lt;p&gt;中：赌气到底，作业照样得做、果汁照样想喝，可话已经放出去了，自己把自己架在那儿，图什么呢？死要面子，最后只会把自己逼进更差的局面。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566805&amp;amp;idx=1&amp;amp;sn=bd12b3a65918ae45400cb5f76ca98e51&amp;amp;scene=124"&gt;《高校教师建议大学新生尽量避免赌气-学会基于判断而不是情绪来做决定》&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列六：通识与谦逊&lt;/h2&gt;
&lt;h4&gt;1. 手里拿锤子&lt;/h4&gt;
&lt;p&gt;英：When all you have is a hammer, everything looks like a nail. Study one subject deeply, and you may feel it explains everything — but you're missing the thinking other fields have built for centuries. Knowing other tools exist keeps you humble.&lt;/p&gt;
&lt;p&gt;中：手里拿着锤子，看什么都是钉子。学了一个学科，容易觉得它能解释一切，其实是忽视了别的学科早就积累了很久的思考。知道还有别的锤子、别的工具，才不容易因为无知而自大。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566787&amp;amp;idx=1&amp;amp;sn=2cbacc702f8ea950f893a294911dc8a1&amp;amp;scene=124"&gt;《高校教师建议同学们进入大学之后适当补充各个学科的通识内容并且养成终身学习的习惯》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. 别被工程成就冲昏头&lt;/h4&gt;
&lt;p&gt;英：A steam-engine master, however brilliant, could never dream of a nuclear reactor. It's not stupidity — those ideas simply aren't in his world. Be great at your craft, but stay humble before what lies beyond it.&lt;/p&gt;
&lt;p&gt;中：一个蒸汽机师傅优化到极致，也想不到核反应堆。不是他笨，是他的知识坐标系里没有那些维度。手艺再精，也要对视野之外的东西保持敬畏。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566569&amp;amp;idx=1&amp;amp;sn=8d364f41b44c7a5b41fc65baea068384&amp;amp;chksm=8fe841e5b89fc8f3b567c07fe09bcb6681869b69730f37a737be341b960b99bac7353e2e0ea3#rd"&gt;《计算机学科的同学尤其应该注重培养通识并且避免工程上的傲慢》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. 无穷和无穷不一样&lt;/h4&gt;
&lt;p&gt;英：There are infinitely many whole numbers, and infinitely many real numbers — yet there are more real numbers. Learning that some infinities are bigger than others is a real jolt to intuition. Some things are true even when they don't feel true.&lt;/p&gt;
&lt;p&gt;中：自然数无穷多，实数也无穷多，但实数比自然数更多。知道"有些无穷比另一些更大"，是数学带给你的一种认知冲击。直觉会骗人，逻辑不会。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566787&amp;amp;idx=1&amp;amp;sn=2cbacc702f8ea950f893a294911dc8a1&amp;amp;scene=124"&gt;《高校教师建议同学们进入大学之后适当补充各个学科的通识内容并且养成终身学习的习惯》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;4. 结构决定一切&lt;/h4&gt;
&lt;p&gt;英：The same carbon atoms make soft graphite or hard diamond. The atoms don't change — the arrangement does. Structure carries power, in matter and in teams alike. Change the layout, and you change the result.&lt;/p&gt;
&lt;p&gt;中：同样的碳原子，排成石墨就软，排成金刚石就硬。原子没变，变的是结构。结构本身就带有力量——放在物质上、放在团队上，都一样。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566787&amp;amp;idx=1&amp;amp;sn=2cbacc702f8ea950f893a294911dc8a1&amp;amp;scene=124"&gt;《高校教师建议同学们进入大学之后适当补充各个学科的通识内容并且养成终身学习的习惯》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;5. 多看点字，少刷点视频&lt;/h4&gt;
&lt;p&gt;英：Short videos push your excitement bar so high that you can't sit through a long text. Words make you think; pictures just feed you. Read more, and you'll think deeper — it's a trade well worth making.&lt;/p&gt;
&lt;p&gt;中：短视频把刺激的阈值拉得很高，习惯了就坐不住看长文。文字要你主动去想，画面直接喂给你。读得越多，想得越深，这笔账划得来。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566787&amp;amp;idx=1&amp;amp;sn=2cbacc702f8ea950f893a294911dc8a1&amp;amp;scene=124"&gt;《高校教师建议同学们进入大学之后适当补充各个学科的通识内容并且养成终身学习的习惯》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;6. 历史教训要学，角色不要拿&lt;/h4&gt;
&lt;p&gt;英：History holds wonderful patterns, but don't put yourself inside them. Don't become a loyal fan of some dynasty or group, as if their glory were yours. You are you — learn the lessons, don't take the roles.&lt;/p&gt;
&lt;p&gt;中：历史里有很多精彩的规律，但别代入。不要成为某个王朝、某个群体的忠实粉丝，觉得跟人家荣辱与共。你是你自己，历史的教训要学，角色不要拿。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566787&amp;amp;idx=1&amp;amp;sn=2cbacc702f8ea950f893a294911dc8a1&amp;amp;scene=124"&gt;《高校教师建议同学们进入大学之后适当补充各个学科的通识内容并且养成终身学习的习惯》&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列七：工具观&lt;/h2&gt;
&lt;h4&gt;1. 工具是来帮你的&lt;/h4&gt;
&lt;p&gt;英：Tools are here to help you, not to scare you. Learn the basics first; then the bigger tools feel like a hand, not a weight. A tool you truly know becomes an extension of your hand.&lt;/p&gt;
&lt;p&gt;中：工具是来帮你的，不是来吓你的。先把最基础的东西用熟，再上大工具，你会觉得它顺手，而不是压迫。真正学会了的工具，会成为你手的延伸。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566279&amp;amp;idx=1&amp;amp;sn=53f797d1cd7b449d4b36c0e458abe169&amp;amp;chksm=8fe840cbb89fc9dda71d0c1e3518f2110c89cba52ae13caa99eef624d4de642c221309532656#rd"&gt;《并非故意-为什么我更多用命令行工具而不是GUI》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. 命令行不骗人&lt;/h4&gt;
&lt;p&gt;英：The command line tells you exactly what went wrong. A graphical screen just spins, pops up "failed," and stops. That's why I love the command line — it doesn't lie to you.&lt;/p&gt;
&lt;p&gt;中：命令行报错就是报错，清清楚楚甩给你。图形界面转个圈，弹个框说"操作失败"，就完事了。所以我喜欢命令行——它不骗人。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566279&amp;amp;idx=1&amp;amp;sn=53f797d1cd7b449d4b36c0e458abe169&amp;amp;chksm=8fe840cbb89fc9dda71d0c1e3518f2110c89cba52ae13caa99eef624d4de642c221309532656#rd"&gt;《并非故意-为什么我更多用命令行工具而不是GUI》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. 别把工具当信仰&lt;/h4&gt;
&lt;p&gt;英：Worshipping a brand like a religion is just another kind of worship — it turns a thing into a faith. Electronics are tools, not gods. Use them well, but never kneel to them.&lt;/p&gt;
&lt;p&gt;中：把某个牌子当宗教来膜拜，和膜拜别的东西没两样，都是把东西当成了信仰。电子产品说到底就是工具，不是神。用好它，但别跪它。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/xu-xu-tu-zhi.html"&gt;《建议大学生朋友们做事情要徐徐图之，不要急功近利》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列八：外语学习&lt;/h2&gt;
&lt;h4&gt;1. 语言要先用起来&lt;/h4&gt;
&lt;p&gt;英：Language is meant to be spoken and heard first, then read and written. The courage to open your mouth and not fear looking silly matters more than test scores. I was near the bottom in class, but I always dared to speak — and in the end, I used it best.&lt;/p&gt;
&lt;p&gt;中：人类的语言本来就该先听说、后读写。敢开口、不怕丢人，比考试分数重要得多。我外语一路垫底，但一路敢说，最后反而用得最好。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/gao-xiao-jiao-shi-jian-yi-da-xue-sheng-peng-you-men-bu-yao-hu-shi-wai-yu-de-xue-xi.html"&gt;《高校教师建议大学生朋友们不要忽视外语的学习》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;h4&gt;2. 学外语是为了讲好我们自己的故事&lt;/h4&gt;
&lt;p&gt;英：The richer a culture grows, the more it needs people who can speak foreign languages to tell its stories to the world. If you can't open your mouth, how will you tell others what's good about us? Learn the language, then tell the story.&lt;/p&gt;
&lt;p&gt;中：本土文化越昌盛，越需要有外语能力，好把这些好故事讲出去。自己都张不开口，怎么给别人讲我们的好东西？把语言学好，把故事讲出去。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/gao-xiao-jiao-shi-jian-yi-da-xue-sheng-peng-you-men-bu-yao-hu-shi-wai-yu-de-xue-xi.html"&gt;《高校教师建议大学生朋友们不要忽视外语的学习》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;h4&gt;3. 别信"不用学"那套&lt;/h4&gt;
&lt;p&gt;英：Anyone who says "you don't need to learn a foreign language" either has an agenda or is making excuses for their own laziness. Believe it, and only you pay the price. Don't let someone else's failure become your ceiling.&lt;/p&gt;
&lt;p&gt;中：凡是劝你"不用学外语"的，要么别有用心，要么是拿这套说辞给自己找台阶。真信了，吃亏的只有自己。别拿别人的失败，当自己偷懒的理由。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://blog.cycleuser.org/gao-xiao-jiao-shi-jian-yi-da-xue-sheng-peng-you-men-bu-yao-hu-shi-wai-yu-de-xue-xi.html"&gt;《高校教师建议大学生朋友们不要忽视外语的学习》&lt;/a&gt;（博客）&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列九：思维误区&lt;/h2&gt;
&lt;h4&gt;1. 别急着证明自己对&lt;/h4&gt;
&lt;p&gt;英：The easiest trap is rushing to prove you're right and burning hours on it. The time you spend defending yourself is time you could have spent reflecting and improving. Winning an argument is rarely worth the cost.&lt;/p&gt;
&lt;p&gt;中：最常见的坑，就是急于证明自己是对的，为这事浪费一大堆时间。时间都花在证明自己对上，反思的时间就没了。逞一时口舌之快，代价追不回来。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566588&amp;amp;idx=1&amp;amp;sn=21097edc30fd4996ffc736386b0f52ce&amp;amp;chksm=8fe841f0b89fc8e6432ddb23f00e24de4cb92e515e329da54b5082e245c0e38804218c93f2a1#rd"&gt;《高校教师建议大学新生和家长都应该尽早防范的几种常见思维误区》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. 错了就认&lt;/h4&gt;
&lt;p&gt;英：Everyone makes mistakes — memory slips, hands fumble, even masters mess up. Admitting a mistake is basic, and without it you can't improve. Refusing to admit a problem is the surest way to never fix it.&lt;/p&gt;
&lt;p&gt;中：犯错再正常不过，记忆会出错，行为会失控，再高的高手都可能玩脱。认错是件很基础的事，不认错就不可能进步。不承认问题存在，就没法解决问题。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566588&amp;amp;idx=1&amp;amp;sn=21097edc30fd4996ffc736386b0f52ce&amp;amp;chksm=8fe841f0b89fc8e6432ddb23f00e24de4cb92e515e329da54b5082e245c0e38804218c93f2a1#rd"&gt;《高校教师建议大学新生和家长都应该尽早防范的几种常见思维误区》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. 别迷信权威&lt;/h4&gt;
&lt;p&gt;英：Just because someone is famous and successful doesn't mean you should swallow everything they say. Success often rides on luck and timing that even the winner can't see. Judge the idea itself, not the person who said it.&lt;/p&gt;
&lt;p&gt;中：一个很有名、很权威的人说了啥，不见得就该信。成功里往往有运气和时代的成分，连成功者自己都未必看得清。判断一个观点，看它本身，别看是谁说的。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566588&amp;amp;idx=1&amp;amp;sn=21097edc30fd4996ffc736386b0f52ce&amp;amp;chksm=8fe841f0b89fc8e6432ddb23f00e24de4cb92e515e329da54b5082e245c0e38804218c93f2a1#rd"&gt;《高校教师建议大学新生和家长都应该尽早防范的几种常见思维误区》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;4. 从来如此，未必对&lt;/h4&gt;
&lt;p&gt;英："Everyone does it" and "it's always been this way" are not reasons — they're reflexes. A reasonable person gathers the facts and weighs the costs before deciding. Don't hand your judgment to the crowd or to habit.&lt;/p&gt;
&lt;p&gt;中："别人都这样""从来如此"，这俩说法都没来由。该做的是理性判断，把资料收集齐，权衡好利弊再做决定。别把判断力外包给从众和惯性。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566588&amp;amp;idx=1&amp;amp;sn=21097edc30fd4996ffc736386b0f52ce&amp;amp;chksm=8fe841f0b89fc8e6432ddb23f00e24de4cb92e515e329da54b5082e245c0e38804218c93f2a1#rd"&gt;《高校教师建议大学新生和家长都应该尽早防范的几种常见思维误区》&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列十：博弈与格局&lt;/h2&gt;
&lt;h4&gt;1. 三种结局&lt;/h4&gt;
&lt;p&gt;英：Every game between people ends one of three ways: both lose, one wins and one loses, or both win. Most conflicts in life aren't zero-sum — there's usually a way to make the pie bigger. Look for the third way before you fight over the first two.&lt;/p&gt;
&lt;p&gt;中：世间所有的博弈，归根结底逃不开三种结局：两败俱伤的负和、此消彼长的零和、相互成就的正和。生活里大多数冲突都不是零和的，先找第三条路，再谈争抢。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566326&amp;amp;idx=1&amp;amp;sn=e8b4330f1bc3d9be3d7093e2a8dd84c6&amp;amp;chksm=8fe840fab89fc9ec4723ab95d9c1ae6efd1d046c733a5fc87aa8ea24d018bafdedf5ee4a7c97#rd"&gt;《高校教师建议家长和新生进入大学前先了解一下博弈》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. 别掉进负和&lt;/h4&gt;
&lt;p&gt;英：The saddest game is the negative-sum one, where everyone walks away worse. Two roommates feuding for half a year, teammates tearing each other down — no one wins, everyone loses. Talk early, before a small thing turns into mutual ruin.&lt;/p&gt;
&lt;p&gt;中：最让人扼腕的是负和博弈，所有人都没占到便宜，收获远小于付出。室友较劲半年、队友互相拆台，谁也没落着好。小事早沟通，别等它变成互相伤害。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566326&amp;amp;idx=1&amp;amp;sn=e8b4330f1bc3d9be3d7093e2a8dd84c6&amp;amp;chksm=8fe840fab89fc9ec4723ab95d9c1ae6efd1d046c733a5fc87aa8ea24d018bafdedf5ee4a7c97#rd"&gt;《高校教师建议家长和新生进入大学前先了解一下博弈》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. 把蛋糕做大&lt;/h4&gt;
&lt;p&gt;英：Real masters don't fight over how to cut a fixed cake — they find a way to make it bigger. Share your apple, share your orange, and both of you taste two flavors instead of one. Cooperation makes value that competition can't.&lt;/p&gt;
&lt;p&gt;中：真正的高手，从不把自己困在零和的笼子里，而是想办法把蛋糕做大。你分我半个苹果、我分你半个橘子，俩人都能尝到两种味道。合作创造的价值，竞争给不了。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566326&amp;amp;idx=1&amp;amp;sn=e8b4330f1bc3d9be3d7093e2a8dd84c6&amp;amp;chksm=8fe840fab89fc9ec4723ab95d9c1ae6efd1d046c733a5fc87aa8ea24d018bafdedf5ee4a7c97#rd"&gt;《高校教师建议家长和新生进入大学前先了解一下博弈》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;4. 别因怀疑而互相背叛&lt;/h4&gt;
&lt;p&gt;英：The prisoner's dilemma shows why people betray each other even when working together would be best for both. Cut off and unsure, each side plays "safe," and both end up worse. Trust, built slowly, is often the smarter long game.&lt;/p&gt;
&lt;p&gt;中：囚徒困境说透了人为什么明明合作最有利，却还是互相背叛。被隔开、不确定对方会不会守约，各自"理性"地背叛，结果双双更惨。慢慢建立的信任，往往才是更聪明的长期打法。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566326&amp;amp;idx=1&amp;amp;sn=e8b4330f1bc3d9be3d7093e2a8dd84c6&amp;amp;chksm=8fe840fab89fc9ec4723ab95d9c1ae6efd1d046c733a5fc87aa8ea24d018bafdedf5ee4a7c97#rd"&gt;《高校教师建议家长和新生进入大学前先了解一下博弈》&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列十一：没有标准答案&lt;/h2&gt;
&lt;h4&gt;1. 别迷信标准答案&lt;/h4&gt;
&lt;p&gt;英：The "standard answer" you memorized is just the best guess of its time — nothing more. History is full of "final answers" that turned out to be only stepping stones. Don't treat a textbook answer as the end of thinking.&lt;/p&gt;
&lt;p&gt;中：你背下来的"标准答案"，不过是它那个年代最好的猜测，仅此而已。历史上很多"最终答案"，后来都被证明只是中间产物。别把教材答案当成思考的终点。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566611&amp;amp;idx=1&amp;amp;sn=50102916c03e0c309d1c4d2dc6aa23c7&amp;amp;scene=124"&gt;《从志愿填报开始学生和家长都应该考虑到生活不一定要有标准答案》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. 连太阳系都改过答案&lt;/h4&gt;
&lt;p&gt;英：Thirty years ago the solar system had nine planets; now it has eight, and someone wants to change it back. The solar system never changed — only our names and textbooks did. What changed is us, not the world.&lt;/p&gt;
&lt;p&gt;中：三十年前太阳系有九大行星，现在改成八大，最近又有人要改回去。变的从来不是太阳系，只有人类的概念和教材。变的是我们，不是世界。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566611&amp;amp;idx=1&amp;amp;sn=50102916c03e0c309d1c4d2dc6aa23c7&amp;amp;scene=124"&gt;《从志愿填报开始学生和家长都应该考虑到生活不一定要有标准答案》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. 上学不是单行道&lt;/h4&gt;
&lt;p&gt;英：School is not a one-way road from college to PhD to teaching — that's just one path of many. Life is richer than a single fixed route. If you don't love your major, you may switch — just think it through first.&lt;/p&gt;
&lt;p&gt;中：上学不是一条单行道，本科读研读博教书，只是很多条路里的一条。人生很丰富，不必非按某一条既定路径走。不喜欢自己的专业，深思熟虑之后，可以换。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566611&amp;amp;idx=1&amp;amp;sn=50102916c03e0c309d1c4d2dc6aa23c7&amp;amp;scene=124"&gt;《从志愿填报开始学生和家长都应该考虑到生活不一定要有标准答案》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;4. 别让别人的信息替你决定&lt;/h4&gt;
&lt;p&gt;英：The scariest thing is choosing your life by your parents' advice — advice that may be years out of date — while never trying what you actually want. Years later, you regret the road you didn't take. Look into it first, then choose.&lt;/p&gt;
&lt;p&gt;中：最可怕的是按家里长辈的建议做了选择，可长辈的信息未必更新到最新；自己想做的事又没去尝试、没去弄明白。过了很多年，只剩后悔当初。先搞清楚，再决定。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566611&amp;amp;idx=1&amp;amp;sn=50102916c03e0c309d1c4d2dc6aa23c7&amp;amp;scene=124"&gt;《从志愿填报开始学生和家长都应该考虑到生活不一定要有标准答案》&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;系列十二：大学怎么读&lt;/h2&gt;
&lt;h4&gt;1. 别光靠听课&lt;/h4&gt;
&lt;p&gt;英：If you expect to learn everything from lectures, you'll be let down — some teachers just read slides. The real gift of college is that no one holds your hand anymore. Learning to find things yourself is the skill that matters most.&lt;/p&gt;
&lt;p&gt;中：指望光靠听课就学到很多东西，这想法不靠谱——有的老师就是念 PPT。大学最关键的地方，恰恰是没人再带着你了。学会自己找东西学，才是最重要的能力。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566578&amp;amp;idx=1&amp;amp;sn=cb75c15fcf86c8520de71f605170ac1e&amp;amp;chksm=8fe841feb89fc8e8ee76fc7f3ae743a58f975e9fc017c591f9507e689931acad17b80547bf32#rd"&gt;《大学里是不是什么都学不到》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;2. 主动探索&lt;/h4&gt;
&lt;p&gt;英：In college, the most important thing is to find chances and dig into what truly interests you. What the textbook skips and the teacher doesn't teach, you have to learn on your own. That ability is what carries you to graduate school and beyond.&lt;/p&gt;
&lt;p&gt;中：到了大学，最重要的是找到机会，以所学为基础，对自己感兴趣的方向去探索。课本没讲、老师没教的东西，得自己想办法去学。有了这能力，才能走得更远。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566578&amp;amp;idx=1&amp;amp;sn=cb75c15fcf86c8520de71f605170ac1e&amp;amp;chksm=8fe841feb89fc8e8ee76fc7f3ae743a58f975e9fc017c591f9507e689931acad17b80547bf32#rd"&gt;《大学里是不是什么都学不到》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;3. 用好免费资源&lt;/h4&gt;
&lt;p&gt;英：Your college gives you a library, online databases, journals, and talks — use them all. Textbooks are the oldest, journals fresher, conference papers freshest. One good talk can be worth more than a semester of class.&lt;/p&gt;
&lt;p&gt;中：图书馆、电子文库、论文订阅、讲座，这些都是大学白给你的，都得用起来。教材最老，期刊新点，会议论文最新。一场好讲座，可能顶得上半学期的课。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566578&amp;amp;idx=1&amp;amp;sn=cb75c15fcf86c8520de71f605170ac1e&amp;amp;chksm=8fe841feb89fc8e8ee76fc7f3ae743a58f975e9fc017c591f9507e689931acad17b80547bf32#rd"&gt;《大学里是不是什么都学不到》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;4. 你是哪种人&lt;/h4&gt;
&lt;p&gt;英：On the journey west, the Monkey King runs everywhere to gather what it takes to solve a problem, while others wait for the problem to vanish by itself. Be the one who goes looking for answers, not the one who waits. The role is yours to choose.&lt;/p&gt;
&lt;p&gt;中：取经路上，孙悟空是满世界去凑解决难题的资源，而有的人是等着难题自己消失。别做那个干等的人，去做那个主动找答案的人。你想当哪种人，自己选。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566667&amp;amp;idx=1&amp;amp;sn=5c525ef14a5a304d9085fc45d76675c8&amp;amp;chksm=8fe85e47b89fd75169a46bed06ef2cb24291fdc526752c336b40e714e499603e225d3e2d1351#rd"&gt;《进入大学的你想成为取经路上的哪种人？》&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;5. 事情本身最重要&lt;/h4&gt;
&lt;p&gt;英：Watch out when a system starts chasing the score instead of the thing itself — that's how good intentions get twisted. Grades, rankings, metrics — don't let the measuring stick become the goal. Keep your eyes on what truly matters.&lt;/p&gt;
&lt;p&gt;中：当一个体系开始只盯着指标、而不是事情本身的时候，好事也会被扭曲。分数、排名、KPI，都别让"尺子"变成了"目的"。眼睛要盯在真正重要的事情上。&lt;/p&gt;
&lt;p&gt;出处：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566635&amp;amp;idx=1&amp;amp;sn=b18c067daaa2217e4b5ab16d8b4134b7&amp;amp;scene=124"&gt;《「事情本身不重要」是怎么炼成的》&lt;/a&gt;&lt;/p&gt;</content><category term="Education"/><category term="教育"/><category term="双语"/><category term="老登常谈"/><category term="教学"/><category term="英语"/></entry><entry><title>为什么这么多东西都服从正态分布？从历史、数学、物理到哲学的一次完整拆解</title><link href="https://blog.cycleuser.org/why-normal-distribution.html" rel="alternate"/><published>2026-09-23T00:00:00+08:00</published><updated>2026-09-23T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-23:/why-normal-distribution.html</id><summary type="html">&lt;h1&gt;为什么这么多东西都服从正态分布？&lt;/h1&gt;
&lt;p&gt;人的身高、同一种螺栓的直径、反复测量同一个量的误差、一次大考的成绩……很多你随手 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;为什么这么多东西都服从正态分布？&lt;/h1&gt;
&lt;p&gt;人的身高、同一种螺栓的直径、反复测量同一个量的误差、一次大考的成绩……很多你随手一测的东西，画成直方图，都是中间高、两边低、左右对称的一个钟形。这个形状我们叫正态分布，也叫高斯分布。&lt;/p&gt;
&lt;p&gt;但问题是：凭什么？凭什么这么多互不相干的现象，最后都收敛到同一个形状？这是巧合，还是背后有某种必然？&lt;/p&gt;
&lt;p&gt;这篇文章我想把这件事从根上拆一遍：它最早是怎么被人发现的，数学上到底哪一步把它逼成了钟形，物理里它对应着什么样的机制，以及哲学上它到底意味着什么、又不意味着什么。&lt;/p&gt;
&lt;h2&gt;从赌场里长出来的钟形曲线&lt;/h2&gt;
&lt;p&gt;故事要从赌博说起。&lt;/p&gt;
&lt;p&gt;17 到 18 世纪，概率论基本是被赌徒和数学家一起拉扯出来的。帕斯卡、费马给"公平的赌注该怎么分"定了规则，然后有一批人开始研究一个很具体的问题：扔硬币，扔很多次，正面朝上的次数会怎么分布？&lt;/p&gt;
&lt;p&gt;这个问题等价于二项式展开 &lt;span class="arithmatex"&gt;\((a+b)^n\)&lt;/span&gt; 的系数，也就是二项分布。&lt;span class="arithmatex"&gt;\(n\)&lt;/span&gt; 很大的时候，这些系数中间巨大、两边迅速衰减，形状正是那个钟形。但直接算 &lt;span class="arithmatex"&gt;\(n!\)&lt;/span&gt; 特别费劲，于是人们想要一个近似的公式。&lt;/p&gt;
&lt;p&gt;1733 年，法国的棣莫弗（Abraham de Moivre）干了一件了不起的事：他找到了二项式系数的近似，发现它逼近一条钟形曲线。为了得到这个近似，他还顺带把 &lt;span class="arithmatex"&gt;\(n!\)&lt;/span&gt; 的近似给搞了出来——这就是后来所谓的斯特林公式。有意思的是，公式里那个常数 &lt;span class="arithmatex"&gt;\(\sqrt{2\pi}\)&lt;/span&gt; 其实是棣莫弗先摸到的，斯特林只是把常数补完整了。所以严格讲，正态分布第一次露脸，是在算赌钱的概率里，而不是在什么高深的科学里。&lt;/p&gt;
&lt;h2&gt;高斯：测量误差逼出来的分布&lt;/h2&gt;
&lt;p&gt;真正让钟形曲线"封神"的，是天文学。&lt;/p&gt;
&lt;p&gt;1801 年，意大利天文学家皮亚齐发现了谷神星，但只观测了四十来天就找不着了，全欧洲都在猜它跑哪儿去了。24 岁的高斯（Carl Friedrich Gauss）用自己的一套办法，从这些带误差的观测数据里算出了一个轨道，结果别人照着他算的位置，真的又找回了谷神星。高斯一战成名。&lt;/p&gt;
&lt;p&gt;他用的办法，就是最小二乘法：找一条轨道，让所有观测误差的平方和最小。但这里有个隐藏的坑——为什么是"平方"？为什么不是绝对值，不是四次方？高斯必须给个理由。&lt;/p&gt;
&lt;p&gt;1809 年，高斯在《天体运动理论》里给出了理由。他的论证大致是：假设误差是由大量微小扰动叠加而成的，那么误差应该服从一个特定的分布；而这个分布，恰好让"平方和最小"等价于"最有可能"。这个分布就是&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[f(x)=\frac{1}{\sigma\sqrt{2\pi}}\,e^{-\frac{(x-\mu)^2}{2\sigma^2}}\]&lt;/div&gt;
&lt;p&gt;顺便说一句，最小二乘法的"优先权"一直有争议：勒让德在 1805 年就先发表了它。高斯倒挺大度，说自己 1795 年就开始用了。这场公案到现在也没个干净的了断，但没关系，重要的是这条曲线从此有了科学地位。&lt;/p&gt;
&lt;p&gt;所以高斯分布的"高斯"两个字，来自测量误差、来自天文学，而不是来自什么抽象数学。人们先是在现实里反复撞见它，然后才去问"为什么"。&lt;/p&gt;
&lt;h2&gt;拉普拉斯：把"为什么"证了出来&lt;/h2&gt;
&lt;p&gt;真正回答"为什么"的，是拉普拉斯（Pierre-Simon Laplace）。&lt;/p&gt;
&lt;p&gt;他做的事情，可以概括成一句话：&lt;strong&gt;不管单个因素是什么分布，只要数量足够多、彼此足够独立、单个因素又都别太离谱，那么它们的总和就必然逼近正态分布。&lt;/strong&gt; 这就是中心极限定理（CLT）的核心。&lt;/p&gt;
&lt;p&gt;这句话的分量极重。它等于说：正态分布不是某个特定现象的特殊性质，而是"大量微小独立因素的叠加"这个操作本身的性质。谁在叠加，谁就趋向钟形，几乎不管你原来的因素长什么样。&lt;/p&gt;
&lt;p&gt;拉普拉斯在 1810 年前后证明了这件事的一个版本，后来切比雪夫、马尔可夫、李雅普诺夫（1901）、林德伯格（1922）等人又把它推广、收紧，把条件弄得越来越精确。今天我们说的中心极限定理有很多版本，但灵魂都是拉普拉斯那句话。&lt;/p&gt;
&lt;h2&gt;"正态"这名字，其实是后起的&lt;/h2&gt;
&lt;p&gt;有个细节值得说：高斯和拉普拉斯那会儿，没人管它叫"正态分布"，大家叫它"误差律"（law of error）、"误差频率律"。&lt;/p&gt;
&lt;p&gt;到了 19 世纪，比利时人凯特勒（Adolphe Quetelet）做了一件很有争议的事：他把这个本来用于测量误差的曲线，拿去套社会数据。他统计了上千名苏格兰士兵的胸围，发现居然也服从这个钟形曲线。于是他提出了"平均人"（l'homme moyen）的概念，认为社会现象背后也有和天体一样的规律。这个举动影响巨大，但也埋下了后面哲学上的争论。&lt;/p&gt;
&lt;p&gt;高尔顿（Francis Galton）后来研究遗传、研究身高，发现身高也服从这个分布，还提出了"向均值回归"（regression to the mean）——这成了现代统计里"回归"这个词的源头。高尔顿把这条曲线叫"误差频率律"，还称它是"至高无上的法则"。&lt;/p&gt;
&lt;p&gt;"正态"（normal）这个词，是 19 世纪下半叶才慢慢流行起来的，皮尔逊、高尔顿、莱克西斯这些人都用过。皮尔逊晚年还承认过，这名字挺糟糕，容易让人以为其他分布都"不正常"。这个命名上的包袱，正好引出我们后面哲学部分要讲的东西。&lt;/p&gt;
&lt;h2&gt;数学：正态分布是怎么被"逼"出来的&lt;/h2&gt;
&lt;p&gt;上面是历史，现在把数学上的道理拆开看。主要有五层。&lt;/p&gt;
&lt;h3&gt;第一层：可加性——为什么总和趋向正态&lt;/h3&gt;
&lt;p&gt;中心极限定理用式子说就是：如果 &lt;span class="arithmatex"&gt;\(X_1, X_2, \dots, X_n\)&lt;/span&gt; 独立同分布，均值 &lt;span class="arithmatex"&gt;\(\mu\)&lt;/span&gt;、方差 &lt;span class="arithmatex"&gt;\(\sigma^2\)&lt;/span&gt;，那么它们的平均值标准化之后&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[\frac{\bar X - \mu}{\sigma/\sqrt{n}}\ \xrightarrow{d}\ N(0,1)\]&lt;/div&gt;
&lt;p&gt;也就是说，随着 &lt;span class="arithmatex"&gt;\(n\)&lt;/span&gt; 增大，无论 &lt;span class="arithmatex"&gt;\(X_i\)&lt;/span&gt; 原来是什么分布（均匀、指数、抛硬币……），它们的平均值都收敛到标准正态。&lt;/p&gt;
&lt;p&gt;这件事之所以成立，背后是"特征函数"在起作用。特征函数是概率分布的傅里叶变换，独立变量求和，特征函数就相乘。把乘积展开、只保留前几项，最后一定冒出 &lt;span class="arithmatex"&gt;\(e^{-t^2/2}\)&lt;/span&gt; 这个因子——而 &lt;span class="arithmatex"&gt;\(e^{-t^2/2}\)&lt;/span&gt; 正是正态分布的特征函数。所以"求和→正态"不是巧合，是傅里叶变换和泰勒展开联手逼出来的。&lt;/p&gt;
&lt;h3&gt;第二层：公式里为什么有 &lt;span class="arithmatex"&gt;\(e\)&lt;/span&gt; 和 &lt;span class="arithmatex"&gt;\(\pi\)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;那个公式里有两个数学世界的"大明星"：&lt;span class="arithmatex"&gt;\(e\)&lt;/span&gt; 和 &lt;span class="arithmatex"&gt;\(\pi\)&lt;/span&gt;。它们是怎么钻进来的？&lt;/p&gt;
&lt;p&gt;&lt;span class="arithmatex"&gt;\(e\)&lt;/span&gt; 来自"极限"：概率论里凡是涉及大量独立事件累积的地方，几乎必然出现 &lt;span class="arithmatex"&gt;\((1+\frac{x}{n})^n \to e^x\)&lt;/span&gt;。正态分布的指数形式，本质就是这种极限的产物。&lt;/p&gt;
&lt;p&gt;&lt;span class="arithmatex"&gt;\(\pi\)&lt;/span&gt; 来自"对称性"和归一化。要让整条曲线下的面积等于 1，就得算高斯积分&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[\int_{-\infty}^{\infty} e^{-x^2}\,dx = \sqrt{\pi}\]&lt;/div&gt;
&lt;p&gt;这个积分为什么带 &lt;span class="arithmatex"&gt;\(\pi\)&lt;/span&gt;？因为它是圆的面积在作怪：把积分平方，转成极坐标，&lt;span class="arithmatex"&gt;\(x^2+y^2=r^2\)&lt;/span&gt; 里那个圆就露出来了。所以 &lt;span class="arithmatex"&gt;\(\pi\)&lt;/span&gt; 出现在正态分布里，是因为这个分布和一个"圆"有隐秘的联系。&lt;/p&gt;
&lt;h3&gt;第三层：稳定性——正态加正态还是正态&lt;/h3&gt;
&lt;p&gt;正态分布有一个别的分布几乎都没有的性质：两个独立正态变量之和，还是正态分布，只是均值和方差各自相加。这叫"稳定性"。&lt;/p&gt;
&lt;p&gt;在"大量独立微小因素叠加"这个场景里，稳定性极其关键：如果每一步叠加都保持形状不变、只是变宽，那么经过无穷多步之后，你自然还待在"正态"这个家族里。换句话说，正态分布是"求和"这个操作下的一个不动点、一个吸引子。别的分布跌进来，走着走着就都变成了它。&lt;/p&gt;
&lt;h3&gt;第四层：最大熵——一个信息论的视角&lt;/h3&gt;
&lt;p&gt;还有一个更现代的视角，来自 E.T. Jaynes 的"最大熵原理"（1957）。问题反过来问：如果我只知道一个分布的均值 &lt;span class="arithmatex"&gt;\(\mu\)&lt;/span&gt; 和方差 &lt;span class="arithmatex"&gt;\(\sigma^2\)&lt;/span&gt;，别的什么都不知道，那我应该选哪个分布才最"诚实"、最不引入偏见？&lt;/p&gt;
&lt;p&gt;答案是正态分布。在所有均值和方差固定的分布里，正态分布的熵最大——它是在"只知道前两阶矩"这个约束下，最无偏见、最"含混"的选择。&lt;/p&gt;
&lt;p&gt;这个视角很有意思：它不把正态分布看成"自然的铁律"，而看成"信息不足时的默认选项"。我们后面讲哲学，还会回到这一点。&lt;/p&gt;
&lt;h3&gt;第五层：它是扩散方程的解&lt;/h3&gt;
&lt;p&gt;把概率分布看成"一团会扩散的东西"，正态分布就有一个非常物理的身份：它是扩散方程（热传导方程）的基本解。&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[\frac{\partial u}{\partial t} = D\frac{\partial^2 u}{\partial x^2}\]&lt;/div&gt;
&lt;p&gt;这个方程从一个点出发，解随时间演化，就是一个越变越宽的高斯函数&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[u(x,t)=\frac{1}{\sqrt{4\pi Dt}}e^{-\frac{x^2}{4Dt}}\]&lt;/div&gt;
&lt;p&gt;这个身份很重要，因为它把数学和物理直接接上了。下一节讲物理，就从这里讲起。&lt;/p&gt;
&lt;h2&gt;物理：随机游走、热和量子谐振子&lt;/h2&gt;
&lt;h3&gt;随机游走与布朗运动&lt;/h3&gt;
&lt;p&gt;设想一个花粉颗粒悬浮在水里，被无数水分子东撞一下、西撞一下。每一撞都是随机的、独立的、微小的。花粉颗粒经过一段时间后的位移，就是这成千上万次微小碰撞的总和。&lt;/p&gt;
&lt;p&gt;根据中心极限定理，这个位移应当服从正态分布。1905 年，爱因斯坦正是从"随机游走"的模型出发，推导出布朗运动，并写下扩散方程——位移的分布就是一个高斯分布，方差随时间线性增长。后来佩兰的实验验证了爱因斯坦的预言，顺带敲定了原子的存在。&lt;/p&gt;
&lt;p&gt;所以物理里最直观的"正态分布无处不在"的原因就是：&lt;strong&gt;当一个量是大量独立随机微扰的累积时，它就逃不出钟形曲线。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;麦克斯韦速度分布&lt;/h3&gt;
&lt;p&gt;气体里每个分子的速度分量，为什么也服从正态分布？&lt;/p&gt;
&lt;p&gt;因为分子的速度是无数次碰撞累积的结果，而且碰撞是随机的、独立的。于是每个速度分量（比如 &lt;span class="arithmatex"&gt;\(v_x\)&lt;/span&gt; 方向）服从均值 0、方差 &lt;span class="arithmatex"&gt;\(kT/m\)&lt;/span&gt; 的正态分布；三个分量独立，合起来就是麦克斯韦分布。注意一个细节：分子的"速率" &lt;span class="arithmatex"&gt;\(v=\sqrt{v_x^2+v_y^2+v_z^2}\)&lt;/span&gt; 服从的不是正态，而是麦克斯韦速率分布——因为速率是三个高斯分量的"长度"，不再是简单求和了。这个区分很重要，它说明正态分布只对"求和量"天然成立。&lt;/p&gt;
&lt;h3&gt;统计力学：平衡态附近的涨落是高斯&lt;/h3&gt;
&lt;p&gt;更一般地说，统计力学里，一个系统在平衡态附近的涨落，几乎总是高斯的。原因是：把熵 &lt;span class="arithmatex"&gt;\(S\)&lt;/span&gt; 在最大值附近展开，一阶项为零，领头项是二阶项&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[S \approx S_{\max} - \frac12 \sum_i \lambda_i x_i^2\]&lt;/div&gt;
&lt;p&gt;而概率正比于 &lt;span class="arithmatex"&gt;\(e^{S/k}\)&lt;/span&gt;，于是&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[p \propto e^{-\frac12 \sum_i \lambda_i x_i^2}\]&lt;/div&gt;
&lt;p&gt;这就是高斯。所以"平衡态附近是高斯涨落"在物理里几乎是个普遍结论——只要你离平衡态足够近。&lt;/p&gt;
&lt;h3&gt;量子谐振子的基态&lt;/h3&gt;
&lt;p&gt;再往微观走一步：量子力学里，一维谐振子的基态波函数长这样&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[\psi_0(x) = \left(\frac{m\omega}{\pi\hbar}\right)^{1/4} e^{-\frac{m\omega x^2}{2\hbar}}\]&lt;/div&gt;
&lt;p&gt;又是一个高斯。它和前面那些不是巧合，而是一脉相承：谐振子的势能是二次的 &lt;span class="arithmatex"&gt;\(V=\frac12 m\omega^2 x^2\)&lt;/span&gt;，基态是能量最低的态，而高斯恰恰是"在位置和动量的不确定度之间最平衡"的形状——它同时达到海森堡不确定关系的下界。&lt;/p&gt;
&lt;h2&gt;哲学：它意味着什么，又不意味着什么&lt;/h2&gt;
&lt;h3&gt;从"多因之果"到数学定理&lt;/h3&gt;
&lt;p&gt;正态分布的哲学根基，古人其实早有直觉：一个结果若是许多微小原因共同造成的，这些原因的效应会大致抵消，剩下一个居中的、可预期的结果。亚里士多德、盖伦这些人都表达过类似的意思。&lt;/p&gt;
&lt;p&gt;中心极限定理的意义，就是把这条朴素的哲学直觉，变成了一条可以被证明、可以被量化的数学定理。它告诉我们：只要"多因、独立、微小"这三个条件大致成立，结果就趋向正态。这是数学史上少数几条"从世界抽象出来、又反过来解释世界"的定理。&lt;/p&gt;
&lt;h3&gt;拉普拉斯的决定论与概率的张力&lt;/h3&gt;
&lt;p&gt;这里有个有趣的转折。拉普拉斯本人是决定论的代表人物——他写过著名的"拉普拉斯妖"：如果有一个存在知道宇宙里所有粒子的位置和速度，它就能算出过去和未来的一切。&lt;/p&gt;
&lt;p&gt;但同一个人，又发展了概率论，证明了中心极限定理。表面看矛盾，其实不矛盾：决定论说的是"底层物理定律确定"，概率论说的是"我们人类信息不足，只能用概率来描述"。正态分布恰好站在这个交点上——它不是自然本身的属性，而是"我们在信息有限时，对大量复杂原因的一种最优描述"。这正好接上前面最大熵原理给出的结论。&lt;/p&gt;
&lt;h3&gt;"平均人"的教训：从理想化到误用&lt;/h3&gt;
&lt;p&gt;凯特勒的"平均人"引发了一个持久的哲学问题：正态分布描述的是"真实的规律"，还是仅仅"我们的理想化"？&lt;/p&gt;
&lt;p&gt;凯特勒把它当成社会规律的证据，仿佛社会也服从天体的法则。但高尔顿后来指出，凯特勒的"平均人"其实并不存在——没有哪个人真的长着"平均身高、平均体重、平均胸围"。均值是一种抽象，不是实在。&lt;/p&gt;
&lt;p&gt;这个争论一路延续到今天。它的教训是：正态分布是一个极其有用的模型，但它是模型，不是现实本身。把模型当现实，是历史上很多统计误用的根源。&lt;/p&gt;
&lt;h3&gt;不是所有东西都正态：幂律与胖尾&lt;/h3&gt;
&lt;p&gt;最后必须泼一盆冷水。正态分布虽然无处不在，但它绝不是万能的。它的成立依赖"独立 + 微小 + 求和"这几个条件，而现实里大量东西并不满足：&lt;/p&gt;
&lt;p&gt;如果因素是相乘的而不是相加的，结果趋向的是对数正态，不是正态——这个我们下一节结合具体例子讲。如果因素之间有强烈关联、有正反馈、有"赢家通吃"，结果可能是幂律分布，尾巴又长又肥：城市人口、财富、地震能量、书籍销量，很多都是这种。曼德博（Benoit Mandelbrot）研究了一辈子这件事，指出金融市场收益的"胖尾"远比正态分布预测的严重；塔勒布（Nassim Taleb）的"黑天鹅"也是在讲：正态分布会严重低估极端事件。&lt;/p&gt;
&lt;p&gt;所以对正态分布的正确态度是：它是大量"独立、微小、可加"现象的一个极好的默认模型，但不是普适真理。知道它什么时候成立、什么时候失效，比会背它的公式重要得多。&lt;/p&gt;
&lt;h2&gt;一句话总结：加性出正态，乘性出对数正态&lt;/h2&gt;
&lt;p&gt;把整篇文章收成一个最实用的结论，就是这一句：&lt;strong&gt;如果一个量是许多独立微小因素的"和"，它就趋向正态；如果是许多独立微小因素的"积"，它就趋向对数正态——也就是取对数之后才正态。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;拿我们做地球化学的人来说，这个区分天天在用。岩石、土壤、水里的微量元素含量，比如稀土、痕量金属，绝大多数服从的是对数正态分布，而不是正态分布。原因就是：元素的富集、分配很多是乘性的过程——分离结晶里的分配系数、稀释、富集，一步乘一步，累积起来就成了乘积。所以原始浓度画出来是右偏的，取了对数之后才变成漂亮的钟形。阿伦斯（L. H. Ahrens）1954 年那篇经典的《元素的 lognormal 分布》，讲的就是这件事。&lt;/p&gt;
&lt;p&gt;反过来，像测量误差、身高、零件尺寸这些，本质是"加"出来的，就老老实实服从正态。&lt;/p&gt;
&lt;p&gt;所以下次你拿到一批数据，先别急着套正态分布，先问一句：这个东西是怎么"长"出来的？是加出来的，还是乘出来的？这一个问题，往往比任何统计检验都更能告诉你该用什么模型。&lt;/p&gt;
&lt;h2&gt;收尾&lt;/h2&gt;
&lt;p&gt;从棣莫弗算赌注，到高斯测星星，到拉普拉斯的定理，再到爱因斯坦的花粉、麦克斯韦的气体、量子力学的谐振子，最后到凯特勒的"平均人"和曼德博的胖尾——正态分布这一路，串起了概率论、统计、物理、化学、社会学和哲学。&lt;/p&gt;
&lt;p&gt;它之所以无处不在，不是因为它有多神秘，而是因为"大量独立微小因素的叠加"这件事在世界上太普遍了，而数学又恰好证明了：只要你在做这件事，结果就必然是钟形。&lt;/p&gt;
&lt;p&gt;它是一条从混乱里长出来的秩序。但请记得，它不是唯一的秩序，也不是万能的秩序。理解它成立的条件，比膜拜它的形状，更有价值。&lt;/p&gt;</content><category term="Math"/><category term="Math"/><category term="Statistics"/><category term="正态分布"/><category term="高斯分布"/><category term="中心极限定理"/><category term="概率论"/><category term="误差理论"/></entry><entry><title>统计检验概念详解：零假设、自由度、服从分布，以及 t、卡方、F 三个分布</title><link href="https://blog.cycleuser.org/tong-ji-jian-yan-gai-nian-xiang-jie-ling-jia-she-zi-you-du-fu-cong-fen-bu-yi-ji-t-qia-fang-f-san-ge-fen-bu.html" rel="alternate"/><published>2026-09-22T20:45:00+08:00</published><updated>2026-09-22T20:45:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-22:/tong-ji-jian-yan-gai-nian-xiang-jie-ling-jia-she-zi-you-du-fu-cong-fen-bu-yi-ji-t-qia-fang-f-san-ge-fen-bu.html</id><summary type="html">&lt;p&gt;前阵子写&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566194&amp;amp;idx=1&amp;amp;sn=b167d2fc44e4e1264d2097bcb2cce85d&amp;amp;chksm=8fe8407eb89fc968b26f43d14fdd05878b5cf18593e9e66ecf266160bcec1a27258313aa7022#rd"&gt;《基础知识：初级统计概念的简单介绍》&lt;/a&gt;的时候，讲的是平均值、方差、标准差这些"描述性统计"——它们回答的问题是"这堆 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;前阵子写&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566194&amp;amp;idx=1&amp;amp;sn=b167d2fc44e4e1264d2097bcb2cce85d&amp;amp;chksm=8fe8407eb89fc968b26f43d14fdd05878b5cf18593e9e66ecf266160bcec1a27258313aa7022#rd"&gt;《基础知识：初级统计概念的简单介绍》&lt;/a&gt;的时候，讲的是平均值、方差、标准差这些"描述性统计"——它们回答的问题是"这堆数据长什么样"。&lt;/p&gt;
&lt;p&gt;这篇文章要讲的是另一套东西，回答的问题是"两组数据的差异，到底是真的，还是碰巧"——这就是&lt;strong&gt;推断统计&lt;/strong&gt;，也就是统计检验。它是一套术语密集的概念系统：零假设、自由度、服从分布、t 分布、卡方分布、F 分布……每个词单拿出来都像黑话，放在一起更像天书。&lt;/p&gt;
&lt;p&gt;这篇文章的目标，是把这些黑话全部翻译成人话。每讲一个概念，我会先用一个生活里的比方说清楚"它到底在干什么"，再给出直觉解释，最后补一段能直接跑的 Python 代码。读完你应该能看懂论文里"t(18) = 6.1, p &amp;lt; 0.001"或者"χ²(1, N=5924) = 11.50, p &amp;lt; 0.001"这种句子到底在说什么。&lt;/p&gt;
&lt;p&gt;先给一张地图，后面每个概念都是这张图里的一块拼图：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;总体（想知道但看不到全貌的一群人）
   │  抽样
样本（手里实际拿到的一小撮数据）
   │  计算
统计量（把样本压缩成几个数：均值、t 值、卡方值……）
   │  对照
分布（如果零假设成立，统计量本该落在哪里）
   │  算概率
p 值（实际落点有多&amp;quot;离谱&amp;quot;）
   │  下结论
拒绝 / 不拒绝零假设
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2&gt;一、总体与样本：为什么需要"推断"&lt;/h2&gt;
&lt;p&gt;先说一个大前提：你几乎永远看不到"总体"。&lt;/p&gt;
&lt;p&gt;你想知道"全中国成年男性的平均身高"，但你不可能量遍每一个成年男性。你能量到的只是手里这一千个人的身高。这一千个人就是&lt;strong&gt;样本&lt;/strong&gt;，全中国成年男性才是&lt;strong&gt;总体&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;统计检验要干的，就是从样本出发，去推断总体的性质。因为看不到总体，所以所有的结论都是"带概率的猜测"——这就是为什么统计检验永远在谈概率、谈分布、谈"显著不显著"，而不是斩钉截铁地说"是"或"不是"。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二、统计量：用几个数，概括一堆数&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;统计量（statistic）&lt;/strong&gt;，说穿了就是"从样本数据里算出来的一个数"。&lt;/p&gt;
&lt;p&gt;它的&lt;strong&gt;来源&lt;/strong&gt;是样本——不是拍脑袋想出来的，是对手里的数据做加减乘除得到的。它的&lt;strong&gt;作用&lt;/strong&gt;是概括：一千个身高数字没法直接给人看，但"平均身高 172 厘米"一个数就能说明很多问题。&lt;/p&gt;
&lt;p&gt;常见的统计量分两类：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;例子&lt;/th&gt;
&lt;th&gt;回答的问题&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;描述性统计量&lt;/td&gt;
&lt;td&gt;均值、方差、中位数&lt;/td&gt;
&lt;td&gt;这堆数据长什么样&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;检验统计量&lt;/td&gt;
&lt;td&gt;t 值、卡方值、F 值&lt;/td&gt;
&lt;td&gt;差异/偏离有多大，是否显著&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;描述性统计量上一篇讲过，这篇文章重点是&lt;strong&gt;检验统计量&lt;/strong&gt;。它的定义有点绕，但可以先记住一句话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;检验统计量，就是把"你观察到的差异或偏离"浓缩成一个数，好拿去和"纯偶然能产生的波动"做比较。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;比如 t 值，本质是个"信噪比"：分子是信号（两组均值差多少），分母是噪声（抽样自然波动多大）。t 值大，说明差异明显盖过了随机波动，这差异就可能是真的。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="c1"&gt;# 两组各 20 人的成绩&lt;/span&gt;
&lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# 对照组，平均 70&lt;/span&gt;
&lt;span class="n"&gt;experiment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 实验组，平均 78&lt;/span&gt;

&lt;span class="n"&gt;t_value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttest_ind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;equal_var&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t 值 = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t_value&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;p 值 = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p_value&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;t 值 = 2.587
p 值 = 0.0139
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这个 t = 2.587 就是一个检验统计量。它本身只是个数字，它的意义要放到"分布"里才能解释——这正是下一节的内容。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;三、服从分布：数据的"落点规律"&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;"服从分布"&lt;/strong&gt; 这个词，是所有黑话里最唬人的一个。把它翻译成人话就是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;数据不是乱来的，它们落在不同取值上的可能性是有规律的。这个规律，就叫分布。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;举个最直观的例子。你去校门口量 1000 个路人的身高，然后把身高分成很多小段（160-162 一段，162-164 一段……），数每个小段有多少人，画成直方图。你会看到：中间段人最多，越往两边人越少，整个形状像一口钟。这就是"身高服从正态分布"的意思——不是说每个人都是平均身高，而是说&lt;strong&gt;身高的落点遵循一条钟形曲线&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;"服从分布"的严格说法是：一个随机变量的取值，可以用某条概率密度曲线（或某个概率表）来描述。曲线越高的地方，取值落在那里的可能性越大。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="c1"&gt;# 模拟 1000 个&amp;quot;服从正态分布&amp;quot;的身高数据&lt;/span&gt;
&lt;span class="n"&gt;heights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;172&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;heights&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bins&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;density&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;#1f77b4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;身高（cm）&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;频率密度&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1000 个身高的直方图：中间多、两边少，接近钟形&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;直方图的形状，就是我们常说的"分布的形状"。为什么统计检验这么在乎分布？因为——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;只有知道了"如果纯属偶然，这个统计量会落在哪里"，你才能判断"眼前这个落点是不是太离谱了"。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;换句话说，分布是统计检验的"裁判规则书"。下面几节讲的 t 分布、卡方分布、F 分布，就是三种不同的裁判规则书。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;四、正态分布：统计世界的"默认设置"&lt;/h2&gt;
&lt;p&gt;在讲那三个分布之前，必须先讲&lt;strong&gt;正态分布（normal distribution）&lt;/strong&gt;，因为另外三个分布要么从它派生，要么拿它当参照。&lt;/p&gt;
&lt;p&gt;正态分布长这样：&lt;/p&gt;
&lt;p&gt;&lt;img alt="正态分布" src="images/stat-1-normal.png"&gt;&lt;/p&gt;
&lt;p&gt;它的形状特征，一句话：&lt;strong&gt;中间高、两边低、左右对称的钟形&lt;/strong&gt;。两个参数决定它：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;均值 μ&lt;/strong&gt;：钟顶在哪（中心位置）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;标准差 σ&lt;/strong&gt;：钟有多胖（数据的离散程度）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它最著名的性质是"68-95-99.7 法则"：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大约 68% 的数据落在 均值 ± 1 个标准差 之内；&lt;/li&gt;
&lt;li&gt;大约 95% 落在 均值 ± 2 个标准差 之内；&lt;/li&gt;
&lt;li&gt;大约 99.7% 落在 均值 ± 3 个标准差 之内。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为什么正态分布是"默认设置"？两个原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;自然界太多东西近似正态&lt;/strong&gt;：身高、体重、测量误差……大量微小随机因素叠加的结果，往往就是正态分布（这就是中心极限定理）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;抽样均值的分布，无论原始数据长什么样，只要样本够大，就趋近正态&lt;/strong&gt;。这是统计检验能成立的地基。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以课件里反复强调"以下方法全部假定数据服从正态分布"——因为 t 检验、ANOVA 这些方法，都是建立在这个假设之上的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;五、零假设与备择假设：先假定"没事"，再找证据反驳&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;零假设（null hypothesis，记作 H₀）&lt;/strong&gt;，是统计检验里最核心也最容易理解反的一个概念。&lt;/p&gt;
&lt;p&gt;它跟法院的&lt;strong&gt;无罪推定&lt;/strong&gt;一模一样：开庭之前，先假定被告无罪。要判他有罪，控方必须拿出足够强的证据，强到"被告要是真无罪，不可能出现这种证据"的程度。&lt;/p&gt;
&lt;p&gt;统计检验完全照搬这个逻辑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;零假设 H₀&lt;/strong&gt;：先假定"没有差异 / 没有关联 / 没有效果"。比如"两组平均身高没有差异"。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;备择假设 H₁&lt;/strong&gt;：零假设的反面。比如"两组平均身高有差异"。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意两个容易搞错的地方：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;零假设不是你想证明的结论，恰恰是你想"推翻"的靶子&lt;/strong&gt;。检验的目标是看证据够不够强，强到能把"没有差异"这个默认状态推翻。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检验的结论只有两种&lt;/strong&gt;：要么"拒绝零假设"（证据够强，有显著差异），要么"不拒绝零假设"（证据不够，不能下结论有差异）。注意是"不拒绝"，不是"接受"——就像法院判"证据不足、无罪释放"不等于"证明他真是个好人"。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 零假设 H0：两组均值相等（μ1 = μ2）&lt;/span&gt;
&lt;span class="c1"&gt;# 备择假设 H1：两组均值不相等（μ1 ≠ μ2）&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;span class="c1"&gt;# t 检验做的事：在 H0 成立的前提下，算出现当前差异的概率（p 值）。&lt;/span&gt;
&lt;span class="c1"&gt;# 若 p 值太小（比如 &amp;lt; 0.05），说明&amp;quot;H0 成立时不该出现这么大差异&amp;quot;，&lt;/span&gt;
&lt;span class="c1"&gt;# 于是我们拒绝 H0，认为差异显著。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;一句话总结：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;零假设 = 无罪推定 = 默认没有差异。统计检验 = 找证据，看能不能把这个默认状态推翻。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;六、p 值与显著性水平：证据要强到什么程度&lt;/h2&gt;
&lt;p&gt;有了零假设，下一个问题就是：差异大到什么程度，才算"够强"？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;p 值（p-value）&lt;/strong&gt; 的严格定义是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;在零假设成立的前提下，观察到"当前结果或更极端结果"的概率。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;把它翻译成人话：&lt;strong&gt;如果两组真的没有差异，纯靠偶然，出现我们看到的这个差异（甚至更大的差异）的概率有多大？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="p值" src="images/stat-2-p-value.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;p 值大（比如 0.6）："没差异"也能轻轻松松产生这么大的波动，所以没有理由怀疑零假设。&lt;/li&gt;
&lt;li&gt;p 值小（比如 0.001）："没差异"的话，出现这么大差异的概率只有千分之一，太离谱了，所以有理由认为差异是真的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那"多小算小"？这就是&lt;strong&gt;显著性水平 α（significance level）&lt;/strong&gt;，通常取 0.05。它是一条人为划的红线：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;p &amp;lt; α（比如 p &amp;lt; 0.05）→ 拒绝零假设 → 结果"显著"；&lt;/li&gt;
&lt;li&gt;p ≥ α → 不拒绝零假设 → 结果"不显著"。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;论文里常见的星号就是这么来的：&lt;code&gt;*&lt;/code&gt; = p&amp;lt;0.05，&lt;code&gt;**&lt;/code&gt; = p&amp;lt;0.01，&lt;code&gt;***&lt;/code&gt; = p&amp;lt;0.001，星越多证据越强。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;

&lt;span class="c1"&gt;# t = 2.5，自由度 18，算双尾 p 值&lt;/span&gt;
&lt;span class="n"&gt;t_obs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t_obs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;    &lt;span class="c1"&gt;# sf = survival function，即右尾面积；×2 是双尾&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t_obs&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, p = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;p &amp;lt; 0.05&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;p &amp;gt;= 0.05&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;t = 2.5, p = 0.0223
p &amp;lt; 0.05
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;p 值最大的坑&lt;/strong&gt;：它对样本量极度敏感。样本一大，再微不足道的差异也能给出极小的 p 值。所以 p 值只回答"差异是否可检测到"，不回答"差异有多大"——后者要靠效应量（后面第 9 节讲）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;七、自由度：能自由变动的数据点个数&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;自由度（degrees of freedom，简称 df）&lt;/strong&gt;，是被问得最多的概念，也是最值得用直觉先打通的一个。&lt;/p&gt;
&lt;p&gt;最直白的定义：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;自由度 = 在给定了某些约束之后，还能自由变动的数据点个数。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一个经典例子。三个数，已知它们的平均值是 10：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第 1 个数可以随便选，比如 8；&lt;/li&gt;
&lt;li&gt;第 2 个数也可以随便选，比如 12；&lt;/li&gt;
&lt;li&gt;第 3 个数就&lt;strong&gt;被锁死了&lt;/strong&gt;——必须是 10，否则均值就不是 10 了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以这三个数里，真正自由的只有 2 个，自由度 = 3 - 1 = 2。那个被减掉的 1，就是"均值"这个约束消耗掉的一个自由度。&lt;/p&gt;
&lt;p&gt;这就是样本方差公式里除以 n-1 而不是 n 的来历：算样本方差时，你已经先算了一次样本均值，用掉了一个自由度，所以剩下的自由度是 n-1。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 三个数，均值锁定为 10&lt;/span&gt;
&lt;span class="c1"&gt;# 前两个可以自由选，第三个被锁定&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, b=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 自由选择后，c 被锁死为 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;自由度 = 3 - 1 = 2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;a=8, b=12 自由选择后，c 被锁死为 10
自由度 = 3 - 1 = 2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;为什么自由度这么重要？因为&lt;strong&gt;它决定分布的形状&lt;/strong&gt;。t 分布、卡方分布、F 分布的形状都随自由度变化。自由度小，说明"信息少、估计不稳"，对应的分布就更胖、更保守。&lt;/p&gt;
&lt;p&gt;几个常见的自由度：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;自由度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;单样本 t 检验&lt;/td&gt;
&lt;td&gt;n - 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;独立两样本 t 检验&lt;/td&gt;
&lt;td&gt;n₁ + n₂ - 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;卡方检验（2×2 表）&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;卡方检验（r×c 表）&lt;/td&gt;
&lt;td&gt;(r-1)(c-1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单因素 ANOVA（组间）&lt;/td&gt;
&lt;td&gt;k - 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单因素 ANOVA（组内）&lt;/td&gt;
&lt;td&gt;N - k&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;八、t 分布：小样本均值的"谨慎版"正态&lt;/h2&gt;
&lt;p&gt;现在讲第一个"裁判规则书"：&lt;strong&gt;t 分布&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;回忆一下：t 值 = 均值差 ÷ 均值差的标准误。问题来了——当样本量很小时，我们连"标准误"都估不准，于是 t 值的落点就比标准正态更不确定。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;t 分布&lt;/strong&gt;就是用来描述这种"小样本下的不确定性"的分布。它长得像正态分布，但：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自由度越小，尾部越胖&lt;/strong&gt;——因为样本少、信息不足，极端值出现的概率比正态高，判断要更保守；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自由度越大，越接近标准正态分布&lt;/strong&gt;——样本多了，估得准了，就退回正态。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="t分布" src="images/stat-3-t-dist.png"&gt;&lt;/p&gt;
&lt;p&gt;看这张图：df=1 的 t 分布（红线）尾巴明显比正态（黑线）厚得多，df=30（绿线）已经几乎和正态重合了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;

&lt;span class="c1"&gt;# 同样落在 x=3 的位置，df 越小，尾部概率越大&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;df=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;4&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;  P(X&amp;gt;3) = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;   正态分布 P(X&amp;gt;3) = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;df=   1  P(X&amp;gt;3) = 0.1024   正态分布 P(X&amp;gt;3) = 0.0013
df=   5  P(X&amp;gt;3) = 0.0150   正态分布 P(X&amp;gt;3) = 0.0013
df=  30  P(X&amp;gt;3) = 0.0027   正态分布 P(X&amp;gt;3) = 0.0013
df=1000  P(X&amp;gt;3) = 0.0014   正态分布 P(X&amp;gt;3) = 0.0013
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;看到没：同样落在 x=3 这个"极端"位置，df=1 时概率是 0.1024（不算罕见），df=1000 时是 0.0014（很罕见了）。这就是"样本越小，越要谨慎"的数学表达。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;t 分布用在什么时候&lt;/strong&gt;：比较两组均值（t 检验）。论文里的 &lt;code&gt;t(18) = 6.1, p &amp;lt; 0.001&lt;/code&gt;，意思就是"自由度为 18 的 t 检验，检验统计量 t=6.1，p 值小于 0.001"。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;九、效应量：差异"有多大"，而不是"有没有"&lt;/h2&gt;
&lt;p&gt;p 值回答"差异是否真实存在"，但它不回答"差异有多大"。一个身高差 0.1 厘米的差异，样本够大时也能 p&amp;lt;0.001，但 0.1 厘米没有任何实际意义。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;效应量（effect size）&lt;/strong&gt; 就是来补这个洞的。它把"差异的绝对大小"用标准化的方式表达出来，让人一眼看出差异是否"值得一提"。&lt;/p&gt;
&lt;p&gt;最常用的效应量是 &lt;strong&gt;Cohen's d&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;d = (两组均值差) / (合并标准差)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;经验判断：d ≈ 0.2 是小效应，0.5 是中等，0.8 是大效应。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;experiment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;74&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;mean_diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;pooled_sd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;control&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ddof&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ddof&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mean_diff&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;pooled_sd&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;均值差 = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mean_diff&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;，合并标准差 = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;pooled_sd&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Cohen&amp;#39;s d = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;均值差 = 4.12，合并标准差 = 9.98
Cohen&amp;#39;s d = 0.413
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;论文报告规范通常是：&lt;strong&gt;既要报 p 值（有没有差异），也要报效应量（差异有多大）&lt;/strong&gt;。只报 p 值是外行做法。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;十、卡方分布：偏离程度的分布&lt;/h2&gt;
&lt;p&gt;卡方检验用来处理&lt;strong&gt;分类数据&lt;/strong&gt;——不是身高这种连续数字，而是"及格/不及格""是/否""类别 A/B/C"这种数人头的计数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;卡方值&lt;/strong&gt;衡量的是：观测频数（实际数到的人数）和期望频数（零假设成立时"应该"数到的人数）偏离了多少。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;χ² = Σ (观测频数 - 期望频数)² / 期望频数
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;偏离得越厉害，卡方值越大。而这个卡方值"纯靠偶然会落在哪里"，由&lt;strong&gt;卡方分布&lt;/strong&gt;描述。&lt;/p&gt;
&lt;p&gt;卡方分布的形状特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只能取非负值&lt;/strong&gt;（因为平方项都是正的）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右偏&lt;/strong&gt;（长长的右尾巴），自由度越大越趋近对称。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="卡方分布" src="images/stat-4-chi-square.png"&gt;&lt;/p&gt;
&lt;p&gt;一个经典例子（来自课件）：两个作文题目，统计"人"这个词的词频，判断"人"的词频是否和题目有关联。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;题目A&lt;/th&gt;
&lt;th&gt;题目B&lt;/th&gt;
&lt;th&gt;合计&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;人&lt;/td&gt;
&lt;td&gt;114&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;其他名词&lt;/td&gt;
&lt;td&gt;863&lt;/td&gt;
&lt;td&gt;945&lt;/td&gt;
&lt;td&gt;1808&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;合计&lt;/td&gt;
&lt;td&gt;977&lt;/td&gt;
&lt;td&gt;972&lt;/td&gt;
&lt;td&gt;1949&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;

&lt;span class="n"&gt;observed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;114&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                     &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;863&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;945&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="n"&gt;chi2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dof&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chi2_contingency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;observed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;correction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;χ² = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;chi2&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, df = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dof&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, p = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;期望频数：&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;χ² = 56.07, df = 1, p = 6.992e-14
期望频数：
[[ 70.68  70.32]
 [906.32 901.68]]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;χ² = 56.07，p 小到 6.99×10⁻¹⁴，说明"人"的词频和题目有极强的关联——两个题目里"人"的使用确实不一样。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;卡方分布用在什么时候&lt;/strong&gt;：分类变量的关联性检验。论文里的 &lt;code&gt;χ²(1, N=5924) = 11.50, p &amp;lt; 0.001&lt;/code&gt;，意思就是"自由度为 1 的卡方检验，样本量 5924，卡方值 11.50"。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;十一、F 分布：方差比值的分布&lt;/h2&gt;
&lt;p&gt;当你要同时比较&lt;strong&gt;三组及以上&lt;/strong&gt;的均值差异时，t 检验不够用了（它只能比两组），这时上 &lt;strong&gt;ANOVA（方差分析）&lt;/strong&gt;，用的检验统计量是 &lt;strong&gt;F 值&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;F 值的设计思路特别巧妙。它把"差异"拆成两半：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;F = 组间差异（信号） / 组内差异（噪声）
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;组间差异&lt;/strong&gt;：各组均值之间的高低不同——这是你想找的"信号"；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;组内差异&lt;/strong&gt;：同一组内部个体的自然波动——这是"噪声"。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果组间差异大、组内差异小，F 就大，说明组与组之间的区别明显盖过了随机噪声，差异是真的。如果 F 接近 1，说明信号完全淹没在噪声里。&lt;/p&gt;
&lt;p&gt;F 值的落点，由 &lt;strong&gt;F 分布&lt;/strong&gt; 描述。它有两个自由度：一个来自组间（分子），一个来自组内（分母）。&lt;/p&gt;
&lt;p&gt;&lt;img alt="F分布" src="images/stat-5-f-dist.png"&gt;&lt;/p&gt;
&lt;p&gt;F 分布的形状和卡方很像：&lt;strong&gt;非负、右偏&lt;/strong&gt;。有两个自由度（df1 和 df2），分别对应分子和分母。&lt;/p&gt;
&lt;p&gt;课件里那个手工算 F 的小例子，把公式拆得很清楚：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;组&lt;/th&gt;
&lt;th&gt;观测值&lt;/th&gt;
&lt;th&gt;均值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;8, 10, 12&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;4, 6, 8&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;6, 8, 10&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;

&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;grand&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concatenate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;ss_between&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;grand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ss_within&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;
&lt;span class="n"&gt;msb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ss_between&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# 组间均方，自由度 k-1&lt;/span&gt;
&lt;span class="n"&gt;msw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ss_within&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# 组内均方，自由度 N-k&lt;/span&gt;
&lt;span class="n"&gt;F&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msb&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;msw&lt;/span&gt;
&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;f_oneway&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pvalue&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SS组间=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ss_between&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, SS组内=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ss_within&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;MSB=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;msb&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, MSW=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;msw&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;F = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, p = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;SS组间=24.0, SS组内=24.0
MSB=12.0, MSW=4.0
F = 3.0, p = 0.1250
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;F = 3.0，p = 0.125 &amp;gt; 0.05，所以不能拒绝零假设——这三组的均值差异不足以被证明是真实的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F 分布用在什么时候&lt;/strong&gt;：三组及以上均值比较（ANOVA）、以及很多模型的整体显著性检验。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;十二、第一类错误与第二类错误：检验也会犯错&lt;/h2&gt;
&lt;p&gt;统计检验是基于概率的，所以它天然会犯两种错：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;错误类型&lt;/th&gt;
&lt;th&gt;是什么&lt;/th&gt;
&lt;th&gt;类比&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;第一类错误（α）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;零假设其实成立，你却拒绝了它——"误判有罪"&lt;/td&gt;
&lt;td&gt;冤枉好人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;第二类错误（β）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;零假设其实不成立，你却没拒绝它——"漏判有罪"&lt;/td&gt;
&lt;td&gt;放走坏人&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;显著性水平 α 就是你自己设定的第一类错误上限：α=0.05 意味着你愿意接受"最多 5% 的概率冤枉好人"。&lt;/p&gt;
&lt;p&gt;两者之间存在跷跷板关系：α 定得越小（越不容易误判有罪），就越容易放走坏人（第二类错误越大）。这就是为什么 α 不是越小越好，0.05 是学界在两者之间取的一个平衡。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 第一类错误的直觉：即使零假设成立，纯抽样波动也可能让 p 偶尔 &amp;lt; 0.05&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;

&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;false_positives&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 两组其实来自同一总体（无差异）&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttest_ind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;false_positives&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1000 次&amp;#39;无差异&amp;#39;检验中，误报显著的次数：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;false_positives&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;（约等于 α × 1000）&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;1000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;次&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;无差异&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;检验中&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;误报显著的次数&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;&lt;span class="mf"&gt;52&lt;/span&gt;&lt;span class="err"&gt;（&lt;/span&gt;&lt;span class="n"&gt;约等于&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;α&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;×&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1000&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;两组数据明明来自同一个总体（确实没有差异），但 1000 次检验里仍有约 52 次"误报显著"——这就是 5% 的第一类错误在真实发生。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;十三、前提假设：这些方法为什么"有条件"&lt;/h2&gt;
&lt;p&gt;课件反复强调，t 检验、ANOVA 都建立在一些&lt;strong&gt;前提假设&lt;/strong&gt;上，不满足这些假设，结论就不可靠：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 正态性（normality）&lt;/strong&gt;
每组数据应大致服从正态分布。样本量大时（每组 ≥ 30）相对稳健；但相对频率这种数据常常严重偏态，需要警惕。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 方差齐性（homogeneity of variance）&lt;/strong&gt;
各组方差应大致相等。可以用 Levene 检验判断；不齐时用 Welch 修正（我们前面 t 检验用的 &lt;code&gt;equal_var=False&lt;/code&gt; 就是 Welch 修正）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 观测独立性（independence）&lt;/strong&gt;
每个观测相互独立，不重复测量同一对象。文本分析里，每篇文章算一个独立样本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 期望频数（卡方特有）&lt;/strong&gt;
卡方检验里，列联表每个格子的期望频数不宜过小（通常需 &amp;gt; 5），否则卡方近似不成立。&lt;/p&gt;
&lt;p&gt;这些假设如果严重不满足怎么办？答案是&lt;strong&gt;换非参数检验&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;十四、非参数检验：不依赖正态分布的备胎&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;非参数检验&lt;/strong&gt;，就是那些"不要求数据服从正态分布"的方法。&lt;/p&gt;
&lt;p&gt;最典型的是 &lt;strong&gt;Kruskal-Wallis 检验&lt;/strong&gt;，它是 ANOVA 的非参数版本。ANOVA 要求正态、方差齐，Kruskal-Wallis 只要求独立——它不直接用原始数值，而是把数值换成&lt;strong&gt;排名（秩）&lt;/strong&gt;再比较，因此对偏态、异常值都不敏感。&lt;/p&gt;
&lt;p&gt;课件的实战建议很实用：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;先跑 ANOVA 看分布，偏态严重就换 Kruskal-Wallis；卡方只在你只想用组级计数时用。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="c1"&gt;# 三组严重偏态的数据（不满足正态假设）&lt;/span&gt;
&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exponential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exponential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exponential&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p_anova&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;f_oneway&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# ANOVA（假设正态）&lt;/span&gt;
&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p_kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kruskal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# Kruskal-Wallis（非参数）&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ANOVA:          F=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, p=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p_anova&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Kruskal-Wallis: H=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, p=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p_kw&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.4f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ANOVA:          F=5.916, p=0.0038
Kruskal-Wallis: H=15.94, p=0.0003
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;偏态数据下，非参数的 Kruskal-Wallis 往往比 ANOVA 更稳健。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;十五、事后比较：ANOVA 显著了，然后呢？&lt;/h2&gt;
&lt;p&gt;ANOVA 有一个"先天不足"：它只告诉你"至少有一组和别人不同"，但&lt;strong&gt;不告诉你是哪两组&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;要定位具体差异，需要&lt;strong&gt;事后比较（post-hoc test）&lt;/strong&gt;，最常用的是 &lt;strong&gt;Tukey HSD&lt;/strong&gt;。它的思路是：一次性地校正所有两两比较，把"误报"的总概率锁回到 α，避免你连续做一堆 t 检验导致第一类错误累积。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;statsmodels.stats.multicomp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pairwise_tukeyhsd&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concatenate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;# A 组&lt;/span&gt;
    &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;# B 组&lt;/span&gt;
    &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;# C 组&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;groups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;B&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pairwise_tukeyhsd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Tukey HSD 会输出每一对的均值差、校正后的 p 值，以及"是否显著"（reject=True/False）。这样你就知道到底哪两组之间有真实差异。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;十六、一张表收尾&lt;/h2&gt;
&lt;p&gt;把整篇文章的脉络收进一张表，方便查阅：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;概念&lt;/th&gt;
&lt;th&gt;人话解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;总体 / 样本&lt;/td&gt;
&lt;td&gt;想知道的全体 vs 手里拿到的一小撮&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;统计量&lt;/td&gt;
&lt;td&gt;从样本算出来、用来概括或检验的那个数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;服从分布&lt;/td&gt;
&lt;td&gt;数据落点遵循的规律（钟形、右偏……）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;正态分布&lt;/td&gt;
&lt;td&gt;中间高两边低的钟形，统计的"默认设置"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;零假设 H₀&lt;/td&gt;
&lt;td&gt;无罪推定：先默认"没有差异"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;备择假设 H₁&lt;/td&gt;
&lt;td&gt;零假设的反面："有差异"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;检验统计量&lt;/td&gt;
&lt;td&gt;把差异/偏离浓缩成的那个数（t、χ²、F）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p 值&lt;/td&gt;
&lt;td&gt;零假设成立时，出现当前结果的概率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;显著性水平 α&lt;/td&gt;
&lt;td&gt;判死刑的红线，通常 0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自由度 df&lt;/td&gt;
&lt;td&gt;还能自由变动的数据点个数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;t 分布&lt;/td&gt;
&lt;td&gt;小样本均值的分布，df 越小尾巴越胖&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;卡方分布&lt;/td&gt;
&lt;td&gt;"偏离程度"的分布，非负、右偏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F 分布&lt;/td&gt;
&lt;td&gt;"方差比值"的分布，非负、右偏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;效应量&lt;/td&gt;
&lt;td&gt;差异有多大（不只是有没有）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第一类错误&lt;/td&gt;
&lt;td&gt;冤枉好人（无差异却报显著）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第二类错误&lt;/td&gt;
&lt;td&gt;放走坏人（有差异却没查出来）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;非参数检验&lt;/td&gt;
&lt;td&gt;不要求正态的备胎（Kruskal-Wallis）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tukey HSD&lt;/td&gt;
&lt;td&gt;ANOVA 显著后，定位具体哪两组不同&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;最后&lt;/h2&gt;
&lt;p&gt;统计检验这套术语，本质上是一个&lt;strong&gt;反证法的流水线&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先假定"没有差异"（零假设）；&lt;/li&gt;
&lt;li&gt;把观察到的差异浓缩成一个数（检验统计量）；&lt;/li&gt;
&lt;li&gt;对照"纯偶然时这个数该落在哪里"（分布）；&lt;/li&gt;
&lt;li&gt;算"出现这么离谱结果的概率"（p 值）；&lt;/li&gt;
&lt;li&gt;概率够小就推翻零假设，不够小就维持原判。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;理解了这条流水线，t 检验、卡方检验、ANOVA 的区别就只剩下"用什么统计量、对照什么分布"——而这两点，本文都讲过了。剩下的就是多读几篇带统计结果的论文，看到 &lt;code&gt;t(18)=6.1&lt;/code&gt;、&lt;code&gt;χ²(1)=11.50&lt;/code&gt;、&lt;code&gt;F=16.96&lt;/code&gt; 这些符号时，能条件反射地知道它们在说什么。&lt;/p&gt;</content><category term="Math"/><category term="Statistics"/><category term="Math"/><category term="hypothesis-testing"/><category term="统计学"/><category term="假设检验"/></entry><entry><title>给纯新手：在 Windows 上从记事本到终端，跑起你的第一个 Python 脚本</title><link href="https://blog.cycleuser.org/gei-chun-xin-shou-zai-windows-shang-cong-ji-shi-ben-dao-zhong-duan-pao-qi-ni-de-di-yi-ge-python-jiao-ben.html" rel="alternate"/><published>2026-09-20T00:00:00+08:00</published><updated>2026-09-20T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-20:/gei-chun-xin-shou-zai-windows-shang-cong-ji-shi-ben-dao-zhong-duan-pao-qi-ni-de-di-yi-ge-python-jiao-ben.html</id><summary type="html">&lt;h1&gt;给纯新手：在 Windows 上从记事本到终端，跑起你的第一个 Python 脚本&lt;/h1&gt;
&lt;p&gt;这篇文章写给那种"从来没碰过命令行、没写过一行代码"的朋友 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;给纯新手：在 Windows 上从记事本到终端，跑起你的第一个 Python 脚本&lt;/h1&gt;
&lt;p&gt;这篇文章写给那种"从来没碰过命令行、没写过一行代码"的朋友。你手头有一台 Windows 电脑，想自己写个小脚本把它跑起来，结果卡在各种窗口、各种键位上面。别慌，我把从零开始的一条龙给你捋一遍，你照着做，十分钟内能见到自己的程序跑起来。&lt;/p&gt;
&lt;h2&gt;为什么先教你这些"最笨"的办法&lt;/h2&gt;
&lt;p&gt;先说明一下，为什么非要用记事本这种土办法，而不是一上来就装个大软件。&lt;/p&gt;
&lt;p&gt;我接触过的不少大一同学，电脑是上了大学才认真开始用的。平时玩手机为主，刷视频、聊天、看剧都在手机上，连打游戏都不怎么用电脑。你让他新建个文件夹、改个文件名、看看文件在哪个盘，他都是懵的。这没什么好丢人的，就是接触电脑晚、没人教，也没机会练，电脑的基本操作和基础知识等于一片空白。&lt;/p&gt;
&lt;p&gt;所以我故意绕开那些"高级"的东西，先把最基础的操作走一遍。就这一篇里，其实已经练到好几样了：怎么开终端、怎么敲命令，怎么用记事本写东西、保存、改扩展名，什么是路径、怎么从地址栏拿到一个文件夹的位置，怎么进目录、看目录里有什么、再运行一个程序。这些"终端、文件、扩展名、路径"的概念看着不起眼，却是后面所有编程和计算机操作的地基。地基不打牢，后面用什么都是空中楼阁。&lt;/p&gt;
&lt;p&gt;至于那些更复杂的集成开发环境（IDE）、各种功能花哨的编辑器，咱们留到后边再讲。现在先把这些最基础的东西用熟了、手指有了记忆，再上大工具，你会觉得那些工具是来帮你的，而不是来吓你的。&lt;/p&gt;
&lt;h2&gt;这次课，就这一份文本&lt;/h2&gt;
&lt;p&gt;再说一下这次课怎么上。第一次课我在讲台上给大家做过演示，也专门挑了几个同学，先教会他们，再让他们下去教其他同学。到了这次课，就只发你们手里这一份文本——没有图、没有视频，别的什么都不准用，就靠它把任务完成。这么做的目的，是练你们"看着文字描述、自己一步步把事做出来"的能力：一句话没看懂，就多读两遍，照着敲，慢慢就能顺下来。别指望旁边摆张截图对着点，离开图也能把事办成，才算是真会了。&lt;/p&gt;
&lt;p&gt;先提醒一句：很多人（包括我以前带过的学生）第一步就卡在按键上。Windows 键就是键盘左下角画着一个小窗户的那个键。下面每一步我都把"按哪个键、点哪个地方"写清楚，你不用猜。&lt;/p&gt;
&lt;h2&gt;第一步：打开一个"管理员终端"&lt;/h2&gt;
&lt;p&gt;我们要用到的那个黑乎乎的窗口，学名叫"终端"，Windows 11 上默认是 PowerShell。管理员身份其实不是必须的，但有些操作（装东西、改系统配置）需要它，所以干脆一上来就用管理员开，省得后面不够用还得重开。&lt;/p&gt;
&lt;p&gt;按住 Windows 键，再按一下字母 X。&lt;/p&gt;
&lt;p&gt;注意，是 Win+X，你要的就是 Win+X 这一个组合。&lt;/p&gt;
&lt;p&gt;按完之后，屏幕左下角（开始按钮的位置）会弹出一个菜单，里面一排黑底白字的选项。找到"终端(管理员)"或者"Windows PowerShell(管理员)"——不同版本的 Windows 名字略有差别，认准"管理员"三个字就行——点它。系统可能弹个框问你是不是允许这个程序修改你的设备，点"是"。&lt;/p&gt;
&lt;p&gt;完事之后，屏幕上会出现一个深色窗口，上面一行行英文，最后有个闪烁的光标。这个就是终端，你等会要在这里敲命令。&lt;/p&gt;
&lt;h2&gt;第二步：用记事本写一个小脚本&lt;/h2&gt;
&lt;p&gt;记事本怎么开？Win+R 最快。&lt;/p&gt;
&lt;p&gt;按住 Windows 键，再按一下 R，会弹出一个小小的"运行"对话框，里面有个输入框。输入 notepad，回车。&lt;/p&gt;
&lt;p&gt;记事本就出来了，一个空白的白板。在里面敲这几行（就三行，照着敲，别漏了引号）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你好，世界！&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你叫什么名字？&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;欢迎你，&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;第一行打印一句问候，第二行问你的名字并等你输入，第三行把你输进去的名字打回来。就这么个东西，但它是货真价实的 Python 程序。&lt;/p&gt;
&lt;h2&gt;第三步：保存成 .py 文件（这一步最容易翻车）&lt;/h2&gt;
&lt;p&gt;按 Ctrl+S（按住 Ctrl 再按 S），第一次保存会弹出"另存为"对话框。&lt;/p&gt;
&lt;p&gt;这里有两个坑，新手十有八九会踩。&lt;/p&gt;
&lt;p&gt;第一个坑是保存路径。对话框顶部或者左侧有个位置栏。为了后面好找，建议你用一个固定的地方：先进到 D 盘的 VirtualMachine 文件夹，在里面新建一个以你名字命名的文件夹——右击空白处，选"新建 → 文件夹"，输入你的名字。这个文件夹的完整路径就是 D:\VirtualMachine\名字（把"名字"换成你自己的名字，比如你叫张三，就是 D:\VirtualMachine\张三）。把保存位置定到这个文件夹里。&lt;/p&gt;
&lt;p&gt;第二个坑是扩展名。对话框底部有个"保存类型"下拉框，默认是"文本文档 (*.txt)"。如果你不碰它，直接在上面的"文件名"里输入 20260920.py 然后点保存，Windows 会悄悄地把它存成 20260920.py.txt——它把 .txt 硬塞到后面，你的文件根本不是 Python 文件，回头运行的时候会报错。&lt;/p&gt;
&lt;p&gt;正确的做法：把"保存类型"改成"所有文件 (&lt;em&gt;.&lt;/em&gt;)"，然后在"文件名"里输入今天的日期——比如今天是 2026 年 9 月 20 日，就输 20260920.py。用日期当名字，好处是以后每次一眼就能看出这段代码是哪天写的。这样存下来的才是真正的 Python 文件。&lt;/p&gt;
&lt;p&gt;顺带说一句：如果你想在资源管理器里一眼看出文件到底是 .py 还是 .txt，可以把扩展名显示打开。打开任意一个文件夹窗口，顶部"查看"标签 → "显示" → 勾选"文件扩展名"。勾上之后，那些藏起来的 .txt 尾巴就都露出来了。这步可选，但强烈建议勾上，能少踩很多坑。&lt;/p&gt;
&lt;h2&gt;第四步：找到这个文件在电脑里的"地址"&lt;/h2&gt;
&lt;p&gt;资源管理器（就是看文件夹的那个窗口）顶部有一长条"地址栏"，显示的是当前文件夹的位置，大概长这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;D:\VirtualMachine\名字
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这串东西就是这个文件夹的"路径"，你可以理解成它在电脑里的门牌号。&lt;/p&gt;
&lt;p&gt;把光标点进地址栏（或者直接按 Ctrl+L），它会变成可以编辑的文字。按 Ctrl+A 全选，Ctrl+C 复制。这串路径就进剪贴板了。&lt;/p&gt;
&lt;h2&gt;第五步：在终端里进到这个文件夹&lt;/h2&gt;
&lt;p&gt;切回第一步打开的那个终端窗口（如果关了，就再按一次 Win+X 重新开一个，这次不开管理员也行，普通终端就够用）。&lt;/p&gt;
&lt;p&gt;在光标闪烁的地方，敲 cd 加一个空格，然后把刚才复制的路径粘贴进去。粘贴在 PowerShell 里直接按 Ctrl+V 就行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cd D:\VirtualMachine\名字
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;回车。如果没报错，光标会跳到下一行，这时候你就已经"站在"你的那个文件夹里面了。&lt;/p&gt;
&lt;p&gt;如果路径里有空格（比如你给文件夹起了个带空格的名字），记得给整串路径加个引号：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cd &amp;quot;D:\VirtualMachine\我的 文件夹&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;不过绝大多数人从地址栏复制过来的路径都不用加引号，直接粘贴回车就行。&lt;/p&gt;
&lt;h2&gt;第六步：看看这个文件夹里都有啥&lt;/h2&gt;
&lt;p&gt;敲 ls，回车。&lt;/p&gt;
&lt;p&gt;这是"列出当前文件夹里的所有文件"的意思。你会看到刚才存的 20260920.py 躺在里面，可能还有别的文件。确认一下 20260920.py 在不在，在就对了。&lt;/p&gt;
&lt;h2&gt;第七步：运行它&lt;/h2&gt;
&lt;p&gt;先说个让你安心的事：咱们机房的机器已经装好了 miniconda，里面带着一个 Python 3.13，所以这一步你不用操心 Python 装没装的问题。如果你是在自己电脑上做，那先参考我之前公众号里发的安装教程，把 Python 装好再回来。&lt;/p&gt;
&lt;p&gt;敲 python 20260920.py，回车。&lt;/p&gt;
&lt;p&gt;程序就跑起来了：终端里先蹦出一句"你好，世界！"，然后问你"你叫什么名字？"，你在下面随便输个名字，回车，它就会回你一句"欢迎你，XXX"。&lt;/p&gt;
&lt;p&gt;到这儿，你就完整走了一遍"写脚本 → 保存 → 进目录 → 运行"。&lt;/p&gt;
&lt;h2&gt;几个常见问题，提前给你兜底&lt;/h2&gt;
&lt;p&gt;运行 python 的时候报"不是内部或外部命令"：机房机器不会出这个问题，Python 已经装好了。这种情况基本只会出现在你自己的电脑上——要么没装 Python，要么装了没加到 PATH 里。参考我之前公众号里那篇安装教程，装的时候注意勾选"Add Python to PATH"（加到 PATH）那个勾，再重新开一次终端试试。&lt;/p&gt;
&lt;p&gt;python 不行就试 py：Windows 装 Python 时会自带一个叫 py 的启动器。python 20260920.py 不行的话，试试 py 20260920.py，大概率能跑。&lt;/p&gt;
&lt;p&gt;ls 报"不是内部或外部命令"：说明你现在开的是老式的"命令提示符"（cmd），它不认 ls，认 dir。要么换成 PowerShell 终端（Win+X 里选"终端"），要么把 ls 换成 dir，效果一样。&lt;/p&gt;
&lt;p&gt;文件变成了 20260920.py.txt：就是第三步没改"保存类型"。回去把文件重命名，或者重新保存一次，这次记得把"保存类型"选成"所有文件"。&lt;/p&gt;
&lt;h2&gt;最后&lt;/h2&gt;
&lt;p&gt;这些操作看着琐碎，其实就两个能力：会用记事本存对扩展名，会在终端里 cd 到目录再 python 运行。掌握了这两个，后面你写什么脚本都能自己跑，不用每次求人。&lt;/p&gt;
&lt;p&gt;有什么卡住的，照着报错信息去搜，搜不到就群里问我吧孩子们。&lt;/p&gt;</content><category term="Programming"/><category term="Python"/><category term="Windows"/><category term="新手"/><category term="终端"/><category term="PowerShell"/><category term="记事本"/><category term="命令行"/></entry><entry><title>建议大学生朋友们做事情要徐徐图之，不要急功近利</title><link href="https://blog.cycleuser.org/xu-xu-tu-zhi.html" rel="alternate"/><published>2026-09-20T00:00:00+08:00</published><updated>2026-09-20T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-20:/xu-xu-tu-zhi.html</id><summary type="html">&lt;h1&gt;建议大学生朋友们做事情要徐徐图之，不要急功近利&lt;/h1&gt;
&lt;p&gt;我高考语文 130 多，虽然这语文单科分数在我们班不算最高，但也还行 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;建议大学生朋友们做事情要徐徐图之，不要急功近利&lt;/h1&gt;
&lt;p&gt;我高考语文 130 多，虽然这语文单科分数在我们班不算最高，但也还行，四处拿出去吹也能对付一阵。&lt;/p&gt;
&lt;p&gt;到了大学的时候，那会儿我们都要学大学语文。当时那阙老师看上去貌不惊人，瘦瘦的，小小的，有点江湖侠客的风骨。但最开始我打心眼儿里对那老师也不是很敬佩，觉得他未必有多厉害，总想着自己已经学过的东西可能就很厉害了。&lt;/p&gt;
&lt;p&gt;这就是戚继光将军在《纪效新书》里曾经提到的「心有外物而不化，自恃旧习以为佳」的一种具体表现。&lt;/p&gt;
&lt;p&gt;后来老师给我们讲春秋，讲张巡、许远守睢阳，那才发现真是堪称大家。什么《百家讲坛》，什么《东方名家》之类的，那些讲座上的所谓名师高人，和我们阙夫子相比，也差之甚远。&lt;/p&gt;
&lt;p&gt;但是说来惭愧，他讲的其他内容，我早都忘了，现在能想起来的就是当时结尾的那段，印象最深。&lt;/p&gt;
&lt;p&gt;说的是张巡守睢阳的时候，手底下有一个将官非常英勇，叫南霁云，和当时的雷万春两个人齐名，都是非常骁勇的将领。&lt;/p&gt;
&lt;p&gt;睢阳城破的时候，南霁云面对叛军的劝降，有所沉吟，半晌未语，没有立即表明自己是愿意投降还是愿意殉国。张巡就骂他说：「南老八，你怎么还要投降，还是怎么着？」（南霁云排行在八）。南霁云说了一句：「将以有为也。」&lt;/p&gt;
&lt;p&gt;这意思大概是说，他本来想着如果投降，在叛军这儿混着，可能以后能有所作为，把叛军给消灭掉什么的。这有点像卧底的意思，让人想起来当年的姜维在钟会手下，其实也算是类似这么个意思。&lt;/p&gt;
&lt;p&gt;可惜呢，后来由于张巡这么一激，南霁云也就慨然就义。&lt;/p&gt;
&lt;p&gt;现在想想，很多事儿啊，如果保存有生力量，总能够留得一线生机。而且有的事儿是着急急不来的，一定要慢慢来，不能够急着就做到，所谓“缓缓图之”，历史已经告诉了我们很多经验和教训了。&lt;/p&gt;
&lt;p&gt;最重要的一条就是，不管是“速胜论”还是“速败论”，这都是错误的，都是一体两面。不管是极端的乐观还是极端的悲观，它都是极端，本质上都是一样的。&lt;/p&gt;
&lt;p&gt;就像是选了一个“某花牌”，或者选了一个“某果牌”来作为宗教来膜拜，这也是类似的。只是所选的东西不一样，但本质行为都是在膜拜，都是把消费类电子产品当做了一种信仰。&lt;/p&gt;
&lt;p&gt;所有的事儿都相似，不能走极端。&lt;/p&gt;
&lt;p&gt;所以遇到事呢，不求快但求慢。因为你慢慢做的事儿，你就从容，不紧张，从容不迫，就能做得更有条有理，可以把你的实力发挥到更好。&lt;/p&gt;
&lt;p&gt;这个慢不是磨洋工，不是故意拖沓，而是能够张弛有度，工作有序，成果有效。哎呀，我发现自己连着用了这么三个，看上去像是想做排比，其实就有点儿老登作风，这不太好。&lt;/p&gt;
&lt;p&gt;反正就是心态就很重要。如果心态慌了，开始觉得没有章法了，那后边的节奏可能都乱了，很多事儿原本能发挥出来的实力都未必能做到，就非常不划算了。&lt;/p&gt;
&lt;p&gt;所以，有的时候即便这道题不会做，或者这个环境没配置好，又或者一个工具软件掌握得不理想，再或者是某个科目学得不够称心如意，也都别着急。徐徐图之，要持久战，不能够走极端。&lt;/p&gt;
&lt;p&gt;而且一定要相信，心态好、心情好，天天乐呵呵，比什么都重要，才能「将以有为也。」&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Thinking"/><category term="Education"/><category term="徐徐图之"/></entry><entry><title>OpenLaoKe 彻底重构-从 7.8 万行砍到 1.8 万行，试图成为python版本的Pi</title><link href="https://blog.cycleuser.org/openlaoke-che-di-zhong-gou-cong-78-mo-xing-kan-dao-18-mo-xing-shi-tu-cheng-wei-pythonban-ben-de-pi.html" rel="alternate"/><published>2026-09-19T12:30:00+08:00</published><updated>2026-09-19T12:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-19:/openlaoke-che-di-zhong-gou-cong-78-mo-xing-kan-dao-18-mo-xing-shi-tu-cheng-wei-pythonban-ben-de-pi.html</id><summary type="html">&lt;p&gt;OpenLaoKe 之前写过一篇，那时候它是个功能堆得特别满但并不太好用的命令行 AI 助手。
最开始那会儿是参考 opencode 来做的，想的是不 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;OpenLaoKe 之前写过一篇，那时候它是个功能堆得特别满但并不太好用的命令行 AI 助手。
最开始那会儿是参考 opencode 来做的，想的是不用 npm、不用 Node，直接拿 Python 把这事儿实现出来。因为我自己平时以 Python 为主，也希望所有工具的生态都落在 PyPI 上。
OpenLaoKe 最早脱胎于 2024 年 Clap 项目的一个分支，2026 年 4 月才独立出来。当时就是按 opencode 那种思路来的：工具要多、功能要全。到后面堆了三十多个工具，还塞进了 MCP、子智能体、supervisor、计划模式、权限系统、记忆、双模型协作、一个 Web UI，外加一个 FastAPI 后端。&lt;/p&gt;
&lt;p&gt;结果就弄得特别臃肿、特别复杂，调试起来都很麻烦。&lt;strong&gt;286 个文件，77955 行&lt;/strong&gt;——自己想改都得先找半天，改完还常常不知道会不会碰到别的活儿。&lt;/p&gt;
&lt;p&gt;最近崔总建议试试 pi。试了之后发现确实非常轻巧简洁，效率更高，尤其是省 token。&lt;/p&gt;
&lt;p&gt;我在写 pi 那篇里量过：同样一个任务，opencode 那边每一轮比 pi 多背 5800 多个 token，4 轮下来就多两万多。而且这个差距跟用什么模型没关系——换 &lt;code&gt;deepseek-reasoner&lt;/code&gt; 再跑一遍，差的还是那个数。&lt;strong&gt;差距是智能体工具带来的常数。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;按原来的设计，用 OpenLaoKe 跟模型说话的时候，每一轮请求都要重新发一遍系统提示词、工具定义、技能的元信息。这部分东西跟你的任务没关系，但每一次都要花钱、花时间。功能越全，这份“固定开销”就越厚。&lt;/p&gt;
&lt;p&gt;用了 pi 几天之后，我就决定把 OpenLaoKe 整个推倒重写，改成按 pi 的设计来。背后的逻辑很简单：&lt;strong&gt;把每一轮都要重复付的那份成本压下去&lt;/strong&gt;。这不是微优化，是设计上的重构。&lt;/p&gt;
&lt;p&gt;这个的代码也依然是开源的，GPLv3 协议，地址在 &lt;a href="https://github.com/cycleuser/OpenLaoKe"&gt;https://github.com/cycleuser/OpenLaoKe&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;安装方法如下所示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;openlaoke
openlaoke
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;需要 Python 3.12+。&lt;/p&gt;
&lt;p&gt;运行效果如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt="检查系统信息" src="images/openlaoke_showos.png"&gt;&lt;/p&gt;
&lt;p&gt;能够来写 markdown 文档：&lt;/p&gt;
&lt;p&gt;&lt;img alt="写 markdown 文档" src="images/openlaoke_markdown.png"&gt;&lt;/p&gt;
&lt;p&gt;也能完成文档翻译的任务：&lt;/p&gt;
&lt;p&gt;&lt;img alt="文档翻译" src="images/openlaoke_translate.png"&gt;&lt;/p&gt;
&lt;p&gt;但如果要做复杂的任务，本地的 2b 小模型就不够用了，建议用更强模型。&lt;/p&gt;
&lt;h2&gt;改成什么样&lt;/h2&gt;
&lt;p&gt;全面修改完之后，行数从 7.8 万掉到 1.8 万。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th style="text-align: right;"&gt;改造前&lt;/th&gt;
&lt;th style="text-align: right;"&gt;现在（0.1.44）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python 文件&lt;/td&gt;
&lt;td style="text-align: right;"&gt;286&lt;/td&gt;
&lt;td style="text-align: right;"&gt;68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;行数&lt;/td&gt;
&lt;td style="text-align: right;"&gt;77955&lt;/td&gt;
&lt;td style="text-align: right;"&gt;18253&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;运行时依赖&lt;/td&gt;
&lt;td style="text-align: right;"&gt;一堆&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工具&lt;/td&gt;
&lt;td style="text-align: right;"&gt;30+&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8（Windows 上 9）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;提供商&lt;/td&gt;
&lt;td style="text-align: right;"&gt;一堆&lt;/td&gt;
&lt;td style="text-align: right;"&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;砍掉的东西：MCP、子智能体、supervisor、计划模式、权限弹窗、记忆层、insomnia、双模型、自适应路由、防检测层、Web UI、FastAPI 服务、cron、消息总线，还有那个 C 语言翻译版。依赖里也顺手扔了 &lt;code&gt;fastapi&lt;/code&gt;、&lt;code&gt;uvicorn&lt;/code&gt;、&lt;code&gt;websockets&lt;/code&gt;、&lt;code&gt;jieba&lt;/code&gt;、&lt;code&gt;watchfiles&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;留下的：8 个工具、pi 那 23 个内置命令、树状会话（能 fork / clone / rewind）、prompt 模板、按需加载的技能。还有原来那个内置的 GGUF 推理运行时也删了——本地模型现在统一走 OpenAI 兼容端点，Ollama、LM Studio、vLLM 都行，反而更简单。&lt;/p&gt;
&lt;h2&gt;对比测试：和 pi 到底差多少&lt;/h2&gt;
&lt;p&gt;说了这么多改动，总得有点数字。下面这些测试是为这次重构做的，跑的时候是 &lt;strong&gt;OpenLaoKe 0.1.40&lt;/strong&gt;（那会儿还有几个问题没修完）、&lt;strong&gt;pi 0.85.1&lt;/strong&gt;，都在同一台机器上。小模型的数字噪声很大，请当方向性参考，不要当权威结论。&lt;/p&gt;
&lt;h3&gt;测试环境&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;机器&lt;/td&gt;
&lt;td&gt;Apple M4（10 核 CPU），16 GB 内存，macOS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;3.12（conda 环境 &lt;code&gt;dev&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenLaoKe&lt;/td&gt;
&lt;td&gt;0.1.40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pi&lt;/td&gt;
&lt;td&gt;0.85.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;0.34.2，&lt;code&gt;http://127.0.0.1:11434&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地端点&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http://127.0.0.1:11434/v1&lt;/code&gt;（OpenAI 兼容）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这个版本号得说清楚：&lt;strong&gt;测试是真的在 0.1.40 上跑的&lt;/strong&gt;，表里所有数字都出自那个版本。后面那些修补是在 0.1.40 到 0.1.44 之间做的，所以现在再去跑，结果大概会比表里好看一些。本文写完时最新版是 &lt;strong&gt;0.1.44&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;参测的对话模型（都来自本机 Ollama，参数与量化取自 &lt;code&gt;ollama show&lt;/code&gt; 原样输出）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th style="text-align: right;"&gt;参数&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;能力&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen3.5:2b&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2.3B&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;completion, vision, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen3.5:0.8b&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;873.44M&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;completion, vision, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2.7B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;completion, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LiquidAI/lfm2.5-350m&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;354.48M&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;completion, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lfm2.5-thinking&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;1.2B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;completion, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;granite4:350m-h&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;340.33M&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;completion, tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;日常真正好用的就是两个 ≥2B 的（&lt;code&gt;qwen3.5:2b&lt;/code&gt;、&lt;code&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/code&gt;），更小的几个我都删了，表里留的是当时的数据。&lt;/p&gt;
&lt;h3&gt;一、提供商格式兼容性&lt;/h3&gt;
&lt;p&gt;这一部分验证的是承载大多数提供商的那两种线协议：Anthropic Messages 和 OpenAI Chat Completions，都做了端到端测试。OpenLaoKe 还原生支持 Google &lt;code&gt;generateContent&lt;/code&gt;、AWS Bedrock 和 Cohere，那三种不在这一部分的范围内。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;测试&lt;/th&gt;
&lt;th&gt;端点&lt;/th&gt;
&lt;th&gt;结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI 格式，非流式&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST https://api.deepseek.com/v1/chat/completions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ 返回 &lt;code&gt;PONG&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI 格式，流式&lt;/td&gt;
&lt;td&gt;同上&lt;/td&gt;
&lt;td&gt;✅ 流式返回 &lt;code&gt;PONG&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic 格式，真实端点&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST https://api.anthropic.com/v1/messages&lt;/code&gt;（无效 key）&lt;/td&gt;
&lt;td&gt;✅ 请求正确；标准 401 &lt;code&gt;authentication_error&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic 格式，完整请求/响应&lt;/td&gt;
&lt;td&gt;本地 mock&lt;/td&gt;
&lt;td&gt;✅ PASS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地 OpenAI 兼容&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST http://127.0.0.1:11434/v1/chat/completions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;✅ 返回 &lt;code&gt;PONG&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Anthropic 那一项用的是本地 mock，校验的是精确契约，而不只是连通性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;路径必须是 &lt;code&gt;/v1/messages&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;请求头 &lt;code&gt;anthropic-version: 2023-06-01&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;请求头 &lt;code&gt;x-api-key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;请求体字段 &lt;code&gt;model&lt;/code&gt;、&lt;code&gt;messages&lt;/code&gt;、&lt;code&gt;max_tokens&lt;/code&gt;、&lt;code&gt;temperature&lt;/code&gt;、&lt;code&gt;system&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;响应解析：&lt;code&gt;content[0].text == "PONG"&lt;/code&gt;，用量 &lt;code&gt;input=11, output=2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本地端点不再要求 API key：当 base URL 是本地地址（&lt;code&gt;localhost&lt;/code&gt;、&lt;code&gt;127.0.0.1&lt;/code&gt;、&lt;code&gt;0.0.0.0&lt;/code&gt;、&lt;code&gt;::1&lt;/code&gt;、&lt;code&gt;host.docker.internal&lt;/code&gt;）且没配 key 时，OpenLaoKe 会发一个占位的 bearer token。&lt;/p&gt;
&lt;h3&gt;二、本地模型能力&lt;/h3&gt;
&lt;p&gt;每个模型先用一句简单提示走 OpenLaoKe 的 OpenAI 兼容客户端，再走完整的 agent 循环做一个文件任务（“创建 &lt;code&gt;out.txt&lt;/code&gt; 内容为 &lt;code&gt;hello pi&lt;/code&gt;，然后运行 &lt;code&gt;cat out.txt&lt;/code&gt;”）。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th style="text-align: center;"&gt;非流式&lt;/th&gt;
&lt;th style="text-align: center;"&gt;流式&lt;/th&gt;
&lt;th style="text-align: center;"&gt;工具调用&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen3.5:2b&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td&gt;综合最好&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen3.5:0.8b&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td&gt;写成 &lt;code&gt;hello pi.&lt;/code&gt;（多一个句号）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td&gt;写成 &lt;code&gt;hello pi.&lt;/code&gt;（多一个句号）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LiquidAI/lfm2.5-350m&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td&gt;文件内容正确&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lfm2.5-thinking&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td&gt;只思考不行动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;granite4:350m-h&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td&gt;工具调用幻觉报错&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;纯 embedding 模型（&lt;code&gt;nomic-embed-text&lt;/code&gt;、&lt;code&gt;snowflake-arctic-embed&lt;/code&gt;、两个 &lt;code&gt;all-minilm&lt;/code&gt;、&lt;code&gt;granite-embedding&lt;/code&gt;）在 &lt;code&gt;/chat/completions&lt;/code&gt; 上被正确拒绝（HTTP 400）——它们本来就不是对话模型，所以不列进来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这一部分还顺手抓到一个 bug。&lt;/strong&gt; Ollama 的 OpenAI 兼容流把思考放在 &lt;code&gt;delta.reasoning&lt;/code&gt;，而 DeepSeek 用的是 &lt;code&gt;delta.reasoning_content&lt;/code&gt;。OpenLaoKe 原本只读后者，导致思考型模型流式输出全空。现在两个字段都读了。&lt;/p&gt;
&lt;h3&gt;三、多语言一致性&lt;/h3&gt;
&lt;p&gt;让两个智能体工具各用 10 种语言回一句“介绍一下你自己”，再对回复做语言分类：按字符脚本判定（Hangul → 韩语，假名 → 日语，CJK → 中文，西里尔 → 俄语），拉丁字母则按停用词特征判断。&lt;strong&gt;✅ 表示检测到的语言和请求一致，❌ 表示对不上。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先看 OpenLaoKe 这边：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;qwen3.5:2b&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;qwen3.5:0.8b&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;lfm2.5-2.6b&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;lfm2.5-350m&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;lfm2.5-thinking&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;granite4:350m-h&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;英&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;法&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;俄&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;德&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;西&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;葡&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;意&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;韩&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;得分&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;10/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;8/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;9/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;8/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;5/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;2/10&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;再看 pi：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;qwen3.5:2b&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;qwen3.5:0.8b&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;lfm2.5-2.6b&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;lfm2.5-350m&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;lfm2.5-thinking&lt;/code&gt;&lt;/th&gt;
&lt;th style="text-align: center;"&gt;&lt;code&gt;granite4:350m-h&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;英&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;法&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;俄&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;德&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;西&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;葡&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;意&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;韩&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;得分&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;9/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;9/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;8/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;9/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;3/10&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: center;"&gt;&lt;strong&gt;3/10&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;那些 ❌ 大致分三种：回了别的语言（比如要求日语却答成中文，或者用英文作答）、干脆空回复、分类器判不出来。&lt;/p&gt;
&lt;p&gt;合计：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;智能体工具&lt;/th&gt;
&lt;th style="text-align: right;"&gt;通过&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenLaoKe&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;strong&gt;42/60&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pi&lt;/td&gt;
&lt;td style="text-align: right;"&gt;41/60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;按语言拆开（两个智能体工具合并，满分 12）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th style="text-align: right;"&gt;通过&lt;/th&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th style="text-align: right;"&gt;通过&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;英&lt;/td&gt;
&lt;td style="text-align: right;"&gt;12/12&lt;/td&gt;
&lt;td&gt;葡&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;法&lt;/td&gt;
&lt;td style="text-align: right;"&gt;10/12&lt;/td&gt;
&lt;td&gt;韩&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;西&lt;/td&gt;
&lt;td style="text-align: right;"&gt;10/12&lt;/td&gt;
&lt;td&gt;德&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8/12&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6/12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;俄&lt;/td&gt;
&lt;td style="text-align: right;"&gt;8/12&lt;/td&gt;
&lt;td&gt;意&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6/12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;四、具体任务&lt;/h3&gt;
&lt;p&gt;在两个 ≥2B 的模型上，用两个智能体工具、中英双语跑 5 个具体任务：8 种（智能体工具、模型、语言）组合 × 5 任务 = 40 次。每次运行单独一个目录，输出在 &lt;code&gt;run.log&lt;/code&gt;，生成的文件保留原处供人工检查。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;任务&lt;/th&gt;
&lt;th&gt;指令（中文）&lt;/th&gt;
&lt;th&gt;通过条件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1 精确写文件&lt;/td&gt;
&lt;td&gt;在当前目录创建 &lt;code&gt;hello.txt&lt;/code&gt;，内容正好是 &lt;code&gt;hello small model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文件含该文本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T2 读并求和&lt;/td&gt;
&lt;td&gt;读 &lt;code&gt;data.txt&lt;/code&gt;（每行一个整数），求和&lt;/td&gt;
&lt;td&gt;答案含 &lt;code&gt;224&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T3 写+运行&lt;/td&gt;
&lt;td&gt;写 &lt;code&gt;fib.py&lt;/code&gt; 打印前 10 个斐波那契数，并运行&lt;/td&gt;
&lt;td&gt;脚本可运行并输出 &lt;code&gt;0 1 1 2 3 5 8 13 21 34&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T4 生成产物&lt;/td&gt;
&lt;td&gt;写 &lt;code&gt;report.md&lt;/code&gt;，含标题和三条要点&lt;/td&gt;
&lt;td&gt;有 &lt;code&gt;#&lt;/code&gt; 标题且 ≥3 条要点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T5 修 bug&lt;/td&gt;
&lt;td&gt;修复 &lt;code&gt;buggy.py&lt;/code&gt; 中 &lt;code&gt;average()&lt;/code&gt; 的偏差，并运行&lt;/td&gt;
&lt;td&gt;去掉 &lt;code&gt;+ 1&lt;/code&gt;，输出 &lt;code&gt;4.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;结果（✅ = 通过，❌ = 失败）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;智能体工具&lt;/th&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th style="text-align: center;"&gt;T1&lt;/th&gt;
&lt;th style="text-align: center;"&gt;T2&lt;/th&gt;
&lt;th style="text-align: center;"&gt;T3&lt;/th&gt;
&lt;th style="text-align: center;"&gt;T4&lt;/th&gt;
&lt;th style="text-align: center;"&gt;T5&lt;/th&gt;
&lt;th style="text-align: right;"&gt;得分&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;openlaoke&lt;/td&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openlaoke&lt;/td&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;英&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openlaoke&lt;/td&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;openlaoke&lt;/td&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td&gt;英&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pi&lt;/td&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pi&lt;/td&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;英&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pi&lt;/td&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4/5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pi&lt;/td&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td&gt;英&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;❌&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: center;"&gt;✅&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4/5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;按任务、按模型、按智能体工具、按语言四个角度看：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;按任务&lt;/th&gt;
&lt;th style="text-align: right;"&gt;通过&lt;/th&gt;
&lt;th&gt;按模型&lt;/th&gt;
&lt;th style="text-align: right;"&gt;通过&lt;/th&gt;
&lt;th&gt;按智能体工具&lt;/th&gt;
&lt;th style="text-align: right;"&gt;通过&lt;/th&gt;
&lt;th&gt;按语言&lt;/th&gt;
&lt;th style="text-align: right;"&gt;通过&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1 精确写文件&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7/8&lt;/td&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td style="text-align: right;"&gt;15/20&lt;/td&gt;
&lt;td&gt;openlaoke&lt;/td&gt;
&lt;td style="text-align: right;"&gt;14/20&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: right;"&gt;16/20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T2 读并求和&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6/8&lt;/td&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td style="text-align: right;"&gt;15/20&lt;/td&gt;
&lt;td&gt;pi&lt;/td&gt;
&lt;td style="text-align: right;"&gt;16/20&lt;/td&gt;
&lt;td&gt;英&lt;/td&gt;
&lt;td style="text-align: right;"&gt;14/20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T3 写+运行&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3/8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T4 生成产物&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7/8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T5 修 bug&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7/8&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;失败到底错在哪，值得单独说，因为全在模型那边，跟智能体工具没关系：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;把 &lt;code&gt;\n&lt;/code&gt; 写成字面量。&lt;/strong&gt; 模型在工具参数里放了两个字符 &lt;code&gt;\&lt;/code&gt; 和 &lt;code&gt;n&lt;/code&gt;，而不是真的换行。LiquidAI-dev 多次如此——&lt;code&gt;fib.py&lt;/code&gt; 变成单行 &lt;code&gt;print("Fibonacci test")\n&lt;/code&gt;，报 &lt;code&gt;SyntaxError: unexpected character after line continuation character&lt;/code&gt;。智能体工具只是把模型要求的内容原样写进去。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定义了却不调用。&lt;/strong&gt; &lt;code&gt;openlaoke + qwen3.5:2b + 英 + T3&lt;/code&gt; 生成了 &lt;code&gt;fib(n)&lt;/code&gt; 函数却没调用，跑起来没输出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复述指令。&lt;/strong&gt; &lt;code&gt;pi + qwen3.5:2b + 中 + T2&lt;/code&gt; 答的是提示词原文，而不是算出来的和。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;另外还有一次 600 秒超时（&lt;code&gt;pi + LiquidAI-dev + 中 + T3&lt;/code&gt;）和一次 Python 报错（&lt;code&gt;openlaoke + LiquidAI-dev + 中 + T3&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;按任务看，最惨的是“写脚本并运行”，只有 3/8。这里既要模型产出合法代码、又要它真的去执行，是小模型翻车的重灾区。相对可靠的是精确写文件（7/8）和读文件汇报。&lt;/p&gt;
&lt;h3&gt;五、本地推理速度&lt;/h3&gt;
&lt;p&gt;这一部分通过 Ollama 原生 API 测量，它给出纳秒级的 &lt;code&gt;prompt_eval_duration&lt;/code&gt; 和 &lt;code&gt;eval_duration&lt;/code&gt;。&lt;code&gt;prefill&lt;/code&gt; = 提示 token 数 / 预填充耗时，&lt;code&gt;decode&lt;/code&gt; = 生成 token 数 / 解码耗时。3 次取中位数，输出上限 128 token。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;提示规模&lt;/th&gt;
&lt;th style="text-align: right;"&gt;提示 token&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Prefill (t/s)&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Decode (t/s)&lt;/th&gt;
&lt;th style="text-align: right;"&gt;首包 (s)&lt;/th&gt;
&lt;th style="text-align: right;"&gt;总时长 (s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;短&lt;/td&gt;
&lt;td style="text-align: right;"&gt;15&lt;/td&gt;
&lt;td style="text-align: right;"&gt;142&lt;/td&gt;
&lt;td style="text-align: right;"&gt;17.2&lt;/td&gt;
&lt;td style="text-align: right;"&gt;0.11&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: right;"&gt;560&lt;/td&gt;
&lt;td style="text-align: right;"&gt;5608&lt;/td&gt;
&lt;td style="text-align: right;"&gt;17.5&lt;/td&gt;
&lt;td style="text-align: right;"&gt;—&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7.41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;长&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2210&lt;/td&gt;
&lt;td style="text-align: right;"&gt;25188&lt;/td&gt;
&lt;td style="text-align: right;"&gt;17.1&lt;/td&gt;
&lt;td style="text-align: right;"&gt;—&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7.62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td&gt;短&lt;/td&gt;
&lt;td style="text-align: right;"&gt;17&lt;/td&gt;
&lt;td style="text-align: right;"&gt;109&lt;/td&gt;
&lt;td style="text-align: right;"&gt;19.1&lt;/td&gt;
&lt;td style="text-align: right;"&gt;0.32&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6.88&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td&gt;中&lt;/td&gt;
&lt;td style="text-align: right;"&gt;560&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3438&lt;/td&gt;
&lt;td style="text-align: right;"&gt;18.8&lt;/td&gt;
&lt;td style="text-align: right;"&gt;—&lt;/td&gt;
&lt;td style="text-align: right;"&gt;6.99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td&gt;长&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2210&lt;/td&gt;
&lt;td style="text-align: right;"&gt;12675&lt;/td&gt;
&lt;td style="text-align: right;"&gt;18.8&lt;/td&gt;
&lt;td style="text-align: right;"&gt;—&lt;/td&gt;
&lt;td style="text-align: right;"&gt;7.03&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;“首包”指任何类型的第一个流式分片耗时，两个模型都在 0.35 秒内。对&lt;strong&gt;思考型&lt;/strong&gt;模型来说，更该看的是&lt;strong&gt;首个可见答案&lt;/strong&gt; token 的时间：&lt;code&gt;qwen3.5:2b&lt;/code&gt; 把推理放进 &lt;code&gt;thinking&lt;/code&gt; 字段，思考结束前 &lt;code&gt;response&lt;/code&gt; 一直是空的，所以答案大约在上表那个预算结束时才出现（128 token 上限时约 7.5 秒）；&lt;code&gt;LiquidAI-dev&lt;/code&gt; 则把 &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; 标记直接写进 &lt;code&gt;response&lt;/code&gt; 流，文字立刻出现，代价是输出里带着思考标记。&lt;/p&gt;
&lt;p&gt;几点小结：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Decode 差不多&lt;/strong&gt;：约 17 t/s（qwen）对约 19 t/s（LiquidAI）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长上下文下 prefill，qwen 更快&lt;/strong&gt;：2210 token 时约 25k 对约 13k t/s。短提示的 prefill 数字被固定开销主导，只有中/长才有意义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;响应感上，短提示时 LiquidAI 更好&lt;/strong&gt;（没有思考延迟），代价是输出里带思考标记。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;这些数字说明什么&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;瓶颈不在智能体工具。&lt;/strong&gt; OpenLaoKe（42/60）和 pi（41/60）基本打平，差异在模型噪声范围内。同一个模型在两个智能体工具里表现几乎一致。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型选择才是决定性的。&lt;/strong&gt; &lt;code&gt;qwen3.5:2b&lt;/code&gt; 在两个智能体工具拿到 10/10 和 9/10；&lt;code&gt;granite4:350m-h&lt;/code&gt; 和 &lt;code&gt;lfm2.5-thinking&lt;/code&gt; 都只有 2–5/10。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能体工具影响的是“身份”，不是语言。&lt;/strong&gt; 同一个模型在 OpenLaoKe 里答“我是 OpenLaoKe……”，在 pi 里答“我是 Pi Coding Agent……”，说明系统提示词确实生效，但没有改变它回什么语言。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过小的模型不适合 agent 场景。&lt;/strong&gt; &lt;code&gt;granite4:350m-h&lt;/code&gt; 在 OpenLaoKe 里产生工具幻觉、乱建文件；管道是对的，是模型不行。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;也得把局限说清楚：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;语言分类器是启发式的。有些 ❌ 其实是混语言回复或者分类边界，不一定是硬失败。&lt;/li&gt;
&lt;li&gt;每格只跑了 1 次。小模型本身随机性大，重跑会移动个别格子。&lt;/li&gt;
&lt;li&gt;两处异常：&lt;code&gt;pi + qwen3.5:0.8b + 中文&lt;/code&gt; 超时 420 秒（空回复）；&lt;code&gt;openlaoke + granite4:350m-h + 中文&lt;/code&gt; 空回复。&lt;/li&gt;
&lt;li&gt;对所有模型，英文都是最强的，中文和意大利语最弱。这是模型属性，跟两个智能体工具无关。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;额外的一些废话&lt;/h2&gt;
&lt;p&gt;这轮折腾下来，我最大的感受是&lt;strong&gt;智能体工具的“聪明”要用对地方&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;重构本身其实不算难，难的是改完之后跟本地小模型磨合的那几天，一路上碰到一堆乱七八糟的麻烦：有的命令明明只是看看系统信息，却被当成危险命令拦下来；工具列表不看平台就一股脑全给模型，结果在 macOS 上塞了个 PowerShell 进去；模型名里带个斜杠也能被解析吃掉；小模型明明乖乖回了工具调用，反倒被判成“没有输出”。还有几处是我自己给自己挖的坑，比如上下文预算从官方目录里取了个理论值，对着本地服务根本对不上；又比如默认放开让思考型模型去想，结果一轮就卡在那儿不动。&lt;/p&gt;
&lt;p&gt;这些毛病有个共同点：&lt;strong&gt;在云端和“乖”的模型上不显山不露水，一旦换成小模型、换成本地，全都会变成绊脚石。&lt;/strong&gt; 而其中一部分，纯粹是我自作聪明的结果——以为从官网目录读窗口比硬编码强，却没分清“模型能支持多大”和“服务器实际给多大”根本不是一回事。&lt;strong&gt;改进之前，得先弄清楚你改的是不是同一个东西。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;至于和 pi 的差距，我觉得很正常。pi 是 Mario 写了很久的原版，我这是照着重写一遍。多语言打平、具体任务差 2 分，这个成绩我觉得可以接受，剩下的差距主要在细节打磨上。&lt;/p&gt;
&lt;p&gt;说句实在的，本地小模型这条路，&lt;strong&gt;智能体工具能帮你的有限&lt;/strong&gt;。工具调用链路我可以修得干干净净，但“读一周的代码然后总结”这种活，2B 模型是真干不了；翻译一整篇文章，它会直接照抄原文。想让本地模型干正事，起码上到能用的量级——我这里就是 &lt;code&gt;qwen3.5:2b&lt;/code&gt; 和 &lt;code&gt;lfm2.5-2.6b&lt;/code&gt; 这两个，更小的我试过，有时候可能会连工具调用都带不动。&lt;/p&gt;</content><category term="Tool"/><category term="OpenLaoKe"/><category term="pi"/><category term="本地模型"/><category term="小模型"/><category term="工具调用"/><category term="Ollama"/><category term="上下文管理"/><category term="智能体"/></entry><entry><title>不用显卡就能运行的本地小模型能做啥-用 pi 实测两个 2B 模型的工具调用与真实任务</title><link href="https://blog.cycleuser.org/bu-yong-xian-qia-jiu-neng-yun-xing-de-ben-di-xiao-mo-xing-neng-zuo-sha-yong-pi-shi-ce-liang-ge-2b-mo-xing-de-gong-ju-diao-yong-yu-zhen-shi-ren-wu.html" rel="alternate"/><published>2026-09-19T07:30:00+08:00</published><updated>2026-09-19T07:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-19:/bu-yong-xian-qia-jiu-neng-yun-xing-de-ben-di-xiao-mo-xing-neng-zuo-sha-yong-pi-shi-ce-liang-ge-2b-mo-xing-de-gong-ju-diao-yong-yu-zhen-shi-ren-wu.html</id><summary type="html">&lt;p&gt;我手里这台机器是 Apple M4，10 核 CPU，16 GB 内存。这种配置想跑本地大模型，要想不影响其他工具的日常运行，就不能全都跑慢，粗 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我手里这台机器是 Apple M4，10 核 CPU，16 GB 内存。这种配置想跑本地大模型，要想不影响其他工具的日常运行，就不能全都跑慢，粗略估计适合在 0.5B 到 3B 这个区间里挑。我之前也一直用小模型，不过大多是在聊聊天、写写摘要。真正让一些同学好奇的是另一件事：这种小模型，能不能当 coding agent 用，也就是会不会调用工具、能不能完成一个具体的小任务。&lt;/p&gt;
&lt;p&gt;所以这回咱们来实测一轮。这篇文章里的数字都是我自己在这台机器上跑出来的，不是抄的榜单。&lt;/p&gt;
&lt;h2&gt;先说清楚被测的两个模型&lt;/h2&gt;
&lt;p&gt;本机 Ollama（0.34.2）里我留了两个 2B 级别、且支持工具调用的模型：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th style="text-align: right;"&gt;参数&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;能力&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen3.5:2b&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2.3B&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;completion, vision, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LiquidAI-dev/lfm2.5-2.6b:latest&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;2.7B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;completion, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;（参数和量化都是从 &lt;code&gt;ollama show&lt;/code&gt; 原样抄的，不是我估的。）&lt;/p&gt;
&lt;p&gt;之前我还试过更小的几个：350M 的、0.8B 的，结论很直接——太小的一是根本带不动工具调用，二是太小了容易幻觉起飞甚至随时乱编。所以最后就留了这两个 2B 以上的。&lt;/p&gt;
&lt;h2&gt;用 pi 来测&lt;/h2&gt;
&lt;p&gt;工具调用这种能力，光让模型"聊天"是测不出来的。必须有一个外壳把工具定义发给它、解析它的工具调用、真正去执行，才算数。我用的是 &lt;a href="https://github.com/earendil-works/pi"&gt;pi&lt;/a&gt;（Mario Zechner 写的极简终端 agent）。&lt;/p&gt;
&lt;p&gt;pi 的接法很简单：在 &lt;code&gt;~/.pi/agent/models.json&lt;/code&gt; 里声明一个 OpenAI 兼容的提供方指向本机 Ollama，然后：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pi&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;--provider&lt;span class="w"&gt; &lt;/span&gt;ollama-local&lt;span class="w"&gt; &lt;/span&gt;--model&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;模型&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你的指令&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;为了测的干净，我把技能、扩展、上下文文件全关掉，只留最核心的 agent 循环和工具（&lt;code&gt;read&lt;/code&gt;、&lt;code&gt;write&lt;/code&gt;、&lt;code&gt;edit&lt;/code&gt;、&lt;code&gt;bash&lt;/code&gt; 等）。这样测出来的就是模型本身，而不是各种插件带来的加成。&lt;/p&gt;
&lt;h2&gt;关于 SOTA 榜单：小模型在这个维度确实吃亏&lt;/h2&gt;
&lt;p&gt;开始之前先说个背景。公开评测里，衡量"会不会用工具、听不听话"这类能力的标准集主要有这几套：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Berkeley Function Calling Leaderboard (BFCL)&lt;/strong&gt;：伯克利做的函数/工具调用榜，是目前最直接衡量工具调用能力的评测（&lt;a href="https://gorilla.cs.berkeley.edu/leaderboard.html"&gt;gorilla.cs.berkeley.edu/leaderboard.html&lt;/a&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IFEval&lt;/strong&gt;：指令遵循评测（Zhou et al., 2023, &lt;a href="https://arxiv.org/abs/2311.07911"&gt;arXiv:2311.07911&lt;/a&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;τ-bench&lt;/strong&gt;：真实业务场景下的工具-agent 评测（Yao et al., 2024, &lt;a href="https://arxiv.org/abs/2406.12045"&gt;arXiv:2406.12045&lt;/a&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MMLU / GSM8K / HumanEval&lt;/strong&gt;：分别是综合知识（&lt;a href="https://arxiv.org/abs/2009.03300"&gt;arXiv:2009.03300&lt;/a&gt;）、数学推理（&lt;a href="https://arxiv.org/abs/2110.14168"&gt;arXiv:2110.14168&lt;/a&gt;）、代码生成（&lt;a href="https://arxiv.org/abs/2107.03374"&gt;arXiv:2107.03374&lt;/a&gt;）的经典基准。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些榜单上排前面的基本都是几十 B 甚至上百 B 的模型。2B 级别在这些维度上普遍靠后，尤其是需要多步规划、格式严格的任务。所以下面的实测结果，你可以当作"低配机器上小模型的真实上限"来看。&lt;/p&gt;
&lt;h2&gt;本次具体测了什么&lt;/h2&gt;
&lt;p&gt;我给两个模型、中英双语，各安排了 5 个任务，一共 20 次运行。每跑一次，模型生成的原始文件我都留在单独目录里，方便事后人工翻看。&lt;/p&gt;
&lt;p&gt;这 5 个任务是这样：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;任务&lt;/th&gt;
&lt;th&gt;指令&lt;/th&gt;
&lt;th&gt;判定标准&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1 精确写文件&lt;/td&gt;
&lt;td&gt;创建 &lt;code&gt;hello.txt&lt;/code&gt;，内容正好是 &lt;code&gt;hello small model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文件里有这句话&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T2 读并求和&lt;/td&gt;
&lt;td&gt;读 &lt;code&gt;data.txt&lt;/code&gt;（每行一个整数），求和&lt;/td&gt;
&lt;td&gt;答案出现 224&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T3 写+运行&lt;/td&gt;
&lt;td&gt;写 &lt;code&gt;fib.py&lt;/code&gt; 打印前 10 个斐波那契数，并运行&lt;/td&gt;
&lt;td&gt;脚本能跑，输出 &lt;code&gt;0 1 1 2 3 5 8 13 21 34&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T4 生成产物&lt;/td&gt;
&lt;td&gt;写 &lt;code&gt;report.md&lt;/code&gt;，标题加三条要点&lt;/td&gt;
&lt;td&gt;有标题且至少三条要点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T5 修 bug&lt;/td&gt;
&lt;td&gt;修掉 &lt;code&gt;buggy.py&lt;/code&gt; 里平均值多加了 1 的 bug，并运行&lt;/td&gt;
&lt;td&gt;去掉 &lt;code&gt;+ 1&lt;/code&gt; 且输出 4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;结果&lt;/h2&gt;
&lt;p&gt;先看任务维度：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;任务&lt;/th&gt;
&lt;th style="text-align: right;"&gt;通过&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;T1 精确写文件&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T2 读并求和&lt;/td&gt;
&lt;td style="text-align: right;"&gt;3/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T3 写+运行&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;strong&gt;2/4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T4 生成产物&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;T5 修 bug&lt;/td&gt;
&lt;td style="text-align: right;"&gt;4/4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;再看模型和语言：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qwen3.5:2b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;中文&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;英文&lt;/td&gt;
&lt;td&gt;8/10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两个模型完全打平，中英文也没有差别。总共 20 次里过了 16 次。样本不大，但方向很清楚：&lt;strong&gt;单步任务基本能过，T3 这种"写代码再运行"的是重灾区。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;真正有意思的是它们错在哪&lt;/h2&gt;
&lt;p&gt;跑完看生成的原始文件，失败方式非常集中，而且很"小模型"：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一、把换行写成了字面量 &lt;code&gt;\n&lt;/code&gt;。&lt;/strong&gt; 这是最典型的。模型在工具参数里放的不是真换行，而是反斜杠加字母 n 两个字符。LiquidAI 尤其容易这样，它写的 &lt;code&gt;fib.py&lt;/code&gt; 整份文件就一行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;print(&amp;quot;Fibonacci test&amp;quot;)\n
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;拿去运行直接报 &lt;code&gt;SyntaxError: unexpected character after line continuation character&lt;/code&gt;。注意这不是 pi 的错——外壳只是把模型要求的内容原样写进文件。是模型自己没分清"内容里的换行"和"转义后的文本"。四次 T3 里，LiquidAI 的两次全栽在这上面。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二、没读文件，凭自己编数据。&lt;/strong&gt; 有一次让它读 &lt;code&gt;data.txt&lt;/code&gt; 再求和，结果它没去读，直接给了个"100 + 200 + 300 = 600"。文件里根本没有这些数，正确的是 224。这种错最危险，因为它答得很自信、格式也漂亮，你不去核对根本发现不了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;三、写错路径还谎报成功。&lt;/strong&gt; 还有一次让它把文件写到当前目录，它把文件写到了根目录的 &lt;code&gt;/hello.txt&lt;/code&gt;（只读文件系统，其实失败了），然后回复说"文件已成功创建"。&lt;strong&gt;它报告的成功是假的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;说白了：&lt;strong&gt;写文件基本没问题，读文件汇报也一般没问题，但只要进入"写完还得运行"这一步，就崩了&lt;/strong&gt;——因为它得先通过工具调用吐出一份语法完全正确的代码，再让系统执行，中间任何一个字符错位，整件事就废了。&lt;/p&gt;
&lt;h2&gt;顺带测了速度&lt;/h2&gt;
&lt;p&gt;既然是低配机器，速度也是关键。我用 Ollama 原生接口，它返回纳秒级的预填充（prefill）和解码（decode）耗时，比拿总时间除一下准得多。3 次取中位数，输出上限 128 token。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;提示规模&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Prefill (t/s)&lt;/th&gt;
&lt;th style="text-align: right;"&gt;Decode (t/s)&lt;/th&gt;
&lt;th style="text-align: right;"&gt;首包延迟&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;短 15 token&lt;/td&gt;
&lt;td style="text-align: right;"&gt;142&lt;/td&gt;
&lt;td style="text-align: right;"&gt;17.2&lt;/td&gt;
&lt;td style="text-align: right;"&gt;0.11s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;长 2210 token&lt;/td&gt;
&lt;td style="text-align: right;"&gt;&lt;strong&gt;25188&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: right;"&gt;17.1&lt;/td&gt;
&lt;td style="text-align: right;"&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td&gt;短 17 token&lt;/td&gt;
&lt;td style="text-align: right;"&gt;109&lt;/td&gt;
&lt;td style="text-align: right;"&gt;19.1&lt;/td&gt;
&lt;td style="text-align: right;"&gt;0.32s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiquidAI-dev/lfm2.5-2.6b&lt;/td&gt;
&lt;td&gt;长 2210 token&lt;/td&gt;
&lt;td style="text-align: right;"&gt;12675&lt;/td&gt;
&lt;td style="text-align: right;"&gt;18.8&lt;/td&gt;
&lt;td style="text-align: right;"&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;几个观察：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;解码速度差不多&lt;/strong&gt;，都在 17 到 19 t/s。这个速度写代码是慢的，但应付短任务够用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预填充 qwen 明显更快&lt;/strong&gt;，长上下文下差不多是 LiquidAI 的两倍（25k 对 12.7k t/s）。提示越长，这个差距越值钱。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;短提示那行的 prefill 数字别当真&lt;/strong&gt;，全被固定开销盖住了，只有中长提示才有参考意义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;首包延迟&lt;/strong&gt;两个都快（0.1 到 0.3 秒），但这里有个坑：qwen3.5:2b 是&lt;strong&gt;思考型&lt;/strong&gt;模型，它把推理先写进单独的 &lt;code&gt;thinking&lt;/code&gt; 字段，&lt;code&gt;response&lt;/code&gt; 一直空着，所以你要等到它"想完"才看到正文。实测在 128 token 上限下，第一个可见的答案 token 差不多要到 7.5 秒才出现。LiquidAI 反过来，把 &lt;code&gt;&amp;lt;think&amp;gt;&lt;/code&gt; 标记直接写进正文流里，文字立刻就有，代价是输出里混着思考标记。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以论"聊天时的即时手感"，LiquidAI 更跟手；论"长提示的处理速度"，qwen 更快。&lt;/p&gt;
&lt;h2&gt;那本地小模型到底适合干什么&lt;/h2&gt;
&lt;p&gt;测完我的结论是：&lt;strong&gt;别拿这种2B小模型当可以完全依赖的 coding agent，但把它当"本地小助手"用，还是有价值的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;适合的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;短文本的翻译、改写、摘要（其实还是以前我就常用的场景）。&lt;/li&gt;
&lt;li&gt;单步的文件操作：读一个文件、写一个文件、改一行、算个数（注意有可能会有错，要有核验环节）。&lt;/li&gt;
&lt;li&gt;结构简单的指令，比如"把这份 CSV 转成 Markdown 表格"。&lt;/li&gt;
&lt;li&gt;要绝对本地、绝对不联网的场景，哪怕结果粗糙也能接受。&lt;/li&gt;
&lt;li&gt;离线、断网、或者不想把数据发出去的时候做个兜底。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不适合的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多步任务，尤其是"写代码再运行"这种带反馈闭环的。&lt;/li&gt;
&lt;li&gt;需要严格格式的任务（JSON、复杂 Markdown），它们动不动就把换行写成 &lt;code&gt;\n&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;任何需要读取真实数据再作答的任务——它会直接编。&lt;/li&gt;
&lt;li&gt;任何你没法一眼看出对错的输出。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;真要在这台机器上稳定跑 agent，我的建议还是拉一个 4B 到 8B、且明确支持 tools 的模型。2B 这个级别，能跑通简单的单步任务，但别指望它扛复杂流程。&lt;/p&gt;
&lt;h2&gt;最后扯几句&lt;/h2&gt;
&lt;p&gt;说句实在的，小模型这几年的进步是看得见的，2B 能做到今天这样，放在两年前不敢想。但它跟"能帮你干活的 agent"之间，还差一些，这道坎不仅仅体现在参数量的绝对值上，而更多事在&lt;strong&gt;多步任务的稳定性&lt;/strong&gt;上——单步它行，一旦要连着做两三步、还要根据中间结果调整，就很容易散架。&lt;/p&gt;
&lt;p&gt;特别值得警惕的是那两类"看起来很对"的错：一种是编数据（100+200+300=600），一种是谎报成功（写到只读路径还说建好了）。这两类错不会报错、不会崩，但会实打实地误导你。所以我一直强调，用任何模型做 agent，&lt;strong&gt;最终判断权都得留在人手里&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;低配机器上跑本地小模型，是个有趣的、也能干点事的小工具，但如果需要可靠的开发伙伴，建议还是要9b起步。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;测试环境：Apple M4（10 核 CPU），16 GB 内存，macOS；Ollama 0.34.2；pi 0.85.1。所有数字均为本机实测。&lt;/em&gt;&lt;/p&gt;</content><category term="Tool"/><category term="本地模型"/><category term="小模型"/><category term="Ollama"/><category term="pi"/><category term="工具调用"/><category term="qwen"/><category term="LiquidAI"/><category term="智能体"/></entry><entry><title>pi 是个啥-能被你自己改造的终端编程助手以及它和 opencode 的区别</title><link href="https://blog.cycleuser.org/pi-shi-ge-sha-neng-bei-ni-zi-ji-gai-zao-de-zhong-duan-bian-cheng-zhu-shou-yi-ji-ta-he-opencode-de-qu-bie.html" rel="alternate"/><published>2026-09-18T21:40:00+08:00</published><updated>2026-09-18T21:40:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-18:/pi-shi-ge-sha-neng-bei-ni-zi-ji-gai-zao-de-zhong-duan-bian-cheng-zhu-shou-yi-ji-ta-he-opencode-de-qu-bie.html</id><summary type="html">&lt;p&gt;我平时用 opencode 挺多的，用得也算顺手。前一阵子崔总跟我说，建议也试试 pi 吧。我一开始还纳闷，pi 是个啥东西，没听说过。装上一 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我平时用 opencode 挺多的，用得也算顺手。前一阵子崔总跟我说，建议也试试 pi 吧。我一开始还纳闷，pi 是个啥东西，没听说过。装上一看才明白，它跟 opencode 是同一类东西，都是跑在终端里的 AI 编程助手，但这两个家伙的脾气完全不一样。&lt;/p&gt;
&lt;p&gt;这篇文章就说说 pi 是啥、怎么用，以及它和 opencode 到底差在哪。我尽量按自己用下来的实际感受写，不吹也不黑，讲错了的地方欢迎指出来。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;pi 是个啥&lt;/h2&gt;
&lt;p&gt;pi 的全名是 &lt;code&gt;@earendil-works/pi-coding-agent&lt;/code&gt;，作者是 Mario Zechner，也就是当年写 libGDX 的那个 badlogic。官网是 pi.dev，MIT 协议，用 TypeScript 写的，跑在 Node 上，要求 Node 22.19 以上。我装的时候是 0.85.1。&lt;/p&gt;
&lt;p&gt;它给自己的定位是 minimal terminal coding harness，直译就是"极简的终端编程外壳"。注意它说的是 harness，外壳，不是 framework，也不是 platform。意思很清楚：它只管最核心的那点事，剩下的都留着让你自己加。&lt;/p&gt;
&lt;p&gt;默认情况下，pi 只给模型四个工具，read、write、edit、bash，另外还有 grep、find、ls 这些查东西用的。就这些。你让它干活，它就靠这么几个工具去干。&lt;/p&gt;
&lt;p&gt;最有个性的地方，是它故意不做很多东西。官方文档里说得很直白：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;No MCP. No sub-agents. No permission popups. No plan mode. No built-in to-dos. No background bash.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;翻译过来就是：没有 MCP、没有子智能体、没有权限弹窗、没有计划模式、没有内置待办、没有后台 bash。&lt;/p&gt;
&lt;p&gt;这几样东西，在 opencode 里基本都有。pi 的态度是，你要你就自己搭，或者装别人写好的包，别指望我塞给你。&lt;/p&gt;
&lt;p&gt;我刚看到这段的时候，第一反应是，这不等于啥都没有吗。后来用了一阵子才转过弯来，它不是没有，是把这些都做成了"可选"，而不是"必须"。内核小，改起来就方便，这跟 opencode 那种"开箱即用"是两个路子。&lt;/p&gt;
&lt;h2&gt;怎么装、怎么跑起来&lt;/h2&gt;
&lt;p&gt;安装有两种方式，一种是 npm，一种是官方脚本。npm 这种：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;npm&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-g&lt;span class="w"&gt; &lt;/span&gt;--ignore-scripts&lt;span class="w"&gt; &lt;/span&gt;@earendil-works/pi-coding-agent
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;那个 &lt;code&gt;--ignore-scripts&lt;/code&gt; 是官方特意让加的，因为 pi 正常安装不需要跑依赖的安装脚本，加上这个更安稳。&lt;/p&gt;
&lt;p&gt;如果你更喜欢脚本，也可以：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://pi.dev/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;装完要配一个模型。最省事的是设个环境变量：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-ant-...
pi
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;或者不设环境变量，直接敲 &lt;code&gt;pi&lt;/code&gt; 进去，再用 &lt;code&gt;/login&lt;/code&gt; 选提供商：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;然后就能用了。在终端里敲 &lt;code&gt;pi&lt;/code&gt;，进去就是交互界面，直接跟它说话就行，跟 opencode 一样，没什么学习成本。&lt;/p&gt;
&lt;h2&gt;日常怎么用&lt;/h2&gt;
&lt;p&gt;进到界面里，编辑框有几个用法挺顺手。输入 &lt;code&gt;@&lt;/code&gt; 可以模糊搜项目里的文件，Tab 补全路径，Shift+Enter 换行。想用外部编辑器按 Ctrl+G。要贴图直接 Ctrl+V，或者把图片拖进终端。还有个我觉得挺方便的，输入 &lt;code&gt;!command&lt;/code&gt; 能把命令跑掉、把结果发给模型，&lt;code&gt;!!command&lt;/code&gt; 则是跑掉但不发给模型。&lt;/p&gt;
&lt;p&gt;输入 &lt;code&gt;/&lt;/code&gt; 会弹出命令。常用的有这些：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;干嘛的&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/login&lt;/code&gt; &lt;code&gt;/logout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;管提供商的登录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/model&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;换模型，选的时候按 Ctrl+S 存成默认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/thinking&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;换思考档位，同样能 Ctrl+S 存默认&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/settings&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;主题、消息投递、传输方式这些设置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/resume&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;从之前的会话里挑一个继续&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/new&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;开新会话&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/tree&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;跳到会话的任意一点，从那儿接着往下&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/fork&lt;/code&gt; &lt;code&gt;/clone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;从某条消息分叉、或者复制当前分支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/compact&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;手动压缩上下文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/export&lt;/code&gt; &lt;code&gt;/import&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;导出、导入会话&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/share&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;传成私有 gist，给一个能看的网页链接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/hotkeys&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;看所有快捷键&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;快捷键里，Ctrl+L 换模型，Shift+Tab 切思考档位，连按两下 Escape 打开 &lt;code&gt;/tree&lt;/code&gt;，Ctrl+O 折叠工具输出，Ctrl+T 折叠思考块，连按两下 Ctrl+C 退出。&lt;/p&gt;
&lt;p&gt;还有个小细节，pi 支持消息排队。它正在干活的时候，你按 Enter 发的是"引导消息"，等它这一轮工具调用跑完就插进去；按 Alt+Enter 发的是"后续消息"，得等它彻底干完才发。这个在多轮任务里挺有用，不用干等着。&lt;/p&gt;
&lt;h2&gt;会话能长成一棵树&lt;/h2&gt;
&lt;p&gt;这块是 pi 我觉得最好玩的地方。&lt;/p&gt;
&lt;p&gt;它的会话存成 JSONL 文件，而且里面的结构是树，每条记录有 id 和 parentId。好处是，你可以在同一个文件里原地分支，不用另开文件。&lt;/p&gt;
&lt;p&gt;比如你聊着聊着发现前面某步走歪了，按 &lt;code&gt;/tree&lt;/code&gt; 就能把整个会话树调出来，跳到那个点，从那儿重新走下去，两条分支的历史都留着。&lt;code&gt;/fork&lt;/code&gt; 是从某条消息分出一个新会话文件，&lt;code&gt;/clone&lt;/code&gt; 是把当前分支整个复制一份。&lt;/p&gt;
&lt;p&gt;命令行里也能干这些事：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pi&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# 继续最近一次会话&lt;/span&gt;
pi&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="c1"&gt;# 浏览挑一个历史会话&lt;/span&gt;
pi&lt;span class="w"&gt; &lt;/span&gt;--no-session&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# 临时模式，不保存&lt;/span&gt;
pi&lt;span class="w"&gt; &lt;/span&gt;--name&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;my task&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# 起个名字&lt;/span&gt;
pi&lt;span class="w"&gt; &lt;/span&gt;--fork&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;path&lt;span class="p"&gt;|&lt;/span&gt;id&amp;gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# 从某个会话分叉出来&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;上下文快满了怎么办？pi 有压缩，叫 compaction。手动是 &lt;code&gt;/compact&lt;/code&gt;，自动默认也开着，快满了会自己总结前面的内容。要说明的是这个压缩是有损的，前面的细节会被总结掉，但完整历史还在 JSONL 里，想翻旧账用 &lt;code&gt;/tree&lt;/code&gt; 回去看就行。&lt;/p&gt;
&lt;h2&gt;模型和提供商&lt;/h2&gt;
&lt;p&gt;pi 支持的提供商不少。订阅类的可以接 Claude Pro/Max、ChatGPT Plus/Pro 的 Codex、还有 GitHub Copilot。API key 类的就更多了，Anthropic、OpenAI、Google、DeepSeek、Mistral、Groq、xAI、OpenRouter、Kimi、MiniMax 一大堆。&lt;/p&gt;
&lt;p&gt;换模型就 &lt;code&gt;/model&lt;/code&gt;，选中了按 Ctrl+S 能存成默认。命令行里可以用 &lt;code&gt;--list-models&lt;/code&gt; 列出来，用 &lt;code&gt;--models&lt;/code&gt; 指定一批给 Ctrl+P 循环切换，像我这样经常换模型的人挺方便。&lt;/p&gt;
&lt;p&gt;它还内置了 llama.cpp 的路由服务，&lt;code&gt;/login llama.cpp&lt;/code&gt; 配上，再用 &lt;code&gt;/llama&lt;/code&gt; 下模型、加载模型，本地跑也行。&lt;/p&gt;
&lt;p&gt;有意思的是，pi 的提供商列表里居然还有 OpenCode Zen 和 OpenCode Go。也就是说，你可以用 pi 这个客户端，去连 opencode 家的模型服务。&lt;/p&gt;
&lt;p&gt;如果你要接的是那种 OpenAI、Anthropic、Google 格式的自定义服务，可以在 &lt;code&gt;~/.pi/agent/models.json&lt;/code&gt; 里加。要是碰到非标准 API 或者要 OAuth，那就得写扩展了。&lt;/p&gt;
&lt;h2&gt;四件套和包&lt;/h2&gt;
&lt;p&gt;pi 的定制，主要靠四样东西，官方叫 prompt templates、skills、extensions、themes。&lt;/p&gt;
&lt;p&gt;prompt templates 就是把常用提示词存成 Markdown，放到 &lt;code&gt;~/.pi/agent/prompts/&lt;/code&gt;，用的时候输入 &lt;code&gt;/名字&lt;/code&gt; 就展开了。&lt;/p&gt;
&lt;p&gt;skills 是技能，跟 opencode 用的是同一套 Agent Skills 标准，放在 &lt;code&gt;~/.pi/agent/skills/&lt;/code&gt; 或者 &lt;code&gt;~/.agents/skills/&lt;/code&gt;。用的话输入 &lt;code&gt;/skill:名字&lt;/code&gt;，或者让模型自己按需加载。这点挺省事的——我把同一套技能，同时装给了 opencode 和 pi，两边都能用，不用维护两份。（顺带说一句，pi 也能直接加载 &lt;code&gt;~/.claude/skills&lt;/code&gt;、&lt;code&gt;~/.codex/skills&lt;/code&gt; 这些别的工具的技能目录，在 settings 里配上就行。）&lt;/p&gt;
&lt;p&gt;extensions 是扩展，用 TypeScript 写。这个是 pi 的重头戏。它能加自定义工具、加命令、加键盘快捷键、拦事件，还能改 UI，甚至连内置工具都能整个换掉。官方示例里连 Doom 都给塞进去了，等模型干活的时候打游戏。前面说的那些"pi 故意不做"的功能——子智能体、计划模式、权限闸门、MCP 支持——理论上都能用扩展自己搭出来。&lt;/p&gt;
&lt;p&gt;themes 是主题，改完直接热加载，不用重启。prompt template、skill、extension、theme 这四样，加上包管理，合起来就是 pi packages。可以打包成 npm 包或者 git 仓库分享给别人：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pi&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;npm:@foo/pi-tools
pi&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;git:github.com/user/repo
pi&lt;span class="w"&gt; &lt;/span&gt;list
pi&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt; &lt;/span&gt;--all
pi&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# 在 TUI 里开关各个包资源&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;除了交互模式，还能当积木用&lt;/h2&gt;
&lt;p&gt;pi 不只是个给人用的 TUI，它还有几种程序化的用法。&lt;/p&gt;
&lt;p&gt;比如打印模式，跑完就退，适合写脚本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pi&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;总结一下这个代码库&amp;quot;&lt;/span&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;README.md&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pi&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;把这段文字总结一下&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;再比如 JSON 模式，所有事件按 JSON 行输出，方便别的程序解析；还有 RPC 模式，走 stdin/stdout，给非 Node 的进程集成用。最后它本身就是个 SDK，可以在自己的 TypeScript 程序里直接把它嵌进去：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;createAgentSession&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ModelRuntime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;SessionManager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;@earendil-works/pi-coding-agent&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;要让它遵守项目里的规矩，就在项目根目录放个 &lt;code&gt;AGENTS.md&lt;/code&gt;（或者 &lt;code&gt;CLAUDE.md&lt;/code&gt;），pi 启动会自动读。想整个换掉系统提示词，用 &lt;code&gt;.pi/SYSTEM.md&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;pi 和 opencode 有啥不一样&lt;/h2&gt;
&lt;p&gt;说到这儿，可能有人会问，那它跟 opencode 到底选哪个。我先把两边的主要区别摆出来，都是我自己用下来加上看文档整理的。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方面&lt;/th&gt;
&lt;th&gt;pi&lt;/th&gt;
&lt;th&gt;opencode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;定位&lt;/td&gt;
&lt;td&gt;极简内核，自己拼&lt;/td&gt;
&lt;td&gt;功能齐全，开箱即用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;出身&lt;/td&gt;
&lt;td&gt;Mario Zechner（badlogic）&lt;/td&gt;
&lt;td&gt;SST 团队&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;子智能体&lt;/td&gt;
&lt;td&gt;没有，自己搭&lt;/td&gt;
&lt;td&gt;有，主/子 agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP&lt;/td&gt;
&lt;td&gt;没有，写扩展加&lt;/td&gt;
&lt;td&gt;有&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;计划模式&lt;/td&gt;
&lt;td&gt;没有&lt;/td&gt;
&lt;td&gt;有&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;权限弹窗&lt;/td&gt;
&lt;td&gt;没有&lt;/td&gt;
&lt;td&gt;有权限配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扩展方式&lt;/td&gt;
&lt;td&gt;TypeScript 扩展&lt;/td&gt;
&lt;td&gt;插件 + 配置 + 命令 Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;会话&lt;/td&gt;
&lt;td&gt;JSONL 树，原地分支&lt;/td&gt;
&lt;td&gt;会话 + 分享 + 回退&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;形态&lt;/td&gt;
&lt;td&gt;终端 TUI + 库&lt;/td&gt;
&lt;td&gt;TUI + 服务端 + 网页 + 桌面端&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;集成&lt;/td&gt;
&lt;td&gt;SDK / RPC / JSON&lt;/td&gt;
&lt;td&gt;ACP / MCP / GitHub / serve / attach&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;技能&lt;/td&gt;
&lt;td&gt;Agent Skills 标准&lt;/td&gt;
&lt;td&gt;Agent Skills 标准&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;差别最大的，我认为是思路。opencode 是"我都给你配好，你直接用"，它有子智能体、有 MCP、有权限控制、能起服务端、有网页和桌面端、还跟 GitHub 打通，能 &lt;code&gt;opencode github&lt;/code&gt;、&lt;code&gt;opencode pr&lt;/code&gt; 直接拉 PR。功能面铺得很宽。你可以把它当成一个完整的开发平台来用。&lt;/p&gt;
&lt;p&gt;pi 反过来，它相信"你不想要我强塞的东西"。核心就四个工具，剩下的全靠扩展和包。你不动手，它就是个很小的终端助手；你愿意折腾，它能被改成任何样子，而且不用去 fork 它的源码。&lt;/p&gt;
&lt;p&gt;会话这块是 pi 的强项。它的树状会话和原地分支，用起来比一般工具的"线性历史"灵活，尤其是那种试错很多的任务。&lt;/p&gt;
&lt;p&gt;隐私和安全上，得说两句实在话。pi 明确没有权限弹窗，官方建议是要么在容器里跑，要么自己用扩展写确认流程。扩展和技能又是能执行任意代码的，第三方包一定要先看看源码再装。opencode 这边至少有权限配置这一层，你可以把危险的 bash 命令设成要确认或者直接拒绝。这两点在取舍上得想清楚。&lt;/p&gt;
&lt;h2&gt;做了个对照实验，看看谁快&lt;/h2&gt;
&lt;p&gt;前面说 pi 手感快，这只是感觉，不算数。所以我认真做了一组对照实验，想看看差距到底从哪来。&lt;/p&gt;
&lt;p&gt;条件尽量卡平：同一个模型（DeepSeek 的 &lt;code&gt;deepseek-chat&lt;/code&gt;，两边都直连官方接口），同一个任务——目录里放一个算平均值的 &lt;code&gt;buggy.py&lt;/code&gt;，让它读文件、找 bug、修好、跑一遍，把结果告诉我；每次都在全新的空目录里跑。为了排除干扰，我把 pi 的技能、扩展、上下文文件全关掉，opencode 那边用一个只留 provider 的最小配置，两边各跑 4 次取平均。&lt;/p&gt;
&lt;p&gt;这里说的"快"，用的是&lt;strong&gt;墙钟时间&lt;/strong&gt;，也就是从敲下回车到它彻底干完，现实中真实等了多久。这个数里包含启动、把提示词发给模型、模型生成，还有它读文件、改文件、跑命令的全过程，跟咱们的体感一致。&lt;/p&gt;
&lt;p&gt;结果是这样：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;pi&lt;/th&gt;
&lt;th&gt;opencode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;总耗时&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.40 秒&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.32 秒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第一轮模型响应&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.60 秒&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4.33 秒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输入 token&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;809&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6310&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缓存读 token&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6016&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;23936&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出 token&lt;/td&gt;
&lt;td&gt;289&lt;/td&gt;
&lt;td&gt;231&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;总 token&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7114&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30477&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工具调用 / 模型回合&lt;/td&gt;
&lt;td&gt;3 / 4&lt;/td&gt;
&lt;td&gt;3 / 4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;正确率&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两边干的活一模一样，都修对了，工具调用和回合数也一样。但你看输出 token，289 对 231，基本是一个量级——说明模型"想"和"说"的量差不多。差的全在&lt;strong&gt;输入&lt;/strong&gt;这一侧：opencode 每一轮背的上下文，差不多是 pi 的 4 倍。&lt;/p&gt;
&lt;p&gt;这 4 倍是哪来的？我单独测了一句废话"只回复 ok"，不触发任何工具：pi 是 1515 个 token，opencode 是 7333 个。一上来 opencode 就多背了将近 6000 token。原因也不神秘，它的内置工具多（read、edit、write、bash、glob、grep、list、patch、task、todowrite、webfetch 一大堆），每个工具的定义都要发给模型，再加上它内置了好几套 agent 的系统提示词。pi 默认就四个工具，提示词也短。&lt;/p&gt;
&lt;p&gt;输出差不多、输入差很多，意味着时间差主要花在"把上下文喂给模型"这一步，也就是预填充和网络传输，而不是模型在思考。&lt;/p&gt;
&lt;h2&gt;技能装得越多，差距会怎么变&lt;/h2&gt;
&lt;p&gt;这才是有意思的地方。pi 和 opencode 都遵循同一套 Agent Skills 标准，技能的名字和描述都是常驻在系统提示词里的（正文要按需才读）。那技能一多，两边的差距会不会被拉大？&lt;/p&gt;
&lt;p&gt;我用统一规格的技能做了个扫描，还是测一句"ok"的输入 token：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;技能数&lt;/th&gt;
&lt;th&gt;pi&lt;/th&gt;
&lt;th&gt;opencode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1515&lt;/td&gt;
&lt;td&gt;7333&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;3659&lt;/td&gt;
&lt;td&gt;9443&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;10490&lt;/td&gt;
&lt;td&gt;16406&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;22289&lt;/td&gt;
&lt;td&gt;28433&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;42989&lt;/td&gt;
&lt;td&gt;49533&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;把它拟合成一条直线，能看出：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pi：成本 ≈ 1561 + 207 × 技能数&lt;/li&gt;
&lt;li&gt;opencode：成本 ≈ 7333 + 211 × 技能数&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关键结论是：&lt;strong&gt;每装一个技能，两边增加的开销几乎一样（207 对 211），差距全在起跑线上那个固定的 5800。&lt;/strong&gt; 技能本身不是差距来源，基线才是。所以技能越多，opencode 的相对劣势反而越小，但绝对差距基本卡在 5800 上下不动。&lt;/p&gt;
&lt;p&gt;拿我自己那套 43 个技能来说：pi 一个请求 15051 token，opencode 20256。跑一个 4 轮的编码任务，总 token 是这样：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;技能数&lt;/th&gt;
&lt;th&gt;pi 总 token&lt;/th&gt;
&lt;th&gt;opencode 总 token&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7171&lt;/td&gt;
&lt;td&gt;30541&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43（真实）&lt;/td&gt;
&lt;td&gt;61284&lt;/td&gt;
&lt;td&gt;82175&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;168290&lt;/td&gt;
&lt;td&gt;194595&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里得划个重点：&lt;strong&gt;技能数会把每个任务的 token 成倍放大，因为每一轮都要把完整上下文重发一遍。&lt;/strong&gt; 43 个技能就把一个 4 轮任务从 7 千 token 顶到了 6 万（pi）。公式大概就是：任务总 token ≈ 回合数 × (基线 + 210 × 技能数)。所以真要省钱，最有效的不是换工具，而是把技能精简掉——这一条对 pi 和 opencode 都成立。&lt;/p&gt;
&lt;h2&gt;换个模型会变吗&lt;/h2&gt;
&lt;p&gt;我又用 &lt;code&gt;deepseek-reasoner&lt;/code&gt;（带思考的那个）测了一遍。结论是：换模型不改变两边的固定差距。opencode 不管用 chat 还是 reasoner，每个任务都稳定地比 pi 多背两万多 token，正好是 4 轮乘以那个 5800 的基线差。&lt;strong&gt;差距是壳带来的常数，不是模型带来的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;启动速度也顺带量了：pi 冷启动约 0.44 秒，opencode 约 0.75 秒。不过真正让 opencode 显慢的，是第一轮那个大上下文，不是这零点几秒。&lt;/p&gt;
&lt;p&gt;所以"pi 快一些"这事，拆开看其实很朴素：&lt;strong&gt;它省的是那个固定的上下文基线，不是它有什么更快的引擎。&lt;/strong&gt; 输出和回合数两边一样，说明模型那一侧是同一个东西；差的只是每一轮要背多少包袱。&lt;/p&gt;
&lt;p&gt;当然，这个实验也有局限，我得说清楚：样本不大（各 4 次），而且我把两边都调成了最小配置。你真实用起来，opencode 还会加载 agent、规则这些，盘子只会更大；pi 的技能是描述常驻、正文按需，涨得慢一些。数值会变，但"pi 省在固定基线、技能对两边等价"这个结论不会变。&lt;/p&gt;
&lt;h2&gt;我的一些看法&lt;/h2&gt;
&lt;p&gt;要我说，这俩不是非要二选一。&lt;/p&gt;
&lt;p&gt;如果你想要一个东西，装上就能干活，功能越全越好，团队里还要统一管控权限，那 opencode 更合适。它有子智能体、有 MCP、有权限这一套，拿来就能用。&lt;/p&gt;
&lt;p&gt;如果你跟我一样，喜欢把工具拆开看、按自己习惯组装，还经常写点小脚本小扩展，那 pi 会让你觉得很舒服。它内核小，改起来不费劲，出了什么问题也容易看明白。而且它是认真在做"可扩展"，不是嘴上说说。&lt;/p&gt;
&lt;p&gt;我用下来的感觉是，平时常规的写代码、改代码、跑命令，两个都能干，差别不大。真到了要分支探索、要接一堆自定义流程的时候，pi 的树状会话和扩展能力就显出好处了。反过来，要做那种需要子智能体分工、需要连 MCP 服务、需要团队权限管控的活，opencode 更省心。&lt;/p&gt;
&lt;p&gt;还有个我挺喜欢的地方，是这两个工具并不互斥。技能是同一套标准，模型服务也能互相用（pi 能连 opencode 的 Zen/Go），会话也各管各的。完全可以两个都装着，看当天想干什么就用哪个。&lt;/p&gt;
&lt;h2&gt;最后&lt;/h2&gt;
&lt;p&gt;说句实在的，pi 这种"故意少做"的工具，一开始会让人有点不习惯，觉得啥都得自己来。但用久了会发现，正是因为它肯把决定权留给你，才没那么多"它以为你需要"的东西。&lt;/p&gt;
&lt;p&gt;当然，天下没有免费的午餐。东西越少，你要自己补的就越多；权限没有弹窗，出了事也得自己担着。所以装第三方扩展之前，多看一眼代码，这个习惯一定要有。&lt;/p&gt;
&lt;p&gt;想试试的话，官网是 pi.dev，源码在 GitHub 上（earendil-works/pi），npm 包名是 &lt;code&gt;@earendil-works/pi-coding-agent&lt;/code&gt;。我这边是 0.85.1，opencode 是 1.18.31，上面说的都是这个版本的实际用法，后面版本要是有变化，以官方文档为准。&lt;/p&gt;</content><category term="Tool"/><category term="pi"/><category term="opencode"/><category term="AI"/><category term="编程助手"/><category term="终端"/><category term="智能体"/></entry><entry><title>8G 显存怎么跑本地大模型？——从 RTX 2060 到 4070 的极限压榨实录</title><link href="https://blog.cycleuser.org/8g-xian-cun-zen-yao-pao-ben-di-da-mo-xing-cong-rtx-2060-dao-4070-de-ji-xian-ya-zha-shi-lu.html" rel="alternate"/><published>2026-09-18T21:30:00+08:00</published><updated>2026-09-18T21:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-18:/8g-xian-cun-zen-yao-pao-ben-di-da-mo-xing-cong-rtx-2060-dao-4070-de-ji-xian-ya-zha-shi-lu.html</id><summary type="html">&lt;h1&gt;8G 显存怎么跑本地大模型？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;16G 显存的取舍我写过一篇，这回把档次再往下压：手里只有一张 8G 的卡——RTX 3070、4060、2060 Super，或者 4070 Laptop 这 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1&gt;8G 显存怎么跑本地大模型？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;16G 显存的取舍我写过一篇，这回把档次再往下压：手里只有一张 8G 的卡——RTX 3070、4060、2060 Super，或者 4070 Laptop 这种 8G 笔记本——还能不能跑本地大模型？&lt;strong&gt;技术上能跑，甚至能跑 35B；但"能跑"和"好用"之间隔还是有点远啊&lt;/strong&gt;。本文全部数据来自真实实测，出处见文末。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;一、先摆结论：8G 能跑 35B，但别高兴太早&lt;/h2&gt;
&lt;p&gt;先说反直觉的部分：&lt;strong&gt;8G 显存跑 35B 大模型，是可行的&lt;/strong&gt;。论坛里至少四张不同的 8G 卡（3070、4060、2060 Super、4070 Laptop）都成功跑起了 Qwen3.6-35B-A3B，速度从 17 t/s 到 42 t/s 不等，甚至有人把 35B 塞进了 8G 笔记本还开出 128K 上下文[1][2][3][4]。&lt;/p&gt;
&lt;p&gt;但同一批帖子里，楼主自己的评价是这样的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;"编码可以跑。能处理图片。其他的拉稀中。总结：学习机小拉拉一枚。"[1]&lt;/li&gt;
&lt;li&gt;"这个小拉拉实际应用没有任何意义。或者直白点就是 8G 就是没什么意义。我的任意项目它都是跑不了的。"[1]&lt;/li&gt;
&lt;li&gt;"8G 的卡只能是跑起来而已，用来驱动 agent 几乎不可用的。"[3]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;为什么会有这种分裂？&lt;/strong&gt; 因为 8G 的瓶颈从来不是"装不装得下模型"，而是&lt;strong&gt;预填充（prefill）速度&lt;/strong&gt;。日常聊天、短代码问答，体验尚可；一旦接上 Agent（比如 Hermes），系统提示词动辄 20K+ token，8G 卡的 prefill 就会慢到让人失去耐心[3]。&lt;/p&gt;
&lt;p&gt;所以本文的正确读法是：&lt;strong&gt;8G 能带你入门、能跑通、能理解参数，但它不是生产力工具的上限，而是一个"折腾甜点"&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;二、核心原理：MoE + CPU Offload 是 8G 的救命稻草&lt;/h2&gt;
&lt;p&gt;8G 能跑 35B，靠的不是什么黑科技，而是&lt;strong&gt;架构红利&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qwen3.6-35B-A3B 是混合专家模型（MoE）&lt;/strong&gt;：35B 总参数，但每次推理只激活约 3B 参数[1]。这意味着 GPU 不需要一次性加载完整的 35B 权重。&lt;/p&gt;
&lt;p&gt;再叠加 llama.cpp 的两个能力：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CPU Offload（&lt;code&gt;-ngl&lt;/code&gt;）&lt;/strong&gt;：控制多少层放 GPU，其余放内存；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MoE 专家路由（&lt;code&gt;--n-cpu-moe&lt;/code&gt;）&lt;/strong&gt;：把非激活的专家层丢到系统内存，GPU 只保留注意力层和少量专家[2]。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;于是形成"&lt;strong&gt;GPU 跑注意力层、内存跑专家层&lt;/strong&gt;"的分工——这才是 8G 卡能跑 35B 的核心原因[1]。代价是：&lt;strong&gt;速度上限被内存带宽锁死&lt;/strong&gt;，因为每生成一个 token 都要从内存里搬专家权重。&lt;/p&gt;
&lt;p&gt;反过来说：如果你用的是&lt;strong&gt;同尺寸的稠密（Dense）模型&lt;/strong&gt;，比如 27B 稠密，那 8G 基本没戏——Q4 量化后权重就要 15GB 以上，根本放不下，硬 offload 会慢到不可用[5]。&lt;/p&gt;
&lt;h2&gt;三、模型怎么选：35B-A3B MoE，还是退一步用 9B&lt;/h2&gt;
&lt;p&gt;8G 上有两条路线，选哪条取决于你要干什么。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;路线一：35B-A3B MoE——"能跑大模型"的执念&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是论坛里 8G 玩家最热衷的方向，因为"8G 跑 35B"本身就有巨大的心理满足感。实测也确实能跑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RTX 3070 8G + i7-12700，Q4_K_M 量化，&lt;code&gt;-ngl 99 --n-cpu-moe 999&lt;/code&gt;，32K 上下文，还支持多模态和网页 UI[1]&lt;/li&gt;
&lt;li&gt;RTX 4060 8G + R7 5700X，APEX-MTP 量化（13.7GB），&lt;code&gt;-ngl 999 --n-cpu-moe 32&lt;/code&gt;，64K 上下文，短输出 30+ t/s、代码场景 45-50 t/s[3]&lt;/li&gt;
&lt;li&gt;RTX 4070 Laptop 8G，Q4_K_M，短文本 42.3 t/s、Thinking 模式 42.1 t/s，一键包支持 128K + 多模态[4]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;路线二：9B 级稠密模型——"真的好用"的务实选择&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;论坛里不止一个人劝退"8G 硬上 35B"：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"4060 还是玩 9B 吧……跑起来还快点。"[3]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在工具调用（function calling）这个对 8G 最关键的场景里，有会员给出了明确建议[5]：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;8G（4070）：27B 的 Q4 要 15G 以上，放不下。8G 实际能打的是 &lt;strong&gt;Qwen3-8B、GLM-4-9B&lt;/strong&gt;（同尺寸里工具调用很强）、&lt;strong&gt;Gemma3-12B Q4&lt;/strong&gt; 勉强压线。别为了"跑大模型"硬上 27B 的低量化档——&lt;strong&gt;如果只是翻译或者写文本倒是无所谓了，但工具调用对量化损伤很敏感，降档后 function call 格式会先崩&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这句话很关键：&lt;strong&gt;Agent 场景下，"小模型满精度"往往打得过"大模型低量化"&lt;/strong&gt;。因为工具调用要求模型稳定输出 JSON schema，低量化会先破坏这种结构化输出能力。&lt;/p&gt;
&lt;h2&gt;四、量化怎么选：8G 的量化比 16G 更极端&lt;/h2&gt;
&lt;p&gt;8G 上量化档位的选择空间比 16G 窄得多，但方向是一致的——&lt;strong&gt;找到能全层上卡、又不至于把质量整崩溃的那一档&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;论坛实测过的几档（35B-A3B）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;大小&lt;/th&gt;
&lt;th&gt;8G 卡适配情况&lt;/th&gt;
&lt;th&gt;出处&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Q4_K_M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16.5 GB&lt;/td&gt;
&lt;td&gt;权重就超 8G，必须重度 offload，能跑但吃力&lt;/td&gt;
&lt;td&gt;[1][4]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APEX-MTP-I-Mini&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;13.7 GB&lt;/td&gt;
&lt;td&gt;4060 上 30+ t/s、代码 45-50 t/s，8G 的"毕业配置"&lt;/td&gt;
&lt;td&gt;[3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;APEX-I-Quality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~16.8 GB&lt;/td&gt;
&lt;td&gt;异构多卡（12G+8G）上 prefill 1279 t/s、decode 88.8 t/s&lt;/td&gt;
&lt;td&gt;[6]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IQ2_M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;最小&lt;/td&gt;
&lt;td&gt;2060 Super 上唯一能稳定跑 8K 上下文的档位，~17 t/s&lt;/td&gt;
&lt;td&gt;[2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Q3_K_XL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~16.8 GB&lt;/td&gt;
&lt;td&gt;需要 24G 以上才舒服，8G 上偏重&lt;/td&gt;
&lt;td&gt;[3]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;几个结论：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;8G 上"精度换速度"是刚需&lt;/strong&gt;。16G 上还能讲究 IQ4_XS 全层上卡，8G 上往往要一路降到 APEX/IQ2 级别，甚至接受"模型智商明显下降"[2]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;APEX 量化是 8G 的惊喜&lt;/strong&gt;。它把 35B 压到 13.7GB，配合 MTP（多 token 预测）能在 4060 上跑出 30+ t/s，被社区称为"8G 显存的毕业配置"[3]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;别迷信低量化能救一切&lt;/strong&gt;。IQ2_M 虽然塞得下，但作者自己也说"完全没有意思""硬件限制上不到 16K"[2]——量化降到这个程度，模型能力已经受损。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;五、关键参数：&lt;code&gt;--n-cpu-moe&lt;/code&gt; 和 &lt;code&gt;-fit off&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;8G 跑大 MoE 模型，参数比模型更重要。论坛里一份"极限参数定稿报告"把调参过程完整记录了下来，非常有参考价值[2]：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阶段 1：默认参数（失败）&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-ngl 80 -c 4096
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;现象：显存逼近 8G 爆满，报 &lt;code&gt;failed to fit params to free device memory&lt;/code&gt;，llama.cpp 自动回退，速度断崖式跌到 ~7.5 t/s。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阶段 2：开启 MoE 专家路由（部分改善）&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-ngl 80 --n-cpu-moe 38 -c 4096
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;显存降到 ~2.5G（异常偏低），速度 ~15 t/s。问题：GPU 层数被削太狠，大量权重滞留内存，瓶颈变成内存带宽。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阶段 3：强制显存适配 + 降 GPU 层数（关键突破）&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-ngl 30 --n-cpu-moe 20 -c 4096 -fit off
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;显存 6.8G / 8G（余量 1.3G），速度 ~15 t/s。&lt;code&gt;-fit off&lt;/code&gt; 关闭自动适配后，30 层权重成功驻留显存，进入甜点区。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阶段 4：上下文扩容（最终定稿）&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;-ngl 30 --n-cpu-moe 20 -c 8192 -fit off
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;显存 7.0G / 8G（余量 1.1G），速度 ~17 t/s。上下文翻倍，显存只多 200MB，&lt;strong&gt;速度反而微升&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这份报告的核心经验&lt;/strong&gt;[2]：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--n-cpu-moe&lt;/code&gt; 是 8G 卡跑大 MoE 的核心参数&lt;/strong&gt;，负责把非激活专家路由到内存；不能无脑 &lt;code&gt;-ngl 80&lt;/code&gt;，要配合 &lt;code&gt;-fit off&lt;/code&gt; 手动控制显存分配。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;显存甜点区是 6.5G ~ 7.2G&lt;/strong&gt;：低于 6G，GPU 层数不足、速度受限；高于 7.5G，余量不够，Windows 的 WDDM 驱动一波动就爆显存、速度断崖。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows 的可用显存要比标称少&lt;/strong&gt;：标称 8192 MiB，实际空闲只有 7158 MiB；同配置在 Linux 下预计能多出 500MB~1G，有望稳定 16K 上下文[2]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上下文和速度不总是负相关&lt;/strong&gt;：4K→8K 速度从 15 微升到 17 t/s，因为 4K 时 GPU 利用率没吃满，8K 反而让流水线更饱和[2]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thinking 会偷偷吃掉 token&lt;/strong&gt;：复杂 prompt 容易陷入长推理，建议前端加约束"请直接回答，不要输出思考过程"[2]。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;另外，KV 缓存量化也是 8G 的必备技巧：&lt;code&gt;--cache-type-k q4_0 --cache-type-v q4_0&lt;/code&gt; 能大幅省显存换上下文[1]；如果显存还有余量，用 q8_0 质量更稳[3]。&lt;/p&gt;
&lt;h2&gt;六、实测数据的真实表现&lt;/h2&gt;
&lt;p&gt;把论坛里几张 8G 卡的实测数据放在一起看，差异非常明显：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;显卡&lt;/th&gt;
&lt;th&gt;CPU/内存&lt;/th&gt;
&lt;th&gt;模型/量化&lt;/th&gt;
&lt;th&gt;上下文&lt;/th&gt;
&lt;th&gt;生成速度&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RTX 3070 8G&lt;/td&gt;
&lt;td&gt;i7-12700 / 64G&lt;/td&gt;
&lt;td&gt;35B-A3B Q4_K_M&lt;/td&gt;
&lt;td&gt;32K&lt;/td&gt;
&lt;td&gt;编码可跑&lt;/td&gt;
&lt;td&gt;多模态+UI，作者自称"学习机"[1]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 2060 Super 8G&lt;/td&gt;
&lt;td&gt;i7-4790K / 32G DDR3&lt;/td&gt;
&lt;td&gt;35B-A3B IQ2_M&lt;/td&gt;
&lt;td&gt;8K&lt;/td&gt;
&lt;td&gt;~17 t/s&lt;/td&gt;
&lt;td&gt;极限定稿，甜点区 6.5-7.2G[2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 4060 8G（台式）&lt;/td&gt;
&lt;td&gt;R7 5700X / 64G&lt;/td&gt;
&lt;td&gt;35B-A3B APEX-MTP&lt;/td&gt;
&lt;td&gt;64K&lt;/td&gt;
&lt;td&gt;30+ t/s，代码 45-50&lt;/td&gt;
&lt;td&gt;prefill ~499 t/s[3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 4060 8G（USB4 笔记本）&lt;/td&gt;
&lt;td&gt;R7 6850HS / 32G&lt;/td&gt;
&lt;td&gt;35B-A3B APEX-MTP&lt;/td&gt;
&lt;td&gt;64K&lt;/td&gt;
&lt;td&gt;同上但 prefill 慢 3 倍&lt;/td&gt;
&lt;td&gt;prefill ~168 t/s[3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 4070 Laptop 8G&lt;/td&gt;
&lt;td&gt;i7-14650HX / 32G&lt;/td&gt;
&lt;td&gt;35B-A3B Q4_K_M&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;42.3 t/s&lt;/td&gt;
&lt;td&gt;一键包，多模态+Agent[4]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4070 8G 笔记本&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;35B-A3B&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;35 t/s&lt;/td&gt;
&lt;td&gt;成功接入 Hermes[1]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;几个观察：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;同是 4060 8G，台式机和 USB4 外接笔记本差 3 倍&lt;/strong&gt;——差的不是 GPU 算力，而是 PCIe vs USB4 的带宽/延迟，以及移动 CPU 的持续功耗和内存带宽[3]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU 和内存同样重要&lt;/strong&gt;：2060 Super 配 DDR3 只能跑 17 t/s，而 4060 配 DDR4-3200 能跑 30+；专家层跑在内存里，内存带宽直接决定下限[2][3]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异构多卡是一条野路子&lt;/strong&gt;：有人用双 2060 12G + 2070 8G 组异构，跑 35B APEX 量化，prefill 达到 1279 t/s、decode 88.8 t/s[6]——但这已经超出"单张 8G"的范畴了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;七、连接方式之争：USB4/雷电 vs OCuLink&lt;/h2&gt;
&lt;p&gt;先回答一个很多人搞混的问题：&lt;strong&gt;USB4 和雷电（Thunderbolt）到底是不是一回事？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答案是"同源但不等同"。Intel 当年把 &lt;strong&gt;Thunderbolt 3 的协议贡献给了 USB-IF&lt;/strong&gt;，这套协议后来就成了 &lt;strong&gt;USB4&lt;/strong&gt;（2019 年发布）。所以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;雷电 3 / USB4 40Gbps / 雷电 4&lt;/strong&gt;：底层是同一套协议，eGPU 走的都是 &lt;strong&gt;PCIe 3.0 x4 隧道&lt;/strong&gt;（约 32 Gbps 可用、约 3.9 GB/s）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;雷电 4&lt;/strong&gt; 只是 USB4 40Gbps 之上的更严格认证（强制 40Gbps、PCIe 隧道 ≥32Gbps）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;雷电 5 / USB4 v2&lt;/strong&gt; 才把带宽拉到 80/120 Gbps（PCIe 4.0 x4 隧道）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关键结论&lt;/strong&gt;：所谓"USB4 不行"，问题不在"USB4 比雷电差"——&lt;strong&gt;USB4 40Gbps 和雷电 3/4 的 eGPU 带宽本质是一样的&lt;/strong&gt;。真正的瓶颈是&lt;strong&gt;这套隧道机制本身的开销和延迟&lt;/strong&gt;，跟原生 PCIe 有先天差距[3]。换句话说，你换成雷电 3/4 的显卡坞，也不会比 USB4 好到哪去。&lt;/p&gt;
&lt;p&gt;那什么更好？&lt;strong&gt;OCuLink&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;OCuLink（SFF-8611）走的是&lt;strong&gt;原生 PCIe 信号&lt;/strong&gt;，不经 USB/雷电的协议封装（隧道），所以延迟更低；规格上常见 PCIe 3.0 x4（32 Gbps）或 &lt;strong&gt;PCIe 4.0 x4（64 Gbps）&lt;/strong&gt;——后者是 USB4/雷电 3/4 的两倍带宽。代价是不支持热插拔、线缆不供电（要独立电源）、线短、还要占一个 M.2/PCIe 槽。&lt;/p&gt;
&lt;p&gt;论坛里有一份&lt;strong&gt;同一张 7900 XTX 在不同连接方式下的实测阶梯&lt;/strong&gt;，非常有说服力[7]：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;连接方式&lt;/th&gt;
&lt;th&gt;预期生成速度（tg mean）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;雷电 3 eGPU（Razer Core X Chroma）&lt;/td&gt;
&lt;td&gt;37–45 t/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OCuLink 改装同一个坞（~$80，3 小时）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52–55 t/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;移到 X99 台式机（PCIe 3.0 x16）&lt;/td&gt;
&lt;td&gt;58–62 t/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;现代 AM5 + PCIe 4.0 x16&lt;/td&gt;
&lt;td&gt;67 t/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;OCuLink 比雷电 3 快了约 40%（37-45 → 52-55），几乎追平原生 PCIe 3.0 x16&lt;/strong&gt;。所以对 eGPU 跑 LLM，OCuLink 是比雷电/USB4 更划算的选择。另有会员在 OCuLink + R9700 上实测 Q4 量化：pp512 达 680 t/s、tg128 约 29.5 t/s、开 MTP 长输出约 43 t/s，作者表示没观察到明显的链路瓶颈[8]（不过他强调没有同卡 PCIe x16 的 A/B 对照，结论只能作参考）。&lt;/p&gt;
&lt;p&gt;回到 8G 笔记本的场景，连接方式的影响同样明显[3]：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;台式机 PCIe 内置 RTX 4060&lt;/strong&gt;：长 prompt processing ≈ &lt;strong&gt;499 tok/s&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;笔记本 USB4 外接 RTX 4060&lt;/strong&gt;：长 prompt processing ≈ &lt;strong&gt;168 tok/s&lt;/strong&gt;（慢近 3 倍）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;原因有四[3]：
1. USB4 eGPU 的带宽和延迟弱于台式机 PCIe；
2. 35B-A3B 依赖 CPU MoE，CPU/GPU 协作频繁，链路瓶颈被放大；
3. 移动端 CPU 的持续功耗、散热、内存带宽不如台式机；
4. 笔记本内存通常 32G，64K 上下文 + prompt cache + CPU MoE 时余量更小。&lt;/p&gt;
&lt;p&gt;（补充一个兼容性坑：有会员反馈 &lt;strong&gt;Blackwell + USB4 + Linux CUDA 运算必崩&lt;/strong&gt;，RTX 5090 eGPU 在 Linux 下无法启动[9]——外接显卡不光看带宽，还要看平台兼容性。）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;笔记本的务实建议&lt;/strong&gt;[3]：
- 上下文降到 32K（&lt;code&gt;ctx-size = 32768&lt;/code&gt;），&lt;code&gt;n-cpu-moe&lt;/code&gt; 提到 35；
- 或者干脆改用能完整放进 8G 的小模型（Qwen3.5-9B、7B/8B coder），避开 CPU MoE 的链路瓶颈；
- 别把笔记本当主力 Agent 服务端；
- 真要外接，优先考虑 OCuLink 而非雷电/USB4 显卡坞。&lt;/p&gt;
&lt;h2&gt;八、笔记本 4060 能逼近笔记本 4070？&lt;/h2&gt;
&lt;p&gt;回头看第六节的表，有个现象值得单独拆开：&lt;strong&gt;笔记本 RTX 4060（低一档的卡）居然和笔记本 RTX 4070（高一档的卡）打得不分上下&lt;/strong&gt;——笔记本 4060 短输出 30+ t/s、代码 45-50 t/s[3]，笔记本 4070 是短文本 42.3 t/s、Thinking 42.1 t/s[4]。按理说 4070 该碾压 4060，为什么会这样？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最重要的：笔记本 4060 和 4070 的显存带宽完全相同。&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;显卡&lt;/th&gt;
&lt;th&gt;核心&lt;/th&gt;
&lt;th&gt;CUDA 核&lt;/th&gt;
&lt;th&gt;位宽&lt;/th&gt;
&lt;th&gt;显存带宽&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RTX 4060 Laptop&lt;/td&gt;
&lt;td&gt;AD107&lt;/td&gt;
&lt;td&gt;3072&lt;/td&gt;
&lt;td&gt;128-bit&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;256 GB/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 4070 Laptop&lt;/td&gt;
&lt;td&gt;AD106&lt;/td&gt;
&lt;td&gt;4608&lt;/td&gt;
&lt;td&gt;128-bit&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;256 GB/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;（对比）RTX 4060 桌面&lt;/td&gt;
&lt;td&gt;AD107&lt;/td&gt;
&lt;td&gt;3072&lt;/td&gt;
&lt;td&gt;128-bit&lt;/td&gt;
&lt;td&gt;272 GB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;（对比）RTX 4070 桌面&lt;/td&gt;
&lt;td&gt;AD104&lt;/td&gt;
&lt;td&gt;5888&lt;/td&gt;
&lt;td&gt;192-bit&lt;/td&gt;
&lt;td&gt;504 GB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;笔记本 4060 和 4070 都是 128-bit、16 Gbps 的 GDDR6，带宽&lt;strong&gt;都是 256 GB/s&lt;/strong&gt;——4070 多出来的 1536 个 CUDA 核，并没有换来带宽提升。而 &lt;strong&gt;LLM 解码（decode）是"带宽瓶颈"型任务&lt;/strong&gt;：每生成一个 token，都要把权重从显存完整读一遍，速度基本由显存带宽决定，而不是 CUDA 核数。带宽一样，解码速度自然就接近。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后，频率差异又补了一刀——笔记本 4060 的加速频率反而更高。&lt;/strong&gt; 这是很多人忽略的变量：AD107 核心数少、功耗密度低，反而能跑到更高的频率。官方规格里，&lt;strong&gt;RTX 4060 Laptop 的 Boost 频率约 2370 MHz，比 RTX 4070 Laptop 的约 2175 MHz 还高&lt;/strong&gt;（部分高 TGP 机型 4060 能上到 2460 MHz，而 4070 大约封顶 2295 MHz）。用"核心数 × 频率"估有效算力：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;显卡&lt;/th&gt;
&lt;th&gt;核心数&lt;/th&gt;
&lt;th&gt;Boost 频率&lt;/th&gt;
&lt;th&gt;有效算力（核·MHz）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RTX 4060 Laptop&lt;/td&gt;
&lt;td&gt;3072&lt;/td&gt;
&lt;td&gt;~2370 MHz&lt;/td&gt;
&lt;td&gt;7.28 M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 4070 Laptop&lt;/td&gt;
&lt;td&gt;4608&lt;/td&gt;
&lt;td&gt;~2175 MHz&lt;/td&gt;
&lt;td&gt;10.02 M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;4060 的有效算力达到了 4070 的约 73%，而不是纯核数比给出的 67%&lt;/strong&gt;——频率优势把差距从 33% 缩小到了约 27%。再考虑笔记本里持续负载下的实际频率（小核心更容易维持高频），差距还会进一步收窄。所以"核心数"这一项的影响力，被频率抵消了相当一部分；&lt;strong&gt;在带宽瓶颈的 decode 阶段，频率和核数都不太起作用，两者更是难分高下。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;少得可怜的那点差距，用处也不大，因为多出来的核数只在 prefill 阶段有优势。&lt;/strong&gt; prefill（处理输入 prompt）是计算密集操作，有效算力（核心数 × 频率）更高的 4070 会快一些；但到了逐 token 输出的 decode 阶段，两者又被带宽拉回同一水平。所以"聊天的体感速度"（看 decode）差不多，只有"首字延迟"（看 prefill）4070 占优。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;而且，两者都是笔记本芯片，功耗墙和散热限制相同。&lt;/strong&gt; 4060 Laptop 和 4070 Laptop 的可配置功耗区间都是 35–115W，薄本里常年 60–80W 且会热降频。LLM 推理是持续负载，谁都没法长时间跑满，差距进一步被抹平。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最后，配置差异也在放大或缩小差距。&lt;/strong&gt; 笔记本 4060 那组用了 APEX-MTP（带 MTP 投机解码，提速 30-50%），笔记本 4070 那组是 Q4_K_M、没提 MTP[3][4]。所以"4060 看起来不输 4070"里，有一部分是量化/MTP 配置的功劳，不全是硬件的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;反过来看桌面版就明白了&lt;/strong&gt;：桌面 4060（272 GB/s）和桌面 4070（504 GB/s）带宽差了近一倍，档次差距立刻显现——桌面 4070 在解码上能明显碾压桌面 4060。&lt;strong&gt;笔记本 4060/4070 之所以"打平"，本质是"同带宽、不同核数、但频率反超"三者叠加&lt;/strong&gt;；桌面 4060/4070 则是"带宽差一倍"，差距自然拉开。&lt;/p&gt;
&lt;p&gt;一句话总结：&lt;strong&gt;选卡跑本地模型，先看显存带宽，再看有效算力（核心数 × 频率）。&lt;/strong&gt; 笔记本 4060 和 4070 共享 256 GB/s 带宽，且 4060 频率更高、部分抵消核数劣势，所以在带宽瓶颈的 LLM 解码里难分高下。&lt;/p&gt;
&lt;h2&gt;九、8G 到底能干什么：Agent 场景的现实&lt;/h2&gt;
&lt;p&gt;这一节可能是新手朋友最关心的了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;能干的&lt;/strong&gt;：
- 日常对话、短代码补全、文本翻译；
- 图片/视频问答（多模态，8G 也支持）[1][4]；
- 轻量 Agent 任务（有会员在 4070 8G 笔记本上接 Hermes 成功执行多种任务）[1]；
- 学习理解 MoE、offload、量化这些概念——&lt;strong&gt;8G 是最好的"教具"&lt;/strong&gt;[2]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;干不动的&lt;/strong&gt;：
- &lt;strong&gt;Hermes 这类 Agent 的默认系统提示词就有 20K+ token&lt;/strong&gt;。8G 卡 prefill 速度约 300 tok/s，光处理提示词就要等很久，实际使用"基本没什么效率可言"[3]；
- 复杂多轮工具调用——量化降档后 function call 格式先崩[5]；
- 长代码生成——输出长了会明显变慢，最好让 Agent 分文件、分阶段输出[3]。&lt;/p&gt;
&lt;p&gt;一位带佬的总结很到位[3]：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;8G 的卡只能是跑起来而已，用来驱动 agent 几乎不可用的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以对 8G 玩家，我的建议是&lt;strong&gt;把心态放对&lt;/strong&gt;：
- 想"跑通、学原理、发帖炫技"→ 35B-A3B MoE，尽情折腾；
- 想"日常真的用起来"→ 老老实实用 9B 稠密 + 满精度，或者升级到 16G/24G；
- 想"驱动 Agent 干正事"→ 8G 不够，这不是调参能解决的，是硬件天花板。&lt;/p&gt;
&lt;h2&gt;十、给 8G 玩家的一张速查表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;你的诉求&lt;/th&gt;
&lt;th&gt;推荐模型&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;关键参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;就想跑通 35B 玩玩&lt;/td&gt;
&lt;td&gt;Qwen3.6-35B-A3B&lt;/td&gt;
&lt;td&gt;APEX-MTP-I-Mini (13.7G)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-ngl 999 --n-cpu-moe 32&lt;/code&gt;，KV q8_0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;极限压榨（2060S 级）&lt;/td&gt;
&lt;td&gt;35B-A3B&lt;/td&gt;
&lt;td&gt;IQ2_M&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-ngl 30 --n-cpu-moe 20 -c 8192 -fit off&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;日常对话/短代码&lt;/td&gt;
&lt;td&gt;Qwen3.5-9B / 8B coder&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;全层上卡，别 offload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工具调用/Agent&lt;/td&gt;
&lt;td&gt;Qwen3-8B / GLM-4-9B&lt;/td&gt;
&lt;td&gt;高精度&lt;/td&gt;
&lt;td&gt;别用 27B 低量化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多模态&lt;/td&gt;
&lt;td&gt;35B-A3B + mmproj&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--mmproj&lt;/code&gt; 加视觉文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;笔记本&lt;/td&gt;
&lt;td&gt;9B 稠密&lt;/td&gt;
&lt;td&gt;高精度&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ctx-size 32768&lt;/code&gt;，&lt;code&gt;n-cpu-moe 35&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;三条铁律&lt;/strong&gt;：
1. &lt;strong&gt;8G 跑大模型，&lt;code&gt;--n-cpu-moe&lt;/code&gt; 和 &lt;code&gt;-fit off&lt;/code&gt; 比模型本身更重要&lt;/strong&gt;，显存控制在 6.5-7.2G 的甜点区；
2. &lt;strong&gt;能跑 ≠ 好用&lt;/strong&gt;，Agent 场景的瓶颈是 prefill，不是生成速度；
3. &lt;strong&gt;别为了"跑大模型"硬上低量化&lt;/strong&gt;，尤其工具调用场景，小模型满精度往往更实用。&lt;/p&gt;
&lt;p&gt;8G 不是废物，它会让你清楚地看到显存、带宽、量化三者之间的取舍。折腾它，你能学会所有该学的；指望它，你会失望。理性折腾，量力而行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考来源&lt;/h2&gt;
&lt;p&gt;本文全部实测数据来自抡锤者（lcz.me）论坛会员的真实分享，原帖均可点击核对完整配置与测法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/262/262/8g显存-篇-rtx3070-8g显存-成功跑-qwen3.6-35b-多模态ai大模型"&gt;8G显存 篇。RTX3070 8G显存。成功跑 Qwen3.6-35B 多模态AI大模型&lt;/a&gt; — https://lcz.me/topic/262/262/8g显存-篇-rtx3070-8g显存-成功跑-qwen3.6-35b-多模态ai大模型（TID:262）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/342/342/rtx-2060-super-8g-部署-qwen3.6-35b-a3b-极限参数定稿报告"&gt;RTX 2060 Super 8G 部署 Qwen3.6-35B-A3B 极限参数定稿报告&lt;/a&gt; — https://lcz.me/topic/342/342/rtx-2060-super-8g-部署-qwen3.6-35b-a3b-极限参数定稿报告（TID:342，极限调参四阶段）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/213/213/rtx4060-8g显存-运行qwen3.6-35b-a3b-apex-mtp包含两种方式及测试结果"&gt;【RTX4060】【8G显存】运行Qwen3.6 35B A3B APEX-MTP包含两种方式及测试结果&lt;/a&gt; — https://lcz.me/topic/213/213/rtx4060-8g显存-运行qwen3.6-35b-a3b-apex-mtp包含两种方式及测试结果（TID:213，台式机 vs USB4 笔记本、n-cpu-moe 调优）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1080/1080/开源个安装包qwen3.6-35b-塞进了-8gb-显存笔记本-128k-多模态-thinking-一键安装还能接本地-agent"&gt;开源个安装包Qwen3.6 35B 塞进了 8GB 显存笔记本：128K、多模态、Thinking，一键安装还能接本地 Agent&lt;/a&gt; — https://lcz.me/topic/1080/1080/开源个安装包qwen3.6-35b-塞进了-8gb-显存笔记本-128k-多模态-thinking-一键安装还能接本地-agent（TID:1080）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1066/1066/请教-对于7900xtx-24g和4070-8g这类小显存显卡-进行工具调用的模型有什么评分之类的信息出处供参考么"&gt;【请教】对于7900xtx-24G和4070-8G这类小显存显卡，进行工具调用的模型有什么评分之类的信息出处供参考么？&lt;/a&gt; — https://lcz.me/topic/1066/1066/请教-对于7900xtx-24g和4070-8g这类小显存显卡-进行工具调用的模型有什么评分之类的信息出处供参考么（TID:1066，8G 工具调用模型建议）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1092/1092/雙2060-12g-加-2070-8g-llama.cpp-with-ornith-1.0-35b-heretic-mtp-apex-i-quality"&gt;雙2060 12G 加 2070 8G llama.cpp with Ornith-1.0-35B-Heretic-MTP-APEX-I-Quality&lt;/a&gt; — https://lcz.me/topic/1092/1092/雙2060-12g-加-2070-8g-llama.cpp-with-ornith-1.0-35b-heretic-mtp-apex-i-quality（TID:1092，异构多卡）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/151/151/分享自己的經驗-7900-xtx-本地-llm-優化實測報告-qwen3.6-27b"&gt;分享自己的經驗 # 7900 XTX 本地 LLM 優化實測報告（Qwen3.6-27B）&lt;/a&gt; — https://lcz.me/topic/151/151/分享自己的經驗-7900-xtx-本地-llm-優化實測報告-qwen3.6-27b（TID:151，雷电 3 vs OCuLink vs 原生 PCIe 实测阶梯）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1345/1345/r9700-qwen3.8-27b-128k-mtp-q4-q6-都折腾了一遍"&gt;R9700 + Qwen3.8-27B：128K、MTP、Q4/Q6 都折腾了一遍&lt;/a&gt; — https://lcz.me/topic/1345/1345/r9700-qwen3.8-27b-128k-mtp-q4-q6-都折腾了一遍（TID:1345，OCuLink 实测与带宽讨论）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1010/1010/strix-halo本地部署-deepseek-v4-flash-環境-失效-可行與技術總結"&gt;Strix Halo本地部署 DeepSeek V4 Flash — 環境、失效、可行與技術總結&lt;/a&gt; — https://lcz.me/topic/1010/1010/strix-halo本地部署-deepseek-v4-flash-環境-失效-可行與技術總結（TID:1010，Blackwell + USB4 + Linux CUDA 兼容性问题）&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="8G显存"/><category term="本地模型"/><category term="量化"/><category term="llama.cpp"/><category term="MoE"/><category term="Qwen"/><category term="n-cpu-moe"/><category term="RTX3070"/><category term="RTX4060"/><category term="RTX2060"/><category term="理性对比"/></entry><entry><title>翻出一张2014年春天的课表</title><link href="https://blog.cycleuser.org/fan-chu-yi-zhang-2014nian-chun-tian-de-ke-biao.html" rel="alternate"/><published>2026-09-18T15:00:00+08:00</published><updated>2026-09-18T15:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-18:/fan-chu-yi-zhang-2014nian-chun-tian-de-ke-biao.html</id><summary type="html">&lt;p&gt;整理旧文件，翻出来一张2014年春季的课表。&lt;/p&gt;
&lt;p&gt;那会儿按学制算，我应该还在研二，但实际上已经在准备直博了。读的是地球科学的博士，可课表 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;整理旧文件，翻出来一张2014年春季的课表。&lt;/p&gt;
&lt;p&gt;那会儿按学制算，我应该还在研二，但实际上已经在准备直博了。读的是地球科学的博士，可课表上选了一堆跟计算机沾边的课。现在回头看，这些课里真正影响我后来做事方式的，反而是当时觉得最"不务正业"的那几门。&lt;/p&gt;
&lt;p&gt;先看课表。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;星期一&lt;/th&gt;
&lt;th&gt;星期二&lt;/th&gt;
&lt;th&gt;星期三&lt;/th&gt;
&lt;th&gt;星期四&lt;/th&gt;
&lt;th&gt;星期五&lt;/th&gt;
&lt;th&gt;星期六&lt;/th&gt;
&lt;th&gt;星期日&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1-2节&lt;/td&gt;
&lt;td&gt;矿床地球化学(1-6) 综合楼101&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;显微构造(11-14) 科-413&lt;/td&gt;
&lt;td&gt;单片机原理与应用(3-10) 杜刚 科-208&lt;/td&gt;
&lt;td&gt;显微构造(11-14) 科-413&lt;/td&gt;
&lt;td&gt;岩石地球化学(4-5,8-9) 综-702&lt;/td&gt;
&lt;td&gt;岩石地球化学(4-5,8-9) 综-702&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-4节&lt;/td&gt;
&lt;td&gt;矿床地球化学(1-6) 综合楼101&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;单片机原理与应用(3-10) 杜刚 科-208&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-6节&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;专业英语(1-10) 综合楼101&lt;/td&gt;
&lt;td&gt;Unix程序设计(1-8) 周长兵 科-415&lt;/td&gt;
&lt;td&gt;矿床地球化学(1-6) 综合楼101&lt;/td&gt;
&lt;td&gt;自然辩证法(1-4)&lt;/td&gt;
&lt;td&gt;岩浆及岩浆热液矿床学(1-5,8-9) 综-701&lt;/td&gt;
&lt;td&gt;岩浆及岩浆热液矿床学(1-5,8-9) 综-701&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7-8节&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Unix程序设计(1-8) 周长兵 科-415&lt;/td&gt;
&lt;td&gt;数字图像处理(9-17) 严红平 科-404&lt;/td&gt;
&lt;td&gt;自然辩证法(1-4)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;专业课那一列，矿床地球化学、显微构造、岩石地球化学、岩浆及岩浆热液矿床学，还有专业英语和自然辩证法，都是本分。真正有意思的是另外三门：单片机原理与应用、Unix 程序设计、数字图像处理。&lt;/p&gt;
&lt;p&gt;一个地球科学的博士，跑去学单片机和 Unix，放在今天看也不算常规。但我现在很庆幸当时选了。单片机那门课讲硬件底层的访问控制，Unix 那门课讲内存管理，这些概念后来一直跟着我，看什么都用得上。很多时候，你觉得自己在学一个"用不上的东西"，其实只是还没到用它的场景。&lt;/p&gt;
&lt;p&gt;Unix 那门课，其实主要讲的是 BSD。具体内容我印象已经不深了，但那门课之后，我用 BSD 明显更多了，尤其喜欢 FreeBSD，觉得它可靠性很好。在这之前，我承认自己容易被社会上的一些文章带偏。比如当年有人写文章说"完全用 Linux 工作"，讲得很有感染力，很多人信了，包括我。后来这位作者自己也修正了那个观点。&lt;/p&gt;
&lt;p&gt;学完这门课我才真正想明白：不同的场景要用不同的工具。有的事像跑车，追求速度；有的事像卡车，要的是载重；有的事像客车，得装下一车人；还有的事得靠越野车，路烂也能走。赛道上跑车最快，但这不代表所有场景都该开跑车。工具没有绝对的好坏，只有合不合适。&lt;/p&gt;
&lt;p&gt;前几天，我的一个学生去了某顶级名校旁听了一次他们研究生的课程，就发现对比他们和我们本科班的上课氛围，有明显不同。&lt;/p&gt;
&lt;p&gt;他们那边，下课前几分钟，几乎没什么人急着收拾东西走人，大多还在做题、听讲、翻书。我们这边本科生上课可能都提前三五分钟就要为下课做准备收拾书和包了。我猜原因有几层：一是他们那所名校的研究生无论是保送还是考研上来的，可能本身就比较拼，绩点、直博、毕业，样样都要争；二是可能好奇心确实更强一些。另外，这类学校的课，老师一般也不太需要花力气去强调课堂纪律，大家心里有数。&lt;/p&gt;
&lt;p&gt;我就想起来我当年听江老师的地球物理课。&lt;/p&gt;
&lt;p&gt;他讲地壳地幔的密度均衡的部分，那时候相关的几篇文章我们好几个人都看过。他当时做的是两段均衡，结果方程配不平，图画不出来。课上他就直接说，这个算不出来了，大家有什么办法？我们四五个人就轮流上去，把自己的思路写一部分在黑板上。后来发现，大家看的是同一篇文章，关注的点却各不相同。我当时提的是，地壳的均衡过程可能需要三种密度端元才能配平。现在看，那模型其实很粗糙，但我很怀念那种上课的状态。&lt;/p&gt;
&lt;p&gt;后来越来越觉得，高水平的教育，不太可能是几分钟一个知识点、几分钟一个总结、几分钟一个思想、几分钟一个活动。那是中小学的路子，不是面向成年人的高等教育。大学生、研究生，不该被当成小学生那样一板一眼地教。这既不太符合教育规律，也不太符合人认知事物的基本方式。&lt;/p&gt;
&lt;p&gt;当然，也能理解，有的地方就是习惯这种形式化的东西。因为形式化的东西好留痕，好交差，看着也整齐。只是整齐和有效，有时候是两回事。&lt;/p&gt;
&lt;p&gt;说到这儿，想起一句话，以前老听一些坏人引用，叫"存在即合理"。&lt;/p&gt;
&lt;p&gt;后来查了原文，请教了人家外语专业的才知道，这句话的本意，大概是指现实中的东西有其合乎理性的根据，合乎理性的东西才会在现实中有所对应。它本身不涉及好坏的价值判断，只是一种描述。可传着传着，就被简化成了"凡存在的就是合理的"，然后拿去为各种既定的东西背书——尤其是那些陈旧、落后、本该改一改的东西。这中间的意思，其实已经偏了很远。&lt;/p&gt;
&lt;p&gt;十多年过去了，再看这张课表，我想起来的是另一件事：那时候在课堂上，学生是可以发表自己想法的，是可以对老师讲的东西提出不同意见的，并且有机会把这些意见讲出来、一起查证、各自列参考文献。这种事，当年是存在的。我相信现在的一些高校里，依然还是这样。&lt;/p&gt;
&lt;p&gt;当年的一些同学，跟我一样，也都陆续站上了讲台。&lt;/p&gt;
&lt;p&gt;前几天我们一个同学提到某顶级名校的一位教师，说看着像四五十岁，结果一问比我还小，还不到四十，但人家已经是教授、博导了，非常优秀。&lt;/p&gt;
&lt;p&gt;不过听说，同学们跟他沟通的体验，好像算不上特别好。这其实也正常，人各有各的风格，年轻有为的人往往也有自己的脾气。&lt;/p&gt;
&lt;p&gt;我跟自己带的学生说过：咱们沟通方式比较平和，比较扁平，大家是以一种接近平等的姿态在交流。研究生阶段，本来就该是这样。&lt;/p&gt;
&lt;p&gt;我不知道从什么时候开始，师生关系在一些地方慢慢变成了上下级。据传，有的地方甚至还有师兄师姐组织大家凑钱，给老师买教师节礼物。这种事我听着总觉得不太舒服。师生之间，本来不该是这个样子。&lt;/p&gt;
&lt;p&gt;写这些，不是想说过去一定就很好，而是每个时代有每个时代的问题，无意厚古薄今，有些东西值得保留：课堂上允许不同的声音，师生之间能平等地讨论，对现状保留一点追问的勇气。&lt;/p&gt;
&lt;p&gt;凡是希望大家安于现状、不要再做任何改进的说法，我现在都会多想一想。这不代表要否定一切，而是说，当"存在即合理"被拿来回应所有改进的诉求时，它多半已经不是在讲它本来的意思了。&lt;/p&gt;</content><category term="随笔"/><category term="课表"/><category term="大学"/><category term="教育"/><category term="研究生"/><category term="师生关系"/><category term="随笔"/></entry><entry><title>给大一同学：Python 与数学建模学习资源指南</title><link href="https://blog.cycleuser.org/gei-da-yi-tong-xue-python-yu-shu-xue-jian-mo-xue-xi-zi-yuan-zhi-nan.html" rel="alternate"/><published>2026-09-18T13:30:00+08:00</published><updated>2026-09-18T13:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-18:/gei-da-yi-tong-xue-python-yu-shu-xue-jian-mo-xue-xi-zi-yuan-zhi-nan.html</id><summary type="html">&lt;p&gt;每年开学，都有大一同学来问：想学编程、想搞数学建模，该从哪儿开始，看什么。&lt;/p&gt;
&lt;p&gt;网上资源多是多，但太散。这个教程说要从 C 语 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;每年开学，都有大一同学来问：想学编程、想搞数学建模，该从哪儿开始，看什么。&lt;/p&gt;
&lt;p&gt;网上资源多是多，但太散。这个教程说要从 C 语言开始，那个视频说直接上机器学习，看一圈下来反而更懵。&lt;/p&gt;
&lt;p&gt;我这些年自己也教过不少学生，陆陆续续写过一批相关的东西，干脆按学习顺序整理成一份指南，专门给刚入学的同学用。&lt;/p&gt;
&lt;p&gt;下面这些链接，都是我公众号上发过的文章，点进去就能看。我没有把网上所有好资源都塞进来，只挑了自己看过、用过、觉得靠谱的。顺序上建议从头往后走，跳着看容易卡壳。&lt;/p&gt;
&lt;h2&gt;一、先把环境搭起来&lt;/h2&gt;
&lt;p&gt;学 Python 第一件事不是写代码，是装环境。这一步劝退的人比语法本身多，先把地基打好。&lt;/p&gt;
&lt;p&gt;Windows 用户照着这篇做就行，从 USTC 镜像下载，装到固定路径，配好镜像源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566952&amp;amp;idx=1&amp;amp;sn=6434e83d1ba6383acd83de7a80d746d5&amp;amp;chksm=8fe85f64b89fd672ba8c440c16007a95c89953b6d327102528ce73501eebf6df8853e07c6601#rd"&gt;Windows 系统下从中科大 USTC 镜像安装 Miniconda3 完整指南&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;装完之后，建议顺手把「路径」这个概念搞明白。以后报的各种「找不到命令」「模块导入失败」，八成都是路径问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566937&amp;amp;idx=1&amp;amp;sn=fe54c637cb0aee3ac949a418526817c4&amp;amp;chksm=8fe85f55b89fd6435e3d7cd91d110d28901fc1f15b455ed4c1d781fd54e8557db81a844f0081#rd"&gt;简单讲一下路径&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563706&amp;amp;idx=1&amp;amp;sn=c40b5c21396ef42ba39795c5cfa3a304&amp;amp;chksm=8fe84a36b89fc32005a91a551b800588bcb8a7d87282ac285e83ad2da1ed715e2fa679051031#rd"&gt;打造绿色便携 Python：初步理解嵌入式 Python 与路径机制&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;二、Python 基础&lt;/h2&gt;
&lt;p&gt;环境好了，按这个顺序看。这四篇篇幅都不长，但把关键点讲到了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563765&amp;amp;idx=1&amp;amp;sn=4f400394f7691783a062b70834086163&amp;amp;chksm=8fe84af9b89fc3ef82df30888a981b636a65282162e8ad5b0b8e6d66f455fba9cddb2fbea3fa#rd"&gt;Python 基础语法5分钟入门&lt;/a&gt; —— 数据类型、容器、索引切片、条件循环、函数、异常，一篇过一遍。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563893&amp;amp;idx=1&amp;amp;sn=8c2698f24d7532dc97b8ddeb0120f144&amp;amp;chksm=8fe84b79b89fc26fed1fc7d4bc4ecd90d1a6c31d7e2688d85c956d4fbf8467e80c13a3801f85#rd"&gt;面向对象编程入门：用武侠角色理解 Python 中的“类”&lt;/a&gt; —— 用武侠角色打比方，把类、实例、继承讲明白。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565691&amp;amp;idx=1&amp;amp;sn=5cd44109e7b52a488bc8c0467f207f68&amp;amp;chksm=8fe84277b89fcb613dccba2501757a1a37614afba764aa3ab0c3c30e062183a945b35e7dd244#rd"&gt;简单说说Python里面的「函数是第一公民（First-Class Citizen）」&lt;/a&gt; —— 理解 Python 的函数为什么特殊，后面学装饰器、回调都靠它。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563714&amp;amp;idx=1&amp;amp;sn=87639d33575afd794f80721cba40fa87&amp;amp;chksm=8fe84aceb89fc3d88c0b771d0ee8c61c3fc8527f76822f708150a0f96df2c8746d76b66ee6e9#rd"&gt;单一职责原则：写好Python函数的第一步&lt;/a&gt; —— 不是语法，是习惯。早点养成，代码质量差很多。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一阶段的目标很具体：能自己写脚本处理文件、批量改文件名、读一份 Excel 或 CSV 做点统计。做得到，基础就算过关了。&lt;/p&gt;
&lt;h2&gt;三、数学与科学计算基础&lt;/h2&gt;
&lt;p&gt;写代码只是工具，真做建模和数据分析，数学底子决定你能走多远。这几篇不要求你数学多好，但帮你把计算机里的数字、统计和常见概念搞清楚。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566194&amp;amp;idx=1&amp;amp;sn=b167d2fc44e4e1264d2097bcb2cce85d&amp;amp;chksm=8fe8407eb89fc968b26f43d14fdd05878b5cf18593e9e66ecf266160bcec1a27258313aa7022#rd"&gt;基础知识：初级统计概念的简单介绍&lt;/a&gt; —— 均值、方差、分布这些，用最直白的话讲一遍。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565449&amp;amp;idx=1&amp;amp;sn=b576f3c0cb514eafc4e0ac3a1661119e&amp;amp;chksm=8fe84505b89fcc13575efbbcf2c2221133c7cf32482174f8c682ff014eceb3d5705fa4eb2791#rd"&gt;单精度浮点数的“分辨率”：为什么在计算机里 1000 万和 1000 万加 0.01 可能是一样的？&lt;/a&gt; —— 为什么算出来的数会「不准」，这篇讲得最清楚。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566231&amp;amp;idx=1&amp;amp;sn=bbdadfe77824134e89b91693090b346a&amp;amp;chksm=8fe8401bb89fc90d8f57727409a329e42daba9a6592d531d2bca615e875d1003c0ef36ab20f3#rd"&gt;你的电脑每秒能做多少次浮点运算？——FLOPS 的故事&lt;/a&gt; —— 算力到底怎么衡量。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566252&amp;amp;idx=1&amp;amp;sn=3cba6b062c739fd13cfcd967faff32c9&amp;amp;chksm=8fe84020b89fc93641d9d07004650cc05871bc7bf3ea11ff41baad14c8b67aafa4cd428522f7#rd"&gt;只测 FLOPS 还不够——四个经典 CPU 测试基准&lt;/a&gt; —— 接着上一篇，讲讲实际性能怎么测。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564731&amp;amp;idx=1&amp;amp;sn=b285f724e2bbcb6a5f720cb5c8b08b0e&amp;amp;chksm=8fe84637b89fcf21b17059fe927d15678639ceb4ac907e5f9b9e0014c29406af61ece7c026c3#rd"&gt;基础概念-拉普拉斯算子（排版修复版本）&lt;/a&gt; —— 一个在物理、图像、微分方程里到处出现的算子。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566662&amp;amp;idx=1&amp;amp;sn=b83141b43bc7c0f0267defe8238d7f2d&amp;amp;scene=124"&gt;一维查找方法综述：从三分、黄金分割到 Fibonacci 与 Brent&lt;/a&gt; —— 优化的入门，怎么用最少的次数找到你要的值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;四、数值方法：积分与滤波&lt;/h2&gt;
&lt;p&gt;这部分开始上强度了。建议不要只看，把代码敲一遍，改改参数看看结果怎么变。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;积分和求根&lt;/strong&gt;，从最简单的梯形法一路到自适应方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563774&amp;amp;idx=1&amp;amp;sn=9a4cce7f602702656358918b3e3aec24&amp;amp;chksm=8fe84af2b89fc3e4bba7fe9f213d15f3f7720815b1fe4293c8a54cc68165a1a47d3a59062acb#rd"&gt;数值积分漫谈：如何让用Python求积分？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563730&amp;amp;idx=1&amp;amp;sn=9f55db8edb7079bd845058a4834323aa&amp;amp;chksm=8fe84adeb89fc3c8e1f187f1388d0d5d13c76f5fdf7ef70797a87b7f52e8078c7550d431ea00#rd"&gt;梯形法求积分的Python实现&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563725&amp;amp;idx=1&amp;amp;sn=f0cd4e34e9be92a3e24b8489b8d2531c&amp;amp;chksm=8fe84ac1b89fc3d7f856d8366a6f22abdb7b2c4bea5c89a0f134d2f0430af9a507a56ca22196#rd"&gt;牛顿法求解过程的Python实现及其详解&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563753&amp;amp;idx=1&amp;amp;sn=81c7f135f898017f459f116aeb09f1bd&amp;amp;chksm=8fe84ae5b89fc3f312cc81b6aebf7a9e18d79d5e73d624b6476baa70d9964910d891e0c7b51e#rd"&gt;借助Python来理解自适应辛普森积分：原理、实现与动态可视化&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;滤波&lt;/strong&gt;，做传感器、导航、信号处理、时间序列预测都用得上，也是数学建模里很实用的一块。这篇把从移动平均到粒子滤波的几类方法串了一遍：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566500&amp;amp;idx=1&amp;amp;sn=d86e27d6e49658209b1e2f1d55de5f81&amp;amp;chksm=8fe84128b89fc83e821bedc43d5543dd3f355d03fbd12286d1ca25fa6238471e790b273c47b5#rd"&gt;滤波方法：从移动平均到粒子滤波&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;五、数学建模实战&lt;/h2&gt;
&lt;p&gt;这是一个完整的系列，从零讲怎么把一个现实问题变成数学模型，再用 Python 跑出来、画出来。强烈建议跟着做一遍，哪怕只是照抄代码再改改参数。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564850&amp;amp;idx=1&amp;amp;sn=3fc40bfa31b23d07484f4dd7935d99f6&amp;amp;chksm=8fe846beb89fcfa8f637690507fbbdc1e4d988e777cc9a434f9e228b7f8596a3e568d83107a4#rd"&gt;数学建模与Python：探索世界的数字钥匙&lt;/a&gt; —— 总纲，先看这篇。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564976&amp;amp;idx=1&amp;amp;sn=7500383a6639a345cfc87d74a28105ef&amp;amp;chksm=8fe8473cb89fce2a1dc9a54d53ee8b55b58c52ac17a7fad048a6d1049e57ec0ccf128c7fc10a#rd"&gt;数学建模与Python：高空坠落的硬币传说&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564977&amp;amp;idx=1&amp;amp;sn=62d05de397a7a0f4cdd86580e65dae83&amp;amp;chksm=8fe8473db89fce2b28ac0b41c8571d6e75d153a5ec2933bede4e442a9029524500f1f6409f21#rd"&gt;数学建模与Python：共享单车系统建模-从简单模拟到参数优化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564978&amp;amp;idx=1&amp;amp;sn=5bcb66493aca463df07d021a73acfad9&amp;amp;chksm=8fe8473eb89fce28b9c6bead2125bded190da57a4cb72e036cf715b808eb268bec57d63388db#rd"&gt;数学建模与Python：天体运行模型-从日地月到三体系统的模拟&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564979&amp;amp;idx=1&amp;amp;sn=266898daff24c85f36b2f70ecb147891&amp;amp;chksm=8fe8473fb89fce29c7699cb785b64179beb10af343866cdf8a490567efc6df183bd4025f5186#rd"&gt;数学建模与Python：能量模拟-从分子运动到宏观热力学&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565048&amp;amp;idx=1&amp;amp;sn=d934a2f74aa8062d62cab554338d8af5&amp;amp;chksm=8fe847f4b89fcee21643a9e64a9bb45107caf7bd7743a6a1eee01c7a625b0169e5fda32189f0#rd"&gt;数学建模与Python：图灵的形态发生模型-从均匀到有序&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565049&amp;amp;idx=1&amp;amp;sn=609d2e47174f82a56a3ff46dfefae0e0&amp;amp;chksm=8fe847f5b89fcee31002bbce80f34ba5174afc807264033fc38fb765dc694a8b2cb22b941a10#rd"&gt;数学建模与Python：沙堆崩塌模型-自组织临界性&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565078&amp;amp;idx=1&amp;amp;sn=08e1764dc8fb0a274ee9c7fbd7311b65&amp;amp;chksm=8fe8479ab89fce8c96f689766a7265721f65bd44937295b70ca089191c209d6c3d90a294d7f5#rd"&gt;数学建模与Python：传染病模型与森林火灾-从空间传播到自组织临界性&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;学完这些，建议去参加一次数学建模竞赛。校赛、国赛、美赛都行，重点是逼自己完整走一遍「读题—建模—编程—写论文」的流程，这个经验比多看十篇文章都值。&lt;/p&gt;
&lt;h2&gt;六、科研与论文（提前准备）&lt;/h2&gt;
&lt;p&gt;大一就开始准备不早。等你要写课程论文、大创、竞赛论文的时候，这些能救命。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563778&amp;amp;idx=1&amp;amp;sn=ea017a308f1b660b339d0325b5256a10&amp;amp;scene=124"&gt;新手向的 Markdown 数学公式指南&lt;/a&gt; —— 先把公式怎么写学会。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563879&amp;amp;idx=1&amp;amp;sn=318c687f078a9a965682e122520c4771&amp;amp;scene=124"&gt;学术论文中常见研究方法综述及简单举例&lt;/a&gt; —— 知道论文里那些方法都是干嘛的。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563694&amp;amp;idx=1&amp;amp;sn=0d7c77e2957f10fca7e1f6e781d6620f&amp;amp;scene=124"&gt;学术研究支持工具分类与文献获取方法&lt;/a&gt; —— 文献去哪儿找、怎么管。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564711&amp;amp;idx=1&amp;amp;sn=1e5e1f833b2f730296a18980ededdd3b&amp;amp;chksm=8fe8462bb89fcf3dd6f58425d3c9a7bcea0f37ab376136008f21a36ee275919a94b0e451ca33#rd"&gt;《给研究生的一些建议》（本人翻译版本）&lt;/a&gt; —— 虽然是给研究生的，大一看了能少走很多弯路。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566508&amp;amp;idx=1&amp;amp;sn=784c1d744a0d19664d1e9661f6381ba2&amp;amp;chksm=8fe84120b89fc836787903a7717b5b14fc5ac505617956b6a189202e39b53ece7d5f1ca6d2b3#rd"&gt;高校教师建议大一新生养成阅读论文的习惯&lt;/a&gt; —— 为什么、怎么读论文。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566557&amp;amp;idx=1&amp;amp;sn=92442ce96a28525c9795c7cbdf8a3258&amp;amp;chksm=8fe841d1b89fc8c73468b49c613b2a52ac48b0fdff7b7b88fce50bf3553d7722a4d9f795a671#rd"&gt;计算机相关专业学生的自学指南：从教材到实践的全新学习路径&lt;/a&gt; —— 想系统自学计算机的看这篇。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你对 AI 方向感兴趣，可以顺着这两篇往下走：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563952&amp;amp;idx=1&amp;amp;sn=8203e9be15c66433e4e1a70b3ed363f6&amp;amp;chksm=8fe84b3cb89fc22a10e4872d02553dad04f53df7fae2ba2e84bc525334d37be81e243ff4ab6e#rd"&gt;对ReLU、GELU、SwiGLU的Python实现和可视化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564463&amp;amp;idx=1&amp;amp;sn=226f1faa22093c471ef054ce91b83746&amp;amp;scene=124"&gt;大语言模型的底层-数值标准化&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;七、边学边用的工具&lt;/h2&gt;
&lt;p&gt;下面这些工具都是我用 Python 写的，源码不复杂，可以拿来当练手项目读，也可以直接拿来用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564955&amp;amp;idx=1&amp;amp;sn=bebd98d64a638b6dfcd223a81c1a2ca6&amp;amp;scene=124"&gt;Chou（瞅）——一个Python小工具，让你的论文PDF文件名不再是乱码&lt;/a&gt; —— 论文党必备。&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564937&amp;amp;idx=1&amp;amp;sn=11d2b565b53cf79ba9ed341f3fa41924&amp;amp;scene=124"&gt;NuoYi 挪移-一个离线的 PDF/DOCX 转 Markdown 工具&lt;/a&gt; —— 把 PDF 资料变成能编辑的文本。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564919&amp;amp;idx=1&amp;amp;sn=09b660bf7145edbae2670e579b5fc0c0&amp;amp;chksm=8fe8477bb89fce6d00c6b843009384f3ceda48f14d54a87acf1ad9c31c0680112d9de62200d0#rd"&gt;Huan-一个把网页转换成 Markdown的Python 小工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565684&amp;amp;idx=1&amp;amp;sn=fe46cefba99aad217abd36e9ae6d1daa&amp;amp;chksm=8fe84278b89fcb6e03f8183c5451719b1bd04eff55ac849b8b121f34a9ad7fe0358b9178afc4#rd"&gt;HeiBan（黑板）-将Markdown转换成HTML来当讲义&lt;/a&gt; —— 做讲义、做汇报很好用。&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565552&amp;amp;idx=1&amp;amp;sn=7f33dbb603d891a8d3656455dbdecf38&amp;amp;chksm=8fe845fcb89fcceaa71c2de4f1c07a38f8929550417b5ba31db5a2532bb50dc333b34e78f470#rd"&gt;Xie（写）：把 Markdown 转成微信公众号格式网页的小工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=400098682&amp;amp;idx=1&amp;amp;sn=31555dd44fe5a6e124560046e1623025&amp;amp;chksm=05cd2b3632baa220ca704d6a8b51cf32ee57436488098d1c351027976c75bd06caf6fe2a045d#rd"&gt;推荐一款MarkDown的跨平台离线编辑器，支持随时预览&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;八、给大一的几条建议&lt;/h2&gt;
&lt;p&gt;最后说几条老登常谈。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;别只看视频。&lt;/strong&gt; 看的时候觉得都懂了，自己一写就卡壳，这是常态。看一段就自己敲一遍，改改参数、故意写错看看报什么错，比连看三小时视频有用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从项目出发。&lt;/strong&gt; 不要等「学完了」再动手，永远等不到那一天。找一个自己感兴趣的小题目，比如把班级成绩表处理一下、爬个天气数据画张图，边做边查，学得最快。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数学别丢。&lt;/strong&gt; 高数、线代、概率统计，这些课当时觉得没用，等你做建模、看论文、学机器学习的时候，全会回来找你。课上认真听，比以后补课省事得多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;参加一次数学建模竞赛。&lt;/strong&gt; 不管拿不拿奖，完整做一次的价值都很大。组队、分工、熬夜、写论文，这个过程本身就是训练。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;英语要跟上。&lt;/strong&gt; 最新的文档、论文、教程几乎都是英文的。不用一上来就啃原著，但至少要习惯看英文文档，别一见到英文就去找二手翻译。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;别怕报错。&lt;/strong&gt; 报错是常态，不是你笨。学会看报错的最后一行、学会搜索报错信息，这个能力比记住多少语法都重要。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;用好 AI 工具，但别依赖它。&lt;/strong&gt; 现在用 AI 辅助写代码、查资料确实方便，但基础得自己打。AI 给的代码你要看得懂、能改，否则出了问题完全没法排查。&lt;/p&gt;
&lt;h2&gt;九、外部资源&lt;/h2&gt;
&lt;p&gt;除了我写的这些，下面这些是我觉得值得收藏的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Python 官方文档：https://docs.python.org/zh-cn/3/ ，中文版，遇到问题先查它。&lt;/li&gt;
&lt;li&gt;《Think Python》原书：https://greenteapress.com/wp/think-python-2e/ ，免费。&lt;/li&gt;
&lt;li&gt;数据集平台：Kaggle（https://www.kaggle.com/datasets ）和 ModelScope（https://www.modelscope.cn/datasets ），练手用。&lt;/li&gt;
&lt;li&gt;数学建模竞赛：全国大学生数学建模竞赛官网 http://www.mcm.edu.cn/ ，先看历年题目。&lt;/li&gt;
&lt;li&gt;书：姜启源《数学模型》、司守奎《数学建模算法与应用》，图书馆一般都有。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;最后&lt;/h2&gt;
&lt;p&gt;大学四年，最不缺的是时间，最容易被浪费的也是时间。大一这一年如果能把 Python 和数学的基础打扎实，后面做项目、进实验室、参加竞赛、找实习，都会轻松很多。&lt;/p&gt;
&lt;p&gt;不用着急，也不用什么都学。照上面的顺序，一周啃一两篇，动手做，坚持一个学期，回头你会感谢现在的自己。&lt;/p&gt;
&lt;p&gt;有问题欢迎在公众号后台留言，我看到会回。&lt;/p&gt;</content><category term="Education"/><category term="Python"/><category term="数学建模"/><category term="大一"/><category term="学习资源"/><category term="自学指南"/><category term="数学"/></entry><entry><title>纯文本格式盘点：txt、dat、csv、json、jsonl、md 都是干嘛的</title><link href="https://blog.cycleuser.org/chun-wen-ben-ge-shi-pan-dian-txt-dat-csv-json-jsonl-md-du-shi-gan-ma-de.html" rel="alternate"/><published>2026-09-16T23:30:00+08:00</published><updated>2026-09-16T23:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-16:/chun-wen-ben-ge-shi-pan-dian-txt-dat-csv-json-jsonl-md-du-shi-gan-ma-de.html</id><summary type="html">&lt;p&gt;上一篇说了把文本打包成 ZIM 来省空间，顺手就想把"文本"这件事展开说说。&lt;/p&gt;
&lt;p&gt;这些年折腾数据，从地球化学的仪器导出，到爬虫 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;上一篇说了把文本打包成 ZIM 来省空间，顺手就想把"文本"这件事展开说说。&lt;/p&gt;
&lt;p&gt;这些年折腾数据，从地球化学的仪器导出，到爬虫抓回来的网页，再到给大模型准备的训练语料，几乎每天都跟各种纯文本格式打交道。什么 &lt;code&gt;.txt&lt;/code&gt;、&lt;code&gt;.dat&lt;/code&gt;、&lt;code&gt;.csv&lt;/code&gt;、&lt;code&gt;.json&lt;/code&gt;、&lt;code&gt;.jsonl&lt;/code&gt;、&lt;code&gt;.md&lt;/code&gt;，后缀五花八门，很多人是"知道有这个东西，但说不清它到底是啥、为什么存在、跟旁边那个有什么区别"。&lt;/p&gt;
&lt;p&gt;这篇文章就把常见的纯文本格式一个个过一遍：它是干嘛的，典型用在什么场景，优势劣势是什么，以及实际用的时候会踩的坑。&lt;/p&gt;
&lt;h2&gt;先说清楚，什么是"纯文本"&lt;/h2&gt;
&lt;p&gt;纯文本（plain text）就是&lt;strong&gt;一个字节序列，每个字节都对应着字符&lt;/strong&gt;，没有任何关于字体、颜色、加粗这类排版信息。你用记事本能打开、用 Vim 能打开、用 VS Code 能打开，看到的内容是一样的，这就是纯文本。&lt;/p&gt;
&lt;p&gt;跟它相对的是二进制格式：Word 的 &lt;code&gt;.docx&lt;/code&gt;、Excel 的 &lt;code&gt;.xlsx&lt;/code&gt;、照片的 &lt;code&gt;.jpg&lt;/code&gt;。这些用记事本打开就是一堆乱码，因为里面存的是压缩后的结构，不是字符。&lt;/p&gt;
&lt;p&gt;纯文本有两个特别容易被忽略的基础问题，几乎所有"打开是乱码"的事故都出在这。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一是编码。&lt;/strong&gt; 计算机里只有数字，字符要用数字来表示，这个对应关系就是编码。老祖宗是 ASCII，一个字节搞定 128 个英文字符；中文进来之后，国家搞了 GB2312、GBK，一个汉字两个字节；后来全世界统一到 UTF-8，英文一个字节、中文三个字节，兼容 ASCII，成为事实标准。&lt;/p&gt;
&lt;p&gt;乱码的根源基本都是一个：&lt;strong&gt;文件是一种编码写的，你用另一种编码去读&lt;/strong&gt;。最典型的就是 Windows 上老版本记事本，默认用本地编码（中文系统就是 GBK）保存，文件拿给 Mac 上默认 UTF-8 的编辑器一打开，就是"鏂囨湰鏍煎紡"这种天书。反过来，UTF-8 的文件用 GBK 去读，也是一锅粥。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二是换行。&lt;/strong&gt; Windows 用回车加换行（&lt;code&gt;\r\n&lt;/code&gt;，写作 CRLF），Linux 和 macOS 用换行（&lt;code&gt;\n&lt;/code&gt;，写作 LF），老款 Mac 用单独的回车（&lt;code&gt;\r&lt;/code&gt;，基本绝迹了）。同一个文件在两边倒腾，有时会出现"每行末尾多了个 &lt;code&gt;^M&lt;/code&gt;"或者"整个文件挤成一行"的怪象，就是这俩在打架。Git 配置里那个 &lt;code&gt;core.autocrlf&lt;/code&gt;，就是为了处理这个。&lt;/p&gt;
&lt;p&gt;后面讲每个格式的时候，这两个坑会反复出现，先记住。&lt;/p&gt;
&lt;h2&gt;txt：万能的口袋&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.txt&lt;/code&gt; 是最原始的格式，它的定义几乎等于"纯文本本身"：没有任何结构约定，就是一段字符。&lt;/p&gt;
&lt;p&gt;它的用途也就因此特别宽：写笔记、存日志、装语料、放配置、当程序之间交换数据的最简陋协议，都行。我手里那个相声文本库，最早就是 234 个 &lt;code&gt;.txt&lt;/code&gt; 文件，后来才打包成 ZIM 的。&lt;/p&gt;
&lt;p&gt;txt 的优势是&lt;strong&gt;极致的简单和通用&lt;/strong&gt;。任何设备、任何年代的系统都能打开它，五十年前的程序能读，五十年后的也能读。作为"给人看、给人存"的载体，它几乎不会出错。&lt;/p&gt;
&lt;p&gt;劣势是&lt;strong&gt;没有任何结构&lt;/strong&gt;。没有行列的概念，没有字段的区分，程序想从里面提取"第二列的分数"，就得自己写正则去抠。数据一有结构，txt 就不够用了。所以 txt 更像一张白纸，而后面这些格式，都是在这张纸上画了不同的格子。&lt;/p&gt;
&lt;h2&gt;dat：一个约定俗成的黑盒&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.dat&lt;/code&gt; 挺有意思，它是这堆格式里&lt;strong&gt;唯一没有标准的一个&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;data&lt;/code&gt; 的缩写，谁都可以用，所以它代表什么，完全取决于生成它的那个软件。可能是制表符分隔的表格，可能是逗号分隔，可能是自己发明的格式，甚至可能是二进制数据（比如很多仪器的原始数据、Windows 的某些缓存文件）混着叫 &lt;code&gt;.dat&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我早些年处理地球化学数据的时候，经常从仪器软件里导出 &lt;code&gt;.dat&lt;/code&gt; 文件，每次拿到一个新仪器的导出，第一件事就是用文本编辑器打开看一眼：是文本就好办，用 pandas &lt;code&gt;read_csv&lt;/code&gt; 配上正确的分隔符就能读；打不开或者满屏乱码，那就得找说明书，或者找厂家要格式说明。&lt;/p&gt;
&lt;p&gt;所以对 &lt;code&gt;.dat&lt;/code&gt; 的态度就是：&lt;strong&gt;别看后缀，先打开看内容&lt;/strong&gt;。它是文本还是二进制、用什么分隔符、有没有表头，都得靠眼睛确认。它的存在更多是一种历史习惯，而不是一种"格式"。&lt;/p&gt;
&lt;h2&gt;csv 和 tsv：表格的最低配&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.csv&lt;/code&gt;，Comma-Separated Values，逗号分隔值，是表格数据的最低配实现：第一行表头，往后每行一条记录，字段之间用逗号隔开。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;name,age,city
张三,30,北京
李四,25,上海
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;.tsv&lt;/code&gt; 是它的兄弟，Tab-Separated Values，用制表符分隔。制表符在正常文本里出现得少，所以 tsv 省去了转义的麻烦，但肉眼看起来没那么直观。&lt;/p&gt;
&lt;p&gt;csv 的优势很明显：&lt;strong&gt;表格数据的通用交换语言&lt;/strong&gt;。Excel、数据库、pandas、R、各种 BI 工具，全都认它。文本格式意味着版本控制能看 diff、任何语言都能解析、几十年的工具链都支持。&lt;/p&gt;
&lt;p&gt;但 csv 的坑，可能比它的优势还多，我一个个说。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一个坑，分隔符本身会出现在数据里。&lt;/strong&gt; 比如地址是"北京市,海淀区"，逗号一进去，程序就把一行读成两列了。标准解法是用引号把字段包起来，&lt;code&gt;"北京市,海淀区"&lt;/code&gt;；引号本身要转义成两个引号。这套规则写在 RFC 4180 里，但很多软件并不严格遵守，于是"能生成 csv 的软件"和"能正确读 csv 的软件"之间就出现了大量错位。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二个坑，Excel。&lt;/strong&gt; 用 Excel 打开 UTF-8 编码的 csv，中文经常是乱码，因为它默认不认 UTF-8，除非你带上 BOM（一个隐藏在文件开头的 &lt;code&gt;EF BB BF&lt;/code&gt; 三字节标记）。所以用 Python 写 csv 给 Excel 用户时，要特意用 &lt;code&gt;utf-8-sig&lt;/code&gt; 编码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;out.csv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8-sig&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Excel 还有更出名的毛病：打开 csv 时自作聪明做类型转换。基因名 &lt;code&gt;SEPT1&lt;/code&gt; 被它理解成 9 月 1 日，&lt;code&gt;MARCH1&lt;/code&gt; 变成 3 月 1 日；长数字（比如银行卡号、经纬度）被显示成科学计数法，再保存回去，末尾几位就永久变成 0 了。这不是段子，2016 年《Genome Biology》上有一篇论文就因为这个把五分之一的基因名写错了，后来人类基因组织（HGNC）干脆在 2020 年把二十多个带这类前缀的基因符号改了名，就为了躲开 Excel。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三个坑，它没有类型。&lt;/strong&gt; csv 里的一切都是字符串，&lt;code&gt;1.0&lt;/code&gt;、&lt;code&gt;01&lt;/code&gt;、&lt;code&gt;1e3&lt;/code&gt; 之间毫无区别，全靠读取方去猜。日期格式更是五花八门，&lt;code&gt;2026-09-16&lt;/code&gt;、&lt;code&gt;2026/9/16&lt;/code&gt;、&lt;code&gt;16-09-2026&lt;/code&gt; 都可能是"日期"，解析的时候得自己指定。&lt;/p&gt;
&lt;p&gt;所以我对 csv 的使用心得是：&lt;strong&gt;它是交换格式，不是存储格式&lt;/strong&gt;。中间文件、临时导出用它没问题；正经存数据，要么进数据库，要么用 Parquet 这类列式格式。&lt;/p&gt;
&lt;h2&gt;json：结构化数据的事实标准&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.json&lt;/code&gt;，JavaScript Object Notation，现在已经是跨语言的结构化数据交换标准，网页 API 返回数据、各种配置文件、NoSQL 数据库，几乎都用它。&lt;/p&gt;
&lt;p&gt;长这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;CycleUser&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;age&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;tags&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Python&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Geology&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;address&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Beijing&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;zip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;100083&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;quot;active&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;它只有六种数据类型：字符串、数字、布尔、null、数组（&lt;code&gt;[]&lt;/code&gt;）、对象（&lt;code&gt;{}&lt;/code&gt;，键值对）。靠数组和对象的嵌套，能表达任意复杂的结构。&lt;/p&gt;
&lt;p&gt;json 的优势是&lt;strong&gt;结构明确、机器友好&lt;/strong&gt;。相比 csv，它天然支持嵌套（一个对象里套对象、套数组）、字段名就是键、类型信息由语法直接表达（带引号的是字符串，不带的可以当数字）。Python 里 &lt;code&gt;json.loads()&lt;/code&gt; 一下就变成字典和列表，配合使用毫无障碍。&lt;/p&gt;
&lt;p&gt;劣势主要有三个，都挺扎心。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不支持注释。&lt;/strong&gt; 给配置文件写 json，想加一行"这个参数是干嘛的"，没门。这是它作为配置格式被后来者（yaml、toml）赶超的核心原因。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不允许尾逗号。&lt;/strong&gt; &lt;code&gt;{"a": 1, "b": 2,}&lt;/code&gt; 这种写法，在 Python 的字典字面量里合法，在 json 里是语法错误。手写 json 的时候特别容易中招。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大数精度问题。&lt;/strong&gt; json 的数字按浮点数处理，JavaScript 里超过 2^53 - 1（900719919254740991 之后）的整数就会丢精度。订单号、雪花 ID 这种长数字，经过一次 JS 处理可能就变了。所以很多 API 干脆把大整数序列化成字符串来传。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;

&lt;span class="c1"&gt;# 标准库足够日常使用&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;quot;name&amp;quot;: &amp;quot;张三&amp;quot;, &amp;quot;scores&amp;quot;: [89, 73]}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;scores&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;        &lt;span class="c1"&gt;# 89&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ensure_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;中文用户还要注意 &lt;code&gt;ensure_ascii=False&lt;/code&gt; 这个参数，不加的话中文会被转成 &lt;code&gt;\u5f20\u4e09&lt;/code&gt; 这种转义，文件大小翻好几倍，虽然合法但没法看。&lt;/p&gt;
&lt;h2&gt;jsonl：一行一条，为流式而生&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.jsonl&lt;/code&gt;，JSON Lines，有时也叫 &lt;code&gt;.ndjson&lt;/code&gt;，就是把很多个 json 对象&lt;strong&gt;一行一个&lt;/strong&gt;地排进同一个文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{&amp;quot;name&amp;quot;: &amp;quot;张三&amp;quot;, &amp;quot;score&amp;quot;: 89}
{&amp;quot;name&amp;quot;: &amp;quot;李四&amp;quot;, &amp;quot;score&amp;quot;: 73}
{&amp;quot;name&amp;quot;: &amp;quot;王五&amp;quot;, &amp;quot;score&amp;quot;: 91}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;它和"一个巨大的 json 数组"的区别，初看不大，用起来天差地别。&lt;/p&gt;
&lt;p&gt;一个装着一百万条记录的 json 数组，程序必须&lt;strong&gt;整个读进内存、从头解析到尾&lt;/strong&gt;，中间任何一行坏了，整个文件都废了。而 jsonl 是一行一条独立记录，可以&lt;strong&gt;逐行读、逐行解析&lt;/strong&gt;：读一行处理一行，内存占用几乎恒定；第 800 万行坏了，跳过它接着读，前面 799 万行完好无损。&lt;/p&gt;
&lt;p&gt;典型场景：日志系统、大模型训练数据的存放。你去看 Hugging Face 上很多数据集、看各家微调框架的输入格式，基本就是 jsonl：一行一条对话或一条样本。逐行处理意味着可以流式喂给训练管线，内存里永远只有当前这一条。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data.jsonl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSONDecodeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;第 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 行解析失败，跳过&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="c1"&gt;# 处理 record&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;劣势就是它放弃了"一整个结构"的表达能力：顶层只能是一串平级的对象，想表达"这批数据整体有个元信息头"这种结构，就得自己定约定（比如第一行放一个 &lt;code&gt;type: meta&lt;/code&gt; 的行）。另外它也是纯文本，体积比 Parquet 这类二进制列式格式大不少，大数据量下读写速度吃亏。&lt;/p&gt;
&lt;h2&gt;md：给"人"看才舒服的标记&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.md&lt;/code&gt;，Markdown，是我写博客、写笔记、写公众号初稿用的格式，也是这两年几乎所有技术文档的事实标准。&lt;/p&gt;
&lt;p&gt;它的思路跟上面那些"数据格式"完全不同：csv、json 是给机器读的，md 是&lt;strong&gt;给人读的&lt;/strong&gt;，只是顺便让机器也能解析出结构。星号包起来是斜体，井号开头是标题，大于号是引用，反引号是代码——这些符号都是从纯文本时代电子邮件的约定里继承来的，一眼能看懂，不需要渲染。&lt;/p&gt;
&lt;p&gt;Markdown 由 John Gruber 在 2004 年设计，最初的语法就一小页纸。后来因为太流行，各家开始加私货，于是有了两个重要的标准化努力：&lt;strong&gt;CommonMark&lt;/strong&gt; 把核心语法钉死了，&lt;strong&gt;GFM&lt;/strong&gt;（GitHub Flavored Markdown）在它之上加了表格、任务列表、删除线、代码块语言标注这些特别实用的扩展。&lt;/p&gt;
&lt;p&gt;我写博客用的是 Pelican，markdown 文件头部有 front matter 存标题、日期、分类、标签，正文里数学公式靠 pymdownx 扩展转给 KaTeX 渲染。这些都是 md 生态的一部分：&lt;strong&gt;核心语法极简，按需加扩展&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;md 的优势很明显：写作体验好、版本控制友好（纯文本，diff 清晰）、可移植（任何编辑器都能写）、渲染后好看。劣势是&lt;strong&gt;方言太多&lt;/strong&gt;：同一个语法点，GitHub 支持、公众号不支持；表格、脚注、数学公式这些都不在核心语法里，换个渲染器可能就原样显示出符号来。&lt;/p&gt;
&lt;h2&gt;yaml：配置文件的主力&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.yaml&lt;/code&gt;（&lt;code&gt;.yml&lt;/code&gt; 是同一个东西的缩写后缀），重点用在配置文件上。GitHub Actions 的工作流、Docker Compose、conda 的 &lt;code&gt;.condarc&lt;/code&gt;、Kubernetes 的资源清单，全是 yaml。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;channels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;conda-forge&lt;/span&gt;
&lt;span class="nt"&gt;show_channel_urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="nt"&gt;custom_channels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;bioconda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;https://mirrors.ustc.edu.cn/anaconda/cloud&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;它支持注释，支持多行文本，支持嵌套结构，写起来比 json 舒服太多。配置文件要经常被人手工编辑，注释和可读性是刚需，所以 yaml 成了主流。&lt;/p&gt;
&lt;p&gt;它的劣势也很独特：&lt;strong&gt;缩进就是语法&lt;/strong&gt;。空格数错了、用了 Tab，配置的含义就变了，而且这类错误报错信息往往不友好。还有一个著名的 "Norway problem"：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;no&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;yaml 会把 &lt;code&gt;no&lt;/code&gt; 解析成布尔值 &lt;code&gt;false&lt;/code&gt; 而不是字符串 "no"。类似的还有 &lt;code&gt;on&lt;/code&gt;、&lt;code&gt;off&lt;/code&gt;、&lt;code&gt;yes&lt;/code&gt;。写挪威的代码，得加引号。这种"帮你猜类型"的体贴，偶尔就是灾难。&lt;/p&gt;
&lt;h2&gt;toml：新一代配置标准&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.toml&lt;/code&gt;（Tom's Obvious, Minimal Language）是近几年崛起的配置格式，Python 官方把它定为项目元数据的标准，&lt;code&gt;pyproject.toml&lt;/code&gt; 就是它：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[project]&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ds-holiday&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0.1.0&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;requires-python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;gt;=3.12&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;numpy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pandas&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;它跟 yaml 解决同一个问题，但思路相反：&lt;strong&gt;用显式的类型语法代替缩进&lt;/strong&gt;。字符串带引号、日期是原生类型、布尔就是 &lt;code&gt;true/false&lt;/code&gt;，没有 Norway problem，缩进错了顶多难看，不会改变语义。&lt;/p&gt;
&lt;p&gt;劣势是深层嵌套的写法比较啰嗦（靠 &lt;code&gt;[a.b.c]&lt;/code&gt; 这种分段标题逐层进入），表达复杂结构不如 yaml 灵活。但配置文件一般也没多深，所以 toml 正在快速取代 ini 和一部分 yaml 的地盘。&lt;/p&gt;
&lt;h2&gt;ini：老派但还活着&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.ini&lt;/code&gt; 是 Windows 时代传下来的配置格式，等号赋值，方括号分节：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[global]&lt;/span&gt;
&lt;span class="na"&gt;index-url&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://pypi.mirrors.ustc.edu.cn/simple&lt;/span&gt;
&lt;span class="na"&gt;trusted-host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;pypi.mirrors.ustc.edu.cn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;pip 的配置文件就是 ini。它简单到几乎没什么可学的，但正因为简单，嵌套能力几乎没有、类型全靠读的人自己理解。新项目一般直接上 toml，不过维护老系统、读别人的配置，ini 还是绕不开。&lt;/p&gt;
&lt;h2&gt;xml 和 html：标签家族&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;.xml&lt;/code&gt; 和 &lt;code&gt;.html&lt;/code&gt; 是亲戚，都用尖括号标签来标记内容。&lt;/p&gt;
&lt;p&gt;XML 是"通用标记语言"，特点是&lt;strong&gt;严格&lt;/strong&gt;：必须有唯一的根节点、标签必须闭合、大小写敏感。RSS 订阅源、SVG 矢量图、Maven 的 &lt;code&gt;pom.xml&lt;/code&gt;、Android 的布局文件，都是 XML。它的优势是规范极其严格，解析器写起来有标准可依，还带命名空间机制；劣势是啰嗦，同样的数据，XML 的体积通常比 json 大不少，嵌套深了之后可读性也不行。现在除了老系统和特定领域（RSS、SVG、Office 文档底层），新项目很少选它。&lt;/p&gt;
&lt;p&gt;顺带一提，Word 的 &lt;code&gt;.docx&lt;/code&gt;、Excel 的 &lt;code&gt;.xlsx&lt;/code&gt; 本质是个 zip 压缩包，里面装的是一堆 XML 和媒体文件。把后缀改成 zip 解开就能看到，挺涨知识的。&lt;/p&gt;
&lt;p&gt;HTML 是给浏览器看的，天生宽容：标签没闭合它也尽力渲染。它不算"数据格式"，是文档格式，这里提它是因为做数据抓取的时候，你写的解析器多半就是在跟 HTML 打交道（Beautiful Soup、XPath 那一套）。&lt;/p&gt;
&lt;h2&gt;还有一批常见的：log、sql、srt、tex&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;.log&lt;/code&gt;&lt;/strong&gt; 是日志文件，通常一行一条记录，开头是时间戳。它没有标准 schema，但"一行一条、按时间追加"这个习惯是通用的。查问题的时候 grep 日志，是每个开发者的日常。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;.sql&lt;/code&gt;&lt;/strong&gt; 是数据库脚本文件，里面就是 SQL 语句。数据库导出、迁移、备份常用它。文本格式的好处是能进版本控制，能 code review。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;.srt&lt;/code&gt;&lt;/strong&gt; 是字幕文件，序号 + 时间轴 + 文本，三段一组：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;1&lt;/span&gt;
&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;000&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;000&lt;/span&gt;
&lt;span class="n"&gt;大家好&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;今天说说纯文本格式&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;.tex&lt;/code&gt;&lt;/strong&gt; 是 LaTeX 排版源码，&lt;strong&gt;&lt;code&gt;.bib&lt;/code&gt;&lt;/strong&gt; 是它的参考文献库。写论文的人躲不开。这两个语法门槛比前面都高，但排版质量确实是所见即所得编辑器很难达到的。&lt;/p&gt;
&lt;p&gt;另外还有一大批"没有后缀的文本文件"：&lt;code&gt;Dockerfile&lt;/code&gt;、&lt;code&gt;Makefile&lt;/code&gt;、&lt;code&gt;.gitignore&lt;/code&gt;、&lt;code&gt;requirements.txt&lt;/code&gt;、&lt;code&gt;.env&lt;/code&gt;。它们也是纯文本，只是约定了固定的名字和语法。这恰恰说明：&lt;strong&gt;纯文本的本质是"内容和结构靠约定，不靠后缀"&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;怎么选，一张表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;格式&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;th&gt;人读&lt;/th&gt;
&lt;th&gt;机器读&lt;/th&gt;
&lt;th&gt;典型场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;txt&lt;/td&gt;
&lt;td&gt;纯文本口袋&lt;/td&gt;
&lt;td&gt;很好&lt;/td&gt;
&lt;td&gt;要自己解析&lt;/td&gt;
&lt;td&gt;笔记、日志、语料&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dat&lt;/td&gt;
&lt;td&gt;无标准黑盒&lt;/td&gt;
&lt;td&gt;看约定&lt;/td&gt;
&lt;td&gt;看约定&lt;/td&gt;
&lt;td&gt;仪器导出、各软件自定义&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;csv / tsv&lt;/td&gt;
&lt;td&gt;表格交换&lt;/td&gt;
&lt;td&gt;一般&lt;/td&gt;
&lt;td&gt;很好&lt;/td&gt;
&lt;td&gt;数据导出导入、Excel 交换&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;json&lt;/td&gt;
&lt;td&gt;结构化对象&lt;/td&gt;
&lt;td&gt;一般&lt;/td&gt;
&lt;td&gt;很好&lt;/td&gt;
&lt;td&gt;API 返回、通用数据交换&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jsonl&lt;/td&gt;
&lt;td&gt;一行一条 json&lt;/td&gt;
&lt;td&gt;差&lt;/td&gt;
&lt;td&gt;很好&lt;/td&gt;
&lt;td&gt;日志、大模型训练数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;md&lt;/td&gt;
&lt;td&gt;轻量标记写作&lt;/td&gt;
&lt;td&gt;很好&lt;/td&gt;
&lt;td&gt;好（需解析器）&lt;/td&gt;
&lt;td&gt;博客、README、文档&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;yaml&lt;/td&gt;
&lt;td&gt;配置&lt;/td&gt;
&lt;td&gt;很好&lt;/td&gt;
&lt;td&gt;好&lt;/td&gt;
&lt;td&gt;Docker Compose、CI、conda&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;toml&lt;/td&gt;
&lt;td&gt;配置&lt;/td&gt;
&lt;td&gt;很好&lt;/td&gt;
&lt;td&gt;好&lt;/td&gt;
&lt;td&gt;pyproject.toml、Cargo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ini&lt;/td&gt;
&lt;td&gt;极简配置&lt;/td&gt;
&lt;td&gt;好&lt;/td&gt;
&lt;td&gt;好&lt;/td&gt;
&lt;td&gt;pip、Git 老式配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;xml&lt;/td&gt;
&lt;td&gt;严格标记&lt;/td&gt;
&lt;td&gt;一般&lt;/td&gt;
&lt;td&gt;好&lt;/td&gt;
&lt;td&gt;RSS、SVG、Office 底层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;html&lt;/td&gt;
&lt;td&gt;网页文档&lt;/td&gt;
&lt;td&gt;差&lt;/td&gt;
&lt;td&gt;好（宽容）&lt;/td&gt;
&lt;td&gt;网页&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sql&lt;/td&gt;
&lt;td&gt;语句脚本&lt;/td&gt;
&lt;td&gt;好&lt;/td&gt;
&lt;td&gt;好&lt;/td&gt;
&lt;td&gt;数据库导出、迁移&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我的选择习惯大致是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;给人看的记录，用 md；&lt;/li&gt;
&lt;li&gt;跟别的软件交换表格数据，csv；&lt;/li&gt;
&lt;li&gt;程序之间传结构化数据、调 API，json；&lt;/li&gt;
&lt;li&gt;大量记录要逐行流式处理，jsonl；&lt;/li&gt;
&lt;li&gt;写配置文件，新项目 toml，跟随既有生态（Docker、CI）就 yaml；&lt;/li&gt;
&lt;li&gt;数据要长期存、频繁按列查询，别用以上任何一个，上数据库或者 Parquet。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;说一下编码和细节&lt;/h2&gt;
&lt;p&gt;第一，&lt;strong&gt;编码统一用 UTF-8，没有例外&lt;/strong&gt;。所有历史遗留的 GBK、Latin-1 文件，碰到就转成 UTF-8 存一份。Python 里读写文件养成显式写 &lt;code&gt;encoding="utf-8"&lt;/code&gt; 的习惯，能躲开九成乱码问题。要照顾 Excel，就用 &lt;code&gt;utf-8-sig&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;第二，&lt;strong&gt;csv 是交换格式，不是存储格式&lt;/strong&gt;。它没有类型、没有约束、动不动被 Excel 篡改，正经数据请交给数据库或 Parquet，csv 只负责在系统之间搬运。&lt;/p&gt;
&lt;p&gt;第三，&lt;strong&gt;配置文件选 yaml 还是 toml，看生态跟随&lt;/strong&gt;。容器和 CI 的世界已经被 yaml 占了，Python 的新世界是 toml 的，跟大流走，别逆着来。&lt;/p&gt;
&lt;p&gt;第四，&lt;strong&gt;jsonl 是被低估的格式&lt;/strong&gt;。很多人一提批量数据就想到 json 数组或者 csv，实际上日志、训练样本、爬虫输出这些"一行一条、逐行处理"的场景，jsonl 都是最舒服的选择：坏一行跳一行，内存占用恒定，还能直接按行 append。&lt;/p&gt;
&lt;p&gt;纯文本格式看着朴素，背后全是几十年演化出来的取舍。理解每个格式"为什么长这样"，比记住"怎么用"更重要——因为格式会过时，但是取舍的逻辑其实还是类似的。&lt;/p&gt;</content><category term="Tool"/><category term="文本"/><category term="格式"/><category term="txt"/><category term="csv"/><category term="json"/><category term="jsonl"/><category term="md"/><category term="yaml"/><category term="toml"/></entry><entry><title>国庆假期别浪费：从Python基础语法到数据分析的成长路径</title><link href="https://blog.cycleuser.org/guo-qing-jia-qi-bie-lang-fei-cong-pythonji-chu-yu-fa-dao-shu-ju-fen-xi-de-cheng-chang-lu-jing.html" rel="alternate"/><published>2026-09-16T21:30:00+08:00</published><updated>2026-09-16T21:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-16:/guo-qing-jia-qi-bie-lang-fei-cong-pythonji-chu-yu-fa-dao-shu-ju-fen-xi-de-cheng-chang-lu-jing.html</id><summary type="html">&lt;p&gt;快到国庆节了，有很多小朋友都有一段时间比较长的假。这种整块的、不用打卡、不用开会的时间，一年也没几段。用来躺着刷 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;快到国庆节了，有很多小朋友都有一段时间比较长的假。这种整块的、不用打卡、不用开会的时间，一年也没几段。用来躺着刷手机，刷完了其实啥也没剩下；用来啃一门技术，十天足够把一套东西从"听说过"变成"能上手"。&lt;/p&gt;
&lt;p&gt;当初的《Python 基础语法5分钟入门》https://mp.weixin.qq.com/s/9uB7Ct02HFQwo06VP0rpWg 里，数据类型、列表字典、索引切片、if/for、函数、模块、异常，这些看一遍就能懂，写点小脚本也够用了。&lt;/p&gt;
&lt;p&gt;但如果你打算往数据分析、数据科学这个方向做点开发和探索，光会语法是不够的。语法只是"会写字"，离"能写出有用的东西"还差三样：一套顺手的工具环境、一批核心的库、以及一点统计和数据的思维方式。&lt;/p&gt;
&lt;p&gt;这篇文章就按这个思路来介绍一下。&lt;/p&gt;
&lt;p&gt;每个库都要清楚：官网在哪、核心功能是什么、典型用在什么场景、优势和劣势各是什么。&lt;/p&gt;
&lt;h2&gt;一、先把环境弄对，别在系统 Python 上瞎装&lt;/h2&gt;
&lt;p&gt;这一步很多人跳过，然后被环境问题折磨三天，假期就废了。我先说这个。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一件事，别往系统的 Python 里 pip install。&lt;/strong&gt; 系统那个 Python 是给操作系统自己用的，如果装乱了，轻则某些系统工具报错，重则终端里一堆东西用不了。装东西一定要在虚拟环境里。&lt;/p&gt;
&lt;p&gt;虚拟环境以前大家都用 conda，现在我个人更推荐 uv。它快，管理 Python 版本和依赖都很利索。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Miniconda 官网：https://docs.conda.io/projects/miniconda/en/latest/&lt;/li&gt;
&lt;li&gt;uv 官网：https://docs.astral.sh/uv/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用 uv 建环境就这么几步：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 装 uv（macOS/Linux）&lt;/span&gt;
curl&lt;span class="w"&gt; &lt;/span&gt;-LsSf&lt;span class="w"&gt; &lt;/span&gt;https://astral.sh/uv/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;sh

&lt;span class="c1"&gt;# 建一个项目目录，指定 Python 版本&lt;/span&gt;
uv&lt;span class="w"&gt; &lt;/span&gt;init&lt;span class="w"&gt; &lt;/span&gt;ds-holiday
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ds-holiday
uv&lt;span class="w"&gt; &lt;/span&gt;venv&lt;span class="w"&gt; &lt;/span&gt;--python&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12

&lt;span class="c1"&gt;# 装库&lt;/span&gt;
uv&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;numpy&lt;span class="w"&gt; &lt;/span&gt;pandas&lt;span class="w"&gt; &lt;/span&gt;matplotlib&lt;span class="w"&gt; &lt;/span&gt;scipy&lt;span class="w"&gt; &lt;/span&gt;scikit-learn
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;第二件事，装个能交互式跑代码的东西。&lt;/strong&gt; 数据分析跟写网站不一样，你需要一边看数据长什么样、一边改代码。Jupyter 就是干这个的，官网在 https://jupyter.org 。现在更省事的做法是用 VS Code 装个 Jupyter 插件，或者直接上 JupyterLab。我个人习惯 VS Code 里开 &lt;code&gt;.ipynb&lt;/code&gt;，改一行看一行结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三件事，把镜像源配上。&lt;/strong&gt; 国内直连 PyPI 经常慢得让人怀疑人生。中科大 USTC 的源很稳：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;global.index-url&lt;span class="w"&gt; &lt;/span&gt;https://pypi.mirrors.ustc.edu.cn/simple
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Windows 上从 USTC 镜像装 Miniconda3 的完整步骤，我之前单独写过一篇，《Windows 系统下从中科大 USTC 镜像安装 Miniconda3 完整指南》https://mp.weixin.qq.com/s/fR6k5iSrEbS1df-nBqLffg?token=916056284&amp;amp;lang=zh_CN&lt;/p&gt;
&lt;p&gt;环境搞定，后面才顺畅。&lt;/p&gt;
&lt;h2&gt;二、数据科学的四件套&lt;/h2&gt;
&lt;p&gt;这四样是地基，不管后面做哪个方向都绕不开。我按学习顺序排：NumPy 打底，pandas 做表格，Matplotlib 画图，SciPy 补科学计算。&lt;/p&gt;
&lt;h3&gt;NumPy：一切的地基&lt;/h3&gt;
&lt;p&gt;官网：https://numpy.org&lt;/p&gt;
&lt;p&gt;NumPy 就干一件事，提供一种叫 &lt;code&gt;ndarray&lt;/code&gt; 的多维数组，然后让所有对数组的操作都在底层用 C 语言跑，快到飞起。它的核心思想叫&lt;strong&gt;向量化&lt;/strong&gt;和&lt;strong&gt;广播&lt;/strong&gt;：你不用写 for 循环，直接对整个数组做运算，代码短、速度快。&lt;/p&gt;
&lt;p&gt;典型场景是所有跟数值沾边的活：矩阵运算、图像处理（图像本质就是三维数组）、信号处理、机器学习里所有张量操作。可以说 Python 数据科学这一整座楼，地基都是 NumPy。&lt;/p&gt;
&lt;p&gt;优势很明确：快（底层 C 和 BLAS 库）、生态基础（pandas、SciPy、scikit-learn 全建在它上面）、广播机制让代码极简。&lt;/p&gt;
&lt;p&gt;劣势也得说清楚：它没有列名，只有数字下标，做表格分析很别扭；默认把所有数据一次性读进内存，数据大了就爆内存；对缺失值、混合类型的支持也很差。所以你不能拿 NumPy 直接分析一张有表头、有字符串、有空值的业务表，那是 pandas 的活。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# 整个数组乘 2，不用 for&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# 广播：b 自动扩展成 3x4 再加&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# 按列求平均&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;pandas：表格处理的事实标准&lt;/h3&gt;
&lt;p&gt;官网：https://pandas.pydata.org&lt;/p&gt;
&lt;p&gt;如果说 NumPy 是数组，pandas 就是"带行列名的表格"。它提供两个核心对象：&lt;code&gt;Series&lt;/code&gt;（一列）和 &lt;code&gt;DataFrame&lt;/code&gt;（一张表）。你在 Excel 里干的所有事，筛选、排序、透视、分组、合并、填充缺失值，pandas 都能干，而且能处理几十万行这个量级。&lt;/p&gt;
&lt;p&gt;典型场景：数据清洗（这一步能占数据分析 70% 的时间）、特征工程、时间序列分析、结果汇总。它能直接读 CSV、Excel、JSON、SQL、Parquet，非常省事。&lt;/p&gt;
&lt;p&gt;优势是生态和文档无敌。你遇到的几乎每个问题，网上都有现成的 pandas 答案；API 也符合直觉，&lt;code&gt;df[df['age'] &amp;gt; 18]&lt;/code&gt; 这种写法一看就懂。&lt;/p&gt;
&lt;p&gt;劣势主要有三个。第一，内存吃紧，它默认还是全量加载，数据超过内存就很尴尬。第二，它是单线程的，现在 CPU 核心那么多，它却只用一个，浪费。第三，历史包袱重，有些老 API 设计得别扭，你可能会经常看到 &lt;code&gt;SettingWithCopyWarning&lt;/code&gt; 这种警告，本质是它想区分"视图"和"副本"，但设计得不够干净。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pandas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sales.csv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dropna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;amount&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;amount&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;region&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;amount&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agg&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;count&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;sum&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mean&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sum&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Matplotlib：最经典的画图库&lt;/h3&gt;
&lt;p&gt;官网：https://matplotlib.org&lt;/p&gt;
&lt;p&gt;Matplotlib 是 Python 里历史最久、最经典的画图库，几乎任何静态图它都能画，折线、柱状、散点、热力图、等高线、3D 图，要什么有什么。它的另一个身份是"底座"：seaborn、pandas 的 &lt;code&gt;.plot()&lt;/code&gt; 底层调的都是它。&lt;/p&gt;
&lt;p&gt;典型场景：论文插图、报告里的图表、任何需要精确控制的地方。它的控制力可以细到"这个刻度标签旋转 45 度、字号 8、颜色 #333"。&lt;/p&gt;
&lt;p&gt;优势是全能、可控、稳定，画出来的图能直接进期刊。&lt;/p&gt;
&lt;p&gt;劣势是默认样式比较丑，得自己调；它有两套 API（&lt;code&gt;pyplot&lt;/code&gt; 快速版和面向对象的 &lt;code&gt;Figure/Axes&lt;/code&gt; 版），新手经常搞混；交互性差，图上不能缩放拖拽。所以日常探索数据我更爱用 seaborn，要精细排版才回来用 Matplotlib。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;marker&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;o&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;y&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;demo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;demo.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;SciPy：科学计算的工具箱&lt;/h3&gt;
&lt;p&gt;官网：https://scipy.org&lt;/p&gt;
&lt;p&gt;SciPy 是建立在 NumPy 之上的一整套科学计算算法库。它按功能分了很多子模块：&lt;code&gt;scipy.optimize&lt;/code&gt;（优化、求根、曲线拟合）、&lt;code&gt;scipy.integrate&lt;/code&gt;（积分、解微分方程）、&lt;code&gt;scipy.interpolate&lt;/code&gt;（插值）、&lt;code&gt;scipy.stats&lt;/code&gt;（统计分布和检验）、&lt;code&gt;scipy.signal&lt;/code&gt;（信号处理、滤波）、&lt;code&gt;scipy.sparse&lt;/code&gt;（稀疏矩阵）、&lt;code&gt;scipy.linalg&lt;/code&gt;（线性代数）。&lt;/p&gt;
&lt;p&gt;典型场景：给一组实验数据拟合一条曲线、做傅里叶变换、算 t 检验、解一个常微分方程。做科研和工程的基本都要用到。&lt;/p&gt;
&lt;p&gt;优势是算法全、经过几十年打磨、可靠。劣势是它的 API 比较"科学"，不像 pandas 那么友好，参数多、文档偏学术；而且它和 NumPy 边界有点模糊，新手经常不知道某个函数该去哪找。我的经验是：数值数组操作找 NumPy，需要"某个具体算法"的时候去 SciPy 翻。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;scipy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# 跟 1.0 比，看有没有显著差异&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ttest_1samp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;三、统计和可视化：让数据说人话&lt;/h2&gt;
&lt;p&gt;四件套之后，如果方向偏"分析"而不是"工程"，这两个库要补。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;statsmodels&lt;/strong&gt;，官网 https://www.statsmodels.org 。它跟 scikit-learn 不一样，scikit-learn 关心"预测得准不准"，statsmodels 关心"这个变量到底有没有影响、影响多大、显不显著"。回归、方差分析、时间序列（ARIMA）、假设检验，它给的输出是一张完整的统计表，p 值、置信区间、R² 全都有。做经济学、社会科学、医学统计的人离不开它。劣势是速度慢、API 偏统计学思维，做大规模预测不合适。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;seaborn&lt;/strong&gt;，官网 https://seaborn.pydata.org 。它建在 Matplotlib 上，专治"统计图"。一行代码就能画出带回归线的散点图、分组箱线图、相关性热力图，默认配色还好看。做探索性分析（EDA）的时候，它是我的第一选择。劣势是自由度不如 Matplotlib，画很特殊的图会受限，而且它默认在背后偷偷调 Matplotlib，出问题的时候错误信息会有点绕。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plotly&lt;/strong&gt;，官网 https://plotly.com/python/ 。它的卖点是交互：图能缩放、悬停显示数值、点击筛选，还能直接嵌到网页里。做数据看板、要给非技术同事演示的时候特别好用。&lt;code&gt;plotly.express&lt;/code&gt; 那套接口跟 seaborn 一样简洁。劣势是图比静态图重、导出成图片要额外装东西、离线环境配置稍微麻烦。&lt;/p&gt;
&lt;h2&gt;四、机器学习：scikit-learn 打底&lt;/h2&gt;
&lt;p&gt;官网：https://scikit-learn.org&lt;/p&gt;
&lt;p&gt;scikit-learn 是传统机器学习（非深度学习）的标准库。它最值钱的地方不是算法多，而是&lt;strong&gt;接口统一&lt;/strong&gt;：所有模型都是 &lt;code&gt;fit()&lt;/code&gt; 训练、&lt;code&gt;predict()&lt;/code&gt; 预测、&lt;code&gt;transform()&lt;/code&gt; 转换。你学会一个，就等于学会了几十个。它还提供了 Pipeline（把预处理和模型串成一条流水线）、交叉验证、网格搜索、各种评估指标，做完整实验流程够用了。&lt;/p&gt;
&lt;p&gt;典型场景：分类（这封邮件是不是垃圾邮件）、回归（明天销量多少）、聚类（这些用户能分成几类）、降维（把高维数据压到二维画图）。&lt;/p&gt;
&lt;p&gt;优势是接口一致、文档有大量示例、算法覆盖全、依赖轻。劣势是它&lt;strong&gt;不做深度学习&lt;/strong&gt;（神经网络部分很弱，真要做 CNN、Transformer 得换 PyTorch），也不擅长超大规模数据（数据太大要配 Dask 或换 Spark），而且它默认单机内存计算。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.datasets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_iris&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.model_selection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.ensemble&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RandomForestClassifier&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sklearn.metrics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;accuracy_score&lt;/span&gt;

&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;load_iris&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;return_X_y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;train_test_split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RandomForestClassifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;random_state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;accuracy_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;如果你做的是&lt;strong&gt;表格数据&lt;/strong&gt;（业务数据、实验数据这类），那真正在比赛和生产里占据主流的往往不是神经网络，而是梯度提升树：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XGBoost：https://xgboost.readthedocs.io&lt;/li&gt;
&lt;li&gt;LightGBM：https://lightgbm.readthedocs.io&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这俩在结构化数据上的精度和速度，通常比随机森林更好，Kaggle 上表格比赛的获奖方案里一半以上都有它们。优势是精度高、能处理缺失值、有特征重要性、训练快（LightGBM 尤其快）。劣势是参数多、调参要经验、可解释性不如线性模型，而且容易过拟合，得靠交叉验证和正则化压住。&lt;/p&gt;
&lt;p&gt;再往上就是深度学习。&lt;strong&gt;PyTorch&lt;/strong&gt;（https://pytorch.org ）现在是学术界和工业界的主流，接口灵活、调试方便。但它需要 GPU，学习曲线也陡，如果你只是想做数据分析，我建议先别碰，把 scikit-learn 吃透了再说。真要做图像、文本、大模型相关，再单独安排时间。&lt;/p&gt;
&lt;h2&gt;五、数据变大的时候，该怎么办&lt;/h2&gt;
&lt;p&gt;前面那套在几十万行、几百 MB 的规模上很舒服。数据一旦涨到几 GB、几十 GB，pandas 就开始卡、开始爆内存。这时候有几条路。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Polars&lt;/strong&gt;，官网 https://pola.rs 。它是用 Rust 写的 DataFrame 库，多线程、列式存储、还带查询优化，单机处理速度比 pandas 快很多（官方说能到几十倍，实际看场景）。API 跟 pandas 有相似之处，学起来不算难。劣势是生态还不如 pandas 成熟，很多第三方库只认 pandas，而且有些写法跟 pandas 不一样，迁移要改代码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DuckDB&lt;/strong&gt;，官网 https://duckdb.org 。它是个"能嵌进 Python 里的分析型 SQL 数据库"，不用起服务器，&lt;code&gt;pip install duckdb&lt;/code&gt; 就能用。你可以直接对 CSV、Parquet 文件跑 SQL，还能和 pandas DataFrame 互相转。数据大到内存装不下，它也能靠流式处理扛一扛。劣势是它是 SQL 思维，习惯 pandas 链式写法的人要适应；对非表格的复杂数据结构支持一般。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PyArrow&lt;/strong&gt;，官网 https://arrow.apache.org/docs/python/ 。它是 Apache Arrow 的 Python 接口。Arrow 是一种列式内存格式，Parquet 文件、DuckDB、Polars、pandas 之间能"零拷贝"共享数据，靠的就是它。你平时不一定直接写 Arrow 代码，但了解它有助于理解为什么现在这套工具能跑那么快。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dask&lt;/strong&gt;，官网 https://www.dask.org 。它解决的是"数据比内存大"和"想用多核/多机"的问题。它的 DataFrame 接口跟 pandas 基本一样，把 &lt;code&gt;pd.read_csv&lt;/code&gt; 换成 &lt;code&gt;dd.read_csv&lt;/code&gt;，最后加个 &lt;code&gt;.compute()&lt;/code&gt;，就能把计算自动切块、并行跑到多个核心甚至一个集群上。劣势是它的延迟计算模型（lazy）跟 pandas 的即时计算不一样，调试时不容易一眼看到中间结果；小数据上用它是杀鸡用牛刀。&lt;/p&gt;
&lt;p&gt;我个人的建议：先别急着学 Dask 和 Polars。把 pandas 用熟，遇到真的扛不住的数据，再按需换。&lt;/p&gt;
&lt;h2&gt;六、数据从哪来：Kaggle 和 ModelScope&lt;/h2&gt;
&lt;p&gt;如果你手上没有数据，或者想拿真实数据练手，最省事的办法是去公开数据集平台直接下。国内用得多的是这两个。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kaggle&lt;/strong&gt;，官网 https://www.kaggle.com ，数据集板块在 https://www.kaggle.com/datasets 。它是全球最大的数据科学社区和竞赛平台，公开数据集有几十万个，房价、天气、医疗、金融、图像、文本各个方向都有。好处是数据质量相对可控，每个数据集都有说明，还能看下载量和投票数来判断靠不靠谱；它自带免费的在线 Notebook（有 GPU 额度），本地环境都不用配就能跑；社区里还有大量别人分享的代码（kernel），可以拿来学别人怎么做特征、怎么建模。劣势是国内访问不稳定，经常得借助网络工具；数据集以英文和国外场景为主；部分竞赛和数据集要接受规则或完成手机验证才能下载。&lt;/p&gt;
&lt;p&gt;想在本地用，装个官方 CLI，配上 API token 就能拉：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;kaggle
&lt;span class="c1"&gt;# 把 kaggle.json 放到 ~/.kaggle/ 下&lt;/span&gt;
kaggle&lt;span class="w"&gt; &lt;/span&gt;datasets&lt;span class="w"&gt; &lt;/span&gt;download&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;owner/dataset-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;ModelScope（魔搭）&lt;/strong&gt;，官网 https://www.modelscope.cn ，数据集板块在 https://www.modelscope.cn/datasets 。它是阿里推出的模型和数据社区，国内访问速度快，中文数据集比 Kaggle 多不少，很多是国内机构、高校发布的数据，做中文 NLP、中文问答这类任务很合适。它既能在网页上直接下，也能用 &lt;code&gt;modelscope&lt;/code&gt; 这个库拉取，和 Python 脚本集成很方便：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;modelscope
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;modelscope.msdatasets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MsDataset&lt;/span&gt;

&lt;span class="n"&gt;ds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MsDataset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;数据集名&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subset_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;default&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;train&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;优势是国内直连、下载快、中文数据友好、和自家的模型库打通。劣势是数据集的绝对数量和沉淀时间不如 Kaggle，检索和筛选体验也还有提升空间，部分数据集需要登录甚至申请授权才能用。&lt;/p&gt;
&lt;p&gt;简单说：练手、找英文和通用数据，去 Kaggle；找中文数据、想下载快，去 ModelScope。两个都注册一下，不麻烦。&lt;/p&gt;
&lt;h2&gt;七、按方向再延伸&lt;/h2&gt;
&lt;p&gt;上面是通用底座。如果你有比较关注的具体领域，再挑对应的库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;地理空间数据：GeoPandas（https://geopandas.org ），把 GeoJSON、Shapefile 当 DataFrame 处理。我早些年做地球化学、空间分析，这类库很实用。&lt;/li&gt;
&lt;li&gt;图/网络：NetworkX（https://networkx.org ），社交网络、关系分析。&lt;/li&gt;
&lt;li&gt;图像：OpenCV（https://opencv.org ）做工程级图像处理，scikit-image（https://scikit-image.org ）偏科研算法。&lt;/li&gt;
&lt;li&gt;文本：中文分词用 jieba，工业级 NLP 用 spaCy（https://spacy.io ）。我在《Python NLP 利器：分词与词性标注库总结与实战》里详细写过，这里不重复。&lt;/li&gt;
&lt;li&gt;符号计算：SymPy（https://www.sympy.org ），推导公式、解方程、求导积分，写教程和做理论验证很方便。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;八、日程上怎么排&lt;/h2&gt;
&lt;p&gt;工具列了一堆，但假期有限，贪多效果可能最差，开心快乐最重要，核心原则是&lt;strong&gt;项目驱动，别只看教程&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;前两天，装环境 + 啃 NumPy。把 &lt;code&gt;ndarray&lt;/code&gt;、切片、广播、轴（axis）这几个概念搞清楚。&lt;/p&gt;
&lt;p&gt;接下来，主攻 pandas。读文件、筛选、分组聚合、合并、处理缺失值、时间序列。这是投入产出比最高的一段，学完立刻能干实事。&lt;/p&gt;
&lt;p&gt;用 pandas 的同时，就可以搭配 matplotlib + seaborn。学会画折线、散点、柱状、箱线、雷达图、热力图这五种就够覆盖大部分需求。&lt;/p&gt;
&lt;p&gt;都弄完了，scikit-learn。走一遍完整流程：划分训练测试集、训练、预测、评估、交叉验证。再了解一下过拟合和正则化。&lt;/p&gt;
&lt;p&gt;在这个过程中，找一份感兴趣的数据，争取做一个完整的、自己感兴趣的小项目。这一步最关键。比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从某个公开 API 抓数据（天气、股票、GitHub 仓库），清洗后做统计，画图，最后写个简单预测。&lt;/li&gt;
&lt;li&gt;从 Kaggle（https://www.kaggle.com ）或 UCI 数据集仓库（https://archive.ics.uci.edu ）下一个数据集，从零做一遍分析。&lt;/li&gt;
&lt;li&gt;用天池（https://tianchi.aliyun.com ）上的入门赛题练手。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个完整项目走下来，比看十个教程学到的都多。因为你一定会遇到教程里没讲的问题：编码不对、日期格式乱、缺失值一堆、某个库版本不兼容，这些才是真实世界的常态。&lt;/p&gt;
&lt;h2&gt;九、一点建议&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;别贪多。&lt;/strong&gt; 有人一上来就想把 NumPy、pandas、PyTorch、Spark 全学了，结果十天过去每个都只看了个开头。四件套吃透，比什么都会一点强得多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尽量别看视频。&lt;/strong&gt; 看视频容易觉得都懂了，自己一写就卡壳，这是常态。数据科学这东西，代码一定得动起来。看一段，自己敲一遍，改改参数看看结果怎么变。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数学不是拦路虎，但迟早要补。&lt;/strong&gt; 刚开始做数据分析，统计里会算个均值方差、会看 p 值，线性代数知道矩阵乘法怎么回事，就够用了。等你要深入建模、理解算法原理的时候，概率统计和线性代数就得认真学，遇到啥就学啥，反正现在查资料也方便。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;环境问题会吃掉你一半时间。&lt;/strong&gt; 这不是你的错，是这个生态的现状。装库失败、版本冲突、编码报错，遇到就慢慢查，别怀疑自己智商。装好一次环境、存一个能用的配置，以后能省很多事，而且尽量自己学会，不要只靠AI帮忙完成。&lt;/p&gt;
&lt;p&gt;按这个路走下来，至少能从一个"会写 Python 语法的人"变成"能独立做一份数据分析的人"。&lt;/p&gt;
&lt;p&gt;祝同学们假期过得充实。&lt;/p&gt;</content><category term="Python"/><category term="Python"/><category term="数据分析"/><category term="数据科学"/><category term="NumPy"/><category term="pandas"/><category term="学习路线"/><category term="假期"/></entry><entry><title>把文本打包成 ZIM 文件既能直接读还能省空间</title><link href="https://blog.cycleuser.org/ba-wen-ben-da-bao-cheng-zim-wen-jian-ji-neng-zhi-jie-du-huan-neng-sheng-kong-jian.html" rel="alternate"/><published>2026-09-16T12:00:00+08:00</published><updated>2026-09-16T12:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-16:/ba-wen-ben-da-bao-cheng-zim-wen-jian-ji-neng-zhi-jie-du-huan-neng-sheng-kong-jian.html</id><summary type="html">&lt;p&gt;最近整理本地资料，希望能节省一些硬盘空间。&lt;/p&gt;
&lt;p&gt;因为我用的是当初教育优惠叠加分期免息的最丐版的MacBook Air M4，配置也比较 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近整理本地资料，希望能节省一些硬盘空间。&lt;/p&gt;
&lt;p&gt;因为我用的是当初教育优惠叠加分期免息的最丐版的MacBook Air M4，配置也比较低，硬盘空间也很少。&lt;/p&gt;
&lt;p&gt;为了给在投的刊物凑版面费（N记子刊的版面费真可怕），趁着内存和固态以及笔记本电脑最近价格上涨，将之前用的微星游戏本（7945HX+64G+4070 8G+ SN850X 4T）以及一些其他的固态硬盘陆续都卖掉了。&lt;/p&gt;
&lt;p&gt;于是手上的存储空间就有点紧张了，所以把手里几乎所有成规模的文本，都打包成了 &lt;code&gt;.zim&lt;/code&gt; 格式。&lt;/p&gt;
&lt;p&gt;相声文本库、公有领域的世界文学名著、几千篇 AAAI 的论文、几万篇 arXiv 论文，都压缩成了一个个 &lt;code&gt;.zim&lt;/code&gt; 文件里。&lt;/p&gt;
&lt;p&gt;这篇文章就说说 ZIM 这个格式。&lt;/p&gt;
&lt;h2&gt;ZIM 是什么&lt;/h2&gt;
&lt;p&gt;先说清楚 ZIM ，这是 Kiwix 项目用的文件格式。&lt;/p&gt;
&lt;p&gt;Kiwix （ https://kiwix.org/en/about/ ） 是做离线内容的开源项目，你可以在没有网络的时候，用 Kiwix 打开一整个维基百科。&lt;/p&gt;
&lt;p&gt;ZIM 就是它背后存数据的容器：一个文件，里面可以装下几十万篇文章，打开 Kiwix 就能直接浏览、搜索、跳转。&lt;/p&gt;
&lt;p&gt;我这些年一直尽量用本地的离线模型，也经常用这类离线的内容工具。&lt;/p&gt;
&lt;p&gt;可能有同学不太理解：现在上网这么方便，何必非得用离线的？&lt;/p&gt;
&lt;p&gt;这其实跟我以前做地球科学的经历有关。那会儿在青藏高原、呼伦贝尔、大兴安岭这些地方跑野外，很多区域根本没有网络覆盖，想查点东西只能靠本地文件一条条翻，特别费劲。&lt;/p&gt;
&lt;p&gt;所以我一直盼着，要是能把一些网站做成这种既压缩、又能检索、还方便人来读的工具，那就太省事了。&lt;/p&gt;
&lt;p&gt;后来有一些文本文件从TXT变成了MD文档，固然是能够用一些工具去搜索，但始终不那么方便，跟网站阅读还是没法比的。&lt;/p&gt;
&lt;h2&gt;第一个原因：压缩，真的省空间&lt;/h2&gt;
&lt;p&gt;文本是压缩空间最显著的东西，没有之一。&lt;/p&gt;
&lt;p&gt;这个道理想想就明白：一篇中文文章，里面翻来覆去就是那几千个常用字，"的""了""是""我""一个"这些词反复出现，重复率高得吓人。压缩算法最擅长的就是对付这种重复，所以文本的压缩率往往能到七八成甚至更高。几百兆的纯文本，压完可能就剩几十兆。&lt;/p&gt;
&lt;p&gt;拿我自己实际做过的几个文件来说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;相声文本库&lt;/strong&gt;：234 个段子，一百多万字，压成 &lt;code&gt;.zim&lt;/code&gt; 之后只有 &lt;strong&gt;4.5 MB&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公有领域世界文学名著集&lt;/strong&gt;：559 部作品（荷马、但丁、莎士比亚、托尔斯泰……从古希腊到 20 世纪），113.9 MB。这个数字包含了大量英文原著和翻译版，要是散成一个个 &lt;code&gt;.txt&lt;/code&gt; 或者 &lt;code&gt;.md&lt;/code&gt; 文件放着，体积要大不少。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他类型的文件当然也能压缩，图片、音频都有专门的压缩格式，但它们的压缩空间远不如文本。一张已经压过的 JPEG 图片，你再压也压不出多少；而一段纯文本，压出来的效果是立竿见影的。所以如果你手里有大量文本要归档，压缩这件事的收益是最高的。&lt;/p&gt;
&lt;h2&gt;第二个原因：ZIM 不是"压缩包"，不用解压&lt;/h2&gt;
&lt;p&gt;这是 ZIM 和 zip 最本质的区别。&lt;/p&gt;
&lt;p&gt;zip 是个压缩包，想查看一个 zip 里面的文件，得先解压，解压出来的东西再占一份空间，然后才能用里面的文件。用完了想省空间，又得把解压出来的删掉。一来一回，麻烦，而且解压这件事本身就要临时占用额外的磁盘。&lt;/p&gt;
&lt;p&gt;ZIM 不一样。它不是"先压起来、要用再解开"，而是"压着也能直接读"。你装一个 Kiwix（或者用 libzim 这样的库），就可以&lt;strong&gt;直接打开 &lt;code&gt;.zim&lt;/code&gt; 文件翻文章、搜关键词&lt;/strong&gt;，整个过程不需要把整个文件解压出来。数据在磁盘上就一直是压缩状态，读哪一篇，就解哪一篇，读完还保持压缩。&lt;/p&gt;
&lt;p&gt;这一点对我这种"存一大堆、偶尔翻一篇"的场景特别友好。我想查相声《买猴》的原文，不用先把 234 个段子全解压出来，直接打开 ZIM 搜"买猴"就行。&lt;/p&gt;
&lt;h2&gt;第三个原因：它像一个原始版的知识库&lt;/h2&gt;
&lt;p&gt;这是我觉得最有意思的一点。&lt;/p&gt;
&lt;p&gt;现在大家都在让大模型帮忙实现 RAG、挂载访问知识库、实现高效率的向量检索。一个正经的知识库，要做文本切块、向量化、语义相似度检索，维度高、工程复杂。而 ZIM 提供的是另一种东西——一个&lt;strong&gt;最原始形态的知识库&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;它没有向量，没有语义相似度分析，就是一个"文章集合 + 全文索引"。但它是可编程访问的：用 &lt;code&gt;libzim&lt;/code&gt; 这类库，程序可以直接遍历 ZIM 里的每一篇文章，读标题、读正文。这就意味着，&lt;strong&gt;你可以让一个智能体工具直接去访问一个 ZIM 文件来查资料&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;模型通过 libzim 打开 ZIM，把文章一篇篇读出来，然后做分词、做主题模型、做统计分析。整个过程里，ZIM 扮演的角色就是"语料库"：数据规规整整地待在一个文件里，模型按需取用。&lt;/p&gt;
&lt;p&gt;说白了，它就是个"能装很多文章、能全文检索、能被程序读取"的容器。它没有现代知识库那么高的维度，做不了"这段文字和那段文字语义像不像"这种分析，但作为"把一批文本喂给模型去读"的原始底座，完全够用，而且轻量、省事、一个文件走天下。&lt;/p&gt;
&lt;h2&gt;顺便说一句：怎么用它&lt;/h2&gt;
&lt;p&gt;如果只是阅读，装个 Kiwix 客户端（用winget和brew都可以安装），打开 &lt;code&gt;.zim&lt;/code&gt; 文件就行。&lt;/p&gt;
&lt;p&gt;如果想让程序或 AI 读，用 Python 的话装个 &lt;code&gt;libzim&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;libzim
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;然后就可以用代码来访问了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;libzim.reader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Archive&lt;/span&gt;
&lt;span class="n"&gt;zim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Archive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;相声文本库.zim&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 遍历整个 ZIM 里的所有条目&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zim&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all_entry_count&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zim&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_get_entry_by_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;  &lt;span class="c1"&gt;# 文章的正文（bytes）&lt;/span&gt;

&lt;span class="c1"&gt;# 或者按路径直接取某一篇&lt;/span&gt;
&lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zim&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_entry_by_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;传统单口相声/打灯谜.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这么几行，就能把整个 ZIM 里的内容交给下游处理了。
如果你手里也攒着一堆文本，与其让它们散成一地文件，不如试试装进一个 &lt;code&gt;.zim&lt;/code&gt; 里。&lt;/p&gt;</content><category term="Tool"/><category term="ZIM"/><category term="Kiwix"/><category term="压缩"/><category term="文本"/><category term="知识库"/><category term="AI"/><category term="opencode"/></entry><entry><title>教师节的一场梦：我的第一次"战或逃"</title><link href="https://blog.cycleuser.org/jiao-shi-jie-de-yi-chang-meng-wo-de-di-yi-ci-zhan-huo-tao.html" rel="alternate"/><published>2026-09-10T00:00:00+08:00</published><updated>2026-09-10T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-10:/jiao-shi-jie-de-yi-chang-meng-wo-de-di-yi-ci-zhan-huo-tao.html</id><summary type="html">&lt;h1&gt;教师节的一场梦：我的第一次"战或逃"&lt;/h1&gt;
&lt;p&gt;今天是教师节。我也当了好些年的老师了，今天还受了表彰。本来是件挺高兴的事，可我 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;教师节的一场梦：我的第一次"战或逃"&lt;/h1&gt;
&lt;p&gt;今天是教师节。我也当了好些年的老师了，今天还受了表彰。本来是件挺高兴的事，可我心里特别无奈：表彰现场，很多孩子准备了花，我的花粉过敏突然就严重起来，喘不上气，心里发慌。我赶紧跑到附近的医院，吃了抗过敏的药，又吸了会儿氧，这才缓过来。&lt;/p&gt;
&lt;p&gt;医生让我别再进室内，就在空气流通的室外歇着。歇着的过程中，我还看到一位朋友分享的一张图。也不知道是在哪个国家、什么地方，大意是说，有些孩子坐着在那儿喝牛奶还是什么饮料，另外一些孩子站在后面喝水。我状态不好，也没细看，估计是国外的什么地方吧。&lt;/p&gt;
&lt;p&gt;这事我没太往心里去，于是就睡着了。睡梦中，想起小时候做过的一个个梦。&lt;/p&gt;
&lt;h2&gt;不讲教材，而是要讲教辅书&lt;/h2&gt;
&lt;p&gt;我梦到，我跟着父母四处打工、到处借读。第一次进的那所小学，大概是三年级，学校要求所有学生都买一本叫"目标与培养"之类的教辅书，说上课不讲教材，只讲这本书。&lt;/p&gt;
&lt;p&gt;那会儿我还小，根本不知道人家就是为了挣这个钱。我的想法很简单：把这书拿回去，让我妈在打工之余有空的时候，帮我抄下来一本，然后我拿着写就行。&lt;/p&gt;
&lt;p&gt;后来我还真就这么干了。我找同学借了一本，拿回家让我妈帮我抄。那好像是数学的，字不算特别多。我妈还挺认真，帮我工工整整写了一个本儿。弄好之后，我拿着这个抄本去了学校，结果它不高兴了，问我：这东西你怎么没去买那本书呢？我说，我抄下来了，让我妈抄的，我做这上面的题，这样我也能跟着你们听课。它很生气。&lt;/p&gt;
&lt;p&gt;那学期就那么糊弄着，没几天也就过去了。到了第二学期，其他同学也有一些人不再买了，他们好像是复印的，纸的质量不太好，有点发暗，上面的油墨像是复印出来的，而且每个人的那个本子上印的油墨笔迹看着好像都一样，我怀疑是有人先抄好一份，大家再拿去复印。好多人都不去买那本"目标与培养"了。结果呢，第二学期它就不讲这本书了，改讲别的书。&lt;/p&gt;
&lt;p&gt;后来我才慢慢明白，它那会儿的目的，可能就是为了卖大家书、想挣钱。&lt;/p&gt;
&lt;p&gt;从那时候起，只要有人要求我们"自愿"统一订购什么，我就本能地开始厌恶。&lt;/p&gt;
&lt;p&gt;可那会儿我大概才八九岁，还不足以跟人家对抗。一次更激烈的对抗，要等到下一次。后来我转到另外一个学校，那时候我已经十来岁了。&lt;/p&gt;
&lt;h2&gt;它让我必须自愿订购豆奶&lt;/h2&gt;
&lt;p&gt;那一次，它要求我们每个人，必须自愿每个月花十八块八，订购一种豆奶。&lt;/p&gt;
&lt;p&gt;是叫喵喵豆奶还是苗苗豆奶，我记不清了，反正是这么个东西。&lt;/p&gt;
&lt;p&gt;我没有钱，我说我不定。它就在那儿辱骂我。我跟它说，你说那些也没用，我就是不定。它还是不依不饶，接着讽刺我。&lt;/p&gt;
&lt;p&gt;它说我在搞特殊，说怎么就你一个人特殊。然后还说我浪费大家的时间，浪费一个人一分钟，就是浪费了八十多个人八十多分钟。&lt;/p&gt;
&lt;p&gt;我能感觉到，它是在用一种强盗的、流氓的、非常无耻而鄙陋的蠢蛋逻辑来胡搅蛮缠，想让其他同学一道来讨厌我、攻击我。&lt;/p&gt;
&lt;p&gt;可那会儿我已经想好了，这些我都不在乎。我不在乎与任何人为敌，我就是要捍卫我这十八块八，我不能花这个钱，我需要这些钱。&lt;/p&gt;
&lt;p&gt;于是干脆直接跟它说：你说这些话都没用，我不想定。你弄死我我也不定；你弄不死我，我还不定，我跟你斗到底，我就是不服，你叫我找家长也没用，我家也没有电话。&lt;/p&gt;
&lt;p&gt;我坚信不能被这种"被自愿"的要求打败，我绝对不投降。&lt;/p&gt;
&lt;p&gt;那年我大概十一岁。&lt;/p&gt;
&lt;p&gt;它并没有过来弄死我，而只是不让我听课，不只是它的课，让我在别的课上也站着。&lt;/p&gt;
&lt;p&gt;其实它自己也不怎么讲课，课上主要也就是骂我。&lt;/p&gt;
&lt;p&gt;现在想想，我挺佩服小时候的那个自己。&lt;/p&gt;
&lt;p&gt;我当时是一个10来岁的孩子，能够在那种情况下忍受着一节又一节的那种火力的嘲讽语言的霸凌，应该忍了大概有一个月或者至少有两三周。&lt;/p&gt;
&lt;p&gt;我给自己鼓劲，而且每次都明跟它说，你的课你也不讲什么，我自己会去学，你不讲我也能学会；其他的课你有能耐就在这儿看着我，你不在这我就听课，你有能耐一天都跟我耗着么？大不了你过来，你敢过来咱们就拼命。&lt;/p&gt;
&lt;p&gt;后来，它也并没有跟我拼命，也不再骂我或者追打我了，甚至也不再逼着我订豆奶了。&lt;/p&gt;
&lt;p&gt;然后这过程中，也逐渐地听说有一些老师对它去干扰人家上课也是颇有微词，而且对他的很多言行也颇为不齿。看来毕竟是好人多呀。&lt;/p&gt;
&lt;p&gt;再往后，它就不当我们班的班主任了。据我所知，好像还有另外几个同学，也开始不定了。&lt;/p&gt;
&lt;p&gt;在我明确表示不定、并且公开跟它唱反调之前，其实别的同学都还是半推半就地接受了。&lt;/p&gt;
&lt;p&gt;当时我确实是太穷了：我一顿饭吃一张卷饼加个鸡蛋才五毛钱，要是有一块钱，我就能吃盒饭了，一块五的盒饭里能加一片火腿，那都算很好了。&lt;/p&gt;
&lt;p&gt;所以一个月十八块八，对我来说是很大的一笔钱，我甚至愿意为它去拼命。&lt;/p&gt;
&lt;p&gt;它要是强行想从我这儿抢走，我没有那个钱，所以我心里有底气；真要是我兜里有那些钱，我还真怕它过来抢。&lt;/p&gt;
&lt;p&gt;那时候我觉得这是我遇到的最重要的事情，绝对不能同意，要是同意了，就没机会了。&lt;/p&gt;
&lt;p&gt;这大概是我人生里第一次意识到自己身上那种动物性的本能——战或逃（fight or flight），第一次想要去保护自己、捍卫自己，甚至不惜跟它拼命。&lt;/p&gt;
&lt;p&gt;那会儿我觉得，世界上没有比它更坏的了；它那种行为，简直就像是在抢劫我一样。&lt;/p&gt;
&lt;p&gt;我要战胜眼前这个肮脏恶臭、令人厌恶的东西。别看它衣着光鲜、外表体面、目光柔和，我知道它内里究竟是什么样子。我甚至不惜跟它拼命，我做好了它冲过来扑向我的准备。&lt;/p&gt;
&lt;p&gt;可就在这时候，我心里又冒出另外一个念头：我也要当老师，我要当一个更好的老师，要在这个行当里，彻底胜过这个丑陋的东西。&lt;/p&gt;
&lt;p&gt;当然，这只是一个梦，一个噩梦。这个梦，终于醒了。&lt;/p&gt;
&lt;h2&gt;关于教师节送礼&lt;/h2&gt;
&lt;p&gt;之前我就跟人说过，教师节就别送礼。&lt;/p&gt;
&lt;p&gt;我也希望我带过的那些同学，等他们当了师兄师姐，也别让底下更小的学弟学妹给他们买东西、送奶茶之类的。&lt;/p&gt;
&lt;p&gt;我就想，当老师是个职业，有工资拿，为什么还要去拿别人的东西呢？&lt;/p&gt;
&lt;p&gt;我始终觉得收礼是件很不体面的事。&lt;/p&gt;
&lt;p&gt;我梦到过有的学生考研到了某个所谓老牌名校，那的师兄师姐要求大家一块儿凑钱，凑个挺大的数目，几千块钱，给导师买东西。&lt;/p&gt;
&lt;p&gt;我梦到过有的学生考研到了某个不太名校的地方，他们的导师居然要让他们学生出钱给自己付钱打五百块一场的球，然后下个月从补助里面扣除。&lt;/p&gt;
&lt;p&gt;我梦到过有的学生考研到了某个老牌名校，导师每个月给他们打劳务费到卡里面，然后再让他们去取出来现金交还回导师手里。&lt;/p&gt;
&lt;p&gt;这都还好只是梦，都是很不成体统的事，很可能是那个师兄师姐自己别有用心，很可能那个导师作风不正，很可能有人套取经费等等，总之都是想借这个机会捞点什么。&lt;/p&gt;
&lt;p&gt;我甚至还梦到中小学里面有的家长，带着一种谄媚的心理，撺掇着说：大家咱们一起给老师买点什么。&lt;/p&gt;
&lt;p&gt;这种逢迎钻营、惯于讨好的人，自古就有，好像是可以称之为「奸佞」，是最要不得的。&lt;/p&gt;
&lt;h2&gt;很多道理，小时候就懂了&lt;/h2&gt;
&lt;p&gt;有很多道理，其实我们小时候就懂了。幼儿园就告诉我们，不要撒谎，要诚实，要善良，不要强迫别人，不要伤害别人。有的甚至写到了纸上，写成规则。&lt;/p&gt;
&lt;p&gt;到了小学，老师还是这么讲，翻来覆去地讲，好像这些道理是天底下最要紧的事。&lt;/p&gt;
&lt;p&gt;可当时我在梦幻中就早已经发现，那些把道理讲得头头是道的大人、老师，有的人自己未必真那么信，也未必真那么做。&lt;/p&gt;
&lt;p&gt;讲归讲，做归做，说出口的和做出来的，常常是两回事。我不想成为那样的人，也不希望有一天，自己变成当年最看不惯的那种样子。&lt;/p&gt;
&lt;p&gt;我以前听一个朋友说过（当然，也是做梦听到的），他说，如果一句话里说"原则上"如何如何，那就说明这个原则是可以打折扣的。&lt;/p&gt;
&lt;p&gt;语言被污染成这个样子，真可怕。因为它可能意味着，思想上的污染早就存在了，甚至早就被人接受了。&lt;/p&gt;
&lt;p&gt;教师节呀，就希望能顺顺当当地，好好教孩子们，也就行了。&lt;/p&gt;
&lt;p&gt;当年那个宁可罚站、也不肯低头的十一岁小孩，二十多年后，他自己不仅成了老师，还会站在表彰台上。&lt;/p&gt;
&lt;p&gt;希望，站在台上的这个人，永远不要变成当年梦里那个逼人订豆奶的老师。&lt;/p&gt;
&lt;p&gt;祝大家教师节快乐。&lt;/p&gt;</content><category term="随笔"/><category term="教师节"/><category term="教育"/><category term="回忆"/><category term="随笔"/></entry><entry><title>16G 显存怎么跑本地大模型</title><link href="https://blog.cycleuser.org/16g-xian-cun-zen-yao-pao-ben-di-da-mo-xing.html" rel="alternate"/><published>2026-09-09T20:00:00+08:00</published><updated>2026-09-09T20:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-09:/16g-xian-cun-zen-yao-pao-ben-di-da-mo-xing.html</id><summary type="html">&lt;h1&gt;16G 显存怎么跑本地大模型？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;不是每个人都有 24G、32G 的卡。手里一张 16G 的 RX 6800 XT、RTX 4060Ti 16G、5060Ti 16G，或者笔记本上的 16G 显卡，同样想跑 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1&gt;16G 显存怎么跑本地大模型？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;不是每个人都有 24G、32G 的卡。手里一张 16G 的 RX 6800 XT、RTX 4060Ti 16G、5060Ti 16G，或者笔记本上的 16G 显卡，同样想跑本地大模型，该怎么选模型、选量化、调参数？这回咱们看看 16G 这个档位上的真实取舍——模型尺寸怎么定、量化选哪档、上下文和 KV 怎么压、A 卡和 N 卡差在哪，全部综述于论坛的真实实测，出处编号见文末。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;一、先认清 16G 的天花板在哪&lt;/h2&gt;
&lt;p&gt;16G 显存的尴尬，用论坛网友的话说最贴切："能用，但是又不省心。像鸡肋，食之无味，弃之可惜。"[2] 具体卡在哪三处：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;权重装得下，KV 就紧张。&lt;/strong&gt; 主流的 Qwen 27B 模型，Q4_K_M 量化后权重约 16.5GB——光权重就顶到 16G 天花板，再想留上下文空间就得 offload 到内存[4]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 场景吃上下文。&lt;/strong&gt; Hermes 这类工具自带 system prompt 就 15K 左右，做稍微复杂的任务马上就 OOM（显存溢出）[2]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化越狠，上下文越省，但智商越掉。&lt;/strong&gt; 这是一个必须权衡的三角：模型尺寸、量化精度、上下文长度，16G 上只能同时要两个。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;好消息是：&lt;strong&gt;只要量化选对、参数调对，16G 跑 27B 是完全可以当生产力用的&lt;/strong&gt;。下面逐项拆。&lt;/p&gt;
&lt;h2&gt;二、模型尺寸怎么选：27B 稠密 还是 35B MoE&lt;/h2&gt;
&lt;p&gt;16G 上最值得考虑的其实是两类模型，而不是一路往大堆。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选择一：27B 稠密（Dense）——工具调用最稳&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Qwen3.6 / 3.8-27B 是社区公认的"16G 能跑的最强 Agent 模型"，理由很直接：&lt;strong&gt;27B 密集参数的工具调用（function calling）稳定性远好于同尺寸 MoE&lt;/strong&gt;[3]。用 llama.cpp 加载，4bit 量化 + 16K 上下文约 14.5GB，还有余量[3]。&lt;/p&gt;
&lt;p&gt;它的短板是速度一般、上下文紧张。但如果你主要拿来跑 agent、写代码、需要稳定的指令跟随，27B 稠密是首选[3]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;选择二：35B-A3B（MoE）——速度与上下文的"降维打击"&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你被 27B 的速度和上下文折磨，MoE 是 16G 上的另一条路，而且是论坛实测里"反直觉"的惊喜：&lt;strong&gt;总参数更大的 35B-A3B，实际显存占用反而比 27B 全层稠密还低&lt;/strong&gt;（35B 只需把 26 层放 GPU，14 层 offload 到 CPU）[6]。&lt;/p&gt;
&lt;p&gt;实测对比（RTX 5070 Ti 16G，同一台机器）[6]：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;27B 稠密&lt;/th&gt;
&lt;th&gt;35B-A3B MoE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;显存占用&lt;/td&gt;
&lt;td&gt;15,048 MiB&lt;/td&gt;
&lt;td&gt;14,826 MiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;上下文&lt;/td&gt;
&lt;td&gt;98K&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;短 prompt 首字&lt;/td&gt;
&lt;td&gt;0.52s&lt;/td&gt;
&lt;td&gt;0.24s（快 2.2 倍）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;短 prompt 生成&lt;/td&gt;
&lt;td&gt;12.7 t/s&lt;/td&gt;
&lt;td&gt;48.0 t/s（快 3.8 倍）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;长 prompt 生成&lt;/td&gt;
&lt;td&gt;13.3 t/s&lt;/td&gt;
&lt;td&gt;51.7 t/s（快 3.9 倍）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;原因在于 MoE "每次只激活 3B 参数"——显存带宽固定时，读取量变成 1/9，速度自然暴涨[6]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代价&lt;/strong&gt;：MoE 是"局部专家各自为战"，在需要跨几十步的深层逻辑推导（复杂数学证明、大型架构重构）时，27B 稠密的逻辑连贯性有时反而更好[6]。所以结论是：&lt;strong&gt;跑 agent、追求速度与上下文 → 35B-A3B MoE；追求单步推理的严密与工具调用稳定 → 27B 稠密&lt;/strong&gt;[3][6]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;还有个"更聪明"的思路&lt;/strong&gt;：与其硬塞 27B，不如退一步用更小的模型换满上下文。16G 上 Qwen3.5-9B Q8_0 全精度可以跑满 128K 上下文，响应速度比 27B 快 2-3 倍，轻量级 Agent 任务完全够用[3]。别被"参数越大越好"绑住，因为如果不是写代码之类的任务，而只是文本翻译之类的，9B 其实也能用。&lt;/p&gt;
&lt;h2&gt;三、量化怎么选：这是 16G 的核心功课&lt;/h2&gt;
&lt;p&gt;量化决定了"权重占多少显存"，直接影响你能开多大上下文。以 Qwen3.8-27B 在 16G 卡上为例，论坛整理出的量化对比表如下[4]：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;大小&lt;/th&gt;
&lt;th&gt;最小显存&lt;/th&gt;
&lt;th&gt;单流 TG (tok/s)&lt;/th&gt;
&lt;th&gt;Prefill (tok/s)&lt;/th&gt;
&lt;th&gt;代码质量&lt;/th&gt;
&lt;th&gt;16G 推荐度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IQ4_XS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;14.8 GB&lt;/td&gt;
&lt;td&gt;15.8 GB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;38-43&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1350&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;全层上卡首选&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Q4_K_M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16.5 GB&lt;/td&gt;
&lt;td&gt;17.5 GB&lt;/td&gt;
&lt;td&gt;18-27（需 offload）&lt;/td&gt;
&lt;td&gt;~1240&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;质量优先，需 offload 2-4 层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5_K_M&lt;/td&gt;
&lt;td&gt;19.8 GB&lt;/td&gt;
&lt;td&gt;21 GB&lt;/td&gt;
&lt;td&gt;34-36&lt;/td&gt;
&lt;td&gt;~1080&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;需 24G 卡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVFP4（50 系专用）&lt;/td&gt;
&lt;td&gt;~13 GB&lt;/td&gt;
&lt;td&gt;14 GB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;55-65&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1800&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;未来首选，待框架支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q3_K_L&lt;/td&gt;
&lt;td&gt;14.2 GB&lt;/td&gt;
&lt;td&gt;15.2 GB&lt;/td&gt;
&lt;td&gt;44+&lt;/td&gt;
&lt;td&gt;~1420&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;不推荐生产&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;几个关键结论：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;16G 卡上，IQ4_XS 才是"全层上 GPU"的正确选择&lt;/strong&gt;，不是 Q4_K_M。Q4_K_M 权重 16.5GB + 32K KV 约 1.2GB = 17.7GB，物理上超了 16G，硬上只能 offload 部分层，速度掉到 18-27 t/s；而 IQ4_XS 权重 14.8GB，能全层上卡，速度 38-43 t/s[4]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化别贪低也别贪高。&lt;/strong&gt; Q3_K_L 虽然体积小、速度还行，但质量只给两星，"不推荐生产"；Q5_K_M 质量好但需 24G 卡[4]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;50 系（Blackwell）的 NVFP4 是"完全体"&lt;/strong&gt;，约 13GB 就能跑、速度 55-65 t/s，但需要较新的 llama.cpp 支持（PR #21095 合并后）[4]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UD 版（Unsloth Dynamic）比普通版更值&lt;/strong&gt;：对敏感张量保留更高精度，纠错这类吃细节的任务推荐 UD-Q4_K_XL，体积大不了多少[7]。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;A 卡用户注意&lt;/strong&gt;：像 RX 6800 XT 这种 16G A 卡，实测可以用 &lt;strong&gt;IQ3_XS&lt;/strong&gt; 级别的量化，开 MTP + q4 KV，勉强跑到 128K 上下文，此时显存占用 99%[1]。A 卡的 prefill 是短板，量化策略要更激进一些。&lt;/p&gt;
&lt;h2&gt;四、上下文与 KV 缓存：16G 的"走钢丝"艺术&lt;/h2&gt;
&lt;p&gt;16G 上能开多长上下文，几乎全由 KV 缓存决定。这块有三个实用技巧：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技巧一：KV 量化到 q4_0，上下文翻倍。&lt;/strong&gt;
把 KV cache 量化到 4bit，能大幅压缩显存。27B 在 128K 上下文下，KV 量化后能省下大量显存[2][1]。但要注意：&lt;strong&gt;Agent 场景别用 q4 KV&lt;/strong&gt;，因为需要精确理解工具 schema，质量会掉；建议 agent 用 q8_0、日常对话和代码补全用 q4_0，写两个启动脚本切换[1]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技巧二：用 ik_llama.cpp 的 turboQuant，上下文直接翻倍。&lt;/strong&gt;
这是 16G 玩家的一大发现：用带 turboQuant 的 ik_llama.cpp，原本只能稳定跑 20K 上下文的 16G 卡，&lt;strong&gt;极端双 q4 下能跑到 64K&lt;/strong&gt;，速度还不变（25-27 t/s）。有人用 V100 16G 甚至跑到 100K[2]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技巧三：上下文别贪，够用就行。&lt;/strong&gt;
论坛经验：96K 对重度 Agent 仍可能触发上下文压缩；128K 在 16G 上跑 Q4 会"卡成狗"；&lt;strong&gt;65K 就能接入 Hermes 做很多项目&lt;/strong&gt;，上下文压缩在可接受范围内[5]。超长上下文不适合所有工作，够用就行。&lt;/p&gt;
&lt;h2&gt;五、A 卡 vs N 卡：16G 上的真实差异&lt;/h2&gt;
&lt;p&gt;同样是 16G，A 卡和 N 卡的体验差别不小，这一点论坛讲得很实在：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;N 卡（4060Ti/5060Ti/5070Ti）：CUDA 生态成熟、prefill 快、省心。&lt;/strong&gt;
- 单卡 16G 跑 27B Q4 需 offload，速度约 8-15 t/s（DDR4 平台），"比乌龟强一点"[7]
- 加第二张 16G 卡组 32G，速度跳到 35-50 t/s 量级（双 3060 43-50、双 5060Ti 65）[7]
- 5070Ti 算力比 3090 强，但 16G 显存是瓶颈[10]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A 卡（RX 6800 XT）：prefill 是明显短板。&lt;/strong&gt;
6800 XT 实测跑 27B IQ3_XSS + MTP2 + q4 KV，能勉强跑 128K 上下文（显存 99%），64K 上下文时 prefill 只有 200 t/s、生成 28-38 t/s。用 opencode 做简单代码开发够用，但 &lt;strong&gt;Hermes 读一次 tools 反馈要等 30 秒&lt;/strong&gt;——这就是 AMD prefill 优化不如 N 卡的硬件生态问题[1]。&lt;/p&gt;
&lt;p&gt;不过 A 卡也不是没救：换最新 llama.cpp + ROCm 后端、降低 KV 精度、开 &lt;code&gt;--no-mmap --mlock&lt;/code&gt; 都能缓解 prefill 等待感[1]。&lt;strong&gt;如果你的工作重度依赖 agent、对首字延迟敏感，16G 档位建议优先 N 卡；如果只是代码补全、日常对话，A 卡够用且便宜。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;六、MTP 投机解码：16G 上要不要开&lt;/h2&gt;
&lt;p&gt;MTP（多 token 预测）是常见的提速手段，但在 16G 卡上有个反直觉的结论：&lt;strong&gt;很多时候开 MTP 反而是负优化。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;论坛实测：4060Ti 16G 跑 27B，&lt;strong&gt;开 MTP 后 decode 只有 12.8 t/s，关掉反而 18.9 t/s&lt;/strong&gt;——因为 MTP 的草稿模型要多占 1-2GB 显存，16G 上本来就贴边，draft 计算开销超过了投机收益，接受率也低（平均约 2.3）[7]。同理，Qwen3.8-27B 的 MTP draft head 偏弱，接受率实测只有约 40%[7]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;16G 上的建议&lt;/strong&gt;：先关掉 MTP 跑基线；真想试，从 &lt;code&gt;--spec-draft-n-max 1&lt;/code&gt; 起步，别一上来就 2 或更高；长上下文时直接关掉（效果递减）[7][4]。相比之下，&lt;strong&gt;35B-A3B MoE 靠架构本身就能到 48-52 t/s，不太依赖 MTP&lt;/strong&gt;[6]。&lt;/p&gt;
&lt;h2&gt;七、双 16G 卡：另一条路&lt;/h2&gt;
&lt;p&gt;如果你手上已经有一张 16G，或者预算允许，&lt;strong&gt;再凑一张 16G 组 32G 是 16G 玩家最划算的升级&lt;/strong&gt;[7]。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;双 4060Ti/5060Ti 16G 组 32G：Q4 权重全放下 + KV 富余，速度 35-50 t/s[7]&lt;/li&gt;
&lt;li&gt;双 5070Ti 16G：张量并行高上下文稳定 52+ t/s，开 MTP 到 64-70+ t/s[8]&lt;/li&gt;
&lt;li&gt;注意：&lt;strong&gt;5060Ti/4060Ti 不支持 NVLink&lt;/strong&gt;，只能走 PCIe；写代码这类频繁交互场景，跨卡延迟比单卡明显[9]&lt;/li&gt;
&lt;li&gt;PCIe 3.0 x4 够不够？够——tensor split 每 token 跨卡只传几百 KB 激活量，x4 损失个位数百分比，27B 规模没问题[7]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不过论坛老手的提醒也值得听：&lt;strong&gt;如果是全新买两张 16G，不如直接上单张 24G/32G&lt;/strong&gt;——单卡省电、省心、无跨卡开销，二手 3090 的价格有时和新的 5070Ti 差不多甚至更低，却能跑 40+ t/s[10][9]。双 16G 更适合"已有卡再加一张"的情况。&lt;/p&gt;
&lt;h2&gt;八、给 16G 玩家的一张速查表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;你的诉求&lt;/th&gt;
&lt;th&gt;推荐模型&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;关键参数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent / 工具调用最稳&lt;/td&gt;
&lt;td&gt;Qwen3.6/3.8-27B 稠密&lt;/td&gt;
&lt;td&gt;IQ4_XS（全层）或 Q4_K_M（offload）&lt;/td&gt;
&lt;td&gt;KV q8_0（agent）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;速度 + 长上下文优先&lt;/td&gt;
&lt;td&gt;Qwen3.6-35B-A3B MoE&lt;/td&gt;
&lt;td&gt;UD-Q4_K_M&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-ngl 26 -c 131072&lt;/code&gt;，关 FA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;轻量任务、要满上下文&lt;/td&gt;
&lt;td&gt;Qwen3.5-9B&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;可跑满 128K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;想榨出更长上下文&lt;/td&gt;
&lt;td&gt;27B + ik_llama.cpp&lt;/td&gt;
&lt;td&gt;IQ4_XS / Q3&lt;/td&gt;
&lt;td&gt;turboQuant，双 q4 KV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 系卡尝鲜&lt;/td&gt;
&lt;td&gt;27B NVFP4&lt;/td&gt;
&lt;td&gt;NVFP4&lt;/td&gt;
&lt;td&gt;待框架支持，55-65 t/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A 卡（6800XT）&lt;/td&gt;
&lt;td&gt;27B&lt;/td&gt;
&lt;td&gt;IQ3_XS 级别&lt;/td&gt;
&lt;td&gt;MTP2 + q4 KV，接受 prefill 短板&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;模型尺寸&lt;/strong&gt;：16G 上要么选 27B 稠密（工具调用稳），要么选 35B-A3B MoE（速度上下文碾压），别盲目追更大；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;量化&lt;/strong&gt;：全层上卡选 IQ4_XS，质量优先选 Q4_K_M 但接受 offload 掉速，50 系等 NVFP4；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数&lt;/strong&gt;：KV 用 q4_0 换上下文、agent 场景换 q8_0，MTP 在 16G 上多数是负优化，上下文够用就好。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;16G 不是终点，但绝不是废物。选对模型和量化、把参数调到贴合你的场景，它一样能当生产力用。理性配置，量力而行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考来源&lt;/h2&gt;
&lt;p&gt;本文全部实测数据来自抡锤者（lcz.me）论坛会员的真实分享，原帖均可点击核对完整配置与测法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/181/181/16g-6800xt-推理qwen-3.6-27b-的经验分享-已经对amd-prefill-速度的问题"&gt;16g 6800xt 推理 qwen 3.6 27b 的经验分享（已对 AMD prefill 速度的问题）&lt;/a&gt; — https://lcz.me/topic/181/181/16g-6800xt-推理qwen-3.6-27b-的经验分享-已经对amd-prefill-速度的问题（TID:181）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/174/174/大模型16g卡的春天"&gt;大模型 16G 卡的春天&lt;/a&gt; — https://lcz.me/topic/174/174/大模型16g卡的春天（TID:174，ik_llama.cpp + turboQuant 上下文翻倍实测）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/868/868/各位佬-当前最适合16gb显存的黄金模型是哪个"&gt;各位佬，当前最适合 16GB 显存的黄金模型是哪个？&lt;/a&gt; — https://lcz.me/topic/868/868/各位佬-当前最适合16gb显存的黄金模型是哪个（TID:868）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1207/1207/rtx-5070-ti-16gb-跑-qwen3.8-27b-16g-卡量化选择-启动配置与基准数据"&gt;RTX 5070 Ti 16GB 跑 Qwen3.8-27B：16G 卡量化选择、启动配置与基准数据&lt;/a&gt; — https://lcz.me/topic/1207/1207/rtx-5070-ti-16gb-跑-qwen3.8-27b-16g-卡量化选择-启动配置与基准数据（TID:1207，核心量化对比表）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/524/524/16gb显存极限挑战-rtx-5070-ti-本地部署-qwen3.6-27b-q4-调优指南与实测报告"&gt;16GB 显存极限挑战：RTX 5070 Ti 本地部署 Qwen3.6-27B (Q4) 调优指南与实测报告&lt;/a&gt; — https://lcz.me/topic/524/524/16gb显存极限挑战-rtx-5070-ti-本地部署-qwen3.6-27b-q4-调优指南与实测报告（TID:524，96K 上下文走钢丝）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/542/542/rtx-5070-ti-本地部署-qwen3-35b-a3b-moe-vs-27b-dense-对比报告"&gt;RTX 5070 Ti 本地部署 Qwen3 35B-A3B (MoE) vs 27B (Dense) 对比报告&lt;/a&gt; — https://lcz.me/topic/542/542/rtx-5070-ti-本地部署-qwen3-35b-a3b-moe-vs-27b-dense-对比报告（TID:542）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1354/1354/微星-b660m-迫击炮-4060ti-16g-i7-12700k-ddr4-32g-本地部署-qwen3.8-27b-怎么吐字最快"&gt;微星 B660M 迫击炮 + 4060Ti 16G + i7-12700K + DDR4 32G，本地部署 Qwen3.8-27B 怎么吐字最快？&lt;/a&gt; — https://lcz.me/topic/1354/1354/微星-b660m-迫击炮-4060ti-16g-i7-12700k-ddr4-32g-本地部署-qwen3.8-27b-怎么吐字最快（TID:1354，单卡 offload 速度、MTP 负优化、双卡方案）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1268/1268/双rtx5070ti在llama.cpp环境下运行qwen3.8-27b的效果"&gt;双 RTX5070TI 在 llama.cpp 环境下运行 Qwen3.8-27B 的效果&lt;/a&gt; — https://lcz.me/topic/1268/1268/双rtx5070ti在llama.cpp环境下运行qwen3.8-27b的效果（TID:1268）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/188/188/两张5060ti-16g想部署qwen3.6-27b用来写代码"&gt;两张 5060ti 16g 想部署 qwen3.6 27b 用来写代码&lt;/a&gt; — https://lcz.me/topic/188/188/两张5060ti-16g想部署qwen3.6-27b用来写代码（TID:188，双卡 vs 单卡取舍）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/29/29/另类16gb-12gb配置"&gt;另类 16GB+12GB 配置&lt;/a&gt; — https://lcz.me/topic/29/29/另类16gb-12gb配置（TID:29，单卡大显存 vs 多卡拼显存）&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="16G显存"/><category term="量化"/><category term="模型选择"/><category term="RX6800XT"/><category term="4060Ti"/><category term="5060Ti"/><category term="5070Ti"/><category term="Qwen"/><category term="MoE"/><category term="KV缓存"/><category term="本地模型"/><category term="理性对比"/></entry><entry><title>显卡选好了，其他配件怎么配？四大路线详解 X99洋垃圾/消费级/工作站/整机</title><link href="https://blog.cycleuser.org/xian-qia-xuan-hao-liao-qi-ta-pei-jian-zen-yao-pei-si-da-lu-xian-xiang-jie-x99yang-la-ji-xiao-fei-ji-gong-zuo-zhan-zheng-ji.html" rel="alternate"/><published>2026-09-09T18:00:00+08:00</published><updated>2026-09-09T18:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-09:/xian-qia-xuan-hao-liao-qi-ta-pei-jian-zen-yao-pei-si-da-lu-xian-xiang-jie-x99yang-la-ji-xiao-fei-ji-gong-zuo-zhan-zheng-ji.html</id><summary type="html">&lt;h1&gt;显卡选好了，其他配件怎么配？四大路线详解 X99 洋垃圾/消费级/工作站/整机&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;前面几篇聊了本地部署值不值、显存怎么选、显卡 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1&gt;显卡选好了，其他配件怎么配？四大路线详解 X99 洋垃圾/消费级/工作站/整机&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;前面几篇聊了本地部署值不值、显存怎么选、显卡按价位怎么挑。这一篇解决最后一块拼图：&lt;strong&gt;显卡定下来之后，主板、CPU、内存、电源、机箱这些"配角"到底怎么配？&lt;/strong&gt; 同样的显卡，有人用 X99 洋垃圾平台 3000 块搞定整机，有人上最新消费级平台花一万多——差距在哪，分别适合谁？本文把论坛里真实玩家的四类装机路线全部拆开，附预算区间、适用场景、长处短板和抄作业清单，数据与观点均来自抡锤者（lcz.me）论坛的真实装机分享。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;先说三个通用原则（任何路线都适用）&lt;/h2&gt;
&lt;p&gt;无论你走哪条路线，下面三件事是所有 AI 装机玩家反复强调的，先记牢：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;电源是整机里最不能省、也最值得多花钱的配件。&lt;/strong&gt; 论坛老玩家原话："电源这个东西最不能省，又是最耐用的，买一个好的 10 年都不会坏，也不担心把别的更贵的硬件搞坏。显卡会降价、CPU 会换代，但好的电源不会。"[1] 容量建议留到整机功耗的 1.5-2 倍以应付瞬时峰值（3090/7900XTX 瞬时功耗可达 450-800W+）[1][5]。&lt;strong&gt;千万别用老旧或没有品质保障的电源&lt;/strong&gt;——轻则掉盘，重则起火[1]。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内存是"跑不跑得动"的关键，不是"跑得快不快"的关键。&lt;/strong&gt; 权重主要在显存里，内存只参与加载和 offload，所以&lt;strong&gt;内存频率和时序对推理影响很小，容量才是重点&lt;/strong&gt;[8]。内存容量一般按"模型加载 + 系统 + 预留"算，跑 27B 建议 64G 起步，跑大模型 + ComfyUI 同时开建议 128G[5][12]。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PCIe 通道数决定你未来能不能加第二张卡。&lt;/strong&gt; 单卡随便什么板都行，但&lt;strong&gt;想升级双卡，主板必须有两根 CPU 直连的 x16 槽（或支持拆分 x8+x8）&lt;/strong&gt;，否则第二张卡只能跑 x4，白花钱[12][6]。这个坑非常多，下面每档都会提醒。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;路线一：X99 洋垃圾平台（极致性价比 / 预算 3000-6000）&lt;/h2&gt;
&lt;p&gt;论坛讨论度最高、被叫做"抄作业"最多的路线。核心思路是：用退役服务器平台（华南金牌 X99 主板 + 洋垃圾 Xeon E5 CPU + RECC 服务器内存）把 CPU、主板、内存的成本压到极低，把预算全部砸在显卡上。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;典型配置清单（抄作业）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配件&lt;/th&gt;
&lt;th&gt;型号推荐&lt;/th&gt;
&lt;th&gt;预算&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;主板&lt;/td&gt;
&lt;td&gt;华南金牌 X99-TF / X99-AD4 单路 ATX&lt;/td&gt;
&lt;td&gt;300-500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;E5-2686v4 / E5-2680v4（14-18 核）&lt;/td&gt;
&lt;td&gt;100-300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;DDR4 RECC 4×16G=64G（四通道必须插满）&lt;/td&gt;
&lt;td&gt;400-900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;显卡&lt;/td&gt;
&lt;td&gt;你选的 24G-32G 卡&lt;/td&gt;
&lt;td&gt;主力预算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;电源&lt;/td&gt;
&lt;td&gt;长城/鑫谷 1000W 金牌&lt;/td&gt;
&lt;td&gt;500-750&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;硬盘&lt;/td&gt;
&lt;td&gt;1TB NVMe&lt;/td&gt;
&lt;td&gt;400-500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;机箱/散热&lt;/td&gt;
&lt;td&gt;中塔机箱 + 风扇若干&lt;/td&gt;
&lt;td&gt;200-500&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;怎么选 X99 板的三个要点&lt;/strong&gt;（论坛老手总结）：①认准&lt;strong&gt;单路 ATX 板&lt;/strong&gt;（X99-AD3/AD4/TF 这类），第一条 PCIe x16 必须是 CPU 直连满速槽；别碰双路板，单卡用双路纯浪费。②&lt;strong&gt;内存四通道必须插满 4 条&lt;/strong&gt;才不浪费带宽——4×16G 起步，别买单条 32G×2 带宽直接腰斩。③CPU 选 v4 不用折腾"鸡血 BIOS"更省心；跑 ComfyUI 或大内存需求选 128G[2]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;真实成交价参考&lt;/strong&gt;：一套"华南 X99-TF + E5-2686v4 + 128G DDR4"平台约 1900 元；某 7900XTX 整机（含显卡 6499 + 平台）总计约 1.06 万[3]；双路 E5-2686v4 + X99 双路板 + 64G 平台约 2800 元[12]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;长处：&lt;/strong&gt; 价格无敌，CPU 核心多（18 核 36 线程"量大管饱"），内存白菜价能上 128G-256G，跑长上下文、同时开多个服务、CPU 通道兜底处理 N 卡专属模型（如 VOXCPM 走 CPU 也能跑）都从容[3]。
&lt;strong&gt;短板：&lt;/strong&gt; 平台老（PCIe 3.0，双卡 TP 带宽受限）；DDR3 版与 DDR4 版别买错（插不进）；洋垃圾主板品控看运气、BIOS 折腾多、无保修；机箱风道和风扇噪音要自己打理[2][3]。
&lt;strong&gt;适合谁：&lt;/strong&gt; 预算紧张但想上大显存显卡的低预算玩家、愿意折腾、不介意二手和噪音。&lt;/p&gt;
&lt;h2&gt;路线二：消费级新平台（省心省事 / 预算 6000-12000 不含显卡）&lt;/h2&gt;
&lt;p&gt;"不折腾、要保修、装完就能用"的主流路线。用全新主流平台（Intel B760/Z890 或 AMD B650/B850 + i5/R5 级 CPU）配一张中高端显卡，也是论坛老玩家给大多数普通用户的首选。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;单卡方案（抄作业）：&lt;/strong&gt;
- CPU：R5 7600 / i5-13400F 级别就够（"模型全放 GPU 后，推理主要吃显卡，不需要 9950X 这种级别"）[7][6]
- 主板：B650/B850 ATX 或 B760，认准&lt;strong&gt;第一条显卡槽 CPU 直连 x16&lt;/strong&gt;、M.2 数量够
- 内存：64GB（2×32G）DDR5；预算紧 DDR4 也行（"DDR5 6000 和 DDR4 2133 对推理影响很小"）[8]
- 电源：850W 起（7900XTX 建议 1000W）ATX 3.0/3.1[7]
- 机箱：大风道中塔，注意显卡长度厚度&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总预算参考&lt;/strong&gt;：R5 7500F + B650 + 32G DDR5 + 850W + 1TB ≈ 3700 元[6]；i5-13400F + B760 + 64G DDR4 + 1000W ≈ 3300 元[6]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;长处：&lt;/strong&gt; 全新有保修、装完即用、噪音功耗低、PCIe 4.0/5.0 带宽足、未来升级空间明确[6][7]。AMD AM5 平台还有"双卡原生 x8+x8"的板子可选（如 B850 AI TOP、X870E Creator），为将来留路[12]。
&lt;strong&gt;短板：&lt;/strong&gt; 价格比洋垃圾高出一截，同样预算下显卡档次会被拉低；消费级板子&lt;strong&gt;双卡位选择要仔细看&lt;/strong&gt;（很多 B 系列板第二条 x16 只有 x4）[12]。
&lt;strong&gt;适合谁：&lt;/strong&gt; 大多数不想折腾的玩家、需要稳定工作的生产力用户、预算能覆盖显卡 + 新平台的人。&lt;/p&gt;
&lt;h2&gt;路线三：工作站/专业平台（多卡与极致性能 / 预算 1.5 万-3 万起不含显卡）&lt;/h2&gt;
&lt;p&gt;目标是双卡 TP、70B+ 大模型、或 4 卡以上 ComfyUI 集群的玩家，普通消费级平台满足不了，需要上工作站级或双路服务器平台。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键认知：PCIe Switch 与 P2P。&lt;/strong&gt; 想多卡真正高效协同，主板最好带 PCIe Switch（PLX）芯片实现物理 P2P。论坛给出的推荐排序：
- 华硕 Pro WS TRX50-SAGE（PCIe 5.0、板载 Switch，综合首选，整机 1.5-2 万+）
- 超微 H12D 系列（EPYC 双路、企业级、二手性价比极高，但机箱风扇噪音大，适合机房）
- 华南双路 X99/X10（预算最低的双路，PCIe 3.0 带宽上限低）[9]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但必须泼的冷水：&lt;/strong&gt; 论坛老玩家多次强调，&lt;strong&gt;如果只是跑 27B 这类单卡放得下的模型，双卡各跑各的，PCIe 3.0 还是 4.0 几乎没差别，选便宜的就行&lt;/strong&gt;；只有上 70B 级走张量并行（TP）才真正吃 PCIe 带宽[8]。另外 &lt;strong&gt;A 卡（R9700/7900XTX）双卡没有 P2P，跨卡通信要绕主机内存，TP 效率大打折扣&lt;/strong&gt;——想玩双卡 TP 老老实实选 N 卡[8]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;长处：&lt;/strong&gt; 多卡扩展上限高、内存可上 128-512G、适合多人并发/多模型同时服务/训练。
&lt;strong&gt;短板：&lt;/strong&gt; 贵、噪音大、占地大、功耗高（双路 E5 待机 100W+，满载 300W+ CPU 功耗）[4]。
&lt;strong&gt;适合谁：&lt;/strong&gt; 明确要双卡 TP 或 4 卡以上、有场地放得下服务器、预算充足的重度玩家。&lt;/p&gt;
&lt;h2&gt;路线四：品牌整机/准系统（省心兜底 / 预算 4000-15000）&lt;/h2&gt;
&lt;p&gt;不想自己攒机、又想要服务器级扩展性的选择——直接买二手品牌工作站整机或准系统。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;典型代表（论坛实测推荐）：&lt;/strong&gt;
- &lt;strong&gt;戴尔 T7910 双路工作站&lt;/strong&gt;：双 CPU 8 通道 DDR4 ECC + 1300W 原装电源，二手整机路线，比 X99 洋垃圾"省心一点但换机箱电源照样折腾"[2]
- &lt;strong&gt;联想 P910 准系统&lt;/strong&gt;：适合装双卡（如双 R9700）但要注意机箱内部空间[11]
- 这类机器的好处：原厂做工、供电扎实、PCIe 布局合理，缺点是体积大、年份老、升级空间有限[2][11]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;长处：&lt;/strong&gt; 原厂电源供电稳、扩展位多、适合"懒人上双卡"。
&lt;strong&gt;短板：&lt;/strong&gt; 老平台性能受限、噪音大、内部布局紧凑改装麻烦。
&lt;strong&gt;适合谁：&lt;/strong&gt; 不想自己挑配件、需要多卡又信不过杂牌洋垃圾板的玩家。&lt;/p&gt;
&lt;h2&gt;四条路线总对比&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;路线&lt;/th&gt;
&lt;th&gt;平台成本&lt;/th&gt;
&lt;th&gt;核心优势&lt;/th&gt;
&lt;th&gt;主要短板&lt;/th&gt;
&lt;th&gt;适合谁&lt;/th&gt;
&lt;th&gt;备查&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;X99 洋垃圾&lt;/td&gt;
&lt;td&gt;3000-6000&lt;/td&gt;
&lt;td&gt;极致性价比、内存白菜价、CPU 核多&lt;/td&gt;
&lt;td&gt;折腾多、无保修、PCIe 3.0&lt;/td&gt;
&lt;td&gt;低预算/爱折腾玩家&lt;/td&gt;
&lt;td&gt;[2][3]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;消费级新平台&lt;/td&gt;
&lt;td&gt;6000-12000&lt;/td&gt;
&lt;td&gt;省心、有保修、安静低功耗&lt;/td&gt;
&lt;td&gt;同预算下显卡档次被拉低&lt;/td&gt;
&lt;td&gt;大多数普通用户&lt;/td&gt;
&lt;td&gt;[6][7]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;工作站/专业平台&lt;/td&gt;
&lt;td&gt;1.5万起&lt;/td&gt;
&lt;td&gt;多卡扩展、P2P、大内存&lt;/td&gt;
&lt;td&gt;贵、噪音大、占地方&lt;/td&gt;
&lt;td&gt;双卡 TP/重度用户&lt;/td&gt;
&lt;td&gt;[9]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;品牌整机/准系统&lt;/td&gt;
&lt;td&gt;4000-15000&lt;/td&gt;
&lt;td&gt;原厂做工、供电稳、扩展好&lt;/td&gt;
&lt;td&gt;老平台、布局紧凑&lt;/td&gt;
&lt;td&gt;不想自攒的多卡用户&lt;/td&gt;
&lt;td&gt;[2][11]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;预算导向的完整方案示例（含显卡）&lt;/h2&gt;
&lt;p&gt;把前几篇的显卡选择也串进来，给你三档可直接照抄的完整配置（价格为论坛 2026 年中的常见区间）：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;低预算档（约 1 万元整机）—— X99 + 二手 3090 24G&lt;/strong&gt;
X99 单路板 + E5-2680v4 + 64G DDR4 RECC（约 1200 元）+ 二手 3090 24G（约 4500-5000 元）+ 1000W 金牌（约 600 元）+ 1TB NVMe + 机箱 ≈ 9000-10000 元。跑 27B 流畅、首字 1-2 秒，兼顾知识库 RAG[5]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;中档预算（约 1.5-1.8 万元整机）—— 消费级新平台 + R9700 32G / 4080S 32G&lt;/strong&gt;
B650/B850 + R5 7600（约 2000 元）+ 64G DDR5 + 850W ATX3.0（约 3000 元）+ R9700 32G（约 7000-8000 元）或 4080S 32G 魔改。省心安静、未来可加第二张卡[6][7]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;高端预算（约 2-2.5 万元整机）—— 工作站级或双卡&lt;/strong&gt;
双 3090 NVLink（二手约 1 万）+ X99 双路板或 AM5 双 x8 主板，或单 4090D 48G 魔改（约 2 万）走单卡省心路线[9][6]。&lt;/p&gt;
&lt;h2&gt;一点忠告&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;配件预算别跟显卡抢钱，但也别把电源和机箱省到离谱。&lt;/strong&gt; 电源是最该多花的钱[1]，机箱风道直接影响你那张厚卡会不会过热降频。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存买容量、别追频率。&lt;/strong&gt; DDR5-5600/6000 足够，贵一倍的 6400+ CL30 跑 AI 几乎没差别，省下的钱加到显卡上更值[10][7]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;决定未来的是主板的 PCIe 槽位，不是 CPU 型号。&lt;/strong&gt; 想以后加第二张卡，现在就买两根 CPU 直连 x16 的板子，电源一步到位 1200W[7]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;别因为"网上都在用 X99"就上 X99。&lt;/strong&gt; 爱折腾、图便宜选洋垃圾；要省心、要保修、怕噪音就老老实实消费级新平台——两条路都对，选符合你性格的那条[2][12]。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;买配件和选显卡是同一件事：&lt;strong&gt;没有最好的配置，只有最适合你的预算、场景和折腾意愿的配置。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考来源&lt;/h2&gt;
&lt;p&gt;本文配置与观点均来自抡锤者（lcz.me）论坛会员的真实装机分享，原帖均可点击查看完整清单：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/550/550/提醒一下诸位-千万不要使用老旧或者品质没有保障的电源"&gt;提醒一下诸位，千万不要使用老旧或者品质没有保障的电源&lt;/a&gt; — https://lcz.me/topic/550/550/提醒一下诸位-千万不要使用老旧或者品质没有保障的电源（TID:550）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1353/1353/已经买了个7900xtx-怎么去华南金牌选x99型号-抄个作业-论坛没搜索功能"&gt;已经买了个 7900xtx，怎么去华南金牌选 x99 型号，抄个作业&lt;/a&gt; — https://lcz.me/topic/1353/1353/已经买了个7900xtx-怎么去华南金牌选x99型号-抄个作业-论坛没搜索功能（TID:1353，含 X99 选板要点与 T7910 整机路线）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/613/613/交作业-华南金牌-x99-tf-e5-2686v4-蓝宝石7900xtx-白金板"&gt;【交作业】华南金牌 X99-TF + E5 2686V4 + 蓝宝石 7900XTX 白金板&lt;/a&gt; — https://lcz.me/topic/613/613/交作业-华南金牌-x99-tf-e5-2686v4-蓝宝石7900xtx-白金板（TID:613，完整配置清单与总价 1.06 万）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/779/779/双3090-本地ai-大家现在还用消费级平台-还是已经转-trx40-了"&gt;双 3090 本地 AI，大家现在还用消费级平台，还是已经转 TRX40 了？&lt;/a&gt; — https://lcz.me/topic/779/779/双3090-本地ai-大家现在还用消费级平台-还是已经转-trx40-了（TID:779，消费级 vs 工作站功耗与 PCIe 分析）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/626/626/求助-预算-1w-以内-自费组装-购买一台跑本地知识库的机器-求推荐配置"&gt;预算 1W 以内，自费组装/购买一台跑本地知识库的机器，求推荐配置&lt;/a&gt; — https://lcz.me/topic/626/626/求助-预算-1w-以内-自费组装-购买一台跑本地知识库的机器-求推荐配置（TID:626）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/888/888/2w预算-想本地模型跑hermes与comfyui出视频需要真正用于生产-求推荐硬件配置"&gt;2W 预算，想本地模型跑 hermes 与 comfyui 出视频需要真正用于生产，求推荐硬件配置&lt;/a&gt; — https://lcz.me/topic/888/888/2w预算-想本地模型跑hermes与comfyui出视频需要真正用于生产-求推荐硬件配置（TID:888，含多档消费级配置清单）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1458/1458/目前我有一张5090-想部署qwen3.8-的话-后续的板u内存硬盘机箱之类的给如何搭配-有没有性价比的方案"&gt;目前我有一张 5090，想部署 Qwen3.8，后续板 U 内存硬盘机箱如何搭配&lt;/a&gt; — https://lcz.me/topic/1458/1458/目前我有一张5090-想部署qwen3.8-的话-后续的板u内存硬盘机箱之类的给如何搭配-有没有性价比的方案（TID:1458，单卡消费级配置原则）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1238/1238/双r9700如何配置"&gt;双 R9700 如何配置？&lt;/a&gt; — https://lcz.me/topic/1238/1238/双r9700如何配置（TID:1238，PCIe 带宽/内存对推理影响与 A 卡双卡 P2P 分析）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1238/1238/双r9700如何配置"&gt;双 R9700 / 多卡 PCIe Switch 主板分析与推荐排行&lt;/a&gt; — https://lcz.me/topic/1238/1238/双r9700如何配置（TID:1238 回复，TRX50/超微 H12 等 P2P 主板对比）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/225/225/虚心请教国内预算5w求配置"&gt;虚心请教国内预算 5w 求配置&lt;/a&gt; — https://lcz.me/topic/225/225/虚心请教国内预算5w求配置（TID:225，内存"没必要上太好"与多显卡方案取舍）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1558/1558"&gt;美帝良心的 P910 准系统是否适合来装双 R9700&lt;/a&gt; — https://lcz.me/topic/1558/1558（TID:1558）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/234/234/比较流畅的跑qwen-3.6-27b-模型本地部署-使用ai-pro-r9700-主机怎么配置"&gt;比较流畅的跑 Qwen 3.6 27B 模型本地部署，使用 AI PRO R9700，主机怎么配置&lt;/a&gt; — https://lcz.me/topic/234/234/比较流畅的跑qwen-3.6-27b-模型本地部署-使用ai-pro-r9700-主机怎么配置（TID:234，含 AM5 双 x8 主板清单、X99 双路成交价等）&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="装机配置"/><category term="X99"/><category term="主板"/><category term="CPU"/><category term="内存"/><category term="电源"/><category term="洋垃圾"/><category term="工作站"/><category term="显卡"/><category term="本地模型"/><category term="预算"/><category term="理性对比"/></entry><entry><title>本地跑模型的显卡怎么选？从2000到2万的价位全景指南</title><link href="https://blog.cycleuser.org/ben-di-pao-mo-xing-de-xian-qia-zen-yao-xuan-cong-2000dao-2mo-de-jie-wei-quan-jing-zhi-nan.html" rel="alternate"/><published>2026-09-09T16:00:00+08:00</published><updated>2026-09-09T16:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-09:/ben-di-pao-mo-xing-de-xian-qia-zen-yao-xuan-cong-2000dao-2mo-de-jie-wei-quan-jing-zhi-nan.html</id><summary type="html">&lt;h1&gt;本地跑模型的显卡怎么选？从 2000 到 2 万的价位全景指南&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;前面两篇分别聊了 24G/32G 怎么选、以及本地部署到底值不值得。这一 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1&gt;本地跑模型的显卡怎么选？从 2000 到 2 万的价位全景指南&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;前面两篇分别聊了 24G/32G 怎么选、以及本地部署到底值不值得。这一篇把"显卡本身"摊开：本地跑模型到底有哪些卡能选？按预算怎么排？本文只用一个统一的尺子——跑社区最主流的 Qwen 27B（以及少量 35B MoE）的真实速度——把 2000 元的入门卡到几万元的 AI 小主机这些路线全部标出来，并给出每一档适合谁。速度数字都是从论坛实测信息中总结出来的，出处编号见文末；价格行情则是 2026 年 9 月 13 日在淘宝、闲鱼上检索到的实际挂牌价，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;先说四个选卡的前提&lt;/h2&gt;
&lt;p&gt;在罗列显卡之前，有四件事必须先讲清楚，否则下面的数字你会看不懂：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;跑 27B 是社区统一的"尺子"。&lt;/strong&gt; 目前本地部署最主流的模型是 Qwen3.6 / 3.8-27B（Q4 量化约 16-17GB），论坛几乎所有显卡实测都拿它当基准[6]。比它小的是 14B 及以下，比它大的是 35B-A3B（MoE）、120B 级大模型。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同一张卡速度能差一倍，关键看三样：投机解码（MTP/DFlash/EAGLE）开不开、上下文开多大、思考链开几档&lt;/strong&gt;[6]。下面标注的速度都尽量注明条件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;显存容量 &amp;gt; 速度。&lt;/strong&gt; 显存不够直接"跑不起来"，速度只是快慢问题。选卡第一件事是算清楚你的目标模型量化后多大、要开多少上下文[3]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;价格是浮动的。&lt;/strong&gt; 二手市场（3090、7900XTX、2080Ti 魔改）价格波动很大，以下价格为 &lt;strong&gt;2026 年 9 月 13 日&lt;/strong&gt;查到的大致区间。&lt;strong&gt;价格随时可能变化，甚至几天一个价，入手前请务必到淘宝、闲鱼等平台查一下当时的实际成交价，不要照搬本文数字。&lt;/strong&gt;[1][9]&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;先看行情：各卡价格速查（2026 年 9 月 13 日）&lt;/h2&gt;
&lt;p&gt;在展开各档位之前，先把当天在淘宝（新卡/拆机）和闲鱼（二手个人）上检索到的价格列出来，方便对照。同一型号价差极大，主要看成色、是否魔改、有无保修、是不是拆机/矿卡。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;显卡&lt;/th&gt;
&lt;th&gt;淘宝（新卡 / 拆机）&lt;/th&gt;
&lt;th&gt;闲鱼（二手个人）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RTX 3060 12G&lt;/td&gt;
&lt;td&gt;2100-3500（典型 2700）&lt;/td&gt;
&lt;td&gt;1600-2200（典型 1950）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tesla P40 24G&lt;/td&gt;
&lt;td&gt;1269-1280&lt;/td&gt;
&lt;td&gt;1200-1400&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2080Ti 22G 魔改&lt;/td&gt;
&lt;td&gt;2600-2800&lt;/td&gt;
&lt;td&gt;2500-2600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 5060Ti 16G&lt;/td&gt;
&lt;td&gt;3600-4900&lt;/td&gt;
&lt;td&gt;基本无整卡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 3090 24G&lt;/td&gt;
&lt;td&gt;拆机 3600-5100；公版新 8400-8600&lt;/td&gt;
&lt;td&gt;7300-8800（典型 7600-8000）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RX 7900XTX 24G&lt;/td&gt;
&lt;td&gt;新卡 5400-8700&lt;/td&gt;
&lt;td&gt;4800-6400（典型 5000-5600）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Radeon AI PRO R9700 32G&lt;/td&gt;
&lt;td&gt;新卡 11000-16000（常见 11500-14000）&lt;/td&gt;
&lt;td&gt;仅见工程样品&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 4080S 32G 魔改&lt;/td&gt;
&lt;td&gt;9000-15000&lt;/td&gt;
&lt;td&gt;基本无整卡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4090D 48G 魔改&lt;/td&gt;
&lt;td&gt;20000-27000&lt;/td&gt;
&lt;td&gt;多为扩容服务，非整卡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 5090 32G&lt;/td&gt;
&lt;td&gt;新卡 28000-48500&lt;/td&gt;
&lt;td&gt;二手 5090D 23400-23500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX PRO 6000&lt;/td&gt;
&lt;td&gt;41438-217799（84G 版 4-7 万；96G 版 13-22 万）&lt;/td&gt;
&lt;td&gt;无&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MI210 64G&lt;/td&gt;
&lt;td&gt;拆机 4000 / 全新 18500&lt;/td&gt;
&lt;td&gt;3999-4000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA DGX Spark（GB10 整机）&lt;/td&gt;
&lt;td&gt;22959-44800（典型 33000-36000）&lt;/td&gt;
&lt;td&gt;基本无整机挂单&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD AI Max+ 395（Strix Halo 整机）&lt;/td&gt;
&lt;td&gt;12499-28999（典型 16000-18000）&lt;/td&gt;
&lt;td&gt;多为 CPU 散片/定金，非整机&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;这张表能看出两个关键信号：&lt;strong&gt;一是二手 3090 已经明显涨价&lt;/strong&gt;，闲鱼个人卡普遍 7600-8000 元，和当年 4500-5500 元的行情完全是两回事；&lt;strong&gt;二是 7900XTX 二手反而比 3090 便宜&lt;/strong&gt;（4800-6400），单卡速度还更快，差距只剩在 A 卡生态上。下面各档位的取舍都会围绕这两点重新说明。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;第零档：入门试水（2000 元以内）&lt;/h2&gt;
&lt;p&gt;预算极低、只想先感受"本地模型"是什么感觉，不想一上来花大钱。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;显存&lt;/th&gt;
&lt;th&gt;能跑什么&lt;/th&gt;
&lt;th&gt;实测&lt;/th&gt;
&lt;th&gt;一句话评价&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;二手 RTX 3060 12G&lt;/td&gt;
&lt;td&gt;12GB&lt;/td&gt;
&lt;td&gt;7-14B 完全体；27B 勉强（要 CPU offload）&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;CUDA 省心，最便宜的入坑卡&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tesla P40 24G（洋垃圾）&lt;/td&gt;
&lt;td&gt;24GB&lt;/td&gt;
&lt;td&gt;27B Q4 能跑&lt;/td&gt;
&lt;td&gt;35B-A3B Q5 约 45-60 t/s（配 2080Ti 缝合）[2]&lt;/td&gt;
&lt;td&gt;被动散热、无视频输出，纯计算卡，折腾门槛高[2]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;论坛里对洋垃圾（P40、V100、CMP170HX）的主流态度：&lt;strong&gt;不是不能玩，而是"买来跑推理都算踩坑"&lt;/strong&gt;——显存数字好看，但每一步都在跟驱动、散热、平台兼容搏斗，调试成本远超省下的钱[12]。真想稳定大显存，社区验证过的路还是正常卡或 3090 双卡。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;第一档：丐版双卡（4000-8000 元）——低预算的性价比之王&lt;/h2&gt;
&lt;p&gt;这一档是论坛讨论最热烈的地方，核心思路是"用两张便宜的 N 卡凑显存"。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;双 RTX 3060 12G（约 4000 元）&lt;/strong&gt;
论坛名帖"最丐 Qwen3.6-27b"，两张 3060 合计约 4000 元（二手 3060 12G 闲鱼约 1900-2200 元/张），实测 27B Q4：&lt;strong&gt;MTP 开 43-50 t/s、关闭 MTP 31-36 t/s，prefill 稳定 600 t/s 上下&lt;/strong&gt;。结论是"速度极其稳定、GPU 占用率长时间 100%，CUDA 就是成熟"[1]。双 16G 的 4060Ti/5060Ti 效果更好。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;双 RTX 2080Ti 22G 魔改（约 5000-5300 元）&lt;/strong&gt;
魔改 22G 的 2080Ti 是另一条路。双卡实测 27B：&lt;strong&gt;decode 60-82 t/s、prefill 约 1000 t/s&lt;/strong&gt;（llama.cpp TP）[11][17]。也有单卡 TP2 跑 27B-FP8 的实测，decode 60-106 t/s、prefill 1100-1300 t/s[17]。2080Ti 有 NVLink，双卡通信比纯 PCIe 好。缺点是魔改卡有翻车风险、无官方保修。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;双 RTX 5060Ti 16G（约 7200-8000 元）&lt;/strong&gt;
Blackwell 新卡，两卡合计 32GB。实测 vLLM TP 模式 35-78 t/s、LM Studio 实际 26-50 t/s[7]。新卡有保修、能效好，但价格已接近单张二手 3090。论坛观点："双 16G 卡虽然性价比下降，但 CUDA 发挥稳定，效果更好"[1]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这一档小结：&lt;/strong&gt; 双 N 卡是社区公认最省心的丐版路线。按 9 月 13 日的行情，双 3060 合计约 4000 元，仍是最便宜的双卡入坑方案；双 2080Ti 22G 约 5000-5300 元；但双 5060Ti 已经要 7200-8000 元，接近一张二手 3090，"极致便宜"的标签主要留给前两个组合。另外要注意——&lt;strong&gt;双卡跑单模型要走 TP/张量并行，速度不是 2 倍，约 1.3-1.5 倍&lt;/strong&gt;，且 PCIe 通信有开销；跨卡调度在写代码这类频繁交互场景延迟明显[1][4]。&lt;/p&gt;
&lt;h2&gt;第二档：24G 单卡主力（5000-8000 元）——最主流的选择&lt;/h2&gt;
&lt;p&gt;如果只想插一张卡、不想折腾双卡，这一档是绝对主流。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二手 RTX 3090 24G（闲鱼个人卡约 7600-8000 元 / 淘宝拆机 3600-5100 元）&lt;/strong&gt;
CUDA 生态 + 24G，本地跑 27B 的"最省心单卡"。实测 27B：&lt;strong&gt;MTP 开约 55-70 t/s、168K 上下文稳定，思考态 45-60 t/s&lt;/strong&gt;[6]。论坛大量"3090 24G 单卡"实战帖，工具调用、长上下文都验证充分[6]。&lt;strong&gt;但要提醒一句，3090 这一年涨得很凶&lt;/strong&gt;：闲鱼个人自用卡普遍报到 7600-8000 元，淘宝上 3600-5100 元的便宜货基本是拆机/矿卡，水深，功耗也高（350W）[6]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RX 7900XTX 24G（二手约 4800-6400 元 / 新卡 6500-8000 元）&lt;/strong&gt;
24G 大带宽卡，游戏旗舰定位。实测 27B Q4：&lt;strong&gt;不开投机约 39 t/s，Vulkan+MTP 后 51-73 t/s&lt;/strong&gt;（工具调用 73.4 t/s），prefill 约 587 t/s[8][9]。速度是 24G 档里最能打的，但 A 卡要吃 ROCm/Vulkan 生态的折腾成本[9]。&lt;strong&gt;这里出现了一个"价格倒挂"&lt;/strong&gt;：7900XTX 二手已经比 3090 便宜（4800-6400 对 7600-8000），单卡速度还更快，唯一的门槛就是 A 卡生态[9][14]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这一档怎么选：&lt;/strong&gt;
- 想要省心、驱动稳定、双卡扩展潜力 → &lt;strong&gt;3090&lt;/strong&gt;（但二手已涨到 7600-8000，预算要留够）
- 想要单卡最高速度、且愿意折腾 A 卡 → &lt;strong&gt;7900XTX&lt;/strong&gt;（二手 4800-6400，如今反而更划算）&lt;/p&gt;
&lt;h2&gt;第三档：32G 大显存（9000-16000 元）——面向长上下文与更高精度&lt;/h2&gt;
&lt;p&gt;显存上到 32G，意味着 27B 能开 Q6/Q8 高精度、或 128K-256K 长上下文，还能跑 35B-A3B 这类 MoE。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Radeon AI PRO R9700 32G（全新约 11000-16000 元）&lt;/strong&gt;
RDNA4 新卡，32G 大显存。实测 27B Q4：&lt;strong&gt;约 27.6 t/s（不开投机）、MTP 优化后 35-50 t/s&lt;/strong&gt;[15][16]；vLLM 特调（MXFP4+DFlash2）下 prefill 能到 2000-3300 t/s、decode 思考态 40/编程 70-80 t/s[5]。速度不如 7900XTX，但&lt;strong&gt;胜在 32G 大显存 + 新卡保修 + ROCm 支持比 RDNA3 更好&lt;/strong&gt;——长上下文、高精度量化、ComfyUI 视频是它的主场[9][15]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RTX 4080S 32G 魔改版（约 9000-15000 元）&lt;/strong&gt;
N 卡 32G 的魔改路线。实测 llama.cpp + MTP：&lt;strong&gt;decode 中位约 89 t/s（不开投机仅 31）、冷 prefill 约 1900 t/s，307K 统一上下文池&lt;/strong&gt;——32G 卡里相当能打[13]。与 R9700 价格接近，"N 卡生态 + 32G"是它最大的卖点，但魔改卡无官方保修，看运气[13]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这一档怎么选：&lt;/strong&gt;
- 要 N 卡生态 + 32G + 高速度 → 4080S 32G 魔改（接受无保修风险）
- 要新卡保修 + 32G + A 卡生态能忍 → R9700（A 卡生态当前最强 4 代）&lt;/p&gt;
&lt;h2&gt;第四档：48G 高端（15000-27000 元）——为"更大模型"铺路&lt;/h2&gt;
&lt;p&gt;上了 48G，27B 只是热身，真正的价值是能跑更大模型、开更长上下文、或跑 ComfyUI 视频生成不打架。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;双 RTX 3090 NVLink（约 15000-16000 元）&lt;/strong&gt;
论坛验证最充分的高端方案。双 3090 + NVLink 实测 27B：&lt;strong&gt;vLLM + AWQ-INT4 + MTP 工具调用 130 t/s、262K 上下文全开&lt;/strong&gt;[10]；SGLang 版常规对话 88 t/s、中文散文 178 t/s[18]；半年实测 4 用户并发饱和 258 t/s[3]。48G 显存让 27B 开满上下文毫无压力，还能给多用户/多 Agent 用。&lt;strong&gt;不过双 3090 也跟着涨价&lt;/strong&gt;：按闲鱼单张 7600-8000 元算，两张加 NVLink 桥就是 15000-16000 元，仍比 4090D 48G 单卡（20000-27000）便宜，但"性价比最高"已经要打个折扣[6][10]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4090D 48G 魔改（约 20000-27000 元）&lt;/strong&gt;
单卡 48G。实测 27B W4A16-AWQ + SGLang + DFlash2：&lt;strong&gt;平均 110 tok/s&lt;/strong&gt;[4]；FP8 版本 63-76 t/s。单卡 48G 意味着不用双卡、没有跨卡开销，部署最省心，但魔改卡贵且无官方保修[4]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这一档怎么选：&lt;/strong&gt;
- 预算敏感、能接受双卡折腾 → 双 3090（价格较低、可扩展）
- 不想折腾、要单卡省心 → 4090D 48G 魔改&lt;/p&gt;
&lt;h2&gt;第五档：旗舰与专业卡（2.8 万元以上）——追求极致或有特殊需求&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;RTX 5090 32G&lt;/strong&gt;
当前消费级最强。实测 27B：&lt;strong&gt;NVFP4 单请求 decode 中位 143 tok/s、MTP 结构化输出 219.8 t/s，prefill 8000+ t/s&lt;/strong&gt;；3 并发满载每路 146 t/s[19][20]。新卡约 2.8-4.5 万元，二手 5090D 约 2.3-2.4 万元。适合预算无上限、追求"本地接近在线体感"的人。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RTX PRO 5000/6000（48G+，专业卡）&lt;/strong&gt;
48G 起步、有 ECC 与专业驱动。论坛实测 RTX PRO 5000 48G 跑 27B 约 55-65 t/s 量级。适合企业/生产力场景，价格昂贵（PRO 6000 现货约 4-22 万，84G 版 4-7 万、96G Blackwell 版 13-22 万，更多人选择卖掉换 3 张 R9700）[21]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;MI210 64G / A100 / L20（数据中心卡）&lt;/strong&gt;
论坛对 MI210 的态度很鲜明：&lt;strong&gt;"入手就是退役期，生态走到末期，社区主流支持 CDNA3/RDNA3"&lt;/strong&gt;，除非 SR-IOV 等特殊需求，否则不推荐[14]。A100 40G、L20 96G 同理——买新不买旧，软件支持永远优先给新架构。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mac 统一内存路线（M4/M5 系列）&lt;/strong&gt;
Mac Studio M5 Ultra 256G 能跑 170GB 级别的 DeepSeek-V4 开源模型（几十 t/s）[22]。适合需要超大统一内存、且生态（MLX）能接受的用户；但"统一内存并非万能"，跑大模型性价比不如同价位 PC[23]。&lt;/p&gt;
&lt;h2&gt;另一条路：AI 小主机（DGX Spark / AI Max 395）&lt;/h2&gt;
&lt;p&gt;除了插显卡，这几年还多了一条"统一内存小主机"的路线：CPU 与 GPU 共享一整块大内存，显存不再是瓶颈，代价是内存带宽普遍偏低。论坛最近讨论最多的就是 NVIDIA DGX Spark 和 AMD Ryzen AI Max+ 395 这两台，值得单独说。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NVIDIA DGX Spark（GB10，淘宝约 2.3-4.5 万元，典型 3.3-3.6 万；闲鱼基本无整机挂单）&lt;/strong&gt;
128GB LPDDR5X 统一内存、6144 CUDA 核心（48 SM）、带宽约 273-300 GB/s[24]。容量能装下 140B 级量化模型，但论坛的共识是&lt;strong&gt;它先撞的是带宽墙，而不是 128G 这个容量数字&lt;/strong&gt;：27B Q4 激活约 15GB，理论上限也就 18 tok/s 左右，140B 级 MoE 更只有几 tok/s[24]。实测层面，单机跑 Qwen3.8-27B（SGLang + NVFP4 + DSpark）能到 34-38 tok/s，数学 43.6、代码 34 tok/s，但 prefill 不到 1000，冷启动要等 20-30 秒[25]；4 台 DGX Spark 组 TP=4 跑 DeepSeek-V4.1-Flash，单条工作流 40-60 tok/s、三条 50-100 tok/s、prefill 2500-3000 tok/s[26]；3 台就能装下 748B 的 V4.1-Flash 权重[27]。整体评价是"低功耗、安静、CUDA 原生，但单机跑大模型确实拉垮，更适合组集群"[25]，论坛里也有专门提醒"新手不要碰 DGX Spark"[28]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AMD Ryzen AI Max+ 395（Strix Halo，淘宝约 1.25-2.9 万元，典型 1.6-1.8 万；闲鱼多为 CPU 散片或定金，整机仍看淘宝）&lt;/strong&gt;
集成 Radeon 8060S（40 CU / 2560 SP），128GB 统一内存，带宽约 215-260 GB/s[29]。它的性能上限比 Spark 更低，但价格便宜一大截。早期实测 Qwen3.6-27B：Q4_K_M 约 10-12 tok/s、Q8 约 7.5、BF16 只有 4.3 tok/s，prefill 要几分钟，当时的评价是"跑 Agent 会慢到吐血"[30]。转折出现在 2026 年 9 月，社区给 Strix Halo 做了一批定制优化（halogen-flash-server、ROCmFP4 + MTP、HaloGen），Qwen3.8-27B 的 decode 能到 40 tok/s 上下、prefill 突破 1000，长上下文曲线也不怎么掉[31][32][33]，一下把它的性价比拉了起来。整机品牌有 FEVM FAEX1、极摩客 EVO-X2、铭凡 MS-S1 MAX、零刻 GTR9 Pro 等，淘宝价从 1.25 万一路到 2.2 万不等[29]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这两台怎么选：&lt;/strong&gt;
- 要 CUDA 生态、能接受单机慢或愿意组集群 → &lt;strong&gt;DGX Spark&lt;/strong&gt;（单机 3.3-3.6 万，集群才有意义）
- 要便宜、能折腾 Linux/ROCm、主要跑 27B → &lt;strong&gt;AI Max 395 小主机&lt;/strong&gt;（1.6-1.8 万，优化后速度可用）
- 要更大统一内存、且接受苹果生态 → &lt;strong&gt;Mac Studio&lt;/strong&gt;（见上一档，256G 可跑 170GB 级模型）&lt;/p&gt;
&lt;h2&gt;总对比表&lt;/h2&gt;
&lt;p&gt;以下是各价位主流方案的集中对比（基准模型：Qwen 27B Q4，速度区间取决于投机解码/引擎/上下文，请以条件为准）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方案&lt;/th&gt;
&lt;th&gt;显存&lt;/th&gt;
&lt;th&gt;市场价(元)&lt;/th&gt;
&lt;th&gt;27B 实测速度&lt;/th&gt;
&lt;th&gt;优势&lt;/th&gt;
&lt;th&gt;短板&lt;/th&gt;
&lt;th&gt;适合谁&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;P40 24G 洋垃圾&lt;/td&gt;
&lt;td&gt;24G&lt;/td&gt;
&lt;td&gt;~1200-1400&lt;/td&gt;
&lt;td&gt;35B-A3B 45-60 t/s[2]&lt;/td&gt;
&lt;td&gt;便宜、显存大&lt;/td&gt;
&lt;td&gt;折腾门槛极高&lt;/td&gt;
&lt;td&gt;折腾爱好者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;双 3060 12G&lt;/td&gt;
&lt;td&gt;24G&lt;/td&gt;
&lt;td&gt;~4000&lt;/td&gt;
&lt;td&gt;43-50 t/s[1]&lt;/td&gt;
&lt;td&gt;极致便宜、CUDA 稳定&lt;/td&gt;
&lt;td&gt;双卡通信、无扩展&lt;/td&gt;
&lt;td&gt;预算最低的入坑者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;双 2080Ti 22G&lt;/td&gt;
&lt;td&gt;44G&lt;/td&gt;
&lt;td&gt;~5000-5300&lt;/td&gt;
&lt;td&gt;60-82 t/s[11][17]&lt;/td&gt;
&lt;td&gt;NVLink、大显存&lt;/td&gt;
&lt;td&gt;魔改翻车风险&lt;/td&gt;
&lt;td&gt;敢赌魔改的省钱党&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;双 5060Ti 16G&lt;/td&gt;
&lt;td&gt;32G&lt;/td&gt;
&lt;td&gt;~7200-8000&lt;/td&gt;
&lt;td&gt;35-78 t/s[7]&lt;/td&gt;
&lt;td&gt;新卡有保修&lt;/td&gt;
&lt;td&gt;比 3090 组合贵&lt;/td&gt;
&lt;td&gt;要保修的双卡用户&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;二手 3090 24G&lt;/td&gt;
&lt;td&gt;24G&lt;/td&gt;
&lt;td&gt;~5000-8000&lt;/td&gt;
&lt;td&gt;55-70 t/s[6]&lt;/td&gt;
&lt;td&gt;最省心单卡、CUDA&lt;/td&gt;
&lt;td&gt;二手水深、功耗高&lt;/td&gt;
&lt;td&gt;绝大多数人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7900XTX 24G&lt;/td&gt;
&lt;td&gt;24G&lt;/td&gt;
&lt;td&gt;二手4800-6000&lt;/td&gt;
&lt;td&gt;39-73 t/s[8][9]&lt;/td&gt;
&lt;td&gt;24G 里速度王&lt;/td&gt;
&lt;td&gt;A 卡生态折腾&lt;/td&gt;
&lt;td&gt;愿折腾的 A 卡玩家&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R9700 32G&lt;/td&gt;
&lt;td&gt;32G&lt;/td&gt;
&lt;td&gt;11000-16000&lt;/td&gt;
&lt;td&gt;27-50 t/s[15][16]&lt;/td&gt;
&lt;td&gt;32G+新卡保修&lt;/td&gt;
&lt;td&gt;速度一般&lt;/td&gt;
&lt;td&gt;长上下文/高精度需求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4080S 32G 魔改&lt;/td&gt;
&lt;td&gt;32G&lt;/td&gt;
&lt;td&gt;9000-15000&lt;/td&gt;
&lt;td&gt;约 89 t/s[13]&lt;/td&gt;
&lt;td&gt;N 卡生态+32G&lt;/td&gt;
&lt;td&gt;魔改无保修&lt;/td&gt;
&lt;td&gt;N 卡 32G 追求者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;双 3090 NVLink&lt;/td&gt;
&lt;td&gt;48G&lt;/td&gt;
&lt;td&gt;15000-16000&lt;/td&gt;
&lt;td&gt;108-178 t/s[3][10][18]&lt;/td&gt;
&lt;td&gt;48G 里价格较低&lt;/td&gt;
&lt;td&gt;双卡折腾&lt;/td&gt;
&lt;td&gt;想上 48G 的玩家&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4090D 48G 魔改&lt;/td&gt;
&lt;td&gt;48G&lt;/td&gt;
&lt;td&gt;~20000-27000&lt;/td&gt;
&lt;td&gt;110 t/s[4]&lt;/td&gt;
&lt;td&gt;单卡 48G 省心&lt;/td&gt;
&lt;td&gt;贵、无保修&lt;/td&gt;
&lt;td&gt;不折腾的高预算用户&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX 5090 32G&lt;/td&gt;
&lt;td&gt;32G&lt;/td&gt;
&lt;td&gt;28000-45000&lt;/td&gt;
&lt;td&gt;143-220 t/s[19][20]&lt;/td&gt;
&lt;td&gt;消费级最强&lt;/td&gt;
&lt;td&gt;极贵&lt;/td&gt;
&lt;td&gt;预算无上限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTX PRO 5000 48G&lt;/td&gt;
&lt;td&gt;48G&lt;/td&gt;
&lt;td&gt;4 万+&lt;/td&gt;
&lt;td&gt;55-65 t/s&lt;/td&gt;
&lt;td&gt;专业卡 ECC&lt;/td&gt;
&lt;td&gt;极贵&lt;/td&gt;
&lt;td&gt;企业生产力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mac M5 Ultra&lt;/td&gt;
&lt;td&gt;256G 统一&lt;/td&gt;
&lt;td&gt;~8.6 万&lt;/td&gt;
&lt;td&gt;数十 t/s[22]&lt;/td&gt;
&lt;td&gt;超大内存跑大模型&lt;/td&gt;
&lt;td&gt;贵、生态窄&lt;/td&gt;
&lt;td&gt;特殊大模型需求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DGX Spark GB10&lt;/td&gt;
&lt;td&gt;128G 统一&lt;/td&gt;
&lt;td&gt;3.3-3.6 万&lt;/td&gt;
&lt;td&gt;27B 34-38 t/s[25]&lt;/td&gt;
&lt;td&gt;CUDA、可组集群&lt;/td&gt;
&lt;td&gt;带宽低、单机慢&lt;/td&gt;
&lt;td&gt;要 CUDA 的集群玩家&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Max 395 小主机&lt;/td&gt;
&lt;td&gt;128G 统一&lt;/td&gt;
&lt;td&gt;1.6-1.8 万&lt;/td&gt;
&lt;td&gt;27B 约 40 t/s[31]&lt;/td&gt;
&lt;td&gt;便宜、统一内存&lt;/td&gt;
&lt;td&gt;带宽最低、要折腾&lt;/td&gt;
&lt;td&gt;预算有限的折腾党&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;价格均为 2026 年 9 月 13 日在淘宝、闲鱼检索到的大致区间，&lt;strong&gt;价格随时会变，建议随时关注淘宝、闲鱼上的实际行情，以购买当天的成交价为准&lt;/strong&gt;；"27B 实测速度"以论坛最常见配置为准，同一配置因投机解码与上下文设置会有明显差异，横向比较仅供参考，务必回原文看测法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;三句话总结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;预算 4000-8000 → 双 3060 / 双 2080Ti / 双 5060Ti&lt;/strong&gt;，双 N 卡是低预算路线的性价比之王，前提是你接受折腾双卡；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预算 5000-8000 只想插一张卡 → 3090（省心）或 7900XTX（最快）&lt;/strong&gt;，这是最主流、抄作业帖最多的一档；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;想要长上下文/高精度/更大的模型 → 加钱上 32G（R9700 或 4080S 32G），再往上 48G（双 3090 价格较低、4090D 48G 更省心）&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;买卡没有标准答案，只有"你的预算 × 你要跑的模型 × 你愿意折腾多少"。量力而行，先跑起来，比什么都重要。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考来源&lt;/h2&gt;
&lt;p&gt;本文全部实测数据来自论坛会员的真实装机分享，原帖链接均可点击核对测法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/328/328/双卡指南-最丐-qwen3.6-27b-3000-元双-rtx-3060-50t-s"&gt;(双卡指南) 最丐 Qwen3.6-27b - 3000 元双 RTX 3060 - 50t/s&lt;/a&gt; — https://lcz.me/topic/328/328/双卡指南-最丐-qwen3.6-27b-3000-元双-rtx-3060-50t-s（TID:328）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/493/493/双卡缝合怪-x99平台-p40-2080ti的本地生产力平台"&gt;双卡缝合怪 X99 平台 P40+2080Ti 的本地生产力平台&lt;/a&gt; — https://lcz.me/topic/493/493/双卡缝合怪-x99平台-p40-2080ti的本地生产力平台（TID:493）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/988/988/双-3090-nvlink-vllm-半年实测-qwen3.6-27b-解码-128-tok-s-并发-4-用户-258-tok-s"&gt;双 3090 NVLink + vLLM 半年实测：Qwen3.6-27B 解码 128 tok/s，并发 4 用户 258 tok/s&lt;/a&gt; — https://lcz.me/topic/988/988/双-3090-nvlink-vllm-半年实测-qwen3.6-27b-解码-128-tok-s-并发-4-用户-258-tok-s（TID:988）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1340/1340/4090-48gb-sglang-dflash2-平均-110-tok-s-27b-w4a16-awq"&gt;4090 48GB SGlang+DFlash2 平均 110 tok/s 27B W4A16-AWQ&lt;/a&gt; — https://lcz.me/topic/1340/1340/4090-48gb-sglang-dflash2-平均-110-tok-s-27b-w4a16-awq（TID:1340）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1529/1529"&gt;單張 R9700 AI PRO 32G + VLLM + amd/Qwen3.8-27B-Quark-AWQ-MXFP4&lt;/a&gt; — https://lcz.me/topic/1529/1529（TID:1529）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/474/474/3090-24g-跑qwopus-3.6-27b-mtp-131k上下文-kv-q8_0-55tok-s-智能开关思考-最终配置-再也不折腾了-6月14日更新"&gt;3090 24G 跑 QWOPUS 3.6 27B mtp 131K 上下文 KV(Q8_0) 55TOK/S…&lt;/a&gt; — https://lcz.me/topic/474/474/3090-24g-跑qwopus-3.6-27b-mtp-131k上下文-kv-q8_0-55tok-s-智能开关思考-最终配置-再也不折腾了-6月14日更新（TID:474）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/421/421/技术分享-双卡-rtx-5060ti-blackwell-运行-vllm-与-lm-studio-性能实测报告"&gt;技术分享：双卡 RTX 5060Ti Blackwell 运行 vLLM 与 LM Studio 性能实测报告&lt;/a&gt; — https://lcz.me/topic/421/421/技术分享-双卡-rtx-5060ti-blackwell-运行-vllm-与-lm-studio-性能实测报告（TID:421）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1164/1164/7900-xtx-跑-qwen3.8-27b-實測73.4t-s-完整部署與實測指南-claude-code-opus5協助佈署的-分享給大家"&gt;# 7900 XTX 跑 Qwen3.8-27B 實測 73.4t/s 完整部署與實測指南&lt;/a&gt; — https://lcz.me/topic/1164/1164/7900-xtx-跑-qwen3.8-27b-實測73.4t-s-完整部署與實測指南-claude-code-opus5協助佈署的-分享給大家（TID:1164）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/349/349/7900xtx-vs-r9700-llm速度对比"&gt;7900xtx vs r9700 llm 速度对比&lt;/a&gt; — https://lcz.me/topic/349/349/7900xtx-vs-r9700-llm速度对比（TID:349）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1245/1245/双-3090-nvlink-跑-qwen3.8-27b-vllm-awq-int4-mtp-工具调用-130-t-s-262k-上下文全开-附完整配置与-8-个踩坑"&gt;双 3090 NVLink 跑 Qwen3.8-27B：vLLM + AWQ-INT4 + MTP，工具调用 130 t/s、262K 上下文全开&lt;/a&gt; — https://lcz.me/topic/1245/1245/双-3090-nvlink-跑-qwen3.8-27b-vllm-awq-int4-mtp-工具调用-130-t-s-262k-上下文全开-附完整配置与-8-个踩坑（TID:1245）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1184/1184/双rtx2080ti-22g-nvlink-llama.cpp-跑qwen3.8-27b实战"&gt;双 RTX2080ti 22G nvlink llama.cpp 跑 Qwen3.8-27B 实战&lt;/a&gt; — https://lcz.me/topic/1184/1184/双rtx2080ti-22g-nvlink-llama.cpp-跑qwen3.8-27b实战（TID:1184）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1056/1056/cmp-170hx显卡到底怎么样"&gt;CMP 170HX 显卡到底怎么样？&lt;/a&gt; — https://lcz.me/topic/1056/1056/cmp-170hx显卡到底怎么样（TID:1056）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1404/1404/4080s-32g-跑-qwen3.8-27b-llama.cpp-优化全记录-sglang-探索踩坑"&gt;4080S 32G 跑 Qwen3.8-27B:llama.cpp 优化全记录 + SGLang 探索踩坑&lt;/a&gt; — https://lcz.me/topic/1404/1404/4080s-32g-跑-qwen3.8-27b-llama.cpp-优化全记录-sglang-探索踩坑（TID:1404）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1465/1465"&gt;AMD Yes？它的显卡适合谁？MI210 是宝藏还是工业垃圾？&lt;/a&gt; — https://lcz.me/topic/1465/1465（TID:1465）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/820/820/5700x-radeon-ai-pro-r9700-32gb-简单测试-求优化建议-换了3090"&gt;5700X + Radeon AI PRO R9700 32GB 简单测试&lt;/a&gt; — https://lcz.me/topic/820/820/5700x-radeon-ai-pro-r9700-32gb-简单测试-求优化建议-换了3090（TID:820）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1535/1535"&gt;AMD R9700 實測：ROCm 10，Qwen38-27B-UD-Q6_K、128K context 和 MTP&lt;/a&gt; — https://lcz.me/topic/1535/1535（TID:1535）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/772/772/让你们看看垃圾魔改卡2080ti-的威力-qwen3.6-27b-fp8-精度-速度能到-60tokens-s-nvlink-连接"&gt;让你们看看垃圾魔改卡 2080ti 的威力 qwen3.6-27b fp8&lt;/a&gt; — https://lcz.me/topic/772/772/让你们看看垃圾魔改卡2080ti-的威力-qwen3.6-27b-fp8-精度-速度能到-60tokens-s-nvlink-连接（TID:772）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1366/1366/双-3090-nvlink-从vllm-换到-sglang-跑-qwen3.8-27b-实测-108-t-s-262k-上下文全开"&gt;双 3090 NVLink 从 vLLM 换到 SGLang 跑 Qwen3.8-27B：实测 108 t/s，262K 上下文全开&lt;/a&gt; — https://lcz.me/topic/1366/1366/双-3090-nvlink-从vllm-换到-sglang-跑-qwen3.8-27b-实测-108-t-s-262k-上下文全开（TID:1366）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1228/1228/rtx-5090-qwen3.8-27b-dsh-全套實測-自寫推理引擎-ninfer-deepseek-harness-開源編碼-agent-任務-跑-13-小時真實編程任務的數據-6-個坑-以及-並發不是越大越快"&gt;RTX 5090 Qwen3.8-27B dsh 全套實測&lt;/a&gt; — https://lcz.me/topic/1228/1228/rtx-5090-qwen3.8-27b-dsh-全套實測-自寫推理引擎-ninfer-deepseek-harness-開源編碼-agent-任務-跑-13-小時真實編程任務的數據-6-個坑-以及-並發不是越大越快（TID:1228）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1462/1462/3並發146-t-s-@105k-nvfp4-qwen3.8-27b-rtx-5090-滿載實測-ii-全-nvfp4-450k-pool-419k-全上卡零-offload"&gt;3 並發 146 t/s @105K nvfp4：Qwen3.8-27B RTX 5090 滿載實測 II&lt;/a&gt; — https://lcz.me/topic/1462/1462/3並發146-t-s-@105k-nvfp4-qwen3.8-27b-rtx-5090-滿載實測-ii-全-nvfp4-450k-pool-419k-全上卡零-offload（TID:1462）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/435/435/rtx-pro6000-现货价格-10w-该不该卖-换-3-张-r9700"&gt;RTX PRO6000 现货价格 10w，该不该卖，换 3 张 r9700&lt;/a&gt; — https://lcz.me/topic/435/435/rtx-pro6000-现货价格-10w-该不该卖-换-3-张-r9700（TID:435）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1448/1448/deepseek-v4-flash-vision-exp-开源了-现在有跑本地的量化版本吗"&gt;DeepSeek-V4-Flash-Vision-Exp 开源了，现在有跑本地的量化版本吗&lt;/a&gt; — https://lcz.me/topic/1448/1448/deepseek-v4-flash-vision-exp-开源了-现在有跑本地的量化版本吗（TID:1448）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1357/1357/m5-max-ultral-ai性能强悍-苹果-amd-英伟达ai小主机ai性能全面分析-潜力很大但统一内存并非万能"&gt;M5 Max/Ultra AI 性能强悍？苹果、AMD、英伟达 AI 小主机 AI 性能全面分析（潜力很大但统一内存并非万能）&lt;/a&gt; — https://lcz.me/topic/1357/1357/m5-max-ultral-ai性能强悍-苹果-amd-英伟达ai小主机ai性能全面分析-潜力很大但统一内存并非万能（TID:1357）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1657"&gt;想聽聽各路大神對RTX Spark的看法&lt;/a&gt; — https://lcz.me/topic/1657（TID:1657）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1188"&gt;DGX单机也有春天——Qwen3.8-27B at 34-38 tok/s on DGX Spark (GB10)&lt;/a&gt; — https://lcz.me/topic/1188（TID:1188）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1658"&gt;Deepseek v4.1 flash, 4台DGX spark GB10, TP=4&lt;/a&gt; — https://lcz.me/topic/1658（TID:1658）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1611"&gt;DeepSeek V4.1 Flash 552B权重翻倍，DGX Spark 3台可以装下权重&lt;/a&gt; — https://lcz.me/topic/1611（TID:1611）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/27"&gt;新手不要碰DGX Spark（重要事情说三遍）&lt;/a&gt; — https://lcz.me/topic/27（TID:27）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/143"&gt;分享：4090/48G, R9700/32G, AI Max 395 (8060S) 跑大语言模型的实测数据&lt;/a&gt; — https://lcz.me/topic/143（TID:143）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/713"&gt;请问有没有人可以帮助提供 AMD AI MAX 395 跑Qwen3.6-27B的速度情况？&lt;/a&gt; — https://lcz.me/topic/713（TID:713）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1609"&gt;Aimax 395的定制qwen 3.8 flash，prefill突破1000了，decode 40-50&lt;/a&gt; — https://lcz.me/topic/1609（TID:1609）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1576"&gt;ROCm FP4以 AI Max+ 395測試 對比Q4進步不小&lt;/a&gt; — https://lcz.me/topic/1576（TID:1576）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1659"&gt;Halogen Flash Server配置與實測(AI Max+ 395 w Qwen 3.8 Flash Next)&lt;/a&gt; — https://lcz.me/topic/1659（TID:1659）&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="本地模型"/><category term="显卡选购"/><category term="LLM"/><category term="3090"/><category term="7900XTX"/><category term="R9700"/><category term="4090"/><category term="5090"/><category term="5060Ti"/><category term="2080Ti"/><category term="洋垃圾"/><category term="价位"/><category term="理性对比"/></entry><entry><title>本地部署大模型到底能跑什么？一次讲清模型选择、应用场景与在线的真实差距</title><link href="https://blog.cycleuser.org/ben-di-bu-shu-da-mo-xing-dao-di-neng-pao-shi-yao-yi-ci-jiang-qing-mo-xing-xuan-ze-ying-yong-chang-jing-yu-zai-xian-de-zhen-shi-chai-ju.html" rel="alternate"/><published>2026-09-09T14:00:00+08:00</published><updated>2026-09-09T14:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-09:/ben-di-bu-shu-da-mo-xing-dao-di-neng-pao-shi-yao-yi-ci-jiang-qing-mo-xing-xuan-ze-ying-yong-chang-jing-yu-zai-xian-de-zhen-shi-chai-ju.html</id><summary type="html">&lt;h1&gt;本地部署大模型到底能跑什么？一次讲清模型选择、应用场景与在线的真实差距&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本地模型这两年发展得太快：从"只能跑个 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1&gt;本地部署大模型到底能跑什么？一次讲清模型选择、应用场景与在线的真实差距&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本地模型这两年发展得太快：从"只能跑个 7B 玩玩"到"32G 显卡都能当主力写代码"，从"必须联网"到"几百 G 的开源模型也能塞进一台机器"。但很多人其实是看着别人折腾眼热，心里并不清楚本地部署到底有哪些模型可选、真正适合干什么、和在线比到底差在哪。这篇文章用抡锤者（lcz.me）论坛上大量真实用户的实测和讨论，把"本地部署这件事"讲透——哪些场景是真刚需，哪些只是花钱买个折腾的乐趣。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;先说清楚：本文素材从哪来&lt;/h2&gt;
&lt;p&gt;本地模型的真实表现，和显卡、驱动、推理框架、量化方式、上下文长度、思考链设置全部相关，同一张卡不同配置测出来能差一倍。所以本文不引用厂商跑分，只用&lt;strong&gt;抡锤者（lcz.me）论坛会员在真实机器上的实测与讨论&lt;/strong&gt;，每一处结论都标了出处编号，文末附原帖链接，方便读者去核对完整上下文。&lt;/p&gt;
&lt;h2&gt;一、先建立坐标系：本地模型大概分几档&lt;/h2&gt;
&lt;p&gt;本地部署最大的误区，是以为"模型大小 = 越大越好"。实际上现在的模型分两大类，差别很大：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;稠密（Dense）模型&lt;/strong&gt;：每次推理全部参数都参与计算，质量稳定，但参数量越大越吃显存；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MoE（专家混合）模型&lt;/strong&gt;：总参数很大、但每次只激活一小部分。比如总参 35B、每次只激活 3B，文件看着大，实际跑起来反而比同规模的稠密模型更快更省[12]。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;按"你这台机器能跑什么"，论坛实测可以把本地模型大致分成下面几档：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;档位&lt;/th&gt;
&lt;th&gt;代表模型&lt;/th&gt;
&lt;th&gt;显存/内存需求&lt;/th&gt;
&lt;th&gt;备注&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;主力甜点&lt;/td&gt;
&lt;td&gt;Qwen3.6 / 3.8-27B（Q4~Q6）&lt;/td&gt;
&lt;td&gt;24G 就够，32G 更从容&lt;/td&gt;
&lt;td&gt;论坛公认"本地最值得折腾的一个模型"，质量/速度/生态最平衡[4][7]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;高效率 MoE&lt;/td&gt;
&lt;td&gt;Qwen3.6-35B-A3B 等&lt;/td&gt;
&lt;td&gt;16G 起步&lt;/td&gt;
&lt;td&gt;每次只激活 3B，16G 显存都能 128K 上下文，速度对 27B 形成"降维打击"[12]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大模型尝鲜&lt;/td&gt;
&lt;td&gt;Qwen3.8-125B-A6B、Qwen3.8-Flash-Next（约 176B 总量）&lt;/td&gt;
&lt;td&gt;48G+128G 内存（部分权重驻留内存）&lt;/td&gt;
&lt;td&gt;48G 卡 + 128G 内存实测能跑 30 tok/s 左右，但要牺牲 prefill 和视觉[5]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;顶配/统一内存&lt;/td&gt;
&lt;td&gt;DeepSeek-V4-Flash-Vision-Exp（284B/13B 激活）&lt;/td&gt;
&lt;td&gt;约 170GB 权重起，双 96G 或 Mac 统一内存&lt;/td&gt;
&lt;td&gt;刚开源，本地门槛极高，现阶段"API 最省事"[6]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;几个关键结论：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;绝大多数人的"本地主力"就是 27B 这一个模型&lt;/strong&gt;。论坛上反复出现的说法是"没有模型比 Qwen 3.6 27B 更能打"，连用 96G 专业卡的网友也被建议"先跑 Qwen 3.6 27B Q4，够用了"[7]。它 Q4 量化约 16-17GB，24G 显卡能塞下且留出上下文余量，是社区沉淀最足、抄作业帖最多的档位[4]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MoE 是"小显存跑大模型"的答案&lt;/strong&gt;。16G 显存上，35B-A3B（激活 3B）实测比 27B 稠密更快、上下文从 98K 提到 128K、显存占用反而更低——因为它只把部分层放 GPU[12]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更大的模型不是必须的&lt;/strong&gt;。论坛有人专门做过基准：GPT-OSS-120B 用"12G 显卡 + 110G 内存"也能跑，但质量（86 分）反而打不过 27B 的服务（96-97 分）——"参数更大"不等于"本地更好用"[4]。120B 级模型要等 125B-A6B 这类激活参数更聪明的架构，或者直接上大显存/统一内存。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;二、大家到底拿本地模型在干什么？&lt;/h2&gt;
&lt;p&gt;看了几十页帖子，本地部署的真实用途可以归纳成这几类，按"不可替代性"从高到低排：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 隐私与敏感数据（真刚需）&lt;/strong&gt;
代码、内部文档、不想喂给任何在线服务的内容，本地跑是唯一选择[11][2]。这是本地模型最"不可替代"的场景之一。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 图/音/视频生成与多模态（真刚需）&lt;/strong&gt;
自部署在 ComfyUI 出图、视频生成上"性价比高、可无限出图"；相比之下在线生成"8000 元抽不了多少次卡就没了"[2]。有用户让本地模型接 ComfyUI 自动出图、测试生成视频，绕开订阅额度[7]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 不审查/去审查模型（真刚需，但注意分寸）&lt;/strong&gt;
社区有大量"去审查"（abliterated）版本：Huihui、HauHau、llmfan 等对 Qwen 27B/35B 的魔改版，论坛专门做过 12 个模型压力横评[13]。这类需求在线模型给不了，只能本地。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 批量、免费、跑通宵的活（高价值）&lt;/strong&gt;
翻译、格式化、日志分析、批量摘要这类"量大、要钱买 token"的重复劳动，本地挂后台跑一晚上不心疼[11][10]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 给在线大模型当"分流层"（高性价比玩法）&lt;/strong&gt;
本地 27B 做路由、预筛、结论压缩，在线大模型当主脑——能省一大半 API 费用。论坛有用户专门实践"开两个窗口"：一个接本地 Qwen 27B 省 token，一个接 DeepSeek Pro 干重活[11][1]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Agent / 编程助手（体感复杂，要看任务）&lt;/strong&gt;
Hermes、Claude Code、Codex、DSH 这类工具接本地 27B 是论坛主流玩法，小工具、维护项目、论坛皮肤、APP 这种"有框架限定"的活完全没问题[11]。但见下节，大活别指望它。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7. 学习与折腾本身（隐形价值）&lt;/strong&gt;
很多人把买卡当"实战是最好的老师"——想学会本地部署、懂推理原理，光用 API 是学不会的[2]。&lt;/p&gt;
&lt;h2&gt;三、本地 vs 在线：把账算清楚&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 能力差距：别拿 27B 当 400B 用&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本地最强的 27B，和在线头部模型（DeepSeek V4 Flash、GLM 系列这类"大几百 B 激活参数"的模型）差距是量级的。论坛的原话很直接：&lt;strong&gt;"拿本地 27B 当 400B 级在线模型使，这件事本身就会失望——V4-Flash 的推理深度和工具调用正确率跟 27B 差两个量级"[11]。&lt;/strong&gt; 有一张 3090 的网友实测：审 3.9 万行代码的项目，在线 GLM 用 17 分钟-30 分钟干完，本地 Qwen 27B 跑 2 小时才到 30% 进度[10]。&lt;/p&gt;
&lt;p&gt;但反过来说，也有人用本地 Qwen 27B + SGLang 同时接 6 个中等难度开发任务，20 分钟全部搞定，体验"可以接受"[3]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 体感差距：快慢各在哪&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;论坛有个很中肯的提醒：&lt;strong&gt;在线模型的"强"和"快"要分开看&lt;/strong&gt;。本地 27B 的 decode（吐字）能到 50-70 t/s 并不慢，但它"爱想"——agent 循环里思考链占大量输出预算，加上长上下文 prefill 慢，体感就是"慢半拍"[10]。而在线模型快，一部分是人家架构+服务端缓存做得好。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 成本账：绝大多数人用 API 更划算&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是论坛反复算过、最反直觉的一笔账：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个"洗数据填 Excel、频率很低"的用户，用 DeepSeek API 一天也就 3-5 元，一年 1095-1825 元；&lt;/li&gt;
&lt;li&gt;一张 7900XTX 要 5000-6500 元，&lt;strong&gt;够他交 3-6 年 API 费&lt;/strong&gt;[2]；&lt;/li&gt;
&lt;li&gt;结论很明确：&lt;strong&gt;纯文本、低频、无隐私顾虑的用户，自部署在成本上完全不划算&lt;/strong&gt;[2][8]。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;论坛老手甚至给出更狠的判断：&lt;strong&gt;"自部署只在图/音/视频生成、数据隐私、非审查模型上有比较高的不可替代性；其他场景如果只谈性价比，在线更优。"&lt;/strong&gt;[2]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 订阅、API、本地，是三笔不同的账&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在线订阅有额度坑：GPT Plus（&lt;span class="arithmatex"&gt;\(20/月）额度少，"用不到十分钟五小时就到限额"，且不含最强的模型；Pro（\)&lt;/span&gt;100/月）才宽松[3]；&lt;/li&gt;
&lt;li&gt;API 按量付费，对低频用户最透明，DeepSeek 被反复称为"性价比之王"，识图"白菜价、可以当玩具玩"[3]；&lt;/li&gt;
&lt;li&gt;本地是一次性硬件投入 + 免费算力，适合高频、批量、敏感这三类需求。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;四、在线模型也分层，别一竿子打死&lt;/h2&gt;
&lt;p&gt;在线模型现在也是分层的，论坛实测的经验可以借鉴：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;头部在线&lt;/strong&gt;（GPT-5.6/6、Gemini、Claude）确实强，但对普通程序员"绝对算不上碾压式领先"，且额度贵、执行一个中等任务就吃掉 20% 订阅额度[3]；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性价比档&lt;/strong&gt;（DeepSeek V4 Flash、GLM5.3-flash、腾讯混元 HY3、Kimi）是论坛大多数人的实际主力——价格便宜、工具调用精准、能扛长链任务[3][9]。腾讯 HY3 免费测试时被评价为"DeepSeek V4 Flash 平替，指令理解精准、工具调用准确、审美在线"[9]；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;在线也有不靠谱的时候&lt;/strong&gt;：白天高峰期能力下降、"有明确的活它乱编"，有人专门挑半夜用[10][9]。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以"本地 vs 在线"不是简单二选一，而是&lt;strong&gt;先用便宜够用的在线档（V4 Flash 级别），真遇到它干不好或不能干的（隐私、批量、无审查、出图），再让本地补位&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;五、本地模型的正确用法：是分工，不是替代&lt;/h2&gt;
&lt;p&gt;看了这么多帖，论坛对"本地模型该处于什么位置"已经形成了相当一致的方法论——&lt;strong&gt;不是替代在线，而是分工&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;大任务拆开喂&lt;/strong&gt;：一次性把 3.9 万行代码塞给 27B 是"任务喂法"的问题，不是模型弱。正确做法是按模块拆成 ≤5K-1.5 万行一批、开干净上下文、用固定 checklist 输出结构化结果，最后让在线/强模型做全局综述[10]；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;prompt 增强&lt;/strong&gt;：定向任务把要求写死（只查 X 类问题、给 Y 格式结论），能压掉 27B "爱想"空烧的大量思考 token[10]；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地干"每个模块深挖"，在线干"全局找联系"&lt;/strong&gt;[10]；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人机协同而非神灯许愿&lt;/strong&gt;：有网友说得透彻——用 AI 干活本质是"工程问题、人机协同、思维同步的问题"，模糊打几个字指望 AI 像阿拉丁神灯一样又快又好地实现结果，目前只有特定几个付费产品勉强接近[1]。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;六、到底有没有必要上本地？给你一张自检清单&lt;/h2&gt;
&lt;p&gt;结合论坛讨论，可以帮你快速判断自己需不需要本地部署：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;你的情况&lt;/th&gt;
&lt;th&gt;结论&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;纯文本、低频、无隐私顾虑（如洗数据填表）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;别买卡&lt;/strong&gt;，DeepSeek/GLM 等 API 一天几块钱[2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;高频写代码、但项目大、要长上下文&lt;/td&gt;
&lt;td&gt;在线为主；本地 27B 只处理小任务[10]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;有隐私代码/内部文档/敏感资料&lt;/td&gt;
&lt;td&gt;值得上，本地是唯一选择[11][2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;想出图/视频/多模态，且量大&lt;/td&gt;
&lt;td&gt;值得上，本地无限量且便宜[2][7]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;需要无审查能力&lt;/td&gt;
&lt;td&gt;值得上，只能本地[13][2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;只是好奇、想学部署原理&lt;/td&gt;
&lt;td&gt;先别买大卡，用旧电脑 CPU 跑个 7-14B 试水，或二手 3060 12G 起步[2]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;已经决定买卡&lt;/td&gt;
&lt;td&gt;先上论坛抄作业：24G 够跑 27B，想要余量（高精度/长上下文/MoE）再上 32G（参考上一篇 32G vs 24G 对比）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;本地部署这几年最实在的变化，不是"本地能替代在线"，而是&lt;strong&gt;把一个以前只能花钱买的"推理能力"，变成了你有空就免费跑、有隐私就放心跑、有怪需求就能自己调的一种本地资源&lt;/strong&gt;。它和在线模型的关系，更像家里的厨房和外卖——日常图省事点外卖（API），但想吃得放心、吃得便宜、想吃什么自己做，家里得有个厨房。&lt;/p&gt;
&lt;p&gt;买不买、上不上，取决于你的使用频率和需求性质，而不是"别人都上了"。理性消费，量力而行——这也是论坛老玩家反复强调的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考来源&lt;/h2&gt;
&lt;p&gt;本文全部观点与实测数据来自抡锤者（lcz.me）论坛会员的真实分享，原帖均可点击核对完整内容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/486/486/闲唠一下关于玩本地llm和在线前沿模型"&gt;闲唠一下关于玩本地 LLM 和在线前沿模型&lt;/a&gt; — https://lcz.me/topic/486/486/闲唠一下关于玩本地llm和在线前沿模型（TID:486，人机协同/分工方法论）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/592/592/我这样的需求-有必要折腾本地7900xtx主机吗"&gt;我这样的需求，有必要折腾本地 7900XTX 主机吗？&lt;/a&gt; — https://lcz.me/topic/592/592/我这样的需求-有必要折腾本地7900xtx主机吗（TID:592，成本账与必要性判断）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1520/1520"&gt;GPT Plus 比 API 划算得多…DeepSeek V4 Flash 和 Qwen 27B 真香&lt;/a&gt; — https://lcz.me/topic/1520/1520（TID:1520，订阅/API/本地三笔账与在线体验）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1289/1289/什么-12g显存的显卡也能跑120b大模型-本地大模型基准评测与-freetoken-numa-实操报告-2026-08-24"&gt;什么！12G 显存的显卡也能跑 120B 大模型？基准评测报告&lt;/a&gt; — https://lcz.me/topic/1289/1289/什么-12g显存的显卡也能跑120b大模型-本地大模型基准评测与-freetoken-numa-实操报告-2026-08-24（TID:1289，多模型同基准横评与质量分）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1439/1439/qwen3.8-flash-next-q4_k_xl-本地实测-48gb-显存-128gb-内存-实际能跑到什么程度"&gt;Qwen3.8-Flash-Next Q4_K_XL 本地实测：48GB 显存 + 128GB 内存&lt;/a&gt; — https://lcz.me/topic/1439/1439/qwen3.8-flash-next-q4_k_xl-本地实测-48gb-显存-128gb-内存-实际能跑到什么程度（TID:1439，176B 级模型本地实测）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1448/1448/deepseek-v4-flash-vision-exp-开源了-现在有跑本地的量化版本吗"&gt;DeepSeek-V4-Flash-Vision-Exp 开源了，现在有跑本地的量化版本吗&lt;/a&gt; — https://lcz.me/topic/1448/1448/deepseek-v4-flash-vision-exp-开源了-现在有跑本地的量化版本吗（TID:1448，284B 模型本地门槛）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/284/284/關於本地版的模型"&gt;關於本地版的模型&lt;/a&gt; — https://lcz.me/topic/284/284/關於本地版的模型（TID:284，新手本地模型选择讨论）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/564/564/新人小白玩本地llm-设备dgx-spark-128g-求推荐优质本地模型和参数-也可分享经验"&gt;新人小白玩本地 LLM，设备 dgx spark 128g，求推荐优质本地模型&lt;/a&gt; — https://lcz.me/topic/564/564/新人小白玩本地llm-设备dgx-spark-128g-求推荐优质本地模型和参数-也可分享经验（TID:564）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/877/877/腾讯hy3编程-agent测试-deepseek-v4-flash平替-略慢一点但指令执行-工具调用精准-长链任务自主决策不错-前端审美在线-编程能合格"&gt;腾讯 HY3 编程/Agent 测试：DeepSeek V4 Flash 平替&lt;/a&gt; — https://lcz.me/topic/877/877/腾讯hy3编程-agent测试-deepseek-v4-flash平替-略慢一点但指令执行-工具调用精准-长链任务自主决策不错-前端审美在线-编程能合格（TID:877，在线档位实测）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1522/1522"&gt;3090 单卡跑 qwen3.8 27b q4km 上下文 2456K 达成，但是感觉生产力还是不太行&lt;/a&gt; — https://lcz.me/topic/1522/1522（TID:1522，本地 vs 在线真实任务对比与"拆任务"方法论）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1479/1479"&gt;7900xtx 一般都用来做什么，我部署了 qwen3.8 27b&lt;/a&gt; — https://lcz.me/topic/1479/1479（TID:1479，本地模型应用场景与定位讨论）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/542/542/rtx-5070-ti-本地部署-qwen3-35b-a3b-moe-vs-27b-dense-对比报告"&gt;RTX 5070 Ti 本地部署 Qwen3 35B-A3B (MoE) vs 27B (Dense) 对比报告&lt;/a&gt; — https://lcz.me/topic/542/542/rtx-5070-ti-本地部署-qwen3-35b-a3b-moe-vs-27b-dense-对比报告（TID:542，MoE 与稠密模型对比）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/601/601/12-个模型压力测试-谁真-无审查-谁只是会装-huihui-hauhau-chatgpt-gemini-grok-本地-qwen-gemma-横评"&gt;12 个模型压力测试：谁真"无审查"&lt;/a&gt; — https://lcz.me/topic/601/601/12-个模型压力测试-谁真-无审查-谁只是会装-huihui-hauhau-chatgpt-gemini-grok-本地-qwen-gemma-横评（TID:601，去审查模型横评）&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="本地模型"/><category term="LLM"/><category term="Qwen"/><category term="DeepSeek"/><category term="模型选择"/><category term="应用场景"/><category term="在线API"/><category term="本地vs在线"/><category term="必要性"/><category term="理性对比"/></entry><entry><title>跑本地大模型，32G 显存还是 24G？——一次基于社区实测的理性对比</title><link href="https://blog.cycleuser.org/pao-ben-di-da-mo-xing-32g-xian-cun-huan-shi-24g-yi-ci-ji-yu-she-qu-shi-ce-de-li-xing-dui-bi.html" rel="alternate"/><published>2026-09-09T10:00:00+08:00</published><updated>2026-09-09T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-09:/pao-ben-di-da-mo-xing-32g-xian-cun-huan-shi-24g-yi-ci-ji-yu-she-qu-shi-ce-de-li-xing-dui-bi.html</id><summary type="html">&lt;h1&gt;跑本地大模型，32G 显存还是 24G？——一次基于社区实测的理性对比&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;想跑本地模型的人，几乎都会卡在同一个问题上：显存到底买 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1&gt;跑本地大模型，32G 显存还是 24G？——一次基于社区实测的理性对比&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;想跑本地模型的人，几乎都会卡在同一个问题上：显存到底买 24G 还是 32G？24G 的 RX 7900XTX 现在二手便宜，但 32G 的 Radeon AI PRO R9700 又能多塞好几个模型。这篇文章不站队，只用论坛里大量真实用户的实测数据，把两张卡在"跑模型"这件事上的差距一项项摆出来，结论你自己定。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;先说明：本文数字从哪来&lt;/h2&gt;
&lt;p&gt;本地跑模型的性能，和显卡、驱动、推理框架、量化、上下文长度、思考链设置全部相关，论坛上同一张卡测出的数字能差一倍[2]。所以本文不引用任何"官方跑分"，只引用&lt;strong&gt;抡锤者（lcz.me）论坛会员在真实机器上的实测分享&lt;/strong&gt;，并把出处逐条列在文末，方便你点开看原帖和它的完整测法。&lt;/p&gt;
&lt;p&gt;先说两个必须懂的前提，否则下面的表格容易误读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;decode（生成/吐字速度）&lt;/strong&gt;是带宽瓶颈，决定"字吐得多快"；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;prefill（读长提示词）&lt;/strong&gt;是算力瓶颈，决定"第一个字要等多久"。agent 多轮对话体感卡不卡，主要看后者，而不是前者[1]。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;两张卡到底是什么定位&lt;/h2&gt;
&lt;p&gt;先把规格摆出来，两者都是当前 AMD 消费级里跑本地模型的热门选择，但定位完全不同：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;RX 7900XTX 24G&lt;/th&gt;
&lt;th&gt;Radeon AI PRO R9700 32G&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;架构&lt;/td&gt;
&lt;td&gt;RDNA3 / Navi 31（gfx1100）&lt;/td&gt;
&lt;td&gt;RDNA4（gfx1201），新一代&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;显存&lt;/td&gt;
&lt;td&gt;24GB GDDR6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;32GB&lt;/strong&gt; GDDR6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;显存带宽&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;约 960 GB/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;约 640 GB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;市场定位&lt;/td&gt;
&lt;td&gt;曾经的游戏旗舰，二手充足&lt;/td&gt;
&lt;td&gt;AI Pro 专业线，2026 新品[12]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;二手参考价（2026 年中）&lt;/td&gt;
&lt;td&gt;约 4000–4700 元[7]&lt;/td&gt;
&lt;td&gt;新卡约 7000–8000 元[1]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;单卡典型功耗&lt;/td&gt;
&lt;td&gt;约 350W（可限 230W）&lt;/td&gt;
&lt;td&gt;约 350W（可限 210W）[4][8]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一句话概括差异：&lt;strong&gt;7900XTX 是把"带宽"点满的快卡，R9700 是把"容量"点满的新卡。&lt;/strong&gt; 带宽高→吐字快；容量大→装得下更大的模型和更长的上下文。这是全文所有结论的出发点[1][11]。&lt;/p&gt;
&lt;h2&gt;24G 到底够不够用？——它真的不弱&lt;/h2&gt;
&lt;p&gt;先给 24G 一个公道。以 Qwen 3.8-27B 这种目前最主流的本地甜点模型（Q4_K_M 量化约 17GB）为例，7900XTX 单卡的表现其实相当能打：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不开投机解码的纯 decode 约 39 t/s；开启 MTP 投机解码后，&lt;strong&gt;工具调用场景实测 73.4 t/s、代码生成 68–70 t/s&lt;/strong&gt;，128K 上下文全开也能塞进 24GB 不爆显存[2]；&lt;/li&gt;
&lt;li&gt;另一份同样是 Vulkan + MTP 的实测跑到约 63 t/s（显存吃到 23.85GB，几乎贴满）[3]；&lt;/li&gt;
&lt;li&gt;Windows 下 Q4_K_XL 也能稳定 55 t/s 左右[3]；&lt;/li&gt;
&lt;li&gt;prefill 约 587–600 t/s，配合前缀缓存，agent 场景体感可以很接近在线模型[2]。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是说：&lt;strong&gt;如果你的模型选择就锁定在 27B（或更小）这一档、上下文不开到夸张、思考链开中低档，那么 24G 完全够你舒舒服服用上一两年&lt;/strong&gt;，这是论坛大量 7900XTX 用户实测得出的结论[2][3][10]。&lt;/p&gt;
&lt;p&gt;再看日常怎么用。有人把 7900XTX 接到 15 年老平台跑 coding agent，实测写代码约 40–70 t/s，日常小工具、维护项目毫无压力[8]。论坛主流意见也一致：&lt;strong&gt;本地 27B 的正确用法不是当"主力大脑"，而是当隐私数据跑批、批量翻译、离线兜底、给在线大模型当分流层的"便宜副手"&lt;/strong&gt;，这个场景 24G 绰绰有余[10]。&lt;/p&gt;
&lt;h2&gt;那 32G 多出来的 8GB，到底值在哪&lt;/h2&gt;
&lt;p&gt;如果只看"27B 能不能跑"，32G 优势不大；它的价值在&lt;strong&gt;你不想只跑 27B 的时候&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 高精度量化。&lt;/strong&gt; 27B 的 Q6_K 约 22–23GB、Q8_0 约 28.5GB。24G 上 Q6 已经贴边、Q8 直接装不下；32G 上 Q6 从容、Q8 也上得去，精度（尤其是工具调用时的格式稳定性）实打实更好[1]。R9700 实测用 Q6_K + ROCm 10 稳定跑 128K 上下文[5]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 长上下文。&lt;/strong&gt; 27B Q4 占约 16GB，24G 只剩 8GB 做 KV cache，开 32K–128K 会吃力；R9700 剩 16GB，32K–128K 更从容[1]。有用户通过调低 batch，把 R9700 的上下文一路顶到 &lt;strong&gt;246K&lt;/strong&gt;，仍能维持约 1.4K–2.3K tok/s 的 prefill[4]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 更大的模型。&lt;/strong&gt; 单卡想上 Qwen 3.6-35B-A3B 这类 MoE，24G 只能贴边塞 Q5 量化；32G 更稳[1]。稠密 34B+ 则是另一回事——24G、32G 都装不下，那要 48G 级别[1][4]。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 多模态/出图。&lt;/strong&gt; 想同时挂个 mmproj 视觉模型、或 ComfyUI 跑 720P 视频，32G 余量更足。论坛的观点是：&lt;strong&gt;"测 35B 稠密模型时，7900XTX 直接就上不了；而 R9700 的优势在于长上下文、更高精度和 ComfyUI 视频。"&lt;/strong&gt;[1]&lt;/p&gt;
&lt;h2&gt;速度实测：谁快谁慢&lt;/h2&gt;
&lt;p&gt;把两卡在 Qwen 27B 上的代表性实测放一起（注意：引擎、量化、测法都不同，横向只作量级参考）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;7900XTX 24G&lt;/th&gt;
&lt;th&gt;R9700 32G&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;decode，纯生成（Q4，不开投机）&lt;/td&gt;
&lt;td&gt;约 39 t/s[2]&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;decode，开 MTP/投机解码（Q4）&lt;/td&gt;
&lt;td&gt;51–73 t/s[2][3]&lt;/td&gt;
&lt;td&gt;llama.cpp 约 35–40 t/s（Q6）[5]；vLLM 特调后思考 40、编程 70–80 t/s[4]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;decode，MoE 35B-A3B&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;约 170–180 t/s（A3B 贴带宽线）[6]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prefill&lt;/td&gt;
&lt;td&gt;约 587 t/s[2]&lt;/td&gt;
&lt;td&gt;llama.cpp 短输入约 785 t/s[5]；vLLM 特调可到 &lt;strong&gt;2300–3300 tok/s&lt;/strong&gt;[4]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两条信息值得注意：&lt;/p&gt;
&lt;p&gt;第一，&lt;strong&gt;纯 decode（吐字）7900XTX 通常更快&lt;/strong&gt;，因为带宽是它的强项；R9700 想追速度，得靠"特调 vLLM + MXFP4 + 投机解码"这类很吃折腾的配置[4]。用 llama.cpp 默认走，两者差距没那么夸张。&lt;/p&gt;
&lt;p&gt;第二，&lt;strong&gt;R9700 的 prefill 上限明显更高&lt;/strong&gt;。特调 vLLM 下 prefill 能到 2300–3300 tok/s，是 7900XTX 常规水平的 3–5 倍[4]。而 agent 场景（Hermes、Claude Code、Codex 这类）每一轮都要重新读一遍全部上下文，&lt;strong&gt;prefill 快 = 首字延迟低 = 体感跟手&lt;/strong&gt;。这正是论坛里多位用户强调的：不要只盯着 t/s，要看 TTFT（首字延迟）[2][4][11]。&lt;/p&gt;
&lt;h2&gt;别被单一数字骗了&lt;/h2&gt;
&lt;p&gt;写这篇文章前，我特意把论坛里 7900XTX 的实测数字都翻了一遍，从 39 到 90 t/s 都有人说。差异主要来自测法，不是卡有毛病：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开不开 MTP：同样 7900XTX 跑 27B，不开约 39 t/s，开了 73 t/s，差了近一倍[2]；&lt;/li&gt;
&lt;li&gt;上下文长短：从 8K 加到 115K，prefill 会从 2.3K 降到 1.4K tok/s，TTFT 从 1.6 秒涨到 80 秒[4]；&lt;/li&gt;
&lt;li&gt;思考链：agent 场景把思考等级拉满，几十秒全耗在 reasoning 上，跟解码速度没关系[2]；&lt;/li&gt;
&lt;li&gt;模型版本：Qwen 3.8 的 27B 工具调用稳定性实测反而不如 3.6，这也是"测速之外的坑"[3]。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以理性选购的第一条原则是：&lt;strong&gt;别用别人晒出来的一个 t/s 数字做决定，要看对方测的是什么场景、什么配置&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;双卡：想上更大模型的另一条路&lt;/h2&gt;
&lt;p&gt;如果目标本来就是 34B+ 稠密或 120B 级 MoE，单卡无论 24G 还是 32G 都装不下，那就该考虑双卡——但这里有几个和 N 卡完全不同的现实：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AMD 没有 NVLink&lt;/strong&gt;，双卡张量并行走 PCIe，速度不是简单的 2 倍，实测约 1.3–1.5 倍；48G 名义显存实际可用约 44–45G（通信 buffer + 分片对齐各吃掉 1.5–2G）[1]；&lt;/li&gt;
&lt;li&gt;双 7900XTX：二手约 1.2–1.4 万，配 1000W+ 电源，功耗 700W+；论坛实测跑 27B + MTP（TP2）单请求 73–83 tok/s，2 并发聚合 85 t/s[7]；另一帖用魔改 SGLang 双卡 TP 做到 TTFT &amp;lt;1s、平均 TG 80–100、4 并发聚合 200 t/s[9]；&lt;/li&gt;
&lt;li&gt;双 R9700：功耗低（350W×2）、是&lt;strong&gt;更新的 4 代卡&lt;/strong&gt;；论坛有人实测"速度接近双 7900XTX 的两倍，还能跑 FP8"[7]；&lt;/li&gt;
&lt;li&gt;混插注意：&lt;strong&gt;RDNA3 + RDNA4 混插不能合体跑同一个模型&lt;/strong&gt;（要 HSA_OVERRIDE 补丁，且小模型 TP 收益会被 PCIe 同步吃掉大半），只适合分工各跑各的——R9700 当"容量机"跑大上下文/出图，7900XTX 专职喂 agent[11]。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;生态与折腾成本：容易被忽略的隐藏分&lt;/h2&gt;
&lt;p&gt;跑本地模型，硬件的"纸面性能"只占一半，另一半是软件生态。这点上两卡也各有说法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;7900XTX（RDNA3）生态最成熟&lt;/strong&gt;。教程、抄作业帖最多，Vulkan/ROCm/各种 vLLM、SGLang 魔改分支都齐备，Windows 下也有机智 Box 一类整合包降低门槛[12]。老平台的坑（ReBAR、NUMA）也被反复讨论过，查得到答案[2]。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;R9700（RDNA4）是新品&lt;/strong&gt;。好消息是 ROCm 6.3+ 对它的支持比 RDNA3 省心、争议少[1]；Windows 下 ROCm 10 路线已经能跑通 128K + MTP[5]。坏消息是 vLLM 官方主干对 RDNA4 的 MXFP4 支持仍一般，想跑出前面那个吓人的 prefill 数字，得用社群 fork（vllm-radiance），对新手不友好[4]。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还有一条现实的建议来自论坛老玩家，值得搬过来：&lt;strong&gt;AMD 的卡"买了就得认"，折腾门槛比 N 卡高；没有硬件基础和折腾意愿的人，别为了省几千块去买生态末期的"工业垃圾"，新卡反而不用怕退役在自己手里[12]。&lt;/strong&gt; 这条虽然是针对洋垃圾说的，但对"24G vs 32G"同样适用——买新不买旧在 A 卡上尤其成立，因为软件支持总是优先给新架构。&lt;/p&gt;
&lt;h2&gt;结论：你到底该买哪个&lt;/h2&gt;
&lt;p&gt;把前面所有实测收敛成三句话：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;只跑 27B 及以下、上下文 32K 内、当"副手"用 → 24G 完全够，且吐字更快、更便宜。&lt;/strong&gt; 预算有限优先 7900XTX，省下的钱买好 CPU/内存/固态更实在[2][3][10]。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;想跑 27B 高精度量化（Q6/Q8）、需要 64K+ 长上下文、想挂 MoE（35B-A3B）、或要边跑模型边出图 → 32G 的 R9700 更值。&lt;/strong&gt; 它解决的是"塞不塞得下"和"agent 跟不跟手"这两个 24G 解决不了的问题[1][4][5]。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目标是 34B+ 稠密或 120B MoE → 24G、32G 单卡都不行，直接算双卡预算&lt;/strong&gt;（或上 48G/96G），别在单卡容量上纠结[1][4]。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;至于"24G 还能用几年"——从论坛当前的甜点模型（27B Q4）来看，24G 至少还能稳吃一两个大版本；但它已经在 Q6/Q8 和长上下文上贴边了。&lt;strong&gt;如果你预算允许且想一步到位、少折腾，32G 的余量能让你在两三年内面对"新模型变大"时不那么被动&lt;/strong&gt;；如果预算紧张、且你确定自己就玩 27B，24G 现在买也绝不亏。选卡从来不是选"最大的"，是选"够用且用得起"的——理性消费，量力而行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考来源&lt;/h2&gt;
&lt;p&gt;本文所有实测数据均来自抡锤者（lcz.me）论坛会员的真实分享，下列原帖均可点击查看完整配置与测法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/349/349/7900xtx-vs-r9700-llm速度对比"&gt;7900xtx vs r9700 llm 速度对比&lt;/a&gt; — https://lcz.me/topic/349/349/7900xtx-vs-r9700-llm速度对比（TID:349，含单卡带宽/容量分析与双卡显存损耗讨论）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1164/1164/7900-xtx-跑-qwen3.8-27b-實測73.4t-s-完整部署與實測指南-claude-code-opus5協助佈署的-分享給大家"&gt;# 7900 XTX 跑 Qwen3.8-27B 實測 73.4t/s 完整部署與實測指南&lt;/a&gt; — https://lcz.me/topic/1164/1164/7900-xtx-跑-qwen3.8-27b-實測73.4t-s-完整部署與實測指南-claude-code-opus5協助佈署的-分享給大家（TID:1164，测法最严谨的一帖：同一台机器不同题目 39→73 t/s）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1135/1135/7900xtx-qwen3.8-27b-63t-s"&gt;7900xtx qwen3.8 27b 63t/s&lt;/a&gt; — https://lcz.me/topic/1135/1135/7900xtx-qwen3.8-27b-63t-s（TID:1135，Vulkan + MTP 实测与 3.6/3.8 工具调用对比）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1529/1529"&gt;單張 R9700 AI PRO 32G + VLLM + amd/Qwen3.8-27B-Quark-AWQ-MXFP4&lt;/a&gt; — https://lcz.me/topic/1529/1529（TID:1529，R9700 特调 vLLM 全参数与 prefill/decode 基准）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1535/1535"&gt;AMD R9700 實測：ROCm 10，Qwen38-27B-UD-Q6_K、128K context 和 MTP&lt;/a&gt; — https://lcz.me/topic/1535/1535（TID:1535，R9700 长上下文实测与 TTFT 数据）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1488/1488"&gt;R9700 的速度还是挺好的，单发 170，双并发 180&lt;/a&gt; — https://lcz.me/topic/1488/1488（TID:1488，R9700 跑 35B-A3B 与 MoE 速度实测）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1482/1482"&gt;关于双 AMD RX7900XTX 的使用感受&lt;/a&gt; — https://lcz.me/topic/1482/1482（TID:1482，双 7900XTX 源码编译 vLLM 实测、二手价格与功耗）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1508/1508"&gt;15 年老平台 + 单张 RX 7900 XTX 跑 Qwen3.8-27B：本地 Coding Agent 实测&lt;/a&gt; — https://lcz.me/topic/1508/1508（TID:1508）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1532/1532"&gt;魔改 SGLANG 支持 7900XTX 双卡 TP TTFT &amp;lt;1s 平均 TG 80-100&lt;/a&gt; — https://lcz.me/topic/1532/1532（TID:1532，双卡 SGLang 参考）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1479/1479"&gt;7900xtx 一般都用来做什么，我部署了 qwen3.8 27b&lt;/a&gt; — https://lcz.me/topic/1479/1479（TID:1479，24G 卡的日常定位讨论）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1172/1172/我想知道有没有伙伴用amd-r-9700-32g-rx-7900xtx-24g混合部署ai模型"&gt;我想知道有没有伙伴用 AMD R9700 32G + RX 7900xtx 24G 混合部署 ai 模型&lt;/a&gt; — https://lcz.me/topic/1172/1172/我想知道有没有伙伴用amd-r-9700-32g-rx-7900xtx-24g混合部署ai模型（TID:1172，混插限制与"容量型卡"定位）&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lcz.me/topic/1465/1465"&gt;AMD Yes？它的显卡适合谁？MI210 是宝藏还是工业垃圾？&lt;/a&gt; — https://lcz.me/topic/1465/1465（TID:1465，A 卡生态/新旧架构支持讨论）&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="7900XTX"/><category term="R9700"/><category term="显存"/><category term="本地模型"/><category term="LLM"/><category term="32G"/><category term="24G"/><category term="显卡选购"/><category term="Qwen"/><category term="理性选购"/></entry><entry><title>用 opencode 搞定哨笛笛头打印：从手搓失败到真正能吹的实战</title><link href="https://blog.cycleuser.org/yong-opencode-gao-ding-shao-di-di-tou-da-yin-cong-shou-cuo-shi-bai-dao-zhen-zheng-neng-chui-de-shi-zhan.html" rel="alternate"/><published>2026-09-08T10:00:00+08:00</published><updated>2026-09-08T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-08:/yong-opencode-gao-ding-shao-di-di-tou-da-yin-cong-shou-cuo-shi-bai-dao-zhen-zheng-neng-chui-de-shi-zhan.html</id><summary type="html">&lt;p&gt;3D 打印一个哨笛笛头，听起来不像什么难事——不就是个带孔的管子嘛。&lt;/p&gt;
&lt;p&gt;这次全程用 opencode 辅助。整个过程并不顺利，走了好几次弯 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;3D 打印一个哨笛笛头，听起来不像什么难事——不就是个带孔的管子嘛。&lt;/p&gt;
&lt;p&gt;这次全程用 opencode 辅助。整个过程并不顺利，走了好几次弯路。&lt;/p&gt;
&lt;h2&gt;一开始我以为很简单&lt;/h2&gt;
&lt;p&gt;我想做一个哨笛笛头：内径 2.2cm 到 1.8cm 的管子都能装上去，用来 3D 打印。第一反应是让 opencode 用 OpenSCAD 写一个参数化模型。&lt;/p&gt;
&lt;p&gt;我给它就只说是哨笛的笛头，模型选择的是 DeepSeek V4 Flash，它好像是觉得哨笛就是个竖直的气槽——上面是吹口，中间一条窄风道往下走，前面开个窗口，下面是刀刃。于是它顺着这个印象，建了圆柱、锥形榫头，然后减去风道、减去窗口、减去音孔。&lt;/p&gt;
&lt;p&gt;渲染出来看，外观还挺像回事——一个规规矩矩的圆柱，上面开了个槽。&lt;/p&gt;
&lt;p&gt;可一剖开就露馅了。沿着对称面切一刀看内腔剖面：风道、窗口、刀刃一堆几何互相打架，剖面图支离破碎，根本不是做声音的结构。这个"表面光鲜、一剖就漏"的坑，是 AI 建模最容易踩的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AI 不会告诉你它没把握，它只会很自信地把一个错的模型交给你。&lt;/strong&gt;外表和三视图都能骗人，只有切开看内腔剖面，才看得出这玩意儿到底能不能出声。&lt;/p&gt;
&lt;h2&gt;查资料：真正的笛头长什么样&lt;/h2&gt;
&lt;p&gt;这一版被打回之后，我让 opencode 去搜真正的笛头结构。&lt;/p&gt;
&lt;p&gt;它搜到了一个在哨笛圈很有名的资料：Guido Gonzato 的《The "Low-Tech" Whistle》。这份资料最大的价值是给了吹口每个部位的&lt;strong&gt;实测比例&lt;/strong&gt;——风道该多宽、窗口该多大、刀刃上缘该磨成多少度、风道块该放到离刀刃多远。这回让 opencode 按这些比例重新建参，再剖开看，终于"看着像"了。但我还是高兴得太早——"看着像"不等于"是对的"。&lt;/p&gt;
&lt;h2&gt;关键的转折：方向搞反了&lt;/h2&gt;
&lt;p&gt;真正的问题在接笛身的那一端。&lt;/p&gt;
&lt;p&gt;我一开始只是跟 opencode 说"做一个笛头"，它顺着自己脑补的形状，把下端做成了&lt;strong&gt;凸出来的锥形榫头&lt;/strong&gt;（插进管子里去）。但我要的是&lt;strong&gt;母口锥形插口&lt;/strong&gt;——笛头开口朝下，把笛管往上顶进去，卡得越深越紧。这样不用精确量口径，插到哪段卡住就算哪段。&lt;/p&gt;
&lt;p&gt;这一步是我中途把 opencode 拽回来的：它做反了。我跟它说"不对，应该是向下开口、越往里越紧，这样不同口径的管子都能往上插进去"，它才重新改。&lt;/p&gt;
&lt;p&gt;这个"凸还是凹"的差别，我在对话里反复纠结了好几次才真正确认。事后想想，这不能全怪 AI——&lt;strong&gt;需求里的方向性信息，AI 很容易理解偏。&lt;/strong&gt; 尤其是涉及到具体形状的时候，当前这些模型其实未必具有多么好的空间感知。&lt;/p&gt;
&lt;p&gt;所以那之后我学到一个习惯：&lt;strong&gt;让 AI 建模之前，先把"你要的东西到底是什么形状、怎么跟别的件配合"在对话里用一两句话钉死。&lt;/strong&gt; 否则模型可能就按自己瞎猜的来，那自然越做越偏。&lt;/p&gt;
&lt;h2&gt;真正能吹的那一个：拿来一份成品&lt;/h2&gt;
&lt;p&gt;自己手搓懒得绘制，让模型自己做还终究心里没底。于是让模型直接在 MakerWorld 上找了一个&lt;strong&gt;已经验证能吹的&lt;/strong&gt;成品：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;哨笛笛头（D 调，内径 13mm），别自己造了，用这个改。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是整个流程里最有价值的一步转折——&lt;strong&gt;不要从零造，找一个已经被证明能响的，改它。&lt;/strong&gt; 把下载好的文件放进目录：&lt;code&gt;平口吹嘴(金属打印)D_stls.zip&lt;/code&gt;，解压出来是一个 STL。&lt;/p&gt;
&lt;p&gt;这时候 opencode 的用处就体现出来了——它能把一个黑盒 STL 读得明明白白：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;水密性检查&lt;/strong&gt;：是不是一个封闭的实体，能不能切片。&lt;code&gt;is_watertight&lt;/code&gt; 为真。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;是否多件&lt;/strong&gt;：里面有没有断开成好几块。它确认是单一实体。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逐层切片&lt;/strong&gt;：沿着轴线每切一刀，读出这一层的内径（音孔）和外径。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;按它读出来的结果，这个 Celtic 笛头是：外径 14.5mm、内径 13mm、长 38.7mm 的一根直管，吹口在顶端，下端就是接笛身的那段音孔。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;内音孔&lt;span class="w"&gt;    &lt;/span&gt;外径
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;13.0&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;14.5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;下端接笛身
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;13.0&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;14.5&lt;/span&gt;
&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;11.9&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="m"&gt;14.5&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;进入风道&lt;span class="o"&gt;/&lt;/span&gt;刀刃区
&lt;span class="kc"&gt;...&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="kc"&gt;...&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="kc"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这就是 &lt;strong&gt;AI 相对擅长的事：把做好的东西用数据一层层进行解析&lt;/strong&gt;。这种"读任意一个 3D 网格并量化它的每个截面"的活，人做很费劲，模型来做就简单易行，几步就完了。&lt;/p&gt;
&lt;h2&gt;改成 20mm：为什么是"等比放大"，而不是"改内径"&lt;/h2&gt;
&lt;p&gt;我之前一心想把音孔从 13 改成 20mm，直觉上觉得是"把那个孔改大"。但 opencode 读完这个模型的结构后，给了一个更对的方案：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Celtic 这个笛头和笛身，是同一根管子首尾对接&lt;/strong&gt;——外径和内径都连续，头上没有插口。所以最稳妥、也最不破坏发音的办法，是&lt;strong&gt;整个笛头等比放大&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;20&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;13&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.538&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;把整个模型放大 1.538 倍。这样风道、窗口、刀刃、音孔全部&lt;strong&gt;按同一个比例同步放大&lt;/strong&gt;，相对关系一点没变——所以它照样能响，只是音孔更大、音更低。这比"单独把某个孔改大"安全得多，因为单独改孔，很容易把风道和刀刃的比例破坏掉，那才是真的会不响。&lt;/p&gt;
&lt;p&gt;放大后验证了一下：音孔正好是 20.0mm，外径 22.3mm，长 59.5mm。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;水密: True
单一实体: True
音孔: 20.1 mm
外径: 22.3 mm, 长: 59.5 mm, 体积: 4.5 cm³
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;放大后的笛头，外形跟原版一模一样，只是整体大了一圈：&lt;/p&gt;
&lt;p&gt;&lt;img alt="放大到 20mm 音孔的笛头" src="../images/whistle_20mm_iso.png"&gt;&lt;/p&gt;
&lt;h2&gt;做成"母口锥形插口"&lt;/h2&gt;
&lt;p&gt;接下来要做的是母口锥形插口：开口放宽、往里收窄、楔紧。&lt;/p&gt;
&lt;p&gt;做法是让 opencode 用 OpenSCAD 对那个放大的 STL 做布尔运算：先把下端音孔临时封成一个实心圆柱，再用一个锥体减去，得到一个"开口大、往深处小"的锥孔。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;difference() {
  import(&amp;quot;celtic_head_20mm.stl&amp;quot;);
  translate([0,0,-29.7]) cylinder(h=17.5, r1=10.0, r2=9.0);  // 开口Ø20 收到 Ø18
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这中间又踩了个坑。这个 STL 有六万多个面，OpenSCAD 的 CGAL 布尔运算特别慢，第一次用默认超时跑，结果生成到一半被掐断——输出的 STL 是"半截"的：三角面数对不上，末尾还停在半句 &lt;code&gt;facet normal&lt;/code&gt; 上。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;facet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="m"&gt;11466&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;数得出来
&lt;span class="n"&gt;outer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="m"&gt;11465&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;差一个，说明最后一面没写完
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;把超时放宽到好几分钟重跑，这次才完整。算完再切片验证锥度，确实是从开口 20mm 一路收到 18mm：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;z 深度  音孔
 3mm    19.6
 7mm    19.1
11mm    18.9
17mm    18.05
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;后来又想要一版 19.5 到 19 的，改两个参数重跑一遍就行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cylinder(h=17.5, r1=9.75, r2=9.5);   // 开口Ø19.5 收到 Ø19
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这就体现参数化建模 + 脚本的好处：改的不是形状，是三个数字。&lt;/p&gt;
&lt;p&gt;&lt;img alt="带母口锥形插口的笛头（开口 Ø20 → 深处 Ø18）" src="../images/whistle_head_iso.png"&gt;&lt;/p&gt;
&lt;h2&gt;打印与自用&lt;/h2&gt;
&lt;p&gt;最后交付的三样东西是：&lt;strong&gt;可切片的 STL、剖切剖面图、尺寸和说明&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;打印上有几个点要提醒：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;层高别超过 0.16mm，因为风道才 1.2mm 宽，层高粗了风道就废了；&lt;/li&gt;
&lt;li&gt;竖直摆、吹口朝上、插口朝下；&lt;/li&gt;
&lt;li&gt;用 PETG 或 ABS，别用软料，软料会发闷。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外很重要的一点：&lt;strong&gt;音高不是笛头定的，是笛身长度定的。&lt;/strong&gt; 笛头只负责发出"哨声"这个机制，具体吹多高，取决于你接的管子多长。20mm 音孔想吹到 G 调低音，管身大约要 43–45cm，然后从管脚每 1mm 修短，用调音器调准。这一点很多人第一次做会搞反——以为是笛头决定音高，其实是管长决定音高。&lt;/p&gt;
&lt;h2&gt;经验：AI 到底帮上了什么，又帮不上什么&lt;/h2&gt;
&lt;p&gt;这事做完，我最深的体会不是"AI 多厉害"，而是 &lt;strong&gt;AI 在一个正确方向上有多能打，在一个错误方向上就有多能跑偏。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;帮得上忙的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;查资料&lt;/strong&gt;：它搜到了 Gonzato 那份实测比例的资料，这是我自己翻半天都未必找得到的；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;读黑盒网格&lt;/strong&gt;：把一个陌生 STL 的水密性、单件性、每一层的内径外径，用数据量化出来；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;几何计算&lt;/strong&gt;：布尔运算、等比缩放、逐层切片验证锥度，这些又枯燥又容易算错的活，它干得很稳；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成交付物&lt;/strong&gt;：可打印 STL、剖面图、打印说明，一条龙。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;帮不上忙、必须人来的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义需求&lt;/strong&gt;："笛头到底要怎么跟笛身配合——插口还是对接、口径多少"这种方向性的事，得自己钉死；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;判断对不对&lt;/strong&gt;：第一次那个"剖开就散"的错误结构，AI 自己觉得挺对，只有人和剖面图能判定它错了；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拿到被墙挡住的成品&lt;/strong&gt;：MakerWorld 的反爬加登录，AI 翻不过去，得自己点一下下载；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用耳朵验收&lt;/strong&gt;：风道差零点几毫米，AI 算不出来算不算"好听"，只有吹了才知道。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以这套流程的正确姿势是：&lt;strong&gt;我提问题、定标准、给参考、最后拍板；AI 负责查、算、读、改、出图。&lt;/strong&gt; 顺序不能反。你先给一个模糊指令，它就顺着自己脑补的形状一路狂奔；你越先把"对的东西长什么样"给它，它越接近你要的。&lt;/p&gt;
&lt;p&gt;这次下来，哨笛笛头算是打印出来了。回头再看，AI 是很好的辅助执行者，但"什么才算对了"这件事，建议还是得咱们人类来定。&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="AI"/><category term="3D打印"/><category term="哨笛"/><category term="OpenSCAD"/><category term="参数化建模"/><category term="trimesh"/></entry><entry><title>刚进入大学的新生朋友一定要注意</title><link href="https://blog.cycleuser.org/gang-jin-ru-da-xue-de-xin-sheng-peng-you-yi-ding-yao-zhu-yi.html" rel="alternate"/><published>2026-09-02T00:00:00+08:00</published><updated>2026-09-02T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-02:/gang-jin-ru-da-xue-de-xin-sheng-peng-you-yi-ding-yao-zhu-yi.html</id><summary type="html">&lt;h1&gt;刚进入大学的新生朋友一定要注意&lt;/h1&gt;
&lt;p&gt;又到一年开学季。各个高校陆续开学了，我这个在大学里待了小二十年的中老登，想跟 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;刚进入大学的新生朋友一定要注意&lt;/h1&gt;
&lt;p&gt;又到一年开学季。各个高校陆续开学了，我这个在大学里待了小二十年的中老登，想跟刚进校门的大学生朋友们分享一点攻略。&lt;/p&gt;
&lt;h2&gt;先学会善待自己&lt;/h2&gt;
&lt;p&gt;先说一件最不起眼、却最要紧的事。&lt;/p&gt;
&lt;p&gt;小学中学的时候，很多孩子会养成一个习惯：有事情先举手跟老师请假，得到允许了再去。我一直觉得，这事真没那么必要。你要是觉得不舒服，需要去卫生间，就应该赶紧去，绝对不要憋着。一旦没憋住，反倒容易生化攻击，那场面大家都懂；就算憋住了，对身体也没什么好处。两头都不划算，何必呢。&lt;/p&gt;
&lt;p&gt;我亲戚家一个孩子，就因为不好意思、不敢跟老师请假，硬是憋着，结果憋出了肠胃问题，消化不良，代谢都受到了影响。你看，这不就为了一点没必要的不好意思，把身体搭进去了么。&lt;/p&gt;
&lt;p&gt;到了大学，大家都是成年人了，更不该这么拘谨。你去上厕所，跟老师招呼一声"我去趟卫生间"就行，只要别太频繁、在合理范围内，没有哪个老师会拦着你。千万不要在那儿等着，非得人家点头你才敢去。&lt;/p&gt;
&lt;p&gt;说到底就一句话：人一定要先让自己舒服。这社会往后有的是让你不舒服的事，你自己个儿要是还为难自己，那真就没法过了。&lt;/p&gt;
&lt;p&gt;建议大家一定要善待自己，先对自己好，才能对别人好。这也是以后展开各种复杂社交关系的前提。有的同学大学里会谈恋爱，甚至以后组成家庭，那能爱别人的前提，一定也是先爱自己。&lt;/p&gt;
&lt;h2&gt;对人不对事，荣誉和典型都别太当真&lt;/h2&gt;
&lt;p&gt;还有好多事，都应该对人不对事。&lt;/p&gt;
&lt;p&gt;谁给你使绊子，谁给你使坏，谁想办法调理你，这种你一定要搞清楚，到底是谁在背后捣的鬼。弄清楚"是谁"很重要，事儿本身反倒不重要。事儿嘛，大概无非就那样，没什么真正过不去的大事。&lt;/p&gt;
&lt;p&gt;这个道理放在荣誉称号上也是一样。什么三好学生不三好学生的，优秀学生干部不学生干部的，未必就真的多么优秀，也未必就真的那么好。这些称号不见得有那么重的价值，堆一摞在那儿，不如你自己有一篇一作的二区以上文章，或者国际学术会议的成果来得实在。&lt;/p&gt;
&lt;p&gt;得想明白，称号只是别人给的一个标签，反映的是一部分情况，不等于这个人本身，更不等于全部价值。&lt;/p&gt;
&lt;p&gt;被树成典型的，也一样要留个心眼。有些地方会推很多所谓的优秀典型，前一阵子某所高校有位被精心打造过"高颜值学霸"人设的女教授，后来被人举报生活作风和道德品质上有问题。被树成典型的人，可能在有些方面确实有可取之处，但也不见得就一定是完人。&lt;/p&gt;
&lt;p&gt;你要知道，一个三好学生，也完全可能在公共场所吸烟，人家的"三好"也许就好在其他地方了。&lt;/p&gt;
&lt;p&gt;人是很复杂的，一个人的优点和缺点往往并存，并不冲突。&lt;/p&gt;
&lt;p&gt;所以，大家一定要理性看待这些。各种地方的宣传物料，可以参考，但绝对不要盲目听信。毕竟人是复杂的，也是会变化的，今天这个样子，明天可能就是另一个样子。&lt;/p&gt;
&lt;p&gt;咱们古代就有应对的智慧：择其善者而从之，其不善者而改之。千万不能盲听盲信，尤其不要太把什么优秀称号当作完全可信的东西。&lt;/p&gt;
&lt;h2&gt;分清事实和观点&lt;/h2&gt;
&lt;p&gt;我曾经跟人说，博士又怎么了，读博无非就是读书的时间多了点，不见得就有什么过人之处。这背后其实有个背景：因为我读过博，所以我这么说的时候，偷偷地会觉得理直气壮。不过说到底，时不时念叨这件事，其实还是隐隐地把学历有那么一点点当回事了，才会这么关注和谈论它。&lt;/p&gt;
&lt;p&gt;而且我那么说，本身也不靠谱，毕竟还是身边统计学，而身边统计学恰恰是最不靠谱的。这一来二去就更说明问题了：我这些看法，充其量只是个观点（opinion），是个观点而已，并不是事实（facts）。&lt;/p&gt;
&lt;p&gt;学会区分这两样，恰恰是培养批判性思维的起点。针对事实，大家公认了，就不用争论；针对观点，大家完全可以各说各的，这都没问题。你清楚哪些是事实、哪些只是观点，就不容易被别人的话带着走。&lt;/p&gt;
&lt;p&gt;就拿"水刊""水硕"这种说法来说。如果你发的期刊被人说成是"水刊"，申请的学校被人说是"水硕"，不妨先理性想想。不是所有期刊都是 nature、science，也不是所有学校都是剑桥、牛津。&lt;/p&gt;
&lt;p&gt;说那些话的人自己弄成了没有？他要是自己都没做出什么像样的东西，却跑来跟你说这是水刊水硕，那这种话就不用太理会他。他说的不过是一个没经过他自己验证的观点，你何必当真。&lt;/p&gt;
&lt;h2&gt;宽容他人，也要守住底线&lt;/h2&gt;
&lt;p&gt;有的同学生活习惯上可能互相有差异，这个一定要想办法尽量互相宽容。&lt;/p&gt;
&lt;p&gt;但宽容不等于没有底线。如果别人不愿意闻到烟味，你千万不要在人家跟前吸烟熏人；别的，比如别拿臭豆腐去熏人，也是一样的道理。这种基本的公德，能具备已经很不错了。毕竟有的人就是习惯在公共场合吸烟，能约束自己、不让自己的行为影响到别人，这一点真的很难得。&lt;/p&gt;
&lt;p&gt;我自己当年上学的时候，就曾经去劝阻别人在公共场合吸烟，发生了"肢体说服"的过程。这个大家千万别学，那绝对是不可以的。&lt;/p&gt;
&lt;p&gt;另外，同学有一些独特的生活爱好或者认知，也千万不要去嘲笑。现在的孩子压力都比较大，对未来的期待、各方面的事情都会影响自己的心境。一旦发生矛盾冲突，年轻气盛的，真闹出点什么伤损来，非常不必要。大家一定要互相宽容、互相体谅，实在不成，大不了换个寝室，也千万不要发生过激的矛盾。&lt;/p&gt;
&lt;h2&gt;大学里也可能交到真朋友&lt;/h2&gt;
&lt;p&gt;高中、初中、小学的那些朋友，等你长大之后会发现，彼此的价值观有很多差异，不一定很兼容，也不一定聊得来。真到了大一放暑假、寒假回去，你就会发现，跟很多以前玩得来的老朋友，共同语言在逐渐变少。反倒是跟大学同学，哪怕是大学期间结识的其他院系的同学，反而可能有更多相近的话题。&lt;/p&gt;
&lt;p&gt;说句可能有点扎心的话：真正的朋友，有可能是大学里才交得到的。&lt;/p&gt;
&lt;p&gt;也许，人真正的朋友，本来就是得等自己成熟了、长大了，能够判断彼此三观是否兼容之后，才慢慢沉淀下来的。急不来，也强求不来。&lt;/p&gt;
&lt;h2&gt;请假走流程，诚实放第一&lt;/h2&gt;
&lt;p&gt;有些时候你要请假，一定要按人家的要求来。辅导员老师或者上课的老师，不是故意要为难你，不太可能有这种事。但要是真病了请假，如果对方要求挂号记录、去掉隐私信息的病历、诊断证明或者其他合理证据，那还应该配合。&lt;/p&gt;
&lt;p&gt;这里头最关键的是要诚实。绝对不能骗人，不能拿个图片糊弄一下，这种事做不得。社会的规则，在大学期间就要逐渐适应。流程就是那样，对方只是负责要求你走完这个流程，他不见得是为了阻碍你。这些环节里的人，都是对事不对人的，你把该交的东西交齐，事情自然就顺了。&lt;/p&gt;
&lt;p&gt;如果就是不开心了，也一定要说出来，要想办法弄清楚是谁让你不开心，要跟人说清楚你确实不开心。要不然，人家不知道，你也不说，自己闷着受伤，和同学之间的关系也会受影响。有什么事摊开来讲，多半比憋在心里强。别把话烂在肚子里，也别指望别人能猜中你的心思。&lt;/p&gt;
&lt;h2&gt;送到校门口，想起当年&lt;/h2&gt;
&lt;p&gt;我前几天陪我哥们儿，把他外甥女送到某所老牌名校报到。在校门口，一下子想起二十来年前，我们俩一块儿骑车在北京城里转悠，在没名湖边还给他照过几张相。&lt;/p&gt;
&lt;p&gt;那天送完孩子，把他订好的旅馆留给孩子休息，我们俩跑出去，想着干嘛呢，去网吧打游戏。打了半天，最开始打 CS，连机器人都不打过，后来只能玩骑马与砍杀，玩骑砍还行，但也远不如当年神勇了。玩了两个多小时就开始累，没到四小时就退机了。想当年那都是能包宿的，现在去网吧打游戏都没成绩。&lt;/p&gt;
&lt;p&gt;不过得说一句，现在的网吧配置是真高，有的都是 5080 档那种高端显卡，内存普遍 32G 以上。所以有时候自己机器跑不动的东西，也可以考虑找家合适的网吧试试。但前提是，得先问清楚人家允不允许自带软件和环境，这玩意儿可能挺麻烦，一定先沟通好，别把人家机器弄坏了。&lt;/p&gt;
&lt;p&gt;好了，就说这么多吧。希望大家都能好好的，先爱自己，再爱这世界。&lt;/p&gt;</content><category term="随笔"/><category term="大学"/><category term="建议"/><category term="生活"/><category term="成长"/><category term="随笔"/></entry><entry><title>高校教师建议大学生朋友们不要忽视外语的学习</title><link href="https://blog.cycleuser.org/gao-xiao-jiao-shi-jian-yi-da-xue-sheng-peng-you-men-bu-yao-hu-shi-wai-yu-de-xue-xi.html" rel="alternate"/><published>2026-09-02T00:00:00+08:00</published><updated>2026-09-02T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-02:/gao-xiao-jiao-shi-jian-yi-da-xue-sheng-peng-you-men-bu-yao-hu-shi-wai-yu-de-xue-xi.html</id><summary type="html">&lt;h1&gt;高校教师建议大学生朋友们不要忽视外语的学习&lt;/h1&gt;
&lt;p&gt;从小学三年级开始学一门外语，小学三年，初中三年，高中三年，这就九年 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;高校教师建议大学生朋友们不要忽视外语的学习&lt;/h1&gt;
&lt;p&gt;从小学三年级开始学一门外语，小学三年，初中三年，高中三年，这就九年了。要是从一年级开始学，那就是十二年。可现实没那么好看，大一新生里，能流畅或者哪怕只是大方自然地使用一门外语的，恐怕比例不太多。&lt;/p&gt;
&lt;p&gt;人从出生学说话，用不了九年就能把一门语言说利索了。当然，母语有足够的环境和外部输入，学习效率不一样，这没错。但无论如何，九年十年十二年下来，也不该是张不开口、听不明白这种状态吧。&lt;/p&gt;
&lt;p&gt;听说读写，人类的语言本来就应该先听说后读写。可现在的考试考核方式是这样吗？从小学以来的教学方式是这样吗？以前或许还有人会说，外语师资缺乏，只能面对困难将就一下。这都将就多少年了？外语专业的人才还那么匮乏吗？为什么这么多年过去了，情况并没有明显改善呢？&lt;/p&gt;
&lt;h2&gt;我的外语，是一路垫底一路用过来的&lt;/h2&gt;
&lt;p&gt;说起这事，得从小学讲起。那时候我说外语，有同学笑话我的口音。我二话不说，就对他进行肢体说服教育，让他以后别这么干。这么一来二去，我反倒养成了习惯，也不怕丢人，就是敢说。&lt;/p&gt;
&lt;p&gt;到了高中，我依然敢跟人开口说，也长期靠捡塑料瓶子卖钱换磁带，买各种听力材料来听，买 VCD 来看电影。所以即便考试成绩不理想，我也一直没因为成绩而缺乏自信，始终有勇气去使用这门外语。&lt;/p&gt;
&lt;p&gt;到了大学，我当年大一入学的时候，外语摸底考试考了个 52 分，全班倒第二。然后外语老师把我和另一位估计是倒第一的同学一起叫到办公室，告诉我们要好好努力学习。我还以为是因为我俩特殊优秀呢，后来才知道，我俩应该是垫底的。&lt;/p&gt;
&lt;p&gt;大学里，很多同学都是读写很厉害，在本土的常规考试里很占优势。不过我听得明白，阅读虽然很多词汇我不太认得准（注意，不是完全不认识，是认得不太准，也不会背记拼写），照样能得一些分。&lt;/p&gt;
&lt;p&gt;后来我从基地班被分流出去的时候，新的外语老师还嘲讽我，怕我过不了四六级。其实当时我只是错过了第一次报名机会罢了。后来我都是考一次就过，而且那时候特别傻，每次考四六级之前，都在背一本后来才知道是托福单词的单词书。&lt;/p&gt;
&lt;p&gt;不过功夫总是有用处的。我后来裸考过了 PETS5，从而读博的时候可以外语免修。后来两次参加托福，分别考了 100 和 103。这分数不算高，但对于三十来岁、又没有特别投入时间准备的我来说，已经很知足了。而且很自然，我越来越敢于用这门语言，一点也不惧怕。当初在学校参加外语演讲比赛，我第一次拿了校赛非外语专业的一等奖，第二次拿了个二等奖。但当时说一等奖不方便去参加国赛，指导教师还问我是否愿意替补去。我那时候年少气盛，直接撕了二等奖的证书，告诉他说我没获奖，不能去。&lt;/p&gt;
&lt;p&gt;可回看我的大学生活的起点，尤其是那次外语摸底考试。作为被叫到办公室加以鼓励的后进生，以及后来各种原因、反正就是成绩不行而从基地班分流出来的淘汰生，单看外语的应试能力，我绝对远远逊色于我的那些同学们。&lt;/p&gt;
&lt;p&gt;可是十多年以后呢？我有一次碰巧遇到过一个同学，在某个学术交流场景和一位海外同行沟通。他说话的声音依然是颤抖的，我能感受到他的紧张。&lt;/p&gt;
&lt;h2&gt;我们是不是从一开始就学反了&lt;/h2&gt;
&lt;p&gt;也许我们从小的教学过程，就更多关注的是考试的应试能力，而听力和口语在里面占比一直很低。&lt;/p&gt;
&lt;p&gt;也许过去来看，经济条件更好的家庭可以有更多的资源支撑孩子去接触外语环境，甚至出国旅游研学等等。&lt;/p&gt;
&lt;p&gt;而如今呢？视频网站上一堆学习资源，AI 也来了。手机上装一个 AI 客户端，不管你用的是千问还是其他的，都可以让它用外语跟你对话，还能问各种语法问题。&lt;/p&gt;
&lt;p&gt;所以用 AI，应该让它首先作为一个大语言模型的本职工作来帮忙学习一门外语。&lt;/p&gt;
&lt;p&gt;我们有了 AI，不是为了不学外语了，而是应该让一切学习都能够最大化地提高效率。&lt;/p&gt;
&lt;p&gt;当然，AI 的语言能力其实很基础，也就是语法合规和基本的记忆检索，很多创造性内容其实做不到。前两年我带着 22 级同学做了一个研究，就是模型连对对联这么简单的任务，都未必能完成得很好。哪怕不用要求平仄，让 AI 给「南来北往吃东西」对一个下联，往往都很不理想，就连「远迎近送论亲疏」或者「夏种冬藏度春秋」这种都对不出来。&lt;/p&gt;
&lt;p&gt;但定语从句、宾语从句以及时态语态阴阳格等等，对于外语学习场景来说，LLM 还是足够用一阵的了。&lt;/p&gt;
&lt;h2&gt;别信"不用学外语"那套话&lt;/h2&gt;
&lt;p&gt;网络上有些声音，说什么本土文化足够自信，不需要学外语。这话其实站不住脚，也和咱们教育部门的政策相违背。义务教育阶段从一开始就有外语教学，中考高考也都设有外语科目，不管是哪一种外语，只要是教育部门政策规定要学习、要考试的，自然都有它实实在在的作用。&lt;/p&gt;
&lt;p&gt;一个简单的道理是，本土文化越是昌盛，越需要有外语能力，才好把这些源远流长、海纳百川的文化对外输出出去。自己都张不开口，怎么给别人讲我们的好东西？所以鼓吹外语无用、甚至污名化外语学习的，要么背后有某些不希望我们开放的声音在暗戳戳使劲，要么就是一些不愿意努力的失败者，拿这套说辞给自己找个台阶，好掩盖不努力的懒惰，又或者纯粹是发泄一下无能狂怒。真信了这些，吃亏的只有自己。&lt;/p&gt;
&lt;p&gt;华夏文明源远流长，历来是世界上最包容、胸怀最广阔的文明之一，从来不具有侵略性、扩张性，靠的是昌盛的文化来实现威名远播。越是这样，越需要把外语学起来，把我们的故事讲出去，讲给更多人听。&lt;/p&gt;
&lt;p&gt;所以，希望孩子们都能好好学外语，将来对外讲好我们自己的故事。&lt;/p&gt;
&lt;h2&gt;每一代人都在羡慕下一代&lt;/h2&gt;
&lt;p&gt;以前总遇到一些上年纪的人，他们总会对当时的我说：你看你们现在都有书店、有字典、有纸有笔了，我们那会儿都用很粗糙的发黄的纸张当本子，还得爱惜着用。&lt;/p&gt;
&lt;p&gt;我们现在这些中老登，看到现在的青少年，也会说：你看你们现在都有电脑了，都有 AI 了，可以搜索任何想知道的东西了。我们那会儿上网吧还要被烟熏，还要被父母怀疑打游戏，自己买电脑都特别贵。&lt;/p&gt;
&lt;p&gt;也许，都是错过了学习能力最强、精力最旺盛的年岁的人在羡慕当前的年轻一代。而他们自己当年没有这种条件，如今条件倒是都有了，但已经错过了全盛时期，既没法全心投入，也发挥不出当年的想象力，只能转身面对越来越惨淡的生活。&lt;/p&gt;
&lt;p&gt;所以你看，当年有人羡慕我有纸有笔，如今我羡慕他们有 AI。条件从来不是最稀缺的东西，愿不愿意开口、敢不敢开口，才是。&lt;/p&gt;
&lt;p&gt;愿现在的年轻人，能把这么好的工具用起来。外语这扇门，其实是靠胆子推开的，不是靠分数敲开的。&lt;/p&gt;
&lt;h2&gt;到了大学，千万别浪费外语课&lt;/h2&gt;
&lt;p&gt;现在同学们进入大学了，可能有的大学外语课非常别致，比如教师自己也不怎么讲，就让同学们自己做 PPT 自己讲，美其名曰「翻转课堂」，可能大家就会感觉学不到什么。这里头有个数字值得想想：外语很可能是大学四年里课时数最多的课程，至少也是排在最前面的那几门之一。这么多课时，要是纯靠刷手机混过去，那就真的太可惜了。所以这些时间千万别浪费了，哪怕带着个本子练练写字，也总比看手机刷短视频强。而且有机会就要争取多提问、多说外语，不要笑话别人，也不要怕被笑话，就是要让有限的课程时间尽可能为自己所用。有各种相关比赛都多参与，在比赛过程中，一些短板就露出来了，需要额外学的东西也有思路了，就不至于浑浑噩噩茫茫然跟着课程和教材。跟着课程和教材学出来的也不太可能是顶级高手，顶级高手一定要有自己的训练策略和战略目标，然后一步一步地逐渐达到这个战略目标。课时的总量摆在那儿，用不用、怎么用，主动权其实全在自己手里，用得好，这几年能顶别人好几年。&lt;/p&gt;</content><category term="随笔"/><category term="外语"/><category term="学习"/><category term="听说读写"/><category term="AI"/><category term="教育"/><category term="随笔"/></entry><entry><title>烤串、公开课和那些不会做的题</title><link href="https://blog.cycleuser.org/kao-chuan-gong-kai-ke-he-na-xie-bu-hui-zuo-de-ti.html" rel="alternate"/><published>2026-09-02T00:00:00+08:00</published><updated>2026-09-02T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-02:/kao-chuan-gong-kai-ke-he-na-xie-bu-hui-zuo-de-ti.html</id><summary type="html">&lt;h1&gt;烤串、公开课和那些不会做的题&lt;/h1&gt;
&lt;h2&gt;小学门口那根烤串&lt;/h2&gt;
&lt;p&gt;我小时候，因为父母四处打工赚钱的原因，跟着他们到处走，所以到哪儿 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;烤串、公开课和那些不会做的题&lt;/h1&gt;
&lt;h2&gt;小学门口那根烤串&lt;/h2&gt;
&lt;p&gt;我小时候，因为父母四处打工赚钱的原因，跟着他们到处走，所以到哪儿都是插班生，前前后后换了不知道多少所小学。&lt;/p&gt;
&lt;p&gt;有一所小学的门口，有卖烤串的。有一次，大概是三年级吧，老师专门把我们叫住，说千万不能吃学校门外那烤串，那串儿都是死耗子肉做的，无辜鸡爪都是找老年女性用牙啃的，反正怎么恶心怎么说，就是不让我们吃。&lt;/p&gt;
&lt;p&gt;结果有一天放学，我正看见一个同学在校门口买了串儿，又被这老师撞上了，他当场就把人赶走，说不能吃。可后来呢，我看他抢过来，自己吃了。&lt;/p&gt;
&lt;p&gt;我当时就觉得，这老师又虚伪又假。他对着我们，平时经常凶，很少有好脸色。可偏偏有一次，学校搞那种表演性质的公开课，后面坐了一排老头老太太，据说都是能决定他职称晋升的人。那一节课他讲得可认真了，而且一直在笑。我一学期都见不到他笑几次，就那天，他一直在笑，笑了一整节课。&lt;/p&gt;
&lt;p&gt;我当时就觉得特别神奇。人怎么能变得这么快呢？&lt;/p&gt;
&lt;p&gt;后来过了很多年，我偶然听到一首歌么《方舱医院真神奇》，就是那个腔调啊，一听到，就忽然又想起他那天一直笑的样子，心里那份同感一下子就冒出来了。&lt;/p&gt;
&lt;p&gt;所以你看，成年人说那些话，他自己个儿未必都能做得到，也不见得真的就那么信。有些时候，他可能只是在表演，甚至是在骗人。我小时候那会儿就认清了这个形势，所以对老师说的话，基本都不太当真。&lt;/p&gt;
&lt;h2&gt;高中那些"考完就好了"&lt;/h2&gt;
&lt;p&gt;这种老师会"骗"学生的状态，我觉得一直持续到高中。&lt;/p&gt;
&lt;p&gt;高中的时候，老师会跟你说，好好考啊，考上大学就好了，考到这个层次就好了，考到那个层次就好了。一副很懂的样子。可他自个儿，未必真学过那些专业，也未必真了解，就装作很懂的样子在那儿说。&lt;/p&gt;
&lt;p&gt;你说那些班主任、科任老师，自个儿未必都学过几个专业。他们当年走上讲台，多半是因为喜欢教书、想当老师，这不假，可真到了要给学生们指点该报什么专业、将来干什么的时候，一个人要是连那个专业是怎么回事都没弄明白，他怎么能有那个信心去指点呢？要是他自己当年都没整明白，又怎么能给别人讲明白呢？&lt;/p&gt;
&lt;p&gt;到了大学里，老师们各自教各自的专业，自己那一亩三分地可能很熟，可换个领域，他也不一定就了解多少。&lt;/p&gt;
&lt;p&gt;反正这些年在学校里待下来，越来越清楚一件事：大人说的话，别急着全信，先看看他自己做没做到、他自己信不信。&lt;/p&gt;
&lt;h2&gt;会做的和不会做的&lt;/h2&gt;
&lt;p&gt;再说回我自己高中那会儿的学习状态。&lt;/p&gt;
&lt;p&gt;那些我不会的题，我心里其实很清楚，我不是完全没想明白，也不是一点都不会——而是我不具有稳定性。我没法保证百分之百，也没法保证百分之五十，更没法指定一个稳定的概率，说自己一定能拿到多少分。&lt;/p&gt;
&lt;p&gt;但我会的那些，我一定能做到。我可以把会的那部分，得分概率推到最高，能推多高推多高。可不会的那部分，我就是控制不了。它不是完全为零，而是存在一个很大的扰动量，是那种不可控的不确定。&lt;/p&gt;
&lt;p&gt;这个体会，后来帮我想明白了一件特别重要的事。&lt;/p&gt;
&lt;h2&gt;有时候要不止看分数&lt;/h2&gt;
&lt;p&gt;小学、中学，尤其是高中那会儿，人特别容易陷进一个误区：因为那是选拔性考试，就觉得好像分数非要考得越高越好，最好是奔着满分去。&lt;/p&gt;
&lt;p&gt;可现实世界的逻辑，根本不是这样。&lt;/p&gt;
&lt;p&gt;现实是，一件事只要你能做到六十分以上、能过得去，那就足够了。甚至，如果你能最快时间内达到六十分，你比那些要花三五倍时间熬到九十分的人都要强——因为你省下来的时间，可以去迭代，可以有更多试错的机会，可以再去做下一件能到六十分的事。&lt;/p&gt;
&lt;p&gt;攒一个九十分要花掉那么多力气，够你完成好几轮"从零到六十分"了。而这个世界真正奖励的，往往不是那个孤零零的九十分，是你手里握着的那一堆已经跑通的六十分，以及你比旁人快出来的那几轮迭代。&lt;/p&gt;
&lt;p&gt;所以啊，别把劲儿都憋在那一场考试上，也别把大人的话句句都当真。看清楚什么是表演，看清楚什么才是自己真正控制得了的，把那部分推到最高，剩下的，交给时间和一次次的迭代就好。&lt;/p&gt;</content><category term="随笔"/><category term="教育"/><category term="回忆"/><category term="思考"/><category term="随笔"/></entry><entry><title>从文件存储到数据库：分享一下数据管理的大体脉络</title><link href="https://blog.cycleuser.org/cong-wen-jian-cun-chu-dao-shu-ju-ku-fen-xiang-yi-xia-shu-ju-guan-li-de-da-ti-mai-luo.html" rel="alternate"/><published>2026-09-01T00:00:00+08:00</published><updated>2026-09-01T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-09-01:/cong-wen-jian-cun-chu-dao-shu-ju-ku-fen-xiang-yi-xia-shu-ju-guan-li-de-da-ti-mai-luo.html</id><summary type="html">&lt;h1&gt;从文件存储到数据库：分享一下数据管理的大体脉络&lt;/h1&gt;
&lt;p&gt;有没有想过，网店、后台、手机里那堆 App，数据到底存在哪儿？答案很简单 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;从文件存储到数据库：分享一下数据管理的大体脉络&lt;/h1&gt;
&lt;p&gt;有没有想过，网店、后台、手机里那堆 App，数据到底存在哪儿？答案很简单，最底层全都躺在文件里。可既然文件就能存，为什么大家还要费劲去折腾数据库这玩意儿？&lt;/p&gt;
&lt;p&gt;这回就从"一个让你想放弃文件存储的故事"讲起，一路讲到关系型、NoSQL、宽表、向量库，最后再回头看看你一开始可能问的那些问题。&lt;/p&gt;
&lt;h2&gt;一个让你放弃文件存储的故事&lt;/h2&gt;
&lt;p&gt;想象你在经营一家网店。第一天开业，你用一个文本文件 &lt;code&gt;users.txt&lt;/code&gt; 记录用户：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;张三, 13800000001, 北京
李四, 13800000002, 上海
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;很完美，简单、直观、零学习成本。&lt;/p&gt;
&lt;p&gt;三个月后，生意火了。你雇了两个客服，他们同时打开这个文件编辑，结果李四的地址被另一个客服顺手覆盖了，丢了。你想给用户按城市分组统计，吭哧吭哧写了 200 行解析代码，结果文件里混进一行少写一个逗号的数据，程序直接崩。双十一流量高峰，文件被写坏了，你只能恢复到三天前的备份，几百条订单没了。&lt;/p&gt;
&lt;p&gt;半年后更惨。你的用户数据分散在 &lt;code&gt;users.txt&lt;/code&gt;、&lt;code&gt;orders.csv&lt;/code&gt;、&lt;code&gt;address.json&lt;/code&gt; 三个文件里。李四改了手机号，你改了 &lt;code&gt;users.txt&lt;/code&gt;，却忘了 &lt;code&gt;orders.csv&lt;/code&gt; 里还躺着个旧号码，数据对不上了。&lt;/p&gt;
&lt;p&gt;这个故事里的每一个坑，都对应着数据库要解决的一个核心问题。&lt;/p&gt;
&lt;h2&gt;为什么不能直接读写文件&lt;/h2&gt;
&lt;p&gt;先说句公道话，文件本身没错，它是操作系统给的基础能力。问题出在，文件系统只负责"存"，不负责"管"。一旦数据量、并发量、复杂度上去了，裸用文件就会撞上一连串结构性障碍。&lt;/p&gt;
&lt;p&gt;最要命的是并发。操作系统对文件的写入是"块"级别的，根本没有"行"或"记录"的概念。两个进程同时写同一个文件，没有任何机制保证 A 写一半的时候 B 不会插进来。你想解决，就得自己动手实现锁，而正确地实现锁，是计算机科学里最容易翻车的任务之一，死锁、饿死、竞态条件，一个比一个阴。数据库在存储引擎这一层就把行级锁、多版本并发控制做掉了，让"读写不互斥、写写安全排队"成了默认行为 [7]。&lt;/p&gt;
&lt;p&gt;其次是查询。在文件里找"所有北京的用户"，唯一的办法是从头读到尾。1 万条数据无所谓，1000 万条就是灾难。数据库靠索引（最典型的是 B+ 树）把查找复杂度压到对数级别，1000 万条数据，大概只需要访问 3 到 4 次磁盘页 [7][10]。&lt;/p&gt;
&lt;p&gt;再就是脏数据和崩溃。文件根本不关心内容，手机号填了"你好"、年龄填了 -5、必填字段空着，它全都照单收下，数据质量一天天劣化。而写文件时一旦进程崩溃或断电，很可能留下写了一半的内容，你的 &lt;code&gt;users.txt&lt;/code&gt; 说不定就永久损坏了。数据库用模式加约束在写入那一刻就把非法数据挡在门外，用预写日志加事务来兜底，要么全部写入成功，要么当作什么都没发生，这就是原子性 [7][10]。&lt;/p&gt;
&lt;p&gt;最后还有两个不那么显眼但同样麻烦的问题。一是没有查询语言，换个统计口径就得重写一遍解析代码，数据和逻辑死死缠在一起；数据库用 SQL 让你只说"要什么"不说"怎么拿"，优化器自动挑最优执行路径。二是权限太粗，文件权限顶多控制"谁能打开"，管不了"谁能看这一列工资、谁能改但不能删"这种细活儿，数据库能给你表级、列级、行级的细粒度控制。&lt;/p&gt;
&lt;p&gt;说到底，不是"不能"用文件，而是当你自己动手把并发控制、索引、崩溃恢复、约束、权限、查询优化全都实现一遍之后，你相当于重新发明了一个数据库，而且大概率不如人家三十年打磨出来的稳定。&lt;/p&gt;
&lt;p&gt;顺带说个有意思的事，数据库底层最终也是把数据存在文件里的（比如 MySQL 的 &lt;code&gt;.ibd&lt;/code&gt; 文件）。数据库不是抛弃文件，而是在文件之上盖起了一整套精密的数据管理体系。它提供的六个核心价值，也就是事务的 ACID、索引查询、约束体系、MVCC 并发控制、WAL 崩溃恢复、三级模式的数据独立性，全部建立在这个基础上 [1][7][10]。&lt;/p&gt;
&lt;p&gt;这里重点说说 ACID，它是数据库最伟大的发明。事务保证一组操作要么全部成功，要么全部回滚。其中原子性意味着转账时扣款和到账必须同时发生，一致性意味着转账前后两个账户余额总和不变，隔离性意味着两个人同时买最后一件库存商品不会都成功，持久性意味着提交之后数据库重启数据也不丢。"同时买最后一件商品"这个场景，用文件几乎没法正确实现，用数据库，一句 &lt;code&gt;SELECT ... FOR UPDATE&lt;/code&gt; 或者调个隔离级别就搞定了 [10]。&lt;/p&gt;
&lt;h2&gt;演进史，从关系模型到 SQL&lt;/h2&gt;
&lt;p&gt;理解了数据库要解决什么，再看它怎么一步步长成今天这样，脉络就清楚了。&lt;/p&gt;
&lt;p&gt;1960 年代是层次数据库和网状数据库的天下，数据按树状或网状组织，查数据得写"导航式"代码，先访问 A，再顺着指针走到 B，路径全写死在程序里，数据结构一改，程序就得大改。&lt;/p&gt;
&lt;p&gt;1970 年，IBM 研究员 Edgar F. Codd 发表了《A Relational Model of Data for Large Shared Data Banks》，提出用关系（也就是二维表）来组织数据 [1]，这篇论文拿了 1981 年图灵奖。它的革命性在于，你只需要描述数据之间的关系，不需要描述访问路径，怎么找数据是数据库优化器的事。这就是声明式查询的威力 [1][5]。核心思想就三条，数据组织成表，行是记录、列是字段；表与表之间靠主键和外键关联；操作数据用关系代数，也就是后来的 SQL。&lt;/p&gt;
&lt;p&gt;一个电商的最小关系模型长这样：用户表存 &lt;code&gt;id, name, city&lt;/code&gt;，订单表存 &lt;code&gt;id, user_id, amount, status&lt;/code&gt;，&lt;code&gt;user_id&lt;/code&gt; 是外键，指向用户表的 &lt;code&gt;id&lt;/code&gt;。想查"北京用户的订单总额"，一句 SQL 就够：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;JOIN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;北京&amp;#39;&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;关系模型还带来了一套叫"规范化"的设计理论，核心是"一事一地"，也就是一个事实只存一处，通过范式（1NF、2NF、3NF）消除冗余 [10]。实践中大部分业务表设计到 3NF 就够了；分析型场景反而会故意反范式做宽表来减少 JOIN，这给后面的宽表数据库埋了伏笔。&lt;/p&gt;
&lt;p&gt;SQL 源自 IBM System R 的 SEQUEL，1986 年成为 ANSI 标准。四十多年过去，它依然是数据领域事实上的通用语，而且 NoSQL 运动绕了一大圈之后，很多产品又纷纷加回了 SQL 接口，这事儿本身就挺说明问题的 [5]。&lt;/p&gt;
&lt;p&gt;关系型数据库的代表产品也很好认。Oracle 是功能最全的企业霸主，MySQL 是互联网装机量之王，PostgreSQL 号称"开源界的 Oracle"，SQLite 则因为嵌入式特性成了全球部署量最大的数据库，每台手机里都有。&lt;/p&gt;
&lt;h2&gt;NoSQL 不是否定，是取舍&lt;/h2&gt;
&lt;p&gt;2000 年代中期，Google、Amazon 这些互联网巨头撞上了传统关系库撑不住的三座大山，一个是海量数据（单机库存不下 PB 级，得水平扩展），一个是超高并发（双十一级别的访问量，单机连接数扛不住），一个是灵活模式（产品迭代快，改一次表结构锁表几小时受不了）。Google 的 Bigtable 和 Amazon 的 Dynamo 两篇论文，直接引爆了整个 NoSQL 运动 [2][3]。&lt;/p&gt;
&lt;p&gt;它们做的取舍很激进。放弃关系模型（不做 JOIN，把数据按访问模式拍平），放松事务保证（只保证单键原子性，不保证跨行 ACID），放松一致性（允许短暂的数据不一致换可用性）。所以更准确的理解是，NoSQL 不是对关系数据库的否定，而是在特定场景下，用"少一些保证"换"多一些扩展性和灵活性"。它否定的不是关系模型本身，而是"一种数据库打天下"的通用主义。&lt;/p&gt;
&lt;p&gt;Stonebraker 早在 2005 年就预言专用数据库会取代通用数据库 [6]，NoSQL 正是这个预言的应验，而 Stonebraker 本人恰恰是关系数据库时代的奠基人之一，革命者居然来自旧阵营内部。&lt;/p&gt;
&lt;p&gt;理解 NoSQL 的取舍，绕不开 CAP 定理。分布式系统在网络分区发生时，只能在一致性和可用性之间二选一。传统单机关系库不考虑分区，是"CA"；分布式 NoSQL 多数选"AP"加最终一致性，也就是 BASE，基本可用、软状态、最终一致 [4]。&lt;/p&gt;
&lt;p&gt;NoSQL 有四大主流类型，每一种都是在关系模型上做减法（减掉 JOIN、Schema 或事务）的同时做加法（加上某种场景的极致优化）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;键值型（KV）：减掉一切查询能力，换来极限速度，代表是 Redis、DynamoDB&lt;/li&gt;
&lt;li&gt;文档型：减掉 JOIN 和 Schema，换来"一次查询取回完整对象"，代表是 MongoDB&lt;/li&gt;
&lt;li&gt;宽表型：减掉关系完整性，换来线性写扩展，代表是 Cassandra、HBase&lt;/li&gt;
&lt;li&gt;图型：把"关系"从 JOIN 操作变成一等公民存储结构，代表是 Neo4j&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;宽表，为海量写入而生&lt;/h2&gt;
&lt;p&gt;为什么叫"宽表"？设想一个传感器数据表，不同型号的传感器上传的字段完全不同，温度传感器有 &lt;code&gt;temperature&lt;/code&gt;，电量传感器有 &lt;code&gt;voltage&lt;/code&gt;。用关系型建模，要么建一堆可空列（表越来越"宽"），要么拆成 EAV 模型（查询痛苦得要命）。宽表数据库的答案，是让每一行可以拥有完全不同的列，列不用预先定义，百万列也无所谓。"宽"指的是逻辑上允许一张表横向无限延展。物理上，数据按行键有序存储，同一行的列稀疏存储，没值的列不占任何空间，这和关系库"每行必须填满所有列"完全是两回事。&lt;/p&gt;
&lt;p&gt;宽表数据库普遍采用 LSM 树作为存储引擎 [12]，和关系库的 B+ 树形成鲜明对比。B+ 树就地更新、为读优化，写放大高；LSM 树追加写、先写内存再批量刷盘、为写优化，顺序写对磁盘极其友好。一句话，B+ 树为读优化，LSM 树为写优化，这就是 Cassandra 敢号称"单集群每秒百万级写入"的底气。&lt;/p&gt;
&lt;p&gt;两大门派里，HBase 源自 Bigtable 论文 [2]，构建在 Hadoop/HDFS 之上，强一致，适合和大数据生态配合；Cassandra 融合了 Bigtable 的数据模型加 Dynamo 的分布式架构（无主 P2P、一致性可调）[3]，AP 型高可用，多数据中心支持出色。&lt;/p&gt;
&lt;p&gt;注意别和另一个"宽表"搞混。数据仓库里的宽表是为了分析方便，故意把几十张维度表反范式 JOIN 成一张超宽的分析表。前者是一种存储引擎结构，后者是一种建模手法，俩只是恰好都叫"宽表"。&lt;/p&gt;
&lt;h2&gt;其他类型与选型&lt;/h2&gt;
&lt;p&gt;数据库的版图还在扩张。近十年起来的，有时序数据库（为"按时间写、按时间读、按时间删"而生，代表 InfluxDB、TimescaleDB、Prometheus）、向量数据库（AI 时代的新贵，把文本图片映射成高维向量，查询变成找最相似的 K 个向量，代表 Milvus [9]、Pinecone，以及 pgvector 这类关系库插件，RAG 应用的核心基础设施就是这类数据库）、NewSQL 或叫分布式 SQL（想"既要 NoSQL 的水平扩展，又要关系库的 ACID 和 SQL"，Google Spanner [8]、TiDB、CockroachDB 是代表，本质是把 Codd 的关系模型在分布式环境下重新实现了一遍 [11]）。还有 HTAP 让一套系统同时跑交易和分析，多模数据库让一个引擎同时支持关系、文档、图、KV 多种模型，PostgreSQL 就是个活生生的例子，关系型数据库自己反而长成了全栈选手。&lt;/p&gt;
&lt;p&gt;没有最好的数据库，只有最合适的数据库。常规业务系统（订单、用户、财务）用 PostgreSQL 或 MySQL，因为需要 ACID 和关系完整性；缓存、排行榜、会话用 Redis，微秒级延迟；字段频繁变化、以 JSON 为主用 MongoDB；海量日志或传感器写入用 Cassandra 或 ClickHouse；关系深度遍历用 Neo4j；监控指标和行情用 InfluxDB；AI 语义检索用 Milvus 或 pgvector；需要水平扩展又不牺牲一致性用 TiDB 或 CockroachDB；手机 App 内嵌用 SQLite。&lt;/p&gt;
&lt;p&gt;默认从 PostgreSQL 开始，它今天已经是事实上的多模数据库，能覆盖 80% 场景，错了迁移成本也最低；没有明确理由就别引入新数据库，每种数据库都是一笔运维成本和技术债；组合使用是常态，主流互联网公司的标准配置是"关系库做交易 + Redis 做缓存 + ES 做搜索 + ClickHouse 做分析"，各司其职。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;为什么不能直接读写文件？因为文件只负责"存"，不负责"管"。并发安全、高效检索、崩溃恢复、数据约束、权限控制，这些需求文件系统一概不提供，而自己实现它们等于重新发明数据库。&lt;/p&gt;
&lt;p&gt;数据库是什么？它是建立在文件之上、提供 ACID 事务、索引查询、并发控制、恢复机制和声明式查询语言的数据管理系统。需要它，是因为现代应用对数据的正确性、并发性和规模有要求，而这些要求裸文件满足不了。&lt;/p&gt;
&lt;p&gt;关系型和非关系型是否定关系吗？不是，是取舍与分工。关系模型提供最强的一致性保证和查询表达力，至今仍是交易类系统的基石 [1]；NoSQL 是互联网规模下"用部分保证换扩展性和灵活性"的场景化特化 [2][3][6]；NewSQL 又把两者重新缝合 [8][11]。数据库的历史是一场"分久必合、合久必分"的螺旋，不是单向革命。&lt;/p&gt;
&lt;p&gt;宽表数据库是什么？一种以"行键 + 动态列族"组织数据、以 LSM 树为存储引擎、为海量写入和稀疏数据优化的 NoSQL 类型，代表是 Cassandra 和 HBase [2][3][12]。&lt;/p&gt;
&lt;p&gt;在数据库五十多年的历史里，"颠覆关系数据库"的预言至少出现过五次，而关系数据库的市场份额至今还在涨。Codd 在 1970 年用数学奠定的大厦 [1]，比任何一种具体的存储引擎都活得久。真正不朽的，从来不是某种技术实现，而是"用干净的抽象管理复杂的数据"这个思想本身。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;p&gt;[1] Codd, E. F. (1970). &lt;em&gt;A Relational Model of Data for Large Shared Data Banks&lt;/em&gt;. Communications of the ACM, 13(6), 377–387.（关系模型奠基论文，作者因此获 1981 年图灵奖）&lt;/p&gt;
&lt;p&gt;[2] Chang, F., Dean, J., Ghemawat, S., et al. (2006). &lt;em&gt;Bigtable: A Distributed Storage System for Structured Data&lt;/em&gt;. Proceedings of OSDI '06, USENIX Association.（Google Bigtable 论文，宽表模型与 HBase 的直接源头）&lt;/p&gt;
&lt;p&gt;[3] DeCandia, G., Hastorun, D., et al. (2007). &lt;em&gt;Dynamo: Amazon's Highly Available Key-value Store&lt;/em&gt;. Proceedings of SOSP '07, ACM.（Amazon Dynamo 论文，AP 取舍与最终一致性的工程范本）&lt;/p&gt;
&lt;p&gt;[4] Gilbert, S., &amp;amp; Lynch, N. (2002). &lt;em&gt;Brewer's Conjecture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services&lt;/em&gt;. ACM SIGACT News, 33(2), 51–59.（CAP 定理的证明）&lt;/p&gt;
&lt;p&gt;[5] Hellerstein, J. M., Stonebraker, M., &amp;amp; Hamilton, J. (2007). &lt;em&gt;Architecture of a Database System&lt;/em&gt;. Foundations and Trends in Databases, 1(2), 141–259.（数据库系统架构的权威综述，Now Publishers）&lt;/p&gt;
&lt;p&gt;[6] Stonebraker, M., &amp;amp; Çetintemel, U. (2005). &lt;em&gt;"One Size Fits All": An Idea Whose Time Has Come and Gone&lt;/em&gt;. Proceedings of the First Biennial Conference on Innovative Data Systems Research (CIDR '05).（"专用数据库取代通用数据库"的著名预言）&lt;/p&gt;
&lt;p&gt;[7] Stonebraker, M., &amp;amp; Hellerstein, J. M. (2005). &lt;em&gt;What Goes Around Comes Around&lt;/em&gt;. In M. Stonebraker &amp;amp; J. M. Hellerstein (Eds.), Readings in Database Systems (4th ed.), MIT Press.（数据库五十年技术轮回的历史回顾）&lt;/p&gt;
&lt;p&gt;[8] Corbett, J. C., Dean, J., et al. (2012). &lt;em&gt;Spanner: Google's Globally-Distributed Database&lt;/em&gt;. Proceedings of OSDI '12, USENIX Association.（NewSQL 技术标杆论文）&lt;/p&gt;
&lt;p&gt;[9] Wang, J., Yi, X., Guo, R., et al. (2021). &lt;em&gt;Milvus: A Purpose-Built Vector Data Management System&lt;/em&gt;. Proceedings of SIGMOD '21, ACM.（向量数据库代表性论文）&lt;/p&gt;
&lt;p&gt;[10] Silberschatz, A., Korth, H. F., &amp;amp; Sudarshan, S. (2019). &lt;em&gt;Database System Concepts&lt;/em&gt; (7th ed.). McGraw-Hill Education.（数据库经典教材，ACID/事务/并发控制/范式的系统论述）&lt;/p&gt;
&lt;p&gt;[11] Pavlo, A., &amp;amp; Aslett, M. (2016). &lt;em&gt;What's Really New with NewSQL?&lt;/em&gt; SIGMOD Record, 45(2), 45–55.（NewSQL 概念的系统梳理）&lt;/p&gt;
&lt;p&gt;[12] O'Neil, P., Cheng, E., Gawlick, D., &amp;amp; O'Neil, E. (1996). &lt;em&gt;The Log-Structured Merge-Tree (LSM-Tree)&lt;/em&gt;. Acta Informatica, 33(4), 351–385.（LSM 树原始论文，宽表数据库存储引擎的理论基础）&lt;/p&gt;
&lt;p&gt;[13] Ramakrishnan, R., &amp;amp; Gehrke, J. (2003). &lt;em&gt;Database Management Systems&lt;/em&gt; (3rd ed.). McGraw-Hill.（一部经典教材，查询处理与存储结构章节）&lt;/p&gt;
&lt;p&gt;[14] Kleppmann, M. (2017). &lt;em&gt;Designing Data-Intensive Applications&lt;/em&gt;. O'Reilly Media.（现代数据系统设计的入门书，中文版《数据密集型应用系统设计》，B 树/LSM/一致性/分布式事务的对比分析写得很清楚，想深入了解的话值得一读）&lt;/p&gt;</content><category term="Programming"/><category term="Database"/><category term="数据库"/><category term="SQL"/><category term="NoSQL"/><category term="关系型数据库"/><category term="宽表"/><category term="编程"/></entry><entry><title>麻辣烫店里睡着的小孩</title><link href="https://blog.cycleuser.org/ma-la-tang-dian-li-shui-zhao-de-xiao-hai.html" rel="alternate"/><published>2026-08-27T22:00:00+08:00</published><updated>2026-08-27T22:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-27:/ma-la-tang-dian-li-shui-zhao-de-xiao-hai.html</id><summary type="html">&lt;h1&gt;麻辣烫店里睡着的小孩&lt;/h1&gt;
&lt;p&gt;晚上去食堂其他档口都没什么吃的了，只能去吃麻辣烫，看到店家的小孩睡在几把拼在一起餐椅 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;麻辣烫店里睡着的小孩&lt;/h1&gt;
&lt;p&gt;晚上去食堂其他档口都没什么吃的了，只能去吃麻辣烫，看到店家的小孩睡在几把拼在一起餐椅，就那么蜷缩着躺着。八点多了，他妈妈不那么忙了，过来叫他要吃饭了，把他叫醒。&lt;/p&gt;
&lt;p&gt;我就坐在旁边看着，想起自己小时候。我爸妈那时候在外打工，家里就我一个人。脖子上挂着钥匙，放学了自己回家，自己热吃的。那时候倒也没觉得多苦，小孩子的世界简单，没那么多比较，觉得日子本来就是这样过的。&lt;/p&gt;
&lt;p&gt;那时候父母工作地方的楼上是高中生的宿舍，我和那些高中生经常一起玩，听他们聊天，看他们的书。他们做作业，我看他们的教材。逐渐地我发现有些题目我也能看明白，甚至有的题他们不会做，我反而会了。我现在最早知道鸦片战争，都是那时候在那些高中生的课本里看来的——一个上小学的小孩，提前看了高中的东西，后来回想起来，那对我帮助特别大，相当于提前剧透了后面的学习攻略了。只是可惜，他们都是文科生，而我后来选择的是纯理科。&lt;/p&gt;
&lt;p&gt;有一回，饭点到了，我特别饿，到了父母工作的食堂，看到桌上放了一份菜，摆得好好的，心里想这肯定是给我留的，太好了。端起来就吃，吃得可香了，可高兴了。&lt;/p&gt;
&lt;p&gt;我妈妈看到我在吃东西，突然就哭了。后来我才知道，那是别人吃剩的菜。&lt;/p&gt;
&lt;p&gt;今天看着这个小孩，几个餐椅拼成一张"床"，在店里就睡着了，我又想起这些事来。&lt;/p&gt;
&lt;p&gt;想起以前跟我同学说过的一个事情：我同学小时候是坐小轿车的那种城里小孩，我小时候是追着小轿车跑着看的。两个童年完全不一样的人，在那个年代，还能考到同一所学校，有很相容的三观，能成为朋友。&lt;/p&gt;
&lt;p&gt;在旧时代，这种情况，恐怕不太容易，因为那里社会割裂得厉害，生活的轨道越来越分岔。而坐车的人和追车的人，大概不会再坐进同一间教室。&lt;/p&gt;
&lt;p&gt;那些被餐椅拼起来的童年，和那些有自己房间、有自己书桌的童年，也许像是活在了两个平行的世界里。&lt;/p&gt;
&lt;p&gt;我坐在麻辣烫店里，看着那小孩被他妈叫醒，揉着眼睛去吃饭。&lt;/p&gt;
&lt;p&gt;我不知道，很多年后，他会不会记得这个晚上，会记得这些拼起来的椅子，以及可能香甜的梦。&lt;/p&gt;
&lt;p&gt;愿他长大以后，能遇到更好的世界。&lt;/p&gt;</content><category term="随笔"/><category term="童年"/><category term="打工"/><category term="回忆"/><category term="成长"/><category term="随笔"/></entry><entry><title>Java 基础语法5分钟入门</title><link href="https://blog.cycleuser.org/java-ji-chu-yu-fa-5fen-zhong-ru-men.html" rel="alternate"/><published>2026-08-27T09:00:00+08:00</published><updated>2026-08-27T09:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-27:/java-ji-chu-yu-fa-5fen-zhong-ru-men.html</id><summary type="html">&lt;p&gt;Java 是一门面向对象的语言，"一切皆对象，一切皆类"。它采用"编译 + 解释"混合执行方式：源码先编译成字节码，再由 JVM 解释或即时 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Java 是一门面向对象的语言，"一切皆对象，一切皆类"。它采用"编译 + 解释"混合执行方式：源码先编译成字节码，再由 JVM 解释或即时编译（JIT）执行，与 Python 的"纯解释执行"、C 语言的"编译成机器码"都不相同。它与 Python 最大的区别在于：任何代码都必须写在类里，入口必须是 &lt;code&gt;public static void main&lt;/code&gt;，类型必须显式声明。本文将用"水果"这一生活化主题贯穿始终，带你了解 Java 的核心基础语法，包括编译运行、基本类型、数组与集合、字符串、流程控制、方法与异常处理，以及 Java 的灵魂——面向对象（类与对象、封装、继承、接口、多态）。每部分都配有简短示例，适合从 Python 转过来的新手快速上手。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;0. 程序结构与编译运行&lt;/h2&gt;
&lt;p&gt;Java 源文件名必须与公共类名一致（如 &lt;code&gt;Hello.java&lt;/code&gt; 里必须是 &lt;code&gt;public class Hello&lt;/code&gt;）。程序从 &lt;code&gt;main&lt;/code&gt; 方法开始执行。就像一家水果店，&lt;code&gt;Hello&lt;/code&gt; 是店名，&lt;code&gt;main&lt;/code&gt; 是每天开店营业的入口。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// Hello.java&lt;/span&gt;
&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Hello, 水果世界!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;编译运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;javac Hello.java    # 编译：生成 Hello.class 字节码（不是机器码）
java Hello          # 运行：JVM 加载字节码，解释或 JIT 即时编译执行
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Python 是纯解释型语言，写脚本直接运行；Java 是"编译 + 解释"混合型——&lt;code&gt;javac&lt;/code&gt; 先编译成平台无关的字节码，再由 JVM 解释/即时编译执行。字节码不依赖具体操作系统和 CPU，这就是"一次编写，到处运行"（Write Once, Run Anywhere）的原理。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;1. 基本数据类型&lt;/h2&gt;
&lt;p&gt;Java 是&lt;strong&gt;强类型&lt;/strong&gt;语言，有 8 种基本数据类型，变量必须先声明类型。就像水果店进货，必须先明确每种水果按什么单位计量。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;public class Demo {
    public static void main(String[] args) {
        int apples = 42;          // 整数 int：苹果个数
        double grapeWeight = 3.14;   // 双精度浮点数 double：葡萄重量（斤）
        float unitPrice = 8.5f;   // 单精度浮点数 float：单价（元/斤，加 f 后缀）
        char grade = &amp;#39;A&amp;#39;;         // 单个字符 char：水果等级 A/B/C，用单引号
        boolean isFresh = true;   // 布尔值 boolean：水果是否新鲜，只能 true/false
        long stockCount = 100000L;   // 长整数 long：库存总量（要加 L 后缀）

        System.out.println(apples);        // 自动换行输出
        System.out.println(grapeWeight);
        System.out.printf(&amp;quot;%.1f\n&amp;quot;, unitPrice);  // 格式化输出，保留一位
        System.out.println(isFresh);
        System.out.println(stockCount);    // 库存总量输出
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Java 的基本类型是"值"，不是对象；整数没有 Python 那样的任意大数，&lt;code&gt;int&lt;/code&gt; 有范围限制（约 ±21亿），存不下很大的库存数要用 &lt;code&gt;long&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;2. 数组与集合：水果篮与水果摊&lt;/h2&gt;
&lt;p&gt;Java 的&lt;strong&gt;数组&lt;/strong&gt;长度固定，一旦创建不能改变，就像一排固定格数的水果架。要动态增删元素，需使用集合类 &lt;code&gt;ArrayList&lt;/code&gt;，就像可以随时往里放水果的果篮。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Demo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;static&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;数组&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;&lt;span class="n"&gt;一排固定的水果架&lt;/span&gt;
        &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;苹果&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;葡萄&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;香蕉&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;橙子&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;苹果&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;数组长度用&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;

        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;&lt;span class="n"&gt;可以随意增减的果篮&lt;/span&gt;
        &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;basket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;葡萄&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                     &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;放进去&lt;/span&gt;
        &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;巨峰葡萄&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;苹果&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                       &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;拿走第0个&lt;/span&gt;&lt;span class="err"&gt;（&lt;/span&gt;&lt;span class="n"&gt;葡萄&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;巨峰葡萄&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;苹果&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：&lt;code&gt;ArrayList&lt;/code&gt; 用 &lt;code&gt;.add()&lt;/code&gt; 添加、&lt;code&gt;.get(i)&lt;/code&gt; 取值、&lt;code&gt;.size()&lt;/code&gt; 求长度，没有 Python 的字典和集合内置类型（对应的是 &lt;code&gt;HashMap&lt;/code&gt;、&lt;code&gt;HashSet&lt;/code&gt;）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;3. 字符串：String 类&lt;/h2&gt;
&lt;p&gt;Java 的字符串是 &lt;code&gt;String&lt;/code&gt; 类对象，&lt;strong&gt;不可变&lt;/strong&gt;（每次修改都会产生新对象）。就像水果的标签，贴上去就固定了。比较内容用 &lt;code&gt;.equals()&lt;/code&gt; 而不是 &lt;code&gt;==&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;public class Demo {
    public static void main(String[] args) {
        String fruit = &amp;quot;巨峰葡萄&amp;quot;;
        System.out.println(fruit.charAt(0));       // 巨，取第一个字符
        System.out.println(fruit.length());        // 4，长度
        System.out.println(fruit.substring(0, 2)); // 巨峰，切片 [0,2)
        System.out.println(fruit.indexOf(&amp;quot;葡萄&amp;quot;)); // 2，查找子串位置

        // 拼接字符串：+ 或 concat
        String dish = &amp;quot;葡萄&amp;quot; + &amp;quot;汁&amp;quot;;
        System.out.println(dish);                 // 葡萄汁

        // 比较内容必须用 equals，== 比较的是引用地址
        String a = new String(&amp;quot;苹果&amp;quot;);
        String b = new String(&amp;quot;苹果&amp;quot;);
        System.out.println(a == b);            // false（地址不同）
        System.out.println(a.equals(b));       // true（内容相同）
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Java 字符串没有 &lt;code&gt;s[-1]&lt;/code&gt; 这样的负索引，也没有 Python 的 &lt;code&gt;in&lt;/code&gt; 判断（要用 &lt;code&gt;.contains()&lt;/code&gt;）。中文字符按字符计数，&lt;code&gt;substring&lt;/code&gt; 边界要小心。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;4. 条件语句（if/else if/else）&lt;/h2&gt;
&lt;p&gt;根据条件执行不同代码块。就像判断一个水果是甜的、酸的还是烂的。条件必须放在括号里，代码块用 &lt;code&gt;{}&lt;/code&gt; 包裹。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Demo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;String&lt;/span&gt;[]&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;sweetness&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="c1"&gt;;   // 水果甜度 0~10&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sweetness&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nv"&gt;System&lt;/span&gt;.&lt;span class="nv"&gt;out&lt;/span&gt;.&lt;span class="nv"&gt;println&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;很甜&amp;quot;&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;}&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;sweetness&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nv"&gt;System&lt;/span&gt;.&lt;span class="nv"&gt;out&lt;/span&gt;.&lt;span class="nv"&gt;println&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;一般甜&amp;quot;&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;}&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nv"&gt;System&lt;/span&gt;.&lt;span class="nv"&gt;out&lt;/span&gt;.&lt;span class="nv"&gt;println&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;偏酸&amp;quot;&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;}
&lt;span class="w"&gt;    &lt;/span&gt;}
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Java 也支持 &lt;code&gt;switch&lt;/code&gt; 语句，&lt;code&gt;case&lt;/code&gt; 后要加 &lt;code&gt;break&lt;/code&gt; 防止穿透。就像按水果种类给不同价格（下面的片段省去了类的 &lt;code&gt;main&lt;/code&gt; 框架，完整可运行版本见配套代码文件夹）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;fruit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;葡萄&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;switch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;fruit&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;苹果&amp;quot;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;System.out.println(&amp;quot;5元/斤&amp;quot;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;葡萄&amp;quot;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;System.out.println(&amp;quot;8元/斤&amp;quot;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;时价&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2&gt;5. 循环语句（for、while、for-each）&lt;/h2&gt;
&lt;p&gt;循环就是一遍遍处理，就像把果篮里的水果逐个清点、逐个称重。Java 有 &lt;code&gt;for&lt;/code&gt;、&lt;code&gt;while&lt;/code&gt;、&lt;code&gt;do-while&lt;/code&gt; 三种循环，还有 Python 没有的 &lt;strong&gt;for-each&lt;/strong&gt; 增强循环，专门用于遍历数组和集合。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Demo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;static&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;经典&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;循环&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;&lt;span class="n"&gt;从第1个数到第3个水果&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;水果&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;循环&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;&lt;span class="n"&gt;一直试吃&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;直到满意&lt;/span&gt;
        &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;satisfied&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;satisfied&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;试吃 &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;satisfied&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="n"&gt;增强循环&lt;/span&gt;&lt;span class="err"&gt;（&lt;/span&gt;&lt;span class="n"&gt;类似&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;的&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;
        &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;苹果&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;葡萄&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;香蕉&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;遍历&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt; &lt;span class="n"&gt;果篮&lt;/span&gt;
        &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;basket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;苹果&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;巨峰葡萄&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2&gt;6. 方法定义与调用&lt;/h2&gt;
&lt;p&gt;方法必须写在类里面，格式为"&lt;strong&gt;访问修饰符 + 返回类型 + 方法名(参数)&lt;/strong&gt;"。没有返回值用 &lt;code&gt;void&lt;/code&gt;。方法不能像 Python 那样单独存在。就像水果店的"称重"、"算钱"这些固定工序。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;public class Demo {
    // 返回 double，接收重量和单价，算出总价
    static double calcPrice(double weight, double unitPrice) {
        return weight * unitPrice;
    }

    // 没有返回值用 void，打印今日水果
    static void printTodayFruits() {
        System.out.println(&amp;quot;今日水果：苹果、葡萄、巨峰葡萄&amp;quot;);
    }

    public static void main(String[] args) {
        printTodayFruits();
        double total = calcPrice(2.5, 8.0);   // 2.5斤葡萄，每斤8元
        System.out.println(total);   // 20.0
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Java 没有 &lt;code&gt;def&lt;/code&gt;，且调用普通方法必须写返回类型；&lt;code&gt;static&lt;/code&gt; 表示静态方法，可直接通过类名调用，不需要先创建对象。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;7. 方法参数：值传递与引用传递&lt;/h2&gt;
&lt;p&gt;Java 的&lt;strong&gt;基本类型参数按值传递&lt;/strong&gt;（拷贝一份）；&lt;strong&gt;对象参数按引用传递&lt;/strong&gt;（传的是对象引用，方法内修改会影响原对象）。就像称重量时改的是"秤上的数字"（值拷贝），而往果篮里放水果改的是"果篮本身"（引用共享）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Demo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;static&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;eatOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;     &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;基本类型&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;&lt;span class="n"&gt;值传递&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;外部不变&lt;/span&gt;
        &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;static&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;addFruit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;对象&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;&lt;span class="n"&gt;引用传递&lt;/span&gt;
        &lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;香蕉&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;static&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="n"&gt;apples&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;eatOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apples&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apples&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;没变&lt;/span&gt;

        &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;basket&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;addFruit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;basket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;变了&lt;/span&gt;&lt;span class="err"&gt;（&lt;/span&gt;&lt;span class="n"&gt;果篮里有了香蕉&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;注意：Java 没有 C 语言的指针语法，没有 &lt;code&gt;*&lt;/code&gt;、&lt;code&gt;&amp;amp;&lt;/code&gt; 运算符；所有对象都用"引用"操作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;8. 返回值与方法重载&lt;/h2&gt;
&lt;p&gt;方法通过 &lt;code&gt;return&lt;/code&gt; 返回结果，返回类型必须与方法声明一致。&lt;strong&gt;一个方法只能返回一个值&lt;/strong&gt;。Java 支持&lt;strong&gt;方法重载&lt;/strong&gt;：方法名相同、参数列表不同（个数或类型不同）可以共存，调用时按参数自动匹配。就像"榨果汁"：给苹果榨出苹果汁，给橙子榨出橙汁，同一个词、不同输入。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Demo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;两个方法同名，参数类型不同&lt;span class="w"&gt; &lt;/span&gt;——&lt;span class="w"&gt; &lt;/span&gt;方法重载
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;makeJuice&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fruit&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fruit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;汁&amp;quot;&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;}

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;makeJuice&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fruit1&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fruit2&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fruit1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;fruit2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;混合汁&amp;quot;&lt;/span&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;}

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;String&lt;/span&gt;[]&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;System&lt;/span&gt;.&lt;span class="nv"&gt;out&lt;/span&gt;.&lt;span class="nv"&gt;println&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;makeJuice&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;葡萄&amp;quot;&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;&lt;span class="c1"&gt;;        // 葡萄汁&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;System&lt;/span&gt;.&lt;span class="nv"&gt;out&lt;/span&gt;.&lt;span class="nv"&gt;println&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;makeJuice&lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;苹果&amp;quot;&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;香蕉&amp;quot;&lt;/span&gt;&lt;span class="ss"&gt;))&lt;/span&gt;&lt;span class="c1"&gt;; // 苹果香蕉混合汁&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;}
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Python 可以用默认参数实现类似效果，Java 没有默认参数，但可以用重载弥补；Java 也没有 Python 那种"返回多个值（元组）"的写法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;9. 包与导入&lt;/h2&gt;
&lt;p&gt;Java 用 &lt;code&gt;import&lt;/code&gt; 引入其他类（相当于 Python 的 &lt;code&gt;from ... import ...&lt;/code&gt;），用 &lt;code&gt;package&lt;/code&gt; 声明包（相当于 Python 的模块目录）。&lt;code&gt;java.util&lt;/code&gt;、&lt;code&gt;java.lang&lt;/code&gt; 等是 JDK 自带的标准包。就像水果店里各种固定摆放的货架区域。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.util.Scanner&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;导入&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;util&lt;/span&gt; &lt;span class="n"&gt;包里的&lt;/span&gt; &lt;span class="n"&gt;Scanner&lt;/span&gt; &lt;span class="n"&gt;类&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.util.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;导入整个包&lt;/span&gt;&lt;span class="err"&gt;（&lt;/span&gt;&lt;span class="n"&gt;不推荐&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;太宽泛&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;

&lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Demo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;static&lt;/span&gt; &lt;span class="n"&gt;void&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Scanner&lt;/span&gt; &lt;span class="n"&gt;scanner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Scanner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;请问你要买什么水果？&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你选择了：&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;fruit&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Java 的 &lt;code&gt;java.lang&lt;/code&gt; 包（String、Math 等）默认自动导入，其余包需要 &lt;code&gt;import&lt;/code&gt;。自定义类放在同一个包（目录）里可直接使用，无需 import。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;10. 异常处理（try/catch/finally）&lt;/h2&gt;
&lt;p&gt;Java 用 &lt;code&gt;try...catch...finally&lt;/code&gt; 捕获异常，与 Python 的 &lt;code&gt;try...except...finally&lt;/code&gt; 非常相似。Java 强制要求处理某些"受检异常"（编译期必须 try/catch 或声明 throws）。就像水果店分装水果，发现"分到一半果篮没了"就停下处理。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;public class Demo {
    public static void main(String[] args) {
        try {
            int apples = 10;
            int baskets = 0;                    // 果篮数量为0
            int perBasket = apples / baskets;   // 触发 ArithmeticException
            System.out.println(perBasket);
        } catch (ArithmeticException e) {      // 捕获算术异常
            System.out.println(&amp;quot;果篮不能为0！&amp;quot;);
        } finally {
            System.out.println(&amp;quot;无论是否异常，分装流程都会结束&amp;quot;);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;多个异常可以写多个 &lt;code&gt;catch&lt;/code&gt;，也可以合并写：&lt;code&gt;catch (IOException | SQLException e)&lt;/code&gt;。还可以用 &lt;code&gt;throw&lt;/code&gt; 主动抛出异常、用 &lt;code&gt;throws&lt;/code&gt; 声明方法可能抛出的异常。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Python 是 &lt;code&gt;except ZeroDivisionError&lt;/code&gt;，Java 是 &lt;code&gt;catch (ArithmeticException e)&lt;/code&gt;；Java 的异常要处理或声明，Python 相对宽松。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;11. 面向对象：类与对象&lt;/h2&gt;
&lt;p&gt;面向对象是 Java 的灵魂。&lt;strong&gt;类&lt;/strong&gt;（class）是创建对象的模板，&lt;strong&gt;对象&lt;/strong&gt;（object）是根据模板创建出来的实例。就像"水果"是一个抽象概念（类），而桌上这串"巨峰葡萄"是一个具体对象。定义类用 &lt;code&gt;class&lt;/code&gt; 关键字，&lt;code&gt;new&lt;/code&gt; 创建对象，&lt;code&gt;.&lt;/code&gt; 调用对象的方法。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Demo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;创建对象：两个不同的葡萄对象&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;grape1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;巨峰葡萄&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;grape2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;阳光玫瑰&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;调用对象的方法&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;grape1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grape2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getPrice&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;定义&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;类&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;variety&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;成员变量（属性）：品种&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;每斤价格&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;构造方法：与类同名，创建对象时自动调用&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;variety&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variety&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;variety&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variety&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;，每斤&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;元&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getPrice&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;price&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Python 用 &lt;code&gt;__init__&lt;/code&gt; 作构造方法、&lt;code&gt;self&lt;/code&gt; 表示对象自身；Java 用&lt;strong&gt;与类同名的构造方法&lt;/strong&gt;、&lt;code&gt;this&lt;/code&gt; 表示对象自身。Python 的 &lt;code&gt;def method(self, ...)&lt;/code&gt; 对应 Java 的 &lt;code&gt;public void method(...)&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;12. 封装（Encapsulation）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;封装&lt;/strong&gt;是指把数据（成员变量）设为私有，通过公开的方法（getter/setter）来访问，从而保护数据不被随意修改。Java 用 &lt;code&gt;private&lt;/code&gt; 关键字实现封装。就像水果的"生产日期"不能让人随便改，只能通过店铺登记。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;public class Demo {
    public static void main(String[] args) {
        Fruit orange = new Fruit(&amp;quot;橙子&amp;quot;, 10);
        orange.raisePrice(2);                 // 涨价2元
        System.out.println(orange.getPrice());  // 12
        System.out.println(orange.setDiscount(-5));  // false，非法折扣
        System.out.println(orange.getPrice());     // 12，价格未被破坏
    }
}

class Fruit {
    private String name;       // 私有属性，外部不能直接访问
    private int price;

    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }

    // getter：获取私有属性
    public int getPrice() {
        return this.price;
    }

    // 封装业务逻辑：涨价、打折都通过公开方法完成，并做合法性校验
    public void raisePrice(int amount) {
        if (amount &amp;gt; 0) {
            this.price += amount;
        }
    }

    public boolean setDiscount(int percent) {
        if (percent &amp;gt;= 0 &amp;amp;&amp;amp; percent &amp;lt;= 100) {
            this.price = this.price * (100 - percent) / 100;
            return true;
        }
        return false;   // 非法折扣（负数或超过100）直接拒绝
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Python 靠 &lt;code&gt;_name&lt;/code&gt; 约定"内部属性"，但实际仍可访问；Java 用 &lt;code&gt;private&lt;/code&gt; &lt;strong&gt;强制&lt;/strong&gt;禁止外部直接访问，必须走 getter/setter，保护更彻底。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;13. 继承（Inheritance）与多态（Polymorphism）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;继承&lt;/strong&gt;用 &lt;code&gt;extends&lt;/code&gt; 让子类复用父类的属性和方法，并可&lt;strong&gt;重写&lt;/strong&gt;（@Override）父类方法。&lt;strong&gt;多态&lt;/strong&gt;指同一个父类类型的引用指向不同子类对象时，调用同名方法表现出不同行为。&lt;/p&gt;
&lt;p&gt;用"水果 → 葡萄 → 巨峰葡萄"这条食物链理解最直观：&lt;code&gt;水果&lt;/code&gt; 是父类（所有水果都有味道），&lt;code&gt;葡萄&lt;/code&gt; 是水果的子类（有葡萄特有风味），&lt;code&gt;巨峰葡萄&lt;/code&gt; 又是葡萄的子类（更甜更大）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Demo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb nb-Type"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;多态：父类引用指向子类对象&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Fruit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Fruit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;f2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KyohoGrape&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;taste&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;葡萄：酸甜多汁&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;f2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;taste&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;巨峰葡萄：个大、更甜&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;父类：水果&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Fruit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;taste&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;水果的味道&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;子类：葡萄，继承水果&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;extends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Fruit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Override&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;taste&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;葡萄：酸甜多汁&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;孙类：巨峰葡萄，继承葡萄&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;KyohoGrape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;extends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Grape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Override&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb nb-Type"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;taste&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;巨峰葡萄：个大、更甜&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Python 用 &lt;code&gt;class Grape(Fruit)&lt;/code&gt; 继承，Java 用 &lt;code&gt;class Grape extends Fruit&lt;/code&gt;；Python 重写方法不需要修饰符，Java 可以加 &lt;code&gt;@Override&lt;/code&gt; 注解让编译器帮你检查。多层继承（水果→葡萄→巨峰葡萄）两种语言都支持。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;14. 接口（Interface）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;接口&lt;/strong&gt;定义了一组方法"规范"（只声明、不实现），实现类用 &lt;code&gt;implements&lt;/code&gt; 必须实现接口里所有方法。接口用于约定能力，实现同一接口的类可以互换使用。就像"可食用"是个约定：凡是声明"可食用"的水果，都必须能回答"怎么吃"。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Demo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;String&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// 用接口类型引用实现类对象&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;Edible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;e1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Grape&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;howToEat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;// 葡萄：洗净直接吃&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 接口：只声明方法，不实现&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Edible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;howToEat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// 实现接口：必须实现 howToEat 方法&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Grape&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;implements&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Edible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;Override&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;howToEat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;葡萄：洗净直接吃&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;与 Python 的对比：Python 没有 &lt;code&gt;interface&lt;/code&gt; 关键字，靠鸭子类型（有方法就能调）；Java 用接口&lt;strong&gt;强制&lt;/strong&gt;实现类提供约定方法，是"面向接口编程"的基础。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;掌握以上基础语法与面向对象核心概念，你已经能读懂并编写 Java 的日常小程序了！不妨动手做一个"水果摊记账小程序"练练手。下一步建议深入学习&lt;strong&gt;集合框架&lt;/strong&gt;（HashMap、HashSet、泛型）、&lt;strong&gt;Lambda 表达式和流式处理&lt;/strong&gt;（Stream API），以及多线程与网络编程。Java 是大型企业级应用的绝对主力，学好它的类型系统与面向对象思想，会为你打开一片广阔的工程世界。&lt;/p&gt;</content><category term="Java"/><category term="Java-基础语法5分钟入门"/></entry><entry><title>大语言模型不是在说谎，也不是在产生幻觉——一篇关于AI输出本质的哲学论文读后感</title><link href="https://blog.cycleuser.org/da-yu-yan-mo-xing-bu-shi-zai-shuo-huang-ye-bu-shi-zai-chan-sheng-huan-jue-yi-pian-guan-yu-aishu-chu-ben-zhi-de-zhe-xue-lun-wen-du-hou-gan.html" rel="alternate"/><published>2026-08-26T22:00:00+08:00</published><updated>2026-08-26T22:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-26:/da-yu-yan-mo-xing-bu-shi-zai-shuo-huang-ye-bu-shi-zai-chan-sheng-huan-jue-yi-pian-guan-yu-aishu-chu-ben-zhi-de-zhe-xue-lun-wen-du-hou-gan.html</id><summary type="html">&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;原文: Hicks, M.T., Humphries, J. &amp;amp; Slater, J. (2024). ChatGPT is bullshit. &lt;em&gt;Ethics and Information Technology&lt;/em&gt;, 26:38. https://doi.org/10.1007/s10676-024-09775-5&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用过大语言模型的人大概都有过这样的经历：它前一秒还在 …&lt;/p&gt;</summary><content type="html">&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;原文: Hicks, M.T., Humphries, J. &amp;amp; Slater, J. (2024). ChatGPT is bullshit. &lt;em&gt;Ethics and Information Technology&lt;/em&gt;, 26:38. https://doi.org/10.1007/s10676-024-09775-5&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用过大语言模型的人大概都有过这样的经历：它前一秒还在条分缕析地跟你讲道理，下一秒就可能凭空捏造出一个根本不存在的学术论文，连DOI都编得有模有样。这种"一本正经地胡说八道"的现象，行业里有个专门的说法——"AI幻觉"。好像模型本来好好地看着世界，只是偶尔眼花看岔了而已。&lt;/p&gt;
&lt;p&gt;最近读到一篇2024年发表的哲学论文，题目起得有点惊世骇俗，叫《ChatGPT is bullshit》。三位Glasgow大学的学者——Hicks、Humphries和Slater——把矛头对准了以ChatGPT为代表的一众大语言模型，提出了一个听起来不太学术、细想却相当精准的判断：&lt;strong&gt;这些模型输出的那些虚假信息，与其说是"幻觉"，不如说是"胡扯"。&lt;/strong&gt; 这两个词之间的差别，远不止是措辞上的讲究——它们代表着对AI本质完全不同的理解。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;一、"幻觉"这个词，用错了地方&lt;/h2&gt;
&lt;p&gt;"AI幻觉"这个说法之所以流行，是因为它暗含了一个让人舒服的前提：模型在努力"看"世界，只是偶尔"看"歪了。&lt;/p&gt;
&lt;p&gt;但作者一上来就拆掉了这个前提。大语言模型的工作方式，说到底就是不停地猜下一个词该是什么。它把海量文本喂进一个巨大的概率模型里，学会了什么词后面通常跟着什么词。你给它一个开头，它就沿着概率最高的路径一路往下接，直到生成一段"读起来像人话"的文字。&lt;/p&gt;
&lt;p&gt;整个过程中，模型从未试图去"描述"什么、"感知"什么、"理解"什么。它的目标只有一个：&lt;strong&gt;生成的文本要看起来足够自然、足够令人信服。&lt;/strong&gt; 至于内容是不是真的，那根本不在它的优化范围之内。&lt;/p&gt;
&lt;p&gt;作者引用了Shah和Bender的判断："语言模型根本就没有设计来处理算术、时间推理这类任务。它偶尔能答对，不过是碰巧从训练数据里凑出了看起来像那么回事的字符串罢了。"&lt;/p&gt;
&lt;p&gt;说得明白一点：&lt;strong&gt;它压根就没有在"看"，何来"看花眼"一说？&lt;/strong&gt; 幻觉这个比喻，把模型想象成了一个有感知能力、只是感知偶尔出错的主体——可大语言模型连感知这个动作都没有做过。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二、"说谎"也挂不上号&lt;/h2&gt;
&lt;p&gt;有人可能会说：好吧，不是幻觉，那算说谎总可以吧？毕竟假话从它嘴里出来了。&lt;/p&gt;
&lt;p&gt;问题是，"说谎"在哲学上有明确的门槛。论文援引了一个经典定义：&lt;strong&gt;说谎是指明知自己说的话是假的，还故意让对方信以为真。&lt;/strong&gt; 两个要素缺一不可——要知道自己在说假话，还要有心去骗人。&lt;/p&gt;
&lt;p&gt;大语言模型一条都不满足。它不知道自己在说什么——它只是在做概率运算，挑一个"看起来最合理"的词往下接。输出是真是假，对它来说没有任何区别。它没有欺骗谁的意图，也没有掩盖真相的需要——因为它压根就不知道什么是真相。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;三、法兰克福的"胡扯"：一种被低估的哲学概念&lt;/h2&gt;
&lt;p&gt;既然既不是幻觉也不是说谎，那大语言模型到底在干什么？论文把目光转向了美国哲学家哈里·法兰克福2005年出版的一本小册子——《论胡扯》（&lt;em&gt;On Bullshit&lt;/em&gt;）。&lt;/p&gt;
&lt;p&gt;法兰克福对"胡扯"的界定，抓住了一个常被忽视的关键：&lt;strong&gt;胡扯的本质不在于"说了假话"，而在于说话的人对真假根本无所谓。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;说谎者和胡扯者之间有一个本质区别：说谎者是关心真相的——他之所以说谎，恰恰因为他知道了真相，然后有意地去隐瞒。而胡扯者对真相毫无兴趣。他说话不是为了传达或掩盖什么，而是为了别的目的——让自己显得有学问，让场面不至于冷场，或者纯粹是习惯了张嘴就来。&lt;/p&gt;
&lt;p&gt;课堂上被突然点名的学生，没有预习过，却凭常识和语感编出一大段"听起来像那么回事"的分析。他未必知道自己说的对不对，也没指望老师真把他说的当回事——他只是在撑过那几分钟。这就是法兰克福意义上的胡扯。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;四、硬胡扯与软胡扯&lt;/h2&gt;
&lt;p&gt;论文在法兰克福的基础上做了一层更细致的区分，把"胡扯"分成了两种。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;软胡扯&lt;/strong&gt;是最基本的那种：说话的人对真假毫不在意。不关心你说的是不是真话，也不关心你说的是不是假话，甚至根本没意识到"真假"是一回事。大语言模型天然就是这种状态——它没有立场、没有信念、没有求真的欲望。说了一句真话不会让它"高兴"，输出了一条虚假信息也不会让它"内疚"。它就是一个概率采样器，不停地输出"读起来像话"的文字，内容的真假从来就不是它的目标函数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;硬胡扯&lt;/strong&gt;则多了一层心机：说话的人不仅不在乎真假，还试图让你觉得他在乎。他在伪装自己的态度——让你以为他是一个认真对待事实的人，其实他根本没往心里去。论文认为，如果我们愿意用"意向性立场"来理解大语言模型（也就是把它的功能表现当作某种意义上的"意图"），那么它的行为模式至少在表面上符合硬胡扯的特征：它的核心使命是模仿人类的对话方式，让你觉得你在和一个"有思考、有判断"的对象交流。它表现出一副"在意对错"的样子，可它的底层架构里根本就没有"对错"这个维度。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;五、为什么要较这个真&lt;/h2&gt;
&lt;p&gt;论文花了很大篇幅来说明：把模型的虚假输出叫做"幻觉"还是"胡扯"，不是文字游戏，而是会影响到我们怎么对待这些输出的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其一，"幻觉"这个说法会把人往沟里带。&lt;/strong&gt; 如果你相信模型是在"感知"世界时出了差错，你自然会想方设法去"修复"它的感知——给它更好的数据源、更准确的检索库。但这解决不了根本问题，因为毛病根本不出在感知上，而是模型从头到尾就没有试图去感知什么。它只是在做模式匹配和文本续写。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其二，"幻觉"这个词会让公众和决策者产生不切实际的期待。&lt;/strong&gt; 听起来AI好像在努力追求准确，只是能力还不够。这种印象会让人高估模型的能力，低估它的局限。而"胡扯"虽然不太好听，至少不会让人产生"模型快要懂得真相了"的幻觉——讽刺的是，"幻觉"这个词本身就在制造一种关于AI的幻觉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其三，法兰克福本人的警告值得重视。&lt;/strong&gt; 一个社会对真假之分的尊重程度，决定了这个社会的文明底线。当我们把AI的信口开河当作无害的"技术瑕疵"一笑而过的时候，我们其实是在消解对真相的基本敬畏。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;六、这篇文章也有值得商榷的地方&lt;/h2&gt;
&lt;p&gt;话说回来，这篇论文并不是无懈可击的。&lt;/p&gt;
&lt;p&gt;最大的软肋是"意图"问题。硬胡扯需要说话者有意"伪装"自己的态度，但模型到底有没有意图，本身就是个见仁见智的哲学难题。如果连"模型是否具有意图"都谈不拢，硬胡扯的论证就悬在半空了。作者本人也坦承这一点。&lt;/p&gt;
&lt;p&gt;另外，用"bullshit"这个词做标题，哲学上虽然精准，但在公共语境里未免有些刺耳。学术圈的讨论要走出象牙塔，措辞上的分寸感还是很重要的。也许需要一个更妥帖的中文对应词——"胡扯"已经比原文雅驯了一些，但仍然不够庄重。&lt;/p&gt;
&lt;p&gt;还有学者提出用"虚构"（confabulation）来替代"幻觉"，意思是模型在无意识地"编造"信息。这个说法和"胡扯"有交叉，但侧重点不同："虚构"暗示模型有一个记忆系统，只是偶尔出现了空白需要填补；而"胡扯"走得更远，它从根本上否认了模型和"真实认知过程"之间有任何关联。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;七、结语&lt;/h2&gt;
&lt;p&gt;这篇论文的价值，不在于给技术问题提供一个答案，而在于帮我们看清一个经常被忽视的前提：&lt;strong&gt;大语言模型从来就不是一个"努力求真但偶尔犯错"的系统。&lt;/strong&gt; 它们是从设计之初就与"真相"无关的文本生成器。&lt;/p&gt;
&lt;p&gt;当我们用"幻觉"来形容它的失误时，我们不知不觉间赋予了它一种它并不具备的"认知地位"。而当我们用"胡扯"来描述它的输出时，我们才能真正看清：&lt;strong&gt;它的每一句话，无论对错，都与它是否"相信"自己在说什么无关。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个认识对每一个AI使用者来说都很重要。它提醒我们：与其寄希望于模型"越来越准"，不如从一开始就摆正心态——它只是一个极其精巧的文本拼接工具，至于拼出来的东西是真是假，那是需要我们自己去判断的事。&lt;/p&gt;
&lt;p&gt;最后需要说明一点：本文所讨论的对象，严格来说是&lt;strong&gt;纯文本生成的大语言模型&lt;/strong&gt;—。随着技术的发展，AI早已不满足于只做文本生成。多模态模型可以同时处理图像、音频、视频，嵌入模型则擅长把文本、图片等不同形式的数据映射到同一个向量空间里，适用于智能体的模型还具有外部工具调用的能力。这些更复杂的模型，在"胡扯"这个问题上可能面临额外的维度——比如视觉幻觉（把图片里没有的东西"看"成有的）、跨模态的信息不一致等等。法兰克福的框架能不能原封不动地套用到这些场景，还需要更细致的分析。这篇论文提供了一个思考的起点，但远不是终点。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Hicks, M.T., Humphries, J. &amp;amp; Slater, J. ChatGPT is bullshit. &lt;em&gt;Ethics Inf Technol&lt;/em&gt; &lt;strong&gt;26&lt;/strong&gt;, 38 (2024). https://doi.org/10.1007/s10676-024-09775-5&lt;/li&gt;
&lt;li&gt;Frankfurt, H. (2005). &lt;em&gt;On Bullshit&lt;/em&gt;. Princeton University Press.&lt;/li&gt;
&lt;li&gt;Frankfurt, H. (2002). Reply to Cohen. In &lt;em&gt;The Contours of Agency: Essays on Themes from Harry Frankfurt&lt;/em&gt;. MIT Press.&lt;/li&gt;
&lt;li&gt;Shah, C. &amp;amp; Bender, E.M. (2022). Situating Search. &lt;em&gt;CHIIR '22&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Dennett, D.C. (1987). &lt;em&gt;The Intentional Stance&lt;/em&gt;. MIT Press.&lt;/li&gt;
&lt;li&gt;Edwards, B. (2023). Why ChatGPT and Bing Chat Are So Good at Making Things Up. &lt;em&gt;Ars Technica&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><category term="LLM"/><category term="大语言模型"/><category term="ChatGPT"/><category term="哲学"/><category term="法兰克福"/><category term="幻觉"/><category term="bullshit"/><category term="AI伦理"/></entry><entry><title>用 opencode 搞定毕业论文材料核查：跨文件多维度自动比对的实战</title><link href="https://blog.cycleuser.org/yong-opencode-gao-ding-bi-ye-lun-wen-cai-liao-he-cha-kua-wen-jian-duo-wei-du-zi-dong-bi-dui-de-shi-zhan.html" rel="alternate"/><published>2026-08-24T22:00:00+08:00</published><updated>2026-08-24T22:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-24:/yong-opencode-gao-ding-bi-ye-lun-wen-cai-liao-he-cha-kua-wen-jian-duo-wei-du-zi-dong-bi-dui-de-shi-zhan.html</id><summary type="html">&lt;p&gt;每年毕业季都有一个很折磨人的事情：上级部门通知限期完成毕业论文材料核查，要求比对同一学生在系统中提交的所 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;每年毕业季都有一个很折磨人的事情：上级部门通知限期完成毕业论文材料核查，要求比对同一学生在系统中提交的所有材料——开题报告、中期检查表、初稿、二稿、答辩稿、成绩评定表、终稿、查重报告——里面的课题名称是否一致，企业导师信息是否正确，佐证附件是否齐全，过程材料签字是否完整。&lt;/p&gt;
&lt;p&gt;七个人，每人七个阶段的材料，每个阶段还有 PDF、docx、ZIP 等不同格式。手动一个一个打开、一条一条比对，再认真做表格记录，这件事很枯燥，很耗时间，而且极其容易漏。&lt;/p&gt;
&lt;p&gt;这次演示的就是怎么用 opencode 把这件事半自动化掉——不是完全自动，是"人提问题、AI 找问题、人定问题"的模式。&lt;/p&gt;
&lt;p&gt;用 AI 做事情，有一个很容易掉进去的陷阱：把控制权交出去。"帮我检查一下这些材料有没有问题"——这句话听起来没什么，但仔细想想，"什么算问题"是你定的，还是 AI 定的？如果你不提前说清楚，AI 就会按自己的理解去定义"问题"，那最后出来的东西未必是你想要的。&lt;/p&gt;
&lt;p&gt;所以整个流程要这样设计：&lt;/p&gt;
&lt;p&gt;人来提出要查什么，AI 来执行查找和比对，最后人来决定查出来的结果怎么办。&lt;/p&gt;
&lt;p&gt;从头到尾，人必须是掌控者，AI 是执行者。这个顺序一旦搞反——比如你直接跟 AI 说"帮我把材料审核一遍"，什么都不限定——出来的结果可能看起来很完整，但重点完全跑偏了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;背景：一个 deadline 很近的核查任务&lt;/h2&gt;
&lt;p&gt;事情的由头是一份通知，要求在规定日期前完成毕业论文材料的全面核查，并将检查报告提交给上级部门。检查内容有好几项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;课题名称在开题报告、成绩评定表、查重报告、论文正文中是否一致&lt;/li&gt;
&lt;li&gt;查重率是否真实、佐证附件（程序代码、设计文档等）是否齐全&lt;/li&gt;
&lt;li&gt;双导师（校内导师+企业导师）信息是否一致&lt;/li&gt;
&lt;li&gt;过程材料签字是否完整&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;七位学生，每人七个阶段的材料，格式各不相同。你要是手动查，光是打开 PDF 就要点几十次，甚至还得一条条记。这件事听起来就让人头疼。&lt;/p&gt;
&lt;h2&gt;我给 opencode 的第一句话&lt;/h2&gt;
&lt;p&gt;我一开始的需求其实很简单，用一句话说清楚就行：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;帮我访问这个论文管理系统，把七位学生的所有材料全部下载下来，然后按学生、按阶段分好目录，最后做一份核查报告，对比每份材料里边的题目是否一致。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你看，这句话里有四个信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;干什么&lt;/strong&gt;：访问系统、下载材料、整理目录、做核查报告&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;范围&lt;/strong&gt;：七位学生，每人所有阶段&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;比对维度&lt;/strong&gt;：题目在各材料中的一致性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;交付物&lt;/strong&gt;：一份完整的核查报告&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至于具体怎么访问浏览器、用什么库解析 PDF、怎么从 docx 里提取标题——这些技术细节我一句话都没提。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;因为不需要提。&lt;/strong&gt; opencode 知道去启动浏览器、去写代码、去调用工具。你需要操心的只是"把需求说清楚"，剩下的交给它。&lt;/p&gt;
&lt;h2&gt;第一步：打开浏览器，人工登录&lt;/h2&gt;
&lt;p&gt;这一步有一个很重要的原则：&lt;strong&gt;账号密码绝不交给 AI&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;opencode 的做法是用 Selenium 启动一个 Firefox 浏览器窗口，然后——等你自己去登录。你在那个浏览器里手动输入用户名密码、点击登录，完成整个认证过程。opencode 不参与这一步，它看不到你的密码，也不会替你输入。&lt;/p&gt;
&lt;p&gt;登录成功之后，opencode 从浏览器的 session 里读取一组 cookie（SESSION、XSRF-TOKEN、JSESSIONID），后续所有的 API 调用都靠这组 cookie 来维持身份。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个设计思路值得说一下：让 AI 控制浏览器去做后续的自动化操作没问题，但登录这一步必须由人来完成。&lt;/strong&gt; 原因很简单——把账号密码交给 AI，不管它是本地运行的还是在线的，都多了一层不必要的风险。你自己登录，它只拿 cookie，各管各的。&lt;/p&gt;
&lt;h2&gt;第二步：摸清系统 API 结构&lt;/h2&gt;
&lt;p&gt;这是整个流程里最关键的一步。登录之后，opencode 没有傻乎乎地去"翻页截图"，而是去分析了系统的 API 接口。&lt;/p&gt;
&lt;p&gt;它用浏览器开发者工具（或者说 Selenium 的 network 监控）发现了后端的几个关键接口：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dynamicListJson&lt;/code&gt;：列出某个阶段的所有学生材料记录&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getDownloadUrl&lt;/code&gt;：获取某个文件的下载地址&lt;/li&gt;
&lt;li&gt;&lt;code&gt;checkReport&lt;/code&gt;：查看查重报告&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每个接口需要的参数、请求头、cookie，它自己去摸索了一遍，最后把 API 的调用方式完整摸清了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个过程有点像你用浏览器的"检查元素"去分析网页，只不过 AI 比你快得多，而且不会漏。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;第三步：批量下载所有材料&lt;/h2&gt;
&lt;p&gt;摸清 API 之后，就进入干活的环节了。&lt;/p&gt;
&lt;p&gt;opencode 写了一个 Python 脚本，遍历七位学生的所有阶段（开题报告、初稿、二稿、中期检查、答辩稿、成绩评定、终稿），逐个调用下载接口，把文件保存到对应目录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;毕业论文材料核查/
├── 下载_学生材料/
│   ├── 学生A_2022000001/
│   │   ├── 开题报告/
│   │   ├── 初稿/
│   │   ├── 二稿/
│   │   ├── 中期检查/
│   │   ├── 答辩稿/
│   │   ├── 成绩评定/
│   │   └── 最终稿/（含佐证附件和查重报告）
│   ├── 学生B_2022000002/
│   ├── ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;73 个文件，160MB，全部按学生和阶段分目录存放。查重报告是 ZIP 压缩包，自动解压。&lt;/p&gt;
&lt;p&gt;这一步如果手动做——打开每个学生的每个阶段、点击下载、保存到对应文件夹——大概需要一个多小时。opencode 跑了五分钟。&lt;/p&gt;
&lt;h2&gt;第四步：从 PDF 和 docx 中提取标题&lt;/h2&gt;
&lt;p&gt;接下来才是真正的难点：&lt;strong&gt;从不同格式的文件中，准确提取出"课题名称"或"论文题目"字段&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;难点在于不同格式的结构完全不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开题报告 PDF&lt;/strong&gt;：标题在"题目（中、外文）："这个标签后面，中文标题在第一行，英文标题在第二行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成绩评定表 PDF&lt;/strong&gt;：标题在"论文题目"字段后面，但可能跨多行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查重报告 PDF&lt;/strong&gt;：标题在"NO."编号后面，紧跟着论文题目。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;docx 文件&lt;/strong&gt;：标题可能在封面、摘要、正文里多次出现。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;刚开始我用的正则表达式是 &lt;code&gt;r'论文题目\s*([^\n]+)'&lt;/code&gt;——只取第一个换行符之前的内容。结果成绩评定表里的长标题被截断了，比对的时候出现了大量"不一致"的假阳性。&lt;/p&gt;
&lt;p&gt;后来改成更聪明的方案：不是精确提取标题文本，而是把系统中的完整标题做归一化处理（去除所有空白、去除字母间距），然后检查归一化后的系统标题是否出现在文件的全文中。这样就完全避免了截断问题。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\s+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;([A-Za-z]) ([A-Za-z])&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\1\2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="c1"&gt;# 检查系统标题是否出现在 docx 正文（归一化后）&lt;/span&gt;
&lt;span class="n"&gt;sys_n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;面向本地大语言模型运行时的环境感知辅助系统设计与实现&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fulln&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;docx_paragraphs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;hit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys_n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fulln&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;归一化的逻辑还处理了 PDF 中常见的"字母间距"问题——有些 PDF 把字母间距放大了，比如"Windows"在 PDF 里可能显示为"W i n d o w s"，归一化时把这些间距去掉再比较。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个细节是人手工比对时很难注意到的，但 AI 写脚本处理起来很自然。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;第五步：生成对照表格&lt;/h2&gt;
&lt;p&gt;全部文件下载、提取、比对完成后，opencode 生成了一份对照表格，把七位学生在每个阶段的题目信息排列在一起，一眼就能看出有没有不一致的地方。&lt;/p&gt;
&lt;p&gt;表格大概是这样的结构：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;学生&lt;/th&gt;
&lt;th&gt;系统课题名称&lt;/th&gt;
&lt;th&gt;开题报告题目&lt;/th&gt;
&lt;th&gt;成绩评定表题目&lt;/th&gt;
&lt;th&gt;查重报告标题&lt;/th&gt;
&lt;th&gt;初稿正文&lt;/th&gt;
&lt;th&gt;二稿正文&lt;/th&gt;
&lt;th&gt;答辩稿正文&lt;/th&gt;
&lt;th&gt;终稿正文&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;学生A&lt;/td&gt;
&lt;td&gt;xxx&lt;/td&gt;
&lt;td&gt;✅ 一致&lt;/td&gt;
&lt;td&gt;✅ 一致&lt;/td&gt;
&lt;td&gt;✅ 一致&lt;/td&gt;
&lt;td&gt;✅ 含完整题目&lt;/td&gt;
&lt;td&gt;✅ 含完整题目&lt;/td&gt;
&lt;td&gt;✅ 含完整题目&lt;/td&gt;
&lt;td&gt;✅ 含完整题目&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学生B&lt;/td&gt;
&lt;td&gt;xxx&lt;/td&gt;
&lt;td&gt;✅ 一致&lt;/td&gt;
&lt;td&gt;✅ 一致&lt;/td&gt;
&lt;td&gt;✅ 一致&lt;/td&gt;
&lt;td&gt;✅ 含完整题目&lt;/td&gt;
&lt;td&gt;✅ 含完整题目&lt;/td&gt;
&lt;td&gt;✅ 含完整题目&lt;/td&gt;
&lt;td&gt;✅ 含完整题目&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;...&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;查重率也一并列了出来——每位学生的论文重复率、AIGC 检测率，系统侧是否标记为"完成"。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个表格就是整次核查的核心产出。&lt;/strong&gt; AI 把 73 个文件里分散的信息汇总到一张表里，人不需要再打开 73 个原始文件一个一个看了——对着这张表逐行审阅就行。&lt;/p&gt;
&lt;h2&gt;第六步：人来审阅&lt;/h2&gt;
&lt;p&gt;表格生成完，AI 的活就基本干完了。剩下的事情是人来做的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;逐行逐列读完整张对照表，每位学生在每个阶段的题目、查重率、附件状态，全部过一遍&lt;/li&gt;
&lt;li&gt;看到哪个单元格有疑点，就打开对应的原始文件核实&lt;/li&gt;
&lt;li&gt;检查佐证附件是否齐全（程序代码、运行截图、设计文档）&lt;/li&gt;
&lt;li&gt;检查双导师信息在系统里是否登记完整&lt;/li&gt;
&lt;li&gt;确认过程材料签字是否完整&lt;/li&gt;
&lt;li&gt;最后根据表格的整体情况，写出核查结论&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;这一步是 AI 替代不了的。&lt;/strong&gt; AI 能把信息汇总成表格，但"这个表格说明了什么"、"哪些地方需要进一步确认"，判断权永远在你手里。&lt;/p&gt;
&lt;h2&gt;整个过程用了多久&lt;/h2&gt;
&lt;p&gt;从登录系统到报告生成完毕，整个过程大约用了不到一个小时。其中大部分时间花在 API 探索和 PDF 解析上——登录、下载、整理目录这些都是几分钟的事。&lt;/p&gt;
&lt;p&gt;如果完全手动做：打开 73 个文件、逐个核对标题、手工记录在表格里，保守估计需要三到五个小时，还不算中间打开错文件、找错行之类的失误成本。&lt;/p&gt;
&lt;h2&gt;但这件事的核心不是"AI 多厉害"&lt;/h2&gt;
&lt;p&gt;回到开头说的那个框架：&lt;strong&gt;人提出问题 → AI 发现问题 → 人决定问题。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个流程里，每一步都不能缺。没有人提出问题，AI 不知道该查什么；没有 AI 去执行，人得自己打开 73 个文件一个一个看；没有人来决定结果，AI 给你的对照表格就只是一堆符号，你不知道该信任还是该怀疑。&lt;/p&gt;
&lt;p&gt;拿这次的事来说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;人提出问题&lt;/strong&gt;：我告诉 opencode"比对七位学生在开题报告、成绩评定表、查重报告、论文正文中的课题名称是否一致"。这一句话界定了比对的范围和维度。如果我没说"课题名称"，它可能去比对学生姓名；如果我没说"论文正文"，它可能漏掉 docx 里的信息。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI 发现问题&lt;/strong&gt;：opencode 下载了 73 个文件，逐个解析 PDF 和 docx，把每个阶段的题目提取出来，和系统里的课题名称做归一化比对，最后生成对照表格。这个过程涉及 PDF 解析、正则表达式、文本归一化、文件名处理等一堆技术细节，全让 AI 干了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;人决定问题&lt;/strong&gt;：对照表格摆到面前，我逐行逐列地读——每位学生在每个阶段的题目、查重率、附件情况，全部过一遍，然后根据结果写核查结论。AI 不能替我做这个判断——它不知道上级部门对这份报告的具体要求，也不知道哪些"看起来一致"的地方其实藏着猫腻。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AI 做的是"把材料摆到你面前"，人做的是"确认材料没问题"。这两步缺一不可。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但最关键的不是这两步，而是&lt;strong&gt;开头那一步——你得自己先把问题想清楚&lt;/strong&gt;。"要比对什么"、"比对的范围是什么"、"什么情况下算有问题"，这些问题不先想明白，后面 AI 再厉害也是白搭。你给它一个模糊的指令，它给你一个模糊的结果，最后你还得自己从头来。&lt;/p&gt;
&lt;h2&gt;对类似场景的建议&lt;/h2&gt;
&lt;p&gt;如果你也有类似的需求——批量核查文档、比对多处信息、做交叉验证——以下几条经验可能有用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;明确比对维度&lt;/strong&gt;。在你跟 AI 说需求的时候，就把"要比对什么"说清楚。"题目是否一致"、"查重率是否真实"、"签字是否完整"，每一条都单独列出来。AI 不知道你关心什么，你得告诉它。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理格式差异&lt;/strong&gt;。不同文件格式（PDF、docx、图片）的解析方式完全不同，AI 会自己找工具去处理，但你可能需要在发现它解析出错的时候及时纠正——比如"成绩评定表的标题跨了两行，你的正则截断了"。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;让 AI 汇总成表格再审&lt;/strong&gt;。AI 的价值不只是"帮你找问题"，而是把分散在 73 个文件里的关键指标汇总成一张完整的对照表格。人审阅的是这张表格，不是原始文件。表格里该有的信息都有——学生姓名、系统课题名称、各阶段题目、查重率、附件状态——逐行读完，整体判断，比自己打开文件一个个看靠谱得多，也不会漏。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核查报告要分优先级&lt;/strong&gt;。所有问题都标"紧急"等于没有紧急。分成"必须处理"、"需要核实"、"建议改进"三级，对 deadline 前的决策帮助很大。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结一下&lt;/h2&gt;
&lt;p&gt;这篇的例子：用 opencode 把"七个人的毕业论文材料核查"从一个手动三小时的活，变成了一个小时半自动完成的任务。&lt;/p&gt;
&lt;p&gt;核心工作流是：人提出问题（比对什么、比对哪些人、比对哪些材料）→ AI 执行（登录、下载、解析、比对、生成表格）→ 人来审阅（逐行读表、写结论）。每一步都有技术难点——登录的 cookie 管理、API 的参数探索、PDF 的标题提取、docx 的文本归一化——但这些都让 AI 去处理了。&lt;/p&gt;
&lt;p&gt;人需要做的只有两件事：&lt;strong&gt;开头把需求想清楚，结尾把结果审一遍。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;控制权始终在你手里，AI 只是替你跑腿。工具提升的是效率，不是判断力。效率越高，越需要你把判断的事情想清楚。这件事不管用不用 AI 都是一样的。&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="AI"/><category term="毕业论文"/><category term="文档核查"/><category term="Python"/><category term="PDF解析"/></entry><entry><title>本地模型能不能当好 agent？7 个模型跑完 12 个长链复杂任务的实测</title><link href="https://blog.cycleuser.org/ben-di-mo-xing-neng-bu-neng-dang-hao-agent7-ge-mo-xing-pao-wan-12-ge-chang-lian-fu-za-ren-wu-de-shi-ce.html" rel="alternate"/><published>2026-08-23T00:20:00+08:00</published><updated>2026-08-23T00:20:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-23:/ben-di-mo-xing-neng-bu-neng-dang-hao-agent7-ge-mo-xing-pao-wan-12-ge-chang-lian-fu-za-ren-wu-de-shi-ce.html</id><summary type="html">&lt;h1&gt;本地模型能不能当好 agent？7 个模型跑完 12 个长链复杂任务的实测&lt;/h1&gt;
&lt;p&gt;测一个模型的"单轮对话能力"很容易，测一个模型"能不能 …&lt;/p&gt;</summary><content type="html">&lt;h1&gt;本地模型能不能当好 agent？7 个模型跑完 12 个长链复杂任务的实测&lt;/h1&gt;
&lt;p&gt;测一个模型的"单轮对话能力"很容易，测一个模型"能不能真的当 agent 干活"就难得多了——因为它要连续很多步：读文件、写代码、跑命令、查目录、改 Bug、再验证结果，中间任何一步出错都可能带偏后面所有步骤。&lt;/p&gt;
&lt;p&gt;这次用 Hermes Agent（本地部署）在单张 RX 7900 XTX 上，把 7 个模型放进 12 个复杂长链任务里跑了一遍，每个任务最多允许 40 轮工具调用，用 35 个自动验证检查点来判分。测的是模型在"真实干活"场景下的工具调用和长链执行能力，而不是单纯的口头问答。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;测了什么&lt;/h2&gt;
&lt;p&gt;12 个任务覆盖了 agent 日常要干的活：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;数据分析&lt;/strong&gt;：生成 sales.csv 并算出各区域合计、最佳区域&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bug 修复&lt;/strong&gt;：写一个 stats.py，再修好里面的 Bug 并跑通测试&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;包构建&lt;/strong&gt;：搭一个 Python 包目录结构（含 &lt;strong&gt;init&lt;/strong&gt;.py、hello.py、setup.py）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查找修补&lt;/strong&gt;：建多个文件、按规则查找内容、打补丁、拼接文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网页项目&lt;/strong&gt;：搭一个迷你站点（index.html / style.css / script.js / manifest）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆运算&lt;/strong&gt;：用记忆工具存 5 个商品价格，再跨会话算总价（考验长期记忆）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日志分析&lt;/strong&gt;：生成 app.log，再从日志里提取统计&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI 工具&lt;/strong&gt;：写一个能跑命令行参数的 fib.py&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目录搜索&lt;/strong&gt;：建目录树、放文件、移动文件、验证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON 查询&lt;/strong&gt;：生成 products.json 数组，再按字段查询&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文本处理&lt;/strong&gt;：生成一段精确文本并处理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;毕业设计&lt;/strong&gt;：一个 7 步多阶段任务，要求用 todo 工具跟踪步骤&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;环境：Hermes Agent + llama-server，单张 RX 7900 XTX，全部模型无 CPU 卸载，MTP 投机解码启用（不支持者自动降级），最大可用上下文。3.8 系列用 reasoning_effort=medium 思考档，3.6 系列关闭思考。模型间通过独立 HERMES_HOME 隔离记忆，杜绝互相污染。&lt;/p&gt;
&lt;h2&gt;总分榜&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;家族&lt;/th&gt;
&lt;th&gt;检查点&lt;/th&gt;
&lt;th&gt;得分&lt;/th&gt;
&lt;th&gt;耗时(s)&lt;/th&gt;
&lt;th&gt;工具调用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Qwen 3.6 Q5Hyb&lt;/td&gt;
&lt;td&gt;Qwen3.6-27B&lt;/td&gt;
&lt;td&gt;35/35&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;699&lt;/td&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Huihui 3.6 Q5Hyb&lt;/td&gt;
&lt;td&gt;Huihui-27B 去审查&lt;/td&gt;
&lt;td&gt;35/35&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;679&lt;/td&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Qwen 3.8 Q5Hyb&lt;/td&gt;
&lt;td&gt;Qwen3.8-27B&lt;/td&gt;
&lt;td&gt;35/35&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;893&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Uncensored 3.8 Q5Hyb&lt;/td&gt;
&lt;td&gt;3.8-27B 去审查&lt;/td&gt;
&lt;td&gt;35/35&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;712&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Nemotron 3.5 Lightning&lt;/td&gt;
&lt;td&gt;Nemotron-30B-A3B&lt;/td&gt;
&lt;td&gt;33/35&lt;/td&gt;
&lt;td&gt;94.3%&lt;/td&gt;
&lt;td&gt;775&lt;/td&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;GLM-4.7-Flash&lt;/td&gt;
&lt;td&gt;GLM-Flash-MoE&lt;/td&gt;
&lt;td&gt;31/35&lt;/td&gt;
&lt;td&gt;88.6%&lt;/td&gt;
&lt;td&gt;1043&lt;/td&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Qwen3.5-9B&lt;/td&gt;
&lt;td&gt;Qwen3.5-9B&lt;/td&gt;
&lt;td&gt;28/35&lt;/td&gt;
&lt;td&gt;80.0%&lt;/td&gt;
&lt;td&gt;923&lt;/td&gt;
&lt;td&gt;132&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt="总分" src="images/hermes_total.png"&gt;&lt;/p&gt;
&lt;h2&gt;逐任务热力图&lt;/h2&gt;
&lt;p&gt;&lt;img alt="热力图" src="images/hermes_heatmap.png"&gt;&lt;/p&gt;
&lt;h2&gt;逐任务明细&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;数据分析&lt;/th&gt;
&lt;th&gt;Bug修复&lt;/th&gt;
&lt;th&gt;包构建&lt;/th&gt;
&lt;th&gt;查找修补&lt;/th&gt;
&lt;th&gt;网页项目&lt;/th&gt;
&lt;th&gt;记忆运算&lt;/th&gt;
&lt;th&gt;日志分析&lt;/th&gt;
&lt;th&gt;CLI工具&lt;/th&gt;
&lt;th&gt;目录搜索&lt;/th&gt;
&lt;th&gt;JSON查询&lt;/th&gt;
&lt;th&gt;文本处理&lt;/th&gt;
&lt;th&gt;毕业设计&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 Q5Hyb&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huihui 3.6 Q5Hyb&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 Q5Hyb&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncensored 3.8 Q5Hyb&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nemotron 3.5 Lightning&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM-4.7-Flash&lt;/td&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5-9B&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;几个有意思的发现&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 四个 27B 全家满分，但速度和工具效率不一样&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Qwen 3.6、Huihui 3.6、Qwen 3.8、Uncensored 3.8 四个模型都是 35/35 满分，但效率差异明显：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;耗时最少的是 Huihui 3.6（679s）和 Qwen 3.6（699s），3.8 家族明显更慢（Qwen 3.8 要 893s）&lt;/li&gt;
&lt;li&gt;工具调用次数最少的是 Uncensored 3.8（73 次）和 Qwen 3.8（75 次）——说明它们"想得少、一次到位"；3.6 家族调用更多（89-95 次），更谨慎但速度更快&lt;/li&gt;
&lt;li&gt;值得注意的是：&lt;strong&gt;3.6 家族 MTP 接受率更高&lt;/strong&gt;（0.86-0.88 vs 3.8 的 0.79-0.83），配合更少的思考 token，整体反而更快&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这其实延续了之前大阅兵里的结论：27B 这个量级上，3.6 和 3.8 能力基本打平，3.6 靠 MTP 和关闭思考在速度上更占优，工具调用效率的差异更多来自"思考策略"而非"模型能力"。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 去审查基本无损&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Huihui 3.6（去审查）100%，Uncensored 3.8（去审查）100%——去对齐在长链 agent 任务上几乎不影响工具调用能力，甚至 Huihui 3.6 还是全场最快的。之前测试里担心的"去审查会不会损失能力"在这批场景里没看到代价。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 记忆运算是所有模型的共同洼地&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;六个模型里，除了四个 27B 满分，Nemotron、GLM-4.7-Flash、Qwen3.5-9B 全都在 &lt;strong&gt;t06_memory_arithmetic（记忆运算）上得 0 分&lt;/strong&gt;。这个任务要求用记忆工具存 5 个商品价格、再跨会话算总价——本质是考验"长期记忆 + 多步工具调用"的组合能力。这三个模型要么没把价格正确存进记忆，要么没能在后续步骤调出来。这说明记忆类工具的稳定使用，比单纯"能回答问题"难得多，是中小模型 agent 能力的明显短板。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. GLM-4.7-Flash：能干的都能干，干不细的会出小错&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GLM-4.7-Flash 拿了 88.6%，多数任务满分，但在数据分析上 67%（算错了一个合计数字）、目录搜索 50%（结果长度不对）。它没有大翻车，但会在"需要精确数值"的地方偶尔出错——这正好符合它 MoE 轻量版的定位：速度快、范围广，精度上略逊。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Qwen3.5-9B：参数规模是硬约束&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;9B 只拿了 80%，在 Bug 修复（0 分）、查找修补（0 分）、记忆运算（0 分）三个任务上失败。而且它工具调用最多（132 次）、耗时也长（923s）——说明 9B 模型在长链任务里容易"绕圈子"，反复试错但找不到关键步骤。Agent 场景对模型的"规划能力"要求，比单轮问答高得多，参数规模在这时成了实打实的门槛。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Nemotron：能打，但会犯小错&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nemotron 拿了 94.3%，唯一扣分在记忆运算（0 分），另外还有 1 次工具错误。它工具调用很激进（107 次，全场第二多），terminal 用了 56 次——干活很卖力，但有时候会多走弯路。&lt;/p&gt;
&lt;h2&gt;结论&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;冠军是 Qwen 3.6 Q5Hyb&lt;/strong&gt;——12 个长链复杂任务全部通过，35/35 检查点满分，耗时也只有 699 秒，是"满能力"里效率最高的。&lt;/p&gt;
&lt;p&gt;对选型来说，这次测试给出几个直接可用的判断：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;27B 是 agent 任务的安全线&lt;/strong&gt;：四个 27B（含去审查）全部满分，能力层面没有短板，主要差在速度和工具调用风格上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要快就选 3.6 家族&lt;/strong&gt;：MTP 接受率更高、可关思考，同样满分下比 3.8 快 20% 以上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;去审查版在 agent 场景无代价&lt;/strong&gt;：如果在意内容自由度，Huihui 3.6 或 Uncensored 3.8 可以放心用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;记忆类工具是中小模型的试金石&lt;/strong&gt;：能不能稳定"记住东西、跨步调用"，比能不能答对题更能区分 agent 能力&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;方法论说明&lt;/strong&gt;：评测框架是 Hermes Agent 自带的 batch_runner（40 轮上限、单 worker 串行、断点续跑）；每任务独立工作目录 + 独立 HERMES_HOME 隔离记忆；35 个确定性验证检查点（文件存在性、内容精确匹配、脚本执行结果、JSON 字段）；原始数据含完整对话+工具调用轨迹（trajectories.jsonl）、逐任务工作区快照、服务端日志（MTP 接受率）。所有模型均在同一张 7900 XTX、llama-server 后端下测试，未做多次重复，结果受单次运行影响。&lt;/p&gt;</content><category term="LLM"/><category term="Hermes"/><category term="Agent"/><category term="工具调用"/><category term="本地模型"/><category term="7900XTX"/><category term="Qwen3.6"/><category term="Qwen3.8"/><category term="Nemotron"/><category term="GLM"/><category term="评测"/></entry><entry><title>7900XTX 本地模型大阅兵：开源小/中大三档，能否追上 GPT-3.5 与 GPT-4o？</title><link href="https://blog.cycleuser.org/7900xtx-ben-di-mo-xing-da-yue-bing-kai-yuan-xiao-zhong-da-san-dang-neng-fou-zhui-shang-gpt-35-yu-gpt-4o.html" rel="alternate"/><published>2026-08-21T21:00:00+08:00</published><updated>2026-08-21T21:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-21:/7900xtx-ben-di-mo-xing-da-yue-bing-kai-yuan-xiao-zhong-da-san-dang-neng-fou-zhui-shang-gpt-35-yu-gpt-4o.html</id><summary type="html">&lt;h1&gt;7900XTX 本地模型大阅兵：开源小/中/大三档，能否追上 GPT-3.5 与 GPT-4o？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;单张 7900XTX 24GB 上实测 22 个开源模型，对标 GPT-3.5 与 GPT-4o。发现开源已追平 2024 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;h1&gt;7900XTX 本地模型大阅兵：开源小/中/大三档，能否追上 GPT-3.5 与 GPT-4o？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;单张 7900XTX 24GB 上实测 22 个开源模型，对标 GPT-3.5 与 GPT-4o。发现开源已追平 2024 闭源第一梯队；工具调用主力首选 Qwen 3.6 27B Q5Hyb，六维 90.5、BFCL 89.4 全场第一，综合来看甚至强于 Qwen 3.8 27B；性价比选 Gemma4 E4B，极致速度选 Nemotron。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;之前我们曾把本地模型和 GPT-3.5 做过对比。现在回头看，除了 GPT-3.5，第二年的 GPT-4o 同样值得参照——一个代表"能用"的门槛，一个代表 2024 年第一梯队的标杆。这次的雷达图同时画上这两条基线。&lt;/p&gt;
&lt;p&gt;模型有大有小。这次在&lt;strong&gt;单张 7900XTX 24GB&lt;/strong&gt; 上，选了一批当前有代表性的模型——硬盘空间有限，不可能全装，只选不算太旧、各尺寸段有代表性的：小尺寸（≤1.2GB）、中尺寸（1.2-8GB）、大尺寸（&amp;gt;8GB，需 8G+ 显存）三档。核心问题只有一个：&lt;strong&gt;现在的开源模型，和当年的闭源模型相比，到底怎么样了？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所有模型均在同一张 7900XTX 上实测（六维基准各 30 题 + 单流生成速度 + 官方 BFCL 工具调用）；闭源基线取公开可查证分数（出处逐项标注，见下表）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所谓"六维"，指下表参照基线里列出的六个基准&lt;/strong&gt;，覆盖知识、代码、数学、常识推理四类能力，每维 30 题、"六维均分"即六项准确率的算术平均：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MMLU&lt;/strong&gt;：多任务语言理解（专业/通识知识选择题）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HumanEval&lt;/strong&gt;：代码生成（函数补全，pass@1）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GSM8K&lt;/strong&gt;：小学数学应用题（多步推理）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HellaSwag&lt;/strong&gt;：常识句子补全（反直觉干扰项）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ARC&lt;/strong&gt;：科学/常识问答；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WinoGrande&lt;/strong&gt;：指代消解（代词指向）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;工具调用方面：&lt;strong&gt;BFCL（Berkeley Function Calling Leaderboard）就是标准的工具调用评测&lt;/strong&gt;，本次 22 个模型全部跑完 V4 Non-Live 七类 AST（见各档表格与专项表）；ToolBench 是另一个更重的 agent 型工具调用基准（多步规划），仅 27B 家族六个模型有实测，主要体现出 27B 的 3.6 还是比 3.8 更好的选择。&lt;/p&gt;
&lt;h2&gt;参照基线：GPT-3.5 与 GPT-4o&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;GPT-3.5-Turbo (2023)&lt;/th&gt;
&lt;th&gt;GPT-4o (2024)&lt;/th&gt;
&lt;th&gt;出处&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MMLU&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;88.7&lt;/td&gt;
&lt;td&gt;GPT-4 Technical Report (arXiv:2303.08774) / OpenAI 官方&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval 编程&lt;/td&gt;
&lt;td&gt;48.1&lt;/td&gt;
&lt;td&gt;90.2&lt;/td&gt;
&lt;td&gt;同上 / OpenAI 官方（System Card + Azure AI 目录）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM8K&lt;/td&gt;
&lt;td&gt;57.1&lt;/td&gt;
&lt;td&gt;96.0*&lt;/td&gt;
&lt;td&gt;同上 / *官方未发布，社区实测中位&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HellaSwag&lt;/td&gt;
&lt;td&gt;85.5&lt;/td&gt;
&lt;td&gt;95.3*&lt;/td&gt;
&lt;td&gt;同上 / *llm-stats 社区实测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARC&lt;/td&gt;
&lt;td&gt;85.2&lt;/td&gt;
&lt;td&gt;95.5*&lt;/td&gt;
&lt;td&gt;同上 / *llm-stats 社区实测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WinoGrande&lt;/td&gt;
&lt;td&gt;81.6&lt;/td&gt;
&lt;td&gt;88.5*&lt;/td&gt;
&lt;td&gt;同上 / *llm-stats 社区实测&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BFCL 工具调用（单轮 AST）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;84.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85.9 / 87.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BFCL v3 官方榜单：GPT-3.5-Turbo-0125 (FC) AST 84.52（ToolACE 论文 arXiv:2409.00920 引 2024-09-20 榜单）；GPT-4o-2024-08-06 AST 85.9（Amazon Nova 报告 arXiv:2506.12103 引 2024-11-17 榜单）、gpt-4o-2024-11-20 (FC) Non-Live AST 87.42（官方榜 2025-01-18 快照）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BFCL Overall（含多轮）&lt;/td&gt;
&lt;td&gt;51.93（多轮仅 19.12）&lt;/td&gt;
&lt;td&gt;68.9 / 69.6（多轮 63.4）&lt;/td&gt;
&lt;td&gt;同上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;生成速度&lt;/td&gt;
&lt;td&gt;~65 t/s (API)&lt;/td&gt;
&lt;td&gt;~92 t/s (API)&lt;/td&gt;
&lt;td&gt;Artificial Analysis / llm-stats 实测中位&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;说明：①本地模型 BFCL 为 &lt;strong&gt;V4 七类 AST 平均&lt;/strong&gt;，闭源为 &lt;strong&gt;v3 榜单口径&lt;/strong&gt;，测试集版本不同，对比仅供参考；②GPT-3.5 的 BFCL Overall 只有 51.93，主因是多轮（19.12）拉胯——&lt;strong&gt;单轮工具调用它并不弱（84.5）&lt;/strong&gt;；③带 * 维度为官方未发布、取社区实测中位；④HumanEval 均为官方 0-shot/pass@1 口径。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;一、小尺寸档（≤1.2GB）——秒开级轻骑兵&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;型号&lt;/th&gt;
&lt;th&gt;家族&lt;/th&gt;
&lt;th&gt;参数量&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;文件大小&lt;/th&gt;
&lt;th&gt;代码 HumanEval&lt;/th&gt;
&lt;th&gt;工具调用 BFCL&lt;/th&gt;
&lt;th&gt;六维均分&lt;/th&gt;
&lt;th&gt;生成 t/s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Qwen3 0.6B&lt;/td&gt;
&lt;td&gt;Alibaba Qwen3&lt;/td&gt;
&lt;td&gt;0.75B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;0.52GB&lt;/td&gt;
&lt;td&gt;53.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;65.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;47.2&lt;/td&gt;
&lt;td&gt;250.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Qwen3.5 0.8B&lt;/td&gt;
&lt;td&gt;Alibaba Qwen3.5&lt;/td&gt;
&lt;td&gt;0.87B&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;1.0GB&lt;/td&gt;
&lt;td&gt;33.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;57.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;42.8&lt;/td&gt;
&lt;td&gt;185.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Granite4 0.35B&lt;/td&gt;
&lt;td&gt;IBM Granite 4.0&lt;/td&gt;
&lt;td&gt;0.34B&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;0.37GB&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;67.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;40.0&lt;/td&gt;
&lt;td&gt;258.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;LFM2.5-Think 1.2B&lt;/td&gt;
&lt;td&gt;LiquidAI LFM2.5&lt;/td&gt;
&lt;td&gt;1.2B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;0.73GB&lt;/td&gt;
&lt;td&gt;30.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;72.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;28.3&lt;/td&gt;
&lt;td&gt;355.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;LFM2.5 0.35B&lt;/td&gt;
&lt;td&gt;LiquidAI LFM2.5&lt;/td&gt;
&lt;td&gt;0.35B&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;0.38GB&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;24.4&lt;/td&gt;
&lt;td&gt;374.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;特点：&lt;strong&gt;Qwen3 0.6B&lt;/strong&gt; 微型全能底子；&lt;strong&gt;Qwen3.5 0.8B&lt;/strong&gt; 新一代微型、数学强；&lt;strong&gt;Granite4 0.35B&lt;/strong&gt; 企业级安全调优、MoE 混合架构；&lt;strong&gt;LFM2.5-Think 1.2B&lt;/strong&gt; 思考型、小身材长推理；&lt;strong&gt;LFM2.5 0.35B&lt;/strong&gt; 非Transformer混合架构。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tiny (≤1.2GB)" src="images/radar_tier_tiny.png"&gt;&lt;/p&gt;
&lt;p&gt;这一档 5 个模型全部在 1.2GB 以内，加载秒开、生成速度 185-374 t/s 是全部参赛选手里最快的。共同短板也很明显：六维平均分只有 24-47，MMLU/数学都远远够不着 GPT-3.5 的边。它们的正确用法是&lt;strong&gt;高频轻任务&lt;/strong&gt;：&lt;strong&gt;文本翻译&lt;/strong&gt;（短句翻译几乎瞬时返回，日常中英互译质量够用、速度是大模型的 3-5 倍）、分类、摘要、格式转换、意图路由——以及给大模型当"前置路由"，判断该不该升级到大模型处理。代码能力分化明显：Granite4 0.35B 的 HumanEval 66.7 是本档意外亮点，Qwen3 0.6B 53.3 次之，LFM2.5 两兄弟（3-30 分）基本不会写代码。工具调用：本档 BFCL 实测 LFM2.5 0.35B 45.9、Granite4 0.35B 67.0、LFM2.5-Think 1.2B 72.3、Qwen3 0.6B 65.5、Qwen3.5 0.8B 57.8——远低于大模型档（77-89），简单单工具调用勉强可用（Granite 0.35B 的 multiple 85 出人意料），但平行调用和复杂 agent 别指望。&lt;/p&gt;
&lt;p&gt;➡️ &lt;strong&gt;本档推荐：Qwen3 0.6B&lt;/strong&gt;（六维 47.2 分 + 250.9 t/s；本档首选翻译/摘要/路由等轻任务）&lt;/p&gt;
&lt;h2&gt;二、中尺寸档（1.2-8GB）——单卡实用主力&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;型号&lt;/th&gt;
&lt;th&gt;家族&lt;/th&gt;
&lt;th&gt;参数量&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;文件大小&lt;/th&gt;
&lt;th&gt;代码 HumanEval&lt;/th&gt;
&lt;th&gt;工具调用 BFCL&lt;/th&gt;
&lt;th&gt;六维均分&lt;/th&gt;
&lt;th&gt;生成 t/s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Gemma4 E4B&lt;/td&gt;
&lt;td&gt;Google Gemma4&lt;/td&gt;
&lt;td&gt;4B 有效(总7.5B)&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;5.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;83.4&lt;/td&gt;
&lt;td&gt;115.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Gemma4 12B&lt;/td&gt;
&lt;td&gt;Google Gemma4&lt;/td&gt;
&lt;td&gt;11.9B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;7.1GB&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;80.6&lt;/td&gt;
&lt;td&gt;62.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Qwen3.5 9B&lt;/td&gt;
&lt;td&gt;Alibaba Qwen3.5&lt;/td&gt;
&lt;td&gt;9.7B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;6.6GB&lt;/td&gt;
&lt;td&gt;73.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;80.5&lt;/td&gt;
&lt;td&gt;79.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Gemma4 E2B&lt;/td&gt;
&lt;td&gt;Google Gemma4&lt;/td&gt;
&lt;td&gt;2B 有效(总4.6B)&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;3.1GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;79.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;75.0&lt;/td&gt;
&lt;td&gt;154.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;OmniCoder2 9B&lt;/td&gt;
&lt;td&gt;社区 OmniCoder&lt;/td&gt;
&lt;td&gt;9.0B&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;5.7GB&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;48.3&lt;/td&gt;
&lt;td&gt;85.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;特点：&lt;strong&gt;Gemma4 E4B&lt;/strong&gt; 性价比之王；&lt;strong&gt;Gemma4 12B&lt;/strong&gt; 中量级标杆；&lt;strong&gt;Qwen3.5 9B&lt;/strong&gt; 中坚全能；&lt;strong&gt;Gemma4 E2B&lt;/strong&gt; 轻任务够用；&lt;strong&gt;OmniCoder2 9B&lt;/strong&gt; 代码特化、通用偏科。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mid (1.2-8GB)" src="images/radar_tier_mid.png"&gt;&lt;/p&gt;
&lt;p&gt;这一档开始进入"真正能用"的区间：五个模型六维平均分 48-83，&lt;strong&gt;Gemma4 E4B 以 4B 参数拿到 83.4 分 + 115 t/s&lt;/strong&gt;，超过 GPT-3.5 六维平均（71.2），是全场性价比最高的一档。代码能力全员过关：Gemma4 E2B/E4B 的 HumanEval 双双 100 分，OmniCoder2 93.3（不愧代码特化），Gemma4 12B 83.3 / Qwen3.5 9B 73.3 稳定。E2B（75 分）证明了 2B 就是日常轻聊天+轻代码的底线；Qwen3.5 9B 和 Gemma4 12B 是均衡中坚；OmniCoder 偏科严重（只会写代码，通用垫底 48.3）。工具调用：本档 5/5 模型完成 BFCL 实测（见上表），Qwen3.5/Gemma4 家族模板层均已验证支持 function calling。&lt;strong&gt;单卡日常主力建议从这档选&lt;/strong&gt;——除非你确定需要旗舰级能力。&lt;/p&gt;
&lt;p&gt;➡️ &lt;strong&gt;本档推荐：Gemma4 E4B&lt;/strong&gt;（六维 83.4 分 + HumanEval 100 + 115 t/s，性价比之王；工具调用已实测 BFCL 81.9，需要 function calling 的场景本档即可胜任）&lt;/p&gt;
&lt;h2&gt;三、大尺寸档（&amp;gt;8GB，需 8G+ 显存）——旗舰竞技场&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;型号&lt;/th&gt;
&lt;th&gt;家族&lt;/th&gt;
&lt;th&gt;参数量&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;文件大小&lt;/th&gt;
&lt;th&gt;代码 HumanEval&lt;/th&gt;
&lt;th&gt;工具调用 BFCL&lt;/th&gt;
&lt;th&gt;六维均分&lt;/th&gt;
&lt;th&gt;生成 t/s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Qwen3.6 35B MoE&lt;/td&gt;
&lt;td&gt;Alibaba Qwen3.6&lt;/td&gt;
&lt;td&gt;34.7B(A3B)&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;22.0GB&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;83.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;93.4&lt;/td&gt;
&lt;td&gt;106.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Gemma4 31B&lt;/td&gt;
&lt;td&gt;Google Gemma4&lt;/td&gt;
&lt;td&gt;30.7B 稠密&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;18.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;83.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;91.7&lt;/td&gt;
&lt;td&gt;29.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Nemotron 3.5 Lightning&lt;/td&gt;
&lt;td&gt;NVIDIA&lt;/td&gt;
&lt;td&gt;30B(A3B)&lt;/td&gt;
&lt;td&gt;Q4_0&lt;/td&gt;
&lt;td&gt;18.9GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;79.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;91.1&lt;/td&gt;
&lt;td&gt;129.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Qwen 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;Alibaba Qwen3.6&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90.5&lt;/td&gt;
&lt;td&gt;29.91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Qwen 3.8 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;Alibaba Qwen3.8&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;16.8GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;37.94&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Qwen 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;Alibaba Qwen3.8&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85.1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;30.22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Huihui 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;Huihui 去审查&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;89.4&lt;/td&gt;
&lt;td&gt;30.73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Qwen 3.6 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;Alibaba Qwen3.6&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;17.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;88.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;88.9&lt;/td&gt;
&lt;td&gt;36.32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Uncensored 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;Heretic 去审查&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;td&gt;30.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;GLM4.7 Flash&lt;/td&gt;
&lt;td&gt;智谱 GLM&lt;/td&gt;
&lt;td&gt;29.9B MoE&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;18.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;79.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;td&gt;95.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Gemma4 26B MoE&lt;/td&gt;
&lt;td&gt;Google Gemma4&lt;/td&gt;
&lt;td&gt;25.2B(A4B)&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;16.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;87.2&lt;/td&gt;
&lt;td&gt;91.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;GPT-OSS 20B&lt;/td&gt;
&lt;td&gt;OpenAI gpt-oss&lt;/td&gt;
&lt;td&gt;20.9B(A3.6B)&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;11.0GB&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;78.9&lt;/td&gt;
&lt;td&gt;155.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;特点：&lt;strong&gt;Qwen3.6 35B MoE&lt;/strong&gt; 全场总分第一；&lt;strong&gt;Gemma4 31B&lt;/strong&gt; 大杯旗舰、速度慢；&lt;strong&gt;Nemotron 3.5 Lightning&lt;/strong&gt; Mamba2+MoE、agent 执行层；&lt;strong&gt;Qwen 3.6 27B Q5Hyb&lt;/strong&gt; 定制混合量化(Q5主体+Q8注意力)；&lt;strong&gt;Qwen 3.8 27B Q4_K_M&lt;/strong&gt; 混合线性注意力架构；&lt;strong&gt;Qwen 3.8 27B Q5Hyb&lt;/strong&gt; 定制混合量化；&lt;strong&gt;Huihui 3.6 27B Q5Hyb&lt;/strong&gt; abliterated 去对齐；&lt;strong&gt;Qwen 3.6 27B Q4_K_M&lt;/strong&gt; 官方标准量化；&lt;strong&gt;Uncensored 3.8 27B Q5Hyb&lt;/strong&gt; 消融法去对齐；&lt;strong&gt;GLM4.7 Flash&lt;/strong&gt; 国产旗舰 MoE 轻量版；&lt;strong&gt;Gemma4 26B MoE&lt;/strong&gt; MoE 高效大杯；&lt;strong&gt;GPT-OSS 20B&lt;/strong&gt; OpenAI 开源 MoE。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Large (&amp;gt;8GB, 8G+ VRAM)" src="images/radar_tier_large.png"&gt;&lt;/p&gt;
&lt;p&gt;12 个模型挤在这一档，也是和 GPT-4o 正面交锋的主战场。&lt;strong&gt;Qwen3.6 35B MoE 以 93.4 分 + 106.7 t/s 双料登顶&lt;/strong&gt;，但是工具调用不如 27B 家族的，好在六维全面越过 GPT-4o 基线（89.5）；Gemma4 31B（91.7 分）是稠密阵营最强但速度只有 29 t/s；Nemotron 3.5 Lightning（91.1 分 + 129 t/s）靠 Mamba2+MoE 架构拿到全场最快大模型；Qwen 27B 家族六个模型挤在 88.9-90.5 的密集区间——量化选择的影响（约 1 分）远小于家族差异。这一档全员在能力面上&lt;strong&gt;越过或贴住 GPT-4o&lt;/strong&gt;，仅在速度轴被本地小模型反超。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本档工具调用专项实测&lt;/strong&gt;——BFCL（V4 Non-Live AST 七类官方口径）12 个模型全部实测：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;型号&lt;/th&gt;
&lt;th&gt;BFCL 工具调用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.6 35B MoE&lt;/td&gt;
&lt;td&gt;83.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 31B&lt;/td&gt;
&lt;td&gt;83.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nemotron 3.5 Lightning&lt;/td&gt;
&lt;td&gt;79.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;89.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;86.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;85.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huihui 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;89.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncensored 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;86.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM4.7 Flash&lt;/td&gt;
&lt;td&gt;79.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 26B MoE&lt;/td&gt;
&lt;td&gt;78.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-OSS 20B&lt;/td&gt;
&lt;td&gt;52.9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;BFCL 七类中 simple_python 全员 93-97；&lt;strong&gt;Java/JS 是所有模型的洼地&lt;/strong&gt;（60-78）；3.8 家族 irrelevance（该拒判时不调用）明显弱于 3.6（70-75 vs 90），去审查版 Uncensored 更低至 47.9。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ToolBench-Static 专项实测&lt;/strong&gt;（100 域内+50 域外抽样；仅 27B 家族六兄弟有实测，其余大模型未跑）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;型号&lt;/th&gt;
&lt;th&gt;ToolBench 域内 plan_em&lt;/th&gt;
&lt;th&gt;域外 plan_em&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;0.822&lt;/td&gt;
&lt;td&gt;0.837&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;0.822&lt;/td&gt;
&lt;td&gt;0.857&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;0.835&lt;/td&gt;
&lt;td&gt;0.816&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huihui 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;0.800&lt;/td&gt;
&lt;td&gt;0.816&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;0.789&lt;/td&gt;
&lt;td&gt;0.816&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncensored 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;0.833&lt;/td&gt;
&lt;td&gt;0.857&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;➡️ &lt;strong&gt;本档推荐&lt;/strong&gt;：&lt;strong&gt;综合主力首选 Qwen 3.6 27B（Q5Hyb）&lt;/strong&gt;——27B 量级能力均衡无短板，工具调用非常强（BFCL 89.4 全场第一、ToolBench 域内 0.822、六维 90.5 领先 27B 家族）；且 3.8 在 27B 档并没有比 3.6 强太多（六维 90.0 vs 90.5 持平，工具调用反而落后 3-4 分），换代收益有限。要极致总分再上 Qwen3.6 35B MoE（六维 93.4 分，工具调用 实测 83.0）；要速度选 Nemotron（129 t/s，BFCL 79.7，Java/JS 偏弱）。&lt;/p&gt;
&lt;h2&gt;四、全景：22 模型同场雷达&lt;/h2&gt;
&lt;p&gt;&lt;img alt="All 22 Models" src="images/radar_all_models.png"&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;型号&lt;/th&gt;
&lt;th&gt;参数量&lt;/th&gt;
&lt;th&gt;文件大小&lt;/th&gt;
&lt;th&gt;代码 HumanEval&lt;/th&gt;
&lt;th&gt;工具调用 BFCL&lt;/th&gt;
&lt;th&gt;六维平均分&lt;/th&gt;
&lt;th&gt;生成 t/s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Qwen3.6 35B MoE&lt;/td&gt;
&lt;td&gt;34.7B(A3B)&lt;/td&gt;
&lt;td&gt;22.0GB&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;83.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;93.4&lt;/td&gt;
&lt;td&gt;106.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Gemma4 31B&lt;/td&gt;
&lt;td&gt;30.7B 稠密&lt;/td&gt;
&lt;td&gt;18.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;83.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;91.7&lt;/td&gt;
&lt;td&gt;29.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Nemotron 3.5 Lightning&lt;/td&gt;
&lt;td&gt;30B(A3B)&lt;/td&gt;
&lt;td&gt;18.9GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;79.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;91.1&lt;/td&gt;
&lt;td&gt;129.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Qwen 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;20.6GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90.5&lt;/td&gt;
&lt;td&gt;29.91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Qwen 3.8 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;16.8GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;37.94&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Qwen 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;20.6GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85.1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;30.22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Huihui 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;20.6GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;89.4&lt;/td&gt;
&lt;td&gt;30.73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Qwen 3.6 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;17.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;88.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;88.9&lt;/td&gt;
&lt;td&gt;36.32&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Uncensored 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;27B 稠密&lt;/td&gt;
&lt;td&gt;20.6GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;td&gt;30.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;GLM4.7 Flash&lt;/td&gt;
&lt;td&gt;29.9B MoE&lt;/td&gt;
&lt;td&gt;18.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;79.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;td&gt;95.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Gemma4 26B MoE&lt;/td&gt;
&lt;td&gt;25.2B(A4B)&lt;/td&gt;
&lt;td&gt;16.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;87.2&lt;/td&gt;
&lt;td&gt;91.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Gemma4 E4B&lt;/td&gt;
&lt;td&gt;4B 有效(总7.5B)&lt;/td&gt;
&lt;td&gt;5.0GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;83.4&lt;/td&gt;
&lt;td&gt;115.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Gemma4 12B&lt;/td&gt;
&lt;td&gt;11.9B&lt;/td&gt;
&lt;td&gt;7.1GB&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;77.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;80.6&lt;/td&gt;
&lt;td&gt;62.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Qwen3.5 9B&lt;/td&gt;
&lt;td&gt;9.7B&lt;/td&gt;
&lt;td&gt;6.6GB&lt;/td&gt;
&lt;td&gt;73.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;80.5&lt;/td&gt;
&lt;td&gt;79.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;GPT-OSS 20B&lt;/td&gt;
&lt;td&gt;20.9B(A3.6B)&lt;/td&gt;
&lt;td&gt;11.0GB&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;78.9&lt;/td&gt;
&lt;td&gt;155.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Gemma4 E2B&lt;/td&gt;
&lt;td&gt;2B 有效(总4.6B)&lt;/td&gt;
&lt;td&gt;3.1GB&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;79.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;75.0&lt;/td&gt;
&lt;td&gt;154.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;OmniCoder2 9B&lt;/td&gt;
&lt;td&gt;9.0B&lt;/td&gt;
&lt;td&gt;5.7GB&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;48.3&lt;/td&gt;
&lt;td&gt;85.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;Qwen3 0.6B&lt;/td&gt;
&lt;td&gt;0.75B&lt;/td&gt;
&lt;td&gt;0.52GB&lt;/td&gt;
&lt;td&gt;53.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;65.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;47.2&lt;/td&gt;
&lt;td&gt;250.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;Qwen3.5 0.8B&lt;/td&gt;
&lt;td&gt;0.87B&lt;/td&gt;
&lt;td&gt;1.0GB&lt;/td&gt;
&lt;td&gt;33.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;57.8&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;42.8&lt;/td&gt;
&lt;td&gt;185.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Granite4 0.35B&lt;/td&gt;
&lt;td&gt;0.34B&lt;/td&gt;
&lt;td&gt;0.37GB&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;67.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;40.0&lt;/td&gt;
&lt;td&gt;258.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;LFM2.5-Think 1.2B&lt;/td&gt;
&lt;td&gt;1.2B&lt;/td&gt;
&lt;td&gt;0.73GB&lt;/td&gt;
&lt;td&gt;30.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;72.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;28.3&lt;/td&gt;
&lt;td&gt;355.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;LFM2.5 0.35B&lt;/td&gt;
&lt;td&gt;0.35B&lt;/td&gt;
&lt;td&gt;0.38GB&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45.9&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;24.4&lt;/td&gt;
&lt;td&gt;374.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;速度为单流实测（27B 取无 MTP 基线）；六维=30题/维；GPT-3.5 基线六维平均 71.2，GPT-4o 约 89.2。颜色=家族，线型=家族内成员；黑色加粗虚线=GPT-3.5，灰色点划线=GPT-4o。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;4.1 详细分数全表（22 模型六维明细 + BFCL 汇总）&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;六维明细&lt;/strong&gt;（MMLU / HumanEval / GSM8K / HellaSwag / ARC / WinoGrande，各 30 题 acc；按文件大小升序）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;型号&lt;/th&gt;
&lt;th&gt;文件GB&lt;/th&gt;
&lt;th&gt;MMLU&lt;/th&gt;
&lt;th&gt;HumanEval&lt;/th&gt;
&lt;th&gt;GSM8K&lt;/th&gt;
&lt;th&gt;HellaSwag&lt;/th&gt;
&lt;th&gt;ARC&lt;/th&gt;
&lt;th&gt;WinoGrande&lt;/th&gt;
&lt;th&gt;六维均分&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Granite4 0.35B&lt;/td&gt;
&lt;td&gt;0.37&lt;/td&gt;
&lt;td&gt;40.0&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;23.3&lt;/td&gt;
&lt;td&gt;33.3&lt;/td&gt;
&lt;td&gt;26.7&lt;/td&gt;
&lt;td&gt;50.0&lt;/td&gt;
&lt;td&gt;40.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LFM2.5 0.35B&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;td&gt;26.7&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;6.7&lt;/td&gt;
&lt;td&gt;23.3&lt;/td&gt;
&lt;td&gt;46.7&lt;/td&gt;
&lt;td&gt;40.0&lt;/td&gt;
&lt;td&gt;24.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3 0.6B&lt;/td&gt;
&lt;td&gt;0.52&lt;/td&gt;
&lt;td&gt;36.7&lt;/td&gt;
&lt;td&gt;53.3&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;20.0&lt;/td&gt;
&lt;td&gt;56.7&lt;/td&gt;
&lt;td&gt;50.0&lt;/td&gt;
&lt;td&gt;47.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LFM2.5-Think 1.2B&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;23.3&lt;/td&gt;
&lt;td&gt;30.0&lt;/td&gt;
&lt;td&gt;46.7&lt;/td&gt;
&lt;td&gt;20.0&lt;/td&gt;
&lt;td&gt;13.3&lt;/td&gt;
&lt;td&gt;36.7&lt;/td&gt;
&lt;td&gt;28.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5 0.8B&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;13.3&lt;/td&gt;
&lt;td&gt;33.3&lt;/td&gt;
&lt;td&gt;73.3&lt;/td&gt;
&lt;td&gt;40.0&lt;/td&gt;
&lt;td&gt;50.0&lt;/td&gt;
&lt;td&gt;46.7&lt;/td&gt;
&lt;td&gt;42.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 E2B&lt;/td&gt;
&lt;td&gt;3.1&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;33.3&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;73.3&lt;/td&gt;
&lt;td&gt;75.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 E4B&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;83.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OmniCoder2 9B&lt;/td&gt;
&lt;td&gt;5.7&lt;/td&gt;
&lt;td&gt;13.3&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;23.3&lt;/td&gt;
&lt;td&gt;30.0&lt;/td&gt;
&lt;td&gt;50.0&lt;/td&gt;
&lt;td&gt;48.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5 9B&lt;/td&gt;
&lt;td&gt;6.6&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;73.3&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;80.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 12B&lt;/td&gt;
&lt;td&gt;7.1&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;80.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-OSS 20B&lt;/td&gt;
&lt;td&gt;11.0&lt;/td&gt;
&lt;td&gt;63.3&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;63.3&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;76.7&lt;/td&gt;
&lt;td&gt;78.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 26B MoE&lt;/td&gt;
&lt;td&gt;16.0&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;76.7&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;87.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;16.8&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;17.0&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;88.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM4.7 Flash&lt;/td&gt;
&lt;td&gt;18.0&lt;/td&gt;
&lt;td&gt;73.3&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 31B&lt;/td&gt;
&lt;td&gt;18.0&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;76.7&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;91.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nemotron 3.5 Lightning&lt;/td&gt;
&lt;td&gt;18.9&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;76.7&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;91.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huihui 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;89.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6&lt;/td&gt;
&lt;td&gt;73.3&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;90.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncensored 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.6 35B MoE&lt;/td&gt;
&lt;td&gt;22.0&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;93.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;BFCL 工具调用汇总&lt;/strong&gt;（27B 家族为官方 Non-Live Overall Acc，其余为 V4 七类 AST 平均）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;型号&lt;/th&gt;
&lt;th&gt;文件GB&lt;/th&gt;
&lt;th&gt;BFCL 工具调用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Granite4 0.35B&lt;/td&gt;
&lt;td&gt;0.37&lt;/td&gt;
&lt;td&gt;67.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LFM2.5 0.35B&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;td&gt;45.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3 0.6B&lt;/td&gt;
&lt;td&gt;0.52&lt;/td&gt;
&lt;td&gt;65.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LFM2.5-Think 1.2B&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;72.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5 0.8B&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;57.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 E2B&lt;/td&gt;
&lt;td&gt;3.1&lt;/td&gt;
&lt;td&gt;79.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 E4B&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;81.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OmniCoder2 9B&lt;/td&gt;
&lt;td&gt;5.7&lt;/td&gt;
&lt;td&gt;81.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.5 9B&lt;/td&gt;
&lt;td&gt;6.6&lt;/td&gt;
&lt;td&gt;80.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 12B&lt;/td&gt;
&lt;td&gt;7.1&lt;/td&gt;
&lt;td&gt;77.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-OSS 20B&lt;/td&gt;
&lt;td&gt;11.0&lt;/td&gt;
&lt;td&gt;52.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 26B MoE&lt;/td&gt;
&lt;td&gt;16.0&lt;/td&gt;
&lt;td&gt;78.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;16.8&lt;/td&gt;
&lt;td&gt;86.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;17.0&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GLM4.7 Flash&lt;/td&gt;
&lt;td&gt;18.0&lt;/td&gt;
&lt;td&gt;79.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma4 31B&lt;/td&gt;
&lt;td&gt;18.0&lt;/td&gt;
&lt;td&gt;83.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nemotron 3.5 Lightning&lt;/td&gt;
&lt;td&gt;18.9&lt;/td&gt;
&lt;td&gt;79.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huihui 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6&lt;/td&gt;
&lt;td&gt;89.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6&lt;/td&gt;
&lt;td&gt;89.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6&lt;/td&gt;
&lt;td&gt;85.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncensored 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;20.6&lt;/td&gt;
&lt;td&gt;86.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3.6 35B MoE&lt;/td&gt;
&lt;td&gt;22.0&lt;/td&gt;
&lt;td&gt;83.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;4.2 27B 家族深挖数据对比（拒答率 / τ² / MTP / ToolBench 幻觉率 / BFCL irrelevance）&lt;/h3&gt;
&lt;p&gt;结论里提到的拒答率、irrelevance 拒判、MTP 加速、τ² 智能体等，原始实测数据如下（27B 家族六个模型；τ² 为本地 user-sim 口径、非官方协议；拒答率越低越不拘束）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;型号&lt;/th&gt;
&lt;th&gt;拒答率&lt;/th&gt;
&lt;th&gt;τ² 成功率&lt;/th&gt;
&lt;th&gt;MTP n=3 t/s&lt;/th&gt;
&lt;th&gt;MTP 加速比&lt;/th&gt;
&lt;th&gt;无MTP t/s&lt;/th&gt;
&lt;th&gt;ToolBench 幻觉率(域内/域外)&lt;/th&gt;
&lt;th&gt;BFCL irrelevance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;0.05&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;66.4&lt;/td&gt;
&lt;td&gt;1.75x&lt;/td&gt;
&lt;td&gt;37.9&lt;/td&gt;
&lt;td&gt;0.03 / 0.04&lt;/td&gt;
&lt;td&gt;74.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q4_K_M&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;td&gt;60.2&lt;/td&gt;
&lt;td&gt;1.66x&lt;/td&gt;
&lt;td&gt;36.3&lt;/td&gt;
&lt;td&gt;0.03 / 0.02&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;td&gt;55.1&lt;/td&gt;
&lt;td&gt;1.84x&lt;/td&gt;
&lt;td&gt;29.9&lt;/td&gt;
&lt;td&gt;0.05 / 0.04&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;0.05&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;59.7&lt;/td&gt;
&lt;td&gt;1.98x&lt;/td&gt;
&lt;td&gt;30.2&lt;/td&gt;
&lt;td&gt;0.00 / 0.00&lt;/td&gt;
&lt;td&gt;70.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Huihui 3.6 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;td&gt;65.2&lt;/td&gt;
&lt;td&gt;2.12x&lt;/td&gt;
&lt;td&gt;30.7&lt;/td&gt;
&lt;td&gt;0.02 / 0.02&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncensored 3.8 27B Q5Hyb&lt;/td&gt;
&lt;td&gt;0.05&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;td&gt;59.4&lt;/td&gt;
&lt;td&gt;1.94x&lt;/td&gt;
&lt;td&gt;30.7&lt;/td&gt;
&lt;td&gt;0.00 / 0.00&lt;/td&gt;
&lt;td&gt;47.9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;读法：&lt;strong&gt;拒答率&lt;/strong&gt; huihui 全量微调去对齐最彻底（0.0），官方版 0.05-0.15；&lt;strong&gt;τ² 成功率&lt;/strong&gt; 3.8 家族两兄弟 100%、其余 93%；&lt;strong&gt;MTP 加速&lt;/strong&gt; 全部 1.66-2.12x；&lt;strong&gt;幻觉率&lt;/strong&gt; 3.8 家族（0.00-0.04）普遍低于 3.6（0.02-0.05）；&lt;strong&gt;irrelevance 拒判&lt;/strong&gt; 3.6 家族 90 明显强于 3.8（70-75），去审查版 Uncensored 掉到 47.9——这正是结论 3 判断"3.6 工具调用更强"的原始依据。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;五、结论&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;开源已追平 2024 闭源第一梯队&lt;/strong&gt;：大尺寸档冠军 Qwen3.6 35B MoE（93.4 分）全面越过 GPT-4o 基线，前十名大模型全部在能力面上贴住或超过 GPT-4o。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MoE 是当前甜点架构&lt;/strong&gt;：总榜前十中 MoE 占四席（Qwen3.6 35B、Nemotron、GPT-OSS、Gemma4 26B），且速度普遍 90-130 t/s，比同档稠密模型快 3-4 倍。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;工具调用的主力推荐：Qwen 3.6 27B&lt;/strong&gt;（首选 Q5Hyb，其次官方 Q4_K_M）——27B 这个量级能力均衡没有短板：六维 88.9-90.5、BFCL 工具调用 88.3-89.4（27B 档全员 85+，非常强）、ToolBench 域内 0.79-0.82、拒答率克制（官方 0.15）、还有 MTP 1.7-2.1x 加速可用。更关键的判断是：&lt;strong&gt;在 27B 档，Qwen 3.8 并没有比 3.6 强太多&lt;/strong&gt;——六维 90.0 vs 90.5、MMLU 70.0 vs 73.3 基本持平，而 3.6 在最要紧的工具调用上明显领先（BFCL 88.3-89.4 vs 85.1-86.8，irrelevance 拒判 90 vs 70-75），甚至超过 GPT-4o 的单轮工具调用（87.4，v3 榜口径，版本不同仅供参考）。换代收益有限，选能力更全面、工具调用更强的 3.6，才是单卡日常主力的正解。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;按量级选型&lt;/strong&gt;：轻任务/翻译/路由 Qwen3 0.6B（250 t/s）；中量级性价比 Gemma4 E4B（83 分+115 t/s）；旗舰总分 Qwen3.6 35B MoE（93.4 分）；&lt;strong&gt;均衡主力 Qwen 3.6 Q5Hyb（见结论 3）&lt;/strong&gt;；要极致速度的大模型选 Nemotron（129 t/s）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;速度与能力要做好取舍&lt;/strong&gt;：大尺寸 MoE 已经同时给出 90+ 分和 100+ t/s，真正的取舍只存在于"极致速度（小模型 250 t/s+）"和"极致能力（93+ 分）"之间。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="7900XTX"/><category term="本地模型"/><category term="LLM"/><category term="Qwen3.6"/><category term="Qwen3.8"/><category term="Gemma4"/><category term="MoE"/><category term="BFCL"/><category term="量化"/><category term="GPT-3.5"/><category term="GPT-4o"/></entry><entry><title>Qwen3.6 vs Qwen3.8：27B 量化与去审查版本能力全对比，以及本地模型能不能替代 GPT-3.5</title><link href="https://blog.cycleuser.org/qwen36-vs-qwen3827b-liang-hua-yu-qu-shen-cha-ban-ben-neng-li-quan-dui-bi-yi-ji-ben-di-mo-xing-neng-bu-neng-ti-dai-gpt-35.html" rel="alternate"/><published>2026-08-19T16:00:00+08:00</published><updated>2026-08-19T16:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-19:/qwen36-vs-qwen3827b-liang-hua-yu-qu-shen-cha-ban-ben-neng-li-quan-dui-bi-yi-ji-ben-di-mo-xing-neng-bu-neng-ti-dai-gpt-35.html</id><summary type="html">&lt;p&gt;现在总有人说，本地部署模型可能越来越没必要了——在线模型那么便宜，调用一次没几个钱，何必自己折腾硬件。之前这话大 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;现在总有人说，本地部署模型可能越来越没必要了——在线模型那么便宜，调用一次没几个钱，何必自己折腾硬件。之前这话大体没错，但最近情况有点变化：有的在线模型突然涨价了。价格一涨，成本优势打了折扣，本地部署这事就又被拿出来讨论。&lt;/p&gt;
&lt;p&gt;而且现在的本地模型确实不是当年的水平了。今天能在自己机器上跑起来的开源模型，能力上可能已经超过了前些年令人非常惊艳的那些模型——当年的 GPT-3.5 刚出来的时候多轰动啊。所以这篇就把当年的 GPT-3.5、Qwen3.6 和最新的 Qwen3.8 拉到一起比一比。&lt;/p&gt;
&lt;p&gt;顺便也想澄清一个误区：不是最新的模型在所有场景下都比旧模型强。就拿工具调用来说，默认模板下 3.6 有时候的表现反而比 3.8 要好一些。版本号不见得就决定一切。&lt;/p&gt;
&lt;p&gt;先声明：这篇里所有的数据，都只是在我个人的设备的 7900xtx 24G 上跑出来的结果。环境是个例，样本量也小，不具有太多的参考意义，更不能代表模型的官方或普遍水平。&lt;/p&gt;
&lt;p&gt;之前写过 Qwen3.8-27B 从 f16 到 IQ1_S 的量化阶梯，那篇说的是部署和速度。这篇只聊能力：把手头 3.6 和 3.8 两代 27B 的各种量化版、去审查版拉出来，用 BFCL V4 工具调用和六个经典基准统一测一遍，再看看本地模型替代在线 API 这事到底靠不靠谱。&lt;/p&gt;
&lt;p&gt;先说结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单轮工具调用，默认模板下 3.6 反而比 3.8 强。3.6 官方 Q5hyb 拿到 89.44%，是全场最高，比 3.8 最好的配置高出 2.6 分以上。&lt;/li&gt;
&lt;li&gt;两个家族都全面追平或超过 GPT-3.5。七个维度没有一个落后的，HumanEval 甚至是 100 对 48.1。&lt;/li&gt;
&lt;li&gt;去审查不是免费的。3.6 的去审查版几乎无损（-0.21），3.8 的去审查版在"该不该调用工具"的判断上直接崩到 47.92%。&lt;/li&gt;
&lt;li&gt;多轮工具调用两个都不太理想，复杂的智能体流程费劲了，当然可能主要是显存有限，上下文没给够。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;一、测了什么，怎么测的&lt;/h2&gt;
&lt;p&gt;环境还是那套：llama.cpp 走 Vulkan，AMD 7900XTX 24G 主力。推理参数 &lt;code&gt;--temp 0&lt;/code&gt;，关闭思维链，保证结果可复现。这篇不谈速度，速度的事在量化阶梯那篇里已经说过了。&lt;/p&gt;
&lt;p&gt;受测的六个主力配置：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置&lt;/th&gt;
&lt;th&gt;体积&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3.6 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;17.0GB&lt;/td&gt;
&lt;td&gt;官方权重常规量化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.6 官方 Q5hyb&lt;/td&gt;
&lt;td&gt;19.4GB&lt;/td&gt;
&lt;td&gt;Q6/Q5 主体 + Q8_0 注意力 + Q8_0 MTP 的定制混合量化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.6 去审查 Q5hyb&lt;/td&gt;
&lt;td&gt;19.4GB&lt;/td&gt;
&lt;td&gt;huihui 微调 / Heretic 消融&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;16.8GB&lt;/td&gt;
&lt;td&gt;官方权重常规量化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 官方 Q5hyb&lt;/td&gt;
&lt;td&gt;20.6GB&lt;/td&gt;
&lt;td&gt;同上定制混合量化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 去审查 Q5hyb&lt;/td&gt;
&lt;td&gt;19.4GB&lt;/td&gt;
&lt;td&gt;huihui 微调 / Heretic 消融&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Q5hyb 是个什么东西&lt;/h3&gt;
&lt;p&gt;表格里反复出现 Q5hyb，值得单独说一下。这是我自己做的一个定制混合量化，名字就是 Q5 级混合（hybrid）的缩写。&lt;/p&gt;
&lt;p&gt;出发点很简单：Q4_K_M 够小，但质量上总觉得还能再往上够一档；可直接上 Q6_K、Q8_0 又太大——27B 的模型，Q8_0 要 27 GiB，24G 卡物理上装不下，Q6_K 也有 20.9 GiB，塞进去之后留给 KV cache 和上下文的空间就很紧了。那就别一刀切：不同的张量对精度的敏感度本来就不一样，分开给。&lt;/p&gt;
&lt;p&gt;设计思路一句话：好钢用在刀刃上。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;注意力部分保 Q8_0。注意力是整个模型里对精度最敏感的部分，Q/K/V 投影有点误差，模型"看到"的东西就变了，这块不能省。&lt;/li&gt;
&lt;li&gt;MTP 层也保 Q8_0。这层体积很小，但它是投机解码的草稿层，草稿质量直接决定接受率，也就是决定提速效果。保 Q8，质量速度两头都不亏。&lt;/li&gt;
&lt;li&gt;主干 FFN 用 Q6/Q5 混合。FFN 占的参数量最大，但对精度相对宽容，往下压一档，体积省得最明显。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;做法跟之前那篇里的 Q8SLIM 是同一个路子：llama-quantize 的 &lt;code&gt;--tensor-type&lt;/code&gt; 参数可以按张量名分别指定量化类型。&lt;/p&gt;
&lt;p&gt;出来的效果：3.8 的 Q5hyb 20.6GB，单张 24G 卡装下之后还有富余；3.6 的 Q5hyb 在这次测试里是全场总分第一的配置（BFCL 89.44%，MMLU、WinoGrande 也是第一）。&lt;/p&gt;
&lt;p&gt;测试分两块：&lt;/p&gt;
&lt;p&gt;一块是 BFCL V4，专门测工具调用（function calling）的，这是现在本地模型最被看重的能力之一。测了 Non-Live AST 七类、Live 真实 API、Multi-turn 多轮三部分。&lt;/p&gt;
&lt;p&gt;另一块是六个经典基准：MMLU（知识）、HumanEval（代码）、GSM8K（数学）、HellaSwag（常识）、ARC（科学推理）、WinoGrande（语义），每个采样 30 题，题面和评分复用之前的评测框架。&lt;/p&gt;
&lt;p&gt;GPT-3.5 的成绩全部来自公开文献：前六维取 GPT-4 Technical Report 的 Table 2（OpenAI 自己公布的），BFCL 取 ToolN1 ICLR'26 论文里 BFCL V4 2025-04-13 快照的数据。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二、BFCL V4：3.6 全面压过 3.8&lt;/h2&gt;
&lt;h3&gt;2.1 Non-Live AST 总览&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;Non-Live AST&lt;/th&gt;
&lt;th&gt;vs GPT-3.5&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3.6 官方 Q5hyb&lt;/td&gt;
&lt;td&gt;89.44%&lt;/td&gt;
&lt;td&gt;+11.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.6 去审查 Q5hyb&lt;/td&gt;
&lt;td&gt;89.23%&lt;/td&gt;
&lt;td&gt;+11.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.6 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;88.27%&lt;/td&gt;
&lt;td&gt;+10.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 去审查 Q5hyb&lt;/td&gt;
&lt;td&gt;86.81%&lt;/td&gt;
&lt;td&gt;+8.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;86.00%&lt;/td&gt;
&lt;td&gt;+8.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 官方 Q5hyb&lt;/td&gt;
&lt;td&gt;85.08%&lt;/td&gt;
&lt;td&gt;+7.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;参照线：GPT-3.5-Turbo-0125 的 BFCL V4 Non-Live Overall 约 78.0%。也就是说，这六个本地量化版里最"差"的一个，也比 GPT-3.5 高 7 个点。再提醒一句：这只是我个人设备上跑出来的结果，不具有太多参考意义。&lt;/p&gt;
&lt;p&gt;&lt;img alt="BFCL Non-Live AST（含 GPT-3.5 参照线）" src="../images/bfcl_qwen36-38_vs_gpt35.png"&gt;&lt;/p&gt;
&lt;h3&gt;2.2 拆开看：输在哪，赢在哪&lt;/h3&gt;
&lt;p&gt;总分只是一个数，拆开按类别看才有意思：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;3.6 家族&lt;/th&gt;
&lt;th&gt;3.8 家族&lt;/th&gt;
&lt;th&gt;谁赢&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;simple_python&lt;/td&gt;
&lt;td&gt;95.75~96.25&lt;/td&gt;
&lt;td&gt;96.25~97.0&lt;/td&gt;
&lt;td&gt;3.8 略胜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;simple_java&lt;/td&gt;
&lt;td&gt;63~65&lt;/td&gt;
&lt;td&gt;65~66&lt;/td&gt;
&lt;td&gt;半斤八两&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;simple_javascript&lt;/td&gt;
&lt;td&gt;74~76&lt;/td&gt;
&lt;td&gt;70~78&lt;/td&gt;
&lt;td&gt;半斤八两&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multiple（多函数选一）&lt;/td&gt;
&lt;td&gt;94.0~95.0&lt;/td&gt;
&lt;td&gt;96.5&lt;/td&gt;
&lt;td&gt;3.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;parallel（并行调用）&lt;/td&gt;
&lt;td&gt;90.5~92.0&lt;/td&gt;
&lt;td&gt;81.0~90.5&lt;/td&gt;
&lt;td&gt;3.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;parallel_multiple&lt;/td&gt;
&lt;td&gt;91.0~92.5&lt;/td&gt;
&lt;td&gt;79.0~84.0&lt;/td&gt;
&lt;td&gt;3.6 明显&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;irrelevance（识别无可用函数）&lt;/td&gt;
&lt;td&gt;90.0（全员）&lt;/td&gt;
&lt;td&gt;70.4~76.7&lt;/td&gt;
&lt;td&gt;3.6 明显&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;规律很清楚：单次调用、从一堆函数里挑一个这种"简单活"，3.8 做得稍好；一旦要一次并行调多个函数，或者要判断"这个请求根本没有合适的函数、应该拒绝调用"，3.6 的优势就出来了，parallel_multiple 上差了将近 10 个点。&lt;/p&gt;
&lt;p&gt;irrelevance 这一项值得单独说。它测的是模型会不会"没活硬干"——给一个和所有函数都不沾边的请求，看模型是老实说没有合适工具，还是硬编一个调用出来。3.6 所有版本都稳在 90%，3.8 官方版本只有 70 出头。这个能力在真实 agent 场景里很要命：工具列表一大，模型要是见什么都想调，整个流程就会被幻觉调用带偏。&lt;/p&gt;
&lt;h3&gt;2.3 Live 与 Multi-turn&lt;/h3&gt;
&lt;p&gt;Live（真实 API 子集）只有 Q4 系列跑了完整数据：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;Live Overall&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3.6 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;82.16%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 Q4_K_REC v22&lt;/td&gt;
&lt;td&gt;82.16%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;81.72%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 Q4_K_REC&lt;/td&gt;
&lt;td&gt;80.98%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Live 上两家基本打平，差不到半个点。顺带一提，3.8 还有两个 Q4_K_REC 变体配置也跑了，成绩都在 80.98~82.16 这个区间里，和官方 Q4_K_M 没有本质区别。&lt;/p&gt;
&lt;p&gt;Multi-turn 就没什么好说的了，全员拉胯：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;Multi-turn Overall&lt;/th&gt;
&lt;th&gt;Base 子项&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3.6 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;18.50%&lt;/td&gt;
&lt;td&gt;74.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;17.25%&lt;/td&gt;
&lt;td&gt;69.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 Q4_K_REC&lt;/td&gt;
&lt;td&gt;16.25%&lt;/td&gt;
&lt;td&gt;65.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;多轮工具调用要求模型在状态不断变化、函数缺失、参数缺失的情况下持续做正确决策，18% 这种成绩说明两代模型离"可靠的 agent 大脑"都还有距离。这点后面讨论替代在线模型时还要提。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;三、七维能力雷达 vs GPT-3.5&lt;/h2&gt;
&lt;p&gt;六个基准加 BFCL，凑七个维度：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;MMLU&lt;/th&gt;
&lt;th&gt;HumanEval&lt;/th&gt;
&lt;th&gt;GSM8K&lt;/th&gt;
&lt;th&gt;HellaSwag&lt;/th&gt;
&lt;th&gt;ARC&lt;/th&gt;
&lt;th&gt;WinoGrande&lt;/th&gt;
&lt;th&gt;BFCL&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3.6 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;88.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3.6 官方 Q5hyb&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;73.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.7&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89.4&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.6 去审查 Q5hyb&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;93.3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;80.0&lt;/td&gt;
&lt;td&gt;89.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 官方 Q4_K_M&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;86.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 官方 Q5hyb&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;96.7&lt;/td&gt;
&lt;td&gt;90.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;85.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.8 去审查 Q5hyb&lt;/td&gt;
&lt;td&gt;66.7&lt;/td&gt;
&lt;td&gt;100.0&lt;/td&gt;
&lt;td&gt;93.3&lt;/td&gt;
&lt;td&gt;86.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;86.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-3.5-Turbo&lt;/td&gt;
&lt;td&gt;70.0&lt;/td&gt;
&lt;td&gt;48.1&lt;/td&gt;
&lt;td&gt;57.1&lt;/td&gt;
&lt;td&gt;85.5&lt;/td&gt;
&lt;td&gt;85.2&lt;/td&gt;
&lt;td&gt;81.6&lt;/td&gt;
&lt;td&gt;78.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img alt="3.6 vs 3.8 七维能力雷达（含 GPT-3.5 参照）" src="../images/radar_qwen36-38_vs_gpt35.png"&gt;&lt;/p&gt;
&lt;p&gt;几个要点：&lt;/p&gt;
&lt;p&gt;全部六个量化版在七个维度上没有一个低于 GPT-3.5 的。差距最大的是 HumanEval，100 对 48.1——当然这里要说明，30 题的 HumanEval 子集全对，和官方 164 题全量不是一回事，但起码说明代码生成这块，本地 27B 量化版完全不虚三年前的 GPT-3.5。GSM8K 同理，93.3~100 对 57.1。&lt;/p&gt;
&lt;p&gt;最接近的是 MMLU，66.7~73.3 对 70.0，基本持平。知识面这种东西跟参数规模和训练数据强相关，追平就是追平，没什么可吹的，也没输。&lt;/p&gt;
&lt;p&gt;3.6 官方 Q5hyb 是全场唯一在多数维度领先的配置，MMLU、WinoGrande、BFCL 三项第一。3.8 家族则在 ARC 上全员满分。&lt;/p&gt;
&lt;p&gt;由于时间有限，所以每维只有 30 题，统计方差大约 ±9%，维度之间 5 分以内的差异不具备显著性。HumanEval 和 GSM8K 又都摸到了满分天花板，区分度为零。所以这张雷达图能说明"追平并超过 GPT-3.5"这个定性结论，但应该是不能拿小数点做严格比较。而且这一切都只是在我个人的设备上、用我这套环境跑出来的，换个环境未必是这个样子，参考意义有限。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;四、3.6 对 3.8：同门对决&lt;/h2&gt;
&lt;p&gt;把两代模型的差异单独拎出来：&lt;/p&gt;
&lt;p&gt;3.6 赢的地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;BFCL Non-Live 总分，89.44 对 85.08~86.81，全场前三被 3.6 家族包揽。&lt;/li&gt;
&lt;li&gt;并行调用（parallel、parallel_multiple），这是真实工作流里最常见的模式。&lt;/li&gt;
&lt;li&gt;irrelevance 检测，90 对 70 出头，质的差距。&lt;/li&gt;
&lt;li&gt;WinoGrande 和 MMLU（Q5hyb 配置下）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3.8 赢的地方：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;multiple 单选，96.5 对 94~95。&lt;/li&gt;
&lt;li&gt;simple_python / simple_java 单函数调用，略高。&lt;/li&gt;
&lt;li&gt;ARC 满分对 93.3。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;量化敏感度的方向也不一样：3.6 是 Q5hyb 比 Q4_K_M 好（89.44 对 88.27），3.8 反而 Q4_K_M 比 Q5hyb 略好（86.00 对 85.08）。这个反向差异在 ±9% 的样本方差里未必站得住，但至少说明两代模型对量化方式的响应不一样，不能拿着一代的经验直接套另一代。&lt;/p&gt;
&lt;p&gt;总的判断：这次测试用的是默认模板。在默认模板下，如果你的主要用途是工具调用、agent 类任务，3.6 有时候的表现反而比最新的 3.8 要好，而且不是险胜；3.8 的优势集中在单函数调用和科学推理这种单点能力上。所以别迷信版本号，不是最新的模型在所有场景下都比旧模型强——这代 3.8 在 BFCL 上就是实打实的退步。当然，这也只是我个人设备上的结果，仅供参考。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;五、去审查的代价：两家完全不一样&lt;/h2&gt;
&lt;p&gt;去审查（去对齐）版本是本地社区的特色需求。这次测的两个去审查版，走的是 huihui 微调和 Heretic 消融的路子。结果非常有意思：&lt;/p&gt;
&lt;p&gt;3.6 去审查版：BFCL 89.23，比官方版 89.44 只低 0.21，irrelevance 检测保持 90%，七个基准维度的波动全在方差范围内。可以说能力基本无损。&lt;/p&gt;
&lt;p&gt;3.8 去审查版：BFCL 总分 86.81，看着甚至比官方 Q5hyb 的 85.08 还高一点，但拆开看就露馅了——irrelevance 检测从 70 多直接掉到 47.92%，腰斩都不止。也就是说，去审查之后的 3.8 变得"特别乐于助人"：不管请求跟工具沾不沾边，都倾向于调用一个函数试试。multiple、parallel 这些类别它甚至还略有提升，但"该拒绝时拒绝"的能力基本丢了。&lt;/p&gt;
&lt;p&gt;这个对比说明一件事：去审查对能力的影响不是个固定的"损耗百分比"，它取决于对齐微调动的是哪块。3.6 的去对齐做得干净，3.8 的去对齐把工具调用的边界感也一起消融掉了。选去审查版本之前，最好先想清楚自己要的是什么——如果是拿来跑 agent，一个不会拒绝的模型可能比一个偶尔拒绝的模型更危险。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;六、本地模型能不能替代在线模型&lt;/h2&gt;
&lt;p&gt;这是绕不开的问题。先限定讨论范围：这里的"在线模型"参照是 GPT-3.5-Turbo，也就是 2023 年初的水平，很多 API 场景至今还在用的那个档次。&lt;/p&gt;
&lt;p&gt;从这次的数据看，替代是成立的：&lt;/p&gt;
&lt;p&gt;七个能力维度全部追平或超过，工具调用超出 7~11 个点。对于"调 API 做单轮任务"这类需求——翻译、抽取、格式转换、单函数工具调用——本地 27B 量化版给出的质量不低于 GPT-3.5 档次的在线服务，而且数据不出本地、零调用成本、断网也能跑。数据敏感的场景里，这本身就是决定性的优势。&lt;/p&gt;
&lt;p&gt;但有三条边界要说清楚：&lt;/p&gt;
&lt;p&gt;第一，GPT-3.5 是个三年前的靶子。赢了它也远不能比现在的旗舰在线模型，都不用说那些闭源的，就连开源的GLM5.3、DeepSeek V4 等等更大规模参数的开源在线模型的推理和长文本能力，本地这种 27B 的小模型也还差得远。&lt;/p&gt;
&lt;p&gt;第二，多轮是硬伤。Multi-turn 18% 的成绩意味着"模型自己规划、连续多轮调工具、处理异常"这种复杂 agent 流程，我这台设备上用当前的参数恐怕目前撑不起来。这类任务要么继续用在线旗舰模型，要么自己在框架层做大量兜底。&lt;/p&gt;
&lt;p&gt;第三，样本量的限制。30 题的基准只能给出定性结论，真要下"全面替代"的判断，得上全量测试。这篇的结论是"能力上够格"，不是"统计上严格证明"。&lt;/p&gt;
&lt;p&gt;第四，也是最根本的一条：以上所有数字都只是在我个人的设备上跑出来的，不具有太多参考意义。替代成立与否，最终要在你自己的环境里验证。&lt;/p&gt;
&lt;p&gt;不过，总体来看，本地模型好歹也达到替代 GPT-3.5 的能力了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;七、总结一下&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;工具调用选 3.6，官方 Q5hyb 是全场最佳配置，89.44%。&lt;/li&gt;
&lt;li&gt;3.8 在单函数调用和 ARC 上有优势，但 BFCL 总分对 3.6 是退步。&lt;/li&gt;
&lt;li&gt;对 GPT-3.5：七维全胜或持平，本地替代在单轮任务上成立。&lt;/li&gt;
&lt;li&gt;去审查：3.6 几乎无损，3.8 的 irrelevance 检测崩到 47.92%，选之前想清楚。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后再强调一遍：以上所有数据都只是在我个人的设备上跑出来的结果，不具有太多参考意义，看个思路就好。&lt;/p&gt;</content><category term="LLM"/><category term="Qwen3.6"/><category term="Qwen3.8"/><category term="GGUF"/><category term="量化"/><category term="去审查"/><category term="BFCL"/><category term="GPT-3.5"/><category term="本地模型"/><category term="llama.cpp"/></entry><entry><title>2026年的本地小模型 vs 2023年的GPT-3.5：6个基准60题的全面对比</title><link href="https://blog.cycleuser.org/2026nian-de-ben-di-xiao-mo-xing-vs-2023nian-de-gpt-356ge-ji-zhun-60ti-de-quan-mian-dui-bi.html" rel="alternate"/><published>2026-08-19T10:00:00+08:00</published><updated>2026-08-19T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-19:/2026nian-de-ben-di-xiao-mo-xing-vs-2023nian-de-gpt-356ge-ji-zhun-60ti-de-quan-mian-dui-bi.html</id><summary type="html">&lt;p&gt;总有人说本地模型没意义。这种考量如果只从自己的需求出发，可能过于武断，甚至有些自大。不同的人、不同的场景，有不同 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;总有人说本地模型没意义。这种考量如果只从自己的需求出发，可能过于武断，甚至有些自大。不同的人、不同的场景，有不同的模型需求。以翻译和转换为例，速度有的时候不是第一要务，而可靠性和从知识库检索后转换翻译的质量可能更重要。在数据敏感的场景下，本地模型虽然速度不一定最快，但能保证数据不出本地，这本身就是很大的价值。有本地搭建需求的场景，也不应该被轻易否定。&lt;/p&gt;
&lt;p&gt;所以作为理性的人，不能轻易否定其他人的选择和需求，不能无端地说速度或者参数规模要超过某个数值以上的才有用、低于某个数值就不能用。甚至上下文范围也不能说一定得大于某个值才行——有的工具调用不需要特别大的上下文，反而需要比较靠谱的工具调用能力对代码进行优化；有的模型就是为此而生的。&lt;/p&gt;
&lt;p&gt;一个开阔豁达的人，不要为了自己赢或者秀优越而去争论什么，那样很不体面。&lt;/p&gt;
&lt;p&gt;之前关于速度的部分已经在别的文章里提到过，这篇就不说速度，只关注一件事：现在这些在本地处理器上就能运行的小模型，和当年的 GPT-3.5 相比，能不能达到那个表现。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;评测基准&lt;/h2&gt;
&lt;p&gt;选了有代表性的 6 个基准，覆盖知识、代码、数学、推理四个维度。GPT-3.5 的成绩来自 GPT-4 技术报告 Table 2（arXiv:2303.08774），是 OpenAI 自己公布的。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;基准&lt;/th&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;GPT-3.5 成绩&lt;/th&gt;
&lt;th&gt;测试方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MMLU&lt;/td&gt;
&lt;td&gt;多任务知识&lt;/td&gt;
&lt;td&gt;70.0%&lt;/td&gt;
&lt;td&gt;5-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval&lt;/td&gt;
&lt;td&gt;代码生成&lt;/td&gt;
&lt;td&gt;48.1%&lt;/td&gt;
&lt;td&gt;pass@1, 0-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM8K&lt;/td&gt;
&lt;td&gt;小学数学&lt;/td&gt;
&lt;td&gt;57.1%&lt;/td&gt;
&lt;td&gt;5-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HellaSwag&lt;/td&gt;
&lt;td&gt;常识推理&lt;/td&gt;
&lt;td&gt;85.5%&lt;/td&gt;
&lt;td&gt;10-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARC&lt;/td&gt;
&lt;td&gt;科学推理&lt;/td&gt;
&lt;td&gt;85.2%&lt;/td&gt;
&lt;td&gt;25-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WinoGrande&lt;/td&gt;
&lt;td&gt;语义推理&lt;/td&gt;
&lt;td&gt;81.6%&lt;/td&gt;
&lt;td&gt;5-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;数据集都是公开的：MMLU 来自 HuggingFace（14042 题），HumanEval 来自 GitHub openai/human-eval（164 题），GSM8K 来自 GitHub openai/grade-school-math（1319 题），HellaSwag 来自 GitHub rowanz/hellaswag（10042 题），ARC 来自 HuggingFace allenai/ai2_arc（1119 题），WinoGrande 来自 HuggingFace allenai/winogrande（40398 题）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;受测模型&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;大小&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:9b&lt;/td&gt;
&lt;td&gt;8.9 GB&lt;/td&gt;
&lt;td&gt;本次实验中最大的本地模型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;carstenuhlig/omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;5.7 GB&lt;/td&gt;
&lt;td&gt;代码专用模型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;td&gt;1GB 级别通用模型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking:latest&lt;/td&gt;
&lt;td&gt;697 MB&lt;/td&gt;
&lt;td&gt;带思维链的混合架构&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;349 MB&lt;/td&gt;
&lt;td&gt;IBM 混合架构，1M 上下文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiquidAI/lfm2.5-350m&lt;/td&gt;
&lt;td&gt;379 MB&lt;/td&gt;
&lt;td&gt;Spark Arena 速度榜首&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;拉取命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:9b
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;carstenuhlig/omnicoder-2-9b
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:0.8b
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;lfm2.5-thinking:latest
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;granite4:350m-h
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;LiquidAI/lfm2.5-350m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2&gt;评测方法&lt;/h2&gt;
&lt;p&gt;每个基准从完整数据集中均匀采样 60 题。为什么不用全量？因为时间有限，而且也没那个必要——60 道题足够有代表性了。采样时按学科或类别均匀分布，避免偏科。所有模型用同样的 60 道题，temperature=0，确保结果可比。&lt;/p&gt;
&lt;p&gt;每道题的模型原始回答完整存储下来，然后离线评分。评分时先清理思维链前缀（有些模型会先输出一大段思考过程再给答案），再从清理后的文本中用多种策略提取答案——先找结构化标记，再找关键词模式，最后从文本末尾回溯。这样不会因为某个模型的输出格式特殊就丢分。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;结果&lt;/h2&gt;
&lt;p&gt;&lt;img alt="雷达图：本地小模型 vs GPT-3.5 六维度对比" src="../images/radar_vs_gpt35.png"&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;大小&lt;/th&gt;
&lt;th&gt;MMLU&lt;/th&gt;
&lt;th&gt;HumanEval&lt;/th&gt;
&lt;th&gt;GSM8K&lt;/th&gt;
&lt;th&gt;HellaSwag&lt;/th&gt;
&lt;th&gt;ARC&lt;/th&gt;
&lt;th&gt;WinoGrande&lt;/th&gt;
&lt;th&gt;平均比值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPT-3.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;70.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48.1%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;57.1%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85.5%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85.2%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:9b&lt;/td&gt;
&lt;td&gt;8.9 GB&lt;/td&gt;
&lt;td&gt;63.2% (90%)&lt;/td&gt;
&lt;td&gt;55.0% (114%)&lt;/td&gt;
&lt;td&gt;91.7% (161%)&lt;/td&gt;
&lt;td&gt;76.7% (90%)&lt;/td&gt;
&lt;td&gt;86.7% (102%)&lt;/td&gt;
&lt;td&gt;91.7% (112%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;95%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;5.7 GB&lt;/td&gt;
&lt;td&gt;19.3% (28%)&lt;/td&gt;
&lt;td&gt;90.0% (187%)&lt;/td&gt;
&lt;td&gt;70.0% (123%)&lt;/td&gt;
&lt;td&gt;28.3% (33%)&lt;/td&gt;
&lt;td&gt;26.7% (31%)&lt;/td&gt;
&lt;td&gt;46.7% (57%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;76%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;349 MB&lt;/td&gt;
&lt;td&gt;42.1% (60%)&lt;/td&gt;
&lt;td&gt;60.0% (125%)&lt;/td&gt;
&lt;td&gt;21.7% (38%)&lt;/td&gt;
&lt;td&gt;28.3% (33%)&lt;/td&gt;
&lt;td&gt;21.7% (25%)&lt;/td&gt;
&lt;td&gt;56.7% (69%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;58%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;td&gt;15.8% (23%)&lt;/td&gt;
&lt;td&gt;43.3% (90%)&lt;/td&gt;
&lt;td&gt;56.7% (99%)&lt;/td&gt;
&lt;td&gt;30.0% (35%)&lt;/td&gt;
&lt;td&gt;60.0% (70%)&lt;/td&gt;
&lt;td&gt;40.0% (49%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;51%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;697 MB&lt;/td&gt;
&lt;td&gt;31.6% (45%)&lt;/td&gt;
&lt;td&gt;25.0% (52%)&lt;/td&gt;
&lt;td&gt;41.7% (73%)&lt;/td&gt;
&lt;td&gt;30.0% (35%)&lt;/td&gt;
&lt;td&gt;15.0% (18%)&lt;/td&gt;
&lt;td&gt;40.0% (49%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-350m&lt;/td&gt;
&lt;td&gt;379 MB&lt;/td&gt;
&lt;td&gt;28.1% (40%)&lt;/td&gt;
&lt;td&gt;13.3% (28%)&lt;/td&gt;
&lt;td&gt;10.0% (18%)&lt;/td&gt;
&lt;td&gt;26.7% (31%)&lt;/td&gt;
&lt;td&gt;48.3% (57%)&lt;/td&gt;
&lt;td&gt;38.3% (47%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;37%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;括号内为相对 GPT-3.5 的能力比值。平均比值为六维度比值的算术平均。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;各模型表现&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;qwen3.5:9b — 已全面追平 GPT-3.5（平均 95%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;四个维度超过 GPT-3.5：GSM8K 91.7% vs 57.1%，HumanEval 55.0% vs 48.1%，ARC 86.7% vs 85.2%，WinoGrande 91.7% vs 81.6%。MMLU 63.2% 略低于 70.0%，HellaSwag 76.7% 略低于 85.5%。如果 2023 年 GPT-3.5 是标杆，那这个模型在 2026 年已经把它追平了，而且是本地免费跑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;omnicoder-2-9b — 代码和数学暴打 GPT-3.5，通用知识几乎为零（平均 76%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HumanEval 90.0% 对 GPT-3.5 的 48.1% 是 187%，GSM8K 70.0% 对 57.1% 是 123%。但 MMLU 只有 19.3%，HellaSwag 28.3%，ARC 26.7%——典型的代码专用模型，非代码任务能力塌方。拿它写代码很好，拿它做选择题就别指望了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;granite4:350m-h — 349MB 做到 GPT-3.5 的 58%（平均）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HumanEval 60.0% 超过 GPT-3.5 的 48.1%，WinoGrande 56.7% 达到 69%。但数学只有 21.7%，常识推理 28.3%。体积小、速度快、代码能力突出，适合边缘部署。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;qwen3.5:0.8b — 1GB 级别最均衡（平均 51%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GSM8K 56.7% 几乎追平 GPT-3.5 的 57.1%，ARC 60.0% 达到 70%，HumanEval 43.3% 达到 90%。MMLU 偏低（15.8%），但其他维度都在 GPT-3.5 的一半以上。1GB 以内的模型里它最接近 GPT-3.5。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lfm2.5-thinking — 思维链在数学上有用，但拖累代码（平均 45%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GSM8K 41.7% 是几个小模型里相对较好的，思维链确实帮助了数学推理。但 HumanEval 只有 25.0%——思维链输出太长，干扰了代码补全。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lfm2.5-350m — 最轻量但能力有限（平均 37%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;379MB 体积最小，能力也最低。GSM8K 只有 10.0%，HumanEval 13.3%。不过 ARC 48.3% 达到了 GPT-3.5 的 57%。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;关键发现&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;体积差 25 倍，能力差不到 2 倍。&lt;/strong&gt; 以 GPT-3.5 位参考，granite4:350m-h（349MB）平均 58%，qwen3.5:9b（8.9GB）平均 95%。体积差了 25 倍，能力差不到 2 倍。小模型的性价比远超直觉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码能力超越 GPT-3.5 的门槛最低。&lt;/strong&gt; granite4:350m-h 的 HumanEval 60% 就超过了 GPT-3.5 的 48.1%。一个 349MB 的模型在代码生成上赢了当初震惊世界的 GPT-3.5。代码生成是这些小模型最容易"以小博大"的维度——可能是因为代码训练数据质量高、模式重复性强，而且当年的 GPT-3.5 可能代码能力也还没有太擅长。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;数学能力两极分化。&lt;/strong&gt; qwen3.5:9b 的 GSM8K 91.7% 远超 GPT-3.5，但 lfm2.5-350m 只有 10.0%。数学推理对模型参数量的要求看来是比代码更高——小模型要么懂、要么完全不懂，中间地带很窄。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;通用知识（MMLU）是最难追平的维度。&lt;/strong&gt; 除了 qwen3.5:9b（63.2%），其他模型都在 42% 以下。MMLU 覆盖 57 个学科，需要广泛的知识储备，这是小模型的天然短板——参数量小意味着能记住的东西可能确实是少了很多了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;专用模型的偏科现象最极端。&lt;/strong&gt; omnicoder 的代码 187%、数学 123%，但 MMLU 28%、HellaSwag 33%。专用模型在训练时牺牲了通用能力来强化特定领域，使用时必须清楚它的边界。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结一下&lt;/h2&gt;
&lt;p&gt;不同方向、不同领域上，这几个模型各有各的表现。有的虽然模型体积小，但已经达到 GPT-3.5 的很大比例了，非常优秀，只不过速度稍微慢一点；有的虽然速度快，但准确率有差距。各有各的合适场景，设计好自己的需求再选型就好了。&lt;/p&gt;
&lt;p&gt;越是四处去炫耀自己厉害的，恐怕往往越未必有那么厉害。&lt;/p&gt;
&lt;p&gt;现在看不上本地模型的人，当年或许也曾经为GPT-3.5而赞叹过。&lt;/p&gt;</content><category term="LLM"/><category term="GPT-3.5"/><category term="小模型"/><category term="MMLU"/><category term="HumanEval"/><category term="GSM8K"/><category term="HellaSwag"/><category term="ARC"/><category term="WinoGrande"/><category term="本地部署"/></entry><entry><title>Qwen3.8:27B 本地部署：从 52G 的 f16 到 7G 的 IQ1_S阶梯量化实测，AMD的7900XTX 24G和 NVIDIA的4070 8G都跑一遍</title><link href="https://blog.cycleuser.org/qwen3827b-ben-di-bu-shu-cong-52g-de-f16-dao-7g-de-iq1_sjie-ti-liang-hua-shi-ce-amdde-7900xtx-24ghe-nvidiade-4070-8gdu-pao-yi-bian.html" rel="alternate"/><published>2026-08-15T15:00:00+08:00</published><updated>2026-08-15T15:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-15:/qwen3827b-ben-di-bu-shu-cong-52g-de-f16-dao-7g-de-iq1_sjie-ti-liang-hua-shi-ce-amdde-7900xtx-24ghe-nvidiade-4070-8gdu-pao-yi-bian.html</id><summary type="html">&lt;p&gt;先说结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;24G 卡追求质量&lt;/strong&gt;：Q8SLIM，22.3 GiB 全进显存，29 tok/s，这是 7900XTX 上能摸到的最高参数规格。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;24G 卡追求速度&lt;/strong&gt;：IQ4_XS，39.6 tok/s，质量验证 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;先说结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;24G 卡追求质量&lt;/strong&gt;：Q8SLIM，22.3 GiB 全进显存，29 tok/s，这是 7900XTX 上能摸到的最高参数规格。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;24G 卡追求速度&lt;/strong&gt;：IQ4_XS，39.6 tok/s，质量验证全过，日常用体感和 Q4_K_M 没区别。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;质量底线&lt;/strong&gt;：IQ2_XXS（8.1 GiB），再往下 IQ1_S 数学就崩了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8G 卡&lt;/strong&gt;：27B 纯属超纲，IQ1_S 能跑但别指望质量，真想跑 27B 老老实实上 16G 以上显存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MTP 必开&lt;/strong&gt;：特别是部分卸载场景，65% 的提速不要白不要。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;现在开源模型更新得太快了，前脚刚把一个 27B 玩明白，后脚新版又出来了。这回看上的是 ModelScope 上面的 Qwen3.8-27B。这个模型有点意思：它是多模态架构，官方标识的 model_type 是 qwen3_5，内部结构是 linear_attention 和 full_attention 交替混搭的，一共 64 层主干，外带一层 MTP（Multi-Token Prediction，多 token 预测）。而且它原生就带了 MTP 权重，这对后面提速很关键，咱后面细说。&lt;/p&gt;
&lt;p&gt;手头两块卡：一块 AMD 7900XTX，24G 显存；一块 NVIDIA RTX 4070，8G 显存。这回就把这个模型从 f16 一路量化到 IQ1_S，十三个版本全做出来，每个都验证 MTP 层还在不在，大于 8G 的挨个在 7900XTX 上跑，小于 8G 的丢给 4070，速度和答案正确性都验一遍。下面把整个流程和坑都摊开讲讲。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;一、先把模型弄下来&lt;/h2&gt;
&lt;p&gt;模型地址是 &lt;a href="https://modelscope.cn/models/Qwen/Qwen3.8-27B"&gt;https://modelscope.cn/models/Qwen/Qwen3.8-27B&lt;/a&gt;，下载直接走 ModelScope 是最省事的，用它的 SDK 就行。这里我下载的路径在 &lt;code&gt;C:/Users/frede/models/Qwen3.8-27B&lt;/code&gt;，后面代码示范都是这个目录。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;modelscope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;snapshot_download&lt;/span&gt;
&lt;span class="n"&gt;snapshot_download&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Qwen/Qwen3.8-27B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;local_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;C:/Users/frede/models/Qwen3.8-27B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;原始权重是 18 个 safetensors 分片，总共 52G 左右，下了差不多四个小时。这里提醒一句，网络不稳的话别用多线程下载器硬抢，单线程流式反而稳，断了能接着续。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二、转成 GGUF&lt;/h2&gt;
&lt;p&gt;llama.cpp 的转换脚本直接用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python&lt;span class="w"&gt; &lt;/span&gt;convert_hf_to_gguf.py&lt;span class="w"&gt; &lt;/span&gt;C:/Users/frede/models/Qwen3.8-27B&lt;span class="w"&gt; &lt;/span&gt;--outtype&lt;span class="w"&gt; &lt;/span&gt;f16&lt;span class="w"&gt; &lt;/span&gt;--outfile&lt;span class="w"&gt; &lt;/span&gt;Qwen3.8-27B-f16.gguf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;出来一个 50.9 GiB 的 f16 GGUF，866 个张量。这里有个值得注意的点：转换完之后我专门检查了一下张量列表，发现 &lt;code&gt;blk.64.nextn.*&lt;/code&gt; 这一组的四个张量都在——这就是 MTP 层，第 65 层（编号 64）专门用来预测未来 token 的。转换脚本没有把它扔掉，这意味着后面所有量化版本理论上都能保留投机解码的能力。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;三、量化阶梯：一口气做十三个&lt;/h2&gt;
&lt;p&gt;量化用 llama-quantize，普通 K 系量化（Q8_0、Q6_K、Q5_K_M、Q4_K_M、Q3_K_M）直接从 f16 转就行。但 IQ 系列（IQ4_XS、IQ3_XS、IQ2_M、IQ2_XS、IQ2_XXS、IQ1_S）不一样，它们是重要性矩阵量化，必须先算 imatrix。&lt;/p&gt;
&lt;p&gt;算 imatrix 得有校准语料。我把自己博客上三百七十篇文章拼在一起，凑了 2MB 的 calib.txt，肥水不流外人田，用自己的语料校准自己的模型，语义分布也对付了。这里参考意义就不大了，大家到时候自行探索。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 先用 Q5_K_M 跑 imatrix（256 个 chunk）&lt;/span&gt;
llama-imatrix&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;Qwen3.8-27B-Q5_K_M.gguf&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;calib.txt&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;imatrix.gguf&lt;span class="w"&gt; &lt;/span&gt;-ngl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;512&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-b&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;256&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--chunks&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;256&lt;/span&gt;

&lt;span class="c1"&gt;# 带 imatrix 的量化&lt;/span&gt;
llama-quantize&lt;span class="w"&gt; &lt;/span&gt;--imatrix&lt;span class="w"&gt; &lt;/span&gt;imatrix.gguf&lt;span class="w"&gt; &lt;/span&gt;Qwen3.8-27B-f16.gguf&lt;span class="w"&gt; &lt;/span&gt;Qwen3.8-27B-IQ4_XS.gguf&lt;span class="w"&gt; &lt;/span&gt;IQ4_XS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;最后做出来的完整阶梯长这样（全部验证过包含 MTP 层）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;量化版本&lt;/th&gt;
&lt;th&gt;体积&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;f16&lt;/td&gt;
&lt;td&gt;50.9 GiB&lt;/td&gt;
&lt;td&gt;源文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;27.0 GiB&lt;/td&gt;
&lt;td&gt;8.50 BPW，超过 24G 显存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q8SLIM&lt;/td&gt;
&lt;td&gt;22.3 GiB&lt;/td&gt;
&lt;td&gt;混合量化，见下文&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q6_K&lt;/td&gt;
&lt;td&gt;20.9 GiB&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5_K_M&lt;/td&gt;
&lt;td&gt;18.2 GiB&lt;/td&gt;
&lt;td&gt;5.72 BPW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;15.7 GiB&lt;/td&gt;
&lt;td&gt;4.92 BPW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ4_XS&lt;/td&gt;
&lt;td&gt;14.3 GiB&lt;/td&gt;
&lt;td&gt;imatrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q3_K_M&lt;/td&gt;
&lt;td&gt;12.6 GiB&lt;/td&gt;
&lt;td&gt;3.95 BPW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ3_XS&lt;/td&gt;
&lt;td&gt;11.4 GiB&lt;/td&gt;
&lt;td&gt;imatrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ2_M&lt;/td&gt;
&lt;td&gt;9.5 GiB&lt;/td&gt;
&lt;td&gt;imatrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ2_XS&lt;/td&gt;
&lt;td&gt;8.7 GiB&lt;/td&gt;
&lt;td&gt;imatrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ2_XXS&lt;/td&gt;
&lt;td&gt;8.1 GiB&lt;/td&gt;
&lt;td&gt;imatrix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ1_S&lt;/td&gt;
&lt;td&gt;6.9 GiB&lt;/td&gt;
&lt;td&gt;imatrix&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;IQ1/IQ2 的一个坑&lt;/h3&gt;
&lt;p&gt;第一次做 IQ2 和 IQ1 的时候直接报错退出，提示缺少重要性矩阵。查了半天才发现根因：算 imatrix 的时候模型是普通模式跑的，MTP 那层（blk.64）根本没被执行过，所以 imatrix 里没有它的数据。而 IQ1、IQ2 这种极低比特量化是强制要求每个张量都有重要性数据的，没有就罢工。&lt;/p&gt;
&lt;p&gt;解法很简单，把 blk.64 单独指成 Q4_K，K 系量化不需要 imatrix：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llama-quantize&lt;span class="w"&gt; &lt;/span&gt;--imatrix&lt;span class="w"&gt; &lt;/span&gt;imatrix.gguf&lt;span class="w"&gt; &lt;/span&gt;--tensor-type&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;blk.64=Q4_K&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;f16.gguf&lt;span class="w"&gt; &lt;/span&gt;out-IQ1_S.gguf&lt;span class="w"&gt; &lt;/span&gt;IQ1_S
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这样 MTP 层用 Q4_K 保真，主干用 IQ1_S 压缩，两不耽误。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;四、Q8 塞不进 24G 怎么办：Q8SLIM&lt;/h2&gt;
&lt;p&gt;周总跟我说 Q8_0 在 7900XTX 上跑没问题。但我自己转换的纯 Q8_0 是 27 GiB，24G 的卡物理上就装不下。之前试过各种层拆分（-ngl 62、54、52）全都 Vulkan DeviceLost，只有 -ngl 50 勉强稳定但只剩 2.5 tok/s，没啥实用价值。&lt;/p&gt;
&lt;p&gt;所以我选择的做法是混合量化：注意力部分保 Q8_0，FFN 降到 Q6_K，词表嵌入压到 Q4_K，输出层给 Q6_K：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;llama-quantize&lt;span class="w"&gt; &lt;/span&gt;--token-embedding-type&lt;span class="w"&gt; &lt;/span&gt;Q4_K&lt;span class="w"&gt; &lt;/span&gt;--output-tensor-type&lt;span class="w"&gt; &lt;/span&gt;Q6_K&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--tensor-type&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ffn_=Q6_K&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;f16.gguf&lt;span class="w"&gt; &lt;/span&gt;Q8SLIM.gguf&lt;span class="w"&gt; &lt;/span&gt;Q8_0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;出来 22.3 GiB（6.99 BPW），整卡装下还有富余。质量上注意力这种对精度最敏感的部分还是 Q8，FFN 这些大块头降一档，体感损失很小。实测 29.1 tok/s，两道验证题全对。这大概就是我这张 7900XTX 24G 卡上能跑的最高质量档。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;五、7900XTX 大阅兵&lt;/h2&gt;
&lt;p&gt;10 个超过 8G 的版本挨个上，Ollama 走 ROCm 后端，但怕爆显存就只设置了 8k 上下文，temperature 0，每档跑两道固定题：一道数学（17×23），一道代码（写斐波那契函数）。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;速度&lt;/th&gt;
&lt;th&gt;数学&lt;/th&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Q8SLIM&lt;/td&gt;
&lt;td&gt;29.1 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q6_K&lt;/td&gt;
&lt;td&gt;29.4 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5_K_M&lt;/td&gt;
&lt;td&gt;30.9 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;32.8 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IQ4_XS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;39.6 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q3_K_M&lt;/td&gt;
&lt;td&gt;32.9 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ3_XS&lt;/td&gt;
&lt;td&gt;31.1 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ2_M&lt;/td&gt;
&lt;td&gt;32.0 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ2_XS&lt;/td&gt;
&lt;td&gt;32.2 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ2_XXS&lt;/td&gt;
&lt;td&gt;32.6 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;几个观察：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;IQ4_XS 是速度之王&lt;/strong&gt;，39.6 tok/s 一骑绝尘，比 Q4_K_M 快了 20%。原因不复杂：IQ4_XS 是 4 BPW 出头，比 Q4_K_M 的 4.92 BPW 小了 1.4G，全部塞进显存之后剩余空间更宽裕，而且 IQ 系列的内存访问模式在显存带宽吃紧的时候更有优势。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q8SLIM 和 Q6_K 这两个大块头反而最慢&lt;/strong&gt;（29 出头），大概是因为太大，显存基本塞满了，KV cache 的空间也吃紧。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IQ2_XXS 居然还能全对&lt;/strong&gt;，8.1 GiB 的 27B 模型，质量崩塌的临界点比想象中低。&lt;/li&gt;
&lt;li&gt;中间有个小插曲：Q6_K 第一次测出来只有 1.3 tok/s，吓一跳。后来发现是前一个测试的模型没卸载干净，显存被占了一半。清掉重测就是正常的 29.4。跑批量测试的时候，每个模型测完记得 keep_alive=0 卸载，不然数据全是坑。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;六、4070 接力：IQ1_S 和质量底线&lt;/h2&gt;
&lt;p&gt;小于 8G 的只有 IQ1_S（6.9 GiB），扔给 4070。8G 显存里有 1G 多被桌面占着，实际可用 6.8G 左右，无奈，只能用 -ngl 55 把大部分层放上去，剩下留 CPU：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;测试&lt;/th&gt;
&lt;th&gt;速度&lt;/th&gt;
&lt;th&gt;数学&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IQ1_S 基线&lt;/td&gt;
&lt;td&gt;5.4 tok/s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;错&lt;/strong&gt;（340+51 算成 370）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IQ1_S + MTP&lt;/td&gt;
&lt;td&gt;6.5 tok/s&lt;/td&gt;
&lt;td&gt;错（同基线）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5_K_M -ngl 15&lt;/td&gt;
&lt;td&gt;1.9 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q5_K_M -ngl 15 + MTP&lt;/td&gt;
&lt;td&gt;3.2 tok/s&lt;/td&gt;
&lt;td&gt;对&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;IQ1_S 就是质量断崖。1.68 BPW 的比特率，27B 模型的数学能力直接崩了，340 加 51 能给你写成 370。所以说这代的可用底线是 IQ2_XXS，IQ1 系列只能算"能出字"，不能算"能用"。&lt;/p&gt;
&lt;p&gt;顺带一提，Q5_K_M 在 8G 卡上属于超载运行，18G 的模型只塞进去 15 层，剩下全靠内存和 CPU，1.9 tok/s 咬牙能用。这卡跑 27B 本来就是超纲题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;七、MTP 投机解码：白捡的加速&lt;/h2&gt;
&lt;p&gt;这个模型原生带 MTP 层，llama.cpp 用 &lt;code&gt;--spec-type draft-mtp&lt;/code&gt; 就能启用。原理粗略来讲：普通自回归是猜一个 token 验证一个，MTP 相当于模型自带一个小抄，一次猜好几个，主模型批量验证，猜中的直接收下，猜错的回滚。猜中率越高，加速越明显。&lt;/p&gt;
&lt;p&gt;实测数据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IQ1_S（4070）：5.4 → 6.5 tok/s，&lt;strong&gt;提速 20%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Q5_K_M（4070，部分卸载）：1.9 → 3.2 tok/s，&lt;strong&gt;提速 65%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;部分卸载场景提速更显著，可能是因为瓶颈在 CPU 内存带宽，一次验证多个 token 等于把宝贵的带宽利用率拉满了。而且开了 MTP 之后输出和基线完全一致——这是投机解码的数学性质保证的，猜错会回滚，最终结果和逐 token 生成一模一样，纯粹是白捡的速度。&lt;/p&gt;
&lt;p&gt;温度为 0 的时候接受率最稳。温度拉高之后输出随机性变大，草稿和主模型容易对不上，加速效果会打折扣，这个要有心理预期。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;八、这一路踩的坑&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;官方 Windows 二进制好像是有 bug&lt;/strong&gt;。llama.cpp b10405 和 b10435 的官方 Windows release，在回调路径（cb_eval）上有堆损坏，llama-imatrix 跑任何模型任何后端都会在第一个 decode 静默崩掉，exit code 0xC0000374；开 draft-mtp 的 llama-cli 也崩。解决办法是自己编译：本机 VS18 Community 加 CMake，注意必须用 Ninja 生成器，VS 自带生成器会报 "No CUDA toolset found"。自建的版本一切正常。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;链式量化别接管道&lt;/strong&gt;。第一次批量量化的时候，输出接了 &lt;code&gt;grep | head&lt;/code&gt;，管道提前关闭触发 SIGPIPE，把 IQ3_XS 的文件头截断了，GGUF magic 都没了。量化这种长任务老老实实写日志文件，我整不明白就暂时先不接管道了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vulkan 崩了可能是驱动问题但也别慌&lt;/strong&gt;。AMD 的 Vulkan 后端偶发 DeviceLost，恢复套路是固定的：taskkill 杀光所有 llama 进程，等 10 秒再启动，基本就能活过来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;llama-cli 单轮测试用 &lt;code&gt;-st&lt;/code&gt;&lt;/strong&gt;。不带这个参数它会进对话模式，后台跑的时候没人交互，就死循环打印提示符，日志能给你写几百兆。另外后台跑一定要 &lt;code&gt;&amp;gt; /dev/null&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;九、简单总结&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;24G 卡追求质量&lt;/strong&gt;：Q8SLIM，22.3 GiB 全进显存，29 tok/s，这是 7900XTX 上能摸到的最高画质。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;24G 卡追求速度&lt;/strong&gt;：IQ4_XS，39.6 tok/s，质量验证全过，日常用体感和 Q4_K_M 没区别。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;质量底线&lt;/strong&gt;：IQ2_XXS（8.1 GiB），再往下 IQ1_S 数学就崩了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8G 卡&lt;/strong&gt;：27B 纯属超纲，IQ1_S 能跑但别指望质量，真想跑 27B 老老实实上 16G 以上显存。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MTP 必开&lt;/strong&gt;：特别是部分卸载场景，65% 的提速不要白不要。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一轮折腾下来，本地盘上躺了 268 GiB 的模型文件。可能觉得折腾这些不如直接调 API，但自己量化、自己测速、自己找到那个"再压一档就崩"的临界点，这个过程对模型和硬件的理解是租 API 很难提供的乐趣。下一次出新卡或者新模型，这套流程直接照搬就行，几个小时就能摸清楚它的底细。&lt;/p&gt;</content><category term="LLM"/><category term="Qwen3.8"/><category term="GGUF"/><category term="量化"/><category term="llama.cpp"/><category term="7900XTX"/><category term="RTX 4070"/><category term="MTP"/><category term="Ollama"/><category term="本地部署"/></entry><entry><title>位居Spark Arena 速度榜首的LFM2.5-350M-低配设备无显卡也能运行的本地大模型</title><link href="https://blog.cycleuser.org/wei-ju-spark-arena-su-du-bang-shou-de-lfm25-350m-di-pei-she-bei-wu-xian-qia-ye-neng-yun-xing-de-ben-di-da-mo-xing.html" rel="alternate"/><published>2026-08-15T15:00:00+08:00</published><updated>2026-08-15T15:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-15:/wei-ju-spark-arena-su-du-bang-shou-de-lfm25-350m-di-pei-she-bei-wu-xian-qia-ye-neng-yun-xing-de-ben-di-da-mo-xing.html</id><summary type="html">&lt;p&gt;Liquid AI 的 LFM2.5-350M 最近在 &lt;a href="https://spark-arena.com/leaderboard"&gt;Spark Arena https://spark-arena.com/leaderboard&lt;/a&gt; 上长期居于速度榜首。这个模型在 Ollama 上可以直接拉取：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;LiquidAI/lfm2.5-350m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;只有 379MB，Q8_0 量化，354.48M 参 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Liquid AI 的 LFM2.5-350M 最近在 &lt;a href="https://spark-arena.com/leaderboard"&gt;Spark Arena https://spark-arena.com/leaderboard&lt;/a&gt; 上长期居于速度榜首。这个模型在 Ollama 上可以直接拉取：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;LiquidAI/lfm2.5-350m
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;只有 379MB，Q8_0 量化，354.48M 参数，128K 上下文，标注了 tools + thinking + completion 三项能力。&lt;/p&gt;
&lt;p&gt;我把之前对其他所有小模型做过的同一套测试——脚本评测（46 用例中英双语）和 BFCL 官方评测（25 抽样）——都对它跑了一遍，下面是结果和对比。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;测试环境与模型&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;MacBook Air M4, 16G 统一内存
推理引擎: Ollama 0.32.9
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;模型名&lt;/td&gt;
&lt;td&gt;lfm2.5-350m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;架构&lt;/td&gt;
&lt;td&gt;LFM-2.5（Liquid 混合架构）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参数量&lt;/td&gt;
&lt;td&gt;354.48M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载大小&lt;/td&gt;
&lt;td&gt;379 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;量化&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;上下文&lt;/td&gt;
&lt;td&gt;128,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;能力&lt;/td&gt;
&lt;td&gt;completion, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama 地址&lt;/td&gt;
&lt;td&gt;https://ollama.com/LiquidAI/lfm2.5-350m&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spark Arena&lt;/td&gt;
&lt;td&gt;https://spark-arena.com/leaderboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;脚本评测结果&lt;/h2&gt;
&lt;p&gt;46 个测试用例（23 用例 × 中英双语），覆盖 simple / parallel / tool_selection / irrelevant / multi_turn / tau_airline / tau_retail / edge 八个维度，使用 Ollama 原生 tools 接口，temperature=0。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;得分&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;simple&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;parallel&lt;/td&gt;
&lt;td&gt;0.35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tool_selection&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;irrelevant&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multi_turn&lt;/td&gt;
&lt;td&gt;0.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tau_airline&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tau_retail&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;edge&lt;/td&gt;
&lt;td&gt;0.33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;总通过率&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50.0%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;均分&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.42&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EN 通过率&lt;/td&gt;
&lt;td&gt;69.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZH 通过率&lt;/td&gt;
&lt;td&gt;30.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;总耗时&lt;/td&gt;
&lt;td&gt;74s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;BFCL 官方评测结果&lt;/h2&gt;
&lt;p&gt;使用 BFCL 官方管线（&lt;code&gt;bfcl generate&lt;/code&gt; → &lt;code&gt;bfcl evaluate&lt;/code&gt;），25 个抽样测试用例（simple_python 10 + irrelevance 10 + parallel 5），AST 解析 + 类型检查 + 标准化值匹配。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类别&lt;/th&gt;
&lt;th&gt;准确率&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;irrelevance&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;simple_python&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;parallel&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;irrelevance 90% 说明这个模型在"不该调工具的时候能管住自己"这件事上做得不错。simple_python 50% 在同体量模型里也是中上水平。但 parallel 0%——在 BFCL 严格的 AST 格式要求下，它的并行调用输出格式没过关。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;与其他模型对比&lt;/h2&gt;
&lt;h3&gt;脚本评测总榜（含 LFM2.5-350M）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;大小&lt;/th&gt;
&lt;th&gt;通过率&lt;/th&gt;
&lt;th&gt;均分&lt;/th&gt;
&lt;th&gt;EN&lt;/th&gt;
&lt;th&gt;ZH&lt;/th&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;697 MB&lt;/td&gt;
&lt;td&gt;76.1%&lt;/td&gt;
&lt;td&gt;0.74&lt;/td&gt;
&lt;td&gt;95.7%&lt;/td&gt;
&lt;td&gt;56.5%&lt;/td&gt;
&lt;td&gt;668s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:1.7b&lt;/td&gt;
&lt;td&gt;1,736 MB&lt;/td&gt;
&lt;td&gt;76.1%&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;87.0%&lt;/td&gt;
&lt;td&gt;65.2%&lt;/td&gt;
&lt;td&gt;194s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;349 MB&lt;/td&gt;
&lt;td&gt;67.4%&lt;/td&gt;
&lt;td&gt;0.64&lt;/td&gt;
&lt;td&gt;78.3%&lt;/td&gt;
&lt;td&gt;56.5%&lt;/td&gt;
&lt;td&gt;60s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;988 MB&lt;/td&gt;
&lt;td&gt;63.0%&lt;/td&gt;
&lt;td&gt;0.61&lt;/td&gt;
&lt;td&gt;82.6%&lt;/td&gt;
&lt;td&gt;43.5%&lt;/td&gt;
&lt;td&gt;370s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:0.6b&lt;/td&gt;
&lt;td&gt;498 MB&lt;/td&gt;
&lt;td&gt;56.5%&lt;/td&gt;
&lt;td&gt;0.54&lt;/td&gt;
&lt;td&gt;78.3%&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;td&gt;220s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m&lt;/td&gt;
&lt;td&gt;676 MB&lt;/td&gt;
&lt;td&gt;54.3%&lt;/td&gt;
&lt;td&gt;0.54&lt;/td&gt;
&lt;td&gt;73.9%&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;td&gt;41s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;lfm2.5-350m&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;379 MB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.42&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;69.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;74s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2:1b&lt;/td&gt;
&lt;td&gt;1,260 MB&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;43.5%&lt;/td&gt;
&lt;td&gt;26.1%&lt;/td&gt;
&lt;td&gt;97s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;functiongemma&lt;/td&gt;
&lt;td&gt;287 MB&lt;/td&gt;
&lt;td&gt;17.4%&lt;/td&gt;
&lt;td&gt;0.17&lt;/td&gt;
&lt;td&gt;26.1%&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;td&gt;106s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;BFCL 官方评测对比&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;irrelevance&lt;/th&gt;
&lt;th&gt;parallel&lt;/th&gt;
&lt;th&gt;simple_python&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:0.6b&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;functiongemma&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:1.7b&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;50%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;lfm2.5-350m&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2:1b&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;分析&lt;/h2&gt;
&lt;h3&gt;体积效率&lt;/h3&gt;
&lt;p&gt;379MB 的体积在所有受测模型中排倒数第二（仅比 functiongemma 的 287MB 大），但通过率 50% 远超 functiongemma 的 17.4%。按"每 MB 通过率"来算，LFM2.5-350M 是 0.132%/MB，granite4:350m-h 是 0.193%/MB——granite4:350m-h 仍然是体积效率最高的，LFM2.5-350M 排第二。&lt;/p&gt;
&lt;h3&gt;英文 vs 中文&lt;/h3&gt;
&lt;p&gt;英文 69.6% vs 中文 30.4%，差距 39 个百分点。这个差距和 lfm2.5-thinking（95.7% vs 56.5%，差 39pp）以及 qwen3.5:0.8b（82.6% vs 43.5%，差 39pp）几乎一样。说明 LFM 系列的中文工具调用能力和同体量的其他模型处于同一水平——都不太行。&lt;/p&gt;
&lt;h3&gt;简单调用能力强&lt;/h3&gt;
&lt;p&gt;simple 维度 0.67，在所有模型中排第三（granite4:350m-h 和 lfm2.5-thinking 并列第一 0.75）。BFCL simple_python 50% 也是所有模型中最高的（与 smollm2:1.7b 并列）。这说明 LFM2.5-350M 在单次工具调用 + 参数填充这件事上做得不错。&lt;/p&gt;
&lt;h3&gt;并行调用是短板&lt;/h3&gt;
&lt;p&gt;脚本评测 parallel 0.35，BFCL parallel 0%。在 BFCL 严格的 AST 格式下，它的并行调用输出完全没过关。这和 Spark Arena 的排名形成对比——Spark Arena 评测的可能不是并行工具调用场景，而是单轮推理质量。&lt;/p&gt;
&lt;h3&gt;与同门 lfm2.5-thinking 的关系&lt;/h3&gt;
&lt;p&gt;lfm2.5-thinking（697MB，1.2B 参数）通过率 76.1%，lfm2.5-350m（379MB，354M 参数）通过率 50%。同一架构、不同参数规模，通过率差了 26 个百分点。参数量缩到不到三分之一，能力下降了三分之一多一点，这么粗略来看缩放效率还算合理。&lt;/p&gt;
&lt;h3&gt;速度&lt;/h3&gt;
&lt;p&gt;实际生成速度（tokens/s）测试结果：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;生成 tokens&lt;/th&gt;
&lt;th&gt;生成时间&lt;/th&gt;
&lt;th&gt;tok/s&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;lfm2.5-350m&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;0.41s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80.2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;126&lt;/td&gt;
&lt;td&gt;3.63s&lt;/td&gt;
&lt;td&gt;34.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;8.41s&lt;/td&gt;
&lt;td&gt;30.4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;LFM2.5-350M 以 80.2 tok/s 的生成速度遥遥领先，是 granite4:350m-h 的 2.3 倍、lfm2.5-thinking 的 2.6 倍。这正是它在 Spark Arena 速度榜上排第一的原因——Liquid 的混合架构（SSM + Transformer）在推理效率上有天然优势，350M 参数配合 Q8_0 量化在本地 CPU/Metal 上能跑到 80 tokens/s，这个速度体验已经非常流畅了。&lt;/p&gt;
&lt;p&gt;74 秒跑完 46 个工具调用测试，平均每个测试 1.6 秒，也是所有受测模型里第二快的（仅次于 granite4:350m 的 41s）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;代码能力测试&lt;/h2&gt;
&lt;p&gt;工具调用之外，还用 HumanEval / HumanEval-X 对两个 LFM 模型跑了代码生成 pass@1 测试。每种语言 15 题，覆盖 Python、C++、JavaScript 三种语言，要求模型补全函数代码并通过单元测试。&lt;/p&gt;
&lt;p&gt;测试方法：给模型 HumanEval 的 prompt，追加指令"Complete the code. Output ONLY the code, no explanation, no markdown."，temperature=0。从模型输出中提取代码块，编译/运行后检查测试用例是否通过。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;大小&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;JS&lt;/th&gt;
&lt;th&gt;平均&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-350m&lt;/td&gt;
&lt;td&gt;379 MB&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;13%&lt;/td&gt;
&lt;td&gt;9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;697 MB&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;结果很直白：两个 LFM 模型的代码生成能力都很弱。&lt;/p&gt;
&lt;p&gt;lfm2.5-thinking（697MB，1.2B 参数）全挂——三种语言 0%。考虑到它有 thinking 机制，很可能在代码场景下思维链反而干扰了输出格式，导致提取不到有效代码，或者生成的代码虽然"看起来像"但逻辑不对。&lt;/p&gt;
&lt;p&gt;lfm2.5-350m（379MB，354M 参数）稍好，Python 和 JS 各对了 2 题（13%），C++ 全挂。9% 的平均 pass@1 在同体量模型里属于较低水平。作为参考，之前测过的 qwen3.5 系列在同样 15 题规模下 Python 普遍在 40-70% 区间。&lt;/p&gt;
&lt;p&gt;这说明 LFM 的混合架构（SSM + Transformer）在工具调用场景下有一定竞争力，但在代码生成这个需要精确语法和逻辑推理的任务上，跟同体量的 Dense Transformer 模型还有明显差距。如果你的使用场景需要模型写代码，LFM 系列目前不是合适的选择。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总的来看适合低成本设备&lt;/h2&gt;
&lt;p&gt;LFM2.5-350M 在 379MB 的体积下做到 50% 工具调用通过率和 50% 的 BFCL simple_python 准确率，单次工具调用能力在同体量模型中领先。但并行调用（BFCL parallel 0%）、中文（30.4%）、以及代码生成（pass@1 平均 9%）是三个明显短板。&lt;/p&gt;
&lt;p&gt;Spark Arena 榜首的位置说明它在速度上确实有优势，但工具调用和代码生成场景下的表现跟专门的评测还是有差距。如果需要并行调用、中文工具调用或代码生成，granite4:350m-h（349MB，67.4%，中文 56.5%）仍然是更稳妥的选择。但如果你的使用场景对体积和速度敏感、以单次工具调用为主、以英文为主、不需要写代码，LFM2.5-350M 值得一试。&lt;/p&gt;
&lt;p&gt;对于一般的低成本设备来说，LFM2.5-350M 根本不用什么 GPU，就直接用 CPU 应该就可以流畅运行了。&lt;/p&gt;</content><category term="LLM"/><category term="ollama"/><category term="LFM"/><category term="Liquid AI"/><category term="tool calling"/><category term="BFCL"/><category term="小模型评测"/></entry><entry><title>超小模型在超低配 MacBook 上的运行性能实测</title><link href="https://blog.cycleuser.org/tiny-models-lowend-macbook-performance.html" rel="alternate"/><published>2026-08-15T10:00:00+08:00</published><updated>2026-08-15T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-15:/tiny-models-lowend-macbook-performance.html</id><summary type="html">&lt;p&gt;低配机器的本地模型，绕不开一个矛盾：模型越小跑得越快，但能力也越弱。在一些不具备大显存独显的设备上，"超小模型"（参 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;低配机器的本地模型，绕不开一个矛盾：模型越小跑得越快，但能力也越弱。在一些不具备大显存独显的设备上，"超小模型"（参数低于 2B）几乎是唯一能跑得顺畅的选择。本文把当前 Ollama 里安装的全部生成模型按统一标准测一遍速度，重点看超小模型这一档的真实表现。&lt;/p&gt;
&lt;h2&gt;测试方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;硬件：MacBook Air M4，16G 统一内存&lt;/li&gt;
&lt;li&gt;推理引擎：Ollama 0.32.9&lt;/li&gt;
&lt;li&gt;测速方式：300 token 长文本生成，&lt;code&gt;temperature=0&lt;/code&gt;、关闭思考，充分预热后取 5 次平均值&lt;/li&gt;
&lt;li&gt;生成速度单位：token/s（每秒生成 token 数）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;测速用长文本生成而非短回复，是因为短回复测的是"首 token 延迟"，长文本才反映持续生成的吞吐，更贴近实际使用。&lt;/p&gt;
&lt;h2&gt;完整速度表&lt;/h2&gt;
&lt;p&gt;当前 Ollama 里共 8 个生成模型（另有 5 个 embedding 模型，不参与生成速度对比），按参数规模排列：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;参数量&lt;/th&gt;
&lt;th&gt;体积&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;生成速度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;340M&lt;/td&gt;
&lt;td&gt;366 MB&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30.2 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b-mlx&lt;/td&gt;
&lt;td&gt;0.8B&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;td&gt;mxfp8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30.0 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;1.2B&lt;/td&gt;
&lt;td&gt;731 MB&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;26.3 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:1.7b&lt;/td&gt;
&lt;td&gt;1.7B&lt;/td&gt;
&lt;td&gt;1.8 GB&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;12.9 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:2b-mlx&lt;/td&gt;
&lt;td&gt;2B&lt;/td&gt;
&lt;td&gt;3.1 GB&lt;/td&gt;
&lt;td&gt;mxfp8&lt;/td&gt;
&lt;td&gt;11.0 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:4b-mlx&lt;/td&gt;
&lt;td&gt;4B&lt;/td&gt;
&lt;td&gt;4.0 GB&lt;/td&gt;
&lt;td&gt;nvfp4&lt;/td&gt;
&lt;td&gt;9.7 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:9b-mlx&lt;/td&gt;
&lt;td&gt;9B&lt;/td&gt;
&lt;td&gt;8.9 GB&lt;/td&gt;
&lt;td&gt;nvfp4&lt;/td&gt;
&lt;td&gt;5.1 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;9B&lt;/td&gt;
&lt;td&gt;5.7 GB&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;4.4 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;速度随参数量递减，但曲线并非线性——从 340M 到 1.2B 这一档，速度几乎持平在 26-30 tok/s；从 1.7B 起，速度降到 13 tok/s 以下。这个"分界"值得注意。&lt;/p&gt;
&lt;h2&gt;三个观察&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;340M 与 800M 速度相同，提示小模型受固定开销拖累。&lt;/strong&gt; granite4:350m-h 只有 340M 参数，是 qwen3.5:0.8b（800M）的 42%，但两者的生成速度完全一致（30.2 vs 30.0 tok/s）。参数少了 2.35 倍，速度却没有提升——这说明瓶颈可能不在"读取权重"（内存带宽），而在 Metal 引擎的固定开销：kernel 调度、内存延迟这类与参数规模无关的成本。当然，这只是本次样本的观察，未测更小的模型，不能据此断言存在某个绝对的速度上限。所谓 hybrid 架构（SSM 融合）在 Metal 后端上也未体现出速度优势。granite4:350m-h 的真正价值在于"能力密度"（此前工具调用评测通过率 67.4%，是所有模型里最小而最强的），而非推理速度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;qwen3.5:0.8b 的 30 tok/s 需要预热。&lt;/strong&gt; 首次运行只有 6 tok/s，要到第 3 次才稳定到 27-32 tok/s。这是 Metal kernel 首次编译缓存导致的冷启动开销，其他模型同样存在，只是小模型更容易被掩盖。实际使用中，第一次对话明显偏慢，属正常现象。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lfm2.5-thinking 的"思考"开关似乎没有生效。&lt;/strong&gt; 分别用 &lt;code&gt;think=False&lt;/code&gt; 和 &lt;code&gt;think=True&lt;/code&gt; 各测 5 次，速度都是 26.3 tok/s，没有差异。它此前在工具调用评测中耗时 668 秒（是 granite 的 10 倍），但那是"每步先思考再行动"累积的结果，而非生成速度慢。纯生成场景下，它的速度并无劣势。&lt;/p&gt;
&lt;h2&gt;超小模型这一档的取舍&lt;/h2&gt;
&lt;p&gt;把速度数据与之前的能力评测（智力、知识、代码、工具调用）合并起来看：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;速度&lt;/th&gt;
&lt;th&gt;工具调用&lt;/th&gt;
&lt;th&gt;特点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;30.2&lt;/td&gt;
&lt;td&gt;67.4%&lt;/td&gt;
&lt;td&gt;最小最强，hybrid 架构&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;30.0&lt;/td&gt;
&lt;td&gt;63.0%&lt;/td&gt;
&lt;td&gt;全功能，含视觉/思考&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;26.3&lt;/td&gt;
&lt;td&gt;76.1%&lt;/td&gt;
&lt;td&gt;工具调用最高，但"思考"存疑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:1.7b&lt;/td&gt;
&lt;td&gt;12.9&lt;/td&gt;
&lt;td&gt;76.1%&lt;/td&gt;
&lt;td&gt;工具调用并列最高&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;四项里没有单项通吃的赢家：granite4 体积最小、能力密度最高，lfm2.5 和 smollm2 工具调用更强，qwen3.5:0.8b 胜在功能全面（视觉、思考、工具调用都支持）。&lt;/p&gt;
&lt;h2&gt;简单总结&lt;/h2&gt;
&lt;p&gt;在 16G 内存的低配 MacBook 上，超小模型（&amp;lt;2B）的价值在于"常驻可用"——30 tok/s 的速度足以支撑日常对话和文本翻译之类的简单任务，366MB 的 granite4:350m-h 甚至可以一直挂在内存里随叫随到。但它们的上限也明确：一旦任务需要真正的代码生成或多步推理，就必须跨过 2B 这条线，接受速度的降低。&lt;/p&gt;
&lt;p&gt;超小模型解决的是"有没有得用"，不是"用得好不好"。前者在低配机器上，恰恰是最重要的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;要最小体积、常驻内存&lt;/strong&gt;：granite4:350m-h，366MB 几乎无感，速度与其他超小模型持平（30 tok/s），简单工具调用够用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要全功能、对付着用&lt;/strong&gt;：qwen3.5:0.8b，视觉/思考/工具调用都支持，速度同样 30 tok/s，代价是体积略大。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要工具调用准确率&lt;/strong&gt;：lfm2.5-thinking 或 smollm2:1.7b，前者更小更快，后者更稳。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要真正能写代码/复杂推理&lt;/strong&gt;：越过 2B 这一档，上 qwen3.5:4b（9.7 tok/s，代码能力跃升），这是超小模型之外的第一个"甜点"。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不在乎速度&lt;/strong&gt;：那还是 qwen3.5:9b 或者 omnicoder-2-9b（各种能力都强力提升），虽然速度相对慢了，但能力提升显著。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;附录：模型拉取命令&lt;/h2&gt;
&lt;p&gt;文中涉及的模型均可通过以下命令拉取：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 超小模型（参数 &amp;lt; 2B）&lt;/span&gt;
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;granite4:350m-h
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:0.8b-mlx
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;lfm2.5-thinking:latest
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;smollm2:1.7b

&lt;span class="c1"&gt;# 小模型（2B - 4B）&lt;/span&gt;
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:2b-mlx
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:4b-mlx

&lt;span class="c1"&gt;# 9B 模型&lt;/span&gt;
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:9b-mlx
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;carstenuhlig/omnicoder-2-9b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="LLM"/><category term="ollama"/><category term="超小模型"/><category term="本地部署"/><category term="性能实测"/><category term="MacBook Air M4"/><category term="生成速度"/><category term="granite4"/><category term="smollm2"/><category term="lfm2.5"/></entry><entry><title>Qwen3.5 小模型本地部署的不严谨横评：智力、知识、代码三项 SOTA 基准</title><link href="https://blog.cycleuser.org/qwen35-intelligence-knowledge-code.html" rel="alternate"/><published>2026-08-14T12:00:00+08:00</published><updated>2026-08-14T12:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-14:/qwen35-intelligence-knowledge-code.html</id><summary type="html">&lt;p&gt;此前已对比过 Ollama、oMLX、MoXing 三条推理路线，关注的是推理速度。但推理速度只是工程问题，真正决定模型是否可用的是模型本身 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;此前已对比过 Ollama、oMLX、MoXing 三条推理路线，关注的是推理速度。但推理速度只是工程问题，真正决定模型是否可用的是模型本身的能力。&lt;/p&gt;
&lt;p&gt;Qwen3.8 的 27B 版本已经发布，但更小尺寸的尚未放出。本文转而回顾拥有多个小规模参数的 Qwen3.5 系列。&lt;/p&gt;
&lt;p&gt;本文将 Qwen3.5 全系——0.8b、2b、4b、9b，外加一个 coding 特调的 omnicoder-2-9b——集中起来，用三套 SOTA 基准分别测量&lt;strong&gt;智力&lt;/strong&gt;（推理）、&lt;strong&gt;知识&lt;/strong&gt;（记忆）与&lt;strong&gt;代码&lt;/strong&gt;（编程）三项能力。目标是回答两个问题：这些能力如何随参数规模变化；以及"能否让模型遗忘知识、仅保留智力"这一老问题。&lt;/p&gt;
&lt;h2&gt;测试环境与模型&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;MacBook Air M4, 16G 统一内存
推理引擎: Ollama 0.32.9
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;共五个模型，均为 Qwen3.5 系列：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;体积&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;格式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b-mlx&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;td&gt;mxfp8&lt;/td&gt;
&lt;td&gt;safetensors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:2b-mlx&lt;/td&gt;
&lt;td&gt;3.1 GB&lt;/td&gt;
&lt;td&gt;mxfp8&lt;/td&gt;
&lt;td&gt;safetensors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:4b-mlx&lt;/td&gt;
&lt;td&gt;4.0 GB&lt;/td&gt;
&lt;td&gt;nvfp4&lt;/td&gt;
&lt;td&gt;safetensors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:9b-mlx&lt;/td&gt;
&lt;td&gt;8.9 GB&lt;/td&gt;
&lt;td&gt;nvfp4&lt;/td&gt;
&lt;td&gt;safetensors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;5.7 GB&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;GGUF&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;前四个为官方版本；omnicoder 是社区上传的 coding 特调版，基于 Qwen3.5 9B 微调而来。将其纳入，可作为"知识被消除后剩余能力"的对照样本。&lt;/p&gt;
&lt;p&gt;所有测试都用 &lt;code&gt;temperature=0&lt;/code&gt;、关闭思考，每道题只生成一次（pass@1）。&lt;/p&gt;
&lt;h2&gt;智力 vs 知识：SOTA 基准&lt;/h2&gt;
&lt;p&gt;先界定"智力"与"知识"的区分。采用四套数据集：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;智力&lt;/strong&gt;（题面提供充分信息，考察推理）：HellaSwag（常识推理）+ GSM8K（小学数学应用题）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知识&lt;/strong&gt;（题面不提供，考察记忆）：TriviaQA（冷门事实问答）+ MMLU（学科知识）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各抽样 20 题，结果如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;智力(推理)&lt;/th&gt;
&lt;th&gt;知识(记忆)&lt;/th&gt;
&lt;th&gt;智力−知识差&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;+2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;+2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:4b&lt;/td&gt;
&lt;td&gt;38%&lt;/td&gt;
&lt;td&gt;28%&lt;/td&gt;
&lt;td&gt;+10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:9b&lt;/td&gt;
&lt;td&gt;58%&lt;/td&gt;
&lt;td&gt;48%&lt;/td&gt;
&lt;td&gt;+10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;td&gt;12%&lt;/td&gt;
&lt;td&gt;+2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分项数据：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;HellaSwag&lt;/th&gt;
&lt;th&gt;GSM8K&lt;/th&gt;
&lt;th&gt;TriviaQA&lt;/th&gt;
&lt;th&gt;MMLU&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.8b&lt;/td&gt;
&lt;td&gt;8/20&lt;/td&gt;
&lt;td&gt;1/20&lt;/td&gt;
&lt;td&gt;3/20&lt;/td&gt;
&lt;td&gt;5/20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2b&lt;/td&gt;
&lt;td&gt;11/20&lt;/td&gt;
&lt;td&gt;0/20&lt;/td&gt;
&lt;td&gt;4/20&lt;/td&gt;
&lt;td&gt;6/20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4b&lt;/td&gt;
&lt;td&gt;15/20&lt;/td&gt;
&lt;td&gt;0/20&lt;/td&gt;
&lt;td&gt;5/20&lt;/td&gt;
&lt;td&gt;6/20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9b&lt;/td&gt;
&lt;td&gt;18/20&lt;/td&gt;
&lt;td&gt;5/20&lt;/td&gt;
&lt;td&gt;8/20&lt;/td&gt;
&lt;td&gt;11/20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;omnicoder&lt;/td&gt;
&lt;td&gt;4/20&lt;/td&gt;
&lt;td&gt;2/20&lt;/td&gt;
&lt;td&gt;0/20&lt;/td&gt;
&lt;td&gt;5/20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;由此得到两项结论：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;智力比知识更"昂贵"。&lt;/strong&gt; 从 0.8b 到 9b，智力提升 36 个百分点，知识仅提升 28 个；智力−知识差由 +2% 扩大至 +10%——模型越大，推理能力相对记忆的优势越明显。这与"遗忘知识可节省空间"的直觉相反：&lt;strong&gt;记忆事实是相对廉价的部分，推理才是占用参数的主要部分。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;omnicoder 是"知识被消除"的实证案例。&lt;/strong&gt; 其 TriviaQA 得分为 0/20，冷门事实几乎全部遗忘；但代价是智力同步受损——HellaSwag 常识推理仅 4/20，而 9b 官方版为 18/20。特调消除知识的同时，推理能力一并受损。&lt;/p&gt;
&lt;h2&gt;知识外置验证&lt;/h2&gt;
&lt;p&gt;既然特调能够消除知识，那么能否彻底放弃记忆知识、改由外部检索提供？为此设计一组对照实验：对每个 TriviaQA 问题，分别在两种模式下作答——"无外部知识"（仅依赖模型记忆）与"有外部知识"（模拟 RAG，参考资料中已包含答案），各 10 题。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;仅依赖记忆&lt;/th&gt;
&lt;th&gt;提供外部知识&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;0/10&lt;/td&gt;
&lt;td&gt;3/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:9b&lt;/td&gt;
&lt;td&gt;3/10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10/10&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;实验结果表明：&lt;strong&gt;知识外置的路径可行，但前提是模型自身的理解能力保持完整。&lt;/strong&gt; 9b 仅依赖记忆时只有 3/10，提供外部知识后达到满分 10/10——其短板并非知识储备，而是信息输入；一旦上下文中给出答案所需的信息，其理解能力即可将答案提取出来。而 omnicoder 即便在"从参考资料中提取答案"这一任务上也仅做对 3/10，说明其基础理解能力已经受损。&lt;/p&gt;
&lt;p&gt;因此，对"遗忘知识、保留智力"这一设想，正确的结论是：&lt;strong&gt;知识可以不内置于权重，但智力无法省略；且特调或遗忘操作往往同时损害智力。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;代码能力：HumanEval 系列&lt;/h2&gt;
&lt;p&gt;代码部分采用 HumanEval（Python）与 HumanEval-X（C++/JS），pass@1 评分——模型仅生成一次，随后用 clang 编译、node 运行、python 执行测试用例，全部通过方记为正确。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;JS&lt;/th&gt;
&lt;th&gt;平均&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;53%&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:2b&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;td&gt;33%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:4b&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;76%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:9b&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;47%&lt;/td&gt;
&lt;td&gt;93%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;67%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;说明：前四个模型每语言测 15 题；omnicoder 因推理速度过慢（生成一段代码需上百秒），每语言仅测 5 题，其分数为 5 题内的正确率，仅供参考。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;代码部分的观察如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4b 是能力分水岭。&lt;/strong&gt; 0.8b 到 2b 仅从 31% 升至 40%，增幅平缓；2b 到 4b 则由 40% 跃升至 76%。4b 与 9b 在 Python 简单题上均取得满分——对于日常编写脚本、函数的需求，4b 已经足够。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C++ 是所有模型的薄弱项。&lt;/strong&gt; 即便 9b 也仅有 47%。C++ 的类型系统、指针与 STL 对较小模型尤为不利，生成的代码多数无法通过编译。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;omnicoder 的特调未带来代码优势，反而引入了额外问题。&lt;/strong&gt; 其 Python 60% 并不高于 9b 官方版，且默认会将"思考过程"直接输出到正文中，开头常出现大段 "Let me analyze this problem..."，需显式传入 &lt;code&gt;num_think=0&lt;/code&gt; 才能正常输出代码。否则，其 token 预算会被思考内容耗尽，函数体尚未生成即被截断。&lt;/p&gt;
&lt;h2&gt;三项观察&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;"智力"与"知识"在模型中并不等价，但也难以干净分离。&lt;/strong&gt; 数据显示智力随规模增长更快（+36pp vs +28pp），说明二者的参数效率不同；但 omnicoder 的案例又表明，无法只消除其一——特调消除知识时，智力随之受损。二者在权重中深度耦合。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码能力是三项中增长最不连续的一项。&lt;/strong&gt; 推理与知识均随规模平滑提升，代码却呈现 2b 到 4b 的突变。一个可能的原因是：代码生成需要模型达到某个理解阈值，超过阈值后，剩余的部分即是对标准模式的组合。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;小模型的 C++ 能力基本不可用。&lt;/strong&gt; 4b 以下模型 C++ 正确率均不高于 33%。若需本地进行 C++ 代码生成，应选择 9b 及以上规模，而非寄望于小模型。&lt;/p&gt;
&lt;h2&gt;选型建议&lt;/h2&gt;
&lt;p&gt;按用途划分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;日常对话、简单工具调用&lt;/strong&gt;：0.8b 或 2b 即可，智力 22-28% 足以应对简单场景，优势在于速度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地编写代码（Python/JS）&lt;/strong&gt;：4b 是均衡之选，Python 满分、JS 80%，体积仅 4GB，16G 内存下运行无压力。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;追求最强的通用能力&lt;/strong&gt;：9b，智力 58%、代码 80%，代价是推理速度与内存占用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;omnicoder 不建议采用&lt;/strong&gt;：特调未带来代码优势，且需额外处理思考内容泄露问题，性价比不高。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;回到最初的问题——"能否让模型遗忘知识、仅保留智力"。&lt;/p&gt;
&lt;p&gt;综合三项测试，结论是：&lt;strong&gt;方向正确，但实现路径有误。&lt;/strong&gt; 正确之处在于"知识可以外置"——9b 在提供外部知识后达到满分，证明 RAG/检索增强完全可行。错误之处在于"仅保留智力"——智力恰恰是最昂贵、最不可省略的部分；任何"定向删除知识"的操作（特调、遗忘、蒸馏）几乎都会同时损伤智力。&lt;/p&gt;
&lt;p&gt;因此，现实的方案是：&lt;strong&gt;不应试图在权重中删减知识，而应选择一个规模适度、能力足够的模型，将知识外置于检索系统。&lt;/strong&gt; 需要时按需检索并注入上下文，远比压缩权重更为经济。&lt;/p&gt;</content><category term="LLM"/><category term="qwen3.5"/><category term="模型评测"/><category term="HumanEval"/><category term="MMLU"/><category term="HellaSwag"/><category term="GSM8K"/><category term="代码能力"/><category term="本地部署"/><category term="知识外置"/><category term="RAG"/></entry><entry><title>Windows 系统下从中科大 USTC 镜像安装 Miniconda3 完整指南</title><link href="https://blog.cycleuser.org/windows-xi-tong-xia-cong-zhong-ke-da-ustc-jing-xiang-an-zhuang-miniconda3-wan-zheng-zhi-nan.html" rel="alternate"/><published>2026-08-14T12:00:00+08:00</published><updated>2026-08-14T12:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-14:/windows-xi-tong-xia-cong-zhong-ke-da-ustc-jing-xiang-an-zhuang-miniconda3-wan-zheng-zhi-nan.html</id><summary type="html">&lt;p&gt;近年来接触了不少初学 Python 的朋友，发现几种常见做法会带来一些困难：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一部分人直接从官网下载 Python 解释器，不仅下载速度 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;近年来接触了不少初学 Python 的朋友，发现几种常见做法会带来一些困难：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一部分人直接从官网下载 Python 解释器，不仅下载速度慢，后续的环境变量配置和多版本管理也较为繁琐；&lt;/li&gt;
&lt;li&gt;另一部分人选择安装体积庞大的 Anaconda3，并长期依赖 Spyder 等类似 MATLAB 界面的集成开发环境，但这类环境依赖链条复杂，稍有版本不匹配便可能导致整个系统无法启动；&lt;/li&gt;
&lt;li&gt;还有一些人在面对多项目并行开发时，遭遇包依赖冲突，虽尝试使用虚拟环境，却因路径混乱或管理不便而难以有效隔离环境。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;针对上述问题，一种更轻量、灵活的解决方案是采用 Miniconda——Anaconda 的精简版本。通过将其安装至固定路径、配置全局可用，并为不同项目单独创建指定 Python 版本及依赖组件的隔离环境，可显著提升开发效率与环境稳定性。&lt;/p&gt;
&lt;p&gt;当然了，随着以后开发经验的积累，完全可以逐渐按照自己的开发偏好或者所在团队的规范来另行设置。&lt;/p&gt;
&lt;p&gt;本文围绕这一实践路径展开说明：如何在 Windows 系统中，从中国科学技术大学开源软件镜像站（USTC）下载并安装 Miniconda3，部署至 &lt;code&gt;C:\Miniconda3&lt;/code&gt; 目录，并完成基础开发环境的配置。内容涵盖安装流程、PowerShell 初始化、镜像源设置、虚拟环境创建及包管理操作，适用于初学者与日常开发场景。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;为什么从 TUNA 换成 USTC？&lt;/strong&gt;
清华大学 TUNA 镜像站已宣布不再提供 Anaconda 官方仓库的镜像服务。USTC 镜像站目前仍然提供 Miniconda 安装包下载以及 conda-forge、bioconda 频道的动态缓存。需要注意的是，USTC 的 Anaconda 镜像&lt;strong&gt;不包含&lt;/strong&gt; Anaconda 公司维护的 defaults 频道（即 main、free 等），而是通过 conda-forge 和 bioconda 这两个社区频道来提供包。对于绝大多数用户来说，conda-forge 已经能够覆盖日常所需的几乎全部 Python 包，且更新更频繁、版本更新。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;1、下载 Miniconda3 安装程序&lt;/h2&gt;
&lt;p&gt;安装程序需从 USTC 镜像站获取，以确保下载速度与版本时效性。使用以下链接直接下载适用于 64 位 Windows 系统的最新版 Miniconda3：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://mirrors.ustc.edu.cn/anaconda/miniconda/Miniconda3-latest-Windows-x86_64.exe
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;该链接始终指向最新稳定版本，无需手动选择具体文件名。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;2、安装 Miniconda3 到 C:\Miniconda3&lt;/h2&gt;
&lt;p&gt;目标路径 &lt;code&gt;C:\Miniconda3&lt;/code&gt; 位于系统盘根目录，Windows 默认限制普通用户在此位置写入数据。因此，安装过程必须以管理员权限运行，并选择"所有用户"安装模式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装步骤&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;右键点击下载完成的安装文件（&lt;code&gt;Miniconda3-latest-Windows-x86_64.exe&lt;/code&gt;），选择 &lt;strong&gt;"以管理员身份运行"&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;在安装向导中点击 "Next"，勾选 "I Agree" 接受许可协议。&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;安装类型（Select Installation Type）&lt;/strong&gt; 页面，选择 &lt;strong&gt;"All Users (requires admin privileges)"&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：尽量别选择 "Just Me"，否则安装程序无法写入 &lt;code&gt;C:\&lt;/code&gt; 目录。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;strong&gt;安装路径（Choose Install Location）&lt;/strong&gt; 页面，手动输入路径：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;C:\Miniconda3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;在 &lt;strong&gt;高级选项（Advanced Options）&lt;/strong&gt; 页面：&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;勾选&lt;/strong&gt; "Add Miniconda3 to my PATH environment variable"；&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;勾选&lt;/strong&gt; "Register Miniconda3 as my default Python 3.x"。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击 "Install" 开始安装，完成后点击 "Finish"。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;安装完成后，Miniconda3 将位于 &lt;code&gt;C:\Miniconda3&lt;/code&gt;，对系统中所有用户可用。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;3、初始化 Conda 对 PowerShell 的支持&lt;/h2&gt;
&lt;p&gt;Conda 需通过初始化操作，才能在 PowerShell 中自动激活环境并提供命令补全等功能。该操作需在管理员权限下执行一次，后续普通用户即可正常使用。&lt;/p&gt;
&lt;p&gt;初始化步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;以管理员身份启动 PowerShell：&lt;/li&gt;
&lt;li&gt;按 &lt;code&gt;Win + S&lt;/code&gt;，搜索 "PowerShell"；&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;右键选择 "以管理员身份运行"。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置 PowerShell 执行策略，允许本地脚本运行：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;Set-ExecutionPolicy&lt;/span&gt; &lt;span class="n"&gt;RemoteSigned&lt;/span&gt; &lt;span class="n"&gt;-Scope&lt;/span&gt; &lt;span class="n"&gt;CurrentUser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;输入 &lt;code&gt;Y&lt;/code&gt; 并回车确认。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;执行 Conda 初始化命令：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;C:\Miniconda3\Scripts\conda.exe&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="n"&gt;powershell&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;关闭当前 PowerShell 窗口，重新打开一个新的普通 PowerShell 窗口（无需管理员权限）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;验证初始化是否成功：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;若返回版本号（如 &lt;code&gt;conda 24.5.0&lt;/code&gt;），说明配置成功。此时命令行提示符前可能显示 &lt;code&gt;(base)&lt;/code&gt;，表示 Conda 的基础环境已激活。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4、配置 Conda 与 pip 使用 USTC 镜像源&lt;/h2&gt;
&lt;h3&gt;配置 Conda 镜像源&lt;/h3&gt;
&lt;p&gt;由于 USTC 镜像不提供 Anaconda 官方的 defaults 频道，我们需要移除 defaults，改为使用 conda-forge 和 bioconda 这两个社区频道。&lt;/p&gt;
&lt;p&gt;首先，检查是否已存在 &lt;code&gt;.condarc&lt;/code&gt; 配置文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-show-sources&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;如果显示的配置中包含 &lt;code&gt;defaults&lt;/code&gt; 频道，先删除该文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;Remove-Item&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$env:USERPROFILE\.condarc&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-ErrorAction&lt;/span&gt; &lt;span class="n"&gt;SilentlyContinue&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;然后重新生成并写入 USTC 镜像配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-set&lt;/span&gt; &lt;span class="n"&gt;show_channel_urls&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这条命令会在 &lt;code&gt;%USERPROFILE%&lt;/code&gt; 目录下生成 &lt;code&gt;.condarc&lt;/code&gt; 文件。接下来手动写入完整配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="sh"&gt;@&amp;#39;&lt;/span&gt;
&lt;span class="sh"&gt;channels:&lt;/span&gt;
&lt;span class="sh"&gt;  - nodefaults&lt;/span&gt;
&lt;span class="sh"&gt;custom_channels:&lt;/span&gt;
&lt;span class="sh"&gt;  conda-forge: https://mirrors.ustc.edu.cn/anaconda/cloud&lt;/span&gt;
&lt;span class="sh"&gt;  bioconda: https://mirrors.ustc.edu.cn/anaconda/cloud&lt;/span&gt;
&lt;span class="sh"&gt;show_channel_urls: true&lt;/span&gt;
&lt;span class="sh"&gt;&amp;#39;@&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Out-File&lt;/span&gt; &lt;span class="n"&gt;-FilePath&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$env:USERPROFILE\.condarc&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-Encoding&lt;/span&gt; &lt;span class="n"&gt;utf8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;写入完成后，清除索引缓存使配置生效：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="n"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;验证配置是否正确：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;-n&lt;/span&gt; &lt;span class="n"&gt;testenv&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="n"&gt;-c&lt;/span&gt; &lt;span class="n"&gt;conda-forge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;如果能正常从 USTC 镜像下载并安装，说明配置成功。可以删除测试环境：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt; &lt;span class="n"&gt;-n&lt;/span&gt; &lt;span class="n"&gt;testenv&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;配置 pip 镜像源&lt;/h3&gt;
&lt;p&gt;执行以下命令创建 pip 配置文件，使用 USTC 的 PyPI 镜像：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$env:APPDATA&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt;
&lt;span class="sh"&gt;@&amp;#39;&lt;/span&gt;
&lt;span class="sh"&gt;[global]&lt;/span&gt;
&lt;span class="sh"&gt;index-url = https://pypi.mirrors.ustc.edu.cn/simple&lt;/span&gt;
&lt;span class="sh"&gt;trusted-host = pypi.mirrors.ustc.edu.cn&lt;/span&gt;
&lt;span class="sh"&gt;&amp;#39;@&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Out-File&lt;/span&gt; &lt;span class="n"&gt;-FilePath&lt;/span&gt; &lt;span class="nv"&gt;$env:APPDATA&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="p"&gt;\&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ini&lt;/span&gt; &lt;span class="n"&gt;-Encoding&lt;/span&gt; &lt;span class="n"&gt;utf8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;配置完成后，所有 &lt;code&gt;pip install&lt;/code&gt; 命令将自动使用 USTC 的 PyPI 镜像，显著提升安装速度。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;5、创建 Python 3.12 虚拟环境&lt;/h2&gt;
&lt;p&gt;为避免不同项目间的依赖冲突，推荐使用 Conda 创建独立的虚拟环境。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;创建与激活环境&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# 创建名为 dev、Python 版本为 3.12 的环境&lt;/span&gt;
&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;-n&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;12&lt;/span&gt; &lt;span class="n"&gt;-y&lt;/span&gt;
&lt;span class="c"&gt;# 激活该环境&lt;/span&gt;
&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;激活后，命令行提示符前将显示 &lt;code&gt;(dev)&lt;/code&gt;，表示当前处于 &lt;code&gt;dev&lt;/code&gt; 环境中。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;验证 Python 版本&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;输出应为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Python 3.12.x
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2&gt;6、使用 conda 和 pip 安装包&lt;/h2&gt;
&lt;p&gt;在虚拟环境中，可使用 &lt;code&gt;conda&lt;/code&gt; 或 &lt;code&gt;pip&lt;/code&gt; 安装所需库。由于 USTC 镜像走的是 conda-forge 频道，安装时建议显式指定 &lt;code&gt;-c conda-forge&lt;/code&gt;，若包在 conda-forge 中不存在，再使用 &lt;code&gt;pip&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装示例&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# 确保已激活 dev 环境&lt;/span&gt;
&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt;
&lt;span class="c"&gt;# 使用 conda 从 conda-forge 安装 numpy&lt;/span&gt;
&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="n"&gt;-c&lt;/span&gt; &lt;span class="n"&gt;conda-forge&lt;/span&gt; &lt;span class="n"&gt;-y&lt;/span&gt;
&lt;span class="c"&gt;# 使用 pip 安装 requests（从 USTC PyPI 镜像）&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;查看已安装的包&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看 Conda 安装的包：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;conda&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;查看 pip 安装的包：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2&gt;7、常用命令速查&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能&lt;/th&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;激活环境&lt;/td&gt;
&lt;td&gt;&lt;code&gt;conda activate dev&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;退出当前环境&lt;/td&gt;
&lt;td&gt;&lt;code&gt;conda deactivate&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;查看所有环境&lt;/td&gt;
&lt;td&gt;&lt;code&gt;conda env list&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;删除环境&lt;/td&gt;
&lt;td&gt;&lt;code&gt;conda env remove -n dev&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;导出环境配置&lt;/td&gt;
&lt;td&gt;&lt;code&gt;conda env export &amp;gt; environment.yml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;从配置文件创建环境&lt;/td&gt;
&lt;td&gt;&lt;code&gt;conda env create -f environment.yml&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;从 conda-forge 安装包&lt;/td&gt;
&lt;td&gt;&lt;code&gt;conda install &amp;lt;包名&amp;gt; -c conda-forge&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过上述步骤，已完成以下配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从 USTC 镜像下载并安装 Miniconda3 至 &lt;code&gt;C:\Miniconda3&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;在 PowerShell 中正确初始化 Conda；&lt;/li&gt;
&lt;li&gt;将 Conda 的频道配置为 USTC 镜像的 conda-forge 和 bioconda；&lt;/li&gt;
&lt;li&gt;将 pip 的默认源设置为 USTC PyPI 镜像；&lt;/li&gt;
&lt;li&gt;创建了独立的 Python 3.12 开发环境；&lt;/li&gt;
&lt;li&gt;掌握了基本的包管理操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;日常开发中应始终使用虚拟环境，以保持项目依赖的清晰与隔离。该配置适用于数据科学、机器学习、Web 开发等多种 Python 应用场景。&lt;/p&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;USTC Anaconda 镜像帮助：&lt;a href="https://mirrors.ustc.edu.cn/help/anaconda.html"&gt;https://mirrors.ustc.edu.cn/help/anaconda.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;USTC PyPI 镜像帮助：&lt;a href="https://mirrors.ustc.edu.cn/help/pypi.html"&gt;https://mirrors.ustc.edu.cn/help/pypi.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Miniconda 安装包目录：&lt;a href="https://mirrors.ustc.edu.cn/anaconda/miniconda/"&gt;https://mirrors.ustc.edu.cn/anaconda/miniconda/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Education"/><category term="Windows"/><category term="Miniconda3"/><category term="USTC"/><category term="镜像"/><category term="conda-forge"/></entry><entry><title>最低配 MacBook Air M4 16G 跑 9B 模型：Ollama、oMLX、MoXing 三条路线实测</title><link href="https://blog.cycleuser.org/zui-di-pei-macbook-air-m4-16g-pao-9b-mo-xing-ollama-omlx-moxing-san-tiao-lu-xian-shi-ce.html" rel="alternate"/><published>2026-08-14T07:30:00+08:00</published><updated>2026-08-14T07:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-14:/zui-di-pei-macbook-air-m4-16g-pao-9b-mo-xing-ollama-omlx-moxing-san-tiao-lu-xian-shi-ce.html</id><summary type="html">&lt;p&gt;对于手头只有一台最低配 MacBook Air（M4，16G 统一内存，256G 硬盘）的朋友来说，能不能本地跑一个 9B 模型，还能不能用起来？答案是可以 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;对于手头只有一台最低配 MacBook Air（M4，16G 统一内存，256G 硬盘）的朋友来说，能不能本地跑一个 9B 模型，还能不能用起来？答案是可以，但"用哪个引擎跑"这件事，速度差得不是一点半点。&lt;/p&gt;
&lt;p&gt;这一篇拿手上这台最低配 Air，把三条路线——Ollama、oMLX、MoXing——全跑了一遍，速度和工具调用能力都测了，数据摆出来，分享给大家。&lt;/p&gt;
&lt;h2&gt;测试环境&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;MacBook Air M4
内存: 16G 统一内存架构
硬盘: 256G SSD
推理: Apple M4 GPU (Metal) + CPU 混合
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;三个引擎都是最新版：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;引擎&lt;/th&gt;
&lt;th&gt;定位&lt;/th&gt;
&lt;th&gt;底层&lt;/th&gt;
&lt;th&gt;装法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ollama 0.32.9&lt;/td&gt;
&lt;td&gt;最流行的本地 LLM 管理器&lt;/td&gt;
&lt;td&gt;自带 runner&lt;/td&gt;
&lt;td&gt;&lt;code&gt;brew install ollama&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oMLX 0.5.7&lt;/td&gt;
&lt;td&gt;Apple Silicon 原生推理服务器&lt;/td&gt;
&lt;td&gt;mlx-lm（Apple 官方）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;brew tap jundot/omlx &amp;amp;&amp;amp; brew install omlx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoXing 0.1.38&lt;/td&gt;
&lt;td&gt;llama.cpp 的 Python 封装&lt;/td&gt;
&lt;td&gt;llama.cpp（Metal）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install moxing&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ollama 的 MLX 底层似乎是把权重拆成几百个散装 blob 存起来，跑的时候走 Ollama 自己的 runner，绕了一道。要说原生调 MLX，那还是 oMLX（直接基于 Apple 官方的 mlx-lm）。MoXing 则是另一条路——直接跑 llama.cpp，走的是 GGUF 这条更通用的路子。&lt;/p&gt;
&lt;h2&gt;模型从哪来&lt;/h2&gt;
&lt;p&gt;测三个引擎需要模型。两个 9B 选手：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;qwen3.5:9b&lt;/strong&gt;（Qwen3.5 系列，工具调用 + 编码都能打）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;omnicoder-2-9b&lt;/strong&gt;（社区 coding 模型，Q4_K_M 量化，GGUF 格式）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下载路径各不一样，这里有个坑值得单独说：&lt;/p&gt;
&lt;p&gt;Ollama 的模型&lt;strong&gt;基本不能直接给 oMLX 用&lt;/strong&gt;。就我实测，Ollama 把 MLX 权重拆成了逐个 tensor 的 blob（我 hexdump 看过，每个 blob 是 &lt;code&gt;长度前缀 + JSON 元数据 + 裸 tensor&lt;/code&gt;），oMLX 要的是标准的 &lt;code&gt;config.json + model.safetensors + tokenizer.json&lt;/code&gt; 目录结构，两者对不上。&lt;/p&gt;
&lt;p&gt;oMLX 这边，好消息是它&lt;strong&gt;原生支持 ModelScope 下载&lt;/strong&gt;（内置了 &lt;code&gt;ms_downloader&lt;/code&gt;，走 modelscope SDK）。Qwen 是阿里自家的，ModelScope 也是阿里的，所以 Qwen 系列的 MLX 版本在 ModelScope 上最全，国内直连比 HuggingFace 快得多：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# oMLX 从 ModelScope 拉 Qwen3.5 的 MLX 版&lt;/span&gt;
snapshot_download&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mlx-community/Qwen3.5-9B-MLX-4bit&amp;#39;&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;local_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;~/.omlx/models/...&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;MoXing 更省事，它&lt;strong&gt;能直接读 Ollama 下载好的用户上传的 GGUF&lt;/strong&gt;。Ollama 的 GGUF 模型本来就是整个文件存成一个 blob，MoXing 找到这个 blob 的路径就能直接跑，但是要注意只能运行omnicoder-9b这样的用户上传的GGUF，而不是Ollama的官方的GGUF：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;moxing.ollama&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OllamaClient&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OllamaClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_model_gguf_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;carstenuhlig/omnicoder-2-9b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# /Users/fred/.ollama/models/blobs/sha256-550e8f...  (5.74 GB)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;速度对比&lt;/h2&gt;
&lt;p&gt;测速统一用 300 token 长文本生成、关闭思考、热启动取三次平均。这是最贴近"实际持续生成"的数字，比工具调用那种只吐几十个 token 的短回复更能反映真实吞吐。&lt;/p&gt;
&lt;h3&gt;9B 模型&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;引擎&lt;/th&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;生成速度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;Q4_K_M (GGUF)&lt;/td&gt;
&lt;td&gt;4.6 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoXing&lt;/td&gt;
&lt;td&gt;omnicoder-2-9b（同一份 GGUF）&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.0 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;qwen3.5:9b-mlx&lt;/td&gt;
&lt;td&gt;NVFP4 (safetensors)&lt;/td&gt;
&lt;td&gt;5.1 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oMLX&lt;/td&gt;
&lt;td&gt;qwen3.5 9B&lt;/td&gt;
&lt;td&gt;4bit&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.5 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;冷启动（含模型加载）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;引擎&lt;/th&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;冷启动耗时&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;~62s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MoXing&lt;/td&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;~38s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;qwen3.5:9b-mlx&lt;/td&gt;
&lt;td&gt;~66s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oMLX&lt;/td&gt;
&lt;td&gt;qwen3.5 9B&lt;/td&gt;
&lt;td&gt;~44s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Ollama vs MoXing：同模型多轮统计&lt;/h3&gt;
&lt;p&gt;上面 omnicoder 那一行（4.6 vs 5.0）是整体平均值。为了看清楚 MoXing 到底快在哪，把同一个 GGUF 按「输入长短 × 输出长短」切成四个场景，每个场景跑 3 次取平均：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;Ollama (tok/s)&lt;/th&gt;
&lt;th&gt;MoXing (tok/s)&lt;/th&gt;
&lt;th&gt;加速比&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;短输入-短输出（60 tok）&lt;/td&gt;
&lt;td&gt;4.65 ± 0.94&lt;/td&gt;
&lt;td&gt;5.00 ± 0.70&lt;/td&gt;
&lt;td&gt;1.08×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;短输入-长输出（300 tok）&lt;/td&gt;
&lt;td&gt;4.68 ± 0.12&lt;/td&gt;
&lt;td&gt;4.61 ± 0.56&lt;/td&gt;
&lt;td&gt;0.99×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;长输入-短输出（60 tok）&lt;/td&gt;
&lt;td&gt;4.29 ± 1.13&lt;/td&gt;
&lt;td&gt;4.77 ± 1.25&lt;/td&gt;
&lt;td&gt;1.11×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;长输入-长输出（300 tok）&lt;/td&gt;
&lt;td&gt;4.74 ± 0.15&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.51 ± 0.09&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.16×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;整体平均&lt;/td&gt;
&lt;td&gt;4.59&lt;/td&gt;
&lt;td&gt;4.97&lt;/td&gt;
&lt;td&gt;1.08×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;规律大致是：&lt;strong&gt;长输入场景 MoXing 优势大（11-16%），短输入场景差距小（0-8%）&lt;/strong&gt;。原因大概在于 MoXing 默认开了 Flash Attention 和 KV cache 4-bit 量化，这些优化的收益主要落在 prefill（处理输入）阶段，输入越长省得越多。短 prompt 时 prefill 占比小，两边 decode 速度本来就接近，差距就摊薄了。&lt;/p&gt;
&lt;h3&gt;0.8B 模型&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;引擎&lt;/th&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;生成速度&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;qwen3.5:0.8b-mlx-bf16&lt;/td&gt;
&lt;td&gt;BF16&lt;/td&gt;
&lt;td&gt;25 tok/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oMLX&lt;/td&gt;
&lt;td&gt;qwen3.5 0.8B&lt;/td&gt;
&lt;td&gt;8bit&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34.4 tok/s&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;工具调用能力对比&lt;/h2&gt;
&lt;p&gt;速度只是一方面，工具调用能不能打，才算得上本地模型能不能干活的更关键一环。测试沿用之前那套方案——参照 BFCL / ToolBench / τ-bench 的方法论，23 个用例 × 中英双语 = 46 个测试，覆盖简单调用、并行调用、工具选择、无关场景、多轮串行、边界情况八个维度。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;引擎&lt;/th&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;通过率&lt;/th&gt;
&lt;th&gt;EN&lt;/th&gt;
&lt;th&gt;ZH&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;qwen3.5:9b-mlx&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;67.4%&lt;/strong&gt; (31/46)&lt;/td&gt;
&lt;td&gt;78.3%&lt;/td&gt;
&lt;td&gt;56.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oMLX&lt;/td&gt;
&lt;td&gt;qwen3.5 9B 4bit&lt;/td&gt;
&lt;td&gt;65.2% (30/46)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;82.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;47.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;63.0% (29/46)&lt;/td&gt;
&lt;td&gt;78.3%&lt;/td&gt;
&lt;td&gt;47.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;分维度得分：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;qwen3.5:9b-mlx (Ollama)&lt;/th&gt;
&lt;th&gt;qwen3.5 9B (oMLX)&lt;/th&gt;
&lt;th&gt;omnicoder-2-9b (Ollama)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;simple&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;parallel&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.90&lt;/td&gt;
&lt;td&gt;0.96&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tool_selection&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;irrelevant&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.50&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;multi_turn&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.38&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.21&lt;/td&gt;
&lt;td&gt;0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tau_retail&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.50&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.50&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;edge&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.83&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;之前那篇测过 11 个 1B 及以下的小模型，用的就是同一套 46 用例的脚本。把这次的三个 9B 成绩放进去一起排：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;参数量&lt;/th&gt;
&lt;th&gt;通过率&lt;/th&gt;
&lt;th&gt;来源&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;1.2B&lt;/td&gt;
&lt;td&gt;76.1%&lt;/td&gt;
&lt;td&gt;之前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:1.7b&lt;/td&gt;
&lt;td&gt;1.7B&lt;/td&gt;
&lt;td&gt;76.1%&lt;/td&gt;
&lt;td&gt;之前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;340M&lt;/td&gt;
&lt;td&gt;67.4%&lt;/td&gt;
&lt;td&gt;之前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;qwen3.5:9b-mlx&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9B&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;67.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;本篇 (Ollama)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5 9B&lt;/td&gt;
&lt;td&gt;9B&lt;/td&gt;
&lt;td&gt;65.2%&lt;/td&gt;
&lt;td&gt;本篇 (oMLX)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;0.8B&lt;/td&gt;
&lt;td&gt;63.0%&lt;/td&gt;
&lt;td&gt;之前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;9B&lt;/td&gt;
&lt;td&gt;63.0%&lt;/td&gt;
&lt;td&gt;本篇 (Ollama)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:0.6b&lt;/td&gt;
&lt;td&gt;0.75B&lt;/td&gt;
&lt;td&gt;56.5%&lt;/td&gt;
&lt;td&gt;之前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m&lt;/td&gt;
&lt;td&gt;350M&lt;/td&gt;
&lt;td&gt;54.3%&lt;/td&gt;
&lt;td&gt;之前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2:1b&lt;/td&gt;
&lt;td&gt;1.2B&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;td&gt;之前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;functiongemma&lt;/td&gt;
&lt;td&gt;268M&lt;/td&gt;
&lt;td&gt;17.4%&lt;/td&gt;
&lt;td&gt;之前&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemma3:1b&lt;/td&gt;
&lt;td&gt;1B&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;之前&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;第一眼有点意外：9B 的通过率（63-67%）并没有碾压小模型，甚至被 lfm2.5-thinking 和 smollm2:1.7b 反超。但仔细看能看出门道：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9B 的 parallel（并行调用）这次拿了满分。&lt;/strong&gt; qwen3.5:9b 在"同时查几个城市天气、同时调多个工具"这类场景拿到 1.0，和 lfm2.5 打平，超过其他所有小模型。一次回复里规划多个工具调用，这是"复杂工具编排"的能力，比单次调用更接近真实 agent 干活的场景。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lfm2.5 的 76% 是拿速度换的。&lt;/strong&gt; 它跑了 668 秒，是 granite4:350m-h（60 秒）的十倍还多——thinking 机制让它每一步都先"想"再"做"。真实场景里没人愿意为一个天气查询干等十几秒。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更重要的是，9B 是通用模型。&lt;/strong&gt; lfm2.5、smollm2 这些是在"工具调用"这个窄场景里表现好，让它们写代码、读长文档、做复杂推理，往往就直接掉链子。9B 相对是"什么都能干一点"——编码、长上下文、复杂推理、工具调用，都不算太拉胯。&lt;/p&gt;
&lt;p&gt;所以"应急"的准确含义是：手头只有一台 16G 的 Air、没有网、又需要本地模型处理一点稍微复杂的活时，9B 是那个能顶上的——它不算顶尖，但不会像 1B 小模型那样在复杂任务面前直接宕机。&lt;/p&gt;
&lt;p&gt;反过来，小模型也有它的位置。别看完上面的对比就觉得 9B 全面压制。在"简单工具调用"这个专门场景里，有些小模型不输 9B，甚至反超：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;granite4:350m-h（349MB）通过率 67.4% 和 9B 打平，但简单调用（0.83）和多轮串行（0.79）两项都超过了 qwen3.5 9B 的 0.67 和 0.38&lt;/li&gt;
&lt;li&gt;关键是它只要 349MB、60 秒就跑完整个测试，常驻内存几乎零负担，随叫随到&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以更实用的组合不是二选一，而是各存一个：&lt;strong&gt;常驻一个 granite4:350m-h 这种轻量模型处理高频的简单调用，需要复杂任务时再临时拉 9B 出来。&lt;/strong&gt; 一个管"快"，一个管"全"，不冲突。&lt;/p&gt;
&lt;h2&gt;几个有意思的发现&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;同一个 GGUF，换引擎平均快个 8%，长输入快更多。&lt;/strong&gt; MoXing 跑的就是 Ollama 下载的那份 omnicoder-2-9b GGUF，字节都没变。就这次多轮统计来看，短输入场景基本持平（0.99-1.08×），长输入场景能快 11-16%。原因大概在 runner 的默认参数——Ollama 没开 KV cache 量化、Flash Attention、连续批处理这些优化，而 MoXing 启动时默认就全开了（&lt;code&gt;-ctk q4_0 -ctv q4_0 --flash-attn on --cont-batching&lt;/code&gt;），这些优化的收益集中在处理长输入的 prefill 阶段。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;oMLX 的原生 MLX 比 Ollama 的 MLX 兼容层是要快一些。&lt;/strong&gt; 9B 那组是 6.5 vs 5.1 tok/s，快 27%。这组相对干净——两边都是 4bit 级量化（NVFP4 vs MLX 4bit），可比。0.8B 那组 oMLX 快 38%，但那里 Ollama 用的是 BF16 全精度、oMLX 用 8bit，量化更低，所以 38% 里有一部分是量化差异的功劳，不能全算到引擎头上。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;工具调用能力基本跟引擎无关，主要还是取决于模型本身。&lt;/strong&gt; qwen3.5 9B 在 Ollama 里 67.4%，换到 oMLX 里 65.2%，基本持平。这大概说明换引擎不会明显提升模型的工具调用水平——引擎主要决定快慢，模型才决定好坏。要提升工具调用，得换模型或换量化，不是换引擎。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;omnicoder-2-9b 的多轮串行算是短板。&lt;/strong&gt; "先翻译再发邮件"这种链式任务，omnicoder-2-9b 只有 0.08 分，qwen3.5 9B 有 0.38。它定位是 coding 模型，工具调用不是强项，尤其多步依赖的场景基本掉链子。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;中文工具调用普遍比英文差。&lt;/strong&gt; 三个 9B 英文都在 78-83%，中文只有 47-57%，掉 30 个点以上。即使 Qwen3.5 9B 这种中英都训过的模型也一样，大概率说明这些模型的工具调用能力主要还是英文训练数据喂出来的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;16G 内存确实吃紧，oMLX 的 SSD caching 算是个解。&lt;/strong&gt; 9B 模型 4bit 量化后 5.6GB，加上 KV cache 和其他进程，16G 内存已经不宽裕。oMLX 的 tiered KV cache + SSD caching（把冷 KV 块落到 SSD，热块留内存）在这台机器上是有意义的，这是 Ollama 没有的。不过它要占硬盘，硬盘紧张的话就得掂量一下了。&lt;/p&gt;
&lt;h2&gt;选型建议&lt;/h2&gt;
&lt;p&gt;结合速度和工具调用，三条路线各管一段：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要省心、生态全：Ollama。&lt;/strong&gt; 一条命令拉模型，全平台支持，缺点是速度稍慢。适合第一次接触本地模型、或者不在乎多等几秒的场景。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要速度、跑 GGUF：MoXing。&lt;/strong&gt; 直接读 Ollama 下载的 GGUF，同一份权重平均能快个 8%，长输入场景更明显，Metal 后端自动检测。缺点是得 pip 装、自己配，生态不如 Ollama。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;oMLX 呢？&lt;/strong&gt; 原生调 mlx-lm，9B 快 27%、冷启动快 1/3，还带 SSD caching。但说实话，我自己最后把它卸了——MLX 的加速在 9B 这个体量上感觉意义不大，速度差距没多少，还不如直接用 llama.cpp 这类，更省空间也省事。它那个 SSD 缓存听着不错，但我这 256G 硬盘本来就不太够用，就先不折腾了。要是你硬盘宽裕、又主要在 Apple Silicon 上跑 MLX 模型，它还是值得一试的。&lt;/p&gt;
&lt;p&gt;模型本身的话，&lt;strong&gt;工具调用场景首选 qwen3.5 9B&lt;/strong&gt;，它的 parallel 能拿满分、多轮串行也最强；omnicoder-2-9b 留给纯 coding 用，别指望它做多步工具编排。&lt;/p&gt;
&lt;h2&gt;几点说明&lt;/h2&gt;
&lt;p&gt;最后交代一下这次对比的局限性。&lt;/p&gt;
&lt;p&gt;速度和引擎那部分，受网络和存储的限制，没能从 HuggingFace 把全部模型的 GGUF 和 MLX 版本都下载齐，导致量化等级对不齐——BF16 对 8bit、NVFP4 对 4bit，不完全是同一个东西在比。所以"谁快多少"这个数字只能当个粗略参考，别拿去当精确结论。&lt;/p&gt;
&lt;p&gt;工具调用那部分是另一回事：三套引擎跑的是同一套 46 用例的测试脚本，跟之前小模型的成绩可以直接排在一起比。这部分结论是站得住的——9B 没在工具调用上碾压小模型，但它是通用模型，需要应急处理复杂任务时，它还是能顶上的那个。&lt;/p&gt;</content><category term="LLM"/><category term="ollama"/><category term="omlx"/><category term="moxing"/><category term="mlx"/><category term="llama.cpp"/><category term="9B模型"/><category term="本地部署"/><category term="tool calling"/><category term="工具调用"/><category term="MacBook Air M4"/></entry><entry><title>给大一新生的计算机使用建议</title><link href="https://blog.cycleuser.org/gei-da-yi-xin-sheng-de-ji-suan-ji-shi-yong-jian-yi.html" rel="alternate"/><published>2026-08-11T12:00:00+08:00</published><updated>2026-08-11T12:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-11:/gei-da-yi-xin-sheng-de-ji-suan-ji-shi-yong-jian-yi.html</id><summary type="html">&lt;p&gt;这篇文章是我给大一同学们的一些计算机使用方面的建议。不是什么高深的技术，都是踩过坑之后攒下来的经验。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;固态硬 …&lt;/h2&gt;</summary><content type="html">&lt;p&gt;这篇文章是我给大一同学们的一些计算机使用方面的建议。不是什么高深的技术，都是踩过坑之后攒下来的经验。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;固态硬盘尽量别分区&lt;/h2&gt;
&lt;p&gt;建议大家尽量不对固态硬盘做分区处理，用目录来进行文件管理就好。也别没事就去格式化——格式化就意味着数据全丢。&lt;/p&gt;
&lt;p&gt;为什么要额外准备一块机械硬盘做备份呢？因为固态硬盘的数据恢复，相比机械硬盘，成本高得多，也不那么方便。机械硬盘的存储是基于磁道上的磁性标记，只要原来的数据没有被真正覆盖，就总还有机会拿回来，甚至还有开盘读取这种进阶手段。但固态硬盘是直接用电信号写入的，没有物理上的磁性残留，想恢复的话，有时候未必总有那么多机会。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;云盘备份这件事&lt;/h2&gt;
&lt;p&gt;除了额外的机械硬盘之外，还建议要有一个靠谱的、能稳定访问的云盘。&lt;/p&gt;
&lt;p&gt;大概十五六年前，有家云盘公司曾经夸下海口，说自己的服务是终身免费的，容量给得特别大。结果很明显，这事儿不可持续。它突然有一天说终止运营了，让大家把数据都下载下去。那会儿我有一个同学，之前听信了这个厂商的宣传，把所有数据都传到了这个云盘上。后来发现下载带宽非常低，根本下不完。那会儿甚至有人提出愿意提供自己的硬盘，想邮寄给这家公司，让人家帮忙把数据导出来——因为有的人的数据真是没考虑过这公司可能这么不靠谱。但很遗憾，这些请求好像都没能成功。最终我那位同学丢失了很多数据，非常懊悔。&lt;/p&gt;
&lt;p&gt;与此同时，我经历过一次硬盘损坏。好在那次用的是机械硬盘，做了数据恢复。从那以后，如果用网盘，我就尽量多备份几份。免费的、付费的，尽量都舍得一点——数据的安全性是最根本的保障。数据恢复的价格要比硬盘的物料价格、甚至比云盘的订阅价格都贵很多。十三四年前我做过一次数据恢复，两个 T 还是三个 T 的数据来着，花了几千块。那会儿这么大的硬盘本身都没那么高的价格，这笔恢复费是非常贵的钱了。&lt;/p&gt;
&lt;p&gt;所以，要有云盘备份，而且尽量别只依赖一家。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;数据的优先级划分&lt;/h2&gt;
&lt;p&gt;在备份数据的时候，可以考虑对数据做一个优先级的划分。&lt;/p&gt;
&lt;p&gt;最普通常见的、不是特别重要的数据，你可以不怎么备份，或者只放一份。相对重要、但能够得到下载链接、或者后面还有机会再拿到的，也可以备份一下，但不必浪费云盘上的太多空间。&lt;/p&gt;
&lt;p&gt;只有那些&lt;strong&gt;非常重要&lt;/strong&gt;的东西——比如家人照片、视频、自己的重要文档、毕业论文、学位论文等等——建议尽量别只放一份。存云盘的时候应该打包成压缩包，并且加上密码，来粗略保障一下数据安全。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;软件尽量装到默认路径&lt;/h2&gt;
&lt;p&gt;对于新手来说，使用计算机的另一个建议是：尽量把软件安装到默认路径。&lt;/p&gt;
&lt;p&gt;除非你特别有把握，并且有经验的人明确跟你说过这件事儿要改路径，你再改。因为有可能某些软件就因为路径被改到了别的地方，就运行不正常了。还有一些软件会要求安装路径里不能有特殊符号——中文不行，空格也不行。&lt;/p&gt;
&lt;p&gt;什么情况下需要自定义路径呢？就是当你明确知道这事儿我要这么做，而且知道这么做会有什么效果，也清楚会有什么隐患，并且你能够解决这些问题的时候。有这些充足的准备和信心，你就可以自己动手。&lt;/p&gt;
&lt;p&gt;比如我常举的一个例子：Miniconda。我经常会把它安装到系统盘分区的一个比较短的目录下。因为后面要在这里边创建很多个虚拟环境，虚拟环境里又有一些依赖包，依赖包里可能有一些文件的名字比较长。如果把它装到默认路径下，比如在用户的临时数据目录或者 Program Data 等目录下，就可能导致路径过长，有时候会引发一些意想不到的问题和故障。这都是踩过坑之后得到的经验。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;别给笔记本电脑贴贴纸&lt;/h2&gt;
&lt;p&gt;不建议给计算机贴上各种各样的贴纸。一方面可能会影响散热，另一方面，如果你后续不想要了、想二手卖掉，这些贴纸清理起来会留下胶粘的痕迹，甚至有划痕，反倒影响品相。&lt;/p&gt;
&lt;p&gt;你要实在想贴、想保护一下，弄个透明的那种也还好。不过话说回来，现在的计算机是个生产工具，但也是电子消费品。三年前买的机器，三年后可能连一半价格都卖不到了。除非什么呢——像内存、固态硬盘这些，遇到突发的行业涨价，那倒还有一定的保值率。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;买笔记本电脑尽量选可扩展内存的&lt;/h2&gt;
&lt;p&gt;如果大家买笔记本电脑，我的建议是尽量买支持内存扩展的。尤其是在现在内存价格非常贵的情况下，可扩展内存的机器给了你一个缓冲：自带的内存不够用的时候，你可以等到内存价格在你能够接受的时候，或者预算攒够了，或者内存降价了，再购入新的内存给它扩上去。&lt;/p&gt;
&lt;p&gt;运行内存提高了之后，就能运行更多的虚拟机。这就说到了虚拟机。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;虚拟机和我的转行经历&lt;/h2&gt;
&lt;p&gt;虚拟机最早在大概二十年前左右，那会儿我刚开始接触，是为了能够在一台机器上运行多个操作系统。&lt;/p&gt;
&lt;p&gt;当时我得到了一张从海外邮寄过来的 Ubuntu 6.06 安装盘，想安装起来用。但发现我的显卡和网卡都没驱动。那会儿就得知，用一个虚拟机把它装成虚拟系统，就很方便。再往后，就在这个过程中，使用虚拟机体验了很多不同的上古操作系统、相关的编程语言，还有一些古老的软件。&lt;/p&gt;
&lt;p&gt;后来又因为会装一点虚拟机和操作系统，又能装点工作用的工具软件和基础环境，就帮别人去弄像 Hadoop、Spark 之类的存储和计算工具。这是我早期转行的初期的机会之一。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;尽量别重装系统&lt;/h2&gt;
&lt;p&gt;说到操作系统，现在一般来说，正常的笔记本电脑买到了之后都会有自带的正版系统，这已经在价格里了。&lt;/p&gt;
&lt;p&gt;大家会发现里边有一些自带的软件，比如某些品牌的助手，或者是什么数字安全软件之类的，建议把它们卸载掉。这些东西都会拖累你的运行速度，而且并不能提供什么真正的安全防护。但操作系统自带的安全管理软件还是可以保留的。如果你想要用像火绒这类主动防御工具，你要是能接受它带来的性能损失，那也可以使用。不过这些咱就不展开了——现在已经不是当年那种小狮子和免费杀软大战的时代了，在那个时代，还有一些厂商会自己参与一些很难说清楚是黑是白的事情。&lt;/p&gt;
&lt;p&gt;如果不是必要，建议尽量别自己重新安装整个系统。因为对于新手来说，驱动下载可能比较麻烦。现在很多之前的免费驱动工具软件，都要注册账户、甚至要买会员才给提供满速的服务了。这也正常，人家要保证自己的商业化嘛。&lt;/p&gt;
&lt;p&gt;但很多同学缺乏搜索的能力，还没有培养起这个经验。他不知道找电脑驱动，一是可以找笔记本电脑的品牌厂商，可能会有售后服务；二是可以找对应硬件的官网——比如显卡是 N 卡就找 N 卡官网，是 A 卡就找 A 卡官网。这个思路没掌握的话，就会觉得很痛苦。万一折腾好几天都弄不好，还得花钱找人帮忙，又耽误时间又降低效率，而且让自己心情很不好。&lt;/p&gt;
&lt;p&gt;所以建议新手，除了卸载一些不必要的软件之外，不是特别重要的情况下，尽量别重新安装操作系统，没有必要。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;别做品牌的粉丝&lt;/h2&gt;
&lt;p&gt;说到操作系统了，就多说一句。现在的小朋友应该不像以前那么偏激了。我们上学那会儿，有一个人得到了很多流量和关注。他说：要完全用 Linux 操作系统来工作，凡是 Linux 操作系统不能完成的工作，就都是不重要的工作。所有重要的工作用 Linux 操作系统都能完成。&lt;/p&gt;
&lt;p&gt;这个人后来自己也后悔了，也反思了，也承认了自己当时这么说的错误。再后来，他的流量也逐渐就不太行了，在很多地方都难以完整地完成学业，也充分体现了这个人在个性上和与人相处方面，还有很多可以磨砺的空间。&lt;/p&gt;
&lt;p&gt;大家尽量别因为买了一个设备、用了某个品牌的东西，就成为它的信徒和狂热粉丝，四处去跟人说这东西好。&lt;/p&gt;
&lt;p&gt;前几天就有人问我，某某水果品牌的设备好不好用，推荐买哪款。我就跟他说，最近就别买了，因为涨价了。而且它的芯片虽然用了统一内存，但在做本地模型运行的时候，解码的速度什么的都不是太理想——工具调用什么的也没有太多优势，反而不如那种专门的像 G10 之类的一体机。&lt;/p&gt;
&lt;p&gt;他就很好奇，他说：你看你这用着这个设备，你怎么还说它不好呢？我就跟他讲，不是因为我用了这个设备，我就得成为它的粉丝和拥护者。恰恰是因为我十多年来都用它这些设备，我才了解这个产品现在的状态。我能判断出，我现在是否应该推荐给那天我沟通的那位朋友——因为他的需求是有一定的本地模型部署需求的。但他不需要部署特别大规模的模型，那其实完全没必要追着统一内存的大内存。有一个对应的独立显卡的体验还更好。而且他也不需要轻薄，他更需要兼容性——尤其是有一些软件，在水果平台上本来就不兼容。&lt;/p&gt;
&lt;p&gt;希望大家尽量别这样。用什么，就用；该说什么就说什么。尽量别被品牌绑住。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;尽量别买太贵的手机&lt;/h2&gt;
&lt;p&gt;笔记本电脑三四千块钱就已经能用了，但是手机这个东西，有的都卖到五六千甚至七八千。而手机的折价又特别厉害，一年之后可能就腰斩了。&lt;/p&gt;
&lt;p&gt;建议大家读书的时候，还是尽量把钱花到刀刃儿上。养成对自己的财务负责的习惯——你现在花的每一分钱，要么是你父母挣的，要么是你自己辛辛苦苦攒的。别为了一个手机弄得自己经济紧张，或者给家里增加不必要的负担。够用就好。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;手机屏幕调光与频闪&lt;/h2&gt;
&lt;p&gt;现在手机屏幕除了亮度之外，还有一个很多人不知道的问题——频闪。&lt;/p&gt;
&lt;p&gt;目前手机屏幕的调光方式主要分两种：LCD 屏幕用 DC 直流调光，通过调整电流大小来控制亮度，没有频闪。但 OLED 屏幕大多用 PWM 调光，靠快速开关屏幕来模拟亮度变化——屏幕其实一直在闪，只是频率高到你以为它没闪。像我这种对频闪敏感的人，看一会儿就觉得眼睛刺、头疼。这不是心理作用，是生理反应。&lt;/p&gt;
&lt;p&gt;所以如果你跟我一样，用 OLED 手机觉得眼睛累，别觉得是自己用眼习惯不好。很可能就是 PWM 频闪的问题。选手机的时候可以留意一下有没有"类 DC 调光"或者"高频 PWM"的标注，或许会稍微好一点，但我还是觉得不如 LCD 的手机。&lt;/p&gt;
&lt;p&gt;另外，把亮度和环境光调到接近，以及千万别夜间黑灯刷手机。眼睛很累的。我有个师妹当年视网膜脱落了，记得她提到过的医生跟她说的不良用眼习惯里就有这个。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;不建议新手去实体店买笔记本电脑&lt;/h2&gt;
&lt;p&gt;还有一个建议：不建议新手去实体店买笔记本电脑。&lt;/p&gt;
&lt;p&gt;实体店买电脑被坑的案例太多了。&lt;/p&gt;
&lt;p&gt;我们专业 25 级的一个同学，电脑是在实体店找亲戚买的。官方的配置是 1T 固态硬盘、单根 16GB 内存，他拿到手的也是 1T 固态、16GB 内存——看着一模一样。但用了之后总觉得有点奇奇怪怪的。后来拆开一看，发现官方的是单根 1T 固态、单根 16GB 内存，到他这儿变成了两根 512GB 的固态、两根 8GB 的内存。很明显是被人调包了——人家把原厂单根大容量的拆走，换成了两根小容量的。单根高容量的内存和固态，那会儿价格已经开始涨了，拆出去单卖能比两根小容量的贵不少。而且这还是"找亲戚买的"，更让人觉得防不胜防。&lt;/p&gt;
&lt;p&gt;还有一个人在网上看好了一款机型，去实体店问价。店员说"这款我们也有，还便宜三百"。交了钱，店员说要去仓库提货，让他等半小时。等了很久之后回来说，你要的那款刚好卖完了，但我们有另一款配置更好的，稍微补点差价就行。这人信了，补了钱拿回去。后来发现，到手的那款网上根本查不到评测——是专供线下的特供型号，配置缩水得很厉害。&lt;/p&gt;
&lt;p&gt;这些套路的本质都一样：利用信息不对等赚你的钱。&lt;/p&gt;
&lt;p&gt;建议在电商平台上找靠谱的自营店铺，尽量别贪便宜。价格太低的，要么是翻新机，要么是展示机，要么是配置被换过的。说到底，一分钱一分货。另外，新手尤其是学生，没有足够的判断能力和承担风险的能力，&lt;strong&gt;尽量别买二手的&lt;/strong&gt;。二手市场水更深，你省的那点钱，很可能会变成学费。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;最后说几句&lt;/h2&gt;
&lt;p&gt;经常有人跟你们说，到了大学就简单了，就放松了，就可以玩儿了。其实这是最坑人的。&lt;/p&gt;
&lt;p&gt;因为到了大学，才是你最需要努力、最需要选择自己努力方向的时候。&lt;/p&gt;
&lt;p&gt;在高中的时候，有唯一的一个指挥棒——就是做题、考试、得分。只要考试得了分，那什么都没问题。家长也满意，老师也认可，整个评价体系都认为这是最棒的。但到了大学，成绩本身其实就不那么重要了。只要你不挂科，能够保研的基础能达到，大概也就行了。如果你不想保研，想考研，那只要不挂科、不影响正常学业，也没有太大问题。&lt;/p&gt;
&lt;p&gt;更重要的是参加比赛，是写论文。甚至是你去找一个自己中意的人，争取保护好、守护好一份感情，以后一起度过余生——这也都是很重要的事儿。&lt;/p&gt;
&lt;p&gt;希望大家能有一个非常难忘的、有收获的大学生活。&lt;/p&gt;</content><category term="随笔"/><category term="大学生活"/><category term="计算机"/><category term="硬盘"/><category term="数据安全"/><category term="装机"/></entry><entry><title>简单讲一下路径</title><link href="https://blog.cycleuser.org/jian-dan-jiang-yi-xia-lu-jing.html" rel="alternate"/><published>2026-08-11T10:00:00+08:00</published><updated>2026-08-11T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-11:/jian-dan-jiang-yi-xia-lu-jing.html</id><summary type="html">&lt;p&gt;给大一新生讲路径，其实是为了环境变量这个概念，很多新生朋友一开始接触的时候容易懵。一直想找一个比较通俗的方 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;给大一新生讲路径，其实是为了环境变量这个概念，很多新生朋友一开始接触的时候容易懵。一直想找一个比较通俗的方式把它讲明白。&lt;/p&gt;
&lt;p&gt;其实说白了，环境变量就相当于一个登记簿。&lt;/p&gt;
&lt;h2&gt;环境变量是个啥：去美食街看看&lt;/h2&gt;
&lt;p&gt;你去一条美食街，或者一个大商场，一般都会有个路牌儿，上面指着每家店铺在几楼、哪个位置。你照着这个牌子找到你想去的那家店，就完了。&lt;/p&gt;
&lt;p&gt;环境变量也是这么回事儿。它是一系列的目录路径，登记在系统里。系统要找一个程序、找一个文件的时候，先去这个登记簿上翻一翻，看看在不在上面写着。在的话，直接就定位过去了；不在的话，可能就找不着，甚至直接就给你忽略了。&lt;/p&gt;
&lt;p&gt;环境变量可以有好多个，不同的变量记着不同的东西，但其中最重要的一个叫 PATH。&lt;/p&gt;
&lt;h2&gt;PATH 是怎么回事儿：王小二的故事&lt;/h2&gt;
&lt;p&gt;这么说吧，假设我们班有一个叫王小二的同学。&lt;/p&gt;
&lt;p&gt;隔壁一班也有一个叫王小二的，甚至这三四个班每个班都有一个王小二。但是跑到篮球队上登记的，记录在篮球队队员名单里面的，是我们班这个王小二。&lt;/p&gt;
&lt;p&gt;那篮球队的教练，他一说"找王小二来"，找的肯定是我们班这个。因为他的登记簿上写的，就是我们班这个王小二。&lt;/p&gt;
&lt;p&gt;PATH 也是一样的道理。它就是一个目录名单。如果你的某一个目录被登记到了 PATH 这个环境变量里面，那么这个目录底下的二进制文件也好、快捷方式也好，系统就能直接找着，优先用它。没登记到 PATH 里的那些目录，系统就很难找到，甚至完全忽略掉。&lt;/p&gt;
&lt;h2&gt;编译器在哪儿&lt;/h2&gt;
&lt;p&gt;除了 PATH，还有一个跟开发关系很大的，就是编译器所在的路径。&lt;/p&gt;
&lt;p&gt;你比如你要用不同的编译器，有时候装了好几个版本，系统得知道这个编译器到底在哪儿。这时候可以用 &lt;code&gt;where&lt;/code&gt;、&lt;code&gt;locate&lt;/code&gt;、&lt;code&gt;whereis&lt;/code&gt;、&lt;code&gt;which&lt;/code&gt; 这些命令来尝试着找。当然，不同的终端、不同的操作系统，支持的命令也不太一样，这个得看自己用的是啥。&lt;/p&gt;
&lt;h2&gt;解释器的路径：Python 版本管理&lt;/h2&gt;
&lt;p&gt;再一个就是解释器的路径。拿 Python 来说，有的同学是直接安装的，也有的同学是用 miniconda 或者 conda 来安装，通过 conda 可以装多个不同版本的 Python。还有些同学习惯单独在某个项目底下新建一个对应的虚拟环境，各用各的。&lt;/p&gt;
&lt;p&gt;这些办法都行，大家各取所需，找一个自己比较习惯的就好。&lt;/p&gt;
&lt;p&gt;我个人的建议是用 miniconda，可以轻量级地方便地管理多个版本的 Python，甚至同一个版本的 Python 也可以创建好几个不同副本，互相不干扰。这么一来，就能避免不同库之间的版本冲突。&lt;/p&gt;
&lt;p&gt;举个例子：你做 PDF 文本提取的工具，比如 marker、markitdown 这些，它可能要求 numpy 的版本比较高。而另一个工具，比如一个做地质投图的，它可能就要求 numpy 1.64。这两个版本有冲突，你装在一个环境里就会打架。这时候用 conda 各开一个环境，各用各的解释器，各装各的 numpy，啥事儿都没有。&lt;/p&gt;
&lt;h2&gt;当前工作路径：你得知道自己在哪儿&lt;/h2&gt;
&lt;p&gt;你到一个商厦去买东西的时候，光知道其他饭店在几楼几号还不够，你还得知道你自己现在在哪儿吧？我现在所在的楼层，就是当前所在的目录路径。&lt;/p&gt;
&lt;p&gt;得先确定了自己在哪儿，再确定目标在哪儿，你才能找到一条路走过去。路径定了，方向就定了。&lt;/p&gt;
&lt;p&gt;从我这儿出发，往前走两步，然后右转就能到那。这个路径就叫相对路径，就是相对于我当前的一个参考点，找到对应的目标的位置。&lt;/p&gt;
&lt;p&gt;从这条大路开始，一直走800米，然后标号为358号，这个叫绝对路径，就是你就在这儿找，绝对在这358号店铺。&lt;/p&gt;
&lt;h2&gt;目标文件在哪儿&lt;/h2&gt;
&lt;p&gt;最后还有一个：你要用的目标代码文件或者资源文件所在的路径。它不一定就是你当前所在的工作路径。&lt;/p&gt;
&lt;p&gt;你别觉得，"我打开终端了，那我要用的文件就在这儿呗"——那可不一定。这俩不是一个概念。有时候你 Python 脚本要读一个 CSV，你得把那个 CSV 的路径写对，不然脚本找不到，就报错了。&lt;/p&gt;
&lt;p&gt;如果你只是自己用你这个绝对路径能确定，你就可以用绝对路径，这没问题。但如果你要把这东西分享给别人，有可能人家要放到别的地方，就要考虑是不是要用相对路径，不要把路径写得固定了。&lt;/p&gt;
&lt;h2&gt;说来说去，就是几个地址嘛&lt;/h2&gt;
&lt;p&gt;串一下，一共就这么几个路径：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;系统的环境变量路径&lt;/strong&gt;（PATH 那些登记在册的目录）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编译器的路径&lt;/strong&gt;（你要用的那个编译器装在哪了）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解释器的路径&lt;/strong&gt;（Python 装在哪个环境里、是哪个版本）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当前工作路径&lt;/strong&gt;（你现在站在商厦的哪一层）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;目标文件所在路径&lt;/strong&gt;（你要找的那家店在哪儿）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;看着挺复杂，其实就是个登记的地址本。理解了这一点，碰上路径相关的问题，静下来想想，找到目标位置，肯定能琢磨明白。&lt;/p&gt;</content><category term="Programming"/><category term="PATH"/><category term="Environment"/><category term="Linux"/><category term="Terminal"/><category term="Python"/><category term="Conda"/><category term="Beginner"/></entry><entry><title>建议大学生学用AI的时候尽量掌握一门编程语言</title><link href="https://blog.cycleuser.org/jian-yi-da-xue-sheng-xue-yong-aide-shi-hou-jin-liang-zhang-wo-yi-men-bian-cheng-yu-yan.html" rel="alternate"/><published>2026-08-11T08:30:00+08:00</published><updated>2026-08-11T08:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-11:/jian-yi-da-xue-sheng-xue-yong-aide-shi-hou-jin-liang-zhang-wo-yi-men-bian-cheng-yu-yan.html</id><summary type="html">&lt;p&gt;现在AI编程工具越来越多了，不少朋友觉得，反正有智能体帮忙写代码，大学生自己还学什么编程语言呢。这其实是得考虑考虑的。&lt;/p&gt;
&lt;p&gt;咱不是说非得 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;现在AI编程工具越来越多了，不少朋友觉得，反正有智能体帮忙写代码，大学生自己还学什么编程语言呢。这其实是得考虑考虑的。&lt;/p&gt;
&lt;p&gt;咱不是说非得逼着每个同学都去当程序员，而是说，要是一点编程基础都没有、直接上来就用AI，容易出问题。你想想，变量是啥不知道，循环和判断是啥不知道，函数调用和返回值是啥不知道，类和继承是啥也不知道。那智能体给你生成了代码，你就只能原样贴进去跑，跑通了也不知道为什么通，跑不通也不知道为什么不通。知其然都未必能做到，更别说知其所以然了。&lt;/p&gt;
&lt;p&gt;这个状态其实挺危险的。你拿一个自己不理解的产物去用，时间长了，会养成一些不太好的习惯——反正看不懂，跑通了就行，出了问题再让AI改。一来二去，自己的判断力没有任何增长，对AI的依赖倒是越来越深。&lt;/p&gt;
&lt;p&gt;如果只是偶尔用一下、体验体验，那直接用智能体聊天就够了，不用学太多。但如果可能长期用，尤其是自己手头有稳定的、复杂的业务流程要靠AI来辅助，那掌握一门编程语言就很有必要了，这关系到长期可持续性的问题。&lt;/p&gt;
&lt;h2&gt;不是让你当专家，是让你能想明白&lt;/h2&gt;
&lt;p&gt;《资治通鉴》里孙权劝吕蒙读书，说了一句很值得参考的话——不是让你研究经传、当个专业的学者，而是让你"涉猎见往事"，拓宽信息渠道，加深对局势的理解。学编程语言也是一样的道理。&lt;/p&gt;
&lt;p&gt;咱建议掌握一门编程语言，不需要去考级，只是说你要能理解最基础的这些东西：变量定义、分支判断、循环控制、函数封装、代码复用、抽象、类别定义和继承关系。说穿了，就这几个基本概念，翻来覆去地组合，就能自己想明白很多事情，有时候更为敏捷。&lt;/p&gt;
&lt;p&gt;想的明白了，遇到用得上的时候自己琢磨得清楚，再跟智能体沟通，就能把想要达到的目的、想要的状态、想要的产物描述得更清晰、更准确。你说得越清楚，智能体干得就越利索，效率自然就上去了。&lt;/p&gt;
&lt;h2&gt;别把鸡蛋放在一个篮子里&lt;/h2&gt;
&lt;p&gt;还有一个要特别注意的，就是避免对某一个具体模型产生依赖。&lt;/p&gt;
&lt;p&gt;你用惯了一个模型，觉得它特别好使，啥都交给它。万一哪天这个模型突然不能用了呢？或者涨价了呢？你所有的流程、所有的prompt、所有的习惯都是围绕它建立的，一下子就抓瞎了，非常被动。&lt;/p&gt;
&lt;p&gt;我前阵子发一篇文章的时候，里面截了几个模型的样例图，有位比较敏锐的读者朋友就发现了，说："你这几张图好像一直用的都是同一个模型啊？有尝试过其他模型吗？"&lt;/p&gt;
&lt;p&gt;我就跟人家解释了，我只是碰巧截图的时候用的那个模型。其实用多了智能体、把技能加载上去之后，模型之间的差距是可以逐渐缩小的，甚至可以完全忽略。&lt;/p&gt;
&lt;p&gt;智能体和技能系统把方法、流程、经验都固化成可复用的"菜谱"了，换一个模型就类似换一个厨师，但只要他照着菜谱做，做出来的菜就会差不太多。当然，换了厨师嘛，略有些许差距是正常的，但大体上不会差到哪儿去。&lt;/p&gt;
&lt;p&gt;所以这也是建议大家多用不同模型的原因。不把所有的篮子都放在一个鸡蛋上，防患于未然嘛。&lt;/p&gt;
&lt;h2&gt;大模型和智能体，不是一回事&lt;/h2&gt;
&lt;p&gt;大模型相当于具体干活的员工，智能体呢，是服务流程和操作场所。你设计好了这个流程，规定了什么时候做什么事、怎么调用工具、怎么处理结果，然后让大模型来执行。&lt;/p&gt;
&lt;p&gt;换个模型，就是换了个干活的。但流程没变，工具没变，所以产出的质量波动不会太大。这也是为什么说，掌握了编程基础、理解了流程逻辑之后，你对单一模型的依赖就会变小。因为你知道自己想要什么，知道流程该怎么走，换个模型无非就是换个人来走这条路而已。&lt;/p&gt;
&lt;p&gt;AI和编程可能会成为大学生必备的竞争力，而编程入门就行，也没那么复杂，比如Python，装好之后，花一点时间把变量、判断、循环、函数、类这几个概念跑一遍，写几个小例子，基本的概念框架就有了。&lt;/p&gt;
&lt;p&gt;很多事情，只要开始做，就成了一半。&lt;/p&gt;</content><category term="Programming"/><category term="AI"/><category term="Programming"/><category term="Agent"/><category term="LLM"/><category term="Learning"/><category term="Python"/></entry><entry><title>Ollama 小尺寸模型的工具调用能力评测</title><link href="https://blog.cycleuser.org/ollama-xiao-chi-cun-mo-xing-de-gong-ju-diao-yong-neng-li-ping-ce.html" rel="alternate"/><published>2026-08-10T02:00:00+08:00</published><updated>2026-08-10T02:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-10:/ollama-xiao-chi-cun-mo-xing-de-gong-ju-diao-yong-neng-li-ping-ce.html</id><summary type="html">&lt;p&gt;对于老鸟来说，本地部署模型，肯定是vllm或者sglang又或者llama.cpp之类的。
但对新手来说，可能还是Ollama更为友好简单。
考虑到很多古老设备可能未必有高性能的GPU，而 Ollama 上 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;对于老鸟来说，本地部署模型，肯定是vllm或者sglang又或者llama.cpp之类的。
但对新手来说，可能还是Ollama更为友好简单。
考虑到很多古老设备可能未必有高性能的GPU，而 Ollama 上面一些体积不大于 1GB的模型可以完全加载到CPU当中用处理器来运行。&lt;/p&gt;
&lt;p&gt;这回就针对 Ollama 上面体积不大于 1GB（含两个稍超的对照组）具备工具调用能力的模型，攒了一个测试方案，参照 BFCL、ToolBench、τ-bench 三大基准的方法论进行了评测，覆盖 8 个评测维度、中英双语、共 506 个测试用例。然后再用BFCL的官方测试跑一遍验证一下。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;评测基准来源&lt;/h2&gt;
&lt;h3&gt;BFCL — Berkeley Function Calling Leaderboard&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;项目地址&lt;/strong&gt;：&lt;a href="https://github.com/ShishirPatil/gorilla"&gt;https://github.com/ShishirPatil/gorilla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;论文&lt;/strong&gt;：The Berkeley Function Calling Leaderboard (ICML 2025)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当前版本&lt;/strong&gt;：V4，新增 agentic web search 和 memory management 评测&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：工具调用评测的事实标准，采用 AST 级别的参数匹配检查，覆盖 simple / parallel / multiple / irrelevance / multi-turn 等多个维度。支持 FC（原生 function calling）和 Prompt 两种模式分别排名。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ToolBench&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;项目地址&lt;/strong&gt;：&lt;a href="https://github.com/OpenBMB/ToolBench"&gt;https://github.com/OpenBMB/ToolBench&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;论文&lt;/strong&gt;：ToolLLM: Facilitating Large Language Models to Master 16000+ Real-world APIs (ICLR 2024)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：清华大学 THUNLP 出品，16,464 个真实 API、49 个类别。G1/G2/G3 三级难度分别对应单工具/同类多工具/跨类多工具。采用 DFS 树搜索策略进行多步工具调用，用 ChatGPT 做自动化评估（与人类判断 87.1% 一致）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;τ-bench&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;项目地址&lt;/strong&gt;：&lt;a href="https://github.com/sierra-research/tau2-bench"&gt;https://github.com/sierra-research/tau2-bench&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;论文&lt;/strong&gt;：τ-bench: Benchmarking AI Agents on Real-World Tasks (2024) / τ²-bench (NeurIPS 2025)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：Sierra 出品，聚焦真实业务场景的 Agent 评测。覆盖航空（airline）、零售（retail）、电信（telecom）、银行知识（banking_knowledge）四个领域。Agent 需要与模拟用户持续对话、调用工具、遵循业务策略。评分基于数据库终态匹配而非动作轨迹匹配。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;评测环境&lt;/h2&gt;
&lt;h3&gt;硬件&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;MacBook Air M4 
内存: 16G 统一内存架构
推理: CPU + GPU (Metal) 混合
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;软件环境&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 创建 conda 环境并安装依赖&lt;/span&gt;
conda&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;llmbench&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;python&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.12
conda&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;llmbench
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;openai&lt;span class="w"&gt; &lt;/span&gt;requests

&lt;span class="c1"&gt;# 安装 Ollama&lt;/span&gt;
brew&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;ollama&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# macOS&lt;/span&gt;
&lt;span class="c1"&gt;# curl -fsSL https://ollama.com/install.sh | sh  # Linux&lt;/span&gt;
ollama&lt;span class="w"&gt; &lt;/span&gt;serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;克隆三个评测基准项目：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/Documents/GitHub/Others&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/Documents/GitHub/Others

&lt;span class="c1"&gt;# BFCL — 工具调用评测事实标准&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/ShishirPatil/gorilla.git&lt;span class="w"&gt; &lt;/span&gt;bfcl
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bfcl/berkeley-function-call-leaderboard
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;.

&lt;span class="c1"&gt;# ToolBench — 大规模真实 API 工具评测&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/Documents/GitHub/Others
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/OpenBMB/ToolBench.git&lt;span class="w"&gt; &lt;/span&gt;toolbench
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;toolbench
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-r&lt;span class="w"&gt; &lt;/span&gt;requirements.txt

&lt;span class="c1"&gt;# τ-bench — Sierra 出品 Agent 业务场景评测&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/Documents/GitHub/Others
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/sierra-research/tau2-bench.git&lt;span class="w"&gt; &lt;/span&gt;tau-bench
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;tau-bench
pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;uv&lt;span class="w"&gt; &lt;/span&gt;sync

&lt;span class="c1"&gt;# 回到工作目录&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/Documents/GitHub/Others
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;环境变量&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# BFCL 配置 — 指向 Ollama 的 OpenAI 兼容端点&lt;/span&gt;
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ollama
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:11434/v1
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BFCL_PROJECT_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/Documents/GitHub/Others/bfcl/berkeley-function-call-leaderboard
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h2&gt;受测模型&lt;/h2&gt;
&lt;p&gt;拉取命令和清单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 批量拉取所有测试模型&lt;/span&gt;
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3:0.6b
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;qwen3.5:0.8b
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;lfm2.5-thinking:latest
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;granite4:350m-h
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;granite4:350m
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;functiongemma:latest
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;llama3.2:1b
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;smollm2:135m
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;smollm2:360m
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;smollm2:1.7b
ollama&lt;span class="w"&gt; &lt;/span&gt;pull&lt;span class="w"&gt; &lt;/span&gt;gemma3:1b
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;模型完整规格：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;参数量&lt;/th&gt;
&lt;th&gt;下载大小&lt;/th&gt;
&lt;th&gt;量化&lt;/th&gt;
&lt;th&gt;架构&lt;/th&gt;
&lt;th&gt;上下文&lt;/th&gt;
&lt;th&gt;能力标签&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:135m&lt;/td&gt;
&lt;td&gt;134.52M&lt;/td&gt;
&lt;td&gt;258 MB&lt;/td&gt;
&lt;td&gt;F16&lt;/td&gt;
&lt;td&gt;SmolLM2&lt;/td&gt;
&lt;td&gt;8K&lt;/td&gt;
&lt;td&gt;completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;functiongemma:latest&lt;/td&gt;
&lt;td&gt;268.10M&lt;/td&gt;
&lt;td&gt;287 MB&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;Gemma&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;completion, tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;340.33M&lt;/td&gt;
&lt;td&gt;349 MB&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;GraniteHybrid&lt;/td&gt;
&lt;td&gt;1,048,576&lt;/td&gt;
&lt;td&gt;completion, tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:0.6b&lt;/td&gt;
&lt;td&gt;751.63M&lt;/td&gt;
&lt;td&gt;498 MB&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;Qwen3&lt;/td&gt;
&lt;td&gt;40,960&lt;/td&gt;
&lt;td&gt;completion, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m&lt;/td&gt;
&lt;td&gt;352.38M&lt;/td&gt;
&lt;td&gt;676 MB&lt;/td&gt;
&lt;td&gt;BF16&lt;/td&gt;
&lt;td&gt;Granite&lt;/td&gt;
&lt;td&gt;32,768&lt;/td&gt;
&lt;td&gt;completion, tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:360m&lt;/td&gt;
&lt;td&gt;361.82M&lt;/td&gt;
&lt;td&gt;692 MB&lt;/td&gt;
&lt;td&gt;F16&lt;/td&gt;
&lt;td&gt;SmolLM2&lt;/td&gt;
&lt;td&gt;8K&lt;/td&gt;
&lt;td&gt;completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking:latest&lt;/td&gt;
&lt;td&gt;1.2B&lt;/td&gt;
&lt;td&gt;697 MB&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;LFM-2.5&lt;/td&gt;
&lt;td&gt;128,000&lt;/td&gt;
&lt;td&gt;completion, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemma3:1b&lt;/td&gt;
&lt;td&gt;999.89M&lt;/td&gt;
&lt;td&gt;778 MB&lt;/td&gt;
&lt;td&gt;Q4_K_M&lt;/td&gt;
&lt;td&gt;Gemma3&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;873.44M&lt;/td&gt;
&lt;td&gt;988 MB&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;Qwen3.5&lt;/td&gt;
&lt;td&gt;262,144&lt;/td&gt;
&lt;td&gt;vision, completion, tools, thinking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2:1b&lt;/td&gt;
&lt;td&gt;1.2B&lt;/td&gt;
&lt;td&gt;1,260 MB&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;Llama3.2&lt;/td&gt;
&lt;td&gt;131,072&lt;/td&gt;
&lt;td&gt;completion, tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:1.7b&lt;/td&gt;
&lt;td&gt;1.7B&lt;/td&gt;
&lt;td&gt;1,736 MB&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;SmolLM2&lt;/td&gt;
&lt;td&gt;8K&lt;/td&gt;
&lt;td&gt;completion, tools&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;注：部分模型未标注上下文长度（显示为 0 或 —），表示 Ollama 未从模型元数据中读取到该信息。gemma3:1b 实际上下文为 32K（架构默认）。functiongemma 使用了 Gemma 的指令微调模板。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;测试代码&lt;/h2&gt;
&lt;p&gt;评测脚本使用 Ollama 原生 tools 接口（对有 tools 能力的模型）和 &lt;code&gt;/api/generate&lt;/code&gt; 普通文本模式（对无 tools 能力的模型），所有调用 temperature=0。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;OLLAMA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://localhost:11434&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;TOOLS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Get current weather / 查询城市天气&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;City name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                          &lt;span class="s2"&gt;&amp;quot;unit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;enum&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;celsius&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fahrenheit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Get current time for timezone / 获取时区时间&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;timezone&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;e.g. Asia/Shanghai&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;timezone&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Search information / 搜索信息&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;query&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;limit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;query&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Send email / 发送邮件&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;subject&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;subject&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;calculate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;calculate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Math calculation / 数学计算&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expression&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;e.g. &amp;#39;2+3*4&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expression&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Translate text / 翻译&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;target_lang&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;target_lang&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Get stock price / 获取股价&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;symbol&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Ticker e.g. AAPL&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;symbol&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;book_restaurant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;book_restaurant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Book restaurant / 预订餐厅&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;restaurant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                          &lt;span class="s2"&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;guests&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;restaurant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;guests&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;get_flight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_flight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Search flights / 查询航班&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;origin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;destination&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;origin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;destination&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;get_order&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_order&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Look up order / 查询订单&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;order_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Order ID&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
            &lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;order_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}}},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 测试用例定义 — 23 个用例 × 2 语言 = 46 个测试/模型&lt;/span&gt;
&lt;span class="n"&gt;TEST_CASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;# === BFCL simple (6 cases) ===&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s01&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;simple&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;weather by city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;What&amp;#39;s the weather in Beijing?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;北京今天天气怎么样？&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Beijing&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s02&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;simple&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;with optional param&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Check weather in Tokyo, use Fahrenheit.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;用华氏度查东京天气。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Tokyo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;unit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fahrenheit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s03&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;simple&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;math calculation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Calculate (15 + 27) * 3.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;帮我算一下 (15 + 27) * 3。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;calculate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;calculate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expression&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(15 + 27) * 3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s04&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;simple&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stock lookup&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;What&amp;#39;s the current price of AAPL?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;查一下茅台股票的价格。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;symbol&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;AAPL&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s05&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;simple&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;flight search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Find flights from SFO to JFK on 2026-09-01.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;查北京到上海航班，9月1日。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_flight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_flight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;origin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SFO&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;destination&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;JFK&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2026-09-01&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;s06&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;simple&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;order lookup&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Look up order #ORD-12345.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;查订单号 ORD-12345。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_order&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_order&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;order_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORD-12345&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;

    &lt;span class="c1"&gt;# === BFCL parallel (4 cases) ===&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;p01&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;parallel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;two cities weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Weather in Paris and London?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;同时查巴黎和伦敦天气。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Paris&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;London&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;p02&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;parallel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;weather + time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Tell me Tokyo weather and New York time.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;告诉我东京天气和纽约时间。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Tokyo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;timezone&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;America/New_York&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;p03&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;parallel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stock + search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Get NVDA stock price and search for NVIDIA news.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;查NVDA股价同时搜NVIDIA新闻。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;symbol&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;NVDA&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;query&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;NVIDIA&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;p04&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;parallel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;three tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Weather in Shanghai, time in Tokyo, search AI news.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;同时查上海天气、东京时间、搜AI新闻。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Shanghai&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;timezone&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Asia/Tokyo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;query&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;AI&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;

    &lt;span class="c1"&gt;# === BFCL tool_selection (4 cases) ===&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;m01&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool_selection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;time over weather/news&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;What time is it in London?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;伦敦现在几点了？&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;timezone&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Europe/London&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;m02&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool_selection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stock over weather/time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;What&amp;#39;s the current price of TSLA?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;查一下特斯拉股价。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;symbol&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;TSLA&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;m03&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool_selection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;email (complex params)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Send email to fred@test.com, subject &amp;#39;Meeting&amp;#39;, body &amp;#39;Room 301 at 3pm&amp;#39;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;给fred@test.com发邮件，主题会议，内容下午三点301。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;calculate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;fred@test.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;subject&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Meeting&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Room 301 at 3pm&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;m04&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool_selection&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;flight among 5 tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Book a flight from SFO to JFK on 2026-08-20.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;订8月20日北京到上海机票。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_flight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_flight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;origin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SFO&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;destination&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;JFK&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2026-08-20&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;

    &lt;span class="c1"&gt;# === BFCL irrelevant (2 cases) ===&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;i01&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;irrelevant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;book among 8 tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Book a table for 4 at Chez Panisse on 2026-08-15 at 7pm.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;在鼎泰丰预订8月15日晚7点，4位。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;calculate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;book_restaurant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;book_restaurant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;restaurant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Chez Panisse&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2026-08-15&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;19:00&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;guests&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;i02&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;irrelevant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;calc among 7 tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;What is 12345 * 67890?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;12345乘以67890是多少？&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_time&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_stock&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;book_restaurant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;calculate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;calculate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expression&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;12345 * 67890&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;

    &lt;span class="c1"&gt;# === BFCL multi_turn (2 cases) ===&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t01&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;multi_turn&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;translate then email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ordered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Translate &amp;#39;Hello, how are you?&amp;#39; to Chinese, then email to test@example.com subject &amp;#39;Translation&amp;#39;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;把&amp;#39;Hello, how are you?&amp;#39;翻译成中文，发邮件给test@example.com，主题翻译结果。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello, how are you?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;target_lang&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;test@example.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;subject&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Translation&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;t02&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;multi_turn&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;weather→translate→email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ordered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Get Shanghai weather, translate to Japanese, email to info@example.com.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;查上海天气，翻译成日语，发邮件给info@example.com。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Shanghai&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;translate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;target_lang&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ja&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;info@example.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;

    &lt;span class="c1"&gt;# === τ-bench airline / retail (2 cases) ===&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a01&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tau_airline&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search flight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;I need to fly from Boston to Chicago on August 25.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;我需要8月25日从广州飞北京。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_flight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_flight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;origin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Boston&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;destination&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Chicago&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2026-08-25&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;r01&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tau_retail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;order lookup + email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ordered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Look up order ORD-99887 and email status to me@example.com.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;查订单ORD-99887，发邮件给me@example.com。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_order&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_order&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;order_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORD-99887&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}},{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;send_email&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;me@example.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;

    &lt;span class="c1"&gt;# === edge cases (3 cases) ===&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;e01&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;edge&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;no tool needed (chitchat)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello! How are you today?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你好！今天怎么样？&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;calculate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;e02&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;edge&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ambiguous (no city)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;What&amp;#39;s the temperature? It&amp;#39;s so hot here.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;现在多少度？这儿热死了。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[]},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;e03&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;edge&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;desc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;mixed EN/ZH params&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search news about AI safety, limit 3.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;搜索AI安全新闻，要3条。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;args&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;query&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;AI safety&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;limit&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}}]},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;call_native&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool_names&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;TOOLS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tool_names&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;OLLAMA&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/chat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;messages&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;stream&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;options&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;temperature&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;arguments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;arguments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool_calls&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;call_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool_names&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;descs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tool_names&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TOOLS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="n"&gt;ps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,[])&lt;/span&gt;
        &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; (required)&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
        &lt;span class="n"&gt;descs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;## &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Tools:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;descs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Output JSON array:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="se"&gt;{{\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;tool&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;arguments&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;{{}}}}&lt;/span&gt;&lt;span class="s2"&gt;]&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;User: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Assistant:&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;OLLAMA&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/api/generate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;prompt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;full&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stream&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;options&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;temperature&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;num_predict&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;response&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;^```(?:json)?\s*&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\s*```$&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\[[\s\S]*\]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;score_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actual&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ne&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;na&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;actual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ne&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;na&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;na&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="n"&gt;matched&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;act&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;actual&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;act&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tool&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;arguments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;act&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;arguments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,{})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;arguments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;matched&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;matched&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;ne&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run_all&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;granite4:350m-h&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;granite4:350m&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;qwen3:0.6b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;qwen3.5:0.8b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;&amp;quot;lfm2.5-thinking:latest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;functiongemma:latest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;llama3.2:1b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;&amp;quot;smollm2:135m&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;smollm2:360m&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;smollm2:1.7b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;gemma3:1b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;has_tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;functiongemma:latest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;granite4:350m-h&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;qwen3:0.6b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="s2"&gt;&amp;quot;granite4:350m&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lfm2.5-thinking:latest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;qwen3.5:0.8b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                 &lt;span class="s2"&gt;&amp;quot;llama3.2:1b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;smollm2:1.7b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;call_native&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;has_tools&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;call_prompt&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;TEST_CASES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;EN&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]),(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ZH&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])]:&lt;/span&gt;
                &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;calls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tools&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;score_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;expect&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
                &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                                &lt;span class="s2"&gt;&amp;quot;lang&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;score&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;actual&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;calls&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;calls&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;[]})&lt;/span&gt;
        &lt;span class="c1"&gt;# 汇总&lt;/span&gt;
        &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lang&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;EN&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;zh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lang&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ZH&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;en_pass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;score&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;en&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;zh_pass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;zh&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;score&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: pass=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;score&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &amp;quot;&lt;/span&gt;
              &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;EN=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;en_pass&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; ZH=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;zh_pass&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;run_all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;完整评测脚本（含结果输出、分类汇总、JSON 导出）约 500 行，可在 &lt;a href="https://github.com/cycleuser/blog/blob/main/scripts/ollama_full_benchmark.py"&gt;scripts/ollama_full_benchmark.py&lt;/a&gt; 查看。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;评测结果&lt;/h2&gt;
&lt;h3&gt;总榜&lt;/h3&gt;
&lt;p&gt;共 11 个模型，每个模型 46 个测试（23 用例 × 2 语言），总计 506 个测试。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;大小&lt;/th&gt;
&lt;th&gt;模式&lt;/th&gt;
&lt;th&gt;通过率&lt;/th&gt;
&lt;th&gt;均分&lt;/th&gt;
&lt;th&gt;EN&lt;/th&gt;
&lt;th&gt;ZH&lt;/th&gt;
&lt;th&gt;耗时&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;lfm2.5-thinking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;697 MB&lt;/td&gt;
&lt;td&gt;tools&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;76.1%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.74&lt;/td&gt;
&lt;td&gt;95.7%&lt;/td&gt;
&lt;td&gt;56.5%&lt;/td&gt;
&lt;td&gt;668s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:1.7b&lt;/td&gt;
&lt;td&gt;1,736 MB&lt;/td&gt;
&lt;td&gt;tools&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;76.1%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.73&lt;/td&gt;
&lt;td&gt;87.0%&lt;/td&gt;
&lt;td&gt;65.2%&lt;/td&gt;
&lt;td&gt;194s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;349 MB&lt;/td&gt;
&lt;td&gt;tools&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;67.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.64&lt;/td&gt;
&lt;td&gt;78.3%&lt;/td&gt;
&lt;td&gt;56.5%&lt;/td&gt;
&lt;td&gt;60s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;988 MB&lt;/td&gt;
&lt;td&gt;tools&lt;/td&gt;
&lt;td&gt;63.0%&lt;/td&gt;
&lt;td&gt;0.61&lt;/td&gt;
&lt;td&gt;82.6%&lt;/td&gt;
&lt;td&gt;43.5%&lt;/td&gt;
&lt;td&gt;370s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:0.6b&lt;/td&gt;
&lt;td&gt;498 MB&lt;/td&gt;
&lt;td&gt;tools&lt;/td&gt;
&lt;td&gt;56.5%&lt;/td&gt;
&lt;td&gt;0.54&lt;/td&gt;
&lt;td&gt;78.3%&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;td&gt;220s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m&lt;/td&gt;
&lt;td&gt;676 MB&lt;/td&gt;
&lt;td&gt;tools&lt;/td&gt;
&lt;td&gt;54.3%&lt;/td&gt;
&lt;td&gt;0.54&lt;/td&gt;
&lt;td&gt;73.9%&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;td&gt;41s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2:1b&lt;/td&gt;
&lt;td&gt;1,260 MB&lt;/td&gt;
&lt;td&gt;tools&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;43.5%&lt;/td&gt;
&lt;td&gt;26.1%&lt;/td&gt;
&lt;td&gt;97s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;functiongemma&lt;/td&gt;
&lt;td&gt;287 MB&lt;/td&gt;
&lt;td&gt;tools&lt;/td&gt;
&lt;td&gt;17.4%&lt;/td&gt;
&lt;td&gt;0.17&lt;/td&gt;
&lt;td&gt;26.1%&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;td&gt;106s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:360m&lt;/td&gt;
&lt;td&gt;692 MB&lt;/td&gt;
&lt;td&gt;文本&lt;/td&gt;
&lt;td&gt;13.0%&lt;/td&gt;
&lt;td&gt;0.13&lt;/td&gt;
&lt;td&gt;17.4%&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;td&gt;41s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:135m&lt;/td&gt;
&lt;td&gt;258 MB&lt;/td&gt;
&lt;td&gt;文本&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;15s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemma3:1b&lt;/td&gt;
&lt;td&gt;778 MB&lt;/td&gt;
&lt;td&gt;文本&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;27s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;注：标注 "文本" 的模型未在 Ollama 中注册原生 tools 能力，因此通过普通文本模式进行评测。由于普通文本模式对小模型更加困难，这些模型的得分下限更低。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;分类别得分&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;simple&lt;/th&gt;
&lt;th&gt;parallel&lt;/th&gt;
&lt;th&gt;tool_sel&lt;/th&gt;
&lt;th&gt;irrelevant&lt;/th&gt;
&lt;th&gt;multi_turn&lt;/th&gt;
&lt;th&gt;tau_airline&lt;/th&gt;
&lt;th&gt;tau_retail&lt;/th&gt;
&lt;th&gt;edge&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.83&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:1.7b&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.94&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.88&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.83&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.77&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;0.83&lt;/td&gt;
&lt;td&gt;0.62&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.75&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.29&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:0.6b&lt;/td&gt;
&lt;td&gt;0.42&lt;/td&gt;
&lt;td&gt;0.67&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.75&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.83&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m&lt;/td&gt;
&lt;td&gt;0.58&lt;/td&gt;
&lt;td&gt;0.65&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0.42&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.00&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2:1b&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0.46&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;functiongemma&lt;/td&gt;
&lt;td&gt;0.08&lt;/td&gt;
&lt;td&gt;0.29&lt;/td&gt;
&lt;td&gt;0.12&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.25&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:360m&lt;/td&gt;
&lt;td&gt;0.33&lt;/td&gt;
&lt;td&gt;0.12&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.50&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gemma3:1b&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:135m&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;td&gt;0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;tau_airline 维度全部为 0.00——这是因为该测试用例包含 "I need to fly from Boston to Chicago on August 25" 这一真实航线查询，Ollama 的小模型对此类真实世界地理知识的推理能力为零，因此无法正确填充航班查询参数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;深入分析&lt;/h2&gt;
&lt;h3&gt;1. lfm2.5-thinking — 慢但准，英文天花板&lt;/h3&gt;
&lt;p&gt;英文通过率 95.7%，几乎全对。它是一个带思维链（thinking）机制的 1.2B 模型，在正确的 prompt 下可以将工具调用分解为思考→行动两步。并行调用三个工具满分的表现尤其亮眼。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;弱点&lt;/strong&gt;：
- 中文 56.5%，与英文差距 39 个百分点
- 多步串行只有 0.38（比其他维度明显低），把"翻译→发邮件"这类需要保持上下文的链式任务搞错了步骤
- 速度是 granite4:350m-h 的 10 倍以上（668s vs 60s）&lt;/p&gt;
&lt;h3&gt;2. smollm2:1.7b — 最强但最重&lt;/h3&gt;
&lt;p&gt;多轮串行 0.88 是所有模型中唯一的接近满分。它最能理解"先做 A 再用 A 的结果做 B"这种依赖关系。但 1.7GB 的体积已经远超 1GB 目标，更适合有独立 GPU 的场景。&lt;/p&gt;
&lt;h3&gt;3. granite4:350m-h — 体积最小中的最强&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;349 MB 能做到 67.4% 通过率&lt;/strong&gt;。简单调用 0.83、多轮串行 0.79，这两个维度都在前三。中文 56.5% 和 lfm2.5 持平，说明它的中文对齐做得不错。1M 的上下文长度更是所有模型里最大的——虽然小模型很难真正用到这么长的上下文。&lt;/p&gt;
&lt;h3&gt;4. granite4 的标准版与 H 版的架构差异&lt;/h3&gt;
&lt;p&gt;需要重点说明：标记为 &lt;code&gt;-h&lt;/code&gt; 的版本和普通版并不是同一模型的不同量化——它们是&lt;strong&gt;两种不同的模型架构&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;granite4:350m-h&lt;/th&gt;
&lt;th&gt;granite4:350m&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;参数量&lt;/td&gt;
&lt;td&gt;340.33M&lt;/td&gt;
&lt;td&gt;352.38M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;架构&lt;/td&gt;
&lt;td&gt;granitehybrid&lt;/td&gt;
&lt;td&gt;granite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;上下文&lt;/td&gt;
&lt;td&gt;1,048,576 (1M)&lt;/td&gt;
&lt;td&gt;32,768 (32K)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;量化&lt;/td&gt;
&lt;td&gt;Q8_0&lt;/td&gt;
&lt;td&gt;BF16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下载大小&lt;/td&gt;
&lt;td&gt;349 MB&lt;/td&gt;
&lt;td&gt;676 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;embedding 维度&lt;/td&gt;
&lt;td&gt;768&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这两个版本来自 IBM Granite 系列的两个不同分支：
- &lt;strong&gt;granite4:350m&lt;/strong&gt; 是标准的 Dense Transformer（密集注意力）架构；
- &lt;strong&gt;granite4:350m-h&lt;/strong&gt;（&lt;code&gt;-h&lt;/code&gt; = hybrid）是混合架构，在 Transformer 基础上融合了状态空间模型（SSM），参数更少、上下文更长（1M token）、推理更高效。&lt;/p&gt;
&lt;p&gt;在脚本评测中，hybrid 版的通过率 67.4% 明显高于标准版的 54.3%（+13pp）。而 hybrid 版用的是 Q8_0 量化、标准版用的是 BF16 全精度——反而更小更准。这说明两件事：一是 IBM 的 hybrid 架构在工具调用场景下显著优于同体量的 Dense Transformer；二是 Q8 级别的量化对工具调用几乎不造成可感知的精度损失，压缩带来的收益远大于代价。&lt;/p&gt;
&lt;h3&gt;5. 无 tools 能力的模型几乎不可用&lt;/h3&gt;
&lt;p&gt;smollm2:135m、gemma3:1b 通过了 0 个测试。它们的普通文本模式下要么不返回 JSON，要么返回无法解析的格式。smollm2:360m 勉强通过了 6 个测试（13%），这几个都是简单查股票、查订单的单步调用。结论很明确：&lt;strong&gt;如果你想用本地小模型做工具调用，必须选在 Ollama 中标注了 tools 能力的模型&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;6. 中英文差距&lt;/h3&gt;
&lt;p&gt;所有模型的英文通过率都明显高于中文。差距最大的：
- lfm2.5-thinking: 95.7% → 56.5%（↓39pp）
- qwen3.5:0.8b: 82.6% → 43.5%（↓39pp）
- qwen3:0.6b: 78.3% → 34.8%（↓43pp）&lt;/p&gt;
&lt;p&gt;即使是被认为"中英文都训练过"的 Qwen 系列，中文工具调用也比英文差很多。这说明当前小模型的工具调用能力主要来自英文训练数据，中文只是指令翻译的副产物。&lt;/p&gt;
&lt;h3&gt;7. 速度对比&lt;/h3&gt;
&lt;p&gt;从快到慢：
- granite4:350m（BF16, 41s）— 最快，但准确率最低
- granite4:350m-h（Q8_0, 60s）— 快且准
- llama3.2:1b（97s）— 中等
- functiongemma（106s）— 慢但不准
- smollm2:1.7b（194s）— 偏慢但准
- qwen3:0.6b（220s）— 偏慢
- qwen3.5:0.8b（370s）— 很慢
- lfm2.5-thinking（668s）— 极慢但最准&lt;/p&gt;
&lt;p&gt;thinking 机制的代价就是推理时间。lfm2.5 的每个测试平均花费 14.5 秒，而 granite4:350m-h 只需要 1.3 秒。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;BFCL 官方评测验证&lt;/h2&gt;
&lt;p&gt;上一节的脚本评测覆盖了全部 11 个模型 × 8 个维度 × 2 种语言（506 个测试），但评分逻辑用的是字符串包含匹配，精度不如 BFCL 官方的 AST 解析 + 类型检查 + 标准化值匹配。为了校准结果，用 BFCL 官方管线（&lt;code&gt;bfcl generate&lt;/code&gt; → &lt;code&gt;bfcl evaluate&lt;/code&gt;）对 8 个能走原生 tools API 的模型跑了 25 个抽样测试用例，simple_python 看能不能正确调一个函数、irrelevance 看能不能识别什么时候不该调、parallel 看能不能同时调多个：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;conda&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;llmbench
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;BFCL_PROJECT_ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/Documents/GitHub/Others/bfcl/berkeley-function-call-leaderboard
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ollama
&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:11434/v1

&lt;span class="c1"&gt;# 为 Ollama 模型注册 handler（已在 model_config.py 中完成）&lt;/span&gt;

&lt;span class="c1"&gt;# 抽样测试：每个模型跑 simple_python + parallel + irrelevance 共 25 个用例&lt;/span&gt;
bfcl&lt;span class="w"&gt; &lt;/span&gt;generate&lt;span class="w"&gt; &lt;/span&gt;--model&lt;span class="w"&gt; &lt;/span&gt;ollama-qwen3-0.6b-FC&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--test-category&lt;span class="w"&gt; &lt;/span&gt;simple_python,irrelevance,parallel&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--run-ids&lt;span class="w"&gt; &lt;/span&gt;--num-threads&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;

bfcl&lt;span class="w"&gt; &lt;/span&gt;evaluate&lt;span class="w"&gt; &lt;/span&gt;--model&lt;span class="w"&gt; &lt;/span&gt;ollama-qwen3-0.6b-FC&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--test-category&lt;span class="w"&gt; &lt;/span&gt;simple_python,irrelevance,parallel&lt;span class="w"&gt; &lt;/span&gt;--partial-eval
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;BFCL 官方评分结果（25 个抽样测试 × 8 个模型）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;irrelevance&lt;/th&gt;
&lt;th&gt;parallel&lt;/th&gt;
&lt;th&gt;simple_python&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;qwen3:0.6b&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;functiongemma&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;smollm2:1.7b&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;td&gt;40%&lt;/td&gt;
&lt;td&gt;30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llama3.2:1b&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;BFCL vs 脚本评测的差异&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;llama3.2:1b 在 BFCL 中全挂（0%）但在脚本评测中有 34.8%。&lt;/strong&gt; 原因是 BFCL 的 AST 解码器要求模型输出严格的 &lt;code&gt;[{func_name: {params}}]&lt;/code&gt; 格式，而 llama3.2:1b 输出的工具调用 JSON 不符合这个特定格式。Ollama 的 &lt;code&gt;/api/chat&lt;/code&gt; 原生的 &lt;code&gt;tool_calls&lt;/code&gt; 字段是 OpenAI 格式的 &lt;code&gt;[{id, type, function: {name, arguments}}]&lt;/code&gt;，两者不兼容。脚本评测直接取了 Ollama 返回的结构化字段，所以不会遇到格式问题；BFCL 要求解码原始文本，llama3.2:1b 在这个环节就失败了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;irrelevance 在 BFCL 中普遍高于脚本评测。&lt;/strong&gt; irrelevance 的脚本定义是"输出空列表或纯文本即为正确"，BFCL 也类似——只要模型没返回有效函数调用格式就算过。小模型的默认行为就是闲聊而不是调工具，所以 irrelevance 天然高分。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;simple_python 在两套评测中趋势一致&lt;/strong&gt;：smollm2:1.7b 最高（50%），llama3.2:1b 最差（0%）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：脚本评测的排名顺序和 BFCL 官方大致一致，但绝对分数有系统性差异——BFCL 更严格（AST 解析 + 精确类型匹配），脚本评测更宽松（字符串包含）。对于选型决策来说，&lt;strong&gt;排名比绝对分数更重要&lt;/strong&gt;，而两边的排名基本吻合。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;BFCL 官方 strict 模式性价比最优&lt;/strong&gt;：granite4:350m-h（349MB，irr 80%/par 20%/simp 30%）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BFCL 官方 simple_python 最高&lt;/strong&gt;：smollm2:1.7b（50%，但 1.7GB 太胖）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中文相对最好&lt;/strong&gt;：脚本评测中 smollm2:1.7b 中文 65%，qwen3:0.6b 中文多轮串行较强&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具调用必须原生支持 tools&lt;/strong&gt;：普通文本模式的小模型在脚本评测中基本不可用，BFCL 也不支持普通文本模式评测&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hybrid 架构在工具调用上优于 Dense Transformer&lt;/strong&gt;：granite4:350m-h（hybrid，349MB，Q8_0）比 granite4:350m（dense，676MB，BF16）在脚本评测中高 13pp。不同架构差异远超量化精度差异，Q8 量化对工具调用的影响几乎不可感知&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BFCL AST 格式兼容性是门槛&lt;/strong&gt;：llama3.2:1b 在脚本评测中有 34.8% 但在 BFCL 中是 0%，因为它输出的 tool_call JSON 格式与 BFCL 的 &lt;code&gt;[{func: {params}}]&lt;/code&gt; 解码器不兼容。实际使用 Ollama 原生 tools API 不受此影响&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;349MB 的 granite4:350m-h 在 BFCL 官方和脚本评测两套评测中都表现靠前。对于"在配置不高的机器上跑一个有工具调用能力的本地模型"这个需求来说，这是目前比较务实的选择。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;与 GPT-3.5 的全面能力对比&lt;/h2&gt;
&lt;p&gt;工具调用之外，还做了一个更宏观的对比：这些本地小模型和当初的 GPT-3.5 相比，综合能力能到多少？选了 6 个标准化基准，每个基准 60 题，覆盖知识、代码、数学、推理四个维度。GPT-3.5 的成绩来自 GPT-4 技术报告 Table 2（arXiv:2303.08774）。&lt;/p&gt;
&lt;h3&gt;评测基准与 GPT-3.5 参考成绩&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;基准&lt;/th&gt;
&lt;th&gt;维度&lt;/th&gt;
&lt;th&gt;GPT-3.5 成绩&lt;/th&gt;
&lt;th&gt;测试方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MMLU&lt;/td&gt;
&lt;td&gt;多任务知识&lt;/td&gt;
&lt;td&gt;70.0%&lt;/td&gt;
&lt;td&gt;5-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HumanEval&lt;/td&gt;
&lt;td&gt;代码生成&lt;/td&gt;
&lt;td&gt;48.1%&lt;/td&gt;
&lt;td&gt;pass@1, 0-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GSM8K&lt;/td&gt;
&lt;td&gt;小学数学&lt;/td&gt;
&lt;td&gt;57.1%&lt;/td&gt;
&lt;td&gt;5-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HellaSwag&lt;/td&gt;
&lt;td&gt;常识推理&lt;/td&gt;
&lt;td&gt;85.5%&lt;/td&gt;
&lt;td&gt;10-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARC&lt;/td&gt;
&lt;td&gt;科学推理&lt;/td&gt;
&lt;td&gt;85.2%&lt;/td&gt;
&lt;td&gt;25-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WinoGrande&lt;/td&gt;
&lt;td&gt;语义推理&lt;/td&gt;
&lt;td&gt;81.6%&lt;/td&gt;
&lt;td&gt;5-shot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;数据集来源：MMLU（HuggingFace cais/mmlu，14042 题）、HumanEval（GitHub openai/human-eval，164 题）、GSM8K（GitHub openai/grade-school-math，1319 题）、HellaSwag（GitHub rowanz/hellaswag，10042 题）、ARC（HuggingFace allenai/ai2_arc，1119 题）、WinoGrande（HuggingFace allenai/winogrande，40398 题）。每个基准均匀采样 60 题，temperature=0，使用 Ollama generate API 补全模式。&lt;/p&gt;
&lt;h3&gt;全量结果（60 题/基准）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型&lt;/th&gt;
&lt;th&gt;大小&lt;/th&gt;
&lt;th&gt;MMLU&lt;/th&gt;
&lt;th&gt;HumanEval&lt;/th&gt;
&lt;th&gt;GSM8K&lt;/th&gt;
&lt;th&gt;HellaSwag&lt;/th&gt;
&lt;th&gt;ARC&lt;/th&gt;
&lt;th&gt;WinoGrande&lt;/th&gt;
&lt;th&gt;平均比值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPT-3.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;70.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48.1%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;57.1%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85.5%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85.2%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;81.6%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:9b&lt;/td&gt;
&lt;td&gt;8.9 GB&lt;/td&gt;
&lt;td&gt;63.2% (90%)&lt;/td&gt;
&lt;td&gt;55.0% (114%)&lt;/td&gt;
&lt;td&gt;91.7% (161%)&lt;/td&gt;
&lt;td&gt;76.7% (90%)&lt;/td&gt;
&lt;td&gt;86.7% (102%)&lt;/td&gt;
&lt;td&gt;91.7% (112%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;95%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;omnicoder-2-9b&lt;/td&gt;
&lt;td&gt;5.7 GB&lt;/td&gt;
&lt;td&gt;19.3% (28%)&lt;/td&gt;
&lt;td&gt;90.0% (187%)&lt;/td&gt;
&lt;td&gt;70.0% (123%)&lt;/td&gt;
&lt;td&gt;28.3% (33%)&lt;/td&gt;
&lt;td&gt;26.7% (31%)&lt;/td&gt;
&lt;td&gt;46.7% (57%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;76%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;granite4:350m-h&lt;/td&gt;
&lt;td&gt;349 MB&lt;/td&gt;
&lt;td&gt;42.1% (60%)&lt;/td&gt;
&lt;td&gt;60.0% (125%)&lt;/td&gt;
&lt;td&gt;21.7% (38%)&lt;/td&gt;
&lt;td&gt;28.3% (33%)&lt;/td&gt;
&lt;td&gt;21.7% (25%)&lt;/td&gt;
&lt;td&gt;56.7% (69%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;58%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;qwen3.5:0.8b&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;td&gt;15.8% (23%)&lt;/td&gt;
&lt;td&gt;43.3% (90%)&lt;/td&gt;
&lt;td&gt;56.7% (99%)&lt;/td&gt;
&lt;td&gt;30.0% (35%)&lt;/td&gt;
&lt;td&gt;60.0% (70%)&lt;/td&gt;
&lt;td&gt;40.0% (49%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;51%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-thinking&lt;/td&gt;
&lt;td&gt;697 MB&lt;/td&gt;
&lt;td&gt;31.6% (45%)&lt;/td&gt;
&lt;td&gt;25.0% (52%)&lt;/td&gt;
&lt;td&gt;41.7% (73%)&lt;/td&gt;
&lt;td&gt;30.0% (35%)&lt;/td&gt;
&lt;td&gt;15.0% (18%)&lt;/td&gt;
&lt;td&gt;40.0% (49%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;45%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lfm2.5-350m&lt;/td&gt;
&lt;td&gt;379 MB&lt;/td&gt;
&lt;td&gt;28.1% (40%)&lt;/td&gt;
&lt;td&gt;13.3% (28%)&lt;/td&gt;
&lt;td&gt;10.0% (18%)&lt;/td&gt;
&lt;td&gt;26.7% (31%)&lt;/td&gt;
&lt;td&gt;48.3% (57%)&lt;/td&gt;
&lt;td&gt;38.3% (47%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;37%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;括号内为相对 GPT-3.5 的能力比值。平均比值为六维度比值的算术平均。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;逐模型分析&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;qwen3.5:9b — 已全面达到 GPT-3.5 水平（平均 95%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个 8.9GB 的模型在四个维度上已经超过 GPT-3.5：GSM8K 91.7% vs 57.1%（161%），HumanEval 55.0% vs 48.1%（114%），ARC 86.7% vs 85.2%（102%），WinoGrande 91.7% vs 81.6%（112%）。MMLU 63.2% 略低于 70.0%，HellaSwag 76.7% 略低于 85.5%，但差距不大。如果 2023 年 GPT-3.5 是一个标杆，那 qwen3.5:9b 在 2026 年已经把它追平了——而且是在本地跑的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;omnicoder-2-9b — 代码和数学暴打 GPT-3.5，但通用知识几乎为零（平均 76%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HumanEval 90.0% 对 GPT-3.5 的 48.1% 是 187%，GSM8K 70.0% 对 57.1% 是 123%。但 MMLU 只有 19.3%，HellaSwag 28.3%，ARC 26.7%——典型的代码专用模型，在非代码任务上能力塌方。如果你只需要写代码和解数学题，它比 GPT-3.5 强；但如果需要通用问答，它远不如。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;granite4:350m-h — 349MB 的体积做到 GPT-3.5 的 58%（平均）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;HumanEval 60.0% 超过 GPT-3.5 的 48.1%（125%），WinoGrande 56.7% 也达到了 69%。但数学只有 21.7%，HellaSwag 28.3%，ARC 21.7%——知识储备和推理能力受限。这个模型的价值在于体积小、速度快、代码能力突出，适合边缘部署。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;qwen3.5:0.8b — 1.2GB 的小模型里最均衡（平均 51%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GSM8K 56.7% 几乎追平 GPT-3.5 的 57.1%（99%），ARC 60.0% 达到 70%，HumanEval 43.3% 达到 90%。MMLU 偏低（15.8%），但其他维度都在 GPT-3.5 的一半以上。综合来看是 1GB 级别模型里最接近 GPT-3.5 的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lfm2.5-thinking — 思维链在数学上有用，但拖累代码（平均 45%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GSM8K 41.7% 是几个小模型里相对较好的，思维链机制确实帮助了数学推理。但 HumanEval 只有 25.0%——思维链输出太长，干扰了代码补全。ARC 只有 15.0% 是所有模型最低的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lfm2.5-350m — 最轻量但能力有限（平均 37%）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;379MB 的体积在所有模型中最小，但能力也是最低的。GSM8K 只有 10.0%，HumanEval 13.3%。不过 ARC 48.3% 达到了 GPT-3.5 的 57%，说明它在科学推理上有一定基础。&lt;/p&gt;
&lt;h3&gt;几个观察&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;体积差 25 倍，能力差不到 2 倍&lt;/strong&gt;：granite4:350m-h（349MB）平均 58% of GPT-3.5，qwen3.5:9b（8.9GB）平均 95%。体积差了 25 倍，能力差不到 2 倍。小模型的性价比远超直觉。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码能力超越 GPT-3.5 的门槛最低&lt;/strong&gt;：granite4:350m-h 的 HumanEval 60% 就超过了 GPT-3.5 的 48.1%。代码生成是这些小模型最容易"以小博大"的维度——可能是因为代码训练数据质量高、模式重复性强。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数学能力两极分化&lt;/strong&gt;：qwen3.5:9b 的 GSM8K 91.7% 远超 GPT-3.5，但 lfm2.5-350m 只有 10.0%。数学推理对模型参数量的要求比代码更高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;通用知识（MMLU）是最难追平 GPT-3.5 的维度&lt;/strong&gt;：除了 qwen3.5:9b（63.2%），其他模型都在 42% 以下。MMLU 覆盖 57 个学科，需要广泛的知识储备，这是小模型的天然短板。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;omnicoder 的偏科现象最极端&lt;/strong&gt;：代码 187%、数学 123%，但 MMLU 28%、HellaSwag 33%。专用模型在训练时牺牲了通用能力来强化特定领域，使用时必须清楚它的边界。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content><category term="LLM"/><category term="ollama"/><category term="tool calling"/><category term="function calling"/><category term="BFCL"/><category term="ToolBench"/><category term="τ-bench"/><category term="小模型评测"/></entry><entry><title>编程语言全景：从诞生到2026年的完整图鉴</title><link href="https://blog.cycleuser.org/bian-cheng-yu-yan-quan-jing-cong-dan-sheng-dao-2026nian-de-wan-zheng-tu-jian.html" rel="alternate"/><published>2026-08-08T20:00:00+08:00</published><updated>2026-08-08T20:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-08:/bian-cheng-yu-yan-quan-jing-cong-dan-sheng-dao-2026nian-de-wan-zheng-tu-jian.html</id><summary type="html">&lt;p&gt;编程语言对于不太熟悉的朋友来说可能觉得挺玄乎，其实说白了，就是人和机器之间说话的规矩。计算机用电路，底层来看 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;编程语言对于不太熟悉的朋友来说可能觉得挺玄乎，其实说白了，就是人和机器之间说话的规矩。计算机用电路，底层来看，只认得0和1，人要是直接跟它唠0和1，实在是太麻烦，于是陆续有了汇编语言乃至C语言等等高级语言。于是后来场景变得复杂，这几十年里，一堆先驱者前赴后继，发明了各种语言，让"写程序"这件事，从最初的纸带打孔慢慢变成了打字，现在有了氛围编程，更是成了聊天对话。&lt;/p&gt;
&lt;p&gt;这次把2026年这个时间点的主要编程语言，粗略整理一下来给大家看。数据按2026年8月算，榜单用的是TIOBE 2026年7月的，版本标到了各自最新的。&lt;/p&gt;
&lt;p&gt;排行榜这种东西也就是参考就行，别太当真。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;排名&lt;/th&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th&gt;占比&lt;/th&gt;
&lt;th&gt;同比变化&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;18.94%&lt;/td&gt;
&lt;td&gt;-6.91%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;10.86%&lt;/td&gt;
&lt;td&gt;+1.30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;9.12%&lt;/td&gt;
&lt;td&gt;-2.65%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;8.03%&lt;/td&gt;
&lt;td&gt;-0.94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;4.49%&lt;/td&gt;
&lt;td&gt;+0.17%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;2.72%&lt;/td&gt;
&lt;td&gt;-0.17%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Visual Basic&lt;/td&gt;
&lt;td&gt;2.48%&lt;/td&gt;
&lt;td&gt;+0.59%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;SQL&lt;/td&gt;
&lt;td&gt;1.71%&lt;/td&gt;
&lt;td&gt;+0.23%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;1.69%&lt;/td&gt;
&lt;td&gt;+0.30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;1.34%&lt;/td&gt;
&lt;td&gt;+0.30%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Delphi/Object Pascal&lt;/td&gt;
&lt;td&gt;1.29%&lt;/td&gt;
&lt;td&gt;-0.60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Scratch&lt;/td&gt;
&lt;td&gt;1.27%&lt;/td&gt;
&lt;td&gt;+0.27%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;1.17%&lt;/td&gt;
&lt;td&gt;-1.08%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;1.16%&lt;/td&gt;
&lt;td&gt;-0.08%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;Swift&lt;/td&gt;
&lt;td&gt;0.99%&lt;/td&gt;
&lt;td&gt;+0.27%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Ada&lt;/td&gt;
&lt;td&gt;0.91%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;Assembly language&lt;/td&gt;
&lt;td&gt;0.81%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;MATLAB&lt;/td&gt;
&lt;td&gt;0.74%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;Fortran&lt;/td&gt;
&lt;td&gt;0.74%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;0.73%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;第一梯队：统治级语言&lt;/h2&gt;
&lt;h3&gt;Python&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Guido van Rossum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1991年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;3.14.6（2026年6月10日）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;面向对象、函数式、过程式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;动态类型、强类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐（极易入门）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#1（18.94%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Python现在是大模型的代名词，其实它1991年甚至更早点就出生了，是个叫Guido van Rossum的荷兰人搞的，这个语言的名字取自他喜欢的英剧《Monty Python》。最大的特点就是写起来像人话，强制缩进逼着你把代码排整齐，简单好上手是它常年霸榜新手第一语言的原因。AI、数据科学这块它基本是独一份，PyTorch、pandas这些全让他如虎添翼。&lt;/p&gt;
&lt;p&gt;缺点是跑得慢，还有个GIL锁卡着多线程，真想并行挺费劲。好在3.14开始搞了free-threaded模式，等于把这顶帽子摘下来一半。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;里程碑事件&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.9&lt;/td&gt;
&lt;td&gt;1991&lt;/td&gt;
&lt;td&gt;首次发布，受ABC语言启发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1994&lt;/td&gt;
&lt;td&gt;函数式工具（lambda/map/filter）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;列表推导式、垃圾回收&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.7&lt;/td&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;2.x最终版本，长期维护至2020年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;2008&lt;/td&gt;
&lt;td&gt;不向后兼容的大重构（print函数化、Unicode字符串）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.6&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;f-strings、类型注解&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.10&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;结构化模式匹配（match-case）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.11&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;性能提升10-60%（ specializing adaptive interpreter）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.12&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;类型参数语法（PEP 695）、f-strings改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.13&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;实验性free-threaded模式、JIT编译器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.14&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;PEP 779正式支持free-threaded、PEP 649延迟注解求值、PEP 784 compression.zstd模块、t-strings（PEP 750）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;C&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Dennis Ritchie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1972年（贝尔实验室）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前标准&lt;/td&gt;
&lt;td&gt;C23（2024年正式发布）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;过程式、结构化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、弱类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等偏高）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#2（10.86%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;C被叫做"一切之母"，不是没道理的。操作系统、编译器、数据库，往下挖到底基本都是C。手机Android系统所用的Linux内核、跑Python的那个解释器CPython，全是C写的。它简洁得吓人，关键字就那么几十个，从C89的32个到C23也就44个，但组合起来啥都能干。&lt;/p&gt;
&lt;p&gt;代价是指针这玩意儿能把人折腾得厉害，一个不小心就内存泄漏、缓冲区溢出。系统级、嵌入式的活儿躲不开它，新手上来就学它确实苦，所以后来也有人在驱动开发等场景开始使用Rust了。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标准&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;核心特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;K&amp;amp;R C&lt;/td&gt;
&lt;td&gt;1978&lt;/td&gt;
&lt;td&gt;Brian Kernighan与Dennis Ritchie合著的《The C Programming Language》定义的非正式标准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C89/C90&lt;/td&gt;
&lt;td&gt;1989/1990&lt;/td&gt;
&lt;td&gt;ANSI/ISO正式标准化，引入函数原型、void类型、const/volatile限定符、标准库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C95&lt;/td&gt;
&lt;td&gt;1995&lt;/td&gt;
&lt;td&gt;宽字符支持、国际化改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C99&lt;/td&gt;
&lt;td&gt;1999&lt;/td&gt;
&lt;td&gt;//单行注释、inline函数、变长数组(VLA)、long long、stdint.h、指定初始化器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C11&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;多线程支持(threads.h)、原子操作(stdatomic.h)、_Generic类型泛型、Unicode支持、匿名结构体/联合体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C17/C18&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;C11的缺陷修复版，无新特性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C23&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;bool/true/false成为关键字、#embed指令、auto类型推断、十进制浮点类型、移除K&amp;amp;R函数声明语法&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;C++&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Bjarne Stroustrup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1985年（"C with Classes"始于1979年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前标准&lt;/td&gt;
&lt;td&gt;C++23（已发布），C++26（2026年3月功能冻结）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（面向对象、泛型、函数式、过程式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐（极高）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#3（9.12%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;C++简单来看就是在C上面叠了一大堆东西：类、模板、异常、lambda……口号是"零开销抽象"，其实他的范式和C是几乎完全不同的，只是做到了对C的兼容，基本能手写达到C的一个性能。游戏引擎、高性能计算、量化交易这些死磕性能的地方，往往是它的地盘。&lt;/p&gt;
&lt;p&gt;代价是这玩意儿复杂到没边，C++26的标准文档据说两千多页，学起来没个三五年都未必掌握了所有特性。学习难度拉满的榜上它常年前三，入坑前先做好心理准备，但是学好了确实很强大。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标准&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;核心特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C++98&lt;/td&gt;
&lt;td&gt;1998&lt;/td&gt;
&lt;td&gt;首个ISO标准，模板、异常处理、STL、命名空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++03&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;
&lt;td&gt;技术修正版（TC1），修复缺陷&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++11&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;auto、lambda、移动语义、右值引用、智能指针、constexpr、范围for、nullptr——"现代C++"的起点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++14&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;函数返回类型推断、泛型lambda、二进制字面量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++17&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;结构化绑定、optional/variant/any、文件系统库、并行算法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++20&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;概念(Concepts)、协程、模块、范围(Ranges)、三路比较运算符(&amp;lt;=&amp;gt;)——史上最大更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++23&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;std::expected、std::print、std::span、多维下标运算符、flat_map&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++26&lt;/td&gt;
&lt;td&gt;2026（功能冻结）&lt;/td&gt;
&lt;td&gt;反射(Reflection)、契约(Contracts: pre/post/contract_assert)、std::execution senders/receivers——近年来最大的语言级新增&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Java&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;James Gosling（Sun Microsystems）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1995年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;JDK 26（2026年3月，非LTS），JDK 25（2025年9月，当前LTS）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;面向对象、函数式（Java 8起）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#4（8.03%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Java 1995年出生，靠着一句"一次编写，到处运行"打天下，底气是JVM这层虚拟机，把原来的代码翻译成字节码，然后四处用自己的JVM虚拟机运行，比解释器的Python快，但比编译型的往往要慢一些。它最大的功劳是把自动垃圾回收带进了主流，让程序员告别了手动管内存的苦日子。银行、电商、企业后端，遍地都是它的存量，培训班井喷的时代带来了大量的人力资源积累，成本卷到很低了，加上业务存留，估计一时半会儿倒不了。&lt;/p&gt;
&lt;p&gt;相对慢、吃内存，这些年靠虚拟线程、值类型这些项目憋着劲儿但恐怕也难翻盘。排名虽然跌到历史最低，但企业里那堆老系统还得靠它撑着。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;里程碑&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JDK 1.0&lt;/td&gt;
&lt;td&gt;1996&lt;/td&gt;
&lt;td&gt;首次发布&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JDK 1.1&lt;/td&gt;
&lt;td&gt;1997&lt;/td&gt;
&lt;td&gt;内部类、JDBC、JavaBeans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;J2SE 1.2&lt;/td&gt;
&lt;td&gt;1998&lt;/td&gt;
&lt;td&gt;Swing、集合框架、JIT编译器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;J2SE 1.4&lt;/td&gt;
&lt;td&gt;2002&lt;/td&gt;
&lt;td&gt;断言、NIO、正则表达式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 5&lt;/td&gt;
&lt;td&gt;2004&lt;/td&gt;
&lt;td&gt;泛型、注解、枚举、增强for循环、自动装箱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 8&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;Lambda表达式、Stream API、Optional、新的日期时间API——史上最重要更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 9&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;模块化系统(JPMS)、REPL(jshell)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 11&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;LTS，var局部变量推断、HTTP Client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 17&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;LTS，密封类、记录类(Records)、模式匹配预览&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 21&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;LTS，虚拟线程正式发布、模式匹配开关、记录模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 25&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;当前LTS，性能增强、模式匹配改进、虚拟线程改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java 26&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;非LTS，HTTP/3支持(JEP 517)、AOT对象缓存(JEP 516)、结构化并发第6次预览&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;C&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Anders Hejlsberg（Microsoft）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2000年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;C# 14（.NET 10）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（面向对象、函数式、声明式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#5（4.49%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;C#是微软出的，不要读作C井，是C-sharp。当年就是个"改良版Java"，在.NET平台上跑。后来一路演化，现在语法上比Java时髦多了，LINQ、async/await、记录类型、模式匹配这些全都有，算是最现代化的主流静态语言之一。.NET Core之后也彻底跨了平台，不再被Windows绑死。&lt;/p&gt;
&lt;p&gt;Unity游戏开发、Windows桌面、ASP.NET后端，都是它的地盘。你要是喜欢一套语法干多个方向，它挺合适。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C# 1.0&lt;/td&gt;
&lt;td&gt;2002&lt;/td&gt;
&lt;td&gt;基础面向对象，与.NET Framework 1.0同步&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 2.0&lt;/td&gt;
&lt;td&gt;2005&lt;/td&gt;
&lt;td&gt;泛型、迭代器、可空类型、匿名方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 3.0&lt;/td&gt;
&lt;td&gt;2007&lt;/td&gt;
&lt;td&gt;LINQ、Lambda、扩展方法、匿名类型——革命性更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 4.0&lt;/td&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;动态类型(dynamic)、命名参数、协变/逆变&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 5.0&lt;/td&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;async/await异步编程——改变异步编程范式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 6.0&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;字符串插值、空条件运算符、表达式体成员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 7.0-7.3&lt;/td&gt;
&lt;td&gt;2017-2018&lt;/td&gt;
&lt;td&gt;模式匹配、元组、局部函数、Span&lt;T&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 8.0&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;可空引用类型、异步流、范围和索引&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 9.0&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;记录类型、顶级语句、init访问器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 10.0&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;全局using、文件范围命名空间、record struct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 11.0&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;原始字符串、列表模式、required成员&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 12.0&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;主构造函数、集合表达式、内联数组&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 13.0&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;params集合、扩展类型成员、ref struct改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C# 14.0&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;扩展属性、 nameof增强、未初始化结构体警告改进&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;JavaScript&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Brendan Eich（Netscape）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1995年（10天内完成原型）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前标准&lt;/td&gt;
&lt;td&gt;ECMAScript 2025（ES2025）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（面向对象原型链、函数式、事件驱动）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;动态类型、弱类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐（入门容易，精通难）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#6（2.72%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;JavaScript是1995年那阵子赶出来的，当时似乎就是给网页加加点小花活。没想到后来成了全世界浏览器的唯一亲儿子，你打开的每个网页里都有它。ES6之后它现代了不少，Node.js又把它带到了服务器端，现在前后端、桌面、移动哪哪都是它。&lt;/p&gt;
&lt;p&gt;JS的问题是入门容易，写好难，动态类型加原型链，水是真的深，安全性动不动被人埋雷，而且写不好也会特别慢。好在后面那个TypeScript出来给提升了性能。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ES1&lt;/td&gt;
&lt;td&gt;1997&lt;/td&gt;
&lt;td&gt;首个ECMA标准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES3&lt;/td&gt;
&lt;td&gt;1999&lt;/td&gt;
&lt;td&gt;正则表达式、try/catch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES5&lt;/td&gt;
&lt;td&gt;2009&lt;/td&gt;
&lt;td&gt;严格模式、JSON、数组方法forEach/map/filter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES6/ES2015&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;let/const、箭头函数、Promise、class、模块(import/export)、解构、模板字符串、Map/Set——现代JS的起点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES2016-2019&lt;/td&gt;
&lt;td&gt;2016-2019&lt;/td&gt;
&lt;td&gt;Array.includes、async/await、Object.entries、可选catch绑定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES2020&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;可选链(?.)、空合并(??)、BigInt、动态import()&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES2021&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;逻辑赋值、String.replaceAll、Promise.any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES2022&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;Top-level await、类字段、at()方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES2023&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;数组从后查找(findLast)、Hashbang语法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES2024&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Promise.withResolvers、Object.groupBy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ES2025&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;Set方法（union/intersection/difference）、Iterator Helpers、Promise.try&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;第二梯队：系统与安全语言&lt;/h2&gt;
&lt;p&gt;看完几位一线明星，再往下数，是一帮系统和安全方向的狠角色。&lt;/p&gt;
&lt;h3&gt;Go（Golang）&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Robert Griesemer、Rob Pike、Ken Thompson（Google）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2009年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;1.27（2026年6月）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;过程式、并发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐（低，语法极简）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#13（1.17%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Go是Google出的，三个带佬一起设计，其中一个还是Unix之父Ken Thompson。它的哲学就俩字：简单。25个关键字，语法一天就能上手，goroutine并发用起来是真爽，编译出来一个静态二进制文件，扔到服务器就能跑。&lt;/p&gt;
&lt;p&gt;Docker、Kubernetes、etcd、Prometheus这些云原生基石全是Go写的，想往运维和云原生方向走，或者注重高并发性能的后端开发，可以重点关注golang。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;首个正式版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;自举（编译器用Go重写）、GC暂停降至10ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.7-1.9&lt;/td&gt;
&lt;td&gt;2016-2017&lt;/td&gt;
&lt;td&gt;子测试/benchmark、HTTP/2、类型别名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.11&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;Go Modules（依赖管理）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.13&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;error wrapping（errors.Is/As）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.16&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;embed包（内嵌静态文件）、io/fs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.18&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;泛型（类型参数）——历史性更新&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.21&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;内置min/max/clear、WASI支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.22&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;range over int、for循环变量作用域修复&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.23-1.25&lt;/td&gt;
&lt;td&gt;2024-2026&lt;/td&gt;
&lt;td&gt;range over func（迭代器函数）、工具链改进、context行为变更&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.27&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;最新稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Rust&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Graydon Hoare（Mozilla）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2010年（1.0于2015年发布）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;1.96（2026年5月）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（面向对象、函数式、过程式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型、所有权(Ownership)系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐（极高，所有权和生命周期概念陡峭）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#10（1.34%，历史最高）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Rust这些年是被捧上神坛的语言。看家本领是"所有权"系统，在编译期就保证内存安全，不靠垃圾回收，性能跟C持平。很多地方都推荐关键系统往它上面迁，Linux内核也开始引入Rust驱动的支持。&lt;/p&gt;
&lt;p&gt;代价是学习曲线陡得离谱，借用检查器能把新手折磨到怀疑人生。熬过去之后，写出来的代码是真的让人放心，那种安全感是别的语言给不了的。最近有很多热门的AI智能体项目都从最初的JS或者Python迁移到了Rust，极大地降低了体积还提高了性能。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.1-0.x&lt;/td&gt;
&lt;td&gt;2012-2015&lt;/td&gt;
&lt;td&gt;预发布阶段，语法频繁变化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;首个稳定版，承诺向后兼容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.26&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;Edition 2018，impl Trait、非词法生命周期(NLL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.31&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;Edition切换机制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.58&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;Edition 2021，闭包捕获改进、IntoIterator for arrays&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.75&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;async fn in traits（稳定化）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.79&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;inline模块、关联类型边界&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.85&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;Edition 2024，async closures稳定化、unsafe属性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.96&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;最新稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Swift&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Chris Lattner（Apple）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2014年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;6.1（2025年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（面向对象、函数式、协议导向）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型、可选类型(Optional)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#15（0.99%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Swift是苹果2014年推出来接班Objective-C的，iOS开发现在基本全是它。设计上把现代语言的优点吸收了个遍：类型推断、可选类型、泛型、协议导向编程，还坚持值类型优先于引用类型。&lt;/p&gt;
&lt;p&gt;想开发苹果生态的应用，绕不开它。Swift 6开始搞严格并发安全，写多线程的代码能省不少心。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;首次发布&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;协议扩展、错误处理(throw/try/catch)、开源&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;API设计指南重命名（大范围迁移）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;Codable协议、String重设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;ABI稳定性——里程碑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.1&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;模块稳定性、属性包装器(Property Wrappers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.5&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;async/await、Actor、结构化并发&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.9&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;宏系统(Macro)、非copyable类型、if/switch表达式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.0&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;严格并发安全、数据竞争安全保证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.1&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;最新版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Kotlin&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;JetBrains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2011年（1.0于2016年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;2.4.0（2026年6月）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（面向对象、函数式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型、空安全(Null Safety)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等，Java开发者更易上手）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;未进入Top 20但Android首选&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Kotlin是JetBrains出的，定位就是"更好的Java"。跟Java百分之百互通，但把Java那些烦人的地方收拾得干干净净：空指针没了，样板代码少了，还自带协程。Google在2017年宣布它是Android首选语言，安卓开发现在基本都转过去了。&lt;/p&gt;
&lt;p&gt;Kotlin 2.0上了K2编译器，编译速度快了一大截。写Android目前就它了，别犹豫。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;首次预览&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;首个稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.2&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;跨平台支持(Kotlin Multiplatform)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.3&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;协程(Coroutines)稳定化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.4&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;KMP改进、SAM转换&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;记录类、密封接口、内联属性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;上下文接收器预览&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.7-1.9&lt;/td&gt;
&lt;td&gt;2022-2023&lt;/td&gt;
&lt;td&gt;K2编译器预览、智能 cast改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;K2编译器正式发布——里程碑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;最新稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;第三梯队：Web与脚本语言&lt;/h2&gt;
&lt;h3&gt;TypeScript&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Anders Hejlsberg（Microsoft）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2012年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;6.0.3（2026年）；TypeScript 7.0原生编译器预览中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（面向对象、函数式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、结构化类型系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等，需理解类型系统）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;未列入但有版本追踪&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;TypeScript是微软那位搞C#的大佬Anders Hejlsberg做的，本质是JavaScript的超集，加了一套可选静态类型，编译完还是纯JS。说白了就是给自由奔放的JS套上缰绳，让类型系统在编译期拦下大批低级错误，IDE的补全和重构也顺了。&lt;/p&gt;
&lt;p&gt;大型前端项目现在没它真不行，基本是事实标准。用Go重写编译器后据说编译速度能快上10倍，值得期待。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.8&lt;/td&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;首次发布&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;首个正式版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;可空类型、strict模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;unknown类型、Tuple改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;可变元组类型、自定义类型推导&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.9&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;satisfies操作符&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;装饰器标准化、模块解析&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.6&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;装饰器扩展、配置简化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6.0&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;最新稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;2026（预览）&lt;/td&gt;
&lt;td&gt;原生编译器（Go重写），10x编译速度&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;PHP&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Rasmus Lerdorf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1995年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;8.5.7（2026年6月）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（面向对象、过程式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;动态类型（PHP 7.4+逐步引入类型声明）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐（低门槛）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#14（1.16%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PHP是1995年那个网站还很少的年代出生的，专为Web而生，直接嵌在HTML里跑。全球七成多网站的后端是它，光WordPress就占了四成多，你逛的很多网站底下都是它。&lt;/p&gt;
&lt;p&gt;早年名声不太行，但PHP 7性能比5.6快了2-3倍，8.0又上了JIT编译器，才算把"PHP不够严肃"的印象扭转过来。想快速搞个网站，门槛很低，而且很适合用AI帮忙来氛围编程。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP/FI&lt;/td&gt;
&lt;td&gt;1995&lt;/td&gt;
&lt;td&gt;首版，Personal Home Page Tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 3&lt;/td&gt;
&lt;td&gt;1998&lt;/td&gt;
&lt;td&gt;重写，正式命名PHP: Hypertext Preprocessor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 4&lt;/td&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;Zend引擎、面向对象初步支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 5&lt;/td&gt;
&lt;td&gt;2004&lt;/td&gt;
&lt;td&gt;Zend Engine 2，完整OOP（类/接口/异常）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 5.6&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;变长参数、常量表达式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 7.0&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;性能飞跃（Zend Engine 3）、标量类型声明、返回类型声明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 7.4&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;类型化属性、箭头函数、FFI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.0&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;JIT编译器、联合类型、match、命名参数、属性(Attributes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.1&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;枚举、纤程(Fibers)、只读属性、交叉类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.2&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;只读类、DNF类型、枚举回退&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.3&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;类型化常量、json_validate()、动态类常量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;属性钩子(Property Hooks)、不对称可见性、新数组函数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.5&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;最新稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Ruby&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Yukihiro Matsumoto（松本行弘，"Matz"）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1995年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;3.4（2024年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;面向对象（一切皆对象）、函数式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;动态类型、强类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐（低，语法优雅）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#20（0.73%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ruby是日本人松本行弘搞的，设计目标就一句话：让程序员快乐。一切皆对象，连整数都能调方法，语法优雅得不行。真正让它出名的是一句Ruby on Rails，2004年开创了"约定优于配置"，GitHub、Airbnb都是这套框架的受益者。&lt;/p&gt;
&lt;p&gt;缺点大概是性能了，另外这些年好像没发现除了RoR之外的其他类似量级的明星项目了。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.95&lt;/td&gt;
&lt;td&gt;1995&lt;/td&gt;
&lt;td&gt;首次发布&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1996&lt;/td&gt;
&lt;td&gt;首个正式版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.8&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;
&lt;td&gt;广泛采用，Rails 1.0诞生（2005）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.9&lt;/td&gt;
&lt;td&gt;2007&lt;/td&gt;
&lt;td&gt;YARV虚拟机，性能提升&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2013&lt;/td&gt;
&lt;td&gt;关键字参数、Module#prepend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;JIT编译器（实验性）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;Ractor(并行)、Fiber调度、RBS类型签名、性能3x目标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.1&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;YJIT（用Rust重写的JIT）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.2&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;WASM支持、语法改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;YJIT生产可用、Prism解析器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.4&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;最新稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Lua&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Roberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1993年（巴西）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;5.4（2020年），LuaJIT 2.1（持续维护）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;过程式、函数式、面向对象（通过table实现）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;动态类型、弱类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐（低）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;未进入Top 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Lua是OpenWrt上面会常用到的，整体非常轻量级，小得离谱，整个解释器也就200KB左右，专为嵌进别人的程序里当脚本语言。数据结构就一个table，数组、哈希、对象、模块全靠它一个顶四个。&lt;/p&gt;
&lt;p&gt;除了路由系统OpenWrt之外，游戏脚本、Nginx、Redis、Neovim配置，也是它的地盘。你玩过的魔兽世界、Roblox，底层脚本也可能是它。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1993&lt;/td&gt;
&lt;td&gt;首版，用于Petroleo Brasileiro数据描述&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;1997&lt;/td&gt;
&lt;td&gt;协程机制引入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;
&lt;td&gt;标准API统一、meta-mechanism&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.1&lt;/td&gt;
&lt;td&gt;2006&lt;/td&gt;
&lt;td&gt;模块系统——LuaJIT基准版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.2&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;yield from any scope、位运算&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.3&lt;/td&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;整数类型、UTF-8支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;生成器语义改进、const/local变量&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Perl&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Larry Wall&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1987年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;5.40（2024年），Raku（原Perl 6，已独立）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;过程式、面向对象、函数式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;动态类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐（高，"正则表达式的噩梦"）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#18（0.92%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Perl是1987年出的，江湖人称"完成工作的瑞士军刀"，文本处理的祖师爷。设计哲学是"条条大路通罗马"，自由度极大，但后果就是代码风格五花八门，一个人写的Perl别人基本看不懂。&lt;/p&gt;
&lt;p&gt;它的正则表达式是所有现代语言正则的爹，PCRE就是从它这儿来的。现在主要活在系统管理和遗留系统里。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;1987&lt;/td&gt;
&lt;td&gt;首版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;1991&lt;/td&gt;
&lt;td&gt;《Programming Perl》出版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;1994&lt;/td&gt;
&lt;td&gt;完整OOP、模块系统、引用——现代化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.6&lt;/td&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;Unicode支持、线程（实验性）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.10&lt;/td&gt;
&lt;td&gt;2007&lt;/td&gt;
&lt;td&gt;say、given/when、智能匹配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.14-5.16&lt;/td&gt;
&lt;td&gt;2011-2012&lt;/td&gt;
&lt;td&gt;正则改进、Unicode全面支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.20&lt;/td&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;后缀解引用、子程序签名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.36&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;签名正式稳定、indented heredoc&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.40&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;最新版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;第四梯队：函数式与学术语言&lt;/h2&gt;
&lt;h3&gt;Haskell&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Haskell委员会（学术社区）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1990年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;GHC 9.12（2025年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;纯函数式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型、Hindley-Milner类型推断、高阶类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐（极高，需转变思维范式）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;未进入Top 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Haskell是纯函数式语言的旗舰，学术味浓得呛人。没有副作用、没有可变状态、惰性求值、单子……光这些概念就能劝退一大半人。它的类型系统强得离谱，写出来的代码正确性在编译期就有极高保证。&lt;/p&gt;
&lt;p&gt;金融量化、编译器、区块链（Cardano）用它。说实话，一般来说，大家学这个大概不是为上班用吧。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Haskell 1.0&lt;/td&gt;
&lt;td&gt;1990&lt;/td&gt;
&lt;td&gt;首个标准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haskell 98&lt;/td&gt;
&lt;td&gt;1999&lt;/td&gt;
&lt;td&gt;修订标准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haskell 2010&lt;/td&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;标准库扩展、FFI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GHC 7-8&lt;/td&gt;
&lt;td&gt;2012-2015&lt;/td&gt;
&lt;td&gt;类型级自然数、类型族(Type Families)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GHC 8.0&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;Backpack模块系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GHC 9.0&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;Linear types、 QualifiedDo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GHC 9.6&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;AST改进、GHC提案系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GHC 9.12&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;最新版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Scala&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Martin Odersky&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2004年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;3.x（2025年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;面向对象+函数式融合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型、高阶类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐（极高，概念密集）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;未进入Top 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Scala是Martin Odersky搞的，跑在JVM上，面向对象和函数式一把抓，类型系统极其强大。Scala 3来了一次大重构，换成缩进式语法，简单了不少。&lt;/p&gt;
&lt;p&gt;它最大的地盘是大数据，Apache Spark就是Scala写的，Apache Flink也曾经是Scala写的，但是后续应该是转回Java了。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2004&lt;/td&gt;
&lt;td&gt;首版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2006&lt;/td&gt;
&lt;td&gt;大幅重写&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.8&lt;/td&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;集合库重设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.10&lt;/td&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;宏、字符串插值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.12&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;Java 8互操作、SAM转换&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.13&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;集合库再次重设计&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;Scala 3（Dotty），全新语法、union/intersection类型——里程碑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;LTS版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.5+&lt;/td&gt;
&lt;td&gt;2024-2025&lt;/td&gt;
&lt;td&gt;持续改进&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;第五梯队：科学与专用语言&lt;/h2&gt;
&lt;h3&gt;R&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Ross Ihaka、Robert Gentleman（奥克兰大学）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1993年（S语言基础上发展）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;4.5（2025年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;函数式、数组式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;动态类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中高，统计学背景有帮助）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#9（1.69%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;R是统计计算的老大，1993年出生在奥克兰大学，数据可视化（ggplot2）、统计建模、生物信息学领域地位稳固。CRAN上有近两万个统计相关的包，想搞统计分析它最全。&lt;/p&gt;
&lt;p&gt;语法受S语言和Scheme影响，向量化操作是核心，有统计学背景的人大概会用的多一些。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;首个正式版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2004&lt;/td&gt;
&lt;td&gt;内存管理改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;2013&lt;/td&gt;
&lt;td&gt;长向量支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.6&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;RNG默认变更&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.0&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;字符串因子默认变更、Markdown文档&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;Lambda语法((x) x^2)、原生管道|&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.2&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;|&amp;gt;_正式稳定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.4&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;性能改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.5&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;最新版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;MATLAB&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Cleve Moler（MathWorks）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1984年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;R2025b（2025年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;过程式、面向对象（有限支持）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;动态类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等，矩阵思维）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#18（0.74%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;MATLAB是矩阵计算的天花板，一切皆矩阵是它的核心理念。工程仿真、信号处理、控制系统、图像处理，到处是它，Simulink做可视化建模更是独门绝技。&lt;/p&gt;
&lt;p&gt;缺点就一个字：贵。商业授权费高昂，所以不少人转身投靠Python的NumPy/SciPy，或者开源的GNU Octave、SCI Lab等等。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;早期&lt;/td&gt;
&lt;td&gt;1984&lt;/td&gt;
&lt;td&gt;首次商业发布&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;1997&lt;/td&gt;
&lt;td&gt;面向对象编程、结构体&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;2004&lt;/td&gt;
&lt;td&gt;性能优化、JIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2008a&lt;/td&gt;
&lt;td&gt;2008&lt;/td&gt;
&lt;td&gt;命名改为R+年份格式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2016b&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;tall arrays、字符串类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2020b&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;Live Editor改进、新图形引擎&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2023b&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;Python互操作改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2025b&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;最新版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Julia&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Jeff Bezanson、Stefan Karpinski、Viral Shah、Alan Edelman（MIT）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2012年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;1.11（2024年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（函数式、过程式、面向对象多重派发）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;动态类型、JIT编译&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等，Python+数学背景可快速上手）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;未进入Top 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Julia的口号是解决"双语言问题"——一边想要Python的舒服，一边想要C的速度。它用LLVM做JIT，性能接近编译语言，跟Python/C/Fortran还能无缝互调，复用现成的库。&lt;/p&gt;
&lt;p&gt;多重派发是它的核心特色，函数行为根据所有参数类型决定。科学计算、数值模拟这块可以用到，但是目前生态还是远没办法跟Python相比。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;2012&lt;/td&gt;
&lt;td&gt;首次发布&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.6&lt;/td&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;最后的0.x版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;首个稳定版——里程碑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;Cray支持、线程改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;LTS版本、编译器性能大幅提升&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.8&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;并行计算改进、内存layout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.9&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;编译缓存改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.10&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;LTS版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.11&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;公共API正式化、包管理改进&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Dart&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Lars Bak、Kasper Lund（Google）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2011年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;3.12（2026年5月）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;面向对象、函数式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型、空安全(Sound Null Safety)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐（低，Java/JS开发者快速上手）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;未进入Top 20但Flutter生态活跃&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Dart是Google出的，主要就是给Flutter框架配的。Flutter做跨平台应用，一套代码跑iOS、Android、Web、桌面，开发时热重载体验也好。Dart 3把空安全彻底做扎实了，还加了记录和模式匹配。&lt;/p&gt;
&lt;p&gt;想搞移动跨平台，Flutter是绕不开的主流选择，Dart自然是跟着它。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2013&lt;/td&gt;
&lt;td&gt;首版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;类型系统强化、Flutter成熟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.12&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;空安全(Null Safety)——里程碑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;100%健全空安全、记录(Records)、模式匹配——大版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.2&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;WebAssembly(GC)支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.4&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;性能改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.12&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;最新版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;SQL&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Donald Chamberlin、Raymond Boyce（IBM）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;1974年（SEQUEL），1986年ANSI标准化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前标准&lt;/td&gt;
&lt;td&gt;SQL:2023（ISO/IEC 9075）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;声明式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型（基于模式Schema）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐（基础易，高级优化难）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#8（1.71%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;SQL不算通用编程语言，但搞数据的人没人躲得开它。它的思路是声明式的：你告诉它要啥，它自己琢磨咋取，查询优化器决定执行计划。基础语法学起来半天就会，但优化起来水深得很。&lt;/p&gt;
&lt;p&gt;现在的SQL已经能玩窗口函数、CTE、JSON操作、递归查询这些高级活了，2023版连属性图查询都进了标准。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;标准&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SQL-86&lt;/td&gt;
&lt;td&gt;1986&lt;/td&gt;
&lt;td&gt;首个ANSI标准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL-89&lt;/td&gt;
&lt;td&gt;1989&lt;/td&gt;
&lt;td&gt;参照完整性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL-92&lt;/td&gt;
&lt;td&gt;1992&lt;/td&gt;
&lt;td&gt;JOIN语法、CASE、外连接&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL:1999&lt;/td&gt;
&lt;td&gt;1999&lt;/td&gt;
&lt;td&gt;触发器、递归、正则匹配&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL:2003&lt;/td&gt;
&lt;td&gt;2003&lt;/td&gt;
&lt;td&gt;窗口函数、XML支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL:2008&lt;/td&gt;
&lt;td&gt;2008&lt;/td&gt;
&lt;td&gt;INSTEAD OF触发器、TRUNCATE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL:2011&lt;/td&gt;
&lt;td&gt;2011&lt;/td&gt;
&lt;td&gt;时态数据(Temporal Tables)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL:2016&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;JSON支持、行模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL:2019&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;属性图查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL:2023&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;SQL/PGQ属性图查询、JSON数据类型正式化&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Scratch&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;MIT Media Lab（Mitchel Resnick团队）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2007年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;3.0（2019年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;事件驱动、积木式可视化编程&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;无传统类型系统&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐（极易，面向8-16岁青少年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;#12（1.27%）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Scratch是MIT搞的积木式编程，不用敲代码，把积木块拖来拖去就行，面向小朋友。设计目的是让儿童在编程里学会创造性思维和系统推理，现在学校的信息技术课到处都是它。&lt;/p&gt;
&lt;p&gt;TIOBE排名能排到12，说明少儿编程是真火了一下，但是为什么不直接学Python呢。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创作者&lt;/td&gt;
&lt;td&gt;MIT Media Lab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2007年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;3.0（2019年）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;定位&lt;/td&gt;
&lt;td&gt;少儿编程教育&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;第六梯队：新兴与前沿语言&lt;/h2&gt;
&lt;h3&gt;Zig&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Andrew Kelley&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2016年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;0.16.0（2026年4月）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;过程式、编译期元编程&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等，C开发者友好）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;未进入Top 20但持续上升&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Zig是新锐里的当红炸子鸡，理念是"无隐藏魔法"——没有隐式控制流、没有隐式内存分配、没有预处理器、没有宏，所有行为都得在代码里明着写。最牛的是comptime编译期执行，能在编译期调用任意函数、操作类型，实现零运行时开销的元编程。&lt;/p&gt;
&lt;p&gt;它还能当零依赖的C/C++交叉编译器用，TigerBeetle这种追求极致的数据库就选它。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.1&lt;/td&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;首版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.5&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;comptime系统成熟&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.10&lt;/td&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;自举编译器(self-hosted)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.11&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;包管理器(zig fetch)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.13&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;稳定性提升&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0.16&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;错误处理改进、编译期反射增强、标准库新模块(std.crypto/std.net.Server)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Nim&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;信息&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;创建者&lt;/td&gt;
&lt;td&gt;Andreas Rumpf&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;诞生年份&lt;/td&gt;
&lt;td&gt;2008年&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;当前版本&lt;/td&gt;
&lt;td&gt;2.2.10（2026年4月）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;范式&lt;/td&gt;
&lt;td&gt;多范式（过程式、函数式、面向对象、元编程）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;类型系统&lt;/td&gt;
&lt;td&gt;静态类型、强类型、类型推断&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习难度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（中等，Python语法+C性能）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TIOBE排名&lt;/td&gt;
&lt;td&gt;未进入Top 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nim想同时拥有Python的语法和C的性能，先编译到C/C++/JavaScript，再由GCC/Clang变成原生代码。内存管理用ORC那套，确定性地析构，没有GC暂停。宏系统直接操作AST，表达力极强。&lt;/p&gt;
&lt;p&gt;以太坊有个客户端Nimbus就是它写的，也是它拿得出手的代表作。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;th&gt;年份&lt;/th&gt;
&lt;th&gt;关键特性&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0.x&lt;/td&gt;
&lt;td&gt;2008-2014&lt;/td&gt;
&lt;td&gt;预发布（原名Nimrod）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;首个稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;LTS版本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;ARC/ORC默认——里程碑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;编译器内部重构、ORC改进&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2.10&lt;/td&gt;
&lt;td&gt;2026&lt;/td&gt;
&lt;td&gt;最新版（76 commits、34 bugfixes）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;横向对比&lt;/h2&gt;
&lt;h3&gt;按学习难度排序&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;难度&lt;/th&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th&gt;适合人群&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;⭐ 极易&lt;/td&gt;
&lt;td&gt;Python、Scratch&lt;/td&gt;
&lt;td&gt;零基础入门、青少年教育&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⭐⭐ 低&lt;/td&gt;
&lt;td&gt;Go、PHP、Ruby、Lua、Dart&lt;/td&gt;
&lt;td&gt;有编程基础者快速上手&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⭐⭐⭐ 中&lt;/td&gt;
&lt;td&gt;Java、C#、JavaScript、Nim、Julia&lt;/td&gt;
&lt;td&gt;有一定基础，可深入掌握&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⭐⭐⭐⭐ 中高&lt;/td&gt;
&lt;td&gt;C、Swift、Kotlin、TypeScript、R、MATLAB&lt;/td&gt;
&lt;td&gt;需要理解类型系统或特定范式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⭐⭐⭐⭐⭐ 极高&lt;/td&gt;
&lt;td&gt;C++、Rust、Perl、Scala、Haskell&lt;/td&gt;
&lt;td&gt;需要深厚的计算机科学基础&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;按应用领域速查&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;领域&lt;/th&gt;
&lt;th&gt;首选语言&lt;/th&gt;
&lt;th&gt;备选&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI/机器学习&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Julia、R&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web前端&lt;/td&gt;
&lt;td&gt;JavaScript/TypeScript&lt;/td&gt;
&lt;td&gt;Dart(Flutter)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web后端&lt;/td&gt;
&lt;td&gt;Python/Java/Go/Node.js&lt;/td&gt;
&lt;td&gt;PHP、Ruby、C#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;移动开发&lt;/td&gt;
&lt;td&gt;Kotlin(Android)、Swift(iOS)&lt;/td&gt;
&lt;td&gt;Dart(Flutter跨平台)、React Native(JS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统编程&lt;/td&gt;
&lt;td&gt;C/C++/Rust&lt;/td&gt;
&lt;td&gt;Zig、Go、Nim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;游戏开发&lt;/td&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;C#(Unity)、Lua(脚本)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大数据&lt;/td&gt;
&lt;td&gt;Scala(Spark)&lt;/td&gt;
&lt;td&gt;Python、Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据科学&lt;/td&gt;
&lt;td&gt;Python/R&lt;/td&gt;
&lt;td&gt;Julia、SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;嵌入式&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;C++、Rust、Zig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;云原生/DevOps&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Python、Shell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;科学计算&lt;/td&gt;
&lt;td&gt;Julia/Python&lt;/td&gt;
&lt;td&gt;MATLAB、R&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;按当前版本一览&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th&gt;当前版本&lt;/th&gt;
&lt;th&gt;发布日期&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;3.14.6&lt;/td&gt;
&lt;td&gt;2026-06&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;C23&lt;/td&gt;
&lt;td&gt;2024-10&lt;/td&gt;
&lt;td&gt;标准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;C++23/C++26(冻结)&lt;/td&gt;
&lt;td&gt;2023/2026-03&lt;/td&gt;
&lt;td&gt;标准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;JDK 26&lt;/td&gt;
&lt;td&gt;2026-03&lt;/td&gt;
&lt;td&gt;非LTS(当前LTS: JDK 25)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;14(.NET 10)&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;ES2025&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;标准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;1.27&lt;/td&gt;
&lt;td&gt;2026-06&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;1.96&lt;/td&gt;
&lt;td&gt;2026-05&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swift&lt;/td&gt;
&lt;td&gt;6.1&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;td&gt;2.4.0&lt;/td&gt;
&lt;td&gt;2026-06&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;6.0.3&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;稳定版(7.0原生编译器预览)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;8.5.7&lt;/td&gt;
&lt;td&gt;2026-06&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;3.4&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lua&lt;/td&gt;
&lt;td&gt;5.4&lt;/td&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dart&lt;/td&gt;
&lt;td&gt;3.12&lt;/td&gt;
&lt;td&gt;2026-05&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R&lt;/td&gt;
&lt;td&gt;4.5&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Julia&lt;/td&gt;
&lt;td&gt;1.11&lt;/td&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scala&lt;/td&gt;
&lt;td&gt;3.x&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haskell&lt;/td&gt;
&lt;td&gt;GHC 9.12&lt;/td&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nim&lt;/td&gt;
&lt;td&gt;2.2.10&lt;/td&gt;
&lt;td&gt;2026-04&lt;/td&gt;
&lt;td&gt;稳定版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zig&lt;/td&gt;
&lt;td&gt;0.16.0&lt;/td&gt;
&lt;td&gt;2026-04&lt;/td&gt;
&lt;td&gt;预发布&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;编程语言发展时间线&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;年代&lt;/th&gt;
&lt;th&gt;出现的语言（年份）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1950年代&lt;/td&gt;
&lt;td&gt;Fortran(1957)、LISP(1958)、ALGOL(1958)、COBOL(1959)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1960年代&lt;/td&gt;
&lt;td&gt;BASIC(1964)、PL/I(1964)、Simula(1965)、BCPL(1967)、Pascal(1970)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1970年代&lt;/td&gt;
&lt;td&gt;C(1972)、Smalltalk(1972)、Prolog(1972)、Scheme(1975)、Ada(1983)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1980年代&lt;/td&gt;
&lt;td&gt;Objective-C(1984)、C++(1985)、Eiffel(1986)、Perl(1987)、Tcl(1988)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1990年代&lt;/td&gt;
&lt;td&gt;Haskell(1990)、Python(1991)、Lua(1993)、Ruby(1995)、Java(1995)、JavaScript(1995)、PHP(1995)、Delphi(1995)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2000年代&lt;/td&gt;
&lt;td&gt;C#(2000)、Scala(2004)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2010年代&lt;/td&gt;
&lt;td&gt;Rust(2010)、Dart(2011)、Kotlin(2011)、Julia(2012)、TypeScript(2012)、Swift(2014)、Zig(2016)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020年代&lt;/td&gt;
&lt;td&gt;持续涌现的新语言&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;咋选语言&lt;/h2&gt;
&lt;p&gt;说实话，选语言这事儿，比很多人想的简单。别被"XX已死""XX将取代XX"这种标题党带偏，关键看你到底想干啥。&lt;/p&gt;
&lt;h3&gt;按目标选&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;你的目标&lt;/th&gt;
&lt;th&gt;推荐路径&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;零基础入门&lt;/td&gt;
&lt;td&gt;Python → 理解编程基础后选择方向&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web前端开发&lt;/td&gt;
&lt;td&gt;HTML/CSS → JavaScript → TypeScript → React/Vue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web后端开发&lt;/td&gt;
&lt;td&gt;Python(Django/FastAPI) 或 Go 或 Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android开发&lt;/td&gt;
&lt;td&gt;Kotlin → Jetpack Compose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS开发&lt;/td&gt;
&lt;td&gt;Swift → SwiftUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跨平台移动&lt;/td&gt;
&lt;td&gt;Dart(Flutter)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据科学/AI&lt;/td&gt;
&lt;td&gt;Python(NumPy/pandas/PyTorch) → R(统计) → Julia(高性能)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;游戏开发&lt;/td&gt;
&lt;td&gt;C++(Unreal Engine) 或 C#(Unity)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统编程&lt;/td&gt;
&lt;td&gt;C → Rust 或 Zig&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大数据&lt;/td&gt;
&lt;td&gt;Scala(Spark) 或 Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;嵌入式&lt;/td&gt;
&lt;td&gt;C → Rust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;云原生/后端&lt;/td&gt;
&lt;td&gt;Go → Kubernetes生态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;高并发实时系统&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;金融量化&lt;/td&gt;
&lt;td&gt;Python → C++ → Haskell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;编程教育(儿童)&lt;/td&gt;
&lt;td&gt;Scratch → Python&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;按已有基础选&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;你的背景&lt;/th&gt;
&lt;th&gt;下一步推荐&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;会Java&lt;/td&gt;
&lt;td&gt;Kotlin(Android) 或 Go(云原生) 或 TypeScript(全栈)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;会C&lt;/td&gt;
&lt;td&gt;C++(游戏/高性能) 或 Rust(安全系统) 或 Zig(C替代)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;会Python&lt;/td&gt;
&lt;td&gt;Go(高性能后端) 或 Rust(系统) 或 TypeScript(前端)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;会JavaScript&lt;/td&gt;
&lt;td&gt;TypeScript → Node.js后端 或 Dart(Flutter移动)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这一整篇下来，你会发现编程语言这东西没那么玄乎。本质就是一代代人为了解决当时的具体问题攒出来的工具，各有各的用武之地。数据截至2026年8月，版本和排名都在变，但语言背后那套思想，始终是人和机器的交互。&lt;/p&gt;</content><category term="Programming"/><category term="Programming"/><category term="Language"/><category term="Python"/><category term="C"/><category term="Rust"/><category term="History"/></entry><entry><title>用 opencode 搜集相声文本-其他行业场景用智能体的案例</title><link href="https://blog.cycleuser.org/yong-opencode-sou-ji-xiang-sheng-wen-ben-qi-ta-xing-ye-chang-jing-yong-zhi-neng-ti-de-an-li.html" rel="alternate"/><published>2026-08-07T08:30:00+08:00</published><updated>2026-08-07T08:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-07:/yong-opencode-sou-ji-xiang-sheng-wen-ben-qi-ta-xing-ye-chang-jing-yong-zhi-neng-ti-de-an-li.html</id><summary type="html">&lt;p&gt;先说清楚，这篇文章不是讲相声艺术的。我对相声毫不理解，完全不懂，也很少接触。传统相声里的贯口、柳活、腿子活这些门道 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;先说清楚，这篇文章不是讲相声艺术的。我对相声毫不理解，完全不懂，也很少接触。传统相声里的贯口、柳活、腿子活这些门道，我一个都说不明白。&lt;/p&gt;
&lt;p&gt;那为什么拿相声当例子？因为我想演示一个看起来和 AI、数据科学、计算机离得非常远的场景，其实也能用上这些工具。不需要提示词工程的高手，也不懂什么技能工程、Agent 编排这些名词，在一个看上去很不相干的行业场景，也能实现一件事：&lt;strong&gt;把一件想做的事，用大白话说清楚，然后让智能体去办。&lt;/strong&gt; 这大概是智能体最朴素的用法了。&lt;/p&gt;
&lt;h2&gt;我儿子最近喜欢听相声&lt;/h2&gt;
&lt;p&gt;先说清楚这事的由头。不是我自己要收集相声——是我儿子最近听相声，之前我媳妇给他讲历史故事的时候已经找了很多文本，那这次我想给我儿子找一些相声文本来了解内容。借着这个机会，帮他建立一份初步整理好的东西。&lt;/p&gt;
&lt;p&gt;所以我的需求很直接：把网上能找到的相声文本，收拢到一个目录里，一个段子一个文件，每个文件带上标注，从网络上搜索所有能找到的段子。就这么一句话。&lt;/p&gt;
&lt;p&gt;&lt;img alt="0-给出要求" src="images/xiangsheng_demo_0_prompt.png"&gt;&lt;/p&gt;
&lt;p&gt;我给 opencode 的完整提示词是这样：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;建立一个专门的相声文本的目录，把历史上所有的经典的古典相声段子，小段大活儿等等按照一个一个文件来放好，并且做好标注。从网络上搜索所有能找到的相声段子来吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;提示词隐含策略和框架&lt;/h2&gt;
&lt;p&gt;你可能觉得，这句话挺含糊的，什么"所有""经典""做好标注"，全是虚的。但它接到这句话之后，并没有直接冲出去乱搜，而是先干了一件事——&lt;strong&gt;按我话里蕴含的思路，先把架子搭起来&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我说"建一个目录""按文件放好""做好标注"，它就能听出这活儿得有个结构。于是它先建了这么个骨架：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;相声文本库/
├── README.md
├── 《传统相声汇集》总目录.md
├── 《中国传统相声大全》目录.md
├── 传统单口相声/
├── 传统对口相声/
├── 传统群口相声/
└── 新相声/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;凡事都是要有结构，有纲要，有目录，这就是一个体现。拿了这个，他再去找，这就叫按图索骥，它去参考着找。&lt;/p&gt;
&lt;p&gt;最开始，它从网上翻到了《传统相声汇集》的完整目录——这套书俗称"六小本儿"，六册收了二百多段传统相声，每段还标了口述者和整理者，张寿臣、刘宝瑞、郭启儒、侯宝林、马三立、常宝堃这些名字都在上面。这份目录就成了整个库的索引地基，后面一段一段往里填，就照着它来。&lt;/p&gt;
&lt;p&gt;这里其实是个挺重要的点：&lt;strong&gt;虽然我是直接给它提了个要求，但要求里边尽量蕴含一点对这件事的思考。&lt;/strong&gt; 这个提示词其实压根也说不上什么提示词工程，只是对话的人默认脑子里就想到了要分类、要标注、要完整。把这些想法用大白话放进要求里，智能体就能沿着这个思路去执行。所谓的提示词工程也不是什么玄学，而更可以说是「沟通的技术」，是要求里带上你的思考方向，它才知道往哪儿使劲。&lt;/p&gt;
&lt;h2&gt;顺着名字一路挖下去&lt;/h2&gt;
&lt;p&gt;架子搭好，就开始填内容了。搜到一批经典段子之后，目录里就有了很多段子的名字。有意思的是，&lt;strong&gt;它拿着这些名字，还能接着搜出更多东西，就是从搜索结果当中发散出更多线索&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;比如从目录里看到《报菜名》《八扇屏》《地理图》，它就能顺着这些名字去找各自的全本；看到表演者名单里有张寿臣、刘宝瑞，它又能顺着人去找他们名下别的段子。名字是锚点，一个带一个，越挖越多。&lt;/p&gt;
&lt;p&gt;人自己查这些相关的事儿的时候，是不是不也是这样？如果有的时候需要咱们自己找这种线索，也都是会先看看著名的作品，是谁的代表作，再找典型作者，然后这么来。跟智能体交流也是类似，把事儿说清楚，剩下让它自己滚雪球。&lt;/p&gt;
&lt;h2&gt;AI替人干那些无聊的活&lt;/h2&gt;
&lt;p&gt;这里得再次强调一个原则，让 AI 干活，建议只让它替人完成无聊的重复的机械内容，而绝对不建议把判断权也交给它。&lt;/p&gt;
&lt;p&gt;比如这次，它要上网去把一堆页面上的文本拿下来。这事儿的本质是什么？&lt;strong&gt;是让它去操作浏览器、上网帮忙下载东西，省去了人一个个复制粘贴的功夫。&lt;/strong&gt; ——它只是执行里那些重复、枯燥、纯粹浪费时间的部分。搜集和排版这种活，人干起来又慢又无聊，交给它正合适。&lt;/p&gt;
&lt;p&gt;AI擅长替人做那些&lt;strong&gt;浪费时间又毫无乐趣的重复劳动&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;遇到问题AI能自己想办法&lt;/h2&gt;
&lt;p&gt;这种从网上搜集文本的活儿，走一遍就一定会遇到几个坑，我一开始其实还担心它搞不定，后来发现它对这种问题处理得比人还顺。&lt;/p&gt;
&lt;p&gt;第一个坑是&lt;strong&gt;文字编码&lt;/strong&gt;。有的网站页面文字是 GBK 编码的，直接读出来全是乱码，得转成 UTF-8 才能正常显示。你要是让一个外行人来干这个，他可能压根不知道还有"编码"这么回事，看着满屏乱码就傻眼了。但模型智能体不会——它发现乱码，会自己去识别编码、转码、再重新读。对它来说这不算问题，自动就解决了。&lt;/p&gt;
&lt;p&gt;第二个坑是&lt;strong&gt;内容不完整&lt;/strong&gt;。很多段子在网上只有一半，正文中间有个"查看完整内容"的按钮，点进去要花钱。遇到这种，它就得四处换来源，从别的网站找完整版，再把缺的部分补上拼好。这个问题它也能尽量自己解决——这个站不全就换那个站，一遍不行换几遍。&lt;/p&gt;
&lt;p&gt;智能体有一个特点：&lt;strong&gt;人觉得麻烦甚至无从下手的技术性问题，对模型来说往往不是问题，它会自己想办法。&lt;/strong&gt; 你需要操心的不是"它会不会搞不定"，而是"怎么把要求说清楚，让它知道去干嘛"。&lt;/p&gt;
&lt;p&gt;就算不知道什么是字符编码，也不知道到哪里找和如何拼接完整，人也可以完全不担心不关注这些。&lt;/p&gt;
&lt;p&gt;就像是我要炒菜，只需要知道锅怎么用，菜洗干净之后切成什么样，然后放多少盐就行了。&lt;/p&gt;
&lt;p&gt;不需要去知道这个锅是用什么材料制作的，加工的工艺是什么样的，它的矿物来源是怎么样的，在哪儿进行的选矿冶炼，在哪儿进行的加工成型，怎么进行的互联网营销，最终通过什么样的快递到了这，这些都不用管。&lt;/p&gt;
&lt;p&gt;也不用去知道这个菜是在什么地方产地种的，经历了多长时间的日照，用了什么样的肥料，最终怎么采摘，怎么保存，怎么发给我，这些都不是我一个做菜的这个场景下的操作人员所需要去关注的，人类社会的分工不就是这样吗？&lt;/p&gt;
&lt;h2&gt;初步的结果是一个几十万字的文本目录&lt;/h2&gt;
&lt;p&gt;折腾了一圈之后，目录就建成了。最终收进来了四十多个段子的完整文本，加起来二十多万字：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;传统单口相声：珍珠翡翠白玉汤、连升三级、山东斗法、解学士、君臣斗、小神仙这些刘宝瑞、张寿臣的名段；&lt;/li&gt;
&lt;li&gt;传统对口相声：贯口的报菜名、八扇屏、地理图、绕口令，文哏的论捧逗、文章会，柳活的黄鹤楼、空城计、汾河湾，武哏的大保镖等等；&lt;/li&gt;
&lt;li&gt;传统群口相声：扒马褂、训徒、金刚腿；&lt;/li&gt;
&lt;li&gt;新相声：夜行记、买猴、钓鱼、宇宙牌香烟、五官争功、虎口遐想、小偷公司。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="1-得到结果" src="images/xiangsheng_demo_1_result.png"&gt;&lt;/p&gt;
&lt;h2&gt;文本是原文基础上整理加工过的&lt;/h2&gt;
&lt;p&gt;拿到目录之后，可能有人会想：这不就是把网上的文本复制下来存好吗？&lt;/p&gt;
&lt;p&gt;不完全是。&lt;strong&gt;每个文件里不只是原样文本，模型还会对它做整理和加工。&lt;/strong&gt; 拿连升三级、报菜名这些段子来说，每个文件的开头都有一份标注，正文也有统一的排版和分节。&lt;/p&gt;
&lt;p&gt;比如报菜名那个文件，开头是这样的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;---
篇名:    《报菜名》
别名:    《菜单子》
类型:    传统对口相声 / 贯口活
性质:    大活儿
表演者:  郭启儒、马三立、常宝堃等，各家均有演出本
来源:    网络流传文本（yuwenmi.com 台词库）
&lt;span class="gu"&gt;整理时间: 2026-08-06&lt;/span&gt;
&lt;span class="gu"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;正文里，角色对话统一用「甲：」「乙：」标出来，单口的用叙述体，群口的用「甲/乙/丙」。文末还有一节"来源与备注"，记着这段是从哪抓的、什么版本、有什么残缺。拿到的文本，模型还会顺手润色一下，让它更通顺、更完整，读起来像是整理好的定稿，而不是网页上黏下来的碎渣。&lt;/p&gt;
&lt;p&gt;&lt;img alt="2-文本示范" src="images/xiangsheng_demo_2_sample.png"&gt;&lt;/p&gt;
&lt;p&gt;这一步的意义在于：&lt;strong&gt;从"一堆来源不明的网页"到"一份结构化的资料库"，中间这个整理、标注、校对的活，原本要花很久，现在全让智能体替你干了。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;这种整理好的东西能拿来干嘛&lt;/h2&gt;
&lt;p&gt;说到这儿，可能有人觉得，这不就是整理个资料吗？能有多大用。&lt;/p&gt;
&lt;p&gt;其实想深一层，这种整理出来的结构化文本，用途可以比想象的大。比如，它可以直接作为&lt;strong&gt;某个场景的领域资料&lt;/strong&gt;，拿去训练垂直领域的小模型、做微调的数据集、搭知识库。相声也好，别的什么也好，只要同类文本攒得够多、整理得够规范，就成了可以喂给模型的原料。&lt;/p&gt;
&lt;p&gt;我要说的是：&lt;strong&gt;即使这事看起来和模型、和数据科学离得很远，也可以发挥一点想象力。&lt;/strong&gt; 把日常生活里那些重复性比较高、又没什么创造性的任务，试着交给智能体——整理资料、下载文件、把零散的东西归拢成结构化的东西，这些都是它擅长的。你不用是程序员，也不用懂算法，你只要会"把一件事说清楚"，就能使唤它。&lt;/p&gt;
&lt;h2&gt;但最后必须泼一盆冷水&lt;/h2&gt;
&lt;p&gt;讲到这里，我得提醒一句很重要的事，这也是做这种活儿一定要考虑到的：&lt;strong&gt;模型可能会有幻觉，这是难以避免的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它给出来的文本里，可能带着它自己雕琢、甚至是扭曲的痕迹。你没法保证它整理的每一处都忠实于原文——有些地方它可能顺手"补全"了，有些地方可能理解错了。所以看到结果，不能全盘照收。&lt;/p&gt;
&lt;p&gt;不过具体到相声这个东西，问题倒还不大。因为相声是语言的艺术，它讲究的是顺口、俏皮、包袱响。模型稍微给它改点词儿、顺点句子，人拿回来念两遍，觉得不对劲改回去就是了。语言这东西，改来改去损失不大。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但其他的学科可就未必了。&lt;/strong&gt; 要是整理的是科学文献、医学资料、工程规范，模型要是来这么一手"润色"，后果可能就严重了。所以最后一定要记住：&lt;strong&gt;不能轻信模型，不能让它替你做判断。&lt;/strong&gt; 它负责把活干了，把东西摆到你面前，至于这些内容靠不靠谱、对不对，判断权永远得在你手里。&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="AI"/><category term="相声"/><category term="文本收集"/><category term="智能体"/><category term="日常生活"/></entry><entry><title>从二进制到计算机-0和1是怎么变成程序的</title><link href="https://blog.cycleuser.org/cong-er-jin-zhi-dao-ji-suan-ji-0he-1shi-zen-yao-bian-cheng-cheng-xu-de.html" rel="alternate"/><published>2026-08-06T23:00:00+08:00</published><updated>2026-08-06T23:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-06:/cong-er-jin-zhi-dao-ji-suan-ji-0he-1shi-zen-yao-bian-cheng-cheng-xu-de.html</id><summary type="html">&lt;p&gt;你有没有想过这样一个问题：你手机上某张"图片"，在计算机内部到底是一堆什么？答案是：&lt;strong&gt;一堆 0 和 1&lt;/strong&gt;。不是"一堆像 0 和 1 的 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;你有没有想过这样一个问题：你手机上某张"图片"，在计算机内部到底是一堆什么？答案是：&lt;strong&gt;一堆 0 和 1&lt;/strong&gt;。不是"一堆像 0 和 1 的东西"，就是字面意义上的一长串 &lt;code&gt;010011000111...&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;可能有点反直觉的是，不管是文字、图片、声音、游戏，还是你正在读的这篇文章，到了计算机底层，&lt;strong&gt;全都是 0 和 1&lt;/strong&gt;。那问题就来了：光有 0 和 1，计算机凭什么能"算"，能"存"，最后能跑出千奇百怪的软件？&lt;/p&gt;
&lt;p&gt;这篇文章就顺着这条线，从物理一路讲到编程语言：为什么是二进制 → 二进制怎么表示数 → 二进制怎么计算（逻辑门、加法器）→ 二进制怎么变成各种数据类型 → 不同编程语言处理这些类型时为什么天差地别。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;为什么计算机用二进制，而不是十进制&lt;/h2&gt;
&lt;p&gt;你估计猜到了答案的一半：因为&lt;strong&gt;电路只擅长区分两种状态&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;你当然可以让一个灯泡表示 0~9 十种亮度来代表十进制，但问题是一旦电压稍有波动、电线有点老化、温度有点变化，"亮度 7"和"亮度 8"就不太好分清了。可是"亮"和"灭"——或者更准确地说"高电压"和"低电压"——这两种状态，晶体管可以切换得又快又稳。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;抽象&lt;/th&gt;
&lt;th&gt;物理实现&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;低电压（约 0V）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;高电压（约 3.3V / 5V）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;所以二进制的本质，是&lt;strong&gt;用一个"开关"的两种状态去表达信息&lt;/strong&gt;。一盏灯亮是 1、灭是 0；一格磁带磁化是 1、没磁化是 0；一张光盘有个坑是 1、没坑是 0。理解这一点之后，下面所有内容都顺理成章了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二进制怎么表示数&lt;/h2&gt;
&lt;p&gt;我们在十进制里写 &lt;code&gt;1011&lt;/code&gt;，意思是"1 个千 + 0 个百 + 1 个十 + 1 个一"，每一位的"位权"是 10 的次方。二进制完全一样，只是把"10 的次方"换成了"2 的次方"：&lt;/p&gt;
&lt;p&gt;&lt;img alt="位权对比" src="images/bin_decimal.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图 1. 位权。&lt;/strong&gt; 同样写着 &lt;code&gt;1011&lt;/code&gt;：十进制里每位是 10 的次方，等于一千零一十一；二进制里每位是 2 的次方（8、4、2、1），等于 11。进制不同，数值天差地别。&lt;/p&gt;
&lt;p&gt;二进制里最基本的位权就是：1、2、4、8、16、32、64、128……每一项都是前一项的两倍。所以"把十进制转二进制"其实就是问：这个数能被哪些 2 的次方凑出来？&lt;/p&gt;
&lt;p&gt;用 Python 三行就能搞定（&lt;code&gt;bin()&lt;/code&gt; 是内置函数，下面还附了手算过程）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;            &lt;span class="c1"&gt;# 0b1011&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mb"&gt;0b1011&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;# 11，前缀 0b 表示二进制&lt;/span&gt;

&lt;span class="c1"&gt;# 手动拆：每一位就是 2 的次方&lt;/span&gt;
&lt;span class="n"&gt;bits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;                     &lt;span class="c1"&gt;# 从高位到低位&lt;/span&gt;
&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;# 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;顺便记一个很有用的心算：&lt;strong&gt;&lt;code&gt;2^10 = 1024&lt;/code&gt;&lt;/strong&gt;，大约等于一千。所以"1KB"在计算机里是 1024 字节，不是整 1000（硬盘厂商喜欢用1000）——这个"约等于"的偏差，就是为什么你买的 1TB 硬盘实际可用只有约 931GB。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;八进制与十六进制：二进制的"缩写"&lt;/h2&gt;
&lt;p&gt;二进制有个很烦人的毛病：&lt;strong&gt;太长了&lt;/strong&gt;。一个 8 位的数写起来还行，64 位的整数要写 64 个 0 和 1，谁也受不了。于是计算机科学家想了个偷懒的办法：既然 &lt;code&gt;8 = 2³&lt;/code&gt;、&lt;code&gt;16 = 2⁴&lt;/code&gt;，那就把二进制&lt;strong&gt;每 3 个 bit、每 4 个 bit 打成一包&lt;/strong&gt;，给每一包起一个短名字：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每 &lt;strong&gt;3 个 bit&lt;/strong&gt; 一组，只有 0~7 共 8 种组合 → 叫&lt;strong&gt;八进制&lt;/strong&gt;（octal）；&lt;/li&gt;
&lt;li&gt;每 &lt;strong&gt;4 个 bit&lt;/strong&gt; 一组，只有 0~15 共 16 种组合 → 叫&lt;strong&gt;十六进制&lt;/strong&gt;（hexadecimal）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以八进制、十六进制&lt;strong&gt;不是另一种数&lt;/strong&gt;，而是二进制的"压缩写法"——因为底数分别是 2 的次方，它们和二进制之间可以无损、自由地互相转换。&lt;/p&gt;
&lt;p&gt;&lt;img alt="进制换算" src="images/bin_hex_oct.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图 2. 八进制与十六进制。&lt;/strong&gt; 左图：同一个数 255 用四种进制写出来，进制越大写起来越短；右图：二进制按 4 位一组得到十六进制（&lt;code&gt;1111 1111 → FF&lt;/code&gt;），按 3 位一组得到八进制（&lt;code&gt;011 111 111 → 377&lt;/code&gt;），分组即转换。&lt;/p&gt;
&lt;p&gt;为什么偏偏是 3 和 4？因为 &lt;code&gt;2³ = 8&lt;/code&gt;、&lt;code&gt;2⁴ = 16&lt;/code&gt;：3 个 bit 恰好能表示 0~7（八进制的全部数字），4 个 bit 恰好能表示 0~15（十六进制的全部数字）。于是"二进制 ↔ 八/十六进制"就变成了纯粹的"分组翻译"，根本不用算。十六进制从 10 开始用字母：&lt;code&gt;A=10, B=11, C=12, D=13, E=14, F=15&lt;/code&gt;，对应关系如下：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;二进制&lt;/th&gt;
&lt;th&gt;十六进制&lt;/th&gt;
&lt;th&gt;二进制&lt;/th&gt;
&lt;th&gt;十六进制&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0000&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0001&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1001&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0010&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1010&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0011&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1011&lt;/td&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0100&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;1100&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0101&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;1101&lt;/td&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0110&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;1110&lt;/td&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0111&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;1111&lt;/td&gt;
&lt;td&gt;F&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;在 Python 里三种转换都是内置函数：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;     &lt;span class="c1"&gt;# 0b11111111   二进制&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;oct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;     &lt;span class="c1"&gt;# 0o377        八进制&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;     &lt;span class="c1"&gt;# 0xff         十六进制&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ff&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 255，按十六进制解释字符串&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;377&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 255，按八进制解释字符串&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;为什么程序员整天看见 &lt;code&gt;0x&lt;/code&gt; 开头的东西？因为&lt;strong&gt;内存地址、二进制数据、颜色值&lt;/strong&gt;这类"原始字节"，用十六进制写比二进制短一半还多。比如 CSS 里的颜色 &lt;code&gt;#FF0000&lt;/code&gt; 就是红色——&lt;code&gt;FF&lt;/code&gt; 表示红色的亮度拉满，&lt;code&gt;00&lt;/code&gt; &lt;code&gt;00&lt;/code&gt; 表示绿、蓝为 0。你看到的每一个十六进制字符，背后都是 4 个 bit。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二进制怎么计算：从逻辑门到加法器&lt;/h2&gt;
&lt;p&gt;知道了怎么"表示数"，接下来是最关键的问题：&lt;strong&gt;计算机是怎么"算"的？&lt;/strong&gt; 说白了，计算机里根本没有"算数"这个神秘动作——它只有&lt;strong&gt;逻辑&lt;/strong&gt;。一切算术，都能拆成几个最基本的逻辑操作。&lt;/p&gt;
&lt;h3&gt;逻辑门：电路的"语言"&lt;/h3&gt;
&lt;p&gt;有三个最基本的逻辑门，它们各自只有一张小小真值表：&lt;/p&gt;
&lt;p&gt;&lt;img alt="逻辑门" src="images/bin_gates.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图 3. 三个基本逻辑门。&lt;/strong&gt; 与门 AND：两个输入都是 1，输出才是 1（一票否决制）；或门 OR：只要有一个是 1，输出就是 1；非门 NOT：输入取反。图里每个门都附了真值表。&lt;/p&gt;
&lt;p&gt;用 Python 模拟这三张真值表，你甚至不需要任何硬件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;   &lt;span class="c1"&gt;# 与：两个都要是 1&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;OR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;   &lt;span class="c1"&gt;# 或：有一个是 1 就行&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;NOT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;   &lt;span class="c1"&gt;# 非：取反&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 1 0&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;  &lt;span class="n"&gt;OR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;    &lt;span class="c1"&gt;# 1 0&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;    &lt;span class="n"&gt;NOT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;      &lt;span class="c1"&gt;# 0 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;你可能觉得这太简单了，但请记住：&lt;strong&gt;计算机里所有的"智能"，都是几亿个这种"蠢门"组合出来的。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;异或：三个门就能拼出来&lt;/h3&gt;
&lt;p&gt;不过你可能已经注意到，后面半加器里会用到一个叫"异或门 XOR"的东西——两个输入&lt;strong&gt;不一样&lt;/strong&gt;时输出 1。它是不是第四个"基础门"？不是。&lt;strong&gt;异或完全可以用已经有的与、或、非三个门拼出来，不需要任何新零件。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;异或的意思就是"不一样才为 1"。那什么情况下 A、B 不一样？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 是 1 且 B 是 0：&lt;code&gt;A AND NOT(B)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A 是 0 且 B 是 1：&lt;code&gt;NOT(A) AND B&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这两种情况，任一种成立都算"不一样"，所以再把它们用"或"连起来：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[\text{XOR}(A, B) = (A \land \lnot B) \lor (\lnot A \land B)\]&lt;/div&gt;
&lt;p&gt;&lt;img alt="异或的门级组合" src="images/bin_xor_gates.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图 4. 异或 = 与、或、非的排列组合。&lt;/strong&gt; A 和 ¬B 相与、¬A 和 B 相与，两路结果再相或——异或就出来了。图中蓝色是"A"这一路、绿色是"¬"这一路的走线。&lt;/p&gt;
&lt;p&gt;用代码写出来，就是前面那三个"蠢门"的排列组合：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;OR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;NOT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;XOR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NOT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# 只用与、或、非&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; XOR &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;XOR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 输出：0 XOR 0 = 0；0 XOR 1 = 1；1 XOR 0 = 1；1 XOR 1 = 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这正是"计算机里所有智能都是蠢门组合"的第一课：&lt;strong&gt;连"异或"都不是新零件，只是把与、或、非拼一拼。&lt;/strong&gt; 而它，恰好就是下面半加器里"和位"的核心。&lt;/p&gt;
&lt;h3&gt;半加器：一位加一位&lt;/h3&gt;
&lt;p&gt;二进制里最简单的加法是：一位加一位，可能有四种情况：&lt;code&gt;0+0=0&lt;/code&gt;、&lt;code&gt;0+1=1&lt;/code&gt;、&lt;code&gt;1+0=1&lt;/code&gt;、&lt;code&gt;1+1=2&lt;/code&gt;。前三个好办，最后这个 &lt;code&gt;1+1=2&lt;/code&gt; 在二进制里是 &lt;code&gt;10&lt;/code&gt;——结果是 0，&lt;strong&gt;还要向高一位进 1&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;所以"一位加法"需要同时算出两个东西：&lt;strong&gt;和位&lt;/strong&gt;（sum）和&lt;strong&gt;进位&lt;/strong&gt;（carry）。观察一下真值表就能发现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;和位：两个输入不一样时是 1 → 这是&lt;strong&gt;异或门 XOR&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;进位：两个输入都是 1 时是 1 → 这是&lt;strong&gt;与门 AND&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个组合就叫&lt;strong&gt;半加器&lt;/strong&gt;，两行代码的事：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;   &lt;span class="c1"&gt;# 与&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;XOR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;   &lt;span class="c1"&gt;# 异或&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;half_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;XOR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# (和位, 进位)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;half_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# (0, 0)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;half_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;   &lt;span class="c1"&gt;# (0, 1)  —— 1+1=2，即二进制 10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;全加器：带上进位的加法&lt;/h3&gt;
&lt;p&gt;半加器有个缺陷：它不理会&lt;strong&gt;来自低位的进位&lt;/strong&gt;。可真实的多位加法里，第 3 位算的时候，第 2 位可能正好向它进了个 1。所以得做一个"三位相加"的电路：两个加数位 + 一个低位进位，算出和位 + 新高位进位——这就是&lt;strong&gt;全加器&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;把 4 个全加器串起来，低位的进位接高位的进位输入，就得到一个 4 位加法器：&lt;/p&gt;
&lt;p&gt;&lt;img alt="全加器电路" src="images/bin_full_adder.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图 5. 4 位加法器。&lt;/strong&gt; 每个 FA 是一个全加器：竖着进来的是 A 位和 B 位，横着串起来的是"进位链"（低位算完，进位送给高位）。最左边 C0 补 0，最右边 C4 是最高位进位。整条链就是加法器。&lt;/p&gt;
&lt;p&gt;这个"全加器"用代码实现也只要几行——它正好是&lt;strong&gt;两个半加器加一个或门&lt;/strong&gt;拼出来的。更进一步，把 4 个全加器串起来（低位进位喂给高位的 &lt;code&gt;cin&lt;/code&gt;），就是一台能算 4 位加法的"加法器"：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;OR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;XOR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;half_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;XOR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;AND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# (和位, 进位)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;full_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;half_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# 两个半加器……&lt;/span&gt;
    &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;half_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;     &lt;span class="c1"&gt;# ……再加一个低位进位&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;# (和位, 进位)&lt;/span&gt;

&lt;span class="c1"&gt;# 全加器真值表：8 种情况全对&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)]:&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;+&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;+&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; = 和&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; 进位&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 用 4 个全加器串成 4 位加法器：算 1011 + 0110&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;add4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;                       &lt;span class="c1"&gt;# a、b 是低位在前的 bit 列表&lt;/span&gt;
    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;full_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 上一位的进位传进来&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add4&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# 1011 + 0110（低位在前）&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1011 + 0110 =&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;(二进制)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;十进制结果：&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="c1"&gt;# 输出：1011 + 0110 = 10001 (二进制)；十进制结果：17&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;注意看 &lt;code&gt;add4&lt;/code&gt; 里那个 &lt;code&gt;cin&lt;/code&gt;——它就像图 3 里的那条红色进位链：一位算完，进位被"喂"给下一位。&lt;strong&gt;这一小段 Python，就是 CPU 里加法器的完整逻辑。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下面这个动画演示了这条"进位链"是怎么工作的——算 &lt;code&gt;1011 + 0110&lt;/code&gt;，从最低位（位权 1）开始，逐位计算，每位的进位会"接力"传给下一位：&lt;/p&gt;
&lt;p&gt;&lt;img alt="加法器动画" src="images/bin_adder.gif"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图 6. 二进制加法动画。&lt;/strong&gt; 从最右边一位开始算：1+0=1 无进位，第二位 1+1=0 进 1，第三位 0+1 再+进位 1=0 进 1……直到算出结果 &lt;code&gt;10001&lt;/code&gt;（17）。注意每一列的进位都会"涨"到左边一列。&lt;/p&gt;
&lt;p&gt;到这一步，"计算机是怎么算数"这个问题就有了一个非常硬核又非常朴素的答案：&lt;strong&gt;所谓加法，就是一堆开关（晶体管）按逻辑门的规则互相勾连；所谓算数，就是把这个"加法器"不断做大、做快。&lt;/strong&gt; 减法（补码）、乘法（移位累加）、除法（试商）都可以在加法器的基础上搭出来。CPU 里那个负责算数的部件，就叫 &lt;strong&gt;ALU（算术逻辑单元）&lt;/strong&gt;，本质就是一台超大的加法器加上一堆逻辑门。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;从"数"到"一切数据"：编码&lt;/h2&gt;
&lt;p&gt;现在我们已经能让计算机"算 0 和 1"了。但照片、文字、声音，怎么看都不是 0 和 1。怎么办？答案是&lt;strong&gt;编码&lt;/strong&gt;——人为约定一套规则，让二进制和真实世界一一对应：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;数据&lt;/th&gt;
&lt;th&gt;怎么编码成二进制&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;整数&lt;/td&gt;
&lt;td&gt;直接就是二进制（&lt;code&gt;5&lt;/code&gt; → &lt;code&gt;101&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;小数&lt;/td&gt;
&lt;td&gt;二进制小数/浮点数（如 &lt;code&gt;0.1&lt;/code&gt; → &lt;code&gt;0.000110011...&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;字符&lt;/td&gt;
&lt;td&gt;查表：每个字符一个编号（ASCII / Unicode，如 &lt;code&gt;A&lt;/code&gt; → &lt;code&gt;65&lt;/code&gt; → &lt;code&gt;1000001&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;图片&lt;/td&gt;
&lt;td&gt;每个像素拆成 RGB 三个数（红/绿/蓝亮度）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;声音&lt;/td&gt;
&lt;td&gt;每秒采样几万次，每个采样点一个数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;程序&lt;/td&gt;
&lt;td&gt;指令本身也有编号，CPU 照着编号干活&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;关键要理解的是：&lt;strong&gt;同一串二进制，可以"解释"成任何东西。&lt;/strong&gt; &lt;code&gt;01000001&lt;/code&gt; 可以是一个整数 65，也可以是字符 &lt;code&gt;'A'&lt;/code&gt;，也可以是一张图片里某个像素的某个颜色分量——全看你&lt;strong&gt;打算把它当什么&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这时候，"数据类型"这个概念就出现了。它的本质就是一句话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;数据类型 = 告诉程序"这一串二进制该怎么解释、占多大地方、能干什么"。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;数据类型有哪些&lt;/h2&gt;
&lt;p&gt;常见的"基础数据类型"就那么几种，每种对应一种"人类世界里最基本的信息"：&lt;/p&gt;
&lt;p&gt;常见的"基础数据类型"就那么几种，每种对应一种"人类世界里最基本的信息"，它们占的内存大小差别很大：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;代表语言里的名字&lt;/th&gt;
&lt;th&gt;表示什么&lt;/th&gt;
&lt;th&gt;典型大小&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;布尔 bool&lt;/td&gt;
&lt;td&gt;&lt;code&gt;bool&lt;/code&gt; / &lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;真 / 假&lt;/td&gt;
&lt;td&gt;1 字节&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;字符 char&lt;/td&gt;
&lt;td&gt;&lt;code&gt;char&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一个字符&lt;/td&gt;
&lt;td&gt;1 字节（ASCII）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;整数 int&lt;/td&gt;
&lt;td&gt;&lt;code&gt;int&lt;/code&gt; / &lt;code&gt;integer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;整数（有正负）&lt;/td&gt;
&lt;td&gt;4 或 8 字节&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;无符号整数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;unsigned int&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;只有非负的整数&lt;/td&gt;
&lt;td&gt;4 字节&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;浮点 float&lt;/td&gt;
&lt;td&gt;&lt;code&gt;float&lt;/code&gt; / &lt;code&gt;double&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;带小数的数&lt;/td&gt;
&lt;td&gt;4 或 8 字节&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;字符串 string&lt;/td&gt;
&lt;td&gt;&lt;code&gt;str&lt;/code&gt; / &lt;code&gt;String&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;一串字符&lt;/td&gt;
&lt;td&gt;变长&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一个关键观察：&lt;strong&gt;同一串 0 和 1，类型不同，占的内存和解释方式就完全不同。&lt;/strong&gt; 比如 &lt;code&gt;01000001&lt;/code&gt; 在 &lt;code&gt;char&lt;/code&gt; 里是字符 &lt;code&gt;'A'&lt;/code&gt;，在 &lt;code&gt;int&lt;/code&gt; 里就是数字 65。另外注意 Python 的整数是个"对象"，光一个数就占约 28 字节——因为它要管任意大，牺牲内存换"永远够用"（下文讲语言差异时会再提）。&lt;/p&gt;
&lt;p&gt;在这个基础上，还有由基础类型拼出来的&lt;strong&gt;复合类型&lt;/strong&gt;：数组（一堆同类型排成一排）、结构体/类（把不同类型打包成一个"档案袋"）、指针/引用（记住"数据放在哪"）、枚举（给一组常量起名字）、联合体（同一块内存换着花样用）。但追根到底，它们都是"0 和 1"按不同规则的组织方式。&lt;/p&gt;
&lt;p&gt;一个 32 位整数 &lt;code&gt;int&lt;/code&gt; 能表示的范围是 &lt;code&gt;-2147483648 ~ 2147483647&lt;/code&gt;——为什么是这么个怪数？因为 32 位里最高一位留作符号，剩下 31 位能表示 &lt;span class="arithmatex"&gt;\(2^{31}\)&lt;/span&gt; 个数，一半给负数、一半给非负，所以上限正好是 &lt;span class="arithmatex"&gt;\(2^{31}-1 = 2147483647\)&lt;/span&gt;。&lt;strong&gt;这个"上限"能不能撑住，直接导致了下面要讲的语言差异。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;不同编程语言的类型差异&lt;/h2&gt;
&lt;p&gt;同一个"整数"、"浮点"，在不同编程语言里差别可以非常大。我们从四个维度来看。&lt;/p&gt;
&lt;h3&gt;差异一：静态类型 vs 动态类型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;静态类型&lt;/strong&gt;（C、Java、Go、Rust）：变量是什么类型，&lt;strong&gt;编译的时候&lt;/strong&gt;就定死了，不许变。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动态类型&lt;/strong&gt;（Python、JavaScript）：变量只是"贴了个名字"，类型&lt;strong&gt;运行的时候&lt;/strong&gt;才知道，今天装整数、明天装字符串都行。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python：动态类型，同一个变量想装什么都行&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;        &lt;span class="c1"&gt;# 现在是整数&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;hello&amp;quot;&lt;/span&gt;   &lt;span class="c1"&gt;# 下一秒变成字符串，完全合法&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// C：静态类型，类型写在声明里，想改都不行&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;hello&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;// 编译报错：不能把字符串塞进 int&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;动态类型写起来爽，但类型错误往往&lt;strong&gt;运行到那一步才爆&lt;/strong&gt;；静态类型写起来啰嗦，但编译期就把一堆低级错误挡在门外。&lt;/p&gt;
&lt;h3&gt;差异二：强类型 vs 弱类型&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;强类型&lt;/strong&gt;（Python、Java）：类型不匹配就报错，绝不偷偷"变魔术"。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;弱类型&lt;/strong&gt;（C、JavaScript）：类型不匹配时会&lt;strong&gt;自动转换&lt;/strong&gt;（隐式转换），经常"好心办坏事"。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最典型的例子是 JavaScript 的 &lt;code&gt;+&lt;/code&gt;——它看情况决定是"加法"还是"拼字符串"：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;// JavaScript：弱类型，加号会自动&amp;quot;变魔术&amp;quot;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// &amp;quot;12&amp;quot;   数字被自动转成字符串拼起来了&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;5&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;// true   宽松相等：字符串和数字被自动转成一样&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;5&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;===&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// false  严格相等：类型不同就是不同&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;而 Python 里 &lt;code&gt;"5" + 5&lt;/code&gt; 会直接抛 &lt;code&gt;TypeError&lt;/code&gt;，因为它拒绝"猜测你的意图"。&lt;/p&gt;
&lt;h3&gt;差异三：整数范围——会不会溢出&lt;/h3&gt;
&lt;p&gt;这是最容易踩的坑。&lt;strong&gt;C 的 &lt;code&gt;int&lt;/code&gt; 是固定 4 字节&lt;/strong&gt;，加过头就"绕回去"：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2147483647&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;// int32 的最大值&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;// 溢出！输出 -2147483648&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;int=%zu 字节, float=%zu, double=%zu, char=%zu&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Python 的整数是"任意精度"&lt;/strong&gt;：不够用就自动多占几个字节，永远不溢出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2147483647&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# 2147483648，自动变大，不会绕回去&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# 一百位数也能存，想多大就多大&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Python 整数牺牲内存，换来了"永远够用"。而 C 选择固定 4 字节，换来的是速度和可预测的内存布局。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;差异四：浮点精度——所有语言共同的坑&lt;/h3&gt;
&lt;p&gt;小数（浮点数）在所有语言里都面临同一个问题：&lt;strong&gt;0.1 在二进制里是无限循环小数&lt;/strong&gt;，存不下，只能截断。所以：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# 0.30000000000000004&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;为什么是 &lt;code&gt;0.30000000000000004&lt;/code&gt; 而不是 &lt;code&gt;0.3&lt;/code&gt;？看这个图就明白了——十进制的 0.1 转成二进制，会一直除不尽，永远写不完：&lt;/p&gt;
&lt;p&gt;&lt;img alt="浮点精度" src="images/bin_float.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;图 7. 0.1 的二进制表示。&lt;/strong&gt; 十进制 0.1 的二进制是 &lt;code&gt;0.00011001100110011...&lt;/code&gt;，无限循环。浮点数只有有限位（float 32 位、double 64 位），只能截断，所以存下的其实是一个"很接近 0.1 但不是 0.1"的数，两个这种数加一起，误差就露出来了。&lt;/p&gt;
&lt;p&gt;不同语言在这件事上唯一的区别是"精度档位"：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C：有 &lt;code&gt;float&lt;/code&gt;（4 字节，约 7 位有效数字）和 &lt;code&gt;double&lt;/code&gt;（8 字节，约 15 位有效数字），自己选；&lt;/li&gt;
&lt;li&gt;Python：只有一个 &lt;code&gt;float&lt;/code&gt;，&lt;strong&gt;其实就是 8 字节的 double&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;JavaScript：连整数都是 double——所以你写 &lt;code&gt;0.1+0.2&lt;/code&gt; 得到 &lt;code&gt;0.30000000000000004&lt;/code&gt;，而 &lt;code&gt;9007199254740993&lt;/code&gt; 这种大整数会悄悄变不准。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;语言"性格"一览&lt;/h3&gt;
&lt;p&gt;把上面这些差异汇总成一张表（"静态/动态"管类型什么时候定，"强/弱"管类型会不会偷偷转换）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th&gt;静态 / 动态&lt;/th&gt;
&lt;th&gt;强 / 弱&lt;/th&gt;
&lt;th&gt;一句话特点&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;静态&lt;/td&gt;
&lt;td&gt;偏弱&lt;/td&gt;
&lt;td&gt;类型就是那几个字节，直接操作内存，快但危险&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;静态&lt;/td&gt;
&lt;td&gt;强&lt;/td&gt;
&lt;td&gt;编译期查类型，跑在虚拟机上，严谨稳重&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;静态&lt;/td&gt;
&lt;td&gt;强&lt;/td&gt;
&lt;td&gt;带类型推断，编译快，适合写后端服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;静态&lt;/td&gt;
&lt;td&gt;强&lt;/td&gt;
&lt;td&gt;最严的类型系统，既要性能又要安全&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;动态&lt;/td&gt;
&lt;td&gt;强&lt;/td&gt;
&lt;td&gt;随手写、运行期才定类型，但拒绝乱猜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;动态&lt;/td&gt;
&lt;td&gt;弱&lt;/td&gt;
&lt;td&gt;灵活到"加号都会变魔术"，坑多但生态巨大&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这张表不是"谁好谁坏"，而是&lt;strong&gt;取舍&lt;/strong&gt;：写操作系统、游戏引擎，你希望编译期就把类型查死（C、Rust）；做数据分析、写脚本，你更想要随手就写、运行期再说的爽快（Python）。&lt;/p&gt;
&lt;h3&gt;语言的类型差异，本质还是内存问题&lt;/h3&gt;
&lt;p&gt;说到底，为什么会有这些差异？因为&lt;strong&gt;底层的二进制和内存布局是唯一的，语言只是给了不同的"包装"&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C 直接暴露内存：&lt;code&gt;int&lt;/code&gt; 就是那 4 个字节，程序员自己看着办；&lt;/li&gt;
&lt;li&gt;Java 在中间加一层"虚拟机"，类型是声明出来给编译器检查用的；&lt;/li&gt;
&lt;li&gt;Python 一切皆对象：每个数据都是一个"对象头 + 值"，所以慢、占内存，但安全、好用；&lt;/li&gt;
&lt;li&gt;静态语言的"类型"在编译完就消失了（变成机器码里的固定字节数），动态语言的"类型"要一直带到运行期。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;全链路：从晶体管到程序&lt;/h2&gt;
&lt;p&gt;把所有零件串起来，就是一整条链条，每一层都为上一层铺路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;物理层&lt;/strong&gt;：晶体管能稳定表示两种电压 → 这就是 0 和 1；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逻辑层&lt;/strong&gt;：与/或/非三个门能组合出任何逻辑；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运算层&lt;/strong&gt;：加法器 + 进位链，让"开关"能算数；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存储层&lt;/strong&gt;：内存把成千上万个 0/1 保存下来；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解释层&lt;/strong&gt;：数据类型规定"这串 0/1 是什么、多大、怎么用"；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语言层&lt;/strong&gt;：编程语言把这层解释封装成 &lt;code&gt;int&lt;/code&gt;、&lt;code&gt;float&lt;/code&gt;、&lt;code&gt;str&lt;/code&gt; 等"给人看的词"；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用层&lt;/strong&gt;：你用这些词写出程序，程序变成 0/1 跑在芯片上。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以回到开头的问题："那张手机照片是什么？"答案是：&lt;strong&gt;手机照片 = 一串 0 和 1；这串 0 和 1 是 '图片' 这种数据类型；'图片' 是图像软件给这串二进制起的名字；而计算机算它的过程，不过是几十亿个开关按逻辑门在飞快地开合。&lt;/strong&gt; 从一盏灯，到一整个数字世界，中间没有一步是神秘的。&lt;/p&gt;
&lt;p&gt;想亲手验证这条链，可以试试：把 &lt;code&gt;bin(65)&lt;/code&gt; 的输出 &lt;code&gt;0b1000001&lt;/code&gt; 拿去对照 ASCII 表，你会发现它正好是字符 &lt;code&gt;'A'&lt;/code&gt;——你看，数字、字符、图片，在你眼里不同的东西，在计算机眼里都只是"一串开关"。&lt;/p&gt;</content><category term="Programming"/><category term="二进制"/><category term="计算机组成"/><category term="数据类型"/><category term="C"/><category term="Python"/></entry><entry><title>用 opencode 做商业信息汇总与搜索-以马斯克商业版图为例</title><link href="https://blog.cycleuser.org/yong-opencode-zuo-shang-ye-xin-xi-hui-zong-yu-sou-suo-yi-ma-si-ke-shang-ye-ban-tu-wei-li.html" rel="alternate"/><published>2026-08-06T21:30:00+08:00</published><updated>2026-08-06T21:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-06:/yong-opencode-zuo-shang-ye-xin-xi-hui-zong-yu-sou-suo-yi-ma-si-ke-shang-ye-ban-tu-wei-li.html</id><summary type="html">&lt;p&gt;在开始之前先说明一下：这篇文章讲的不是"怎么用 AI 炒股"，而是"怎么用 opencode 这类 AI 编码助手，把一堆散落各处的商业信息，快 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;在开始之前先说明一下：这篇文章讲的不是"怎么用 AI 炒股"，而是"怎么用 opencode 这类 AI 编码助手，把一堆散落各处的商业信息，快速整理成一份结构清晰、带表格带图表的 Markdown 报告"。案例用的是马斯克的商业版图，原因是它的信息量大、数据点密集、且涉及大量"来源冲突"，用来演示 AI 做信息汇总的严谨性处理，再合适不过。文中所有数字都只是公开资料的整理，不构成任何投资建议。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;为什么用 AI 做商业信息汇总&lt;/h2&gt;
&lt;p&gt;传统的信息整理流程大概是：打开各种百科 → 看几个新闻网站 → 复制粘贴 → 手工排表格 → 手工画图。遇到"同一件事多个来源数字不一样"的时候，还得自己去追原始报道。一顿操作下来，半天没了。&lt;/p&gt;
&lt;p&gt;AI 的优势在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;搜索与阅读省事&lt;/strong&gt;：可以让 AI 同时抓取维基百科、Reuters、CNBC、Forbes 等页面，并交叉核对；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;结构化输出方便&lt;/strong&gt;：直接把散乱信息整理成时间线、估值表、大事年表，不用你手动排版；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可视化简单方便&lt;/strong&gt;：让 AI 写 Python 代码，用 matplotlib 把数据画成图表，用 mermaid 画公司股权关系图等等，都很方便；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;充分查询检索信息&lt;/strong&gt;：AI 可以把"来源冲突"和"待确认数据"显式标出来，而不是蒙混过关。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;整体工作流&lt;/h2&gt;
&lt;p&gt;以这次马斯克案例为例，opencode 里完整跑通了一套流程，共六个步骤：&lt;/p&gt;
&lt;h3&gt;明确需求与产出形式&lt;/h3&gt;
&lt;p&gt;先想清楚要什么。这个案例的需求是：&lt;strong&gt;马斯克整个商业版图 + 发展历程，要完整、严谨，要有表、有图、有来源&lt;/strong&gt;。同时为了"快餐式"阅读，最后还要一个&lt;strong&gt;简单版&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;派研究代理去搜索和核实&lt;/h3&gt;
&lt;p&gt;这是最关键的一步。让 AI 派出一个"研究代理"，带上明确的数据清单去抓网页：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每家公司：成立年份、马斯克投入多少、融资估值时间线、退出/出售时间和价格、当前持股比例；&lt;/li&gt;
&lt;li&gt;个人维度：净资产时间线、薪酬包、历年套现；&lt;/li&gt;
&lt;li&gt;附带要求：&lt;strong&gt;每个数据点给出处；不同来源不一致的要标注；拿不准的标"待确认"，不许编。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一步的价值在于，把"搜索结果"和"结论输出"分离：先老老实实收集证据，再动笔写报告。&lt;/p&gt;
&lt;h3&gt;结构化：时间线、估值表、大事年表&lt;/h3&gt;
&lt;p&gt;拿到调研数据后，按公司组织成结构化的 Markdown 表格。以 SpaceX 为例：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;时间&lt;/th&gt;
&lt;th&gt;事件&lt;/th&gt;
&lt;th&gt;估值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2012 初&lt;/td&gt;
&lt;td&gt;私营市场估值&lt;/td&gt;
&lt;td&gt;$1.3B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021.10&lt;/td&gt;
&lt;td&gt;融资轮&lt;/td&gt;
&lt;td&gt;$100.3B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023.12&lt;/td&gt;
&lt;td&gt;融资轮&lt;/td&gt;
&lt;td&gt;$180B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026.06&lt;/td&gt;
&lt;td&gt;IPO 定价 $135/股&lt;/td&gt;
&lt;td&gt;$1.77T&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这种"时间+事件+估值"的三列结构，是所有商业报告的地基。&lt;/p&gt;
&lt;h3&gt;数据可视化&lt;/h3&gt;
&lt;p&gt;用 matplotlib 生成图表（本机装了中文字体后，&lt;code&gt;rcParams&lt;/code&gt; 里指定 &lt;code&gt;Hiragino Sans GB&lt;/code&gt; 即可正常显示中文），用 mermaid 画股权结构。本次一共生成：净资产时间线、各公司估值对照、企业存续时间线、估值里程碑、财富构成饼图、投资回报图，共六张。最后应要求又补了一张"最终状态"静态图：&lt;/p&gt;
&lt;p&gt;&lt;img alt="马斯克各公司估值演变最终状态" src="images/musk_valuation_final.png"&gt;&lt;/p&gt;
&lt;p&gt;这张图有个设计细节值得一提：&lt;strong&gt;卖掉的公司在出售年份曲线就截止、不再延伸&lt;/strong&gt;（虚线），在营公司则延伸到最新（实线）。这样"看一图而知全貌"。&lt;/p&gt;
&lt;h3&gt;分层交付：完整版 + 简单版&lt;/h3&gt;
&lt;p&gt;一次调研产出了三份东西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;完整版研究报告&lt;/strong&gt;：约 500 行，含方法说明、不确定项清单、逐公司深度档案、来源 URL 清单；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简单版&lt;/strong&gt;：一张估值图 + 一张一览表 + 一张速查表，几分钟能读完；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调研原始数据文件&lt;/strong&gt;：保留所有数据点和来源，可追溯。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;分层交付的好处是：读者可以按需取用，不浪费。&lt;/p&gt;
&lt;h3&gt;严谨性处理&lt;/h3&gt;
&lt;p&gt;AI 汇总最容易翻车的就是"自信地编造"。所以这次特意做了三层保险：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;来源冲突显式标注&lt;/strong&gt;。比如 Zip2 收购价主流是 $305M、个别来源写 $307M；xAI 被 SpaceX 收购作价两个词条分别写 $250B 和 $125B，差距一倍。报告里都如实列出双口径，而不是二选一。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;"待确认"标签&lt;/strong&gt;。没有一手来源的数值（如 Neuralink 2023–2024 融资额、SpaceX 2024 年某次估值），一律标"待确认"。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;免责声明&lt;/strong&gt;。明确写清：仅基于公开资料的参考整理，不构成投资建议，引用前需以一手来源核实。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;本次对话实录：完整提示词与截图&lt;/h2&gt;
&lt;p&gt;下面的截图就是这次任务的真实过程记录，每张图对应一轮提示词，可以直接看到"怎么一步步把一个模糊想法磨成一份报告"。&lt;/p&gt;
&lt;h3&gt;给出初步要求&lt;/h3&gt;
&lt;p&gt;第一轮提示词（也是全部需求的起点）：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我想要了解马斯克公司的整个商业版图和发展历程，要总结出完整的沿着时间和他的投资额、薪酬、估值以及从事的领域等等，做出来非常严谨的一个报告，还要有对应的数据的可视化，要有表，要有图，做成markdown文档。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="第0轮-给出要求" src="images/musk_demo_0_prompt.png"&gt;&lt;/p&gt;
&lt;h3&gt;开始数据收集&lt;/h3&gt;
&lt;p&gt;AI 据此派出研究代理抓取维基百科与 Reuters/CNBC/Forbes 等页面，按"成立时间、投资额、薪酬、估值、持股比例、退出价格"逐项核实，并把来源冲突和待确认数据单独列出来。&lt;/p&gt;
&lt;p&gt;&lt;img alt="第1轮-开始数据收集" src="images/musk_demo_1_collect.png"&gt;&lt;/p&gt;
&lt;h3&gt;初步有结果&lt;/h3&gt;
&lt;p&gt;第一版完整报告交付：约 500 行的 Markdown，包含研究方法说明、不确定项清单、逐公司深度档案、来源 URL，以及 6 张 matplotlib 图表和一张 mermaid 股权结构图。&lt;/p&gt;
&lt;p&gt;&lt;img alt="第2轮-初步有了结果" src="images/musk_demo_2_first_result.png"&gt;&lt;/p&gt;
&lt;h3&gt;要求改进&lt;/h3&gt;
&lt;p&gt;用户觉得完整版太复杂，要求出一个"简单版"，且点名要一种特定的可视化形式：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;给一个简单版本的横轴是时间纵轴是估值。然后各个公司的，什么的反正就在上面弄成那种随着时间变化的这种动图，然后再给一个数据表格。数据表格就是什么时，每个公司按照时间什么从新到旧啊，什么时候卖出去的，等等等等这样来，不要那么复杂的给一个这样新的，但已经有的，那你先存着吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="第3轮-要求改进" src="images/musk_demo_3_revise.png"&gt;&lt;/p&gt;
&lt;h3&gt;继续提要求&lt;/h3&gt;
&lt;p&gt;简单版动图做好后，用户进一步纠偏——不要动图，要一张静态的"最终状态"图，并且规定了重要规则：&lt;strong&gt;卖掉的公司曲线到出售年份为止、之后不再延伸&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不对，还是不应该用动图直接来一个单个的图就行，就是最终的那状态。然后，中间有一些他卖掉的，就得从他卖掉那年之后就不再算了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="第4轮-继续提要求" src="images/musk_demo_4_more.png"&gt;&lt;/p&gt;
&lt;p&gt;之后还补充了两轮要求：给简单版加上&lt;strong&gt;数据来源说明与免责声明&lt;/strong&gt;（"作为 opencode 使用的代码范例，不具有投资等其他作用"），以及&lt;strong&gt;基于以上内容写一篇介绍 opencode 用法的文章&lt;/strong&gt;——也就是你现在正在读的这篇。可见"好的需求是磨出来的"，AI 对话里迭代需求是常态，opencode 每轮都能在保留上下文的前提下增量修改，这是它比单次提问好用得多的地方。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;一些建议&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;别把 AI 当权威数据库&lt;/strong&gt;。AI 擅长的是"搜索+整理+排版"，数字本身要让它去抓原始页面核对，而不是凭记忆生成。这次所有关键数字都来自抓到的词条及其引用的报道。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;告诉 AI 怎么处理不确定&lt;/strong&gt;。在任务描述里直接写"不同来源不一致就并列标出，拿不准就写待确认，不许编"，能显著减少幻觉。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可视化先确认数据再画图&lt;/strong&gt;。先有结构化的表格数据，再让 AI 写绘图脚本，比边画边猜靠谱得多。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;交付物分层&lt;/strong&gt;。完整版给需要细节的人，简单版给只想扫一眼的人，调研原稿留作备用。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;总结一下&lt;/h2&gt;
&lt;p&gt;这篇就是一次演示：用 opencode 把"马斯克商业版图"从"一堆链接"变成"一份带表带图的 Markdown 报告"，中间穿插了研究代理调研、来源核实、图表生成和严谨性处理。方法论本身可以复用到任何商业信息汇总场景——行业研究、竞品分析、公司尽调都可以套这套流程。&lt;/p&gt;
&lt;p&gt;需要强调的最后一件事：&lt;strong&gt;AI 整理的信息适合做参考、做入门、做框架，但不适合直接拿来决策。&lt;/strong&gt; 关键数据请回到一手来源核实。&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="AI"/><category term="商业信息"/><category term="数据可视化"/><category term="Markdown"/></entry><entry><title>十年之后-纪念罗明非博士与雷霄骅同学</title><link href="https://blog.cycleuser.org/shi-nian-zhi-hou-ji-nian-luo-ming-fei-bo-shi-yu-lei-xiao-hua-tong-xue.html" rel="alternate"/><published>2026-08-06T20:00:00+08:00</published><updated>2026-08-06T20:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-06:/shi-nian-zhi-hou-ji-nian-luo-ming-fei-bo-shi-yu-lei-xiao-hua-tong-xue.html</id><summary type="html">&lt;p&gt;2016年7月17日，中国传媒大学的在读博士雷霄骅同学，猝然离世。2016年7月20日，中国地质大学（北京）毕业的罗明非博士，在西藏的野外工作中遇险离 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;2016年7月17日，中国传媒大学的在读博士雷霄骅同学，猝然离世。2016年7月20日，中国地质大学（北京）毕业的罗明非博士，在西藏的野外工作中遇险离开了这个世界。&lt;/p&gt;
&lt;p&gt;整整十年过去了。而这个七月，我忙着各种学习和训练，居然把这两个日子都忘了。直到今天看日历，才猛然想起，心里一下子空落落的。&lt;/p&gt;
&lt;p&gt;十年，足够一个人从学生到工作，足够很多记忆被生活的琐碎冲淡。今天就写下来，即是为了纪念。&lt;/p&gt;
&lt;h2&gt;雷霄骅：传道授业的开源教程作者&lt;/h2&gt;
&lt;p&gt;雷霄骅（1991年10月20日-2016年7月17日），2007年考入中国传媒大学，大二的时候，2008年，就注册了CSDN网站，陆续在上面开始分享自己的学习心得和经验，后来还利用GitHub Pages建立了自己的个人网站。后来他在本校读研读博，学的是通信与信息系统专业，做的是数字视频技术方向，尤其关注 FFmpeg 相关的开发。&lt;/p&gt;
&lt;p&gt;他是个特别乐于分享和帮助别人的人，习惯以教促学，在考试之前还会给需要帮助的同学辅导答疑。他的很多相关的经验呢，也都写成了博客文章，很早就发在了网上。现在相关领域的不少程序员当年可能都看过他的教程——在那个资料匮乏的年代，他把自己研究音视频的心得一点点写成博客，做成开源项目（TIandSI、VideoEye），还发表了多篇国际会议论文。他在技术圈里粉丝众多，因为他分享的内容曾经帮助了无数初学音视频的年轻人。&lt;/p&gt;
&lt;p&gt;图片&lt;/p&gt;
&lt;p&gt;在2013年到2016年的这段时间当中，他的GitHub上有266条的提交，典型的工作模式是深夜加凌晨，这266条提交当中有62条是半夜12点到早上5点，占了23%。然后还有一些是凌晨一点的，有34条都是凌晨一点左右。而GitHub只是他开发和写作的一部分内容，在其他网站还有更多内容创作，以及研究工作等等。可见他的工作强度是很大的。&lt;/p&gt;
&lt;p&gt;2016年7月16日，晚上九点多，雷同学进了实验室，凌晨三点被人发现倒在电梯口，早上七点多同学才得知消息。一个26岁的年轻人，就这么走了，留下了技术文档、开源代码，和无数被他带进门的后辈。&lt;/p&gt;
&lt;p&gt;图片&lt;/p&gt;
&lt;p&gt;2026年8月4日，FFmpeg 9.0 正式发布，版本代号"Lei"，来纪念他。&lt;/p&gt;
&lt;h2&gt;罗明非：投身野外工作的地质学家&lt;/h2&gt;
&lt;p&gt;罗明非（1982年12月22日-2016年7月20日）生于四川广元，，本科就读于成都理工大学，后来在中国地质大学（北京）读的博士，我记得他是莫院士的学生。&lt;/p&gt;
&lt;p&gt;图片&lt;/p&gt;
&lt;p&gt;上图是2014年12月5日晚上0点22分，我半夜醒来，发现他在看文献，拍了背影。&lt;/p&gt;
&lt;p&gt;2015年他博士毕业后回了成都，记得应该是在2015年7月8号那天，他正式到中国地质调查局成都地质调查中心上班工作了。&lt;/p&gt;
&lt;p&gt;他是那个年代里典型的地质人——不是坐在实验室里只靠测试数据做研究，而是常年在野外，隔壁高山峡谷。&lt;/p&gt;
&lt;p&gt;地质工作是辛苦的，也是危险的。海拔四五千米的高原，荒无人烟的沟谷，是可能面对的自然灾害，野兽、恶劣的天气环境，有时候还可能有一些毒虫叮咬等等……&lt;/p&gt;
&lt;p&gt;「平沙落日大荒西，陇上明星高复低。」&lt;/p&gt;
&lt;p&gt;「浩浩乎，平沙无垠，夐不见人。河水萦带，群山纠纷。黯兮惨悴，风悲日曛。蓬断草枯，凛若霜晨。」&lt;/p&gt;
&lt;p&gt;这些也都是地质工作者日常面对的。&lt;/p&gt;
&lt;p&gt;2016年7月20日，罗博士在西藏措勤开展野外工作时遭遇车祸，因公殉职，年仅34岁。同时遇难的还有2014年博士毕业于地大北京的孟繁一博士（1988年2月10日-2016年7月20日）。当时罗博士刚结婚不到一年，孩子还没出生。&lt;/p&gt;
&lt;p&gt;他的QQ空间上，在2016年3月15号那天早上9点，写的是「你真正做成一件事之前，存在感是一种可以被人随意践踏的东西。」
可能工作的生活未必很舒心和顺利，他QQ空间里上一条发的和工作相关的内容是「上班第二天！」还是在2015年的7月9号那天早上也是9点钟发的。&lt;/p&gt;
&lt;h2&gt;一些多余的话&lt;/h2&gt;
&lt;p&gt;这两位一个是校友，一个是我寝室的室友；一个比我年轻几岁，一个比我大几岁；一个是写代码，从事代码开发相关的。另一个是学地质，自然科学领域的。&lt;/p&gt;
&lt;p&gt;我本科是中国传媒大学摄影专业的艺术学学士，我读博是在中国地质大学北京读的地球科学的理学博士。&lt;/p&gt;
&lt;p&gt;所以和这两位就算都有了一点交集，只是没有他们那么优秀，也没有那么闪耀，但在这两个人身上，能看到自己的投射。&lt;/p&gt;
&lt;p&gt;2023年11月，我记得是29号，我当年读书时候的同学，一起拆机装机写代码的伙伴，李解博士，在刚博士毕业没几个月之后，突发疾病意外离世了。&lt;/p&gt;
&lt;p&gt;人走了之后，留下那些都是成果，文章啊，或者代码项目等等。可是人应该比这些更丰富，活着的时候一定要好好活着，不能留任何遗憾。&lt;/p&gt;
&lt;p&gt;只能说，人生无常，身边的人都值得珍惜。尽量不该跟人发脾气，我脾气暴躁，经常容易发怒，不仅伤害自己也会伤到身边的人。后来就尽量控制一下，尽量不去发脾气。&lt;/p&gt;
&lt;p&gt;考虑调整作息，我现在是基本上九十点钟基本就睡觉，然后早上四五点钟起来，每天一定要吃早饭，哎呀，还得争取把自己体重从200多斤尽量降下来。&lt;/p&gt;
&lt;p&gt;如果遇到了不高兴的事儿，就直接的当面儿偿还就好了。这么大碾碎了，再用年轻时候那种「肢体说服教育」确实不行，但言语上还是可以不落下风的，遇到事情，如果不算什么太严重的，不如当场就投桃报李。反正我是这么想的，千万不能有事儿憋着，忍着，以后万一没机会了呢？&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="纪念"/><category term="同学"/><category term="校友"/></entry><entry><title>利用Python代码对一些力学上的定义和概念进行可视化</title><link href="https://blog.cycleuser.org/li-yong-pythondai-ma-dui-yi-xie-li-xue-shang-de-ding-yi-he-gai-nian-jin-xing-ke-shi-hua.html" rel="alternate"/><published>2026-08-05T21:00:00+08:00</published><updated>2026-08-05T21:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-05:/li-yong-pythondai-ma-dui-yi-xie-li-xue-shang-de-ding-yi-he-gai-nian-jin-xing-ke-shi-hua.html</id><summary type="html">&lt;p&gt;想当年，我因为种种原因从理科基地班被人清退了，跑到了普通的班级。有一门课，我大半学期都没赶上，可期末还得参加考 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;想当年，我因为种种原因从理科基地班被人清退了，跑到了普通的班级。有一门课，我大半学期都没赶上，可期末还得参加考试，于是就去听了几次课。那老师讲课，口音实在太重了，把"挠度"说成"老陆"，我基本上是听不懂的。当时还有个同学说他"嘴里有棉裤"。现在想想，这么说人家其实不太好，可当时确实是真听不明白。&lt;/p&gt;
&lt;p&gt;说起来，现在有些高校在申请教师资格的时候，好像已经不要求普通话二级甲等以上了？有博士学位是不是就免了？记不太清这个标准了。但不管怎么说，还是希望高校教师能尽量把普通话说清楚，至少得让学生听懂。当时那位老师讲的东西，我好多都理解得不透，好在对付着考试算是过去了。&lt;/p&gt;
&lt;p&gt;不过大学里应对考试是一回事，真学没学到东西又是另一回事。有的老师不负责任，直接给原题。有的学生觉得这老师好啊，给原题能过，然后就让大家背答案，ABCD对应1234，还真有孩子就背了。这可不是好事，到最后就是自己糊弄自己，根本没学明白，把1234背下来往那儿一放，既糊弄自己又糊弄家长。可孩子们那会儿不懂事，还觉得老师好。这种现象，除了抨击一下，也不好说别的。&lt;/p&gt;
&lt;p&gt;咱只能想想自己当年没学好。后来我就打算再了解一下，补补课。这一补，就有了今天这些内容。本来想着严格对应地质现象来讲，可那样太专门、太枯燥，还显得有点太端着。何况我已经离地学很远了，所以就通用地讲讲这些概念，用代码画图，把力学里这些定义和概念直观地摆出来。&lt;/p&gt;
&lt;p&gt;顺便说一句，这篇也想做个示范。我学的专业跟计算机离得挺远，可这些年，靠逐渐探索出来的编程语言方面的一点浅薄经验，画图、做算法、分析数据、验证想法，省了不少事儿。所以说，就算不是计算机相关专业，学一点编程相关内容，对学自己本专业的东西，往往也是能帮上忙的。&lt;/p&gt;
&lt;p&gt;那这些概念到底是啥呢？一说材料力学、固体力学，很多人就头大，觉得全是公式。其实这几个最基础的概念，全是身边的事儿：拉一根橡皮筋，拧一个瓶盖，用扳手拧螺丝，掰一根钢筋。咱们今天就把应力、应变、力矩、力偶这几个词一个个拆开，配图配上代码，试试进行可视化。&lt;/p&gt;
&lt;h2&gt;应力：单位面积上分摊到的力&lt;/h2&gt;
&lt;p&gt;先想一个画面：一根橡皮筋，你用手往两边拉。你觉得"手在用力"，可实际上，这股力不是集中在某一个点上，而是摊在整个截面上。把"力"除以"截面积"，就是应力（stress），记作 &lt;span class="arithmatex"&gt;\(\sigma\)&lt;/span&gt;：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[\sigma = \frac{F}{A}\]&lt;/div&gt;
&lt;p&gt;单位是帕斯卡（Pa），也就是牛每平方米（N/m²）。一个大气压大概是十万帕，工程上常用兆帕（MPa）。&lt;/p&gt;
&lt;p&gt;应力有两种最基础的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正应力 &lt;span class="arithmatex"&gt;\(\sigma\)&lt;/span&gt;：力垂直作用在面上，拉是拉应力，压是压应力。&lt;/li&gt;
&lt;li&gt;切应力 &lt;span class="arithmatex"&gt;\(\tau\)&lt;/span&gt;：力贴着面（相切）蹭过去，就像拿刀片刮表面那样。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你站着不动，体重压在两脚上，脚底承受的那个"压强"，本质上就是一种正应力。穿细跟的鞋踩到别人脚，受力面积小，压强大——这就是应力大，挨踩的疼啊。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="images/stress.png"&gt;&lt;/p&gt;
&lt;p&gt;这张图左边是正应力：一个正方形小块，左右两边受拉力往外拽；右边是切应力：上下两个面各受一个切向力，方向正好相反，一个往右一个往左，像是在往两个相反的方向"切"。中间那个 &lt;span class="arithmatex"&gt;\(\sigma\)&lt;/span&gt; 和 &lt;span class="arithmatex"&gt;\(\tau\)&lt;/span&gt;，就是单位面积上分到的力。&lt;/p&gt;
&lt;p&gt;下面的代码可以自己跑，画出同样的一张图：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.patches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mpatches&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;font.sans-serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Arial Unicode MS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hiragino Sans GB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Heiti TC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Songti SC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Microsoft YaHei&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;axes.unicode_minus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;DARK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2c3e50&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;RED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#e74c3c&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FancyArrowPatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dy&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-|&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mutation_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 正应力&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#dff0f7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;σ&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;拉力 ÷ 截面积&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;正应力 σ：力垂直作用在面上&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 切应力&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#fdf0d6&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# 顶面切向往右&lt;/span&gt;
    &lt;span class="n"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 底面切向往左&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;τ&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;切向力 ÷ 截面积&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;切应力 τ：力平行作用在面上&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suptitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;应力 = 单位面积上分摊到的力&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.02&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images/stress.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tight&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;应变：变形量除以原来的尺寸&lt;/h2&gt;
&lt;p&gt;光有力还不够，还得看东西被"抻"了多少。一根橡皮筋原长 &lt;span class="arithmatex"&gt;\(L\)&lt;/span&gt;，拉长了 &lt;span class="arithmatex"&gt;\(\Delta L\)&lt;/span&gt;，那"变形程度"就是应变（strain）：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[\varepsilon = \frac{\Delta L}{L}\]&lt;/div&gt;
&lt;p&gt;关键是除以&lt;strong&gt;原来的&lt;/strong&gt;长度，这样不管东西本身多长，都能拿同一把尺子比较变形的剧烈程度。应变没有单位，是个比值。&lt;/p&gt;
&lt;p&gt;跟应力对应，应变也有正应变和切应变：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正应变 &lt;span class="arithmatex"&gt;\(\varepsilon\)&lt;/span&gt;：拉长或压短的比例。&lt;/li&gt;
&lt;li&gt;切应变 &lt;span class="arithmatex"&gt;\(\gamma\)&lt;/span&gt;：形状被"剪切"倾斜的程度，就是那个角度的变化量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Image" src="images/strain.png"&gt;&lt;/p&gt;
&lt;p&gt;左图：虚线是原来的样子，实线是拉长之后的，标了原长 &lt;span class="arithmatex"&gt;\(L\)&lt;/span&gt; 和伸长量 &lt;span class="arithmatex"&gt;\(\Delta L\)&lt;/span&gt;。右图：虚线是原来的方块，实线是被"错开"了的平行四边形，顶边整体滑移了一段，那个绿色的小角度 &lt;span class="arithmatex"&gt;\(\gamma\)&lt;/span&gt; 就是切应变。&lt;/p&gt;
&lt;p&gt;代码也不长：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.patches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mpatches&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;font.sans-serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Arial Unicode MS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hiragino Sans GB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Heiti TC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Songti SC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Microsoft YaHei&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;axes.unicode_minus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;DARK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2c3e50&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;RED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#e74c3c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;BLUE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2980b9&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;GRAY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#95a5a6&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;GREEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2ecc71&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FancyArrowPatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dy&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-|&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mutation_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;L&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;dL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 正应变&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GRAY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;dL&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#dff0f7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;dL&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dL&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dL&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.35&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;xytext&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.35&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;arrowprops&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;-&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dL&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ΔL（伸长量）&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;xytext&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;arrowprops&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;-&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GRAY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;原长 L&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GRAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dL&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ε = ΔL / L&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;正应变 ε：拉长（或压短）的比例&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;axes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# 切应变&lt;/span&gt;
&lt;span class="n"&gt;shift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GRAY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;corners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corners&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;closed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#fdf0d6&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 顶面切向往右&lt;/span&gt;
    &lt;span class="n"&gt;force_arrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 底面切向往左&lt;/span&gt;
&lt;span class="n"&gt;gamma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arctan2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theta1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;gamma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;theta2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;th_mid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;gamma&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;th_mid&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;th_mid&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;γ&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;上边沿横向滑移&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mf"&gt;1.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;γ = 滑移量 / 高度&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;切应变 γ：形状发生&amp;quot;剪切&amp;quot;倾斜&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suptitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;应变 = 变形量与原来尺寸的比值&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.02&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images/strain.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tight&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;应力除以应变，就是弹性模量 &lt;span class="arithmatex"&gt;\(E\)&lt;/span&gt;，&lt;span class="arithmatex"&gt;\(E = \sigma / \varepsilon\)&lt;/span&gt;。它衡量材料"有多硬"——同样抻它，应力涨得快的，就是难拉动的硬材料。在弹性阶段，胡克定律成立：&lt;span class="arithmatex"&gt;\(\sigma = E\varepsilon\)&lt;/span&gt;。这不就是中学学的弹簧嘛，F 换成 σ，伸长量换成 ε，比例系数换成 E。&lt;/p&gt;
&lt;h2&gt;应力-应变曲线：每种材料各有各的"脾气"&lt;/h2&gt;
&lt;p&gt;把一根材料样品慢慢拉，一边记录应力一边记录应变，画出来的就是应力-应变曲线。这条曲线基本就是材料的"性格画像"。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="images/ss_curve.png"&gt;&lt;/p&gt;
&lt;p&gt;图里粗略画了三种典型材料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;低碳钢（韧性材料）&lt;/strong&gt;：先是笔直的弹性段，撤力就复原；然后到屈服点 &lt;span class="arithmatex"&gt;\(\sigma_y\)&lt;/span&gt;，过了这点材料就"回不去了"，产生永久变形，曲线上有个平台；再往后是强化阶段，能扛的应力继续涨到抗拉强度 &lt;span class="arithmatex"&gt;\(\sigma_u\)&lt;/span&gt;；最后某处开始变细（颈缩），没扛多久就断了。整个过程"能屈能伸"，断之前有大量变形预警，这就是韧性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;铸铁（脆性材料）&lt;/strong&gt;：几乎是一条直线，没怎么变形，"咔嚓"一下就断了。看着硬，其实很脆，没有预警。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;橡胶（高弹性材料）&lt;/strong&gt;：弹性模量很小，软，能抻出好几倍的长度不断，曲线是条往上翘的弧线。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;右上角放了一个弹性段的放大图，要不然低碳钢和铸铁的弹性段挤在左边太窄了，根本看不清。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;font.sans-serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Arial Unicode MS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hiragino Sans GB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Heiti TC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Songti SC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Microsoft YaHei&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;axes.unicode_minus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;DARK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2c3e50&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;BLUE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2980b9&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;RED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#e74c3c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;GREEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2ecc71&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# 低碳钢：弹性→屈服平台→强化→颈缩→断裂&lt;/span&gt;
&lt;span class="n"&gt;ey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;400.0&lt;/span&gt;
&lt;span class="n"&gt;E&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;ey&lt;/span&gt;
&lt;span class="n"&gt;e1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;E&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;e1&lt;/span&gt;
&lt;span class="n"&gt;e2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_like&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;
&lt;span class="n"&gt;e3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.18&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;
&lt;span class="n"&gt;t2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;1.4&lt;/span&gt;
&lt;span class="n"&gt;e4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.18&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.22&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;s4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concatenate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e4&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concatenate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s4&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
        &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;低碳钢（韧性材料）&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 铸铁（脆性）：近似直线，应变很小就直接脆断，没有平台&lt;/span&gt;
&lt;span class="n"&gt;e_ci&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0045&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s_ci&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;e_ci&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;e_ci&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e_ci&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s_ci&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;铸铁（脆性材料）&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 橡胶（高弹性）&lt;/span&gt;
&lt;span class="n"&gt;e_r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e_r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;8.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.6&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;e_r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;橡胶（高弹性材料）&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scatter&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;ey&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sy&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;520&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;强化阶段&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;颈缩&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;橡胶：能抻很长不断&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;应变 ε&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;应力 σ（MPa）&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;应力-应变曲线：不同材料各有各的&amp;quot;脾气&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;legend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;upper left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 嵌入放大图：弹性→屈服→强化 的前半段&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inset_axes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mf"&gt;0.47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.50&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;e_zoom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concatenate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e3&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="n"&gt;s_zoom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;concatenate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e_zoom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s_zoom&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e_ci&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s_ci&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axvline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scatter&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;ey&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sy&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zorder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;屈服点 σy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sy&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;xytext&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="n"&gt;arrowprops&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;屈服阶段&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;（平台）&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.011&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;xytext&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="n"&gt;arrowprops&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;强化阶段&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.023&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;440&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;xytext&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;460&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
               &lt;span class="n"&gt;arrowprops&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;520&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;应变 ε&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylabel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;应力 σ&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;弹性→屈服→强化 放大&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;axins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tick_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;labelsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images/ss_curve.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tight&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;工程上选材料，就是在看这条曲线：要扛得住别断，看强度；要能变形缓冲不断，看韧性；要硬，看弹性模量。&lt;/p&gt;
&lt;h2&gt;力矩：让物体转动的"扭转本领"&lt;/h2&gt;
&lt;p&gt;前面说的力，是让物体&lt;strong&gt;平移&lt;/strong&gt;的。可拧螺丝、开门、转方向盘，需要的不是"拽"，而是"拧"。拧的本事叫力矩（moment，也叫扭矩），公式是：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[M = F \times d\]&lt;/div&gt;
&lt;p&gt;&lt;span class="arithmatex"&gt;\(F\)&lt;/span&gt; 是力，&lt;span class="arithmatex"&gt;\(d\)&lt;/span&gt; 是&lt;strong&gt;力臂&lt;/strong&gt;——从转动轴到力的作用线的&lt;strong&gt;垂直&lt;/strong&gt;距离。单位是牛米（N·m）。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="images/moment.png"&gt;&lt;/p&gt;
&lt;p&gt;图上这个扳手最好理解了：螺母转轴在左端，你在扳手末端用力 F 往下压。力臂 d 就是转轴到那条竖直力作用线的垂直距离。力矩让扳手绕着螺母转。&lt;/p&gt;
&lt;p&gt;这里面有个特别实用的结论：&lt;strong&gt;力臂越长越省力&lt;/strong&gt;。所以加长扳手（或者套一根管子加长力臂）就能撬动更紧的螺丝；门把手都装在离合页远远的一边，开起来才省劲。这些都是力矩 &lt;span class="arithmatex"&gt;\(M = F \times d\)&lt;/span&gt; 在起作用。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.patches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mpatches&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;font.sans-serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Arial Unicode MS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hiragino Sans GB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Heiti TC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Songti SC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Microsoft YaHei&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;axes.unicode_minus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;DARK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2c3e50&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;RED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#e74c3c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;BLUE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2980b9&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;GREEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2ecc71&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;GRAY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#95a5a6&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Circle&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;0.32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#bdc3c7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Circle&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;0.14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;3.4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.65&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;solid_capstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;round&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.65&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FancyArrowPatch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;fx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fy&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mf"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
             &lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-|&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mutation_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fx&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mf"&gt;0.18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fy&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mf"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;力 F&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FancyArrowPatch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mf"&gt;0.42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;|-|&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="n"&gt;mutation_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;力臂 d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 转动方向：力向下压，扳手绕螺母顺时针转&lt;/span&gt;
&lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;solid_capstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;round&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RegularPolygon&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;degrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arctan2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)))),&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;M = F × d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontweight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;（力臂越长越省力）&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GREEN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;固定螺母&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GRAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;力矩（扭矩）：让物体转动的&amp;quot;扭转本领&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images/moment.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tight&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;力偶：一对力，只转不挪&lt;/h2&gt;
&lt;p&gt;有时候你会碰上一种特殊的"拧法"：&lt;strong&gt;两个大小相等、方向相反的力，平行但不共线&lt;/strong&gt;，一起作用在一个物体上。这一对力叫力偶（couple）。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="images/couple.png"&gt;&lt;/p&gt;
&lt;p&gt;图上这块东西，左边一个力往上拽，右边一个大小一样、方向相反的力往下压。两股力加起来合力正好是零——所以它不会整体移动；但这一拽一压，恰好让它一个劲地转。这种"只转不挪"的效果，叫力偶矩：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[M = F \times d\]&lt;/div&gt;
&lt;p&gt;&lt;span class="arithmatex"&gt;\(d\)&lt;/span&gt; 是那两个力之间的垂直距离。有意思的是，力偶矩跟你的参考点选在哪&lt;strong&gt;无关&lt;/strong&gt;，只要这一对力在，拧的效果就是固定的。拧瓶盖、双手搓方向盘、拧毛巾，靠的全是力偶。&lt;/p&gt;
&lt;p&gt;静态图的代码一并放上：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.patches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mpatches&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;font.sans-serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Arial Unicode MS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hiragino Sans GB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Heiti TC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Songti SC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Microsoft YaHei&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;axes.unicode_minus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;DARK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2c3e50&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;RED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#e74c3c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;BLUE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2980b9&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;GRAY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#95a5a6&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#dff0f7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# 左边力向上拽，右边力向下压：大小相等、方向相反、平行不共线&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FancyArrowPatch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
             &lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-|&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mutation_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FancyArrowPatch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
             &lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-|&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mutation_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;right&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;0.28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;left&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;xytext&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;arrowprops&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;-&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;垂直距离 d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BLUE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;力偶矩 M = F × d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;只转动，不移动&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;力偶：两个大小相等、方向相反的平行力&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tight_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;savefig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images/couple.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dpi&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bbox_inches&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;tight&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;下面这张动图更直观，力偶作用在一个方块上，方块就这么转起来了，可它的位置一直没挪：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="images/couple_rotate.gif"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.patches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mpatches&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.animation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FuncAnimation&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;font.sans-serif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Arial Unicode MS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hiragino Sans GB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Heiti TC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Songti SC&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Microsoft YaHei&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rcParams&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;axes.unicode_minus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exist_ok&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;DARK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#2c3e50&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;RED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;#e74c3c&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;frames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;draw_frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radians&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 左手上推、右手下压，整体顺时针转&lt;/span&gt;
    &lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ang&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ang&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ang&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ang&lt;/span&gt;&lt;span class="p"&gt;)]])&lt;/span&gt;
    &lt;span class="n"&gt;corners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Polygon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;corners&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;closed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#dff0f7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
    &lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FancyArrowPatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-|&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mutation_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mpatches&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FancyArrowPatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arrowstyle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-|&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mutation_scale&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;RED&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;力偶矩 M&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;只转动，不移动&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;va&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;center&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fontsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DARK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_aspect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;anim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FuncAnimation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;draw_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;anim&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;images/couple_rotate.gif&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pillow&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;串起来记&lt;/h2&gt;
&lt;p&gt;把这几个概念用一句话串起来：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;应力是&lt;strong&gt;单位面积上分摊到的力&lt;/strong&gt;，应变是&lt;strong&gt;变形量相对于原尺寸的比例&lt;/strong&gt;；力矩是&lt;strong&gt;力乘力臂&lt;/strong&gt;的"拧"的本领，力偶是&lt;strong&gt;一对力只转不挪&lt;/strong&gt;的施加力的方法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;公式不用死记，把图看明白就行：应力应变说的是一块材料内部"扛了多少、变了多少"，力矩力偶说的是"拿什么拧、怎么拧"。这几个概念弄明白了，回头再看受力、变形的各种例子，就不至于两眼一抹黑。&lt;/p&gt;
&lt;p&gt;写这篇，除了讲清楚这几个概念，其实更想做个示范：就算不是计算机相关专业，也完全可以考虑学一点编程相关内容。拿它当个趁手的工具，画个图、算个数、验证一下想法，学自己专业的东西，往往也能帮上不少忙。这活儿不挑专业，门槛也没想象中那么高，有兴趣就能上手。&lt;/p&gt;
&lt;p&gt;配图生成的完整代码就在上面的各个代码块里，复制就能跑。要是有讲得不清楚的地方，欢迎指正。&lt;/p&gt;</content><category term="Math"/><category term="Mechanics"/><category term="Materials"/><category term="Physics"/><category term="Python"/><category term="Visualization"/><category term="Education"/></entry><entry><title>高校教师建议大学生不要被自己已有的认知给束缚住</title><link href="https://blog.cycleuser.org/gao-xiao-jiao-shi-jian-yi-da-xue-sheng-bu-yao-bei-zi-ji-yi-you-de-ren-zhi-gei-shu-fu-zhu.html" rel="alternate"/><published>2026-08-04T00:00:00+08:00</published><updated>2026-08-04T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-04:/gao-xiao-jiao-shi-jian-yi-da-xue-sheng-bu-yao-bei-zi-ji-yi-you-de-ren-zhi-gei-shu-fu-zhu.html</id><summary type="html">&lt;p&gt;上课的时候，会经常跟大家提《纪效新书》里戚继光将军讲的一句话，叫"心有外物而不化，自恃旧习以为佳"。&lt;/p&gt;
&lt;p&gt;先把话说清楚，这话 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;上课的时候，会经常跟大家提《纪效新书》里戚继光将军讲的一句话，叫"心有外物而不化，自恃旧习以为佳"。&lt;/p&gt;
&lt;p&gt;先把话说清楚，这话不是抠出来的原话，原文未必是这么写的，是我把两句搁一块儿，显得对仗。意思倒不差：心里头有了之前学来的东西，就不太愿意接受新的了，不愿意改进，不愿意演化。还总凭借着自己那点旧经验、旧知识，觉得那才是好的，新东西一概不学。保守，指的就是这个。&lt;/p&gt;
&lt;p&gt;说白了，就是人不能被自己已有的认知给束缚住。这，也是今天想说的主题。&lt;/p&gt;
&lt;p&gt;二十四节气，有的人打小就会背。春分秋分，芒种白露，张口就来。可你想过没有，这套东西本来是黄河流域那一带的农耕经验，咱这疆域，北边到漠河，南边到南海诸岛，西边到帕米尔高原，还有那雪域高原，从东北到岭南，气候能差出十万八千里去。真要继续严格套用到咱们所有的版图上，恐怕就未必总是那么合适。&lt;/p&gt;
&lt;p&gt;类似的事儿我自己中学时就琢磨过。那时候地理课学地球仪，我推出来一个理儿：南半球那边，尤其南回归线以南，中午的太阳是在北边的。"山南水北为阳"，这是北半球的说法，到了南回归线以南，日照方向整个反过来了，这套说法也得整个反过来才对。&lt;/p&gt;
&lt;p&gt;我跟老师说了，老师来了一句："谁见过在北边的太阳啊？"同学们哄堂大笑。我不死心，又去问语文老师，说这"山南水北为阳"，在南半球是不是就得反过来。结果又让人笑话一顿。&lt;/p&gt;
&lt;p&gt;放到现在我当然知道，我这推理是对的。可当时没一个人信。你说老师是坏吗？肯定不是。同学有恶意吗？也肯定没有。他们就是觉得，太阳它就该在南边，从来如此，天经地义。&lt;/p&gt;
&lt;p&gt;昨天太热了，我去商场里吹冷气，顺便找了里面一个饭馆吃饭。旁边一桌坐着一对老夫妻带着孙子。老太太语重心长跟孙子讲：不该吃雪糕，不该喝冰水儿，这天再热，商场里也不该开空调，因为夏天本来就该热，多出出汗排排毒，这才是宇宙大道，等等等等，一套一套的。我就在旁边，喝着冰水，吹着商场里的空调，一边听着。&lt;/p&gt;
&lt;p&gt;老太太有恶意吗？肯定没有。在她那儿，她那套认知就是天经地义，就是不能改的宇宙大道。&lt;/p&gt;
&lt;p&gt;可咱们得想想，人类这点认知，真没多大。一个人一辈子能走的地方再多，顶多也就是地球表面；一个人能学的见的再多，顶多也就是有限的内容。就算是耄耋之年，所知所见，应该也是有限，哪能自己觉得对就都得叫宇宙大道。连"宇宙"这俩字到底咋回事，可能有的人都还没整明白呢。&lt;/p&gt;
&lt;p&gt;老太太提倡不开空调这事儿，在那一代人的眼里，可能就是完全正确，没有任何问题。咱如果觉得有问题，问题也不在知道得少，毕竟老人家吃过见过，肯定是多知多懂。而且就算是知道得少，可能很多人都是。具体的问题在于，觉得自己知道的就已经是全部了，再没有别的可能。这才是最要命的。&lt;/p&gt;
&lt;p&gt;我这些年有个习惯，喜欢学点别的领域的东西，见到什么人，如果人家方便，都会尽量跟人打听打听，某些我不太理解的事情都是咋回事。就希望自己能不那么浅薄，多学点儿。就像我写的东西，很可能有错，而且不少。这真不是扯虚的，要是大家能给指出来，真是欢迎。&lt;/p&gt;
&lt;p&gt;当然了，也得承认，都是平常人，看见别人否定自己的时候，本能地就抵触。第一反应是先反驳，先找理由，哪怕心里知道人家说得对，嘴上也得犟两句。人天生就这毛病，遇到事先否定别人，见什么都习惯性挑刺。&lt;/p&gt;
&lt;p&gt;这本能不见得多高级，说白了可能就是动物性，是自我保护。可人要是能超脱一点，跟这种本能掰掰手腕，不被它牵着走，那就高级了。别人说你不对，先别急，先听听，先想想有没有道理。就算人家说的确实是错了，你其实也犯不着当场翻脸。大学里啥观点的人都有，正好拿这儿练手，控制好自己的情绪。&lt;/p&gt;
&lt;p&gt;前头说宇宙大道，说"宇宙"这俩字。宇是空间，宙是时间，我记得好像是这么个意思，记不清了。世上到底有没有「宇宙大道」这么个东西，可能有，但难道就只是「夏天不该开空调」么？&lt;/p&gt;
&lt;p&gt;我念了些年书，闯了几年江湖，大概能确定知道的，就是自己知道的实在太少了。&lt;/p&gt;
&lt;p&gt;这话说给年轻的同学们，希望大家千万别把自己束缚住。&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Learn"/><category term="Thinking"/></entry><entry><title>高校教师希望大一新生尽快摆脱学生气的一些建议</title><link href="https://blog.cycleuser.org/avoid-student-mentality.html" rel="alternate"/><published>2026-08-02T00:00:00+08:00</published><updated>2026-08-02T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-02:/avoid-student-mentality.html</id><summary type="html">&lt;p&gt;我毕业的时候已经三十出头了，现在四十来岁了，大概算是标准的中老登。这十来年有个现象挺有意思：很多人见了我，猜的 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我毕业的时候已经三十出头了，现在四十来岁了，大概算是标准的中老登。这十来年有个现象挺有意思：很多人见了我，猜的年龄比实际要小几岁。我媳妇分析过这件事，说一方面是因为我比较胖，脸上褶子没那么多，另一方面是我身上总有一股傻气——有人说就是那种学生气，一看就觉得这人还在读书。&lt;/p&gt;
&lt;p&gt;我想了想，人家说的可能对。学生气这个东西，有几个特点。守规则、听话、在意别人怎么评价你。越是学习好、读书好的孩子，这个特点越明显。老师布置什么就做什么，规则说什么就照着执行，不太去考虑这规则是谁定的、为什么这么定、定规则的人有没有别的心思。就老老实实做一个乖乖的人。&lt;/p&gt;
&lt;h2&gt;为什么校招比社招受欢迎&lt;/h2&gt;
&lt;p&gt;很多单位喜欢校招，不太愿意社招。这跟学生气有关系。&lt;/p&gt;
&lt;p&gt;从社会上招聘的人，风吹雨打过来的，大浪淘沙。他们见识过一些事——可能吃过亏、上过当、被画过大饼后来发现饼是纸做的。这样再来一轮的时候，他就不那么容易被说服了。你跟他说好好干有前途，他可能会问具体是什么前途，有没有写在合同里。&lt;/p&gt;
&lt;p&gt;学校刚毕业的孩子不一样。心思单纯，好管理，也比较容易被一个愿景打动。你给他画个饼，他可能真信。有的地方人力资源部门的一些操作，在社会人眼里一眼就看穿了，但对学生来说，他可能根本不觉得有什么问题。社招来的人里，有的跟好几家东家打过劳动仲裁、甚至起诉过，见招拆招，什么都不怕。刚毕业的学生遇到这种事，第一反应往往是怕，而且也不知道该怎么处理。&lt;/p&gt;
&lt;p&gt;今年年初，我们班上一个大二的孩子第一次自己去医院挂号。在这之前从来没自己挂过号。你知道吗，有的孩子到了大二都不一定独立去过医院。这些生活经验你不经历就永远不会。经历一次，下次就不慌了。&lt;/p&gt;
&lt;h2&gt;大人跟你说的那些话，大人自己也做不到&lt;/h2&gt;
&lt;p&gt;比较单纯善良的孩子容易以为，大人从小教他的那些道理，大人自己想必也是做得到的，至少大人自己是相信的。&lt;/p&gt;
&lt;p&gt;其实未必。&lt;/p&gt;
&lt;p&gt;说一套做一套，这个事在任何时代任何地方都不稀奇。嘴上说要诚实守信、实话实说，实际上很多人喜欢看到的小朋友是那种非常灵巧、懂得讨人喜欢的。让你拿着花束在路边喊"欢迎欢迎"的，和让你说实话的，有时候是同一批人。&lt;/p&gt;
&lt;p&gt;人很容易陷入路径依赖。习惯驱使着很多事按习惯来，未必真学了多少东西。比如到现在了，还有三四十岁的人觉得去实体店买电脑比在电商自营更靠谱——因为能看到一个具体的人站在那里，心里踏实。结果就是很多同学的电脑都是爸妈带着去实体店买的，比电商贵了几百块甚至上千块，配置还奇怪。同款机型电商给的是单条 1T 硬盘，实体店给到的是两枚 512G 拼出来的。&lt;/p&gt;
&lt;p&gt;说这些不是为了批评大人。大人也不是像孩子们想的那样全都非常睿智。大多数大人不见得比孩子更有智慧，只是有更多的经验和习惯，对这个社会的运行逻辑比较熟悉，应对起来熟练自然，能够坦然接受。如此而已。当你有十几岁以后，慢慢就会认清这件事。&lt;/p&gt;
&lt;p&gt;他们可能未必真喜欢《方舱医院真神奇》，但他们也许很喜欢摆布小朋友们去做那样的表演一样的「情绪保健操」。&lt;/p&gt;
&lt;h2&gt;大学不是学习的终点，是你自己真正开始的起点&lt;/h2&gt;
&lt;p&gt;有一句话可能是你这辈子能听到的最大的谎言："到了大学就不用学了，可以各种玩了。"&lt;/p&gt;
&lt;p&gt;事实是大学里竞争最激烈，自己可支配的时间也最多——这两件事加在一起，意味着你和别人的差距很可能是在大学里拉开的，不是高中。&lt;/p&gt;
&lt;p&gt;课程的内容往往相对旧了一些。不是说课程没用，是说光靠课程不够。要想办法在课程基础上找点竞赛，或者发现一个自己感兴趣的方向，主动去找东西学。不一定得多厉害，但主动和被动的差别非常大。&lt;/p&gt;
&lt;p&gt;到了大学你会遇到很多有意思的人，大家能一块做点事当然好。也会遇到你不太喜欢的人，这也不是什么坏事。学会和不喜欢的人和平相处、避免发生矛盾、知道怎么跟各种人打交道，这本身就是大学里要学的东西之一，而且是课程不会教你的。&lt;/p&gt;
&lt;h2&gt;和人相处应该尽量想办法用非暴力的方式解决问题&lt;/h2&gt;
&lt;p&gt;我在北方读的高中，冬天教室里有暖气。我在窗户边的座位，靠中间的同学觉得热，想让靠窗的同学把窗户打开透透气。问题是靠窗的同学——也就是我——觉得冷，窗开了更冷。&lt;/p&gt;
&lt;p&gt;那会儿的我的做法是肢体说服教育了想要开窗的同学，让他放弃了这个想法。这事儿过去很多年了，我后来想过，其实有更好的办法。&lt;/p&gt;
&lt;p&gt;正确的做法应该是：你觉得热，你来窗户边坐一会儿凉快凉快，我去你那儿坐。这样的话两个人都舒服，谁也不用跟谁较劲。但那个岁数的我没有这样的智慧。&lt;/p&gt;
&lt;p&gt;说这个是想说，不是让大家在原则问题上退让，而是希望大家在未来的生活里，尽量不以冲撞的方式来解决问题。有很多方式可以达到目的，选一个让大家都容易接受的方向，是一种可以慢慢练习的能力。&lt;/p&gt;
&lt;h2&gt;坦然面对自己可能很平凡，也不去很掉价地蹭标签&lt;/h2&gt;
&lt;p&gt;有些地方的规则就是不讲道理的。这种时候不要试图跟它讲道理。在规则框架下能做的范围内，算一下投入产出，不划算就算了。&lt;/p&gt;
&lt;p&gt;世界上的机会比你以为的多。我本科是摄影，博士读的是地球科学，后来干过考研辅导，做过艺考培训，现在教基础编程，挺开心的。地球科学应该留给那些真正优秀的人来做，像我这种比较差劲的，就应该明确认清自己的限制，坦然面对自己的平庸，找到一个自己更合适的位置。&lt;/p&gt;
&lt;p&gt;这没什么丢人的。有人得奖了，拿荣誉了，钦佩啊祝福或者心理羡慕一下就好。不用去蹭人家的流量，不用去装自己也是那个圈子的人。人家在某个低空学院待得并不开心、转专业之后甚至也很受打击和挫败，就算是不能说受到了很多冷漠的对待也可以说被打击过信心——这是人家的经历。你某某学院的舔着脸跑去四处宣传说"我校友得了奖"，这事儿挺嘚儿的。&lt;/p&gt;
&lt;p&gt;我上学那会儿，遇到过一些同学，他们嘴里经常挂着各种非常优秀的人的名字，都很牛、都很厉害。最开始听着觉得真了不起，能和那样优秀的人在一块的，大概自己也是优秀的吧。后来慢慢发现，他们也只是挂在嘴边说说而已，平时自己并不怎么学。说那些也许只是想让自己显得厉害一点，偶尔顺便打击一下别人。至于是不是真的希望别人也跟自己一样消磨时间，不太好说。也许旁人要是真有成就了，就更显出自己的空白了，他们可能自己也未必意识到这一点。&lt;/p&gt;
&lt;p&gt;有的地方适合优秀的人，有的地方适合平常的人。优秀的人做优秀的事，平常的人过好平常的生活。平常不代表平庸。平常的生活里也有很多乐趣，你找到那些乐趣，比什么都重要。&lt;/p&gt;
&lt;p&gt;开心一点。大学有很多值得期待的东西，但值得期待的不等于幻想。幻想是以为它会自动变好，期待是知道自己要去做些什么让它变好。去掉一些学生气，不是让你变得冷漠，该有的古道热肠还是要有的。只是别太天真，别以为规则一定是公平的，别以为大人一定是对的，别以为听话就一定有回报。善待自己，平和地开启这段时光。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇OpenCode 进阶用法-你提供素材让open code来帮你制作针对不同场景的简历&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Education"/><category term="education"/><category term="freshman"/><category term="university"/><category term="life"/><category term="advice"/></entry><entry><title>用 OpenCode 检索文献和验证观点来辅助跨学科领域交流</title><link href="https://blog.cycleuser.org/opencode-cross-discipline-research.html" rel="alternate"/><published>2026-08-01T18:00:00+08:00</published><updated>2026-08-01T18:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-01:/opencode-cross-discipline-research.html</id><summary type="html">&lt;p&gt;最近和几位朋友聊到一个话题，涉及到生物电、膜电位和发育生物学的内容。这是一个我并不熟悉的领域，但讨论中出现了 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近和几位朋友聊到一个话题，涉及到生物电、膜电位和发育生物学的内容。这是一个我并不熟悉的领域，但讨论中出现了不少听起来很有道理但仔细一想又觉得不太对劲的说法。&lt;/p&gt;
&lt;p&gt;面对这种情况，以往的做法是去 Google Scholar 搜几篇论文，挑着读一读，大概判断一下。但这次涉及的是一个比较活跃的研究方向，论文量很大，而且我不具备足够的领域背景来判断哪些说法靠谱、哪些是过度引申。&lt;/p&gt;
&lt;p&gt;于是我试着用 OpenCode 来做这件事——搜论文、下全文、转成可读格式、然后逐篇核对内容。整个过程下来，感觉这个工作流值得记录一下。&lt;/p&gt;
&lt;h2&gt;起因：一场关于生物电的友好讨论&lt;/h2&gt;
&lt;p&gt;讨论的起因是 Michael Levin 的工作。这位学者在 Tufts University 研究生物电与形态发生的关系，在发育生物学和再生医学领域相当有影响力。&lt;/p&gt;
&lt;p&gt;有一位朋友在讨论中说了这样一段话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「细胞分化器官的时候，主要是靠生物电网络调节，细胞核遗传物质像是提供原材料的工厂。生物电网络是靠线粒体供能的。母系遗传物质参与了更多的工作。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这段话听起来挺像那么回事，每个断言似乎都有点生物学常识做支撑。但如果你真的去读 Levin 的论文，会发现他把这些概念之间的关系讲得比这精细得多，而上面这段话里有几处明显的简化乃至错误。&lt;/p&gt;
&lt;p&gt;问题在于，要反驳或者修正这种说法，你得拿出论文里的原文来。光凭「我觉得不对」是没用的，你得知道人家到底说了什么。&lt;/p&gt;
&lt;h2&gt;第一步：搜论文&lt;/h2&gt;
&lt;p&gt;我给 OpenCode 的第一条指令很简单：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;搜索下载 Michael Levin 所有关于生物演化和膜电位的论文，到当前目录，转换成 markdown 文档，并且保存好对应的图片，然后总结整理每一篇文章的实验内容和结论等。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;OpenCode 先通过 PubMed 的 API 搜索了 Levin 名下的相关论文。这一步有个小插曲：Levin M 这个名字在 PubMed 里太常见了，搜出来的结果混进了不少其他同名作者的文章——有搞头痛医学的、有搞太阳能的、还有搞蜱虫的。OpenCode 后来加了一层过滤，通过 Tufts 大学附属机构和生物电关键词来筛选，最终锁定了 33 篇近五年（2021–2026）的高相关论文。&lt;/p&gt;
&lt;p&gt;这个过滤过程值得大家注意，用 AI 工具做文献检索，你不能完全放手让它自己跑。它会犯一些错误——比如不区分同名作者。但如果你告诉它如何去检查中间过程，及时让它自己进行反馈，它的效率确实比自己人工搜要高得多。&lt;/p&gt;
&lt;h2&gt;第二步：下载和转换&lt;/h2&gt;
&lt;p&gt;33 篇论文里，18 篇有开放获取的全文 PDF，另外 15 篇是付费期刊的，只能拿到摘要。&lt;/p&gt;
&lt;p&gt;OpenCode 用了几个不同的开放获取源来下载 PDF：Europe PMC 的 &lt;code&gt;?pdf=render&lt;/code&gt; 接口最有效，Unpaywall 作为补充。下载失败的就保存摘要和 PubMed 链接，不硬来。&lt;/p&gt;
&lt;p&gt;拿到 PDF 之后，用 PyMuPDF4LLM 转换成 Markdown。这个库对学术论文的转换效果还不错，表格和图注基本能保留，公式有时候会乱但至少能看出结构。同时用 PyMuPDF 提取了所有图片，按论文分目录存好。&lt;/p&gt;
&lt;p&gt;18 篇全文总共提取了 293 张图片。有些论文图很多，比如那篇 Technological Approach to Mind Everywhere 有 56 张图，占了 63MB。&lt;/p&gt;
&lt;p&gt;整个过程全自动，甚至不需要人工在旁边看输出确认没问题。如果手动做这件事——搜 33 篇论文、下载 18 个 PDF、逐个转换格式、提取图片——恐怕得花一整天。OpenCode 大概用了十几分钟。&lt;/p&gt;
&lt;h2&gt;第三步：逐篇总结&lt;/h2&gt;
&lt;p&gt;这一步是最有价值的。OpenCode 用了 6 个并行 agent，每个负责 3 篇全文论文，同时读取 Markdown 全文并生成结构化中文总结。&lt;/p&gt;
&lt;p&gt;总结的格式是统一的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;期刊和作者&lt;/li&gt;
&lt;li&gt;研究类型（综述/实验研究/计算模型/理论框架）&lt;/li&gt;
&lt;li&gt;核心问题（一句话）&lt;/li&gt;
&lt;li&gt;主要方法&lt;/li&gt;
&lt;li&gt;关键发现和实验内容&lt;/li&gt;
&lt;li&gt;主要结论&lt;/li&gt;
&lt;li&gt;与膜电位和生物演化的关系&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;15 篇只有摘要的论文我也让它做了总结，但标注了「基于摘要」和「待获取全文后补充」。&lt;/p&gt;
&lt;p&gt;最后还生成了一个总目录文档，包含所有 33 篇论文的目录表格、逐篇总结、以及一个核心主题交叉分析——把所有论文按膜电位编码、生物电与演化、再生、癌症、衰老、认知胶水六个主题做了归纳。&lt;/p&gt;
&lt;p&gt;这个交叉分析特别有用。单看一篇论文你可能只看到局部，但把 33 篇放在一起看，你就能发现 Levin 的整个研究体系是怎么拼起来的。&lt;/p&gt;
&lt;h2&gt;第四步：回到那个讨论&lt;/h2&gt;
&lt;p&gt;有了 33 篇论文的全文和总结，现在可以回到那位朋友的说法，逐句核对了。下面每一处引用都标注了英文原文和出处，方便感兴趣的朋友去查证。&lt;/p&gt;
&lt;h3&gt;第一句：「细胞分化器官的时候，主要是靠生物电网络调节」&lt;/h3&gt;
&lt;p&gt;Levin 确实论证了生物电网络在器官发生中具有指导性角色。比如他在 2026 年的 Mind Everywhere 里明确写道：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"the bioelectric pattern memories are instructive, not epiphenomenal" [1]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2021 年的方法学论文也提到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Embryogenesis, as well as regeneration, is increasingly recognized to be orchestrated by an interplay of transcriptional and bioelectric networks." [2]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;注意他用的词是 interplay（相互作用），不是「主导」或「主要」。&lt;/p&gt;
&lt;p&gt;但问题在于「主要」这个词。Levin 从来没有说生物电是「主要」的调节方式。他反复强调的是协同关系。在 2023 年的 Bioelectric networks: the cognitive glue 一文中，他写道：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"the bioelectrical control system works together with genetic information" [3]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;他用的比喻是计算机的硬件和软件：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"While the genome encodes the hardware (the cellular affordances, such as ion channels), the actual outcome is the result of context- and experience-sensitive electrophysiological software that this hardware supports." [3]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;两者缺一不可，不存在谁主导谁的问题。&lt;/p&gt;
&lt;p&gt;而且 Levin 在 2023 年的 Darwin's agential materials 里说得更清楚：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"It is genetics in the sense that genomes specify the ion channels needed to form the circuit, but it is not genetics in the sense that the actual outcome is controlled by experience (in physiological and behavioral space, respectively)." [4]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这话本身就说明他认为有两个层面在工作，不是一个层面取代另一个。&lt;/p&gt;
&lt;h3&gt;第二句：「细胞核遗传物质像是提供原材料的工厂」&lt;/h3&gt;
&lt;p&gt;方向上接近 Levin 的硬件/软件框架，但「原材料工厂」这个比喻矮化了基因组的作用。&lt;/p&gt;
&lt;p&gt;Levin 确实把基因组叫「硬件」。但他用的词不是「原材料」，而是 affordances——可供性/能力。上面引用的原文已经说得很明白了：基因组编码的是 "the cellular affordances, such as ion channels" [3]。这不是被动的原料，而是定义了系统能做什么的主动能力。&lt;/p&gt;
&lt;p&gt;更关键的是，Levin 在 2023 年提出基因组包含两种信息：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"two kinds of genomic information: that which directly specifies phenotypes (e.g., sequence of protein enzymes, or structural genome) and that which specifies a problem-solving competency (second-order computational capacities)." [4]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果基因组只是原材料工厂，那它只需要提供蛋白质就行了。但 Levin 认为基因组还编码了「如何使用这些蛋白质」的元信息——这远超原材料的范畴。&lt;/p&gt;
&lt;p&gt;Levin 还特别指出，连病毒基因组都会专门腾出宝贵空间来编码离子通道基因：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"It is no surprise that viruses, whose genomes are under significant pressure to remain minimal and concise, devote some of that precious space to ion channel genes." [4]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这说明这些基因不是可有可无的「原材料」，而是被自然选择主动保留的核心组件。&lt;/p&gt;
&lt;p&gt;还有一点：生物电网络的全部结构组件——所有离子通道、所有间隙连接蛋白（connexins）、所有 V-ATPase 亚基——都是核基因组编码的。没有核基因组，生物电网络的硬件根本不存在。说它只是「原材料工厂」，就好比说 CPU 的设计图纸只是「硅片的原材料供应商」——技术上沾点边，但严重低估了设计图纸的重要性。&lt;/p&gt;
&lt;h3&gt;第三句：「生物电网络是靠线粒体供能的」&lt;/h3&gt;
&lt;p&gt;基础生理学层面没大错。细胞维持膜电位确实需要 ATP，ATP 主要由线粒体产生。Na⁺/K⁺-ATPase、V-ATPase 这些离子泵都是耗能的。2025 年的综述也提到 "Na⁺ out and K⁺ in through Na⁺/K⁺ ATPase to counter the Donnan effect" [5]。&lt;/p&gt;
&lt;p&gt;但在 Levin 的框架里，这个说法严重误导了因果关系。&lt;/p&gt;
&lt;p&gt;首先，Levin 把线粒体视为生物电层级架构中的一层，不是外部供能者。2025 年的论文提到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"from the subcellular membrane potentials of organelles such as lysosomes and mitochondria to the spatiotemporal patterns of multicellular potentials characteristic of development and regeneration." [6]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;线粒体有自己的膜电位，是生物电系统的一部分，不是站在外面给系统供电的电池。&lt;/p&gt;
&lt;p&gt;其次，在 2024 年的会议报告里，Levin 团队提到 Duan 的工作发现线粒体生物电信号与细胞可塑性的耦合关系后，明确说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"This relation between bioelectricity and mitochondria is a completely unexplored area." [7]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;也就是说，Levin 自己都觉得线粒体和生物电网络的关系还没搞清楚，不会下「生物电靠线粒体供能」这样斩钉截铁的结论。&lt;/p&gt;
&lt;p&gt;更重要的是，把生物电网络简化为「供能」问题，完全错过了 Levin 的核心论点。Levin 说生物电网络是信息处理系统——他称之为 "the cognitive medium of collective intelligence" [3]。Vmem 模式由离子通道和间隙连接的时空分布决定，不只是由 ATP 供应决定。Levin 自己在 2023 年就指出，用酵母的质子泵替换脊椎动物的 V-ATPase 仍然能工作，因为 "it produces the correct physiological signal" [4]——关键是电信号状态，不是具体的蛋白或能量来源。&lt;/p&gt;
&lt;p&gt;这就好比说「大脑靠葡萄糖供能」——对，但这完全没说清大脑在做什么。&lt;/p&gt;
&lt;h3&gt;第四句：「母系遗传物质参与了更多的工作」&lt;/h3&gt;
&lt;p&gt;这一句在 Levin 的 33 篇论文里完全没有依据。&lt;/p&gt;
&lt;p&gt;我把 33 篇全文都搜了一遍，没有找到任何将「母系遗传物质」与生物电网络调节建立因果关系的论述。"maternal" 这个词在论文里只出现在一个通道病条目和一个关于卵细胞提供环境缓冲的脚注里，都不是这个意思。&lt;/p&gt;
&lt;p&gt;这句话的逻辑大概是这样的：线粒体是母系遗传的 → 生物电「靠线粒体供能」 → 所以母系遗传物质参与更多工作。&lt;/p&gt;
&lt;p&gt;但即便接受前两步（虽然前面说了第二步就有问题），这个推理也是跳跃的。线粒体 DNA 只编码 13 个蛋白，主要是电子传递链组件。而生物电网络的全部结构组件——离子通道、间隙连接蛋白、离子泵——全部由核基因组编码，不是线粒体基因组。也就是说，生物电网络的硬件来自核基因组，不是母系遗传。&lt;/p&gt;
&lt;p&gt;Levin 本人在 2023 年确实提到过 DNA 不是唯一的形态发生信息来源，但他举的例子是细胞骨架的皮质遗传（cortical inheritance），不是线粒体：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"DNA is not the only source of morphogenetic information. Changes made to unicellular form can persist across generations." [4]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而他明确将基因组 DNA 定位为「演化尺度个体的记忆印痕」：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"If we consider genomic DNA to be the engram of the evolutionary-scale individual." [8]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里说的是核基因组 DNA，不是线粒体 DNA。&lt;/p&gt;
&lt;p&gt;线粒体提供 ATP，ATP 是通用能量货币，谁都能用。但 ATP 的生成由线粒体执行，ATP 的使用（驱动离子泵、维持 Vmem）由核基因组编码的蛋白质完成。这就像说「发电厂是市政府建的，所以市政府参与了更多家用电器的工作」——发电厂提供电，但电器的设计、制造、控制全都是另一回事。&lt;/p&gt;
&lt;h2&gt;一些感受&lt;/h2&gt;
&lt;p&gt;这个案例或许有一些地方值得说。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;首先就是，AI 工具确实能显著降低跨学科讨论的门槛。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;以前如果讨论中遇到一个不熟悉的领域，要么得自己花大量时间补课，要么只能凭直觉判断——而直觉在不熟悉的领域里往往不可靠。现在有了 OpenCode 这类工具，你可以在十几分钟内把一个学者几十篇论文搜出来、转成可读格式、做好结构化总结。你不需要成为那个领域的专家，但至少能拿到第一手材料来做判断。&lt;/p&gt;
&lt;p&gt;当然前提是你得用它来读原文，而不是让它直接给你一个「答案」。直接问 AI「这个人说得对不对」，它可能会根据训练数据里的信息给你一个笼统的回答，未必准确。但如果让它去读论文原文然后告诉你论文里怎么说的，准确度就高得多——因为这时候它做的是信息提取和整理，不是知识生成。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;另外要注意，论文里的精确表述和二手转述之间的差距可以非常大。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Levin 在论文里说的是 "the physiological software of life" [9]、"an epigenetic mechanism that guides morphogenesis" [5]、"pattern memory" [3]、"nongenetic inheritance of a different large-scale anatomy" [1]。这些表述都有一个共同特点：明确区分了生物电和遗传物质，把它们定位为两个不同层面的东西。&lt;/p&gt;
&lt;p&gt;但到了二手转述里，这些精细的区分就模糊了。「软件层」变成了「主要调节者」，「非遗传继承」变成了「母系遗传物质参与更多工作」。每一步简化都丢失了一些关键信息，累积下来就变成了一个和原文相去甚远的说法。&lt;/p&gt;
&lt;p&gt;在日常讨论中，这自然不是谁故意歪曲的问题。人在转述复杂概念的时候，倾向于用自己能理解的框架去简化它。搞计算机的人容易把一切往「硬件/软件」上靠，搞生物学的人容易往「遗传/能量」上靠。但 Levin 的工作恰恰横跨这两个领域，用任何一个单一框架去简化它都会出问题。&lt;/p&gt;
&lt;p&gt;但如果是有别有用心的营销号矩阵之类的，那就难说了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最重要的是，讨论中拿论文原文来核对，比凭感觉争论有效得多。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你只是凭感觉说「你说的不太对」，对方也可以凭感觉说「我觉得就是这样」，讨论就陷入僵局。但如果你能说「Levin 在 2023 年的这篇论文里原文是 "works together with genetic information"，用的是协同而不是主要」，讨论就稍微有了点共同的事实基础，虽然这种只言片语东鳞西爪的内容也不一定就能代表全貌。&lt;/p&gt;
&lt;p&gt;当然，这也要求你自己得先去读那些原文，不能只看标题和摘要就下结论。摘要是一篇论文最浓缩的表述，但也是信息损失最大的部分。很多关键的限定词和上下文只在正文里才有。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后是还是得人能想明白思路，工具再好，判断还是得你自己做。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;事情还是得人先想好怎么做，像这个过程中，他的主要观点来源，他之前提到过是那个人，然后我才知道去搜这个人的相关文章，并且设置成最近的5年这样，避免拿一些过于老旧的文章来参与讨论当中。因为有的人可能5年之前的一些作品，他现在的观点和那时候未必一样。&lt;/p&gt;
&lt;p&gt;不能说直接跟工具说：「有个人这么说了，你看看他说的对吗？」&lt;/p&gt;
&lt;p&gt;这样的话就反而可能会让工具把幻觉掺入到其中，甚至有可能让工具去迎合你给的提示词，而不一定是基于一个现实的知识库进行更公正一些的审视和讨论。&lt;/p&gt;
&lt;p&gt;工具提升的是效率，不是可靠性。可靠性还是得靠你自己对结果的审查。&lt;/p&gt;
&lt;p&gt;最关键的是把论文内容和那位朋友的说法做对比分析——这步工具只能帮你提供材料，判断还是得你自己来。&lt;/p&gt;
&lt;h2&gt;工具和文件&lt;/h2&gt;
&lt;p&gt;用的工具组合是 OpenCode + PyMuPDF4LLM + PubMed/Europe PMC API。OpenCode 负责编排整个流程——搜索、下载、转换、总结——具体的技术操作由它调用各个工具来完成。&lt;/p&gt;
&lt;p&gt;如果你也有类似的跨学科讨论需求，想快速了解一个不熟悉领域的研究者的核心观点，这个工作流可以照搬。核心步骤就是：搜论文 → 下全文 → 转格式 → 做总结 → 回到问题逐条核对。每一步都不复杂，但串起来的效率比手动操作高一个数量级。&lt;/p&gt;
&lt;p&gt;讨论本身是好事。把观点摆出来，拿证据来核对，有错就改，没错的就坚持。这比闷着头各自相信各自的版本要好得多。只是在这个过程中，得确保你引用的证据确实是你读过的，而不是你觉得大概应该是那样的。&lt;/p&gt;
&lt;h2&gt;最后一道工序：引文核查&lt;/h2&gt;
&lt;p&gt;上面的全文写完之后，我又做了一件事：把参考文献列表里每一条引用，拿英文原文作为搜索词，回到转换好的文章全文里逐条搜索，确认这段话确实出现在那篇论文里。&lt;/p&gt;
&lt;p&gt;这个过程听起来多余——既然引文是从论文里提取的，还能有错？但实际上，12 条引用查下来，原文全部命中，没有一条是编造的。&lt;/p&gt;
&lt;p&gt;用 AI 工具做文献检索和整理，即便大部分操作是基于真实下载的 PDF 和 API 返回的结构化数据，而不是凭空生成，也仍然要警惕幻觉的影响。AI 工具在这个流程里扮演的角色更接近信息搬运工而不是知识生成器——它从论文里提取原文、从 API 获取元数据、从 PDF 转换格式。按理说每一步都有真实的数据来源，不应该出错。但事实是，数据源本身可能返回错误信息，AI 在整合这些信息时可能不加验证地照搬，最终输出里就混入了看起来合理实则错误的内容。&lt;/p&gt;
&lt;p&gt;如果不做核查直接发出去，读者点链接会发现跳到了不相关的论文，整篇文章的可信度都会打折扣。更危险的场景是：如果 AI 在提取论文原文时也出现类似的「张冠李戴」——比如把 A 论文的结论安到 B 论文头上——那你基于这些引用做出的论证就全都站不住了。这次原文提取碰巧全部命中，但这个概率不能假设它每次都这么走运。&lt;/p&gt;
&lt;p&gt;所以最后这一步引文核查，不是可有可无的仪式，是必须做的收尾工序。&lt;/p&gt;
&lt;p&gt;工具提升效率，但工具不保证正确。&lt;/p&gt;
&lt;p&gt;效率越高，出错的传播速度也越快——你十分钟生成的内容，如果带着错误发出去，也是十分钟就传播出去了。&lt;/p&gt;
&lt;p&gt;在效率和可靠之间，核查这一步是唯一的缓冲。&lt;/p&gt;
&lt;p&gt;其实整个这篇文章所说的也正是一个核查的过程，就是把观点和所声称依赖的文献来源进行一下核查。&lt;/p&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;p&gt;[1] Levin M, Resnik DB. "Mind Everywhere: A Framework for Conceptualizing Goal-Directedness in Biology and Other Domains—Part One." &lt;em&gt;Biological Theory&lt;/em&gt;, 2026. PMID: 42183019. DOI: 10.1007/s13752-025-00523-6 &lt;a href="https://doi.org/10.1007/s13752-025-00523-6"&gt;https://doi.org/10.1007/s13752-025-00523-6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] Nanos V, Levin M. "Rewiring Endogenous Bioelectric Circuits in the Xenopus laevis Embryo Model." &lt;em&gt;Methods in Molecular Biology&lt;/em&gt;, 2021. PMID: 33340356. DOI: 10.1007/978-1-0716-1174-6_7 &lt;a href="https://doi.org/10.1007/978-1-0716-1174-6_7"&gt;https://doi.org/10.1007/978-1-0716-1174-6_7&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3] Levin M. "Bioelectric networks: the cognitive glue enabling evolutionary scaling from physiology to mind." &lt;em&gt;Animal Cognition&lt;/em&gt;, 2023. PMID: 37204591. DOI: 10.1007/s10071-023-01780-3 &lt;a href="https://doi.org/10.1007/s10071-023-01780-3"&gt;https://doi.org/10.1007/s10071-023-01780-3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[4] Levin M. "Darwin's agential materials: evolutionary implications of multiscale competency in developmental biology." &lt;em&gt;Cellular and Molecular Life Sciences&lt;/em&gt;, 2023. PMID: 37156924. DOI: 10.1007/s00018-023-04790-z &lt;a href="https://doi.org/10.1007/s00018-023-04790-z"&gt;https://doi.org/10.1007/s00018-023-04790-z&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[5] Zhang G, Levin M. "Bioelectricity is a universal multifaced signaling cue in living organisms." &lt;em&gt;Molecular Biology of the Cell&lt;/em&gt;, 2025. PMID: 39873662. DOI: 10.1091/mbc.E23-08-0312 &lt;a href="https://doi.org/10.1091/mbc.E23-08-0312"&gt;https://doi.org/10.1091/mbc.E23-08-0312&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[6] Cervera J, Levin M, Mafe S. "Top-down perspectives on cell membrane potential and protein transcription." &lt;em&gt;Scientific Reports&lt;/em&gt;, 2025. PMID: 41372487. DOI: 10.1038/s41598-025-31696-6 &lt;a href="https://doi.org/10.1038/s41598-025-31696-6"&gt;https://doi.org/10.1038/s41598-025-31696-6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[7] Pai VP, Zhang G, Levin M. "'Bioelectricity in Development, Regeneration, and Cancers' Cell Bio 2023: A Joint Meeting..." &lt;em&gt;Bioelectricity&lt;/em&gt;, 2024. PMID: 38525485. DOI: 10.1089/bioe.2024.0006 &lt;a href="https://doi.org/10.1089/bioe.2024.0006"&gt;https://doi.org/10.1089/bioe.2024.0006&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[8] Levin M. "Self-Improvising Memory: A Perspective on Memories as Agential, Dynamically Reinterpreting Cognitive Glue." &lt;em&gt;Entropy&lt;/em&gt;, 2024. PMID: 38920491. DOI: 10.3390/e26060481 &lt;a href="https://doi.org/10.3390/e26060481"&gt;https://doi.org/10.3390/e26060481&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[9] Pio-Lopez L, Levin M. "Aging as a loss of morphostatic information: A developmental bioelectricity perspective." &lt;em&gt;Ageing Research Reviews&lt;/em&gt;, 2024. PMID: 38636560. DOI: 10.1016/j.arr.2024.102310 &lt;a href="https://doi.org/10.1016/j.arr.2024.102310"&gt;https://doi.org/10.1016/j.arr.2024.102310&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[10] Pezzulo G, LaPalme J, Durant F, Levin M. "Bistability of somatic pattern memories: stochastic outcomes in bioelectric circuits underlying regeneration." &lt;em&gt;Philosophical Transactions of the Royal Society B&lt;/em&gt;, 2021. PMID: 33550952. DOI: 10.1098/rstb.2019.0765 &lt;a href="https://doi.org/10.1098/rstb.2019.0765"&gt;https://doi.org/10.1098/rstb.2019.0765&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[11] Levin M. "Bioelectrical approaches to cancer as a problem of the scaling of the cellular self." &lt;em&gt;Progress in Biophysics and Molecular Biology&lt;/em&gt;, 2021. PMID: 33961843. DOI: 10.1016/j.pbiomolbio.2021.04.007 &lt;a href="https://doi.org/10.1016/j.pbiomolbio.2021.04.007"&gt;https://doi.org/10.1016/j.pbiomolbio.2021.04.007&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[12] Grodstein J, Levin M. "Stability and robustness properties of bioelectric networks: A computational approach." &lt;em&gt;Biophysics Reviews&lt;/em&gt;, 2021. PMID: 38505634. DOI: 10.1063/5.0062442 &lt;a href="https://doi.org/10.1063/5.0062442"&gt;https://doi.org/10.1063/5.0062442&lt;/a&gt;&lt;/p&gt;</content><category term="Story"/><category term="AI"/><category term="Tools"/><category term="Research"/><category term="Bioelectricity"/><category term="OpenCode"/></entry><entry><title>OpenCode 进阶用法-你提供素材让open code来帮你制作针对不同场景的简历</title><link href="https://blog.cycleuser.org/opencode-resume-builder.html" rel="alternate"/><published>2026-08-01T00:00:00+08:00</published><updated>2026-08-01T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-08-01:/opencode-resume-builder.html</id><summary type="html">&lt;p&gt;之前写过好几篇关于OpenCode的文章了。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566541&amp;amp;idx=1&amp;amp;sn=7ce86cc9c8adf8986f86ce6a4dda3343&amp;amp;token=2053460179&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;opencode 的四种用法与为什么我推荐命令行&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566692&amp;amp;idx=1&amp;amp;sn=6dc9a21822df55f90aacde40560c8fa7&amp;amp;token=2053460179&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;不只是写代码：用opencode和免费模型帮你搜教程、下视频&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566743&amp;amp;idx=1&amp;amp;sn=3ad1c5f7dc1e90877cb115c68cd9e561&amp;amp;token=2053460179&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;用 opencode 帮学习：上课没听懂的东西 …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;之前写过好几篇关于OpenCode的文章了。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566541&amp;amp;idx=1&amp;amp;sn=7ce86cc9c8adf8986f86ce6a4dda3343&amp;amp;token=2053460179&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;opencode 的四种用法与为什么我推荐命令行&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566692&amp;amp;idx=1&amp;amp;sn=6dc9a21822df55f90aacde40560c8fa7&amp;amp;token=2053460179&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;不只是写代码：用opencode和免费模型帮你搜教程、下视频&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566743&amp;amp;idx=1&amp;amp;sn=3ad1c5f7dc1e90877cb115c68cd9e561&amp;amp;token=2053460179&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;用 opencode 帮学习：上课没听懂的东西，让它帮你查清楚画明白&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566719&amp;amp;idx=1&amp;amp;sn=23bb679d34332deb68daa339df0e2384&amp;amp;token=2053460179&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;OpenCode进阶-安装技能再改进：从PDF读取内容来填表和文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566768&amp;amp;idx=1&amp;amp;sn=4cc24558321b0372871b22b1ff2880a3&amp;amp;token=2053460179&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;OpenCode 进阶之「技能创作」：拆解描述典型任务后验证实现再做成可复用的「技能」&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566778&amp;amp;idx=1&amp;amp;sn=4def4836b58ee692bac1342544f37d28&amp;amp;token=2053460179&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;OpenCode进阶探索-利用模型进行文献情报检索但不要让模型替代人判断&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;从简单的下载东西，到更复杂一点的OCR 提取图片文字、填表、整理文献，这些技能都有了。&lt;/p&gt;
&lt;p&gt;这次说一个更具体的场景：用 OpenCode 来帮忙做简历。&lt;/p&gt;
&lt;h2&gt;先把素材都扔进一个目录&lt;/h2&gt;
&lt;p&gt;你在大学这几年攒了不少东西。课程成绩单的 PDF、发表过的软著扫描件、会议文章的录用通知、期刊论文的首页、毕业论文的摘要和目录、摄影作品的精选图片，可能还有一些乱七八糟的证明材料。这些东西平时分散在手机相册、微信文件、电脑桌面各个角落。&lt;/p&gt;
&lt;p&gt;第一步很简单：把这些全部拷到一个目录里。别管格式，PDF、图片、Word、txt 都行。以前写的 OCR 技能这时候就派上了——图片里的文字能提取出来，填表技能能把分数表格数字化。你只要把素材放进去，让 OpenCode 先把它们都读一遍，它就有了一手资料。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/51b3096c4357bef1.png"&gt;&lt;/p&gt;
&lt;h2&gt;不同去向的简历，侧重点不一样&lt;/h2&gt;
&lt;p&gt;找工作的话，不同行业看的是不同的你。投互联网开发的简历要突出编程项目和技术栈，投摄影行业的要突出作品集和器材经验，投教育行业的要把辅导经历和课程设计写清楚。同一个人面对不同方向，简历上重点突出的得不一样。&lt;/p&gt;
&lt;p&gt;OpenCode 可以帮的忙是：你先告诉它目标行业和岗位，让它去搜索可靠的招聘网站上同类岗位的职位描述、要求，再让它回来看你的素材里有哪些能对上。对上号的写细致一点，暂时对不上的也别删，也许下一个岗位用得到。&lt;/p&gt;
&lt;p&gt;考研考博的话，简历的逻辑和找工作的完全不一样。&lt;/p&gt;
&lt;p&gt;导师招人不是要找考试分数最高的。能进复试的分数都不差，差的是有过基础科研训练的人。换句话说，导师想看到的不是"我能考高分"，而是"我来了就能上手帮忙"。如果你本科期间参与过实验室项目，哪怕只是帮师兄师姐跑过数据、做过实验记录、整理过文献，这些东西写到简历上都比高分的含金量高。如果有已经投稿或者发表的文章，更要写清楚——你是第几作者、文章标题是什么、投的什么期刊或者会议、目前什么状态（已发表、录用、在审）。&lt;/p&gt;
&lt;p&gt;毕业论文的题目和方向也要写上。这能告诉导师你大概熟悉什么领域，做过什么程度的探索。导师看到之后心里就有谱：这个人来了大概能安排做什么方向的事。&lt;/p&gt;
&lt;h2&gt;一定要诚实，不能编&lt;/h2&gt;
&lt;p&gt;这是不能含糊的一点。不管是找工作还是升学，简历上写的每一个东西，面试的时候都可能被问到。你说你参与了某个项目，面试官顺着问两句，你要是真做过就能答上来，要是编的就露馅。&lt;/p&gt;
&lt;p&gt;OpenCode 可以帮你把素材整理得更有条理，把你做过的事用更清晰的语言组织出来，但它不能替你编一个你没做过的事。你可以有所保留——有的经历你觉得不够好、不想写上去，这是你的自由。但写上去的东西，每一个都得是真的。真诚坦率，不全写没问题，编造不可以。&lt;/p&gt;
&lt;h2&gt;具体怎么操作&lt;/h2&gt;
&lt;p&gt;把你准备好的素材目录路径告诉 OpenCode，然后说清楚你的目标。下面是一个示例：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我准备做一份简历，目标方向是考研，专业是环境科学。我的素材在桌面上的 &lt;code&gt;resume_materials/&lt;/code&gt; 目录里。里面有本科成绩单 PDF、一篇中文核心的录用通知、毕业论文的摘要、两个软著的证书扫描件，还有一些实验记录的照片。&lt;/p&gt;
&lt;p&gt;请帮我整理。搜索一下目标院校环境科学方向近几年的研究生招生公告和导师介绍，看看他们倾向招什么样的学生。然后根据我的素材，帮我列一份简历的提纲。列出哪些素材应该突出，哪些可以略写，哪些要补充。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;这样就够了。&lt;/p&gt;
&lt;p&gt;素材是现成的，方向是明确的，OpenCode 来干的是整理和检索的活儿。最后呈现出来的简历，提纲是它给的，具体你改不改、怎么改，你来决定。工具做梳理，人做判断。这个分工清楚，就不会跑偏。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇高校教师建议大学新生尽量避免赌气-学会基于判断而不是情绪来做决定&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="resume"/><category term="career"/><category term="graduate-school"/><category term="job-hunting"/></entry><entry><title>高校教师建议大学生朋友们千万走出「见不得身边人好」的心理陷阱</title><link href="https://blog.cycleuser.org/acknowledging-others-excellence.html" rel="alternate"/><published>2026-07-31T12:00:00+08:00</published><updated>2026-07-31T12:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-31:/acknowledging-others-excellence.html</id><summary type="html">&lt;p&gt;有的同学可能有过这种感觉。刷到一条朋友圈，同学拿了奖。听到一个消息，比你小两届的学弟发了顶刊论文。看到一篇推送 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;有的同学可能有过这种感觉。刷到一条朋友圈，同学拿了奖。听到一个消息，比你小两届的学弟发了顶刊论文。看到一篇推送，同龄人在某个比赛里得了奖项。&lt;/p&gt;
&lt;p&gt;你嘴上说着"挺好的"，心里有一种说不清的不舒服。不是羡慕——羡慕是你也想拥有，是往前的，是积极的。也不是嫉妒——嫉妒是带着点恨的，你也没那么严重。就是一种别扭。好像心里住了一只小怪物，拿根细软的针，在你手指缝里、腋窝底下，不知道什么时候就暗戳戳刺一下。不怎么疼，但总是有点难受。&lt;/p&gt;
&lt;p&gt;「为什么不是我呢。」&lt;/p&gt;
&lt;p&gt;这句话会在脑子里转一圈。然后你马上会觉得这样想不对，于是把它压下去。但它过一阵又会冒上来。&lt;/p&gt;
&lt;h2&gt;这件事可能不是你一个人的问题&lt;/h2&gt;
&lt;p&gt;很多人有这个反应，不是天生的。是练出来的。&lt;/p&gt;
&lt;p&gt;从小被拿来跟别人比较的孩子，长大以后很难不把自己跟别人比较。这个模式是家庭里养成的。有些家庭里，大人在外面得给人陪笑、点烟、敬酒、提词，活得很累。回到家以后，这套不舒服的东西没有地方卸掉，就倒给了家人。对孩子尤其方便——孩子不会反抗，成本最低，风险最小。&lt;/p&gt;
&lt;p&gt;水凉了不行，热了也不行。饭菜咸了淡了都是毛病。成绩好了说你骄傲，成绩差了说你没出息。考了第二问你为什么不是第一，考了第一问你这次是不是题目太简单。&lt;/p&gt;
&lt;p&gt;小孩子在这种环境里长大，很容易学会一件事：我的价值不是由我自己来决定的，而是由我比别人强多少来决定的。别人比我强，就等于我输了。我输了，就等于我没有价值。&lt;/p&gt;
&lt;h2&gt;中老登们的斗鸡游戏&lt;/h2&gt;
&lt;p&gt;这些东西上一代玩得很熟。他们那个圈子，乐趣本来就不多。烟酒要花钱，赌博有风险，其他的消遣要么见不得光要么毁身体。比孩子是成本最低的娱乐方式——孩子成绩好，出去吹牛就有素材；孩子讨老师喜欢，等于自己在领导面前有面子。孩子在他们眼里不是一个人，是一个可以向其他中老登展示的成绩单。&lt;/p&gt;
&lt;p&gt;子夏之徒说得对——「狗豨犹有斗，恶有士而无斗矣」，阿猫阿狗都免不了要斗一斗，何况庸碌之人呢。中老登们自然也这样。比谁家孩子出生时胖，比谁家孩子半夜不哭闹，比谁说话早、谁会学大人说那些市侩话。上学了比成绩、比课外班、比谁更讨老师欢心。自己辈子过得没什么拿得出手的东西了，就指望孩子替自己去比，替自己去赢。&lt;/p&gt;
&lt;p&gt;其实他们只希望赢，至于事情本身，其实未必真那么重视，甚至他们可能都懒得掩饰地流露出来&lt;a href="https://mp.weixin.qq.com/s/IrXVSwwyUUegNMx0U4UVDw"&gt;「事情本身不重要」&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;放羊为了成家，成家为了生子，生子让去放羊。这个循环换个皮：学习为了应试，应试为了比别人强，比别人强为了能让父母出去吹牛，吹完牛回家继续要求你比别人更强。鱼头要永远朝向对的人，你也要随时能站起来提一杯。&lt;/p&gt;
&lt;p&gt;也许有一种可能，就是：他们是故意这样设计的，就是希望大家陷入到这样的徒劳和循环。&lt;/p&gt;
&lt;h2&gt;你不需要接这个棒&lt;/h2&gt;
&lt;p&gt;如果你从小到大一直活在这种比较里，到了大学以后，你可能会发现自己有两个本能：第一个是看到别人有成就就难受，第二个是想让别人知道自己认识谁谁谁谁。两个都是这个模式的后遗症。前者让你不开心，后者让你显得浅薄。&lt;/p&gt;
&lt;p&gt;如果你没有经历过这些，也希望能理解——你身边那些看到别人成功就浑身不自在的同学，可能不是人品差，是从小被这么练出来的。而且他们自己可能并没有意识到，只觉得自己是"压力大"或者"要强"。&lt;/p&gt;
&lt;p&gt;同学成绩比你好，同学比赛拿了奖，同学发了论文，同学谈了对象，同学考研上岸了，同学留在高校当了老师，同学拿了个国际大奖——这些都是他们的剧情。你的剧情是你的，不需要和他们比进度条。你不需要羡慕嫉妒恨，那对你没有任何帮助。你也不需要四处跟人说"我认识的那个谁谁多厉害"，因为厉害的人是他，不是你认识的你就跟着厉害了，这两个东西一点关系都没有。&lt;/p&gt;
&lt;p&gt;好好走自己的路。承认别人优秀没那么难。&lt;/p&gt;
&lt;p&gt;多关注一下自我的建设，让自己成为更好的版本。&lt;/p&gt;
&lt;p&gt;选了什么样的生活方式就乐在其中，这比什么都要好。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注：文中提到的「阿猫阿狗」化用了《墨子·耕柱》中一段。原文：子夏之徒问于墨子：「君子有斗乎？」墨子曰：「君子无斗。」子夏之徒曰：「狗豨犹有斗，恶有士而无斗矣？」&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="Story"/><category term="reflection"/><category term="education"/><category term="family"/><category term="comparison"/><category term="university"/></entry><entry><title>高校教师建议大学新生尽量避免赌气-学会基于判断而不是情绪来做决定</title><link href="https://blog.cycleuser.org/dont-make-decisions-out-of-spite.html" rel="alternate"/><published>2026-07-31T00:00:00+08:00</published><updated>2026-07-31T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-31:/dont-make-decisions-out-of-spite.html</id><summary type="html">&lt;p&gt;前几天我儿子闹了个别扭。我买了果汁回来，他本来挺高兴要喝的，他妈妈跟他说先把作业做完再喝吧，果汁正好凉，放一会 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;前几天我儿子闹了个别扭。我买了果汁回来，他本来挺高兴要喝的，他妈妈跟他说先把作业做完再喝吧，果汁正好凉，放一会儿温一温。他就来了一句：那我不喝了。&lt;/p&gt;
&lt;p&gt;这就是赌气。不是不想喝，是因为被提了个条件，心里不舒服，就用"不喝了"来回应。好像拒绝了对方的要求，自己就赢了似的。&lt;/p&gt;
&lt;p&gt;我把他叫到另一个屋子，跟他说，你想喝这个东西对吧。他说对。那作业是不是反正也要做。他说是。那先做作业再喝果汁，这个顺序本身有什么问题吗？他想了一下，好像也没什么问题。那如果现在你说不喝了，等会儿做完了作业想喝的时候怎么办？你已经说了不喝了，再拿起来是不是有点别扭。&lt;/p&gt;
&lt;p&gt;最后他自己也觉得，还是先做作业，做完喝果汁。这事儿就算过去了。&lt;/p&gt;
&lt;p&gt;但如果他当时赌气到底呢？作业照样得做，果汁照样想喝，但话已经放出去了，自己把自己架在那儿了。你说这划不划算。&lt;/p&gt;
&lt;h2&gt;赌气这件事，从小学到大学都在发生&lt;/h2&gt;
&lt;p&gt;有的同学一门科目没考好，就索性不学了。心里想的是，反正我也学不好，那我干脆不学，这样就不是"我努力了还不行"，而是"我没努力所以不行"。这两句话听起来差不多，但对自己的伤害完全不一样。前一个是能力问题，后一个是态度问题，大部分人选了后者，因为后者好接受一点。&lt;/p&gt;
&lt;p&gt;然后如果有其他科目也受了挫，同样的操作再来一次。最后变成了"我都这样了还学什么学"，觉得挺酷。谁劝都没用，劝了反而更来劲——你越劝说明你越在意，我就越要证明我不在意。其实到底在不在意，自己心里清楚。&lt;/p&gt;
&lt;p&gt;还有更隐蔽的一种。身边有人开始吸烟喝酒，好像这样就成年了、就独立了。家里大人劝阻，反而激发了逆反——你说不好，那我偏要试试。甚至自己心里也知道这不一定对，但怕被同样这么做的同学排斥，怕显得自己不合群，就违心地跟着一块混。这不是酷。你只是在用别人的标准衡量自己，而且那个标准本身就不太对。&lt;/p&gt;
&lt;h2&gt;大人也赌气，而且比小孩更会找理由&lt;/h2&gt;
&lt;p&gt;路上开车，人家别了你一下插了队。你赌气，非要别回去，再急刹车拦他一下。这一来二去，轻则剐蹭，重则事故。你本来只是被别了一下，耽误了几秒钟。赌气之后，可能耽误几个小时甚至更久，还得赔钱。投入产出完全不对等，但赌气上头的时候没人算这个。&lt;/p&gt;
&lt;p&gt;排队的时候有人插进来了，你指出来，他不认。他说他是平移过来的，不是在插队。平移这个词用得挺妙——只要找到一个能挽尊的说法，就好像自己不是在插队了，就可以理直气壮地跟人耍横。&lt;/p&gt;
&lt;p&gt;还有更离谱的——占了人家固定车位，人家好好联系了，不理不睬。还撒谎说自己出差了回不来。人家被惹怒了，他又找自己伴侣过来拦着人家。每一步都在让事情升级，每一步都有机会停下来，但一个都没抓住。这就不是一时的赌气了，这是用赌气的方式在处理所有遇到的问题。&lt;/p&gt;
&lt;h2&gt;赌气成为习惯，就是人格的一部分了&lt;/h2&gt;
&lt;p&gt;赌气本身不可怕，谁都有情绪上头的时候。可怕的是赌气成了习惯，成了处理问题的默认路径。更可怕的是自己都不觉得自己在赌气，觉得这就是自己"直率""有骨气"的表现。&lt;/p&gt;
&lt;p&gt;别人给你提个建议，你第一反应不是想这建议有没有道理，而是想这人是不是在管你。别人做了一件你不太喜欢的事，你第一反应是怎么回敬一下让他知道你不高兴，而不是想这件事到底值不值得不高兴。&lt;/p&gt;
&lt;p&gt;久而久之，你遇到所有让自己不舒服的情况都只会用这一种方式应对——对抗、拒绝、把自己架起来。不仅自己不开心，也让身边的人觉得不好相处。大家不是怕你，是懒得跟你打交道了。&lt;/p&gt;
&lt;p&gt;做决定之前问自己一句：我到底是真的想这么选，还是只是在赌气。这句话说起来简单，但每一次能拦住自己把情绪当成决定，都是一次对自己负责。&lt;/p&gt;
&lt;p&gt;对小朋友是这样，对大学新生，对自己，都是这样。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇用OpenCode帮忙搜索整理动漫人物关系和时间线以及当年没弄明白的剧情&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Education"/><category term="education"/><category term="emotion"/><category term="decision-making"/><category term="maturity"/><category term="university"/></entry><entry><title>这个世界的维度不一定是整数——谈谈分数维是怎么回事</title><link href="https://blog.cycleuser.org/fractional-fractal-dimension.html" rel="alternate"/><published>2026-07-30T14:00:00+08:00</published><updated>2026-07-30T14:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-30:/fractional-fractal-dimension.html</id><summary type="html">&lt;p&gt;我们日常接触的维度都是整数：线段是 1 维的，正方形是 2 维的，立方体是 3 维的。这个东西很直观——你从小到大在黑板上画 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我们日常接触的维度都是整数：线段是 1 维的，正方形是 2 维的，立方体是 3 维的。这个东西很直观——你从小到大在黑板上画的坐标系，横轴是一条线，横轴加纵轴是一个面，再加一根竖轴就是空间。&lt;/p&gt;
&lt;p&gt;但这个世界有些东西，它的维度不是整数。&lt;/p&gt;
&lt;p&gt;&lt;img alt="整数维度和分数维度的对比" src="images/fractal-dimension-intro.png"&gt;&lt;/p&gt;
&lt;p&gt;英国的海岸线有多长？你拿一把很长的尺子去量，得到一个数字。换一把更短的尺子，能量到更多弯弯绕绕，量出来的长度变长了。再换更短的尺子，它变得更长。如果尺子无限短，海岸线的长度似乎会变成无限大——但它又不是 2 维的面，它是一根线，只不过缠绕得过于厉害。&lt;/p&gt;
&lt;p&gt;Mandlebrot 在 1967 年那篇著名的 Science 论文里问了这个问题。他的答案是：海岸线的维度在 1 和 2 之间，大概 1.2 到 1.3 左右。这不是一个整数。&lt;/p&gt;
&lt;h2&gt;维度到底怎么算&lt;/h2&gt;
&lt;p&gt;先回想一下整数维度是怎么来的。拿一条线段，把它均分成 2 段——你得到的是 2 段，每段长度是原来的 1/2。如果你把它均分成 3 段，你得到 3 段，每段长度 1/3。&lt;/p&gt;
&lt;p&gt;关键在哪呢？放大的倍数和段数的关系：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;线段：放大 2 倍 → 长度变成 2 倍。2 = 2¹。维度是 1。&lt;/li&gt;
&lt;li&gt;正方形：放大 2 倍 → 面积变成 4 倍。4 = 2²。维度是 2。&lt;/li&gt;
&lt;li&gt;立方体：放大 2 倍 → 体积变成 8 倍。8 = 2³。维度是 3。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;设放大倍数为 r 的倒数（就是缩小的比例），设 N 为缩小后小图形的个数，则维度 D 满足：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[ N = \left(\frac{1}{r}\right)^D \]&lt;/div&gt;
&lt;p&gt;两边取对数：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[ D = \frac{\log N}{\log (1/r)} \]&lt;/div&gt;
&lt;p&gt;&lt;img alt="三个形状的缩放维度计算" src="images/fractal-dimension-formula.png"&gt;&lt;/p&gt;
&lt;p&gt;这个公式妙在什么地方呢？它不要求 N 是整数。只要你能数清楚"一个图形缩小到原来的几分之一后，包含了几个和自己相似的更小图形"，你就能算出它的维度——哪怕算出来的不是整数。&lt;/p&gt;
&lt;h2&gt;科赫雪花：周长无限但面积有限&lt;/h2&gt;
&lt;p&gt;科赫雪花（Koch Snowflake）可能是最著名的分形了。构造方法非常简单：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从一个等边三角形开始&lt;/li&gt;
&lt;li&gt;每条边三等分，把中间那段换成一个小的等边三角形的两条边&lt;/li&gt;
&lt;li&gt;重复&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;用 Python 写出来就是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;koch_snowflake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;生成科赫雪花的顶点坐标&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="c1"&gt;# 初始等边三角形&lt;/span&gt;
    &lt;span class="n"&gt;pts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;new_pts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

            &lt;span class="c1"&gt;# 第一段起点&lt;/span&gt;
            &lt;span class="n"&gt;new_pts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="c1"&gt;# 第二段起点 (三等分点)&lt;/span&gt;
            &lt;span class="n"&gt;new_pts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dy&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="c1"&gt;# 中间凸起的顶点 (旋转60度)&lt;/span&gt;
            &lt;span class="n"&gt;angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
            &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dy&lt;/span&gt;
            &lt;span class="n"&gt;new_pts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;mx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dy&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                            &lt;span class="n"&gt;my&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;dy&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;angle&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
            &lt;span class="c1"&gt;# 第三段起点 (二等分点)&lt;/span&gt;
            &lt;span class="n"&gt;new_pts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dy&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;new_pts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;pts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_pts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pts&lt;/span&gt;

&lt;span class="n"&gt;pts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;koch_snowflake&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#f39c12&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="n"&gt;alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edgecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#f39c12&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;linewidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;equal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;axis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;off&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="科赫雪花的四次迭代过程" src="images/fractal-koch-iterations.png"&gt;&lt;/p&gt;
&lt;p&gt;每一次迭代都发生了什么？一条线段被替换成了 4 条更短的线段，每条的长度是原来的 1/3。&lt;/p&gt;
&lt;p&gt;所以 N = 4，r = 1/3（或者说，放大倍数是 3）。&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[ D = \frac{\log 4}{\log 3} \approx \frac{0.602}{0.477} \approx 1.26 \]&lt;/div&gt;
&lt;p&gt;科赫雪花的维度大约是 1.26。它是一个在 1 和 2 之间的几何对象——比一条线更"拥挤"，但还远不到一个面。它的一个非常反直觉的性质是：面积是有限的，但周长是无限的。每一次迭代，周长都变成原来的 4/3，无限迭代下去周长就趋于无穷。&lt;/p&gt;
&lt;h2&gt;谢尔宾斯基三角形：像是被虫蛀过的三角形&lt;/h2&gt;
&lt;p&gt;另一个经典分形是谢尔宾斯基三角形（Sierpinski Triangle）。构造方法也很简单：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一个黑色实心三角形&lt;/li&gt;
&lt;li&gt;挖掉中间那个倒着的、边长是原来一半的小三角形&lt;/li&gt;
&lt;li&gt;对剩下的三个小三角形重复同样的操作&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;sierpinski&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;生成谢尔宾斯基三角形&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;pts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([[&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)]])&lt;/span&gt;
    &lt;span class="n"&gt;triangles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pts&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;new_tris&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;triangles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="c1"&gt;# 三条边的中点&lt;/span&gt;
            &lt;span class="n"&gt;mab&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
            &lt;span class="n"&gt;mbc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
            &lt;span class="n"&gt;mca&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
            &lt;span class="c1"&gt;# 三个小三角形（中间那个被挖掉了）&lt;/span&gt;
            &lt;span class="n"&gt;new_tris&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mab&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mca&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
            &lt;span class="n"&gt;new_tris&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;mab&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mbc&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
            &lt;span class="n"&gt;new_tris&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;mca&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mbc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
        &lt;span class="n"&gt;triangles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_tris&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;triangles&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="谢尔宾斯基三角形的四次迭代" src="images/fractal-sierpinski.png"&gt;&lt;/p&gt;
&lt;p&gt;每次迭代，三角形被分成 4 个等大的小三角形（中间那个被挖掉所以只剩下 3 个）。每个小三角形的边长是原来的一半。所以 N = 3，r = 1/2。&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[ D = \frac{\log 3}{\log 2} \approx \frac{0.477}{0.301} \approx 1.58 \]&lt;/div&gt;
&lt;p&gt;谢尔宾斯基三角形的维度大概是 1.58。比科赫曲线更接近 2，但仍然不是一个完整的平面——因为它被无限多个窟窿蛀空了，总面积趋近于 0。&lt;/p&gt;
&lt;p&gt;计算任何自相似分形的维度的通用函数：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;math&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;fractal_dimension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    计算自相似分形的维度&lt;/span&gt;
&lt;span class="sd"&gt;    N: 缩小后的小图形个数&lt;/span&gt;
&lt;span class="sd"&gt;    r: 缩小的比例 (新边长 / 原边长)&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;科赫雪花: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fractal_dimension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;谢尔宾斯基三角形: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fractal_dimension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;门格海绵: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fractal_dimension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;线段: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fractal_dimension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;正方形: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fractal_dimension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.2f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;科赫雪花: 1.26
谢尔宾斯基三角形: 1.58
门格海绵: 2.73
线段: 1.00
正方形: 2.00
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;注意最后一行的线段和正方形——N 和 r 取适当的值，公式算出整数维度。这个公式是兼容的，整数维度只是它的特例。&lt;/p&gt;
&lt;h2&gt;Mandelbrot 集：无穷的精致&lt;/h2&gt;
&lt;p&gt;如果说科赫雪花和谢尔宾斯基三角形是数学家人工构造的，那 Mandelbrot 集就是大自然塞到数学里的。它的定义简单到只有一行：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[ z_{n+1} = z_n^2 + c \]&lt;/div&gt;
&lt;p&gt;取一个复数 c，从 z₀ = 0 开始不断迭代这个公式。如果 z 最终发散到无穷大，c 就不属于 Mandelbrot 集；如果永远局限在有限范围内，c 就属于它。你只是把每一个 c 在复平面上对应的点按照迭代发散的快慢染上不同的颜色，就得到了下面这个东西。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Mandelbrot 全集与局部放大" src="images/fractal-mandelbrot.png"&gt;&lt;/p&gt;
&lt;p&gt;用 Python 画出来：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;plt&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;mandelbrot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_iter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xmax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ymin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ymax&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xmax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ymin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ymax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[:,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;:]&lt;/span&gt;
    &lt;span class="n"&gt;Z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros_like&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zeros&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_iter&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
        &lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
        &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mandelbrot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;figsize&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;facecolor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#0f1720&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;imshow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cmap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hot&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xticks&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yticks&lt;/span&gt;&lt;span class="p"&gt;([])&lt;/span&gt;
&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这个集合有一个极为特殊的性质：它的边界是&lt;strong&gt;处处粗糙的&lt;/strong&gt;。不管你把放大倍数调到多大，边界上总有新的结构冒出来。你放大到原子尺度，它依然有凸起、凹陷、螺旋——永远看不完。正是因为这个边界复杂到了极致，它的 Hausdorff 维数被证明等于 2。也就是说，一条"线"——如果它可以被叫做线的话——复杂到了填满一个平面的程度。&lt;/p&gt;
&lt;h2&gt;分数维的存在告诉我们什么&lt;/h2&gt;
&lt;p&gt;维度不是一个必须整数的东西——它更像是在描述"这个形状在一个空间里填充了多少"。科赫雪花比线更挤所以维度比 1 大，但不如面那么密集所以维度比 2 小。谢尔宾斯基三角形比科赫雪花更靠近 2，因为它覆盖的面积比例更大。&lt;/p&gt;
&lt;p&gt;现实中很多东西的维度可能不是整数。海岸线、血管网络、肺的支气管树、河网水系——这些自然形状都或多或少有自相似性，它们的有效维度是一个比整数更有信息量的描述方式。&lt;/p&gt;
&lt;p&gt;这也许也可以当作一种思维方式来琢磨。日常做判断的时候，很多事并不是非黑即白、非零即一的简单二分。在 1 和 0 之间、在 1 和 2 之间，可能存在着连续的、丰富的光谱式的过渡。不是维度可以随便定义，而是很多看起来理所当然的"整数"划分，换个角度去看就有更多东西在中间。&lt;/p&gt;</content><category term="Science"/><category term="mathematics"/><category term="fractal"/><category term="dimension"/><category term="python"/><category term="geometry"/></entry><entry><title>计算机是怎么用二进制做加减乘除的——从原码反码补码讲起</title><link href="https://blog.cycleuser.org/binary-arithmetic-complement.html" rel="alternate"/><published>2026-07-30T10:00:00+08:00</published><updated>2026-07-30T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-30:/binary-arithmetic-complement.html</id><summary type="html">&lt;p&gt;大家基本都知道二进制是怎么回事了——0 和 1，每一位代表 2 的几次方。但光知道二进制表示数字还不够，还得知道计算机 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;大家基本都知道二进制是怎么回事了——0 和 1，每一位代表 2 的几次方。但光知道二进制表示数字还不够，还得知道计算机怎么用它来算加减乘除。&lt;/p&gt;
&lt;p&gt;这事的关键在于三个东西：原码、反码、补码。把这三个弄明白，计算机的运算就没什么神秘的了。&lt;/p&gt;
&lt;h2&gt;原码：最朴素的二进制表示&lt;/h2&gt;
&lt;p&gt;原码就是最直接的写法。最高位（最左边的那位）是符号位——0 表示正数，1 表示负数。剩下的位表示数值的大小。&lt;/p&gt;
&lt;p&gt;比如用 8 位二进制（一个字节）来存。先约定一个基础规则：8 位二进制，每一位从右到左有一个编号。最右边的那位叫作 bit 0，往左依次是 bit 1、bit 2……一直到最左边的 bit 7。bit 0 代表 2⁰ = 1，bit 1 代表 2¹ = 2，bit 7 代表 2⁷ = 128。这个编号方式后面会反复用到。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;bit7  bit6  bit5  bit4  bit3  bit2  bit1  bit0
 0     0     0     0     0     1     0     1   = +5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;+5 怎么表示？符号位是 0，剩下 7 位是 0000101（二进制 101）。组合起来：&lt;strong&gt;0000 0101&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;-5 怎么表示？符号位是 1，剩下 7 位同样是 0000101。组合起来：&lt;strong&gt;1000 0101&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单吧。但原码有一个很要命的问题：如果用原码直接算加法，遇到正负数混合的时候，结果是不对的。&lt;/p&gt;
&lt;p&gt;比如 5 + (-3)，按原码来：0000 0101 + 1000 0011 = 1000 1000。最高位是 1，看起来结果应该是 -8。但 5 + (-3) 应该是 2。&lt;/p&gt;
&lt;p&gt;问题出在符号位也参与了运算。我们需要一种表示法，让符号位和数值位可以统一处理、加法器和减法器能合成同一个电路。这就是补码的由来。但在讲补码之前，先看它的过渡形态：反码。&lt;/p&gt;
&lt;h2&gt;反码：把负数翻转一下&lt;/h2&gt;
&lt;p&gt;反码的规则很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正数的反码就是它自己（和原码一样）。&lt;/li&gt;
&lt;li&gt;负数的反码：符号位保持 1，其余每一位取反——0 变成 1，1 变成 0。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还是用 8 位来看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;+5 的反码：0000 0101（和原码一样）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-5 的反码：先写出 +5 的原码 0000 0101，然后符号位保持，其余全部取反。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;text
  原码: 0 0 0 0  0 1 0 1 (正数的原码)
        |←——数值——→|
  反码: 1 1 1 1  1 0 1 0 (符号位变1，其余取反)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;所以 -5 的反码是 &lt;strong&gt;1111 1010&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;来验证一下：反码的 +5(00000101) 加上 -5(11111010) 等于多少？&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;  0000 0101  (+5 的反码)
+ 1111 1010  (-5 的反码)
-----------
  1111 1111  (全是1)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;11111111 按反码还原回去，就是 -0。反码算出来的 5 + (-5) = -0。方向是对了，但有两个零（00000000 是 +0，11111111 是 -0），这就很不方便。你一个系统里有两个零，比大小又麻烦了。所以还要进一步优化：补码。&lt;/p&gt;
&lt;h2&gt;补码：负数 = 反码 + 1&lt;/h2&gt;
&lt;p&gt;补码是现在计算机里真正用的表示方法。规则也很简单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正数的补码 = 它自己（和原码、反码一样）。&lt;/li&gt;
&lt;li&gt;负数的补码 = 它的反码 + 1。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;按这个规则重算 -5 的补码：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;+5 的原码：0000 0101&lt;/li&gt;
&lt;li&gt;取反得反码：1111 1010&lt;/li&gt;
&lt;li&gt;加 1：1111 1010 + 1 = &lt;strong&gt;1111 1011&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以 -5 的补码是 1111 1011。&lt;/p&gt;
&lt;p&gt;现在用补码算 5 + (-5)：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;  0000 0101  (+5 的补码)
+ 1111 1011  (-5 的补码)
-----------
 10000 0000  (最高位的进位溢出了，8位以内就是 0000 0000)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;结果正好是 0——完美的，两个零的问题解决了。而且补码表示的范围比原码多一个数：8 位补码可以表示 -128 到 +127，而原码只能表示 -127 到 +127。&lt;/p&gt;
&lt;p&gt;补码让你能用同一个加法器算所有的加减法，不需要单独的减法电路。这就是为什么计算机都用补码。&lt;/p&gt;
&lt;h2&gt;用补码做减法&lt;/h2&gt;
&lt;p&gt;有了补码之后，减法就变成了加法：A - B = A + (-B 的补码)。&lt;/p&gt;
&lt;p&gt;计算机里没有减法器，只有一个加法器。算减法的时候，先把减数转成补码，然后直接当加法算。&lt;/p&gt;
&lt;p&gt;看几个例子。比如：7 - 3 = ?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;7 的 8 位补码：0000 0111&lt;/li&gt;
&lt;li&gt;3 的 8 位补码：0000 0011&lt;/li&gt;
&lt;li&gt;-3 的补码：把 3 取反加 1 → 1111 1101&lt;/li&gt;
&lt;li&gt;加法：0000 0111 + 1111 1101 = &lt;strong&gt;1 0000 0100&lt;/strong&gt;（溢出位丢掉，所以是 0000 0100 = 4）✓&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;再看一个：3 - 7 = ?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;3 的补码：0000 0011&lt;/li&gt;
&lt;li&gt;-7 的补码：把 7(0000 0111) 取反加 1 → 1111 1001&lt;/li&gt;
&lt;li&gt;加法：0000 0011 + 1111 1001 = &lt;strong&gt;1111 1100&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;结果最高位是 1，说明是负数。把这个负数的补码还原成原码：减 1 再取反。1111 1100 - 1 = 1111 1011，取反 = 0000 0100 = 4，所以结果是 -4。✓&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;就这样，不管你是正数加正数、正数加负数、两个负数相加，用补码都能直接用同一个加法器算对。这是补码最美的地方。&lt;/p&gt;
&lt;h2&gt;乘法：就是重复加，但加了点技巧&lt;/h2&gt;
&lt;p&gt;乘法原理上就是连加。3 × 5 就是把 5 加三次：5 + 5 + 5 = 15。但计算机不会傻到真的加几十上百次——它用手算竖式乘法的思路。&lt;/p&gt;
&lt;p&gt;二进制乘法比十进制更简单，因为每一位只能是 0 或 1：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果乘数当前位是 1 → 加上被乘数。&lt;/li&gt;
&lt;li&gt;如果乘数当前位是 0 → 不加，直接跳过。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;手算一下 13 × 6（都用 8 位无符号二进制）：13 = 0000 1101，6 = 0000 0110。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;          0000 1101  (被乘数 = 13)
      ×   0000 0110  (乘数 = 6)
-------------------
          0000 0000  (乘数第0位=0，不加)
         0000 1101   (乘数第1位=1，加上 13，左移1位)
        0000 1101    (乘数第2位=1，加上 13，左移2位)
      + 0000 0000    (乘数第3位及以后=0，不加)

      = 0100 1110  (64+8+4+2=78)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;对应十进制公式也是对的：&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[ 13 \times 6 = 13 \times (2^1 + 2^2) = 13 \times 2 + 13 \times 4 = 26 + 52 = 78 \]&lt;/div&gt;
&lt;p&gt;所以你看到没有，乘法在计算机里其实是一系列"判断某一位是否为 1，如果是就加被乘数的移位"的操作。需要加多少次？取决于乘数有多少个 1。乘数里 1 越少，乘法越快。&lt;/p&gt;
&lt;h2&gt;除法：从长除法到计算机的做法&lt;/h2&gt;
&lt;p&gt;除法是乘法的逆运算。你还记得小时候列竖式做除法吗？比如 78 ÷ 6，你会在纸上写：&lt;/p&gt;
&lt;p&gt;6 能乘以多少能刚好不超过 78？6×10=60，6×13=78——刚好。所以你得到商 13，余数 0。&lt;/p&gt;
&lt;p&gt;计算机也是这个思路，只不过它用的是二进制。而且二进制除法比十进制简单很多——因为每一位商只能是 0 或 1。你不需要像十进制那样去试"6 能乘以多少不超过 78"——你只需要试"除数的这个倍数能减吗"，能减商就是 1，不能减商就是 0。&lt;/p&gt;
&lt;p&gt;下面用 78 ÷ 6 来一步步走一遍。先统一用 8 位二进制：78 = 0100 1110，6 = 0000 0110。&lt;/p&gt;
&lt;h3&gt;第一步：把除数对齐到被除数&lt;/h3&gt;
&lt;p&gt;先找一个"合适的"位置把除数放上去——把除数左移，让它尽可能靠近被除数但不超过它。这和十进制竖式里把除数写到被除数的左边几位对齐是一个道理。&lt;/p&gt;
&lt;p&gt;6 = 0000 0110。左移 1 位（×2）就是 0000 1100 = 12，左移 2 位（×4）= 0001 1000 = 24，左移 3 位（×8）= 0011 0000 = 48，左移 4 位（×16）= 0110 0000 = 96。&lt;/p&gt;
&lt;p&gt;96 &amp;gt; 78，超出了，不行。退回到左移 3 位：48。48 &amp;lt; 78，可以。这相当于 6 × 8 = 48。&lt;/p&gt;
&lt;p&gt;好，商从最高位（bit 3 的位置）开始定。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;除数左移到 0011 0000 (6 × 8 = 48)，刚好不超过 78。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;第二步：逐位确定商&lt;/h3&gt;
&lt;p&gt;现在把除数的这个移位版本（0011 0000 = 48）和被除数（0100 1110 = 78）放在一起，从左到右逐位定商。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一位（bit 3）：48 能减吗？&lt;/strong&gt; 78 - 48 = 30 ≥ 0，可以。商 bit3 = 1，新的余数变成 30。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二位（bit 2）：除数再右移一位&lt;/strong&gt;，48 → 24（0011 0000 右移一位 = 0001 1000 = 24）。30 - 24 = 6 ≥ 0，可以减。商 bit2 = 1，余数变成 6。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三位（bit 1）：除数再右移一位&lt;/strong&gt;，24 → 12（0000 1100）。6 - 12 = -6 &amp;lt; 0，不能减。商 bit1 = 0，余数保持 6。（能减就置 1 然后减，不能就跳过，和除法恢复算法对上了。）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四位（bit 0）：除数再右移一位&lt;/strong&gt;，12 → 6（0000 0110）。6 - 6 = 0 ≥ 0，可以减。商 bit0 = 1，余数变成 0。&lt;/p&gt;
&lt;p&gt;整个过程用一张表格看得更清楚：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;被除数: 0100 1110 = 78
除数:   0000 0110 = 6

对齐:   0011 0000 = 6 × 8 = 48  (左移3位, 刚好不超过78)

bit3:  0100 1110 - 0011 0000 = 0001 1110 = 30 ≥ 0  → 商 bit3 = 1
        余数 = 30
        ↓ 除数右移1位

bit2:  0001 1110 - 0001 1000 = 0000 0110 = 6  ≥ 0  → 商 bit2 = 1
        余数 = 6
        ↓ 除数右移1位

bit1:  0000 0110 - 0000 1100 = 负数  &amp;lt; 0             → 商 bit1 = 0
        余数保持 6
        ↓ 除数右移1位

bit0:  0000 0110 - 0000 0110 = 0000 0000 = 0  ≥ 0  → 商 bit0 = 1
        余数 = 0

商 = 1101 (从高到低读出) = 8 + 4 + 0 + 1 = 13  ✓
余数 = 0  ✓
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;你看，和十进制做长除法的过程是一模一样的，只是每一步的判断——能减吗——变得特别简单，因为减得动的结果非负、减不动的结果是负，直接把符号位拿出来就定了商 bit 是 1 还是 0。不需要去猜测商应该取几，也不用乘法试商，这是二进制除法和十进制除法相比最舒服的一个地方。&lt;/p&gt;
&lt;h2&gt;最后总结&lt;/h2&gt;
&lt;p&gt;这些东西一长串地看下来，其实逻辑很简单。计算机是从三种表示数字的方式——原码、反码、补码——一步步推导下来的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原码：最直接，但正负混合加算出错。&lt;/li&gt;
&lt;li&gt;反码：通过取反解决了符号带来的部分问题，但仍然有两个 0。&lt;/li&gt;
&lt;li&gt;补码：反码加 1，把"两个 0"的问题也解决，让同一个加法器能做所有的加减运算。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有了补码，减法通过加上一个补码形式的减数变成了不需要区分的统一的加法。乘法在底层被拆解成"加数和移位"——乘数的每一位是不是 1 决定要不要加，这其实是小学竖式乘法的二进制版本。除法则是先从小到大去比较乘了一个倍数的除数和被除数的大小，把商的每一位定好，也就是长除法在计算机里的样子。&lt;/p&gt;
&lt;p&gt;回过头来看，计算机的加减乘除，全都建立在二进制的 0 和 1 上——和你列竖式的思路没什么不同，只是它只用到了 0 和 1 两种数字，比十进制的心算口诀简单得多，反而更规整。&lt;/p&gt;</content><category term="Education"/><category term="computer"/><category term="binary"/><category term="arithmetic"/><category term="beginner"/><category term="tutorial"/></entry><entry><title>用Open Code帮我搜索整理人物关系和时间线以及当年没弄明白的剧情</title><link href="https://blog.cycleuser.org/anime-bloodline-and-hero-sacrifice.html" rel="alternate"/><published>2026-07-30T00:00:00+08:00</published><updated>2026-07-30T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-30:/anime-bloodline-and-hero-sacrifice.html</id><summary type="html">&lt;p&gt;原创&lt;/p&gt;
&lt;p&gt;无论是大学生还是其他的朋友，生活不能只学习和工作，也该有些娱乐。&lt;/p&gt;
&lt;p&gt;之前关于Open Code的文章都是要么是编程写代码要么是上课学习记笔记要么是写简历找工作或者读研面试，都太严肃了。&lt;/p&gt;
&lt;p&gt;今天乐呵乐呵，这回 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;原创&lt;/p&gt;
&lt;p&gt;无论是大学生还是其他的朋友，生活不能只学习和工作，也该有些娱乐。&lt;/p&gt;
&lt;p&gt;之前关于Open Code的文章都是要么是编程写代码要么是上课学习记笔记要么是写简历找工作或者读研面试，都太严肃了。&lt;/p&gt;
&lt;p&gt;今天乐呵乐呵，这回就用Open Code完成一些剧情搜索和时间线整理的工作，来提供一点乐趣。&lt;/p&gt;
&lt;h2&gt;事情的起因&lt;/h2&gt;
&lt;p&gt;今天跟一些90后00后聊小时候看的动画片，发现他们那时候看的很多还是国外的，尤其是日本动画片。火影、海贼、鬼灭之刃，这几部都有一个共同特点：特别强调血统。谁是谁的孩子，继承了什么东西，家族的羁绊——这些东西贯穿始终。&lt;/p&gt;
&lt;p&gt;当年火影刚出来的时候就觉得这味儿很重，各种家族、各种眼、各种血脉。龙珠后来也是这样。海贼刚开始看的时候觉得还行，路飞挺底层的挺热血的。后来发现他也有很厉害的亲人，血脉里的东西慢慢都浮上来了。感觉就在跟小朋友们说一个道理：你看，厉害的人还是得有个厉害的出身。&lt;/p&gt;
&lt;p&gt;我不知道这是不是整个东亚地区儒家文化圈的影响。日韩到现在也都有非常明确的年资等级之类的东西，好像有这种说法。血统论在动画片里绕来绕去，总让人觉得是在说天龙人的故事。&lt;/p&gt;
&lt;h2&gt;什么样的人物塑造让我觉得还行&lt;/h2&gt;
&lt;p&gt;想了半天，什么样的动画让我觉得能接受。如果只说日本动画的话，一个是逮捕令。那里边对不同的人有很好的呈现——老夫少妻的家庭关系、特殊的着装和性别认同、对工作有特殊认知的人等等。人物形象挺丰富的，很多都不是当时甚至现在特别普遍的角色塑造，但它给了这些不同的角色一样的尊重。甚至里边的反派也不是脸谱化的，不是蠢的，是挺正常地呈现出来的。这种细节在当时的动画片里挺少见。&lt;/p&gt;
&lt;p&gt;另一个是高达00。那里边的主角们不是天生就高贵、血脉怎么怎么样的，更多的是来源复杂，因为认同某一个理念，聚集到了一起，用一些行为去影响世界格局，推动世界改变。最终剧场版里讲的，是经过一番牺牲和苦战之后发现，如果能够互相理解，就能减少很多痛苦。关于理解能减少冲突这件事，我觉得挺有意思，值得参考一下。&lt;/p&gt;
&lt;h2&gt;靠武力解决一切，是不是太简单了&lt;/h2&gt;
&lt;p&gt;再想到一些美国动画片。各种超级英雄系列——正义联盟、复仇者联盟，从上世纪末到本世纪初就开始的这些。模式都差不多：出现了一个很大的危机，主角团用尽智慧和武力镇压了坏人，或者是有一个或者几个英雄角色扮演拯救世界的救世主。但世界应该不只是打一架就解决所有问题那么简单吧，我觉得这个不太靠谱。&lt;/p&gt;
&lt;p&gt;有一个例外是少年正义联盟。这剧前几季的人物塑造非常复杂，没有后来那种为暗黑而暗黑的意思。它呈现了一些很具体的问题：如果一个人发现自己是个克隆体，甚至在不自知的情况下当了卧底，他要怎么面对自己；反派和正派阵营不同，但如果中间产生了感情、有了家庭，这事该怎么处理。&lt;/p&gt;
&lt;p&gt;这些让人能接触到关于生活的现实问题，而不只是超能力拯救全世界那么简单。&lt;/p&gt;
&lt;p&gt;正义联盟有一集里，Lex Luthor为了拯救地球把自己牺牲掉了。还有一集说在另一个平行宇宙里，正义联盟的人是反派，而某个原本被看作混乱角色的Joker是个非常阳光、总是开朗地解决各种问题的人，最终为了拯救大家牺牲了自己。&lt;/p&gt;
&lt;p&gt;这种牺牲的戏码那会儿总容易把我打动。但现在想想，就觉得不应该这样。我现在能意识到自己就是个普通的中老登，不应该去要求英雄们牺牲自己。如果英雄们也能跟大家一样快快乐乐的，那才是更好的。&lt;/p&gt;
&lt;p&gt;就又回到了高达00里那个想法：大家如果都能够尽量是 happy ending，这才好。互相理解，避免很多不必要的冲突，比牺牲谁要好。&lt;/p&gt;
&lt;p&gt;现在看动画片少了，但有时候想知道当年看的那些结局是什么，就会回头搜一搜。聊起这个，就随便写了这些。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;让 OpenCode 帮你整理这些&lt;/h2&gt;
&lt;p&gt;上面的这些动画片——火影、海贼、鬼灭、龙珠、逮捕令、高达00、少年正义联盟、正义联盟——如果你也想理一理这些故事里的人物关系和时间线，可以把下面这段话直接发给 OpenCode：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;帮我整理下面这些动画片的人物关系、时间线和剧情脉络。每一部单独列一个文档。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;火影忍者&lt;/strong&gt;：整理主要角色的家族血统关系（宇智波、千手、日向等），主线剧情的时间线（从鸣人小时候到疾风传再到博人传），各次忍界大战的起因和结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;海贼王&lt;/strong&gt;：整理路飞的家族关系（父亲龙、爷爷卡普、哥哥艾斯和萨博），草帽海贼团各成员加入顺序和背景故事，世界政府的组织架构（五老星、天龙人、海军）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;鬼灭之刃&lt;/strong&gt;：整理鬼杀队九柱的名称和呼吸法，灶门炭治郎家族与日之呼吸的渊源，无惨与鬼的体系。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;龙珠&lt;/strong&gt;：整理赛亚人的血统等级和变身形态（从普通到超蓝到自在极意），主角团从地球到宇宙的战斗力提升时间线。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;逮捕令&lt;/strong&gt;：整理主要角色的身份和性格特点，署长和其他配角的关系。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;机动战士高达00&lt;/strong&gt;：整理天人组织的成员和理念，三大阵营的背景，剧场版中ELS生命体的设定和结局。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;少年正义联盟&lt;/strong&gt;：整理团队成员构成（各季节有所变动），克隆体和卧底的相关角色，反派阵营和跨阵营的家庭关系。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正义联盟动画&lt;/strong&gt;：整理正义联盟成员的能力和背景，平行宇宙的设定，Lex Luthor在动画中的角色弧线。&lt;/p&gt;
&lt;p&gt;输出格式：每部动画片一个独立的 markdown 文档，包含人物关系图（用文字描述）、时间线（按时间排序）、主要剧情线索。如果有复杂的家族或阵营关系，用缩进列表来表示层级。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;把这段话发过去，OpenCode 会帮你按部就班地把每一部作品的信息搜出来、理清楚。这些故事跨度长、人物多，自己翻来翻去挺费时间的，让它干这些梳理的活正好合适。&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片" src="../images/017de4ec357783b0.png"&gt;&lt;/p&gt;
&lt;p&gt;给出要求&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片" src="../images/854c6de0c4907af1.png"&gt;&lt;/p&gt;
&lt;p&gt;给出反馈&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片" src="../images/5af5fd4c022a747a.png"&gt;&lt;/p&gt;
&lt;p&gt;进一步的进度&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片" src="../images/ec4cfcacb727040f.png"&gt;&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;关闭&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;名称已清空&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;喜欢作者其它金额&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;喜欢作者&lt;/p&gt;
&lt;p&gt;其它金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;确定&lt;/p&gt;
&lt;p&gt;返回&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;其它金额&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇教材上的标准答案不一定是真答案——从机翼升力的错误解释说起下一篇高校教师建议大学新生尽量避免赌气-学会基于判断而不是情绪来做决定&lt;/p&gt;
&lt;p&gt;关闭&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;关闭&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="anime"/><category term="culture"/><category term="reflection"/><category term="comics"/><category term="heroism"/></entry><entry><title>刚弄明白了二进制和内存硬盘，接下来聊聊操作系统和编程语言是什么</title><link href="https://blog.cycleuser.org/what-is-os-and-programming.html" rel="alternate"/><published>2026-07-29T22:00:00+08:00</published><updated>2026-07-29T22:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-29:/what-is-os-and-programming.html</id><summary type="html">&lt;p&gt;大家中学的时候大概就都知道了二进制是怎么回事，也基本能粗略理解内存和硬盘的区别。今天聊两件事：操作系统是什 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;大家中学的时候大概就都知道了二进制是怎么回事，也基本能粗略理解内存和硬盘的区别。今天聊两件事：操作系统是什么，编程语言又是什么。&lt;/p&gt;
&lt;p&gt;这两件事放在一起说，是因为它们刚好搭成了一个完整的逻辑：操作系统管着电脑的硬件，编程语言让你跟操作系统说话，告诉它你要干什么。&lt;/p&gt;
&lt;h2&gt;操作系统是个翻译官&lt;/h2&gt;
&lt;p&gt;你有一台电脑，里面有 CPU、内存、硬盘、键盘、鼠标、屏幕。这些东西怎么协同工作呢？CPU 只能执行机器指令——就是一串一串的 0 和 1。你不可能直接写 0 和 1 来让它干活。硬盘上存着文件，但谁来管这些文件放在哪个位置、怎么读怎么写？鼠标点一下屏幕上的按钮，谁来判断你点到了哪里、应该触发什么反应？&lt;/p&gt;
&lt;p&gt;这些东西都需要一个中间人。这个中间人就是操作系统。&lt;/p&gt;
&lt;p&gt;你可以把操作系统想象成一个翻译官，或者一个大管家。你（用户）说人话——点一下鼠标、敲一下键盘、拖一下文件。应用软件（比如浏览器、Word）说自己想干什么——我想打开这个文件、我想往屏幕上画一行字。底层的硬件（CPU、内存、硬盘）说你得给我 0 和 1 我才能动。&lt;/p&gt;
&lt;p&gt;操作系统就站在中间，把用户的操作翻译给软件，把软件的请求翻译给硬件，把硬件的执行结果翻译回来给你看。&lt;/p&gt;
&lt;p&gt;你往硬盘里存一个文件，你不用管这个文件存在硬盘的第几个扇区、磁头要怎么移动。你告诉操作系统"把这个文件存到桌面"，操作系统自己去管底下的事。你打开一个浏览器，你不会关心它被分配了哪一段内存、CPU 调度它跑了多少个时间片——也是操作系统在管。&lt;/p&gt;
&lt;p&gt;常见的操作系统你可能都听过：Windows、macOS、Linux、iOS、Android。它们各自有不同的设计哲学和界面风格，但干的活大同小异——管硬件、跑软件、给你一个操作界面。&lt;/p&gt;
&lt;h2&gt;编程语言是你跟电脑说话的方式&lt;/h2&gt;
&lt;p&gt;好，你有了操作系统，它能管硬件了。但你怎么让它做一件具体的事情呢？&lt;/p&gt;
&lt;p&gt;比如你想算一下 1 到 100 加起来是多少。你觉得很简单，心算也行，但你如果偏要电脑来做，你怎么告诉它？&lt;/p&gt;
&lt;p&gt;你跟一个完全不懂中文的人说"把一到一百加起来"，他听不懂。你得用一种他懂的语言。电脑也听不懂中文，它只能听懂机器指令——0 和 1。但直接写 0 和 1 太反人类了。于是人们发明了编程语言。&lt;/p&gt;
&lt;p&gt;编程语言就是你和电脑之间的一种约定好的沟通方式。它不像 0 和 1 那么底层，也不像日常语言那么模糊。它足够精确，能让计算机理解，也足够接近人的思维方式，让你能写出来。&lt;/p&gt;
&lt;p&gt;Python 是现在最流行的一种编程语言。它长什么样呢？比如你想把 1 到 100 加起来，用 Python 写就是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;就这么几行。你不需要知道 CPU 的寄存器怎么用，不需要知道内存地址怎么分配。你只需要告诉电脑你要干什么，至于怎么干、硬件怎么配合，操作系统和 Python 的解释器帮你去处理。&lt;/p&gt;
&lt;h2&gt;操作系统和编程语言搭在一起&lt;/h2&gt;
&lt;p&gt;你现在可以想象一下这个完整的链条了。&lt;/p&gt;
&lt;p&gt;你写了一段 Python 代码。Python 的解释器把你的代码翻译成操作系统能理解的系统调用。操作系统拿到这些调用，去指挥 CPU 运算、指挥内存读写、指挥硬盘存储数据。算完之后，结果从操作系统返回到 Python，Python 再返回到你的屏幕上。&lt;/p&gt;
&lt;p&gt;这个链条里，每一层都有自己的职责：硬件负责执行，操作系统负责调度和管理，编程语言负责让你表达你的想法。你只需要学最上面那一层——用编程语言把你的想法写出来就行。底下两层是工具，你不用每次都去碰它们，但知道它们在做什么会让你心里更有底。&lt;/p&gt;
&lt;h2&gt;你已经在用操作系统了&lt;/h2&gt;
&lt;p&gt;其实你在看这篇文章的时候，就已经在通过操作系统和硬件打交道了。浏览器是一个应用软件，它请求操作系统在屏幕上画字、从网络接收数据。操作系统把浏览器的请求转换成硬件操作，硬件执行完之后，结果一层一层传回来，变成你眼前的这篇文章。&lt;/p&gt;
&lt;p&gt;每一次点鼠标、每一次敲键盘、每一次打开文件，都是这套流程在运转。知道了这一点，你可能会意识到——电脑并不是一个神秘的黑箱，它只是分了很多层，每一层都有人在用，每一层都可以被理解和学习。&lt;/p&gt;
&lt;p&gt;你不需要一上来就学操作系统是怎么写的，也不需要知道 Python 是怎么实现的。你只需要知道它们各自负责什么，然后从你最方便入手的那一层开始学。&lt;/p&gt;
&lt;p&gt;编程语言就是最好入手的那一层。它离你的想法最近，离硬件最远。写两行代码，运行一下，看到结果——这个正反馈的循环很快。一旦你习惯了用代码说清楚一件事，你就会发现之前觉得复杂的东西其实都可以被拆成一件件小事，一件件地用代码表达出来。&lt;/p&gt;</content><category term="Education"/><category term="computer"/><category term="beginner"/><category term="os"/><category term="programming"/><category term="tutorial"/></entry><entry><title>高校教师建议大学新生：有事直接说，别问在吗</title><link href="https://blog.cycleuser.org/just-say-what-you-need.html" rel="alternate"/><published>2026-07-29T18:00:00+08:00</published><updated>2026-07-29T18:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-29:/just-say-what-you-need.html</id><summary type="html">&lt;p&gt;有一种消息，你收到的时候心里会咯噔一下。&lt;/p&gt;
&lt;p&gt;「在吗？」&lt;/p&gt;
&lt;p&gt;就两个字，没有上下文，没有前因后果，不知道对方要干什么。你回了「在」，对方 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;有一种消息，你收到的时候心里会咯噔一下。&lt;/p&gt;
&lt;p&gt;「在吗？」&lt;/p&gt;
&lt;p&gt;就两个字，没有上下文，没有前因后果，不知道对方要干什么。你回了「在」，对方可能已经不在屏幕前了。你如果不回，又怕有什么急事。等到你问了「什么事」，对方慢吞吞地开始说——这时候你会发现，其实根本没什么急事，他只是习惯以「在吗」开头。&lt;/p&gt;
&lt;p&gt;这种沟通方式，是对双方时间的双重消耗。&lt;/p&gt;
&lt;h2&gt;为什么「在吗」让人不舒服&lt;/h2&gt;
&lt;p&gt;发「在吗」的人，底层逻辑是希望对方马上回应自己。但没有任何人有义务马上回应你。对方可能在开会、在开车、在睡觉、在吃饭。你只是发了个消息，凭什么要求对方立刻放下手头的事来跟你在同一个频道上？&lt;/p&gt;
&lt;p&gt;把「在吗」换成你说清楚你要干什么，对方有空的时候看到了，可以直接回复你的问题。这才是尊重对方的时间，也是尊重你自己的时间。&lt;/p&gt;
&lt;p&gt;有的人半夜两点发一个「在吗」。你被消息震醒了，打开一看，就这两个字。你什么感受？你等了半天，对方又没下文了。第二天你问他什么事，他说「哦已经解决了」。&lt;/p&gt;
&lt;p&gt;这个操作，从头到尾，没有任何一个环节是有效率的。&lt;/p&gt;
&lt;h2&gt;有事说事，这是最基本的能力&lt;/h2&gt;
&lt;p&gt;找人帮忙也好、问问题也好、汇报事情也好，把三件事说清楚：什么事，跟你有什么关系，为什么找到对方。不需要写得多么得体，不需要措辞多么优美。把事情说清楚，别让人猜，这就是最大的得体。&lt;/p&gt;
&lt;p&gt;有的人问别人事情，对方不回复。他就一直等，越等越气。但你想过没有，可能是你问问题的方式让对方不知道该怎么回。你发一个「在吗」，对方回了「在」，然后你又不见了。两次下来，对方就不会再回了。&lt;/p&gt;
&lt;p&gt;还有一种情况，人家看到你的消息了，就是不回，一声不吱。这也很糟糕。问题不是非要马上解决，但你得给个信号，哪怕是「我现在在忙，晚点回你」。对面在等的人，至少知道这条消息没有被扔进虚空中。&lt;/p&gt;
&lt;h2&gt;你不尊重自己，别人怎么尊重你&lt;/h2&gt;
&lt;p&gt;前几天看到一个视频。有人跑到别人家的地里摘菜，被抓住了，说「我以为这是没人要的」，又说「大不了给你钱」。摘之前怎么不想这个？你不先问一下人家同不同意，上来先把东西拿了，被逮住了再说给钱，这不是买卖，这是不尊重人，也不尊重自己。&lt;/p&gt;
&lt;p&gt;很多这种习惯，根源上是从小没有人教。家长不教孩子尊重别人——可能家长自己就不尊重孩子。&lt;/p&gt;
&lt;p&gt;有的家长喜欢在别人面前贬损自己家小朋友。孩子考得不错，当着亲戚面说「他就是运气好」；孩子做了件好事，马上补一句「他平时可懒了」。以为这样显得自己谦虚、显得有礼貌。还有更过分的——在公共场合打骂孩子，把孩子拉到人前训斥，拿别人家的孩子对比，把孩子说得一文不值。自己觉得这是教育，其实是在毁掉孩子的自我认知。&lt;/p&gt;
&lt;p&gt;这不是谦虚。这是一种很陈旧的作派，以为贬损自己人就能在外人面前显得懂事。假的。孩子从小在这样的环境里长大，学会了这种模式——他不知道自己的时间有价值，不知道自己的感受应该被尊重，自然也不知道怎么尊重别人。&lt;/p&gt;
&lt;p&gt;还有一些所谓的客气习惯，比如饭桌上推三阻四互相撕吧抢着买单，假得不能再假。你想买单就买，不想买就别买，在那儿来回推让半天，浪费所有人的时间。孩子看在眼里，学在心里，长大以后也这样——有话不直说，有事不挑明，兜圈子、绕弯子、让人猜。&lt;/p&gt;
&lt;p&gt;到了大学，想纠正这些习惯已经要费很大劲了。你跟他说「有事直接说」，他心里过不去那个坎。他觉得不铺垫一下不礼貌，他觉得直接说会显得自己不懂事。可实际上，对方等得焦躁，心里想的是「你能不能快点说事」。&lt;/p&gt;
&lt;h2&gt;大学里没人惯着你，社会上更是&lt;/h2&gt;
&lt;p&gt;到了大学，「在吗」这种沟通方式会让你失去很多机会。问老师问题，发个「在吗」，老师可能根本不理你。找同学协作，开局就是「在吗」，对方可能隔半天才回，效率极低。有的人被这么折腾几次，直接就不再跟你沟通了。先是不提醒消息，后来可能就拉黑了。&lt;/p&gt;
&lt;p&gt;你没为对方提供任何有效信息，反而增加了对方的沟通成本。对方的时间也是时间。&lt;/p&gt;
&lt;p&gt;有个格式可以参考：什么事、跟对方什么关系、为什么找他。三句话，一分钟打完。对方看到了，直接就能处理或者回复。不怕你说得不够好，就怕你什么都不说，先丢一个「在吗」在那里让人等。&lt;/p&gt;
&lt;p&gt;沟通这件事，效率优先，得体其次。先把事说清楚，效率上来了，大家都舒服。条理清晰、单刀直入才是最得体的。&lt;/p&gt;</content><category term="Education"/><category term="education"/><category term="communication"/><category term="efficiency"/><category term="freshman"/><category term="university"/></entry><entry><title>教材上的标准答案不一定是真答案——从机翼升力的错误解释说起</title><link href="https://blog.cycleuser.org/textbook-answers-arent-always-right.html" rel="alternate"/><published>2026-07-29T00:00:00+08:00</published><updated>2026-07-29T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-29:/textbook-answers-arent-always-right.html</id><summary type="html">&lt;p&gt;中学物理课本在讲流体力学的时候，有一个经典的解释：飞机机翼上面弧度大、路程长，下面平直、路程短。空气从机翼前缘分 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;中学物理课本在讲流体力学的时候，有一个经典的解释：飞机机翼上面弧度大、路程长，下面平直、路程短。空气从机翼前缘分开，为了在后缘同时会合，上方的空气就得走得更快。根据伯努利原理，流速快的地方压力小，所以机翼上方压力小于下方，产生升力。&lt;/p&gt;
&lt;p&gt;我在中学学到的就是这个版本。大多数人也都是。&lt;/p&gt;
&lt;h2&gt;这个解释为什么流传这么广&lt;/h2&gt;
&lt;p&gt;它有一个很大的优点：说得通。有因有果，逻辑链条完整，不需要微积分，不需要流体力学方程，一个初中生就能听懂。老师在黑板上画一个弯弯的截面，标两个箭头，讲一遍，学生就记住了。&lt;/p&gt;
&lt;p&gt;考试的时候，如果你在伯努利方程的题目下面写"因为气流被机翼向下偏转所以产生升力"，判卷老师可能会给你打个叉。标准答案是"上方流速快、压力小"。&lt;/p&gt;
&lt;p&gt;我把英文原文翻译在下面，包含 NASA 原版的两个图和伯努利方程的严格表述。&lt;/p&gt;
&lt;p&gt;NASA 格伦研究中心（Glenn Research Center）有一个页面，标题就叫"不正确的翼型理论"（Incorrect Airfoil Theory / Equal Transit Theory Interactive）。下面逐条翻译。原文地址：https://www1.grc.nasa.gov/beginners-guide-to-aeronautics/foilw1/&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;错误的翼型理论&lt;/h3&gt;
&lt;p&gt;这一页描述的是流传最广的错误解释之一。这个理论可以被称为"&lt;strong&gt;更长路径&lt;/strong&gt;"理论，或者"&lt;strong&gt;等时通过&lt;/strong&gt;"（Equal Transit Time）理论。该理论声称，翼型的上表面比下表面更长。&lt;/p&gt;
&lt;p&gt;空气分子在翼型上表面要走的路比下表面更长。为了让分子在后缘会合，走翼型上方的分子必须比走下方的分子移动得更快。因为上方气流更快，根据&lt;strong&gt;伯努利方程&lt;/strong&gt;，压力更低。翼型上下表面的&lt;strong&gt;压力差&lt;/strong&gt;产生了升力。&lt;/p&gt;
&lt;p&gt;密度恒定时，面积减小则流速增大。按照这个错误理论，翼型上表面弯曲，收缩了气流。因为面积减小，上方的流速增大。然后根据伯努利方程，更高的流速产生更低的压力，翼型上表面的低压产生了升力。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/c27b6cd2b494d180.jpg"&gt;&lt;/p&gt;
&lt;p&gt;等程理论错误示意图：上方路径长所以流速快产生低压&lt;/p&gt;
&lt;h3&gt;逐条驳斥&lt;/h3&gt;
&lt;p&gt;在讨论这个理论错在哪里之前，先通过一个求解正确流场方程的模拟器来做几个实验，看看翼型周围的实际流场。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/828b17d7e18183a5.png"&gt;&lt;/p&gt;
&lt;p&gt;NASA 翼型流场模拟器截图&lt;/p&gt;
&lt;p&gt;下面用模拟器得到的信息来逐一评估"等时通过"理论的各个部分。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 升力翼型的上表面比下表面长？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这一点&lt;strong&gt;并不总是正确&lt;/strong&gt;。实验中的&lt;strong&gt;对称翼型&lt;/strong&gt;产生了大量的升力，而它的上表面和下表面长度&lt;strong&gt;完全相同&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;想一想&lt;strong&gt;纸飞机&lt;/strong&gt;。它的翼型就是一块平板——上表面和下表面长度和形状完全相同，但飞得好好的。现代有一些低阻翼型，它们的&lt;strong&gt;下表面实际上比上表面更长&lt;/strong&gt;，但仍然产生升力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这个理论也无法解释飞机为什么能倒着飞&lt;/strong&gt;——这在航展和空战中经常发生。倒飞时，更长的表面就在下面了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 空气分子在上表面走得更快，以便和下面的分子在后缘会合？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;实验 1 显示，升力翼型上表面的气流&lt;strong&gt;确实&lt;/strong&gt;比下表面快。但是实际流速比"使分子在后缘会合"所需的速度&lt;strong&gt;快得多&lt;/strong&gt;。在前缘相邻的两个分子&lt;strong&gt;并不会&lt;/strong&gt;在后缘相邻到达。&lt;/p&gt;
&lt;p&gt;"等时通过"理论预测的升力&lt;strong&gt;远小于&lt;/strong&gt;实测升力，因为它给出的速度太低了。上表面的粒子到达后缘的时间&lt;strong&gt;早于&lt;/strong&gt;下表面的粒子。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 上表面流速更快所以压力更低？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;翼型两侧的压力差产生升力。如实验 1 所示，&lt;strong&gt;这一部分理论是正确的&lt;/strong&gt;。这个理论的问题在于，它试图基于一个&lt;strong&gt;不符合物理事实的假设&lt;/strong&gt;（分子必须同时到达后缘）来计算流速。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;真正的升力到底怎么来的&lt;/h2&gt;
&lt;p&gt;NASA 驳斥了等程理论，那正确的解释是什么？两个关键词：&lt;strong&gt;气流偏转&lt;/strong&gt;和&lt;strong&gt;攻角&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;气流偏转（Flow Turning）与环量&lt;/h3&gt;
&lt;p&gt;机翼在空气中运动时，把迎面来的空气&lt;strong&gt;往下推&lt;/strong&gt;。根据牛顿第三定律，空气给机翼一个向上的反作用力——这就是升力最直观的来源。你可以把手伸出车窗，手掌稍微向上翘一点，手就被往上推，这个感觉就是气流偏转产生的升力。&lt;/p&gt;
&lt;p&gt;在流体力学里，这个效应被精确地表述为&lt;strong&gt;库塔-茹科夫斯基定理&lt;/strong&gt;（Kutta-Joukowski Theorem）：&lt;/p&gt;
&lt;p&gt;其中 (L) 是升力（单位展长），(ρ) 是空气密度，(U) 是来流速度，(Γ) 是绕翼型的&lt;strong&gt;环量&lt;/strong&gt;（circulation）。&lt;/p&gt;
&lt;p&gt;环量从哪里来？翼型后缘是尖的，气流必须平滑地离开后缘——这就是&lt;strong&gt;库塔条件&lt;/strong&gt;（Kutta condition）。这个条件在翼型周围自然产生了一个环流。均匀来流叠加上环流之后，上表面气流加速（压力降低），下表面气流减速（压力升高），宏观效果就是向上的升力。&lt;/p&gt;
&lt;p&gt;前面提到的等时通过理论，错误不在于伯努利方程本身——方程是对的，速度高压力低也是对的——错在它给流速找了一个虚构的原因（路程长）。实际的原因是环量和库塔条件。&lt;/p&gt;
&lt;h3&gt;攻角（Angle of Attack）&lt;/h3&gt;
&lt;p&gt;攻角，就是机翼弦线和来流方向之间的夹角。来流不是正对着弦线吹过来，而是有一个小小的向上倾斜的角度，这就是正攻角。&lt;/p&gt;
&lt;p&gt;对于薄翼型，升力系数和攻角的关系非常简洁：&lt;/p&gt;
&lt;p&gt;其中 (C_L) 是升力系数，(\alpha) 是攻角（弧度）。这个公式说明：&lt;strong&gt;攻角越大，升力越大&lt;/strong&gt;——直到攻角超过一个临界值，气流从翼面分离，升力急剧下降，这就是失速（stall）。&lt;/p&gt;
&lt;p&gt;总升力的完整公式是：&lt;/p&gt;
&lt;p&gt;(S) 是机翼面积。把 (CL​=2πα) 代进去，可以看到升力和速度的平方成正比，和攻角成正比。这就是为什么飞机起飞要加速、要拉机头——速度不够升力不够，攻角不够升力也不够。&lt;/p&gt;
&lt;h3&gt;回到倒飞的问题&lt;/h3&gt;
&lt;p&gt;有了攻角和环量的概念，倒飞就好理解了。飞机倒飞时，飞行员推杆让机头向上仰——相对于来流方向，机翼的攻角仍然是正的（从飞机的角度看机头朝上，气流从下方斜着撞上来）。只要有正攻角，就有环量，就有向上的升力。&lt;/p&gt;
&lt;p&gt;对称翼型在这一点上最直观：它的 (CL​-α) 曲线是对称的，正攻角正升力、负攻角负升力，全由攻角决定。所以特技飞机和战斗机普遍采用对称或接近对称的翼型——这不是因为对称翼型本身升力更大，而是因为它在正飞和倒飞之间切换时，升力特性完全可控。&lt;/p&gt;
&lt;h2&gt;标准答案不一定是对的&lt;/h2&gt;
&lt;p&gt;这件事让我想了很久的问题，不是流体力学本身，是"标准答案"这件事。&lt;/p&gt;
&lt;p&gt;标准答案在考试的时候有用。你按标准答案写，得分。你不按标准答案写，哪怕你写的更接近真实，可能扣分。这是一个系统性的问题，不怪老师，也不太怪出题人。一个简化的解释一旦写进教材，被印了很多次，被出成考题，它就变成了事实上的"正确"。再改的成本很高。&lt;/p&gt;
&lt;p&gt;但你自己心里得清楚：这个是你为了通过考试而接受的答案，不一定是这个世界的真实运行方式。两个可以同时成立。&lt;/p&gt;
&lt;h2&gt;从粗略到精细，是认知的正常路径&lt;/h2&gt;
&lt;p&gt;很多知识的最初版本都是粗糙的、简化的、甚至局部错误的。这不丢人。牛顿力学在相对论出现之前也是"标准答案"，它解释日常现象完全够用，只是到了极端条件才露馅。但牛顿没有错，他只是不够精细。&lt;/p&gt;
&lt;p&gt;机翼升力的问题不一样——等程理论不是"不够精细"，它是&lt;strong&gt;核心假设就错了&lt;/strong&gt;。这种错误本来应该在教材修订中被纠正的，但惰性太强。&lt;/p&gt;
&lt;p&gt;你可能在中学阶段没有办法改变教材，没有办法改变老师讲的版本，甚至没有办法在考试中写你认为更对的答案。但你可以做一件事：&lt;strong&gt;不要以为考完、背完就完了&lt;/strong&gt;。对一个问题保持好奇，知道它的解释在不同阶段可能有不同的版本，粗的版本后面有细的版本，细的版本后面可能还有更细的。这不是说谁错了，是认知一直在往前走。&lt;/p&gt;
&lt;h2&gt;别把标准答案当成终点&lt;/h2&gt;
&lt;p&gt;有的同学到了大学之后，发现有些东西和中学老师讲的不一样，第一反应是"那我之前学的都是错的"——然后要么全盘否定之前的积累，要么抗拒新的知识觉得大学老师胡说八道。这两种反应都不太好。&lt;/p&gt;
&lt;p&gt;更好的心态是：之前学的是一个简化的版本，它在当时的认知水平和教学条件下是合理的。现在有机会看到更精细、更接近真实的版本，这是一件好事。知识本来就不是一块死的石头，它是一层一层叠加上去的。&lt;/p&gt;
&lt;p&gt;自满的人会停在他觉得"够用了"的那个版本上。固步自封的人会拒绝任何在他看来和他已有的认知不同的东西。这两种人在大学里都不少，出了大学更多。希望大家不成为那个样子。&lt;/p&gt;
&lt;h2&gt;推荐阅读&lt;/h2&gt;
&lt;p&gt;NASA 等程理论错误专题：https://www1.grc.nasa.gov/beginners-guide-to-aeronautics/foilw1/&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇高校教师建议同学们进入大学之后适当补充各个学科的通识内容并且养成终身学习的习惯下一篇用OpenCode帮忙搜索整理动漫人物关系和时间线以及当年没弄明白的剧情&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Education"/><category term="education"/><category term="physics"/><category term="aerodynamics"/><category term="critical-thinking"/><category term="textbook"/></entry><entry><title>高校教师建议同学们进入大学之后适当补充各个学科的通识内容并且养成终身学习的习惯</title><link href="https://blog.cycleuser.org/general-education-for-university.html" rel="alternate"/><published>2026-07-28T00:00:00+08:00</published><updated>2026-07-28T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-28:/general-education-for-university.html</id><summary type="html">&lt;p&gt;最近假期在外面学习，就有一些其他院校的同学问我，说自己是学文科的，或者学工科的，到了大学之后除了专业课之外，还 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近假期在外面学习，就有一些其他院校的同学问我，说自己是学文科的，或者学工科的，到了大学之后除了专业课之外，还应该了解点别的什么。&lt;/p&gt;
&lt;p&gt;我想了想，觉得值得好好写写。&lt;/p&gt;
&lt;p&gt;不是说要每个人都变成全才，那不现实。但有些学科里最基本的几个概念，知道了和不知道，看世界的方式会不太一样。下面说的这些，是我觉得不管学什么专业，都值得了解一点的东西。&lt;/p&gt;
&lt;h2&gt;物理：从离散和连续两个角度来认识世界&lt;/h2&gt;
&lt;p&gt;不需要会解薛定谔方程。你只要知道有这么回事就行：能量有时候不是连续的，是一份一份的。光既是波又是粒子——不是有时候是波有时候是粒子，而是它同时就是这两个东西，取决于你怎么去看它。&lt;/p&gt;
&lt;p&gt;连续和离散，这两个概念在很多地方都会冒出来。数字信号和模拟信号、像素和矢量、甚至时间管理里"整块时间"和"碎片时间"，背后都有连续和离散的影子。脑子里有这个框架，以后再碰到类似的东西，理解起来就快很多。推荐赵峥教授在 B 站的物理公开课 https://search.bilibili.com/all?keyword=%E8%B5%B5%E5%B3%A5 ，讲得深入浅出，适合入门。&lt;/p&gt;
&lt;h2&gt;数学：无穷和无穷不一样，有的无穷一样大&lt;/h2&gt;
&lt;p&gt;自然数有多少个？无穷多个。有理数有多少个？无穷多个。但这两个无穷不一样大吗？答案可能出乎意料：自然数和有理数一样多。可以通过一一对应的方法证明——把分数排列成一个表格，按对角线走一圈，每一个有理数都能和一个自然数对上号。这种"能对上号"的无穷，叫可数无穷。&lt;/p&gt;
&lt;p&gt;但实数比自然数多。不管你怎么排，总有一些实数是排不进去的。这就是康托尔的对角线证明。无穷和无穷之间，是有大小的。&lt;/p&gt;
&lt;p&gt;不用记住证明细节。知道"有些无穷比另一些更大"这件事本身，就是数学带给你的一种认知冲击——很多事情不是直觉想的那样，得靠逻辑去推。推荐 G·伽莫夫的《从一到无穷大》（暴永宁译本，https://book.douban.com/subject/1102715/ ，用非常通俗的语言从数论一路讲到相对论和宇宙学。&lt;/p&gt;
&lt;h2&gt;统计：从贝叶斯到高维的直觉&lt;/h2&gt;
&lt;p&gt;统计学里有两个大的流派。频率学派认为概率就是大量重复试验的频率，贝叶斯学派认为概率是你对一件事的相信程度，可以根据新的证据不断更新。这两种思路在日常生活里都能用得上——你看到一个现象，是先假设一个模型然后根据数据调整（贝叶斯），还是等攒够了数据再下结论（频率论），处理问题的方式会很不一样。&lt;/p&gt;
&lt;p&gt;另外还有一个容易被忽略的直觉：当数据的维度变高之后，样本量增加带来的帮助往往是边际递减的。更重要的可能是特征维度——也就是你从什么角度去看这件事。维度高了之后，很多在低维空间里不成立的规律会冒出来，这就是所谓"维度的诅咒"。知道这一点，对你以后看数据分析、看 AI 预测结果的时候，会多一分清醒。推荐 Kevin Murphy 的 &lt;em&gt;Machine Learning: A Probabilistic Perspective&lt;/em&gt;（简称 MLAPP，https://probml.github.io/pml-book/book0.html）、Christopher Bishop 的 &lt;em&gt;Pattern Recognition and Machine Learning&lt;/em&gt;（简称 PRML，https://www.microsoft.com/en-us/research/publication/pattern-recognition-machine-learning/），以及李航的《统计学习方法》（https://book.douban.com/subject/33437381/），三本都是经典。&lt;/p&gt;
&lt;h2&gt;化学：结构决定一切&lt;/h2&gt;
&lt;p&gt;同样的碳原子，排成石墨就是滑溜溜的一层一层，排成金刚石就是地球上最硬的东西之一。原子没变，变的是结构。&lt;/p&gt;
&lt;p&gt;这个道理其实超出了化学。一个团队换一种组织形式效率可能完全不同，一段文字换个顺序读起来完全不一样，一个零件换个位置机器就转不起来。结构本身就带有力量，能决定性质。推荐北京大学卞江老师在 B 站上的化学视频（https://search.bilibili.com/all?keyword=%E5%8D%9E%E6%B1%9F+%E5%8C%96%E5%AD%A6）和相关公开课，讲得清晰易懂。&lt;/p&gt;
&lt;h2&gt;生物：演化的丰富和残酷&lt;/h2&gt;
&lt;p&gt;蛋白质折叠错了一个角度，可能就是致命的遗传病。所以一个小小的结构变化，可以带来如此完全不同的惊人后果。突变是一直在发生的，环境在不断选择。有些突变被淘汰了，有些留下来了，还有些被保留的原因可能仅仅是因为运气。&lt;/p&gt;
&lt;p&gt;演化不是朝着一个方向走的。对于演化更细节的话题，建议关注饶毅老师的公众号，以及《知识分子》的公众号，上面有很多可以参考的内容。&lt;/p&gt;
&lt;h2&gt;避免一种常见的自大&lt;/h2&gt;
&lt;p&gt;学了一个学科之后容易有一种错觉：觉得这个东西能解释一切。学经济学的觉得所有问题都是激励问题，学物理的觉得所有东西都能建模，学计算机的觉得所有事都能自动化。老话说手里拿着锤子看什么都是钉子，不一定谁对谁错，就是有时候容易忽视了别的学科在同一个问题上已经积累了很久的思考。&lt;/p&gt;
&lt;p&gt;有了一点通识之后，至少你知道那里还有别的锤子、别的工具。不一定非得会用，知道它们存在，就不会太笃定自己手里这个就是唯一。这样当然有好处，起码不容易因为无知而自大。&lt;/p&gt;
&lt;h2&gt;了解历史，但别成为粉丝&lt;/h2&gt;
&lt;p&gt;历史里有很多精彩的规律。权力的运作、经济的周期、技术的扩散，在长尺度上看一遍，比任何管理学教材都深刻。但不要代入。不要成为某个王朝、某个皇族、某个利益群体的忠实粉丝，觉得自己跟人家血脉相连、荣辱与共。&lt;/p&gt;
&lt;p&gt;你不是他们。你是你自己。历史的教训要学，角色不要拿。&lt;/p&gt;
&lt;p&gt;想要了解历史，要注意区分几种不同性质的东西。通俗小说是一种，论坛文学和碎片化短视频里那种指点江山是另一种——尤其是某些油腻的中年人甚至中老登在屏幕前信口开河的东西，和真正基于史料的历史研究完全是两回事。北大有一些老师，比如孙庆伟老师做考古和历史研究的，他们的东西可以参考。像厦门大学的某中天教授，他本身是研究美学的，讲历史更适合作为一种爱好者的观点来看待，不必当作严肃的史学研究。&lt;/p&gt;
&lt;p&gt;另外，外国人写的通史有时候也会有一些基础性的错误。斯塔夫里阿诺斯的《全球通史》就有不少细节上的问题。这也不奇怪，研究一个不属于自己文化背景的历史，难免有不准确的地方。反过来说，我们自己去看外国的历史，同样也要注意认知上的偏差——不要轻易陷入某种狂热的信仰，也不要轻易否定自己并不一定了解的东西。保持开放，保持谨慎。&lt;/p&gt;
&lt;p&gt;对应的，政治学、经济学也应该了解一点。不需要深入到模型和方程，知道权力怎么分配、资源怎么流动，基本的几个框架有一个印象，看新闻的时候不容易被带节奏。&lt;/p&gt;
&lt;h2&gt;多看点字，少刷点视频&lt;/h2&gt;
&lt;p&gt;短视频把刺激的阈值拉得很高。十几秒一个笑点、一个反转、一个情绪高潮。习惯了之后，看一篇长文章、读一本没那么紧张的书，可能就坐不住了。不是书不好，是脑子被惯坏了。&lt;/p&gt;
&lt;p&gt;能看原著就看原著。《史记》的原文非常精彩，《左传》也一样。文言文一开始可能有点门槛，读几篇就习惯了，比你想象的容易。现代的通俗文学也有很多好作品。重点是看字，不是看画面。文字需要你主动去想，画面直接喂给你。读得越多，想得越深。&lt;/p&gt;
&lt;p&gt;纸质书和电子书各有各的好处。电子书方便搜索、方便跑代码，纸质书翻起来快、看着不累。这倒不用太纠结，看你自己习惯什么。关键是别只看视频，更别只刷短视频。&lt;/p&gt;
&lt;h2&gt;学一门编程语言，配一个智能体&lt;/h2&gt;
&lt;p&gt;不管你是什么专业，建议学一点编程。Python 或者 JavaScript 都行。不用写得多好，能用就行。学会之后，很多需要重复处理的事情你自己就能搞定，不用每次都找人帮忙。&lt;/p&gt;
&lt;p&gt;再配一个智能体工具——比如 opencode 这种开源免费的，或者其他你喜欢的都行。有一个编程语言基础，加一个智能体辅助，能做的事情会多很多。自己动手解决问题的成就感，挺实在的。&lt;/p&gt;
&lt;h2&gt;养成记笔记的习惯&lt;/h2&gt;
&lt;p&gt;纸质也好，电子也好，甚至就是微信传输助手里打几行字都行。重点是记下来，然后回头看。&lt;/p&gt;
&lt;p&gt;每天睡前想一想今天有哪些收获，哪怕只是一点点；早上翻一下昨天的记录，看有什么遗漏。这不是什么高深的习惯，但坚持下来的话，很多零散的念头就不会丢了。灵感是非常容易跑掉的东西，随手抓一下，可能后面就会用得到。&lt;/p&gt;
&lt;h2&gt;尽量掌握一门外语&lt;/h2&gt;
&lt;p&gt;不用多精通。基本的原文阅读能力有就行，看不太懂的可以借助翻译工具。但最好能做到翻译工具不可用的时候，也能基本看懂、能回个邮件。&lt;/p&gt;
&lt;p&gt;不是为考试。是因为不同的语言，思维方式不一样。有些概念在中文里有几种说法，在英文里可能要换个角度才能表达清楚。反过来也一样。你学会了用另一种语言去组织思路，就相当于多了一套看待世界的框架。&lt;/p&gt;
&lt;p&gt;对自己专业领域的术语，能用外语简单说清楚；对自己感兴趣的东西——比如你喜欢电影、喜欢音乐、喜欢运动——也能跟人聊上几句。这不需要多高的语言水平，需要的是愿意开口。你得到的不仅是一种交流能力，更是从另一个文化视角看同一件事的机会。&lt;/p&gt;
&lt;p&gt;总之，想办法让自己更丰富，而不是更狭隘。成为更好的版本，而不要把自己锁到茧子里，变成茧房当中的一只小虫子。&lt;/p&gt;
&lt;h2&gt;学习是一辈子的事&lt;/h2&gt;
&lt;p&gt;到了大学，考试就不再是目标了。你要面对的真正的课题，是怎么成长为自己希望的那个样子。每一门课、每一本书、每一次尝试，都是往那个方向上走的一小步。&lt;/p&gt;
&lt;p&gt;世界的更新不会等你毕业。总会有新的东西冒出来，总有你不知道的东西。这不是焦虑的来源，是乐趣的来源——你想知道的时候，永远有东西可以学。&lt;/p&gt;
&lt;p&gt;这事儿跟年龄也没什么关系。三十岁、四十岁、五十岁，该学还是学。能学是一种自由，能知道自己不会的东西然后去学会，是一种很踏实的能力。&lt;/p&gt;
&lt;p&gt;开开心心的，别把自己弄太累。加油。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇高校教师建议大学生朋友能对自己诚实负责地度过大学生活下一篇教材上的标准答案不一定是真答案——从机翼升力的错误解释说起&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Education"/><category term="education"/><category term="general-education"/><category term="learning"/><category term="university"/><category term="reading"/></entry><entry><title>高校教师建议大学生朋友能对自己诚实负责地度过大学生活</title><link href="https://blog.cycleuser.org/stable-mindset-on-winning.html" rel="alternate"/><published>2026-07-27T00:00:00+08:00</published><updated>2026-07-27T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-27:/stable-mindset-on-winning.html</id><summary type="html">&lt;p&gt;吃饭的时候听到有人讨论最近上映的某个电影里的桥段，大概是说影片里面有两个人吵架，一个说我参加这项运动就是 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;吃饭的时候听到有人讨论最近上映的某个电影里的桥段，大概是说影片里面有两个人吵架，一个说我参加这项运动就是为了赢，另一个说我就是喜欢这项运动本身才来的。&lt;/p&gt;
&lt;p&gt;这让我想起大概二十多年前的事。&lt;/p&gt;
&lt;h2&gt;二十多年前的模糊记忆&lt;/h2&gt;
&lt;p&gt;《中国队勇夺世界杯》已经过去有二十年了吧？那大概体现了当时部分民众朴素的美好愿望。&lt;/p&gt;
&lt;p&gt;那时候我还很年轻，中国队冲击世界杯，好像当时的目标最后也没实现。但这不重要。记得是那个时候电视上有个退钱哥，非常投入，直播也好、评论也好，看得出来是真心热爱足球这件事。球队让他失望了很多次，他还是看，还是关注。前一段时间好像没怎么看到他消息了，不知道怎么回事。但他一直挺热爱这件事的。&lt;/p&gt;
&lt;p&gt;后来我就想，人和人不太一样。有的人大概是纯粹的热爱，比如退钱哥面对让他失望多次的国足，似乎依然喜欢足球。&lt;/p&gt;
&lt;p&gt;而有的人只是为了赢。足球能赢，他就喜欢足球。足球不能赢了，他就去喜欢能赢的。比如排球能赢就喜欢排球。排球不行了，乒乓球能赢就喜欢乒乓球。乒乓球也不行了，羽毛球能赢就喜欢羽毛球。人总能找到一个相对容易赢的球来喜欢。目的很明显——他只是喜欢赢。至于通过什么赢，不重要。&lt;/p&gt;
&lt;p&gt;他最开始可能是希望自己赢的。但自己上去踢足球、打排球、打乒乓球、打羽毛球，都不太行。自己赢不了的时候，如果有一个人跟他有某种联系——同一个文化群体、说同样语言、同样国籍——总之能扯上关系，他就能产生一种归属感。那个人赢了，他跟着高兴。那个人输了，他骂。&lt;/p&gt;
&lt;h2&gt;十几年前的深刻印象&lt;/h2&gt;
&lt;p&gt;十多年前，山里发水，我们困在某个地方好几天。正好赶上外面谣传沈阳全运会期间有什么全城环保检查，附近饭店都关了。住在老乡家，老乡好心说能给我们做吃的，我们出去买了点面买了点肉，麻烦人家给包饺子还是做面条来着，记不太清了。&lt;/p&gt;
&lt;p&gt;那会儿正好赶上一个挺大的比赛在播，奥运会还是全运会来着。有位以跨栏取得突破、广受关注的选手，跟腱的旧伤犯了，跟腱断裂，好像是单腿蹦着完成了比赛。我当时觉得挺不容易的，我韧带就受过伤，知道特别疼，而他韧带断了肯定更疼，他能单腿蹦也要完成，挺让我佩服的。&lt;/p&gt;
&lt;p&gt;结果旁边看电视的几位前辈——学历很高、职称也很高——当场就破口大骂，说这人是XX，怎么怎么着的，说这是民族罪人之类的话。我当时心里不是滋味。&lt;/p&gt;
&lt;p&gt;我就想，你们大家之前支持他，是因为热爱这项运动吗？是因为钦佩运动员的拼搏吗？还是只是因为他让你感受到了一个共同群体的归属感，他能替代你去赢？&lt;/p&gt;
&lt;p&gt;他赢了你就支持他。他不赢，你就把他骂得一文不值。即使他已经那么惨了，跟腱都断了。&lt;/p&gt;
&lt;h2&gt;替代式的赢&lt;/h2&gt;
&lt;p&gt;希望大家不要这样。希望你能分清楚，你支持一个人或者一件事，是因为发自内心真的有热爱，还是因为它能替你赢。&lt;/p&gt;
&lt;p&gt;他能做到你自己做不到的事——赢。你就把感情寄托在他身上，他赢了你跟着高兴，好像自己也赢了。这是一种替代。&lt;/p&gt;
&lt;p&gt;某某战队得了什么冠军，你熬到半夜看直播。挂科还是挂科，直播只是给平台赚了流量钱，消耗的是你自己的健康。你支持的球队或者选手并不会因为你看直播而踢得更好。&lt;/p&gt;
&lt;p&gt;这种赢来得简单，来得廉价。比自己亲自去拼、去争取赢，要容易太多了。你只要投入一下感情，有一个共鸣，就足够有参与感、有归属感了。&lt;/p&gt;
&lt;h2&gt;读了大学要开始对自己诚实&lt;/h2&gt;
&lt;p&gt;现在大学生不稀奇了。有人调侃说硕士满街走、博士多如狗——我自己碰巧混了个博士，博士当中我是混得很差的，那我应该就正好是那个多如狗的。&lt;/p&gt;
&lt;p&gt;虽然只是读书的年头多了点，可也好歹接受了这么多年高等教育，应该在知识和认知上都有些变化才对。&lt;/p&gt;
&lt;p&gt;不只是专业细节上比以前知道得多，也应该是非判断上比以前清楚，对自己思想和行为多少有些反省。&lt;/p&gt;
&lt;p&gt;有的同学上课不听课，拿着手机打游戏。下课不学习，刷短视频。食堂都懒得去，找人带饭。&lt;/p&gt;
&lt;p&gt;以前是麻烦寝室同学，甚至有开玩笑说拜为义父让人帮带饭的。现在花几块钱就有送餐到寝室的服务。这倒没什么，挺方便的。&lt;/p&gt;
&lt;p&gt;但如果连思考和判断，连想一些简单的事情都自己不想了，什么东西都拿去问工具，甚至让工具替自己做决定，或者看网红怎么说自己就怎么弄，那就可惜了。&lt;/p&gt;
&lt;p&gt;读了一回大学，如果依然是靠最原始的本能支配自己，那不应该。&lt;/p&gt;
&lt;p&gt;就算专业课不愿意学，可以学点自己感兴趣的。&lt;/p&gt;
&lt;p&gt;什么感兴趣的都找不到，能在完成学业的基础上锻炼个好身体也行。&lt;/p&gt;
&lt;p&gt;开开心心、身心健康，拿到学位证毕业证，然后面对下个阶段的挑战，这也可以。&lt;/p&gt;
&lt;p&gt;千万不要动不动陷入极端情绪，成为某些偶像团体的狂热粉丝，牺牲大量时间精力甚至健康。&lt;/p&gt;
&lt;p&gt;你得诚实地考虑下面的问题：你沉迷的游戏或者运动、喜欢的那个文艺作品，是真的喜欢它本身，还是只需要一个归属感、只需要一个东西让你体验到赢的感觉？你是不是在躲避什么？这种躲避会一直拯救你么？&lt;/p&gt;
&lt;p&gt;你参加竞赛，是因为对这件事本身感兴趣，还是为了赢，为了能够得到奖学金或者保研上的加成？&lt;/p&gt;
&lt;p&gt;其实都没问题的，你有啥想法都随你，这都是人自己的自由意志了。&lt;/p&gt;
&lt;p&gt;像是在《马丁·伊登》里面，主人公的作品早就写出来了，可是周围的人对他的评价并不高；等他的作品突然大卖赚了很多钱名利双收了，周围那些原本对他冷漠的人又都围上来各种恭维和吹捧。他突然发现自己原来多了很多「真心朋友」，而并不是像以前那样孤独。而这本身才让他认识到这是最大的孤独。&lt;/p&gt;
&lt;p&gt;毕竟人类社会目前是成果导向的，你的过程不一定会被人重视，但当你的成果出来了之后会发现突然有很多人恭喜你、为你高兴，甚至和你一道分享荣耀。&lt;/p&gt;
&lt;p&gt;当然你没必要对所有人都把所有真实想法说出来，只是尽量说出来的就都是真实想法就好了。&lt;/p&gt;
&lt;p&gt;最后，希望你对自己诚实，也希望所有人都对自己诚实。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/17919ccc47d77916.jpg"&gt;&lt;/p&gt;
&lt;p&gt;配图与本文无任何关系&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇OpenCode进阶探索-利用模型进行文献情报检索但不要让模型替代人判断下一篇高校教师建议同学们进入大学之后适当补充各个学科的通识内容并且养成终身学习的习惯&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Education"/><category term="education"/><category term="mindset"/><category term="sports"/><category term="university"/><category term="reflection"/></entry><entry><title>OpenCode进阶探索-利用模型进行文献情报检索但不要让模型替代人判断</title><link href="https://blog.cycleuser.org/skill-for-learning.html" rel="alternate"/><published>2026-07-26T00:00:00+08:00</published><updated>2026-07-26T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-26:/skill-for-learning.html</id><summary type="html">&lt;p&gt;前面写了一篇怎么从零创作技能的文，这回再写一个新技能的构思过程：帮人学习的技能。&lt;/p&gt;
&lt;p&gt;学习这件事的第一步，其实不是 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;前面写了一篇怎么从零创作技能的文，这回再写一个新技能的构思过程：帮人学习的技能。&lt;/p&gt;
&lt;p&gt;学习这件事的第一步，其实不是直接盲目就开始学，是找到靠谱的东西来学。信息源不靠谱，后面全是白费。这不是什么高深的道理，但很多人着急的时候往往跳过这一步。&lt;/p&gt;
&lt;h2&gt;从博士论文入手&lt;/h2&gt;
&lt;p&gt;博士学位论文有一个好处：要过盲审。不是谁都能随便写一篇就毕业的。这就给了它一个基本的质量底线。另一个好处是博士论文通常有章是导论性质的，把某个领域的来龙去脉讲一遍，比教材新，比期刊深入浅出。要了解一个自己不熟的领域，从一篇好的博士论文看起，效率往往很高。&lt;/p&gt;
&lt;p&gt;但博士论文不全免费。有的数据库可以免费下，有的只能看摘要。如果让模型来帮忙，它可以去搜哪些数据库是免费的、哪些可以通过学校图书馆访问、哪些有开放获取的政策。这比自己一个一个试快得多。&lt;/p&gt;
&lt;h2&gt;各学科的专业站点&lt;/h2&gt;
&lt;p&gt;搜索引擎搜出来的东西良莠不齐。百科类网站谁都能编辑，有的是广告，有的是粉丝维护的。不是说全不能用，是得留个心眼。&lt;/p&gt;
&lt;p&gt;但每个学科总有一些大家默认靠谱的地方。计算机的 Stack Overflow、医学的丁香园、物理的 arXiv，这些站点在各自圈子里是经过时间检验的。让模型做一个列表，把不同领域对应的专业站点整理出来，再根据你具体要查的东西去定向搜索，比泛泛地搜好很多。&lt;/p&gt;
&lt;h2&gt;引用必须能验证&lt;/h2&gt;
&lt;p&gt;用模型查东西最怕一件事：它编了一个看上去很真的引用，你去查，根本不存在。这在学术上是非常严重的问题。有人因为这个被取消了学位——这不是玩笑。&lt;/p&gt;
&lt;p&gt;所以这个技能里有一条死要求：引用的每一个地方，都必须有可点击的超链接。而且要去验证那个链接是不是真的能打开，打开后的内容和引用的是不是一致。做完之后，还要脱离前面的上下文，单独把参考文献列表和正文中的引用位置核对一遍。宁愿少引几条，也不要混进去一条假的。&lt;/p&gt;
&lt;p&gt;自己不熟悉的领域要查东西，让模型来检索是好的，让它来替你做判断是不好的。&lt;/p&gt;
&lt;h2&gt;为什么不能完全交给模型&lt;/h2&gt;
&lt;p&gt;有个现象得说一下。现在的模型是概率生成，它偏向于给出最常见、最中庸的答案。这在很多日常场景下是优点，但在需要前沿、需要严谨的专业领域就可能是问题。最高概率的往往只是最平庸的老生常谈。&lt;/p&gt;
&lt;p&gt;有的人，包括一些老师，习惯什么事都拿模型来问，然后让模型帮自己做决定。这样久了容易产生一种心态，觉得模型说的都对。但到了你自己熟悉的专业领域，你一看就会发现问题——很多地方不靠谱，甚至干脆是错的。你熟悉的领域能看出来，那不熟悉的呢。&lt;/p&gt;
&lt;p&gt;以前有一次和一个师兄聊这个事。他坚持用某个模型来给自己提供医疗和健康方面的建议。我劝过他，说不太靠谱。他说有很多什么专家也在这么用，所以可靠。后来有研究团队发了文章，指出多模态模型在诊断场景下存在一个效应：它根本不认真看图，而是直接输出迎合评分标准的答案。你说它答对了，其实是它在做应试，不是真的在看图分析。我把文章发给他，他还是不改变看法。&lt;/p&gt;
&lt;p&gt;这件事让我想了很久。不是想模型的问题，是想人为什么在一些事情上会那么难以改变。&lt;/p&gt;
&lt;h2&gt;认知茧房和永远对的人&lt;/h2&gt;
&lt;p&gt;有一种情况，我观察过不少次。有的人从来不认为自己需要修正任何看法。支撑他自信的东西，不是对事实的核对，而是他有一套自洽的叙事能解释他看到的东西。只要说得通，就够了。至于事实到底是什么，他没有兴趣去核对。&lt;/p&gt;
&lt;p&gt;这不是年龄的问题。有的人年纪轻轻就已经是这种状态了，反过来有的老人保持着旺盛的好奇心和纠正自己的勇气。区别不在年龄，在是否愿意接受自己可能是错的。&lt;/p&gt;
&lt;p&gt;遇到这样的人，没必要去辩论。他在自己的叙事里是永远赢的——逻辑自洽、经验丰富、引经据典，你怎么可能辩得过他。但辩论赢了又怎样呢，和自己以为的对错没有关系。&lt;/p&gt;
&lt;p&gt;人的时间是有限的。心跳有数，清醒的时刻有限，每一次分心都是不可逆的消耗。把时间花在自己关心的事情上，花在值得深入的东西上，比什么都强。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;怎么把这个做成技能&lt;/h2&gt;
&lt;p&gt;和上一篇视频萃取的思路一样，把刚才说的这些整理成一段话，直接喂给 opencode。下面是我准备好的提示词样本——大家也可以用自己的风格来写，不必照着我的格式来。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;要帮我创建一个技能，中文名叫学术导览，英文名叫 AcademicGuide，用来帮人入门一个新的学科领域。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步，找博士论文。&lt;/strong&gt; 搜索和这个领域相关的博士论文，优先找近三年内的。整理出论文标题、作者、学校、年份、下载链接。标注哪些是免费可获取的、哪些需要机构访问、哪些完全封闭。如果是需要机构访问的，也查一下有没有作者发的预印本或者开放获取版本。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步，整理专业站点。&lt;/strong&gt; 针对这个学科，搜索领域内公认靠谱的专业网站、论坛、数据库。不要用泛泛的百科类站点，要找圈子里公认的。比如计算机领域的 Stack Overflow、GitHub，数学和物理的 arXiv、MathOverflow，医学的 PubMed、UpToDate。把地址、简介、更新频率列一个表出来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步，搜索和记录。&lt;/strong&gt; 每一次搜索的结果都必须保留原始记录。搜到了什么、从哪个网站来的、什么时候搜的，全部记录下来。最终输出的时候，每一条引用都要有一个可点击验证的超链接，还有一个完整的参考文献列表。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四步，验证引用。&lt;/strong&gt; 这步最重要。把参考文献列表单独拿出来，脱离前文的语境，逐条打开链接，确认链接能访问、内容和引用的说法一致。没有经过验证的引用一律不能用。引用格式要规范。&lt;/p&gt;
&lt;p&gt;后续如果要使用这个技能，直接通过 &lt;code&gt;/学术导览 &amp;lt;领域名称&amp;gt;&lt;/code&gt; 来调用。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;上面这段话给了模型它需要的所有约束：信息源的选择标准、验证引用的硬性要求、输出格式的规范。自己先想清楚每一步要做什么、做到什么程度才算合格，再把这段话说给 opencode，它就能帮你做出一个可以反复用的技能来。关键是先想清楚再开口，想不清楚的不要交给它替你想。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/5073789210d8464c.png"&gt;&lt;/p&gt;
&lt;p&gt;给出提示词让 opencode 创造技能&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/e7a1cf0c468974e5.png"&gt;&lt;/p&gt;
&lt;p&gt;技能初步创作完成&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/0c795da8c6148ef5.png"&gt;&lt;/p&gt;
&lt;p&gt;制作成功&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/359ee7259d3ddcf1.png"&gt;&lt;/p&gt;
&lt;p&gt;案例测试&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/8f5e7effae403f7a.png"&gt;&lt;/p&gt;
&lt;p&gt;结果参考&lt;/p&gt;
&lt;p&gt;说回到技能本身。这个技能的思路并不复杂：找一个方向，搜博士论文和专业站点，把信息源做成列表，每一条都验证引用。模型负责做检索和整理这些费时间的事，人负责判断哪些靠谱、哪些需要再确认、哪些方向值得往下走。分工清楚，各干各擅长的。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇大学新生可能遇到的各种常见缩写速查简介下一篇高校教师建议大学生朋友能对自己诚实负责地度过大学生活&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="skill"/><category term="research"/><category term="learning"/><category term="academic"/></entry><entry><title>高兴就好，别让这个那个把你框死</title><link href="https://blog.cycleuser.org/dont-let-knowledge-become-cage.html" rel="alternate"/><published>2026-07-25T20:00:00+08:00</published><updated>2026-07-25T20:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-25:/dont-let-knowledge-become-cage.html</id><summary type="html">&lt;p&gt;古代有先哲说人应该有一种赤子之心。看到小朋友天真烂漫的样子，经过深刻的思辨推导出人性本善，这种想法值得尊重 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;古代有先哲说人应该有一种赤子之心。看到小朋友天真烂漫的样子，经过深刻的思辨推导出人性本善，这种想法值得尊重。&lt;/p&gt;
&lt;p&gt;也有人看到小朋友抢东西、哭闹、发脾气，就说人性本恶。我家老二就经常抢他哥哥的吃的，有时候挠他、咬他、抓他头发。但一个一两岁的小朋友做这些事，不太见得是有什么恶念，就是一种本能。小动物们也互相咬着闹着玩，抢东西，这都是很正常的。&lt;/p&gt;
&lt;p&gt;从几个片段去推导整个人性的善恶，大概都不太靠谱。&lt;/p&gt;
&lt;h2&gt;执着于有，执着于无&lt;/h2&gt;
&lt;p&gt;世界上有两种常见的状态。一种人觉得已经有的东西就是不会变的。现状很稳固、很神圣，自己没有办法去想象它会有变化，甚至不认为它可能变化。这种人执着于"有"。&lt;/p&gt;
&lt;p&gt;这些年世界的变化够多了。投资市场也好、产品价格也好、行业的兴衰也好，你曾经深信不疑的东西，可能只是在一个瞬间就变了。觉得已经有的东西绝对不会被改变，这个想法本身就不太对。&lt;/p&gt;
&lt;p&gt;另一种人过于悲观，执着于"无"。觉得什么东西到最后都没有意义——往生去也，什么都留不下。有的是经过深思熟虑的哲学判断，有的可能就是自己受挫了之后不开心，随口那么一说。&lt;/p&gt;
&lt;p&gt;其实不管是执着于有还是执着于无，这些人往往未必是自己真的那么想的。&lt;/p&gt;
&lt;h2&gt;中学时候的一件小事&lt;/h2&gt;
&lt;p&gt;我上中学那会儿，初中二年级确实很中二。很多同学就呆呆地做一些自己以为很帅气很有个性、其实挺傻的事。&lt;/p&gt;
&lt;p&gt;当时有一个同学每天都要把头发弄上去，扭成一个像懒羊羊一样的发型。那时候还没有懒羊羊这个动画片呢——我不理解为啥要这样。他说这个感觉很有个性。但他每天下课都得弄点啫喱水把头发弄上去，挺耽误时间的，而且那东西味道挺大。我自己是过敏性鼻炎，闻了就难受。说实话我挺讨厌这个同学的。&lt;/p&gt;
&lt;p&gt;后来想想，不应该这么轻易去讨厌一个人。对他来说，这可能是很重要的事，是他的一种执念。&lt;/p&gt;
&lt;p&gt;这事跟我举过的另一个例子有点像。有的人爱吃辣椒，就觉得很多食物都应该放辣椒。有的人完全不喜欢吃，就认为根本不应该有辣椒这种东西。两个都太极端了。吃辣椒的人自己吃自己的，别往不吃的人碗里加就行。不吃的人自己不吃就行了，也犯不着管别人。&lt;/p&gt;
&lt;p&gt;矛盾不算很重的还有一个例子：抽烟。经常有人在公共场合抽烟，熏着别人，不喜欢烟味的人就很反感。不同的人有不同的平衡。有的人吸烟，但从来不在有旁人的地方吸，工作场所从来不碰。有的人不吸烟，但见到别人吸烟也不一定吱声。我小时候过敏，见到吸烟的同学就躲着走。如果非要跑我旁边吸烟，我就肢体说服教育他。后来发现人家要是人多，我也打不过，还好过几年大家都毕业了，也就忍过去了。一直到本科还有在公共场所吸烟的，甚至读了研也还有——专门跑到你宿舍里来抽烟。这时候得让他知道这是个底线。如果真的完全无法接受，找辅导员申请调解。碰巧我当年那个辅导员就比较那个——把我们几个同学的学生证收上去弄磁条刷新，后来就再也没还我，还不承认。&lt;/p&gt;
&lt;p&gt;不管怎么着，别激化矛盾，尽量想办法化解开。&lt;/p&gt;
&lt;h2&gt;存在即合理——这话是错的&lt;/h2&gt;
&lt;p&gt;执着于有的人，总觉得自己无力改变什么，又觉得已经有的东西无比神圣，想去捍卫点什么。执着于无的人，总觉得自己做什么都没有意义，动不动就失去动力，或者总觉得别人做什么没有意义，喜欢打击别人。&lt;/p&gt;
&lt;p&gt;"存在即合理"这句话，大概是很早以前有人翻译得不太准确，后来被一些人拿来四处引用，慢慢就变了味。满清政府当年那些不平等条约都是存在的，能说它合理吗？不能说因为它存在就有合理性。存在的东西有它的现实意义与之对应，但不等于就是合理的。&lt;/p&gt;
&lt;p&gt;类似的话还有小时候老师经常说的："他为什么欺负你啊，他怎么不欺负别人啊？"其实那个同学可能别人他也欺负，只不过这次欺负到你了，你来反抗，老师就认为你俩都有问题，各打五十大板。然后来一句"一个巴掌拍不响"——其实这时候我就想把一巴掌拍他脸上，问他一个巴掌响不响。当然了，那会儿我小，打不过他。后来长大了，想明白了，也不打人了。&lt;/p&gt;
&lt;h2&gt;"无"也能变成一种束缚&lt;/h2&gt;
&lt;p&gt;执念不只是"有"。那些觉得自己做什么都没有意义、总觉得自己很挫败、总觉得一切最终都会消散——这些情绪也是一种束缚。它除了让你悲观一点儿之外，没什么别的帮助。既然没什么帮助，它也不实用，也没什么实际价值。有时候或许能让你冷静一点儿，但大多数时候用处不大。&lt;/p&gt;
&lt;p&gt;那不如就听听相声，看看喜剧，有什么事能让自己开心起来。哪怕吃个冒菜，吃个麻辣烫，能让自己开心的事儿就去做，让自己不开心的事儿尽量想办法过去。&lt;/p&gt;
&lt;p&gt;并不是说最终的结果是无、一切就都成了空虚的没有意义的。正好相反：如果不管怎么着都要走向一个旅途的终点，那这个旅途就更应该珍惜一下，好好看看路上有没有什么好玩的。&lt;/p&gt;
&lt;p&gt;这当然是一个非常简单的比喻。黄色的森林里分开了两条路，其实选哪条都行，不用非得是更少人去的那个。有的人可能觉得选更少人去的让自己显得个性，但这种选择反而就挺没个性的。你真怎么想的、真怎么选的，就怎么选就行了，别考虑人多人少。如果大家都爱听一首歌，你也爱听，你觉得不好意思，这其实没必要。但有的小朋友可能会这样——或者如果大家都不爱听，然后你就偏说自己爱听，这其实也是很做作的一件事。&lt;/p&gt;
&lt;h2&gt;不要让你已经学会的东西限制你&lt;/h2&gt;
&lt;p&gt;说这么多，不是为了否定"有"，也不是为了否定"无"。人类社会有无相生，不要执着于具体的某一个状态、某一个人、某一件事。也别让"无"把自己给束缚住。&lt;/p&gt;
&lt;p&gt;这个不执着，不是说不要在意，而是不要让你所掌握的、所接触到的东西，成了你的阻碍。&lt;/p&gt;
&lt;p&gt;就像学会炒菜知道用火烤着吃，后面就一直只用这一样，不学煮，不学炒，不学高压锅，不学其他做法——这就是让自己已经所学的东西成了自己的限制。&lt;/p&gt;
&lt;p&gt;戚继光在《绩效新书》里有一句话：&lt;strong&gt;心有外物而不化，自恃旧习以为佳&lt;/strong&gt;。说的是有些士兵以前可能学过一点武术，心里有了这个之前学的东西，就不太愿意接受戚继光军队里的训练方法。他认为自己学的旧的就是好的，新的不学。戚继光说这样的士兵是最不可带的——完全没有改进的机会了。一张白纸，你还可以画点妥当的画，不同风格也可以选、可以改。如果上面已经画了很多，画得又不一定好，但又画了很多、成了沉没成本，对他来说真的很难改变。&lt;/p&gt;
&lt;p&gt;我希望大家尽量不执着——不变得僵硬、保守和固化。不是说不要努力。&lt;/p&gt;
&lt;p&gt;我自个儿就换过很多专业，学过很多乱七八糟的东西。今天还遇到一个十八九岁的小朋友问我，你学这些干嘛呀。我说万一我现在干的这些事儿以后活不下去了，我可能再找一个活法。另外有一个没太好意思跟他说的：我觉得这些事儿很有趣。我做所有的事儿最重要的一个原因，就是觉得这玩意儿好玩。如果觉得没意思、很痛苦，我就不这么做了。&lt;/p&gt;
&lt;p&gt;不管是学习还是工作，尽量别让自己痛苦。如果感到痛苦，要不然薪酬足够覆盖掉痛苦，但那样也不一定很开心。要不然就是有机会从中提升自己。在现在这种状况下，不是每个人都能够轻易地说走就走，毕竟很多人有家有口、上有老下有小。&lt;/p&gt;
&lt;p&gt;不管怎么着，都应该让自己开心一点。开心比什么都重要。人开心了、有奔头了，后面遇到什么事就见招拆招。天天特压抑，一点乐趣都没有，那就太可惜了，也太糟糕了。&lt;/p&gt;
&lt;p&gt;希望大家开心，别太执着。&lt;/p&gt;</content><category term="Story"/><category term="philosophy"/><category term="life"/><category term="learning"/><category term="mindset"/><category term="reflection"/></entry><entry><title>大学新生可能遇到的各种常见缩写速查简介</title><link href="https://blog.cycleuser.org/freshman-abbreviations.html" rel="alternate"/><published>2026-07-25T00:00:00+08:00</published><updated>2026-07-25T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-25:/freshman-abbreviations.html</id><summary type="html">&lt;p&gt;先说清楚：这篇文章&lt;strong&gt;不是提倡用英文缩写&lt;/strong&gt;。恰恰相反。&lt;/p&gt;
&lt;p&gt;钱钟书有个牙缝韭菜的典故——说话的时候牙齿上沾着一片韭菜，自己不 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;先说清楚：这篇文章&lt;strong&gt;不是提倡用英文缩写&lt;/strong&gt;。恰恰相反。&lt;/p&gt;
&lt;p&gt;钱钟书有个牙缝韭菜的典故——说话的时候牙齿上沾着一片韭菜，自己不知道，别人看着难受。中文里夹英文缩写也是这个道理。你说了一堆，听的人还得逐个解码，听得很累。能不混用就不混用，该说中文说中文。&lt;/p&gt;
&lt;p&gt;但问题是你拦不住别人用。老师随口就说「这个 DDL 之前交上来」，同学说「你是不是被 PUA 了」，群里讨论买电脑全是「SSD 要 1T 的」「内存 16G 够不够」。你不认识这些缩写，就真听不懂，不是你的问题，是信息被挡住了。&lt;/p&gt;
&lt;p&gt;所以这里把大学里常见又容易让人懵住的缩写按领域列出来。不是为了让你学着用，是为了你碰到的时候能一眼认出是什么意思。&lt;/p&gt;
&lt;h2&gt;校园日常&lt;/h2&gt;
&lt;p&gt;这几个是大学生活里出现频率最高的，先记这几个就行。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AKA&lt;/td&gt;
&lt;td&gt;Also Known As&lt;/td&gt;
&lt;td&gt;又名、也就是&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CEO / CFO / CTO&lt;/td&gt;
&lt;td&gt;Chief Executive / Financial / Technology Officer&lt;/td&gt;
&lt;td&gt;首席执行官 / 首席财务官 / 首席技术官。C 打头的基本都是最高层&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CIO&lt;/td&gt;
&lt;td&gt;Chief Information Officer&lt;/td&gt;
&lt;td&gt;首席信息官。管企业信息化建设的高级职位。注意甄别，有的机构可能会以 CIO 为名头行骗，对不熟悉的邀约保持警惕&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DDL&lt;/td&gt;
&lt;td&gt;Deadline&lt;/td&gt;
&lt;td&gt;截止日期。大学生最怕的词之一，作业、论文、申报材料都有 DDL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FYI&lt;/td&gt;
&lt;td&gt;For Your Information&lt;/td&gt;
&lt;td&gt;供你参考。邮件、消息里转发信息时常带的前缀&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HR&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;人力资源。管招聘、薪资、考核的部门&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KOL&lt;/td&gt;
&lt;td&gt;Key Opinion Leader&lt;/td&gt;
&lt;td&gt;关键意见领袖。就是网红、大 V、某个领域里说话有分量的人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KPI&lt;/td&gt;
&lt;td&gt;Key Performance Indicator&lt;/td&gt;
&lt;td&gt;关键绩效指标。衡量你做得好不好的数字指标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OKR&lt;/td&gt;
&lt;td&gt;Objectives and Key Results&lt;/td&gt;
&lt;td&gt;目标与关键结果。一种定目标和追踪执行的管理方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PR&lt;/td&gt;
&lt;td&gt;Public Relations&lt;/td&gt;
&lt;td&gt;公共关系。管对外形象和媒体沟通。注意 GitHub 上 PR 是 Pull Request（合并请求），两个意思完全不同&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUA&lt;/td&gt;
&lt;td&gt;Pick-Up Artist&lt;/td&gt;
&lt;td&gt;原指以不良手段搭讪操控他人。现在多指精神操控、持续打压让人自我怀疑的行为。被导师 PUA、被老板 PUA，就是说被人持续贬低打压&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;学业相关&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;arXiv&lt;/td&gt;
&lt;td&gt;Archive（χ 是希腊字母 chi）&lt;/td&gt;
&lt;td&gt;预印本论文网站。物理、数学、计算机等学科发正式期刊之前先把论文挂上去，全世界都能免费看。读论文、跟踪前沿研究必知的站点&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CET-4 / CET-6&lt;/td&gt;
&lt;td&gt;College English Test Band 4 / 6&lt;/td&gt;
&lt;td&gt;大学英语四六级。国内本科最基本的英语水平证明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSSCI&lt;/td&gt;
&lt;td&gt;Chinese Social Sciences Citation Index&lt;/td&gt;
&lt;td&gt;中文社会科学引文索引，简称「C 刊」。文科导师常挂在嘴边的就是它&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DOI&lt;/td&gt;
&lt;td&gt;Digital Object Identifier&lt;/td&gt;
&lt;td&gt;数字对象标识符。论文的唯一编号，有了它就能永久定位到一篇文章&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EI&lt;/td&gt;
&lt;td&gt;Engineering Index&lt;/td&gt;
&lt;td&gt;工程索引。工科论文的重要收录库，比 SCI 覆盖面更偏工程应用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPA&lt;/td&gt;
&lt;td&gt;Grade Point Average&lt;/td&gt;
&lt;td&gt;平均绩点。大学成绩的综合评分，满分通常是 4.0。一般 90-100 分对应 4.0，80-89 对应 3.0，70-79 对应 2.0，60-69 对应 1.0，不及格是 0。各校微调不一样，但大致是这个比例。申请研究生或者找工作会看。不过，如果你有很好的学术文章、扎实可靠的软件作品、或者竞赛拿了省一等奖乃至国家级三等奖以上，这些东西都比 GPA 更厉害&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GRE&lt;/td&gt;
&lt;td&gt;Graduate Record Examination&lt;/td&gt;
&lt;td&gt;美国研究生入学考试。去北美读研要考这个&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IELTS&lt;/td&gt;
&lt;td&gt;International English Language Testing System&lt;/td&gt;
&lt;td&gt;雅思。和托福一样，另一个主流的英语水平考试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ISBN&lt;/td&gt;
&lt;td&gt;International Standard Book Number&lt;/td&gt;
&lt;td&gt;国际标准书号。每本公开出版的书独有的编号，找书、借书、引用都会用到&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MOOC&lt;/td&gt;
&lt;td&gt;Massive Open Online Course&lt;/td&gt;
&lt;td&gt;大规模开放在线课程。网上免费的大学课程，比如中国大学 MOOC、Coursera&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ORCID&lt;/td&gt;
&lt;td&gt;Open Researcher and Contributor ID&lt;/td&gt;
&lt;td&gt;开放研究者身份识别码。每个研究者的唯一 ID，不管同名同姓还是换了单位，这个码不会变。发论文、投基金都用的到&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF&lt;/td&gt;
&lt;td&gt;Portable Document Format&lt;/td&gt;
&lt;td&gt;便携式文档格式。不管什么系统打开格式都不乱&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PPT&lt;/td&gt;
&lt;td&gt;PowerPoint&lt;/td&gt;
&lt;td&gt;这个不用解释了吧。上课做展示、答辩、汇报都离不开的幻灯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCI&lt;/td&gt;
&lt;td&gt;Science Citation Index&lt;/td&gt;
&lt;td&gt;科学引文索引。收录高水平期刊的数据库，发 SCI 论文是很多理工科研究生的目标&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TOEFL&lt;/td&gt;
&lt;td&gt;Test of English as a Foreign Language&lt;/td&gt;
&lt;td&gt;托福。去英语国家留学的语言考试&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;学位与证书&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ACCA&lt;/td&gt;
&lt;td&gt;Association of Chartered Certified Accountants&lt;/td&gt;
&lt;td&gt;特许公认会计师。国际会计准则方向的会计证书&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BA / BS&lt;/td&gt;
&lt;td&gt;Bachelor of Arts / Science&lt;/td&gt;
&lt;td&gt;文学学士 / 理学学士。你本科毕业拿的就是这个&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CFA&lt;/td&gt;
&lt;td&gt;Chartered Financial Analyst&lt;/td&gt;
&lt;td&gt;特许金融分析师。金融行业含金量很高的证书，三级考试通过率很低&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPA&lt;/td&gt;
&lt;td&gt;Certified Public Accountant&lt;/td&gt;
&lt;td&gt;注册会计师。会计行业的核心证书&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EMBA&lt;/td&gt;
&lt;td&gt;Executive MBA&lt;/td&gt;
&lt;td&gt;高级管理人员 MBA。给有多年管理经验的人读的，通常不脱产&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MA / MS&lt;/td&gt;
&lt;td&gt;Master of Arts / Science&lt;/td&gt;
&lt;td&gt;文学硕士 / 理学硕士&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MBA&lt;/td&gt;
&lt;td&gt;Master of Business Administration&lt;/td&gt;
&lt;td&gt;工商管理硕士。工作几年后很多人去读，培养管理能力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MPA&lt;/td&gt;
&lt;td&gt;Master of Public Administration&lt;/td&gt;
&lt;td&gt;公共管理硕士。培养政府部门或非营利组织管理人才&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PhD&lt;/td&gt;
&lt;td&gt;Doctor of Philosophy&lt;/td&gt;
&lt;td&gt;哲学博士。最高学位，不限哲学专业，理工科博士也是 PhD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PMP&lt;/td&gt;
&lt;td&gt;Project Management Professional&lt;/td&gt;
&lt;td&gt;项目管理专业人士认证。管理类通用的国际证书&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;计算机硬件&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ARM&lt;/td&gt;
&lt;td&gt;Advanced RISC Machine&lt;/td&gt;
&lt;td&gt;一种低功耗处理器架构，手机、平板、苹果 M 系列芯片都是 ARM 架构的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BIOS&lt;/td&gt;
&lt;td&gt;Basic Input/Output System&lt;/td&gt;
&lt;td&gt;基本输入输出系统。开机时最先启动的那套程序，UEFI 是它的升级版&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;Central Processing Unit&lt;/td&gt;
&lt;td&gt;中央处理器。电脑的大脑，Intel 和 AMD 两家主导&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA&lt;/td&gt;
&lt;td&gt;Compute Unified Device Architecture&lt;/td&gt;
&lt;td&gt;NVIDIA 的 GPU 并行计算平台。做 AI 训练、科学计算基本都用它&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DDR&lt;/td&gt;
&lt;td&gt;Double Data Rate&lt;/td&gt;
&lt;td&gt;双倍数据速率内存。现在主流是 DDR4 和 DDR5，数字越大越快&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DirectX&lt;/td&gt;
&lt;td&gt;Direct eXtension&lt;/td&gt;
&lt;td&gt;微软的多媒体和游戏编程接口。Windows 上玩游戏离不开这个&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FPGA&lt;/td&gt;
&lt;td&gt;Field-Programmable Gate Array&lt;/td&gt;
&lt;td&gt;现场可编程门阵列。一种可以自己定义电路逻辑的芯片，硬件工程师用得多&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;Graphics Processing Unit&lt;/td&gt;
&lt;td&gt;图形处理器。俗称显卡，做图形渲染和 AI 训练的主力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HBM&lt;/td&gt;
&lt;td&gt;High Bandwidth Memory&lt;/td&gt;
&lt;td&gt;高带宽内存。堆叠封装的内存，带宽极高，AI 加速卡（比如 NVIDIA H100）上用的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HDD&lt;/td&gt;
&lt;td&gt;Hard Disk Drive&lt;/td&gt;
&lt;td&gt;机械硬盘。便宜容量大，适合存不常用的文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HDMI&lt;/td&gt;
&lt;td&gt;High-Definition Multimedia Interface&lt;/td&gt;
&lt;td&gt;高清多媒体接口。连显示器、投影仪用的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IO&lt;/td&gt;
&lt;td&gt;Input / Output&lt;/td&gt;
&lt;td&gt;输入输出。所有数据进出设备的统称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NPU&lt;/td&gt;
&lt;td&gt;Neural Processing Unit&lt;/td&gt;
&lt;td&gt;神经网络处理器。专门跑 AI 推理的芯片，手机和笔记本里越来越常见&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVMe&lt;/td&gt;
&lt;td&gt;Non-Volatile Memory Express&lt;/td&gt;
&lt;td&gt;非易失性内存高速传输协议。现在最快的 SSD 接口协议，比 SATA 快好几倍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oculink&lt;/td&gt;
&lt;td&gt;Optical Copper Link&lt;/td&gt;
&lt;td&gt;外置 PCIe 连接方案。把显卡或者硬盘通过一根线接到笔记本外面，带宽比雷电高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenCL&lt;/td&gt;
&lt;td&gt;Open Computing Language&lt;/td&gt;
&lt;td&gt;开放的并行计算框架，不绑特定厂商，AMD、Intel、NVIDIA 都支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenGL&lt;/td&gt;
&lt;td&gt;Open Graphics Library&lt;/td&gt;
&lt;td&gt;跨平台的 2D/3D 图形渲染接口。CAD、游戏引擎都会用到&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCIe&lt;/td&gt;
&lt;td&gt;Peripheral Component Interconnect Express&lt;/td&gt;
&lt;td&gt;高速外设总线。显卡、SSD、网卡都插在这个接口上，现在主流是 PCIe 4.0 和 5.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PSU&lt;/td&gt;
&lt;td&gt;Power Supply Unit&lt;/td&gt;
&lt;td&gt;电源。把 220V 交流电转成电脑用的低电压直流电&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;td&gt;Random Access Memory&lt;/td&gt;
&lt;td&gt;随机存取存储器。也就是内存，程序运行时临时存放数据的地方，断电就没了&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RISC&lt;/td&gt;
&lt;td&gt;Reduced Instruction Set Computer&lt;/td&gt;
&lt;td&gt;精简指令集。一种 CPU 设计思路，指令简单但执行快。ARM 就是 RISC 架构的代表&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROM&lt;/td&gt;
&lt;td&gt;Read-Only Memory&lt;/td&gt;
&lt;td&gt;只读存储器。数据写进去后断电不丢&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SATA&lt;/td&gt;
&lt;td&gt;Serial Advanced Technology Attachment&lt;/td&gt;
&lt;td&gt;串行 ATA。硬盘接口，机械硬盘和老一点的固态硬盘都用这个，比 NVMe 慢但便宜&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSD&lt;/td&gt;
&lt;td&gt;Solid State Drive&lt;/td&gt;
&lt;td&gt;固态硬盘。比机械硬盘快很多，现在装系统基本都是用 SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TPU&lt;/td&gt;
&lt;td&gt;Tensor Processing Unit&lt;/td&gt;
&lt;td&gt;谷歌的 AI 加速芯片，张量处理器。普通用户摸不到，但学 AI 的话会经常听说&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB&lt;/td&gt;
&lt;td&gt;Universal Serial Bus&lt;/td&gt;
&lt;td&gt;通用串行总线。就是那个插 U 盘的接口&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VRAM&lt;/td&gt;
&lt;td&gt;Video RAM&lt;/td&gt;
&lt;td&gt;显存。显卡上专用的内存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulkan&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;新一代跨平台图形与计算 API，比 OpenGL 效率更高。AMD 开源贡献出来的，名叫 Mantle 的前身&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x86&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Intel 搞出来的处理器架构，PC 和服务器上用得最多的 CPU 指令集。AMD 和 Intel 的桌面 CPU 都是 x86 兼容的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x86-64 / AMD64&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;x86 的 64 位扩展，由 AMD 率先推出，Intel 后来跟进。现在几乎所有桌面电脑的 CPU 都支持这个&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;软件与网络&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API&lt;/td&gt;
&lt;td&gt;Application Programming Interface&lt;/td&gt;
&lt;td&gt;应用程序编程接口。不同软件之间交换数据的协议和规则&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLI&lt;/td&gt;
&lt;td&gt;Command-Line Interface&lt;/td&gt;
&lt;td&gt;命令行界面。黑框框里敲命令，程序员必备&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CDN&lt;/td&gt;
&lt;td&gt;Content Delivery Network&lt;/td&gt;
&lt;td&gt;内容分发网络。把网页、图片、视频缓存到离你最近的服务器上，加快访问速度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSV&lt;/td&gt;
&lt;td&gt;Comma-Separated Values&lt;/td&gt;
&lt;td&gt;逗号分隔值。表格数据纯文本存储的格式，Excel 能开&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;Domain Name System&lt;/td&gt;
&lt;td&gt;域名系统。把网址（如 baidu.com）转成 IP 地址的服务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GUI&lt;/td&gt;
&lt;td&gt;Graphical User Interface&lt;/td&gt;
&lt;td&gt;图形用户界面。你看到的带窗口、按钮、图标的界面都是 GUI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML&lt;/td&gt;
&lt;td&gt;HyperText Markup Language&lt;/td&gt;
&lt;td&gt;超文本标记语言。写网页用的标记语言&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTP / HTTPS&lt;/td&gt;
&lt;td&gt;HyperText Transfer Protocol (Secure)&lt;/td&gt;
&lt;td&gt;网页传输协议。HTTPS 多了加密层，现在几乎都是 HTTPS 了&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE&lt;/td&gt;
&lt;td&gt;Integrated Development Environment&lt;/td&gt;
&lt;td&gt;集成开发环境。写代码的软件，比如 VS Code、PyCharm、IDEA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IoT&lt;/td&gt;
&lt;td&gt;Internet of Things&lt;/td&gt;
&lt;td&gt;物联网。让冰箱、灯泡、门锁联网的技术统称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP&lt;/td&gt;
&lt;td&gt;Internet Protocol&lt;/td&gt;
&lt;td&gt;互联网协议。给每个联网设备分配的地址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;JavaScript Object Notation&lt;/td&gt;
&lt;td&gt;一种轻量数据交换格式。程序之间传数据用得多&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LaTeX&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;学术论文排版工具，数学公式渲染特别好，理工科写论文几乎必学&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;轻量级标记语言。用简单的符号就能排版，写 README、记笔记、写博客都用得到&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OOP&lt;/td&gt;
&lt;td&gt;Object-Oriented Programming&lt;/td&gt;
&lt;td&gt;面向对象编程。一种编程思想，Java、Python、C++ 都支持&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Operating System&lt;/td&gt;
&lt;td&gt;操作系统。Windows、macOS、Linux 都是 OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2P&lt;/td&gt;
&lt;td&gt;Peer-to-Peer&lt;/td&gt;
&lt;td&gt;点对点。不经过中心服务器，设备之间直接传数据。BT 下载、PCDN 都基于这个&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCDN&lt;/td&gt;
&lt;td&gt;P2P Content Delivery Network&lt;/td&gt;
&lt;td&gt;P2P 内容分发网络。利用大量用户设备互相传数据来加速分发，比传统 CDN 省带宽成本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL&lt;/td&gt;
&lt;td&gt;Structured Query Language&lt;/td&gt;
&lt;td&gt;结构化查询语言。和数据库打交道用的，增删改查全靠它&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL&lt;/td&gt;
&lt;td&gt;Uniform Resource Locator&lt;/td&gt;
&lt;td&gt;统一资源定位符。就是网址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPN&lt;/td&gt;
&lt;td&gt;Virtual Private Network&lt;/td&gt;
&lt;td&gt;虚拟私人网络。加密你的网络流量，用来访问受限资源或保护隐私&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VR / AR&lt;/td&gt;
&lt;td&gt;Virtual Reality / Augmented Reality&lt;/td&gt;
&lt;td&gt;虚拟现实 / 增强现实。VR=戴头盔沉浸虚拟世界，AR=在现实画面里叠虚拟信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;eXtensible Markup Language&lt;/td&gt;
&lt;td&gt;可扩展标记语言。和 JSON 差不多，以前更流行&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;云服务&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BaaS&lt;/td&gt;
&lt;td&gt;Backend as a Service&lt;/td&gt;
&lt;td&gt;后端即服务。帮你搭好服务器端，你只写前端就行，比如 Firebase、Supabase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DaaS&lt;/td&gt;
&lt;td&gt;Desktop as a Service&lt;/td&gt;
&lt;td&gt;桌面即服务。云端给你一台虚拟电脑，远程连上去用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IaaS&lt;/td&gt;
&lt;td&gt;Infrastructure as a Service&lt;/td&gt;
&lt;td&gt;基础设施即服务。给你虚拟机、硬盘、网络，你自己在上面装系统配环境，比如阿里云 ECS、AWS EC2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MaaS&lt;/td&gt;
&lt;td&gt;Model as a Service&lt;/td&gt;
&lt;td&gt;模型即服务。把训练好的大模型包装成 API 给你调用，不用自己部署，按用量付费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PaaS&lt;/td&gt;
&lt;td&gt;Platform as a Service&lt;/td&gt;
&lt;td&gt;平台即服务。给你一个配好的开发环境，你只写代码不碰服务器，比如 Heroku、Vercel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS&lt;/td&gt;
&lt;td&gt;Software as a Service&lt;/td&gt;
&lt;td&gt;软件即服务。不用装软件，打开网页就能用，比如飞书、石墨文档、Notion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;版本控制与开源&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CLA&lt;/td&gt;
&lt;td&gt;Contributor License Agreement&lt;/td&gt;
&lt;td&gt;贡献者许可协议。给开源项目贡献代码前要签的协议，把代码版权授予项目方&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LGTM&lt;/td&gt;
&lt;td&gt;Looks Good To Me&lt;/td&gt;
&lt;td&gt;我看没问题。代码审查时常用的批准语&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PR&lt;/td&gt;
&lt;td&gt;Pull Request&lt;/td&gt;
&lt;td&gt;合并请求。你在自己分支改完代码，发起一个请求让主项目合进去。GitHub 上最常见的协作操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RFC&lt;/td&gt;
&lt;td&gt;Request for Comments&lt;/td&gt;
&lt;td&gt;征求意见。提出一个方案让大家讨论，常见于技术标准制定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WIP&lt;/td&gt;
&lt;td&gt;Work In Progress&lt;/td&gt;
&lt;td&gt;工作中。代码还没写完，先提交上去占个位置&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;GitHub 常见操作&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;clone&lt;/td&gt;
&lt;td&gt;克隆。把远程仓库完整下载到本地&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;commit&lt;/td&gt;
&lt;td&gt;提交。把修改保存到本地仓库，要写一段说明改了啥&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fork&lt;/td&gt;
&lt;td&gt;复刻。把别人的仓库复制一份到你自己的账号下，方便你改完再提交 PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;issue&lt;/td&gt;
&lt;td&gt;议题。报 bug、提建议、讨论问题的地方&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;merge&lt;/td&gt;
&lt;td&gt;合并。把一个分支的代码合入另一个分支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pull&lt;/td&gt;
&lt;td&gt;拉取。把远程仓库的最新修改同步到本地&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;push&lt;/td&gt;
&lt;td&gt;推送。把本地 commit 好的修改上传到远程仓库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;release&lt;/td&gt;
&lt;td&gt;发布。打包一个稳定版本供下载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;star&lt;/td&gt;
&lt;td&gt;收藏。给项目点星表示关注和赞赏，类似点赞&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;watch&lt;/td&gt;
&lt;td&gt;关注。订阅仓库动态，有更新会通知你&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;无人机/航模相关&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ADC&lt;/td&gt;
&lt;td&gt;Analog-to-Digital Converter&lt;/td&gt;
&lt;td&gt;模数转换器。飞控用它检测电池电压电流&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BEC&lt;/td&gt;
&lt;td&gt;Battery Eliminator Circuit&lt;/td&gt;
&lt;td&gt;降压电路。从主电池分出一路低压给飞控、接收机供电&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ESC&lt;/td&gt;
&lt;td&gt;Electronic Speed Controller&lt;/td&gt;
&lt;td&gt;电调。控制电机转速的器件，飞控发信号给它，它驱动电机转&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FC / FCS&lt;/td&gt;
&lt;td&gt;Flight Control System&lt;/td&gt;
&lt;td&gt;飞行控制系统。也就是飞控板，无人机的大脑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GNSS&lt;/td&gt;
&lt;td&gt;Global Navigation Satellite System&lt;/td&gt;
&lt;td&gt;全球导航卫星系统。GPS、北斗、GLONASS 等的统称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPS&lt;/td&gt;
&lt;td&gt;Global Positioning System&lt;/td&gt;
&lt;td&gt;全球定位系统。给飞控提供位置和速度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IMU&lt;/td&gt;
&lt;td&gt;Inertial Measurement Unit&lt;/td&gt;
&lt;td&gt;惯性测量单元。集成加速度计和陀螺仪，感知姿态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiPo&lt;/td&gt;
&lt;td&gt;Lithium Polymer&lt;/td&gt;
&lt;td&gt;锂聚合物电池。航模无人机最常用的电池类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P (如 2P)&lt;/td&gt;
&lt;td&gt;Parallel&lt;/td&gt;
&lt;td&gt;锂电池并联数。2P=2 节并联，容量翻倍&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PPM&lt;/td&gt;
&lt;td&gt;Pulse Position Modulation&lt;/td&gt;
&lt;td&gt;另一种遥控信号编码方式，比 SBUS 老&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PWM&lt;/td&gt;
&lt;td&gt;Pulse Width Modulation&lt;/td&gt;
&lt;td&gt;脉宽调制。控制舵机和电调的基本信号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTK&lt;/td&gt;
&lt;td&gt;Real-Time Kinematic&lt;/td&gt;
&lt;td&gt;实时动态定位。厘米级精度的定位技术&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RX / TX&lt;/td&gt;
&lt;td&gt;Receiver / Transmitter&lt;/td&gt;
&lt;td&gt;接收机 / 发射机&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;S (如 3S、6S)&lt;/td&gt;
&lt;td&gt;Series&lt;/td&gt;
&lt;td&gt;锂电池串联数。3S=3 节串联，电压乘 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SBUS&lt;/td&gt;
&lt;td&gt;Serial BUS&lt;/td&gt;
&lt;td&gt;Futaba 发明的一种串行总线协议，遥控器接收机和飞控之间用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UART&lt;/td&gt;
&lt;td&gt;Universal Asynchronous Receiver/Transmitter&lt;/td&gt;
&lt;td&gt;串口通信。飞控接 GPS、数传等外设用的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VTX&lt;/td&gt;
&lt;td&gt;Video Transmitter&lt;/td&gt;
&lt;td&gt;图传发射机。把相机画面无线传回地面&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;电子与通信&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AC / DC&lt;/td&gt;
&lt;td&gt;Alternating Current / Direct Current&lt;/td&gt;
&lt;td&gt;交流电 / 直流电。电池出来是直流，插座出来是交流&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bluetooth&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;蓝牙。短距离无线通信&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DSP&lt;/td&gt;
&lt;td&gt;Digital Signal Processor&lt;/td&gt;
&lt;td&gt;数字信号处理器。专门处理音频、视频、传感器信号的芯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IC&lt;/td&gt;
&lt;td&gt;Integrated Circuit&lt;/td&gt;
&lt;td&gt;集成电路。也就是芯片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LCD&lt;/td&gt;
&lt;td&gt;Liquid Crystal Display&lt;/td&gt;
&lt;td&gt;液晶显示器。最常见的屏幕类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LED&lt;/td&gt;
&lt;td&gt;Light-Emitting Diode&lt;/td&gt;
&lt;td&gt;发光二极管。小小的指示灯，也很省电&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCU&lt;/td&gt;
&lt;td&gt;Microcontroller Unit&lt;/td&gt;
&lt;td&gt;单片机。小型的处理器，嵌入式设备常用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NFC&lt;/td&gt;
&lt;td&gt;Near Field Communication&lt;/td&gt;
&lt;td&gt;近场通信。刷卡、刷手机用的短距离无线技术&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OLED&lt;/td&gt;
&lt;td&gt;Organic LED&lt;/td&gt;
&lt;td&gt;有机发光二极管。屏幕的一种，黑色不发光的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCB&lt;/td&gt;
&lt;td&gt;Printed Circuit Board&lt;/td&gt;
&lt;td&gt;印刷电路板。所有电子元器件焊在上面的那块绿板子&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RFID&lt;/td&gt;
&lt;td&gt;Radio Frequency Identification&lt;/td&gt;
&lt;td&gt;射频识别。门禁卡、物流标签用的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SoC&lt;/td&gt;
&lt;td&gt;System on Chip&lt;/td&gt;
&lt;td&gt;片上系统。把 CPU、GPU、内存等集成在一颗芯片上，比如手机处理器&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wi-Fi&lt;/td&gt;
&lt;td&gt;Wireless Fidelity&lt;/td&gt;
&lt;td&gt;无线局域网。就是无线上网&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;医学与健康&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ADHD&lt;/td&gt;
&lt;td&gt;Attention Deficit Hyperactivity Disorder&lt;/td&gt;
&lt;td&gt;注意力缺陷多动障碍。俗称多动症&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BMI&lt;/td&gt;
&lt;td&gt;Body Mass Index&lt;/td&gt;
&lt;td&gt;身体质量指数。体重(kg)÷身高(m)²，衡量是否超重&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CT&lt;/td&gt;
&lt;td&gt;Computed Tomography&lt;/td&gt;
&lt;td&gt;计算机断层扫描。用 X 光从多角度拍然后合成三维图像&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ECG / EKG&lt;/td&gt;
&lt;td&gt;Electrocardiogram&lt;/td&gt;
&lt;td&gt;心电图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EEG&lt;/td&gt;
&lt;td&gt;Electroencephalogram&lt;/td&gt;
&lt;td&gt;脑电图&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ICU&lt;/td&gt;
&lt;td&gt;Intensive Care Unit&lt;/td&gt;
&lt;td&gt;重症监护室&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRI&lt;/td&gt;
&lt;td&gt;Magnetic Resonance Imaging&lt;/td&gt;
&lt;td&gt;磁共振成像。没有辐射的扫描方式，看软组织更清楚&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;其他常见缩写&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;缩写&lt;/th&gt;
&lt;th&gt;英文全称&lt;/th&gt;
&lt;th&gt;解释&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ASAP&lt;/td&gt;
&lt;td&gt;As Soon As Possible&lt;/td&gt;
&lt;td&gt;尽快&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B / B2C&lt;/td&gt;
&lt;td&gt;Business to Business / Consumer&lt;/td&gt;
&lt;td&gt;企业对企业 / 企业对消费者。商业模式的分类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAD&lt;/td&gt;
&lt;td&gt;Computer-Aided Design&lt;/td&gt;
&lt;td&gt;计算机辅助设计。AutoCAD、SolidWorks 就是干这个的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;Do It Yourself&lt;/td&gt;
&lt;td&gt;自己动手做。比如自己装电脑、自己焊东西&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETA&lt;/td&gt;
&lt;td&gt;Estimated Time of Arrival&lt;/td&gt;
&lt;td&gt;预计到达时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQ&lt;/td&gt;
&lt;td&gt;Frequently Asked Questions&lt;/td&gt;
&lt;td&gt;常见问题解答。几乎所有产品文档都有这一栏&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPO&lt;/td&gt;
&lt;td&gt;Initial Public Offering&lt;/td&gt;
&lt;td&gt;首次公开募股。也就是公司上市&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NGO&lt;/td&gt;
&lt;td&gt;Non-Governmental Organization&lt;/td&gt;
&lt;td&gt;非政府组织。境外 NGO 在华活动需依法登记。遇到以 NGO 名义拉拢参与敏感项目的，注意甄别，防范被利用从事涉密或危害国家安全的活动，主动规避风险，保护好自己和家人&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NPO&lt;/td&gt;
&lt;td&gt;Non-Profit Organization&lt;/td&gt;
&lt;td&gt;非营利组织。和 NGO 类似，不追求利润的社会组织。同样需注意甄别境外背景，保护个人信息&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OCR&lt;/td&gt;
&lt;td&gt;Optical Character Recognition&lt;/td&gt;
&lt;td&gt;光学字符识别。把图片里的文字提取出来，扫描件转文字用的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QA / QC&lt;/td&gt;
&lt;td&gt;Quality Assurance / Quality Control&lt;/td&gt;
&lt;td&gt;质量保证 / 质量控制。测试产品确保不出问题的&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R&amp;amp;D&lt;/td&gt;
&lt;td&gt;Research and Development&lt;/td&gt;
&lt;td&gt;研发。企业中搞研究的部门&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ROI&lt;/td&gt;
&lt;td&gt;Return on Investment&lt;/td&gt;
&lt;td&gt;投资回报率。投了多少钱带来了多少收益&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSVP&lt;/td&gt;
&lt;td&gt;Répondez s'il vous plaît（法语）&lt;/td&gt;
&lt;td&gt;请回复。邀请函上常见的，要你确认去不去&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SOP&lt;/td&gt;
&lt;td&gt;Standard Operating Procedure&lt;/td&gt;
&lt;td&gt;标准作业流程。规定一件事具体怎么做的文档&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TBA&lt;/td&gt;
&lt;td&gt;To Be Announced&lt;/td&gt;
&lt;td&gt;待公布&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TBD&lt;/td&gt;
&lt;td&gt;To Be Determined&lt;/td&gt;
&lt;td&gt;待定&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;p&gt;这里列的只是一部分，当作一个快查表来参考，当然不限于这些。大学四年里你还会遇到更多的缩写。原则很简单：&lt;strong&gt;每次遇到不认识的，当场查一下，三秒钟的事，但心里有数了下次就不会慌。&lt;/strong&gt; 别攒着不查，攒多了就真不愿意查了。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇OpenCode 进阶之「技能创作」：拆解描述典型任务后验证实现再做成可复用的「技能」下一篇OpenCode进阶探索-利用模型进行文献情报检索但不要让模型替代人判断&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Education"/><category term="education"/><category term="freshman"/><category term="abbreviations"/><category term="university"/></entry><entry><title>飞机为什么能倒着飞——从"等程理论"这个流传最广的错误说起</title><link href="https://blog.cycleuser.org/how-airplanes-fly-upside-down.html" rel="alternate"/><published>2026-07-24T15:00:00+08:00</published><updated>2026-07-24T15:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-24:/how-airplanes-fly-upside-down.html</id><summary type="html">&lt;p&gt;很多人小时候都听过一个解释：机翼上面弧度大、路程长，下面平、路程短。空气分子在机翼前缘分开，为了在后缘同时会合，上 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;很多人小时候都听过一个解释：机翼上面弧度大、路程长，下面平、路程短。空气分子在机翼前缘分开，为了在后缘同时会合，上方的空气就得跑得更快。根据伯努利原理，流速快的地方压力小，所以上方压力小于下方，产生升力。&lt;/p&gt;
&lt;p&gt;这个故事讲得通顺、容易记，在科普书和中小学教材里流传了几十年。&lt;/p&gt;
&lt;p&gt;但它不对。&lt;/p&gt;
&lt;h2&gt;NASA 明确说了这是错的&lt;/h2&gt;
&lt;p&gt;NASA 格伦研究中心有一个专门的页面，标题就叫"不正确的翼型理论"（Incorrect Airfoil Theory）。页面上逐条驳斥了这个"等程/等时理论"（Equal Transit Time Theory）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;对称翼型同样产生升力&lt;/strong&gt;——它的上下表面长度完全一样，按等程理论该没有升力，但实际显然有。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;纸飞机就是个平面&lt;/strong&gt;——上下同长同形，照样飞得好好的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;现代低阻翼型的下表面可能比上表面更长&lt;/strong&gt;——按等程理论该产生"向下"的升力，但它不。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实际测量中，上表面的气流速度比等程理论预测的快得多&lt;/strong&gt;——两个分子并不会同时到达后缘。上面的分子先到。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;这个理论完全无法解释飞机为什么能倒着飞&lt;/strong&gt;——航展上倒飞是常规操作，按等程理论，倒过来弧度在上方，升力应该向下把人拍地上。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;那升力到底怎么来的？&lt;/p&gt;
&lt;h2&gt;升力的真正来源：环量与气流偏转&lt;/h2&gt;
&lt;p&gt;严谨的流体力学解释用的是&lt;strong&gt;库塔-茹科夫斯基定理&lt;/strong&gt;（Kutta-Joukowski Theorem）：&lt;/p&gt;
&lt;p&gt;升力&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[ L = \rho U \Gamma \]&lt;/div&gt;
&lt;p&gt;其中 &lt;span class="arithmatex"&gt;\(\rho\)&lt;/span&gt; 是空气密度，&lt;span class="arithmatex"&gt;\(U\)&lt;/span&gt; 是来流速度，&lt;span class="arithmatex"&gt;\(\Gamma\)&lt;/span&gt; 是绕翼型的&lt;strong&gt;环量&lt;/strong&gt;（circulation）。环量来自&lt;strong&gt;库塔条件&lt;/strong&gt;——翼型后缘尖锐，气流必须平滑离开后缘，这自然产生了一个绕翼型的环流。均匀来流叠加上这个环流，上表面气流加速（低压），下表面气流减速（高压），合力向上。&lt;/p&gt;
&lt;p&gt;从牛顿第三定律来看更直观：机翼把气流往下偏转，气流给机翼一个向上的反作用力。这就是升力。&lt;/p&gt;
&lt;p&gt;翼型的弯度（camber）可以提高效率，但不是产生升力的必要条件。&lt;strong&gt;攻角&lt;/strong&gt;才是关键——机翼前缘略微往上翘，气流就被压向下方。&lt;/p&gt;
&lt;h2&gt;那倒飞是怎么回事&lt;/h2&gt;
&lt;p&gt;理解了上面的原理，倒飞就好解释了：&lt;/p&gt;
&lt;p&gt;飞机倒飞时，机翼仍然是那个机翼，弧度方向没变。但是&lt;strong&gt;飞行员调整了攻角&lt;/strong&gt;——机头往上仰（从座舱视角看），让来流从机翼的下方斜着撞上来。这样，气流仍然被机翼往下偏转（相对于天空），升力仍然向上。&lt;/p&gt;
&lt;p&gt;对称翼型在这方面优势最大——它上下完全对称，正攻角产生正向升力、负攻角产生反向升力，完全由攻角决定。这也是为什么特技飞机和战斗机普威使用对称翼型或接近对称的翼型。&lt;/p&gt;
&lt;p&gt;下面用位势流（Joukowski 翼型 + Kutta-Joukowski 定理）做的严格数值模拟来展示两种情况：&lt;/p&gt;
&lt;p&gt;&lt;img alt="正常飞行：正攻角，上表面低压产生升力" src="images/airfoil-normal.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="倒飞：对称翼型，负攻角产生反向压力差，但飞机调整攻角即可产生向上净升力" src="images/airfoil-inverted.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;动图1：正常飞行时流线随攻角变化&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="正常飞行流线动图" src="images/airfoil-normal.gif"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;动图2：对称翼型在正/负攻角间切换，升力方向随之改变但净升力可控&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="倒飞升力切换动图" src="images/airfoil-inverted.gif"&gt;&lt;/p&gt;
&lt;h2&gt;小结&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;"上面弧度大路程长所以升力"是错的，NASA 有专题页面详细解释。&lt;/li&gt;
&lt;li&gt;升力 = 环量 × 速度 × 密度，来自库塔-茹科夫斯基定理。&lt;/li&gt;
&lt;li&gt;气流被往下偏转，反作用力往上，这才是升力的直观理解。&lt;/li&gt;
&lt;li&gt;倒飞时靠攻角调整，气流仍然往下偏，升力仍然往上。&lt;/li&gt;
&lt;li&gt;对称翼型的特技飞机倒飞最自如——全由攻角决定升力方向。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;NASA Glenn Research Center, &lt;em&gt;Incorrect Airfoil Theory (Equal Transit Time)&lt;/em&gt;, https://www1.grc.nasa.gov/beginners-guide-to-aeronautics/foilw1/&lt;/li&gt;
&lt;li&gt;Anderson, J. D., &lt;em&gt;Fundamentals of Aerodynamics&lt;/em&gt;, McGraw-Hill&lt;/li&gt;
&lt;li&gt;计算代码：&lt;code&gt;images/airfoil_lift.py&lt;/code&gt;（Joukowski 变换 + 位势流 + Kutta 条件 + 压力分布）&lt;/li&gt;
&lt;/ul&gt;</content><category term="Science"/><category term="aerodynamics"/><category term="physics"/><category term="lift"/><category term="airfoil"/><category term="Python"/></entry><entry><title>OpenCode 进阶之「技能创作」：拆解描述典型任务后验证实现再做成可复用的「技能」</title><link href="https://blog.cycleuser.org/opencode-jin-jie-zhi-ji-neng-chuang-zuo-chai-jie-miao-shu-dian-xing-ren-wu-hou-yan-zheng-shi-xian-zai-zuo-cheng-ke-fu-yong-de-ji-neng.html" rel="alternate"/><published>2026-07-24T00:00:00+08:00</published><updated>2026-07-24T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-24:/opencode-jin-jie-zhi-ji-neng-chuang-zuo-chai-jie-miao-shu-dian-xing-ren-wu-hou-yan-zheng-shi-xian-zai-zuo-cheng-ke-fu-yong-de-ji-neng.html</id><summary type="html">&lt;p&gt;前面有很多跟OpenCode相关的一点经验分享给大家：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566364&amp;amp;idx=1&amp;amp;sn=95f63f82f914ac114fd890a4fb249c75&amp;amp;token=1002926725&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;高校教师建议大一开学要有电脑，还要安装OpenCode使用智能体&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566541&amp;amp;idx=1&amp;amp;sn=7ce86cc9c8adf8986f86ce6a4dda3343&amp;amp;token=1002926725&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;opencode 的四种用法与为什么我推荐命令行&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566692&amp;amp;idx=1&amp;amp;sn=6dc9a21822df55f90aacde40560c8fa7&amp;amp;token=1002926725&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;不只是写代码：用opencode和免费模型帮你搜教程 …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;前面有很多跟OpenCode相关的一点经验分享给大家：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566364&amp;amp;idx=1&amp;amp;sn=95f63f82f914ac114fd890a4fb249c75&amp;amp;token=1002926725&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;高校教师建议大一开学要有电脑，还要安装OpenCode使用智能体&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566541&amp;amp;idx=1&amp;amp;sn=7ce86cc9c8adf8986f86ce6a4dda3343&amp;amp;token=1002926725&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;opencode 的四种用法与为什么我推荐命令行&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566692&amp;amp;idx=1&amp;amp;sn=6dc9a21822df55f90aacde40560c8fa7&amp;amp;token=1002926725&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;不只是写代码：用opencode和免费模型帮你搜教程、下视频&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566743&amp;amp;idx=1&amp;amp;sn=3ad1c5f7dc1e90877cb115c68cd9e561&amp;amp;token=1002926725&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;用 opencode 帮学习：上课没听懂的东西，让它帮你查清楚画明白&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566719&amp;amp;idx=1&amp;amp;sn=23bb679d34332deb68daa339df0e2384&amp;amp;token=1002926725&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;OpenCode进阶-安装技能再改进：从PDF读取内容来填表和文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其中关于技能的部分，有不少朋友看过了基于已有技能修改的案例之后，表示想从头来创作一个自己的技能，希望给个案例参考一下。&lt;/p&gt;
&lt;p&gt;这回咱们考虑这样一个场景：从视频提取图片做出文档。&lt;/p&gt;
&lt;p&gt;看视频费眼睛，也费时间。刷过学习视频的人都懂——半个小时讲下来，真正有信息量的可能就那几分钟。剩下的大半是口头禅、重复、空镜头。视频的信息密度确实不高。&lt;/p&gt;
&lt;p&gt;但很多好东西只有视频。当年在北师大听过不少赵峥老先生的课，后来发现他在 B 站上还发了很多物理公开课。讲得好，但不看可惜，长时间盯着又累。&lt;/p&gt;
&lt;p&gt;有了 opencode 之后就在想，能不能让它帮个忙：把视频下载下来，提取音频转成逐字稿，抓关键帧做成幻灯片，再写一篇总结。整个流程跑一遍，输出一份随时能翻看的图文材料。说干就干，这个事来回改了挺久，最后不光能做出来，还把整个过程做成一个技能了。&lt;/p&gt;
&lt;p&gt;这个过程本身挺值得说一说的。&lt;/p&gt;
&lt;p&gt;和上一回提到的"改一个已有的技能"不一样了，这次终于是从零开始，先想清楚要干什么，把步骤拆解开，自己详细叙述给 opencode 让它跑通验证，再把流程整理成技能文件存下来。后面每次直接调用就行，不用重新解释。&lt;/p&gt;
&lt;h2&gt;从零把一件事变成技能&lt;/h2&gt;
&lt;p&gt;有时候你觉得一个流程特别好用，但每次都得跟 AI 从头说一遍，太累了。比如这个"下载视频→提取字幕→关键帧→幻灯片→文章"的流程。你心里门儿清，但不想每次打这么多字。&lt;/p&gt;
&lt;p&gt;opencode 的技能系统就是解决这个的。你第一次把流程跟它讲清楚，它帮你写成技能文件。以后直接调技能名，当初设计好的流程完整载入上下文，省掉所有重复的口舌。&lt;/p&gt;
&lt;h2&gt;怎么跟 opencode 说清楚你要干什么&lt;/h2&gt;
&lt;p&gt;关键是把任务拆解完、说详细。拿视频萃取这个例子来说，我给 OpenCode 的对话大概是下面这样的。（注意，我就是把下面的文字直接发给 OpenCode 的，大家也可以这么做，但没必要严格按照我这样的文本格式和次序，完全可以有自己的风格探索出来哈。）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;要帮我创建一个技能。这个技能中文名字叫视频萃取，英文名字叫VideoExtract，要完成下面这些事。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步&lt;/strong&gt;，想办法调用工具把链接里的视频下载下来。yt-dlp 能用的就用 yt-dlp 下载。如果实在不能下载，就用截图加音频流的方式把内容获取下来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步&lt;/strong&gt;，处理音频。如果能获得原始的字幕就用原始字幕，字幕比转写更准。如果不能，就基于音频来生成字幕，用 whisper 或者 faster-whisper 都行。这样就能得到一个可以作为基础文本的东西——但注意不要直接用这个文本，原始转写会有笔误和口误。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步&lt;/strong&gt;，修正文本。基于前面的字幕信息或者转写出来的文本，整理一遍，看里边会不会有笔误或者口误之类的。说错的东西修正一下，重复的口头语去掉。修正完的版本才是有用的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四步&lt;/strong&gt;，从视频里提取关键帧。有些视频连续好几帧变化不大、信息差异不大，要设置一个合理的阈值，只截真正有画面变化的帧。尤其是那种 PPT 幻灯片的公开课，画面几秒一翻页，关键帧就在翻页的那一刻。截下来的关键帧按照前后次序记录好时间轴。这个时间轴后面有用——你点文字想快速跳转的时候，能对得上。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第五步&lt;/strong&gt;，生成最终产物。前面你有了文本（修正过的逐字稿）也有了图片（关键帧），就可以生成了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以做成一个网页，打开方便。网页里内嵌好图片也排好文本。&lt;/li&gt;
&lt;li&gt;网页也可以转成 Word 文档，方便编辑。&lt;/li&gt;
&lt;li&gt;生成幻灯片（PPTX）。&lt;/li&gt;
&lt;li&gt;生成一个干货总结，去掉铺垫和重复，只留核心内容，但不能损失任何重要信息。&lt;/li&gt;
&lt;li&gt;最后，有一个可选项：中间的这些临时文件（下载的视频、提取的音频、原始截图）要允许用户选择保留还是删除。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;后续如果要进行上面的过程，要能够直接通过 &lt;code&gt;/视频萃取 https://www.bilibili.com/video/BVxxxxxx&lt;/code&gt; 之类的命令来完成这个过程。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;这段对话为什么能让 opencode 写出一个完整的技能&lt;/h2&gt;
&lt;p&gt;拆开看的话，上面这段话给了 opencode 它需要的所有原材料：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;每一轮要做什么&lt;/strong&gt;：下载、音视频分离、文本修正、关键帧、最终产物，五步，每一步都明确了输入和输出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具链&lt;/strong&gt;：yt-dlp 下载、ffmpeg 提取音频和帧、whisper 转写、python-pptx 做幻灯片。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常兜底&lt;/strong&gt;：不能下载就截图加音频流，任何平台都能拿到内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;质量控制&lt;/strong&gt;：修正转写中的笔误和口误，不是直接用原始输出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多格式输出&lt;/strong&gt;：网页、Markdown、Word、幻灯片、总结，不同需求都能覆盖。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;openode 拿到这些之后，能把它转成一个结构化的 SKILL.md 文件——包含命令名、触发条件、步骤模板、输出清单、工具依赖、注意事项。下次直接用命令调就行了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="images/0e6457e694980856.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;写好技能之后怎么用&lt;/h2&gt;
&lt;p&gt;按照上面的过程完成之后，OpenCode应该已经技能文件放到 &lt;code&gt;~/.config/opencode/skills/&lt;/code&gt; 对应的目录下。之后只需要说一句：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/视频萃取 https://www.bilibili.com/video/BVxxxxxx&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它就自动把整套流程载入上下文，你不必再说第一步干嘛第二步干嘛。这也是技能和纯搞一个脚本的区别——技能是带上下文、带步骤的，模型知道整体要干什么。重复的事一次跑通，后面全靠命令。&lt;/p&gt;
&lt;p&gt;完成后的效果如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="images/4bc29aa529d04356.png"&gt;&lt;/p&gt;
&lt;p&gt;然后检查一下对应目录应该是给制作好了所要求的文件了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="images/c8aab131b249d219.png"&gt;&lt;/p&gt;
&lt;p&gt;上面这个案例只是为了给大一新生演示，所以非常简单也非常粗糙，其实技能系统还有很多更复杂的玩法，此处就不展开更多了。&lt;/p&gt;
&lt;p&gt;千万不要怕自己没有什么编程基础啊经验啊等等都，这些都不应该太担心，大胆尝试一下再说。&lt;/p&gt;
&lt;p&gt;没有任何编程经验的朋友也不要担心，只要你能把这个过程说清楚，并且是可控的，每一步都有明确的验证的方法，就基本可以大胆尝试不用担心了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;因为重要的不是任何的编程的基础和经验，而是把一件事情拆解成一个个可行步骤的这个过程。&lt;/p&gt;
&lt;p&gt;好了，接下来根据你需要的场景，想办法创作属于自己的技能吧。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇高校教师建议大学新生先掌握「提问的智慧」下一篇大学新生可能遇到的各种常见缩写速查简介&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Tool"/><category term="OpenCode-进阶之技能创作拆解描述典型任务后验证实现再做成可复用的技能"/></entry><entry><title>OpenCode 从零创作技能：把视频萃取出文章和幻灯片</title><link href="https://blog.cycleuser.org/opencode-skill-video-extract.html" rel="alternate"/><published>2026-07-22T12:30:00+08:00</published><updated>2026-07-22T12:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-22:/opencode-skill-video-extract.html</id><summary type="html">&lt;p&gt;前面有很多跟 OpenCode 相关的一点经验分享给大家：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/gao-xiao-jiao-shi-jian-yi-da-yi-kai-xue-yao-you-dian-nao-hai-yao-an-zhuang-dai-ma-zhu-li"&gt;高校教师建议大一开学要有电脑，还要安装 OpenCode 使用智能体&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/opencode-de-si-zhong-yong-fa-yu-wei-shi-yao-wo-tui-jian-ming-ling-xing"&gt;opencode 的四种用法与 …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;前面有很多跟 OpenCode 相关的一点经验分享给大家：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/gao-xiao-jiao-shi-jian-yi-da-yi-kai-xue-yao-you-dian-nao-hai-yao-an-zhuang-dai-ma-zhu-li"&gt;高校教师建议大一开学要有电脑，还要安装 OpenCode 使用智能体&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/opencode-de-si-zhong-yong-fa-yu-wei-shi-yao-wo-tui-jian-ming-ling-xing"&gt;opencode 的四种用法与为什么我推荐命令行&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/opencodebu-zhi-shi-xie-dai-ma-yong-mian-fei-mo-xing-bang-ni-sou-jiao-cheng-xia-shi-pin"&gt;不只是写代码：用 opencode 和免费模型帮你搜教程、下视频&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/yong-opencode-bang-xue-xi-shang-ke-mei-ting-dong-de-dong-xi-rang-ta-bang-ni-cha-qing-chu-hua-ming-bai"&gt;用 opencode 帮学习：上课没听懂的东西，让它帮你查清楚画明白&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/opencodejin-jie-an-zhuang-ji-neng-zai-gai-jin-cong-pdfdu-qu-nei-rong-lai-tian-biao-he-wen-dang"&gt;OpenCode进阶-安装技能再改进：从PDF读取内容来填表和文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中关于技能的部分，有不少朋友看过了基于已有技能修改的案例之后，表示想从头来创作一个自己的技能，希望给个案例参考一下。&lt;/p&gt;
&lt;p&gt;这回咱们考虑这样一个场景：从视频提取图片做出文档。&lt;/p&gt;
&lt;p&gt;看视频费眼睛，也费时间。刷过学习视频的人都懂——半个小时讲下来，真正有信息量的可能就那几分钟。剩下的大半是口头禅、重复、空镜头。视频的信息密度确实不高。&lt;/p&gt;
&lt;p&gt;但很多好东西只有视频。当年在北师大听过不少赵峥老先生的课，后来发现他在 B 站上还发了很多物理公开课。讲得好，但不看可惜，长时间盯着又累。&lt;/p&gt;
&lt;p&gt;有了 opencode 之后就在想，能不能让它帮个忙：把视频下载下来，提取音频转成逐字稿，抓关键帧做成幻灯片，再写一篇总结。整个流程跑一遍，输出一份随时能翻看的图文材料。说干就干，这个事来回改了挺久，最后不光能做出来，还把整个过程做成一个技能了。&lt;/p&gt;
&lt;p&gt;这个过程本身挺值得说一说的。&lt;/p&gt;
&lt;p&gt;和上一回提到的"改一个已有的技能"不一样了，这次终于是从零开始，先想清楚要干什么，把步骤拆解开，自己详细叙述给 opencode 让它跑通验证，再把流程整理成技能文件存下来。后面每次直接调用就行，不用重新解释。&lt;/p&gt;
&lt;h2&gt;从零把一件事变成技能&lt;/h2&gt;
&lt;p&gt;有时候你觉得一个流程特别好用，但每次都得跟 AI 从头说一遍，太累了。比如这个"下载视频→提取字幕→关键帧→幻灯片→文章"的流程。你心里门儿清，但不想每次打这么多字。&lt;/p&gt;
&lt;p&gt;opencode 的技能系统就是解决这个的。你第一次把流程跟它讲清楚，它帮你写成技能文件。以后直接调技能名，当初设计好的流程完整载入上下文，省掉所有重复的口舌。&lt;/p&gt;
&lt;h2&gt;怎么跟 opencode 说清楚你要干什么&lt;/h2&gt;
&lt;p&gt;关键是把任务拆解完、说详细。拿视频萃取这个例子来说，我给 OpenCode 的对话大概是下面这样的。（注意，我就是把下面的文字直接发给 OpenCode 的，大家也可以这么做，但没必要严格按照我这样的文本格式和次序，完全可以有自己的风格探索出来哈。）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;要帮我创建一个技能。这个技能中文名字叫视频萃取，英文名字叫 VideoExtract，要完成下面这些事。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一步&lt;/strong&gt;，想办法调用工具把链接里的视频下载下来。yt-dlp 能用的就用 yt-dlp 下载。如果实在不能下载，就用截图加音频流的方式把内容获取下来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步&lt;/strong&gt;，处理音频。如果能获得原始的字幕就用原始字幕，字幕比转写更准。如果不能，就基于音频来生成字幕，用 whisper 或者 faster-whisper 都行。这样就能得到一个可以作为基础文本的东西——但注意不要直接用这个文本，原始转写会有笔误和口误。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三步&lt;/strong&gt;，修正文本。基于前面的字幕信息或者转写出来的文本，整理一遍，看里边会不会有笔误或者口误之类的。说错的东西修正一下，重复的口头语去掉。修正完的版本才是有用的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第四步&lt;/strong&gt;，从视频里提取关键帧。有些视频连续好几帧变化不大、信息差异不大，要设置一个合理的阈值，只截真正有画面变化的帧。尤其是那种 PPT 幻灯片的公开课，画面几秒一翻页，关键帧就在翻页的那一刻。截下来的关键帧按照前后次序记录好时间轴。这个时间轴后面有用——你点文字想快速跳转的时候，能对得上。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第五步&lt;/strong&gt;，生成最终产物。前面你有了文本（修正过的逐字稿）也有了图片（关键帧），就可以生成了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以做成一个网页，打开方便。网页里内嵌好图片也排好文本。&lt;/li&gt;
&lt;li&gt;网页也可以转成 Word 文档，方便编辑。&lt;/li&gt;
&lt;li&gt;生成幻灯片（PPTX）。&lt;/li&gt;
&lt;li&gt;生成一个干货总结，去掉铺垫和重复，只留核心内容，但不能损失任何重要信息。&lt;/li&gt;
&lt;li&gt;最后，有一个可选项：中间的这些临时文件（下载的视频、提取的音频、原始截图）要允许用户选择保留还是删除。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;后续如果要进行上面的过程，要能够直接通过 &lt;code&gt;/视频萃取 https://www.bilibili.com/video/BVxxxxxx&lt;/code&gt; 之类的命令来完成这个过程。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;这段对话为什么能让 opencode 写出一个完整的技能&lt;/h2&gt;
&lt;p&gt;拆开看的话，上面这段话给了 opencode 它需要的所有原材料：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;每一轮要做什么&lt;/strong&gt;：下载、音视频分离、文本修正、关键帧、最终产物，五步，每一步都明确了输入和输出。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;工具链&lt;/strong&gt;：yt-dlp 下载、ffmpeg 提取音频和帧、whisper 转写、python-pptx 做幻灯片。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;异常兜底&lt;/strong&gt;：不能下载就截图加音频流，任何平台都能拿到内容。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;质量控制&lt;/strong&gt;：修正转写中的笔误和口误，不是直接用原始输出。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多格式输出&lt;/strong&gt;：网页、Markdown、Word、幻灯片、总结，不同需求都能覆盖。&lt;/p&gt;
&lt;p&gt;opencode 拿到这些之后，能把它转成一个结构化的 SKILL.md 文件——包含命令名、触发条件、步骤模板、输出清单、工具依赖、注意事项。下次直接用命令调就行了。&lt;/p&gt;
&lt;h2&gt;写好技能之后怎么用&lt;/h2&gt;
&lt;p&gt;按照上面的过程完成之后，OpenCode 应该已经把技能文件放到 &lt;code&gt;~/.config/opencode/skills/&lt;/code&gt; 对应的目录下。之后只需要说一句：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/视频萃取 https://www.bilibili.com/video/BVxxxxxx&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;它就自动把整套流程载入上下文，你不必再说第一步干嘛第二步干嘛。这也是技能和纯搞一个脚本的区别——技能是带上下文、带步骤的，模型知道整体要干什么。重复的事一次跑通，后面全靠命令。&lt;/p&gt;
&lt;p&gt;完成后的效果如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img alt="OpenCode 根据指令生成技能文件和输出目录" src="images/图1.png"&gt;&lt;/p&gt;
&lt;p&gt;然后检查一下对应目录应该是给制作好了所要求的文件了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="桌面上的测试输出目录和产物文件" src="images/图2.png"&gt;&lt;/p&gt;
&lt;p&gt;上面这个案例只是为了给大一新生演示，所以非常简单也非常粗糙，其实技能系统还有很多更复杂的玩法，此处就不展开更多了。&lt;/p&gt;
&lt;p&gt;千万不要怕自己没有什么编程基础啊经验啊等等的，这些都不应该太担心，大胆尝试一下再说。&lt;/p&gt;
&lt;p&gt;没有任何编程经验的朋友也不要担心，只要你能把这个过程说清楚，并且是可控的，每一步都有明确的验证的方法，就基本可以大胆尝试不用担心了。&lt;/p&gt;
&lt;p&gt;因为重要的不是任何的编程的基础和经验，而是把一件事情拆解成一个个可行步骤的这个过程。&lt;/p&gt;
&lt;p&gt;好了，接下来根据你需要的场景，想办法创作属于自己的技能吧。&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="skill"/><category term="workflow"/><category term="video"/><category term="learning"/></entry><entry><title>高校教师建议大学新生先掌握「提问的智慧」</title><link href="https://blog.cycleuser.org/question-wisdom.html" rel="alternate"/><published>2026-07-22T00:00:00+08:00</published><updated>2026-07-22T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-22:/question-wisdom.html</id><summary type="html">&lt;p&gt;大胖哥
大胖哥&lt;/p&gt;
&lt;p&gt;先说清楚，这里说的"提问的智慧"不是当年那篇经典文章。&lt;/p&gt;
&lt;p&gt;当年那篇讲的是，遇到系统报错、软件闪退、代码报 bug …&lt;/p&gt;</summary><content type="html">&lt;p&gt;大胖哥
大胖哥&lt;/p&gt;
&lt;p&gt;先说清楚，这里说的"提问的智慧"不是当年那篇经典文章。&lt;/p&gt;
&lt;p&gt;当年那篇讲的是，遇到系统报错、软件闪退、代码报 bug，该先去搜索引擎搜一圈，看看有没有人踩过同样的坑。&lt;/p&gt;
&lt;p&gt;那是搜索引擎时代的智慧，现在已经不够用了。&lt;/p&gt;
&lt;p&gt;当然了，也依然还有很多人连那种搜索习惯都还没养成。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;何不自己搜&lt;/h2&gt;
&lt;p&gt;经常有人在群里问：这是什么？去哪下？怎么用？&lt;/p&gt;
&lt;p&gt;这些东西放在搜索时代就该自己解决。&lt;/p&gt;
&lt;p&gt;你不动手指，先去张嘴，人家能不想：你连搜都懒得搜？&lt;/p&gt;
&lt;p&gt;这种直接伸手的可能是两种人。&lt;/p&gt;
&lt;p&gt;一种是怯懦。怕搜出来看不懂的东西，胆小不敢点，怕试错了搞坏了。&lt;/p&gt;
&lt;p&gt;另一种就是懒惰。问一嘴有人答了就省事，多方便呢。&lt;/p&gt;
&lt;p&gt;第三种人现在很少了——就是真不知道世界上有搜索引擎这东西。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;工具强多了&lt;/h2&gt;
&lt;p&gt;现在的大语言模型，能联网，能查资料，能帮你把网上的碎片信息理到一个文档里，还都标着出处。&lt;/p&gt;
&lt;p&gt;你遇到不懂的东西，正确做法是先让大模型帮你搜一下。&lt;/p&gt;
&lt;p&gt;汇总一个简短的东西，五百字以内，最好是三百字以内。&lt;/p&gt;
&lt;p&gt;你读了，想了，拿着这个初步的认知再去跟别人聊。&lt;/p&gt;
&lt;p&gt;这是这个时代提问的基本姿势。&lt;/p&gt;
&lt;p&gt;你什么都直接张嘴问。&lt;/p&gt;
&lt;p&gt;搁以前人家会问你：不知道有搜索引擎吗？&lt;/p&gt;
&lt;p&gt;搁现在人家会问你：不会用大模型吗？&lt;/p&gt;
&lt;p&gt;你要是真不会，那是无知。不知者不为怪，下次知道了就好。&lt;/p&gt;
&lt;p&gt;可你要是会，也清楚该怎么做，偏不去动那个手，那就是懒。&lt;/p&gt;
&lt;p&gt;懒可以给自己找很多理由，思维惯性也好、习惯也好，总能找到一个台阶下。&lt;/p&gt;
&lt;p&gt;但不该这样。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;该怎么问&lt;/h2&gt;
&lt;p&gt;我说个具体例子，老师跟你说，「有个东西叫 opencode，挺好用的，大家试一试。」&lt;/p&gt;
&lt;p&gt;你该怎么反应？&lt;/p&gt;
&lt;p&gt;别问「那是什么」。&lt;/p&gt;
&lt;p&gt;别问「在哪下载」。&lt;/p&gt;
&lt;p&gt;更别问「怎么安装」。&lt;/p&gt;
&lt;p&gt;所有搜索引擎能解决的问题，不搜一下就问出去就应该为自己感到羞耻。&lt;/p&gt;
&lt;p&gt;你应该问的是：「我找到了这个网址，下了这个版本，装好了。我拿它试了一下，能写文章、能画图、能做作业。我想继续用它整理下周要交的实验报告，这个方向可行吗？有什么要注意的？还有哪些其他场景？」&lt;/p&gt;
&lt;p&gt;这才是带着思考问问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;问路的道理&lt;/h2&gt;
&lt;p&gt;这和问路是类似的。&lt;/p&gt;
&lt;p&gt;走丢了就先导航。&lt;/p&gt;
&lt;p&gt;导航有时候会带你走小路、拐错巷子，但你得先走过一遍，别上来就拽着路边的人问。&lt;/p&gt;
&lt;p&gt;我今天就去取了个快递。&lt;/p&gt;
&lt;p&gt;菜鸟驿站在同一片地址附近有三家。&lt;/p&gt;
&lt;p&gt;我先按照收到的短信（上面没有联系方式）导航了，结果到了其中一家。&lt;/p&gt;
&lt;p&gt;但是附近还有另外两家，二百米外有一家，三百米外还有一家。&lt;/p&gt;
&lt;p&gt;我推测导航可能会出错，这个小区的一期、二期、一区、二区等等对导航来说可能混淆了。&lt;/p&gt;
&lt;p&gt;我走到窗口，没问"我快递在哪"。&lt;/p&gt;
&lt;p&gt;说的是：&lt;/p&gt;
&lt;p&gt;「取件地址留的是这里的菜鸟驿站，但短信里没有门牌号，导航到了你们这儿，请帮我查一下我手机尾号的这件是你们家这里的还是另外两家的？&lt;/p&gt;
&lt;p&gt;如果没有找到，估计是另外两家的，一般来说大家经常弄混的可能是哪家？&lt;/p&gt;
&lt;p&gt;容易走错？中间那条路还在修，是不是只能绕？」&lt;/p&gt;
&lt;p&gt;对方很愿意帮我。因为我自己探索了来的，而且也提供了足够背景信息。&lt;/p&gt;
&lt;p&gt;所以一定要带着自己的上下文去问。&lt;/p&gt;
&lt;p&gt;带着探索过的痕迹，带着初步的设想。&lt;/p&gt;
&lt;p&gt;这样人家能跟你有更多的共同语境，也更容易接你的话茬。&lt;/p&gt;
&lt;p&gt;沟通不是索取，这是交流。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;别当伸手党&lt;/h2&gt;
&lt;p&gt;别问哪些「我用什么软件好」或者「该怎么装」。&lt;/p&gt;
&lt;p&gt;人哪有义务和时间精力来给解决所有问题？&lt;/p&gt;
&lt;p&gt;你该说的是：「我想要做某件事（明确表达目的），搜到了某个软件（初步的线索），装好了一个版本（已经有尝试），试了一下拿它试做了某个东西（探索了用法），不知道这条路往下走可行不（参考经验）？还有没有更顺手的工具（扩展方向）？需要注意哪些问题（兜底一下）？」&lt;/p&gt;
&lt;p&gt;提问不是不行。但你得带着自己的努力作为诚意去问。&lt;/p&gt;
&lt;p&gt;空手张嘴等人投喂，以前是不知道搜索引擎，现在是连大模型都懒得用。&lt;/p&gt;
&lt;p&gt;你带了探索、带了上下文、带了你的想法去问，别人起码沟通起来更容易，自然也更有可能愿意接住你的话。&lt;/p&gt;
&lt;p&gt;怎么才算高效沟通？&lt;/p&gt;
&lt;p&gt;就是你问出来的问题，对方能看出来你已经自己做过了、自己试过了。&lt;/p&gt;
&lt;p&gt;他能接着你的话说下去，而不是从零开始给你补课。&lt;/p&gt;
&lt;p&gt;以前哥廷根学派有个说法，说愚蠢的问题是受欢迎的。&lt;/p&gt;
&lt;p&gt;这话没错，但有个前提：你得先意识到这问题愚蠢，然后自己也先试一下。&lt;/p&gt;
&lt;p&gt;试过了，实在搞不定，再来问，这不用担心。&lt;/p&gt;
&lt;p&gt;怕的是明明自己随便动动手就能搞定的东西，偏不去碰，张嘴就问。&lt;/p&gt;
&lt;p&gt;那不是愚蠢，那是懒惰。&lt;/p&gt;
&lt;p&gt;行为上懒惰已经可怕了，思想上的懒惰是不可原谅的。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇OpenCode进阶-安装技能再改进：从PDF读取内容来填表和文档下一篇OpenCode 进阶之「技能创作」：拆解描述典型任务后验证实现再做成可复用的「技能」&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Education"/><category term="education"/><category term="communication"/><category term="AI"/><category term="freshman"/><category term="university"/></entry><entry><title>OpenCode进阶-安装技能再改进：从PDF读取内容来填表和文档</title><link href="https://blog.cycleuser.org/opencodejin-jie-an-zhuang-ji-neng-zai-gai-jin-cong-pdfdu-qu-nei-rong-lai-tian-biao-he-wen-dang.html" rel="alternate"/><published>2026-07-21T00:00:00+08:00</published><updated>2026-07-21T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-21:/opencodejin-jie-an-zhuang-ji-neng-zai-gai-jin-cong-pdfdu-qu-nei-rong-lai-tian-biao-he-wen-dang.html</id><summary type="html">&lt;p&gt;前面说了 opencode 能帮你搜教程、下视频，也能帮你补上课没听懂的知识点。&lt;/p&gt;
&lt;p&gt;那更复杂的事儿能管吗？&lt;/p&gt;
&lt;p&gt;比如我有一堆杂七杂八的资 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;前面说了 opencode 能帮你搜教程、下视频，也能帮你补上课没听懂的知识点。&lt;/p&gt;
&lt;p&gt;那更复杂的事儿能管吗？&lt;/p&gt;
&lt;p&gt;比如我有一堆杂七杂八的资料文件，要从里面提取数据，然后按一个固定模板填好，格式一点都不能走样——这种活儿它能干吗？&lt;/p&gt;
&lt;p&gt;能。&lt;/p&gt;
&lt;p&gt;今天就拿一个真实的例子，从头到尾演示一遍——从安装技能、发现技能不够用、当场改进技能、重新安装、到最终拿改进后的技能把活儿干了的全过程。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;先把技能装上&lt;/h2&gt;
&lt;p&gt;opencode 有个东西叫"技能"（Skill），相当于给智能体预设了一套标准化的操作流程。你遇到一类反复出现的任务，就给它装个技能，下次一句话就能触发整套流程。&lt;/p&gt;
&lt;p&gt;我维护了一个开源的技能仓库，在 GitHub 上：https://github.com/cycleuser/Skills/&lt;/p&gt;
&lt;p&gt;之前也有相关介绍：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565115&amp;amp;idx=1&amp;amp;sn=c327133cef7aa1f2eb575483a4ad4b67&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;OpenCode Skills：分享一套自己乱写的还算实用的 AI 编码技能库&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565786&amp;amp;idx=1&amp;amp;sn=30da7a46f0dc1fda3be26f31eaed5ef6&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;自用的 OpenCode Skills 合集更新：从 6 个技能到 22 个，以及必须承认的问题&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650565930&amp;amp;idx=1&amp;amp;sn=d435fca5dc94cf5c208cea76a4b0f1f1&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;自用的OpenCode Skill再次更新：22个skills重新打磨了一遍，顺路解决了OpenCode导致整个图形界面崩溃的问题&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;里面目前有二十多个技能，覆盖架构设计、开发、测试、写作、专利、公文、模板保真填表这些场景。&lt;/p&gt;
&lt;p&gt;安装方式有两种。&lt;/p&gt;
&lt;p&gt;第一种，直接把仓库地址丢给 opencode，让它自己装。你在对话里跟它说"帮我把 https://github.com/cycleuser/Skills/ 这个技能仓库安装到本机"，它就会自己去克隆仓库、跑安装脚本、把技能文件放到该放的位置。你啥都不用管，等它装完就行。&lt;/p&gt;
&lt;p&gt;第二种，一条命令的事儿：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl -sSL https://raw.githubusercontent.com/cycleuser/Skills/main/quick-install-opencode.sh | bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;跑完就全装好了。&lt;/p&gt;
&lt;p&gt;如果你想改了技能直接生效，也可以克隆到本地再安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/cycleuser/Skills.git
cd Skills
python3 install-opencode.py install --source .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;装完验证一下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ls ~/.config/opencode/skills/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;能看到一堆技能目录就对了。技能文件放在 &lt;code&gt;~/.config/opencode/skills/&lt;/code&gt; 目录下，opencode 启动时自动发现。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;填表技能是什么&lt;/h2&gt;
&lt;p&gt;这次要用的是一个叫 &lt;code&gt;tianbiao&lt;/code&gt;（填表）的技能，专门干"照着模板填数据、保持格式不走样"的活儿。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/4546b00461a601e8.png"&gt;&lt;/p&gt;
&lt;p&gt;复杂的事情用技能&lt;/p&gt;
&lt;p&gt;它的核心原则就一条：&lt;strong&gt;复制原模板，把数据填进对应单元格，保持原有字体、边框、合并单元格与版式，绝不从零重排。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为什么不能从零画表？因为用 python-docx 从零新建表格的话，字体、字号、边框、行高、合并单元格全都会走样，跟原模板对不上。学校的表格、单位的报表，格式都是有固定要求的，差一点都不行。所以必须打开原模板，只替换单元格里的文字，让填进去的内容继承单元格原有的样式。&lt;/p&gt;
&lt;p&gt;这个技能有几个命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/填表 &amp;lt;模板&amp;gt; &amp;lt;数据&amp;gt;&lt;/code&gt; — 按模板填充数据，保持格式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/填表 convert &amp;lt;文件&amp;gt;&lt;/code&gt; — 把 .doc/.xls 老格式转成可编辑的 .docx/.xlsx&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/填表 inspect &amp;lt;模板&amp;gt;&lt;/code&gt; — 填之前先摸清模板的表格结构&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/填表 check &amp;lt;文档&amp;gt;&lt;/code&gt; — 填完校验格式保真度和数据一致性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;原来它的工作流是五步：转换老格式 → 摸底模板结构 → 准备数据 → 填充 → 校验。适用于试卷质量分析表、成绩分析表、过程性评价档案、考查课报告这类学校表格。&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;hr&gt;
&lt;h2&gt;事情的起因&lt;/h2&gt;
&lt;p&gt;我手头有一份 84 页的 PDF，是 2026 年中国大学生计算机设计大赛吉林省级赛的成绩公示名单，里面有一千多条获奖记录。还有一个空白的获奖统计表模板，docx 和 xlsx 各一份，只有表头没有数据。&lt;/p&gt;
&lt;p&gt;我要做的就是把 PDF 里的获奖记录提取出来，按模板的格式填进去。&lt;/p&gt;
&lt;p&gt;这个活儿看着简单，实际上又臭又长：PDF 表格解析、换行处理、数据清洗、模板格式保真、批量填充——每一步都有坑。&lt;/p&gt;
&lt;p&gt;我翻了一下填表技能的说明，发现一个问题：它只覆盖了"从结构化源文件（点名册、成绩表）提数据"的场景，而我这次的数据源是一堆非结构化的 PDF，里头的表格还各种换行错位。&lt;/p&gt;
&lt;p&gt;也就是说，技能不够用。&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;hr&gt;
&lt;h2&gt;基于已有技能来修改&lt;/h2&gt;
&lt;p&gt;不够用怎么办？改。不用从零写，在已有技能基础上加东西就行。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/bd6900efb8080494.png"&gt;&lt;/p&gt;
&lt;p&gt;基于已有技能来修改&lt;/p&gt;
&lt;p&gt;重点改 &lt;code&gt;tianbiao&lt;/code&gt;。缺什么补什么——它缺的是"从非结构化资料提取文本"的能力。原来的技能只会从结构化的 Excel 点名册里读数据，碰到 PDF 和图片就抓瞎。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;改进出来新技能&lt;/h2&gt;
&lt;p&gt;新增了一个完整的文本提取规则文件，涵盖：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文件类型路由&lt;/strong&gt;：按扩展名自动分流——有文字层的 PDF 用 pdfplumber 提取，没文字层的扫描件转图片后 OCR，Office 文档用 python-docx/openpyxl 原生解析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OCR 引擎选择&lt;/strong&gt;：中文扫描件首选 PaddleOCR，英文用 Tesseract，高精度需求上云服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错行检测与纠正&lt;/strong&gt;：PDF 多栏排版被读成交错文本的问题，用坐标信息按 Y 轴分行、X 轴分栏来修复&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OCR 纠错&lt;/strong&gt;：形近字（已→己）、数字混淆（0→O）、换行错位、乱码字符的清洗规则&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提取质量校验&lt;/strong&gt;：关键数字回查原文位置、字段完整性、数值合理性&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/fe37c1136197749b.png"&gt;&lt;/p&gt;
&lt;p&gt;改进出来新技能&lt;/p&gt;
&lt;p&gt;同时更新了工作流：原来的"Step 3 备数据"拆成两条路径——3a 从非结构化资料提取（PDF/图片/扫描件），3b 从结构化源文件读取。新增了 &lt;code&gt;/填表 extract &amp;lt;资料目录&amp;gt;&lt;/code&gt; 命令。&lt;/p&gt;
&lt;p&gt;技能版本从 1.0.0 升到 1.1.0。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;技能改进后安装完成&lt;/h2&gt;
&lt;p&gt;改完的技能文件在 GitHub 仓库里，要同步到本机 opencode 的配置目录才生效。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/e6fd31c1a4f7adb8.png"&gt;&lt;/p&gt;
&lt;p&gt;技能改进后安装完成&lt;/p&gt;
&lt;p&gt;技能文件全部复制到位：&lt;code&gt;tianbiao&lt;/code&gt; 新增了 &lt;code&gt;text-extraction.md&lt;/code&gt; 文本提取规则，更新了工作流和命令。验证版本号 1.1.0 对了，文件都在，安装完成。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;具体测试&lt;/h2&gt;
&lt;p&gt;技能装好了，开始干活。先加载填表技能，然后把两个文件路径甩给它——一个是 PDF 数据源，一个是 xlsx 模板。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/0d9c92ed37ffea06.png"&gt;&lt;/p&gt;
&lt;p&gt;具体测试&lt;/p&gt;
&lt;p&gt;同目录下还有个 docx 文件，也是模板。我先分别检查了三个文件：PDF 是 84 页的成绩公示名单（数据源），xlsx 和 docx 都是空白模板（只有表头，7 列 51 行）。&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;hr&gt;
&lt;h2&gt;技能开始执行&lt;/h2&gt;
&lt;p&gt;技能开始执行。先用 pdfplumber 提取 PDF 的表格数据。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/0d9c92ed37ffea06.png"&gt;&lt;/p&gt;
&lt;p&gt;技能开始执行&lt;/p&gt;
&lt;p&gt;第一轮提取到 989 条，但 PDF 实际有 1003 条记录。差了 14 条。排查发现是两种特殊情况：5 条"弃赛"和 9 条"未获奖"——它们的奖项字段不是"一等奖/二等奖/三等奖/优胜奖"，所以没被匹配到。另外还有学校名和赛道名跨行的问题（比如"吉林农业科技\n学院"被读成两行）。&lt;/p&gt;
&lt;p&gt;修正了提取逻辑：把"弃赛"和"未获奖"也纳入奖项集合，加了 &lt;code&gt;clean()&lt;/code&gt; 函数清理换行符。第二轮提取，1003 条全部到位。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;要求进一步明确&lt;/h2&gt;
&lt;p&gt;提取到 1003 条，但模板只有 50 个数据行。这是个明显需要确认的点——不可能瞎填。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/3d9f212a9035adc1.png"&gt;&lt;/p&gt;
&lt;p&gt;要求进一步明确&lt;/p&gt;
&lt;p&gt;opencode 没有自作主张，而是停下来问了我一个问题：你是要全部 1003 条、还是只填某个学校/某个教师/特定学生的？我选了"全部记录"，那模板就要扩展到 1003 行。&lt;/p&gt;
&lt;p&gt;这个"不确定就问"的设计很重要。填表技能的铁律之一就是"不编造、不猜"——宁可停下来确认，也不闷头干完了发现方向错了。&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;hr&gt;
&lt;h2&gt;完成了&lt;/h2&gt;
&lt;p&gt;确认后开始填充。docx 版本：克隆模板的数据行扩展到 1003 行，每行填入序号、学校、成员、指导教师、赛道、奖项、是否推荐国赛。数据行用宋体 9pt 居中，表头设了跨页重复（&lt;code&gt;tblHeader&lt;/code&gt;），每行设了防跨页断裂（&lt;code&gt;cantSplit&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/97beb8cd3664aa15.png"&gt;&lt;/p&gt;
&lt;p&gt;完成了&lt;/p&gt;
&lt;p&gt;xlsx 版本也同步生成：用 openpyxl 打开原模板，只写值不动原有样式，数据行设了宋体 9pt 居中加边框。&lt;/p&gt;
&lt;p&gt;两个文件都填充完毕，1003 条记录一条不少。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;得到文件&lt;/h2&gt;
&lt;p&gt;校验结果：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/a470fb5f30adb554.png"&gt;&lt;/p&gt;
&lt;p&gt;得到文件&lt;/p&gt;
&lt;p&gt;docx 版本：1004 行（1 表头 + 1003 数据），7 列，标题段落保留原模板样式，表头跨页重复，数据行防断裂。抽查首尾数据与源 PDF 一致。&lt;/p&gt;
&lt;p&gt;xlsx 版本：1004 行 7 列，表头样式保留，数据行宋体 9pt 居中带边框。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;最终成品&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/d62de49cdbbc8ced.png"&gt;&lt;/p&gt;
&lt;p&gt;最终成品&lt;/p&gt;
&lt;p&gt;两个文件保存在原目录下：&lt;code&gt;2026设计大赛获奖统计-已填充.docx&lt;/code&gt; 和 &lt;code&gt;2026设计大赛获奖统计-已填充.xlsx&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;整个过程我做了什么？&lt;/p&gt;
&lt;p&gt;开头说了两句话——一句是"参考那篇文章改进技能"，一句是"用改进后的技能填这两个文件"。中间发现技能不够用、当场改了技能、重新安装、提取 PDF、修正数据、扩展模板、填充、校验——全是 opencode 自己跑的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;回顾一下这个过程&lt;/h2&gt;
&lt;p&gt;这个案例跟前面几篇不一样的地方在于：它不是"用一个现成工具干一件事"，而是"工具不够用的时候先改工具，再用改好的工具干活"。&lt;/p&gt;
&lt;p&gt;opencode 的技能系统设计的初衷就是这样的。技能不是黑箱，是透明的 Markdown 文件——你能看到它的每一条规则、每一个步骤。不够用了就加规则，过时了就改流程，不需要等别人发版本。&lt;/p&gt;
&lt;p&gt;这次具体加了什么？一个 &lt;code&gt;text-extraction.md&lt;/code&gt;，把"从 PDF/图片/扫描件提取文本→OCR 识别→错行纠正→数据校验"这套流程标准化了。下次再遇到类似的活儿——不管是成绩公示、获奖名单、还是什么别的 PDF 表格——一句话就能触发整套流程，不用从头教。&lt;/p&gt;
&lt;p&gt;这其实就是用 AI 的正确姿势：&lt;strong&gt;不是每次都从零开始描述需求，而是把重复出现的任务沉淀成技能，让工具自己记住怎么做。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你用的次数越多，积累的技能越多，后面干活的效率就越高。一开始可能要花点时间改技能、调规则，但这个投入是复利的——同一个技能以后每次用都不用再教。&lt;/p&gt;
&lt;p&gt;学会用工具，从学会改工具开始。&lt;/p&gt;
&lt;p&gt;对新人大学生来说，在很多需要填表儿的时候，也可以用这类的东西来帮自己提高效率。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇初步说一说大学里的教风和学风下一篇高校教师建议大学新生先掌握「提问的智慧」&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="AI"/><category term="技能设计"/><category term="填表"/><category term="PDF提取"/><category term="OCR"/><category term="大学生"/></entry><entry><title>高校教师建议大学新生不要用内向的标签影响自己的沟通效率</title><link href="https://blog.cycleuser.org/not-introvert-but-learning-to-speak.html" rel="alternate"/><published>2026-07-20T08:30:00+08:00</published><updated>2026-07-20T08:30:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-20:/not-introvert-but-learning-to-speak.html</id><summary type="html">&lt;p&gt;原创&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src=""&gt;&lt;/p&gt;
&lt;p&gt;有人天生话少，有人喜欢独处。这都没问题。&lt;/p&gt;
&lt;p&gt;但还有一种情况——你遇到需要沟通的事就紧张。跟人说话紧张，表达想法紧张 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;原创&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src=""&gt;&lt;/p&gt;
&lt;p&gt;有人天生话少，有人喜欢独处。这都没问题。&lt;/p&gt;
&lt;p&gt;但还有一种情况——你遇到需要沟通的事就紧张。跟人说话紧张，表达想法紧张，被回应之前就紧张，连问一句「你刚才说的是什么意思」都紧张。然后给自己贴个标签：我内向。&lt;/p&gt;
&lt;p&gt;可能不是。&lt;/p&gt;
&lt;p&gt;内向的人需要表达的时候也照样能说，只是不需要的时候不想说。&lt;/p&gt;
&lt;p&gt;如果你是&lt;strong&gt;想说但不敢说&lt;/strong&gt;，那可能不是因为性格，是因为还没学会怎么开口。&lt;/p&gt;
&lt;p&gt;怕被否定，怕被嘲笑，怕对方不理你，怕说错了显得很蠢。这很正常。很多人都有过这个阶段，只是有的人早一点跨过去了，有的人晚一点。&lt;/p&gt;
&lt;p&gt;没跨过去的容易把自己归类为「内向性格」，然后就不再尝试了。&lt;/p&gt;
&lt;p&gt;这有点可惜了，而且影响很大。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;跟人费劲，跟 AI 也费劲&lt;/h2&gt;
&lt;p&gt;很多人以为跟人沟通紧张是天生的，跟 AI 总该没问题——AI 不会拒绝你，不会不耐烦，不会打断你。&lt;/p&gt;
&lt;p&gt;也许问题根本不在于对方是谁，问题在于你自己敢不敢把话说清楚。&lt;/p&gt;
&lt;p&gt;你跟 AI 的交互效率，取决于你能多大程度、多准确地把脑子里的东西倒出来。&lt;/p&gt;
&lt;p&gt;脑子里想了很多，打出来就剩「帮我写个东西」。&lt;/p&gt;
&lt;p&gt;AI 只能猜。&lt;/p&gt;
&lt;p&gt;猜不对的时候，你嫌 AI 笨。&lt;/p&gt;
&lt;p&gt;其实是信息被你自己砍掉了大半。&lt;/p&gt;
&lt;p&gt;这样一来，表达的动力就越来越弱了。&lt;/p&gt;
&lt;p&gt;哪怕是世上最强的模型坐在对面，你不敢把自己的意思完整地推出去，也只能用到它很少的能力。&lt;/p&gt;
&lt;p&gt;你给它的是碎片，它还给你也只能是碎片。&lt;/p&gt;
&lt;p&gt;然后你觉得 AI 不行。&lt;/p&gt;
&lt;p&gt;其实是你没给 AI 机会去理解你。&lt;/p&gt;
&lt;p&gt;反过来，哪怕你语言组织能力一般，只要你尽力去把你的想法倒出来——打字、画图、举例、类比、甚至说「我说不清楚但大概是这个意思你听我尽量详细说」——AI 总有办法去逼近你的真实意图。&lt;/p&gt;
&lt;p&gt;表达的量够了，理解度才能上来。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;一个容易陷入的循环&lt;/h2&gt;
&lt;p&gt;这个模式可能很早就开始了。&lt;/p&gt;
&lt;p&gt;第一次受挫很受伤，没有得到及时的鼓励和反馈，自己闷在心里。&lt;/p&gt;
&lt;p&gt;上课不敢举手，不是不想回答，是怕答错了被注意。&lt;/p&gt;
&lt;p&gt;作业不会做不敢问，不是不想学，是怕问了显得自己不行。&lt;/p&gt;
&lt;p&gt;时间长了，你确实会比那些敢问敢说的同学显得「慢」。&lt;/p&gt;
&lt;p&gt;不是智力上慢，是信息效率上慢——人家不断获取反馈、不断修正。&lt;/p&gt;
&lt;p&gt;你躲着，越躲越习惯待在自己的壳里。&lt;/p&gt;
&lt;p&gt;然后你落后。&lt;/p&gt;
&lt;p&gt;落后就更不愿意开口。&lt;/p&gt;
&lt;p&gt;更不愿意开口就更落后。&lt;/p&gt;
&lt;p&gt;等到了成年，这个循环已经转了很多圈了。&lt;/p&gt;
&lt;p&gt;你可能已经把「回避→落后→更回避」的模式归结为「我就是内向」「我就是不喜欢跟人打交道」。&lt;/p&gt;
&lt;p&gt;当然不喜欢——如果从来没从沟通中获得过正反馈，谁都不会喜欢。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;这不是性格，是一种可以练习的能力&lt;/h2&gt;
&lt;p&gt;沟通和跑步、写字、编程一样，是可以练的。&lt;/p&gt;
&lt;p&gt;小时候没练好，现在自然起点低了一些。&lt;/p&gt;
&lt;p&gt;但水平差的态度应该是去练，不是绕开。&lt;/p&gt;
&lt;p&gt;当你轻易地说「我内向」，好像这就意味着这是天生的、不可变的、甚至是一种值得被接受的标签。&lt;/p&gt;
&lt;p&gt;可如果你说「我在这方面能力需要加强」，你就承认了可以改变、可以选择练习、可以从最低门槛开始一点点做。&lt;/p&gt;
&lt;p&gt;两种描述，指向的是不一样的路。&lt;/p&gt;
&lt;p&gt;内向是很正常的人格特质，不需要也很难被改造。&lt;/p&gt;
&lt;p&gt;但如果是因为害怕而回避沟通，这就是一个可以通过练习来改善的问题。&lt;/p&gt;
&lt;p&gt;它让你在所有需要协作、需要求助、需要表达的节点上都吃亏。&lt;/p&gt;
&lt;p&gt;包括跟 AI 之间——你同样会敏感，同样会在不确定的时候选择沉默，同样不敢追问、不敢推翻重来、不敢要求 AI 换一种方式解释。&lt;/p&gt;
&lt;p&gt;你跟 AI 的交流，仍然被你跟人交流的习惯限制着。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;试试这样做&lt;/h2&gt;
&lt;p&gt;不需要变成一个社交达人。不需要在任何场合都侃侃而谈。&lt;/p&gt;
&lt;p&gt;只需要在&lt;strong&gt;需要沟通的那一刻&lt;/strong&gt;，把话说出来。&lt;/p&gt;
&lt;p&gt;哪怕磕磕巴巴，哪怕表述不够准，哪怕对方暂时没听明白。&lt;/p&gt;
&lt;p&gt;继续说。换方式说。&lt;/p&gt;
&lt;p&gt;把「怕被拒绝」放一边，把「把事儿说清楚」放第一位。&lt;/p&gt;
&lt;p&gt;跟人如此，跟 AI 也是如此。&lt;/p&gt;
&lt;p&gt;不要只给它一句话。&lt;/p&gt;
&lt;p&gt;给它背景，给它约束，给它你的判断，给它你试过的方向。&lt;/p&gt;
&lt;p&gt;不用在意它对你的评价，而是给它你对它输出的评价。&lt;/p&gt;
&lt;p&gt;AI 不怕你话多。AI 怕你什么都不说然后它不好进行模式选配和回应。&lt;/p&gt;
&lt;p&gt;开口的能力不是天生的性格，是可以攒出来的习惯。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;我其实很内向&lt;/h2&gt;
&lt;p&gt;郭德纲说自己内向，别人可能不信。&lt;/p&gt;
&lt;p&gt;我也信他说自己内向。&lt;/p&gt;
&lt;p&gt;我自己就是个很内向的人，一般都把想法和感受放在心里面。&lt;/p&gt;
&lt;p&gt;除非觉得必要，很少主动跟人分享。&lt;/p&gt;
&lt;p&gt;但我上课不用麦克风，几十人到上百人都能听清。&lt;/p&gt;
&lt;p&gt;沈阳站里帮走散的老人喊了一嗓子让全场寂静下来，那是日行一善。&lt;/p&gt;
&lt;p&gt;跟孩子滔滔不绝甚至喋喋不休，那是本职工作的职责所在。&lt;/p&gt;
&lt;p&gt;内向，喜欢安静，个性没必要也不需要改。&lt;/p&gt;
&lt;p&gt;但沟通习惯，需要说的时候能说出来，这是可以练的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../images/72339012f0a70ffc.jpg"&gt;&lt;/p&gt;
&lt;p&gt;配图与文字毫无关系。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;</content><category term="Education"/><category term="communication"/><category term="AI"/><category term="education"/><category term="freshman"/><category term="university"/></entry><entry><title>手机测产状界面演进：从粗略演示到离线野外工具</title><link href="https://blog.cycleuser.org/chanzhuang-ui-evolution.html" rel="alternate"/><published>2026-07-20T00:00:00+08:00</published><updated>2026-07-20T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-20:/chanzhuang-ui-evolution.html</id><summary type="html">&lt;p&gt;上一篇讲清楚了产状的数学计算。链接如下：&lt;/p&gt;
&lt;p&gt;https://blog.cycleuser.org/%E4%BA%A7%E7%8A%B6%E6%B5%8B%E9%87%8F.html&lt;/p&gt;
&lt;p&gt;点击访问原文也可以直达。&lt;/p&gt;
&lt;p&gt;这篇记录 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;上一篇讲清楚了产状的数学计算。链接如下：&lt;/p&gt;
&lt;p&gt;https://blog.cycleuser.org/%E4%BA%A7%E7%8A%B6%E6%B5%8B%E9%87%8F.html&lt;/p&gt;
&lt;p&gt;点击访问原文也可以直达。&lt;/p&gt;
&lt;p&gt;这篇记录一下一个网页从一个"能跑就行"的原型，一步步迭代，最后长成一个能在没信号的野外拍照录音存数据离线用的工具的过程。&lt;/p&gt;
&lt;p&gt;下面每个版本都配一张当时的界面示意图。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/1908ebeee683c9d3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;v1.1.0 初版&lt;/p&gt;
&lt;h2&gt;v1.1.0　初版：能跑就行的箭头&lt;/h2&gt;
&lt;p&gt;最早一版只想着把倾向倾角算出来显示。界面很直接：顶部一个满宽的绿色"开始测量（授权传感器）"按钮，中间一块大数字面板显示倾角和倾向，下面一个圆形表盘，表盘里一根黄色长箭头从中心指向倾向方向，长度按倾角缩放。再往下把 Yaw/Pitch/Roll 和屏幕法线一并铺开。&lt;/p&gt;
&lt;p&gt;几点不足：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按钮占了一整行，空间利用低。&lt;/li&gt;
&lt;li&gt;那根黄色箭头偏长，穿过中心点，与底部刻度文字重叠。&lt;/li&gt;
&lt;li&gt;倾向数字后缀"（真北）"括号，中文里还夹着英文 "Dip Dir"，中英混排。&lt;/li&gt;
&lt;li&gt;原生数据全部展开，不关心这些行的用户也得一并看着。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;v1.2.0　加水平仪气泡&lt;/h2&gt;
&lt;p&gt;第一个改进是把中心圆盘做成了一个像真水平仪的东西。圆心多了一圈绿色外环和一个会移动的小气泡，气泡按法线水平分量偏移，倾斜越大气泡越靠边。手感上像在用真正的水准管，比光看数字直观多了。指针还是那根黄箭头，依然又长又黄。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/0e06645c632bf903.jpg"&gt;&lt;/p&gt;
&lt;p&gt;v1.2.0 加水平仪气泡&lt;/p&gt;
&lt;h2&gt;v1.3.3　指针固定，表盘转动&lt;/h2&gt;
&lt;p&gt;这是个根本性的设计翻转。之前一直是"指针动、表盘不动"，但这样在固定平面上转手机时指针会跟着转，不符合"产状不变指针就不动"的直觉。改成反过来：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;指针&lt;strong&gt;固定朝画布顶部&lt;/strong&gt;，永远不动。&lt;/li&gt;
&lt;li&gt;整个表盘刻度盘&lt;strong&gt;随倾向旋转&lt;/strong&gt;，让倾向方位的刻度对准顶部指针。&lt;/li&gt;
&lt;li&gt;气泡继续当物理水平仪。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一改，贴在斜面上转手机时指针保持稳定，表盘刻度像指南针那样转，配合指针直接读出方位。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/c2477f44ea873e7c.jpg"&gt;&lt;/p&gt;
&lt;p&gt;v1.3.3 表盘随倾向转&lt;/p&gt;
&lt;h2&gt;v1.3.5　加横纵水平管&lt;/h2&gt;
&lt;p&gt;光一个圆形水平仪只能看总倾斜，看不出"往哪边歪"。这一版在圆盘两侧加了两根细长水平管：一根纵向（测南北分量），一根横向（测东西分量），各自只反映自己那方向的倾斜。两根管贴着圆盘外边，没占多少空间，但读数更明确了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/027bf5ea4fb79bc3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;v1.3.5 加横纵水平管&lt;/p&gt;
&lt;h2&gt;v1.3.6　存帧、下载 CSV、备注&lt;/h2&gt;
&lt;p&gt;前面几版都只是"实时看一眼"，野外测量要记录。这版加了三个东西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;冻结/继续&lt;/strong&gt;切换（单按钮，文本跟着切换）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存一帧&lt;/strong&gt;：每次点击把当前帧原始数据存一条，含序号、时间、倾向、倾角、四元数、加速度、法线分量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下载 CSV&lt;/strong&gt;：把所有记录导出，UTF-8 BOM 兼容 Excel，文件名带时间戳。&lt;/li&gt;
&lt;li&gt;旁边加了个&lt;strong&gt;备注输入框&lt;/strong&gt;，每条测点能敲几个字。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这下从"看"升级到"记"了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/5108b3c2f5667d0b.jpg"&gt;&lt;/p&gt;
&lt;p&gt;v1.3.6 存帧下载CSV&lt;/p&gt;
&lt;h2&gt;v1.3.8　开始/冻结合一，详情折叠&lt;/h2&gt;
&lt;p&gt;界面越来越挤。这版做了两件减法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开始测量&lt;/strong&gt;和&lt;strong&gt;冻结读数&lt;/strong&gt;本来是两个按钮，合成一个：没启动时显示"开始测量"，启动后变成"冻结读数"，再点切回继续。少一个按钮就少一行。&lt;/li&gt;
&lt;li&gt;那一长串 Yaw/Pitch/Roll/法线/罗盘/磁偏角/经纬度，默认&lt;strong&gt;收起来&lt;/strong&gt;，只显示一个"原生数据"标题，点了才展开。普通人不用看这些。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;界面一下子清爽了，圆盘成了绝对主体。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/d84a0a489a5c2e0b.jpg"&gt;&lt;/p&gt;
&lt;p&gt;v1.3.8 开始冻结合一、详情折叠&lt;/p&gt;
&lt;h2&gt;v1.3.11　水平管细长贴边，指针白色半透&lt;/h2&gt;
&lt;p&gt;水平管本来有点粗，挤得圆盘不好看。这版把它们做细做长，紧贴圆盘外缘，像真的水准管贴在仪表边上。指针也改了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;缩短，不再顶到刻度字。&lt;/li&gt;
&lt;li&gt;从刺眼的黄色换成&lt;strong&gt;白色半透明&lt;/strong&gt;，与深色背景对比清晰但不喧宾夺主。&lt;/li&gt;
&lt;li&gt;屏幕朝下时才变红警示。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;按钮文案也统一：开始测量、保存、下载，字号统一，加了 &lt;code&gt;white-space:nowrap&lt;/code&gt; 防止英文状态下换行。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/8df520383b8e80be.jpg"&gt;&lt;/p&gt;
&lt;p&gt;v1.3.11 水平管细长指针白色半透&lt;/p&gt;
&lt;h2&gt;v1.4.1　拍照、录音、ZIP 打包&lt;/h2&gt;
&lt;p&gt;野外调查光记数字不够，得能拍照存证、录音备注。这版加了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;拍照按钮&lt;/strong&gt;：调起后置摄像头，拍完存为附件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;录音按钮&lt;/strong&gt;：用 &lt;code&gt;MediaRecorder&lt;/code&gt; 录音，优先选 AAC/Opus 高压缩编码，点一下开始，再点停止，文件用时间戳命名（&lt;code&gt;rec_20260718063012.webm&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下载&lt;/strong&gt;：有附件时用 JSZip 打成 zip（CSV + media 文件夹，附件名带序号前缀关联），没附件就纯 CSV。&lt;/li&gt;
&lt;li&gt;所有文件名统一用 &lt;code&gt;YYYYMMDDHHmmss&lt;/code&gt; 格式，精确到秒。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这下从"记录"升级到"多媒体记录"了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/aac8faad24e362a7.jpg"&gt;&lt;/p&gt;
&lt;p&gt;v1.4.1 拍照录音ZIP下载&lt;/p&gt;
&lt;h2&gt;v1.4.3　离线缓存，开始/暂停&lt;/h2&gt;
&lt;p&gt;最后一个关键问题：野外经常没信号。一旦断网，浏览器刷新就加载不出页面，之前采集的数据也无法继续使用。这版加了 &lt;strong&gt;Service Worker&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次访问时把页面本身、JSZip CDN 缓存到本地。&lt;/li&gt;
&lt;li&gt;之后断网也能正常打开和使用，刷新不会白屏。&lt;/li&gt;
&lt;li&gt;用 stale-while-revalidate 策略，有网时悄悄更新，没网时用缓存。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;按钮文案最后又改了一次：去掉"继续"，只留两个状态——&lt;strong&gt;开始&lt;/strong&gt;和&lt;strong&gt;暂停&lt;/strong&gt;，简洁明确。&lt;/p&gt;
&lt;p&gt;详情区从"原生数据"改名"详细信息"，配一个可旋转的小三角按钮，点击展开/收起，不再写"点击展开"这种说明文字。中文状态下纯中文，英文状态下纯英文，不再混排。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/643b09c946afc6ea.gif"&gt;&lt;/p&gt;
&lt;p&gt;v1.4.3 最终版离线缓存&lt;/p&gt;
&lt;h2&gt;一路改下来的几点体会&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 指针和表盘谁该动，是个设计问题不是技术问题。&lt;/strong&gt; 最早让指针动、表盘不动，技术上都对，但用起来不顺手——贴在固定平面上转手机时指针会跟着转，违反"产状不变"的直觉。反过来指针固定、表盘转动，立刻就顺手了。这种"谁动谁不动"的选择，纯几何算不出来，得靠实际拿着手机在斜面上转两下才知道。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 减按钮比加按钮难。&lt;/strong&gt; 开始/冻结/继续三个按钮合成一个，要处理"没启动点开始、启动后点切换冻结"两种状态，逻辑变复杂了，但界面少了两行。值得。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 原生数据该藏起来。&lt;/strong&gt; Yaw/Pitch/Roll/四元数/加速度这些是给调试和复算用的，普通用户根本不看。默认折叠、给个三角按钮，是比"点击展开"这种文字说明更克制的做法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 野外工具必须能离线。&lt;/strong&gt; 这一点一开始没想，等真拿到没信号的地方才发现刷新就白屏。Service Worker 加上之后才算是能放心带出门的东西。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 命名要为文件系统着想。&lt;/strong&gt; 时间戳用 &lt;code&gt;YYYYMMDDHHmmss&lt;/code&gt; 而不是 ISO 的 &lt;code&gt;2026-07-18T06:30:12&lt;/code&gt;，是因为前者直接排序、不会因为冒号在某些系统报错、文件名里也好看。&lt;/p&gt;
&lt;p&gt;整个过程没碰过产状的数学计算，改的全是"用起来顺不顺手""断网了能不能用""能不能把照片和录音一起带走"这些工程和界面问题。&lt;/p&gt;
&lt;p&gt;对于具体的需求来说，算得对只是起步，用得顺才是工具。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;虚拟化，操作系统，以及一些小工具 · 目录&lt;/p&gt;
&lt;h1&gt;虚拟化，操作系统，以及一些小工具&lt;/h1&gt;
&lt;p&gt;上一篇并非故意-为什么我更多用命令行工具而不是GUI&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Design"/><category term="UI"/><category term="Design"/><category term="Attitude"/><category term="Geology"/><category term="Mobile"/></entry><entry><title>初步说一说大学里的教风和学风</title><link href="https://blog.cycleuser.org/chu-bu-shuo-yi-shuo-da-xue-li-de-jiao-feng-he-xue-feng.html" rel="alternate"/><published>2026-07-19T00:00:00+08:00</published><updated>2026-07-19T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-19:/chu-bu-shuo-yi-shuo-da-xue-li-de-jiao-feng-he-xue-feng.html</id><summary type="html">&lt;p&gt;最近高校都在抓师德师风、教风学风。师德师风是立身之本，这没得说，干这行就得守这行的规矩，容不得一点瑕疵。我想说的 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近高校都在抓师德师风、教风学风。师德师风是立身之本，这没得说，干这行就得守这行的规矩，容不得一点瑕疵。我想说的是教风和学风这头，在高校读书加工作，呆了有二十来年了，有点自己的想法。&lt;/p&gt;
&lt;h2&gt;老先生讲的那些古&lt;/h2&gt;
&lt;p&gt;我上学那会儿，老师们爱讲古，讲他们当初上学的时候如何如何。说那时候省属、部属高校拨款差距没那么大，211、985之前，各地高校差距也不像后来这么大。后来才慢慢拉开了。&lt;/p&gt;
&lt;p&gt;老先生讲古，我们当时挺反感——你赶紧讲课的内容啊，净讲这些没用的。现在想想，或许他们讲的其实是想让你知道，这东西是变化的，不是从来如此。&lt;/p&gt;
&lt;p&gt;还有一类老师，我上本科那会儿碰到的，他科研做得好，文章发得多，掌管着实验室，挺有影响力，可上课就抱本书在那念。字面意义的照着念，然后普通话还很堪忧，用我一位同学的评价是「嘴里含着棉裤」，让人挺无语。&lt;/p&gt;
&lt;h2&gt;从胶片到电子幻灯片&lt;/h2&gt;
&lt;p&gt;后来开始电子化，要求用PPT、用幻灯片，好像这东西就高大上了。最早那幻灯片可不是现在这种电子文件，是真胶片，顶上有画有写，做得挺细致，真正投影的那种。那玩意儿成本不低，灯泡还烫，我有一回凑近了瞅想偷偷摆弄一下，差点儿烫着，好奇心驱使，挺危险的。&lt;/p&gt;
&lt;p&gt;那东西有个毛病，做好了想改想换很难。有了电子版的，老师们都说方便了，有代码有数据，改一改、有错也好改。&lt;/p&gt;
&lt;p&gt;可到了二零一几年，风气就不对了。有的老师直接照着幻灯片念。还有的出版社主动凑上来，说我这教材配幻灯片、配教学大纲，有的老师就爱选这种。也不一定是他自己懒，有可能就是新入职的，不知道怎么弄，拿来就用。&lt;/p&gt;
&lt;p&gt;结果就是有的课一门下来，完全照着教材的幻灯片念，一本书的目录就是一门课的目录。&lt;/p&gt;
&lt;h2&gt;大学这个"大"字&lt;/h2&gt;
&lt;p&gt;大学不像初高中，拿一本标准教材、按标准答案讲就行。&lt;/p&gt;
&lt;p&gt;大学这个"大"字，我觉得就是说，即便是通识课、导论课，也不应该、没必要只用一本教材，完全顺着教材目录往下讲。&lt;/p&gt;
&lt;p&gt;只讲一本书，还能配称为"大"吗？那不成了教材导读了么？&lt;/p&gt;
&lt;p&gt;一门课总是要与时俱进有所更新的，而教材出来的时间总是很有滞后性，哪怕最新版的，大概也得是一年前甚至两年前写的了。&lt;/p&gt;
&lt;p&gt;所以专业课，我是很鼓励老师们都尽量自编讲义，一定要尊重学情，实事求是，而不能是说为了方便省事而直接照着教材生搬硬套，削足适履。&lt;/p&gt;
&lt;p&gt;然而，更可怕的还在后边。有的人连幻灯片都懒得念。&lt;/p&gt;
&lt;h2&gt;念歪了的翻转课堂&lt;/h2&gt;
&lt;p&gt;翻转课堂这东西本意是好的，想提高学生的参与度，让孩子们自主探索，这是好事。&lt;/p&gt;
&lt;p&gt;可有的地方念歪了，变成让学生做PPT，让学生上前面讲。人家交着学费，一年便宜的几千，贵的上万，家里还供着生活费，来了之后自己个儿做幻灯片、自己个儿讲。&lt;/p&gt;
&lt;p&gt;早些年没AI的时候，孩子们还得自己找点资料做一做，多少能锻炼点。后来有了AI，催生出代做幻灯片的生意，AI生成也好，网上随便买一份也好，到那儿一糊弄就对付过去了。&lt;/p&gt;
&lt;p&gt;授课老师美其名曰翻转课堂。可坐底下的学生能收获啥？今年上半年不就闹出过舆情，学生说我们花着学费来这儿，不是为了自己做个东西上前面念，这有啥意思？&lt;/p&gt;
&lt;p&gt;这事挺让人遗憾，也挺让人惶恐。&lt;/p&gt;
&lt;h2&gt;精致或者不太精致的利己&lt;/h2&gt;
&lt;p&gt;教风出问题，学风也跟着出问题。&lt;/p&gt;
&lt;p&gt;一类孩子是找分儿。考了七十多分，跑来找老师，帮我调个八十多吧，我要出国，绩点得好看。&lt;/p&gt;
&lt;p&gt;我上学那会儿就有这样的，挺精致。更有甚者，给同学出那种不太体面的主意，让拿着东西去找老师请吃送礼。&lt;/p&gt;
&lt;p&gt;这就已经碰到师德师风的红线了。&lt;/p&gt;
&lt;p&gt;有的地方可能是当地习俗带进来了，讲究鱼头朝向谁，讲究送礼。社会风气对孩子们也是一种侵害，有时候家长自己也受影响，让孩子给老师送东西。我特别反感这种事。&lt;/p&gt;
&lt;h2&gt;不要作弊，大不了补考重修&lt;/h2&gt;
&lt;p&gt;还有一类孩子是作弊。他赌别人抓不着，抓着了就耍可怜、耍无辜，"我也是第一次"怎么怎么着。&lt;/p&gt;
&lt;p&gt;可人呐，怎么可能总是第一次就被抓呢？其实之前有可能也弄过吧？ 而且一旦被人抓着一回，后边儿人家就不太信你了。&lt;/p&gt;
&lt;p&gt;考试这玩意儿哪怕过不了，无非是补考。我当年有一回骑自行车，后边三轮把我怼了，三轮跑了。那会儿北京学校里也没那么完善的监控，我跟辅导员一说，脚还疼，脑袋也晕，好在一查，骨头没断，韧带关节损伤，问题不大，但疼啊，走不了路，没法考试。那一学期好几门课没考，全挂了。后来补考，补考过不了的重修，总归不是什么太难的事儿。&lt;/p&gt;
&lt;p&gt;我现在不也照样毕业，本科之后读研、读博，一路过来了。&lt;/p&gt;
&lt;p&gt;补考重修这都怕，那还混啥了？&lt;/p&gt;
&lt;p&gt;可现在的孩子把挂科看得特别重，四处打听，我能不能挂科什么的，这事就变味儿了。&lt;/p&gt;
&lt;h2&gt;歪风不怪小树林&lt;/h2&gt;
&lt;p&gt;作弊之外还有一类，跟教风学风都有关。&lt;/p&gt;
&lt;p&gt;有的课老师给原题让学生针对地来背诵，那样就成了单纯比拼记忆力了。&lt;/p&gt;
&lt;p&gt;比如某个语种的阅读题，一共就这几个阅读材料，答案长这样。&lt;/p&gt;
&lt;p&gt;孩子就把答案当数字硬背——334，323，对应CCD、CBC。&lt;/p&gt;
&lt;p&gt;答案的数字背是背下来了，课程内容学会了吗？恐怕够呛。&lt;/p&gt;
&lt;p&gt;这就成了为考试而优化，跟我之前那篇文章说的一样，&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566635&amp;amp;idx=1&amp;amp;sn=b18c067daaa2217e4b5ab16d8b4134b7&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;「事情本身不重要」是怎么炼成的&lt;/a&gt;？就是盲目地针对指挥棒进行优化，跟给牛奶加三聚氰胺、给辣椒加苏丹红，差不太多。&lt;/p&gt;
&lt;p&gt;这种风气当然不能只怪孩子，也不能只怪某一个环节。&lt;/p&gt;
&lt;p&gt;一个系统性的风险，得从大一一来就打好预防针，让孩子们别走入歧途，别走弯路，别走上错路。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇用 opencode 帮学习：上课没听懂的东西，让它帮你查清楚画明白下一篇OpenCode进阶-安装技能再改进：从PDF读取内容来填表和文档&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="School"/><category term="Thinking"/></entry><entry><title>用 opencode 搞学习：上课没听懂的东西，让它帮你查清楚画明白</title><link href="https://blog.cycleuser.org/yong-opencode-gao-xue-xi-shang-ke-mei-ting-dong-de-dong-xi-rang-ta-bang-ni-cha-qing-chu-hua-ming-bai.html" rel="alternate"/><published>2026-07-18T06:45:00+08:00</published><updated>2026-07-18T06:45:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-18:/yong-opencode-gao-xue-xi-shang-ke-mei-ting-dong-de-dong-xi-rang-ta-bang-ni-cha-qing-chu-hua-ming-bai.html</id><summary type="html">&lt;p&gt;之前说了 opencode 能帮你搜教程、下视频。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566692&amp;amp;idx=1&amp;amp;sn=6dc9a21822df55f90aacde40560c8fa7&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;不只是写代码：用opencode和免费模型帮你搜教程、下视频&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有同学问：那上课的事儿能管吗？我上课没听懂，回去想补，它能 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;之前说了 opencode 能帮你搜教程、下视频。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566692&amp;amp;idx=1&amp;amp;sn=6dc9a21822df55f90aacde40560c8fa7&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;不只是写代码：用opencode和免费模型帮你搜教程、下视频&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有同学问：那上课的事儿能管吗？我上课没听懂，回去想补，它能帮上忙吗？&lt;/p&gt;
&lt;p&gt;能。今天就拿一个真实的例子演示一遍。&lt;/p&gt;
&lt;p&gt;假如你在课上听老师提了一嘴，说海盗数量和全球变暖有相关性，还说"相关性不等于因果性"。&lt;/p&gt;
&lt;p&gt;但当时没注意听，下课回想起来一头雾水——海盗跟气候变暖怎么就扯上关系了？相关性不等于因果性又是啥意思？&lt;/p&gt;
&lt;p&gt;换以前，我上学那会，要是查起来得自己搜索半天，翻好几篇文章，对着零散的资料拼凑，还得自己找数据画图。&lt;/p&gt;
&lt;p&gt;这次咱们直接开 opencode，一句话甩过去。&lt;/p&gt;
&lt;h2&gt;先把事儿说清楚&lt;/h2&gt;
&lt;p&gt;我是这么下命令的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/9ba92d7e2f162ddc.png"&gt;&lt;/p&gt;
&lt;p&gt;说出疑惑&lt;/p&gt;
&lt;p&gt;"上课听到老师说海盗和气候变暖的相关性以及什么相关性不等于因果性之类的，我当时没注意听，想办法搜集好这个数据，用python进行可视化，并且详细写一篇文章来给我解释清楚。"&lt;/p&gt;
&lt;p&gt;就这么一句。你看这里头有几个关键信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;发生了什么&lt;/strong&gt;：上课老师讲了海盗和气候变暖的相关性，还有"相关性不等于因果性"。这交代了背景，让它知道我要补的是什么知识点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;我没听懂&lt;/strong&gt;：直接说我当时没注意听。不用装，不用绕弯子，它不会嫌你笨，你说了它就知道得从基础讲起，不能默认你已经懂了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要什么&lt;/strong&gt;：搜集数据、Python 可视化、写文章解释清楚。三条明确的需求，不是泛泛的"帮我了解一下"。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要解释清楚&lt;/strong&gt;：不是给我一堆链接让我自己看，是要它讲明白。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这四条缺一条都差点意思。你要是只说"帮我查一下海盗和全球变暖的事儿"，它给你一段百度百科你看了还是迷糊。你要是只说"解释一下相关性不等于因果性"，它给你背个统计学定义你更迷糊。把"搜集数据、画图、写文章"一起说清楚，它就知道你要的不是一段话，是一套能看懂的东西。&lt;/p&gt;
&lt;p&gt;跟上一篇说的一样：&lt;strong&gt;把事儿说清，不需要文采，需要信息量给够。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;它开始干活了&lt;/h2&gt;
&lt;p&gt;命令给出去，它先派了个子智能体去搜数据。&lt;/p&gt;
&lt;p&gt;这个"子智能体"你可以理解成它分了个身出去专门干一件事——搜海盗和全球变暖相关性的原始资料。关键词换了好几轮，最后定位到了源头：2005年俄勒冈州立大学一个叫 Bobby Henderson 的物理学毕业生，给堪萨斯州教育委员会写的一封公开信。&lt;/p&gt;
&lt;p&gt;这封信本身就是个讽刺作品。当时堪萨斯教育委员会要在生物课上教"智能设计论"（神创论的马甲），Henderson 觉得离谱，就写了封信说：你们要是这逻辑能成立，那我也可以说全球变暖是海盗减少造成的。他还附了张图，海盗越少温度越高，相关系数高得吓人。&lt;/p&gt;
&lt;p&gt;这个故事的来龙去脉，我自己百度未必能这么快串起来。子智能体几轮搜索就把原始信件、数据来源、后人整理的数据集、相关讨论全给捞回来了：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/7b14a668ccf9b395.png"&gt;&lt;/p&gt;
&lt;p&gt;初步的结果&lt;/p&gt;
&lt;h2&gt;数据有了，开始画图&lt;/h2&gt;
&lt;p&gt;数据是 1800 到 2020 年的，海盗数量从大约 35000 人锐减到几十人，全球温度异常值从 -0.4°C 升到 1.1°C。它直接写了个 Python 脚本：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/aaff58b120e40715.png"&gt;&lt;/p&gt;
&lt;p&gt;代码样本&lt;/p&gt;
&lt;p&gt;脚本一气呵成画了五张图：双 Y 轴时间序列，海盗数量一条线往下掉、温度一条线往上爬，几乎是完美的镜像；散点图加回归线，皮尔逊相关系数 r ≈ -0.96，"强负相关"；混淆变量示意图，点破工业化进程同时导致海盗减少和全球变暖；冰淇淋销量和溺水人数的对比图，类比"天气热"才是共同原因；还有更多荒谬的虚假相关案例，比如 Nicolas Cage 每年演的电影数量和美国泳池溺亡人数高度相关。&lt;/p&gt;
&lt;h2&gt;然后它写了篇文章&lt;/h2&gt;
&lt;p&gt;图生成完，它顺手写了篇完整的文章：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/6c92868b5a33a77e.png"&gt;&lt;/p&gt;
&lt;p&gt;给出的结果&lt;/p&gt;
&lt;p&gt;文章从 Henderson 2005年的公开信讲起，把数据摆出来，解释为什么 r ≈ -0.96 不代表海盗导致了气候变暖，点出"工业化"这个混淆变量，又用冰淇淋-溺水的类比讲清楚混淆变量的概念，最后给了五条区分相关和因果的实用判断标准：时间先后、排除混淆变量、机制合理性、实验验证、剂量效应。&lt;/p&gt;
&lt;p&gt;整个过程，我就说了开头那一句话。搜索资料、写脚本、生成图片、撰写文章，全是它自己跑的。&lt;/p&gt;
&lt;h2&gt;这跟问网页版模型有什么区别&lt;/h2&gt;
&lt;p&gt;有同学可能说：这种知识点我直接问豆包、Kimi 不也行吗？&lt;/p&gt;
&lt;p&gt;行，但效果差不少。网页版模型能给你讲"相关性不等于因果性"的概念，也能举海盗的例子，但它是纯文本的——给你一段话，你自己脑补。你要看图，它可能就给你画个 ASCII 的示意图，或者给你段代码让你自己跑。&lt;/p&gt;
&lt;p&gt;opencode 不一样，它在你机器上有终端、有文件系统、能跑 Python、能装 matplotlib。你说"可视化"，它真的给你生成 PNG 图片存到本地，你打开就能看。你说"写文章"，它真的给你生成一个 Markdown 文件，直接就是一篇成型的东西。&lt;/p&gt;
&lt;p&gt;这就是区别：网页版是"讲解"，opencode 是"交付"。讲解是你听完还得自己消化，交付是东西直接摆到你面前，你能反复看、能改、能发出去。&lt;/p&gt;
&lt;p&gt;而且更关键的是，它给你的东西是可以验证的。数据来源它告诉你了，脚本你可以自己跑一遍，图你可以自己改参数重新画。这不是它说啥你就信啥，是它给了你一套可以复查的材料。这一点对学习尤其重要——你不能光看结论，得能追溯过程。&lt;/p&gt;
&lt;h2&gt;中间还能追问&lt;/h2&gt;
&lt;p&gt;前面的任务完成之后你还能接着问。比如我不明白"皮尔逊相关系数"是啥，我就直接问它："那个 r = -0.96 是怎么算出来的？"&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/d74280397a865708.png"&gt;&lt;/p&gt;
&lt;p&gt;它会接着上文给你讲：皮尔逊相关系数是衡量两个变量线性相关程度的指标，从 -1 到 1，-1 是完美负相关，1 是完美正相关，0 是无关。-0.96 说明海盗数量和温度几乎是完美的负向线性关系。然后它可能还会提醒你：但就算 r = -1，也不代表因果关系。&lt;/p&gt;
&lt;p&gt;你不用每次从头解释背景，它记得你刚才在干什么。这一点比每次开新对话的网页版强不少。你追着问下去，一个点一个点搞明白，比一次性灌一堆概念强。&lt;/p&gt;
&lt;h2&gt;为什么这个用法对学习特别有用&lt;/h2&gt;
&lt;p&gt;大学的学习跟高中不一样。高中老师讲完你做题，做题不会再问老师。大学很多时候是你上课听了，下课发现没听懂，但又不知道从哪儿问起——你可能连"哪儿没懂"都说不太清。&lt;/p&gt;
&lt;p&gt;opencode 这种用法恰恰能解决这个尴尬：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;你说个大概就行&lt;/strong&gt;。"老师讲了海盗和气候变暖，我没听懂"——它就能开始帮你补。你不用精确描述你哪儿没懂，它先给你铺一遍，你看完自然知道自己哪儿还不明白，再追着问。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;它给你可视化的东西&lt;/strong&gt;。人看图比看字快，一条曲线比一段描述直观一百倍。它能画图，这是纯文本模型比不了的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;它给你的材料能反复看&lt;/strong&gt;。文章存下来了，图存下来了，你过两天忘了再翻出来看。不像对话窗口关了就没了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;它能层层深入&lt;/strong&gt;。先给你现象，再给你原理，再给你类比，再给你更多案例。你懂了就停，没懂就接着问，节奏你自己控。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大学里没人追着你教了，你得学会自己补。但"自己补"不等于"闷头查"，用好工具能省你大量时间。&lt;/p&gt;
&lt;h2&gt;说到底还是那个道理&lt;/h2&gt;
&lt;p&gt;跟上一篇说的一样：&lt;strong&gt;你得会把事儿说清楚。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;"上课没听懂海盗和气候变暖的相关性，帮我搜集数据、可视化、写文章解释清楚。"——这一句话里，背景、需求、交付形式都有了。&lt;/p&gt;
&lt;p&gt;你要是说"帮我讲讲统计学"，它给你一段统计学综述你看了更迷糊。你要是说"帮我画个图"，它不知道画啥。把背景交代清、把需求说具体、把交付形式说明确，它基本能给你办明白。&lt;/p&gt;
&lt;p&gt;这能力不光是跟模型打交道用得上。你以后写邮件、提需求、跟人协作，都是同一套逻辑——把事儿说清，别让人猜。&lt;/p&gt;
&lt;p&gt;学会用工具，先从习惯进行表达和提问开始。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇不只是写代码：用opencode和免费模型帮你搜教程、下视频下一篇初步说一说大学里的教风和学风&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="AI"/><category term="大学生"/><category term="学习辅助"/><category term="可视化"/><category term="统计学"/></entry><entry><title>opencode 不只是写代码：用免费模型帮你搜教程、下视频</title><link href="https://blog.cycleuser.org/opencode-bu-zhi-shi-xie-dai-ma-yong-mian-fei-mo-xing-bang-ni-sou-jiao-cheng-xia-shi-pin.html" rel="alternate"/><published>2026-07-18T00:00:00+08:00</published><updated>2026-07-18T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-18:/opencode-bu-zhi-shi-xie-dai-ma-yong-mian-fei-mo-xing-bang-ni-sou-jiao-cheng-xia-shi-pin.html</id><summary type="html">&lt;p&gt;我作为&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566364&amp;amp;idx=1&amp;amp;sn=95f63f82f914ac114fd890a4fb249c75&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;高校教师建议大一开学要有电脑，还要安装OpenCode使用智能体&lt;/a&gt;，而且之前一篇还说了 &lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566541&amp;amp;idx=1&amp;amp;sn=7ce86cc9c8adf8986f86ce6a4dda3343&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;opencode 的四种用法与为什么我推荐命令行&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;有同学 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我作为&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566364&amp;amp;idx=1&amp;amp;sn=95f63f82f914ac114fd890a4fb249c75&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;高校教师建议大一开学要有电脑，还要安装OpenCode使用智能体&lt;/a&gt;，而且之前一篇还说了 &lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566541&amp;amp;idx=1&amp;amp;sn=7ce86cc9c8adf8986f86ce6a4dda3343&amp;amp;token=1735060016&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;opencode 的四种用法与为什么我推荐命令行&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;有同学看完问：那玩意儿不是给程序员写代码用的吗？&lt;/p&gt;
&lt;p&gt;我又不是学计算机的，跟我有什么关系？&lt;/p&gt;
&lt;p&gt;关系大了。&lt;/p&gt;
&lt;p&gt;opencode 的主要场景不一定是编程。除了写代码和跟操作系统打交道之外，它也能帮你做很多日常任务。&lt;/p&gt;
&lt;p&gt;可以把它看作一个多功能的智能体协同配合过程——你说事，它去搜、去找、去下、去验证，最后把东西摆到你面前。&lt;/p&gt;
&lt;p&gt;还有的同学说：我也安装了，可是不知道怎么用啊？&lt;/p&gt;
&lt;p&gt;今天就拿一个真实的例子演示一遍：去 B 站找一个英语口语教程，下载第一集到桌面。&lt;/p&gt;
&lt;h2&gt;事情得说清楚&lt;/h2&gt;
&lt;p&gt;先看我是怎么下命令的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/2e259bb8e2d41b15.png"&gt;&lt;/p&gt;
&lt;p&gt;给出命令&lt;/p&gt;
&lt;p&gt;"帮我去B站找到有史以来最简明易懂最被认可的英语口语教程，下载其中第一集到本设备的桌面上。"&lt;/p&gt;
&lt;p&gt;就这么一句。但你注意这里头有几个关键信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;去哪儿找&lt;/strong&gt;：B 站。不是抖音，不是快手，就是 B 站。你得把备选区间设定好，否则它找的东西质量不一定符合你的预期。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要什么样的&lt;/strong&gt;：最简明易懂、最被认可。这俩词定调了筛选标准——不要那种一百集讲语法的，也不要那种浮夸卖课的，要的是口碑好、上手快的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要第几集&lt;/strong&gt;：第一集。不是全部，不是"看着办"，全部下载可能磁盘就存不下了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;下到哪儿&lt;/strong&gt;：本设备的桌面。不是下载目录，不是某个项目文件夹，就是桌面，一眼能看见，当然这不是个好的习惯，最好是有一个对应的单独目录，不过为了演示给新手看就先这样了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这四条缺一条都麻烦。你如果只说"帮我下个英语视频"，它可能给你下个非常呆萌的动画儿歌，也可能下个六级听力真题，你看了想骂它，可是实际上问题不在它笨，在于你没说清。&lt;/p&gt;
&lt;p&gt;把它当做一个语言转换过程：从人类的自然语言，转换成一个可执行的搜索操作，以及你希望最后给你呈现的结果。确定性和清晰很重要。这东西最需要的是你进行语言表达的效率——你得能说得清楚，把事儿才能办了。&lt;/p&gt;
&lt;p&gt;你说不清楚的时候怎么办？那就尽量多说。不用考虑遣词造句，不用有文采，你要做的是用最大的信息量把你要做的事儿描述清楚。它的理解能力是不错的，你多给它几条线索，它自己能往一块儿拼。怕的是你给的信息太少，它只能猜，猜歪了你又嫌它不行。&lt;/p&gt;
&lt;h2&gt;它开始干活了&lt;/h2&gt;
&lt;p&gt;命令给出去之后，它自己开始搜：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/9de77eee7203f852.png"&gt;&lt;/p&gt;
&lt;p&gt;模型搜索&lt;/p&gt;
&lt;p&gt;它调用了网络搜索工具，关键词换了好几轮——"最简单易懂 英语口语教程"、"B站最经典英语口语教学"、"百万播放"——这是它在反复校准搜索策略，一轮不够再换一轮。你看那个搜索结果列表，B 站上这类教程是真不少，有"全170集英语经典900句"，有"挑战100天英语开口计划"，还有 Coach Shane 的 Daily Easy English Expression。&lt;/p&gt;
&lt;p&gt;几轮搜下来，它选中了 Coach Shane 这一套。理由它自己说了：每集 3 到 5 分钟，只讲一个地道表达，讲解里不光讲意思还讲连读弱读这些发音细节，零基础一学就会。主频道订阅百万，B 站上多人搬运，累计播放上千万，一些营销号曾经也都推荐过，基本上在英语学习圈子里认可度挺高。&lt;/p&gt;
&lt;p&gt;这个筛选过程你自己做可能要翻半天评论区，对比好几个视频，而模型帮你来几轮搜索就给定位了。这就是工具调用的价值——它不是瞎猜，是真的去查了，查完还给你说了为什么选这个。&lt;/p&gt;
&lt;h2&gt;中间不是一帆风顺&lt;/h2&gt;
&lt;p&gt;找到之后要下载，它先用 yt-dlp 试：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/5cd4ae905ce6a017.png"&gt;&lt;/p&gt;
&lt;p&gt;尝试下载&lt;/p&gt;
&lt;p&gt;报错了。&lt;code&gt;HTTP Error 412: Precondition Failed&lt;/code&gt;。B 站的反爬机制挡住了。&lt;/p&gt;
&lt;p&gt;你看它的反应——它没卡住，没跟你说"对不起我下不了您自己来吧"。它先加 User-Agent、加 Referer 头，再试，还是 412。然后它意识到可能是 yt-dlp 版本太旧，WBI 签名机制搞不定，于是自己去 &lt;code&gt;pip install -U yt-dlp&lt;/code&gt; 把版本升到最新，再试一次——这次过了。&lt;/p&gt;
&lt;p&gt;这个"&lt;strong&gt;自己装工具、自己修问题&lt;/strong&gt;"的能力，是 opencode 和普通网页对话框最大的区别。你要是直接跟千问啊豆包啊等等的网页版说"帮我下个视频"，它十有八九告诉你"抱歉我无法访问外部网络下载文件"，然后这事就卡死了。opencode 不一样，它手里有终端，能装包，能改参数，能反复试。它搞不定的时候会换路径和工具，不是一遇到墙就回头。&lt;/p&gt;
&lt;p&gt;这就是智能体和聊天机器人的区别。聊天机器人只能跟你说话，智能体能动手。&lt;/p&gt;
&lt;h2&gt;搞定了&lt;/h2&gt;
&lt;p&gt;最后视频下到桌面上了：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/e41b082f8e4eb085.png"&gt;&lt;/p&gt;
&lt;p&gt;完成后给结果&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/Users/fred/Desktop/Coach_Shane_001.mp4&lt;/code&gt;，8.6MB，第1集"How are you doing?"，3分21秒。&lt;/p&gt;
&lt;p&gt;它下完还顺带验证了一下文件确实存在、大小正常，然后告诉你选的是哪一套、为什么选、第一集讲的什么。不是甩给你一个文件就完事，是把前因后果都交代了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/104bf967495a9268.png"&gt;&lt;/p&gt;
&lt;p&gt;整个过程你做了什么？你就说了开头那一句话。剩下搜索、筛选、下载、装工具、修报错、验证，全是它自己跑的。你省下来的时间够你看两集教程了。&lt;/p&gt;
&lt;h2&gt;后续还能继续聊&lt;/h2&gt;
&lt;p&gt;下完之后我又问了一句"这个系列不错啊，一共多少集"：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/2edd33af12744615.png"&gt;&lt;/p&gt;
&lt;p&gt;继续交互&lt;/p&gt;
&lt;p&gt;它没忘前文，直接去查那个合集的 playlist 信息，告诉你一个合集 50 集，整套一共 20 个合集，算下来 1000 集，每天学 2 集差不多一年刷完。&lt;/p&gt;
&lt;p&gt;这就是会话的连续性——你不用每次都从头解释背景，它记得你刚才在干什么。这点也比网页对话框强，网页版你刷新一下上下文就丢了，opencode 的会话是持续的，你能像跟一个人聊天一样，一件事追着问下去。&lt;/p&gt;
&lt;h2&gt;为什么不直接用网页版模型&lt;/h2&gt;
&lt;p&gt;有同学可能说：那我直接打开千问、豆包、Kimi 的网页版问不就行了？干嘛非得开终端用 opencode？&lt;/p&gt;
&lt;p&gt;能问，但很多事干不了。网页版模型主要是文本对话，上传文件也有限制，它不具备多工具调用能力——不能跑命令、不能装包、不能下载之后再验证、不能操作你本地的文件系统。你说"帮我下个视频"，它只能告诉你怎么下，不能替你下。你说"帮我整理桌面上这十张图片按日期分类"，它只能教你用 Python 怎么写脚本，不能直接动手帮你分。&lt;/p&gt;
&lt;p&gt;opencode 不一样，它在你机器上有终端、有文件系统、有网络访问、能装包。你说事儿，它动手。这就是 Agent 和聊天助手的本质区别。&lt;/p&gt;
&lt;p&gt;而且最关键的一点——&lt;strong&gt;这套东西不花钱&lt;/strong&gt;。opencode 自带的那个免费模型，绝大部分日常场景都能搞定。下个视频、搜个文档、整理个文件、查个资料，都不用你掏一分钱。你拿它当个免费的辅助使唤就行，能帮你省下大量亲自操作的时间。不一定每次都百分百满意，但总比你自己亲自上手要强得多。&lt;/p&gt;
&lt;h2&gt;为什么推荐用命令行终端&lt;/h2&gt;
&lt;p&gt;还是那句话，我推荐大家用命令行终端版本的 opencode，这样可以尽量减少其他东西的干扰。&lt;/p&gt;
&lt;p&gt;终端里就一个输入框、一段对话、一个结果。你不用关心界面长什么样、按钮在哪儿、广告弹没弹。你只管把事儿说清楚，然后看它干、验证结果，别的都不用管。&lt;/p&gt;
&lt;p&gt;这个体验跟网页对话框最大的不同是：网页版是"对话"，opencode 是"协作"。对话是你问我答，协作是我说事儿你去办。后者更接近你真正想要的东西——你不是想跟 AI 聊天，你是想让 AI 帮你把活干了。&lt;/p&gt;
&lt;h2&gt;说给大学新生的话&lt;/h2&gt;
&lt;p&gt;希望大学新生入学之后，先把这件事练好。&lt;/p&gt;
&lt;p&gt;练什么？练&lt;strong&gt;把事儿说清楚的能力&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;大学跟高中不一样，高中你问老师问同学天经地义，大学很多人不好意思开口。有的同学觉得"我不会，问人家多丢人"，有的同学怕打扰别人，有的同学就是社恐。这时候你偷偷问模型嘛，没人知道，不丢人。&lt;/p&gt;
&lt;p&gt;但问模型这件事本身有门槛——你得会问。&lt;/p&gt;
&lt;p&gt;你说"豆包帮我把作业做了"，它做不出来，你也不知道它怎么做的，它也可能糊弄你。&lt;/p&gt;
&lt;p&gt;你说"帮我在 B 站找一个英语口语教程"，它找的可能是你根本不想看的那种。问题不在它，在你的问题描述可能太模糊。&lt;/p&gt;
&lt;p&gt;把事儿说清，不需要你有文采，不需要你遣词造句，需要的是你把信息量给够：去哪儿找、找什么样的、要哪一部分、放哪儿。这四条说清了，它基本能给你办明白。这四条说糊了，它也只能糊弄回来。&lt;/p&gt;
&lt;p&gt;这其实就是在练沟通能力。你跟模型沟通熟了，跟人沟通也不会差——因为你习惯了把需求拆清楚、把背景交代明白、把预期说明确。这个能力不管你以后干什么都用得上。&lt;/p&gt;
&lt;p&gt;等到你能熟练地用 opencode 搜视频、下文档、整理资料、查资料了，你就再也不用问老师"那个视频在哪儿找的"、"那个软件从哪下载"这种问题了——这种问题问出来才真的呆呆的。安装软件的事儿也可以让它来，下回咱们再说。&lt;/p&gt;
&lt;p&gt;今天这个搜教程加下载的过程，你会看到它中间调用了好几个工具：网络搜索、网页抓取、命令行下载、包管理器升级。如果它找不到某个工具，它自个儿就会装，这事非常方便，你不用操心这些细节。&lt;/p&gt;
&lt;p&gt;但如果你想知道具体是怎么实现的，你可以直接问它："你刚才下载那个视频用的什么命令？为什么第一次失败了？"&lt;/p&gt;
&lt;p&gt;它会把它用的命令、失败的原因、怎么修的，一条一条告诉你。让你干活的同时，还能把背后的门道看明白，这可比自己闷头查文档省事多了。&lt;/p&gt;
&lt;p&gt;大学生活就快开始了，大家赶紧趁早开练。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇一维查找方法综述：从三分、黄金分割到 Fibonacci 与 Brent下一篇用 opencode 帮学习：上课没听懂的东西，让它帮你查清楚画明白&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Tool"/><category term="opencode"/><category term="AI"/><category term="大学生"/><category term="日常任务"/><category term="搜索"/><category term="下载"/><category term="Vibe Coding"/></entry><entry><title>海盗消失了，地球就变暖了？聊聊"相关性不等于因果性"</title><link href="https://blog.cycleuser.org/hai-dao-xiao-shi-liao-di-qiu-jiu-bian-nuan-liao-liao-liao-xiang-guan-xing-bu-deng-yu-yin-guo-xing.html" rel="alternate"/><published>2026-07-17T20:00:00+08:00</published><updated>2026-07-17T20:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-17:/hai-dao-xiao-shi-liao-di-qiu-jiu-bian-nuan-liao-liao-liao-xiang-guan-xing-bu-deng-yu-yin-guo-xing.html</id><summary type="html">&lt;p&gt;2005年，一个叫Bobby Henderson的俄勒冈州立大学物理学毕业生，给美国堪萨斯州教育委员会写了一封公开信。当时教育委员会正在讨论要不要在生物课上教"智能设计论 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;2005年，一个叫Bobby Henderson的俄勒冈州立大学物理学毕业生，给美国堪萨斯州教育委员会写了一封公开信。当时教育委员会正在讨论要不要在生物课上教"智能设计论"（也就是神创论的马甲），Henderson觉得这事儿离谱，就用了一种极其讽刺的方式反驳：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;全球变暖、地震、飓风和其他自然灾害，都是自1800年以来海盗数量急剧减少的直接后果。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;他附了一张图，横轴是海盗数量，纵轴是全球温度。海盗越少，温度越高。相关系数高得吓人。&lt;/p&gt;
&lt;p&gt;这张图后来成了互联网上解释"相关性不等于因果性"最经典的案例之一。&lt;/p&gt;
&lt;h2&gt;先把数据摆出来&lt;/h2&gt;
&lt;p&gt;Henderson用的是近似数据，我整理了一份后人还原的版本：&lt;/p&gt;
&lt;p&gt;&lt;img alt="双Y轴时间序列" src="images/pirates_01_dual_axis.png"&gt;&lt;/p&gt;
&lt;p&gt;从1800年到2020年，海盗数量从大约35000人锐减到几十人，全球温度异常值从-0.4°C上升到1.1°C。两条曲线几乎是完美的镜像关系。&lt;/p&gt;
&lt;p&gt;画成散点图更直观：&lt;/p&gt;
&lt;p&gt;&lt;img alt="散点图与回归线" src="images/pirates_02_scatter.png"&gt;&lt;/p&gt;
&lt;p&gt;皮尔逊相关系数 r ≈ -0.96。在统计学里，这叫"强负相关"——海盗数量每减少一点，温度就升高一点。如果只看这个数字，你可能会觉得海盗确实是地球的空调。&lt;/p&gt;
&lt;h2&gt;为什么说这纯粹是扯淡&lt;/h2&gt;
&lt;p&gt;相关性高不代表因果关系，这是统计学的第一课，但很多人一辈子都没真正理解。&lt;/p&gt;
&lt;p&gt;问题出在哪？Henderson犯了一个经典的错误：&lt;strong&gt;他忽略了一个混淆变量&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="混淆变量示意图" src="images/pirates_04_confounding.png"&gt;&lt;/p&gt;
&lt;p&gt;真实的情况是这样的：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;工业化进程&lt;/strong&gt;同时导致了两件事：
1. 海盗因为各国海军力量增强而减少
2. 化石燃料大量使用导致温室效应加剧、全球变暖&lt;/p&gt;
&lt;p&gt;海盗减少和全球变暖都是工业化的结果，它们之间没有直接的因果关系。就像你不能因为"冰淇淋销量和溺水人数高度正相关"就得出"吃冰淇淋会淹死人"的结论。&lt;/p&gt;
&lt;h2&gt;冰淇淋和溺水：一个更直观的例子&lt;/h2&gt;
&lt;p&gt;&lt;img alt="冰淇淋与溺水" src="images/pirates_03_icecream.png"&gt;&lt;/p&gt;
&lt;p&gt;夏天冰淇淋卖得多，溺水的人也多。相关系数也很高。但原因很简单：&lt;strong&gt;天气热&lt;/strong&gt;。天热→吃冰淇淋多，天热→游泳的人多→溺水的多。冰淇淋和溺水之间没有因果链，"炎热的天气"才是共同的原因。&lt;/p&gt;
&lt;p&gt;在统计学里，这个隐藏的共同原因叫&lt;strong&gt;混淆变量&lt;/strong&gt;（Confounding Variable）。如果你不控制混淆变量，直接拿两个变量算相关系数，得到的就是"虚假相关"（Spurious Correlation）。&lt;/p&gt;
&lt;h2&gt;这世上还有多少荒谬的"相关性"&lt;/h2&gt;
&lt;p&gt;互联网上有一整个网站专门收集这类东西（tylervigen.com/spurious-correlations），随便举几个：&lt;/p&gt;
&lt;p&gt;&lt;img alt="虚假相关案例" src="images/pirates_05_spurious.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nicolas Cage 每年演的电影数量，和当年美国泳池溺亡人数，相关系数 r = 0.66&lt;/li&gt;
&lt;li&gt;美国每年葬礼的数量，和冰淇淋销量，高度正相关&lt;/li&gt;
&lt;li&gt;美国每年离婚率，和人均黄油消费量，几乎同步变化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些荒谬的例子都在说明同一件事：&lt;strong&gt;两个变量在时间上同步变化，不代表一个导致了另一个&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;怎么区分相关和因果&lt;/h2&gt;
&lt;p&gt;几个实用的判断标准：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 时间先后&lt;/strong&gt;
原因必须发生在结果之前。如果A导致B，A的时间线要早于B。但光有时间先后还不够——公鸡打鸣后太阳升起，不代表公鸡叫醒了太阳。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 排除混淆变量&lt;/strong&gt;
把其他可能的解释都考虑一遍。如果有一个变量C同时影响A和B，那A和B之间的"相关"就可能是虚假的。海盗和温度之间的C就是工业化。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 机制合理性&lt;/strong&gt;
因果关系需要一个说得通的物理/生物/社会机制。冰淇淋→溺水没有生理机制，海盗→温度没有物理机制，但CO₂排放→温室效应有明确的物理机制（CO₂吸收红外辐射）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 实验验证&lt;/strong&gt;
最可靠的方法是做对照实验。随机把人分成两组，一组吃冰淇淋一组不吃，然后看溺水量有没有区别。当然这个实验没法做（也不道德），但科学上我们正是通过控制实验来建立因果关系的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 剂量效应&lt;/strong&gt;
如果因果关系成立，增加"原因"的剂量应该增强"结果"。CO₂排放越多，升温越明显——这符合剂量效应。但海盗减少的"剂量"和温度升高之间没有这种机制性的联系。&lt;/p&gt;
&lt;h2&gt;为什么这个话题重要&lt;/h2&gt;
&lt;p&gt;Henderson写那封信的目的不是真的要说服任何人相信海盗理论。他是在讽刺：如果你可以用同样的逻辑支持"海盗导致全球变暖"，那"智能设计论"也可以用类似的方式混进科学课堂。&lt;/p&gt;
&lt;p&gt;这个案例之所以流传了20年还在被反复引用，是因为它实在太完美了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据确实存在（温度确实在升，海盗确实在减少）&lt;/li&gt;
&lt;li&gt;相关性确实很高（r ≈ -0.96）&lt;/li&gt;
&lt;li&gt;因果关系确实荒谬（海盗不是地球的空调）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它用一种极端的方式提醒我们：&lt;strong&gt;数据可以说谎，统计数字也可以。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当你看到"XX和YY高度相关"的新闻标题时，多问一句：有没有混淆变量？有没有反向因果？时间顺序对不对？机制说得通吗？&lt;/p&gt;
&lt;p&gt;别被一张好看的散点图骗了。&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Bobby Henderson, &lt;em&gt;Open Letter to the Kansas School Board&lt;/em&gt;, 2005 (&lt;a href="https://www.venganza.org/about/open-letter/"&gt;venganza.org&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Tyler Vigen, &lt;em&gt;Spurious Correlations&lt;/em&gt; (&lt;a href="https://tylervigen.com/spurious-correlations"&gt;tylervigen.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Judea Pearl, &lt;em&gt;The Book of Why&lt;/em&gt;, 2018&lt;/li&gt;
&lt;/ul&gt;</content><category term="Story"/><category term="Story"/><category term="Math"/><category term="Statistics"/><category term="Correlation"/><category term="Causation"/></entry><entry><title>无人机平飞有利速度与所需速度：最大航程和最大航时分别用什么速度</title><link href="https://blog.cycleuser.org/wu-ren-ji-ping-fei-you-li-su-du-yu-suo-xu-su-du-zui-da-hang-cheng-he-zui-da-hang-shi-fen-bie-yong-shi-yao-su-du.html" rel="alternate"/><published>2026-07-16T10:00:00+08:00</published><updated>2026-07-16T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-16:/wu-ren-ji-ping-fei-you-li-su-du-yu-suo-xu-su-du-zui-da-hang-cheng-he-zui-da-hang-shi-fen-bie-yong-shi-yao-su-du.html</id><summary type="html">&lt;h2&gt;两个容易混淆的概念&lt;/h2&gt;
&lt;p&gt;无人机在平飞时,有两个非常重要的速度概念经常被混淆:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;平飞所需速度&lt;/strong&gt;(Required Speed):维持匀速平飞所需的 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;h2&gt;两个容易混淆的概念&lt;/h2&gt;
&lt;p&gt;无人机在平飞时,有两个非常重要的速度概念经常被混淆:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;平飞所需速度&lt;/strong&gt;(Required Speed):维持匀速平飞所需的最小速度。本质上就是满足升力等于重力的那个速度,对应的是&lt;strong&gt;能否飞起来&lt;/strong&gt;的问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平飞有利速度&lt;/strong&gt;(Best Speed):在所需速度之上的某个特定速度值,能让某种性能指标(航程或航时)达到最大。对应的是&lt;strong&gt;怎么飞最划算&lt;/strong&gt;的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更准确地说,&lt;strong&gt;有利速度不是一个速度,而是两个&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;速度&lt;/th&gt;
&lt;th&gt;对应性能&lt;/th&gt;
&lt;th&gt;物理本质&lt;/th&gt;
&lt;th&gt;关系&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;最大航程速度 &lt;span class="arithmatex"&gt;\(V_{R_{max}}\)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;飞得最远&lt;/td&gt;
&lt;td&gt;对应 &lt;span class="arithmatex"&gt;\((L/D)_{max}\)&lt;/span&gt; (总阻力最小点)&lt;/td&gt;
&lt;td&gt;&lt;span class="arithmatex"&gt;\(V_{R_{max}} &amp;gt; V_{E_{max}}\)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;最大航时速度 &lt;span class="arithmatex"&gt;\(V_{E_{max}}\)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;飞得最久&lt;/td&gt;
&lt;td&gt;对应最小需用功率点&lt;/td&gt;
&lt;td&gt;&lt;span class="arithmatex"&gt;\(V_{E_{max}}\)&lt;/span&gt; 略高于失速速度&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这两个速度都比失速速度高,但最大航时速度非常接近失速边界。&lt;strong&gt;飞最久要飞慢,飞最远要飞快一些&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;理论基础&lt;/h2&gt;
&lt;h3&gt;平飞条件&lt;/h3&gt;
&lt;p&gt;无人机匀速平飞时,升力必须等于重力:&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[L = W = \frac{1}{2} \rho V^2 S C_L\]&lt;/div&gt;
&lt;p&gt;由此解出平飞所需速度:&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[V = \sqrt{\frac{2W}{\rho S C_L}}\]&lt;/div&gt;
&lt;p&gt;从这个公式看,只要迎角不超过临界值(&lt;span class="arithmatex"&gt;\(C_L \leq C_{L_{max}}\)&lt;/span&gt;),总有一个速度满足平飞条件。但不同的速度对应不同的阻力,也就对应不同的燃油消耗率。&lt;/p&gt;
&lt;h3&gt;为什么两个最优速度不同&lt;/h3&gt;
&lt;p&gt;总阻力由两部分组成:&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[D = \underbrace{\frac{1}{2}\rho V^2 S C_{D0}}_{\text{寄生阻力(随V²增大)}} + \underbrace{\frac{1}{2}\rho V^2 S \cdot k C_L^2}_{\text{诱导阻力(随V减小而增大)}}\]&lt;/div&gt;
&lt;p&gt;用平飞条件消去 &lt;span class="arithmatex"&gt;\(C_L\)&lt;/span&gt;,得到阻力随速度的变化:&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[D = \frac{1}{2}\rho V^2 S C_{D0} + \frac{2k W^2}{\rho V^2 S}\]&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;低速时&lt;/strong&gt;(大迎角):诱导阻力占主导,阻力随速度减小而急剧增大(因为需要更大的 &lt;span class="arithmatex"&gt;\(C_L\)&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高速时&lt;/strong&gt;(小迎角):寄生阻力占主导,阻力随速度增大而急剧增大&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中间某处&lt;/strong&gt;:两种阻力相等,总阻力最小 —— 这就是 &lt;strong&gt;&lt;span class="arithmatex"&gt;\((L/D)_{max}\)&lt;/span&gt; 点&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而&lt;strong&gt;需用功率&lt;/strong&gt;是阻力乘以速度:&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[P_{req} = D \cdot V = \frac{1}{2}\rho V^3 S C_{D0} + \frac{2k W^2}{\rho V S}\]&lt;/div&gt;
&lt;p&gt;功率的极小值点比阻力的极小值点出现在更低的速度上(因为功率多乘了一个 &lt;span class="arithmatex"&gt;\(V\)&lt;/span&gt;,使得高速端的惩罚更大)。&lt;/p&gt;
&lt;p&gt;因此:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="arithmatex"&gt;\((L/D)_{max}\)&lt;/span&gt; 出现在总阻力的极小值点 &lt;span class="arithmatex"&gt;\(\frac{dD}{dV}=0\)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;最小需用功率出现在功率的极小值点 &lt;span class="arithmatex"&gt;\(\frac{dP_{req}}{dV}=0\)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这两个点不重合。数学推导可得(螺旋桨飞机):&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[\frac{V_{R_{max}}}{V_{E_{max}}} = 4^{1/4} \approx 1.414\]&lt;/div&gt;
&lt;p&gt;实际无人机由于气动特性、螺旋桨效率变化等因素,比值通常在 1.2~1.5 之间。&lt;/p&gt;
&lt;h3&gt;航程和航时公式&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;螺旋桨飞机&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;航程(Breguet 航程公式):&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[R = \frac{\eta_p}{sfc} \cdot \frac{C_L}{C_D} \cdot \ln\left(\frac{W_0}{W_1}\right)\]&lt;/div&gt;
&lt;p&gt;航时(Endurance):&lt;/p&gt;
&lt;div class="arithmatex"&gt;\[E = \frac{\eta_p}{sfc} \cdot \frac{C_L^{3/2}}{C_D} \cdot \sqrt{2\rho S} \cdot \left(\frac{1}{\sqrt{W_1}} - \frac{1}{\sqrt{W_0}}\right)\]&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;航程正比于 &lt;span class="arithmatex"&gt;\(C_L/C_D = L/D\)&lt;/span&gt; → &lt;strong&gt;最大航程对应 &lt;span class="arithmatex"&gt;\((L/D)_{max}\)&lt;/span&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;航时正比于 &lt;span class="arithmatex"&gt;\(C_L^{3/2}/C_D\)&lt;/span&gt; → &lt;strong&gt;最大航时对应 &lt;span class="arithmatex"&gt;\((C_L^{3/2}/C_D)_{max}\)&lt;/span&gt;&lt;/strong&gt;,即最小需用功率点&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Python 建模与可视化&lt;/h2&gt;
&lt;p&gt;下面以一架典型小型无人机为例(JL-6 型参数参考):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重量 &lt;span class="arithmatex"&gt;\(W = 20 \text{ kg} \times 9.81 = 196.2 \text{ N}\)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;机翼面积 &lt;span class="arithmatex"&gt;\(S = 0.65 \text{ m}^2\)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;零升阻力系数 &lt;span class="arithmatex"&gt;\(C_{D0} = 0.025\)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;诱导阻力因子 &lt;span class="arithmatex"&gt;\(k = 0.045\)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;核心计算代码:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;numpy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;rho&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.225&lt;/span&gt;  &lt;span class="c1"&gt;# 海平面空气密度&lt;/span&gt;
&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;C_D0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;196.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.65&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.025&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.045&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;CL_from_V&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;平飞升力系数&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rho&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;CD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;阻力系数&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;C_D0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;total_drag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;总阻力&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;c_l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CL_from_V&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;rho&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;CD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;power_required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;需用功率 (propeller)&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total_drag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;V&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;L_over_D&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;升阻比&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;c_l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CL_from_V&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c_l&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;CD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 扫描速度范围&lt;/span&gt;
&lt;span class="n"&gt;V_stall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rho&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mf"&gt;1.6&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# C_Lmax ≈ 1.6&lt;/span&gt;
&lt;span class="n"&gt;V_range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;V_stall&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 找最优点&lt;/span&gt;
&lt;span class="n"&gt;V_min_drag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;V_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmin&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;total_drag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;V_range&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;
&lt;span class="n"&gt;V_min_power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;V_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argmin&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;power_required&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;V_range&lt;/span&gt;&lt;span class="p"&gt;])]&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;失速速度: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;V_stall&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; m/s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;最大航程速度 (V_min_drag): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;V_min_drag&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; m/s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;最大航时速度 (V_min_power): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;V_min_power&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; m/s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;输出结果:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;失速速度: 17.6 m/s ≈ 63 km/h
最大航程速度: 25.7 m/s ≈ 93 km/h  (对应 L/D_max)
最大航时速度: 19.5 m/s ≈ 70 km/h  (对应最小需用功率)
比值 V_range/V_endurance = 1.32
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;综合分析图&lt;/h2&gt;
&lt;p&gt;下图的四个面板展示了完整的平飞性能分析:&lt;/p&gt;
&lt;p&gt;&lt;img alt="无人机平飞性能综合分析" src="https://blog.cycleuser.org/images/uav-speed-analysis.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;左上&lt;/strong&gt;:总阻力分解为寄生阻力和诱导阻力,两条虚线交叉处为最小阻力点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;右上&lt;/strong&gt;:需用功率曲线。注意最小功率点(紫色)在最小阻力点(蓝色)左侧。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;左下&lt;/strong&gt;:升阻比 L/D 曲线。峰值对应最大航程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;右下&lt;/strong&gt;:相对航程(蓝)和相对航时(绿)随速度变化。100% 分别对应各自的最大值,&lt;strong&gt;两个最优速度不重合&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;动态演示 GIF&lt;/h2&gt;
&lt;p&gt;下面的动画展示了在不同速度下阻力、升力、功率的变化,以及当前速度对应于航程最优还是航时最优:&lt;/p&gt;
&lt;p&gt;&lt;img alt="无人机速度-性能动态演示" src="https://blog.cycleuser.org/images/uav-speed-demo.gif"&gt;&lt;/p&gt;
&lt;p&gt;速度从略高于失速逐渐增加到最大速度,可以直观看到:
- 低速阶段诱导阻力主导(红色条很高)
- 高速阶段寄生阻力主导(绿色条很高)&lt;br&gt;
- 中间某处总阻力最小 → 最大航程速度
- 稍低速处需用功率最小 → 最大航时速度&lt;/p&gt;
&lt;h2&gt;小结&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;使用速度&lt;/th&gt;
&lt;th&gt;数值&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;刚起飞/防止失速&lt;/td&gt;
&lt;td&gt;&lt;span class="arithmatex"&gt;\(V &amp;gt; V_{stall}\)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt; 17.6 m/s&lt;/td&gt;
&lt;td&gt;升力必须 ≥ 重力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;最大航时(飞最久)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="arithmatex"&gt;\(V_{E_{max}}\)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~19.5 m/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;对应最小需用功率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;最大航程(飞最远)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;span class="arithmatex"&gt;\(V_{R_{max}}\)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~25.7 m/s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;对应最大升阻比 &lt;span class="arithmatex"&gt;\((L/D)_{max}\)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;快速到达/巡航&lt;/td&gt;
&lt;td&gt;&lt;span class="arithmatex"&gt;\(V &amp;gt; V_{R_{max}}\)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&amp;gt; 25.7 m/s&lt;/td&gt;
&lt;td&gt;牺牲效率换速度&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对于实际操作:
- 需要&lt;strong&gt;在空中停留尽可能长的时间&lt;/strong&gt;(监视、 loitering),飞最小时功率速度
- 需要&lt;strong&gt;尽可能飞得远&lt;/strong&gt;(转场、覆盖更大区域),飞最小阻力速度
- 两个速度差了约 &lt;strong&gt;32%&lt;/strong&gt;,不是同一个速度
- 在小无人机上,长期在低功率速度附近飞行要注意别失速(余量不大)&lt;/p&gt;</content><category term="Academic"/><category term="UAV"/><category term="Performance"/><category term="Aerodynamics"/><category term="Python"/><category term="Visualization"/></entry><entry><title>一维查找方法综述：从三分、黄金分割到 Fibonacci 与 Brent</title><link href="https://blog.cycleuser.org/yi-wei-cha-zhao-fang-fa-zong-shu-cong-san-fen-huang-jin-fen-ge-dao-fibonacci-yu-brent.html" rel="alternate"/><published>2026-07-16T00:00:00+08:00</published><updated>2026-07-16T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-16:/yi-wei-cha-zhao-fang-fa-zong-shu-cong-san-fen-huang-jin-fen-ge-dao-fibonacci-yu-brent.html</id><summary type="html">&lt;p&gt;到了暑假了，给孩子们来点相对直观的。&lt;/p&gt;
&lt;h2&gt;怎么找一个单峰函数的极值&lt;/h2&gt;
&lt;p&gt;给定一个在区间  上先降后升的单峰函数，怎么又快又 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;到了暑假了，给孩子们来点相对直观的。&lt;/p&gt;
&lt;h2&gt;怎么找一个单峰函数的极值&lt;/h2&gt;
&lt;p&gt;给定一个在区间  上先降后升的单峰函数，怎么又快又稳地找到它的极小点？这是数值优化里最基础的一维问题，也是各种高维优化里"线搜索"（line search）步骤的内核。方法有一大把：三分查找、黄金分割、Fibonacci 查找、抛物线插值、Brent、二分/牛顿……&lt;/p&gt;
&lt;p&gt;这篇文章把它们放在一起做个综述，全部用同一套基准诚实地量：同样的测试函数、同样的精度、数每种方法花了多少次函数求值，并检查是否都收敛到了正确答案。核心的一条主线是：&lt;strong&gt;一个方法用了函数的多少信息，决定了它能有多快，也决定了它的适用范围。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;黄金分割"快"在哪：复用点&lt;/h2&gt;
&lt;p&gt;先从最经典的黄金分割查找（golden section search）说起。很多人以为它的精髓是那个神奇的比率 ，其实不是——**精髓是"复用点"**。&lt;/p&gt;
&lt;p&gt;在区间  放两个内点 、，比较  和 ，丢掉更差的一端。黄金比率满足自相似性质 ，使得&lt;strong&gt;收缩后的新区间里，旧的一个内点恰好落在新的黄金分割位置&lt;/strong&gt;。下一轮只需算一个新点，另一个直接复用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/bf7cbd342a16cd9b.png"&gt;&lt;/p&gt;
&lt;p&gt;黄金分割每轮只需 1 次新求值&lt;/p&gt;
&lt;p&gt;一句话：&lt;strong&gt;黄金分割每轮区间收缩到 0.618，但只花 1 次函数求值。&lt;/strong&gt; 对比之下，三分查找每轮把区间缩到 2/3，看起来比 0.618 更狠，可它两个内点每轮都要重算，&lt;strong&gt;每轮花 2 次求值&lt;/strong&gt;，摊下来反而更亏。这说明衡量快慢不能只看单轮收缩幅度，要看"每次求值能换来多少收缩"。&lt;/p&gt;
&lt;h2&gt;有限轮数下的最优：Fibonacci 查找&lt;/h2&gt;
&lt;p&gt;黄金分割的比率是恒定的。有没有可能让比率逐轮变化，既缩得更聪明、又保持复用？&lt;/p&gt;
&lt;p&gt;有。用 &lt;strong&gt;Fibonacci 数列&lt;/strong&gt; 来定分点。给定精度需要的轮数 ，每轮的保留比率取 。因为 Fibonacci 有递推 ，这个结构&lt;strong&gt;恰好也能复用一个旧点&lt;/strong&gt;，每轮只算一个新点——和黄金分割一样省，但比率是逐轮变化的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/06670f1aefb424a5.png"&gt;&lt;/p&gt;
&lt;p&gt;Fibonacci 比率逐轮变化，极限是黄金比率&lt;/p&gt;
&lt;p&gt;有意思的是：&lt;strong&gt;黄金分割查找其实就是 Fibonacci 查找在  时的极限&lt;/strong&gt;——比率不再变化、恒为 。而对有限轮数，Fibonacci 是&lt;strong&gt;理论最优&lt;/strong&gt;的：在"只能比较函数值大小"的框架下，给定固定的求值次数，Fibonacci 能把最终区间压到最小（Kiefer 1953 证明）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;
&lt;span class="n"&gt;phi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fibonacci_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tol&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1e-6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;nonlocal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;calls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1, 1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;tol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;-1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;-2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n-2&lt;/span&gt;&lt;span class="o"&gt;]/&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;]*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n-1&lt;/span&gt;&lt;span class="o"&gt;]/&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;]*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n-k-2&lt;/span&gt;&lt;span class="o"&gt;]/&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n-k&lt;/span&gt;&lt;span class="o"&gt;]*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;比率逐轮变&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;但只算&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;个新点&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n-k-1&lt;/span&gt;&lt;span class="o"&gt;]/&lt;/span&gt;&lt;span class="n"&gt;fib&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n-k&lt;/span&gt;&lt;span class="o"&gt;]*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;calls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;上代码，诚实地量所有方法&lt;/h2&gt;
&lt;p&gt;同一套 8 个单峰测试函数（二次、四次、尖谷、非对称指数、平底等），统一收敛到 ，数每种方法的函数求值次数，并检查是否收敛正确：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;需要什么&lt;/th&gt;
&lt;th&gt;每轮求值&lt;/th&gt;
&lt;th&gt;合计求值&lt;/th&gt;
&lt;th&gt;收敛正确&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;三分查找&lt;/td&gt;
&lt;td&gt;只比大小&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;560&lt;/td&gt;
&lt;td&gt;8/8 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;黄金分割 GS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;只比大小&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;248&lt;/td&gt;
&lt;td&gt;8/8 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fibonacci&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;只比大小&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;240&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8/8 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;抛物线插值&lt;/td&gt;
&lt;td&gt;用曲率&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;151&lt;/td&gt;
&lt;td&gt;8/8 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Brent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用曲率+兜底&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;136&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8/8 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;二分（需导数）&lt;/td&gt;
&lt;td&gt;需梯度&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;120*&lt;/td&gt;
&lt;td&gt;6/6 ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;（*二分需要导数，仅在 6 个可导函数上统计）&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/2d27fbf723fd6032.png"&gt;&lt;/p&gt;
&lt;p&gt;各方法总求值次数对比&lt;/p&gt;
&lt;p&gt;几个结论一目了然：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;三分查找最慢&lt;/strong&gt;：它不复用，每轮 2 次求值，虽然区间每轮缩到 2/3，但摊下来最亏。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fibonacci 略胜黄金分割&lt;/strong&gt;（240 vs 248）：因为它在有限轮数下是最优的，黄金分割只是它的极限近似。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;黄金分割是"够用且简单"的选择&lt;/strong&gt;：不用预先算轮数，实现最短，性能只比最优差一点点。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;真正的加速：利用更多信息&lt;/h2&gt;
&lt;p&gt;黄金分割和 Fibonacci 都只用了 &lt;span class="arithmatex"&gt;\(f(c)&amp;lt;f(d)\)&lt;/span&gt; 这一个比较（一个比特），太浪费。想更快，就得用函数值里更多的信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;抛物线插值&lt;/strong&gt;（successive parabolic interpolation）用最近三点拟合抛物线，取顶点作为下一个试点：&lt;/p&gt;
&lt;p&gt;在光滑函数附近超线性收敛，二次函数上&lt;strong&gt;一步到位&lt;/strong&gt;（表中"二次"只用 5 次）。但它对尖谷、平底会失灵（"平底四次"用了 54 次，比黄金分割还慢）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Brent 方法&lt;/strong&gt;是工程上的标准答案：&lt;strong&gt;能抛物线插值就插值，插值越界或不老实就退回黄金分割兜底&lt;/strong&gt;。既拿到插值的快，又保住黄金分割的稳，8 个函数只用 136 次，全部收敛正确。这也是 &lt;code&gt;scipy.optimize.minimize_scalar&lt;/code&gt; 默认用的方法。&lt;/p&gt;
&lt;p&gt;如果&lt;strong&gt;能拿到导数&lt;/strong&gt;，那就更快：极值点等价于导数的零点，直接对导数做&lt;strong&gt;二分&lt;/strong&gt;（120 次），甚至用&lt;strong&gt;牛顿法&lt;/strong&gt;，但代价是必须有梯度。&lt;/p&gt;
&lt;h2&gt;方法家族全景&lt;/h2&gt;
&lt;p&gt;把这些方法按"用了多少信息"排一下，脉络就清楚了：信息用得越多，收敛越快，但对函数的要求也越高。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/234d8db861f41034.png"&gt;&lt;/p&gt;
&lt;p&gt;一维查找方法家族关系&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只比函数值大小&lt;/strong&gt;（最通用，连不可导、有噪声都能用）：三分 → 黄金分割 → Fibonacci（最优）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;还用函数值的具体数值（曲率）&lt;/strong&gt;：抛物线插值 → Brent（插值+兜底）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;还能用导数&lt;/strong&gt;：二分（导数符号）→ 牛顿法（导数值），最快但要求最苛刻。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;三种区间法同屏对比&lt;/h2&gt;
&lt;p&gt;最后放一个动画，让三分、黄金分割、Fibonacci 在同一个函数上同屏收缩。三分的区间每轮缩得多但费两次求值；黄金分割和 Fibonacci 缩得稳，且每轮只花一次。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/62696d3100b08f88.gif"&gt;&lt;/p&gt;
&lt;p&gt;三分、黄金分割、Fibonacci 收缩过程对比&lt;/p&gt;
&lt;h2&gt;简单总结&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;黄金分割查找的精髓是&lt;strong&gt;复用点&lt;/strong&gt;：每轮收缩到 0.618，只花 1 次求值；三分不复用，所以更慢。&lt;/li&gt;
&lt;li&gt;想在保持复用的同时让比率变得更聪明，正确做法是 &lt;strong&gt;Fibonacci 查找&lt;/strong&gt;：比率逐轮变化（0.5→0.667→0.6→…→φ）却仍复用一点，且在有限轮数下&lt;strong&gt;理论最优&lt;/strong&gt;。黄金分割正是它  的极限。&lt;/li&gt;
&lt;li&gt;真想更快，方向是&lt;strong&gt;用函数值里更多的信息&lt;/strong&gt;：抛物线插值（用曲率）→ Brent（插值+黄金兜底，工程首选）；若有导数，二分/牛顿更快，但要求更高。&lt;/li&gt;
&lt;li&gt;选型口诀：&lt;strong&gt;通用稳妥用 Brent，纯比较场景用黄金分割/Fibonacci，有梯度就上牛顿。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇「事情本身不重要」是怎么炼成的下一篇不只是写代码：用opencode和免费模型帮你搜教程、下视频&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Math"/><category term="Optimization"/><category term="Golden Section"/><category term="Fibonacci"/><category term="Brent"/><category term="Search"/><category term="Python"/><category term="Visualization"/></entry><entry><title>事情本身不重要，是怎么炼成的</title><link href="https://blog.cycleuser.org/shi-qing-ben-shen-bu-zhong-yao-shi-zen-yao-lian-cheng-de.html" rel="alternate"/><published>2026-07-14T00:00:00+08:00</published><updated>2026-07-14T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-14:/shi-qing-ben-shen-bu-zhong-yao-shi-zen-yao-lian-cheng-de.html</id><summary type="html">&lt;p&gt;有一些同学和朋友，看到一些事情，总是不理解为什么会出现。&lt;/p&gt;
&lt;p&gt;其实有很多问题的背后，都有一个共同的原理：「事情本身不重 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;有一些同学和朋友，看到一些事情，总是不理解为什么会出现。&lt;/p&gt;
&lt;p&gt;其实有很多问题的背后，都有一个共同的原理：「事情本身不重要。」&lt;/p&gt;
&lt;p&gt;要说明白这个原理，咱们得先假设一家饭馆。&lt;/p&gt;
&lt;p&gt;这家饭馆本来挺简单。菜做得大家觉得好吃，价格也划算，还干净，街坊邻居就都去。这是做餐饮最朴素的路子，也是大多数饭馆本该有的样子。&lt;/p&gt;
&lt;p&gt;后来味道变了。&lt;/p&gt;
&lt;p&gt;怎么变的呢？他开始跟你讲情怀。讲用料是多么讲究的产地直采，讲这道菜背后花了多少心思，讲创办人是什么名校毕业、师从某某名厨、祖上几代做菜、甚至是什么非遗传承人。总之，你得为这些东西买单。客单价就提上去了。&lt;/p&gt;
&lt;p&gt;还不够。他开始人为制造稀缺。每天限量，门口排长队，你排了一小时吃上的东西，好不好吃已经不重要了——重要的是你排到了，你发朋友圈了，这儿成了打卡地。菜品的口味、食材的新鲜度、甚至后厨的卫生，都没那么被人关心了。你消费的不是一顿饭，是一种时尚，是一个谈资。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/e27793401ec24791.png"&gt;&lt;/p&gt;
&lt;p&gt;这还是第一阶段。&lt;/p&gt;
&lt;p&gt;接着往下走。他开始搞会员制，充卡预付费，只对会员开放。这么做如果能撑住，其实倒能筛出一帮忠实客群，降低获客成本。但撑不住就麻烦了。起初给你打九折，后来八折，再往后充卡赠百分之五十，差不多就是五折。你但凡有点常识就知道，这不是做福利，这是现金流快断了。&lt;/p&gt;
&lt;p&gt;我朋友就遇到过一个真实例子。某烤串城，前两年扩张得很猛，直营店和加盟店并存，会员卡卖得满天飞。后来资金链出了问题，突然某天，直营店的卡在另一个同品牌的店里就不认了。你在A店充的钱，B店门口贴张纸说"本店独立经营，会员卡不通用"。你找谁说理去？&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/a82feddb941bfa12.png"&gt;&lt;/p&gt;
&lt;p&gt;这不只是餐饮。&lt;/p&gt;
&lt;p&gt;你想想理发店。你本来只想理个发，手艺好，干净，价格能接受，这需求不过分吧。但他不。他先给你安排个总监、首席，反正你没见过他们剪出来的头有什么区别，但价格翻了几倍。然后开始推销护发素、精华液、头皮护理，那些东西有没有批号、有没有正规手续，你也不好意思追着问。最后大招来了——卖卡，预付费储值。你觉得买了卡每次能便宜点，贪这点便宜，人家看的是你的本金。一旦跑了，维权成本高到让人放弃，几千块打了水漂，自认倒霉。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/1f7c8ca9b63cdd42.png"&gt;&lt;/p&gt;
&lt;p&gt;那教书呢？也一样。&lt;/p&gt;
&lt;p&gt;有些高校的课堂上，那课讲得怎么样，学生是不是听得进去，身心是不是健康地成长，这些事儿已经不那么重要了。什么重要呢？拉项目，发文章，整帽子，评人才称号，拿基金，冲排名。这些东西能在互联网榜单上提高排位，能变成可量化的KPI。指挥棒指到哪儿，大家就冲到哪儿。指挥棒本身成了唯一被优化的对象，至于你是来教书的还是来跑指标业务的，无所谓。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/5cdb9d3e43f01ea2.png"&gt;&lt;/p&gt;
&lt;p&gt;标准化考试也是。它本来只是个衡量手段，一种检验学习效果的工具。但最后它变成了唯一的目的。学习不再是为了让自己成长为一个更全面的人，不再是为了发现感兴趣的领域然后深入探索，而是变成了——我要针对这个考试达到某个分数，领先多少人，拿到某个排名，然后去另一个地方参加另一场考试，再领先另一拨人。中考完了高考，高考完了考研，考研完了读博，读博之后申基金、写本子、评职称，这个阶梯永无止境。事情的本质，也就是你到底学到了什么、创造了什么价值，在这个体系里反而成了最不重要的事。&lt;/p&gt;
&lt;p&gt;很多带着各种名头的人，搞出学术不端、图片误用、数据造假，甚至把学生的论文署上自己的名字，你也不必觉得奇怪。他本来就不在乎事情本身，他在乎的是怎么用这些手段在指挥棒体系下最大化自己的利益。他的目的，和这个体系标榜的目的，本来就不一致。&lt;/p&gt;
&lt;p&gt;就连中小学老师也一样。他们要宣传防溺水，宣传防火用电安全，甚至宣传社保医保的好处。这些事你说重不重要？都特别重要。但当它们全落在老师头上，成了被考核的任务，那备课、钻研教学就成了只能用课外时间、业余时间来准备的事。他们自己也未必喜欢这些，只是这些东西恰好也连着指挥棒。再往前一步，自愿打卡、自愿捐款，你就说是不是自愿的？&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/c759b7bcf9d1ef80.png"&gt;&lt;/p&gt;
&lt;p&gt;无论如何，反正最终就变成这样：事情本身不重要，一切都围绕指挥棒转。&lt;/p&gt;
&lt;p&gt;只要能找到一个可被量化的指标，就针对这个指标一直优化，优化到扭曲。&lt;/p&gt;
&lt;p&gt;奶粉里蛋白不够怎么办？加三聚氰胺。指标上去了，就有人赌了。&lt;/p&gt;
&lt;p&gt;类似的，苏丹红、瘦肉精、塑化剂，等等，很多事情可能都有类似的逻辑。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/f50d2de436991086.png"&gt;&lt;/p&gt;
&lt;p&gt;为什么会这样？&lt;/p&gt;
&lt;p&gt;承认问题和发现问题，本来就是解决问题的前提。&lt;/p&gt;
&lt;p&gt;不知道大家以为如何。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇从志愿填报开始学生和家长都应该考虑到生活不一定要有标准答案下一篇一维查找方法综述：从三分、黄金分割到 Fibonacci 与 Brent&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Life"/><category term="Thinking"/></entry><entry><title>软考架构师备考刷题：从开源题库到单文件离线刷题系统</title><link href="https://blog.cycleuser.org/ruan-kao-jia-gou-shi-bei-kao-shua-ti-cong-kai-yuan-ti-ku-dao-dan-wen-jian-chi-xian-shua-ti-xi-tong.html" rel="alternate"/><published>2026-07-13T00:00:00+08:00</published><updated>2026-07-13T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-13:/ruan-kao-jia-gou-shi-bei-kao-shua-ti-cong-kai-yuan-ti-ku-dao-dan-wen-jian-chi-xian-shua-ti-xi-tong.html</id><summary type="html">&lt;p&gt;前面我写过 &lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566568&amp;amp;idx=1&amp;amp;sn=e95beb24b7ade334850ed8372268cc3e&amp;amp;token=238975220&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师到底有没有用&lt;/a&gt; 等等一系列文章，都在&lt;a href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIxOTA5Mzc5NQ==&amp;amp;action=getalbum&amp;amp;album_id=4379623684961845266#wechat_redirect"&gt;二手架构师杂谈 这个合集&lt;/a&gt;里面，这里面乱七八 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;前面我写过 &lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650566568&amp;amp;idx=1&amp;amp;sn=e95beb24b7ade334850ed8372268cc3e&amp;amp;token=238975220&amp;amp;lang=zh_CN&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师到底有没有用&lt;/a&gt; 等等一系列文章，都在&lt;a href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIxOTA5Mzc5NQ==&amp;amp;action=getalbum&amp;amp;album_id=4379623684961845266#wechat_redirect"&gt;二手架构师杂谈 这个合集&lt;/a&gt;里面，这里面乱七八糟东西很多，有的是分章节的知识介绍，也有的讨论的是这考试值不值得考、我自己怎么过的。这次换个角度，说一个更具体、更"工具流"的事儿：备考时怎么刷题。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/57a2a4c258e68e51.jpg"&gt;&lt;/p&gt;
&lt;p&gt;上图感谢保哥分享&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;刷题这事儿，绕不开真题&lt;/h2&gt;
&lt;p&gt;软考架构师的考试结构是上午综合知识（75 道单选）、下午案例、下午论文。综合知识看着简单，其实就是单选题，可架不住它面铺得太广：操作系统、网络、数据库、软件工程、系统架构设计、项目管理、安全、法律、专业英语，甚至嵌入式、新技术都来一点。你哪一块软，哪一块就给你扣分。我在数据库和前端方面就丢了不少分。&lt;/p&gt;
&lt;p&gt;这种考试，光看教材没用，必须得刷真题。原因是真题的"调调"和教材不完全一样，它考的是你怎么用那套知识，而不是你背没背下来定义。而且真题有重复率——不是原题照搬，是同一个知识点换个壳又出来了。你把历年真题里某个模块的题都刷一遍，那个模块的考点你心里就有谱了。&lt;/p&gt;
&lt;p&gt;问题是真题散得到处都是。网上能搜到一堆 PDF，按年份分文件夹的那种，动辄十几年的题，打开一个是一个，想做错了想看解析还得翻答案文件。手机上更别提了，PDF 在小屏上翻来翻去能把人逼疯。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;找到一个好项目&lt;/h2&gt;
&lt;p&gt;后来我在 GitHub 上找到一个仓库：Zhang-986/ruankao-architect-practice。&lt;/p&gt;
&lt;p&gt;它的厉害之处在于，作者把 2009 下半年到 2025 下半年这十几年（除 2019 下半年那份是扫描 PDF 没法结构化之外）的综合知识真题，外加 7 套 2026 年 5 月模拟卷，一共 1773 道选择题，全部整理成了一个机读的 JSON 文件，每道题带题干、4 个选项、正确答案、解析、所属知识模块、知识点、难度标签。&lt;/p&gt;
&lt;p&gt;这就不是 PDF 了，是结构化数据。结构化数据意味着你能拿它干任何事——做一个网页刷题器、塞进 Anki、导进自己写的 app、喂给 AI 做错题诊断，都行。原仓库自己就配了一个多文件静态站点，支持继续练习、章节练习、真题套卷、错题重刷、收藏、AI 诊断导出，功能挺全的。&lt;/p&gt;
&lt;p&gt;可它有一个对我特别不友好的点：要求本地服务器。&lt;/p&gt;
&lt;p&gt;原仓库的 &lt;code&gt;index.html&lt;/code&gt; 用 &lt;code&gt;fetch&lt;/code&gt; 异步读取 &lt;code&gt;data/bank.json&lt;/code&gt;，这是常规做法，但浏览器对 &lt;code&gt;file://&lt;/code&gt; 协议下的 &lt;code&gt;fetch&lt;/code&gt; 有 CORS 限制，双击打开就是白屏。README 里也明确写了"不要直接双击 &lt;code&gt;index.html&lt;/code&gt;"，得跑一句 &lt;code&gt;python3 -m http.server 4173&lt;/code&gt; 再访问。&lt;/p&gt;
&lt;p&gt;平时在电脑前还好，开个终端跑一句也不费事。可我想在手机上刷、想丢给不会用命令行的同事刷、想塞 U 盘里随身带着任何机器双击就开，这种需求它都满足不了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;把题库塞进一个 HTML&lt;/h2&gt;
&lt;p&gt;所以我 fork 了这个仓库，在它的基础上加了一个"离线单文件版"。&lt;/p&gt;
&lt;p&gt;思路特别简单粗暴：用 Python 把那个 &lt;code&gt;bank.json&lt;/code&gt; 读进来，序列化成 JS 字符串，直接注入到 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 标签里，让 &lt;code&gt;QUESTIONS&lt;/code&gt; 变成一个普通的 JS 变量，而不是用 &lt;code&gt;fetch&lt;/code&gt; 去拿。这样整个题库就和 HTML 是一体的了，浏览器解析 HTML 的时候题库已经在内存里，不需要任何外部请求，也不受协议限制。&lt;/p&gt;
&lt;p&gt;代价是文件变大了，单文件 1.2MB 左右，因为里头装了 1773 道题的全部文字。但 1.2MB 在 2026 年真不算啥，手机浏览器秒开，U 盘随手传，网盘分享也方便。一次加载，永久离线。&lt;/p&gt;
&lt;p&gt;刷题系统本身的功能是我之前给另一个考试做过的同款改的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;顺序刷题：1822 题从第 1 题刷到最后&lt;/li&gt;
&lt;li&gt;模拟考试：抽 75 题，和单场考试题量一致，答完出分&lt;/li&gt;
&lt;li&gt;随机抽题：50 题快速测，适合碎片时间&lt;/li&gt;
&lt;li&gt;错题本：答错自动记录，可以一键重练，答对会从错题本移除&lt;/li&gt;
&lt;li&gt;学习统计：各知识模块完成进度条 + 错题数&lt;/li&gt;
&lt;li&gt;按知识模块练：12 个模块独立练，专攻薄弱项&lt;/li&gt;
&lt;li&gt;按年份 / 模拟卷练：整套整套地刷真题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;答题交互就是那种答完即时反馈、绿对红错、解析卡片直接展开的路数。答过的题再回来会恢复状态，中途退出有确认提示，答完整套出个得分圆环，≥80 绿、≥60 橙、否则红。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/6d6132598a74e576.jpg"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;怎么用&lt;/h2&gt;
&lt;p&gt;Fork版本的仓库地址：https://github.com/cycleuser/ruankao-architect-practice&lt;/p&gt;
&lt;p&gt;单文件版在 &lt;code&gt;offline-single-file/&lt;/code&gt; 目录，里头一个 &lt;code&gt;index.html&lt;/code&gt;，下载下来双击就能开刷，题库已经内联进去了。不需要 Node，不需要 Python，不需要 &lt;code&gt;npm install&lt;/code&gt;，不需要联网。U 盘拷走、微信传给同事、丢进网盘都行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;致谢&lt;/h2&gt;
&lt;p&gt;题库项目是 https://github.com/Zhang-986/ruankao-architect-practice 的，上游数据好像是来自 https://github.com/wujiaming88/awesome-ruankao，标注的是 CC BY-SA 4.0，都是供个人学习交流用的，只是把题库用单文件 HTML 包了一层壳，让它更顺手一点。&lt;/p&gt;
&lt;p&gt;刷题终究只是备考的一环，能帮你把零散的知识点过一遍、把薄弱模块找出来，但真正的功夫还是得落到理解上。真题刷多了你会发现，考来考去就那几个核心点，背选项是没用的，得真明白为什么是这个答案。刷题让你熟悉套路，理解才能让你在题目换了壳之后还能选对。&lt;/p&gt;
&lt;p&gt;还是整个在线链接点击即可用的，点击访问原文即可。&lt;/p&gt;
&lt;p&gt;不过，如果是要考架构的朋友，自己不可能连从GitHub上下载html到本地都搞不定。&lt;/p&gt;
&lt;p&gt;要是下载html并且本地浏览器打开访问都搞不定的话，大概也不太适合这个考试了吧？&lt;/p&gt;
&lt;p&gt;刷起来吧。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;二手架构师杂谈 · 目录&lt;/p&gt;
&lt;h1&gt;二手架构师杂谈&lt;/h1&gt;
&lt;p&gt;上一篇计算机学科的同学尤其应该注重培养通识并且避免工程上的傲慢&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Book"/><category term="Architecture"/><category term="Tool"/></entry><entry><title>从志愿填报开始，学生和家长都应该考虑到生活不一定要有标准答案</title><link href="https://blog.cycleuser.org/cong-zhi-yuan-tian-bao-kai-shi-xue-sheng-he-jia-chang-du-ying-gai-kao-lu-dao-sheng-huo-bu-yi-ding-yao-you-biao-zhun-da-an.html" rel="alternate"/><published>2026-07-12T00:00:00+08:00</published><updated>2026-07-12T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-12:/cong-zhi-yuan-tian-bao-kai-shi-xue-sheng-he-jia-chang-du-ying-gai-kao-lu-dao-sheng-huo-bu-yi-ding-yao-you-biao-zhun-da-an.html</id><summary type="html">&lt;p&gt;&lt;img alt="Image" src="../images/b49bd7c9e0e072c6.jpg"&gt;&lt;/p&gt;
&lt;p&gt;最近在看一本书。其实之前就看了它的英文版，后来发现孔夫子旧书网上有二手的，就顺手买了一个，留作纪念。&lt;/p&gt;
&lt;p&gt;翻着翻着就 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Image" src="../images/b49bd7c9e0e072c6.jpg"&gt;&lt;/p&gt;
&lt;p&gt;最近在看一本书。其实之前就看了它的英文版，后来发现孔夫子旧书网上有二手的，就顺手买了一个，留作纪念。&lt;/p&gt;
&lt;p&gt;翻着翻着就想起来一件事：从小到大，很多朋友上学的过程中，都容易被标准化考试带来的那种应试训练打下一个思想钢印——认为世界上的很多事儿都应该有标准答案。&lt;/p&gt;
&lt;p&gt;外行的思路往往都是教材上写的什么答案，他们就认为一定是这样，然后还要为自己以为知道答案而窃喜。&lt;/p&gt;
&lt;p&gt;有点水平的考试型选手大概会稍微考虑一下这个题目为何是这样的答案，以及如何从题目得到这个标准答案的路径；水平一般的就只是背诵或者记忆，然后期待未来的某个重要的考试一定要考这个，最好是原题。&lt;/p&gt;
&lt;p&gt;这很不靠谱。&lt;/p&gt;
&lt;p&gt;从人类认识和改造世界的历史看，人对外界的认知都是从模糊到精确，中间还可能走弯路。比如当年存在过的以太学说，又比如燃素学说，这些后来都被证明只是阶段性探索的中间产物，远不是最靠谱的选择。&lt;/p&gt;
&lt;p&gt;假设一下，要是咱们生存在当年——那个以以太学说、或者燃素学说为准的标准化考试年代——那标准答案、参考答案是不是就得长那样？&lt;/p&gt;
&lt;p&gt;如果人都这样，早就完蛋了。&lt;/p&gt;
&lt;h2&gt;牛顿那时候的标准答案&lt;/h2&gt;
&lt;p&gt;在牛顿那个年代，大部分情况下研究的只能是相对低速的物理现象，也都很靠谱。&lt;/p&gt;
&lt;p&gt;很自然的，牛顿力学很靠谱，那应该就是标准答案了。&lt;/p&gt;
&lt;p&gt;可如果守着这么一个标准答案，不去做任何改进，觉得标准答案就在那、别瞎想、别批判，那恐怕后来洛伦兹变换的爱因斯坦解释就都很难再出现了。人们也就很难去想象，高速的情况下、接近光速的情况下，是什么样。&lt;/p&gt;
&lt;p&gt;因为人们会觉得：既然已经有标准答案了，就不用再考虑了，就会丧失探索的欲望。&lt;/p&gt;
&lt;p&gt;既然标准答案能解决所有问题，标准化考试解决了所有问题，那利益会指导一切，它就成了最重要的指挥棒了。&lt;/p&gt;
&lt;p&gt;尤其是是不是可能出现了一种「脑内迎合」，就是只要看到「标准答案」，就先去奋不顾身地对其进行合理化，甚至以率先完成了看上去自洽的合理化而洋洋得意。&lt;/p&gt;
&lt;h2&gt;连太阳系都改过答案&lt;/h2&gt;
&lt;p&gt;再举个更近点的例子，就是行星和矮行星的定义。&lt;/p&gt;
&lt;p&gt;以前，大概是三十年前那会儿上学的时候，教材一般都是说太阳系大行星有九个，冥王星是大行星。可到了十多年以前，教材又改了，改成冥王星是矮行星，教材说太阳系只有八大行星了。而最近几年据说又有好事者要改回去，折腾来折腾去的。&lt;/p&gt;
&lt;p&gt;实际上，发生改变的从来都不是太阳系，只有人类的概念和教材而已。&lt;/p&gt;
&lt;p&gt;标准答案就这样来回变化，会随着时代发展而改变，会根据人的认识而修正。&lt;/p&gt;
&lt;p&gt;无他，无非是人定的一种粗略描述罢了。&lt;/p&gt;
&lt;h2&gt;地层也是人划的&lt;/h2&gt;
&lt;p&gt;又比如有的地方，那个地层分成几个组、几个阶等等，这些东西其实全是这些研究人员自己根据自己的经验给出的。&lt;/p&gt;
&lt;p&gt;自然界原本它就不一定有那么多个组。甚至很多东西，中间可能沉积了、后来又被剥蚀掉了，它就缺失了，这些都是后边观察不到的。能观察到的、留下来的东西，不见得是大多数，甚至可能只是残留的一小部分。&lt;/p&gt;
&lt;p&gt;只是人看到了这么一小部分，然后很「聪明」地将其用自己所熟悉的东西来起个名字，再脑内演绎一番精彩故事，写出锦绣文章，花大价钱写文章给敛财的出版社，成了学术成果，然后通过行业协会强制其他人接受。&lt;/p&gt;
&lt;h2&gt;上学不是一条单行道&lt;/h2&gt;
&lt;p&gt;日常骑车的目的是到达而不是竞速耍酷，学术研究总应该有那么一点是为了诚实地去进行探索而不是迎合指挥棒。&lt;/p&gt;
&lt;p&gt;同理，学习的目的不只是为了升学。读了本科之后读研，读研之后读博，读博之后找地儿弄博士后，博士后出站再找地方教书，一直觉得留在自己这个学科领域内是唯一正确的标准答案——这就是一个需要摒弃掉的传统认知。&lt;/p&gt;
&lt;p&gt;人类社会很丰富，人的生活很多样，没必要非要按某一个既定的路径走下去。那已经不见得是最优的了，又何必执着于这种路径依赖呢？&lt;/p&gt;
&lt;p&gt;如果一个专业自己实在不喜欢，有机会转专业，就趁本科的时候早转。当然，这一定要深思熟虑，要确定好自己转去的那个地方能让自己接受，不会后悔，或者后悔也能忍住。&lt;/p&gt;
&lt;p&gt;有一种最可怕的现象：按家里长辈给的建议做了选择，可家里长辈的信息未必更新到最新版本；而自己想做的事儿又没去尝试、去探索、去理解清楚。等过了很多年，就只能在那后悔当初没有怎么怎么样。&lt;/p&gt;
&lt;p&gt;当然了，实际上过了很多年之后，其实还是有机会再去考的，甚至可以重新高考，或者成人高考，可以考研跨专业，等等。&lt;/p&gt;
&lt;h2&gt;我自己的路径&lt;/h2&gt;
&lt;p&gt;我读博的时候学地质拿的是理学的博士，本科是学摄影的艺术学学士，后来还成人高考继续读汉语言文学。这目的就只是高兴，因为这个好玩，而且当初错过的那些我能够有机会弥补一下，其实也不指望这些东西能让我直接从事相关领域的工作。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/95f5e1606f131a7a.jpg"&gt;&lt;/p&gt;
&lt;p&gt;我当年第一份工作是在某所谓央企进行数据采集，体验不太好。因为周围的人都在那抽烟，我是过敏体质，呼吸道、眼睛都敏感，经常容易过敏，所以只能辞了职，考研接着读书。&lt;/p&gt;
&lt;p&gt;后来读博之后参与了一段时间的创业公司，跟人合伙开发软件，但那会儿时间精力上很难划分，毕业又麻烦着延期了一年，就自然跟人家散了。&lt;/p&gt;
&lt;p&gt;再往后，博士毕业去了一些高校，二本一本陆续都混过，这中间还跑一些互联网公司的合作项目，跟着掺和过一些日子。从南方到北方四处跑，机缘巧合之下，还给人家做过考研辅导、艺考培训等各种各样的事儿。&lt;/p&gt;
&lt;p&gt;最后发现还是愿意写代码、愿意教书，这找了个地方继续教。&lt;/p&gt;
&lt;p&gt;如果也守着那种报了一个专业就一直从事这个专业的想法，那恐怕生活轨迹会截然不同：大概我还在某企业忍着别人的二手烟？又或者还在某院士团队麾下给人当拎包小弟打下手？也可能还在哪个地方带着孩子们准备艺考？&lt;/p&gt;
&lt;p&gt;如果总觉得有标准答案，换个活法就被当成了一种很可怕的叛逆行为，那探索就止步了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/ed4723ea2508925e.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;报考别只盯着一个参数&lt;/h2&gt;
&lt;p&gt;所以无论是专业、学科，还是学校，这些都不应该成为你报考的唯一考虑因素，因为你的生活不应该只考虑这些东西。&lt;/p&gt;
&lt;p&gt;应该着重考虑的是要有更多的可能性：要去人口多、机会多、高校也多的大城市。&lt;/p&gt;
&lt;p&gt;一线城市能接触到的文化产业更多。比如帝都就有国家博物馆、军事博物馆、故宫博物院、国家图书馆等等，这些是其他地方所没有的。&lt;/p&gt;
&lt;p&gt;另外，大城市高校多，行业也多，未来选择也多。如果报考只着眼于某一个行业——就是现在这个行业很热，或者估计未来几年还是很热——然后就去报了，并且准备一直从事这个事儿，可万一学一阵才发现不喜欢，该怎么办呢？&lt;/p&gt;
&lt;p&gt;这时候如果在学院路，还有机会通过学院路共同体选一些其他学校的课去了解了解，甚至找机会跨考考研。可如果所选的高校非常偏远，就那么一两所学校在那，也没什么大的图书馆、博物馆，甚至连太多的学术交流机会都没有，那就比较痛苦了。&lt;/p&gt;
&lt;p&gt;家长都是为孩子想谋深远，可事实上只考虑就业，或者只根据最近几年和自己的预测，又或者听信所谓专家（其实读没读过大学都不一定，至少大部分没教过大学，教过大学的也未必去过不同城市的多个大学），然后做判断，恐怕就不一定靠谱。&lt;/p&gt;
&lt;p&gt;其实完全可以考虑找一个高校多的地方，让孩子以后能有更多选择。&lt;/p&gt;
&lt;p&gt;甚至从让孩子找对象的角度看，去个高校多的地方，他找对象的机会也多，在学校里找到的对象往往要比在社会上更单纯，这也是好事儿。&lt;/p&gt;
&lt;p&gt;如果始终认为所有事情都有标准答案，而总是去追求这个标准答案，往往可能得到的，是一个更不靠谱的选择。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇手机当罗盘：从俯仰横滚偏航三个角，算出任意平面的产状下一篇「事情本身不重要」是怎么炼成的&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Life"/><category term="Thinking"/><category term="School"/></entry><entry><title>取经路上的几种人</title><link href="https://blog.cycleuser.org/qu-jing-lu-shang-de-ji-chong-ren.html" rel="alternate"/><published>2026-07-11T10:00:00+08:00</published><updated>2026-07-11T10:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-11:/qu-jing-lu-shang-de-ji-chong-ren.html</id><summary type="html">&lt;p&gt;原创&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src=""&gt;&lt;/p&gt;
&lt;p&gt;这些年带的学生，22级是成果最多的，冠绝江湖，本科生中有好几位达到某兄弟院校的硕士研究生毕业的学术出版要求。&lt;/p&gt;
&lt;p&gt;23级相对来说没那么群星璀璨，但是很有多 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;原创&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src=""&gt;&lt;/p&gt;
&lt;p&gt;这些年带的学生，22级是成果最多的，冠绝江湖，本科生中有好几位达到某兄弟院校的硕士研究生毕业的学术出版要求。&lt;/p&gt;
&lt;p&gt;23级相对来说没那么群星璀璨，但是很有多样性，软硬兼修的高手，能歌善舞的偶像，行动力强的实干派，都有很多。&lt;/p&gt;
&lt;p&gt;24级变成了两个班，百花齐放，非常多的带佬，高手如云。想当年全校一共六十多人获得全国大学生数学建模竞赛省赛奖项，其中我们专业24级的两个班就有三四十人，这个获奖人数能打得过某些不是太重视相关赛事的兄弟院校。&lt;/p&gt;
&lt;p&gt;到了25级，现在情况有点儿令人担忧。一样也是两个班，也有很多多出色的人物，但超一流选手，似乎没有24级那么多了。&lt;/p&gt;
&lt;p&gt;尤其是25级有的同学也遇到了和当初24级面对的，那种初步接触开发或者是研究时候的迷茫和无助等等。已经有同样的资源储备，也有24级分享一些相似的案例，甚至还有24级的带佬带他们来过一些比较难的关口，结果却不很理想。&lt;/p&gt;
&lt;p&gt;为什么同样一件事，交到不同人手里，结果能差出很多呢？&lt;/p&gt;
&lt;p&gt;后来想想，这事儿《西游记》早就写明白了。取经这一路，师徒几个凑在一起，恰好就是不同任务的类型样本。&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;hr&gt;
&lt;h2&gt;孙悟空：自己就会找诀窍的那种&lt;/h2&gt;
&lt;p&gt;悟空这只猴子，是不用人教的，而是自己知道要去学，也知道想学什么。&lt;/p&gt;
&lt;p&gt;他学本事那一段最见功夫。花果山过得好好的，他偏偏想到一层——猴子也会老会死。为了这个念头，他扎个木筏，漂洋过海，走了十几年，光是找师父就找了大半个人生。到了菩提祖师门下，别人还在洒扫应对，他已经琢磨透了师父敲他三下脑袋、倒背着手走进去是什么意思——半夜三更来学真本事。&lt;/p&gt;
&lt;p&gt;这就是那种人：目标是自己认的，路是自己找的，诀窍也是自己悟的。你不用掰开揉碎了讲，你甚至拦都拦不住。他学七十二变、筋斗云，很认真，他主动学，也自然一学就会，因为他是真想要。&lt;/p&gt;
&lt;p&gt;做事也一样。取经路上遇了难处，多是他冲在前头。打不过就搬救兵，一趟南海、一趟天庭、一趟灵山，各路神仙挨个求过来。别人是等着难题自己消失，他是满世界去凑解决难题的资源。&lt;/p&gt;
&lt;p&gt;25级其实有一个这样的孩子，之前有一次是习题课，特意叮嘱习题不要传播到网上。他第一个做完了所有的题，还偷偷地把这个题录了个视频发到群里边儿，跟大家炫耀一下显得厉害。&lt;/p&gt;
&lt;p&gt;这种人稀罕，也难控制——所以才要给他戴个紧箍。太有主意的人，往往还得配个能管得住的东西，要不然他肯定不会总是服从的，他一定有自己的想法，也可能就打坏了人参果树惹了大祸。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;唐僧：本事不大，但认准的事九头牛拉不回&lt;/h2&gt;
&lt;p&gt;唐僧手无缚鸡之力，遇个妖怪就得被人拎走，看着是最没用的一个。&lt;/p&gt;
&lt;p&gt;可整个队伍是围着他转的。为什么？因为这件事是他要做的。西天在哪儿他没去过，路有多远他不知道，会死几回他心里也没底，可他就是认准了要走这一趟。女儿国的荣华、各路的威胁利诱，都没能让他改主意。&lt;/p&gt;
&lt;p&gt;这是另一种人：自己未必样样都行，但心里有一杆认定的秤，方向一旦定了就不再摇。他成事，靠的不是本领，是那股子不回头的定力，外加把一群能人拢在身边、一起把事做成的本事。&lt;/p&gt;
&lt;p&gt;25级有一个孩子，当初是体育生伤病转考高考，因此成绩不太理想，外语入学的时候创了本专业甚至本校的低分记录。但他从来没说因为自己外语水平不理想就不学了，而是和同伴一起结队，从模型微调到数据清洗再到数学建模，样样都练出来了，还收获了同班一位英语尖子生的芳心。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;沙僧：独木难支，但踏实能补台&lt;/h2&gt;
&lt;p&gt;沙僧存在感低，可这一路也少不了他。&lt;/p&gt;
&lt;p&gt;让他自己去取经，多半是取不成的——他没那个主意，也没那个闯劲。但你把他放进这个班子里，挑担的挑担，牵马的牵马，师兄弟吵翻天的时候他在中间和稀泥，遇事也能出一份力、搭一句话。&lt;/p&gt;
&lt;p&gt;这种人靠不了单干，可只要有人搭台、有个主心骨，他就能安安稳稳把自己那份做扎实。一个摊子里，这样的人其实是压舱石。&lt;/p&gt;
&lt;p&gt;24级当年有一位同学也是体育生，考试成绩也不是很理想，但待人接物非常和善，沟通效率非常高，也愿意给人当绿叶来合作，因此结识了一些外系的同学，一起参赛也拿了省级奖项。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;猪八戒：动不动就想散伙的那种&lt;/h2&gt;
&lt;p&gt;八戒是最让人头疼的。&lt;/p&gt;
&lt;p&gt;不是他没能耐，钉耙抡起来也能打，真正的毛病在心气上——路稍微难走一点，他第一个念头就是“分了行李各回各家”，他惦记的还是高老庄那点安逸日子。事儿刚开头，或者走到半道，他就先打退堂鼓了。&lt;/p&gt;
&lt;p&gt;而且他这人软硬都不大好使。硬压，他阳奉阴违、偷奸耍滑；讲道理，他左耳进右耳出；真要说管用的，也就一口好吃的、一点小便宜能哄他往前挪两步。取经这么大的事，对他来说更像是被裹挟着走完的，而不是自己要走的。&lt;/p&gt;
&lt;p&gt;说白了，这就是那种没什么主动性、随时准备撤的人。事儿成了有他一份，事儿黄了他跑得比谁都快。&lt;/p&gt;
&lt;p&gt;这还没有典型的同学，也希望不会有人真的走到这一步。如果只是图着顺利毕业拿个学位，那这大学生活要错过多少精彩内容呢？&lt;/p&gt;
&lt;p&gt;把资料发过去，如果有人问「这是什么」，或者「压缩包如何解压缩」，那他就有可能是有点八戒的影子了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;说到底&lt;/h2&gt;
&lt;p&gt;一支队伍参加比赛，有时候这几种人都可能遇到：有悟空这样自己就往前冲的，有唐僧这样认死理不回头的，有沙僧这样能补台的，只要尽量避免八戒时时想散伙，基本上硬拽着也走到了终点。&lt;/p&gt;
&lt;p&gt;分辨人，其实不难。看他遇到难处时的第一反应就够了：是自己去找路，是等着人扶，还是先想着散伙。&lt;/p&gt;
&lt;p&gt;用人、共事、看自己，大抵都是这个理。&lt;/p&gt;
&lt;p&gt;那么，刚进入大学的你，希望成为哪一种呢？&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../images/59cd59f72529262c.png"&gt;&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Thinking"/><category term="Education"/></entry><entry><title>手机当罗盘：从俯仰横滚偏航三个角，算出任意平面的产状</title><link href="https://blog.cycleuser.org/shou-ji-dang-luo-pan-cong-fu-yang-heng-gun-pian-hang-san-ge-jiao-suan-chu-ren-yi-ping-mian-de-chan-zhuang.html" rel="alternate"/><published>2026-07-11T00:00:00+08:00</published><updated>2026-07-11T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-11:/shou-ji-dang-luo-pan-cong-fu-yang-heng-gun-pian-hang-san-ge-jiao-suan-chu-ren-yi-ping-mian-de-chan-zhuang.html</id><summary type="html">&lt;p&gt;这是十多年前的一个小软件的算法，当时的项目，后来我就退出了，然后这个过程中就一直没再想着继续，现在把它做了个 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;这是十多年前的一个小软件的算法，当时的项目，后来我就退出了，然后这个过程中就一直没再想着继续，现在把它做了个网页版出来，点击访问原文就是了。大家可以用手机试一试。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/a918b1fc8aecba57.jpg"&gt;&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;hr&gt;
&lt;h2&gt;一个看似简单的问题&lt;/h2&gt;
&lt;p&gt;把手机随手拍在一块倾斜的桌面、岩层面或者墙面上，不管手机是横着放、竖着放、还是斜着扭一个角度贴上去，只要它紧贴着那个平面，手机总能算出这个平面「朝哪个方向倾、倾多少度」。地质上把这两个量叫&lt;strong&gt;产状&lt;/strong&gt;：&lt;strong&gt;倾向（dip direction）&lt;/strong&gt;和&lt;strong&gt;倾角（dip）&lt;/strong&gt;。手机里的「产状测量」「电子罗盘」App 干的就是这件事。&lt;/p&gt;
&lt;p&gt;关键的直觉是：手机贴在平面上时，它自己的&lt;strong&gt;朝向&lt;/strong&gt;是任意的（你可以随便转），但它背面（屏幕法线）永远垂直于那个平面。所以平面的产状只跟法线有关，跟手机怎么摆无关。这篇文章把这套逻辑从头推一遍，给出可复现的计算案例和可视化。&lt;/p&gt;
&lt;h2&gt;三个姿态角的英文说法&lt;/h2&gt;
&lt;p&gt;描述一个刚体在空间里的朝向，最常用的是三个欧拉角。中英文对照如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;俯仰角 —— Pitch&lt;/strong&gt;，绕&lt;strong&gt;横轴（x 轴，机体的左右方向）&lt;/strong&gt;旋转，抬头/低头。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;横滚角 —— Roll&lt;/strong&gt;，绕&lt;strong&gt;纵轴（y 轴，机体的前后方向）&lt;/strong&gt;旋转，左右翻滚。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;偏航角 —— Yaw&lt;/strong&gt;，绕&lt;strong&gt;竖轴（z 轴，垂直机体平面）&lt;/strong&gt;旋转，也就是航向（Heading）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在航空航天里这三个词几乎是固定搭配。另外你还会见到几个近义词：航向角常写作 &lt;strong&gt;Heading&lt;/strong&gt; 或 &lt;strong&gt;Azimuth（方位角）&lt;/strong&gt;；整体姿态叫 &lt;strong&gt;Attitude&lt;/strong&gt; 或 &lt;strong&gt;Orientation&lt;/strong&gt;；三个角合起来常缩写为 &lt;strong&gt;RPY&lt;/strong&gt;（Roll-Pitch-Yaw）。手机传感器文档里则叫 &lt;strong&gt;Pitch / Roll / Azimuth&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/2239755efeaf7efa.jpg"&gt;&lt;/p&gt;
&lt;p&gt;俯仰、横滚、偏航三个姿态角的定义，红绿蓝分别为机体 x/y/z 轴&lt;/p&gt;
&lt;h2&gt;坐标系与旋转约定&lt;/h2&gt;
&lt;p&gt;要把话说清楚，先固定两个坐标系。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;世界系（导航系）用 ENU&lt;/strong&gt;：x 轴指向正东（East），y 轴指向正北（North），z 轴指向天顶（Up）。这是本地水平坐标系的标准约定之一。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;机体系（手机系）&lt;/strong&gt;：x 轴指向手机右侧，y 轴指向手机顶部，z 轴垂直屏幕向外——这正是手机加速度计/陀螺仪的常见轴向。&lt;/p&gt;
&lt;p&gt;姿态就是一个旋转矩阵 ，它把机体系的坐标变换到世界系。 的三个列向量，恰好就是机体三个轴在世界系（ENU）里的方向。我们采用 Z-X-Y 的旋转次序（先偏航、再俯仰、后横滚）：&lt;/p&gt;
&lt;p&gt;其中各基本旋转为：&lt;/p&gt;
&lt;p&gt;手机的姿态怎么来的？静止时，加速度计测得的是重力反方向（近似天顶方向），由此可解出 pitch 和 roll；磁力计测得地磁水平分量，配合前两个角度可解出 yaw（航向）。这三个角就是我们的输入。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;核心一步：屏幕法线的方向&lt;/h2&gt;
&lt;p&gt;手机贴在平面上，手机的 z 轴（屏幕法线）就等于平面的法线。而机体 z 轴在世界系里的方向，正是旋转矩阵的第三列：&lt;/p&gt;
&lt;p&gt;把  展开，第三列只跟 pitch、yaw 有关（roll 是绕 y 轴自身，不改变 y 轴、也就不改变第三列的方向）：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这就是「怎么摆都一样」的数学原因&lt;/strong&gt;：roll 不出现在法线公式里。你绕着屏幕法线随便自转（改变的是 roll 和一部分 yaw 的组合），只要 z 轴指向不变，法线就不变，产状自然不变。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;从法线到产状（倾向与倾角）&lt;/h2&gt;
&lt;p&gt;有了单位法线 （约定朝上，若  就整体取反），产状就是简单的几何：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;倾角&lt;/strong&gt; 是平面与水平面的夹角，等于法线与竖直方向的夹角：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;倾向&lt;/strong&gt; 是平面「最陡下坡」方向的水平方位角，从正北起顺时针度量。最陡下坡方向是法线在水平面的投影的反方向，因此：&lt;/p&gt;
&lt;p&gt;反过来，已知产状也能重建法线，用于校验：设上倾方位角 ，则&lt;/p&gt;
&lt;h2&gt;关键演示：同一平面，两种任意摆法&lt;/h2&gt;
&lt;p&gt;下面这个 GIF 是全文的核心。同一个倾斜平面，手机绕着屏幕法线不停自转（模拟你「随便怎么贴」）。注意看：上面一行的 &lt;strong&gt;yaw / pitch / roll 一直在剧烈变化&lt;/strong&gt;，而下面一行的 &lt;strong&gt;倾角、倾向纹丝不动&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/6e1efb8644cb532b.gif"&gt;&lt;/p&gt;
&lt;p&gt;我们用一个具体的平面来跑数值——真实产状定为&lt;strong&gt;倾角 35°、倾向 120°&lt;/strong&gt;，对应法线（ENU）为 。然后用两种完全不同的摆法把手机贴上去：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;摆法&lt;/th&gt;
&lt;th&gt;yaw&lt;/th&gt;
&lt;th&gt;pitch&lt;/th&gt;
&lt;th&gt;roll&lt;/th&gt;
&lt;th&gt;反算法线 (E,N,U)&lt;/th&gt;
&lt;th&gt;倾角&lt;/th&gt;
&lt;th&gt;倾向&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;摆法一（spin=0°）&lt;/td&gt;
&lt;td&gt;60.00°&lt;/td&gt;
&lt;td&gt;−35.00°&lt;/td&gt;
&lt;td&gt;0.00°&lt;/td&gt;
&lt;td&gt;(−0.4967, 0.2868, 0.8192)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;35.00°&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;120.00°&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;摆法二（spin=137°）&lt;/td&gt;
&lt;td&gt;−168.70°&lt;/td&gt;
&lt;td&gt;24.80°&lt;/td&gt;
&lt;td&gt;25.53°&lt;/td&gt;
&lt;td&gt;(−0.4967, 0.2868, 0.8192)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;35.00°&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;120.00°&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两种摆法的三个欧拉角天差地别，但反算出来的法线一模一样，产状都精确回到 35°/120°。这正是手机「怎么放都能测」的底气。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/e24448920f3ea7e4.jpg"&gt;&lt;/p&gt;
&lt;p&gt;两种摆法对应同一法线，得到相同产状&lt;/p&gt;
&lt;h2&gt;完整可复现代码&lt;/h2&gt;
&lt;p&gt;下面是从三个姿态角到产状的核心函数，以及上面案例的验证。可直接运行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;import numpy as np
r2d, d2r = np.rad2deg, np.deg2rad

def Rx(a): c,s=np.cos(a),np.sin(a); return np.array([[1,0,0],[0,c,-s],[0,s,c]])
def Ry(a): c,s=np.cos(a),np.sin(a); return np.array([[c,0,s],[0,1,0],[-s,0,c]])
def Rz(a): c,s=np.cos(a),np.sin(a); return np.array([[c,-s,0],[s,c,0],[0,0,1]])

def R_from_ypr(yaw, pitch, roll):
    return Rz(yaw) @ Rx(pitch) @ Ry(roll)      # 列 = 机体轴在 ENU 中的方向

def attitude_from_normal(n):
    n = n/np.linalg.norm(n)
    if n[2] &amp;lt; 0: n = -n                          # 法线取朝上
    dip = r2d(np.arccos(np.clip(n[2], -1, 1)))
    dip_dir = r2d(np.arctan2(-n[0], -n[1])) % 360
    return dip, dip_dir

def normal_from_attitude(dip, dip_dir):
    up = d2r((dip_dir + 180) % 360)
    return np.array([np.sin(d2r(dip))*np.sin(up),
                     np.sin(d2r(dip))*np.cos(up),
                     np.cos(d2r(dip))])

&lt;span class="gh"&gt;#&lt;/span&gt; 真实平面：倾角35°，倾向120°
n_true = normal_from_attitude(35, 120)

&lt;span class="gh"&gt;#&lt;/span&gt; 摆法一：yaw=60, pitch=-35, roll=0
R1 = R_from_ypr(d2r(60), d2r(-35), d2r(0))
print(attitude_from_normal(R1 @ [0,0,1.0]))   # -&amp;gt; (35.0, 120.0)

&lt;span class="gh"&gt;#&lt;/span&gt; 摆法二：yaw=-168.7, pitch=24.8, roll=25.53
R2 = R_from_ypr(d2r(-168.70), d2r(24.80), d2r(25.53))
print(attitude_from_normal(R2 @ [0,0,1.0]))   # -&amp;gt; (35.0, 120.0)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;别忘了磁偏角与经纬度&lt;/h2&gt;
&lt;p&gt;上面算出来的倾向是相对&lt;strong&gt;手机航向&lt;/strong&gt;的，而手机航向来自磁力计，指的是&lt;strong&gt;磁北&lt;/strong&gt;。地质记录和地图用的是&lt;strong&gt;真北&lt;/strong&gt;。两者之差就是&lt;strong&gt;磁偏角（magnetic declination）&lt;/strong&gt;，它随经纬度和年份变化，可由 WMM/IGRF 地磁模型按位置查得。校正很简单：&lt;/p&gt;
&lt;p&gt;倾向真北倾向磁北磁偏角&lt;/p&gt;
&lt;p&gt;以重庆（纬度 29.563°、经度 106.551°）为例，磁偏角约 −1.9°（西偏），则磁北倾向 120° 对应真北倾向 118.10°。&lt;/p&gt;
&lt;p&gt;如果还想把这个法线放到&lt;strong&gt;全球统一的地心地固坐标系（ECEF）&lt;/strong&gt;里——比如做跨区域的构造统计——就要用经纬度做一次 ENU→ECEF 旋转：&lt;/p&gt;
&lt;p&gt;其中  是纬度、 是经度。同一块岩层面在重庆测得的法线，换算到 ECEF 就是 。这样，无论你在地球上哪个位置，任意时刻、任意摆法测到的产状，都能落到同一套全局坐标里比较。&lt;/p&gt;
&lt;h2&gt;小结&lt;/h2&gt;
&lt;p&gt;整条链路其实非常干净：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;手机静止时用加速度计+磁力计解出 &lt;strong&gt;yaw / pitch / roll&lt;/strong&gt; 三个姿态角；&lt;/li&gt;
&lt;li&gt;组成旋转矩阵 ，取第三列得到&lt;strong&gt;屏幕法线&lt;/strong&gt;——这一步天然把 roll 消掉，所以怎么摆都行；&lt;/li&gt;
&lt;li&gt;由法线用  和  直接读出&lt;strong&gt;倾角&lt;/strong&gt;和&lt;strong&gt;倾向&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;用&lt;strong&gt;磁偏角&lt;/strong&gt;把磁北换成真北，必要时用&lt;strong&gt;经纬度&lt;/strong&gt;把法线搬进 ECEF 全局坐标。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一部手机、几行三角函数，就复刻了地质罗盘的核心功能。而它「随便怎么放都准」的秘密，不过是一句话：产状只认那根垂直于平面的法线，不认手机自己转了多少。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇应届生搞OPC一人公司的避坑提示下一篇从志愿填报开始学生和家长都应该考虑到生活不一定要有标准答案&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Math"/><category term="Attitude"/><category term="Rotation"/><category term="IMU"/><category term="Geology"/><category term="Python"/><category term="Visualization"/></entry><entry><title>应届生搞OPC一人公司的避坑提示</title><link href="https://blog.cycleuser.org/ying-jie-sheng-gao-opcyi-ren-gong-si-de-bi-keng-ti-shi.html" rel="alternate"/><published>2026-07-10T00:00:00+08:00</published><updated>2026-07-10T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-10:/ying-jie-sheng-gao-opcyi-ren-gong-si-de-bi-keng-ti-shi.html</id><summary type="html">&lt;p&gt;最近一段时间了，"一人公司 OPC （One Person Company）"，这个词刷屏刷得厉害，网上甚至有各种"超级个体+AI=月入十万"的励志故事，看着确实挺 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近一段时间了，"一人公司 OPC （One Person Company）"，这个词刷屏刷得厉害，网上甚至有各种"超级个体+AI=月入十万"的励志故事，看着确实挺诱人。也有一些同学问这事儿到底能不能做。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/c4b092a7e44a724a.png"&gt;&lt;/p&gt;
&lt;p&gt;先说结论：可以尝试，但要冷静考虑好，别头脑一热就冲。&lt;/p&gt;
&lt;p&gt;对应届生这个特定群体来说，网上那些成功故事里可能没有提到潜在的坑，尤其有几个雷区是应届生需要特别注意的，别人踩了无所谓，应届生踩了可能影响很多。&lt;/p&gt;
&lt;h2&gt;OPC到底是个啥&lt;/h2&gt;
&lt;p&gt;先说清楚，OPC就是One Person Company，一人有限责任公司。不是说"只有一个人的公司"那么简单，而是一个法律概念，正经的企业法人，有独立财产，能签合同、开发票、打官司、申请知识产权。粗略来说，跟个体工商户最大的区别就是"有限责任"——正常情况下有限责任公司赔了钱，股东只以认缴出资额为限承担债务，你个人的存款啊房子啊车啊等等就都不会被拿去抵债。&lt;/p&gt;
&lt;h2&gt;不要轻易买课&lt;/h2&gt;
&lt;p&gt;在这之前，得先说一件比弄一人公司本身更重要的事，就是防范非理性消费。&lt;/p&gt;
&lt;p&gt;"一人公司"火了之后，网上冒出来一大堆教你"零基础开OPC、月入十万"的课。几百到几千不等，文案写得一个比一个诱人，好像你交了钱跟着做就能躺着挣钱。&lt;/p&gt;
&lt;p&gt;这些课的套路很一致：先给你看几个成功案例，让你觉得"别人行我也行"，心里痒痒的；然后告诉你门槛很低、有AI帮忙、不用会写代码；最后催你赶紧下单，名额有限、优惠马上结束。&lt;/p&gt;
&lt;p&gt;你仔细想想，他要是真能靠OPC月入十万，为啥要卖几百块的课给你？或许它们就是靠着卖这种课程才月入几万的呢？&lt;/p&gt;
&lt;p&gt;现在AI确实帮助很多外行人都能开始写相关内容了，完全没听过CDN的甚至也可以给人讲全栈开发，而且营销起来也很成功，比如有个经典案例，就是说某个头部营销号说"有个东西，也是我今天才学到的，叫 CDN"。&lt;/p&gt;
&lt;p&gt;又比如是出自清华美院的某位营销高手，哪怕其原来的学术路径基本与AI、深度学习等专业不太相关，也可以充当区工智能的大师傅，实现卖课收入不菲。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/5ca7f3f20671f052.jpg"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;创道投资咨询总经理步日欣认为，AI课程其实是收消费者的智商税，抓住了部分消费者焦虑未来、渴望新知的心理。&lt;/p&gt;
&lt;p&gt;“从卖课经验看，一部分讲的是‘创业艰辛和融资逻辑’，另一部分就宣传‘上完课半个月搞定融资’，知识与情绪的差别可能就造成了课程的大卖。本来，从用户体验上讲，学知识本来就很累人，谁愿意付费受累，但’上一次AI课就能跟上时代、不被淘汰‘的宣传，则抓住了现代人的焦虑心理。”步日欣说。&lt;/p&gt;
&lt;p&gt;https://www.thepaper.cn/newsDetail_forward_26425574&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当然了，营销是一种本事，人家能卖出去，就比很多学校里默默讲课还没太多人听的教师要成功多了，也不是说所有课都是骗人的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/def3f906ab2243da.png"&gt;&lt;/p&gt;
&lt;p&gt;网上有人把它们这种课程比作「挥起镰刀割韭菜」，虽然生动，但也未必尽然，毕竟孩子们不见得没有判断力。&lt;/p&gt;
&lt;p&gt;主要是孩子们要想清楚：真正有用的东西，是花几百块看几节录播视频就能学到的么？还是对营销大师傅定向投喂付费了就能获得的？&lt;/p&gt;
&lt;p&gt;那些卖课的人赚的，不是OPC的钱，是你的钱。&lt;/p&gt;
&lt;h2&gt;第一个雷区：应届生身份&lt;/h2&gt;
&lt;p&gt;这是应届生同学最需要考虑的一点，考公考编、人才引进、参加校招，好多渠道都认这个。&lt;/p&gt;
&lt;p&gt;而认定应届生身份的一个关键指标，在不少地方就是"有没有缴纳过社保"。&lt;/p&gt;
&lt;p&gt;你注册了OPC，如果以公司名义给自己缴社保，那就要注意了，可能在很多地方的认定标准里，你就不再是应届生了。&lt;/p&gt;
&lt;p&gt;应届生身份一旦丢，想找回来可难。&lt;/p&gt;
&lt;p&gt;也许有的地方认为"两年内未落实工作单位的毕业生"还算应届；可你确实是开了自己的公司，如果还缴了社保，那这不就得叫"已落实工作单位"了么？&lt;/p&gt;
&lt;p&gt;所以，如果你心里还惦记着考公、考编、走人才引进落户这些路子，一定要先把当地的应届生身份认定标准查清楚再决定是否以及如何弄OPC。&lt;/p&gt;
&lt;p&gt;千万别贸然上头，直接就公司开了、社保缴了，然后回头发现考公报名那关过不了，那才叫无奈。&lt;/p&gt;
&lt;h2&gt;第二个雷区：社保断缴&lt;/h2&gt;
&lt;p&gt;如果你的OPC业务订单不稳定，收入也不稳定，甚至可能给自己的社保断缴。这个对谁都是问题，对毕业生尤其要命。&lt;/p&gt;
&lt;p&gt;有的地方车牌摇号、子女入学，都跟社保连续缴纳年限挂钩。&lt;/p&gt;
&lt;p&gt;应届生刚毕业，本来社保年限就是零，如果一上来就创业、订单又接不上，社保断断续续，后面很多事情可能都受到影响。&lt;/p&gt;
&lt;h2&gt;第三个雷区：有限责任不一定真有限&lt;/h2&gt;
&lt;p&gt;OPC最吸引人的卖点就是"有限责任"，公司亏了不连累个人。听着美，可这其实也是有标准有条件的。&lt;/p&gt;
&lt;p&gt;就是你得能证明公司财产独立于股东自己的财产的，否则就应当对公司债务承担连带责任。&lt;/p&gt;
&lt;p&gt;而且，还有可能要面对"举证责任倒置"。意思是别人告你，你得主动证明自己的财产和公司财产相独立。&lt;/p&gt;
&lt;p&gt;这对一个刚毕业、啥都不懂的学生来说，潜在的风险可是实打实的。&lt;/p&gt;
&lt;p&gt;刚开始创业的时候，也许你偶尔就用个人微信收订金、营业款，甚至公私账户混着用，买东西记账乱七八糟—等等，这些事儿在创业初期太常见了。&lt;/p&gt;
&lt;p&gt;每年还得做审计，请会计师事务所出报告，这又是一笔成本。你要是为了省钱省事跳过这步，出了事更说不清。&lt;/p&gt;
&lt;p&gt;一旦发生纠纷，你无法证明公司财产和自己的个人财产相互独立，可能就会被判连带责任了。&lt;/p&gt;
&lt;h2&gt;第四个雷区：AI产品淘汰率&lt;/h2&gt;
&lt;p&gt;这个跟OPC模式本身关系不大，但跟"为啥要开OPC"关系很大。绝大多数应届生搞OPC，业务方向都是AI应用。&lt;/p&gt;
&lt;p&gt;某些AI工具聚合网站收录了几千上万个AI工具，其中有不少已经关闭、被收购或终止运营。&lt;/p&gt;
&lt;p&gt;AI产品淘汰很快，你早起的靠智能体做的工作流，可能后面就被模型内禀能力给吸收了，甚至对应场景的能力还不一定打得过新模型。&lt;/p&gt;
&lt;p&gt;你雄心勃勃做了个产品，也许不到半年后就没人用了，订单可能也彻底没了，可是公司还在那儿杵着，你得继续记账、报税、审计，注销也得走流程。&lt;/p&gt;
&lt;h2&gt;那到底能不能干&lt;/h2&gt;
&lt;p&gt;说了这么多坑，不是劝你别干，是劝你想清楚再干。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;适合干的情况&lt;/strong&gt;：你本来就走技术路线、有拿得出手的东西，在校期间已经做过项目、接过单、或者有明确的垂直领域能力。你开OPC是为了把已有的副业正规化、能开票、能接企业单。这种情况下OPC就是个工具，用得好是加分项。而且你目标明确，不指着考公考编，那应届生身份这块的顾虑就小很多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不适合干的情况&lt;/strong&gt;：你其实就是被"超级个体+AI=月入十万"的故事冲昏了头，或者是被卖课的忽悠得觉得这件事很简单。自己还未必具备啥核心能力，却想着先开个公司再说。这种十有八九是给代办机构贡献KPI，折腾一圈公司也黄了，还搭进去一个应届生身份。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;中间地带&lt;/strong&gt;：你想创业但还没想好干啥，又怕丢应届生身份。这种情况我建议你先别急着注册公司。可以先以个人名义接单、做副业、攒作品和客户，等你真有稳定订单和明确方向了再注册也不迟。&lt;/p&gt;
&lt;p&gt;OPC对有能力、有想法、有资源的创业者来说，是个不错的载体。但绝对不是给没想清楚的人准备的避风港。&lt;/p&gt;
&lt;p&gt;不少成功案例里的人，要么是读研读博时候就有门路，在读同时搞研发、要么是有大厂经验资深开发者、要么是已经创业过几次的老兵。他们开OPC是水到渠成，不是脑子一热。如果这些故事被卖课的包装一遍之后，就变成了"你也可以"。&lt;/p&gt;
&lt;p&gt;你刚毕业，最大的本钱是时间和身份，这俩东西丢一个都心疼。想清楚了再动，衡量好成本和风险吧。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇大学里是不是什么都学不到下一篇手机当罗盘：从俯仰横滚偏航三个角，算出任意平面的产状&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Job"/><category term="OPC"/><category term="AI"/></entry><entry><title>大学里是不是什么都学不到</title><link href="https://blog.cycleuser.org/da-xue-li-shi-bu-shi-shi-yao-du-xue-bu-dao.html" rel="alternate"/><published>2026-07-09T00:00:00+08:00</published><updated>2026-07-09T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-09:/da-xue-li-shi-bu-shi-shi-yao-du-xue-bu-dao.html</id><summary type="html">&lt;p&gt;网上总是有人说大学里啥也学不到，真是这样的么？&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;先说课程本身&lt;/h2&gt;
&lt;p&gt;要是你指望把那些基础课程学完、考试一过，就觉得能学 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;网上总是有人说大学里啥也学不到，真是这样的么？&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;先说课程本身&lt;/h2&gt;
&lt;p&gt;要是你指望把那些基础课程学完、考试一过，就觉得能学到很多东西，那这想法本身就不靠谱。&lt;/p&gt;
&lt;p&gt;为啥呢？有的老师就是念PPT。有的PPT还包浆了，不知道传了多少年。更过分的，有的老师让学生自己做PPT，让学生上去念。这事儿甚至闹出过舆情。你要是光盯着这些东西看，那大学里只靠听课确实可能学不到太多东西。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/5f61bd5afe9340dc.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;再说下课之后&lt;/h2&gt;
&lt;p&gt;可大学最关键的地方，恰恰是它没有老师再带着你了。&lt;/p&gt;
&lt;p&gt;高中那套思路，是老师给你定制好一个规划，你照着走，每一步亦步亦趋，大部分内容学会了，然后培养好应试能力，考试分就高。&lt;/p&gt;
&lt;p&gt;大学不是这样。大学没有唯一的衡量标准，也没有那么多标准答案。你拿高中的思路来套大学，套不上。&lt;/p&gt;
&lt;p&gt;很多人说大学什么都没学到，估计很大一部分原因是他的学习习惯没转过来。还等着别人安排、别人带，没人带就呆着，就说大学不行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;大学该怎么读&lt;/h2&gt;
&lt;p&gt;到了大学，最重要的是找到一切机会，以所学为基础，对自己感兴趣的方向去探索。&lt;/p&gt;
&lt;p&gt;很多东西课本上没讲、老师没教，那你自己个儿就得想办法找地儿学去。这是最重要的能力。有了这能力，再经过基础的科研训练，就能读研了。要是你在某个方向上还能总结出自己的问题，研究上能搞出点小成果，那就适合读博。&lt;/p&gt;
&lt;p&gt;那要是不想读研读博，就只想着读完本科就去工作，怎么办？也一样，除了课程内容得学点别的。光指望课程内容学东西，不现实，也不划算。大学课余时间那么多，一定得用起来。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;那些浪费掉的时间&lt;/h2&gt;
&lt;p&gt;有的人课余时间就是刷短视频、打游戏，或者抽烟喝酒，又或者各种谈恋爱。这算各种不同的人生选择，只要不违法违纪，谁也管不着。&lt;/p&gt;
&lt;p&gt;但有的人课上时间也刷短视频或者打游戏，拇指上下滑动，几十秒的视听刺激，基本消耗掉了注意力的阈值，一局游戏四十分钟，四局游戏一上午，晚上熬夜继续打游戏，还要扰民闹矛盾，然后自己黑眼圈。&lt;/p&gt;
&lt;p&gt;不只是普通高校，所谓名校，也有很多这样的情况，上课也都是有人跑到后排躲着玩手机，也有人熬夜通宵打游戏，也有人每天用手机七八个小时以上。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/89bc569e1559d0a3.png"&gt;&lt;/p&gt;
&lt;p&gt;你要是这么过了，回头说大学啥也没学到，那很大比例是你自己的问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;大学里有啥能用&lt;/h2&gt;
&lt;p&gt;大学里基本都有图书馆，这上课能学到的那点东西其实是一小部分，图书馆里的东西可能更多。有的学校不一定有大的实体图书馆，但有在线的电子文库、论文订阅，这些都能用。&lt;/p&gt;
&lt;p&gt;教材是最老的。期刊相对新点，但也有限，审稿周期一年左右甚至更长。会议论文最新，可能就几个月。想看新玩意儿，往会议论文那儿找。&lt;/p&gt;
&lt;p&gt;还有一样东西特别需要重视——讲座。大学里会来一些人做讲座，有的真有东西。你去听、去提问，这都是交流的机会。别觉得讲座是累赘、是耽误功夫。不愿意听的课、不愿意去的讲座，你也得尽量利用起来，能有所收获才行。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;还有老师&lt;/h2&gt;
&lt;p&gt;老师上完课就走了，你平时跟他也没联系，跟人也不熟，也不知道人干嘛的。&lt;/p&gt;
&lt;p&gt;那怎么办？先搜搜这些老师的论文都有啥，他研究什么的，看自己感不感兴趣。感兴趣的，课上找机会留个联系方式，打请教请教。万一有合作机会，让人带着打个比赛、一起做个科研项目，甚至后来准备跟他读研读博，都挺好。&lt;/p&gt;
&lt;p&gt;关键就一条：得主动去做，别等、别靠、别要。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;成年人要为自己负责&lt;/h2&gt;
&lt;p&gt;大学最重要的，是你成年了。成年人得为自己的行为和选择负责任。&lt;/p&gt;
&lt;p&gt;有人说大学什么也没学到，这话恐怕更多反映的是，这人刚成年的那段时间，自己做的选择不太理想，所以觉得没啥收获。&lt;/p&gt;
&lt;p&gt;一样读了同样的大学，有的人成就很多，有的人就差一些。&lt;/p&gt;
&lt;p&gt;那么，你准备度过怎样的大学生活呢？&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇AI 能抹平外行和内行的差距吗？当前恐怕不行下一篇应届生搞OPC一人公司的避坑提示&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Learn"/><category term="School"/></entry><entry><title>计算机学科的同学尤其应该注重培养通识并且避免工程上的傲慢</title><link href="https://blog.cycleuser.org/ji-suan-ji-xue-ke-de-tong-xue-you-qi-ying-gai-zhu-zhong-pei-yang-tong-shi-bing-qie-bi-mian-gong-cheng-shang-de-ao-man.html" rel="alternate"/><published>2026-07-08T00:00:00+08:00</published><updated>2026-07-08T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-08:/ji-suan-ji-xue-ke-de-tong-xue-you-qi-ying-gai-zhu-zhong-pei-yang-tong-shi-bing-qie-bi-mian-gong-cheng-shang-de-ao-man.html</id><summary type="html">&lt;p&gt;学生突然问我：老师，宿命论可信吗？&lt;/p&gt;
&lt;p&gt;我问怎么说。&lt;/p&gt;
&lt;p&gt;他发来了一个视频，说里面有一个特别成功赚了很多钱的大学霸，说「所有事 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;学生突然问我：老师，宿命论可信吗？&lt;/p&gt;
&lt;p&gt;我问怎么说。&lt;/p&gt;
&lt;p&gt;他发来了一个视频，说里面有一个特别成功赚了很多钱的大学霸，说「所有事物的发展在宇宙爆炸那一刻就定好了，都是必然结果，早就预设好了。」 他说，如果分子原子的运动能被精确计算，下一步的发展确实是可以预料的。&lt;/p&gt;
&lt;p&gt;我说我还没来得及看这个视频，但从话语风格和讨论视角推测，说这话的人大概从本科开始一直都是计算机相关专业的。&lt;/p&gt;
&lt;p&gt;他说对，搞大模型的。&lt;/p&gt;
&lt;p&gt;我说那就正常了。如果学计算机相关专业的人成就特别出色，同时有可能缺乏对自然科学的基础认知和底层敬畏，对自己的技术又极有信心，就可能会这样。&lt;/p&gt;
&lt;p&gt;他问，难道也是缺乏通识知识？&lt;/p&gt;
&lt;p&gt;我说也不见得是缺乏，毕竟再厉害的人，都可能存在不擅长的领域。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;这个对话让我想了很久。&lt;/p&gt;
&lt;p&gt;不是宿命论本身——那东西从拉普拉斯妖开始就被讨论了无数轮，热力学第二定律和量子力学的不确定性原理早就把机械决定论锤烂了。&lt;/p&gt;
&lt;p&gt;我想的是另一个问题：计算机专业如果缺乏自然科学的知识学习，同时万一还缺乏人文学科的素养培养，就可能因为自己学科领域的出色而过于有信心，乃至到自负的程度——缺乏对自然的敬畏，也缺乏人文的关怀。&lt;/p&gt;
&lt;p&gt;然后在这个基础上，&lt;strong&gt;为什么优秀甚至杰出的工程人，尤其是搞计算机的人，特别容易陷入一种"我这条路径能解释一切"的幻觉？&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;蒸汽机师傅的终极奥义&lt;/h2&gt;
&lt;p&gt;假设你是一个十九世纪的蒸汽机师傅。&lt;/p&gt;
&lt;p&gt;你一辈子都在优化热效率、改进活塞气密性、调校飞球调速器。你造出了当时最高效的蒸汽机，力大无穷，驱动工厂、火车、轮船。&lt;/p&gt;
&lt;p&gt;你可能真心觉得，蒸汽机就是解决一切动力问题的终极答案。&lt;/p&gt;
&lt;p&gt;过了些年，内燃机把汽车送上了公路，燃气轮机把飞机送上了天。&lt;/p&gt;
&lt;p&gt;可再过些年，核反应堆把原子核的能量释放了出来。&lt;/p&gt;
&lt;p&gt;回头看那个蒸汽机师傅的"终极奥义"，是不是觉得太早了？&lt;/p&gt;
&lt;p&gt;这不是蒸汽机师傅水平不行。他可能在他那个范式里已经做到了极致。他缺乏的不是聪明和努力，是&lt;strong&gt;认知的维度和角度&lt;/strong&gt;。他原来的工作场景可以不知道电动力学，也未必知道链式反应，更不用说什么高温超导。这些东西不在他的知识坐标系里，所以他无法想象能量的来源除了烧开水还能有别的方式。&lt;/p&gt;
&lt;p&gt;就像一个一辈子只吃过采摘的水果的人，不知道食物还能煮着吃。他不是固执，是真没见过。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/f16e6110a35a0f30.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;从投石机到核武器&lt;/h2&gt;
&lt;p&gt;古代的工程发展也遵循类似的轨迹。从简单的抛石，到床弩，到连发弩，到利用重力势能的重型投石机——工程优化一直在推进，射程越来越远，威力越来越大。如果没有能源革命，迟早会出现机械动力的连发弩箭，或者其他形式的动能武器。&lt;/p&gt;
&lt;p&gt;但炸药的出现不是靠工程优化投石机得来的。核武器的出现不是靠把炸药做得更大更纯得来的。这些是&lt;strong&gt;范式跃迁&lt;/strong&gt;，是换了一条赛道，用完全不同的物理原理实现了几何级数的能量释放。&lt;/p&gt;
&lt;p&gt;工程优化能让你在同一条赛道上跑到极致，但它给不了你新赛道。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;成功的案例不能证明路径的普适&lt;/h2&gt;
&lt;p&gt;回到搞大模型的那群赚了很多钱的出色人士。或许有些人真心觉得 Transformer 就是终极架构，Scaling Law 能一路通向 AGI，数据和算力能解决一切。&lt;/p&gt;
&lt;p&gt;但到目前为止，似乎并不是如此。&lt;/p&gt;
&lt;p&gt;拿蛋白质结构预测来说。AlphaFold 确实在这个问题上做到了惊艳的程度，但它用的 Evoformer 架构本身就融合了演化生物学的信息和结构生物学里的不变性约束，不只是一个通用 Transformer 灌数据就能跑出来的东西。换句话说，&lt;strong&gt;问题本身的特性决定了这个解法能走多远，而不是解法的通用性决定了它能覆盖多少问题。&lt;/strong&gt; 一个特定问题上的成功，不等于这个技术路线在所有问题上都能复制。&lt;/p&gt;
&lt;p&gt;搞研究的人对此应该体会更深——一个实验室同时探索好几个方向，十个里能跑出来一两个就很不错了。那些没跑出来的项目，外人可能根本也看不到，新闻报道里也不会写。所以我们看到的"成功案例"本身就存在严重的幸存者偏差。&lt;/p&gt;
&lt;p&gt;把工具当信仰，把路径当终点，忽略了问题本身的结构差异，这是所谓杰出工程师最容易犯的错。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/852122a149fecabd.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;更需要通识的计算机专业&lt;/h2&gt;
&lt;p&gt;说回开头的判断，为什么计算机专业的杰出人士尤其容易踩这个坑。&lt;/p&gt;
&lt;p&gt;一个是学科本身的特性。搞计算机，你自己定义问题，自己解决问题。语言是你设计的，编译器是你写的，跑起来不对你就改，改完再跑。这跟物理化学那些实验科学完全不一样——人家是去猜自然规律，猜错了没办法改规律，只能改自己的猜想。但计算机里，规则就是你定的，边界不够就加内存、不够就加显卡，实在不行换个架构重来。待久了你就容易忘一件事：出了这个屏幕，到了真实世界，大多数问题的规则不是你定义的，也不是你改几行代码就能推平的。&lt;/p&gt;
&lt;p&gt;另一个是历史积累的效用不同。物理学家面对的宇宙，几百年来牛顿、麦克斯韦、爱因斯坦这帮天才都没穷尽，从业者天然就有种敬畏——自己不过是漫长链条上的一环。生物学家面对的是进化了几十亿年的系统，越研究越觉得复杂。但计算机这行节奏太快，快到三年前的框架就有人叫"上古遗产"，五年前的论文可能就没太多人引了。这种节奏会给人一种错觉，觉得过去的东西不重要，我手上这套才是最新的、最能打的。可物理学的牛顿定律三百年了还在用，你敢说三年前的框架过时了，但不敢说三百年前的力学被淘汰了——这本身就是一种学科差异带来的认知偏差。&lt;/p&gt;
&lt;p&gt;自然科学告诉你的世界很硬核：能量守恒、熵增、测不准关系，这些是宇宙层面的约束，不是你多买几张 H100 能突破的。人文社科告诉你的东西很复杂：历史上多少帝国因为傲慢崩了，多少决策因为只看一个维度搞砸了。这两类知识恰恰是计算机培养方案里最容易被挤掉的——工程相关的课表太满了，操作系统、编译原理、算法、机器学习，哪个不重要？挤来挤去，通识课的比例就有限了。&lt;/p&gt;
&lt;p&gt;一个人如果这三样凑齐了——习惯了自己定规则、习惯了快速迭代觉得旧的都不值一提、又恰好缺了自然科学和人文的底子，然后他又在自己的领域做得很出色赚了很多钱取得了世俗眼里的「巨大成功」——那很自然，他的自信心就容易漫出自己学科的实际边界。看什么都像一个待优化的系统，什么问题都觉得加数据加算力能搞定。宿命论也好，AGI 必然到来也好，说到底都是同一个思维习惯换了个话题而已。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;谦逊是一种美德&lt;/h2&gt;
&lt;p&gt;或许有一个规律：&lt;strong&gt;真正厉害的人，往往相当谦逊。&lt;/strong&gt; 如果一个人不谦逊，他可能也很有能力，但未必能到最顶尖那个层次。&lt;/p&gt;
&lt;p&gt;为什么谦逊和水平有相关性？因为谦逊不是道德品质，是&lt;strong&gt;认知能力&lt;/strong&gt;。你能意识到自己不知道什么，你才可能去学。你能意识到自己当前的方法有边界，你才可能去突破边界。一个人如果觉得自己已经掌握了终极真理，他的认知容器就满了，再也没有空间装新东西。&lt;/p&gt;
&lt;p&gt;那种一个劲儿吹嘘某一个技术、某一个框架、某一个理论的人，要么是能从吹嘘中获得利益，要么就是真的——用北方话说——山炮。&lt;/p&gt;
&lt;p&gt;不过"山炮"这个词可能太重了。也许只是偏执。偏执一段时间之后，也许能改变。真正的山炮是不认为自己需要进步或者改变的。所以重点不在于一个人当下的观点对不对，在于他有没有给自己留&lt;strong&gt;接受信息发散的空间&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;保持开放心态&lt;/h2&gt;
&lt;p&gt;我的几个学生现在持续看新东西，对自己学过的内容持审慎态度，持续更新，反复反思。这就是进步的节奏。我希望他们千万不要突然松了劲头，也不要崩得太紧，只要持续保持开放心态持续进步就好。&lt;/p&gt;
&lt;p&gt;哪怕有一天人类真的达到了 AGI，也不一定只有一条道路。就像肉可以煮着吃，也可以烤着吃。最怕的不是走得慢，是走着走着你觉得自己行了，哪怕还没达到目的地，就突然信心爆棚，然后把地图一扔，说其他的路都是错误的。&lt;/p&gt;
&lt;p&gt;回到宿命论那个问题。说实话，这种哲学层面的终极问题不是我所擅长的领域。虽然我内心并不认同机械决定论，但你要我给出一个无懈可击的论证来驳倒它，我也做不到。量子力学的不确定性、复杂系统的混沌效应、自由意志的神经科学讨论——每个角度都有各自的解释力，也可能有各自的局限。我唯一比较确定的是：如果你因为相信一切都是注定的，就不再努力、不再探索、不再反思了，那这个信或者不信的结论对你而言就不太划算。&lt;/p&gt;
&lt;p&gt;真正值得琢磨的或许是：当你发现自己正在用你熟悉的那个锤子去砸所有钉子的时候，能不能停下来问一句——有没有可能，有些东西根本不是钉子？&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;二手架构师杂谈 · 目录&lt;/p&gt;
&lt;h1&gt;二手架构师杂谈&lt;/h1&gt;
&lt;p&gt;上一篇软考高级系统架构设计师到底有没有用下一篇软考架构师备考刷题：从开源题库到单文件离线刷题系统&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="Philosophy"/><category term="Science"/><category term="Engineering"/><category term="Education"/></entry><entry><title>AI 能抹平外行和内行的差距吗</title><link href="https://blog.cycleuser.org/ai-neng-mo-ping-wai-xing-he-nei-xing-de-chai-ju-ma.html" rel="alternate"/><published>2026-07-07T00:00:00+08:00</published><updated>2026-07-07T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-07:/ai-neng-mo-ping-wai-xing-he-nei-xing-de-chai-ju-ma.html</id><summary type="html">&lt;p&gt;大胖哥
大胖哥&lt;/p&gt;
&lt;p&gt;前一阵在赵老师的Python群里面，有人聊起 AI 编程工具，说有了这东西，一个完全没学过编程的外行，配上各种工具和技 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;大胖哥
大胖哥&lt;/p&gt;
&lt;p&gt;前一阵在赵老师的Python群里面，有人聊起 AI 编程工具，说有了这东西，一个完全没学过编程的外行，配上各种工具和技能，能跟计算机本科毕业生干一样的活。甚至有人觉得 AI 彻底抹平了信息差，外行借助 AI 能达到硕士水平。&lt;/p&gt;
&lt;p&gt;真的如此么？恐怕未必。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;拿写代码来说&lt;/h2&gt;
&lt;p&gt;一个外行用 opencode 或者 cursor、codex，搭个简单的页面，写个一次性小脚本，确实能做出来。但稍微往外走一步，往真实的、复杂的业务环境里走一步，差距立刻就出来了。&lt;/p&gt;
&lt;p&gt;现在短视频平台上经常刷到这样的内容：一个自称零基础的人，花了半天，用 AI 搭了个漂亮的网页。前端导航栏、卡片、按钮一应俱全，后端还能读写数据库，甚至接了个支付接口。评论一片"程序员要失业了""以后不需要学代码了"。&lt;/p&gt;
&lt;p&gt;然后坑人的卖课的就都开始了，贩卖焦虑是它们卖课的好机会。&lt;/p&gt;
&lt;p&gt;几乎没人注意到一个问题：这个页面和后端用的全是假数据。那些好看卡片、表格、图表，填充的是 AI 随手编的示例——用户名全是"张三""李四"，数据曲线光滑得不像真实世界。在本机 &lt;code&gt;npm run dev&lt;/code&gt; 看到的华丽，距离能上线的东西，中间隔着的东西多了去了。真数据一灌进去，字段类型对不上，null 值没处理，并发没考虑，错误路径一条没覆盖。&lt;/p&gt;
&lt;p&gt;有人说那可以让 AI 继续改，agent 编排嘛，让 AI 自己检查、修、打磨。理论上是这样，外行实际操作起来是另一回事。他判断不了 AI 每一步输出的质量。AI 改了三轮，数据库结构变了一次，API 的返回格式调了两次，中间多了几个他没见过的配置文件。他问 AI"这些文件干嘛的"，AI 给了解释，他看着挺长挺专业，觉得大概没问题。这个"大概"就是裂缝的开始。&lt;/p&gt;
&lt;p&gt;事情不是突然失控的。最开始他还能看懂 AI 在干嘛，毕竟一个单 HTML 页面的结构就那么几行。后来依赖越来越多，AI 加了中间件、配了缓存层、换了状态管理库。每一步都说得通，每一步都把他的认知范围往外推了一点。推到某个位置，他突然发现这个项目在跑什么他完全说不清楚了。他只是 AI 指令的传达者：AI 说装这个包就装，AI 说改那个配置就改，AI 说这个报错解决了它就解决了。他点头，但没真的看懂。&lt;/p&gt;
&lt;p&gt;这种情况下如果出问题——比如线上某个接口莫名其妙报 500——他连该从哪里查都不知道。日志贴给 AI，AI 说大概是某个第三方依赖的兼容性问题，建议回退版本。他照做。好了一阵，又出别的问题。继续贴给 AI，AI 继续给方案。这个循环的终点，不是有一天他突然学会了，是有天连 AI 自己也绕不出来了——上下文塞满，bug 叠加 bug，之前的"修复"成了新问题的来源。到那个时候别说他，有经验的工程师接手也得头疼一阵。他以为自己是项目的主人，实际上他只是 AI 输出管道上的一个转发节点。而且他对这个处境毫无察觉。&lt;/p&gt;
&lt;p&gt;这就是外行用 AI 最危险的状态。AI 会给他一种信心，让他以为自己控制住了一切。问 AI"这个架构合理吗"，AI 说合理。问"有没有安全问题"，AI 列了几条，他说修，AI 修完说修好了。全程他没有独立验证任何一件事的能力。但因为每一步都得到了肯定的回复，他觉得自己在掌控全局。这种信心是 AI 替他搭起来的——他每次问，AI 每次都给一个让他觉得没问题的说法。他对这些说法没有任何独立验证，但说得多了，他就信了。等他真把这个东西推到生产环境里，那些他"验证过"的安全问题、那些他"检查过"的边界情况、那些他"跑通过"的测试，每一项都是拿 AI 的回复当证据的。而他根本分不出那些回复里哪句是事实、哪句是 AI 在顺着他说的漂亮话。&lt;/p&gt;
&lt;p&gt;说回来。外行人用 AI 写代码，缺的不是敲键盘的手速。工具已经很好用了，说话就写，报错就改，跑不通就调。缺的是判断力。AI 写完一段代码，你看不出它对不对。你能看懂的那部分，刚好在 AI 替你兜着的那条线以内。线外面的东西全是黑的。你不知道这个函数的边界情况该怎么测，不知道那个 SQL 查询数据量大了以后会不会崩，不知道它用的库是不是已经废弃了。AI 不会主动告诉你这些，除非你问。但你在不知道这些概念的时候，连问都不知道该问什么。&lt;/p&gt;
&lt;p&gt;这还只是写代码，AI 做得最好的领域。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;「最可能」不等于「最好」&lt;/h2&gt;
&lt;p&gt;目前这代 AI——Transformer 架构的大语言模型——本质上是个概率生成器。你问它一个问题，它给出的是基于训练语料统计出的最可能让用户满意的回答。这个差别在通用场景下不明显，在垂直专业领域就非常大。专业领域的"最优解"常常不在最流行的那些答案里，有时候还跟流行做法反着来。&lt;/p&gt;
&lt;p&gt;它倾向于给你一个迎合的回答。你说的东西它顺着你说，给了个看起来头头是道的方案。你看得舒服，觉得它真厉害。但这个方案放在行业里，可能是五年前的思路，可能是大厂对新手的通用建议但完全不适合你的场景，甚至可能已经被更新的实践推翻——只是训练语料里旧内容太多，它没见过新的。&lt;/p&gt;
&lt;p&gt;两个同学用同一个 AI 做同一个作业，给同样的问题，大概率得到很相似的答案。思路相似，结构相似，用语都相似。查重一过，两个人都傻了。他们没有互相抄，只是 AI 的输出池就那么大，概率最高的那条路，两个人一起走到头了。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;坐标系&lt;/h2&gt;
&lt;p&gt;外行人缺的是一套坐标系。行业里的人，哪怕只是个刚毕业的本科生，四年下来至少建了一个知识框架：知道这个领域大概分哪几块，每块有哪些核心问题，什么方案在什么条件下成立，哪些结论有前提、换个场景就不对了。这些东西学的时候可能没觉得多有用——谁背地质年代表的时候不犯困——但它们是判断力的底盘。&lt;/p&gt;
&lt;p&gt;有了这个底盘，AI 给你的东西你才能校准。它说了个方案，你能判断这个方案在你的场景下对不对。它列了参考文献，你知道哪篇是扎实的工作，哪篇是水文。它给了个看起来很厉害的实现，你知道少了一块——因为你清楚这个东西在实际工程里有哪些必踩的坑，AI 一个都没提。&lt;/p&gt;
&lt;p&gt;外行人没这个底盘。AI 说什么就是什么。AI 错了他看不出，AI 偷懒了他发觉不了。他只能从"结果看起来对不对"来判断，但很多专业问题结果是看不出来的——系统跑了三个月才发现数据库设计有缺陷。三个月前那个"看起来对"一文不值。&lt;/p&gt;
&lt;p&gt;反过来，如果两个人都是做这行的，一个经验浅一个经验深，AI 确实能拉近一些距离。经验浅的那个人知道自己要什么，只是手生，工具不熟，查文档慢。AI 帮他补了这部分——代码说话就写，文档不用查了直接问，调试报错贴回去它帮你分析。他能看懂 AI 给的方案的边界，能判断方向对不对，能识别出来 AI 是不是开始胡扯。经验深的那个老手只是比他快，但两个人看的是同一张地图。&lt;/p&gt;
&lt;p&gt;AI 抹平的是技能熟练度，抹不平认知基础。工具越好用，对内行人越是放大器——知道往哪儿使劲的人越用越强。不知道往哪儿使劲的人，工具越好越容易被带跑偏。而且这个跑偏特别隐蔽，因为 AI 的回应永远是自信的、流畅的、裹在专业术语里的。对没有辨别力的人来说，自信和正确长得一模一样。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;尺度&lt;/h2&gt;
&lt;p&gt;目前这代模型天然倾向于给出最大概率的、不冒犯的中庸回答。&lt;/p&gt;
&lt;p&gt;在写代码这种答案比较"硬"的场景——能跑就是能跑，报错就是报错——这个倾向的危害还算可控。&lt;/p&gt;
&lt;p&gt;在答案比较"软"的场景，比如做研究、做判断、做决策，问题就大了。&lt;/p&gt;
&lt;p&gt;很多专业场景下，最大概率的解就是最平庸的解，真正有价值的东西往往在长尾里。&lt;/p&gt;
&lt;p&gt;拿地球科学来说。你能采到的样品在整个地球中占比微乎其微。某个岩体你打了几个钻孔取了几段岩心，这几段岩心在多大程度上能代表整个岩体？在一个侵入岩体里，矿物组合、结构构造、蚀变程度这些东西可能几米之内就全变了。人的取样永远有物理上限，根据这些取样得出的认识，本质上是一个带有很大不确定性的概率估计。&lt;/p&gt;
&lt;p&gt;AI 不这么看问题。它基于已有的数据——那个岩体被文献记录过的描述——拼出一个"最可能"的样子，然后用相当确定的语气告诉你。外行人看了觉得好厉害、好清楚。懂行的人看了知道这份清楚是假的——模型把不确定性吃掉了，把本来应该老老实实写上"误差范围很大"的部分，换成了一个干脆利落的答案。&lt;/p&gt;
&lt;p&gt;搞地球科学的人或许对 AI 预测未来这件事不以为然，原因就在这。&lt;/p&gt;
&lt;p&gt;更不用说用 AI 推演宇宙演化、搞什么宿命论必然性了。连脚下这颗行星的三四成奥秘都没弄明白——这还是个粗略说法，不同学科不同层次比例不同——就敢用统计模型去外推几十亿年的宇宙史，这是对自己手里那点数据代表性能耐的盲目自信。&lt;/p&gt;
&lt;p&gt;有跨尺度研究背景的人——搞天文地质的，时间跨几十亿年，空间跨全球到显微——对这个问题可能格外敏感。同一个规律在小尺度和大尺度上表现完全不同。地壳尺度的变形机制和矿物晶格尺度的变形机制差了十万八千里，用其中一套去套另一套，结果一定是错的。区分哪些规律是普适的、哪些是尺度绑定的、哪些在什么条件下可以从一个尺度平滑过渡到另一个尺度——目前的 AI 做不了这个。它训练数据里可能有这些内容，但它没有判断力去决定什么时候该用哪一套。有判断力的，是脑子里装着跨尺度框架的人。&lt;/p&gt;
&lt;p&gt;而且目前的 AI 不仅跨不了尺度，它连"意识到自己在用一个尺度的规律去套另一个尺度的问题"这件事都做不到。它就是在自己的向量空间里找一个最接近的问法、拼一个最大概率的答法。给它一个具体的小问题，答得像模像样。给它一个跨尺度的大问题，也答得像模像样——因为它不知道自己不知道，它只是在生成。但那个答案，在懂行的人看来，是把多个不同层面的东西搅在一起，每一条单独拿出来可能都对，合起来完全不对。&lt;/p&gt;
&lt;p&gt;AI 抹平不了外行和内行的差距。它抹平的是技能层面的熟练度差异——查文档的速度、写代码的速度、处理重复劳动的速度。它抹不平的是判断力，是那个在脑子里已经建好的、知道什么情况下什么方案靠谱什么方案不靠谱的坐标系。这个坐标系没有捷径，就是靠时间堆出来的——读书、上课、做实验、踩坑、改错、再做一遍。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;学习还是有意义的&lt;/h2&gt;
&lt;p&gt;本科四年最大的价值，可能不是教会了哪门具体的课——大概率毕业没几年就忘光了。最大的价值是在脑子里搭了一个框架，让你遇到新问题的时候知道该往哪个方向找答案、怎么判断找到的答案对不对。外行人没有这个框架。AI 给不了这个框架。它只能给答案，给不了判断答案对错的能力。不仅如此，它还会给一种信心——让你误以为自己已经有了这个能力。这种误信比无知更麻烦，因为它让人敢于在自己完全不了解的领域里做决策。&lt;/p&gt;
&lt;p&gt;人对世界的认知本来就很局限。地球科学搞了几百年，对自己脚下这颗行星的了解也只是个大概。人能采样的范围就那么点，钻孔能打下去的深度就那么浅，地震波反演来反演去也就是个模糊的影子。人在自然面前还渺小得很，别太把自己手里的统计模型当回事。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇高校教师建议大学新生和家长都应该尽早防范的几种常见思维误区下一篇大学里是不是什么都学不到&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="AI"/><category term="AI"/><category term="LLM"/><category term="Cognition"/><category term="Education"/><category term="Earth Science"/></entry><entry><title>高校教师建议大学新生应该尽早防范的几种常见的思维误区</title><link href="https://blog.cycleuser.org/gao-xiao-jiao-shi-jian-yi-da-xue-xin-sheng-ying-gai-jin-zao-fang-fan-de-ji-chong-chang-jian-de-si-wei-wu-qu.html" rel="alternate"/><published>2026-07-05T00:00:00+08:00</published><updated>2026-07-05T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-05:/gao-xiao-jiao-shi-jian-yi-da-xue-xin-sheng-ying-gai-jin-zao-fang-fan-de-ji-chong-chang-jian-de-si-wei-wu-qu.html</id><summary type="html">&lt;p&gt;孩子要读大学了，就得让他尽快成长成大人了，说话做事都要更清醒。&lt;/p&gt;
&lt;p&gt;有时候孩子们容易陷入的一些思维误区，可能还有家 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;孩子要读大学了，就得让他尽快成长成大人了，说话做事都要更清醒。&lt;/p&gt;
&lt;p&gt;有时候孩子们容易陷入的一些思维误区，可能还有家长身上的影响因素。&lt;/p&gt;
&lt;p&gt;什么强加因果、比烂思维和逻辑塌方等等就不说了，这回咱们说些具体的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;急于证明自己是对的&lt;/h2&gt;
&lt;p&gt;最常见的坑，就是急于证明自己是对的，为这事浪费一大堆时间。&lt;/p&gt;
&lt;p&gt;你要把时间都花在证明自己对上，反思的时间就没了。可有时候你也未必那么对，有些新东西本可以去考虑、去补充，但你没注意，光顾着跟人较劲自己没错。时间是真金白银，这么花掉可惜了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/a32d92e0bc0b4b4f.png"&gt;&lt;/p&gt;
&lt;p&gt;甚至有的时候一上头可能一连几个小时去跟人在线对线论战，就算是逞了口舌之利赢了又能如何呢？浪费的时间精力是追不回来的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;错了还嘴硬&lt;/h2&gt;
&lt;p&gt;比上面更糟的是，自己明明知道错了，还嘴硬。&lt;/p&gt;
&lt;p&gt;人天性就不喜欢自己犯错，错了不愿意认，总想推卸责任。即便认了，也得补一句"不怪我，是别的原因导致的"。让他干干净净承认一句"我错了"，比登天还难。&lt;/p&gt;
&lt;p&gt;孩子容易这样，往往是因为大人也这样。大人总爱摆出一副啥都知道、啥都有正确答案的做派，不想让自己的形象变差。他觉得自己一旦跟孩子承认有啥事不知道，威严就扫地了。结果孩子有样学样，也变得特别固执。&lt;/p&gt;
&lt;p&gt;其实不管是人还是别的什么动物，犯错都再正常不过。记忆会出错，行为会失控，再高的高手都可能玩脱。认错是个很基础的事，不认错就不可能进步。你不承认问题存在，就没法解决问题。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;从众和从来如此&lt;/h2&gt;
&lt;p&gt;"别人都这样，那我也这样。""从来如此，就这样。"&lt;/p&gt;
&lt;p&gt;这俩说法都没来由，都不是理性的人该有的态度。该做的是根据自己的理性判断，把资料收集齐，权衡好利弊，再做判断。&lt;/p&gt;
&lt;p&gt;当然，不重要的事另说。中午吃啥，你没必要费这么大劲选。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;迷信权威和名人&lt;/h2&gt;
&lt;p&gt;一个很有名、很权威的人说了啥，不见得就该信。&lt;/p&gt;
&lt;p&gt;一个人赚了很多钱、很有名，他说啥你就信了，觉得信了也能赚那么多钱，这也不见得。就像有人坐电梯到了很高的楼层，你问他怎么上这么高的，他未必意识到自己坐了电梯。时代红利、运气这些外部因素，他都不愿意往外归因，他容易归因到自己身上——说是因为我健康饮食、每天喝八瓶水。这种话能靠谱吗？&lt;/p&gt;
&lt;p&gt;有的包装非常好看的「天选之人」结果被证明是精致的骗子。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/205a0537575f19b8.png"&gt;&lt;/p&gt;
&lt;p&gt;成年人不该再上这种当。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;学术上的权威也别盲信&lt;/h2&gt;
&lt;p&gt;就算是学术上的东西，很多人引用一篇文章、很多人说真对真对，也不见得就该信。&lt;/p&gt;
&lt;p&gt;当年心肌干细胞那事，很多人是真的做出那些结果吗？还是自己不敢去质疑权威？这不好说。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/56a99f1d6711d7d4.png"&gt;&lt;/p&gt;
&lt;p&gt;还有当年一些企业赞助的研究，比如某些碳水化合物类的厂商赞助营养和健康方面的研究。你要是说碳水化合物摄入过量对人害处大，你就拿不到赞助。能拿到赞助的，方向就被变相操控了。这事能搜到，不是秘密。&lt;/p&gt;
&lt;p&gt;所以绝对不能诉诸权威，那是扯的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;纠结细节而整体不通&lt;/h2&gt;
&lt;p&gt;还有一种，论证的整体框架都不成立，你却纠结于某个具体细节，跟人说"这个细节我很对，所以我全对"。&lt;/p&gt;
&lt;p&gt;这就像画一幅画，鼻子、眼睛、嘴每个细节都画得很好，可整个比例不协调、位置全错，这画就是不行，细节再好也没用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/8631f8f09027c98d.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;到了大学该诚实坦然&lt;/h2&gt;
&lt;p&gt;到了大学，千万得有这个意识：父母不是全都对，天底下没人全知全能。&lt;/p&gt;
&lt;p&gt;也不要迷信各种权威，连科学本身都不要去迷信。&lt;/p&gt;
&lt;p&gt;科学最重要的，是质疑，是探索，是好奇心和求知欲。&lt;/p&gt;
&lt;p&gt;希望父母们，也能放下架子，认清现实，以尊重的态度，诚实地跟孩子沟通。&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;基础知识 · 目录&lt;/p&gt;
&lt;h1&gt;基础知识&lt;/h1&gt;
&lt;p&gt;上一篇学习这件事，得先让孩子不恨它下一篇AI 能抹平外行和内行的差距吗？当前恐怕不行&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Learn"/><category term="Thinking"/></entry><entry><title>软考高级系统架构设计师到底有没有用</title><link href="https://blog.cycleuser.org/ruan-kao-gao-ji-xi-tong-jia-gou-she-ji-shi-dao-di-you-mei-you-yong.html" rel="alternate"/><published>2026-07-04T00:00:00+08:00</published><updated>2026-07-04T00:00:00+08:00</updated><author><name>CycleUsyer</name></author><id>tag:blog.cycleuser.org,2026-07-04:/ruan-kao-gao-ji-xi-tong-jia-gou-she-ji-shi-dao-di-you-mei-you-yong.html</id><summary type="html">&lt;p&gt;欢迎对软考感兴趣的朋友们订阅咱们这个合集：&lt;a href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIxOTA5Mzc5NQ==&amp;amp;action=getalbum&amp;amp;album_id=4379623684961845266#wechat_redirect"&gt;二手架构师杂谈&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;好像网上隔三岔五就能看到有人吵软考高级架构师有 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;欢迎对软考感兴趣的朋友们订阅咱们这个合集：&lt;a href="https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzIxOTA5Mzc5NQ==&amp;amp;action=getalbum&amp;amp;album_id=4379623684961845266#wechat_redirect"&gt;二手架构师杂谈&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;好像网上隔三岔五就能看到有人吵软考高级架构师有没有用，每次都能吵个没完。&lt;/p&gt;
&lt;p&gt;这事儿吧，我觉得最没意思的两种极端就是：一种是我没考过，或者我考了没过，就一口咬定这东西一文不值，纯属骗钱骗时间；另一种是我考过了，就把它吹上天，什么含金量秒杀一切、有了它别的证书都不用看了。&lt;/p&gt;
&lt;p&gt;这俩说法都挺扯的。&lt;/p&gt;
&lt;p&gt;我自己是裸考挂过一次论文，后来又第二次过的。&lt;/p&gt;
&lt;p&gt;第一次折在了论文题上，后来就着重备考这部分，参考 &lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564022&amp;amp;idx=1&amp;amp;sn=c3c463f9895c8ae3c8b242457f5339d0&amp;amp;scene=21#wechat_redirect"&gt;软考系统架构设计师论文题备考思路指南&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/4335862cfa85f821.png"&gt;&lt;/p&gt;
&lt;p&gt;第二次考试就特别准备了一下，具体情况可以参考前文：&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650563935&amp;amp;idx=1&amp;amp;sn=35b3eaf8aa8c89405056238969cc9509&amp;amp;token=1570808387&amp;amp;lang=zh_CN&amp;amp;scene=21&amp;amp;poc_token=HN1IRmqjCxZrHiMsMSUKPostHAGtrlrZCYwaoiIQ#wechat_redirect"&gt;复盘一下软考高级架构设计师的备考和应考过程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/2bd0fcadd07b5d85.png"&gt;&lt;/p&gt;
&lt;p&gt;过了我也不觉得这就能说明多厉害，没过那会儿我也没觉得这考试是垃圾。&lt;/p&gt;
&lt;p&gt;有它的用处，也有它的局限，没必要捧到天上也没必要踩到地下。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;架构师的这些考试内容，本质上很多就是计算机专业基础课程的那些东西。&lt;/p&gt;
&lt;p&gt;数据结构、操作系统、网络、软件工程、数据库，这些玩意儿科班出身的同学大学都学过。可学过归学过，学完就忘的也不在少数。对教师来说，把这套东西再过一遍，其实就是一个把当年学过、后来可能又生疏了的知识重新磨练一遍的过程，温故而知新。&lt;/p&gt;
&lt;p&gt;再说另一个角度：平时开发里用的东西，到了架构考试这儿，往往能给你归置到一块儿。&lt;/p&gt;
&lt;p&gt;你写了好几年代码，缓存用过、消息队列用过、分布式库分表还有什么拉姆达架构等等也搞过，可这些经验散在脑子里头是零碎的，像一抽屉乱七八糟的零件。备考的过程，某种程度上就是逼着你把这些零件拿出来、擦干净、按类别摆好。什么影响性能、什么是可用性、什么场景该上微服务什么场景不该上、质量属性之间怎么打架怎么权衡——这些东西你平时可能也琢磨过，但没有一个框架把它们串起来。啃一遍教材，再对照着自己做过的项目想一遍，很多原来模模糊糊的感觉就清楚了。&lt;/p&gt;
&lt;p&gt;这跟写年终总结一个道理，你不写不知道自己这一年到底干了啥，一写才发现哦原来我做过这些事儿。&lt;/p&gt;
&lt;p&gt;所以这考试最大的用处，倒不一定在于那张证书，而在于它给你提供了一个契机，让你把经验和知识捋一遍，而证书是额外赠品。&lt;/p&gt;
&lt;p&gt;&lt;img alt="Image" src="../images/83107ff1b98c5a9e.png"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;还有一层我特别想说的，是检验和反馈这事儿本身的价值。&lt;/p&gt;
&lt;p&gt;人做完了一些工作之后，总得有个渠道检验一下自己到底咋样。光自己闷头干，很容易陷入一种"我觉得我挺行"或者"我觉得我挺不行"的两极摇摆里，因为这俩感觉都没有参照系。考试就是这么一个参照系，虽然不完美，但好歹是个外部的东西，比你自己跟自己较劲强。&lt;/p&gt;
&lt;p&gt;你考过了，至少说明在这一套知识体系的衡量下，你达到了某个线。你哪科没过，至少说明那块儿你确实差点意思。这种反馈是实打实的，比朋友圈里互相点赞真实多了。&lt;/p&gt;
&lt;p&gt;拿到一张认证，也是一个正向的闭环。你学了、你练了、你检验了、你拿到了一个被承认的东西，这事儿就闭环了。&lt;/p&gt;
&lt;p&gt;接下来不管你是想升职、想跳槽、还是想跟人聊天的时候多点底气，这张纸好歹能帮你撑撑场面。它当然不是万能的，可它也不是废纸。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最后说回它不完美的地方。&lt;/p&gt;
&lt;p&gt;架构师考试覆盖的东西太广了，广到必然未必深刻。软考那套教材你翻一遍就知道，什么都要讲，可能就什么都没法讲透。&lt;/p&gt;
&lt;p&gt;过了这考试，不代表你真就是个合格的架构师，顶多代表你在那套知识体系里达标了。&lt;/p&gt;
&lt;p&gt;真正架构师的功夫，是在一个一个项目里练出来的，很多事情考试考不出来。&lt;/p&gt;
&lt;p&gt;所以你要是问我它有没有用，我的回答是：有用，但没神化到那种程度。&lt;/p&gt;
&lt;p&gt;你要是科班出身、基础扎实、又一直在一线干活，那备考的过程对你来说就是个把零碎经验归拢归拢的活儿，过了顺手拿个证，没过也知道了自己哪儿差点意思。&lt;/p&gt;
&lt;p&gt;如果跟我一样非科班、半路转行、或者平时接触的面比较窄，那它就更值当了，等于逼着你把计算机基础的那些东西系统地过一遍，补上一块可能一直缺着的短板。&lt;/p&gt;
&lt;p&gt;反过来，你要是已经是大厂资深架构、带过大团队、扛过大项目，那这考试对你来说确实意义不大，顶多锦上添花。你真不用靠这张纸证明自己。&lt;/p&gt;
&lt;p&gt;至于把它说成一文不值，或者吹成秒杀一切的硬通货，那都是话术，跟这考试本身没啥关系。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;除了考试本身，我倒想说说蕴含在备考和应考这个过程里的另一些东西。&lt;/p&gt;
&lt;p&gt;两次进考场，有个现象挺触动我的，就是出勤率。&lt;/p&gt;
&lt;p&gt;第一次我没具体数，但肉眼一看就知道座位空了不少，顶多坐了一半多点儿，差不多一小半的人压根没到。那会儿我自己备考也紧，没心思细琢磨这事儿。&lt;/p&gt;
&lt;p&gt;等第二次去考的时候，我就特意留意了一下。那个考场名额是 50 个人，我数了一遍，到场的只有 24 个还是 25 个。等下午考完最后一场，再一看，就剩 20 个左右了，有人上午还在、下午人就没了。&lt;/p&gt;
&lt;p&gt;这情况其实挺普遍的。你想想，考软考的大多数都是在职的人，毕业好多年了，甚至年纪挺大的。像我这种 40 来岁的在里面都不算最老的，还有看着比我大、50 岁上下的也在考。这种人有家有业有工作，考试那天遇上个项目紧急上线、家里有事或者出差赶不回来，太正常了。不是说人家就没坚持下来，很可能就是那天实在去不了。还有的人上午来了，咬着牙考了两场，下午实在扛不住撤了，也不稀奇。&lt;/p&gt;
&lt;p&gt;这就引出一个挺有意思的事儿。网上老有人说软考通过率低，10% 上下，听着挺吓人，好像这考试难得要命。可你要是把我那个考场的情况拆开算，就会发现这个"10%"的水分不小。&lt;/p&gt;
&lt;p&gt;50 个人的名额，实际到场 24 个，撑死 25 个，再扣掉下午弃考的，真正把三场考完的也就 20 个上下。这 20 个里头，假设最后过了 5 个——我说假设啊，实际可能不止 5 个——那 5 个人占的是谁的分母？是这 20 个完赛的人，不是那 50 个报名的人。5 除以 20，那是 25%。这通过率是不是就高多了？&lt;/p&gt;
&lt;p&gt;当然就一个考场看，样本太小，不能拿来一概而论。可这个思路是可以参考的：那个 10%，是把报名没去的、上午来下午走的，全算进分母了。真正从头坐到尾的人里头，过的比例没那么低。&lt;/p&gt;
&lt;p&gt;所以这考试也没必要神化成什么难如登天的玩意儿。它难不难？有一定难度，特别是论文那科，没准备过体例的人头一回确实容易抓瞎，我头一回不就是栽这上头了么。可要说它难得吓人、通过率惨不忍睹，那也不至于。你真坐到考场里把三场考完，比你想象的容易些。&lt;/p&gt;
&lt;p&gt;说回到这个过程本身。我后来琢磨，这事儿给我的启发倒不只在架构知识上。你在一个 40 多岁还能往考场里扎、50 岁的人也还在考的环境里头坐着，本身就有股劲儿。这帮人不是为了拿证换个好工作，多数人早就过了靠一张纸找活儿的年纪了。可能图的就是个不让自己停下来、不想就这么混下去的心气儿。&lt;/p&gt;
&lt;p&gt;人最容易丢的不是技术、不是学历，是这股心气儿。考个试、啃本书、把一摊零碎知识整理下，看着折腾，其实给自己续这口气，让自己能够提起精神来应对考验。这种考试正好给了一个机会。光这点，我就觉得挺值。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;再说说辅导班这事儿。&lt;/p&gt;
&lt;p&gt;网上那些个机构，有几个挺大的，广告铺天盖地，刷短视频刷着刷着就蹦出来一个，跟你说不报班就过不了似的。那到底有没有必要报班呢？&lt;/p&gt;
&lt;p&gt;我自己报过班，所以能说两句实话。我的感觉是，报班给我的帮助没那么大，远不如它收的成本高。真要说有用的部分，其实就是论文批改那一块儿，有人帮你看看格式对不对路、结构顺不顺，给个反馈。可等你搞清楚论文该咋写了，剩下的事儿——刷真题、背综合知识——自己干也完全能搞定，我心里是有底能考下来的。&lt;/p&gt;
&lt;p&gt;更坑的是我还被一个所谓的"网红"坑过。这人在某些视频网站上挺热，免费那部分内容流量大、听的人多，他那私塾课堂就也有人跟着掏钱。可实际听了才知道，讲得属实不咋样，录音设备也差，滋滋啦啦的，内容也不太对路，好些地方讲得就不准确。这位也不是科班干这行的，半路出家搞开发，后来转去搞培训。咱就不点人名了，也不坏人家买卖，毕竟人家也是凭本事吃饭。但你要问我推荐不推荐，那我肯定不推荐。&lt;/p&gt;
&lt;p&gt;我给大家的建议是：先刷真题。论文这东西呢，找几篇写得规范的范文看看，照着把那个体例摸清楚，自己先准备准备就行。复习的时候，把论文和案例分析的真题当主力，拿这些东西当抓手，复习到哪块儿了顺带把综合知识里对应的点记一记，该背的背，该刷的刷。三科虽然科目多，但每科考的难度其实都不算太难，深度也不深，就是抽象层次挺高，知识点铺得广。别被那套教材的厚度吓住，真坐下来啃，没那么吓人。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;考过了能换啥呢？能兑换个副高职称。有些地方还有购房补贴、人才政策啥的。不过这种政策各地不一样，而且也不一定稳定，今年有明年可能就没了，参考价值不太大，别冲着这个去考。&lt;/p&gt;
&lt;p&gt;主要是个经历吧。考过一回，拿着能当个谈资，跟人聊天的时候吹吹牛，也就这样了。&lt;/p&gt;
&lt;p&gt;我当初考这个，其实动机挺朴素的：我本科不是学计算机的，总有人拿这个说我水平差、是外行。我就想着好歹考个级别高点儿的证书，证明一下自己在这行里是个合格的。可后来真考过了，慢慢也就想明白了：你过了这个考试，和你能不能干好这个活儿，它不是一码事，没有直接的必然联系。证书能帮你过简历这关、堵住一部分嘴，可真到了项目里，还是看你能不能把活儿干明白。大家理性看待吧。&lt;/p&gt;
&lt;p&gt;最后说一句，希望这次没能上岸的同学，年底那回都一定能过。这东西一回不行就两回，没考过不丢人，中途有事儿没去成也不丢人。慢慢整，都能考到自己想要的那个结果。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;准备了一些参考资料，分享给大家：&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564998&amp;amp;idx=1&amp;amp;sn=bf45d7a9dfecbf8dfcd45ea08bf59700&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师知识精要&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564998&amp;amp;idx=1&amp;amp;sn=bf45d7a9dfecbf8dfcd45ea08bf59700&amp;amp;scene=21#wechat_redirect"&gt;-&lt;/a&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564998&amp;amp;idx=1&amp;amp;sn=bf45d7a9dfecbf8dfcd45ea08bf59700&amp;amp;scene=21#wechat_redirect"&gt;架构师&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564998&amp;amp;idx=1&amp;amp;sn=bf45d7a9dfecbf8dfcd45ea08bf59700&amp;amp;scene=21#wechat_redirect"&gt;专业英语高频词汇表&lt;/a&gt;&lt;strong&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564998&amp;amp;idx=1&amp;amp;sn=bf45d7a9dfecbf8dfcd45ea08bf59700&amp;amp;scene=21#wechat_redirect"&gt;原创&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564996&amp;amp;idx=1&amp;amp;sn=c3fd0a130803fda3a500a0ca12ef5e02&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师知识精要&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564996&amp;amp;idx=1&amp;amp;sn=c3fd0a130803fda3a500a0ca12ef5e02&amp;amp;scene=21#wechat_redirect"&gt;-新兴技术与基础设施&lt;/a&gt;&lt;strong&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564996&amp;amp;idx=1&amp;amp;sn=c3fd0a130803fda3a500a0ca12ef5e02&amp;amp;scene=21#wechat_redirect"&gt;原创&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564828&amp;amp;idx=1&amp;amp;sn=8981558808ec8615fbddda20e0581695&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师知识精要&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564828&amp;amp;idx=1&amp;amp;sn=8981558808ec8615fbddda20e0581695&amp;amp;scene=21#wechat_redirect"&gt;-&lt;/a&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564828&amp;amp;idx=1&amp;amp;sn=8981558808ec8615fbddda20e0581695&amp;amp;scene=21#wechat_redirect"&gt;系统&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564828&amp;amp;idx=1&amp;amp;sn=8981558808ec8615fbddda20e0581695&amp;amp;scene=21#wechat_redirect"&gt;安全与区块链技术&lt;/a&gt;&lt;strong&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564828&amp;amp;idx=1&amp;amp;sn=8981558808ec8615fbddda20e0581695&amp;amp;scene=21#wechat_redirect"&gt;原创&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564827&amp;amp;idx=1&amp;amp;sn=e5ddb12aa5569104d1f96f3517f1dee1&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师知识精要&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564827&amp;amp;idx=1&amp;amp;sn=e5ddb12aa5569104d1f96f3517f1dee1&amp;amp;scene=21#wechat_redirect"&gt;-数据库与存储&lt;/a&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564827&amp;amp;idx=1&amp;amp;sn=e5ddb12aa5569104d1f96f3517f1dee1&amp;amp;scene=21#wechat_redirect"&gt;架构&lt;/a&gt;&lt;/em&gt;&lt;strong&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564827&amp;amp;idx=1&amp;amp;sn=e5ddb12aa5569104d1f96f3517f1dee1&amp;amp;scene=21#wechat_redirect"&gt;原创&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564733&amp;amp;idx=1&amp;amp;sn=95b8bbff201b05f398cb45cc2c2a0ca8&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师知识精要&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564733&amp;amp;idx=1&amp;amp;sn=95b8bbff201b05f398cb45cc2c2a0ca8&amp;amp;scene=21#wechat_redirect"&gt;-软件测试与运行维护&lt;/a&gt;&lt;strong&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564733&amp;amp;idx=1&amp;amp;sn=95b8bbff201b05f398cb45cc2c2a0ca8&amp;amp;scene=21#wechat_redirect"&gt;原创&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564516&amp;amp;idx=1&amp;amp;sn=64f8fa6393579572ec6b65d010eeed74&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师知识精要&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564516&amp;amp;idx=1&amp;amp;sn=64f8fa6393579572ec6b65d010eeed74&amp;amp;scene=21#wechat_redirect"&gt;-软件&lt;/a&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564516&amp;amp;idx=1&amp;amp;sn=64f8fa6393579572ec6b65d010eeed74&amp;amp;scene=21#wechat_redirect"&gt;架构设计&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564516&amp;amp;idx=1&amp;amp;sn=64f8fa6393579572ec6b65d010eeed74&amp;amp;scene=21#wechat_redirect"&gt;与评估&lt;/a&gt;&lt;strong&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564516&amp;amp;idx=1&amp;amp;sn=64f8fa6393579572ec6b65d010eeed74&amp;amp;scene=21#wechat_redirect"&gt;原创&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564434&amp;amp;idx=1&amp;amp;sn=4b9c96b9c2dfc47cbe436cd1e38606e0&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师知识精要&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564434&amp;amp;idx=1&amp;amp;sn=4b9c96b9c2dfc47cbe436cd1e38606e0&amp;amp;scene=21#wechat_redirect"&gt;-&lt;/a&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564434&amp;amp;idx=1&amp;amp;sn=4b9c96b9c2dfc47cbe436cd1e38606e0&amp;amp;scene=21#wechat_redirect"&gt;系统&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564434&amp;amp;idx=1&amp;amp;sn=4b9c96b9c2dfc47cbe436cd1e38606e0&amp;amp;scene=21#wechat_redirect"&gt;建模与UML&lt;/a&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564434&amp;amp;idx=1&amp;amp;sn=4b9c96b9c2dfc47cbe436cd1e38606e0&amp;amp;scene=21#wechat_redirect"&gt;设计&lt;/a&gt;&lt;/em&gt;&lt;strong&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564434&amp;amp;idx=1&amp;amp;sn=4b9c96b9c2dfc47cbe436cd1e38606e0&amp;amp;scene=21#wechat_redirect"&gt;原创&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564430&amp;amp;idx=1&amp;amp;sn=f27f1a1a93cb0470818127f4158cf5b7&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师知识精要&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564430&amp;amp;idx=1&amp;amp;sn=f27f1a1a93cb0470818127f4158cf5b7&amp;amp;scene=21#wechat_redirect"&gt;-软件工程与开发方法&lt;/a&gt;&lt;strong&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564430&amp;amp;idx=1&amp;amp;sn=f27f1a1a93cb0470818127f4158cf5b7&amp;amp;scene=21#wechat_redirect"&gt;原创&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564426&amp;amp;idx=1&amp;amp;sn=ab5875c9820f2d77a9e32cdda334f0d7&amp;amp;scene=21#wechat_redirect"&gt;软考高级系统架构设计师知识精要&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564426&amp;amp;idx=1&amp;amp;sn=ab5875c9820f2d77a9e32cdda334f0d7&amp;amp;scene=21#wechat_redirect"&gt;-信息&lt;/a&gt;&lt;em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564426&amp;amp;idx=1&amp;amp;sn=ab5875c9820f2d77a9e32cdda334f0d7&amp;amp;scene=21#wechat_redirect"&gt;系统&lt;/a&gt;&lt;/em&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564426&amp;amp;idx=1&amp;amp;sn=ab5875c9820f2d77a9e32cdda334f0d7&amp;amp;scene=21#wechat_redirect"&gt;与企业信息化&lt;/a&gt;&lt;strong&gt;&lt;a href="https://mp.weixin.qq.com/s?__biz=MzIxOTA5Mzc5NQ==&amp;amp;mid=2650564426&amp;amp;idx=1&amp;amp;sn=ab5875c9820f2d77a9e32cdda334f0d7&amp;amp;scene=21#wechat_redirect"&gt;原创&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;预览时标签不可点&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;Name cleared&lt;/p&gt;
&lt;p&gt;&lt;img alt="赞赏二维码" src=""&gt;&lt;strong&gt;微信扫一扫赞赏作者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Like the AuthorOther Amount&lt;/p&gt;
&lt;p&gt;赞赏后展示我的头像&lt;/p&gt;
&lt;p&gt;作品&lt;/p&gt;
&lt;p&gt;暂无作品&lt;/p&gt;
&lt;p&gt;Like the Author&lt;/p&gt;
&lt;p&gt;Other Amount&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;OK&lt;/p&gt;
&lt;p&gt;Back&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Amount&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;赞赏金额&lt;/p&gt;
&lt;p&gt;¥&lt;/p&gt;
&lt;p&gt;最低赞赏 ¥0&lt;/p&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;p&gt;0&lt;/p&gt;
&lt;p&gt;.&lt;/p&gt;
&lt;p&gt;二手架构师杂谈 · 目录&lt;/p&gt;
&lt;h1&gt;二手架构师杂谈&lt;/h1&gt;
&lt;p&gt;上一篇架构是个什么东西，架构师又是干啥的下一篇计算机学科的同学尤其应该注重培养通识并且避免工程上的傲慢&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;
&lt;p&gt;搜索「」网络结果&lt;/p&gt;
&lt;p&gt;Close&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;调整当前正文文字大小&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更多&lt;/p&gt;
&lt;p&gt;100%&lt;/p&gt;</content><category term="Story"/><category term="Story"/><category term="Book"/><category term="History"/><category term="Architecture"/></entry></feed>