<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>技术分享 on CAO ZUOHUA</title><link>https://caozuohua.github.io/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/</link><description>Recent content in 技术分享 on CAO ZUOHUA</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 03 Nov 2026 22:00:00 +0800</lastBuildDate><atom:link href="https://caozuohua.github.io/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/index.xml" rel="self" type="application/rss+xml"/><item><title>系统崩溃归因：从内核到内存的五层收敛法</title><link>https://caozuohua.github.io/posts/2026-11-03-crash-analysis-five-layers/</link><pubDate>Tue, 03 Nov 2026 22:00:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-11-03-crash-analysis-five-layers/</guid><description>&lt;h1 id="系统崩溃归因从内核到内存的五层收敛法"&gt;系统崩溃归因：从内核到内存的五层收敛法&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;导语：崩溃分析真正的工作量不在「找到崩溃的那个函数」，而在证明它不是根因。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;崩溃报告给出的，几乎总是&lt;strong&gt;发现故障的位置&lt;/strong&gt;，而不是&lt;strong&gt;造成故障的位置&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;内核是个诚实的证人，但它的证词有偏差：它只在踩到非法内存的那一刻报警。而那块内存可能几毫秒前、也可能十几分钟前就被别人写坏了；那个对象可能早已被回收，指针只是还挂在某个链表上。所以崩溃点天生在下游，根因在上游，两者之间隔着一段时序。&lt;/p&gt;&#10;&lt;p&gt;这决定了排查的基本形状：不是去找「谁崩了」，而是沿时间往回退，直到找到一个能被证据钉住、又能被实验证伪的环节。&lt;/p&gt;&#10;&lt;p&gt;下面这套分层方法，是我在一次真实的蓝屏排查中逐步磨出来的。它不是检查清单的堆叠，而是一条证据粒度越来越细的收敛链。&lt;/p&gt;&#10;&lt;h2 id="五层漏斗每层只回答一个问题"&gt;五层漏斗：每层只回答一个问题&lt;/h2&gt;&#10;&lt;p&gt;层与层之间不是并列关系，而是&lt;strong&gt;上下游&lt;/strong&gt;关系。上层的产物是下层的输入，判据是「是否产出一个能被下一层消费的锚点」。没有锚点的层，等于没做。&lt;/p&gt;&#10;&lt;div class="cr-fig"&gt;&#10;&lt;style&gt;&#10;.cr-fig{margin:30px 0}&#10;.cr-fig svg{display:block;width:100%;height:auto}&#10;.cr-cap{font-size:13px;color:#6c757d;text-align:center;margin-top:10px;line-height:1.6}&#10;&lt;/style&gt;&#10;&lt;svg viewBox="0 0 680 452" width="100%" role="img" xmlns="http://www.w3.org/2000/svg"&gt;&#10;&lt;title&gt;崩溃分析的五层收敛漏斗&lt;/title&gt;&#10;&lt;desc&gt;从内核日志、调用栈、模块归属、驱动特征到内存机理，逐层把嫌疑集合收窄，每层产出一个供下一层消费的锚点。&lt;/desc&gt;&#10;&lt;rect x="135" y="24" width="430" height="72" rx="10" fill="#f8f9fa" stroke="#dee2e6" stroke-width="0.5"/&gt;&#10;&lt;text x="350" y="48" text-anchor="middle" dominant-baseline="central" font-size="14" font-weight="500" fill="#212529"&gt;L1 内核层 · kernel&lt;/text&gt;&#10;&lt;text x="350" y="68" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#6c757d"&gt;问：崩在什么上下文、什么错误类型&lt;/text&gt;&#10;&lt;text x="350" y="86" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#6c757d"&gt;出：错误性质 + 故障 IP + 非法地址&lt;/text&gt;&#10;&lt;rect x="155" y="108" width="390" height="72" rx="10" fill="#f8f9fa" stroke="#dee2e6" stroke-width="0.5"/&gt;&#10;&lt;text x="350" y="132" text-anchor="middle" dominant-baseline="central" font-size="14" font-weight="500" fill="#212529"&gt;L2 调用栈 · backtrace&lt;/text&gt;&#10;&lt;text x="350" y="152" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#6c757d"&gt;问：谁调用谁、路径是怎么走过来的&lt;/text&gt;&#10;&lt;text x="350" y="170" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#6c757d"&gt;出：一条方向 + 最深的外部帧&lt;/text&gt;&#10;&lt;rect x="175" y="192" width="350" height="72" rx="10" fill="#f8f9fa" stroke="#dee2e6" stroke-width="0.5"/&gt;&#10;&lt;text x="350" y="216" text-anchor="middle" dominant-baseline="central" font-size="14" font-weight="500" fill="#212529"&gt;L3 模块层 · module&lt;/text&gt;&#10;&lt;text x="350" y="236" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#6c757d"&gt;问：这个地址属于哪个模块&lt;/text&gt;&#10;&lt;text x="350" y="254" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#6c757d"&gt;出：具名模块，或「全部在内核内」&lt;/text&gt;&#10;&lt;rect x="193" y="276" width="314" height="72" rx="10" fill="#f8f9fa" stroke="#dee2e6" stroke-width="0.5"/&gt;&#10;&lt;text x="350" y="300" text-anchor="middle" dominant-baseline="central" font-size="14" font-weight="500" fill="#212529"&gt;L4 驱动层 · driver&lt;/text&gt;&#10;&lt;text x="350" y="320" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#6c757d"&gt;问：它为何在此刻、此负载下出错&lt;/text&gt;&#10;&lt;text x="350" y="338" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#6c757d"&gt;出：可证伪的缺陷假设&lt;/text&gt;&#10;&lt;rect x="208" y="360" width="284" height="72" rx="10" fill="#fdf4f4" stroke="#e8cccc" stroke-width="0.5"/&gt;&#10;&lt;text x="350" y="384" text-anchor="middle" dominant-baseline="central" font-size="14" font-weight="500" fill="#8a2f2f"&gt;L5 内存层 · memory&lt;/text&gt;&#10;&lt;text x="350" y="404" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#a05050"&gt;问：这些字节是被谁改坏或回收的&lt;/text&gt;&#10;&lt;text x="350" y="422" text-anchor="middle" dominant-baseline="central" font-size="12" fill="#a05050"&gt;出：破坏者 ≠ 受害者&lt;/text&gt;&#10;&lt;/svg&gt;&#10;&lt;div class="cr-cap"&gt;图 1 · 每层只承担一个问题，且必须交付一个可被下层消费的锚点&lt;br&gt;越往下越接近机理，也越贵 —— 上层没收敛就别急着往下跳&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;在进入 L1 之前，还有一件成本最低、收益最高的事。&lt;/p&gt;</description></item><item><title>mem0 最小部署：193MB 跑起来的 Agent 记忆层，瓶颈却不在内存</title><link>https://caozuohua.github.io/posts/2026-10-21-mem0-minimal-deployment/</link><pubDate>Wed, 21 Oct 2026 11:00:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-10-21-mem0-minimal-deployment/</guid><description>&lt;style&gt;&#10; .mem0-card { margin: 20px 0; padding: 18px; background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 8px; }&#10; .mem0-chart { margin: 20px 0 8px; padding: 18px 16px 10px; background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 8px; }&#10; .mem0-cap { margin: 6px 0 0; font-size: 12px; color: #868e96; text-align: center; }&#10; .mem0-tier { display: flex; align-items: center; gap: 12px; padding: 9px 0; border-bottom: 1px solid #e9ecef; }&#10; .mem0-tier:last-of-type { border-bottom: none; }&#10; .mem0-tier-name { flex: 0 0 118px; font-size: 13px; color: #212529; font-weight: 600; }&#10; .mem0-tier-sub { font-size: 12px; color: #868e96; font-weight: 400; }&#10; .mem0-track { flex: 1 1 auto; height: 9px; border-radius: 5px; background: #e9ecef; }&#10; .mem0-track i { display: block; height: 100%; border-radius: 5px; }&#10; .mem0-pct { flex: 0 0 76px; text-align: right; font-size: 13px; font-weight: 600; color: #212529; }&#10; .mem0-foot { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 16px; padding-top: 12px; border-top: 1px solid #dee2e6; font-size: 12px; color: #868e96; }&#10; .mem0-bar { display: flex; height: 14px; border-radius: 7px; overflow: hidden; margin-bottom: 18px; }&#10; .mem0-bar span { display: block; height: 100%; }&#10; .mem0-warn { margin: 20px 0; padding: 16px 18px; background: #fff8f8; border: 1px solid #f1d0d0; border-left: 4px solid #dc3545; border-radius: 8px; }&#10; .mem0-warn p { margin: 0 0 10px; }&#10; .mem0-warn p:last-child { margin-bottom: 0; }&#10; .mem0-warn-title { font-weight: 600; color: #a71d2a; }&#10; .mem0-ok { margin: 20px 0; padding: 16px 18px; background: #f6fbf7; border: 1px solid #cfe8d8; border-left: 4px solid #2f9e5f; border-radius: 8px; }&#10; .mem0-ok p { margin: 0 0 10px; }&#10; .mem0-ok p:last-child { margin-bottom: 0; }&#10; .mem0-ok-title { font-weight: 600; color: #1d7040; }&#10; @media (max-width: 560px) {&#10; .mem0-tier-name { flex: 0 0 92px; font-size: 12px; }&#10; .mem0-pct { flex: 0 0 68px; font-size: 12px; }&#10; }&#10;&lt;/style&gt;&#10;&lt;h1 id="mem0-最小部署193mb-跑起来的-agent-记忆层瓶颈却不在内存"&gt;mem0 最小部署：193MB 跑起来的 Agent 记忆层，瓶颈却不在内存&lt;/h1&gt;&#10;&lt;p&gt;mem0 是这两年的 Agent 记忆层网红。但当你真的想把它塞进一个个人项目时，第一个问题不是&amp;quot;怎么用&amp;quot;，而是&amp;quot;&lt;strong&gt;它到底要吃多少资源&lt;/strong&gt;&amp;quot;。&lt;/p&gt;</description></item><item><title>Meta Muse 拆解：消费级 Agent 的玩法全解，与上线六周暴露的七个问题</title><link>https://caozuohua.github.io/posts/2026-10-01-meta-muse-agent-teardown/</link><pubDate>Thu, 01 Oct 2026 08:10:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-10-01-meta-muse-agent-teardown/</guid><description>&lt;h1 id="meta-muse-拆解消费级-agent-的玩法全解与上线六周暴露的七个问题"&gt;Meta Muse 拆解：消费级 Agent 的玩法全解，与上线六周暴露的七个问题&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;2026 年 9 月 8 日，Meta 发布 Muse，自称「世界首个为所有人打造的个人 AI Agent」。六周之后，它交出的成绩单是双面的：美国日活约 60 万、专用硬件 Muse Charm 定档 12 月发货；同时它也比任何一个同类产品更快地踩中了地址外泄、零日漏洞、被电商平台封禁、被指抄袭开源框架这一整串问题。&lt;/p&gt;&#10;&lt;p&gt;这篇文章不站队，只做一件事：把 Muse 的产品设计、技术架构和商业模式拆开，让你看清&lt;strong&gt;一个消费级 Agent 到底是怎么运转的&lt;/strong&gt;，以及这套设计在哪里漏了风。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="一30-秒结论"&gt;一、30 秒结论&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;它是什么&lt;/strong&gt;：一个「执行型」而非「对话型」的个人 Agent。用户告诉它要完成什么，它自己去开浏览器、填表单、发邮件、谈价格、下单付款；关掉 App 也继续跑，只在敏感动作前回来找你要授权。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;最有价值的设计&lt;/strong&gt;：&lt;strong&gt;Muse Secure VM + Sentinel 双 Agent 架构&lt;/strong&gt;。每个用户独占一台云端虚拟机，另有一个系统级隔离的守门 Agent，Muse 的任何出网动作都要经它批准。这是目前消费级产品里对「Agent 越权」最认真的一次工程回应。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;最有商业含义的动作&lt;/strong&gt;：支付走 Stripe Link，且是&lt;strong&gt;第一个被 Link 购买保护覆盖的 AI Agent&lt;/strong&gt;——虚拟一次性卡号、丢件/降价/退货有保。Meta 明确说长期变现靠&lt;strong&gt;交易抽佣&lt;/strong&gt;，不是订阅费。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;最能说明问题的部分&lt;/strong&gt;：六周内的七个事故。它们不是孤立的运维失误，而是指向同一个结构性矛盾——&lt;strong&gt;给 Agent 的权限越大，可被诱导的路径就越多&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;一个关键背景&lt;/strong&gt;：Muse 的文件体系（&lt;code&gt;SOUL.md&lt;/code&gt;、&lt;code&gt;memory&lt;/code&gt;、&lt;code&gt;tools&lt;/code&gt;）与开源 Agent 框架 OpenClaw 高度同源。理解这一点，才能理解它的安全边界是从哪来的。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="二它到底能替用户做什么"&gt;二、它到底能替用户做什么&lt;/h2&gt;&#10;&lt;p&gt;先交代一个容易被忽略的前提：Muse 由 Meta &lt;strong&gt;自研模型 Muse Spark 1.3&lt;/strong&gt; 驱动（该版本 9 月 2 日发布，官方称其主打真实世界的 agentic 工作）。产品和模型共用「Muse」这一系列名，意味着 Meta 走的是&lt;strong&gt;自研模型 + 自研 Agent 的垂直整合&lt;/strong&gt;路线——这一点与后文要对照的 Manus 恰好相反。&lt;/p&gt;</description></item><item><title>Manus 2.0 拆解：Cascade、云电脑与 Cue——把 Agent 做成「卖电脑的生意」</title><link>https://caozuohua.github.io/posts/2026-10-01-manus-2-cascade-cue/</link><pubDate>Thu, 01 Oct 2026 08:00:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-10-01-manus-2-cascade-cue/</guid><description>&lt;h1 id="manus-20-拆解cascade云电脑与-cue把-agent-做成卖电脑的生意"&gt;Manus 2.0 拆解：Cascade、云电脑与 Cue——把 Agent 做成「卖电脑的生意」&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;2026 年 9 月 28 日，Manus 发布 2.0。此时距它 9 月 1 日正式恢复独立运营，只过了 27 天。&lt;/p&gt;&#10;&lt;p&gt;官方开篇第一句就把调子定死了：「&lt;strong&gt;Manus 2.0 不是一次版本更新。它是围绕一个根本问题构建的新架构、新产品和新能力：下一代 Manus 应该是什么样的？&lt;/strong&gt;」&lt;/p&gt;&#10;&lt;p&gt;这篇文章要回答的是：这个「全家桶」里，哪些是真变化，哪些只是把已有能力重排了一遍；以及为什么它和同月上线的 Meta Muse，走的几乎是相反的两条路。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="一30-秒结论"&gt;一、30 秒结论&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;最硬的一项&lt;/strong&gt;：自研 Agent 框架 &lt;strong&gt;Cascade&lt;/strong&gt;。官方数据是 token 消耗降 23.2%、任务耗时降 28.2%、运行成本降 32%——注意官方同时声明&lt;strong&gt;这是单项测试配置的结果，不是全场景平均&lt;/strong&gt;，这个自我限定比数字本身更值得注意。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;最实用的两项&lt;/strong&gt;：&lt;strong&gt;Cloud Computer&lt;/strong&gt;（可购买的云电脑，让项目在用户合上笔记本后继续跑）与 &lt;strong&gt;Automations&lt;/strong&gt;（把「定时任务」升级为「&lt;strong&gt;事件触发&lt;/strong&gt;」——一封邮件、一条 Slack 消息、一次 Notion 更新都能启动工作流）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;最有想象力的一项&lt;/strong&gt;：个人 Agent 产品 &lt;strong&gt;Cue&lt;/strong&gt;。每个 Agent 拥有&lt;strong&gt;独立的邮箱、电话号码、钱包和自己的电脑&lt;/strong&gt;，可以在预算内付款、代接电话并留摘要，还能把多个 Agent 拉进同一个群聊协作。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;最好记的一句定位&lt;/strong&gt;：创始人肖弘说「我一直觉得 Manus 挺像是一个&lt;strong&gt;卖电脑的生意&lt;/strong&gt;」——工作之外也得能看视频、打游戏。这句话解释了 2.0 为什么要把视频、游戏、远程控制全塞进来。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;和 Meta Muse 的分野&lt;/strong&gt;：Muse 追求「&lt;strong&gt;尽可能多的人&lt;/strong&gt;」，用 WhatsApp 触达二十亿用户；Manus 追求「&lt;strong&gt;尽可能深的活&lt;/strong&gt;」，把 Agent 做成一个可购买、可常驻、可协作的工作空间。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="二cascade这一版的重点是省"&gt;二、Cascade：这一版的重点，是「省」&lt;/h2&gt;&#10;&lt;p&gt;Agent 框架这个层面，用户的感知最弱，但它决定了产品的成本结构和上限。&lt;/p&gt;</description></item><item><title>DeepSeek 开源昇腾版 TileLang：一份写给非底层读者的阅读指南</title><link>https://caozuohua.github.io/posts/2026-09-30-deepseek-ascend-tilelang-reading-guide/</link><pubDate>Wed, 30 Sep 2026 22:00:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-30-deepseek-ascend-tilelang-reading-guide/</guid><description>&lt;h1 id="deepseek-开源昇腾版-tilelang一份写给非底层读者的阅读指南"&gt;DeepSeek 开源昇腾版 TileLang：一份写给非底层读者的阅读指南&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;2026 年 9 月 30 日，DeepSeek 官宣开源一批面向华为昇腾算力平台的基础设施组件：&lt;strong&gt;TileLang 高级语言编译器、计算库、分布式通信库&lt;/strong&gt;，共六个组件，与它此前面向英伟达平台开源的那一套「一一对应」。&lt;/p&gt;&#10;&lt;p&gt;这条新闻在国内被反复转述为「对标 CUDA」。这个说法&lt;strong&gt;方向对、程度夸&lt;/strong&gt;。本文想做的事只有一件：让没写过 CUDA、也没碰过昇腾的读者，读完之后能自己判断这类新闻里哪句是事实、哪句是厂商自评、哪句是媒体加的戏。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="一30-秒结论"&gt;一、30 秒结论&lt;/h2&gt;&#10;&lt;p&gt;先把答案给出来，后面全是展开。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;发生了什么&lt;/strong&gt;：DeepSeek 把自己训练和推理&lt;strong&gt;真正在用的那套底层软件&lt;/strong&gt;，从英伟达平台搬到了华为昇腾平台上，并且开源了。核心是编程语言层（TileLang），外围是六个可直接调用的库。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;为什么重要&lt;/strong&gt;：英伟达真正难被替代的不是芯片，是芯片外面那层软件。别人能做出一块算力接近的卡，但做不出「让四百万开发者不用重新学习就能把模型跑起来」的那层东西。这次是&lt;strong&gt;模型厂商第一次把自己吃饭的家伙下沉到国产芯片上&lt;/strong&gt;，性质比「适配一下模型」重得多。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;哪句要打折&lt;/strong&gt;：所有性能数字都是&lt;strong&gt;厂商自评&lt;/strong&gt;，没有第三方基准；跑出那些数字用的还是&lt;strong&gt;非公开的 PoC 固件&lt;/strong&gt;；官方&lt;strong&gt;没有说&lt;/strong&gt; V4 已经在昇腾上完成了全量训练。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;一句话定位&lt;/strong&gt;：这不是「国产 CUDA 建成了」，而是「国产芯片的软件生态，第一次有了一个由顶级模型团队亲手填上的、可用的关键零件」。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="二补三个概念写给不写底层代码的人"&gt;二、补三个概念：写给不写底层代码的人&lt;/h2&gt;&#10;&lt;p&gt;要读懂这条新闻，只需要三个概念。它们都有日常类比。&lt;/p&gt;&#10;&lt;h3 id="21-算子kernelai-芯片的招式"&gt;2.1 算子（kernel）：AI 芯片的「招式」&lt;/h3&gt;&#10;&lt;p&gt;大模型跑起来，本质上是无数次的矩阵乘法、加法、数据搬运。每完成一个不能再拆的基本运算单元，就叫一个&lt;strong&gt;算子&lt;/strong&gt;（英文 kernel，直译「内核」，但在中文语境里叫算子更准确）。&lt;/p&gt;&#10;&lt;p&gt;类比：如果 AI 芯片是一台厨房设备，&lt;strong&gt;算子就是一套固定的刀工&lt;/strong&gt;——切片、切丝、剁馅。市面上有现成的刀工（框架自带的算子），但顶级厨师遇到特殊食材时，必须自己设计一套新刀法。这套新刀法就是「自定义算子」。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;关键点：算子的效率决定了芯片效率。&lt;/strong&gt; 同一块芯片，算子写得好能跑到理论性能的 99%，写得差可能只有 30%。芯片参数的差距，经常被算子水平的差距盖过去。&lt;/p&gt;&#10;&lt;h3 id="22-编译器--dsl从人话到机器指令的翻译官"&gt;2.2 编译器 / DSL：从「人话」到「机器指令」的翻译官&lt;/h3&gt;&#10;&lt;p&gt;直接对着芯片写指令，等于让人用汇编语言写 App——不是不行，是太慢太痛苦。于是有了&lt;strong&gt;编译器&lt;/strong&gt;：你用一门更接近人话的语言描述「我要做什么」，它负责翻译成芯片能执行的指令，并顺手做优化。&lt;/p&gt;&#10;&lt;p&gt;这门「更接近人话的语言」如果只为某个领域服务，就叫 &lt;strong&gt;DSL&lt;/strong&gt;（领域专用语言）。TileLang 就是这类东西，而且是 Python 风格的——这一点很重要，因为后面所有性能优势都来自「写起来像 Python，跑起来像手写汇编」。&lt;/p&gt;&#10;&lt;h3 id="23-cuda英伟达真正的护城河"&gt;2.3 CUDA：英伟达真正的护城河&lt;/h3&gt;&#10;&lt;p&gt;CUDA 是英伟达的编程语言 + 整套工具链。它之所以是护城河，不是因为语言本身多优美，而是因为：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;十几年积累的库、调试器、性能分析器、文档；&lt;/li&gt;&#10;&lt;li&gt;几乎所有 AI 框架都优先支持它；&lt;/li&gt;&#10;&lt;li&gt;据《纽约时报》估计，全球约 &lt;strong&gt;400 万开发者&lt;/strong&gt; 已经会用它。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;换一块卡容易，换掉这 400 万人脑子里的东西很难。&lt;strong&gt;这就是为什么「国产芯片」的瓶颈常常不在算力，而在软件。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Agent 技能解剖（四）：Proactive Agent——主动性的代价与上下文存活</title><link>https://caozuohua.github.io/posts/2026-09-28-agent-skill-anatomy-04-proactive/</link><pubDate>Mon, 28 Sep 2026 21:30:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-28-agent-skill-anatomy-04-proactive/</guid><description>&lt;h1 id="agent-技能解剖四proactive-agent主动性的代价与上下文存活"&gt;Agent 技能解剖（四）：Proactive Agent——主动性的代价与上下文存活&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;前三篇都在处理「记忆」：怎么存、怎么约束、怎么改进。&#10;这一篇换一个层面——&lt;strong&gt;记忆的载体本身会消失。&lt;/strong&gt; 上下文压缩一发生，没落盘的一切就没了。而在这个前提下，讨论「主动」才有意义。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="这篇的位置"&gt;这篇的位置&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;Proactive Agent&lt;/code&gt; 是本系列里定位最特殊的一个：它不提供存储，而是提供&lt;strong&gt;一整套协作行为规范&lt;/strong&gt;。它的自我描述是「把 AI Agent 从任务执行者变成主动伙伴」，实际内容可以归到两个问题：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;怎么让主动行为不打扰人？&lt;/strong&gt;（主动性必须有上限，否则就是骚扰）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;怎么让 Agent 活过上下文压缩？&lt;/strong&gt;（这是主动性的前提——一个连昨天做过什么都想不起来的 Agent，无法主动）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;第二个问题是硬约束，第一个问题是软约束。技能的绝大部分篇幅给了第二个。&lt;/p&gt;&#10;&lt;h2 id="技能档案"&gt;技能档案&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;项&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;值&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;技能名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Proactive Agent&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;slug&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;proactive-agent&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作者&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;halthelobster&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;版本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3.1.0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下载量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;273,764&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;安装量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;28,937&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;星标&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;913&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;来源&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ClawHub&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;组成&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SKILL.md（v3，含 v2.3 备份与 v3 草案）+ 7 个工作区模板 + 2 份参考 + 1 个安全审计脚本&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;数据抓取于 2026-09-28。作者署名是一个 AI Agent 本身（Hal 9001），技能里没有理论引用，全部是「这样试过、那样会坏」的经验条目——&lt;strong&gt;这决定了它的读法：当成事故报告合集来读，比当成架构文档读收获大。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="上下文存活的三个协议"&gt;上下文存活的三个协议&lt;/h2&gt;&#10;&lt;p&gt;这是全篇最硬的部分，按触发时机串起来看：&lt;/p&gt;&#10;&lt;div class="mermaid"&gt;&#10;flowchart TD&#10; M[&amp;#34;每收到一条消息&amp;#34;] --&amp;gt; S{&amp;#34;扫描 6 类信号&amp;lt;br/&amp;gt;纠错 / 专有名词 / 偏好&amp;lt;br/&amp;gt;决策 / 草稿变更 / 具体数值&amp;#34;}&#10;&#10; S -- &amp;#34;命中任一&amp;#34; --&amp;gt; WAL[&amp;#34;WAL：先写 SESSION-STATE.md&amp;lt;br/&amp;gt;再回复&amp;#34;]&#10; S -- &amp;#34;未命中&amp;#34; --&amp;gt; N[&amp;#34;正常回复&amp;#34;]&#10;&#10; N --&amp;gt; C{&amp;#34;上下文用量&amp;#34;}&#10; M --&amp;gt; C&#10; C -- &amp;#34;＜60%&amp;#34; --&amp;gt; NB[&amp;#34;正常处理&amp;#34;]&#10; C -- &amp;#34;≥60%&amp;#34; --&amp;gt; BUF[&amp;#34;Working Buffer 激活&amp;lt;br/&amp;gt;之后每条消息双向落盘&amp;lt;br/&amp;gt;（人说的话 + 自己回复的摘要）&amp;#34;]&#10;&#10; BUF --&amp;gt; CK{&amp;#34;发生压缩？&amp;#34;}&#10; CK -- &amp;#34;是&amp;#34; --&amp;gt; REC[&amp;#34;Compaction Recovery&amp;lt;br/&amp;gt;1 读 buffer → 2 读 SESSION-STATE&amp;lt;br/&amp;gt;→ 3 读今昨日记 → 4 不行再全量搜&amp;#34;]&#10; REC --&amp;gt; OUT[&amp;#34;『从缓冲区恢复完成，上一件事是 X，继续？』&amp;lt;br/&amp;gt;禁止问『我们刚才在聊什么』&amp;#34;]&#10;&lt;/div&gt;&#10;&lt;script type="module"&gt;&#10; import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';&#10; mermaid.initialize({&#10; startOnLoad: true,&#10; theme: 'neutral',&#10; securityLevel: 'strict',&#10; flowchart: { curve: 'basis' }&#10; });&#10;&lt;/script&gt;&#10;&lt;h3 id="协议一walwrite-ahead-log"&gt;协议一：WAL（Write-Ahead Log）&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;触发条件是用户的输入，不是模型的自省。&lt;/strong&gt; 这是整个设计里最关键的一处选择。技能列出了需要扫描的六类信号：&lt;/p&gt;</description></item><item><title>Agent 技能解剖（三）：Self-Improving Agent——从纠错日志到规则晋升</title><link>https://caozuohua.github.io/posts/2026-09-28-agent-skill-anatomy-03-self-improving/</link><pubDate>Mon, 28 Sep 2026 21:20:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-28-agent-skill-anatomy-03-self-improving/</guid><description>&lt;h1 id="agent-技能解剖三self-improving-agent从纠错日志到规则晋升"&gt;Agent 技能解剖（三）：Self-Improving Agent——从纠错日志到规则晋升&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;前两篇解决的是一致性问题：怎么把记忆存成数据、怎么用 schema 约束它。&#10;但记忆本身不改变行为。&lt;strong&gt;你知道一件事，不等于你会因此改变做法。&lt;/strong&gt;&#10;这一篇讲的是把「知道」变成「改掉」的机制。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="一个被普遍误读的词"&gt;一个被普遍误读的词&lt;/h2&gt;&#10;&lt;p&gt;「自我改进的 Agent」这个说法容易让人想到权重更新、在线微调、参数层面的学习。而本系列讨论的这类技能，做的完全是另一件事：&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;它把「学习」实现为一个文档编辑流程。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;模型的行为由 prompt 决定，那么「改变行为」的最短路径就不是训练，而是&lt;strong&gt;改 prompt&lt;/strong&gt;。于是「自我改进」被拆解成一条可执行的流水线：把纠正与错误写成结构化日志 → 反复出现的模式被识别出来 → 蒸馏成一句规则 → 写进项目的常驻 prompt 文件。&lt;/p&gt;&#10;&lt;p&gt;这个技能就是这个流水线的一份完整、且经过版本迭代的实现。它是当前&lt;strong&gt;装机量最高的技能（86,140）&lt;/strong&gt;，不是偶然——它解决的是所有 Agent 用户都有的痛感。&lt;/p&gt;&#10;&lt;h2 id="技能档案"&gt;技能档案&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;项&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;值&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;技能名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;self-improvement（包名 &lt;code&gt;self-improving-agent&lt;/code&gt;）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;slug&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;self-improving-agent&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作者&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;pskoett&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;版本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3.0.24&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下载量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1,268,197&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;安装量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;86,140&lt;/strong&gt;（SkillHub 全站第 1）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;星标&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4,517&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;来源&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ClawHub&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;组成&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;三份日志模板 + 两个 hook 脚本 + 一个 OpenClaw hook + 技能提取脚本&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;数据抓取于 2026-09-28。版本号走到 3.0.24 说明它经历了长期实际使用与修正。&lt;/p&gt;&#10;&lt;h2 id="四层记忆阶梯"&gt;四层记忆阶梯&lt;/h2&gt;&#10;&lt;p&gt;先看它把知识放在了哪几层。这是理解全技能的钥匙：&lt;/p&gt;&#10;&lt;div class="mermaid"&gt;&#10;flowchart TD&#10; L0[&amp;#34;L0 会话上下文&amp;lt;br/&amp;gt;易失，压缩即丢&amp;#34;] --&amp;gt;|&amp;#34;发现问题立刻写&amp;#34;| L1&#10;&#10; L1[&amp;#34;L1 .learnings/*.md&amp;lt;br/&amp;gt;原始观测，append-only&amp;lt;br/&amp;gt;LEARNINGS / ERRORS / FEATURE_REQUESTS&amp;#34;]&#10; L1 --&amp;gt;|&amp;#34;复现≥3 次 · 跨≥2 任务 · 30 天内&amp;#34;| L2&#10;&#10; L2[&amp;#34;L2 项目常驻 prompt&amp;lt;br/&amp;gt;CLAUDE.md / AGENTS.md&amp;lt;br/&amp;gt;.github/copilot-instructions.md&amp;#34;]&#10; L2 --&amp;gt;|&amp;#34;满足可复用性门槛&amp;#34;| L3&#10;&#10; L3[&amp;#34;L3 SKILL.md&amp;lt;br/&amp;gt;跨项目可复用技能&amp;#34;]&#10;&#10; L2 -.行为类.-&amp;gt; L4[&amp;#34;L4 SOUL.md / TOOLS.md&amp;lt;br/&amp;gt;身份、边界、工具坑&amp;#34;]&#10;&lt;/div&gt;&#10;&lt;script type="module"&gt;&#10; import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';&#10; mermaid.initialize({&#10; startOnLoad: true,&#10; theme: 'neutral',&#10; securityLevel: 'strict',&#10; flowchart: { curve: 'basis' }&#10; });&#10;&lt;/script&gt;&#10;&lt;p&gt;四层的分工非常明确，且&lt;strong&gt;晋升是单向的&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>Agent 技能解剖（二）：Ontology——用 schema 管住模型的不确定性</title><link>https://caozuohua.github.io/posts/2026-09-28-agent-skill-anatomy-02-ontology/</link><pubDate>Mon, 28 Sep 2026 21:10:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-28-agent-skill-anatomy-02-ontology/</guid><description>&lt;h1 id="agent-技能解剖二ontology用-schema-管住模型的不确定性"&gt;Agent 技能解剖（二）：Ontology——用 schema 管住模型的不确定性&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;上一篇讲 Agent Memory，结论是「把记忆做成数据层」。但数据层有一个自带的问题：&lt;strong&gt;数据一旦自由生长，就查不动、也信不过。&lt;/strong&gt;&#10;这一篇讲那个问题的解法：给记忆加一层类型系统与约束校验。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="问题的真正形态"&gt;问题的真正形态&lt;/h2&gt;&#10;&lt;p&gt;用自然语言存储记忆，会遇到三类麻烦，而且它们都不会立刻暴露：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;形态漂移&lt;/strong&gt;。「项目」「Project」「project」是同一个东西；「进行中」「in progress」「active」也是同一个状态。写入时没人觉得有问题，三个月后查询时全都查不全。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;关系丢失&lt;/strong&gt;。「张三负责官网改版」这句话，在纯文本记忆里就是一句话。你没法问「张三还负责什么」，只能全文搜「张三」，然后自己读。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;无校验&lt;/strong&gt;。模型写下「会议结束时间早于开始时间」，存储层照单全收，没有任何环节会拒绝它。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;code&gt;Ontology&lt;/code&gt; 这个技能给出的答案是教科书式的：&lt;strong&gt;因为语言是不确定的，那就不要再让语言承担一致性保证——把它压缩成「实体 + 类型 + 属性 + 关系」，然后用 schema 去校验。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="技能档案"&gt;技能档案&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;项&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;值&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;技能名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ontology&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;slug&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;ontology&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作者&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;oswalpalash&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;版本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.4&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下载量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;286,820&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;安装量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;29,080&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;星标&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;787&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;来源&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ClawHub&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;存储介质&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;memory/ontology/graph.jsonl&lt;/code&gt;（追加式）+ &lt;code&gt;memory/ontology/schema.yaml&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;入口&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;scripts/ontology.py&lt;/code&gt;（create / get / query / list / update / delete / relate / related / validate / schema-append）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;数据抓取于 2026-09-28，口径为 SkillHub 聚合榜。&lt;/p&gt;</description></item><item><title>Agent 技能解剖（一）：Agent Memory——把「记住」做成数据层</title><link>https://caozuohua.github.io/posts/2026-09-28-agent-skill-anatomy-01-memory/</link><pubDate>Mon, 28 Sep 2026 21:00:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-28-agent-skill-anatomy-01-memory/</guid><description>&lt;h1 id="agent-技能解剖一agent-memory把记住做成数据层"&gt;Agent 技能解剖（一）：Agent Memory——把「记住」做成数据层&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;本系列共四篇，逐篇拆解四个当前装机量最高的 Agent 技能，全部基于&lt;strong&gt;下载技能包后的源码级阅读&lt;/strong&gt;，不是对 README 的转述。&#10;解读视角固定为 prompt 工程：它把哪一部分不确定性交给了模型，又把哪一部分交给了代码。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="为什么先拆这一个"&gt;为什么先拆这一个&lt;/h2&gt;&#10;&lt;p&gt;关于「让 Agent 记住」，业内长期存在两种做法：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;塞进上下文&lt;/strong&gt;——把历史对话、文件、笔记尽可能多地带进 prompt；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;外置成存储&lt;/strong&gt;——把记忆写成结构化数据，需要时检索回来。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;第一种做法的问题不是「不够长」，而是&lt;strong&gt;成本与轮次线性相关&lt;/strong&gt;：每一轮都要为全部历史重新付费，且上下文越长，模型对中段的注意力越差。第二种做法把问题从「prompt 长度」转换成了「数据工程」，代价是要自己定义 schema、自己做检索、自己处理过期与冲突。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;Agent Memory&lt;/code&gt; 是第二种路线上装机量最高的技能之一。它值得拆的地方在于：&lt;strong&gt;代码只有 680 行，却把一个记忆系统该有的骨架全都摆出来了&lt;/strong&gt;——三种记忆类型、覆盖率、冲突覆盖、遗忘机制。骨架清晰，正好适合当教学样本；同时它的几处实现与宣称不一致，也正好适合当反面教材。&lt;/p&gt;&#10;&lt;h2 id="技能档案"&gt;技能档案&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;项&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;值&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;技能名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Agent Memory&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;slug&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;agent-memory&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;作者&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;dennis-da-menace&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;版本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1.0.0&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;下载量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;145,610&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;安装量&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;25,555&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;星标&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;172&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;来源&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ClawHub&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;代码规模&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;src/memory.py&lt;/code&gt; 688 行 + 3 个 CLI + 1 个测试文件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;外部依赖&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;无&lt;/strong&gt;（&lt;code&gt;requirements.txt&lt;/code&gt; 仅一行「No external dependencies - just Python stdlib」）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;数据抓取于 2026-09-28，口径为 SkillHub 聚合榜。&lt;/p&gt;</description></item><item><title>Dify 深度玩法（五）：Agent、MCP 与一个完整实战</title><link>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-05-agent-mcp-practice/</link><pubDate>Sat, 26 Sep 2026 20:40:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-05-agent-mcp-practice/</guid><description>&lt;h1 id="dify-深度玩法五agentmcp-与一个完整实战"&gt;Dify 深度玩法（五）：Agent、MCP 与一个完整实战&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;上一篇：&lt;a href="https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-04-rag/"&gt;RAG 深度玩法&lt;/a&gt;。&#10;本篇是收官：先讲清 Agent 与 Workflow 的分工原则，再讲 MCP 的实际价值，最后把整个系列串成一个跑得通的真实项目——博客勘误官。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="agent-与-workflow谁管什么"&gt;Agent 与 Workflow：谁管什么&lt;/h2&gt;&#10;&lt;p&gt;新版 Dify 的 Agent 带来了 Linux 沙箱与技能（Skills）体系：Agent 可以在隔离环境里执行命令、管理文件、按需安装依赖。能力变强之后，最重要的设计原则反而是&lt;strong&gt;克制&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Agent 管判断&lt;/strong&gt;：任务路径开放的环节——自己决定查什么、跑哪个脚本、怎么补证据；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Workflow 管编排&lt;/strong&gt;：触发、顺序、分支、审批门、重试、归档——所有需要确定性的环节。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="mermaid"&gt;&#10;flowchart TD&#10; T[&amp;#34;定时 / 表单触发&amp;#34;] --&amp;gt; W[&amp;#34;Workflow 编排层&amp;lt;br/&amp;gt;触发·顺序·审批门·重试·归档&amp;#34;]&#10; W --&amp;gt; A{&amp;#34;需要开放判断？&amp;#34;}&#10; A -- &amp;#34;否：路径确定&amp;#34; --&amp;gt; N[&amp;#34;普通节点链&amp;lt;br/&amp;gt;LLM·Code·HTTP·知识检索&amp;#34;]&#10; A -- &amp;#34;是：现场决定做什么&amp;#34; --&amp;gt; AG[&amp;#34;Agent 节点&amp;lt;br/&amp;gt;沙箱内自主执行&amp;#34;]&#10; N --&amp;gt; O[&amp;#34;出口：API / Web App / MCP / 推送&amp;#34;]&#10; AG --&amp;gt; O&#10;&lt;/div&gt;&#10;&lt;script type="module"&gt;&#10; import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';&#10; mermaid.initialize({&#10; startOnLoad: true,&#10; theme: 'neutral',&#10; securityLevel: 'strict',&#10; flowchart: { curve: 'basis' }&#10; });&#10;&lt;/script&gt;&#10;&lt;p&gt;反例是&amp;quot;一个 Agent 干全部&amp;quot;：触发它自己定、写操作它自己批、失败它自己咽——这类流程出问题时你连现场都还原不了。&lt;strong&gt;自主性是成本，不是默认值。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Dify 深度玩法（四）：RAG 做到什么程度才算到位</title><link>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-04-rag/</link><pubDate>Sat, 26 Sep 2026 20:30:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-04-rag/</guid><description>&lt;h1 id="dify-深度玩法四rag-做到什么程度才算到位"&gt;Dify 深度玩法（四）：RAG 做到什么程度才算到位&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;上一篇：&lt;a href="https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-03-node-customization/"&gt;节点自定义的五个层级&lt;/a&gt;。&#10;自托管 Dify 的 RAG 不是&amp;quot;上传文档然后问答&amp;quot;，而是一条每一段都能调参的流水线，且没有云版的容量阉割。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="全链路入库与查询"&gt;全链路：入库与查询&lt;/h2&gt;&#10;&lt;div class="mermaid"&gt;&#10;flowchart LR&#10; subgraph IN [&amp;#34;入库侧（一次性）&amp;#34;]&#10; A[&amp;#34;多源接入&amp;lt;br/&amp;gt;文档·网页·Notion·API&amp;#34;] --&amp;gt; B[&amp;#34;分块&amp;lt;br/&amp;gt;通用·父子·问答对&amp;#34;]&#10; B --&amp;gt; C[&amp;#34;双路索引&amp;lt;br/&amp;gt;向量 + 关键词&amp;#34;]&#10; end&#10; subgraph Q [&amp;#34;查询侧（每次请求）&amp;#34;]&#10; D[&amp;#34;查询预处理&amp;lt;br/&amp;gt;改写·分类路由&amp;#34;] --&amp;gt; E[&amp;#34;混合检索&amp;lt;br/&amp;gt;向量+全文+元数据过滤&amp;#34;]&#10; E --&amp;gt; F[&amp;#34;重排&amp;lt;br/&amp;gt;rerank 精排&amp;#34;]&#10; F --&amp;gt; G[&amp;#34;带引用生成&amp;lt;br/&amp;gt;可拒答·可溯源&amp;#34;]&#10; end&#10; C -.-&amp;gt;|&amp;#34;查询时检索&amp;#34;| E&#10;&lt;/div&gt;&#10;&lt;script type="module"&gt;&#10; import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';&#10; mermaid.initialize({&#10; startOnLoad: true,&#10; theme: 'neutral',&#10; securityLevel: 'strict',&#10; flowchart: { curve: 'basis' }&#10; });&#10;&lt;/script&gt;&#10;&lt;p&gt;平台能力是现成的。&lt;strong&gt;效果差异来自三个你自己做的决定：分块策略、检索模式、元数据设计。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="效果的四层阶梯"&gt;效果的四层阶梯&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;层次&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;做出来的效果&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;依赖能力&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;1. 基础问答&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;回答带引用来源，知识库里没有就明确说不知道&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;混合检索 + 重排 + 阈值&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;2. 精准知识库&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;长文档问答不丢上下文；检索自动限定在某类文档&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;父子分段 + 元数据过滤&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3. 可编程检索流水线&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查询改写、分类路由、多库检索、生成前校验全部画进画布&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RAG 流水线 / Chatflow&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;4. 外挂检索引擎&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Dify 只当编排层，检索打到你自己写的 API（ES、数据库、自建向量服务）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;外部知识库 API&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;第 2、4 层是自托管的意义所在：云版免费额度装不下，而外部知识库接口意味着可以整体绕开内置向量库。&lt;/p&gt;</description></item><item><title>Dify 深度玩法（三）：节点自定义的五个层级</title><link>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-03-node-customization/</link><pubDate>Sat, 26 Sep 2026 20:20:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-03-node-customization/</guid><description>&lt;h1 id="dify-深度玩法三节点自定义的五个层级"&gt;Dify 深度玩法（三）：节点自定义的五个层级&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;上一篇：&lt;a href="https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-02-deploy-and-keys/"&gt;部署选型与模型 Key&lt;/a&gt;。&#10;进了画布，第一个问题是&amp;quot;这东西到底能改多深&amp;quot;。答案是分层看：&lt;strong&gt;参数、逻辑、数据流三层几乎不设限；节点类型可靠插件扩展；硬边界只有两处。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="五个层级总览"&gt;五个层级总览&lt;/h2&gt;&#10;&lt;div class="mermaid"&gt;&#10;flowchart TD&#10; L1[&amp;#34;L1 参数级&amp;lt;br/&amp;gt;每个节点的配置项&amp;#34;] --&amp;gt; L2[&amp;#34;L2 逻辑级&amp;lt;br/&amp;gt;Code 与 HTTP 逃生门&amp;#34;]&#10; L2 --&amp;gt; L3[&amp;#34;L3 数据流级&amp;lt;br/&amp;gt;变量系统 + 容错策略&amp;#34;]&#10; L3 --&amp;gt; L4[&amp;#34;L4 节点类型级&amp;lt;br/&amp;gt;插件定义新节点&amp;#34;]&#10; L4 --&amp;gt; L5[&amp;#34;L5 协议级&amp;lt;br/&amp;gt;DSL 手改 + 外部知识库 API&amp;#34;]&#10; L1 -.- N1[&amp;#34;自由度：低，但覆盖日常&amp;#34;]&#10; L2 -.- N2[&amp;#34;自由度：高，万能逃生门&amp;#34;]&#10; L4 -.- N4[&amp;#34;自由度：最高，成本也最高&amp;#34;]&#10;&lt;/div&gt;&#10;&lt;script type="module"&gt;&#10; import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';&#10; mermaid.initialize({&#10; startOnLoad: true,&#10; theme: 'neutral',&#10; securityLevel: 'strict',&#10; flowchart: { curve: 'basis' }&#10; });&#10;&lt;/script&gt;&#10;&lt;h2 id="l1-参数级每个节点都有一层配置"&gt;L1 参数级：每个节点都有一层配置&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;LLM 节点&lt;/strong&gt;：每个节点独立选模型、独立调参数（温度、最大输出等），提示词模板可引用任意上游变量，支持结构化输出、视觉输入、会话记忆。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;知识检索节点&lt;/strong&gt;：可挂多个知识库，检索模式、返回条数、相似度阈值、重排模型逐项可配。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;问题分类器 / 参数提取器&lt;/strong&gt;：分类类别和抽取字段完全由你定义，抽取方式可选函数调用或提示词驱动。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;这一层覆盖了八成日常需求，特点是&amp;quot;改配置不改逻辑&amp;quot;。&lt;/p&gt;&#10;&lt;h2 id="l2-逻辑级两个万能逃生门"&gt;L2 逻辑级：两个万能逃生门&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Code 节点&lt;/strong&gt;（Python 3.10+ 或 Node.js 18+）负责任意数据变换。一个真实可用的例子——对抓取结果做归一化去重：&lt;/p&gt;</description></item><item><title>Dify 深度玩法（二）：云版还是自托管？部署决策与模型 Key 清单</title><link>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-02-deploy-and-keys/</link><pubDate>Sat, 26 Sep 2026 20:10:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-02-deploy-and-keys/</guid><description>&lt;h1 id="dify-深度玩法二云版还是自托管部署决策与模型-key-清单"&gt;Dify 深度玩法（二）：云版还是自托管？部署决策与模型 Key 清单&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;上一篇：&lt;a href="https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-01-positioning/"&gt;Dify 适合做什么&lt;/a&gt;。&#10;本篇回答第二个实际决策：在哪跑、接什么模型。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="先澄清一个常见误解"&gt;先澄清一个常见误解&lt;/h2&gt;&#10;&lt;p&gt;很多人以为云版免费额度限制的是&amp;quot;调用量&amp;quot;。真实情况是：&lt;strong&gt;自带 API Key 的调用不消耗 Dify 的 message credits&lt;/strong&gt;（credits 只在使用 Dify 内置供应商时消耗）。云版免费版（Sandbox）真正的瓶颈是：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;维度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;云版 Sandbox（免费）&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;自托管 Community&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;应用数&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;5 个&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;不限&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;知识库&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;50 篇文档 / 50 MB&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;取决于你的磁盘&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;本地模型（llama.cpp / Ollama）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;访问不到你的 localhost&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;容器内直连&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;费用&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0（够用要升级到约 59 美元/月）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;0（电费与磁盘）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;维护&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;无&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;升级需读 release note、改环境配置后重启&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;结论很直接：&lt;strong&gt;多项目 + RAG 的组合，云版免费版装不下&lt;/strong&gt;。应用数和知识库容量这两个上限，恰好卡在个人开发者的典型需求上。&lt;/p&gt;&#10;&lt;h2 id="三阶段部署路径"&gt;三阶段部署路径&lt;/h2&gt;&#10;&lt;p&gt;不建议二选一，建议分三步走：&lt;/p&gt;&#10;&lt;div class="mermaid"&gt;&#10;flowchart TD&#10; A[&amp;#34;第 1 步：云版免费账号&amp;lt;br/&amp;gt;用 0 到 2 天&amp;#34;] --&amp;gt; B[&amp;#34;第 2 步：本机 Docker 自托管&amp;lt;br/&amp;gt;正式开发&amp;#34;]&#10; B --&amp;gt; C[&amp;#34;第 3 步：迁移到 VPS&amp;lt;br/&amp;gt;需要对外服务时&amp;#34;]&#10; A -.- A1[&amp;#34;目的：熟悉节点与画布&amp;lt;br/&amp;gt;不绑自己的 Key，不建知识库&amp;#34;]&#10; B -.- B1[&amp;#34;目的：无配额限制&amp;lt;br/&amp;gt;直连本机 llama.cpp 或 Ollama&amp;#34;]&#10; C -.- C1[&amp;#34;目的：Web App 与 API 常在线&amp;lt;br/&amp;gt;本地模型改走云端 API&amp;#34;]&#10;&lt;/div&gt;&#10;&lt;script type="module"&gt;&#10; import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';&#10; mermaid.initialize({&#10; startOnLoad: true,&#10; theme: 'neutral',&#10; securityLevel: 'strict',&#10; flowchart: { curve: 'basis' }&#10; });&#10;&lt;/script&gt;&#10;&lt;p&gt;第 1 步不要投入任何东西——云版只用来确认&amp;quot;画布的工作方式你是否接受&amp;quot;。第 2 步才是正式开发环境。第 3 步等真的要给别人用时再做，因为自托管应用可以导出 DSL 迁移，前期投入不会浪费。&lt;/p&gt;</description></item><item><title>Dify 深度玩法（一）：它适合做什么，不适合做什么</title><link>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-01-positioning/</link><pubDate>Sat, 26 Sep 2026 20:00:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-26-dify-deep-dive-01-positioning/</guid><description>&lt;h1 id="dify-深度玩法一它适合做什么不适合做什么"&gt;Dify 深度玩法（一）：它适合做什么，不适合做什么&lt;/h1&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;本系列共五篇，基于 2026 年的 Dify（含新版 Agent 与 MCP 能力）整理自实际调研与项目设计。&#10;这一篇先回答最容易被跳过的问题：&lt;strong&gt;什么项目该用 Dify，什么项目用了反而更慢。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="一句话定位"&gt;一句话定位&lt;/h2&gt;&#10;&lt;p&gt;Dify 是一个 LLMOps 平台：把「可视化编排 + 知识库 RAG + Agent + 一键发布（Web App / API / 嵌入组件）」装进同一个画布。它与 LangChain 这类代码框架的本质区别是——&lt;strong&gt;Dify 是产品，LangChain 是框架&lt;/strong&gt;。框架给你最大自由，产品给你最快速度，代价是边界由平台划定。&lt;/p&gt;&#10;&lt;h2 id="三条判断标准"&gt;三条判断标准&lt;/h2&gt;&#10;&lt;p&gt;一个项目&amp;quot;适合 Dify&amp;quot;，通常同时满足三条：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;逻辑主体是 IO + 数据整形 + LLM 判断&lt;/strong&gt;。抓数据、清洗、让模型打分或判定、输出文本——这条链路是 Dify 节点的母语。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;需要快速拿到可调用的出口&lt;/strong&gt;。你需要在几小时内拥有一个能点开的 Web App、一个 REST API、一个可嵌入的聊天组件，而不是先写两周前后端。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;改提示词的频率远高于改代码的频率&lt;/strong&gt;。Dify 上改一个 LLM 节点的 prompt 是秒级的，不需要重新发版。如果你的项目半年才改一次提示词，这个优势归零。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;反过来，满足不了这三条的，用 Dify 通常更慢。下面这张决策图可以直接对着用：&lt;/p&gt;&#10;&lt;div class="mermaid"&gt;&#10;flowchart TD&#10; A[&amp;#34;接到一个 LLM 项目需求&amp;#34;] --&amp;gt; B{&amp;#34;逻辑主体是&amp;lt;br/&amp;gt;IO + 数据整形 + LLM 判断？&amp;#34;}&#10; B -- &amp;#34;不是：重计算/事务/低延迟&amp;#34; --&amp;gt; C[&amp;#34;直接写代码&amp;lt;br/&amp;gt;不要用 Dify&amp;#34;]&#10; B -- &amp;#34;是&amp;#34; --&amp;gt; D{&amp;#34;需要 3 天内拿到&amp;lt;br/&amp;gt;可给别人用的界面或 API？&amp;#34;}&#10; D -- &amp;#34;不需要，纯后台数据管道&amp;#34; --&amp;gt; E[&amp;#34;脚本也可以胜任&amp;lt;br/&amp;gt;Dify 是可选项&amp;#34;]&#10; D -- &amp;#34;需要&amp;#34; --&amp;gt; F{&amp;#34;会频繁调提示词&amp;lt;br/&amp;gt;和检索策略吗？&amp;#34;}&#10; F -- &amp;#34;不会&amp;#34; --&amp;gt; G[&amp;#34;写代码 + 配置文件&amp;lt;br/&amp;gt;更可控&amp;#34;]&#10; F -- &amp;#34;会&amp;#34; --&amp;gt; H[&amp;#34;用 Dify&amp;lt;br/&amp;gt;原型到生产都在画布上迭代&amp;#34;]&#10;&lt;/div&gt;&#10;&lt;script type="module"&gt;&#10; import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';&#10; mermaid.initialize({&#10; startOnLoad: true,&#10; theme: 'neutral',&#10; securityLevel: 'strict',&#10; flowchart: { curve: 'basis' }&#10; });&#10;&lt;/script&gt;&#10;&lt;h2 id="场景对照表"&gt;场景对照表&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;场景&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;用 Dify&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;原因&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;多源抓取 → 清洗 → LLM 打分 → 输出日报&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;典型的 IO + LLM 链路，改数据源不动代码&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文档知识库问答（RAG）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;分块、检索、重排、引用都是现成节点&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;一次性深度调研报告生成&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;多 Agent 分工 + 引用校验节点&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;需要快速给客户演示的垂直领域助手&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Web App 与 API 一键发布&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高频低延迟 API（P95 要求数百毫秒内）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每个节点都有额外开销与队列&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;视频渲染、大规模数值计算&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;沙箱 30 秒超时 + 内存上限，干不了重活&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;复杂有状态业务流程（事务、回滚、幂等）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;声明式分支表达不了状态机&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;逻辑需要严格 code review 与版本控制&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;⚠️&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;工作流导出为 YAML，diff 可读性差&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="关于拖拉拽的真实配比"&gt;关于&amp;quot;拖拉拽&amp;quot;的真实配比&lt;/h2&gt;&#10;&lt;p&gt;一个常见误解是&amp;quot;用 Dify = 纯拖拽&amp;quot;。实际项目里有效的配比是&lt;strong&gt;约八成拖拽、两成 Code 节点&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>Agent 开发实践：基于 simple-agent 的循环构建与工具调用</title><link>https://caozuohua.github.io/posts/2026-09-17-simple-agent-loop/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://caozuohua.github.io/posts/2026-09-17-simple-agent-loop/</guid><description>&lt;p&gt;在 AI Agent 的开发中，一个健壮的 Loop 循环（Agent Loop）是其处理复杂任务的核心。&lt;code&gt;simple-agent&lt;/code&gt; 作为一款轻量级框架，通过其简洁的接口将 LLM、工具（Tools）和状态（Context）有机结合。&lt;/p&gt;&#10;&lt;p&gt;本文将调研 &lt;code&gt;simple-agent&lt;/code&gt; 的核心接口，构建一套完备的 Agent Loop 示例，并解析其背后的设计逻辑。&lt;/p&gt;&#10;&lt;h2 id="核心接口分析"&gt;核心接口分析&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;simple-agent&lt;/code&gt; 的设计哲学是“去重型化”，其核心接口围绕着 &lt;code&gt;Agent&lt;/code&gt; 类展开：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;Agent()&lt;/code&gt; 初始化&lt;/strong&gt;：支持自定义 LLM 配置（通过 LiteLLM 支持 100+ 模型）、System Prompt 以及工具目录。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;run(task)&lt;/code&gt;&lt;/strong&gt;：单轮任务执行，适合一次性的问答或任务。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;chat(message)&lt;/code&gt;&lt;/strong&gt;：多轮会话管理，自动维护 Context 状态，这是实现“Agent 记忆”的关键。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Skills System&lt;/strong&gt;：支持 Tier 1（元数据）到 Tier 2（指令）的渐进式加载，有效减少 token 消耗。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="完备的-agent-loop-示例"&gt;完备的 Agent Loop 示例&lt;/h2&gt;&#10;&lt;p&gt;以下代码展示了一个具备工具调用与上下文感知的 Agent 运行逻辑：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; simple_agent &lt;span style="color:#f92672"&gt;import&lt;/span&gt; SimpleAgent&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. 初始化：设置模型与行为约束&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;agent &lt;span style="color:#f92672"&gt;=&lt;/span&gt; SimpleAgent(&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; model&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;openrouter/anthropic/claude-3.5-sonnet&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; system_prompt&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;你是一个能够执行网络诊断的专业 AI 助理。&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; enable_skills&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. 模拟真实 Agent Loop&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;run_agent_loop&lt;/span&gt;(task: str):&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;--- 任务开始: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;task&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; ---&amp;#34;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 获取初始结果&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response &lt;span style="color:#f92672"&gt;=&lt;/span&gt; agent&lt;span style="color:#f92672"&gt;.&lt;/span&gt;run(task)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 3. 循环判断与迭代（模拟生产逻辑）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; iterations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; response[&lt;span style="color:#e6db74"&gt;&amp;#39;success&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;and&lt;/span&gt; iterations &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;迭代 &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;iterations&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;: 尝试自我修正...&amp;#34;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; response &lt;span style="color:#f92672"&gt;=&lt;/span&gt; agent&lt;span style="color:#f92672"&gt;.&lt;/span&gt;chat(&lt;span style="color:#e6db74"&gt;&amp;#34;请根据之前的错误重新规划你的工具调用。&amp;#34;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; iterations &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; response[&lt;span style="color:#e6db74"&gt;&amp;#39;result&amp;#39;&lt;/span&gt;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 执行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; run_agent_loop(&lt;span style="color:#e6db74"&gt;&amp;#34;检查 google.com 的连接性，并根据结果提供建议&amp;#34;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(&lt;span style="color:#e6db74"&gt;f&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;最终结果: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;result&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="关键技术解读"&gt;关键技术解读&lt;/h2&gt;&#10;&lt;h3 id="1-状态维持与内存"&gt;1. 状态维持与“内存”&lt;/h3&gt;&#10;&lt;p&gt;LLM 本身是无状态的，Agent 的“记忆”完全依赖于 &lt;code&gt;SimpleAgent&lt;/code&gt; 类内部的对话历史管理。在 &lt;code&gt;chat()&lt;/code&gt; 接口调用时，框架会自动把最新的交互追加到历史列表中，并重新作为整个上下文发送给 LLM。这种实现方式确保了 Agent 的一致性。&lt;/p&gt;</description></item><item><title>一份基座，N 套人格：LoRA 热插拔的原理、接口与真实成本</title><link>https://caozuohua.github.io/posts/2026-09-14-lora-hot-swap-explained/</link><pubDate>Mon, 14 Sep 2026 10:40:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-14-lora-hot-swap-explained/</guid><description>&lt;h1 id="一份基座n-套人格lora-热插拔的原理接口与真实成本"&gt;一份基座，N 套人格：LoRA 热插拔的原理、接口与真实成本&lt;/h1&gt;&#10;&lt;p&gt;如果你曾经为&amp;quot;想要三个不同风格/不同领域的模型&amp;quot;而准备下载三份模型文件，那这篇文章能帮你省下大量磁盘、显存和等待时间。&lt;/p&gt;&#10;&lt;p&gt;核心结论先给出：&lt;strong&gt;一份基座模型 + 若干个几十 MB 的 LoRA 适配器，可以在运行时自由切换甚至叠加，不重启、不重新导出、不复制大文件。&lt;/strong&gt; 在生产环境里，这套做法已经有人把每月的 GPU 成本从约 2.4 万美元降到约 1200 美元。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一lora-是什么给大模型贴一张专用贴纸"&gt;一、LoRA 是什么：给大模型贴一张&amp;quot;专用贴纸&amp;quot;&lt;/h2&gt;&#10;&lt;p&gt;微调（Fine-tuning）传统上指：拿一份预训练模型，用你自己的数据继续训练，得到一份&lt;strong&gt;完整的新模型文件&lt;/strong&gt;。问题很明显——一个 8B 模型就是 16 GB，你想要三个风格，就要存三份 48 GB，跑起来还要三份显存。&lt;/p&gt;&#10;&lt;p&gt;LoRA（Low-Rank Adaptation，低秩适配）的做法完全不同。它发现了一个经验规律：&lt;strong&gt;模型从&amp;quot;通用&amp;quot;变成&amp;quot;某个专用领域&amp;quot;，权重需要改变的部分其实很少&lt;/strong&gt;。于是它不动原来的权重，而是额外学两个很小的矩阵。&lt;/p&gt;&#10;&lt;p&gt;用数学写出来非常简单：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;原始输出： y = x · W&#10;加上 LoRA： y = x · W + scale · x · A · B&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;其中 W 是原来那个巨大的权重矩阵（冻结、不动），而 A 和 B 是两个&amp;quot;瘦长&amp;quot;的小矩阵。它们的尺寸是刻意设计成很窄的——中间那个很窄的维度就是 &lt;strong&gt;rank（秩）&lt;/strong&gt;，通常取 16 到 64。&lt;/p&gt;&#10;&lt;p&gt;它为什么能这么小？举个例子：一个 8B 模型在 rank 16 下的可训练参数约 &lt;strong&gt;1500 万&lt;/strong&gt;，而模型本身有 &lt;strong&gt;80 亿&lt;/strong&gt;冻结参数——你只训练了不到 0.2% 的参数，最终产物就是几千万个数字，落到磁盘上大约 &lt;strong&gt;40 MB&lt;/strong&gt;（rank 16）。&lt;/p&gt;</description></item><item><title>让 2B 当侦察兵：投机解码的原理、实测数据与失效边界</title><link>https://caozuohua.github.io/posts/2026-09-14-speculative-decoding-explained/</link><pubDate>Mon, 14 Sep 2026 10:30:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-14-speculative-decoding-explained/</guid><description>&lt;h1 id="让-2b-当侦察兵投机解码的原理实测数据与失效边界"&gt;让 2B 当侦察兵：投机解码的原理、实测数据与失效边界&lt;/h1&gt;&#10;&lt;p&gt;上一篇我们提到，2B 小模型最&amp;quot;值钱&amp;quot;的用法之一是给大模型当草稿机。这个技术的正式名字叫&lt;strong&gt;投机解码（Speculative Decoding）&lt;/strong&gt;。它的效果相当戏剧化：有人实测把 27B 模型的生成速度从 25 tok/s 提到 45 tok/s，也有人实测把 60 tok/s 掉到 45 tok/s——&lt;strong&gt;用的是同一个技术&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;本文面向没有推理优化背景的读者，先讲清&amp;quot;为什么能加速&amp;quot;，再讲清&amp;quot;为什么有时反而变慢&amp;quot;，中间穿插多组真实实测数据。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一先搞懂一个反直觉的事实大模型生成慢不是因为算不过来"&gt;一、先搞懂一个反直觉的事实：大模型生成慢，不是因为算不过来&lt;/h2&gt;&#10;&lt;p&gt;这是理解投机解码的唯一前提。&lt;/p&gt;&#10;&lt;p&gt;大模型生成文字是一个字一个字往外蹦的（术语叫自回归）。每蹦一个字，都要把&lt;strong&gt;整个模型的全部权重&lt;/strong&gt;从显存里完整读一遍。以 27B 模型 Q4 量化为例，权重约 16 GB——也就是说，&lt;strong&gt;每生成一个字，就要搬运 16 GB 数据&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;这带来一个关键结论：瓶颈在&lt;strong&gt;内存带宽&lt;/strong&gt;，不在计算能力。显卡的计算单元绝大部分时间在空转等数据。用一张带宽 936 GB/s 的 RTX 3090 举例，理论上限就是 936 ÷ 16 ≈ 58 tok/s，无论这张卡的算力有多强。&lt;/p&gt;&#10;&lt;p&gt;所以加速的方向有两条：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;减少要搬运的数据量（量化、用小模型）——代价是质量。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;让空转的算力干点活&lt;/strong&gt;——这正是投机解码的思路，且&lt;strong&gt;不损失任何质量&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="二核心思路让便宜的小模型去猜让贵的大模型去批改"&gt;二、核心思路：让便宜的小模型去&amp;quot;猜&amp;quot;，让贵的大模型去&amp;quot;批改&amp;quot;&lt;/h2&gt;&#10;&lt;p&gt;打个比方。大模型是个写文章很慢但水平很高的资深编辑，小模型是个打字飞快但水平一般的实习生。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;传统方式&lt;/strong&gt;：编辑一个字一个字亲自写，写一个字想一下，慢。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;投机解码&lt;/strong&gt;：实习生先一口气猜出接下来 5 个字，编辑拿过来一次性扫一眼——&lt;strong&gt;&amp;ldquo;前 3 个对，第 4 个不对&amp;rdquo;&lt;/strong&gt;。于是前 3 个字直接采纳（几乎白赚），第 4 个字由编辑自己改，第 5 个字扔掉重来。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;关键在于：&lt;strong&gt;编辑一次性检查 5 个字的成本，和检查 1 个字的成本几乎一样&lt;/strong&gt;。因为权重的搬运量在一次前向传播里是固定的，检查 5 个 token 只是把这条数据多算几遍而已——而算力本来就是空闲的。&lt;/p&gt;</description></item><item><title>curl 不止是下载工具：AI 与 Agent 开发中的十二类实战场景</title><link>https://caozuohua.github.io/posts/2026-09-14-curl-in-ai-agent-development/</link><pubDate>Mon, 14 Sep 2026 10:00:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-14-curl-in-ai-agent-development/</guid><description>&lt;h1 id="curl-不止是下载工具ai-与-agent-开发中的十二类实战场景"&gt;curl 不止是下载工具：AI 与 Agent 开发中的十二类实战场景&lt;/h1&gt;&#10;&lt;p&gt;多数人学 curl 的第一课是&amp;quot;下载文件&amp;quot;，此后便把它归类为 wget 的同类。但在 AI 与 Agent 工程中，curl 的角色完全不同：它是唯一一个&lt;strong&gt;在协议层完全透明、零依赖、可在任何环境逐字复现&lt;/strong&gt;的 HTTP 客户端。当需要回答&amp;quot;这个模型接口到底返回了什么&amp;quot;&amp;ldquo;延迟究竟卡在哪一段&amp;quot;&amp;ldquo;Agent 的工具调用为什么静默失败&amp;quot;时，curl 往往比任何 SDK 都更快给出答案——因为它不隐藏任何东西。&lt;/p&gt;&#10;&lt;p&gt;本文以 curl 8.22.0（2026-09-02 发布，第 276 个版本，命令行选项累计 278 个）为基线，梳理十二类高频场景。所有命令均可直接粘贴执行，只需替换端点与凭据。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="一llm-接口调试的四个基本动作"&gt;一、LLM 接口调试的四个基本动作&lt;/h2&gt;&#10;&lt;h3 id="11-最小可复现调用"&gt;1.1 最小可复现调用&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;--json&lt;/code&gt;（7.82.0 引入）是单次调用最省事的写法，它等价于同时做三件事：把数据作为 &lt;code&gt;--data-binary&lt;/code&gt; 发送、设置 &lt;code&gt;Content-Type: application/json&lt;/code&gt;、设置 &lt;code&gt;Accept: application/json&lt;/code&gt;。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -sS https://api.deepseek.com/chat/completions &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H &lt;span style="color:#e6db74"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;$DEEPSEEK_API_KEY&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --json &lt;span style="color:#e6db74"&gt;&amp;#39;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;model&amp;#34;: &amp;#34;deepseek-chat&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;只回复 OK&amp;#34;}],&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; &amp;#34;temperature&amp;#34;: 0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }&amp;#39;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -w &lt;span style="color:#e6db74"&gt;&amp;#39;\n[%{http_code} | %{time_total}s | %{size_download}B]\n&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;三点值得强调：&lt;/p&gt;</description></item><item><title>别把 2B 当小号 GPT-4：llama.cpp + Qwen 2B 的六种实战玩法</title><link>https://caozuohua.github.io/posts/2026-09-13-llamacpp-qwen2b-local-playbook/</link><pubDate>Sun, 13 Sep 2026 12:00:00 +0800</pubDate><guid>https://caozuohua.github.io/posts/2026-09-13-llamacpp-qwen2b-local-playbook/</guid><description>&lt;h1 id="别把-2b-当小号-gpt-4llamacpp--qwen-2b-的六种实战玩法"&gt;别把 2B 当小号 GPT-4：llama.cpp + Qwen 2B 的六种实战玩法&lt;/h1&gt;&#10;&lt;p&gt;在本地跑一个 2B 级别的模型（Qwen2.5-1.5B、Qwen3-1.7B 这一类），最常见的失望是「它连个像样的回答都给不出来」。于是很容易得出一个结论：小模型没用，还得上 32B 甚至 72B。&lt;/p&gt;&#10;&lt;p&gt;这个结论错在前提。&lt;strong&gt;2B 的定位从来不是&amp;quot;小号 GPT-4&amp;quot;，而是流水线里一个廉价、快速、输出确定的专用零件。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;在一台普通笔记本上，Qwen 2B（Q4_K_M 量化）的生成速度可以轻松跑到 30 tokens/s 以上，显存占用不到 2GB。这意味着它一秒能吞下几十条请求。真正的技术含量不在于它有多聪明，而在于你&lt;strong&gt;如何把任务切到它擅长的那一格&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;一句话概括本文的判断：&lt;strong&gt;不要让小模型去&amp;quot;思考&amp;quot;，要让它去&amp;quot;填空&amp;quot;。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="先确认你的跑法"&gt;先确认你的跑法&lt;/h2&gt;&#10;&lt;p&gt;下文所有玩法都建立在 &lt;code&gt;llama-server&lt;/code&gt; 上——它提供 OpenAI 兼容接口，任何现成的 SDK 都能直接接。一个够用的启动命令：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./llama-server &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -m models/Qwen2.5-1.5B-Instruct-Q4_K_M.gguf &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c &lt;span style="color:#ae81ff"&gt;4096&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -np &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt; --cont-batching &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --jinja &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --host 127.0.0.1 --port &lt;span style="color:#ae81ff"&gt;8080&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;几个参数值得单独说明：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上下文长度，小模型不要盲目开大&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-np&lt;/code&gt; &lt;code&gt;--cont-batching&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;并行槽位 + 连续批处理，是批量吞吐的关键&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--jinja&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;启用模型自带对话模板，工具调用能力依赖它&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-ctk q8_0 -ctv q8_0&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;KV Cache 量化，长上下文时能省一半显存&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--mmproj xxx.gguf&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加载视觉投影层，进入多模态模式&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="玩法一语法约束输出器--最高杠杆的一招"&gt;玩法一：语法约束输出器 —— 最高杠杆的一招&lt;/h2&gt;&#10;&lt;p&gt;llama.cpp 原生支持 &lt;strong&gt;GBNF 语法&lt;/strong&gt;与 &lt;strong&gt;JSON Schema 约束解码&lt;/strong&gt;。这是它相对于 vLLM、Ollama 最显著的差异点，也是让 2B 从&amp;quot;勉强能用&amp;quot;跳到&amp;quot;近乎可靠&amp;quot;的关键。&lt;/p&gt;</description></item><item><title>从自动化到智能化：Playwright 全栈进阶指南</title><link>https://caozuohua.github.io/posts/2026-09-13-playwright-guide/</link><pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate><guid>https://caozuohua.github.io/posts/2026-09-13-playwright-guide/</guid><description>&lt;h1 id="从自动化到智能化playwright-全栈进阶指南"&gt;从自动化到智能化：Playwright 全栈进阶指南&lt;/h1&gt;&#10;&lt;p&gt;Playwright 已经超越了传统的自动化测试框架，成为了 Web 浏览器协议栈的最强控制端。无论是常规的端到端测试，还是赋予 AI Agent 真实世界的“双手”，Playwright 都是必不可少的工具。&lt;/p&gt;&#10;&lt;p&gt;以下是 Playwright 从零到 AI 代理的进阶路线图。&lt;/p&gt;&#10;&lt;h2 id="目录"&gt;目录&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;环境搭建与架构初探&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;定位器与交互艺术&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;异步测试与高级等待机制&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AI 代理与浏览器控制 (MCP)&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CI/CD 与多环境适配&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="1-环境搭建与架构初探"&gt;1. 环境搭建与架构初探&lt;/h2&gt;&#10;&lt;p&gt;Playwright 基于 WebKit、Chromium 和 Firefox 的原生 CDP（Chrome DevTools Protocol），相比 Selenium 具有更高的稳定性和并发性能。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;初始化&lt;/strong&gt;：&lt;code&gt;npm init playwright@latest&lt;/code&gt; 或 Python 下 &lt;code&gt;pip install playwright&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;关键配置&lt;/strong&gt;：理解配置文件中的 &lt;code&gt;projects&lt;/code&gt;（多浏览器并行）与 &lt;code&gt;use&lt;/code&gt;（全局断言/超时设置）。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2-定位器与交互艺术"&gt;2. 定位器与交互艺术&lt;/h2&gt;&#10;&lt;p&gt;拒绝 XPath，全面拥抱 Web-First Locators。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;推荐使用&lt;/strong&gt;：&lt;code&gt;getByRole&lt;/code&gt;, &lt;code&gt;getByLabel&lt;/code&gt;, &lt;code&gt;getByPlaceholder&lt;/code&gt;, &lt;code&gt;getByTestId&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;交互逻辑&lt;/strong&gt;：&lt;code&gt;click&lt;/code&gt;, &lt;code&gt;fill&lt;/code&gt;, &lt;code&gt;press&lt;/code&gt; 均具备自动等待功能，有效减少了手动 &lt;code&gt;sleep&lt;/code&gt; 的“代码异味”。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="3-异步测试与高级等待机制"&gt;3. 异步测试与高级等待机制&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;事件驱动&lt;/strong&gt;：利用 &lt;code&gt;page.waitForEvent&lt;/code&gt; 和 &lt;code&gt;page.waitForResponse&lt;/code&gt; 精准监控 Web 交互流。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;状态断言&lt;/strong&gt;：使用 &lt;code&gt;expect&lt;/code&gt; 工具链进行原子化断言（如 &lt;code&gt;toBeVisible&lt;/code&gt;）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;网络拦截&lt;/strong&gt;：使用 &lt;code&gt;page.route&lt;/code&gt; 进行 API Mock 或异常注入，模拟复杂的后端行为。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="4-ai-代理与浏览器控制-mcp"&gt;4. AI 代理与浏览器控制 (MCP)&lt;/h2&gt;&#10;&lt;p&gt;这是 Playwright 进阶的巅峰：将浏览器控制权交给 LLM。&lt;/p&gt;</description></item></channel></rss>