[{"data":1,"prerenderedAt":10570},["ShallowReactive",2],{"latest-articles":3,"all-build-logs":1957,"all-tutorials-count":8216},[4,365,1080,1270,1444,1748],{"id":5,"title":6,"body":7,"cover":326,"date":327,"description":328,"draft":329,"extension":330,"faq":331,"featured":329,"meta":344,"navigation":345,"path":346,"readingTime":347,"seo":348,"seoKeywords":349,"stem":357,"summary":358,"tags":359,"type":362,"updated":363,"video":363,"__hash__":364},"articles\u002Farticles\u002Fmarkdown-vs-html.md","Markdown 已死？先别慌，自媒体又在夸大了",{"type":8,"value":9,"toc":315},"minimark",[10,17,22,25,28,31,34,37,40,43,46,52,59,63,66,72,75,83,86,92,98,101,104,109,112,116,119,124,131,134,139,142,147,161,166,169,172,177,180,193,199,204,208,211,237,240,254,259,262,265,269,272,275,285,291,294,297,301,304,307,312],[11,12,13],"blockquote",{},[14,15,16],"p",{},"HTML 是给人看的，Markdown 是和 AI 说话的。两者服务的对象不同，根本不存在谁取代谁。",[18,19,21],"h2",{"id":20},"又一个已死标题","又一个「已死」标题",[14,23,24],{},"上周，一个帖子炸了。",[14,26,27],{},"Anthropic 工程师 Thariq 写了一篇长文，大意是：他已经完全改用 HTML 作为 AI 的输出格式，Markdown 又长又难读，超过 100 行他基本就不看了。",[14,29,30],{},"随后自媒体蜂拥而至，标题一个比一个猛：",[14,32,33],{},"「Markdown，当死。」",[14,35,36],{},"「卡帕西也站队了，HTML 要取代 Markdown？」",[14,38,39],{},"「你刚学会用 MD，它又要死了？」",[14,41,42],{},"然后我看到身边很多人开始焦虑——",[14,44,45],{},"又要学新东西了？之前花时间搭的 Markdown 工作流是不是白费了？",[14,47,48],{},[49,50,51],"strong",{},"先冷静。这件事被严重夸大了。",[14,53,54],{},[55,56],"img",{"alt":57,"src":58},"Thariq 的帖子截图","\u002Fa\u002Fmarkdown-vs-html\u002Fthariq-post.webp",[18,60,62],{"id":61},"thariq-说的其实是对的但说的是另一件事","Thariq 说的其实是对的，但说的是另一件事",[14,64,65],{},"Thariq 的观察我完全认同，而且我们团队内部也在印证这件事。",[14,67,68,69],{},"他说的是：",[49,70,71],{},"当 AI 输出一份供人阅读的文档时，HTML 比 Markdown 好得多。",[14,73,74],{},"这句话是对的。",[14,76,77,78,82],{},"超过 100 行的 Markdown？老实说，我自己也没怎么认真看过。Claude Code 吭哧吭哧生成的 ",[79,80,81],"code",{},"plan.md","，我基本瞟一眼就发\"开工\"了。",[14,84,85],{},"但 HTML 不一样——AI 可以把同样的信息做成带标签页、可折叠区块、甚至响应式布局的页面。视觉层次清晰，打开浏览器就能看，甩给同事一个链接，零门槛。",[14,87,88,89],{},"这个优势是真实的。对于需要示意、解释、说服别人的内容，",[49,90,91],{},"一个可以\"玩\"起来的文档，比一堆 ASCII 代码块强太多了。",[14,93,94,95],{},"所以 Thariq 说的是：",[49,96,97],{},"让 AI 输出 HTML，给人看。",[14,99,100],{},"他没说的是：用 HTML 和 AI 对话。",[14,102,103],{},"这两件事，完全不同。",[14,105,106],{},[49,107,108],{},"但反直觉的是——恰恰是 AI 能力越来越强，Markdown 反而变得更不可替代了。",[14,110,111],{},"因为 AI 越强，你和它沟通的频次越高，你给它的上下文越多，那个\"中间沟通层\"就越关键。而那个层，Markdown 才是王者。",[18,113,115],{"id":114},"但markdown-已死是彻底的夸大","但「Markdown 已死」是彻底的夸大",[14,117,118],{},"自媒体把这件事扭曲成了「HTML 要全面取代 Markdown」，这就荒谬了。",[14,120,121],{},[49,122,123],{},"Markdown 为什么不会死？因为它是和 AI 沟通的语言，不是给人读的格式。",[14,125,126,127,130],{},"反直觉的地方在这里：大家以为 HTML 更\"现代\"，Markdown 更\"原始\"，所以 HTML 应该赢。但判断一个格式该不该用，不是看谁更好看，而是看",[49,128,129],{},"谁在用它、用来做什么","。",[14,132,133],{},"四个理由：",[14,135,136],{},[49,137,138],{},"1. AI 就是在 Markdown 上训练出来的",[14,140,141],{},"互联网上大量的技术文档、GitHub README、Stack Overflow 回答，都是 Markdown 格式。语言模型吃的就是这些。Markdown 的结构——标题层级、列表、代码块——AI 天然就懂，对它的理解比任何格式都精准。",[14,143,144],{},[49,145,146],{},"2. 和 AI 说话，你要的是干净，不是花哨",[14,148,149,150,153,154,153,157,160],{},"当你给 AI 一段上下文、一份规格文档、一个任务描述，你要的是让它尽快理解，没有噪音。HTML 里充满了 ",[79,151,152],{},"\u003Cdiv>","、",[79,155,156],{},"\u003Cspan>",[79,158,159],{},"class"," 属性——这些对 AI 来说都是要处理的冗余信息。Markdown 的纯文本信息更干净，AI 读得更快、理解更准。",[14,162,163],{},[49,164,165],{},"3. Token 是真实成本",[14,167,168],{},"据实测，相同内容，HTML 消耗的 token 约是 Markdown 的 2-8 倍。有人算过账：同样规模的项目，从 Markdown 切换到全链路 HTML，一年多花将近一倍的 API 费用。",[14,170,171],{},"如果 HTML 只是最终呈现层，这个成本是值得的。但如果整个 AI 工作流的中间环节都在传递 HTML，那是在把大量钱烧在标签上。",[14,173,174],{},[49,175,176],{},"4. AI 工作流是有层次的",[14,178,179],{},"一个完整的 AI 协作链路通常是：",[181,182,183,187,190],"ul",{},[184,185,186],"li",{},"你用 Markdown 给 AI 写指令和上下文",[184,188,189],{},"AI 用代码或 Markdown 完成中间步骤",[184,191,192],{},"最终输出物：展示给人看的部分用 HTML",[14,194,195,198],{},[49,196,197],{},"中间态给 AI，终态给人。"," 这才是正确的分工。",[11,200,201],{},[14,202,203],{},"HTML 是给人看的展示载体，Markdown 是和 AI 沟通的工作语言。两者服务的对象根本不同，就像你不会因为 PPT 好看就把所有工作邮件都写成 PPT 格式。",[18,205,207],{"id":206},"什么时候该让-ai-输出-html","什么时候该让 AI 输出 HTML？",[14,209,210],{},"具体说，以下这些场景用 HTML 是对的：",[181,212,213,219,225,231],{},[184,214,215,218],{},[49,216,217],{},"方案对比页","：几个方向并排展示，带标注和权衡分析",[184,220,221,224],{},[49,222,223],{},"代码审查说明","：带颜色 diff、模块依赖图、行内批注",[184,226,227,230],{},[49,228,229],{},"数据报告","：SVG 图表、交互式数据探索",[184,232,233,236],{},[49,234,235],{},"一次性编辑器","：拖拽看板、参数调试器、Prompt 预览——用完即抛",[14,238,239],{},"以下这些场景，继续用 Markdown：",[181,241,242,245,248,251],{},[184,243,244],{},"给 AI 写任务描述和上下文",[184,246,247],{},"项目的规格文档（AI 需要频繁读取和更新的）",[184,249,250],{},"代码注释和 README",[184,252,253],{},"任何 AI 需要「消费」而不是「展示」的内容",[14,255,256],{},[49,257,258],{},"原则很简单：这份内容的最终消费者是人还是 AI？",[14,260,261],{},"是人 → HTML。",[14,263,264],{},"是 AI → Markdown。",[18,266,268],{"id":267},"生成了-html怎么分享","生成了 HTML，怎么分享？",[14,270,271],{},"有一个真实的痛点：AI 给你生成了一份漂亮的 HTML 文档，但你怎么发给同事看？",[14,273,274],{},"发源码？对方看到的是一堆标签。发附件？对方还要找工具打开。上传到服务器？需要账号和配置，不是人人都搞得定。",[14,276,277,278,130],{},"我最近在用的解法是 ",[279,280,284],"a",{"href":281,"rel":282},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FhtmlShare\u002F",[283],"nofollow","MeTool 的 HTML 分享工具",[14,286,287],{},[55,288],{"alt":289,"src":290},"MeTool AI HTML 预览分享工具","\u002Fa\u002Fmarkdown-vs-html\u002Fhtml-preview.png",[14,292,293],{},"把 AI 生成的 HTML 粘进去，点一下，生成一个可以直接发给任何人的链接，对方用手机浏览器打开就能看到完整渲染效果。短内容直接编码进 URL，完全不经过服务器；链接 7 天有效，到期自动失效。",[14,295,296],{},"从 AI 生成到对方看到，整个流程 30 秒。",[18,298,300],{"id":299},"所以-markdown-将会活得好好的","所以 Markdown 将会活得好好的！",[14,302,303],{},"Thariq 的观察是真实的，局部也是对的。但「Markdown 已死」这个结论，是自媒体加的。",[14,305,306],{},"AI 时代信息更新快，焦虑是正常的。但在被标题带节奏之前，多问一句：",[14,308,309],{},[49,310,311],{},"这个观点，说的是全部情况，还是某一个具体场景？",[14,313,314],{},"想清楚这一点，你就不会再为「Markdown 已死」慌神了。",{"title":316,"searchDepth":317,"depth":317,"links":318},"",3,[319,321,322,323,324,325],{"id":20,"depth":320,"text":21},2,{"id":61,"depth":320,"text":62},{"id":114,"depth":320,"text":115},{"id":206,"depth":320,"text":207},{"id":267,"depth":320,"text":268},{"id":299,"depth":320,"text":300},"\u002Fa\u002Fmarkdown-vs-html\u002Fcover.png","2026-05-14","Anthropic 工程师力推 HTML 输出，但「Markdown 已死」是夸大其词。HTML 是给人看的，Markdown 是和 AI 说话的，两者根本不是一回事。",false,"md",[332,335,338,341],{"q":333,"a":334},"Anthropic 工程师为什么推荐 HTML 而不是 Markdown？","Thariq 的核心理由是：超过 100 行的 Markdown 文件几乎没人会认真读完，而 HTML 可以用 CSS 排版、SVG 画图、JavaScript 做交互，信息密度和可读性远超纯文本。他推荐的是「让 AI 输出 HTML 给人看」，而不是「用 HTML 和 AI 对话」。",{"q":336,"a":337},"为什么说 Markdown 更适合和 AI 沟通？","AI 语言模型本身就是在大量 Markdown 格式的文本上训练的，对其结构天然敏感。Markdown 语法简洁，相同信息消耗的 token 更少，也没有 HTML 标签的噪音干扰。与 AI 对话时，Markdown 是最干净、最高效的输入格式。",{"q":339,"a":340},"HTML 输出会消耗更多 token 吗？","是的，据实测，同样内容 HTML 格式消耗的 token 约是 Markdown 的 2-4 倍。如果你把 HTML 用于「展示给人看」的输出，这个成本是值得的；但如果在整个 AI 工作流的中间环节都用 HTML 传递信息，就会造成大量不必要的 token 浪费。",{"q":342,"a":343},"什么时候该让 AI 输出 HTML，什么时候用 Markdown？","简单原则：如果这份内容是「展示给人看的终态」——报告、方案对比、代码审查说明——就用 HTML；如果是「与 AI 继续沟通的中间态」——指令、上下文、规格文档——就用 Markdown。终态给人，中间态给 AI。",{},true,"\u002Farticles\u002Fmarkdown-vs-html",8,{"title":6,"description":328},[350,351,352,353,354,355,356],"Markdown HTML AI输出","AI输出格式","HTML替代Markdown","Claude HTML输出","AI token消耗","vibe coding格式","AI沟通技巧","articles\u002Fmarkdown-vs-html","HTML 适合人类浏览和交互，Markdown 适合与 AI 沟通——两者服务的对象不同，根本不存在谁取代谁的问题。别被「Markdown 已死」的标题带节奏。",[360,361],"AI 洞察","AI 应用","article",null,"g_TUEKdqyPBMT6-RG1GBrdcwcnrbF3L75Gy4vXauSeM",{"id":366,"title":367,"body":368,"cover":380,"date":1049,"description":1050,"draft":329,"extension":330,"faq":1051,"featured":329,"meta":1064,"navigation":345,"path":1065,"readingTime":562,"seo":1066,"seoKeywords":1067,"stem":1075,"summary":1076,"tags":1077,"type":362,"updated":363,"video":363,"__hash__":1079},"articles\u002Farticles\u002Fgit-worktree-ai-parallel-dev.md","榨干 AI 效率，优雅的 AI 并行开发技巧",{"type":8,"value":369,"toc":1037},[370,375,381,384,387,390,393,397,403,406,409,416,419,422,426,432,435,444,455,462,482,485,491,495,499,613,616,620,623,676,679,685,688,718,721,725,728,735,738,829,834,838,841,850,870,873,876,879,941,944,948,1016,1022,1025,1030,1033],[11,371,372],{},[14,373,374],{},"AI 不是不够快，是你的工作流只允许它一次干一件事。Git Worktree 让你的项目从单行道变成多车道，每个 AI 各走各的，互不干扰。",[14,376,377],{},[55,378],{"alt":379,"src":380},"cover","\u002Fa\u002Fgit-worktree-ai-parallel-dev\u002Fcover.png",[14,382,383],{},"上周，AI 正在帮我重构一个组件。进度条缓慢推进，预计还要 3 分钟。",[14,385,386],{},"我盯着屏幕，脑子里想的全是：另一个需求的接口层也可以同时改啊。于是我开了第二个 AI 会话窗口，让它去改接口层。两边同时跑，效率翻倍，完美。",[14,388,389],{},"直到我准备合并代码的那一刻。",[14,391,392],{},"两个 AI 都动了同一个配置文件。满屏红色冲突标记，解冲突花了半小时。比让 AI 排队干还慢。",[18,394,396],{"id":395},"问题出在哪","问题出在哪？",[14,398,399,400],{},"想明白之后，答案很简单：",[49,401,402],{},"两个 AI 会话共用了同一个工作目录。",[14,404,405],{},"它们改的文件确实大部分不重叠，但只要有一个公共文件被双方碰过，就会打架。这就像两个厨师共用一个灶台，各做各的菜没问题，但只要同时伸手拿调料瓶，就撞上了。",[14,407,408],{},"而且这个问题不只出现在个人开发中。",[14,410,411,412,415],{},"团队开发时更明显。需求单都是独立的，大家本来就习惯用 ",[79,413,414],{},"git branch"," 各自开分支。但如果你想让 AI 帮你在不同分支上同时开发不同的需求，就会非常别扭。AI 没法在同一个工作目录里同时 checkout 两个分支，你要么频繁切分支，要么 clone 多份仓库。",[14,417,418],{},"前者打断工作流，后者浪费空间和时间。",[14,420,421],{},"我一度觉得，这大概就是 AI 并行开发的天花板了。",[18,423,425],{"id":424},"直到我发现-git-worktree","直到我发现 Git Worktree",[14,427,428,429,130],{},"Git 里有一个存在很久、但大多数人没用过的功能：",[49,430,431],{},"Worktree（工作树）",[14,433,434],{},"一句话解释：它可以让你为同一个仓库创建多个独立的工作目录，每个目录对应一个不同的分支。",[436,437,442],"pre",{"className":438,"code":440,"language":441},[439],"language-text","my-project\u002F              ← 主目录，在 main 分支\nmy-project-feat-a\u002F       ← Worktree 1，在 feature\u002Fa 分支\nmy-project-feat-b\u002F       ← Worktree 2，在 feature\u002Fb 分支\n","text",[79,443,440],{"__ignoreMap":316},[14,445,446,447,450,451,454],{},"这三个目录是",[49,448,449],{},"完全独立的文件系统","，互不干扰。但它们共享同一个 ",[79,452,453],{},".git"," 对象数据库。提交历史、远程仓库配置、钩子全部共享，不会出现\"两份代码配置慢慢漂移\"的问题。",[14,456,457,458,461],{},"和 ",[79,459,460],{},"git clone"," 多份仓库相比，Worktree 的优势很明显：",[181,463,464,470,476],{},[184,465,466,469],{},[49,467,468],{},"创建速度快","：几乎瞬间完成，不需要重新下载整个仓库",[184,471,472,475],{},[49,473,474],{},"几乎不占额外空间","：共享对象数据库，只多了工作区的文件副本",[184,477,478,481],{},[49,479,480],{},"配置不漂移","：远程仓库、钩子、Git 配置全部共享",[14,483,484],{},"说白了，Worktree 就是让你在一个仓库里同时\"打开\"多个分支，每个分支有自己的目录，互相看不见。",[14,486,487,488],{},"发现它的那一刻，我就意识到：",[49,489,490],{},"这不就是给 AI 并行开发量身定做的吗？",[18,492,494],{"id":493},"实操两分钟上手","实操：两分钟上手",[496,497,498],"h3",{"id":498},"基础命令速查",[436,500,504],{"className":501,"code":502,"language":503,"meta":316,"style":316},"language-bash shiki shiki-themes github-light-default github-dark-default","# 查看当前所有工作目录\ngit worktree list\n\n# 为已有分支创建新工作目录\ngit worktree add ..\u002Ffeat-login feature\u002Flogin\n\n# 创建新分支 + 新工作目录，一步到位\ngit worktree add ..\u002Ffeat-payment -b feature\u002Fpayment\n\n# 在某个特定 commit 上创建工作目录（只读排查场景常用）\ngit worktree add --detach ..\u002Finvestigate abc1234\n","bash",[79,505,506,515,528,533,539,555,560,566,584,589,595],{"__ignoreMap":316},[507,508,511],"span",{"class":509,"line":510},"line",1,[507,512,514],{"class":513},"sU953","# 查看当前所有工作目录\n",[507,516,517,521,525],{"class":509,"line":320},[507,518,520],{"class":519},"sTDnQ","git",[507,522,524],{"class":523},"sSVrQ"," worktree",[507,526,527],{"class":523}," list\n",[507,529,530],{"class":509,"line":317},[507,531,532],{"emptyLinePlaceholder":345},"\n",[507,534,536],{"class":509,"line":535},4,[507,537,538],{"class":513},"# 为已有分支创建新工作目录\n",[507,540,542,544,546,549,552],{"class":509,"line":541},5,[507,543,520],{"class":519},[507,545,524],{"class":523},[507,547,548],{"class":523}," add",[507,550,551],{"class":523}," ..\u002Ffeat-login",[507,553,554],{"class":523}," feature\u002Flogin\n",[507,556,558],{"class":509,"line":557},6,[507,559,532],{"emptyLinePlaceholder":345},[507,561,563],{"class":509,"line":562},7,[507,564,565],{"class":513},"# 创建新分支 + 新工作目录，一步到位\n",[507,567,568,570,572,574,577,581],{"class":509,"line":347},[507,569,520],{"class":519},[507,571,524],{"class":523},[507,573,548],{"class":523},[507,575,576],{"class":523}," ..\u002Ffeat-payment",[507,578,580],{"class":579},"sHrmB"," -b",[507,582,583],{"class":523}," feature\u002Fpayment\n",[507,585,587],{"class":509,"line":586},9,[507,588,532],{"emptyLinePlaceholder":345},[507,590,592],{"class":509,"line":591},10,[507,593,594],{"class":513},"# 在某个特定 commit 上创建工作目录（只读排查场景常用）\n",[507,596,598,600,602,604,607,610],{"class":509,"line":597},11,[507,599,520],{"class":519},[507,601,524],{"class":523},[507,603,548],{"class":523},[507,605,606],{"class":579}," --detach",[507,608,609],{"class":523}," ..\u002Finvestigate",[507,611,612],{"class":523}," abc1234\n",[14,614,615],{},"就这么几条命令。没有复杂的配置，没有需要记的参数。",[496,617,619],{"id":618},"场景一个人-ai-并行开发","场景一：个人 AI 并行开发",[14,621,622],{},"你手上有三个需求要同时推进。打开终端：",[436,624,626],{"className":501,"code":625,"language":503,"meta":316,"style":316},"git worktree add ..\u002Fmy-project-feat-a -b feature\u002Fa\ngit worktree add ..\u002Fmy-project-feat-b -b feature\u002Fb\ngit worktree add ..\u002Fmy-project-fix-bug -b fix\u002Fbug-123\n",[79,627,628,644,660],{"__ignoreMap":316},[507,629,630,632,634,636,639,641],{"class":509,"line":510},[507,631,520],{"class":519},[507,633,524],{"class":523},[507,635,548],{"class":523},[507,637,638],{"class":523}," ..\u002Fmy-project-feat-a",[507,640,580],{"class":579},[507,642,643],{"class":523}," feature\u002Fa\n",[507,645,646,648,650,652,655,657],{"class":509,"line":320},[507,647,520],{"class":519},[507,649,524],{"class":523},[507,651,548],{"class":523},[507,653,654],{"class":523}," ..\u002Fmy-project-feat-b",[507,656,580],{"class":579},[507,658,659],{"class":523}," feature\u002Fb\n",[507,661,662,664,666,668,671,673],{"class":509,"line":317},[507,663,520],{"class":519},[507,665,524],{"class":523},[507,667,548],{"class":523},[507,669,670],{"class":523}," ..\u002Fmy-project-fix-bug",[507,672,580],{"class":579},[507,674,675],{"class":523}," fix\u002Fbug-123\n",[14,677,678],{},"现在你有四个完全独立的项目目录。打开多个 AI 编程窗口，每个窗口指向一个目录，让它们各干各的。",[14,680,681,682],{},"改同一个文件？没关系，",[49,683,684],{},"它们在不同的目录里，根本碰不到彼此。",[14,686,687],{},"各自改完之后，回到主目录正常合并：",[436,689,691],{"className":501,"code":690,"language":503,"meta":316,"style":316},"git merge feature\u002Fa\ngit merge feature\u002Fb\ngit merge fix\u002Fbug-123\n",[79,692,693,702,710],{"__ignoreMap":316},[507,694,695,697,700],{"class":509,"line":510},[507,696,520],{"class":519},[507,698,699],{"class":523}," merge",[507,701,643],{"class":523},[507,703,704,706,708],{"class":509,"line":320},[507,705,520],{"class":519},[507,707,699],{"class":523},[507,709,659],{"class":523},[507,711,712,714,716],{"class":509,"line":317},[507,713,520],{"class":519},[507,715,699],{"class":523},[507,717,675],{"class":523},[14,719,720],{},"如果合并时有冲突，那是正常的代码逻辑冲突，你可以从容处理。而不是两个 AI 在同一份文件上乱改造成的混乱。",[496,722,724],{"id":723},"场景二团队多分支开发","场景二：团队多分支开发",[14,726,727],{},"团队里每个人各自开了分支做不同需求，你负责修一个线上 bug。",[14,729,730,731,734],{},"传统方式：",[79,732,733],{},"git checkout"," 切来切去，AI 的上下文全丢了。",[14,736,737],{},"Worktree 方式：",[436,739,741],{"className":501,"code":740,"language":503,"meta":316,"style":316},"# 为 hotfix 单独开一个工作目录\ngit worktree add ..\u002Fhotfix-2174 -b hotfix\u002F2174 origin\u002Frelease\u002F1.2\n\n# 在 hotfix 目录里让 AI 修 bug，主目录继续开发新功能\ncd ..\u002Fhotfix-2174\ngit commit -am \"Fix null check in payment total\"\ngit push -u origin hotfix\u002F2174\n\n# 修完了，回主目录继续手头的活\ncd ..\u002Fmy-project\n",[79,742,743,748,767,771,776,784,797,813,817,822],{"__ignoreMap":316},[507,744,745],{"class":509,"line":510},[507,746,747],{"class":513},"# 为 hotfix 单独开一个工作目录\n",[507,749,750,752,754,756,759,761,764],{"class":509,"line":320},[507,751,520],{"class":519},[507,753,524],{"class":523},[507,755,548],{"class":523},[507,757,758],{"class":523}," ..\u002Fhotfix-2174",[507,760,580],{"class":579},[507,762,763],{"class":523}," hotfix\u002F2174",[507,765,766],{"class":523}," origin\u002Frelease\u002F1.2\n",[507,768,769],{"class":509,"line":317},[507,770,532],{"emptyLinePlaceholder":345},[507,772,773],{"class":509,"line":535},[507,774,775],{"class":513},"# 在 hotfix 目录里让 AI 修 bug，主目录继续开发新功能\n",[507,777,778,781],{"class":509,"line":541},[507,779,780],{"class":579},"cd",[507,782,783],{"class":523}," ..\u002Fhotfix-2174\n",[507,785,786,788,791,794],{"class":509,"line":557},[507,787,520],{"class":519},[507,789,790],{"class":523}," commit",[507,792,793],{"class":579}," -am",[507,795,796],{"class":523}," \"Fix null check in payment total\"\n",[507,798,799,801,804,807,810],{"class":509,"line":562},[507,800,520],{"class":519},[507,802,803],{"class":523}," push",[507,805,806],{"class":579}," -u",[507,808,809],{"class":523}," origin",[507,811,812],{"class":523}," hotfix\u002F2174\n",[507,814,815],{"class":509,"line":347},[507,816,532],{"emptyLinePlaceholder":345},[507,818,819],{"class":509,"line":586},[507,820,821],{"class":513},"# 修完了，回主目录继续手头的活\n",[507,823,824,826],{"class":509,"line":591},[507,825,780],{"class":579},[507,827,828],{"class":523}," ..\u002Fmy-project\n",[14,830,831],{},[49,832,833],{},"不用切分支，不丢上下文，每个需求都有自己的\"房间\"。",[18,835,837],{"id":836},"ai-编程工具已经在用这个方案了","AI 编程工具已经在用这个方案了",[14,839,840],{},"这不是我一个人折腾出来的野路子。",[14,842,843,844,849],{},"Cursor 最近发布的 ",[279,845,848],{"href":846,"rel":847},"https:\u002F\u002Fcursor.com\u002Fdocs\u002Fconfiguration\u002Fworktrees",[283],"Parallel Agents 功能","，底层就是用 Git Worktree 实现的。每个并行 Agent 自动运行在独立的 Worktree 和分支上，提供三个关键保障：",[181,851,852,858,864],{},[184,853,854,857],{},[49,855,856],{},"文件隔离","：每个 Agent 的文件编辑和暂存区完全独立，不会互相覆盖",[184,859,860,863],{},[49,861,862],{},"高效创建","：Worktree 比 clone 快得多，几乎没有额外空间开销",[184,865,866,869],{},[49,867,868],{},"历史可追溯","：每个 Agent 的分支清晰记录了它做了什么改动",[14,871,872],{},"这意味着行业已经在朝这个方向走了。即使你现在用的工具还不支持自动并行，手动用 Worktree 一样能达到同样的效果。",[18,874,875],{"id":875},"用完记得收拾",[14,877,878],{},"Worktree 用完后别忘了清理，否则目录会越攒越多：",[436,880,882],{"className":501,"code":881,"language":503,"meta":316,"style":316},"# 删除不再需要的工作目录\ngit worktree remove ..\u002Ffeat-login\n\n# 如果目录已经被手动删了，清理残留的元数据\ngit worktree prune\n\n# 可选：删除已合并的远程分支\ngit push origin --delete feature\u002Flogin\n",[79,883,884,889,901,905,910,919,923,928],{"__ignoreMap":316},[507,885,886],{"class":509,"line":510},[507,887,888],{"class":513},"# 删除不再需要的工作目录\n",[507,890,891,893,895,898],{"class":509,"line":320},[507,892,520],{"class":519},[507,894,524],{"class":523},[507,896,897],{"class":523}," remove",[507,899,900],{"class":523}," ..\u002Ffeat-login\n",[507,902,903],{"class":509,"line":317},[507,904,532],{"emptyLinePlaceholder":345},[507,906,907],{"class":509,"line":535},[507,908,909],{"class":513},"# 如果目录已经被手动删了，清理残留的元数据\n",[507,911,912,914,916],{"class":509,"line":541},[507,913,520],{"class":519},[507,915,524],{"class":523},[507,917,918],{"class":523}," prune\n",[507,920,921],{"class":509,"line":557},[507,922,532],{"emptyLinePlaceholder":345},[507,924,925],{"class":509,"line":562},[507,926,927],{"class":513},"# 可选：删除已合并的远程分支\n",[507,929,930,932,934,936,939],{"class":509,"line":347},[507,931,520],{"class":519},[507,933,803],{"class":523},[507,935,809],{"class":523},[507,937,938],{"class":579}," --delete",[507,940,554],{"class":523},[14,942,943],{},"养成习惯：需求合并后，顺手 remove 对应的 Worktree。",[18,945,947],{"id":946},"什么时候该用什么时候不用","什么时候该用，什么时候不用？",[949,950,951,964],"table",{},[952,953,954],"thead",{},[955,956,957,961],"tr",{},[958,959,960],"th",{},"场景",[958,962,963],{},"推荐方案",[965,966,967,976,983,997,1005],"tbody",{},[955,968,969,973],{},[970,971,972],"td",{},"AI 并行开发多个独立需求",[970,974,975],{},"Worktree",[955,977,978,981],{},[970,979,980],{},"团队多分支同时推进",[970,982,975],{},[955,984,985,988],{},[970,986,987],{},"临时看一眼另一个分支的代码",[970,989,990,993,994],{},[79,991,992],{},"git stash"," + ",[79,995,996],{},"checkout",[955,998,999,1002],{},[970,1000,1001],{},"需要完全不同的远程配置",[970,1003,1004],{},"单独 clone",[955,1006,1007,1010],{},[970,1008,1009],{},"快速修一个小 bug 然后切回来",[970,1011,1012,993,1014],{},[79,1013,992],{},[79,1015,996],{},[14,1017,1018,1019],{},"简单记：",[49,1020,1021],{},"需要长时间并行、不想频繁切换上下文的场景，用 Worktree。",[1023,1024],"hr",{},[14,1026,1027],{},[49,1028,1029],{},"Worktree 之于 Git，就像多车道之于单行道。车还是那些车，路宽了就不堵了。",[14,1031,1032],{},"AI 编程工具越来越快，但如果你的工作流一次只允许它干一件事，再快的 AI 也帮不了你太多。把路拓宽，让每个 AI 都有自己的车道，这可能是当前 AI 开发效率中最容易被忽略的优化点。",[1034,1035,1036],"style",{},"html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":316,"searchDepth":317,"depth":317,"links":1038},[1039,1040,1041,1046,1047,1048],{"id":395,"depth":320,"text":396},{"id":424,"depth":320,"text":425},{"id":493,"depth":320,"text":494,"children":1042},[1043,1044,1045],{"id":498,"depth":317,"text":498},{"id":618,"depth":317,"text":619},{"id":723,"depth":317,"text":724},{"id":836,"depth":320,"text":837},{"id":875,"depth":320,"text":875},{"id":946,"depth":320,"text":947},"2026-04-20","用 Git Worktree 实现 AI 并行开发：多个 AI 会话同时改代码不冲突，团队多分支开发自由切换",[1052,1055,1058,1061],{"q":1053,"a":1054},"用 AI 写代码时，怎么同时推进多个需求而不互相冲突？","核心思路是让每个 AI 会话在物理上隔离的目录中工作。用 Git Worktree 为每个需求创建独立的工作目录和分支，每个 AI 会话打开各自的目录，文件系统层面就不会打架。改完后回到主分支正常合并即可，冲突只会是逻辑层面的，而非两个 AI 互相覆盖造成的混乱。",{"q":1056,"a":1057},"AI 改代码等待时间长，有什么方法能提高开发效率？","最直接的方法是并行化：把待开发的需求拆成独立任务，用 Git Worktree 为每个任务开一个独立目录和分支，同时开多个 AI 会话分别处理。等待 A 任务时，B、C 任务也在推进，整体效率可以提升数倍。关键前提是任务之间在文件系统层面隔离，避免共用工作目录。",{"q":1059,"a":1060},"团队开发时，AI 怎么在多个 feature 分支之间并行工作？","传统做法是 git checkout 频繁切分支，但每次切换 AI 都会丢失上下文。更好的方式是用 Git Worktree 为每个 feature 分支创建独立目录，每个目录可以长期存在、各自独立提交和推送。这样 AI 在不同目录中各自开发，不需要切分支，也不会互相干扰，开发完成后各自合并到主分支即可。",{"q":1062,"a":1063},"Git Worktree 会不会占用很多磁盘空间？和 clone 多份仓库有什么区别？","几乎不会。Worktree 与主仓库共享同一份 Git 对象数据库（提交历史、文件快照等），每个新目录只多了当前分支的工作文件副本。而 clone 会完整复制整个仓库数据，空间翻倍。此外 Worktree 的远程配置、钩子等也全部共享，不会出现多份仓库配置不一致的问题。",{},"\u002Farticles\u002Fgit-worktree-ai-parallel-dev",{"title":367,"description":1050},[1068,1069,1070,1071,1072,1073,1074],"Git Worktree","AI 并行开发","Git 多分支开发","AI 编程冲突","Cursor Parallel Agents","AI 编程效率","Git 工作树","articles\u002Fgit-worktree-ai-parallel-dev","AI 不是不够快，是你的工作流只允许它一次干一件事。Git Worktree 让同一个仓库同时打开多个工作目录，每个 AI 在独立目录和分支上开发，互不干扰。",[361,1078],"独立开发","yYg8aswtxrbGGSYDc_AEd1F_BU3u7hO5EEM8z1NDRog",{"id":1081,"title":1082,"body":1083,"cover":1116,"date":1238,"description":1239,"draft":329,"extension":330,"faq":1240,"featured":329,"meta":1253,"navigation":345,"path":1254,"readingTime":347,"seo":1255,"seoKeywords":1256,"stem":1265,"summary":1266,"tags":1267,"type":362,"updated":363,"video":363,"__hash__":1269},"articles\u002Farticles\u002Fbe-the-minority-in-ai-era.md","AI 干完了普通人能干的活，我们是时候去发展成少数派了",{"type":8,"value":1084,"toc":1231},[1085,1090,1094,1097,1103,1112,1117,1123,1127,1130,1136,1139,1143,1151,1161,1164,1167,1171,1174,1180,1183,1186,1189,1192,1219,1222,1228],[11,1086,1087],{},[14,1088,1089],{},"当 AI 做完了所有人都能做的事，剩下的机会只属于少数派。",[18,1091,1093],{"id":1092},"一个模型强到不敢公开","一个模型，强到不敢公开",[14,1095,1096],{},"2026 年 4 月，Anthropic 发布了一个新模型 Claude Mythos Preview，但没有面向公众开放。他们做了一件不寻常的事：通过一个叫 Project Glasswing 的计划，把模型优先提供给科技公司和开源维护者，让他们先修掉历史遗留的安全漏洞。",[14,1098,1099,1100],{},"为什么不敢直接放出来？因为这个模型在安全领域的能力跳了一个台阶。上一代模型像一个认真的实习生，你指哪它查哪，偶尔能帮你挑出几个拼写错误。",[49,1101,1102],{},"而 Mythos 更像一个干了二十年的老师傅，你把代码丢给它，它自己翻完几千个文件，第二天早上递给你一份报告：这里有个洞，存在 27 年了，所有人都没发现，顺便我写好了修复方案。",[14,1104,1105,1106,1111],{},"这不是实验室数据。",[279,1107,1110],{"href":1108,"rel":1109},"https:\u002F\u002Fred.anthropic.com\u002F2026\u002Fmythos-preview\u002F",[283],"它在两周内发现"," 了 Firefox 浏览器 22 个漏洞，找到了 OpenBSD 一个存在 27 年的 TCP 协议漏洞，找到了 FFmpeg 一个存在 16 年的视频编解码漏洞。这些都是全球顶级安全研究员长年没发现的问题。",[14,1113,1114],{},[55,1115],{"alt":316,"src":1116},"\u002Fa\u002Fbe-the-minority-in-ai-era\u002FFRT-Blog-Chart-CMP-Firefox-exploit.png",[14,1118,1119,1120],{},"这都指向了一个趋势：",[49,1121,1122],{},"至少在软件工程层面，AI 已经把「普通人能做到的」全部做到了，甚至开始侵入「专家才能做到的」领域。",[18,1124,1126],{"id":1125},"不止软件各行业的普通工序正在被接管","不止软件：各行业的「普通工序」正在被接管",[14,1128,1129],{},"这不是只发生在程序员身上。麦肯锡的报告估计，生成式 AI 可把员工 60-70% 工作自动化掉，在客户运营、营销、软件工程和研发四个领域局势更加紧迫。法律行业的合同审阅、医疗的影像诊断、金融的报告生成、影视的剪辑和特效，都在被快速接管。",[14,1131,1132,1133],{},"共性很明显：",[49,1134,1135],{},"凡是有标准流程、有历史数据可学、有「正确答案」可对照的工序，AI 都能学会，而且会越来越快。",[14,1137,1138],{},"问题来了，我们能怎么办？",[18,1140,1142],{"id":1141},"回到模型的训练目标它到底在替代什么类型的人","回到模型的训练目标：它到底在替代什么类型的人？",[14,1144,1145,1146,1150],{},"两年前我写过一篇 ",[279,1147,1149],{"href":1148},"\u002Farticles\u002Fhuman-with-llm","大模型下的生存之道","，从模型训练目标的角度分析过这个问题。核心逻辑今天依然成立，而且更紧迫了：",[14,1152,1153,1154,1157,1158,130],{},"模型最核心的优化目标是预测准确性，减小与现实世界的误差，并且要足够通用、足够泛化，不要过拟合。翻译成白话：",[49,1155,1156],{},"模型要懂各行各业的共识和通用做法，不要钻牛角尖","。麦肯锡在谈不可替代的人类特质时也点到了类似的东西：",[49,1159,1160],{},"本能、直觉、想象力、正直、身份认同，这些全是「无法被大数据平均化」的能力",[14,1162,1163],{},"所以模型天然擅长替代的是通用型输出。而那些带有独特思考角度、独特审美判断、独特经历积淀的人，恰恰是模型不会也不可能替代的。因为要「拟合」一个少数派，模型需要针对你一个人的数据过拟合，这在训练逻辑上没有意义，在资源投入上也不划算。",[14,1165,1166],{},"\"异常数据\"对模型的通用性伤害是很大的，所以成为\"异常数据\"，或者说成为少数派，就是我们必要做的事情了。",[18,1168,1170],{"id":1169},"少数派长什么样","少数派长什么样？",[14,1172,1173],{},"影视行业，AI 能剪辑、能做特效，但诺兰拍《星际穿越》，科幻只是外壳，内核是他自己对亲情和时间的理解，这种东西没有数据集能喂出来。",[14,1175,1176],{},[55,1177],{"alt":1178,"src":1179},"诺兰与他独特的时间叙事","\u002Fa\u002Fbe-the-minority-in-ai-era\u002FNolan.webp",[14,1181,1182],{},"产品领域，竞品分析 AI 都能出，但能从细分人群的真实痛苦中定义新方向的产品经理，模型学不来。写作领域，通稿 AI 写得又快又好，但带着你亲身经历和价值立场的文章，无法被平均化。教育领域，知识传递 AI 全能干，但能激发学生找到自己路径的导师，是另一回事。",[14,1184,1185],{},"这些人的共性不是「比 AI 更聪明」，而是「输出里带着只有他们才有的东西」。",[18,1187,1188],{"id":1188},"是时候行动了",[14,1190,1191],{},"如果你看到这里，不妨问自己三件事：",[1193,1194,1195,1201,1207,1213],"ol",{},[184,1196,1197,1200],{},[49,1198,1199],{},"我喜欢什么？"," - 了解你自己",[184,1202,1203,1206],{},[49,1204,1205],{},"我擅长做什么？"," - 找到你和别人不同的点",[184,1208,1209,1212],{},[49,1210,1211],{},"我经历过什么？"," - 回忆那些只有你走过的路，踩过的坑，它们就是模型没见过的训练数据",[184,1214,1215,1218],{},[49,1216,1217],{},"我能把这些变成什么？"," - 把独特性转化成别人愿意买单的输出，而不是藏在心里",[14,1220,1221],{},"然后把这种「少数派」价值放大到极致。不是说不学通用技能，而是在通用技能被模型拉平之后，你拿出来的那个东西，必须是模型再强也没法模仿的。",[14,1223,1224,1225],{},"这就是大模型时代的生存策略。两年前我用「反泛化」「反效率」来描述这件事，今天我想换一个更直接的词：",[49,1226,1227],{},"成为少数派。",[14,1229,1230],{},"你觉得自己的「少数派」特质是什么？欢迎留言聊聊。",{"title":316,"searchDepth":317,"depth":317,"links":1232},[1233,1234,1235,1236,1237],{"id":1092,"depth":320,"text":1093},{"id":1125,"depth":320,"text":1126},{"id":1141,"depth":320,"text":1142},{"id":1169,"depth":320,"text":1170},{"id":1188,"depth":320,"text":1188},"2026-04-10","当 AI 模型强到连安全专家的活都接了，普通人凭什么不被替？从模型训练目标出发，理解你的独特性为何不可被拟合。",[1241,1244,1247,1250],{"q":1242,"a":1243},"为什么说 AI 已经干完了普通人能干的活？","以 Anthropic 最新发布的模型为例，它在两周内找到了安全专家可能花数年才能发现的软件漏洞，包括存在 27 年都没被人发现的问题。这说明在很多专业领域，AI 的能力已经越过了普通从业者甚至部分专家的门槛。",{"q":1245,"a":1246},"模型的训练目标和普通人被替代有什么关系？","模型的核心训练目标是预测准确、泛化性强、不过拟合。翻译成白话就是：学会多数人的共识和通用做法，不要钻牛角尖。所以模型天然擅长替代的是通用型工作，而非带有独特视角的判断。",{"q":1248,"a":1249},"什么样的人不容易被 AI 替代？","拥有独特经历、独特视角、独特判断的人。比如有深度审美表达的导演、能从细分人群真实痛苦中定义方向的产品经理、能在复杂病例中做出综合判断的临床医生。他们的共性是：输出无法被大数据平均化。",{"q":1251,"a":1252},"普通人现在应该怎么做？","问自己三个问题：我和多数同行到底有什么不同？我过往哪些经历是别人没有的？这些独特性能否变成我的核心输出？然后把这种少数派价值放大到极致，让模型再强也无法模仿你。",{},"\u002Farticles\u002Fbe-the-minority-in-ai-era",{"title":1082,"description":1239},[1257,1258,1259,1260,1261,1262,1263,1264],"AI 替代","少数派","模型泛化","独特性","职场生存","Claude Mythos","反泛化","人机共处","articles\u002Fbe-the-minority-in-ai-era","AI 的训练目标是最大公约数：足够通用、足够准确、覆盖多数人能做的事。当它真的做到了，剩下的机会只属于那些不在公约数里的人。成为少数派，不是口号，是生存策略。",[360,1268],"学习方法","-rNFJimMfpyud8IuExfCzUrOaNjaGxhk6Wq9DF5IT_g",{"id":1271,"title":1272,"body":1273,"cover":1285,"date":1413,"description":1414,"draft":329,"extension":330,"faq":1415,"featured":329,"meta":1428,"navigation":345,"path":1429,"readingTime":591,"seo":1430,"seoKeywords":1431,"stem":1440,"summary":1441,"tags":1442,"type":362,"updated":363,"video":363,"__hash__":1443},"articles\u002Farticles\u002Fai-assisted-work-busy.md","AI 加持我的办公后，活没变少，只是换了一种忙法：普通打工人的真实处境",{"type":8,"value":1274,"toc":1405},[1275,1280,1286,1290,1293,1299,1303,1306,1309,1312,1319,1325,1329,1341,1345,1354,1358,1361,1392,1399,1402],[11,1276,1277],{},[14,1278,1279],{},"AI 能替你生成一版东西，看似你轻松了，但 \"忙碌\" 只是从手换到了眼和脑：审查、对齐、防跑偏。",[14,1281,1282],{},[55,1283],{"alt":1284,"src":1285},"封面：左右对比，想象中的轻松与真实的心力交瘁","\u002Fa\u002Fai-assisted-work-busy\u002Fcover.png",[18,1287,1289],{"id":1288},"处境产物不放心时间花在兜底上","处境：产物不放心，时间花在兜底上",[14,1291,1292],{},"这两年，很多人让 AI 帮忙写材料、出方案、vibe coding、整理纪要。人做的活确实「被干掉了一些」，可越深入使用 AI，我们心里很难松下来：产物不放心，怕跑偏、怕漏条件、怕和真实业务对不上，只好再花精力逐条审查、改口径、拉人确认。",[14,1294,1295,1296],{},"就连老板也说：既然有 AI 加持，你们都可以用更短的时间给我结果了。而这也导致活反而增多、响应和对齐频率反而越快。落到个体身上，就变成了：",[49,1297,1298],{},"明明有了 AI，为什么我感觉更累了！",[18,1300,1302],{"id":1301},"历史里早有先例凯恩斯杰文斯与忙的另一副脸","历史里早有先例：凯恩斯、杰文斯与「忙的另一副脸」",[14,1304,1305],{},"要把这种处境说清楚，就得往历史上看一眼：人类不止一次幻想着「生产率提升后，普通人会因此变闲」，但结果忙碌只是换了形态，继续挤压打工人的时间。下面用很短的理论视角，把这种「似曾相识」说清楚。",[14,1307,1308],{},"1930 年，凯恩斯在《我们孙辈的经济可能性》里展望过：随着资本积累与技术进步，人类可能在百年尺度上大幅缩短劳动时间，「经济问题」缓解之后，人们会关注如何善用闲暇。后来常被拿来对照现实：生产力确实上去了，人们的闲暇预期却没有完全按剧本发生。",[14,1310,1311],{},"另一条线更早：十九世纪杰文斯在《煤炭问题》里指出，蒸汽机提高燃煤效率后，煤的有效成本下降，用途扩张，煤炭总消耗反而可能上升，即常说的「杰文斯悖论」。它常被用来提醒：单位效率提升，不自动等于负担或资源消耗的净减少，总需求可能跟着反弹。",[14,1313,1314,1315,1318],{},"把两条并到今天的 AI 上就变成：",[49,1316,1317],{},"一边是「闲下来」的历史预期，一边是「变便宜之后总用量与总协调量上升」的机制","，都指向同一类经验，省下来的未必自动是你的休息，而可能是下一轮需求、生产与扯皮。",[14,1320,1321],{},[55,1322],{"alt":1323,"src":1324},"历史隐喻：凯恩斯与杰文斯对话","\u002Fa\u002Fai-assisted-work-busy\u002Fhistory-metaphor.png",[18,1326,1328],{"id":1327},"产业快人也被链上带着跑","产业快，人也被链上带着跑",[14,1330,1331,1332,1340],{},"再看一眼产业结构。中国制造业与数字业在若干区域高度集聚，上下游近、配套快，世行与国研中心在讨论创新与产业升级时，也强调集群、供应链效率与迭代节奏（可参考联合报告 ",[1333,1334,1335],"em",{},[279,1336,1339],{"href":1337,"rel":1338},"https:\u002F\u002Fdocuments1.worldbank.org\u002Fcurated\u002Fen\u002F720491585668929282\u002Fpdf\u002FInnovative-China-New-Drivers-of-Growth.pdf",[283],"Innovative China: New Drivers of Growth"," ）。对普通打工人而言，可感知的推论很直白：东西做得越快、版本跟得越密，个人越容易被整条链带着跑。这不是一句「产业强你就轻松」，而是「快」往往同步变成更多会议、迭代、对齐和救火。它和前面说的 AI 新负担叠在一起，就更容易出现「活没少，只是换了一种忙法」。",[18,1342,1344],{"id":1343},"当下agent-skill-与最后一道质检","当下：Agent Skill 与「最后一道质检」",[14,1346,1347,1348,1353],{},"当下还有一个能刷到的趋势：给 AI Agent 做 Skill，把经验甚至协作习惯固化成可复用能力。GitHub 上的开源项目 ",[279,1349,1352],{"href":1350,"rel":1351},"https:\u002F\u002Fgithub.com\u002Ftitanwings\u002Fcolleague-skill",[283],"同事.skill"," 获得很高关注，用聊天记录、文档等把「某位同事」的风格与工作方式蒸馏成 Skill。它像段子，也反映真实痛点：人走了，上下文和锅还在，总得用新方式接。Agent 越多、Skill 越细，协调与验收越显性，人越像流水线上最后一道质检。",[18,1355,1357],{"id":1356},"借鉴过往效率革命之后人通常怎么换技能","借鉴过往：效率革命之后，人通常怎么换技能",[14,1359,1360],{},"每一次大的效率提升，活并没有 magically 消失，而是从一类动作挪到另一类能力。工业革命里，手作让位给机器与流水线，人的价值更多落在规程、质检与协作上；办公自动化以后，「会打字」贬值，会定义问题、会审读、会跨部门对齐升值。和今天对照，普通打工人可以刻意往这几条靠：",[1193,1362,1363,1370,1376,1382],{},[184,1364,1365,1366,1369],{},"从「亲手做完」转向「定标准、做验收」",[1367,1368],"br",{},"\n过去工人要学的是对准图纸和公差；你现在要学的是什么叫一版能交付的 AI 输出，哪些必须人肉终审，哪些可以放手，把「验收清单」写进自己和协作方的预期里。",[184,1371,1372,1373,1375],{},"从「单点产出」转向「写清边界、防跑偏」",[1367,1374],{},"\n产业集聚带来的是链上同步；AI 带来的是模型不确定性。两边叠在一起，把需求、风险、责任写清楚的能力，比「会催模型多生成几版」更保值。",[184,1377,1378,1379,1381],{},"从「会用一个工具」转向「会管一条人机流水线」",[1367,1380],{},"\n历史上新工具普及后，吃香的不是只会按电钮的人，而是能排产、能排错、能升级工艺的人。对应到今天：会拆任务、会选何时人介入、会迭代 Skill 与提示词，比单纯「会用某个 AI」更经得起老板加量。",[184,1383,1384,1385,1387,1388,1391],{},"主动划界，学一点「反榨干」的历史经验",[1367,1386],{},"\n工时与节奏从来不是自然变合理的，而是一边技术一边博弈出来的。个人层面也一样：",[49,1389,1390],{},"别默认「效率工具」会自动还你生活","；哪些会不必为模型多开一轮，哪些时间必须留给离线思考，需要自己站出来说。",[14,1393,1394,1395,1398],{},"这篇文章不是劝你不用 AI，而是说：",[49,1396,1397],{},"看清忙碌换了形态，才有意识地换技能、换谈判筹码。"," 否则，审输出、对齐、学新工具的时间，仍会把日历填满。",[18,1400,1401],{"id":1401},"写在最后",[14,1403,1404],{},"你怎么看？最近多出来的是真正的空档，还是多出来的审查和预期？欢迎留言里聊一句。",{"title":316,"searchDepth":317,"depth":317,"links":1406},[1407,1408,1409,1410,1411,1412],{"id":1288,"depth":320,"text":1289},{"id":1301,"depth":320,"text":1302},{"id":1327,"depth":320,"text":1328},{"id":1343,"depth":320,"text":1344},{"id":1356,"depth":320,"text":1357},{"id":1401,"depth":320,"text":1401},"2026-04-07","AI 代劳后产物需审查对齐，老板预期加码与外行误读并存；借凯恩斯、杰文斯与产业集聚视角理解「忙碌换形态」。",[1416,1419,1422,1425],{"q":1417,"a":1418},"为什么说用了 AI 以后活没有变少？","省掉的多是某一环节的动手时间，但审阅模型输出、对齐业务口径、防止跑偏和幻觉、以及和上下游确认责任边界，这些成本会显性化。总任务量还可能因为老板预期提高而增加。",{"q":1420,"a":1421},"老板和没用透 AI 的人为什么会有误解？","没深度用过的人往往把 AI 想象成「自动完工」，容易说「有了 AI 不就省力了吗」。管理者则可能把效率红利理解成产能上限提高，默认你能承接更多需求。两种视角都容易低估人的审查与协调负担。",{"q":1423,"a":1424},"凯恩斯与杰文斯能帮普通打工人理解什么？","凯恩斯曾展望生产力提高后人类可能有更多闲暇，但现实里消费、比较与工作身份会重新占满时间。杰文斯悖论则说明效率提高后，总用量可能反弹。用来类比 AI：变便宜的不自动等于你个人更轻松。",{"q":1426,"a":1427},"产业集聚和打工人的忙有什么关系？","集群与供应链效率高时，迭代与反馈更快，个人节奏更容易被整条链带着走。这不是说产业不强人就轻松，而是「快」常常同步转化为更多对齐、联调和救火，与 AI 带来的新负担叠在一起。",{},"\u002Farticles\u002Fai-assisted-work-busy",{"title":1272,"description":1414},[1432,1433,1434,1435,1436,1437,1438,1439],"AI 办公","职场 AI","Agent Skill","人机协作","杰文斯悖论","凯恩斯闲暇","产业集聚","打工人","articles\u002Fai-assisted-work-busy","AI 能代劳一部分产出，但署名与责任仍在人身上；审查、对齐与预期管理消耗大量精力。历史上效率提升未必带来普遍闲暇，产业集聚还会加快迭代节奏，忙碌往往只是换了形态。",[361,360],"gAj-TwWK72CC9eS-hd_Zl0n19CGUYR7oXVhrhwr2FPs",{"id":1445,"title":1446,"body":1447,"cover":1718,"date":1719,"description":1720,"draft":329,"extension":330,"faq":1721,"featured":329,"meta":1734,"navigation":345,"path":1735,"readingTime":557,"seo":1736,"seoKeywords":1737,"stem":1744,"summary":1453,"tags":1745,"type":362,"updated":363,"video":363,"__hash__":1747},"articles\u002Farticles\u002Fagent-cli-vs-gui.md","对 Agent 操作 GUI 说不：从 CLI-Anything 看软件交互的下一步",{"type":8,"value":1448,"toc":1711},[1449,1454,1457,1463,1466,1469,1477,1480,1484,1490,1497,1502,1510,1516,1520,1523,1526,1532,1538,1544,1551,1557,1561,1564,1571,1574,1618,1621,1624,1630,1633,1638,1641,1655,1658,1662,1665,1670,1673,1687,1690,1694,1700,1705,1708],[11,1450,1451],{},[14,1452,1453],{},"GUI 是给人类设计的'慢接口'，AI Agent 需要直达操作层的'快通道'。CLI 化适合成熟稳定软件，Scripts 方案更适合迭代灵活的项目。",[14,1455,1456],{},"GitHub 上港大团队开源的 CLI-Anything，两周之内涨到两万多 Stars。它做的事情用一句话概括：把任何桌面软件变成命令行工具，让 AI Agent 可以直接操作。",[14,1458,1459],{},[55,1460],{"alt":1461,"src":1462},"cli-anything","\u002Fa\u002Fagent-cli-vs-gui\u002Fcli-anything.png",[14,1464,1465],{},"一个命令行工具，为什么能引发这么大的关注？",[14,1467,1468],{},"因为 AI 要给我们干活完成任务，无非有两种方式：",[1193,1470,1471,1474],{},[184,1472,1473],{},"AI 自己看着页面操作",[184,1475,1476],{},"AI 通过命令行，不用看界面，就能用命令文本操作",[14,1478,1479],{},"而现在的大模型，在文本处理上的能力远远大于图片理解的能力。所以，越来越多人意识到，给 AI 一个带界面的软件，它觉得更难用，也更难给你一个好结果。反倒是让他用代码的思维通过命令行执行软件，对它而言就简单多了。",[18,1481,1483],{"id":1482},"为什么说让-agent-操作图形界面是弯路","为什么说让 Agent 操作图形界面是弯路？",[14,1485,1486,1487],{},"OpenClaw 的创始人 Peter Steinberger 说过一个很精辟的判断：",[49,1488,1489],{},"App 本质上是一个 Slow API。",[14,1491,1492,1493,1496],{},"什么意思？人需要界面，是因为可以高效利用视觉信息处理问题。但现在的 AI 更擅长文本处理，它只需要知道有一个 ",[79,1494,1495],{},"export"," 命令可以调用就能高效完成任务。所以压根不需要让 AI 像人类一样看页面。",[14,1498,1499],{},[49,1500,1501],{},"GUI 是给人类设计的\"慢接口\"，而 AI Agent 需要的是直接触达操作层的\"快通道\"。",[14,1503,1504,1505,1509],{},"这也是我在",[279,1506,1508],{"href":1507},"\u002Farticles\u002Fagent-ui","上一篇文章","中分享的实践：给产品加 AI 入口时，我没有让 AI 去操作前端界面，而是直接把后端 API 接给了 AI Agent。效果立竿见影——以前运营找人跑数据要半天，现在对话框里说一句话，AI 直接调接口出结果。",[14,1511,1512,1513],{},"CLI-Anything 爆火的逻辑和这个一模一样：",[49,1514,1515],{},"把 可视化界面 拿走，直接暴露底层操作能力给 Agent。",[18,1517,1519],{"id":1518},"也不是一切都要-cli-命令化","也不是一切都要 CLI 命令化",[14,1521,1522],{},"CLI-Anything 的思路是对的——分析源码，自动生成结构化的 CLI 命令，让 Agent 用确定性的方式调用软件功能。比操作 GUI 稳定得多，高效得多。",[14,1524,1525],{},"但我在项目中集成 CLI-Anything 时，我发现了现实的局限性：",[14,1527,1528,1531],{},[49,1529,1530],{},"1. 它需要源码","，闭源商业软件走不通。",[14,1533,1534,1537],{},[49,1535,1536],{},"2. 它需要接口稳定","，软件快速迭代时 CLI 版本很快就会脱节。",[14,1539,1540,1543],{},[49,1541,1542],{},"3. 它受限于预定义命令","，Agent 只能做命令集里有的事，遇到新需求就得重新生成。",[14,1545,1546,1547,1550],{},"所以 CLI 化最适合的场景是：",[49,1548,1549],{},"开源、版本稳定、操作模式固定的软件","——FFmpeg、Blender、成熟的开发工具链这类。接口不怎么变，CLI 化后长期可用。",[14,1552,1553,1554],{},"而对于迭代快、需求灵活多变的产品，转化成 CLI 可能会产生不少副作用。所以，我们决定：",[49,1555,1556],{},"不是所有软件都要 CLI 化，而是根据软件的特性选择最合适的方案。",[18,1558,1560],{"id":1559},"有没有比固定-cli-更灵活的-agent-集成方式","有没有比固定 CLI 更灵活的 Agent 集成方式？",[14,1562,1563],{},"通常我们可以将 CLI 等可由 Agent 执行的逻辑做成一个 Agent Skill。在我们公司的实际项目中，除了 CLI 化，我们也可以直接考虑 Agent Skill 中的原生 Scripts 标准。",[14,1565,1566,1567,1570],{},"简单说，就是不把能力打包成固定的 CLI 命令，而是把底层的操作脚本直接放在 Skill 中的 ",[79,1568,1569],{},"scripts\u002F"," 目录下，让 Agent 自己去读、去理解、去组合调用。",[14,1572,1573],{},"举个例子。假设你有一个数据处理项目，CLI 化后可能生成这样的命令：",[436,1575,1577],{"className":501,"code":1576,"language":503,"meta":316,"style":316},"data-tool export --format csv --date-range 2026-01-01:2026-03-24\ndata-tool analyze --metric retention --group channel\n",[79,1578,1579,1599],{"__ignoreMap":316},[507,1580,1581,1584,1587,1590,1593,1596],{"class":509,"line":510},[507,1582,1583],{"class":519},"data-tool",[507,1585,1586],{"class":523}," export",[507,1588,1589],{"class":579}," --format",[507,1591,1592],{"class":523}," csv",[507,1594,1595],{"class":579}," --date-range",[507,1597,1598],{"class":523}," 2026-01-01:2026-03-24\n",[507,1600,1601,1603,1606,1609,1612,1615],{"class":509,"line":320},[507,1602,1583],{"class":519},[507,1604,1605],{"class":523}," analyze",[507,1607,1608],{"class":579}," --metric",[507,1610,1611],{"class":523}," retention",[507,1613,1614],{"class":579}," --group",[507,1616,1617],{"class":523}," channel\n",[14,1619,1620],{},"这些命令好用，但只能做预定义好的事情。如果运营突然说\"我要把导出的数据按渠道分组，再和另一张表交叉分析\"，而这个组合操作没有对应的 CLI 命令，Agent 就卡住了。",[14,1622,1623],{},"Scripts 方案不一样。你提供的不是固定命令，而是一组可组合的脚本能力：",[436,1625,1628],{"className":1626,"code":1627,"language":441},[439],"scripts\u002F\n  export_data.py      # 导出数据\n  analyze_metric.py   # 分析指标\n  cross_join.py       # 交叉关联\n  format_report.py    # 格式化报告\n",[79,1629,1627],{"__ignoreMap":316},[14,1631,1632],{},"Agent 拿到这些脚本后，可以自己写代码把它们串起来，灵活组合成任何它需要的工作流。接口变了？Agent 直接读最新的脚本，自己适配。需求没见过？Agent 自己写一段胶水代码，把现有脚本能力拼装成新方案。",[14,1634,1635],{},[49,1636,1637],{},"CLI 是一个\"定型的工具包\"——像一套固定菜单，Agent 只能点菜单上有的。Scripts 是一个\"食材库\"——Agent 可以自己看食材、自己搭配、自己炒菜。",[14,1639,1640],{},"这两种方式的适用场景也很清晰：",[181,1642,1643,1649],{},[184,1644,1645,1648],{},[49,1646,1647],{},"软件成熟、接口稳定"," → CLI 化更好。命令固化下来，调用确定、行为可控、维护成本低。",[184,1650,1651,1654],{},[49,1652,1653],{},"项目在迭代、需求灵活"," → Scripts 方案更好。Agent 自由度高，能跟上变化，覆盖面更广。",[14,1656,1657],{},"它们不是谁替代谁的关系，而是不同阶段、不同场景下的最优选择。",[18,1659,1661],{"id":1660},"为什么说软件正在长出第二个入口","为什么说软件正在长出「第二个入口」？",[14,1663,1664],{},"不管是 CLI 化、Scripts 方案，还是我之前做的\"给产品加 AI 对话入口\"，本质上都在做同一件事：",[14,1666,1667],{},[49,1668,1669],{},"给软件开一个专门给 Agent 用的入口。",[14,1671,1672],{},"这意味着未来的软件设计可能会自然地分化出两条通道：",[181,1674,1675,1681],{},[184,1676,1677,1680],{},[49,1678,1679],{},"人走前门","：GUI，图形界面，视觉交互——感知友好，体验优先",[184,1682,1683,1686],{},[49,1684,1685],{},"Agent 走快通道","：CLI \u002F API \u002F Scripts——效率优先，结构化调用",[14,1688,1689],{},"这不是二选一，而是双轨并行。就像一栋大楼，顾客走大堂电梯，货物走后勤通道。各走各的路，各有各的效率。",[18,1691,1693],{"id":1692},"核心不是形式而是思路的转变","核心不是形式，而是思路的转变",[14,1695,1696,1697],{},"CLI-Anything 的爆火，表面上是一个开源项目的成功。但更深层的信号是：",[49,1698,1699],{},"整个行业正在意识到，软件和 AI Agent 之间的交互方式需要被重新设计。",[11,1701,1702],{},[14,1703,1704],{},"别让 Agent 操作界面了，给它一个直达操作层的快通道。",[14,1706,1707],{},"这个趋势已经悄然发生。",[1034,1709,1710],{},"html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":316,"searchDepth":317,"depth":317,"links":1712},[1713,1714,1715,1716,1717],{"id":1482,"depth":320,"text":1483},{"id":1518,"depth":320,"text":1519},{"id":1559,"depth":320,"text":1560},{"id":1660,"depth":320,"text":1661},{"id":1692,"depth":320,"text":1693},"\u002Fa\u002Fagent-cli-vs-gui\u002Fcover.png","2026-03-24","CLI-Anything 爆火背后的思考：GUI 是给人设计的慢接口，Agent 需要的是直接触达操作层的快通道",[1722,1725,1728,1731],{"q":1723,"a":1724},"为什么不应该让 AI Agent 操作图形界面？","GUI 本质上是为人类视觉设计的'慢接口'，而当前 AI 在文本处理上的能力远强于图片理解。让 AI 看界面操作就像让一个盲人通过翻译看画一样低效，直接给它 CLI 命令或 API 接口才是高效路径。",{"q":1726,"a":1727},"CLI 化和 Scripts 方案分别适合什么场景？","CLI 化适合开源、版本稳定、操作模式固定的软件（如 FFmpeg、Blender），命令固化后长期可用。Scripts 方案适合迭代快、需求灵活的项目，Agent 可以自由组合脚本能力，像'食材库'一样灵活搭配，而非只能点固定菜单。",{"q":1729,"a":1730},"CLI-Anything 为什么能在 GitHub 上两周涨到两万 Stars？","因为它精准击中了一个行业共识：AI Agent 需要直达软件操作层的快通道。它把任何桌面软件变成命令行工具，让 Agent 用文本指令而非截图理解来操作软件。这背后的信号是——整个行业正在意识到软件和 AI Agent 之间的交互方式需要被重新设计。",{"q":1732,"a":1733},"未来软件设计会怎样适应 AI Agent？","软件会自然分化出两条通道：人走前门（GUI 图形界面，感知友好，体验优先），Agent 走快通道（CLI\u002FAPI\u002FScripts，效率优先，结构化调用）。就像一栋大楼，顾客走大堂电梯，货物走后勤通道——各走各的路，各有各的效率。",{},"\u002Farticles\u002Fagent-cli-vs-gui",{"title":1446,"description":1720},[1738,1739,1740,1741,1742,1434,1743],"AI Agent 交互","CLI-Anything","GUI vs CLI","Agent 操作软件","AI 自动化","软件设计趋势","articles\u002Fagent-cli-vs-gui",[360,361,1746],"产品思考","xJvuVoGgnu9mzPPrbB-Xd7-rDXRJIhOXklJQQvS1HtQ",{"id":1749,"title":1750,"body":1751,"cover":1775,"date":1929,"description":1930,"draft":329,"extension":330,"faq":1931,"featured":329,"meta":1944,"navigation":345,"path":1507,"readingTime":347,"seo":1945,"seoKeywords":1946,"stem":1954,"summary":1757,"tags":1955,"type":362,"updated":363,"video":363,"__hash__":1956},"articles\u002Farticles\u002Fagent-ui.md","给产品装了个 AI 入口，砍掉了一半待开发需求",{"type":8,"value":1752,"toc":1922},[1753,1758,1761,1764,1767,1770,1776,1780,1783,1789,1792,1798,1801,1807,1810,1813,1817,1820,1823,1828,1831,1834,1837,1842,1846,1849,1852,1855,1858,1864,1871,1875,1878,1881,1884,1890,1893,1899,1902,1906,1912,1915],[11,1754,1755],{},[14,1756,1757],{},"给产品加一个 AI 对话入口，高频需求做界面、长尾需求交给 AI。不是让 AI 替代产品界面，而是让两个入口各管各的，覆盖面反而更大。",[14,1759,1760],{},"上个月开需求评审会，我干了件让团队有点吃惊的事。",[14,1762,1763],{},"需求池里排着十几个待开发的功能，有的已经排了两轮都没排上。我扫了一遍，直接把其中将近一半划掉了。",[14,1765,1766],{},"开发同学愣了：\"这几个需求用户催了好久了，不做了？\"",[14,1768,1769],{},"我说：对，是不需要做成交互页面了。",[14,1771,1772],{},[55,1773],{"alt":1774,"src":1775},"封面图","\u002Fa\u002Fagent-ui\u002Fcover.png",[18,1777,1779],{"id":1778},"那些需求去哪了","那些需求去哪了？",[14,1781,1782],{},"你肯定有过这种经历：在 App 里想干一件事，翻遍菜单就是找不到入口，最后只能找客服，用大白话说一句需求，等人帮你操作。那个客服，其实就是\"人肉版的 AI 对话入口\"。",[14,1784,1785,1786],{},"我的场景也一样。我负责一个互联网产品，运营团队每天都在提各种非标需求：查某天某渠道的数据、分析两个活动的交叉效果、把几张表拼在一起找趋势。",[49,1787,1788],{},"每个都合理，每个都不通用。",[14,1790,1791],{},"这类需求太碎太个性化，不可能每个都做成页面。以前靠人，一来一回快的半天，慢的一周。",[14,1793,1794,1795],{},"后来我做了一件事：",[49,1796,1797],{},"给产品加了一个 AI 对话入口。",[14,1799,1800],{},"我写了一套 AI Agent Skill，把产品后端的 API 接口全部接进去，然后装到 AI agent 里。用户直接在对话框说需求，AI 自己判断调哪些接口、怎么组合、怎么加工，最后把结果直接给到用户。",[14,1802,1803],{},[55,1804],{"alt":1805,"src":1806},"前后端架构图","\u002Fa\u002Fagent-ui\u002Fstructure.png",[14,1808,1809],{},"比如运营想看\"上周新增用户中，同时参与了 A 和 B 活动的人，后续 7 天留存怎么样\"。这种需求产品界面上根本没入口，以前只能找分析师手动跑。现在对话框里说一句话，AI 自动拆解意图、组合接口、交叉处理，不到一分钟直接出结果。",[14,1811,1812],{},"那些被我划掉的需求就是这类。不是不重要，是换了一种方式被满足了。",[18,1814,1816],{"id":1815},"产品怎样长出第二个入口","产品怎样长出第二个入口？",[14,1818,1819],{},"这套东西跑了两个月，我主动让产品长出第二个入口。",[14,1821,1822],{},"以前只有产品界面：点按钮、填表单、看报表。现在在 Web 交互页面之外，多了一个对话框：说人话，AI 帮你搞定。",[14,1824,1825],{},[49,1826,1827],{},"一个产品，两个入口。一个靠界面，一个靠对话。",[14,1829,1830],{},"我在团队内部推了这个思路。现在每来一个新需求，我们都会先问自己一个问题：这个东西，是做成界面上的功能，还是集成到我那个 AI Skill 里？",[14,1832,1833],{},"怎么判断？其实不复杂。",[14,1835,1836],{},"登录、看数据看板、导出报表，这些需求形态固定，人人都用，做成产品界面效率最高。但临时数据查询、定制化分析、跨模块的复杂操作，每个人的需求都不太一样，做页面不划算，对话搞定反而快十倍。",[14,1838,1839],{},[49,1840,1841],{},"高频的活交给界面，长尾的活交给 AI。",[18,1843,1845],{"id":1844},"ai-这么强产品界面还有必要做吗","AI 这么强，产品界面还有必要做吗？",[14,1847,1848],{},"既然 AI 对话这么灵活，干脆全转成 AI 不就完了？产品界面是不是迟早被淘汰？",[14,1850,1851],{},"说实话，我最初也这么想。直到算了一笔账。",[14,1853,1854],{},"你每天看天气，是打开天气 App 扫一眼，还是每次都问 AI？大多数人选前者——打开就有，零成本。换成 AI，每问一次都要理解意图、调接口、组装数据、生成回答。一个人不算什么，一天几百万人这样问，token 成本烧起来很可怕。",[14,1856,1857],{},"道理放到产品里也一样。高频场景下，做一个页面的投入产出比，碾压每次都让 AI 跑一遍。",[14,1859,1860,1861],{},"产品界面不会被取代，原因就俩字：",[49,1862,1863],{},"便宜。",[11,1865,1866],{},[14,1867,1868],{},[49,1869,1870],{},"AI 不会杀死产品界面，成本会决定谁上场。",[18,1872,1874],{"id":1873},"只能对话的-ai-能替代产品界面吗","只能对话的 AI 能替代产品界面吗？",[14,1876,1877],{},"聊到这儿，可能有人会说：有交互界面的产品至少还有一个优势吧？图形化交互、可视化展示，AI 对话做不了这些吧？",[14,1879,1880],{},"一个月前我也这么觉得。",[14,1882,1883],{},"最近我有换房子的想法，顺手做了个看房分析的 Skill。首先在对话框中和它聊天，它先问我置换原因和具体需求，预算多少、通勤多远、学区有没有要求。然后根据这些条件自动筛选小区，直接在一个地图页面上把候选标出来，我就可以通过交互的方式来评估通勤时间、房价、学区评分等。",[14,1885,1886],{},[55,1887],{"alt":1888,"src":1889},"看房分析","\u002Fa\u002Fagent-ui\u002Flook_room.png",[14,1891,1892],{},"AI 一边和我聊天，一边操作页面。谁说 AI 对话只能吐文字？图表、地图、表单，该有的都能有。",[14,1894,1895,1896],{},"所以图形化交互根本不是产品界面的护城河。",[49,1897,1898],{},"真正的分界线，始终是使用频率和成本。",[14,1900,1901],{},"高频场景，投入人力做成固定界面，稳定便宜。长尾场景，AI Skill 灵活组合后端能力，不用排期不用开发。",[18,1903,1905],{"id":1904},"把产品深度-ai-化之后最大感受是什么","把产品深度 AI 化之后，最大感受是什么？",[14,1907,1908,1909],{},"最大的感受就一句话：",[49,1910,1911],{},"AI 不是来革产品的命的，是来帮产品减负的。",[14,1913,1914],{},"标准的高频的，继续做界面。非标的长尾的，交给 AI。两个入口各管各的，反而把产品的覆盖面撑大了。",[11,1916,1917],{},[14,1918,1919],{},[49,1920,1921],{},"能用一句话解决的需求，别用一个页面去承载。",{"title":316,"searchDepth":317,"depth":317,"links":1923},[1924,1925,1926,1927,1928],{"id":1778,"depth":320,"text":1779},{"id":1815,"depth":320,"text":1816},{"id":1844,"depth":320,"text":1845},{"id":1873,"depth":320,"text":1874},{"id":1904,"depth":320,"text":1905},"2026-03-19","AI 对话入口与传统产品界面的双入口模式：高频做界面，长尾交给 AI",[1932,1935,1938,1941],{"q":1933,"a":1934},"AI 对话入口会取代传统产品界面吗？","不会，原因是成本。高频场景下做一个页面的投入产出比远超每次让 AI 跑一遍。就像看天气你会打开 App 扫一眼而不是每次问 AI。产品界面不会被取代，成本会决定谁上场：高频的活交给界面，长尾的活交给 AI。",{"q":1936,"a":1937},"什么样的产品需求适合用 AI 对话入口来满足？","太碎太个性化、不值得做成独立页面的需求。比如临时数据查询、定制化分析、跨模块复杂操作——每个人的需求都不太一样，做页面不划算。AI 自己判断调哪些接口、怎么组合、怎么加工，对话搞定反而快十倍。",{"q":1939,"a":1940},"如何判断一个需求应该做成界面还是交给 AI？","看两个维度：使用频率和标准化程度。登录、看数据看板、导出报表这类高频且形态固定的需求，做界面效率最高。临时数据查询、定制化分析、跨模块复杂操作这类低频且每人不同的需求，交给 AI 对话更合适。高频做界面，长尾交 AI。",{"q":1942,"a":1943},"AI 对话入口只能输出文字吗？","不是。AI 对话同样可以操作图表、地图、表单等交互界面。比如作者做的看房分析 Skill，AI 一边聊天了解需求，一边在地图页面标出候选小区，用户通过交互评估通勤、房价、学区。图形化交互不是产品界面的护城河，真正的分界线是使用频率和成本。",{},{"title":1750,"description":1930},[1947,1948,1949,1950,1951,1952,1953],"AI 对话入口","产品 AI 化","AI Agent Skill","双入口设计","长尾需求","AI 产品设计","高频 vs 长尾","articles\u002Fagent-ui",[360,1746,361],"hsf9qKqBYQXiOHqi1FHIEfDtrtXJYE5N5zVwkfj6TK0",[1958,2134,2483,2685,3300,3442,3677,3975,4247,4433,4661,4849,5087,5428,5597,5700,5837,5979,6168,6256,6381,6642,6731,6830,6963,7149,7313,7454,7624,7773,7907,8082],{"id":1959,"title":1960,"body":1961,"date":2107,"description":2108,"draft":329,"extension":330,"faq":2109,"meta":2119,"navigation":345,"path":2120,"project":2121,"readingTime":535,"seo":2122,"seoKeywords":2123,"stem":2130,"summary":2131,"tags":2132,"updated":363,"__hash__":2133},"builds\u002Fbuilds\u002Fmetool\u002F2026-06-30-online-drum-kit.md","孩子刚开始学架子鼓，我做了个在线版让他在家也能玩",{"type":8,"value":1962,"toc":2100},[1963,1967,1970,1977,1984,1987,1993,1996,2006,2009,2012,2018,2024,2030,2036,2039,2042,2048,2054,2060,2067,2070,2073,2076,2079,2088,2091,2094],[18,1964,1966],{"id":1965},"起因孩子开始学架子鼓了","起因：孩子开始学架子鼓了",[14,1968,1969],{},"我孩子最近在课外班开始学架子鼓。刚入门，正是兴趣最浓的时候——上完课回家还会比划，嘴里念叨着\"动次打次\"。",[14,1971,1972,1973,1976],{},"但架子鼓这东西有个现实问题：",[49,1974,1975],{},"贵、占地方、还吵。"," 一套像样的真鼓几千上万，电子鼓便宜点也要几千块，搬回家放哪都是问题，楼上楼下还得忍受咚咚声。对一个刚开始学、还不确定能坚持多久的孩子来说，一上来就砸钱买设备，风险太大。",[14,1978,1979,1980,1983],{},"可兴趣这东西，",[49,1981,1982],{},"一周只在课外班碰一次，很容易凉。"," 我希望他回家后也能随时摸两下，哪怕只是玩，把那点热乎劲儿保持住。",[14,1985,1986],{},"于是我想：能不能做个在线版，让他打开网页就能敲？不用花大价钱买设备，也能在家体验架子鼓。",[14,1988,1989],{},[55,1990],{"alt":1991,"src":1992},"在线架子鼓：一张俯视图，每个鼓件都是可点击的大热区","\u002Fb\u002Fmetool\u002Fdrumkit-cover.webp",[18,1994,1995],{"id":1995},"做了什么",[14,1997,1998,1999,2005],{},"我用浏览器的 Web Audio API 做了一个",[279,2000,2004],{"href":2001,"rel":2002,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fgames\u002FdrumKit\u002F",[283],"_blank","在线架子鼓","，打开网页、戴上耳机，触屏或键盘一敲就有声音。",[14,2007,2008],{},"为了让手感尽量接近真鼓，我没有用电子合成的\"滴答\"声，而是用了真实录制的开源鼓声采样——底鼓、军鼓、踩镲、嗵鼓、吊镲、叮叮镲都是录音棚里录下来的真实音色，通过 Web Audio API 低延迟播放，敲下去几乎没有延迟。整套鼓做成一张俯视图，每个鼓件是一个大大的可点击热区，点到哪、哪一块就下压回弹，配上可选的震动反馈，敲起来挺\"跟手\"。",[14,2010,2011],{},"几个我自己比较满意的细节：",[14,2013,2014,2017],{},[49,2015,2016],{},"触屏 + 键盘双操作。"," 手机、平板上用手指点，支持多指同时敲；电脑上每个鼓件映射了键盘按键（A 吊镲、S\u002FD 闭\u002F开镲、F 军鼓、空格底鼓……），延迟更低，适合练拍子。",[14,2019,2020,2023],{},[49,2021,2022],{},"踩镲开闭联动。"," 和真鼓一样，敲闭镲会\"掐断\"正在延音的开镲（choke），还原踩镲脚踏的止音手感。",[14,2025,2026,2029],{},[49,2027,2028],{},"录制与循环回放。"," 一键录下你敲的每一下和时间点，再回放、循环，慢慢打磨一段节奏型。录制只存在当前页面内存里，刷新即清，数据不离开浏览器。",[14,2031,2032],{},[55,2033],{"alt":2034,"src":2035},"在线架子鼓界面：每个鼓件标注了对应键盘按键，顶部带录制、播放、循环按钮","\u002Fb\u002Fmetool\u002Fdrumkit-demo.jpeg",[18,2037,2038],{"id":2038},"用它能让孩子练到什么",[14,2040,2041],{},"我特意想清楚了这个工具的能力边界——它不是真鼓的替代品，而是入门和保持兴趣的补充。它真正能帮上忙的，恰好是打鼓里最难、又最不挑设备的那部分：",[14,2043,2044,2047],{},[49,2045,2046],{},"节奏感与稳定性。"," 保持一条稳定的踩镲线是所有鼓手的基本功。打鼓最难的从来不是力气，而是\"稳\"——让每一下都落在准确的时间点上，长时间保持匀速。这是纯神经训练，在屏幕上敲点对了就有效。",[14,2049,2050,2053],{},[49,2051,2052],{},"四肢协调。"," 真鼓要双手双脚各干各的，这里用多指 + 键盘也能模拟\"分手分脚\"的协调挑战。",[14,2055,2056,2059],{},[49,2057,2058],{},"即时反馈与解压。"," 敲下去瞬间就有声音、动画和震动反馈，这种强即时反馈非常解压，孩子玩得停不下来。",[14,2061,2062,2063,2066],{},"它练不了的，是真实的击打力度控制、回弹手感和踩镲脚法——这些得在有物理回弹的设备上练，屏幕给不了。所以我对它的定位很清楚：",[49,2064,2065],{},"课外班学的是手上的真功夫，回家用它保持节奏感和兴趣的余温。"," 两者配合，而不是互相替代。",[18,2068,2069],{"id":2069},"怎么敲出一段节奏",[14,2071,2072],{},"最经典的入门节奏是\"动次打次\"：脚（空格\u002F底鼓）打 1、3 拍，军鼓打 2、4 拍，闭镲打稳定的八分音符垫底。先慢速把三者分开练熟，再合到一起，几乎所有流行歌的基础鼓点就有了。",[14,2074,2075],{},"想进阶就在每四小节结尾用高、中、落地嗵鼓做一个由高到低的过门（fill），最后用吊镲收尾——这就是一段完整的乐句。点\"录制\"录下来再循环播放，能很直观地听出哪里抢拍、哪里拖拍。这个\"敲完马上回放对照\"的闭环，是练时间感最有效的方式之一。",[18,2077,2078],{"id":2078},"为什么又是给孩子做的",[14,2080,2081,2082,2087],{},"熟悉 metool 的朋友知道，",[279,2083,2086],{"href":2084,"rel":2085,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fgames\u002F",[283],"游戏分类我早就改名叫\"给儿子做的游戏合集\"","了。这个在线架子鼓，又是给他做的一个。",[14,2089,2090],{},"metool 上大部分工具是为我自己的工作需求做的，但游戏和这类\"玩\"的东西，基本都是为孩子做的。看着他从迷宫一玩半小时，到现在抱着 iPad 敲架子鼓，我觉得这些东西的价值，不在 GA4 的数字里，而在他想玩的时候我能立刻递给他。",[14,2092,2093],{},"不用花大价钱买设备，打开浏览器就能在家体验架子鼓——这就够了。",[14,2095,2096],{},[279,2097,2099],{"href":2001,"rel":2098},[283],"试试在线架子鼓 →",{"title":316,"searchDepth":317,"depth":317,"links":2101},[2102,2103,2104,2105,2106],{"id":1965,"depth":320,"text":1966},{"id":1995,"depth":320,"text":1995},{"id":2038,"depth":320,"text":2038},{"id":2069,"depth":320,"text":2069},{"id":2078,"depth":320,"text":2078},"2026-06-30","孩子在课外班学架子鼓，刚入门、正有兴趣，可真鼓又贵又吵不可能搬回家。我做了个浏览器在线架子鼓，回家打开网页就能敲，用「玩」的方式帮他保持兴趣的余温。",[2110,2113,2116],{"q":2111,"a":2112},"在线架子鼓能代替真鼓让孩子练习吗？","不能完全代替，但能补上最关键的入门部分。打鼓最难、最值钱的是「节奏稳定」和「四肢协调」，这两样几乎不挑设备，在屏幕或键盘上敲点对就有效。它练不了的是真实的击打力度和踩镲脚法——这些得在有物理回弹的设备上练。所以它适合入门、保持兴趣和日常复习节奏型，是课外班学习的补充。",{"q":2114,"a":2115},"为什么做成网页而不是 App？","因为「随手就能玩」。孩子从课外班回家想敲两下时，我打开浏览器递给他就行，不用下载安装、不用等更新。在线版改完部署，下次打开就是最新的。对这种随时可能想用一下的场景，网页比 App 更顺手。",{"q":2117,"a":2118},"电脑上怎么用键盘敲？","每个鼓件都映射了键盘按键（A 吊镲、F 军鼓、空格底鼓等），屏幕上直接标注。键盘延迟比触屏更低，更适合练拍子。手机、平板上则用手指点，支持多指同时敲击。",{},"\u002Fbuilds\u002Fmetool\u002F2026-06-30-online-drum-kit","metool",{"title":1960,"description":2108},[2004,2124,2125,2126,2127,2128,2129],"没有架子鼓怎么练习","在家练打鼓","儿童架子鼓启蒙","浏览器架子鼓模拟器","零基础学架子鼓","练习节奏感","builds\u002Fmetool\u002F2026-06-30-online-drum-kit","孩子在课外班刚开始学架子鼓，正是有兴趣的时候，但真鼓又贵又吵搬不回家。我用 Web Audio API + 真实鼓声采样做了个在线架子鼓，触屏或键盘一敲就响，自带录制循环回放。回家打开网页就能玩，不用花大价钱买设备，也能让他保持对架子鼓的兴趣。",[1078,1746],"o_1b_uu9pdfbdwHARqlWUv6Rp5QZMUtlghqlBZ-cPQM",{"id":2135,"title":2136,"body":2137,"date":2452,"description":2453,"draft":329,"extension":330,"faq":2454,"meta":2467,"navigation":345,"path":2468,"project":2121,"readingTime":541,"seo":2469,"seoKeywords":2470,"stem":2479,"summary":2480,"tags":2481,"updated":363,"__hash__":2482},"builds\u002Fbuilds\u002Fmetool\u002F2026-06-25-html-editor.md","上线可视化 HTML 编辑器：AI 出码后的最后 10%，别再用对话改一个字了",{"type":8,"value":2138,"toc":2445},[2139,2143,2146,2149,2155,2158,2172,2175,2182,2187,2191,2198,2201,2207,2214,2216,2224,2230,2233,2239,2245,2251,2257,2260,2286,2289,2293,2296,2365,2372,2397,2400,2403,2423,2426,2431,2433,2436,2439],[18,2140,2142],{"id":2141},"问题ai-生成的-html改一个字为什么这么麻烦","问题：AI 生成的 HTML，改一个字为什么这么麻烦？",[14,2144,2145],{},"最近 AI 越来越擅长直接输出 HTML 了。",[14,2147,2148],{},"落地页、数据报告、产品原型、甚至整套 HTML 幻灯片——ChatGPT、Claude、Gemini 都能一次生成，样式完整、结构清晰，打开就能看。",[14,2150,2151,2152],{},"但生成完之后，一个新痛点立刻出现：",[49,2153,2154],{},"你往往只想改一个字、换一张图、调一句文案，却不得不再开一轮 AI 对话。",[14,2156,2157],{},"我遇到过太多次这种场景：",[1193,2159,2160,2163,2166,2169],{},[184,2161,2162],{},"Claude 生成了一个活动落地页，标题里有个错别字",[184,2164,2165],{},"把 HTML 丢回去说「把第三段改成 XXX」",[184,2167,2168],{},"AI 重新生成，第三段改对了，但侧边栏的配色和间距全变了",[184,2170,2171],{},"再改一轮，又动了别的地方……",[14,2173,2174],{},"改一个数字、换一张配图、把模块顺序调一下——这些事手动点一下就能完成，却每次都要烧 token、等生成、还要检查 AI 有没有改坏其他地方。",[14,2176,2177,2178,2181],{},"海外产品 HtmlDrag、HeyHTML 都在强调同一个概念：",[49,2179,2180],{},"AI 出码后的「最后 10% 打磨」","。结构 AI 已经帮你搭好了，剩下的内容微调，应该用手而不是用对话。",[14,2183,2184],{},[55,2185],{"alt":379,"src":2186},"\u002Fb\u002Fmetool\u002Fhtml-editor-cover.png",[18,2188,2190],{"id":2189},"为什么不直接打开源码改","为什么不直接打开源码改？",[14,2192,2193,2194,2197],{},"理论上可以。把 ",[79,2195,2196],{},".html"," 文件拖进 VS Code，找到对应标签，改文字、换图片路径、调 CSS。",[14,2199,2200],{},"但对大多数非技术人员来说，这条路走不通。HTML 标签嵌套层级深，改一处可能影响全局样式；图片路径是相对路径还是外链，改完下载后能不能正常显示，都是坑。",[14,2202,2203,2204],{},"再找 AI 改？前面说了——",[49,2205,2206],{},"小改动不值得大动干戈。",[14,2208,2209,2210,2213],{},"我想要的是：",[49,2211,2212],{},"上传 HTML，页面直接渲染出来，像编辑 Word 文档一样点选修改，改完一键下载。"," 不需要看一行代码，不需要装任何软件，HTML 也不离开浏览器。",[18,2215,1995],{"id":1995},[14,2217,2218,2223],{},[279,2219,2222],{"href":2220,"rel":2221},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fhtml\u002Feditor\u002F",[283],"MeTool 可视化 HTML 编辑器"," 就是这个思路。",[14,2225,2226,2227,2229],{},"上传 AI 生成或已有的 ",[79,2228,2196],{}," 文件，页面立即在编辑区渲染。点中任意元素，浮动工具栏即时出现——改文字、调字体字号颜色、替换配图、删除多余模块、拖拽调整顺序。全程在渲染后的页面上操作，源码面板都不需要打开。",[14,2231,2232],{},"四个核心能力，对应四个最常见的修改需求：",[14,2234,2235,2238],{},[49,2236,2237],{},"点选即改"," — 双击元素进入文字编辑，像改文档一样直接改写措辞。选中后还能调字体、字号、颜色、对齐和加粗。",[14,2240,2241,2244],{},[49,2242,2243],{},"图片内嵌"," — 选中图片上传新图，自动转成 base64 嵌入 HTML。下载后的文件在任何电脑、任何地方打开都能正常显示，不必额外携带图片文件夹。这是 AI 生成 HTML 里最常见的痛点：外链图片失效、相对路径丢失，内嵌后彻底解耦。",[14,2246,2247,2250],{},[49,2248,2249],{},"智能拖拽"," — 不是把元素随便扔到页面上。编辑器会识别元素的排版上下文：flex \u002F grid 文档流里的模块用「排序式」拖拽，释放后自动吸附回原本的排列规则，手机 \u002F 平板 \u002F 桌面切换视口也不乱；只有原本就是绝对定位的装饰元素才允许自由拖到任意坐标。",[14,2252,2253,2256],{},[49,2254,2255],{},"本地隐私"," — 所有编辑在浏览器本地完成，HTML 和图片不上传任何服务器。编辑进度自动缓存到本地，刷新不丢失。",[14,2258,2259],{},"另外几个细节是实际用下来觉得必要的：",[181,2261,2262,2268,2274,2280],{},[184,2263,2264,2267],{},[49,2265,2266],{},"暂停编辑模式","：HTML 幻灯片（reveal.js、自定义 deck 等）载入后，可以先暂停编辑、自由翻页浏览，找到要改的那一页再恢复编辑。交互后才出现的内容（按钮点开弹层、翻页后才显示的模块）也能正常触达。",[184,2269,2270,2273],{},[49,2271,2272],{},"撤销 \u002F 重做","：最多 50 步，改错了可以回退。",[184,2275,2276,2279],{},[49,2277,2278],{},"全局查找替换","：品牌名写错了一处，一次替换全部相同措辞。",[184,2281,2282,2285],{},[49,2283,2284],{},"多视口预览","：手机 \u002F 平板 \u002F 桌面三档切换，改完立刻看响应式效果。",[14,2287,2288],{},"导出时支持下载干净 HTML（剥离编辑层），HTML 幻灯片还可以导出多页 PDF 或逐页 PNG 压缩包。",[18,2290,2292],{"id":2291},"改内容用手点改结构再找-ai","改内容用手点，改结构再找 AI",[14,2294,2295],{},"做这个工具时，我把能力边界想得很清楚——可视化编辑和对话式 AI 修改并不冲突，各有适用场景：",[949,2297,2298,2311],{},[952,2299,2300],{},[955,2301,2302,2305,2308],{},[958,2303,2304],{},"需求",[958,2306,2307],{},"推荐方式",[958,2309,2310],{},"理由",[965,2312,2313,2324,2334,2344,2355],{},[955,2314,2315,2318,2321],{},[970,2316,2317],{},"改一句文案 \u002F 一个数字",[970,2319,2320],{},"可视化编辑",[970,2322,2323],{},"点一下即可，秒级完成，不费 token",[955,2325,2326,2329,2331],{},[970,2327,2328],{},"换一张配图",[970,2330,2320],{},[970,2332,2333],{},"上传内嵌，所见即所得",[955,2335,2336,2339,2341],{},[970,2337,2338],{},"调整模块顺序",[970,2340,2320],{},[970,2342,2343],{},"拖拽即可，自动保持响应式排版",[955,2345,2346,2349,2352],{},[970,2347,2348],{},"新增一整个章节 \u002F 重构布局",[970,2350,2351],{},"对话式 AI",[970,2353,2354],{},"结构性变更更适合让 AI 重写",[955,2356,2357,2360,2362],{},[970,2358,2359],{},"改设计风格 \u002F 配色体系",[970,2361,2351],{},[970,2363,2364],{},"系统性样式改动一句话更高效",[14,2366,2367,2368,2371],{},"一句话总结：",[49,2369,2370],{},"「改内容」用可视化编辑器，「改结构」再找 AI。"," 把昂贵的 API 调用留给真正需要它的地方。",[14,2373,2374,2375,2379,2380,2385,2386,2391,2392,2396],{},"这和 metool HTML 分类里其他工具形成一条完整工作流：在",[279,2376,2378],{"href":2220,"rel":2377},[283],"编辑器","里改内容 → 用",[279,2381,2384],{"href":2382,"rel":2383},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fhtml\u002Fpreview\u002F",[283],"实时预览","检查多视口效果 → 用",[279,2387,2390],{"href":2388,"rel":2389},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fhtml\u002Fshare\u002F",[283],"分享链接","发给对方看。之前写过 ",[279,2393,2395],{"href":2394},"\u002Fbuilds\u002Fmetool\u002F2026-05-14-html-markdown-share","HTML 和 Markdown 分享工具"," 解决「发给别人看」的问题；这次补的是「自己改」这一环。",[18,2398,2399],{"id":2399},"我的使用方式",[14,2401,2402],{},"现在我的典型流程是这样的：",[1193,2404,2405,2411,2414,2417,2420],{},[184,2406,2407,2408,2410],{},"让 Claude 生成一份 HTML 报告或落地页，下载 ",[79,2409,2196],{}," 文件",[184,2412,2413],{},"拖进 MeTool 可视化编辑器，先过一遍整体效果",[184,2415,2416],{},"点选改错别字、换主图、调模块顺序——全程不超过 5 分钟",[184,2418,2419],{},"切换到手机视口看一眼响应式有没有问题",[184,2421,2422],{},"满意后下载 HTML；如果要发给别人，再丢进分享工具生成链接",[14,2424,2425],{},"如果是 HTML 幻灯片，会先开「暂停编辑」翻几页找到要改的内容，改完标题和配图，导出 PDF 直接发。",[14,2427,2428],{},[49,2429,2430],{},"能手动点一下就改好的事，就别再麻烦 AI 了。",[1023,2432],{},[14,2434,2435],{},"这个工具解决的是 AI 时代一个很具体的问题：生成 HTML 已经很容易，但改 HTML 不应该比生成还麻烦。",[14,2437,2438],{},"如果你也经常在 AI 生成的 HTML 里改一个字、换一张图，大概会理解这个痛点。",[14,2440,2441],{},[279,2442,2444],{"href":2220,"rel":2443},[283],"试试可视化 HTML 编辑器 →",{"title":316,"searchDepth":317,"depth":317,"links":2446},[2447,2448,2449,2450,2451],{"id":2141,"depth":320,"text":2142},{"id":2189,"depth":320,"text":2190},{"id":1995,"depth":320,"text":1995},{"id":2291,"depth":320,"text":2292},{"id":2399,"depth":320,"text":2399},"2026-06-25","ChatGPT、Claude 生成的 HTML 落地页、报告、幻灯片，改一句文案或换一张图却要再开一轮 AI 对话——慢、费 token，还可能改坏其他地方。MeTool 上线可视化 HTML 编辑器：上传 HTML，点选即改，全程不看代码，100% 浏览器本地处理。",[2455,2458,2461,2464],{"q":2456,"a":2457},"编辑后的图片会丢失吗？","不会。你替换的图片会以 base64 编码直接内嵌进 HTML，下载后的文件在任何电脑、任何地方打开都能正常显示图片，无需额外附带图片文件。",{"q":2459,"a":2460},"拖拽会不会把页面排版搞乱？","不会。编辑器会智能识别元素的排版方式：处于正常文档流（flex \u002F grid）中的元素采用「排序式」拖拽，释放后自动吸附回原本的排列规则，换屏不乱；只有原本就是绝对定位的装饰元素才允许自由拖到任意坐标。",{"q":2462,"a":2463},"需要懂 HTML 或 CSS 吗？","不需要。整个编辑过程都在渲染后的页面上进行：点选、改字、换色、换图、删除、拖拽，全程不展示也不需要看源码。改完一键下载即可。",{"q":2465,"a":2466},"我的 HTML 会上传到服务器吗？","不会。所有编辑都在你的浏览器本地完成，HTML 与图片都不会离开你的设备，关闭页面前会自动缓存到本地，刷新不丢失。",{},"\u002Fbuilds\u002Fmetool\u002F2026-06-25-html-editor",{"title":2136,"description":2453},[2471,2472,2473,2474,2475,2476,2477,2478],"HTML在线编辑器","AI生成HTML编辑","可视化HTML编辑","改AI生成的HTML","HTML拖拽编辑","不用代码改HTML","HtmlDrag替代品","AI出码后编辑","builds\u002Fmetool\u002F2026-06-25-html-editor","MeTool 上线可视化 HTML 编辑器，解决 AI 生成 HTML 后的「最后一公里」修改问题：上传 HTML 直接渲染，点选元素改文字、换字体颜色、替换配图（base64 内嵌）、智能拖拽排序，全程不看代码。改内容用手点，改结构再找 AI——把 token 留给真正需要的地方。",[1078,361],"k6UJGtEFlJOaT5cXno99BozpRdR4n4k0X2oVj9zd9KQ",{"id":2484,"title":2485,"body":2486,"date":2658,"description":2659,"draft":329,"extension":330,"faq":2660,"meta":2670,"navigation":345,"path":2671,"project":2121,"readingTime":535,"seo":2672,"seoKeywords":2673,"stem":2681,"summary":2682,"tags":2683,"updated":363,"__hash__":2684},"builds\u002Fbuilds\u002Fmetool\u002F2026-06-18-screen-wake-lock.md","上线屏幕常亮工具：等 AI 写代码时，电脑别再自动息屏了",{"type":8,"value":2487,"toc":2651},[2488,2492,2495,2498,2501,2515,2518,2523,2527,2530,2533,2536,2541,2543,2546,2549,2552,2559,2566,2569,2573,2576,2581,2592,2597,2608,2611,2613,2616,2633,2636,2638,2641,2644],[18,2489,2491],{"id":2490},"问题等-ai-写代码时屏幕黑了","问题：等 AI 写代码时，屏幕黑了",[14,2493,2494],{},"最近大量时间花在用 AI 编程工具上——Cursor、Claude Code、Codex。工作流程很简单：给 AI 一段指令，然后等它生成。",[14,2496,2497],{},"问题出在「等」这个环节。",[14,2499,2500],{},"AI 生成一个复杂功能可能需要 2-5 分钟，有时更久。而我的 MacBook 默认 2 分钟无操作就息屏。于是经常出现这样的情况：",[1193,2502,2503,2506,2509,2512],{},[184,2504,2505],{},"给 Claude Code 下了指令，去倒杯水",[184,2507,2508],{},"回来发现屏幕黑了",[184,2510,2511],{},"解锁后发现 AI 还在跑——运气好的话",[184,2513,2514],{},"运气不好的话，网络已经断了，Claude Code 的 SSH 会话超时，得重新来",[14,2516,2517],{},"这事烦了我好几次之后，我决定做个工具解决它。",[14,2519,2520],{},[55,2521],{"alt":379,"src":2522},"\u002Fb\u002Fmetool\u002Fscreen-wake-lock-cover.jpg",[18,2524,2526],{"id":2525},"为什么不改系统设置","为什么不改系统设置？",[14,2528,2529],{},"最简单的方案当然是：系统偏好设置 → 显示器 → 关闭显示器：永不。",[14,2531,2532],{},"但我不想这样做。改完之后我一定会忘记改回来，然后连续几天屏幕永远亮着，电费和屏幕寿命都在烧。",[14,2534,2535],{},"我也看了 Caffeine、Amphetamine 这些 Mac 上的防息屏工具，都不错，但——在客户的电脑上我没法装东西，在公司电脑上可能没有管理员权限。",[14,2537,2209,2538],{},[49,2539,2540],{},"打开一个网页，点一下，屏幕常亮；用完关掉网页，一切恢复原样。",[18,2542,1995],{"id":1995},[14,2544,2545],{},"用浏览器的 Screen Wake Lock API 做了一个屏幕常亮工具。核心逻辑很简单：页面请求一个「唤醒锁」，只要页面保持在前台，设备就不会自动息屏。",[14,2547,2548],{},"但光有个开关太无聊了。等 AI 的那几分钟，盯着一个黑屏或白屏也没意思。",[14,2550,2551],{},"于是我录了一段 Claude Code 在终端里工作的视频——代码在屏幕上刷刷地滚动，光标在跳，看起来很忙碌。把这段视频做成了全屏背景选项：",[14,2553,2554],{},[2555,2556],"video",{"src":2557,"autoPlay":345,"loop":345,"muted":345,"playsInline":345,"style":2558},"\u002Fb\u002Fmetool\u002Fclaude-code-work.mp4","width:100%;border-radius:12px;margin:16px 0;",[14,2560,2561,2562,2565],{},"开启常亮后，整个屏幕变成这段视频的全屏播放。效果就像是——",[49,2563,2564],{},"AI 正在你的屏幕上写代码","，你只需要等着收货就好。",[14,2567,2568],{},"比盯着一个倒计时数字有意思多了。",[18,2570,2572],{"id":2571},"它能做什么不能做什么","它能做什么，不能做什么",[14,2574,2575],{},"做这个工具时我刻意把能力边界想清楚了，在工具页也写得很明白：",[14,2577,2578],{},[49,2579,2580],{},"能做的：",[181,2582,2583,2586,2589],{},[184,2584,2585],{},"本页全屏时，阻止设备自动息屏（等 AI 工作、浏览器内演示投屏）",[184,2587,2588],{},"双屏场景，把本页放在第二块屏保持可见，主屏继续用 Cursor \u002F Claude Code",[184,2590,2591],{},"设置定时关闭，到点自动恢复",[14,2593,2594],{},[49,2595,2596],{},"做不到的：",[181,2598,2599,2602,2605],{},[184,2600,2601],{},"切到其他应用后继续防息屏（切走 = 失效）",[184,2603,2604],{},"在后台保持系统唤醒（这不是浏览器能做的事）",[184,2606,2607],{},"替代 PowerPoint 演示时的防息屏（PPT 在前台时浏览器已经不可见了）",[14,2609,2610],{},"这个限制是浏览器 API 的机制决定的，不是 bug。把这件事讲清楚比假装全能更重要。",[18,2612,2399],{"id":2399},[14,2614,2615],{},"现在我的工作流是这样的：",[1193,2617,2618,2621,2624,2627,2630],{},[184,2619,2620],{},"外接显示器上打开 MeTool 屏幕常亮工具，选「AI 工作」背景，设置 30 分钟定时",[184,2622,2623],{},"点开关，外屏全屏播放 Claude Code 工作视频",[184,2625,2626],{},"主屏上用 Cursor \u002F Claude Code 工作",[184,2628,2629],{},"等 AI 生成时，瞥一眼外屏——视频在滚动，心理上知道「AI 还在忙」",[184,2631,2632],{},"30 分钟后外屏自动恢复息屏，不用管它",[14,2634,2635],{},"即使没有双屏，单屏时也可以直接在本页全屏等待，AI 在后台跑。只要本页可见，设备就不会睡。",[1023,2637],{},[14,2639,2640],{},"这个工具做得很快，前后半天时间。但它解决了一个我每天都会遇到的实际问题——等 AI 写代码时，电脑别再自己黑屏了。",[14,2642,2643],{},"如果你也在用 AI 编程工具，大概也会遇到同样的事。",[14,2645,2646],{},[279,2647,2650],{"href":2648,"rel":2649},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FwakeLock\u002F",[283],"试试屏幕常亮工具 →",{"title":316,"searchDepth":317,"depth":317,"links":2652},[2653,2654,2655,2656,2657],{"id":2490,"depth":320,"text":2491},{"id":2525,"depth":320,"text":2526},{"id":1995,"depth":320,"text":1995},{"id":2571,"depth":320,"text":2572},{"id":2399,"depth":320,"text":2399},"2026-06-18","用 Cursor、Claude Code 写代码时，AI 跑了几分钟，屏幕一黑——网断了，进度丢了。为解决这个问题做了一个浏览器屏幕常亮工具，顺便录了段 Claude Code 工作的视频当全屏背景。",[2661,2664,2667],{"q":2662,"a":2663},"这个工具关掉浏览器后还有效吗？","没有。关闭页面或切到其他应用后，常亮自动停止，设备恢复正常息屏行为。它解决的是「临时需要」，不是永久修改系统设置。",{"q":2665,"a":2666},"能让电脑在跑 PPT 演示时不息屏吗？","不能。切到 PPT 后浏览器不在前台，工具失效。它适合的是「内容就在浏览器里」的场景，或者你用双屏时把这个页面放在第二块屏保持可见。",{"q":2668,"a":2669},"Firefox 能用吗？","能。Chrome、Edge、Safari 用原生 Wake Lock API，Firefox 自动走兼容模式（隐藏媒体播放），效果一样。",{},"\u002Fbuilds\u002Fmetool\u002F2026-06-18-screen-wake-lock",{"title":2485,"description":2659},[2674,2675,2676,2677,2678,2679,2680],"屏幕常亮","防止息屏","AI写代码等待","Cursor防息屏","Claude Code屏幕","自动息屏怎么关闭","wake lock","builds\u002Fmetool\u002F2026-06-18-screen-wake-lock","用 AI 编程工具（Cursor、Claude Code、Codex）时，等 AI 生成代码的几分钟内设备自动息屏，导致网络断开或进程中断。MeTool 上线屏幕常亮工具，一键防息屏，支持定时关闭，还有一段 Claude Code 工作的视频作为全屏等待背景。",[1078,361],"aXFa95YiNoQ-tMKQ3es4xrdz3AQofwWXYLovEJfnVXM",{"id":2686,"title":2687,"body":2688,"date":3271,"description":3272,"draft":329,"extension":330,"faq":3273,"meta":3286,"navigation":345,"path":3287,"project":2121,"readingTime":347,"seo":3288,"seoKeywords":3289,"stem":3296,"summary":3297,"tags":3298,"updated":363,"__hash__":3299},"builds\u002Fbuilds\u002Fmetool\u002F2026-06-13-blind-watermark.md","上线隐形水印工具：调研了六种方案后，选了一个诚实的折中方案",{"type":8,"value":2689,"toc":3258},[2690,2694,2697,2704,2707,2710,2716,2720,2723,2760,2763,2766,2886,2889,2901,2904,2911,2915,2918,2922,2925,2928,2931,2935,2938,2945,2949,2952,2958,2984,2987,3007,3010,3014,3025,3034,3056,3070,3076,3079,3083,3086,3089,3092,3096,3099,3102,3106,3109,3237,3243,3245,3248,3255],[18,2691,2693],{"id":2692},"隐形水印是什么为什么要做它","隐形水印是什么，为什么要做它",[14,2695,2696],{},"图片加水印这件事，最常见的方式是在角落盖个半透明 Logo。但这有个问题——影响美观，而且只要稍加裁剪或修图，水印就没了。",[14,2698,2699,2700,2703],{},"隐形水印解决的是另一件事：",[49,2701,2702],{},"把信息藏进图片里，肉眼看不到，但事后能提取验证","。用途不是「防止被盗用」，而是「被盗用后能证明来源」。",[14,2705,2706],{},"几个典型场景：机构颁发的电子证书，接收方想验证是否为原图；摄影师给自己的作品留下不可见的版权标记；企业内部文件分发，不同渠道嵌入不同标记，泄漏后追溯来源。",[14,2708,2709],{},"我们上线了这个工具，提供两种模式，用起来很简单：上传图片、输入要藏的文字和密码、下载带水印的 PNG，验证时同样上传图片输入密码，一秒出结果。",[14,2711,2712],{},[55,2713],{"alt":2714,"src":2715},"ui","\u002Fb\u002Fmetool\u002FblindWatermark\u002Fui.png",[18,2717,2719],{"id":2718},"两种模式用图说话","两种模式，用图说话",[14,2721,2722],{},"先看最直接的问题：加了水印之后，图片会变样吗？",[949,2724,2725,2738],{},[952,2726,2727],{},[955,2728,2729,2732,2735],{},[958,2730,2731],{},"原图",[958,2733,2734],{},"文字嵌入模式",[958,2736,2737],{},"抗旋转\u002F缩放模式",[965,2739,2740],{},[955,2741,2742,2748,2754],{},[970,2743,2744],{},[55,2745],{"alt":2731,"src":2746,"width":2747},"\u002Fb\u002Fmetool\u002FblindWatermark\u002Foriginal.png",120,[970,2749,2750],{},[55,2751],{"alt":2752,"src":2753,"width":2747},"文字嵌入水印","\u002Fb\u002Fmetool\u002FblindWatermark\u002Fdwt-embed.png",[970,2755,2756],{},[55,2757],{"alt":2758,"src":2759,"width":2747},"抗旋转水印","\u002Fb\u002Fmetool\u002FblindWatermark\u002Ffft-embed.png",[14,2761,2762],{},"三张图肉眼看不出区别——这是隐形水印的基本前提，两种模式都做到了。",[14,2764,2765],{},"然后是关键问题：图片被各种方式「处理」之后，水印还能验证吗？",[949,2767,2768,2784],{},[952,2769,2770],{},[955,2771,2772,2775,2778,2781],{},[958,2773,2774],{},"编辑方式",[958,2776,2777],{},"编辑后效果",[958,2779,2780],{},"文字嵌入",[958,2782,2783],{},"抗旋转\u002F缩放",[965,2785,2786,2804,2820,2836,2853,2870],{},[955,2787,2788,2791,2798,2801],{},[970,2789,2790],{},"亮度 +30",[970,2792,2793],{},[55,2794],{"alt":2795,"src":2796,"width":2797},"亮度攻击","\u002Fb\u002Fmetool\u002FblindWatermark\u002Fattack-brightness.png",80,[970,2799,2800],{},"❌",[970,2802,2803],{},"✅ 60%",[955,2805,2806,2809,2815,2817],{},[970,2807,2808],{},"遮挡 80×80",[970,2810,2811],{},[55,2812],{"alt":2813,"src":2814,"width":2797},"遮挡攻击","\u002Fb\u002Fmetool\u002FblindWatermark\u002Fattack-mask.png",[970,2816,2800],{},[970,2818,2819],{},"✅ 73%",[955,2821,2822,2825,2831,2833],{},[970,2823,2824],{},"旋转 90°",[970,2826,2827],{},[55,2828],{"alt":2829,"src":2830,"width":2797},"旋转攻击","\u002Fb\u002Fmetool\u002FblindWatermark\u002Fattack-rotate90.png",[970,2832,2800],{},[970,2834,2835],{},"✅ 80%",[955,2837,2838,2841,2847,2850],{},[970,2839,2840],{},"缩放往返 75%",[970,2842,2843],{},[55,2844],{"alt":2845,"src":2846,"width":2797},"缩放攻击","\u002Fb\u002Fmetool\u002FblindWatermark\u002Fattack-scale75.png",[970,2848,2849],{},"✅",[970,2851,2852],{},"✅ 64%",[955,2854,2855,2858,2865,2867],{},[970,2856,2857],{},"裁剪 90%",[970,2859,2860],{},[55,2861],{"alt":2862,"src":2863,"width":2864},"裁剪90%","\u002Fb\u002Fmetool\u002FblindWatermark\u002Fattack-crop90.png",72,[970,2866,2800],{},[970,2868,2869],{},"✅ 51%",[955,2871,2872,2875,2882,2884],{},[970,2873,2874],{},"裁剪 50%",[970,2876,2877],{},[55,2878],{"alt":2879,"src":2880,"width":2881},"裁剪50%","\u002Fb\u002Fmetool\u002FblindWatermark\u002Fattack-crop50.png",60,[970,2883,2800],{},[970,2885,2800],{},[14,2887,2888],{},"两种模式的定位由此清晰：",[181,2890,2891,2896],{},[184,2892,2893,2895],{},[49,2894,2734],{},"：能读出你藏进去的文字（版权声明、你的名字），但对改动比较敏感。适合「原图 PNG 直接分发」的场景，比如机构颁发的电子证书。",[184,2897,2898,2900],{},[49,2899,2737],{},"：不能读文字，只验证「有没有水印」，但抗改动能力强得多。适合图片可能被转发、旋转、截取的场景。",[14,2902,2903],{},"两种模式可以叠加使用——先嵌文字，再嵌指纹，互不干扰，可分别独立验证。",[14,2905,2906,2907,2910],{},"有一点要提前说清楚：",[49,2908,2909],{},"截图之后通常无法可靠验证","。截图不是复制原始像素，而是经过屏幕渲染和重新编码的，这个过程会破坏水印信号。这个工具最适合「发送原图 PNG 文件」的链路，不是截图溯源的工具。这不是为了降低预期而说的，是我们实测得到的真实结论。",[18,2912,2914],{"id":2913},"做工具之前调研了六种方案","做工具之前，调研了六种方案",[14,2916,2917],{},"上面说的「我们选定了 DWT-DCT-SVD 算法」，但为什么是它？我们调研了六种方案，把这个过程整理出来，也许对你理解这类工具的能力边界有帮助。",[496,2919,2921],{"id":2920},"方案一经典频域算法-dwt-dct-svd","方案一：经典频域算法 DWT-DCT-SVD",[14,2923,2924],{},"这是学术和工程界应用最广的开源方案。原理是把图片分解成频率层次，把水印信息嵌入到低频系数里——人眼对低频变动不敏感，所以水印不可见；提取时也只需要带水印的图，不需要原图对比。",[14,2926,2927],{},"优点：完全开源、可在浏览器实现、真正的「盲」提取。缺点：对旋转和高强度 JPEG 压缩比较脆弱。",[14,2929,2930],{},"腾讯云和阿里云的文字盲水印服务底层大概率用的就是这个算法族——官方文档的限制（最小尺寸、长宽比要求）和这个算法的块结构要求完全对应。",[496,2932,2934],{"id":2933},"方案二简单-fft-差值法伪盲水印","方案二：简单 FFT 差值法（伪盲水印）",[14,2936,2937],{},"GitHub 上有一些「盲水印」项目用的是这个思路：把水印图的频域叠加到原图频域上，提取时做差还原。",[14,2939,2940,2941,2944],{},"看起来很聪明，但",[49,2942,2943],{},"不是真正的盲水印","——提取时必须持有原图才能做差。腾讯云的图片水印（type1\u002Ftype2）用的就是这个，本质是「有原图才能验证」的留底方案，不适合我们要做的场景。",[496,2946,2948],{"id":2947},"方案三让水印能抗旋转实验结果让我们放弃了这个方向","方案三：让水印能抗旋转——实验结果让我们放弃了这个方向",[14,2950,2951],{},"DWT-DCT-SVD 有个软肋：图片一旦被旋转，内部的块结构对不上，水印提取就失败。一个自然的想法是「同时埋一层定位模板，提取时先估出旋转角度、把图摆正、再提取」。",[14,2953,2954,2955],{},"我们认真做了实验，用三张真实照片跑了完整测试，结论是：",[49,2956,2957],{},"调门要么开不够，要么开太大。",[2959,2960,2962,2963,2962,2975],"div",{"style":2961},"display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;margin:16px 0;","\n  ",[2959,2964,2966,2967,2966,2972,2962],{"style":2965},"flex:1;min-width:180px;text-align:center;","\n    ",[55,2968],{"src":2969,"alt":2970,"style":2971},"\u002Fb\u002Fmetool\u002Fpeppers_original.png","peppers 原图","width:100%;border-radius:8px;",[14,2973,2731],{"style":2974},"font-size:13px;color:#888;margin-top:6px;",[2959,2976,2966,2977,2966,2981,2962],{"style":2965},[55,2978],{"src":2979,"alt":2980,"style":2971},"\u002Fb\u002Fmetool\u002Fpeppers_watermarked.png","peppers 嵌入水印后",[14,2982,2983],{"style":2974},"叠加定位模板后——肉眼已可见条纹",[14,2985,2986],{},"定位模板信号弱时，旋转后找不到模板，摆正失败；强到能用时，图片已经出现肉眼可见的条纹。即使开到最大强度，旋转 8° 只有 1 张图能恢复，旋转 15° 全部失败，旋转加 JPEG 组合则全军覆没：",[2959,2988,2962,2989,2962,2998],{"style":2961},[2959,2990,2966,2991,2966,2995,2962],{"style":2965},[55,2992],{"src":2993,"alt":2994,"style":2971},"\u002Fb\u002Fmetool\u002Fpeppers_rotate8_attacked.png","旋转 8° 攻击后",[14,2996,2997],{"style":2974},"旋转 8° 后（提取失败）",[2959,2999,2966,3000,2966,3004,2962],{"style":2965},[55,3001],{"src":3002,"alt":3003,"style":2971},"\u002Fb\u002Fmetool\u002Fpeppers_rotate8_realigned.png","摆正后",[14,3005,3006],{"style":2974},"几何摆正后——仍然提取失败",[14,3008,3009],{},"算法确实能估出「转了 7.8°」，把图摆正了——但真实照片经过重采样和 JPEG 编码，信号损耗已经超出了能恢复的范围。这个方向不上线。",[496,3011,3013],{"id":3012},"方案四开源项目-blindwatermark-的示例看起来效果很好但有隐藏前提","方案四：开源项目 BlindWatermark 的示例看起来效果很好，但有隐藏前提",[14,3015,3016,3017,3020,3021,3024],{},"调研过程中我们也看了 GitHub 上颇受欢迎的 ",[79,3018,3019],{},"BlindWatermark","（fire-keeper）和 ",[79,3022,3023],{},"blind_watermark","（guofei9987），README 展示的效果图很惊艳——旋转、截图、JPEG 之后都能还原水印图案。我们拆解了一下，发现有几个关键前提没有被明显标出：",[14,3026,3027,3030,3031,3033],{},[49,3028,3029],{},"旋转等几何攻击的「成功」，需要精确的逆操作。"," 打开 ",[79,3032,3023],{}," 的示例代码，每个「攻击成功」的测试都有对应的还原步骤：旋转了 60° 就反向旋转 -60°，缩放到 400×300 就用原图尺寸缩放回去：",[436,3035,3039],{"className":3036,"code":3037,"language":3038,"meta":316,"style":316},"language-python shiki shiki-themes github-light-default github-dark-default","att.rot_att(input_filename='output\u002Fembedded.png', ..., angle=60)\natt.rot_att(input_filename='output\u002F旋转攻击.png', ..., angle=-60)  # ← 精确反转\nwm_extract = bwm1.extract('output\u002F旋转攻击_还原.png', ...)\n","python",[79,3040,3041,3046,3051],{"__ignoreMap":316},[507,3042,3043],{"class":509,"line":510},[507,3044,3045],{},"att.rot_att(input_filename='output\u002Fembedded.png', ..., angle=60)\n",[507,3047,3048],{"class":509,"line":320},[507,3049,3050],{},"att.rot_att(input_filename='output\u002F旋转攻击.png', ..., angle=-60)  # ← 精确反转\n",[507,3052,3053],{"class":509,"line":317},[507,3054,3055],{},"wm_extract = bwm1.extract('output\u002F旋转攻击_还原.png', ...)\n",[14,3057,3058,3061,3062,3065,3066,3069],{},[49,3059,3060],{},"截图攻击需要同时持有原图。"," ",[79,3063,3064],{},"estimate_crop_parameters"," 函数的参数里明确写着 ",[79,3067,3068],{},"original_file='output\u002Fembedded.png'","——用 SIFT 特征点把截图对齐回原图，本质是「非盲」操作。",[14,3071,3072,3075],{},[49,3073,3074],{},"成功标准不同。"," 这些项目嵌入的是一张黑白水印图，提取出来即使有失真，人眼仍能辨认图案。我们嵌入的是精确文字 bit 串，一个 bit 错误就会导致 UTF-8 解码失败——「要么完全正确，要么完全失败」，门槛高得多。",[14,3077,3078],{},"说这些不是否定这些项目，算法本身是扎实的，README 也坦承了自己的「现在的问题」章节。只是评估一个工具的真实能力时，需要区分「已知攻击参数下能还原」和「真实未知场景下盲提取」——这是两件不同的事。",[496,3080,3082],{"id":3081},"方案五google-synthid","方案五：Google SynthID",[14,3084,3085],{},"Google DeepMind 2025 年发表的方案，已处理超 20 亿张图片，鲁棒性远超所有频域方案。",[14,3087,3088],{},"技术路线完全不同：端到端训练的神经网络，训练时主动对水印图施加随机 JPEG、旋转、裁剪攻击，编码器被迫学习把信号藏在这些变换都动不了的地方。",[14,3090,3091],{},"对我们来说，现阶段引入不现实——模型闭源，且我们的定位是完全离线的免费工具。",[496,3093,3095],{"id":3094},"方案六trustmarkadobeiccv-2025","方案六：TrustMark（Adobe，ICCV 2025）",[14,3097,3098],{},"开源的深度学习水印方案，有 ONNX 版本，理论上可以在浏览器通过 WebGPU 运行，模型约 3 MB。",[14,3100,3101],{},"这个方向值得后续评估，「浏览器只做验证，嵌入仍离线处理」的模式在技术上是可行的。已列入我们的技术路线图。",[496,3103,3105],{"id":3104},"为什么选-dwt-dct-svd而不是云-api","为什么选 DWT-DCT-SVD，而不是云 API",[14,3107,3108],{},"调研完这六种方案，再来看云厂商的服务就清楚多了：",[949,3110,3111,3130],{},[952,3112,3113],{},[955,3114,3115,3118,3121,3124,3127],{},[958,3116,3117],{},"比较维度",[958,3119,3120],{},"MeTool",[958,3122,3123],{},"腾讯云 type3",[958,3125,3126],{},"阿里云新版",[958,3128,3129],{},"Google SynthID",[965,3131,3132,3149,3162,3177,3191,3207,3221],{},[955,3133,3134,3137,3140,3143,3146],{},[970,3135,3136],{},"算法",[970,3138,3139],{},"DWT-DCT-SVD",[970,3141,3142],{},"同源",[970,3144,3145],{},"可能升级版",[970,3147,3148],{},"深度学习",[955,3150,3151,3154,3156,3158,3160],{},[970,3152,3153],{},"抗亮度\u002F噪声",[970,3155,2849],{},[970,3157,2849],{},[970,3159,2849],{},[970,3161,2849],{},[955,3163,3164,3167,3169,3172,3175],{},[970,3165,3166],{},"抗旋转+JPEG（真实图）",[970,3168,2800],{},[970,3170,3171],{},"❌（推测）",[970,3173,3174],{},"未知",[970,3176,2849],{},[955,3178,3179,3182,3184,3186,3189],{},[970,3180,3181],{},"抗截屏",[970,3183,2800],{},[970,3185,2800],{},[970,3187,3188],{},"✅（声称）",[970,3190,2849],{},[955,3192,3193,3196,3198,3201,3204],{},[970,3194,3195],{},"任意中文文本",[970,3197,2849],{},[970,3199,3200],{},"有限",[970,3202,3203],{},"256 字符上限",[970,3205,3206],{},"不支持",[955,3208,3209,3212,3214,3216,3218],{},[970,3210,3211],{},"纯浏览器\u002F无需上传",[970,3213,2849],{},[970,3215,2800],{},[970,3217,2800],{},[970,3219,3220],{},"需模型文件",[955,3222,3223,3226,3229,3232,3234],{},[970,3224,3225],{},"成本",[970,3227,3228],{},"零",[970,3230,3231],{},"按调用收费",[970,3233,3231],{},[970,3235,3236],{},"零（开源）",[14,3238,3239,3242],{},[49,3240,3241],{},"MeTool 最大的差异化是：完全离线、免费、支持任意中文文本。"," 云 API 架构上做不到这三点——用户必须上传图片，有隐私顾虑、有费用、有网络延迟。在能力相近的情况下，这三点就是我们的理由。",[1023,3244],{},[14,3246,3247],{},"这次开发最大的收获不是上线了一个工具，而是搞清楚了「这个工具在哪里会失效」。把这件事写清楚、放在工具页的显眼位置，是比功能本身更值得做的事。",[14,3249,3250],{},[279,3251,3254],{"href":3252,"rel":3253},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002FblindWatermark\u002F",[283],"现在就试试隐形水印工具",[1034,3256,3257],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":316,"searchDepth":317,"depth":317,"links":3259},[3260,3261,3262],{"id":2692,"depth":320,"text":2693},{"id":2718,"depth":320,"text":2719},{"id":2913,"depth":320,"text":2914,"children":3263},[3264,3265,3266,3267,3268,3269,3270],{"id":2920,"depth":317,"text":2921},{"id":2933,"depth":317,"text":2934},{"id":2947,"depth":317,"text":2948},{"id":3012,"depth":317,"text":3013},{"id":3081,"depth":317,"text":3082},{"id":3094,"depth":317,"text":3095},{"id":3104,"depth":317,"text":3105},"2026-06-13","做隐形水印工具之前，我们认真调研了从经典频域算法到 Google SynthID 的六种方案，并用真实照片跑了抗攻击对比实验。最终选择了一个「能力边界清晰」的前端可行方案，而不是夸大效果的黑盒。",[3274,3277,3280,3283],{"q":3275,"a":3276},"隐形水印嵌入后图片看起来有变化吗？","几乎看不出来。DWT-DCT-SVD 算法在小波\u002FDCT 频域系数上做微小调整，对人眼视觉影响极小。单独的信息水印嵌入后 PSNR 约 37 dB，完全在业界「肉眼不可见」的标准范围内（通常要求 ≥ 38 dB）。",{"q":3278,"a":3279},"截图后还能验证水印吗？","通常不能可靠验证。截图经过显示器渲染、色彩转换、可能的分辨率变化和重新编码，这些操作会破坏频域中的水印信号。隐形水印最适合保护「原图 PNG 文件」的传播链路，不能作为截图防盗的手段。",{"q":3281,"a":3282},"两种模式的区别是什么？","「嵌入自定义文字」模式可在图片中隐藏任意文字，验证时可完整读出，适合版权声明和溯源；「抗旋转\u002F缩放」模式写入密码指纹，抵抗旋转和缩放后仍可验证有无水印，但不能读出内容。两种模式可叠加使用。",{"q":3284,"a":3285},"为什么不用 Google SynthID 那样的深度学习方案？","深度学习方案（如 SynthID、TrustMark）鲁棒性更强，但模型本身需要几 MB 至几十 MB，且需要 WebGPU 或 WASM 运行时，部署成本高、首次加载慢。DWT-DCT-SVD 是纯数学算法，零依赖、纯浏览器本地运行，适合当前阶段做免费公开工具。深度学习路线已在我们的技术路线图上，作为后续升级方向。",{},"\u002Fbuilds\u002Fmetool\u002F2026-06-13-blind-watermark",{"title":2687,"description":3272},[3290,3291,3139,3292,3293,3294,3295],"隐形水印","盲水印","图片版权保护","隐形水印原理","前端水印","图片防盗","builds\u002Fmetool\u002F2026-06-13-blind-watermark","MeTool 上线隐形水印工具，支持文字嵌入和抗旋转\u002F缩放两种模式，100% 浏览器本地处理无需上传。开发前系统调研了腾讯云、阿里云、Google SynthID 等主流方案，并用真实照片做了抗攻击实验，最终选定 DWT-DCT-SVD 方案，诚实标注能力边界，不做虚假宣传。",[1078,361],"jzJf-x2OZdosBHHeiqJnjK3VssooCBA_zNnHZgnj9B0",{"id":3301,"title":3302,"body":3303,"date":327,"description":3414,"draft":329,"extension":330,"faq":3415,"meta":3428,"navigation":345,"path":2394,"project":2121,"readingTime":535,"seo":3429,"seoKeywords":3430,"stem":3438,"summary":3439,"tags":3440,"updated":363,"__hash__":3441},"builds\u002Fbuilds\u002Fmetool\u002F2026-05-14-html-markdown-share.md","上线了两个分享工具：AI 生成的 HTML 和 Markdown，现在都能一键发给别人看了",{"type":8,"value":3304,"toc":3409},[3305,3308,3311,3314,3323,3332,3338,3346,3350,3353,3359,3365,3368,3371,3378,3381,3388,3391,3394,3400,3403,3406],[18,3306,3307],{"id":3307},"从一个真实痛点出发",[14,3309,3310],{},"做这两个工具，起因是一个很具体的问题。",[14,3312,3313],{},"AI 现在能生成质量很高的 HTML 页面——带标签页的方案对比、可折叠的代码审查报告、带图表的数据摘要。但生成完之后，怎么发给别人看？",[14,3315,3316,3317,3319,3320,3322],{},"发源码？对方看到的是一堆 ",[79,3318,152],{}," 和 ",[79,3321,156],{},"。发附件？对方还得找个能打开 HTML 的工具，手机上基本没戏。上传到服务器？需要账号、需要配置，不是人人都搞得定。",[14,3324,3325,3326,3319,3329,130],{},"Markdown 也有同样的问题。AI 生成了一份结构清晰的会议纪要或技术规格，直接发过去对方看到的是满屏 ",[79,3327,3328],{},"#",[79,3330,3331],{},"**",[14,3333,3334,3337],{},[49,3335,3336],{},"这是 AI 生成内容的「最后一公里」问题。"," 生成很容易，分享很麻烦。",[11,3339,3340],{},[14,3341,3342,3343],{},"关于 HTML 和 Markdown 各自适合什么场景，我在另一篇文章里有更详细的分析：",[279,3344,3345],{"href":346},"「Markdown 已死」？先别慌，自媒体又在夸大了",[14,3347,3348],{},[55,3349],{"alt":289,"src":290},[18,3351,3352],{"id":3352},"上线了两个工具",[14,3354,3355],{},[279,3356,3358],{"href":281,"rel":3357},[283],"AI HTML 预览分享",[14,3360,3361,3362,3364],{},"把 AI 生成的 HTML 粘进去，或者拖入 ",[79,3363,2196],{}," 文件，点一下「生成分享链接」，得到一个 7 天有效的链接。",[14,3366,3367],{},"对方收到链接，浏览器打开，看到的是完整渲染的 HTML 页面——样式、图表、交互效果全部保留。手机打开也正常。",[14,3369,3370],{},"短内容直接编码进 URL，不经过任何服务器。较长内容用第三方临时存储，生成前会提示确认。",[14,3372,3373],{},[279,3374,3377],{"href":3375,"rel":3376},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fmarkdown\u002Fshare\u002F",[283],"Markdown 分享预览",[14,3379,3380],{},"逻辑相同，针对 Markdown 格式。",[14,3382,3383,3384,3387],{},"粘入 Markdown 文本或拖入 ",[79,3385,3386],{},".md"," 文件，生成链接，对方打开看到 GitHub 风格的完整排版效果——标题、代码块、表格、引用，全部渲染。",[14,3389,3390],{},"Markdown 有个天然优势：体积比 HTML 小得多。同样内容，Markdown 可能 5 KB，HTML 可能 50 KB。所以 Markdown 的短链接往往能直接塞进 URL，比 HTML 链接更短、更干净，也更适合在微信这类消息长度有限制的场景里传播。",[18,3392,3393],{"id":3393},"做这两个工具学到的事",[14,3395,3396,3397],{},"HTML 和 Markdown 的分享需求，本质上是一件事：",[49,3398,3399],{},"内容生产者和内容消费者之间存在工具断层。",[14,3401,3402],{},"你用 AI 生成了格式化内容，你有工具查看（IDE、浏览器、Markdown 编辑器）。但接收方没有这些工具，也不应该为了看你发的一份报告去安装软件。",[14,3404,3405],{},"链接是最低门槛的传递载体。浏览器是最普及的查看工具。这两个工具做的事情就是把这条路打通。",[14,3407,3408],{},"另外，这次也顺手解决了一个安全性问题：接收方打开链接前会看到一个来源确认弹窗，提示内容来自分享者，注意不要在页面内输入敏感信息。这个设计是为了防止有人把恶意 HTML 页面伪装成正常分享传播。",{"title":316,"searchDepth":317,"depth":317,"links":3410},[3411,3412,3413],{"id":3307,"depth":320,"text":3307},{"id":3352,"depth":320,"text":3352},{"id":3393,"depth":320,"text":3393},"AI 生成 HTML 和 Markdown 后最大的问题是没法直接分享——发源码对方看不了，发附件又麻烦。上线了两个工具解决这个问题：粘贴内容，生成链接，手机直接查看。",[3416,3419,3422,3425],{"q":3417,"a":3418},"AI HTML 分享工具和 Markdown 分享工具有什么区别？","两个工具解决不同格式的分享问题。HTML 分享工具针对 AI 生成的交互式 HTML 页面，对方打开后看到的是完整渲染效果，包括样式、图表和交互组件。Markdown 分享工具针对 AI 生成的 Markdown 文档，对方看到的是 GitHub 风格的排版效果。短内容 Markdown 链接更短，因为 Markdown 体积比 HTML 小很多。",{"q":3420,"a":3421},"分享链接安全吗？内容会上传到服务器吗？","短内容直接编码进 URL，完全不经过任何服务器。较长内容需要第三方临时存储时，工具会提前告知并请用户确认。链接有效期 7 天，到期自动失效，接收者打开前会看到安全确认弹窗。",{"q":3423,"a":3424},"对方收到链接需要安装什么吗？","不需要。对方直接用浏览器打开链接即可，无需注册账号、无需安装任何应用，手机和电脑均可查看。",{"q":3426,"a":3427},"这两个工具适合什么使用场景？","适合把 AI 生成的内容发给同事、朋友或客户查看。比如：AI 生成的方案对比 HTML 页面、代码审查说明、数据报告、会议纪要 Markdown、行动项清单、技术规格文档等。凡是「自己看得到渲染效果，但发给别人就变成乱码」的内容，都适合用这两个工具分享。",{},{"title":3302,"description":3414},[3431,3432,3433,3434,3435,3436,3437],"AI HTML分享","Markdown分享链接","HTML预览分享","AI输出分享","在线HTML查看","Markdown渲染分享","无需登录分享文档","builds\u002Fmetool\u002F2026-05-14-html-markdown-share","MeTool 上线 AI HTML 预览分享和 Markdown 分享预览两个工具，解决 AI 生成内容的「最后一公里」问题：粘贴内容，一键生成 7 天有效的分享链接，对方无需任何工具直接用浏览器查看，手机也能看。",[1078,361],"rELoyp0IDsjo5dZCpMybDiovIIybTqn1_PSWt-HIBG4",{"id":3443,"title":3444,"body":3445,"date":3647,"description":3648,"draft":329,"extension":330,"faq":3649,"meta":3662,"navigation":345,"path":3663,"project":2121,"readingTime":541,"seo":3664,"seoKeywords":3665,"stem":3673,"summary":3674,"tags":3675,"updated":363,"__hash__":3676},"builds\u002Fbuilds\u002Fmetool\u002F2026-05-10-data-growth-go-global.md","活跃用户翻了 10 倍，下一步是走出中国",{"type":8,"value":3446,"toc":3640},[3447,3450,3453,3459,3462,3465,3474,3477,3483,3487,3490,3496,3499,3513,3516,3519,3522,3525,3531,3537,3540,3546,3549,3552,3556,3559,3562,3569,3575,3579,3582,3585,3605,3608,3634,3637],[18,3448,3449],{"id":3449},"数据验证了一件事",[14,3451,3452],{},"打开 Google Analytics 的 90 天报告，数字让我盯了好一会儿。",[14,3454,3455],{},[55,3456],{"alt":3457,"src":3458},"metool 过去 90 天活跃用户增长趋势","\u002Fb\u002Fmetool\u002F202605ga_trend.png",[14,3460,3461],{},"活跃用户 2 万，增长 1033%。事件数 25 万，增长 1720%。浏览次数 4.7 万，增长 695%。",[14,3463,3464],{},"那条曲线讲了一个很清晰的故事：2 月到 3 月中旬基本是一条平线，3 月底开始拉升，4 月初出现第一个跳跃，然后持续爬坡到 5 月初的 6000。",[14,3466,3467,3468,3473],{},"如果对照之前几篇文章的时间线，3 月底正好是我开始用 ",[279,3469,3472],{"href":3470,"rel":3471,"target":2003},"https:\u002F\u002Fgithub.com\u002FMorvanZhou\u002Fgoogle-analytics-and-search-improve",[283],"GA 分析 Skill"," 做数据驱动迭代的时间点。接入 Google Search Console 看搜索词、用数据决定做什么工具、发现 3D 品类的自然需求、一口气铺开整个 3D 工具矩阵、用 GA4 数据找到 UX 流失点、提炼出能力先于数据和因果并列两条设计准则。",[14,3475,3476],{},"每一次迭代都有数据支撑，每一次改动都能在后续数据里看到反馈。这个「数据 → 决策 → 验证」的循环跑了将近两个月，累积效应终于在曲线上体现出来了。",[14,3478,2367,3479,3482],{},[49,3480,3481],{},"自己做的分析工具，分析自己的产品，驱动自己的增长。"," 这大概是独立开发者最理想的状态。",[18,3484,3486],{"id":3485},"全球覆盖但中国一家独大","全球覆盖，但中国一家独大",[14,3488,3489],{},"再看用户的地理分布：",[14,3491,3492],{},[55,3493],{"alt":3494,"src":3495},"metool 按国家\u002F地区划分的活跃用户","\u002Fb\u002Fmetool\u002F202605ga_map.jpeg",[14,3497,3498],{},"覆盖面看起来不错，蓝色铺满了好几个大洲。但数字告诉我的是另一个故事：",[181,3500,3501,3507,3510],{},[184,3502,3503,3506],{},[49,3504,3505],{},"中国大陆：1.2 万","，增长 213%，占总用户的 80% 左右",[184,3508,3509],{},"美国：755，新加坡：631，香港：467，日本：398",[184,3511,3512],{},"台湾：207，德国：54",[14,3514,3515],{},"中国区的用户量是第二名美国的 16 倍。地图上看起来「全球化」，实际上是中国区在一个人扛着整条增长曲线。",[14,3517,3518],{},"这不是坏事，但也不是能安心的事。",[18,3520,3521],{"id":3521},"流量来源揭示了真正的问题",[14,3523,3524],{},"把流量来源拆开看，问题就更清楚了：",[14,3526,3527],{},[55,3528],{"alt":3529,"src":3530},"metool 按来源\u002F媒介划分的活跃用户","\u002Fb\u002Fmetool\u002F20260ga_source.jpeg",[14,3532,3533,3534,130],{},"排名第一：",[49,3535,3536],{},"cn.bing.com \u002F referral，7911 次",[14,3538,3539],{},"中国区 Bing 一个渠道贡献了接近 56% 的流量。加上 bing organic 的 1469 次，Bing 系总共贡献了超过 9000 次访问。",[14,3541,3542,3543,130],{},"相比之下，",[49,3544,3545],{},"Google organic 只有 200 次",[14,3547,3548],{},"200 次。在一个英文优先、面向全球的工具站上，Google 的自然搜索流量只有 200。这个数字让我停下来想了很久。",[14,3550,3551],{},"还有两个有意思的来源：doubao.com referral 426 次、chatgpt.com referral 159 次。AI 产品开始给工具站导流了，虽然量还小，但趋势值得关注。",[18,3553,3555],{"id":3554},"bing-红利和-bing-风险","Bing 红利和 Bing 风险",[14,3557,3558],{},"中国区 Bing 的流量本质上是一波红利。",[14,3560,3561],{},"微软在中国区大力推广 Bing 搜索（Edge 浏览器默认搜索引擎），而 Bing 对中英文混合内容的收录效率不错。metool 之前做了一系列 SEO 优化：默认语言切英文、全站结构化数据、IndexNow 加速收录，这些正好踩中了 Bing 的收录逻辑。",[14,3563,3564,3565,3568],{},"但红利的另一面是风险：",[49,3566,3567],{},"如果流量高度依赖单一渠道，渠道一变，增长就断了。"," Bing 的算法调整、收录策略变化，或者竞争对手在同样的关键词上发力，都可能让这条曲线掉头。",[14,3570,3571,3572],{},"过去两个月证明了「数据驱动」能带来增长。但数据也在告诉我：",[49,3573,3574],{},"这个增长的基础还不够稳。",[18,3576,3578],{"id":3577},"下一步走出去","下一步：走出去",[14,3580,3581],{},"结论很清楚：metool 需要打开国际市场。",[14,3583,3584],{},"不是因为中国市场不好，而是因为：",[1193,3586,3587,3593,3599],{},[184,3588,3589,3592],{},[49,3590,3591],{},"单一渠道依赖风险太高","。Google organic 200 次，说明 Google SEO 基本还没打开。全球最大的搜索引擎的自然流量几乎为零，这本身就是一个巨大的增长空间。",[184,3594,3595,3598],{},[49,3596,3597],{},"国际用户的工具需求同样旺盛","。3D 查看器、图片处理、音频编辑，这些需求不分国界。而且国际用户的付费意愿通常更强，这为后续的商业化留了空间。",[184,3600,3601,3604],{},[49,3602,3603],{},"基础设施已经就绪","。metool 的默认语言已经是英文，工具的核心体验没有语言门槛。缺的不是产品本身，而是在国际搜索引擎上的存在感。",[14,3606,3607],{},"具体要做的事：",[181,3609,3610,3616,3622,3628],{},[184,3611,3612,3615],{},[49,3613,3614],{},"攻 Google SEO","：分析国际用户的搜索词，针对性地优化页面标题、描述、结构化数据。重点是 3D 工具品类，这是已经验证过有需求的方向。",[184,3617,3618,3621],{},[49,3619,3620],{},"内容本地化","：虽然界面已经是英文，但落地页的文案、FAQ、使用指南需要更加贴合英文用户的表达习惯，不能只是中文的直译。",[184,3623,3624,3627],{},[49,3625,3626],{},"拓展 AI 搜索渠道","：chatgpt.com 和 doubao.com 已经开始导流了。优化 GEO（生成式引擎优化），让 AI 搜索引擎更容易引用 metool 的工具页面。",[184,3629,3630,3633],{},[49,3631,3632],{},"继续用数据说话","：每次改动都要在数据里看到反馈。用同样的 GA 分析 Skill 追踪国际市场的变化，不猜，只看数据。",[14,3635,3636],{},"从 0 到 2 万用户，用了大半年。下一个目标不是简单地把数字再翻一倍，而是让增长的来源更分散、更健康、更国际化。",[14,3638,3639],{},"中国区的 Bing 红利给了 metool 第一波起飞的燃料。但要飞得更远，需要更多的引擎。",{"title":316,"searchDepth":317,"depth":317,"links":3641},[3642,3643,3644,3645,3646],{"id":3449,"depth":320,"text":3449},{"id":3485,"depth":320,"text":3486},{"id":3521,"depth":320,"text":3521},{"id":3554,"depth":320,"text":3555},{"id":3577,"depth":320,"text":3578},"2026-05-10","用自己做的 GA 分析 Skill 持续迭代了几个版本之后，metool 过去 90 天的活跃用户从不到 2000 涨到了 2 万，事件数增长了 17 倍。但数据也清楚地告诉我一件事：流量高度依赖中国区的 Bing，国际市场几乎没打开。是时候认真想想怎么走出去了。",[3650,3653,3656,3659],{"q":3651,"a":3652},"metool 过去 90 天的增长数据是多少？","活跃用户 2 万（增长 1033.4%），事件数 25 万（增长 1720.6%），浏览次数 4.7 万（增长 695.3%），每位活跃用户平均互动时长 2 分 06 秒（增长 116.8%）。从 2 月到 5 月初，日活从接近零攀升到 6000 左右。",{"q":3654,"a":3655},"metool 的流量主要来自哪里？","排名第一的是 cn.bing.com referral（7911 次），其次是直接访问（3783 次）、bing organic（1469 次）、doubao.com referral（426 次）、google organic（200 次）、chatgpt.com referral（159 次）。中国区 Bing 是绝对的流量主力，Google 的自然搜索流量远低于预期。",{"q":3657,"a":3658},"metool 的用户分布在哪些国家和地区？","中国大陆 1.2 万（占比约 80%），美国 755，新加坡 631，香港 467，日本 398，台湾 207，德国 54。虽然覆盖了全球多个地区，但中国区一家独大，国际市场的渗透率还很低。",{"q":3660,"a":3661},"为什么要从中国区向国际市场扩展？","单一市场依赖风险高，中国区的流量主要靠 Bing 一个渠道，如果 Bing 算法变化或收录策略调整，流量可能断崖式下跌。国际市场的工具需求更大、付费意愿更强、Google SEO 的长尾效应更持久。而且 metool 已经默认英文界面，国际化的基础设施是现成的。",{},"\u002Fbuilds\u002Fmetool\u002F2026-05-10-data-growth-go-global",{"title":3444,"description":3648},[3666,3667,3668,3669,3670,3671,3672],"独立开发出海","工具站国际化","Google Analytics 数据分析","在线工具流量增长","Bing SEO 中国区","AI Skill 数据驱动","工具站全球化策略","builds\u002Fmetool\u002F2026-05-10-data-growth-go-global","metool 过去 90 天活跃用户增长 1033%，事件数增长 1720%，用自建 GA 分析 Skill 持续迭代是核心驱动力。但流量来源分析显示 56% 来自 cn.bing.com，中国区占绝对主导。国际市场的 Google organic 仅 200 次，说明 Google SEO 还没真正打开。下一阶段的重心是突破中国区依赖，向国际市场进发。",[1078,1746],"icPCk9P0agGM-7QowKbFYXI4VimjQWm5mqzfxRf8nmI",{"id":3678,"title":3679,"body":3680,"date":3945,"description":3946,"draft":329,"extension":330,"faq":3947,"meta":3960,"navigation":345,"path":3961,"project":2121,"readingTime":557,"seo":3962,"seoKeywords":3963,"stem":3971,"summary":3972,"tags":3973,"updated":363,"__hash__":3974},"builds\u002Fbuilds\u002Fmetool\u002F2026-04-12-capability-first-ux.md","用数据发现了用户在哪里流失，然后我重写了自己的 UX 准则",{"type":8,"value":3681,"toc":3931},[3682,3685,3693,3699,3702,3708,3711,3714,3718,3721,3725,3731,3734,3754,3758,3764,3766,3786,3790,3799,3803,3806,3812,3817,3831,3834,3838,3841,3847,3852,3884,3888,3891,3898,3904,3907,3913,3916,3919,3922,3925,3928],[18,3683,3684],{"id":3684},"用自己做的工具分析自己的工具",[14,3686,3687,3688,3692],{},"最近用自己的 ",[279,3689,3691],{"href":3470,"rel":3690,"target":2003},[283],"GA4 + GSC 分析技能"," 做了一次 metool 的完整数据审查。这个技能会自动拉取 Google Analytics 和 Search Console 的数据，分析用户行为路径，找出实际用户行为和预期目标之间的落差。",[14,3694,3695,3696],{},"数据里有一个细节让我停下来认真想了很久：",[49,3697,3698],{},"工具页面的跳出率比我预期的高很多，而且用户停留时间集中在前 10 秒。",[14,3700,3701],{},"10 秒。用户打开了工具页面，扫了一眼，然后就离开了。",[14,3703,3704,3705],{},"我重新打开了几个自己做的工具页面，第一次以\"用户\"而不是\"作者\"的视角去看。结论让我有点不舒服：",[49,3706,3707],{},"很多工具页面，在我没有上传任何文件之前，页面几乎是空的。",[14,3709,3710],{},"一个上传框，一段描述文字，仅此而已。用户不知道上传之后会发生什么，不知道有哪些配置选项，不知道最终结果长什么样子。唯一的选择是上传并等待——这需要一定的信任成本。",[14,3712,3713],{},"而用户不愿意在信任成本上赌注的时候，他们就直接离开了。",[18,3715,3717],{"id":3716},"提炼两条-ux-准则","提炼两条 UX 准则",[14,3719,3720],{},"这次体验让我重新想了工具类产品的交互逻辑，最后沉淀成两条准则。",[496,3722,3724],{"id":3723},"能力先于数据capability-first-ux","能力先于数据（Capability-First UX）",[14,3726,3727,3730],{},[49,3728,3729],{},"界面的结构与能力应独立于用户数据而完整存在。"," 数据的有无只改变状态，不改变界面的骨架与可见范围。",[14,3732,3733],{},"具体来说：",[181,3735,3736,3742,3748],{},[184,3737,3738,3741],{},[49,3739,3740],{},"零数据可读性","：即使没有任何用户输入，界面本身就是工具能力的完整说明书",[184,3743,3744,3747],{},[49,3745,3746],{},"结构恒定，状态渐进","：页面不因数据到达而从一种布局跳变为另一种布局",[184,3749,3750,3753],{},[49,3751,3752],{},"入口即全貌","：用户首次进入时所见 ≈ 工作中所见，消除「上传后才知道能做什么」的认知黑箱",[496,3755,3757],{"id":3756},"因果并列cause-effect-juxtaposition","因果并列（Cause-Effect Juxtaposition）",[14,3759,3760,3763],{},[49,3761,3762],{},"输入区与输出区在桌面端应并列放置，让用户一眼感知因果关系。"," 上下堆叠的布局迫使用户滚动才能看到操作的结果，打断了「操作 → 反馈」的认知流。",[14,3765,3733],{},[181,3767,3768,3774,3780],{},[184,3769,3770,3773],{},[49,3771,3772],{},"空间换认知","：桌面端屏幕宽度充裕时，优先用横向空间并列展示「输入 → 输出」",[184,3775,3776,3779],{},[49,3777,3778],{},"结果常驻可见","：输出区域使用 sticky 定位，在用户调整配置或滚动时始终停留在视口内",[184,3781,3782,3785],{},[49,3783,3784],{},"Demo 与正式态视觉分离","：示例内容必须在视觉上与正式操作态有明确区分，避免用户误判",[18,3787,3789],{"id":3788},"拿-iphone-拼长图工具做验证","拿 iPhone 拼长图工具做验证",[14,3791,3792,3793,3798],{},"想清楚这两条准则之后，我选了 metool 上的 ",[279,3794,3797],{"href":3795,"rel":3796,"target":2003},"https:\u002F\u002Fmetool.online\u002Fimages\u002FiphoneLongImageStitch\u002F",[283],"iPhone 拼长图"," 工具来做重构验证，因为这个工具的原始版本是一个典型的反例。",[496,3800,3802],{"id":3801},"老版本上传之后才能看见","老版本：上传之后才能看见",[14,3804,3805],{},"下面是老版本在用户没有上传任何图片时的页面：",[14,3807,3808],{},[55,3809],{"alt":3810,"src":3811},"老版本空状态：只有上传框，看不到任何功能结构","\u002Fb\u002Fmetool\u002Fux-compare-old-empty.png",[14,3813,3814],{},[49,3815,3816],{},"老版本的问题：",[1193,3818,3819,3822,3825,3828],{},[184,3820,3821],{},"上传区域之下的设置项（格式、品质、是否保持比例）和结果预览，只有上传图片之后才会出现",[184,3823,3824],{},"用户在上传前完全无法判断这个工具「有多少配置项」「结果长什么样」",[184,3826,3827],{},"整个页面是典型的垂直堆叠：上传 → 设置 → 结果，用户需要滚动才能看到操作结果",[184,3829,3830],{},"点击「开始拼接」之后，需要向下滚动才能看到结果",[14,3832,3833],{},"这是一个用户必须「先投入，才能了解」的工具。信任门槛很高。",[496,3835,3837],{"id":3836},"新版本首屏即全貌","新版本：首屏即全貌",[14,3839,3840],{},"下面是新版本在用户没有上传任何图片时的页面：",[14,3842,3843],{},[55,3844],{"alt":3845,"src":3846},"新版本空状态：界面骨架完整，设置和结果区始终可见","\u002Fb\u002Fmetool\u002Fux-compare-new-empty.png",[14,3848,3849],{},[49,3850,3851],{},"新版本的变化：",[1193,3853,3854,3860,3866,3872,3878],{},[184,3855,3856,3859],{},[49,3857,3858],{},"桌面端并列布局","：左侧是上传区 + 设置栏，右侧是结果预览区，不需要滚动就能同时看到",[184,3861,3862,3865],{},[49,3863,3864],{},"设置栏始终可见","：格式选择、品质滑块、自动去重叠开关，在上传前就能看见（视觉上淡化但结构完整）",[184,3867,3868,3871],{},[49,3869,3870],{},"结果区始终可见","：右侧结果区在无数据时以占位图展示，sticky 定位固定在视口内",[184,3873,3874,3877],{},[49,3875,3876],{},"Demo 模式","：首次进入时自动加载示例图片并展示拼接结果，用户一进门就能看到完整的「输入 → 结果」链路",[184,3879,3880,3883],{},[49,3881,3882],{},"Demo 视觉分离","：示例内容用虚线边框、降低饱和度、灰色 sparkle 标签标注，明确与正式操作态区分；上传入口始终保持可见",[496,3885,3887],{"id":3886},"关键细节demo-上方保留上传入口","关键细节：Demo 上方保留上传入口",[14,3889,3890],{},"这里有一个微妙的设计决策：Demo 内容和上传入口不能相互遮挡。",[14,3892,3893,3894,3897],{},"如果 Demo 内容填满了上传区，用户反而找不到「我要上传自己的图片」入口。所以新版本的处理是：Demo 状态下，",[49,3895,3896],{},"上传 FileDropZone 在上，Demo 缩略图展示在下","，用户随时都能直接拖拽上传，不需要先\"退出\"Demo 模式。",[436,3899,3902],{"className":3900,"code":3901,"language":441},[439],"┌─────────────────┐  ┌──────────────────┐\n│  📁 拖拽上传    │  │  ✦ Demo 结果预览 │\n│                 │  │                  │\n│  [FileDropZone] │  │  [stitched img]  │\n│                 │  │                  │\n├─────────────────┤  │  ↑ sticky 固定   │\n│  ✦ DEMO         │  └──────────────────┘\n│  [示例缩略图]   │\n│  → Demo 结果   │\n├─────────────────┤\n│  格式  品质  □  │  ← 设置栏始终可见\n└─────────────────┘\n",[79,3903,3901],{"__ignoreMap":316},[18,3905,3906],{"id":3906},"这两条准则的本质",[14,3908,3909,3910],{},"回头看，这两条准则本质上在解决同一个问题：",[49,3911,3912],{},"降低用户的认知税。",[14,3914,3915],{},"用户的认知资源是有限的。如果用户需要先上传、先等待，才能推断出「这个工具大概能做什么」，这个推断过程本身就是认知税。而工具类产品的用户通常是来解决具体问题的，他们不愿意把认知资源花在搞清楚界面上。",[14,3917,3918],{},"「能力先于数据」把这份认知税降为零——界面自己就是说明书。\n「因果并列」把操作反馈的延迟降为零——结果就在输入旁边。",[14,3920,3921],{},"两者加在一起，用户的\"我能做什么？\"\"做完之后是什么样？\"这两个问题，在进入页面的第一秒就有了答案。",[18,3923,3924],{"id":3924},"接下来的节奏",[14,3926,3927],{},"这次重构完成了拼长图工具，接下来会陆续把这两条准则应用到 metool 上其他的工具页面。优先处理那些「零数据状态下几乎是空白页」的工具。",[14,3929,3930],{},"同时继续用 GA4 数据来验证假设——这次改动是否真的降低了跳出率，用户停留时间是否有变化。数据说了算。",{"title":316,"searchDepth":317,"depth":317,"links":3932},[3933,3934,3938,3943,3944],{"id":3684,"depth":320,"text":3684},{"id":3716,"depth":320,"text":3717,"children":3935},[3936,3937],{"id":3723,"depth":317,"text":3724},{"id":3756,"depth":317,"text":3757},{"id":3788,"depth":320,"text":3789,"children":3939},[3940,3941,3942],{"id":3801,"depth":317,"text":3802},{"id":3836,"depth":317,"text":3837},{"id":3886,"depth":317,"text":3887},{"id":3906,"depth":320,"text":3906},{"id":3924,"depth":320,"text":3924},"2026-04-12","用自己做的 GA4 + GSC 分析工具审查 metool 的用户行为数据，发现用户在工具页面的一个关键流失点——不知道能做什么就离开了。这让我重新审视了整个交互逻辑，提炼出两条核心 UX 准则，并用 iPhone 拼长图工具做了一次完整的重构。",[3948,3951,3954,3957],{"q":3949,"a":3950},"什么是「能力先于数据」UX 原则？","界面的结构与功能区域应该独立于用户数据而完整存在。数据的有无只改变控件状态（启用\u002F禁用、填充\u002F占位），不改变界面的骨架与可见范围。用户第一眼看到的界面，就已经是工具能做什么的完整说明书。",{"q":3952,"a":3953},"什么是「因果并列」UX 原则？","在桌面端宽度充裕时，把输入区（操作\u002F配置）和输出区（结果\u002F预览）并列放置，让用户一眼就能感知因果关系。输出区使用 sticky 定位，在用户操作时始终停留在视口内，提供即时反馈。",{"q":3955,"a":3956},"为什么 Demo 内容要和正式操作态视觉上区分开？","如果 Demo 数据和用户实际操作结果在视觉上没有区别，用户容易误以为「数据已经预填了」或者「页面有 Bug」。使用降低饱和度、虚线边框、灰色调、标签标注等手段明确区分，同时 Demo 展示区始终保持上传入口可见，避免用户找不到操作入口。",{"q":3958,"a":3959},"这次 UX 重构具体改了什么？","把原来「先上传才能看到设置和结果区」的垂直堆叠布局，改为「设置和结果预览始终可见，数据到来前以占位\u002F禁用态展示」的并列布局。同时加入 Demo 模式，用户首次进入就能看到完整的输入 + 结果展示，消除了「上传后才知道能做什么」的认知黑箱。",{},"\u002Fbuilds\u002Fmetool\u002F2026-04-12-capability-first-ux",{"title":3679,"description":3946},[3964,3965,3966,3967,3968,3969,3970],"独立开发 UX 设计","工具类产品交互设计","能力先于数据 UX","因果并列布局","用户留存优化","Google Analytics 用户行为分析","在线工具交互优化","builds\u002Fmetool\u002F2026-04-12-capability-first-ux","通过 GA4 数据分析发现工具页面的高跳出率根源在于「数据到来前界面是空的」，提炼出「能力先于数据」和「因果并列」两条 UX 准则，并在 iPhone 拼长图工具上完成了完整重构，新版本在首屏即展示完整的界面骨架和 Demo 结果。",[1078,1746],"4xRt7OTQ-Eb2TfiUQvHXYGeDYvUFh9V6f-mS56bDP-U",{"id":3976,"title":3977,"body":3978,"date":4218,"description":4219,"draft":329,"extension":330,"faq":4220,"meta":4233,"navigation":345,"path":4234,"project":2121,"readingTime":541,"seo":4235,"seoKeywords":4236,"stem":4243,"summary":4244,"tags":4245,"updated":363,"__hash__":4246},"builds\u002Fbuilds\u002Fmetool\u002F2026-04-06-screen-editor.md","录了个产品演示，观众说看不清我点了哪里",{"type":8,"value":3979,"toc":4208},[3980,3986,3989,3992,3995,4001,4004,4008,4015,4018,4024,4027,4034,4037,4049,4054,4057,4063,4066,4069,4072,4086,4089,4092,4098,4101,4104,4117,4127,4134,4138,4141,4148,4151,4154,4157,4171,4183,4186,4190,4196,4199,4202,4205],[14,3981,3982],{},[55,3983],{"alt":3984,"src":3985},"metool editor","\u002Fb\u002Fmetool\u002Fvideo-editor-cover.png",[18,3987,3988],{"id":3988},"录屏视频的老问题",[14,3990,3991],{},"做独立开发这一年多，产品演示视频是绕不开的事。",[14,3993,3994],{},"不管是在 Product Hunt 上发布新工具、在 metool 官网展示功能，还是录一段教程发到 B站，都需要录屏。录屏本身不难，macOS 自带的录屏就够用。但录完之后看回放，总觉得哪里不对。",[14,3996,3997,3998],{},"问题很明确：",[49,3999,4000],{},"观众看不清我到底点了哪里。",[14,4002,4003],{},"光标在 1080p 的全屏画面里移动，菜单上某个选项被选中了，终端里跑出了一行关键输出。这些对我来说很清楚，因为我知道自己在干什么。但对观众来说，他们不是在\"看\"演示，而是在满屏幕\"找\"我点了哪里。",[18,4005,4007],{"id":4006},"openscreen-解决了问题但带来了新问题","OpenScreen 解决了问题，但带来了新问题",[14,4009,4010,4011,4014],{},"之前我一直在用 OpenScreen 做录屏视频的后期处理。它最核心的功能就是",[49,4012,4013],{},"动态聚焦","：在录屏视频的任意时间点，画面自动放大到你指定的操作区域，停留一会儿后平滑缩回全景。",[14,4016,4017],{},"效果很好，观众的视线被自然引导到关键操作，不需要加红框、画箭头、配旁白说\"请注意看右上角\"。",[14,4019,4020,4021],{},"但用了一段时间后，有一个持续困扰我的问题：",[49,4022,4023],{},"OpenScreen 的操作逻辑和我习惯的剪辑软件差太远了。",[14,4025,4026],{},"我日常用剪映和 iMovie，已经形成了肌肉记忆。播放头定位、快捷键分割、拖拽修剪、时间线操作，这些在剪映里是一套非常直觉的流程。但 OpenScreen 是 Electron 桌面应用，它的快捷键体系、界面交互、操作逻辑都是自成一套的。",[14,4028,4029,4030,4033],{},"每次打开 OpenScreen，我都需要一个\"切换脑子\"的过程。不是说它不好用，而是我用得",[49,4031,4032],{},"不顺手","。对一个偶尔才用一次的工具来说，这个切换成本太高了。",[18,4035,4036],{"id":4036},"自己做一个",[14,4038,4039,4040,4043,4044,130],{},"既然痛点这么明确，思路也很清楚：",[49,4041,4042],{},"做一个操作习惯对标剪映的录屏视频编辑器，把动态聚焦作为核心功能，跑在浏览器里。"," 于是就有了 metool 的 ",[279,4045,4048],{"href":4046,"rel":4047,"target":2003},"https:\u002F\u002Fmetool.online\u002Fvideos\u002FscreenEditor\u002F",[283],"录屏视频编辑器",[4050,4051],"video-player",{"alt":4052,"src":4053},"演示视频","\u002Fb\u002Fmetool\u002Feditor-demo_edited_compressed.mp4",[14,4055,4056],{},"不需要安装，不限平台，打开网页就能用。操作逻辑不需要重新学，⌘B 分割、拖拽修剪、时间线多片段管理，和剪映一模一样。",[14,4058,4059,4060],{},"核心差异点只有一个：",[49,4061,4062],{},"动态聚焦是一等公民。",[14,4064,4065],{},"在剪映或 iMovie 里，如果你想做类似的效果，需要手动打关键帧、调缩放参数、算坐标位置。能做，但流程很长。在这个编辑器里，按 Z 键，在预览画面上框选一个区域，就完成了。视频会以 ease-in-out 动画自动放大到那个区域，停留设定时间后平滑缩回。",[18,4067,4068],{"id":4068},"动态聚焦怎么用",[14,4070,4071],{},"具体的操作流程是这样的：",[1193,4073,4074,4077,4080,4083],{},[184,4075,4076],{},"上传一段录屏视频（MP4\u002FMOV\u002FM4V，200MB 以内）",[184,4078,4079],{},"在时间线上定位到需要聚焦的时间点",[184,4081,4082],{},"按 Z 键，在预览画面上框选关键操作区域",[184,4084,4085],{},"视频就会在那个时间点自动放大到框选区域",[14,4087,4088],{},"每个 Zoom 的进入和退出都有过渡动画，默认 1 秒，可以调。如果片段时长不够，系统会自动适配过渡参数，不会出现动画卡顿的情况。",[14,4090,4091],{},"在时间线上，Zoom 关键帧是可以直接拖拽的，调整位置和时长都很直观。",[14,4093,4094,4097],{},[49,4095,4096],{},"这个功能让录屏视频从\"裸录屏\"变成\"有引导的专业演示\"。"," 观众不需要自己找重点，画面会自动带着他们看。",[18,4099,4100],{"id":4100},"不只是动态聚焦",[14,4102,4103],{},"既然做了编辑器，剪辑的基本功能也不能少。",[14,4105,4106,4109,4110,4113,4114,130],{},[49,4107,4108],{},"时间线剪辑","完全对标剪映的操作方式：播放头定位 → ⌘B 分割 → 拖拽修剪头尾 → 拖拽重排序。每个片段可以独立设置 ",[49,4111,4112],{},"0.25x 到 4x 的变速","（慢放关键步骤、快进重复操作），以及 ",[49,4115,4116],{},"0 到 200% 的音量调节",[14,4118,4119,4122,4123,4126],{},[49,4120,4121],{},"视觉效果","是另一个加分项。准备了 ",[49,4124,4125],{},"16 款 macOS 风格壁纸","作为背景（深空紫、日落、海洋蓝、极光绿等），加上渐变和纯色选项。圆角、阴影强度、内边距、背景模糊都可以调。录屏画面套上这些效果，瞬间从\"截屏录像\"变成\"产品宣传片\"的质感。",[14,4128,4129,4130,4133],{},"还做了",[49,4131,4132],{},"编辑进度持久化","。所有编辑状态自动保存到 IndexedDB，下次上传同一个视频，片段分割、Zoom 关键帧、变速、音量、样式配置全部恢复。不用担心浏览器关了就白干了。",[18,4135,4137],{"id":4136},"导出浏览器也能做","导出：浏览器也能做",[14,4139,4140],{},"导出是我最担心的环节。视频编码在浏览器里跑，性能够吗？",[14,4142,4143,4144,4147],{},"答案是够的。用了浏览器原生的 ",[49,4145,4146],{},"WebCodecs API","，H.264 视频编码 + AAC 音频编码，GPU 加速。支持原始分辨率、1080p、720p、480p 多档输出。最关键的是，动态聚焦效果、变速、音量调节、视觉样式，在导出的视频里全部完整保留。",[14,4149,4150],{},"不需要上传到服务器，所有处理都在本地完成。",[18,4152,4153],{"id":4153},"和其他工具的定位区别",[14,4155,4156],{},"市面上做录屏和编辑的工具不少，但定位各有不同。",[14,4158,4159,4162,4163,4166,4167,4170],{},[49,4160,4161],{},"Screen Studio"," 是 macOS 上的标杆，月费 $29，录屏+编辑一体化，动画效果丰富。但它是付费的、macOS 专属的。",[49,4164,4165],{},"OpenScreen"," 是开源替代品，免费但需要下载 Electron 应用，操作方式自成一套。",[49,4168,4169],{},"Cap"," 是开源 Loom 替代品，核心是录屏+分享，编辑功能比较基础。",[14,4172,4173,4174,4178,4179,4182],{},"metool 的 ",[279,4175,4177],{"href":4046,"rel":4176,"target":2003},[283],"录屏编辑器"," 不做录屏，",[49,4180,4181],{},"只做录屏的后期编辑","。定位很窄，但在这个窄赛道上做得更深：动态聚焦是一等公民、操作习惯对标主流编辑器、16 款壁纸背景一键配置、变速和音量精细控制、纯浏览器零安装。",[14,4184,4185],{},"对于 3 到 15 分钟的录屏视频后期，这个工具比全功能编辑器快得多。",[18,4187,4189],{"id":4188},"自己用的工具做起来最有底气","自己用的工具，做起来最有底气",[14,4191,4192,4193],{},"回头看 metool 上做过的所有工具，",[49,4194,4195],{},"自己是重度用户的工具，做起来方向感最强。",[14,4197,4198],{},"公众号 Markdown 转换是这样，音频编辑器是这样，这个录屏编辑器也是这样。需求不是调研来的，是自己用的时候觉得\"这里不对\"然后去解决的。",[14,4200,4201],{},"OpenScreen 的操作逻辑让我每次都要\"切换脑子\"，这不是一个产品评测意义上的缺点，是我个人工作流里的真实摩擦。这种摩擦只有自己用的时候才能感受到，别人的需求文档里不会写。",[14,4203,4204],{},"接下来要做的是把这个工具和之前的 GEO 策略结合起来：在工具页底部注入详细的使用场景文章，让 AI 搜索引擎也能理解\"这是一个带动态聚焦功能的在线录屏编辑器\"。",[14,4206,4207],{},"工具和内容的结合，是 metool 现在的主要打法。",{"title":316,"searchDepth":317,"depth":317,"links":4209},[4210,4211,4212,4213,4214,4215,4216,4217],{"id":3988,"depth":320,"text":3988},{"id":4006,"depth":320,"text":4007},{"id":4036,"depth":320,"text":4036},{"id":4068,"depth":320,"text":4068},{"id":4100,"depth":320,"text":4100},{"id":4136,"depth":320,"text":4137},{"id":4153,"depth":320,"text":4153},{"id":4188,"depth":320,"text":4189},"2026-04-06","一直在用 OpenScreen 做产品演示视频的动态聚焦，但它的操作逻辑和剪映、iMovie 差太远，每次用都得重新适应。既然痛点这么明确，不如自己做一个。于是在 metool 上做了一个纯浏览器的录屏视频编辑器，核心功能就是动态聚焦。",[4221,4224,4227,4230],{"q":4222,"a":4223},"什么是动态聚焦（Smooth Zoom）？","动态聚焦是一种录屏视频的后期编辑技术。在视频的任意时间点，画面以丝滑动画自动放大到你框选的关键操作区域，停留设定时间后平滑缩回全景。这样观众的视线会被自然引导到操作重点，不需要红框标注或语音提示'请看右上角'。",{"q":4225,"a":4226},"这个编辑器和 Screen Studio、OpenScreen 有什么区别？","Screen Studio 是 macOS 专属付费应用（月费 $29），OpenScreen 是需要下载的 Electron 桌面应用且操作方式与主流编辑器差异大。MeTool 的编辑器是纯浏览器在线工具，零安装、跨平台、完全免费，操作习惯对标剪映和 iMovie（⌘B 分割、Z 添加 Zoom、拖拽修剪）。",{"q":4228,"a":4229},"这个编辑器除了动态聚焦还有什么功能？","包括剪映式时间线剪辑（分割、修剪、重排序）、0.25x-4x 变速控制、0-200% 音量调节、16 款 macOS 风格壁纸背景、可调圆角和阴影、背景模糊、编辑进度自动保存到 IndexedDB、WebCodecs GPU 加速导出。",{"q":4231,"a":4232},"浏览器里能做视频编辑和导出吗？","可以。使用浏览器原生的 WebCodecs API 进行 H.264 视频编码和 AAC 音频编码，GPU 加速渲染。支持原始分辨率、1080p、720p、480p 导出，动态聚焦效果和视觉样式在导出中完整保留。所有处理都在本地完成，不需要上传到服务器。",{},"\u002Fbuilds\u002Fmetool\u002F2026-04-06-screen-editor",{"title":3977,"description":4219},[4048,4237,4238,4239,4240,4241,4242],"动态聚焦视频","Screen Studio 替代品","OpenScreen 替代品","在线视频编辑器","产品演示视频制作","Smooth Zoom 录屏","builds\u002Fmetool\u002F2026-04-06-screen-editor","因为 OpenScreen 的操作逻辑和主流剪辑软件差异太大，自己在 metool 上做了一个纯浏览器的录屏视频编辑器。核心功能是动态聚焦（Smooth Zoom），让录屏视频自动放大到关键操作区域，操作习惯完全对标剪映和 iMovie，零安装、跨平台、完全免费。",[1078,1746],"2EFMus60db2ekLagwzCI-PSBBHGV_YfvYna5X6_hodQ",{"id":4248,"title":4249,"body":4250,"date":4218,"description":4403,"draft":329,"extension":330,"faq":4404,"meta":4417,"navigation":345,"path":4418,"project":4419,"readingTime":562,"seo":4420,"seoKeywords":4421,"stem":4429,"summary":4430,"tags":4431,"updated":363,"__hash__":4432},"builds\u002Fbuilds\u002Fmofanx\u002F2026-04-06-homepage-evolution-card-information-hierarchy.md","最新建造上首页，让回头客也看得见站点在变",{"type":8,"value":4251,"toc":4397},[4252,4255,4284,4294,4298,4313,4320,4324,4335,4354,4357,4363,4373,4376,4390],[18,4253,4254],{"id":4254},"先说说最初的别扭",[14,4256,4257,4258,4261,4262,4268,4269,4272,4273,4276,4277,4280,4281],{},"建造日志写了不少，内容都",[49,4259,4260],{},"有时效","：这周改了什么、为什么改、截了什么图。但这些信息默认待在 ",[49,4263,4264,4267],{},[79,4265,4266],{},"\u002Fbuilds\u002F..."," 各项目内页","里，按时间排序。对",[49,4270,4271],{},"第一次来","的人，可以从创造总览摸进去；对",[49,4274,4275],{},"常来首页","的回头客，如果习惯只扫首页和文章区，",[49,4278,4279],{},"不主动点进 builds","，就很难感知到：",[49,4282,4283],{},"这些网站其实一直在迭代，并不是上线就冻住的展示页。",[14,4285,4286,4287,4290,4291,130],{},"我想补上的，正是这种**「活着」的感觉**：不是多一个模块堆砌，而是让",[49,4288,4289],{},"最近的建造动态","在首页就有一席之地，和教学、思考并列，让人一眼知道",[49,4292,4293],{},"最近又在动什么",[18,4295,4297],{"id":4296},"首页多了一排最近演化","首页多了一排「最近演化」",[14,4299,4300,4301,4304,4305,4308,4309,4312],{},"做法很直接：在首页「莫烦创造」里，",[49,4302,4303],{},"标题下面先铺一排跨项目、按时间排序的最新日志卡片","，再保留下面原有的「创造项目」入口。前者回答「",[49,4306,4307],{},"最近哪几篇建造","」，后者回答「",[49,4310,4311],{},"想跟进哪个项目","」。",[14,4314,4315,4316,4319],{},"这样，",[49,4317,4318],{},"有时效的内容不再只藏在深一点的列表里","，回头客路过首页也能撞上最新一篇，站点是不是在动，有了可见的抓手。",[18,4321,4323],{"id":4322},"版式上顺带解决的-confusion","版式上顺带解决的 confusion",[14,4325,4326,4327,4330,4331,4334],{},"把两档信息摆在一起以后，新问题也来了：",[49,4328,4329],{},"单篇卡片","和",[49,4332,4333],{},"项目卡片","如果长得太像，读者会愣一下：点进去到底是读一篇文章，还是进整个项目？",[14,4336,4337,4338,4341,4342,4345,4346,4349,4350,4353],{},"所以后面一串都是为这个服务的：两类卡片的版式拉开；演化卡里",[49,4339,4340],{},"先标题、摘要、日期","，",[49,4343,4344],{},"项目 logo 和名称缩在底部","当辅助入口；头图",[49,4347,4348],{},"固定比例裁切","，同一行对齐；区块 ",[49,4351,4352],{},"h2 与 h3"," 用字号和衬线、无衬线区分。教学系列、最新思考的主标题也统一成同一套，首页读起来节奏一致。",[14,4355,4356],{},"下面是改版后「莫烦创造」一角的截图：能看见主标题装饰线、子标题层级，以及演化卡片的头图与信息顺序。",[14,4358,4359],{},[55,4360],{"alt":4361,"src":4362},"首页「莫烦创造」中的最新演化卡片与区块标题","\u002Fb\u002Fmofanx\u002Fbuild-recent-cards.png",[14,4364,4365,4366,4369,4370],{},"技术细节（多链接拆层、避免嵌套 ",[79,4367,4368],{},"\u003Ca>"," 等）之前也写过，这里不重复展开，核心还是：",[49,4371,4372],{},"动机先说清楚，交互才好跟。",[18,4374,4375],{"id":4375},"小结",[14,4377,4378,4379,4382,4383,4386,4387,130],{},"这次改动的起点，不是「卡片好不好看」，而是：",[49,4380,4381],{},"建造动态若只躺在内页，回头客很难感到站点在实时演化。"," 把它请到首页，再借版式把「读一篇」和「进项目」分开，读者先感到",[49,4384,4385],{},"最近在动","，再决定",[49,4388,4389],{},"跟进哪条线",[14,4391,4392,4393,4396],{},"若你也在做个人站或小产品站，不妨问自己：",[49,4394,4395],{},"有时效的那部分更新，新访客和回头客分别能在哪一层看见？"," 能看见，才谈得上「活的」。",{"title":316,"searchDepth":317,"depth":317,"links":4398},[4399,4400,4401,4402],{"id":4254,"depth":320,"text":4254},{"id":4296,"depth":320,"text":4297},{"id":4322,"depth":320,"text":4323},{"id":4375,"depth":320,"text":4375},"有时效性的建造记录都躺在创造日志内页里，常来的读者若不去点，几乎感觉不到这些网站还在迭代。我把跨项目的最新演化拎到首页，再顺手整理了卡片层级和版式，让「活着的站点」一眼能读到。",[4405,4408,4411,4414],{"q":4406,"a":4407},"为什么要把最新演化放到首页？","有时效性的更新如果只躺在各项目的创造日志列表里，回头客逛首页时看不到时间线，很容易觉得站点是静态的。把按时间汇总的最新几篇提到首页，扫一眼就能感到这些站还在长、还在改，和 Build in Public 想传递的「活的建造」一致。",{"q":4409,"a":4410},"首页上怎么区分「一篇演化」和「整个项目」？","上面一排是跨项目的单篇日志卡片，点进去读某次建造故事；下面一排是项目入口，点进去看该项目的全部演化与时间线。样式和标题层级拉开后，先读动机再进项目，不会和「进项目主页」混成一件事。",{"q":4412,"a":4413},"演化卡片里为什么把项目名称放在最下面？","读者先关心这次迭代讲了什么，项目名是归属信息。标题、摘要、日期在上，底部分隔线后再放小号的项目 logo 与名称链接，主路径是读文章，想进项目时间线再点辅助行。",{"q":4415,"a":4416},"头图和标题样式做了哪些配套？","头图用固定比例裁切，避免竖图把同一行卡片撑得高低不一。区块主标题用大字衬线加短装饰线，下面的「最新演化」「创造项目」用无衬线子标题，和教学系列、最新思考的主标题风格对齐，首页各板块读起来是同一套节奏。",{},"\u002Fbuilds\u002Fmofanx\u002F2026-04-06-homepage-evolution-card-information-hierarchy","mofanx",{"title":4249,"description":4403},[4422,4423,4424,4425,4426,4427,4428],"首页展示建造动态","创造日志首页曝光","Build in Public 回头客","独立站点产品迭代感知","内容站信息架构","演化卡片设计","Nuxt 个人站","builds\u002Fmofanx\u002F2026-04-06-homepage-evolution-card-information-hierarchy","建造记录若只放在 builds 内页，常来的读者不主动点进去，很难感知站点仍在实时演化。把跨项目最新演化提到首页「莫烦创造」区块，并区分文章卡与项目卡、固定头图与标题层级，让首页先回答「最近改了什么」，再谈进哪个项目。",[1078,1746],"eU7D5rP7gaH5iTUBfaiwqYb9oePWdHwMLdt-xtVhLkA",{"id":4434,"title":4435,"body":4436,"date":4631,"description":4632,"draft":329,"extension":330,"faq":4633,"meta":4646,"navigation":345,"path":4647,"project":2121,"readingTime":535,"seo":4648,"seoKeywords":4649,"stem":4657,"summary":4658,"tags":4659,"updated":363,"__hash__":4660},"builds\u002Fbuilds\u002Fmetool\u002F2026-04-04-content-meets-tool.md","尝到 SEO 甜头后，我开始琢磨怎么让 AI 也能找到我",{"type":8,"value":4437,"toc":4623},[4438,4442,4445,4451,4454,4457,4463,4466,4469,4472,4475,4480,4483,4489,4492,4495,4498,4504,4507,4513,4518,4521,4524,4530,4536,4574,4580,4587,4590,4593,4596,4602,4605,4609,4612,4615,4620],[18,4439,4441],{"id":4440},"seo-见效了然后呢","SEO 见效了，然后呢",[14,4443,4444],{},"上一篇写到，metool 的日活从不到 100 一下子涨到了 300。SEO 持续优化了几个月，终于看到了正反馈。",[14,4446,4447,4448],{},"这种\"做了就有效果\"的感觉让人上头。自然而然地，我开始想下一个问题：",[49,4449,4450],{},"还有什么增长渠道是我没覆盖到的？",[14,4452,4453],{},"答案几乎是立刻浮现的：AI 搜索引擎。",[14,4455,4456],{},"越来越多的人不再打开 Google 输入关键词了。他们直接问 ChatGPT、Perplexity、Google AI Overview。AI 直接给答案，用户甚至不需要点进任何网站。",[14,4458,4459,4460],{},"我自己就是这样。日常遇到问题，第一反应已经不是 Google，而是问 AI。那反过来想，",[49,4461,4462],{},"如果我的工具不能出现在 AI 的回答里，就等于在一个越来越大的流量入口前隐身了。",[18,4464,4465],{"id":4465},"纯工具页的致命问题",[14,4467,4468],{},"想象一下 AI 搜索引擎在抓取 metool 的一个工具页。",[14,4470,4471],{},"页面上有什么？一个标题、几个按钮、一个上传区域、一些交互控件。对人类来说，一眼就知道这是个图片压缩工具。但对 LLM 来说，页面上几乎没有可供\"理解\"的文本内容。",[14,4473,4474],{},"当用户问 AI：\"有什么好用的在线图片压缩工具？\"AI 需要的是一段可引用的文字描述，而不是一堆 HTML 按钮。",[14,4476,4477],{},[49,4478,4479],{},"纯工具页，对 AI 搜索引擎来说几乎是隐形的。",[18,4481,4482],{"id":4482},"把内容和工具捆在一起",[14,4484,4485,4486],{},"解决思路很直接：",[49,4487,4488],{},"给每个工具页都写一篇文章。",[14,4490,4491],{},"不是单独写一个博客页面，而是直接把文章注入到工具页的底部。用户打开页面，首屏还是工具本身，交互区在最上面，不影响使用。但如果用户想了解更多，比如\"这个工具支持哪些格式\"\"压缩算法是怎么回事\"\"和其他工具比有什么区别\"，往下滑就能找到。",[14,4493,4494],{},"同时，当 AI 搜索引擎抓取这个页面时，它不仅能看到工具的标题和按钮，还能看到一篇完整的、结构化的文章。这就给了 AI 足够的上下文去理解：\"这个页面是一个在线图片压缩工具，支持 PNG\u002FJPG\u002FWebP，无需上传到服务器，本地浏览器处理...\"",[14,4496,4497],{},"以 Word 转 PDF 这个工具页为例，改之前页面底部到\"相关工具推荐\"就结束了：",[14,4499,4500],{},[55,4501],{"alt":4502,"src":4503},"改版前：工具页底部只有 FAQ 和相关推荐，没有正文内容","\u002Fb\u002Fmetool\u002F2026-04-04_before_insert_article.jpeg",[14,4505,4506],{},"改之后，FAQ 和相关推荐下面多了一整篇文章，介绍这个工具的使用场景、核心优势、技术原理：",[14,4508,4509],{},[55,4510],{"alt":4511,"src":4512},"改版后：工具页底部注入了一篇完整的 GEO 文章","\u002Fb\u002Fmetool\u002F2026-04-04_after_insert_article.jpeg",[14,4514,4515],{},[49,4516,4517],{},"一个页面，同时服务两类读者：人类用户和 AI 模型。",[18,4519,4520],{"id":4520},"重新设计页面结构",[14,4522,4523],{},"为了让工具和内容自然共存，我和 AI 一起重新规划了页面结构：",[14,4525,4526],{},[55,4527],{"alt":4528,"src":4529},"工具页的新页面结构","\u002Fb\u002Fmetool\u002F2026-04-04_geo_artical_section.png",[14,4531,4532,4535],{},[49,4533,4534],{},"单工具页","从上到下分六层：",[1193,4537,4538,4544,4550,4556,4562,4568],{},[184,4539,4540,4543],{},[49,4541,4542],{},"Header"," — 面包屑导航、工具标题、一句话描述",[184,4545,4546,4549],{},[49,4547,4548],{},"工具交互区"," — 首屏核心，用户打开就能直接用",[184,4551,4552,4555],{},[49,4553,4554],{},"Feature Highlights"," — 功能亮点，快速建立信任感",[184,4557,4558,4561],{},[49,4559,4560],{},"Related Tools"," — 相关工具推荐，引导用户探索更多",[184,4563,4564,4567],{},[49,4565,4566],{},"FAQ Section"," — 常见问题，覆盖用户最可能搜索的问题",[184,4569,4570,4573],{},[49,4571,4572],{},"SEO\u002FGEO 长文章"," — 给搜索引擎和 AI 模型的深度内容",[14,4575,4576,4579],{},[49,4577,4578],{},"分类集合页","也类似，在工具卡片网格下面加了分类级的 FAQ 和介绍文章。",[14,4581,4582,4583,4586],{},"关键设计原则是：",[49,4584,4585],{},"工具功能在上，内容在下，互不干扰。"," 对着急用工具的人，首屏就是交互区；对想深入了解的人，向下滑就有完整信息；对 AI 爬虫，整个页面都是可理解的结构化内容。",[18,4588,4589],{"id":4589},"为什么我觉得这个方向很重要",[14,4591,4592],{},"这不只是一个 SEO 技巧，而是一个对未来的判断。",[14,4594,4595],{},"传统搜索引擎的逻辑是：用户搜关键词 → 看到结果列表 → 点进网站。在这个模式里，你只需要排名靠前就行。",[14,4597,4598,4599],{},"AI 问答的逻辑完全不同：用户提问 → AI 综合多个来源生成答案 → 可能附上引用链接。在这个模式里，",[49,4600,4601],{},"你的内容需要足够好、足够结构化，才能被 AI \"选中\"作为答案来源。",[14,4603,4604],{},"一个只有按钮和交互控件的工具页，在 AI 问答的世界里是不存在的。但一个工具页加上一篇高质量文章，就有可能在用户问\"best online audio editor\"的时候被 AI 引用。",[18,4606,4608],{"id":4607},"geo-的实验继续","GEO 的实验继续",[14,4610,4611],{},"从之前加 llms.txt、FAQ Schema、HowTo 结构化数据，到现在给每个工具页注入长文章，metool 一直在做 GEO（Generative Engine Optimization）的实验。",[14,4613,4614],{},"这些尝试能不能带来效果，还需要时间验证。但逻辑链条是清晰的：",[14,4616,4617],{},[49,4618,4619],{},"更多可被 AI 理解的内容 → AI 搜索引擎更容易引用 → 在 AI 问答时代获得更多曝光",[14,4621,4622],{},"传统 SEO 让你在 Google 结果页出现，GEO 让你在 AI 的回答里出现。两条路都得走。",{"title":316,"searchDepth":317,"depth":317,"links":4624},[4625,4626,4627,4628,4629,4630],{"id":4440,"depth":320,"text":4441},{"id":4465,"depth":320,"text":4465},{"id":4482,"depth":320,"text":4482},{"id":4520,"depth":320,"text":4520},{"id":4589,"depth":320,"text":4589},{"id":4607,"depth":320,"text":4608},"2026-04-04","用户量涨了三倍，SEO 是见效了。但我意识到光靠 Google 排名不够，还得让 ChatGPT、Perplexity 这些 AI 搜索引擎也能推荐你。问题是纯工具页对 AI 几乎是隐形的。于是我在每个工具页底部注入了一篇文章，让工具和内容捆绑。",[4634,4637,4640,4643],{"q":4635,"a":4636},"为什么要在工具页里写文章？","纯工具页几乎没有文本内容，LLM 抓取后无法理解这个页面是做什么的。当用户问 AI'有什么在线工具可以压缩图片'时，AI 没有足够的文本信息来引用你的工具页。在工具页注入一篇文章，等于给 AI 搜索引擎提供了可引用的内容。",{"q":4638,"a":4639},"这对用户体验有影响吗？","文章放在页面底部，工具交互区仍然在首屏。用户打开页面就能直接使用工具，不受影响。但如果用户想了解更多（比如使用技巧、格式对比、常见问题），向下滑就能找到。这种'工具在上、内容在下'的布局同时服务了两类需求。",{"q":4641,"a":4642},"什么是 GEO（Generative Engine Optimization）？","GEO 是针对 AI 搜索引擎（ChatGPT、Perplexity、Google AI Overview 等）的优化策略。传统 SEO 优化的是 Google 排名，GEO 优化的是'AI 回答问题时是否引用你的内容'。核心手段包括：提供结构化的高质量文本、FAQ、使用步骤说明、llms.txt 等，让 LLM 更容易理解和引用你的页面。",{"q":4644,"a":4645},"工具页的新页面结构是怎样的？","单工具页从上到下分六层：Header（面包屑\u002F标题\u002F描述）、工具交互区（首屏核心）、Feature Highlights（功能亮点信任信号）、Related Tools（相关工具推荐）、FAQ Section（常见问题）、SEO\u002FGEO 长文章（给搜索引擎和 AI 模型）。分类集合页则是：Header、工具卡片网格、FAQ、分类级介绍文章。",{},"\u002Fbuilds\u002Fmetool\u002F2026-04-04-content-meets-tool",{"title":4435,"description":4632},[4650,4651,4652,4653,4654,4655,4656],"GEO 优化策略","AI 搜索引擎优化","工具页内容注入","LLM 检索增强","Generative Engine Optimization","工具站内容策略","AI 问答时代 SEO","builds\u002Fmetool\u002F2026-04-04-content-meets-tool","SEO 见效、用户涨了三倍后，开始琢磨下一个增长渠道：AI 搜索引擎。发现纯工具页对 LLM 几乎是隐形的，没有文本内容就没有检索有效性。于是在每个工具页底部注入了长文章，让工具和内容深度捆绑，同时服务人类用户和 AI 模型。",[1078,361],"4m_V9B7pBnSr7zFPgd5BFaVEP2UB1HjkdSvteBao61Q",{"id":4662,"title":4663,"body":4664,"date":4631,"description":4820,"draft":329,"extension":330,"faq":4821,"meta":4834,"navigation":345,"path":4835,"project":4419,"readingTime":535,"seo":4836,"seoKeywords":4837,"stem":4845,"summary":4846,"tags":4847,"updated":363,"__hash__":4848},"builds\u002Fbuilds\u002Fmofanx\u002F2026-04-04-project-link-and-evolution-number.md","当陌生人开始读你的创造日志",{"type":8,"value":4665,"toc":4812},[4666,4669,4672,4678,4681,4684,4687,4690,4696,4702,4705,4708,4711,4714,4717,4720,4726,4729,4735,4738,4741,4747,4750,4753,4759,4765,4768,4771,4791,4794,4797,4803,4806,4809],[18,4667,4668],{"id":4668},"搜索引擎带来了陌生人",[14,4670,4671],{},"创造日志写了快二十篇了。最近翻 Google Search Console，发现有一些搜索流量直接落到了创造日志的文章页上。",[14,4673,4674,4675],{},"这是好事。但紧接着我意识到一个问题：",[49,4676,4677],{},"这些读者不认识我，也不知道文章里讲的项目在哪。",[14,4679,4680],{},"对我来说，文章里提到 metool.online，我当然知道它是什么。但换个视角想，一个搜索\"工具站 SEO 优化\"然后点进来的陌生人，读完文章的反应可能是：\"这个工具站听起来不错，我去看看\"，然后环顾四周，发现页面上没有任何跳转入口。",[14,4682,4683],{},"这不是内容的问题，是页面动线的盲区。",[18,4685,4686],{"id":4686},"给陌生人一个入口",[14,4688,4689],{},"解决方案很直接：在文章页的两个关键位置加上项目入口。",[14,4691,4692,4695],{},[49,4693,4694],{},"头部","，在日期、阅读时间这行元信息的末尾加了项目名称链接。读者还没开始读正文，就能看到这篇文章讲的是哪个项目，好奇的人可以直接点过去。",[14,4697,4698,4701],{},[49,4699,4700],{},"尾部","，在前后日志导航的上方放了一个带项目 logo 的 CTA 条。不是信息量很大的卡片，而是一句简单的引导：\"觉得有意思？前往体验\"。读到这里的人已经了解了背景，只需要一个行动入口。",[14,4703,4704],{},"两个位置服务两种阅读行为：扫一眼就走的人用头部，认真读完的人用尾部。",[18,4706,4707],{"id":4707},"一个被忽略的数字",[14,4709,4710],{},"做入口的时候，我重新审视了\"演化次数\"这个数据。",[14,4712,4713],{},"演化次数记录的是一个项目被打磨了多少次。对于 Build in Public 来说，这可能是最重要的一个数字：它直接传递了\"这个项目是活的，还是做完就扔了\"。",[14,4715,4716],{},"但之前，这个数字藏得很深。",[14,4718,4719],{},"首页的项目卡片上，它被包在一句\"查看 5 次演化思考\"的文案里，是辅助信息，不是主角。",[14,4721,4722],{},[55,4723],{"alt":4724,"src":4725},"改版前的首页卡片","\u002Fb\u002Fmofanx\u002Fbuild-card-before.png",[14,4727,4728],{},"改版后，我把数字从文案里提了出来，用大号渐变色独占卡片右侧。不需要读文字，扫一眼就知道这个项目迭代了多少次。",[14,4730,4731],{},[55,4732],{"alt":4733,"src":4734},"改版后的首页卡片","\u002Fb\u002Fmofanx\u002Fbuild-card-after.png",[18,4736,4737],{"id":4737},"从卡片到项目页",[14,4739,4740],{},"首页卡片改完，效果很好。但点进项目页之后，同样的数据缩回了一个小标签，和状态、链接挤在一行里，视觉权重几乎为零。",[14,4742,4743],{},[55,4744],{"alt":4745,"src":4746},"改版前的项目页头部","\u002Fb\u002Fmofanx\u002Fproject-header-before.png",[14,4748,4749],{},"这种断层感很明显：卡片上\"13\"是主角，进了项目页\"13\"就消失了。",[14,4751,4752],{},"所以项目页也做了同样的处理。演化次数被提到头部右侧，用大号渐变数字 + \"次演化\"标签展示，和左侧的项目信息用一条竖线自然分隔。",[14,4754,4755],{},[55,4756],{"alt":4757,"src":4758},"改版后的项目页头部","\u002Fb\u002Fmofanx\u002Fproject-header-after.png",[14,4760,4761,4762],{},"从卡片到项目页，同一个数字、同一套视觉语言，不再断层。这就是视觉锤的作用：",[49,4763,4764],{},"让最重要的信息获得最高的视觉权重，并且在所有页面上保持一致。",[18,4766,4767],{"id":4767},"几个小细节",[14,4769,4770],{},"顺手优化了时间线卡片的几个细节：",[181,4772,4773,4779,4785],{},[184,4774,4775,4778],{},[49,4776,4777],{},"封面图贴边","：去掉了图片的最大高度限制，让封面图上下都贴紧卡片边缘，由卡片圆角统一裁切",[184,4780,4781,4784],{},[49,4782,4783],{},"移动端省空间","：隐藏了\"阅读详情\"文字，卡片更紧凑",[184,4786,4787,4790],{},[49,4788,4789],{},"卡片限高","：加了整体最大高度，防止长图把卡片撑得过高",[14,4792,4793],{},"小改动，合在一起让页面更舒服了。",[18,4795,4796],{"id":4796},"视角变了",[14,4798,4799,4800],{},"这次迭代让我想明白一件事：",[49,4801,4802],{},"Build in Public 的页面，不能只考虑\"写给自己看\"。",[14,4804,4805],{},"搜索引擎带来了新读者，他们不了解你的项目背景，不知道产品在哪，甚至不确定你是谁。页面上的每一个设计决策，都应该同时服务老读者和第一次来的陌生人。",[14,4807,4808],{},"项目入口解决的是\"陌生人找不到路\"，演化数字解决的是\"陌生人感受不到生命力\"。",[14,4810,4811],{},"小改动，但看问题的视角变了。",{"title":316,"searchDepth":317,"depth":317,"links":4813},[4814,4815,4816,4817,4818,4819],{"id":4668,"depth":320,"text":4668},{"id":4686,"depth":320,"text":4686},{"id":4707,"depth":320,"text":4707},{"id":4737,"depth":320,"text":4737},{"id":4767,"depth":320,"text":4767},{"id":4796,"depth":320,"text":4796},"搜索引擎带来了不认识你的读者。他们找不到项目入口，感受不到项目的生命力。我重新设计了文章页的入口动线，然后把演化次数从一个不起眼的小标签，变成了页面上最醒目的数字。",[4822,4825,4828,4831],{"q":4823,"a":4824},"为什么要在创造日志的文章页加项目链接？","从搜索引擎来的读者不了解项目背景，读完文章后想看看项目本身却找不到入口。在文章头部元信息行加了项目名称链接，尾部加了带 logo 的 CTA 引导条，让读者在任何阅读阶段都能一键跳转。",{"q":4826,"a":4827},"为什么要把演化次数做成大号数字？","演化次数代表一个项目被打磨了多少次，是传递项目生命力的核心指标。之前它只是一个小标签，视觉权重几乎为零。升级为大号渐变数字后，读者第一眼就能感受到'这个项目迭代了十几次'，数字本身变成了视觉锤。",{"q":4829,"a":4830},"首页卡片和项目页的演化数字是怎么统一设计的？","首页项目卡片先改版，把数字从'查看 N 次演化思考'的文案中提出来，用大号渐变数字独占卡片右侧。然后项目 Timeline 页跟进，用同样的渐变数字 + 竖线分隔的布局，保持视觉一致性。",{"q":4832,"a":4833},"这次还做了哪些细节优化？","时间线卡片去掉了图片的最大高度限制，让封面图上下贴边自然填满；移动端隐藏了'阅读详情'文字以节省空间；卡片整体加了限高防止长图撑开布局。小改动，但让页面更紧凑舒服。",{},"\u002Fbuilds\u002Fmofanx\u002F2026-04-04-project-link-and-evolution-number",{"title":4663,"description":4820},[4838,4839,4840,4841,4842,4843,4844],"Build in Public 页面设计","创造日志用户动线","文章项目外链设计","演化次数视觉设计","独立开发者站点优化","搜索引擎用户体验","时间线页面迭代","builds\u002Fmofanx\u002F2026-04-04-project-link-and-evolution-number","搜索引擎带来了不认识你的读者，他们读完创造日志后找不到项目入口，也感受不到项目被反复打磨的生命力。通过在文章头部和尾部增加项目入口，并将演化次数从 inline 小标签升级为大号渐变数字视觉锤，让页面同时服务老读者和第一次来的陌生人。",[1078,1746],"v_3bJHpiWXSyofyIM44kKoJZBGMoAk1NSsoAOm8VTG0",{"id":4850,"title":4851,"body":4852,"date":5058,"description":5059,"draft":329,"extension":330,"faq":5060,"meta":5073,"navigation":345,"path":5074,"project":2121,"readingTime":535,"seo":5075,"seoKeywords":5076,"stem":5083,"summary":5084,"tags":5085,"updated":363,"__hash__":5086},"builds\u002Fbuilds\u002Fmetool\u002F2026-04-03-user-growth-and-quality.md","用户突然变多了，我慌了",{"type":8,"value":4853,"toc":5050},[4854,4857,4860,4866,4869,4872,4878,4882,4885,4888,4894,4897,4903,4906,4909,4912,4918,4921,4953,4959,4963,4966,4969,4973,4978,4981,4984,4987,4993,4996,5002,5008,5014,5017,5021,5024,5031,5037,5040,5047],[18,4855,4856],{"id":4856},"数据开始动了",[14,4858,4859],{},"打开 Google Analytics，我差点没反应过来。",[14,4861,4862],{},[55,4863],{"alt":4864,"src":4865},"metool 活跃用户增长趋势","\u002Fb\u002Fmetool\u002Fuser-boot.png",[14,4867,4868],{},"过去 28 天，活跃用户 880，涨了 67.9%。新用户 818，涨了 66.3%。但最让我兴奋的是那条曲线的尾巴：最近两天，日活跃用户从不到 100 一下子拉到了 300 左右。",[14,4870,4871],{},"前几篇文章一直在讲 SEO 优化、数据驱动、扩展 3D 品类。说实话，做这些事的时候心里是没底的，因为 SEO 是一个滞后反馈的游戏，你做了优化，可能要等几周甚至几个月才能看到效果。",[14,4873,4874,4875],{},"现在数据给了一个正反馈：",[49,4876,4877],{},"方向是对的。",[18,4879,4881],{"id":4880},"兴奋了三秒然后开始焦虑","兴奋了三秒，然后开始焦虑",[14,4883,4884],{},"高兴了一会儿之后，一个新的担忧浮上来。",[14,4886,4887],{},"这大半年来，我的策略一直是\"快速上线\"。借助 AI Coding 的速度，很多工具从想法到上线只用了一两个小时。几十个工具就是这么铺出来的。",[14,4889,4890,4891],{},"但\"快速上线\"的代价是：",[49,4892,4893],{},"很多工具没有经过认真测试。",[14,4895,4896],{},"用户少的时候，问题不明显。反正也没几个人用，有 bug 也没人发现。但现在日活 300 了，如果用户点进来发现工具不好用、功能太单薄、甚至有 bug，第一印象就毁了。",[14,4898,4899,4900,130],{},"做工具站最怕的不是没人来，而是",[49,4901,4902],{},"人来了，用了一次，再也不来了",[18,4904,4905],{"id":4905},"从最热门的页面开始",[14,4907,4908],{},"焦虑归焦虑，解决问题还是得靠数据。",[14,4910,4911],{},"打开 Google Analytics 的页面报告，看昨天哪些工具页面访问量最高：",[14,4913,4914],{},[55,4915],{"alt":4916,"src":4917},"昨日访问量 Top 5 的工具页面","\u002Fb\u002Fmetool\u002F20260403-top-tools.png",[14,4919,4920],{},"排名很清晰：",[1193,4922,4923,4929,4935,4941,4947],{},[184,4924,4925,4928],{},[49,4926,4927],{},"3D 模型格式转换"," — 92 次浏览，79 个活跃用户",[184,4930,4931,4934],{},[49,4932,4933],{},"音频编辑器"," — 36 次浏览，29 个活跃用户",[184,4936,4937,4940],{},[49,4938,4939],{},"图片压缩"," — 33 次浏览，20 个活跃用户",[184,4942,4943,4946],{},[49,4944,4945],{},"JSON 格式化"," — 26 次浏览，21 个活跃用户",[184,4948,4949,4952],{},[49,4950,4951],{},"Markdown 转换器"," — 23 次浏览，20 个活跃用户",[14,4954,4955,4956],{},"逻辑很简单：",[49,4957,4958],{},"用户最多的地方，最值得先修。",[18,4960,4962],{"id":4961},"_3d-格式转换意料之中的第一名","3D 格式转换：意料之中的第一名",[14,4964,4965],{},"3D 模型格式转换排第一，不意外。上一篇文章里分析过，3D 工具是 metool 唯一有自然搜索流量的品类。这次用户增长，3D 工具应该贡献了不少。",[14,4967,4968],{},"我把这个工具从头到尾跑了一遍，测试了各种格式之间的互转。修复了几个边界情况的问题，确保核心流程是通的。",[18,4970,4972],{"id":4971},"音频编辑器老工具的新问题","音频编辑器：老工具的新问题",[14,4974,4975,4976,130],{},"让我真正停下来思考的是排第二的",[49,4977,4933],{},[14,4979,4980],{},"这个工具是很久之前做的，当时只做了最基本的功能：上传音频、简单裁剪、导出。能用，但仅此而已。",[14,4982,4983],{},"29 个活跃用户，对一个功能单薄的工具来说，其实不少了。这说明\"在线音频编辑\"这个需求是真实存在的。但如果用户进来发现只能做简单裁剪，大概率会失望离开。",[14,4985,4986],{},"我和 AI 做了一轮对话，梳理了音频编辑器真正需要的功能：",[14,4988,4989],{},[55,4990],{"alt":4991,"src":4992},"和 AI 一起规划音频编辑器的功能增强","\u002Fb\u002Fmetool\u002F20260403-audio-editor-plan.png",[14,4994,4995],{},"梳理下来，功能可以分成三个梯队：",[14,4997,4998,5001],{},[49,4999,5000],{},"第一梯队，高频刚需","：淡入淡出（避免裁剪后的爆音）、MP3\u002FOGG 导出（不要只能导出巨大的 WAV）、音量调节、键盘快捷键、精确时间输入。这些不是\"加分项\"，而是\"没有就不好用\"。",[14,5003,5004,5007],{},[49,5005,5006],{},"第二梯队，差异化竞争力","：静音检测自动裁切（播客和录课用户的刚需）、片段边界拖拽调整、片段分割、变速播放。这些功能在大多数在线音频编辑器上都没有，做出来就是竞争力。",[14,5009,5010,5013],{},[49,5011,5012],{},"第三梯队，锦上添花","：波形\u002F频谱图切换、简易降噪、片段重叠检测、项目保存恢复。",[14,5015,5016],{},"思路很清楚：先把第一梯队做完，让工具从\"能用\"变成\"好用\"。",[18,5018,5020],{"id":5019},"从快速上线到让人用得住","从\"快速上线\"到\"让人用得住\"",[14,5022,5023],{},"回头看，这其实是一个自然的阶段切换。",[14,5025,5026,5027,5030],{},"前面大半年，核心命题是",[49,5028,5029],{},"覆盖面","：做更多工具、覆盖更多品类、占据更多搜索入口。速度是第一优先级。",[14,5032,5033,5034,130],{},"但当用户真的开始来了，核心命题就变了：",[49,5035,5036],{},"质量",[14,5038,5039],{},"一个工具好不好，不是我自己觉得好就行，而是用户用了之后愿不愿意再来。覆盖面解决的是\"让人发现你\"，质量解决的是\"让人留下来\"。",[14,5041,5042,5043,5046],{},"现在的策略是：",[49,5044,5045],{},"用数据找到用户最常用的工具，集中精力把它们做到真正好用。"," 不再追求工具数量的增长，而是把已有工具的深度做上去。",[14,5048,5049],{},"先从 3D 格式转换和音频编辑器开始。",{"title":316,"searchDepth":317,"depth":317,"links":5051},[5052,5053,5054,5055,5056,5057],{"id":4856,"depth":320,"text":4856},{"id":4880,"depth":320,"text":4881},{"id":4905,"depth":320,"text":4905},{"id":4961,"depth":320,"text":4962},{"id":4971,"depth":320,"text":4972},{"id":5019,"depth":320,"text":5020},"2026-04-03","SEO 持续优化后，metool 的活跃用户从日均不到 100 涨到了 300。兴奋之后是焦虑：很多工具没经过认真测试，用户真的能用吗？我决定从访问量最高的页面开始，逐个把质量关补上。",[5061,5064,5067,5070],{"q":5062,"a":5063},"metool 的用户增长是怎么实现的？","主要靠持续的 SEO 优化：默认语言切英文覆盖国际用户、全站加 FAQ 和 HowTo 结构化数据、基于搜索数据扩展 3D 工具品类、提交 IndexNow 加速收录。没有投广告，纯粹靠搜索引擎的自然流量增长。",{"q":5065,"a":5066},"用户变多后为什么会焦虑？","因为之前的策略是'快速上线'，借助 AI Coding 的速度，很多工具从开发到上线只用了一两个小时，没有做充分的功能测试。用户少的时候问题不明显，用户多了之后，功能不完善或存在 bug 会直接影响口碑和留存。",{"q":5068,"a":5069},"怎么决定优先测试和优化哪些工具？","看 Google Analytics 的页面浏览数据。昨天访问量最高的五个工具页面是：3D 模型格式转换（92 次浏览）、音频编辑器（36 次）、图片压缩（33 次）、JSON 格式化（26 次）、Markdown 转换器（23 次）。优先从访问量最高的开始测试和优化。",{"q":5071,"a":5072},"音频编辑器打算增强哪些功能？","分三个优先级：第一梯队是高频刚需（淡入淡出、MP3\u002FOGG 导出、音量调节、键盘快捷键）；第二梯队是差异化竞争力（静音检测自动裁切、片段边界拖拽调整、变速播放）；第三梯队是锦上添花（波形\u002F频谱图切换、简易降噪、项目保存恢复）。",{},"\u002Fbuilds\u002Fmetool\u002F2026-04-03-user-growth-and-quality",{"title":4851,"description":5059},[5077,5078,5079,5080,5081,3969,5082],"工具站用户增长","产品质量与用户体验","数据驱动功能优化","在线音频编辑器功能规划","独立开发产品测试","工具站功能迭代优先级","builds\u002Fmetool\u002F2026-04-03-user-growth-and-quality","metool 的 SEO 优化开始见效，活跃用户从日均不到 100 涨到 300。但用户变多带来了新的焦虑：很多工具是快速上线的，没有经过认真测试。通过 Google Analytics 找到访问量最高的工具页面，优先测试和增强 3D 模型格式转换和音频编辑器，从'快速上线'转向'让人用得住'。",[1078,1746],"BAltcFwRZ4So0Xjk-p8jOA2QfMGxN9df1AzCgd_7XrI",{"id":5088,"title":5089,"body":5090,"date":5397,"description":5398,"draft":329,"extension":330,"faq":5399,"meta":5412,"navigation":345,"path":5413,"project":2121,"readingTime":541,"seo":5414,"seoKeywords":5415,"stem":5424,"summary":5425,"tags":5426,"updated":363,"__hash__":5427},"builds\u002Fbuilds\u002Fmetool\u002F2026-04-01-data-driven-building.md","接入 Google Search Console，用搜索数据决定下一步做什么",{"type":8,"value":5091,"toc":5387},[5092,5095,5098,5101,5107,5110,5113,5116,5119,5133,5136,5140,5143,5163,5169,5172,5175,5178,5181,5185,5188,5191,5223,5229,5232,5236,5239,5242,5285,5288,5294,5300,5303,5306,5309,5312,5343,5346,5349,5352,5378,5384],[18,5093,5094],{"id":5094},"从搜索数据开始",[14,5096,5097],{},"上一篇聊了 URL 迁移导致检索量断崖式下跌。跌完之后呢？等恢复的同时，我开始认真看数据。",[14,5099,5100],{},"把 Google Search Console 的搜索词数据拉出来，终于看到了用户是怎么找到 metool 的：",[14,5102,5103],{},[55,5104],{"alt":5105,"src":5106},"Google Search Console 搜索词数据","\u002Fb\u002Fmetool\u002Fgoogle-search-queries.png",[14,5108,5109],{},"这张图里藏了很多信息。",[18,5111,5112],{"id":5112},"品牌词占主导",[14,5114,5115],{},"前四条搜索词全是品牌词的变体：me tool、metool、me tools、metools。加起来 49 次点击、1273 次展现。",[14,5117,5118],{},"这说明两件事：",[1193,5120,5121,5127],{},[184,5122,5123,5126],{},[49,5124,5125],{},"目前大部分用户是\"知道 metool 才来的\"","，而不是搜某个具体需求然后发现了 metool。换句话说，自然搜索带来的新用户还很少。",[184,5128,5129,5132],{},[49,5130,5131],{},"品牌词的点击率不高","。metool 这个词 743 次展现只有 19 次点击，说明搜索结果页上的标题和描述还不够吸引人，或者排名位置不够靠前。",[14,5134,5135],{},"品牌搜索是基本盘，但不能只靠基本盘。要增长，必须让非品牌搜索也能带来流量。",[18,5137,5139],{"id":5138},"_3d-查看器是唯一的自然流量信号","3D 查看器是唯一的自然流量信号",[14,5141,5142],{},"往下看，终于看到了非品牌词：",[181,5144,5145,5151,5157],{},[184,5146,5147,5150],{},[49,5148,5149],{},"glb viewer"," — 1 次点击，97 次展现",[184,5152,5153,5156],{},[49,5154,5155],{},"glb viewer online"," — 1 次点击，20 次展现",[184,5158,5159,5162],{},[49,5160,5161],{},"gltf viewer online"," — 1 次点击，14 次展现",[14,5164,5165,5166],{},"点击量虽然只有个位数，但展现量说明了问题：",[49,5167,5168],{},"有人在搜这些词，而且 Google 认为 metool 的页面和这些搜索词相关。",[14,5170,5171],{},"97 次展现意味着 Google 已经把 metool 的 3D 查看器页面展示给了将近 100 个搜索用户。只是排名可能还不够高，用户没有点进来。",[14,5173,5174],{},"这是一个信号：3D 在线查看器是一个有真实需求的品类，而且 metool 已经有了初步的搜索基础。",[18,5176,5177],{"id":5177},"游戏也有微弱信号",[14,5179,5180],{},"最后两条：五子棋ai（11 次展现）、围棋在线（8 次展现）。量很小，但说明游戏品类也有一些自然搜索曝光。不过游戏市场的竞争格局和工具市场完全不同，暂时不作为重点。",[18,5182,5184],{"id":5183},"和-ai-一起做用户调研","和 AI 一起做用户调研",[14,5186,5187],{},"光看搜索词还不够。搜索「glb viewer」的人到底是谁，他们真正需要什么？",[14,5189,5190],{},"我和 AI 一起做了一轮用户需求分析，拆解出了几类典型用户：",[181,5192,5193,5199,5205,5211,5217],{},[184,5194,5195,5198],{},[49,5196,5197],{},"3D 设计师","：快速预览模型效果，不想打开 Blender 或 Maya。metool 的 GLB Viewer 基本满足。",[184,5200,5201,5204],{},[49,5202,5203],{},"游戏开发者","：检查导出的模型是否正确，查看动画和材质。当前只能看，缺少模型信息面板。",[184,5206,5207,5210],{},[49,5208,5209],{},"3D 打印爱好者","：检查模型尺寸和可打印性。这部分完全没覆盖。",[184,5212,5213,5216],{},[49,5214,5215],{},"前端\u002FWeb 开发者","：预览要嵌入网页的 3D 资源，关心性能指标。也没覆盖。",[184,5218,5219,5222],{},[49,5220,5221],{},"采购和 PM","：收到 3D 资产后快速查看，不想装软件。基本满足。",[14,5224,5225,5226,130],{},"这个分析很有价值。它告诉我两件事：第一，3D 查看器的用户群比我想象的宽得多；第二，",[49,5227,5228],{},"不同用户需要的不只是\"查看\"，还有格式转换、模型优化、信息检查这些周边能力",[14,5230,5231],{},"围绕这些需求，新的工具方向就清晰了：不同格式的查看器覆盖更多搜索入口，模型优化器和格式转换器满足深层需求。每个新页面都是一个独立的长尾关键词入口。",[18,5233,5235],{"id":5234},"用数据做决策一口气强化整个-3d-品类","用数据做决策：一口气强化整个 3D 品类",[14,5237,5238],{},"不是只加一个工具，而是把整个 3D 品类做厚。",[14,5240,5241],{},"metool 之前只有 GLB\u002FglTF Viewer、STL Viewer 和 Text to 3D 三个 3D 相关工具。这次基于数据信号和用户调研，一口气补上了四个：",[181,5243,5244,5254,5264,5274],{},[184,5245,5246,5253],{},[49,5247,5248],{},[279,5249,5252],{"href":5250,"rel":5251,"target":2003},"https:\u002F\u002Fmetool.online\u002F3d\u002FfbxViewer\u002F",[283],"FBX Viewer"," — 游戏开发和动画领域的主流格式，覆盖 fbx viewer online、fbx file viewer 等搜索词",[184,5255,5256,5263],{},[49,5257,5258],{},[279,5259,5262],{"href":5260,"rel":5261,"target":2003},"https:\u002F\u002Fmetool.online\u002F3d\u002FusdzViewer\u002F",[283],"USDZ\u002FUSD Viewer"," — Apple AR 生态的标准格式，iOS 开发者和设计师的刚需",[184,5265,5266,5273],{},[49,5267,5268],{},[279,5269,5272],{"href":5270,"rel":5271,"target":2003},"https:\u002F\u002Fmetool.online\u002F3d\u002FmodelOptimizer\u002F",[283],"3D Model Optimizer"," — 在线减面、压缩贴图，覆盖 reduce 3d model size、optimize glb file 等搜索词",[184,5275,5276,5284],{},[49,5277,5278,5279],{},"增强了 ",[279,5280,5283],{"href":5281,"rel":5282,"target":2003},"https:\u002F\u002Fmetool.online\u002F3d\u002FmodelConvert\u002F",[283],"3D Model Format Converter"," — 支持 STL、OBJ、GLB、glTF、PLY、FBX、DAE 等格式互转",[14,5286,5287],{},"加上原有的三个，metool 的 3D 工具品类从 3 个扩展到了 7 个。",[14,5289,5290],{},[55,5291],{"alt":5292,"src":5293},"metool 的 3D 工具矩阵","\u002Fb\u002Fmetool\u002F3d-tools-matrix.png",[14,5295,5296,5297],{},"这就是数据驱动和凭感觉做的区别：",[49,5298,5299],{},"不是\"我觉得某个工具有用所以做\"，而是\"数据显示 3D 查看器有需求 → 调研发现用户群比想象的宽 → 围绕整个品类做厚\"。",[18,5301,5302],{"id":5302},"一个实验田",[14,5304,5305],{},"我想把 metool 做成数据驱动型构建的实验田。",[14,5307,5308],{},"之前做了大半年工具，模式是\"有什么想法就做什么\"。工具做了几十个，但哪些有人用、哪些没人用，心里没数。",[14,5310,5311],{},"现在的模式是一个循环：",[1193,5313,5314,5320,5326,5332,5338],{},[184,5315,5316,5319],{},[49,5317,5318],{},"收集数据"," — Google Search Console 看搜索词，Google Analytics 看用户行为",[184,5321,5322,5325],{},[49,5323,5324],{},"分析信号"," — 哪些品类有自然需求，哪些搜索词有潜力",[184,5327,5328,5331],{},[49,5329,5330],{},"做出决策"," — 优先做数据验证过的方向",[184,5333,5334,5337],{},[49,5335,5336],{},"上线验证"," — 看新工具的搜索表现",[184,5339,5340],{},[49,5341,5342],{},"回到第一步",[14,5344,5345],{},"这个循环听起来简单，但和之前的工作方式完全不同。之前是\"做完就忘\"，现在是\"做完还要看数据反馈\"。",[18,5347,5348],{"id":5348},"下一步",[14,5350,5351],{},"3D 品类已经铺开了，接下来要做的是深耕和验证：",[181,5353,5354,5360,5366,5372],{},[184,5355,5356,5359],{},[49,5357,5358],{},"增强现有查看器的深度功能","：模型信息面板（顶点数、面数、材质列表）、截图导出、环境贴图切换、URL 直接加载。这些功能能提升用户停留时间和回访率。",[184,5361,5362,5365],{},[49,5363,5364],{},"优化品牌词的点击率","：743 次展现只有 19 次点击，搜索结果的标题和描述需要更有吸引力。",[184,5367,5368,5371],{},[49,5369,5370],{},"追踪新工具的搜索表现","：这批 3D 工具上线后，观察 Google 何时开始收录、展现量和点击量的变化趋势。这是验证\"数据驱动\"循环是否有效的关键一步。",[184,5373,5374,5377],{},[49,5375,5376],{},"观察 URL 迁移后的恢复速度","：上次切默认语言导致索引断崖，需要持续追踪。",[14,5379,5380,5381],{},"长期来看，我想验证一个假设：",[49,5382,5383],{},"一个工具站，能不能完全靠数据驱动来决定做什么、优化什么、放弃什么。",[14,5385,5386],{},"不靠直觉，不靠\"我觉得\"，只靠数据说话。metool 就是这个实验。",{"title":316,"searchDepth":317,"depth":317,"links":5388},[5389,5390,5391,5392,5393,5394,5395,5396],{"id":5094,"depth":320,"text":5094},{"id":5112,"depth":320,"text":5112},{"id":5138,"depth":320,"text":5139},{"id":5177,"depth":320,"text":5177},{"id":5183,"depth":320,"text":5184},{"id":5234,"depth":320,"text":5235},{"id":5302,"depth":320,"text":5302},{"id":5348,"depth":320,"text":5348},"2026-04-01","不再凭感觉做工具了。把 Google Search Console 接入工作流，看到真实的搜索词后发现 3D 查看器有自然流量潜力。和 AI 一起做了用户调研，一口气补上了 FBX Viewer、USDZ Viewer、3D 模型优化器。这是 metool 转向数据驱动型构建的第一步。",[5400,5403,5406,5409],{"q":5401,"a":5402},"为什么要用 Google Search Console 来指导工具开发？","Google Search Console 能看到用户是通过什么搜索词找到你的网站的，包括展现量和点击量。这比 Google Analytics 更直接地反映用户需求——用户在搜什么，说明他们需要什么。用这些数据来决定下一步做什么工具，比凭感觉靠谱得多。",{"q":5404,"a":5405},"搜索数据里发现了什么有价值的信号？","品牌词（metool、me tool 等）占了大部分点击，说明自然搜索带来的新用户还很少。但非品牌词中，glb viewer 有 97 次展现、gltf viewer online 有 14 次展现，说明 3D 在线查看器有真实的搜索需求，而且 Google 已经认为 metool 的页面与这些搜索词相关。",{"q":5407,"a":5408},"基于数据分析，这次做了哪些 3D 工具？","一口气做了四个新工具：FBX Viewer（游戏开发常用格式）、USDZ\u002FUSD Viewer（Apple AR 生态格式）、3D Model Optimizer（减面和贴图压缩）、增强了 3D Model Format Converter（支持更多格式互转）。加上原有的 GLB\u002FglTF Viewer、STL Viewer 和 Text to 3D，3D 品类从 2 个工具扩展到了 7 个。",{"q":5410,"a":5411},"什么是数据驱动型构建？","不再凭直觉决定做什么功能，而是通过搜索数据和用户行为数据发现真实需求，用 AI 辅助做深度调研，然后决定优先做什么。核心循环是：收集数据 → 分析信号 → AI 辅助调研 → 做出决策 → 上线验证 → 再看数据。metool 正在成为这种模式的实验田。",{},"\u002Fbuilds\u002Fmetool\u002F2026-04-01-data-driven-building",{"title":5089,"description":5398},[5416,5417,5418,5419,5420,5421,5422,5423],"Google Search Console 数据分析","数据驱动产品迭代","工具站搜索词分析","GLB Viewer 在线","FBX Viewer 在线工具","USDZ Viewer 在线","3D 模型优化器在线","独立开发数据驱动","builds\u002Fmetool\u002F2026-04-01-data-driven-building","通过 Google Search Console 分析 metool.online 的真实搜索数据，发现 3D 查看器是唯一有自然搜索流量的工具品类。和 AI 一起做了用户需求调研后，一口气补上了 FBX Viewer、USDZ\u002FUSD Viewer、3D Model Optimizer、增强了格式转换器，把 3D 工具从 2 个扩展到 7 个。这是从'凭感觉做工具'到'用数据决定做什么'的转变。",[1078,1746],"Pc5ArqDao5dfNG0TZmiUUo3Vq_NoOgAAuJWYzvhlGug",{"id":5429,"title":5430,"body":5431,"date":5567,"description":5568,"draft":329,"extension":330,"faq":5569,"meta":5582,"navigation":345,"path":5583,"project":2121,"readingTime":535,"seo":5584,"seoKeywords":5585,"stem":5593,"summary":5594,"tags":5595,"updated":363,"__hash__":5596},"builds\u002Fbuilds\u002Fmetool\u002F2026-03-31-url-restructure-cost.md","切换默认语言后，检索量断崖式下跌",{"type":8,"value":5432,"toc":5560},[5433,5436,5439,5445,5448,5451,5454,5460,5463,5466,5473,5493,5498,5501,5504,5507,5510,5513,5516,5519,5539,5542,5545,5548,5551,5554,5557],[18,5434,5435],{"id":5435},"数据说话",[14,5437,5438],{},"先看 Google Search Console 的数据：",[14,5440,5441],{},[55,5442],{"alt":5443,"src":5444},"切换 URL 路径后检索量断崖式下跌","\u002Fb\u002Fmetool\u002Findex-optimize.png",[14,5446,5447],{},"从 1 月到 3 月中旬，metool.online 的 Impressions（展现量）和 Clicks（点击量）一直在稳步增长。Impressions 从每天几十涨到了 300+，Clicks 从 0 涨到了日均 20+。",[14,5449,5450],{},"三个月的积累，一个决定，几乎归零。",[18,5452,5453],{"id":5453},"发生了什么",[14,5455,5456,5457],{},"3 月 19 日，我做了一个决定：",[49,5458,5459],{},"把 metool.online 的默认语言从中文切成英文。",[14,5461,5462],{},"原因很简单：工具站的使用场景是全球通用的。图片压缩、视频转 GIF、JSON 格式化，这些需求不分国界。英文覆盖的潜在用户群远大于中文。",[14,5464,5465],{},"但我低估了这个改动对 SEO 的冲击。",[14,5467,5468,5469,5472],{},"metool 用的是 Nuxt i18n 的 ",[79,5470,5471],{},"prefix_except_default"," 策略——默认语言不带路径前缀，其他语言带前缀。切换默认语言意味着：",[181,5474,5475,5485],{},[184,5476,5477,5478,5481,5482],{},"之前的中文页面 ",[79,5479,5480],{},"\u002Fimages\u002Fcompress\u002F"," → 变成了 ",[79,5483,5484],{},"\u002Fzh\u002Fimages\u002Fcompress\u002F",[184,5486,5487,5488,5481,5491],{},"之前的英文页面 ",[79,5489,5490],{},"\u002Fen\u002Fimages\u002Fcompress\u002F",[79,5492,5480],{},[14,5494,5495],{},[49,5496,5497],{},"全站几十个工具的 URL 全部变了。",[14,5499,5500],{},"紧接着 3 月 26 日，我又做了一轮 trailing slash 统一和 sitemap 重建。双重打击。",[18,5502,5503],{"id":5503},"代价",[14,5505,5506],{},"Google 已经索引的所有旧 URL 全部失效。搜索引擎不知道这些页面\"搬家\"了，它只看到旧 URL 返回了不同的内容（英文版），或者根本找不到了。",[14,5508,5509],{},"结果就是图表上看到的：Impressions 从日均 300+ 跌到不足 80，Clicks 从日均 20+ 跌到接近 0。",[14,5511,5512],{},"三个月的 SEO 积累，几天之内几乎清零。",[18,5514,5515],{"id":5515},"本可以做得更好",[14,5517,5518],{},"回头看，这次迁移本可以更平滑：",[181,5520,5521,5527,5533],{},[184,5522,5523,5526],{},[49,5524,5525],{},"301 重定向","：把旧 URL 301 到新 URL，告诉搜索引擎\"页面搬家了\"而不是\"页面消失了\"。SSG 静态站做 301 需要在部署层配置，当时没有做。",[184,5528,5529,5532],{},[49,5530,5531],{},"过渡期 sitemap","：新旧 URL 同时提交，用 canonical 标签指向新 URL，给搜索引擎过渡时间。",[184,5534,5535,5538],{},[49,5536,5537],{},"分步迁移","：先切语言，等索引稳定了再统一 trailing slash，避免双重打击。",[14,5540,5541],{},"这些都是标准的 URL 迁移方案，但我当时只想着\"赶紧改完\"，没有给搜索引擎留缓冲。",[18,5543,5544],{"id":5544},"为什么我认为长期是对的",[14,5546,5547],{},"短期阵痛是确定的，但我依然认为这个决定是对的。",[14,5549,5550],{},"中文互联网的工具站竞争激烈，而且中文用户获取成本高。英文作为默认语言，每一个工具页面都在面向全球用户。\"online image compressor\"的搜索量是\"在线图片压缩\"的几十倍。",[14,5552,5553],{},"按照 Google 的重新索引周期，新 URL 被完全爬取和收录通常需要 2-4 周，恢复到之前的排名水平可能需要 1-2 个月。前提是新 sitemap 已正确提交、内容质量没有下降。",[14,5555,5556],{},"现在能做的就是：确保新 sitemap 正确、补上 301 重定向、然后等待。",[14,5558,5559],{},"SEO 是一个长期游戏。有时候你必须接受短期的损失，去换一个更大的可能性。",{"title":316,"searchDepth":317,"depth":317,"links":5561},[5562,5563,5564,5565,5566],{"id":5435,"depth":320,"text":5435},{"id":5453,"depth":320,"text":5453},{"id":5503,"depth":320,"text":5503},{"id":5515,"depth":320,"text":5515},{"id":5544,"depth":320,"text":5544},"2026-03-31","为了面向国际用户把默认语言从中文切成英文，所有 URL 路径全变了。Google 索引一夜清零，三个月积累的检索量几乎归零。短期阵痛，但我认为长期是对的。",[5570,5573,5576,5579],{"q":5571,"a":5572},"为什么切换默认语言会导致检索量下跌？","Nuxt i18n 的 prefix_except_default 策略下，默认语言的页面不带语言前缀。把默认语言从中文切成英文后，原来的 \u002Fimages\u002Fcompress\u002F（中文页）变成了 \u002Fzh\u002Fimages\u002Fcompress\u002F，而 \u002Fimages\u002Fcompress\u002F 现在指向英文页。Google 已经索引的所有旧 URL 全部失效，需要重新爬取和建立索引。",{"q":5574,"a":5575},"有没有办法避免这种检索量损失？","可以通过 301 重定向将旧 URL 映射到新 URL，告诉搜索引擎页面搬家了而不是消失了。但 SSG 静态站实现 301 重定向比较复杂，需要在部署层（Nginx\u002FCloudflare）配置规则。另一个方案是在 sitemap 中同时提交新旧 URL 并标注 canonical，给搜索引擎过渡时间。",{"q":5577,"a":5578},"检索量预计多久能恢复？","根据 Google 的重新索引周期，通常需要 2-4 周让新 URL 被完全爬取和收录，1-2 个月恢复到之前的排名水平。前提是新 sitemap 已正确提交、robots.txt 没有阻拦、页面内容质量没有下降。如果做了 301 重定向，恢复速度会更快。",{"q":5580,"a":5581},"切换默认语言的长期收益是什么？","英文作为默认语言意味着全球用户访问时默认看到英文界面，搜索引擎也优先索引英文内容。工具站的使用场景（图片压缩、格式转换等）是全球通用的，英文覆盖的潜在用户群远大于中文。长期来看，国际流量的天花板比中文流量高得多。",{},"\u002Fbuilds\u002Fmetool\u002F2026-03-31-url-restructure-cost",{"title":5430,"description":5568},[5586,5587,5588,5589,5590,5591,5592],"网站 URL 迁移","Google 索引下降","默认语言切换 SEO 影响","sitemap 重建","搜索引擎重新收录","i18n URL 结构变更","独立开发 SEO 教训","builds\u002Fmetool\u002F2026-03-31-url-restructure-cost","metool.online 为面向国际用户将默认语言从中文切成英文，导致全站 URL 路径结构变更，Google 三个月积累的索引几乎归零。Impressions 从日均 300+ 跌到不足 80，Clicks 从日均 20+ 跌到接近 0。这是一次有意识的短期牺牲，押注长期的国际化收益。",[1078,1746],"JiLBHivnJLiSY1PmK_E_QtuRab70pGpC0z_ZoZPpYBo",{"id":5598,"title":5599,"body":5600,"date":5567,"description":5671,"draft":329,"extension":330,"faq":5672,"meta":5685,"navigation":345,"path":5686,"project":4419,"readingTime":317,"seo":5687,"seoKeywords":5688,"stem":5696,"summary":5697,"tags":5698,"updated":363,"__hash__":5699},"builds\u002Fbuilds\u002Fmofanx\u002F2026-03-31-timeline-card-thumbnail.md","给创造日志的时间线加上封面图",{"type":8,"value":5601,"toc":5665},[5602,5605,5608,5611,5617,5621,5624,5630,5633,5637,5640,5643,5649,5652,5656,5659,5662],[18,5603,5604],{"id":5604},"时间线像在看目录",[14,5606,5607],{},"创造日志的时间线页面上线后，我每次回去翻都觉得少了点什么。",[14,5609,5610],{},"所有卡片长得几乎一样：一个日期、一行标题、两行描述。从上往下扫，每张卡片的视觉权重完全相同，很难快速区分\"这篇写的是什么\"。像在看一份目录，而不是在浏览一段开发历程。",[14,5612,5613,5614,130],{},"问题很明显：",[49,5615,5616],{},"缺视觉锚点",[18,5618,5620],{"id":5619},"让文章自己长出封面","让文章自己\"长出\"封面",[14,5622,5623],{},"我不想手动给每篇文章设置一张封面图。因为大多数创造日志里本来就有截图，讲 metool 的有工具截图，讲 mofanx 的有页面截图。",[14,5625,5626,5627],{},"所以做了一个很简单的事：",[49,5628,5629],{},"让程序自动从文章正文里提取第一张图片，作为卡片的封面。",[14,5631,5632],{},"写完文章，封面就自动有了。零额外工作量。",[18,5634,5636],{"id":5635},"贴边不贴邮票","贴边，不贴邮票",[14,5638,5639],{},"第一版把图片放在卡片右侧，加了圆角和边框，尺寸也不大。看起来像一张邮票贴在卡片上，和内容有距离感。",[14,5641,5642],{},"调整后，让图片直接贴紧卡片的右侧边缘，上下也顶满，利用卡片自身的圆角自然裁切。左边是文字，右边是图片，形成一个自然的分区。",[14,5644,5645],{},[55,5646],{"alt":5647,"src":5648},"Timeline 卡片加上封面图后的效果","\u002Fb\u002Fmofanx\u002Ftimeline-thumbnail.png",[14,5650,5651],{},"没有图片的文章卡片会自然降级为纯文字布局，不会出现空白。",[18,5653,5655],{"id":5654},"小改动大不同","小改动，大不同",[14,5657,5658],{},"代码量很小，但浏览体验的变化是立竿见影的。",[14,5660,5661],{},"之前的时间线从头到尾全是文字，想找某篇日志只能逐行读标题。现在扫一眼图片就知道哪篇是哪篇：有工具截图的是 metool 迭代，有页面截图的是 mofanx 改版，有数据图的是 SEO 优化。",[14,5663,5664],{},"有时候决定体验好不好的，就是这种小细节。",{"title":316,"searchDepth":317,"depth":317,"links":5666},[5667,5668,5669,5670],{"id":5604,"depth":320,"text":5604},{"id":5619,"depth":320,"text":5620},{"id":5635,"depth":320,"text":5636},{"id":5654,"depth":320,"text":5655},"Timeline 卡片只有文字，浏览起来像看目录。从文章正文中自动提取第一张图片作为缩略图，让时间线有了视觉锚点。",[5673,5676,5679,5682],{"q":5674,"a":5675},"为什么要给时间线卡片加封面图？","纯文字的卡片浏览起来像在看目录，所有条目视觉权重相同，缺少区分度。加上封面图后，读者扫一眼就能通过图片快速判断这篇日志写的是什么，缩短了从'看到标题'到'决定是否点进去'的认知路径。",{"q":5677,"a":5678},"封面图是从哪来的？需要手动设置吗？","不需要手动设置。程序会自动从每篇文章正文中提取第一张图片作为封面图。因为大多数创造日志里本来就有截图，所以不用额外做任何事，写完文章封面图就自动有了。没有图片的文章会自然降级为纯文字布局，不会出现空白。",{"q":5680,"a":5681},"这个改动效果怎么样？","效果很明显。改之前，时间线从头到尾全是文字，像一份流水账清单。改之后，每张卡片都有了独特的视觉标识，读者扫一眼就知道哪篇讲的是什么。视觉锚点让浏览从'逐行阅读'变成了'快速扫描'。",{"q":5683,"a":5684},"封面图的布局是怎么设计的？","图片贴紧卡片的右侧和上下边缘，利用卡片自身的圆角自然裁切，和左侧的文字区域形成清晰分区。这样图片像是卡片的一部分而不是'贴上去的装饰'，视觉上更整体。",{},"\u002Fbuilds\u002Fmofanx\u002F2026-03-31-timeline-card-thumbnail",{"title":5599,"description":5671},[5689,5690,5691,5692,5693,5694,5695],"创造日志时间线设计","Build in Public 页面优化","卡片封面图自动提取","时间线视觉体验","Timeline UI 设计","文章缩略图自动生成","内容浏览体验优化","builds\u002Fmofanx\u002F2026-03-31-timeline-card-thumbnail","创造日志的时间线卡片原本只有文字，浏览起来像看目录。让程序自动从每篇文章中提取第一张图片作为封面，时间线瞬间有了生命力。一个很小的改动，但对浏览体验的影响立竿见影。",[1078,1746],"trkpOPzMUiuMEU1wmJ2VVoXqHUuW68n7K76jB9Hj3NQ",{"id":5701,"title":5702,"body":5703,"date":5807,"description":5808,"draft":329,"extension":330,"faq":5809,"meta":5822,"navigation":345,"path":5823,"project":4419,"readingTime":535,"seo":5824,"seoKeywords":5825,"stem":5833,"summary":5834,"tags":5835,"updated":363,"__hash__":5836},"builds\u002Fbuilds\u002Fmofanx\u002F2026-03-27-three-content-types.md","引入三种内容形态：教学、创造、思考",{"type":8,"value":5704,"toc":5801},[5705,5708,5716,5719,5722,5725,5731,5734,5737,5740,5760,5763,5783,5786,5789,5795,5798],[18,5706,5707],{"id":5707},"起因",[14,5709,5710,5711,5715],{},"在上一篇日志",[279,5712,5714],{"href":5713},"\u002Fbuilds\u002Fmofanx\u002F2026-03-24-content-first-strategy","《从围绕产品做内容，到围绕内容做产品》","里，我确定了\"围绕内容做产品\"的思路。既然内容是核心，那 mofanx 站点本身就得是一个优秀的内容产品。",[14,5717,5718],{},"但当时站点只有一种内容形态——按分类组织的独立文章。对于一个想做 Build in Public 的独立开发者来说，这远远不够。",[18,5720,5721],{"id":5721},"旧版长什么样",[14,5723,5724],{},"这是改版前 mofanx 的首页：",[14,5726,5727],{},[55,5728],{"alt":5729,"src":5730},"mofanx 旧版首页 — 只有分类文章一种内容形态","\u002Fb\u002Fmofanx\u002Fversion2026-03-20.png",[14,5732,5733],{},"所有内容都是独立文章，按分类平铺。它能承载\"思考\"，但无法表达\"我在教什么\"和\"我在做什么\"。",[18,5735,5736],{"id":5736},"三种内容形态",[14,5738,5739],{},"我把 mofanx 重构为三种内容形态：",[1193,5741,5742,5748,5754],{},[184,5743,5744,5747],{},[49,5745,5746],{},"教学"," — 结构化的学习系列，按章节组织，适合系统性输出方法论",[184,5749,5750,5753],{},[49,5751,5752],{},"创造"," — Build in Public 的实践记录，按时间线展示，让读者看到真实的开发过程",[184,5755,5756,5759],{},[49,5757,5758],{},"思考"," — 原有的独立文章，按分类组织，承载碎片化的洞察和反思",[14,5761,5762],{},"一个独立开发者的 IP 站点，需要覆盖三个维度：",[181,5764,5765,5771,5777],{},[184,5766,5767,5770],{},[49,5768,5769],{},"我在教什么"," → 教学系列",[184,5772,5773,5776],{},[49,5774,5775],{},"我在做什么"," → 创造日志",[184,5778,5779,5782],{},[49,5780,5781],{},"我在想什么"," → 思考文章",[18,5784,5785],{"id":5785},"新版的样子",[14,5787,5788],{},"改版后的首页，三种形态各有入口：",[14,5790,5791],{},[55,5792],{"alt":5793,"src":5794},"mofanx 新版首页 — 教学、创造、思考三种形态并存","\u002Fb\u002Fmofanx\u002Fversion2026-03-27.png",[14,5796,5797],{},"导航从单一的\"分类\"扩展为\"教学、创造、思考、关于\"四个入口，首页也按优先级依次展示教学系列、创造日志和最新思考。",[14,5799,5800],{},"这篇日志本身，就是用新的创造日志形态写的第一批内容。",{"title":316,"searchDepth":317,"depth":317,"links":5802},[5803,5804,5805,5806],{"id":5707,"depth":320,"text":5707},{"id":5721,"depth":320,"text":5721},{"id":5736,"depth":320,"text":5736},{"id":5785,"depth":320,"text":5785},"2026-03-27","为 mofanx 站点引入 Build in Public 创造日志和教学系列两种新内容形态，让站点从单一文章进化为完整的内容平台。",[5810,5813,5816,5819],{"q":5811,"a":5812},"为什么个人站点需要多种内容形态？","单一文章形态只能表达'我在想什么'，但一个独立开发者的 IP 站点需要覆盖三个维度：教学（我在教什么）、创造（我在做什么）、思考（我在想什么）。三种形态各有不同的组织逻辑——教学按章节、创造按时间线、思考按分类——对读者来说更容易找到想要的内容。",{"q":5814,"a":5815},"Build in Public 创造日志具体记录什么内容？","创造日志记录每个项目的真实开发过程，包括：策略决策（为什么做这个选择）、技术实现（怎么解决具体问题）、阶段性成果（做到了什么程度）、反思复盘（哪里可以改进）。按时间线倒序排列，读者可以看到一个项目从 0 到 1 的完整演变。",{"q":5817,"a":5818},"mofanx 站点从旧版到新版改了哪些结构？","旧版只有分类文章一种内容形态，首页按分类平铺所有文章。新版引入三种内容形态后，首页重新组织为四个区域：Hero 个人介绍、教学系列卡片（带封面图）、创造日志时间线、最新思考文章。导航也从单一的'分类'扩展为'教学、创造、思考、关于'四个入口。",{"q":5820,"a":5821},"用什么技术实现多种内容形态的管理？","基于 Nuxt 4 + @nuxt\u002Fcontent v3 的多 collection 功能。在 content.config.ts 中定义三个独立的 schema（articles、tutorials、builds），每种内容有自己的目录、Front Matter 字段和页面路由。所有元数据配置集中在 app\u002Fdata\u002F 目录下，新增内容只需写 Markdown + 在配置文件中注册。",{},"\u002Fbuilds\u002Fmofanx\u002F2026-03-27-three-content-types",{"title":5702,"description":5808},[5826,5827,5828,5829,5830,5831,5832],"个人IP站点架构","Build in Public 实践","内容形态设计","独立开发者内容平台","Nuxt Content 多集合","教学系列网站","创造日志时间线","builds\u002Fmofanx\u002F2026-03-27-three-content-types","将 mofanx 从单一文章站点重构为教学、创造、思考三种内容形态并存的平台，用 Build in Public 创造日志记录过程，用结构化教学系列沉淀方法论，用分类文章承载独立思考。",[1078,1746],"_hIAaVfLSaosHG5xV5Hv7Z49r2J9ON6_WwJLGIbYEYo",{"id":5838,"title":5839,"body":5840,"date":5950,"description":5951,"draft":329,"extension":330,"faq":5952,"meta":5965,"navigation":345,"path":5966,"project":5967,"readingTime":535,"seo":5968,"seoKeywords":5969,"stem":5975,"summary":5976,"tags":5977,"updated":363,"__hash__":5978},"builds\u002Fbuilds\u002Fwhoami\u002F2026-03-26-competitor-wakeup-call.md","同类产品火了，我的却没人知道",{"type":8,"value":5841,"toc":5942},[5842,5845,5848,5851,5857,5860,5863,5866,5877,5881,5884,5901,5904,5907,5910,5919,5927,5930,5933,5939],[18,5843,5844],{"id":5844},"被竞品打醒",[14,5846,5847],{},"3 月下旬，一个叫 mem9 的产品发布了。它解决的问题和 whoami 几乎一模一样：跨 AI 的用户记忆同步。",[14,5849,5850],{},"mem9 发布后迅速获得了大量关注。而 whoami 已经上线了三周，功能更完善、体验也打磨过了，却几乎无人问津。",[14,5852,5853,5854],{},"这让我不得不面对一个事实：",[49,5855,5856],{},"不是产品不好，是没人知道我做了这个产品。",[14,5858,5859],{},"我开始认真思考：产品做出来之后，怎么让人发现它？",[18,5861,5862],{"id":5862},"两个方向的改变",[14,5864,5865],{},"我期望做到：",[181,5867,5868,5871,5874],{},[184,5869,5870],{},"让搜索引擎（包括 AI 搜索引擎）能找到 whoami",[184,5872,5873],{},"通过 Build in Public 持续输出内容，积累关注",[184,5875,5876],{},"不再闷头做产品，而是一边做一边讲",[496,5878,5880],{"id":5879},"让-ai-搜索引擎也能找到你","让 AI 搜索引擎也能找到你",[14,5882,5883],{},"传统 SEO 解决的是 Google 排名，但现在越来越多人通过 ChatGPT、Perplexity 这些 AI 搜索引擎找信息。如果你的产品不能被 AI 引用，就等于失去了一半的流量入口。",[14,5885,5886,5887,5892,5893,5896,5897,5900],{},"我在 ",[279,5888,5891],{"href":5889,"rel":5890,"target":2003},"https:\u002F\u002Fwhoamiagent.com",[283],"whoamiagent.com"," 上添加了 ",[79,5894,5895],{},"llms.txt","——类似 ",[79,5898,5899],{},"robots.txt"," 之于传统爬虫，它告诉 AI 搜索引擎：\"关于这个产品，这些是最值得引用的核心信息。\"",[14,5902,5903],{},"同时全面打磨了站点的交互体验——键盘导航、移动端适配、状态反馈、过渡动画。这些细节不起眼，但用户潜意识里感受得到。",[496,5905,5906],{"id":5906},"去有人的地方讲故事",[14,5908,5909],{},"这是更重要的一步。",[14,5911,5912,5913,5918],{},"我决定在 ",[279,5914,5917],{"href":5915,"rel":5916},"https:\u002F\u002Fmofanx.com",[283],"mofanx.com"," 上公开记录 whoami 的整个开发过程——也就是你现在正在读的这些创造日志。",[14,5920,5921,5922,5926],{},"这不只是\"分享开发日志\"，更是一种获客策略。通过持续输出真实的开发故事，吸引同频的读者和潜在用户。读者看了日志觉得有共鸣，自然会去试试这个产品。我之前也在",[279,5923,5925],{"href":5924},"\u002Farticles\u002Fwhoami-v2","《养虾专业户两周了，我发现一个没人提的问题》","这篇文章里聊过 whoami 的产品理念，但一篇文章远远不够，需要的是持续的、真实的故事。",[14,5928,5929],{},"比起在沙漠里等客人上门，不如去有人的地方讲你的故事。",[18,5931,5932],{"id":5932},"故事还在继续",[14,5934,5935,5936],{},"策略刚刚开始执行，还没有数据能验证效果。但我已经想清楚了一件事：",[49,5937,5938],{},"先做内容、先做影响力，产品会跟着来。",[14,5940,5941],{},"whoami 的故事还在继续。",{"title":316,"searchDepth":317,"depth":317,"links":5943},[5944,5945,5949],{"id":5844,"depth":320,"text":5844},{"id":5862,"depth":320,"text":5862,"children":5946},[5947,5948],{"id":5879,"depth":317,"text":5880},{"id":5906,"depth":317,"text":5906},{"id":5932,"depth":320,"text":5932},"2026-03-26","mem9 发布后迅速获得大量关注，而上线三周的 whoami 几乎无人问津。不是产品不好，是没人知道我做了这个产品。这次我决定改变策略。",[5953,5956,5959,5962],{"q":5954,"a":5955},"为什么功能更完善的 whoami 没有 mem9 火？","不是产品不好，是没人知道这个产品存在。独立开发者容易犯一个经典错误：闷头做产品，做完了再想怎么让人知道。mem9 在内容分发和社区曝光上做得更好，而 whoami 几乎没有主动的获客动作。产品做出来不等于有人用，分发和内容才是关键。",{"q":5957,"a":5958},"什么是 GEO 优化？和传统 SEO 有什么区别？","GEO（Generative Engine Optimization）是针对 AI 搜索引擎的优化。传统 SEO 优化的是 Google 排名，GEO 优化的是被 ChatGPT、Perplexity 等 AI 搜索引擎引用的概率。具体做法包括添加 llms.txt 文件、结构化数据、清晰的产品描述等，让 AI 在回答用户问题时能引用你的内容。",{"q":5960,"a":5961},"llms.txt 是什么？为什么要添加它？","llms.txt 类似 robots.txt 之于传统爬虫，是一种告诉 AI 搜索引擎'关于这个网站的核心信息'的标准文件。添加后，当用户通过 ChatGPT、Perplexity 等搜索'跨 AI 身份同步'相关问题时，AI 更容易引用 whoamiagent.com 的内容。",{"q":5963,"a":5964},"Build in Public 对独立开发者获客有什么帮助？","通过公开记录产品的开发过程、决策思考和真实反馈，持续输出有价值的内容，吸引同频的读者和潜在用户。读者看了开发故事觉得有共鸣，自然会去试试产品。比起在没有流量的地方等用户上门，不如主动去有人的地方讲你的故事。",{},"\u002Fbuilds\u002Fwhoami\u002F2026-03-26-competitor-wakeup-call","whoami",{"title":5839,"description":5951},[5970,5971,5972,5973,5895,4651,5974],"独立开发者获客","竞品分析反思","Build in Public 策略","GEO 优化","产品分发困境","builds\u002Fwhoami\u002F2026-03-26-competitor-wakeup-call","同类产品 mem9 发布后迅速获得大量关注，而上线三周的 whoami 几乎无人问津。问题不在产品本身，而在于没人知道它存在。决定通过 GEO 优化让 AI 搜索引擎找到产品，并用 Build in Public 的方式在 mofanx.com 上持续输出开发故事来积累关注。",[1746,1078],"gy3h-bbfJ2WHi_2LIHvrc5ojOKBKLaP65BV-HvEfSx8",{"id":5980,"title":5981,"body":5982,"date":1719,"description":6140,"draft":329,"extension":330,"faq":6141,"meta":6154,"navigation":345,"path":5713,"project":4419,"readingTime":541,"seo":6155,"seoKeywords":6156,"stem":6164,"summary":6165,"tags":6166,"updated":363,"__hash__":6167},"builds\u002Fbuilds\u002Fmofanx\u002F2026-03-24-content-first-strategy.md","从围绕产品做内容，到围绕内容做产品",{"type":8,"value":5983,"toc":6132},[5984,5987,5990,6001,6004,6007,6010,6016,6022,6025,6029,6032,6043,6048,6051,6055,6058,6072,6078,6081,6107,6110,6113,6116,6119,6126,6129],[18,5985,5986],{"id":5986},"一个让我反思的现象",[14,5988,5989],{},"最近发生了一件事，让我不得不重新审视自己的策略。",[14,5991,5992,5993,5996,5997,6000],{},"我花了大量精力做了一个产品 —— ",[279,5994,5891],{"href":5889,"rel":5995},[283],"。它的核心想法是：",[49,5998,5999],{},"一份身份档案，同步到所有 AI Agent","。我觉得这个需求很真实，自己每天都在用，产品也确实好用。",[14,6002,6003],{},"但上线之后，市场反馈平平。",[14,6005,6006],{},"而另一个同性质的产品 mem9，在我之后发布，却迅速获得了大量关注。",[18,6008,6009],{"id":6009},"问题出在哪里",[14,6011,6012,6013,130],{},"不是产品不好，而是",[49,6014,6015],{},"没人知道你做了这个产品",[14,6017,6018,6019,130],{},"作为独立开发者，我犯了一个经典错误：",[49,6020,6021],{},"先闷头做产品，做完了再想怎么让人知道",[14,6023,6024],{},"这就像在沙漠里开了一家米其林餐厅 —— 菜做得再好，没有路过的人。",[18,6026,6028],{"id":6027},"新策略围绕内容做产品","新策略：围绕内容做产品",[14,6030,6031],{},"反过来想，如果我先有影响力，先有读者和关注者，那么：",[1193,6033,6034,6037,6040],{},[184,6035,6036],{},"做产品之前，可以先验证想法",[184,6038,6039],{},"做产品的过程，本身就是内容",[184,6041,6042],{},"产品上线时，自带第一批用户",[14,6044,6045],{},[49,6046,6047],{},"内容 → 影响力 → 产品 → 反馈 → 更好的内容",[14,6049,6050],{},"这是一个正向飞轮。",[18,6052,6054],{"id":6053},"build-in-public-是桥梁","Build in Public 是桥梁",[14,6056,6057],{},"Build in Public 恰好是连接「内容」和「产品」的桥梁：",[181,6059,6060,6063,6066,6069],{},[184,6061,6062],{},"分享我在做什么 → 积累关注",[184,6064,6065],{},"展示思考过程 → 吸引同频的人",[184,6067,6068],{},"公开遇到的问题 → 获得社区帮助",[184,6070,6071],{},"记录每一步进展 → 倒逼自己思考",[14,6073,6074,6075,130],{},"重点不是产品本身，而是",[49,6076,6077],{},"做产品的过程和思考",[18,6079,6080],{"id":6080},"具体怎么做",[1193,6082,6083,6089,6095,6101],{},[184,6084,6085,6088],{},[49,6086,6087],{},"mofanx.com 作为内容中心"," — 所有思考、教学、创造日志都沉淀在这里",[184,6090,6091,6094],{},[49,6092,6093],{},"公众号做分发"," — 每篇新内容同步到公众号",[184,6096,6097,6100],{},[49,6098,6099],{},"创造日志做连接"," — 用 Build in Public 的方式，把产品开发过程公开",[184,6102,6103,6106],{},[49,6104,6105],{},"教学做深度"," — 用系统化的教学内容建立专业形象",[14,6108,6109],{},"先有内容，先有影响力，产品自然会找到它的用户。",[18,6111,6112],{"id":6112},"心态转变",[14,6114,6115],{},"说实话，这个转变对我来说不容易。",[14,6117,6118],{},"作为工程师，我习惯了「做东西」的满足感。而「写内容」总感觉不如「写代码」来得实在。",[14,6120,6121,6122,6125],{},"但我逐渐意识到：",[49,6123,6124],{},"在 AI 时代，好的想法比好的执行更稀缺","。AI 可以帮你写代码、做设计、跑测试，但它不能替你思考、替你有洞察。",[14,6127,6128],{},"把想法和洞察分享出去，才是独立开发者最大的竞争力。",[14,6130,6131],{},"从今天开始，我要认真做内容了。",{"title":316,"searchDepth":317,"depth":317,"links":6133},[6134,6135,6136,6137,6138,6139],{"id":5986,"depth":320,"text":5986},{"id":6009,"depth":320,"text":6009},{"id":6027,"depth":320,"text":6028},{"id":6053,"depth":320,"text":6054},{"id":6080,"depth":320,"text":6080},{"id":6112,"depth":320,"text":6112},"一次策略转向的思考：先积累影响力再做产品，而不是先做产品再找用户。Build in Public 是连接两者的桥梁。",[6142,6145,6148,6151],{"q":6143,"a":6144},"独立开发者应该先做产品还是先做内容？","建议先做内容。没有影响力的产品就像沙漠里的餐厅——做得再好没人知道。先通过内容积累读者和关注者，做产品时可以提前验证想法、过程本身就是内容素材、上线时自带第一批用户，形成内容→影响力→产品→反馈的正向飞轮。",{"q":6146,"a":6147},"什么是 Build in Public？对独立开发者有什么用？","Build in Public 是公开分享产品开发过程的策略，包括思考、决策、遇到的问题和进展。它是连接'内容'和'产品'的桥梁：分享过程积累关注、展示思考吸引同频的人、公开问题获得社区帮助、记录进展倒逼自己深度思考。重点不是产品本身，而是做产品的过程和洞察。",{"q":6149,"a":6150},"独立开发者做了好产品但没人用怎么办？","这是典型的'先做产品再找用户'的困境。解决方案是策略转向：1）把产品开发过程公开，用 Build in Public 的方式积累关注；2）围绕产品背后的思考写深度内容，建立专业形象；3）用多渠道分发（个人网站+公众号等）扩大触达面；4）让内容先行，让产品跟着影响力自然增长。",{"q":6152,"a":6153},"AI 时代独立开发者最大的竞争力是什么？","是独特的想法和洞察，而不是执行能力。AI 可以帮你写代码、做设计、跑测试，但不能替你思考和产生洞见。把想法和洞察通过内容分享出去，才是 AI 时代独立开发者最大的护城河。好的想法比好的执行更稀缺。",{},{"title":5981,"description":6140},[6157,6158,6159,6160,6161,6162,6163],"独立开发者内容策略","Build in Public","内容驱动产品","个人IP影响力","独立开发冷启动","内容创业飞轮","先做内容还是先做产品","builds\u002Fmofanx\u002F2026-03-24-content-first-strategy","独立开发者先闷头做产品再找用户是经典陷阱，正确路径是先用内容积累影响力，再让产品自带首批用户——内容→影响力→产品→反馈→更好的内容，形成正向飞轮。",[1746,1078],"ay735yzPUTwu25MikGEbmLKjJXktmJz_9PVZQ5cfM0I",{"id":6169,"title":6170,"body":6171,"date":6228,"description":6229,"draft":329,"extension":330,"faq":6230,"meta":6243,"navigation":345,"path":6244,"project":4419,"readingTime":317,"seo":6245,"seoKeywords":6246,"stem":6252,"summary":6253,"tags":6254,"updated":363,"__hash__":6255},"builds\u002Fbuilds\u002Fmofanx\u002F2026-03-20-site-launch.md","从莫烦Python到莫烦无限：为什么我需要一个新站点",{"type":8,"value":6172,"toc":6223},[6173,6177,6186,6189,6196,6200,6203,6206,6210,6213,6216],[18,6174,6176],{"id":6175},"mofanpy-完成了它的使命","mofanpy 完成了它的使命",[14,6178,6179,6180,6185],{},"我有一个叫 ",[279,6181,6184],{"href":6182,"rel":6183},"https:\u002F\u002Fmofanpy.com",[283],"莫烦Python"," 的网站。是我读书时候开始做的。那时候 AI 和 Python 刚火起来，我把自己学到的东西整理成教程，分享给有需要的人。这个网站陪了我很多年，也帮到了不少朋友。",[14,6187,6188],{},"但工作快十年了，我的关注点早已不只是 Python 教学。这些年在工作中积累了大量关于 AI 行业发展、产品设计、学习方法论、教育思考的沉淀，这些内容放在一个叫\"莫烦Python\"的站点下，怎么看都不太对。",[14,6190,6191,6192,6195],{},"我需要一个新的域名，一个新的空间。",[79,6193,6194],{},"mofan + x","——x 是未知，是可能性，是交叉和跨界。这更符合我现在的状态。",[18,6197,6199],{"id":6198},"ai-coding-让重建变得可行","AI Coding 让重建变得可行",[14,6201,6202],{},"mofanpy 的技术架构已经很古老了，当年的前端方案放到今天看，改造成本比重建还高。",[14,6204,6205],{},"好在现在有了 AI Coding，建站这件事变得容易太多。我可以完全从零开始，用现代技术栈重新构建整个站点的逻辑和架构，而不是在旧框架上缝缝补补。这次选了 Nuxt 4 + @nuxt\u002Fcontent v3 + TailwindCSS v4 的组合，写作体验和内容管理都比以前好了一个量级。",[18,6207,6209],{"id":6208},"公众号之外多一个触达你的节点","公众号之外，多一个触达你的节点",[14,6211,6212],{},"其实在建站之前，我从 2025 年底开始是在公众号上尝试分享这些工作以来的感悟和沉淀。但写了一段时间后发现，公众号的分发机制对新账号实在太不友好了。内容写得再好，没有初始流量池，就很难被看到。",[14,6214,6215],{},"我想要一个更符合自己内容组织逻辑的平台。文章之间可以互相关联，系列教程可以按结构呈现，读者可以按主题自由探索，而不是被算法决定看到什么。",[14,6217,6218,6219,6222],{},"所以 ",[279,6220,5917],{"href":5915,"rel":6221},[283]," 上线了。它不是要替代公众号，而是在公众号之外，多一个与你们触达的节点。",{"title":316,"searchDepth":317,"depth":317,"links":6224},[6225,6226,6227],{"id":6175,"depth":320,"text":6176},{"id":6198,"depth":320,"text":6199},{"id":6208,"depth":320,"text":6209},"2026-03-20","mofanpy 承载了读书时代的分享，但工作近十年后，我需要一个新空间来安放 AI 时代的思考与沉淀。",[6231,6234,6237,6240],{"q":6232,"a":6233},"mofanx.com 和莫烦Python是什么关系？","莫烦Python（mofanpy.com）是作者读书时期创建的 AI 和 Python 教学网站。工作近十年后，关注点已远超 Python 教学，涵盖 AI 行业洞察、产品设计、学习方法论、教育思考等，因此创建了 mofanx.com 作为新的内容承载空间。",{"q":6235,"a":6236},"为什么不在莫烦Python的基础上改造而是重建？","mofanpy 的技术架构已经很古老，改造成本比重建还高。现在有了 AI Coding，从零建站变得容易很多，可以用 Nuxt 4 + @nuxt\u002Fcontent v3 + TailwindCSS v4 等现代技术栈重新构建，写作体验和内容管理比以前好了一个量级。",{"q":6238,"a":6239},"mofanx.com 会替代公众号吗？","不会替代，而是补充。公众号的分发机制对新账号不友好，内容难以被看到。mofanx.com 提供了一个自主掌控的平台：文章可以互相关联、系列教程按结构呈现、读者按主题自由探索，而不是被算法决定看到什么。",{"q":6241,"a":6242},"mofanx 中的 x 代表什么？","x 代表未知、可能性、交叉和跨界。作者的内容已经横跨 AI 洞察、产品创造、教育思考、学习方法论等多个领域，不再局限于某一个技术方向，x 更符合这种跨领域探索的状态。",{},"\u002Fbuilds\u002Fmofanx\u002F2026-03-20-site-launch",{"title":6170,"description":6229},[6184,4419,6247,6248,6249,6250,6251],"个人网站搭建","AI Coding 建站","独立博客","Nuxt 4 内容站","个人IP站点","builds\u002Fmofanx\u002F2026-03-20-site-launch","莫烦Python已无法承载工作十年后的思考沉淀，借助 AI Coding 从零重建新站 mofanx.com，在公众号之外多一个自主掌控内容组织的触达节点。",[1078,361],"PTov2bIT4YKSNJbAIivVVJAcOulPQuB5NBcArjxQlLw",{"id":6257,"title":6258,"body":6259,"date":1929,"description":6356,"draft":329,"extension":330,"faq":6357,"meta":6370,"navigation":345,"path":6371,"project":2121,"readingTime":535,"seo":6372,"seoKeywords":6373,"stem":6377,"summary":6378,"tags":6379,"updated":363,"__hash__":6380},"builds\u002Fbuilds\u002Fmetool\u002F2026-03-19-seo-geo-breakthrough.md","做了大半年流量还是很少，我决定认真做 SEO",{"type":8,"value":6260,"toc":6350},[6261,6264,6267,6270,6273,6276,6279,6285,6291,6297,6299,6302,6311,6314,6317,6331,6335,6341,6344,6347],[18,6262,6263],{"id":6263},"流量困局",[14,6265,6266],{},"metool 做了大半年，工具已经有几十个了，覆盖了图片、视频、文档、3D、开发者工具、游戏、AI Skills 等品类。",[14,6268,6269],{},"但流量一直上不去。",[14,6271,6272],{},"Google Analytics 的数据很诚实：每天的访问量很少，大部分还是自己测试产生的。工具做得再多，没人知道它存在，就等于没做。",[18,6274,6275],{"id":6275},"数据驱动的优化",[14,6277,6278],{},"这次不是凭感觉优化了。我从 Google Analytics 的数据出发，让 AI 协助分析和执行。",[14,6280,6281,6284],{},[49,6282,6283],{},"默认语言切英文","：GA 数据显示，英文搜索的流量潜力远大于中文。工具站的使用场景是全球通用的——图片压缩、格式转换这些需求不分国界。把默认语言切成英文，能覆盖更多国际用户。",[14,6286,6287,6290],{},[49,6288,6289],{},"全站 FAQ 结构化数据","：给每个工具页都加了 FAQ Schema。搜索引擎会在结果中直接展示问答内容，占据更大的面积，提升点击率。",[14,6292,6293,6296],{},[49,6294,6295],{},"HowTo 结构化数据","：把每个工具的使用步骤结构化，让搜索引擎理解\"这个工具怎么用\"。当用户搜索\"how to compress video online\"时，搜索结果里就能直接展示操作步骤。",[18,6298,5880],{"id":5879},[14,6300,6301],{},"传统 SEO 优化的是 Google 排名，但 2026 年了，越来越多人通过 ChatGPT、Perplexity 这些 AI 搜索引擎找信息。",[14,6303,6304,6305,3319,6307,6310],{},"我加了 ",[49,6306,5895],{},[49,6308,6309],{},"llms-full.txt","——类似 robots.txt 之于传统爬虫，它告诉 AI 搜索引擎：\"关于 metool.online，这些是最值得引用的信息。\"",[14,6312,6313],{},"文件里列出了所有工具的名称、功能描述和 URL。当用户问 AI\"有什么在线工具可以压缩图片\"的时候，AI 就有可能引用 metool。",[14,6315,6316],{},"还做了一些技术层面的统一：",[181,6318,6319,6325],{},[184,6320,6321,6324],{},[49,6322,6323],{},"Trailing slash 处理"," — 统一 URL 格式，避免搜索引擎把带斜杠和不带斜杠的 URL 当作两个页面",[184,6326,6327,6330],{},[49,6328,6329],{},"robots.txt 优化"," — 允许 AI 爬虫（GPTBot、Anthropic 等）访问",[18,6332,6334],{"id":6333},"从做工具到做增长","从\"做工具\"到\"做增长\"",[14,6336,6337,6338],{},"这一轮优化让我意识到一件事：",[49,6339,6340],{},"做产品和做增长是两件完全不同的事。",[14,6342,6343],{},"前面大半年，我一直在\"做工具\"——有需求就做，做完就上线。但\"做增长\"需要的是另一套思维：数据分析、搜索优化、内容策略。",[14,6345,6346],{},"metool 现在有了几十个工具，架构也足够成熟。下一步不是继续加工具，而是让已有的工具被更多人发现和使用。",[14,6348,6349],{},"这个故事还在继续。",{"title":316,"searchDepth":317,"depth":317,"links":6351},[6352,6353,6354,6355],{"id":6263,"depth":320,"text":6263},{"id":6275,"depth":320,"text":6275},{"id":5879,"depth":320,"text":5880},{"id":6333,"depth":320,"text":6334},"metool 做了大半年，工具几十个了，但流量一直上不去。借着 AI 能力提升，用 Google Analytics 数据反馈 + AI 协助，系统性地做了一轮 SEO 和 GEO 优化。",[6358,6361,6364,6367],{"q":6359,"a":6360},"为什么默认语言要从中文切成英文？","Google Analytics 数据显示，英文搜索带来的流量潜力远大于中文。工具站的使用场景是全球通用的（图片压缩、格式转换等），英文作为默认语言能覆盖更多国际用户，中文用户可以手动切换。",{"q":6362,"a":6363},"什么是 GEO 优化？","GEO（Generative Engine Optimization）是针对 AI 搜索引擎的优化。现在越来越多人通过 ChatGPT、Perplexity 等 AI 搜索信息，如果你的网站不能被 AI 引用，就等于失去了新的流量入口。GEO 包括添加 llms.txt、结构化数据、清晰的产品描述等。",{"q":6365,"a":6366},"llms.txt 是什么？","类似 robots.txt 之于传统爬虫，llms.txt 告诉 AI 搜索引擎'关于这个网站的核心信息'。metool 的 llms.txt 列出了所有工具的名称、功能描述和 URL，让 AI 在回答用户'有什么在线工具可以...'类型的问题时能引用 metool。",{"q":6368,"a":6369},"FAQ 和 HowTo 结构化数据有什么作用？","FAQ Schema 让搜索引擎在搜索结果中直接展示常见问题和回答，占据更大的结果面积。HowTo Schema 把工具的使用步骤结构化，让搜索引擎理解每个工具的操作流程。两者都能提升搜索结果的点击率和可见性。",{},"\u002Fbuilds\u002Fmetool\u002F2026-03-19-seo-geo-breakthrough",{"title":6258,"description":6356},[6374,5973,5895,6375,6295,6376,4651],"工具站 SEO 优化","FAQ Schema 结构化数据","Google Analytics 数据驱动","builds\u002Fmetool\u002F2026-03-19-seo-geo-breakthrough","metool 做了大半年流量依然很少，工具几十个但没人知道。决定借助 AI 能力，通过 Google Analytics 数据反馈系统性做 SEO\u002FGEO 优化：默认语言切英文面向国际用户、全站加 FAQ 和 HowTo 结构化数据、添加 llms.txt 让 AI 搜索引擎也能引用、统一 trailing slash 和 robots.txt。",[1078,361],"HVOKaXEceQ2DIID9meIXaR9TvaR2ws7zvMyDVcU90pg",{"id":6382,"title":6383,"body":6384,"date":6613,"description":6614,"draft":329,"extension":330,"faq":6615,"meta":6628,"navigation":345,"path":6629,"project":2121,"readingTime":541,"seo":6630,"seoKeywords":6631,"stem":6638,"summary":6639,"tags":6640,"updated":363,"__hash__":6641},"builds\u002Fbuilds\u002Fmetool\u002F2026-03-12-dev-tools-and-ai-skills.md","三天上线十几个开发者工具，还做了 AI Skills 板块",{"type":8,"value":6385,"toc":6607},[6386,6390,6393,6400,6407,6411,6414,6424,6427,6432,6478,6483,6521,6526,6537,6543,6547,6550,6591,6595,6601,6604],[18,6387,6389],{"id":6388},"agent-skill-的摸索","Agent Skill 的摸索",[14,6391,6392],{},"2026 年初，我花了大量时间研究 AI Agent Skill 模式——让 AI 助手通过安装技能来扩展能力。",[14,6394,6395,6396,6399],{},"在这个过程中积累了不少经验：怎么设计 Skill 的接口、怎么处理跨平台兼容性、怎么让非技术用户也能安装使用。这些经验后来也应用到了 ",[279,6397,5967],{"href":5889,"rel":6398,"target":2003},[283]," 等项目中。",[14,6401,6402,6403,6406],{},"既然有了经验，不如在 metool 上做一个 ",[49,6404,6405],{},"AI Skills 展示板块","，把我做的各种 Skill 都放上来。",[18,6408,6410],{"id":6409},"三天十几个新工具","三天，十几个新工具",[14,6412,6413],{},"3 月 12 日到 3 月 18 日，可能是 metool 开发密度最高的一段时间。",[14,6415,6416,6419,6420,6423],{},[49,6417,6418],{},"先做了统一设计系统","。之前每个工具页面各写各的，风格不统一，重复代码多。这次抽象出了 ",[79,6421,6422],{},"ToolPageLayout"," 组件——新工具只需要传入标题和核心内容，布局、动画、SEO 信息、相关工具推荐都自动处理。",[14,6425,6426],{},"有了统一架构，加工具的速度就上来了：",[14,6428,6429],{},[49,6430,6431],{},"开发者工具：",[181,6433,6434,6441,6448,6456,6463,6470],{},[184,6435,6436],{},[279,6437,6440],{"href":6438,"rel":6439,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002Fbase64\u002F",[283],"Base64 编解码",[184,6442,6443],{},[279,6444,6447],{"href":6445,"rel":6446,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FregexTest\u002F",[283],"正则表达式测试器",[184,6449,6450,6455],{},[279,6451,6454],{"href":6452,"rel":6453,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FhashGenerator\u002F",[283],"哈希生成器","（MD5、SHA-1、SHA-256 等）",[184,6457,6458],{},[279,6459,6462],{"href":6460,"rel":6461,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FpasswordGenerator\u002F",[283],"随机密码生成器",[184,6464,6465],{},[279,6466,6469],{"href":6467,"rel":6468,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FtextDiff\u002F",[283],"文本差异对比",[184,6471,6472,6477],{},[279,6473,6476],{"href":6474,"rel":6475,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FdataFormatConvert\u002F",[283],"数据格式转换","（JSON\u002FYAML\u002FTOML 互转）",[14,6479,6480],{},[49,6481,6482],{},"文档和媒体工具：",[181,6484,6485,6493,6500,6506,6514],{},[184,6486,6487,6492],{},[279,6488,6491],{"href":6489,"rel":6490,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdocs\u002FpdfTools\u002F",[283],"PDF 工具","（预览、拆分）",[184,6494,6495],{},[279,6496,6499],{"href":6497,"rel":6498,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002Fwatermark\u002F",[283],"图片水印",[184,6501,6502],{},[279,6503,4927],{"href":6504,"rel":6505,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002F3d\u002FmodelConvert\u002F",[283],[184,6507,6508,6513],{},[279,6509,6512],{"href":6510,"rel":6511,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002F3d\u002FtextTo3d\u002F",[283],"Text to 3D","（文字生成 3D 模型）",[184,6515,6516],{},[279,6517,6520],{"href":6518,"rel":6519,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdocs\u002FweixinToMarkdown\u002F",[283],"微信文章反向转 Markdown",[14,6522,6523],{},[49,6524,6525],{},"基础组件：",[181,6527,6528,6531,6534],{},[184,6529,6530],{},"FAQ 组件（每个工具页自动展示常见问题）",[184,6532,6533],{},"Toast 通知系统",[184,6535,6536],{},"vue-json-pretty 替换自制的 JSON 查看器",[14,6538,6539],{},[55,6540],{"alt":6541,"src":6542},"AI Skills 板块","\u002Fb\u002Fmetool\u002Fskills.png",[18,6544,6546],{"id":6545},"ai-skills-板块上线","AI Skills 板块上线",[14,6548,6549],{},"同时上线了 AI Skills 展示板块，每个 Skill 有独立的介绍页面：",[181,6551,6552,6561,6571,6581],{},[184,6553,6554,6560],{},[49,6555,6556],{},[279,6557,5967],{"href":6558,"rel":6559,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fskills\u002Fwhoami\u002F",[283]," — 跨 AI 身份同步",[184,6562,6563,6570],{},[49,6564,6565],{},[279,6566,6569],{"href":6567,"rel":6568,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fskills\u002Fzhongjie\u002F",[283],"中介哥"," — AI 买房参谋",[184,6572,6573,6580],{},[49,6574,6575],{},[279,6576,6579],{"href":6577,"rel":6578,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fskills\u002Fidea2mvp\u002F",[283],"idea2mvp"," — 从创意到产品",[184,6582,6583,6590],{},[49,6584,6585],{},[279,6586,6589],{"href":6587,"rel":6588,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fskills\u002FgaImprove\u002F",[283],"GA 优化"," — Google Analytics 数据驱动优化",[18,6592,6594],{"id":6593},"ai-coding-改变了什么","AI Coding 改变了什么",[14,6596,6597,6598,130],{},"这三天能做这么多，核心原因是 ",[49,6599,6600],{},"AI Coding",[14,6602,6603],{},"每个工具的开发周期从\"半天\"缩短到了\"一两个小时\"。我负责定需求和验收，AI 负责写代码。统一的架构加上 AI 的速度，工具的边际成本几乎为零。",[14,6605,6606],{},"这也是我在探索 Agent Skill 过程中最深的体会：AI 不只是能帮你写代码，它改变的是你做事的规模和速度。",{"title":316,"searchDepth":317,"depth":317,"links":6608},[6609,6610,6611,6612],{"id":6388,"depth":320,"text":6389},{"id":6409,"depth":320,"text":6410},{"id":6545,"depth":320,"text":6546},{"id":6593,"depth":320,"text":6594},"2026-03-12","大量摸索 Agent Skill 模式积累了经验，借 AI Coding 的速度，三天内密集上线了十几个开发者工具和 AI Skills 展示板块。",[6616,6619,6622,6625],{"q":6617,"a":6618},"三天内是怎么做到上线这么多工具的？","两个关键因素：一是 metool 的架构已经很成熟，新增工具只需写核心逻辑；二是 AI Coding 的效率极高，每个工具的开发周期从'半天'缩短到了'一两个小时'。统一的 ToolPageLayout 组件让页面布局、SEO、FAQ 都是自动化的。",{"q":6620,"a":6621},"这次上线了哪些开发者工具？","Base64 编解码、正则表达式测试器、哈希生成器（MD5\u002FSHA 等）、随机密码生成器、文本差异对比、数据格式转换（JSON\u002FYAML\u002FTOML 互转）。此外还有 PDF 工具、图片水印、3D 模型格式转换和 Text to 3D。",{"q":6623,"a":6624},"AI Skills 板块是什么？","展示我开发的 AI Agent Skills 的专区，包括 whoami（跨 AI 身份同步）、中介哥（买房参谋）、idea2mvp（创意到产品）、GA 优化（Google Analytics 数据驱动）等。每个 Skill 有独立的介绍页面，包含功能说明、安装方式和使用演示。",{"q":6626,"a":6627},"统一设计系统（ToolPageLayout）解决了什么问题？","之前每个工具页面的布局、标题区域、描述文案、SEO 信息都是各写各的，风格不统一且重复代码多。ToolPageLayout 把这些全部抽象成一个统一组件，新工具只需传入标题和内容，布局、动画、SEO、相关工具推荐都自动处理。",{},"\u002Fbuilds\u002Fmetool\u002F2026-03-12-dev-tools-and-ai-skills",{"title":6383,"description":6614},[6632,6633,1434,6634,6440,6635,6636,6637],"AI Coding 开发效率","开发者在线工具","AI Skills 展示","正则表达式测试","在线密码生成器","统一设计系统","builds\u002Fmetool\u002F2026-03-12-dev-tools-and-ai-skills","大量摸索 Agent Skill 模式后积累了丰富经验，借助 AI Coding 的效率，三天内在 metool 上密集上线了十几个开发者工具（Base64、正则测试、哈希生成、密码生成、文本对比等），同时做了统一的工具页面设计系统、FAQ 组件、Toast 通知，还上线了 AI Skills 展示板块。",[1078,361],"hihzr5kpiZrcsafARUi4Ir4QvNVm8xwB2k6CfqqQfew",{"id":6643,"title":6644,"body":6645,"date":6613,"description":6702,"draft":329,"extension":330,"faq":6703,"meta":6716,"navigation":345,"path":6717,"project":5967,"readingTime":317,"seo":6718,"seoKeywords":6719,"stem":6727,"summary":6728,"tags":6729,"updated":363,"__hash__":6730},"builds\u002Fbuilds\u002Fwhoami\u002F2026-03-12-open-to-everyone.md","不只是开发者能用，要让所有人都能登录",{"type":8,"value":6646,"toc":6698},[6647,6650,6653,6656,6659,6662,6665,6676,6682,6688],[18,6648,6649],{"id":6649},"注册页跳出率偏高",[14,6651,6652],{},"上线一周多，我开始关注后台数据。有一个现象让我在意：注册页的跳出率偏高。",[14,6654,6655],{},"分析原因，最初只支持 GitHub 和 Google 登录。GitHub 对开发者来说是标配，但 whoami 想服务的是所有 AI 重度用户：很多人根本没有 GitHub 账号。在国内，Google 登录也不是人人都方便。",[14,6657,6658],{},"另一个问题更隐蔽：搜索引擎根本索引不到产品页面。之前在 meta 里误配了爬虫拦截。产品做出来了，但在搜索引擎里几乎不存在。",[18,6660,6661],{"id":6661},"把门开得更大一些",[14,6663,6664],{},"我期望这次升级能做到：",[181,6666,6667,6670,6673],{},[184,6668,6669],{},"更多登录方式，覆盖非开发者用户",[184,6671,6672],{},"后端安全加固，能放心开放给公众使用",[184,6674,6675],{},"让搜索引擎正常收录产品页面",[14,6677,6678,6681],{},[49,6679,6680],{},"登录扩展","：新增了 Microsoft 登录方式，加上账号关联功能——同一个人用不同方式登录，可以绑定到同一个账号。",[14,6683,6684,6687],{},[49,6685,6686],{},"安全加固","：加了 API 速率限制，认证改用 HttpOnly Cookie，定期清理过期令牌。这些是产品从\"能用\"到\"可以放心让公众使用\"的必要步骤。",[14,6689,6690,6693,6694,6697],{},[49,6691,6692],{},"搜索引擎修复","：补全了 meta tags、OpenGraph 标签、JSON-LD 结构化数据，修复了爬虫拦截的误配。搜索引擎终于能找到 ",[279,6695,5891],{"href":5889,"rel":6696,"target":2003},[283]," 了。",{"title":316,"searchDepth":317,"depth":317,"links":6699},[6700,6701],{"id":6649,"depth":320,"text":6649},{"id":6661,"depth":320,"text":6661},"注册页跳出率偏高，分析发现不是功能问题而是入口问题：只有 GitHub 和 Google 登录，把非开发者用户挡在了门外。",[6704,6707,6710,6713],{"q":6705,"a":6706},"为什么 whoami 最初只支持 GitHub 和 Google 登录？","因为开发阶段作者本人是开发者，默认以开发者视角选择了最熟悉的两种登录方式。但 whoami 想服务所有 AI 重度用户，很多人没有 GitHub 账号，国内用户用 Google 也不方便，导致注册页跳出率偏高。",{"q":6708,"a":6709},"扩展登录方式后效果如何？","新增 Microsoft、Apple、Twitter 三种 OAuth 登录后，注册页跳出率有所下降。同时加了账号关联功能，同一个人用不同方式登录可以绑定到同一个账号，避免重复注册的困扰。",{"q":6711,"a":6712},"whoami 做了哪些安全加固？","加了 API 速率限制防止滥用，认证从 Bearer Token 改用 HttpOnly Cookie 防止 XSS 攻击，定期清理过期令牌。这些是产品从'能用'到'可以放心让公众使用'的必要步骤。",{"q":6714,"a":6715},"搜索引擎为什么之前收录不到 whoamiagent.com？","前端 meta 里误配了爬虫拦截（noindex），导致搜索引擎无法索引。修复后补全了 meta tags、OpenGraph 标签和 JSON-LD 结构化数据，搜索引擎终于能正常找到产品页面。",{},"\u002Fbuilds\u002Fwhoami\u002F2026-03-12-open-to-everyone",{"title":6644,"description":6702},[6720,6721,6722,6723,6724,6725,6726],"多平台 OAuth 登录","用户注册跳出率","产品安全加固","搜索引擎收录","非技术用户","AI 产品用户体验","独立开发产品迭代","builds\u002Fwhoami\u002F2026-03-12-open-to-everyone","whoami 注册页跳出率偏高，根源是只支持 GitHub 和 Google 登录，把非开发者用户挡在门外。扩展 Microsoft、Apple、Twitter 登录后跳出率下降，同时完成安全加固和搜索引擎收录修复。",[1746,1078],"FGVKN8bjML0k9GV41luR5OHHVis9nWKBcpBDSVssEP4",{"id":6732,"title":6733,"body":6734,"date":6800,"description":6801,"draft":329,"extension":330,"faq":6802,"meta":6815,"navigation":345,"path":6816,"project":5967,"readingTime":317,"seo":6817,"seoKeywords":6818,"stem":6826,"summary":6827,"tags":6828,"updated":363,"__hash__":6829},"builds\u002Fbuilds\u002Fwhoami\u002F2026-03-05-simplify-onboarding.md","用户说\"太复杂\"，我把注册流程砍掉了一半",{"type":8,"value":6735,"toc":6795},[6736,6739,6742,6745,6748,6751,6754,6757,6768,6775,6782,6786,6789,6792],[18,6737,6738],{"id":6738},"朋友们的第一反馈",[14,6740,6741],{},"产品上线两天后，我让几个朋友试用。",[14,6743,6744],{},"最多的反馈不是功能问题，而是：\"注册完了然后呢？API Key 是什么？我要把它粘贴到哪里？\"",[14,6746,6747],{},"第一版的流程是：注册 → 打开 Dashboard → 复制 API Key → 粘贴给 AI → AI 手动写入配置文件。对开发者来说这很正常，但对普通用户来说，\"API Key\"三个字就已经够劝退了。",[14,6749,6750],{},"whoami 的目标用户是所有同时使用多个 AI 的人，不只是程序员。如果注册流程把人吓跑了，产品做得再好也没用。",[18,6752,6753],{"id":6753},"砍掉一半流程",[14,6755,6756],{},"我想达到的效果很简单：",[181,6758,6759,6762,6765],{},[184,6760,6761],{},"用户全程不需要接触\"API Key\"这个概念",[184,6763,6764],{},"配置过程让 AI 自动完成，用户只需点一下",[184,6766,6767],{},"首页要让人一眼看懂产品是干什么的",[14,6769,6770,6771,6774],{},"改成了",[49,6772,6773],{},"一次性安全链接","方案：Dashboard 生成一个临时链接，用户把链接发给 AI，AI 自己下载配置。链接用完即失效，安全性反而更高。用户全程不需要知道 API Key 是什么。",[14,6776,6777,6778,6781],{},"同时在首页加了一段",[49,6779,6780],{},"聊天演示动画","——用模拟对话展示 whoami 的使用流程。比写十段文字说明都管用。",[18,6783,6785],{"id":6784},"从需要解释到自己就会","从\"需要解释\"到\"自己就会\"",[14,6787,6788],{},"改完之后，再让同一批朋友试，注册到使用的流程从\"需要解释\"变成了\"自己就会\"。",[14,6790,6791],{},"但用户量依然很小——因为知道这个产品的人本来就少。",[14,6793,6794],{},"如果用户觉得难用，不是用户的问题，是产品的问题。但反过来，产品好用也不等于有人用。这两件事，我在后面的经历中体会得越来越深。",{"title":316,"searchDepth":317,"depth":317,"links":6796},[6797,6798,6799],{"id":6738,"depth":320,"text":6738},{"id":6753,"depth":320,"text":6753},{"id":6784,"depth":320,"text":6785},"2026-03-05","朋友试用后最多的反馈不是功能问题，而是'API Key 是什么？'。我意识到注册流程在劝退用户，于是用一次性链接替代了手动配置。",[6803,6806,6809,6812],{"q":6804,"a":6805},"whoami 最初的注册流程有什么问题？","第一版流程是：注册 → Dashboard 复制 API Key → 粘贴给 AI → AI 手动写入配置文件。对开发者来说很正常，但普通用户连'API Key'是什么都不理解，更不知道该粘贴到哪里。注册流程本身就在劝退目标用户。",{"q":6807,"a":6808},"一次性安全链接是怎么工作的？","用户在 Dashboard 点击生成一个临时链接，把链接发给 AI 助手，AI 自动下载配置并保存。链接用完即失效，用户全程不需要理解 API Key、不需要复制粘贴密钥，安全性反而比手动配置更高。",{"q":6810,"a":6811},"首页的聊天演示动画有什么作用？","用一段模拟对话直观展示 whoami 的使用场景和效果，让访客一眼看懂产品是干什么的。比起文字说明，动画演示的转化效果好得多——show don't tell。",{"q":6813,"a":6814},"简化注册流程后效果如何？","同一批朋友再次试用，注册到使用的体验从'需要解释'变成了'自己就会'。但用户量依然很小，因为知道这个产品的人本来就少——产品体验是一回事，让人知道你存在是另一回事。",{},"\u002Fbuilds\u002Fwhoami\u002F2026-03-05-simplify-onboarding",{"title":6733,"description":6801},[6819,6820,6821,6822,6823,6824,6825],"用户体验优化","注册流程简化","API Key 劝退","产品上手门槛","独立开发用户反馈","一次性链接配置","AI 工具易用性","builds\u002Fwhoami\u002F2026-03-05-simplify-onboarding","whoami 上线后朋友试用的第一反馈是'API Key 是什么'，注册流程在劝退非技术用户。用一次性安全链接替代手动配置后，用户全程不需要接触技术概念，注册到使用从'需要解释'变成了'自己就会'。",[1746,1078],"9Z62aARrxttLnq_DODSVInV8iCxOtuai4M_Bf8i1gPI",{"id":6831,"title":6832,"body":6833,"date":6933,"description":6934,"draft":329,"extension":330,"faq":6935,"meta":6948,"navigation":345,"path":6949,"project":5967,"readingTime":535,"seo":6950,"seoKeywords":6951,"stem":6959,"summary":6960,"tags":6961,"updated":363,"__hash__":6962},"builds\u002Fbuilds\u002Fwhoami\u002F2026-03-03-why-i-built-whoami.md","每次换个 AI 就要重新自我介绍，我受够了",{"type":8,"value":6834,"toc":6928},[6835,6839,6842,6845,6848,6854,6857,6863,6867,6870,6873,6876,6882,6885,6896,6903,6907,6910,6922],[18,6836,6838],{"id":6837},"三个-ai三个平行世界","三个 AI，三个平行世界",[14,6840,6841],{},"我每天的工作状态是这样的：写代码用 Cursor，思考问题问 Claude，搜资料用 ChatGPT。",[14,6843,6844],{},"三个 AI，三个平行世界。",[14,6846,6847],{},"Cursor 知道我喜欢用 Python、偏好简洁代码风格，但 Claude 不知道。Claude 记住了我在做一个教育类产品，但 ChatGPT 不知道。每次打开一个新对话，我都要把自己重新介绍一遍：\"我叫莫烦，做独立开发，擅长 Python 和机器学习，现在在做……\"",[14,6849,6850],{},[55,6851],{"alt":6852,"src":6853},"每个 AI 都是一座孤岛，互相不知道你是谁","\u002Fa\u002Fwhoami-skill\u002Fisolated-ai.png",[14,6855,6856],{},"我搜了一圈，做 AI 记忆的产品不少，但它们解决的都是\"AI 不记得我们聊了什么\"——存对话历史、项目上下文。",[14,6858,6859,6860],{},"没有人在解决一个更基础的问题：",[49,6861,6862],{},"AI 根本不知道我是谁。",[18,6864,6866],{"id":6865},"不是对话记忆是身份认知","不是对话记忆，是身份认知",[14,6868,6869],{},"所以我决定自己做。",[14,6871,6872],{},"思路很简单：一份身份档案，Markdown 格式，云端存储。不管你用哪个 AI，开对话的那一刻它就已经了解你了。你在聊天中提到新信息，AI 自动同步回去。",[14,6874,6875],{},"不是对话记忆，是身份认知。",[14,6877,6878],{},[55,6879],{"alt":6880,"src":6881},"一份档案，所有 AI 共享","\u002Fa\u002Fwhoami-skill\u002Fsync-profile.png",[14,6883,6884],{},"我期望它能做到：",[181,6886,6887,6890,6893],{},[184,6888,6889],{},"一行命令安装，注册即用",[184,6891,6892],{},"所有 AI 工具共享同一份档案",[184,6894,6895],{},"用户在任意 AI 中提到新信息，自动同步到云端，其他 AI 也能看到",[14,6897,6898,6899,6902],{},"产品取名 ",[279,6900,5967],{"href":5889,"rel":6901,"target":2003},[283],"：Linux 用户都熟悉这个命令，\"我是谁\"。",[18,6904,6906],{"id":6905},"一天从零到上线","一天，从零到上线",[14,6908,6909],{},"3 月 3 日，一天之内从零到上线。AI Coding 的速度确实吓人：一天提交了 15 个 commit，后端、前端、Skill 脚本、双语文档、Logo 全部到位。",[14,6911,6912,6913,6916,6917],{},"官网 ",[279,6914,5891],{"href":5889,"rel":6915,"target":2003},[283]," 当天上线。代码完全开源：",[279,6918,6921],{"href":6919,"rel":6920,"target":2003},"https:\u002F\u002Fgithub.com\u002Fmorvanzhou\u002Fwhoami",[283],"github.com\u002Fmorvanzhou\u002Fwhoami",[14,6923,6924],{},[55,6925],{"alt":6926,"src":6927},"whoami 产品首页和使用流程","\u002Fa\u002Fwhoami-skill\u002Fintro-zh.png",{"title":316,"searchDepth":317,"depth":317,"links":6929},[6930,6931,6932],{"id":6837,"depth":320,"text":6838},{"id":6865,"depth":320,"text":6866},{"id":6905,"depth":320,"text":6906},"2026-03-03","三个 AI 三个平行世界，没人记得我是谁。市面上都在解决'AI 不记得聊了什么'，没人解决'AI 不知道我是谁'。所以我自己做了一个。",[6936,6939,6942,6945],{"q":6937,"a":6938},"whoami 和其他 AI 记忆产品有什么区别？","市面上的 AI 记忆产品主要解决的是'AI 不记得做了什么'——存对话历史和项目上下文。whoami 解决的是更基础的问题：'AI 不知道我是谁'。它存的是你的身份档案（名字、技能、偏好、工作方式），让每个 AI 开对话的那一刻就已经了解你，不需要重复自我介绍。",{"q":6940,"a":6941},"whoami 是怎么做到一天之内从零到上线的？","借助 AI Coding 的效率，一天内完成了 FastAPI 后端（OAuth 登录、API Key 管理、Profile 读写）、Nuxt 4 前端（Landing Page、Dashboard）、Python Skill 脚本、中英文双语文档、Logo 和 SEO 配置，共提交 15 个 commit。AI Coding 让 MVP 不再是瓶颈。",{"q":6943,"a":6944},"whoami 的身份档案存储在哪里，安全吗？","身份档案以 Markdown 格式存储在云端，通过 API Key 鉴权访问。用户拥有完全的控制权，可以随时在 Dashboard 查看、编辑或删除。代码完全开源在 GitHub 上。",{"q":6946,"a":6947},"whoami 支持哪些 AI 工具？","支持所有兼容 Agent Skill 机制的 AI 工具，包括 Cursor、Claude、Windsurf、ChatGPT 等主流平台。安装只需一行命令：npx skills add MorvanZhou\u002Fwhoami。",{},"\u002Fbuilds\u002Fwhoami\u002F2026-03-03-why-i-built-whoami",{"title":6832,"description":6934},[6952,6953,6954,6955,6956,6957,6958],"AI 身份同步","whoami agent","跨 AI 记忆","AI 不认识你","AI Agent 身份档案","独立开发 MVP","AI Coding 一天上线","builds\u002Fwhoami\u002F2026-03-03-why-i-built-whoami","每天在 Cursor、Claude、ChatGPT 之间切换，每次都要重新自我介绍。市面上的 AI Memory 产品都在存对话历史，没人解决'AI 不知道我是谁'的问题。whoami 用一份云端身份档案让所有 AI 共享你的身份认知，一天内从零到上线。",[1078,361],"UzTjjE7xl19jyX9wfpes6zBHQoMl0BtWCP2LzMtLJaU",{"id":6964,"title":6965,"body":6966,"date":7119,"description":7120,"draft":329,"extension":330,"faq":7121,"meta":7134,"navigation":345,"path":7135,"project":2121,"readingTime":535,"seo":7136,"seoKeywords":7137,"stem":7145,"summary":7146,"tags":7147,"updated":363,"__hash__":7148},"builds\u002Fbuilds\u002Fmetool\u002F2026-02-10-content-creation-tools.md","用 AI 写文章，一键转成公众号和小红书格式",{"type":8,"value":6967,"toc":7113},[6968,6972,6975,6981,6984,6987,6990,6993,6999,7009,7029,7035,7043,7057,7060,7063,7089,7093,7096,7110],[18,6969,6971],{"id":6970},"ai-写作的最后一公里","AI 写作的最后一公里",[14,6973,6974],{},"2026 年初，AI 的写作能力又提升了一大截。我开始认真写公众号，用 AI 辅助产出 Markdown 格式的文章。",[14,6976,6977,6978,130],{},"写作效率提上来了，但有一个环节特别痛苦：",[49,6979,6980],{},"从 Markdown 到公众号发布",[14,6982,6983],{},"微信公众号编辑器不支持 Markdown，也不能直接粘贴 HTML。网上有一些 Markdown 转公众号的工具，但样式太固定、兼容性问题多。每次发文章，我都要花大量时间调排版。",[14,6985,6986],{},"同样的问题在小红书上更严重——小红书是图文格式，长文要拆成多张图片卡片。",[18,6988,6989],{"id":6989},"高度定制化的转换工具",[14,6991,6992],{},"2025 年 3 月做过一个微信文章转换的雏形，但功能很粗糙。这次我重写了整个工具。",[14,6994,6995],{},[55,6996],{"alt":6997,"src":6998},"Markdown 转微信公众号文章","\u002Fb\u002Fmetool\u002Fwechat-converter.png",[14,7000,7001,7008],{},[49,7002,7003],{},[279,7004,7007],{"href":7005,"rel":7006,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdocs\u002FmdToWeixinArtical\u002F",[283],"Markdown 转公众号","：",[181,7010,7011,7014,7017,7020,7023,7026],{},[184,7012,7013],{},"自定义排版风格（标题、正文、引用、代码块各有独立样式）",[184,7015,7016],{},"代码高亮渲染",[184,7018,7019],{},"嵌套列表正确缩进（微信编辑器的经典坑）",[184,7021,7022],{},"HTML 注释自动清理",[184,7024,7025],{},"图片适配（圆角、阴影、居中）",[184,7027,7028],{},"一键复制到剪贴板，粘贴到微信编辑器直接可用",[14,7030,7031],{},[55,7032],{"alt":7033,"src":7034},"Markdown 转小红书卡片","\u002Fb\u002Fmetool\u002Fxiaohongshu-converter.png",[14,7036,7037,7008],{},[49,7038,7039],{},[279,7040,7033],{"href":7041,"rel":7042,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdocs\u002FmdToXiaohongshu\u002F",[283],[181,7044,7045,7048,7051,7054],{},[184,7046,7047],{},"把长文渲染成小红书风格的图文卡片",[184,7049,7050],{},"支持字体大小调节",[184,7052,7053],{},"精准分页，每页内容自动适配小红书图片比例",[184,7055,7056],{},"直接截图就能发",[18,7058,7059],{"id":7059},"全站设计系统也重塑了",[14,7061,7062],{},"做内容工具的同时，我也对 metool 的整体设计做了一次升级：",[181,7064,7065,7071,7078],{},[184,7066,7067,7068],{},"统一了全站的图标系统，从散落各处的 SVG\u002FPNG 图标切换到 ",[49,7069,7070],{},"Iconify",[184,7072,7073,7074,7077],{},"加了 ",[49,7075,7076],{},"全局搜索功能","，工具多了之后靠导航找太慢",[184,7079,7080,7081,7088],{},"做了 ",[49,7082,7083],{},[279,7084,7087],{"href":7085,"rel":7086,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fgames\u002FsolarInHand\u002F",[283],"太阳系手势交互游戏","，儿子可以在手机上用手势旋转缩放太阳系",[18,7090,7092],{"id":7091},"一篇文章多平台分发","一篇文章，多平台分发",[14,7094,7095],{},"现在我的内容创作工作流是这样的：",[1193,7097,7098,7101,7104,7107],{},[184,7099,7100],{},"用 AI 辅助撰写 Markdown 格式的文章",[184,7102,7103],{},"在 metool 上实时预览公众号效果",[184,7105,7106],{},"一键复制 HTML，粘贴到微信编辑器",[184,7108,7109],{},"用转小红书工具生成图文卡片截图",[14,7111,7112],{},"一篇文章，多平台分发，全程不需要手动排版。这就是\"自己做工具\"的好处：完全按自己的工作流定制。",{"title":316,"searchDepth":317,"depth":317,"links":7114},[7115,7116,7117,7118],{"id":6970,"depth":320,"text":6971},{"id":6989,"depth":320,"text":6989},{"id":7059,"depth":320,"text":7059},{"id":7091,"depth":320,"text":7092},"2026-02-10","AI 写作能力大提升，我开始写公众号。但从 Markdown 到公众号发布的最后一公里很痛苦。网上的工具不够用，我做了高度定制化的转换工具。",[7122,7125,7128,7131],{"q":7123,"a":7124},"为什么 Markdown 转公众号需要专门的工具？","微信公众号编辑器不支持 Markdown，而且对 HTML\u002FCSS 有严格限制（不支持外部样式表、不支持 class）。需要把 Markdown 渲染成内联样式的 HTML，还要处理代码高亮、图片适配、列表嵌套等公众号特有的兼容问题。",{"q":7126,"a":7127},"和网上已有的 Markdown 转公众号工具比，有什么不同？","网上的工具大多是通用方案，样式固定。metool 的版本做了高度定制化：自定义排版风格、代码块样式、标题层级样式、图片圆角和阴影效果等，还针对微信编辑器的各种坑做了兼容处理（如 HTML 注释清理、嵌套列表缩进修复）。",{"q":7129,"a":7130},"Markdown 转小红书工具是怎么工作的？","把 Markdown 内容渲染成小红书风格的图文卡片，支持字体大小调节和精准分页。每页内容自动适配小红书的图片比例，可以直接截图发布。适合把长文拆分成小红书的多图内容格式。",{"q":7132,"a":7133},"整个内容创作工作流是什么样的？","用 AI 辅助撰写 Markdown 格式的文章，在 metool 上实时预览效果，一键复制公众号格式的 HTML 粘贴到微信编辑器，同时用转小红书工具生成图文卡片。一篇文章，多平台分发，全程不需要手动排版。",{},"\u002Fbuilds\u002Fmetool\u002F2026-02-10-content-creation-tools",{"title":6965,"description":7120},[7138,7139,7140,7141,7142,7143,7144],"Markdown 转微信公众号","Markdown 转小红书","AI 写作工具","公众号排版工具","内容分发工具","微信文章格式转换","小红书图文卡片","builds\u002Fmetool\u002F2026-02-10-content-creation-tools","AI 能力提升后开始写公众号，发现从 Markdown 到公众号发布的最后一公里很痛苦。网上的转换工具不够用，在 metool 上做了高度定制化的 Markdown 转公众号和转小红书工具，实现 AI 辅助产出内容后一键分发到多个平台。",[1078,361],"wss3sw3VhSQdFnFFEEZBvOfAiN67lGRhbtrz2a2gtuI",{"id":7150,"title":7151,"body":7152,"date":7284,"description":7285,"draft":329,"extension":330,"faq":7286,"meta":7299,"navigation":345,"path":7300,"project":2121,"readingTime":541,"seo":7301,"seoKeywords":7302,"stem":7309,"summary":7310,"tags":7311,"updated":363,"__hash__":7312},"builds\u002Fbuilds\u002Fmetool\u002F2025-11-12-lan-transfer.md","iPhone 和安卓之间传文件，怎么就这么难",{"type":8,"value":7153,"toc":7278},[7154,7157,7160,7174,7177,7187,7191,7194,7200,7203,7217,7220,7224,7227,7233,7239,7245,7251,7257,7263,7266,7272,7275],[18,7155,7156],{"id":7156},"传个文件怎么就这么难",[14,7158,7159],{},"做移动端开发的时候，我经常需要在电脑和手机之间传文件。在 Mac 和 iPhone 之间有 AirDrop，还算方便。但如果是 iPhone 和安卓之间呢？",[181,7161,7162,7165,7168,7171],{},[184,7163,7164],{},"蓝牙太慢",[184,7166,7167],{},"微信传文件有大小限制，还会压缩",[184,7169,7170],{},"邮件附件也有限制",[184,7172,7173],{},"USB 线在手边不一定有",[14,7175,7176],{},"每次遇到这个场景我都很烦。明明两台设备就在手边，传个文件却要折腾半天。",[14,7178,7179,7180,130],{},"我决定在 metool 上做一个 ",[49,7181,7182],{},[279,7183,7186],{"href":7184,"rel":7185,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FlanTransfer\u002F",[283],"局域网文件传输工具",[18,7188,7190],{"id":7189},"浏览器端-p2p-传输","浏览器端 P2P 传输",[14,7192,7193],{},"技术方案用了 WebRTC：两台设备打开同一个网页，通过邀请码建立点对点连接，文件直接在设备之间传输，不经过服务器。",[14,7195,7196],{},[55,7197],{"alt":7198,"src":7199},"跨设备文件互传工具","\u002Fb\u002Fmetool\u002Flan-transfer.png",[14,7201,7202],{},"第一版做了基础功能：",[181,7204,7205,7208,7211,7214],{},[184,7206,7207],{},"4 位数字邀请码配对",[184,7209,7210],{},"二维码扫码连接（手机扫一下就行）",[184,7212,7213],{},"文件和文本都能传",[184,7215,7216],{},"传输过程加密",[14,7218,7219],{},"但发布后发现，真实场景比想象的复杂得多。",[18,7221,7223],{"id":7222},"两周18-个-commit","两周，18 个 commit",[14,7225,7226],{},"从 11 月 12 日到 11 月 21 日，这个功能我迭代了 18 个 commit。是 metool 里单个功能迭代密度最高的一次。",[14,7228,7229,7232],{},[49,7230,7231],{},"大文件分块传输"," — 大文件不能一次性发送，要分块。每块用 Map 追踪接收状态，某一块失败了自动重传，不用重发整个文件。",[14,7234,7235,7238],{},[49,7236,7237],{},"批量文件支持"," — 不只传一个文件，要能一次选多个文件发送。",[14,7240,7241,7244],{},[49,7242,7243],{},"iOS 兼容"," — iOS Safari 对多文件传输有限制，需要特殊处理。还要提示用户调整浏览器的自动下载设置。",[14,7246,7247,7250],{},[49,7248,7249],{},"校园网\u002F办公网"," — 这类网络可能限制 P2P 连接。加了网络限制检测和提示，建议用户开手机热点作为替代方案。",[14,7252,7253,7256],{},[49,7254,7255],{},"代理环境"," — 开了代理的设备连接行为不同，加了说明。",[14,7258,7259,7262],{},[49,7260,7261],{},"连接体验"," — 邀请码从 6 位简化到 4 位纯数字，合并了扫码和手动输入的 UI，优化了连接状态的实时反馈。",[18,7264,7265],{"id":7265},"一个功能的极致打磨",[14,7267,7268,7269],{},"这两周的经历让我体会到一个道理：",[49,7270,7271],{},"做一个功能\"能用\"很快，做到\"好用\"要花十倍的时间。",[14,7273,7274],{},"初版半天就做完了，但覆盖各种边界场景、各种设备兼容性、各种网络环境，花了两周。每次觉得\"应该差不多了\"，真实使用的时候又会冒出新问题。",[14,7276,7277],{},"但这也是个人项目的好处：没有人催进度，可以把一个功能打磨到自己满意为止。",{"title":316,"searchDepth":317,"depth":317,"links":7279},[7280,7281,7282,7283],{"id":7156,"depth":320,"text":7156},{"id":7189,"depth":320,"text":7190},{"id":7222,"depth":320,"text":7223},{"id":7265,"depth":320,"text":7265},"2025-11-12","做移动端开发时经常需要跨设备传文件，iPhone 和安卓之间传文件特别痛苦。用 WebRTC 做了一个局域网 P2P 传输工具，两周迭代了 18 个 commit。",[7287,7290,7293,7296],{"q":7288,"a":7289},"为什么不用现有的文件传输工具？","AirDrop 只在苹果设备之间用，蓝牙传输太慢，微信传文件有大小限制和压缩，邮件附件也有限制。最简单的局域网传输方案需要两台设备在同一个网络下，但浏览器端的方案不需要安装任何软件，打开网页就能用。",{"q":7291,"a":7292},"WebRTC P2P 传输是怎么工作的？","两台设备打开同一个网页，通过邀请码（4 位数字）或二维码建立 WebRTC 点对点连接。文件直接在两台设备之间传输，不经过服务器。传输过程加密，数据不会被中间人截获。",{"q":7294,"a":7295},"大文件传输怎么处理？","大文件会自动分块传输，每块的接收状态用 Map 追踪。如果某一块传输失败，会自动重传而不是重新发送整个文件。这个机制在网络不稳定的环境下特别重要。",{"q":7297,"a":7298},"遇到了哪些边界场景？","校园网\u002F办公网可能限制 P2P 连接，加了使用限制提示和手机热点的解决方案建议。iOS Safari 对多文件传输有限制，做了特殊处理和提示。还有代理环境下的连接问题、自动下载的浏览器兼容性问题等，两周内覆盖了十几种边界场景。",{},"\u002Fbuilds\u002Fmetool\u002F2025-11-12-lan-transfer",{"title":7151,"description":7285},[7303,7304,7305,7306,7307,7231,7308],"局域网文件传输","WebRTC P2P","iPhone 安卓传文件","跨设备文件传输","浏览器端文件传输","在线局域网传输工具","builds\u002Fmetool\u002F2025-11-12-lan-transfer","移动端开发中 iPhone 和安卓之间传文件是一件极其痛苦的事。用 WebRTC 做了浏览器端 P2P 加密传输，支持二维码扫码连接、大文件分块传输和重传机制。两周内从初版迭代到覆盖校园网\u002F代理\u002FiOS 多文件等各种边界场景。",[1078,1746],"3cGzuWpv-48beUzZ8_2W9usNWZv7Bs5wLJnbMUbBLO4",{"id":7314,"title":7315,"body":7316,"date":7424,"description":7425,"draft":329,"extension":330,"faq":7426,"meta":7439,"navigation":345,"path":7440,"project":2121,"readingTime":535,"seo":7441,"seoKeywords":7442,"stem":7450,"summary":7451,"tags":7452,"updated":363,"__hash__":7453},"builds\u002Fbuilds\u002Fmetool\u002F2025-11-02-games-for-my-son.md","孩子一玩迷宫就是半小时，我又给他做了四个游戏",{"type":8,"value":7317,"toc":7418},[7318,7321,7324,7327,7330,7333,7336,7339,7345,7348,7358,7368,7378,7388,7391,7397,7400,7403,7405,7408,7411],[18,7319,7320],{"id":7320},"孩子的编程启蒙",[14,7322,7323],{},"我孩子很小就开始对我的电脑感兴趣。每次我在写代码，他就凑过来看。",[14,7325,7326],{},"之前在 metool 上做过一个迷宫游戏，带音效、带移动端触控操作。有一次我在手机上测试，孩子看到了，拿过去就开始玩。",[14,7328,7329],{},"一玩就是半小时。",[14,7331,7332],{},"从那以后，每次出门吃饭排队，他就问我：\"爸爸，可以玩迷宫吗？\" 我打开手机浏览器，进 metool，递给他。",[14,7334,7335],{},"这让我想到：既然迷宫他这么喜欢，我再做几个游戏给他。做成在线版，随时能打开。",[18,7337,7338],{"id":7338},"一天做了四个",[14,7340,7341],{},[55,7342],{"alt":7343,"src":7344},"给儿子做的游戏合集","\u002Fb\u002Fmetool\u002Fgames.png",[14,7346,7347],{},"2025 年 11 月 2 日，一天之内上线了：",[14,7349,7350,7357],{},[49,7351,7352],{},[279,7353,7356],{"href":7354,"rel":7355,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fgames\u002Fgo\u002F",[283],"围棋"," — 带一个启发式 AI 对手。算法考虑了领地控制、棋子连接和眼位判断，不靠深度学习模型，但在小棋盘上能提供有一定挑战性的对局。支持 9x9 和 13x13 两种棋盘。",[14,7359,7360,7367],{},[49,7361,7362],{},[279,7363,7366],{"href":7364,"rel":7365,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fgames\u002Fgomoku\u002F",[283],"五子棋"," — 同样带 AI 对手，配了胜利烟花动画。AI 的算法会评估棋型（活三、冲四等），对小朋友来说难度刚好。",[14,7369,7370,7377],{},[49,7371,7372],{},[279,7373,7376],{"href":7374,"rel":7375,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fgames\u002Ftetris\u002F",[283],"俄罗斯方块"," — 专门为移动端做了长按控制，方块能快速左右移动和加速下落。还做了悬浮分数面板和下一个方块预览，移动端体验接近桌面端。",[14,7379,7380,7387],{},[49,7381,7382],{},[279,7383,7386],{"href":7384,"rel":7385,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fvideos\u002FaudioEditor\u002F",[283],"音频波形编辑器"," — 这个不是游戏，但顺手做了。支持波形可视化、片段选择和裁剪。",[18,7389,7390],{"id":7390},"为什么做在线版",[14,7392,7393,7394,130],{},"做 App 当然也行，但在线版有一个不可替代的优势：",[49,7395,7396],{},"不需要安装",[14,7398,7399],{},"孩子想玩的时候，我打开浏览器就行了。不用去 App Store 下载，不用等更新。我改了代码部署完，下一次打开就是最新版。",[14,7401,7402],{},"对于这种\"随时可能想用一下\"的场景，网页比 App 更合适。",[18,7404,7343],{"id":7343},[14,7406,7407],{},"后来我把游戏分类的标题改成了\"给儿子做的游戏合集\"。",[14,7409,7410],{},"这不是一个商业决策，是一个爸爸的决策。metool 上的工具大多是为我自己的工作需求做的，但游戏这个品类，是为我孩子做的。",[14,7412,7413,7414,7417],{},"后来又陆续加了",[279,7415,7087],{"href":7085,"rel":7416,"target":2003},[283],"，让他在手机上用手势旋转缩放太阳系。不过那是一个月之后的事了。",{"title":316,"searchDepth":317,"depth":317,"links":7419},[7420,7421,7422,7423],{"id":7320,"depth":320,"text":7320},{"id":7338,"depth":320,"text":7338},{"id":7390,"depth":320,"text":7390},{"id":7343,"depth":320,"text":7343},"2025-11-02","孩子看我编程很感兴趣，尤其迷宫游戏他一玩就是半小时。做成在线版，随时掏出手机就能给他玩。一天之内做了围棋、五子棋、俄罗斯方块和音频编辑器。",[7427,7430,7433,7436],{"q":7428,"a":7429},"围棋的 AI 对手是怎么实现的？","用启发式算法实现，不依赖深度学习模型。算法考虑了领地控制、棋子连接、眼位判断等围棋基本策略，在 9x9 和 13x13 棋盘上能提供有一定挑战性的对局体验。全部在浏览器端运行，不需要服务器计算。",{"q":7431,"a":7432},"为什么俄罗斯方块要做移动端长按控制？","在手机上玩俄罗斯方块，传统的虚拟按键体验很差。长按控制让方块能快速左右移动和加速下落，操作更流畅。还做了悬浮分数面板和下一个方块预览，让移动端的游戏体验接近桌面端。",{"q":7434,"a":7435},"这些游戏为什么做成在线版而不是 App？","在线版的优势是随时随地能用：掏出手机打开浏览器就能玩，不需要下载安装。对孩子来说，在等餐、坐车的时候想玩，打开网页比打开 App 更快。而且在线版更新不需要用户手动升级。",{"q":7437,"a":7438},"音频编辑器是做什么用的？","支持音频波形可视化、片段选择、裁剪和播放控制。可以在浏览器里直接编辑音频文件，截取需要的片段。虽然和游戏是同一天做的，但它属于工具而不是游戏。",{},"\u002Fbuilds\u002Fmetool\u002F2025-11-02-games-for-my-son",{"title":7315,"description":7425},[7443,7444,7445,7446,7447,7448,7449],"给孩子做的游戏","在线围棋 AI 对手","在线五子棋","在线俄罗斯方块","移动端网页游戏","前端游戏开发","启发式 AI 算法","builds\u002Fmetool\u002F2025-11-02-games-for-my-son","孩子看编程很感兴趣，之前做的迷宫游戏他一玩就是半小时。一天之内在 metool 上线了围棋（带启发式 AI 对手）、五子棋（带 AI）、俄罗斯方块（移动端长按控制），还顺手做了一个音频波形编辑器。",[1078,1746],"sdnRuCOzhZjRsJiLHYmOHoSrVUv1pu-bpmx4SCnd2P4",{"id":7455,"title":7456,"body":7457,"date":7595,"description":7596,"draft":329,"extension":330,"faq":7597,"meta":7610,"navigation":345,"path":7611,"project":2121,"readingTime":535,"seo":7612,"seoKeywords":7613,"stem":7620,"summary":7621,"tags":7622,"updated":363,"__hash__":7623},"builds\u002Fbuilds\u002Fmetool\u002F2025-10-12-back-after-silence.md","停了五个月，回来发现要改的全是底层",{"type":8,"value":7458,"toc":7587},[7459,7462,7465,7468,7471,7475,7478,7485,7488,7492,7495,7516,7519,7522,7525,7547,7550,7553,7556,7578,7581,7584],[18,7460,7461],{"id":7461},"五个月的空白",[14,7463,7464],{},"从 2025 年 3 月到 10 月。中间只在 8 月份改了一次去背景工具的代码。",[14,7466,7467],{},"不是放弃了，就是没想到要做什么。工具站不像 SaaS 产品有持续的业务驱动力，个人项目的节奏就是这样：有需求就做，没需求就停。",[14,7469,7470],{},"10 月份回来再看这个项目，发现要改的不是功能，而是底层。",[18,7472,7474],{"id":7473},"ai-去背景大升级","AI 去背景大升级",[14,7476,7477],{},"第一版的图片去背景是纯手动方案：用 Canvas 笔刷一点点涂抹。能用，但效率很低。",[14,7479,7480,7481,7484],{},"这次升级到了 ",[49,7482,7483],{},"ONNX Runtime"," 方案——在浏览器端直接运行 AI 模型，一键自动去背景。精度和速度都大幅提升，而且模型在本地推理，文件还是不会离开设备。",[14,7486,7487],{},"这个升级让我意识到，前端能做的事情比我想象的多。AI 模型跑在浏览器端已经不是实验性的技术了。",[18,7489,7491],{"id":7490},"seo-补课","SEO 补课",[14,7493,7494],{},"停更期间，metool 在搜索引擎上几乎没有存在感。回来后我认真补了一次 SEO：",[181,7496,7497,7507,7510,7513],{},[184,7498,7499,7500,3319,7503,7506],{},"重构了 ",[79,7501,7502],{},"usePageMeta",[79,7504,7505],{},"useSimpleSEO","，让每个工具页自动生成规范的 meta 信息",[184,7508,7509],{},"补全了 Open Graph 标签和 JSON-LD 结构化数据",[184,7511,7512],{},"加了 SEO 客户端插件处理动态结构化数据注入",[184,7514,7515],{},"重写了 robots.txt",[14,7517,7518],{},"SEO 是那种\"不做不会死，做了慢慢见效\"的事情。但对工具站来说，搜索引擎是最重要的流量来源，不做就等于放弃了用户主动找到你的可能性。",[18,7520,7521],{"id":7521},"开发者工具首发",[14,7523,7524],{},"这次回来还上线了第一批开发者工具：",[181,7526,7527,7537],{},[184,7528,7529,7536],{},[49,7530,7531],{},[279,7532,7535],{"href":7533,"rel":7534,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FjsonBeautify\u002F",[283],"JSON 美化\u002F格式化"," — 带语法高亮和可折叠的树形视图",[184,7538,7539,7546],{},[49,7540,7541],{},[279,7542,7545],{"href":7543,"rel":7544,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdev\u002FurlEncodeDecode\u002F",[283],"URL 编码\u002F解码"," — 简单但高频的需求",[14,7548,7549],{},"自己在开发中天天用这类工具，做进 metool 顺理成章。后面这个品类会持续扩展。",[18,7551,7552],{"id":7552},"新的图片工具",[14,7554,7555],{},"还上线了两个新的图片工具：",[181,7557,7558,7568],{},[184,7559,7560,7567],{},[49,7561,7562],{},[279,7563,7566],{"href":7564,"rel":7565,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002FiphoneLongImageStitch\u002F",[283],"iPhone 长图拼接"," — 把多张 iPhone 截图拼成一张长图",[184,7569,7570,7577],{},[49,7571,7572],{},[279,7573,7576],{"href":7574,"rel":7575,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002FresizeIosAppDistribution\u002F",[283],"iOS 应用图标裁剪"," — 一键生成 App Store 需要的全套尺寸",[14,7579,7580],{},"都是做移动端开发时的真实需求。",[18,7582,7583],{"id":7583},"停了五个月不是坏事",[14,7585,7586],{},"停更的五个月让我有了新的视角。如果一直在加功能，可能不会注意到底层该升级了。有时候停下来，再回来看，反而能看清该做什么。",{"title":316,"searchDepth":317,"depth":317,"links":7588},[7589,7590,7591,7592,7593,7594],{"id":7461,"depth":320,"text":7461},{"id":7473,"depth":320,"text":7474},{"id":7490,"depth":320,"text":7491},{"id":7521,"depth":320,"text":7521},{"id":7552,"depth":320,"text":7552},{"id":7583,"depth":320,"text":7583},"2025-10-12","从 3 月到 10 月，metool 停更了五个月。不是放弃了，是没想到要做什么。回来后发现需要升级的不是功能，而是底层能力。",[7598,7601,7604,7607],{"q":7599,"a":7600},"为什么停了五个月？","没有特别的原因，就是积压的需求做完了，没想到还要做什么。工具站不像 SaaS 产品有持续的业务驱动力，个人项目的节奏就是这样——有灵感就做，没灵感就停。",{"q":7602,"a":7603},"AI 去背景升级到 ONNX 模型有什么变化？","第一版去背景是 Canvas 笔刷方案，需要手动涂抹。升级后用 ONNX Runtime 在浏览器端运行 AI 模型，一键自动去背景，精度和速度都大幅提升。模型在本地推理，文件依然不会上传到服务器。",{"q":7605,"a":7606},"这次升级了哪些 SEO 能力？","补全了 meta tags、Open Graph 标签和 JSON-LD 结构化数据。重构了 usePageMeta 和 useSimpleSEO 两个组合式函数，让每个工具页面自动生成规范的 SEO 信息。还加了 SEO 插件处理客户端渲染的结构化数据注入。",{"q":7608,"a":7609},"为什么开始做开发者工具？","自己在开发过程中经常需要格式化 JSON、编解码 URL 这类小操作。之前都在其他网站上做，现在 metool 的架构已经很成熟，加一个新工具很快，干脆自己做了。后面开发者工具会成为 metool 的一个重要品类。",{},"\u002Fbuilds\u002Fmetool\u002F2025-10-12-back-after-silence",{"title":7456,"description":7596},[7614,7615,7616,7617,7618,7566,7619],"独立开发项目停更","ONNX Runtime 去背景","Nuxt Image 优化","SEO 结构化数据","开发者工具 JSON 美化","在线工具性能优化","builds\u002Fmetool\u002F2025-10-12-back-after-silence","metool 停更五个月后回归，发现要改的不是功能而是底层：AI 去背景升级到 ONNX 模型、图片加载用 Nuxt Image 优化、SEO 从零补全结构化数据和 meta 信息、上线了第一批开发者工具（JSON 美化、URL 编解码），还做了 iPhone 长图拼接和 iOS 应用图标裁剪。",[1078,1746],"iiptoayqNzPYX0rh1rHYBLmxt007FNGkwdZhg9DuhvM",{"id":7625,"title":7626,"body":7627,"date":7744,"description":7745,"draft":329,"extension":330,"faq":7746,"meta":7759,"navigation":345,"path":7760,"project":2121,"readingTime":535,"seo":7761,"seoKeywords":7762,"stem":7769,"summary":7770,"tags":7771,"updated":363,"__hash__":7772},"builds\u002Fbuilds\u002Fmetool\u002F2025-03-01-video-tools-and-easter-eggs.md","视频处理也做了，顺手还做了几个节日彩蛋",{"type":8,"value":7628,"toc":7738},[7629,7632,7635,7638,7641,7647,7650,7682,7685,7688,7691,7702,7713,7716,7720,7729,7732,7735],[18,7630,7631],{"id":7631},"补齐视频处理",[14,7633,7634],{},"图片工具和文档工具做完之后，视频处理是一个自然的延伸。",[14,7636,7637],{},"我日常也有视频处理的需求：压缩一下视频发邮件、转个格式、截一段视频做成 GIF。和图片工具一样，网上的视频处理工具不是要上传到服务器就是要付费。",[14,7639,7640],{},"这次的方案是用 FFmpeg 的 WebAssembly 版本，直接在浏览器端跑视频处理。不需要服务器，不需要安装软件。",[14,7642,7643],{},[55,7644],{"alt":7645,"src":7646},"视频工具三件套","\u002Fb\u002Fmetool\u002Fvideo-tools.png",[14,7648,7649],{},"两周内上线了三个视频工具：",[181,7651,7652,7662,7672],{},[184,7653,7654,7661],{},[49,7655,7656],{},[279,7657,7660],{"href":7658,"rel":7659,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fvideos\u002Fcompress\u002F",[283],"视频压缩"," — 调整分辨率和码率，减小文件大小",[184,7663,7664,7671],{},[49,7665,7666],{},[279,7667,7670],{"href":7668,"rel":7669,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fvideos\u002FformatConvert\u002F",[283],"视频格式转换"," — MP4\u002FWebM\u002FAVI 互转",[184,7673,7674,7681],{},[49,7675,7676],{},[279,7677,7680],{"href":7678,"rel":7679,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fvideos\u002FvideoToGif\u002F",[283],"视频转 GIF"," — 支持自定义分辨率、帧率和时间段截取",[14,7683,7684],{},"同时还做了微信公众号 Markdown 文章转换的雏形，不过这个工具后面会有大升级，这里先不展开。",[18,7686,7687],{"id":7687},"节日彩蛋和趣味工具",[14,7689,7690],{},"工具站不一定全是\"正经\"工具。",[14,7692,7693,7694,7701],{},"3 月初正好临近清明节，我做了一个 ",[49,7695,7696],{},[279,7697,7700],{"href":7698,"rel":7699,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fmagics\u002Fqingming\u002F",[283],"清明节纪念页"," ——可以编辑纪念文字、选择背景，生成一张可以分享的纪念图片。技术上验证了文字编辑和图片合成的能力，情感上也算给工具站加了一点温度。",[14,7703,7704,7705,7712],{},"还做了一个 ",[49,7706,7707],{},[279,7708,7711],{"href":7709,"rel":7710,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fmagics\u002Flottery\u002F",[283],"抽奖工具","，动画效果比较花哨，纯粹是觉得好玩。",[14,7714,7715],{},"这些趣味工具的开发时间不长，但让我意识到一件事：工具站的边界不只是\"文件处理\"。只要是用户会在手机或电脑上临时需要的功能，都可以做。",[18,7717,7719],{"id":7718},"图片-resize-也补上了","图片 resize 也补上了",[14,7721,7722,7723,7728],{},"这个阶段还补了一个",[279,7724,7727],{"href":7725,"rel":7726,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002Fresize\u002F",[283],"图片 resize"," 工具，支持自定义尺寸调整。功能简单但使用频率很高，是之前漏掉的基础需求。",[18,7730,7731],{"id":7731},"品类在扩展",[14,7733,7734],{},"回头看这两周，metool 的工具品类从\"图片+文档\"扩展到了\"图片+文档+视频+趣味\"。工具站的定位也从\"文件处理\"慢慢变成了\"在线工具集\"。",[14,7736,7737],{},"接下来应该继续加工具，还是停下来优化体验？我当时没想清楚。事实上，后面我停了很久。",{"title":316,"searchDepth":317,"depth":317,"links":7739},[7740,7741,7742,7743],{"id":7631,"depth":320,"text":7631},{"id":7687,"depth":320,"text":7687},{"id":7718,"depth":320,"text":7719},{"id":7731,"depth":320,"text":7731},"2025-03-01","视频压缩、格式转换、视频转 GIF，把视频处理需求补齐了。清明节纪念页和抽奖工具是兴趣驱动，验证可行性。",[7747,7750,7753,7756],{"q":7748,"a":7749},"浏览器端能做视频压缩和格式转换吗？","可以。用 FFmpeg 的 WebAssembly 版本在浏览器端运行，支持视频压缩、格式转换（MP4\u002FWebM\u002FAVI 互转）和视频转 GIF。处理速度取决于设备性能，但中等长度的视频完全够用，且不需要上传到服务器。",{"q":7751,"a":7752},"视频转 GIF 工具有什么特色？","支持自定义分辨率（多档可选）、帧率调整和时间段截取。GIF 的尺寸优化是难点，提供了多种分辨率选项让用户在清晰度和文件大小之间取舍。",{"q":7754,"a":7755},"为什么要做清明节纪念页和抽奖工具？","纯粹是兴趣驱动和技术验证。清明节纪念页验证了动态文字编辑和背景合成的能力，抽奖工具验证了动画交互效果。这类趣味工具虽然不是核心功能，但能让工具站更有温度。",{"q":7757,"a":7758},"微信公众号 Markdown 转换工具是怎么回事？","第一版的微信公众号文章转换在这个阶段就做了雏形，把 Markdown 渲染成公众号兼容的富文本格式。后来在 2026 年 3 月做了大幅升级和高度定制化。",{},"\u002Fbuilds\u002Fmetool\u002F2025-03-01-video-tools-and-easter-eggs",{"title":7626,"description":7745},[7763,7680,7764,7765,7766,7767,7768],"在线视频压缩","前端视频处理","FFmpeg WASM","微信公众号文章转换","浏览器端视频转换","在线工具开发","builds\u002Fmetool\u002F2025-03-01-video-tools-and-easter-eggs","图片和文档工具做完后，视频处理是下一个自然需求。两周内上线了视频压缩、格式转换和视频转 GIF 三个工具，同时做了微信公众号文章转换、清明节纪念页和抽奖工具。工具站的品类从文件处理扩展到了内容创作和趣味工具。",[1078,1746],"mqYPYxMP9M5vITnR0pz8FrsbGuDd-a7ZEo0hukqQzqk",{"id":7774,"title":7775,"body":7776,"date":7877,"description":7878,"draft":329,"extension":330,"faq":7879,"meta":7892,"navigation":345,"path":7893,"project":2121,"readingTime":535,"seo":7894,"seoKeywords":7895,"stem":7903,"summary":7904,"tags":7905,"updated":363,"__hash__":7906},"builds\u002Fbuilds\u002Fmetool\u002F2025-02-24-go-international.md","AI 把做国际站的门槛降到了最低",{"type":8,"value":7777,"toc":7871},[7778,7782,7785,7788,7791,7794,7797,7825,7831,7842,7846,7849,7855,7858,7861,7865,7868],[18,7779,7781],{"id":7780},"ai-把翻译成本打下来了","AI 把翻译成本打下来了",[14,7783,7784],{},"做了一个月的工具站，工具数量已经不少了。这时候一个想法自然冒了出来：要不要做成国际站？",[14,7786,7787],{},"以前做多语言网站是一件成本很高的事——翻译、校对、维护，每多一种语言就多一份工作量。但 AI 改变了这个等式。翻译成本降到了接近零，一段中文丢给 AI，几秒钟就能拿到质量不错的英文。",[14,7789,7790],{},"我决定用 metool 来验证做国际站的标准方案。",[18,7792,7793],{"id":7793},"中英双语架构",[14,7795,7796],{},"技术方案用了 Nuxt i18n 模块：",[181,7798,7799,7812,7815,7822],{},[184,7800,7801,7802,7805,7806,3319,7809],{},"翻译文件放在 ",[79,7803,7804],{},"locales\u002F"," 目录，",[79,7807,7808],{},"en.json",[79,7810,7811],{},"zh.json",[184,7813,7814],{},"所有工具的标题、描述、按钮文案抽取到翻译文件中",[184,7816,7817,7818,7821],{},"页面组件通过 ",[79,7819,7820],{},"$t()"," 函数引用，不再硬编码中文",[184,7823,7824],{},"路由支持语言前缀切换",[14,7826,7827],{},[55,7828],{"alt":7829,"src":7830},"3D GLB 模型在线预览","\u002Fb\u002Fmetool\u002F3d-preview.png",[14,7832,7833,7834,7841],{},"同一时期还上线了 ",[49,7835,7836],{},[279,7837,7840],{"href":7838,"rel":7839,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002F3d\u002FglbPreview\u002F",[283],"3D GLB 模型预览工具","，用 Three.js 做的。支持拖拽上传 GLB 文件，实时预览、缩放旋转、背景色切换、自动旋转。算是拓展了工具的品类边界，从纯文件处理扩展到了 3D 领域。",[18,7843,7845],{"id":7844},"试了日韩语然后砍掉了","试了日韩语，然后砍掉了",[14,7847,7848],{},"做国际化的时候，顺手加了日语和韩语的支持。",[14,7850,7851,7852],{},"但很快发现一个问题：",[49,7853,7854],{},"翻译容易，维护难。",[14,7856,7857],{},"每次新增一个工具或者改一个文案，要同步更新四种语言的翻译文件。在没有真实用户数据证明日韩用户有需求的情况下，这个维护成本完全不值得。",[14,7859,7860],{},"果断砍掉，只保留中英文。有了用户数据再决定要不要加。",[18,7862,7864],{"id":7863},"经验先做减法","经验：先做减法",[14,7866,7867],{},"国际化不是\"支持的语言越多越好\"，而是要验证：有没有人用、用了之后体验是否完整。",[14,7869,7870],{},"中英双语是投入产出比最高的选择。英语覆盖了全球大部分互联网用户，维护成本可控，也足以验证国际化方案是否跑得通。",{"title":316,"searchDepth":317,"depth":317,"links":7872},[7873,7874,7875,7876],{"id":7780,"depth":320,"text":7781},{"id":7793,"depth":320,"text":7793},{"id":7844,"depth":320,"text":7845},{"id":7863,"depth":320,"text":7864},"2025-02-24","有了 AI，翻译不再是瓶颈。正好趁这个机会验证做国际站的标准方案，顺便把 3D 模型预览工具也做了。",[7880,7883,7886,7889],{"q":7881,"a":7882},"为什么选择在这个时候做国际化？","AI 翻译能力的提升让多语言内容的生产成本大幅降低，以前需要专人翻译的工作现在 AI 几秒钟就能完成。正好用这个项目验证一下做国际站的标准方案，积累经验。",{"q":7884,"a":7885},"国际化的技术方案是什么？","使用 Nuxt i18n 模块，翻译文件用 JSON 格式存放在 locales 目录（en.json 和 zh.json）。所有工具的标题、描述、操作按钮文案都抽取到翻译文件中，页面组件通过 $t() 函数引用。路由支持语言前缀切换。",{"q":7887,"a":7888},"为什么砍掉了日语和韩语支持？","最初尝试加了日语和韩语，但很快发现：翻译容易，维护难。每次新增或修改一个工具，要同步更新四种语言的翻译文件。在没有明确用户需求的情况下，维护成本远高于收益，果断砍掉只保留中英文。",{"q":7890,"a":7891},"3D 模型预览工具是怎么做的？","用 Three.js 构建 3D 场景，支持 GLB 格式模型的拖拽上传和实时预览。功能包括缩放旋转、网格显示、背景色切换、自动旋转。所有渲染在浏览器端完成，不需要安装任何软件。",{},"\u002Fbuilds\u002Fmetool\u002F2025-02-24-go-international",{"title":7775,"description":7878},[7896,7897,7898,7899,7900,7901,7902],"Nuxt i18n 国际化","AI 辅助翻译","在线 3D 模型预览","Three.js GLB 预览","多语言网站开发","国际化工具站","前端 i18n 架构","builds\u002Fmetool\u002F2025-02-24-go-international","AI 让翻译成本降到接近零，做国际站不再是大公司才能干的事。用 Nuxt i18n 搭建了中英双语架构，同时上线了 3D GLB 模型预览工具。曾尝试日韩语支持，发现维护成本高于收益后果断砍掉。",[1078,361],"o4vphR82AQXe1eS-PrkTEb8KWq-BAuA2MYsxYEf1P8c",{"id":7908,"title":7909,"body":7910,"date":8055,"description":8056,"draft":329,"extension":330,"faq":8057,"meta":8070,"navigation":345,"path":8071,"project":2121,"readingTime":535,"seo":8072,"seoKeywords":8073,"stem":8078,"summary":8079,"tags":8080,"updated":363,"__hash__":8081},"builds\u002Fbuilds\u002Fmetool\u002F2025-02-08-tool-explosion.md","积压的需求一起爆发，两周上线了十几个工具",{"type":8,"value":7911,"toc":8049},[7912,7915,7918,7921,7925,7928,7933,7979,7984,8001,8006,8016,8022,8025,8028,8031,8034,8037,8043,8046],[18,7913,7914],{"id":7914},"积压的需求清单",[14,7916,7917],{},"基础架构搭好之后，我脑子里积压的需求开始一个接一个往外冒。",[14,7919,7920],{},"这些都是我日常工作中反复遇到的场景：图片要转格式、要压缩、要生成二维码、要去背景。文档要从 Word 转 PDF、Markdown 要转成其他格式。每次都在网上找工具，现在终于可以一口气做完了。",[18,7922,7924],{"id":7923},"两周十几个工具","两周，十几个工具",[14,7926,7927],{},"从 2 月 8 日到 2 月 20 日，密集上线了这些工具：",[14,7929,7930],{},[49,7931,7932],{},"图片工具全家桶：",[181,7934,7935,7943,7949,7957,7965,7972],{},[184,7936,7937,7942],{},[279,7938,7941],{"href":7939,"rel":7940,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002FimageFormatConvert\u002F",[283],"图片格式转换","（JPG\u002FPNG\u002FWebP\u002FICO 互转）",[184,7944,7945],{},[279,7946,4939],{"href":7947,"rel":7948,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002Fcompress\u002F",[283],[184,7950,7951,7956],{},[279,7952,7955],{"href":7953,"rel":7954,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002FqrCodeGenerate\u002F",[283],"QR 码生成器","（支持自定义锚点和数据点样式）",[184,7958,7959,7964],{},[279,7960,7963],{"href":7961,"rel":7962,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002FremoveBackground\u002F",[283],"图片去背景","（Canvas 笔刷方案）",[184,7966,7967],{},[279,7968,7971],{"href":7969,"rel":7970,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002FlongImageSplit\u002F",[283],"长图分割",[184,7973,7974],{},[279,7975,7978],{"href":7976,"rel":7977,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fimages\u002FmovieSubtitleCrop\u002F",[283],"电影字幕裁剪",[14,7980,7981],{},[49,7982,7983],{},"文档工具：",[181,7985,7986,7993],{},[184,7987,7988],{},[279,7989,7992],{"href":7990,"rel":7991,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdocs\u002FwordToPDF\u002F",[283],"Word 转 PDF",[184,7994,7995,8000],{},[279,7996,7999],{"href":7997,"rel":7998,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fdocs\u002FmarkdownConvert\u002F",[283],"Markdown 格式转换","（支持导出 HTML）",[14,8002,8003],{},[49,8004,8005],{},"趣味工具：",[181,8007,8008],{},[184,8009,8010,8015],{},[279,8011,8014],{"href":8012,"rel":8013,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fmagics\u002FheartBeat\u002F",[283],"心跳表白页","（带微信分享适配）",[14,8017,8018],{},[55,8019],{"alt":8020,"src":8021},"图片工具全家桶","\u002Fb\u002Fmetool\u002Fimage-tools.png",[14,8023,8024],{},"速度能这么快，核心原因是第一天搭的架构：工具卡片组件、分类体系、页面模板全是复用的，新增一个工具只需要写核心逻辑。图片处理用 Canvas API，文档转换用 mammoth.js，每个工具的核心代码量其实不大。",[18,8026,8027],{"id":8027},"数据基础也搭好了",[14,8029,8030],{},"2 月 14 日接入了 Google Analytics，虽然这时候几乎没有外部流量，但尽早有数据追踪比后面补要好得多。",[14,8032,8033],{},"2 月 17 日配置了 sitemap 和 robots.txt，加了 404 错误页面。SEO 基础设施越早搭好越省事，搜索引擎需要时间爬取和收录。",[18,8035,8036],{"id":8036},"所有处理都在本地",[14,8038,8039,8040,130],{},"有一个原则从第一天就没变过：",[49,8041,8042],{},"所有文件处理都在浏览器端完成",[14,8044,8045],{},"图片压缩用 Canvas API，格式转换用 Blob 操作，文档解析用 JavaScript 库。用户的文件不会上传到任何服务器。这不只是隐私保障，也意味着没有服务器成本，工具可以无限免费用。",[14,8047,8048],{},"两周下来，metool 已经从\"三个工具\"变成了\"十几个工具\"。积压的需求基本清完了，但新的想法又开始冒出来。",{"title":316,"searchDepth":317,"depth":317,"links":8050},[8051,8052,8053,8054],{"id":7914,"depth":320,"text":7914},{"id":7923,"depth":320,"text":7924},{"id":8027,"depth":320,"text":8027},{"id":8036,"depth":320,"text":8036},"2025-02-08","图片格式转换、压缩、QR 码生成、去背景、Word 转 PDF、Markdown 转换。把日常文件处理的需求全都做成了在线工具。",[8058,8061,8064,8067],{"q":8059,"a":8060},"两周内是怎么做到上线十几个工具的？","关键在于第一天搭好的架构：分类体系、工具卡片组件、页面模板都是复用的，新增一个工具只需要写核心处理逻辑。图片格式转换用 Canvas API，压缩用 OffscreenCanvas，QR 码用开源库，文档转换用 mammoth.js，每个工具的核心代码量并不大。",{"q":8062,"a":8063},"这些工具的文件处理在哪里完成？","全部在浏览器端完成，不需要上传到服务器。图片处理用 Canvas API 和 Web Worker，文档转换用 JavaScript 库在本地解析。用户的文件不会离开设备，隐私安全有保障。",{"q":8065,"a":8066},"为什么要做图片去背景工具？","日常做素材时经常需要抠图，在线去背景工具要么要付费，要么效果差。用前端 Canvas 配合笔刷工具做了一个本地版，虽然不如 AI 模型精准，但够用且免费。后来在 8 月升级成了 ONNX 模型方案。",{"q":8068,"a":8069},"Google Analytics 和 SEO 在这个阶段就接入了吗？","是的。GA 在 2 月 14 日接入，sitemap 和 robots 在 2 月 17 日配置完成。虽然这时候流量很少，但尽早接入数据追踪能帮助后面分析用户行为。SEO 基础设施（sitemap、robots.txt、错误页面）也是越早搭好越省事。",{},"\u002Fbuilds\u002Fmetool\u002F2025-02-08-tool-explosion",{"title":7909,"description":8056},[8074,8075,7955,7963,7992,8076,8077],"在线图片处理工具","在线文档转换","前端文件处理","浏览器端图片压缩","builds\u002Fmetool\u002F2025-02-08-tool-explosion","基础架构搭好后，两周内密集上线了十几个工具：图片全家桶（格式转换、压缩、QR 码生成、去背景、长图分割）、文档工具（Word 转 PDF、Markdown 转换）、心跳魔法工具，同时接入了 Google Analytics 和基础 SEO。",[1078,1746],"fw6xObA62S7sQ5Tf0Xvu8pCMRptFYfiu3gj1gPqoWhY",{"id":8083,"title":8084,"body":8085,"date":8188,"description":8189,"draft":329,"extension":330,"faq":8190,"meta":8203,"navigation":345,"path":8204,"project":2121,"readingTime":535,"seo":8205,"seoKeywords":8206,"stem":8212,"summary":8213,"tags":8214,"updated":363,"__hash__":8215},"builds\u002Fbuilds\u002Fmetool\u002F2025-01-23-start-from-scratch.md","网上找不到称手的工具，我决定自己做一个",{"type":8,"value":8086,"toc":8182},[8087,8090,8093,8096,8099,8102,8105,8108,8111,8141,8144,8148,8154,8157,8166,8172,8176,8179],[18,8088,8089],{"id":8089},"找不到称手的工具",[14,8091,8092],{},"我的日常工作里，经常需要临时处理一些文件：裁剪图片、转换格式、给视频截字幕区域。",[14,8094,8095],{},"每次都要在网上翻一圈找在线工具。找到的要么功能不对，要么满屏广告，要么要注册才能用，要么要把文件上传到别人的服务器。",[14,8097,8098],{},"这种事情经历多了，我就想：这些操作前端完全能做，为什么不自己做一个？",[18,8100,8101],{"id":8101},"一天搭起来",[14,8103,8104],{},"2025 年 1 月 23 日，我花了一天时间把基础架构搭好了。",[14,8106,8107],{},"技术栈选了 Nuxt 3 + TypeScript + Tailwind CSS。Nuxt 的 SSG 模式可以生成纯静态页面，加载快，部署简单。文件处理全部在浏览器端完成，数据不会离开用户的设备。",[14,8109,8110],{},"第一天上线的工具：",[181,8112,8113,8123,8133],{},[184,8114,8115,8122],{},[49,8116,8117],{},[279,8118,8121],{"href":8119,"rel":8120,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fgames\u002Fsnake\u002F",[283],"贪吃蛇"," — 用来验证游戏交互能力",[184,8124,8125,8132],{},[49,8126,8127],{},[279,8128,8131],{"href":8129,"rel":8130,"target":2003},"https:\u002F\u002Fmetool.online\u002Fzh\u002Fgames\u002Fmaze\u002F",[283],"迷宫游戏"," — 带音效和移动端控制",[184,8134,8135,8140],{},[49,8136,8137],{},[279,8138,7978],{"href":7976,"rel":8139,"target":2003},[283]," — 真实需求，批量裁剪视频截图中的字幕区域",[14,8142,8143],{},"同时搭好了整个工具框架：导航栏、侧边菜单、工具卡片组件、分类体系。后面加新工具只需要写页面逻辑，框架层的事情不用再操心。",[18,8145,8147],{"id":8146},"随时随地手机也能用","随时随地，手机也能用",[14,8149,8150,8151,130],{},"做这个工具箱有一个重要的前提：",[49,8152,8153],{},"手机也能用",[14,8155,8156],{},"我不是总在电脑前，很多时候是在手机上临时需要处理个文件。所以从第一天起，移动端适配就是必须的，不是\"以后再说\"的事。",[14,8158,8159,8160,8165],{},"贪吃蛇和迷宫游戏都做了移动端触控操作，字幕裁剪支持拖拽选区。在手机浏览器里打开 ",[279,8161,8164],{"href":8162,"rel":8163,"target":2003},"https:\u002F\u002Fmetool.online",[283],"metool.online"," 就能直接用。",[14,8167,8168],{},[55,8169],{"alt":8170,"src":8171},"metool.online 首页","\u002Fb\u002Fmetool\u002Fhomepage.png",[18,8173,8175],{"id":8174},"起步很轻但框架要对","起步很轻，但框架要对",[14,8177,8178],{},"回头看，第一天最重要的不是上线了几个工具，而是把架构搭对了：分类体系、组件复用、路由规范。这些决定了后面能不能快速扩充工具，而不是每次都从头写。",[14,8180,8181],{},"工具箱刚刚开始，积压的需求还有一堆。",{"title":316,"searchDepth":317,"depth":317,"links":8183},[8184,8185,8186,8187],{"id":8089,"depth":320,"text":8089},{"id":8101,"depth":320,"text":8101},{"id":8146,"depth":320,"text":8147},{"id":8174,"depth":320,"text":8175},"2025-01-23","每次需要处理图片、裁剪字幕都要在网上翻半天，找到的工具不是功能不对就是体验太差。干脆自己做一个在线工具箱，随时随地能用。",[8191,8194,8197,8200],{"q":8192,"a":8193},"为什么要自己做在线工具箱？","日常工作中经常需要临时处理图片、裁剪视频字幕等，但网上的在线工具要么功能不匹配，要么广告太多体验差。自己做一个工具集，既能完全满足自己的需求，还能随时随地通过手机访问。",{"q":8195,"a":8196},"metool.online 用了什么技术栈？","Nuxt 3 + TypeScript + Tailwind CSS，SSG 静态生成部署。选择 Nuxt 是因为 Vue 生态成熟，SSG 模式加载快且 SEO 友好，前端能力足以处理图片、音视频等文件操作。",{"q":8198,"a":8199},"第一天做了哪些工具？","第一天上线了三个工具：贪吃蛇游戏、迷宫游戏和电影字幕裁剪。游戏是用来验证交互能力的，字幕裁剪是真实需求驱动。同时搭好了导航栏、侧边菜单、工具卡片等基础组件架构。",{"q":8201,"a":8202},"为什么不直接用现成的在线工具？","现成工具有几个痛点：功能不完全匹配自己的需求、广告干扰体验、部分工具需要上传到服务器有隐私风险。自建工具全部在浏览器端处理，数据不离开本地，而且可以按自己的习惯定制功能。",{},"\u002Fbuilds\u002Fmetool\u002F2025-01-23-start-from-scratch",{"title":8084,"description":8189},[8207,8208,8209,8076,8210,8164,8211],"在线工具箱","独立开发在线工具","Nuxt 3 工具站","自建工具集","移动端在线工具","builds\u002Fmetool\u002F2025-01-23-start-from-scratch","经常在网上找在线工具，但总找不到刚好合适的。用 Nuxt 3 + TypeScript + Tailwind CSS 从零搭建了一个在线工具箱 metool.online，第一天就上线了贪吃蛇、迷宫游戏和电影字幕裁剪三个工具。",[1078,1746],"Fnr1PEBjKKQH6aW3oegh7BDch75TqUVOxrwcGFSIfSI",[8217,8381,8588,8759,8899,9319,9661,9948,10259],{"id":8218,"title":8219,"body":8220,"cover":363,"date":8372,"description":8373,"draft":329,"extension":330,"faq":363,"meta":8374,"navigation":345,"path":8375,"publish":329,"readingTime":562,"seo":8376,"seoKeywords":363,"series":8377,"stem":8378,"summary":363,"tags":8379,"updated":363,"__hash__":8380},"tutorials\u002Ftutorials\u002Fai-agent-skill\u002Fcombine-skills.md","组合使用多个 Skill",{"type":8,"value":8221,"toc":8358},[8222,8226,8229,8234,8237,8241,8244,8247,8258,8261,8264,8270,8273,8276,8282,8285,8289,8293,8298,8304,8309,8315,8318,8322,8325,8331,8335,8338,8341,8344,8355],[18,8223,8225],{"id":8224},"为什么要组合-skill","为什么要组合 Skill",[14,8227,8228],{},"单个 Skill 解决单个问题，但真实工作往往需要多步操作：",[11,8230,8231],{},[14,8232,8233],{},"把客户发来的 PDF 报告里的数据提取出来，做成 Excel 表格，然后生成一份分析 PPT。",[14,8235,8236],{},"这个任务涉及三个 Skill：PDF → Excel → PPTX。",[18,8238,8240],{"id":8239},"实战从-pdf-到-ppt","实战：从 PDF 到 PPT",[496,8242,8243],{"id":8243},"场景描述",[14,8245,8246],{},"你收到了一份季度销售报告（PDF），需要：",[1193,8248,8249,8252,8255],{},[184,8250,8251],{},"提取其中的销售数据表格",[184,8253,8254],{},"用 Excel 做数据清洗和计算",[184,8256,8257],{},"生成一份可视化的 PPT 报告",[496,8259,8260],{"id":8260},"操作步骤",[14,8262,8263],{},"直接告诉 Agent 你的完整需求：",[436,8265,8268],{"className":8266,"code":8267,"language":441},[439],"请帮我完成以下任务：\n1. 读取 sales-q1.pdf 中的销售数据\n2. 整理成 Excel，按地区汇总\n3. 生成一份 PPT，包含柱状图和关键指标\n",[79,8269,8267],{"__ignoreMap":316},[14,8271,8272],{},"Agent 会自动拆解任务，依次调用不同的 Skill。",[496,8274,8275],{"id":8275},"背后发生了什么",[436,8277,8280],{"className":8278,"code":8279,"language":441},[439],"[PDF Skill] → 读取 PDF，提取表格\n     ↓\n[Excel Skill] → 创建工作表，按地区分组汇总\n     ↓\n[PPTX Skill] → 生成幻灯片，插入图表\n",[79,8281,8279],{"__ignoreMap":316},[14,8283,8284],{},"每个 Skill 的输出自动成为下一个 Skill 的输入，形成流水线。",[18,8286,8288],{"id":8287},"组合-skill-的技巧","组合 Skill 的技巧",[496,8290,8292],{"id":8291},"_1-描述最终目标而非中间步骤","1. 描述最终目标，而非中间步骤",[14,8294,8295],{},[49,8296,8297],{},"不好的方式：",[436,8299,8302],{"className":8300,"code":8301,"language":441},[439],"先用 PDF skill 读取文件，然后...\n",[79,8303,8301],{"__ignoreMap":316},[14,8305,8306],{},[49,8307,8308],{},"好的方式：",[436,8310,8313],{"className":8311,"code":8312,"language":441},[439],"把这份 PDF 报告的数据做成分析 PPT\n",[79,8314,8312],{"__ignoreMap":316},[14,8316,8317],{},"让 Agent 自己决定用哪些 Skill、怎么组合。",[496,8319,8321],{"id":8320},"_2-分步确认关键节点","2. 分步确认关键节点",[14,8323,8324],{},"对于复杂任务，可以在关键节点设置确认：",[436,8326,8329],{"className":8327,"code":8328,"language":441},[439],"帮我分析这份报告，每一步完成后先给我看结果，我确认后再继续。\n",[79,8330,8328],{"__ignoreMap":316},[496,8332,8334],{"id":8333},"_3-保存常用组合","3. 保存常用组合",[14,8336,8337],{},"如果你经常做类似的任务，可以把流程保存为自定义 Skill（我们在进阶篇会详细讲）。",[18,8339,8340],{"id":8340},"本章小结",[14,8342,8343],{},"第一章我们学到了：",[181,8345,8346,8349,8352],{},[184,8347,8348],{},"Skill 是 Agent 的技能包",[184,8350,8351],{},"安装 Skill 就像安装 App",[184,8353,8354],{},"多个 Skill 可以组合成流水线",[14,8356,8357],{},"接下来的第二章，我们将深入学习如何自己制作 Skill。",{"title":316,"searchDepth":317,"depth":317,"links":8359},[8360,8361,8366,8371],{"id":8224,"depth":320,"text":8225},{"id":8239,"depth":320,"text":8240,"children":8362},[8363,8364,8365],{"id":8243,"depth":317,"text":8243},{"id":8260,"depth":317,"text":8260},{"id":8275,"depth":317,"text":8275},{"id":8287,"depth":320,"text":8288,"children":8367},[8368,8369,8370],{"id":8291,"depth":317,"text":8292},{"id":8320,"depth":317,"text":8321},{"id":8333,"depth":317,"text":8334},{"id":8340,"depth":320,"text":8340},"2026-03-25","学会在一个任务中串联多个 Skill，让 AI Agent 像流水线一样高效处理复杂工作。",{},"\u002Ftutorials\u002Fai-agent-skill\u002Fcombine-skills",{"title":8219,"description":8373},"ai-agent-skill","tutorials\u002Fai-agent-skill\u002Fcombine-skills",[361],"mVA8siZlF2GZX689IbHa7pAwpaNySmWD0z9NJ1dCwmE",{"id":8382,"title":8383,"body":8384,"cover":363,"date":5807,"description":8581,"draft":329,"extension":330,"faq":363,"meta":8582,"navigation":345,"path":8583,"publish":329,"readingTime":591,"seo":8584,"seoKeywords":363,"series":8377,"stem":8585,"summary":363,"tags":8586,"updated":363,"__hash__":8587},"tutorials\u002Ftutorials\u002Fai-agent-skill\u002Ffull-workflow.md","串联完整工作流",{"type":8,"value":8385,"toc":8566},[8386,8389,8392,8420,8423,8426,8430,8436,8440,8446,8450,8456,8460,8464,8467,8471,8474,8478,8481,8487,8490,8493,8513,8516,8519,8557,8563],[18,8387,8388],{"id":8388},"回顾我们做了什么",[14,8390,8391],{},"经过前面的学习，我们已经有了：",[181,8393,8394,8401,8407,8414],{},[184,8395,8396,8397,8400],{},"✅ ",[49,8398,8399],{},"收集 Skill"," — 把内容存入知识库",[184,8402,8396,8403,8406],{},[49,8404,8405],{},"检索 Skill"," — 语义搜索知识库",[184,8408,8409,8410,8413],{},"📝 ",[49,8411,8412],{},"整理 Skill"," — 自动打标签和归类",[184,8415,8409,8416,8419],{},[49,8417,8418],{},"输出 Skill"," — 生成报告和回答",[14,8421,8422],{},"今天把它们全部串联起来。",[18,8424,8425],{"id":8425},"完整工作流演示",[496,8427,8429],{"id":8428},"场景一日常知识收集","场景一：日常知识收集",[436,8431,8434],{"className":8432,"code":8433,"language":441},[439],"用户：把这篇文章存到知识库\n      https:\u002F\u002Fexample.com\u002Fdeep-learning-trends\n\nAgent：[收集 Skill] 抓取文章内容\n      [整理 Skill] 生成摘要 + 标签\n      \n✅ 已保存到知识库\n📝 摘要：深度学习领域的 5 个新趋势...\n🏷️ 标签：AI, 深度学习, 趋势\n📁 位置：data\u002Farticles\u002F2026-03-27-deep-learning-trends.md\n",[79,8435,8433],{"__ignoreMap":316},[496,8437,8439],{"id":8438},"场景二知识检索-问答","场景二：知识检索 + 问答",[436,8441,8444],{"className":8442,"code":8443,"language":441},[439],"用户：我之前存过哪些关于学习方法的内容？帮我总结一下。\n\nAgent：[检索 Skill] 找到 8 篇相关内容\n      [输出 Skill] 综合分析并生成总结\n\n📚 找到 8 篇相关内容，核心观点总结：\n\n1. **间隔重复** — 分散学习比集中学习效果好 3 倍\n2. **主动回忆** — 做题比看书记得更牢\n3. **睡眠整合** — 学完立即睡觉，记忆效果翻倍\n4. **跨学科迁移** — 用已知领域的模型理解新领域\n",[79,8445,8443],{"__ignoreMap":316},[496,8447,8449],{"id":8448},"场景三知识驱动的创作","场景三：知识驱动的创作",[436,8451,8454],{"className":8452,"code":8453,"language":441},[439],"用户：根据我知识库里关于 AI 教育的内容，\n      帮我写一篇公众号文章。\n\nAgent：[检索 Skill] 找到相关知识\n      [输出 Skill] 基于知识库内容创作\n\n📝 生成文章：《AI 时代，我们该教孩子什么》\n   - 引用了你知识库中 5 篇相关笔记\n   - 所有观点都有知识库来源支撑\n",[79,8455,8453],{"__ignoreMap":316},[18,8457,8459],{"id":8458},"skill-编排的核心概念","Skill 编排的核心概念",[496,8461,8463],{"id":8462},"_1-顺序编排","1. 顺序编排",[14,8465,8466],{},"A → B → C，每一步的输出是下一步的输入。",[496,8468,8470],{"id":8469},"_2-并行编排","2. 并行编排",[14,8472,8473],{},"A 和 B 同时执行，结果汇总后给 C。",[496,8475,8477],{"id":8476},"_3-条件编排","3. 条件编排",[14,8479,8480],{},"根据 A 的结果，决定执行 B 还是 C。",[436,8482,8485],{"className":8483,"code":8484,"language":441},[439],"收集新内容\n    ↓\n判断内容类型\n    ├── 如果是文章 → 生成长摘要\n    ├── 如果是书签 → 生成短标注\n    └── 如果是笔记 → 直接保存\n",[79,8486,8484],{"__ignoreMap":316},[18,8488,8489],{"id":8489},"部署和分享",[14,8491,8492],{},"当你的 Skill 组合稳定后，可以：",[1193,8494,8495,8501,8507],{},[184,8496,8497,8500],{},[49,8498,8499],{},"打包成项目"," — 上传到 GitHub，让别人也能用",[184,8502,8503,8506],{},[49,8504,8505],{},"写使用文档"," — 说明每个 Skill 的功能和用法",[184,8508,8509,8512],{},[49,8510,8511],{},"持续迭代"," — 根据使用反馈不断优化",[18,8514,8515],{"id":8515},"系列总结",[14,8517,8518],{},"恭喜你完成了整个系列！我们学到了：",[949,8520,8521,8531],{},[952,8522,8523],{},[955,8524,8525,8528],{},[958,8526,8527],{},"章节",[958,8529,8530],{},"核心内容",[965,8532,8533,8541,8549],{},[955,8534,8535,8538],{},[970,8536,8537],{},"第一章：入门",[970,8539,8540],{},"Skill 是什么、怎么安装、怎么组合使用",[955,8542,8543,8546],{},[970,8544,8545],{},"第二章：进阶",[970,8547,8548],{},"Skill 的结构、怎么制作、提示词工程",[955,8550,8551,8554],{},[970,8552,8553],{},"第三章：实战",[970,8555,8556],{},"完整项目实战、多 Skill 串联",[14,8558,8559,8562],{},[49,8560,8561],{},"记住：Skill 的本质是把人类的专业知识变成 AI 可以理解和执行的指令。"," 掌握了这个能力，你就掌握了 AI 时代最重要的技能之一。",[14,8564,8565],{},"Happy Skilling! 🚀",{"title":316,"searchDepth":317,"depth":317,"links":8567},[8568,8569,8574,8579,8580],{"id":8388,"depth":320,"text":8388},{"id":8425,"depth":320,"text":8425,"children":8570},[8571,8572,8573],{"id":8428,"depth":317,"text":8429},{"id":8438,"depth":317,"text":8439},{"id":8448,"depth":317,"text":8449},{"id":8458,"depth":320,"text":8459,"children":8575},[8576,8577,8578],{"id":8462,"depth":317,"text":8463},{"id":8469,"depth":317,"text":8470},{"id":8476,"depth":317,"text":8477},{"id":8489,"depth":320,"text":8489},{"id":8515,"depth":320,"text":8515},"把收集、整理、检索、输出四个 Skill 串联成一个完整的知识库助手，体验 Skill 组合的威力。",{},"\u002Ftutorials\u002Fai-agent-skill\u002Ffull-workflow",{"title":8383,"description":8581},"tutorials\u002Fai-agent-skill\u002Ffull-workflow",[361,1078],"D4AB5t4iOcp5DeW3AzCB2htYlWSd7s9V1UD2EAa3npI",{"id":8589,"title":8590,"body":8591,"cover":363,"date":8372,"description":8752,"draft":329,"extension":330,"faq":363,"meta":8753,"navigation":345,"path":8754,"publish":329,"readingTime":347,"seo":8755,"seoKeywords":363,"series":8377,"stem":8756,"summary":363,"tags":8757,"updated":363,"__hash__":8758},"tutorials\u002Ftutorials\u002Fai-agent-skill\u002Finstall-first-skill.md","安装你的第一个 Skill",{"type":8,"value":8592,"toc":8737},[8593,8596,8599,8607,8611,8614,8617,8663,8666,8670,8673,8679,8682,8686,8689,8695,8699,8702,8708,8711,8715,8718,8722,8725,8729,8732,8734],[18,8594,8595],{"id":8595},"准备工作",[14,8597,8598],{},"在开始之前，你需要：",[1193,8600,8601,8604],{},[184,8602,8603],{},"一个支持 Skill 的 AI Agent（本教程以 CodeBuddy 为例）",[184,8605,8606],{},"基本的命令行操作能力（不需要写代码）",[18,8608,8610],{"id":8609},"什么是-skill-市场","什么是 Skill 市场",[14,8612,8613],{},"Skill 市场就像手机上的 App Store —— 别人已经做好了各种 Skill，你只需要「安装」就能用。",[14,8615,8616],{},"常见的 Skill 分类：",[949,8618,8619,8629],{},[952,8620,8621],{},[955,8622,8623,8626],{},[958,8624,8625],{},"分类",[958,8627,8628],{},"示例",[965,8630,8631,8639,8647,8655],{},[955,8632,8633,8636],{},[970,8634,8635],{},"文档处理",[970,8637,8638],{},"PDF 阅读、Word 生成、Excel 分析",[955,8640,8641,8644],{},[970,8642,8643],{},"开发辅助",[970,8645,8646],{},"代码审查、API 测试、数据库操作",[955,8648,8649,8652],{},[970,8650,8651],{},"内容创作",[970,8653,8654],{},"写作助手、图片生成、PPT 制作",[955,8656,8657,8660],{},[970,8658,8659],{},"数据分析",[970,8661,8662],{},"数据清洗、可视化、报表生成",[18,8664,8665],{"id":8665},"动手安装",[496,8667,8669],{"id":8668},"第一步找到-skill","第一步：找到 Skill",[14,8671,8672],{},"打开你的 AI Agent，输入：",[436,8674,8677],{"className":8675,"code":8676,"language":441},[439],"帮我找一个可以处理 PDF 的 Skill\n",[79,8678,8676],{"__ignoreMap":316},[14,8680,8681],{},"Agent 会搜索可用的 Skill 列表，推荐匹配的选项。",[496,8683,8685],{"id":8684},"第二步安装-skill","第二步：安装 Skill",[14,8687,8688],{},"选择一个 Skill 后，Agent 会自动加载它。你会看到类似这样的提示：",[436,8690,8693],{"className":8691,"code":8692,"language":441},[439],"✅ PDF Skill 已加载\n现在你可以让我帮你：\n- 阅读 PDF 文件\n- 提取表格数据\n- 合并\u002F拆分 PDF\n",[79,8694,8692],{"__ignoreMap":316},[496,8696,8698],{"id":8697},"第三步使用-skill","第三步：使用 Skill",[14,8700,8701],{},"安装完成后，直接用自然语言描述需求即可：",[436,8703,8706],{"className":8704,"code":8705,"language":441},[439],"请帮我读取 report.pdf，把里面的表格提取出来\n",[79,8707,8705],{"__ignoreMap":316},[18,8709,8710],{"id":8710},"常见问题",[496,8712,8714],{"id":8713},"q-skill-安装在哪里","Q: Skill 安装在哪里？",[14,8716,8717],{},"Skill 不需要「安装」在你的电脑上，它更像是一段指令，告诉 Agent 在特定场景下应该怎么做。",[496,8719,8721],{"id":8720},"q-一次可以用多个-skill-吗","Q: 一次可以用多个 Skill 吗？",[14,8723,8724],{},"可以！Agent 会根据你的需求自动选择合适的 Skill 组合。",[496,8726,8728],{"id":8727},"q-skill-会过期吗","Q: Skill 会过期吗？",[14,8730,8731],{},"不会，但 Skill 可能会有版本更新，新版本通常会修复问题并增加功能。",[18,8733,5348],{"id":5348},[14,8735,8736],{},"学会了安装 Skill，下一篇我们来看看如何组合使用多个 Skill，完成更复杂的任务。",{"title":316,"searchDepth":317,"depth":317,"links":8738},[8739,8740,8741,8746,8751],{"id":8595,"depth":320,"text":8595},{"id":8609,"depth":320,"text":8610},{"id":8665,"depth":320,"text":8665,"children":8742},[8743,8744,8745],{"id":8668,"depth":317,"text":8669},{"id":8684,"depth":317,"text":8685},{"id":8697,"depth":317,"text":8698},{"id":8710,"depth":320,"text":8710,"children":8747},[8748,8749,8750],{"id":8713,"depth":317,"text":8714},{"id":8720,"depth":317,"text":8721},{"id":8727,"depth":317,"text":8728},{"id":5348,"depth":320,"text":5348},"手把手教你在 AI Agent 中安装 Skill，5 分钟让你的 AI 助手获得新技能。",{},"\u002Ftutorials\u002Fai-agent-skill\u002Finstall-first-skill",{"title":8590,"description":8752},"tutorials\u002Fai-agent-skill\u002Finstall-first-skill",[361],"yLyo-reHXTdwpp_RH7TUOVoQGIk487Uak3-JVeUigEI",{"id":8760,"title":8761,"body":8762,"cover":363,"date":8372,"description":8892,"draft":329,"extension":330,"faq":363,"meta":8893,"navigation":345,"path":8894,"publish":329,"readingTime":541,"seo":8895,"seoKeywords":363,"series":8377,"stem":8896,"summary":363,"tags":8897,"updated":363,"__hash__":8898},"tutorials\u002Ftutorials\u002Fai-agent-skill\u002Fintro.md","什么是 AI Agent Skill",{"type":8,"value":8763,"toc":8885},[8764,8768,8771,8777,8788,8791,8794,8824,8828,8831,8851,8854,8857,8877,8880,8882],[18,8765,8767],{"id":8766},"ai-agent-和-skill-的关系","AI Agent 和 Skill 的关系",[14,8769,8770],{},"AI Agent 是一个能够自主完成任务的智能体。你可以把它想象成一个非常聪明但缺乏具体技能的实习生 —— 它有很强的理解和推理能力，但在特定领域需要「技能包」来高效工作。",[14,8772,8773,8776],{},[49,8774,8775],{},"Skill"," 就是 Agent 的技能包。它定义了 Agent 在特定领域的：",[181,8778,8779,8782,8785],{},[184,8780,8781],{},"专业知识（比如如何处理 Excel 文件）",[184,8783,8784],{},"工作流程（比如分析数据的 SOP）",[184,8786,8787],{},"可调用的工具（比如 Python 脚本、API 接口）",[18,8789,8790],{"id":8790},"一个形象的比喻",[14,8792,8793],{},"想象你在训练一个新员工：",[949,8795,8796,8806],{},[952,8797,8798],{},[955,8799,8800,8803],{},[958,8801,8802],{},"没有 Skill 的 Agent",[958,8804,8805],{},"有 Skill 的 Agent",[965,8807,8808,8816],{},[955,8809,8810,8813],{},[970,8811,8812],{},"\"帮我分析这个数据\" → 写了一段有 bug 的代码",[970,8814,8815],{},"\"帮我分析这个数据\" → 调用数据分析 Skill，输出标准报告",[955,8817,8818,8821],{},[970,8819,8820],{},"\"帮我生成 PPT\" → 给了一堆文字建议",[970,8822,8823],{},"\"帮我生成 PPT\" → 调用 PPTX Skill，直接生成文件",[18,8825,8827],{"id":8826},"为什么要学-skill","为什么要学 Skill",[14,8829,8830],{},"在 AI 时代，会使用和制作 Skill 的人，就像工业时代会操作机器的人一样，拥有了核心竞争力。",[1193,8832,8833,8839,8845],{},[184,8834,8835,8838],{},[49,8836,8837],{},"使用 Skill","：让 AI 能帮你完成更复杂的任务",[184,8840,8841,8844],{},[49,8842,8843],{},"制作 Skill","：把你的专业知识封装成可复用的能力",[184,8846,8847,8850],{},[49,8848,8849],{},"分享 Skill","：帮助更多人提升效率，建立影响力",[18,8852,8853],{"id":8853},"这个系列会教什么",[14,8855,8856],{},"本系列分为三个章节：",[1193,8858,8859,8865,8871],{},[184,8860,8861,8864],{},[49,8862,8863],{},"入门篇"," — 理解 Skill，学会安装和使用现成的 Skill",[184,8866,8867,8870],{},[49,8868,8869],{},"进阶篇"," — 自己动手制作 Skill，掌握提示词工程",[184,8872,8873,8876],{},[49,8874,8875],{},"实战篇"," — 在真实项目中综合运用多个 Skill",[14,8878,8879],{},"每一章都有 3 篇文章，从概念到实操，循序渐进。",[18,8881,5348],{"id":5348},[14,8883,8884],{},"在下一篇中，我们会动手安装你的第一个 Skill，体验「让 AI 瞬间变专家」的感觉。",{"title":316,"searchDepth":317,"depth":317,"links":8886},[8887,8888,8889,8890,8891],{"id":8766,"depth":320,"text":8767},{"id":8790,"depth":320,"text":8790},{"id":8826,"depth":320,"text":8827},{"id":8853,"depth":320,"text":8853},{"id":5348,"depth":320,"text":5348},"了解 AI Agent 中 Skill 的概念，以及为什么学会使用和制作 Skill 是 AI 时代的核心能力。",{},"\u002Ftutorials\u002Fai-agent-skill\u002Fintro",{"title":8761,"description":8892},"tutorials\u002Fai-agent-skill\u002Fintro",[361],"bOUydlzt6ugoWVl3RtyETCr93AaZG02LGul1bw4O_XU",{"id":8900,"title":8901,"body":8902,"cover":363,"date":5950,"description":9312,"draft":329,"extension":330,"faq":363,"meta":9313,"navigation":345,"path":9314,"publish":329,"readingTime":9013,"seo":9315,"seoKeywords":363,"series":8377,"stem":9316,"summary":363,"tags":9317,"updated":363,"__hash__":9318},"tutorials\u002Ftutorials\u002Fai-agent-skill\u002Fmake-first-skill.md","动手制作你的第一个 Skill",{"type":8,"value":8903,"toc":9299},[8904,8907,8910,8918,8921,8925,8928,8947,8953,9092,9096,9099,9218,9222,9225,9231,9234,9238,9241,9267,9270,9274,9277,9281,9284,9288,9291,9293,9296],[18,8905,8906],{"id":8906},"我们要做什么",[14,8908,8909],{},"今天我们来制作一个「周报生成器」Skill：",[181,8911,8912,8915],{},[184,8913,8914],{},"输入：本周做的事情（自然语言描述）",[184,8916,8917],{},"输出：格式化的周报（Markdown 格式）",[14,8919,8920],{},"这个 Skill 虽然简单，但涵盖了制作 Skill 的核心流程。",[18,8922,8924],{"id":8923},"第一步创建-skill-文件","第一步：创建 Skill 文件",[14,8926,8927],{},"在你的工作目录下创建一个文件夹：",[436,8929,8931],{"className":501,"code":8930,"language":503,"meta":316,"style":316},"mkdir weekly-report-skill\ncd weekly-report-skill\n",[79,8932,8933,8941],{"__ignoreMap":316},[507,8934,8935,8938],{"class":509,"line":510},[507,8936,8937],{"class":519},"mkdir",[507,8939,8940],{"class":523}," weekly-report-skill\n",[507,8942,8943,8945],{"class":509,"line":320},[507,8944,780],{"class":579},[507,8946,8940],{"class":523},[14,8948,8949,8950,7008],{},"创建主文件 ",[79,8951,8952],{},"skill.md",[436,8954,8958],{"className":8955,"code":8956,"language":8957,"meta":316,"style":316},"language-markdown shiki shiki-themes github-light-default github-dark-default","# 周报生成器\n\n## 功能描述\n根据用户描述的本周工作内容，生成结构化的周报。\n\n## 触发场景\n当用户提到「写周报」「生成周报」「本周总结」时使用此 Skill。\n\n## 周报模板\n\n### 本周工作\n- 按项目分组\n- 每个项目列出完成的具体任务\n- 标注任务状态（已完成\u002F进行中\u002F已延期）\n\n### 关键成果\n- 提炼 2-3 个最重要的成果\n- 用数据量化（如果可能）\n\n### 下周计划\n- 根据本周进展，推断下周重点\n- 列出 3-5 个计划项\n\n### 需要支持\n- 如果有阻塞项，列出需要的支持\n","markdown",[79,8959,8960,8965,8969,8974,8979,8983,8988,8993,8997,9002,9006,9011,9017,9023,9029,9034,9040,9046,9052,9057,9063,9069,9075,9080,9086],{"__ignoreMap":316},[507,8961,8962],{"class":509,"line":510},[507,8963,8964],{},"# 周报生成器\n",[507,8966,8967],{"class":509,"line":320},[507,8968,532],{"emptyLinePlaceholder":345},[507,8970,8971],{"class":509,"line":317},[507,8972,8973],{},"## 功能描述\n",[507,8975,8976],{"class":509,"line":535},[507,8977,8978],{},"根据用户描述的本周工作内容，生成结构化的周报。\n",[507,8980,8981],{"class":509,"line":541},[507,8982,532],{"emptyLinePlaceholder":345},[507,8984,8985],{"class":509,"line":557},[507,8986,8987],{},"## 触发场景\n",[507,8989,8990],{"class":509,"line":562},[507,8991,8992],{},"当用户提到「写周报」「生成周报」「本周总结」时使用此 Skill。\n",[507,8994,8995],{"class":509,"line":347},[507,8996,532],{"emptyLinePlaceholder":345},[507,8998,8999],{"class":509,"line":586},[507,9000,9001],{},"## 周报模板\n",[507,9003,9004],{"class":509,"line":591},[507,9005,532],{"emptyLinePlaceholder":345},[507,9007,9008],{"class":509,"line":597},[507,9009,9010],{},"### 本周工作\n",[507,9012,9014],{"class":509,"line":9013},12,[507,9015,9016],{},"- 按项目分组\n",[507,9018,9020],{"class":509,"line":9019},13,[507,9021,9022],{},"- 每个项目列出完成的具体任务\n",[507,9024,9026],{"class":509,"line":9025},14,[507,9027,9028],{},"- 标注任务状态（已完成\u002F进行中\u002F已延期）\n",[507,9030,9032],{"class":509,"line":9031},15,[507,9033,532],{"emptyLinePlaceholder":345},[507,9035,9037],{"class":509,"line":9036},16,[507,9038,9039],{},"### 关键成果\n",[507,9041,9043],{"class":509,"line":9042},17,[507,9044,9045],{},"- 提炼 2-3 个最重要的成果\n",[507,9047,9049],{"class":509,"line":9048},18,[507,9050,9051],{},"- 用数据量化（如果可能）\n",[507,9053,9055],{"class":509,"line":9054},19,[507,9056,532],{"emptyLinePlaceholder":345},[507,9058,9060],{"class":509,"line":9059},20,[507,9061,9062],{},"### 下周计划\n",[507,9064,9066],{"class":509,"line":9065},21,[507,9067,9068],{},"- 根据本周进展，推断下周重点\n",[507,9070,9072],{"class":509,"line":9071},22,[507,9073,9074],{},"- 列出 3-5 个计划项\n",[507,9076,9078],{"class":509,"line":9077},23,[507,9079,532],{"emptyLinePlaceholder":345},[507,9081,9083],{"class":509,"line":9082},24,[507,9084,9085],{},"### 需要支持\n",[507,9087,9089],{"class":509,"line":9088},25,[507,9090,9091],{},"- 如果有阻塞项，列出需要的支持\n",[18,9093,9095],{"id":9094},"第二步添加示例","第二步：添加示例",[14,9097,9098],{},"好的 Skill 需要示例来帮助 Agent 理解你想要的输出风格：",[436,9100,9102],{"className":8955,"code":9101,"language":8957,"meta":316,"style":316},"## 示例\n\n### 输入\n\"这周主要在做用户系统的重构，完成了登录模块的改造，\n注册模块还在做。另外修了 3 个线上 bug。\"\n\n### 输出\n**本周工作**\n\n**用户系统重构**\n- ✅ 登录模块改造 — 已完成\n- 🔄 注册模块改造 — 进行中\n\n**线上维护**\n- ✅ 修复 3 个线上 bug\n\n**关键成果**\n- 登录模块重构完成，代码量减少约 30%\n- 线上 bug 清零\n\n**下周计划**\n- 完成注册模块改造\n- 用户系统重构联调测试\n- 编写用户系统技术文档\n",[79,9103,9104,9109,9113,9118,9123,9128,9132,9137,9142,9146,9151,9156,9161,9165,9170,9175,9179,9184,9189,9194,9198,9203,9208,9213],{"__ignoreMap":316},[507,9105,9106],{"class":509,"line":510},[507,9107,9108],{},"## 示例\n",[507,9110,9111],{"class":509,"line":320},[507,9112,532],{"emptyLinePlaceholder":345},[507,9114,9115],{"class":509,"line":317},[507,9116,9117],{},"### 输入\n",[507,9119,9120],{"class":509,"line":535},[507,9121,9122],{},"\"这周主要在做用户系统的重构，完成了登录模块的改造，\n",[507,9124,9125],{"class":509,"line":541},[507,9126,9127],{},"注册模块还在做。另外修了 3 个线上 bug。\"\n",[507,9129,9130],{"class":509,"line":557},[507,9131,532],{"emptyLinePlaceholder":345},[507,9133,9134],{"class":509,"line":562},[507,9135,9136],{},"### 输出\n",[507,9138,9139],{"class":509,"line":347},[507,9140,9141],{},"**本周工作**\n",[507,9143,9144],{"class":509,"line":586},[507,9145,532],{"emptyLinePlaceholder":345},[507,9147,9148],{"class":509,"line":591},[507,9149,9150],{},"**用户系统重构**\n",[507,9152,9153],{"class":509,"line":597},[507,9154,9155],{},"- ✅ 登录模块改造 — 已完成\n",[507,9157,9158],{"class":509,"line":9013},[507,9159,9160],{},"- 🔄 注册模块改造 — 进行中\n",[507,9162,9163],{"class":509,"line":9019},[507,9164,532],{"emptyLinePlaceholder":345},[507,9166,9167],{"class":509,"line":9025},[507,9168,9169],{},"**线上维护**\n",[507,9171,9172],{"class":509,"line":9031},[507,9173,9174],{},"- ✅ 修复 3 个线上 bug\n",[507,9176,9177],{"class":509,"line":9036},[507,9178,532],{"emptyLinePlaceholder":345},[507,9180,9181],{"class":509,"line":9042},[507,9182,9183],{},"**关键成果**\n",[507,9185,9186],{"class":509,"line":9048},[507,9187,9188],{},"- 登录模块重构完成，代码量减少约 30%\n",[507,9190,9191],{"class":509,"line":9054},[507,9192,9193],{},"- 线上 bug 清零\n",[507,9195,9196],{"class":509,"line":9059},[507,9197,532],{"emptyLinePlaceholder":345},[507,9199,9200],{"class":509,"line":9065},[507,9201,9202],{},"**下周计划**\n",[507,9204,9205],{"class":509,"line":9071},[507,9206,9207],{},"- 完成注册模块改造\n",[507,9209,9210],{"class":509,"line":9077},[507,9211,9212],{},"- 用户系统重构联调测试\n",[507,9214,9215],{"class":509,"line":9082},[507,9216,9217],{},"- 编写用户系统技术文档\n",[18,9219,9221],{"id":9220},"第三步测试-skill","第三步：测试 Skill",[14,9223,9224],{},"把 Skill 加载到你的 Agent 中，然后试试：",[436,9226,9229],{"className":9227,"code":9228,"language":441},[439],"我这周做了：\n1. 完成了首页的 redesign\n2. 和设计师对了移动端适配方案\n3. 帮后端同事排查了一个数据库慢查询\n4. 参加了两次技术分享会\n",[79,9230,9228],{"__ignoreMap":316},[14,9232,9233],{},"观察输出是否符合预期。如果不满意，回去调整模板和示例。",[18,9235,9237],{"id":9236},"第四步迭代优化","第四步：迭代优化",[14,9239,9240],{},"制作 Skill 是一个迭代的过程：",[1193,9242,9243,9249,9255,9261],{},[184,9244,9245,9248],{},[49,9246,9247],{},"写初版"," → 测试 → 发现问题",[184,9250,9251,9254],{},[49,9252,9253],{},"加示例"," → 测试 → 输出更稳定",[184,9256,9257,9260],{},[49,9258,9259],{},"加约束"," → 测试 → 风格更统一",[184,9262,9263,9266],{},[49,9264,9265],{},"加边界处理"," → 测试 → 更健壮",[18,9268,9269],{"id":9269},"常见陷阱",[496,9271,9273],{"id":9272},"_1-描述太笼统","1. 描述太笼统",[14,9275,9276],{},"❌ \"帮用户写周报\"\n✅ \"根据用户描述的工作内容，按项目分组生成结构化周报\"",[496,9278,9280],{"id":9279},"_2-没有示例","2. 没有示例",[14,9282,9283],{},"没有示例的 Skill 就像没有说明书的产品，Agent 只能猜你想要什么。",[496,9285,9287],{"id":9286},"_3-约束太死","3. 约束太死",[14,9289,9290],{},"不要规定每一个细节，给 Agent 留一些灵活空间。",[18,9292,5348],{"id":5348},[14,9294,9295],{},"恭喜你制作了第一个 Skill！下一篇我们来学习提示词工程的技巧，让你的 Skill 更强大。",[1034,9297,9298],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}",{"title":316,"searchDepth":317,"depth":317,"links":9300},[9301,9302,9303,9304,9305,9306,9311],{"id":8906,"depth":320,"text":8906},{"id":8923,"depth":320,"text":8924},{"id":9094,"depth":320,"text":9095},{"id":9220,"depth":320,"text":9221},{"id":9236,"depth":320,"text":9237},{"id":9269,"depth":320,"text":9269,"children":9307},[9308,9309,9310],{"id":9272,"depth":317,"text":9273},{"id":9279,"depth":317,"text":9280},{"id":9286,"depth":317,"text":9287},{"id":5348,"depth":320,"text":5348},"从零开始制作一个实用的 Skill，掌握 Skill 开发的完整流程。",{},"\u002Ftutorials\u002Fai-agent-skill\u002Fmake-first-skill",{"title":8901,"description":9312},"tutorials\u002Fai-agent-skill\u002Fmake-first-skill",[361],"1vd9OF_cmXbS-6MdnXdJAn8xG9GmB58Q09mpXGfj-M4",{"id":9320,"title":9321,"body":9322,"cover":363,"date":5950,"description":9654,"draft":329,"extension":330,"faq":363,"meta":9655,"navigation":345,"path":9656,"publish":329,"readingTime":591,"seo":9657,"seoKeywords":363,"series":8377,"stem":9658,"summary":363,"tags":9659,"updated":363,"__hash__":9660},"tutorials\u002Ftutorials\u002Fai-agent-skill\u002Fprompt-engineering.md","Skill 中的提示词工程",{"type":8,"value":9323,"toc":9639},[9324,9328,9331,9334,9338,9341,9356,9359,9363,9366,9405,9409,9412,9447,9450,9454,9457,9482,9486,9489,9495,9499,9502,9505,9514,9517,9615,9618,9620,9623,9634,9637],[18,9325,9327],{"id":9326},"提示词工程-skill-的灵魂","提示词工程 = Skill 的灵魂",[14,9329,9330],{},"一个 Skill 的好坏，80% 取决于提示词的质量。同样的功能，好的提示词和差的提示词，产出的差距可能是天壤之别。",[18,9332,9333],{"id":9333},"五个核心原则",[496,9335,9337],{"id":9336},"原则一角色设定","原则一：角色设定",[14,9339,9340],{},"告诉 Agent 它现在是谁：",[436,9342,9344],{"className":8955,"code":9343,"language":8957,"meta":316,"style":316},"你是一位资深的技术写作专家，擅长把复杂的技术概念\n用简单易懂的语言解释给非技术人员。\n",[79,9345,9346,9351],{"__ignoreMap":316},[507,9347,9348],{"class":509,"line":510},[507,9349,9350],{},"你是一位资深的技术写作专家，擅长把复杂的技术概念\n",[507,9352,9353],{"class":509,"line":320},[507,9354,9355],{},"用简单易懂的语言解释给非技术人员。\n",[14,9357,9358],{},"角色设定会影响 Agent 的语气、用词和思维方式。",[496,9360,9362],{"id":9361},"原则二明确输入输出","原则二：明确输入输出",[14,9364,9365],{},"清晰定义「给什么」和「要什么」：",[436,9367,9369],{"className":8955,"code":9368,"language":8957,"meta":316,"style":316},"## 输入\n- 用户提供的原始技术文档（可能是 Markdown 或纯文本）\n\n## 输出\n- 一篇面向产品经理的技术说明\n- 不超过 500 字\n- 包含「一句话总结」「核心变化」「影响范围」三个板块\n",[79,9370,9371,9376,9381,9385,9390,9395,9400],{"__ignoreMap":316},[507,9372,9373],{"class":509,"line":510},[507,9374,9375],{},"## 输入\n",[507,9377,9378],{"class":509,"line":320},[507,9379,9380],{},"- 用户提供的原始技术文档（可能是 Markdown 或纯文本）\n",[507,9382,9383],{"class":509,"line":317},[507,9384,532],{"emptyLinePlaceholder":345},[507,9386,9387],{"class":509,"line":535},[507,9388,9389],{},"## 输出\n",[507,9391,9392],{"class":509,"line":541},[507,9393,9394],{},"- 一篇面向产品经理的技术说明\n",[507,9396,9397],{"class":509,"line":557},[507,9398,9399],{},"- 不超过 500 字\n",[507,9401,9402],{"class":509,"line":562},[507,9403,9404],{},"- 包含「一句话总结」「核心变化」「影响范围」三个板块\n",[496,9406,9408],{"id":9407},"原则三提供示例","原则三：提供示例",[14,9410,9411],{},"Few-shot learning 是最有效的提示词技巧：",[436,9413,9415],{"className":8955,"code":9414,"language":8957,"meta":316,"style":316},"## 示例 1\n输入：我们将数据库从 MySQL 迁移到 PostgreSQL...\n输出：\n**一句话总结**：数据库升级，查询速度提升 3 倍。\n**核心变化**：...\n**影响范围**：...\n",[79,9416,9417,9422,9427,9432,9437,9442],{"__ignoreMap":316},[507,9418,9419],{"class":509,"line":510},[507,9420,9421],{},"## 示例 1\n",[507,9423,9424],{"class":509,"line":320},[507,9425,9426],{},"输入：我们将数据库从 MySQL 迁移到 PostgreSQL...\n",[507,9428,9429],{"class":509,"line":317},[507,9430,9431],{},"输出：\n",[507,9433,9434],{"class":509,"line":535},[507,9435,9436],{},"**一句话总结**：数据库升级，查询速度提升 3 倍。\n",[507,9438,9439],{"class":509,"line":541},[507,9440,9441],{},"**核心变化**：...\n",[507,9443,9444],{"class":509,"line":557},[507,9445,9446],{},"**影响范围**：...\n",[14,9448,9449],{},"2-3 个示例通常就够了。",[496,9451,9453],{"id":9452},"原则四设定边界","原则四：设定边界",[14,9455,9456],{},"告诉 Agent 什么不该做：",[436,9458,9460],{"className":8955,"code":9459,"language":8957,"meta":316,"style":316},"## 注意事项\n- 不要使用技术术语，除非无法避免\n- 不要编造不存在的数据\n- 如果信息不足，明确告知用户而不是猜测\n",[79,9461,9462,9467,9472,9477],{"__ignoreMap":316},[507,9463,9464],{"class":509,"line":510},[507,9465,9466],{},"## 注意事项\n",[507,9468,9469],{"class":509,"line":320},[507,9470,9471],{},"- 不要使用技术术语，除非无法避免\n",[507,9473,9474],{"class":509,"line":317},[507,9475,9476],{},"- 不要编造不存在的数据\n",[507,9478,9479],{"class":509,"line":535},[507,9480,9481],{},"- 如果信息不足，明确告知用户而不是猜测\n",[496,9483,9485],{"id":9484},"原则五迭代优化","原则五：迭代优化",[14,9487,9488],{},"没有一次就完美的提示词。记录每次测试的问题，逐步修改：",[436,9490,9493],{"className":9491,"code":9492,"language":441},[439],"版本 1: 输出太长 → 加字数限制\n版本 2: 格式不统一 → 加模板\n版本 3: 有时遗漏关键信息 → 加检查清单\n",[79,9494,9492],{"__ignoreMap":316},[18,9496,9498],{"id":9497},"实战优化周报-skill","实战：优化周报 Skill",[14,9500,9501],{},"让我们用这五个原则来优化上一篇做的周报 Skill：",[496,9503,9504],{"id":9504},"优化前",[436,9506,9508],{"className":8955,"code":9507,"language":8957,"meta":316,"style":316},"帮用户写周报\n",[79,9509,9510],{"__ignoreMap":316},[507,9511,9512],{"class":509,"line":510},[507,9513,9507],{},[496,9515,9516],{"id":9516},"优化后",[436,9518,9520],{"className":8955,"code":9519,"language":8957,"meta":316,"style":316},"## 角色\n你是一位高效的工作助理，擅长从零散的描述中提炼关键信息。\n\n## 任务\n根据用户描述的本周工作，生成结构化周报。\n\n## 输出格式\n使用以下模板，每个板块必须包含：\n\n### 本周完成\n- 按项目分组\n- 每条标注状态 emoji（✅ 已完成 \u002F 🔄 进行中 \u002F ⏸️ 暂停）\n\n### 下周计划\n- 3-5 条，按优先级排序\n\n## 约束\n- 总字数不超过 300 字\n- 只使用用户提到的信息，不编造\n- 如果用户信息不足，提问而不是猜测\n",[79,9521,9522,9527,9532,9536,9541,9546,9550,9555,9560,9564,9569,9573,9578,9582,9586,9591,9595,9600,9605,9610],{"__ignoreMap":316},[507,9523,9524],{"class":509,"line":510},[507,9525,9526],{},"## 角色\n",[507,9528,9529],{"class":509,"line":320},[507,9530,9531],{},"你是一位高效的工作助理，擅长从零散的描述中提炼关键信息。\n",[507,9533,9534],{"class":509,"line":317},[507,9535,532],{"emptyLinePlaceholder":345},[507,9537,9538],{"class":509,"line":535},[507,9539,9540],{},"## 任务\n",[507,9542,9543],{"class":509,"line":541},[507,9544,9545],{},"根据用户描述的本周工作，生成结构化周报。\n",[507,9547,9548],{"class":509,"line":557},[507,9549,532],{"emptyLinePlaceholder":345},[507,9551,9552],{"class":509,"line":562},[507,9553,9554],{},"## 输出格式\n",[507,9556,9557],{"class":509,"line":347},[507,9558,9559],{},"使用以下模板，每个板块必须包含：\n",[507,9561,9562],{"class":509,"line":586},[507,9563,532],{"emptyLinePlaceholder":345},[507,9565,9566],{"class":509,"line":591},[507,9567,9568],{},"### 本周完成\n",[507,9570,9571],{"class":509,"line":597},[507,9572,9016],{},[507,9574,9575],{"class":509,"line":9013},[507,9576,9577],{},"- 每条标注状态 emoji（✅ 已完成 \u002F 🔄 进行中 \u002F ⏸️ 暂停）\n",[507,9579,9580],{"class":509,"line":9019},[507,9581,532],{"emptyLinePlaceholder":345},[507,9583,9584],{"class":509,"line":9025},[507,9585,9062],{},[507,9587,9588],{"class":509,"line":9031},[507,9589,9590],{},"- 3-5 条，按优先级排序\n",[507,9592,9593],{"class":509,"line":9036},[507,9594,532],{"emptyLinePlaceholder":345},[507,9596,9597],{"class":509,"line":9042},[507,9598,9599],{},"## 约束\n",[507,9601,9602],{"class":509,"line":9048},[507,9603,9604],{},"- 总字数不超过 300 字\n",[507,9606,9607],{"class":509,"line":9054},[507,9608,9609],{},"- 只使用用户提到的信息，不编造\n",[507,9611,9612],{"class":509,"line":9059},[507,9613,9614],{},"- 如果用户信息不足，提问而不是猜测\n",[14,9616,9617],{},"效果的差别一目了然。",[18,9619,8340],{"id":8340},[14,9621,9622],{},"第二章我们学到了：",[181,9624,9625,9628,9631],{},[184,9626,9627],{},"Skill 由元信息、知识、工具三部分组成",[184,9629,9630],{},"从模板开始，通过迭代完善 Skill",[184,9632,9633],{},"提示词工程的五个核心原则",[14,9635,9636],{},"下一章我们进入实战，看看如何在真实项目中综合运用这些知识。",[1034,9638,3257],{},{"title":316,"searchDepth":317,"depth":317,"links":9640},[9641,9642,9649,9653],{"id":9326,"depth":320,"text":9327},{"id":9333,"depth":320,"text":9333,"children":9643},[9644,9645,9646,9647,9648],{"id":9336,"depth":317,"text":9337},{"id":9361,"depth":317,"text":9362},{"id":9407,"depth":317,"text":9408},{"id":9452,"depth":317,"text":9453},{"id":9484,"depth":317,"text":9485},{"id":9497,"depth":320,"text":9498,"children":9650},[9651,9652],{"id":9504,"depth":317,"text":9504},{"id":9516,"depth":317,"text":9516},{"id":8340,"depth":320,"text":8340},"掌握提示词工程的核心技巧，让你的 Skill 输出更稳定、更精准、更符合预期。",{},"\u002Ftutorials\u002Fai-agent-skill\u002Fprompt-engineering",{"title":9321,"description":9654},"tutorials\u002Fai-agent-skill\u002Fprompt-engineering",[361,1268],"yUVDZNwkOw_Rc3MfjaeE9YCPphVt6TArxszynhY9pYo",{"id":9662,"title":9663,"body":9664,"cover":363,"date":5807,"description":9941,"draft":329,"extension":330,"faq":363,"meta":9942,"navigation":345,"path":9943,"publish":329,"readingTime":347,"seo":9944,"seoKeywords":363,"series":8377,"stem":9945,"summary":363,"tags":9946,"updated":363,"__hash__":9947},"tutorials\u002Ftutorials\u002Fai-agent-skill\u002Freal-project-setup.md","实战项目：搭建个人知识库助手",{"type":8,"value":9665,"toc":9929},[9666,9669,9672,9698,9701,9704,9745,9748,9754,9756,9760,9788,9792,9827,9831,9834,9906,9909,9912,9918,9921,9923,9926],[18,9667,9668],{"id":9668},"项目目标",[14,9670,9671],{},"我们要做一个「个人知识库助手」，它能够：",[1193,9673,9674,9680,9686,9692],{},[184,9675,9676,9679],{},[49,9677,9678],{},"收集"," — 把网页、文章、笔记存入知识库",[184,9681,9682,9685],{},[49,9683,9684],{},"整理"," — 自动打标签、归类、生成摘要",[184,9687,9688,9691],{},[49,9689,9690],{},"检索"," — 用自然语言搜索知识库",[184,9693,9694,9697],{},[49,9695,9696],{},"输出"," — 根据知识库内容回答问题或生成报告",[18,9699,9700],{"id":9700},"为什么选这个项目",[14,9702,9703],{},"这个项目完美覆盖了 Skill 的三个核心场景：",[949,9705,9706,9715],{},[952,9707,9708],{},[955,9709,9710,9712],{},[958,9711,960],{},[958,9713,9714],{},"涉及的 Skill",[965,9716,9717,9724,9731,9738],{},[955,9718,9719,9721],{},[970,9720,9678],{},[970,9722,9723],{},"网页抓取 Skill、PDF 读取 Skill",[955,9725,9726,9728],{},[970,9727,9684],{},[970,9729,9730],{},"文本分析 Skill、标签生成 Skill",[955,9732,9733,9735],{},[970,9734,9690],{},[970,9736,9737],{},"向量搜索 Skill",[955,9739,9740,9742],{},[970,9741,9696],{},[970,9743,9744],{},"文档生成 Skill",[18,9746,9747],{"id":9747},"架构设计",[436,9749,9752],{"className":9750,"code":9751,"language":441},[439],"用户输入 → Agent（调度中心）\n              ├── 收集 Skill → 获取内容\n              ├── 整理 Skill → 打标签、摘要\n              ├── 检索 Skill → 语义搜索\n              └── 输出 Skill → 生成回答\n                    ↓\n              知识库（本地文件\u002F数据库）\n",[79,9753,9751],{"__ignoreMap":316},[18,9755,8595],{"id":8595},[496,9757,9759],{"id":9758},"_1-创建项目目录","1. 创建项目目录",[436,9761,9763],{"className":501,"code":9762,"language":503,"meta":316,"style":316},"mkdir my-knowledge-base\ncd my-knowledge-base\nmkdir skills data\n",[79,9764,9765,9772,9778],{"__ignoreMap":316},[507,9766,9767,9769],{"class":509,"line":510},[507,9768,8937],{"class":519},[507,9770,9771],{"class":523}," my-knowledge-base\n",[507,9773,9774,9776],{"class":509,"line":320},[507,9775,780],{"class":579},[507,9777,9771],{"class":523},[507,9779,9780,9782,9785],{"class":509,"line":317},[507,9781,8937],{"class":519},[507,9783,9784],{"class":523}," skills",[507,9786,9787],{"class":523}," data\n",[496,9789,9791],{"id":9790},"_2-准备知识库目录","2. 准备知识库目录",[436,9793,9795],{"className":501,"code":9794,"language":503,"meta":316,"style":316},"mkdir data\u002Farticles    # 文章\nmkdir data\u002Fnotes       # 笔记\nmkdir data\u002Fbookmarks   # 书签\n",[79,9796,9797,9807,9817],{"__ignoreMap":316},[507,9798,9799,9801,9804],{"class":509,"line":510},[507,9800,8937],{"class":519},[507,9802,9803],{"class":523}," data\u002Farticles",[507,9805,9806],{"class":513},"    # 文章\n",[507,9808,9809,9811,9814],{"class":509,"line":320},[507,9810,8937],{"class":519},[507,9812,9813],{"class":523}," data\u002Fnotes",[507,9815,9816],{"class":513},"       # 笔记\n",[507,9818,9819,9821,9824],{"class":509,"line":317},[507,9820,8937],{"class":519},[507,9822,9823],{"class":523}," data\u002Fbookmarks",[507,9825,9826],{"class":513},"   # 书签\n",[496,9828,9830],{"id":9829},"_3-创建收集-skill","3. 创建收集 Skill",[14,9832,9833],{},"第一个 Skill 负责把内容存入知识库：",[436,9835,9837],{"className":8955,"code":9836,"language":8957,"meta":316,"style":316},"# 知识收集 Skill\n\n## 功能\n将用户提供的内容保存到知识库中。\n\n## 支持的输入\n- URL（自动抓取网页内容）\n- 文本（直接保存）\n- 文件路径（读取文件内容）\n\n## 保存规则\n- 文件名：{日期}-{标题}.md\n- 自动生成摘要（不超过 100 字）\n- 自动推荐 2-3 个标签\n",[79,9838,9839,9844,9848,9853,9858,9862,9867,9872,9877,9882,9886,9891,9896,9901],{"__ignoreMap":316},[507,9840,9841],{"class":509,"line":510},[507,9842,9843],{},"# 知识收集 Skill\n",[507,9845,9846],{"class":509,"line":320},[507,9847,532],{"emptyLinePlaceholder":345},[507,9849,9850],{"class":509,"line":317},[507,9851,9852],{},"## 功能\n",[507,9854,9855],{"class":509,"line":535},[507,9856,9857],{},"将用户提供的内容保存到知识库中。\n",[507,9859,9860],{"class":509,"line":541},[507,9861,532],{"emptyLinePlaceholder":345},[507,9863,9864],{"class":509,"line":557},[507,9865,9866],{},"## 支持的输入\n",[507,9868,9869],{"class":509,"line":562},[507,9870,9871],{},"- URL（自动抓取网页内容）\n",[507,9873,9874],{"class":509,"line":347},[507,9875,9876],{},"- 文本（直接保存）\n",[507,9878,9879],{"class":509,"line":586},[507,9880,9881],{},"- 文件路径（读取文件内容）\n",[507,9883,9884],{"class":509,"line":591},[507,9885,532],{"emptyLinePlaceholder":345},[507,9887,9888],{"class":509,"line":597},[507,9889,9890],{},"## 保存规则\n",[507,9892,9893],{"class":509,"line":9013},[507,9894,9895],{},"- 文件名：{日期}-{标题}.md\n",[507,9897,9898],{"class":509,"line":9019},[507,9899,9900],{},"- 自动生成摘要（不超过 100 字）\n",[507,9902,9903],{"class":509,"line":9025},[507,9904,9905],{},"- 自动推荐 2-3 个标签\n",[18,9907,9908],{"id":9908},"测试收集功能",[14,9910,9911],{},"试试把一篇文章存入知识库：",[436,9913,9916],{"className":9914,"code":9915,"language":441},[439],"帮我把这篇文章存入知识库：\nhttps:\u002F\u002Fexample.com\u002Farticle-about-ai\n",[79,9917,9915],{"__ignoreMap":316},[14,9919,9920],{},"Agent 会调用收集 Skill，自动完成抓取、摘要、打标签、保存。",[18,9922,5348],{"id":5348},[14,9924,9925],{},"基础架构搭好了，下一篇我们来实现最核心的检索功能。",[1034,9927,9928],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTDnQ, html code.shiki .sTDnQ{--shiki-default:#953800;--shiki-dark:#FFA657}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}html pre.shiki code .sHrmB, html code.shiki .sHrmB{--shiki-default:#0550AE;--shiki-dark:#79C0FF}html pre.shiki code .sU953, html code.shiki .sU953{--shiki-default:#6E7781;--shiki-dark:#8B949E}",{"title":316,"searchDepth":317,"depth":317,"links":9930},[9931,9932,9933,9934,9939,9940],{"id":9668,"depth":320,"text":9668},{"id":9700,"depth":320,"text":9700},{"id":9747,"depth":320,"text":9747},{"id":8595,"depth":320,"text":8595,"children":9935},[9936,9937,9938],{"id":9758,"depth":317,"text":9759},{"id":9790,"depth":317,"text":9791},{"id":9829,"depth":317,"text":9830},{"id":9908,"depth":320,"text":9908},{"id":5348,"depth":320,"text":5348},"用一个完整的实战项目串联前两章所学，搭建一个能管理和检索个人知识库的 AI 助手。",{},"\u002Ftutorials\u002Fai-agent-skill\u002Freal-project-setup",{"title":9663,"description":9941},"tutorials\u002Fai-agent-skill\u002Freal-project-setup",[361,1078],"-rV8-rBREWB7rbLykdChM3ohV7cahipWnIn9LC5_Cu4",{"id":9949,"title":9950,"body":9951,"cover":363,"date":5950,"description":10252,"draft":329,"extension":330,"faq":363,"meta":10253,"navigation":345,"path":10254,"publish":329,"readingTime":591,"seo":10255,"seoKeywords":363,"series":8377,"stem":10256,"summary":363,"tags":10257,"updated":363,"__hash__":10258},"tutorials\u002Ftutorials\u002Fai-agent-skill\u002Fskill-anatomy.md","Skill 的结构解析",{"type":8,"value":9952,"toc":10244},[9953,9957,9960,9980,10069,10073,10076,10079,10130,10135,10139,10142,10145,10156,10159,10163,10166,10169,10189,10224,10227,10230,10236,10238,10241],[18,9954,9956],{"id":9955},"一个-skill-长什么样","一个 Skill 长什么样",[14,9958,9959],{},"当你打开一个 Skill 的源文件，你会看到它主要由三部分组成：",[1193,9961,9962,9968,9974],{},[184,9963,9964,9967],{},[49,9965,9966],{},"元信息"," — 名字、描述、适用场景",[184,9969,9970,9973],{},[49,9971,9972],{},"知识"," — 领域专业知识和规则",[184,9975,9976,9979],{},[49,9977,9978],{},"工具"," — 可执行的脚本或 API",[436,9981,9985],{"className":9982,"code":9983,"language":9984,"meta":316,"style":316},"language-yaml shiki shiki-themes github-light-default github-dark-default","name: data-analyzer\ndescription: 分析 CSV\u002FExcel 数据，生成可视化报告\n\nknowledge:\n  - 数据清洗的最佳实践\n  - 常见图表类型的选择策略\n  - 统计指标的计算方法\n\ntools:\n  - analyze.py\n  - visualize.py\n","yaml",[79,9986,9987,10000,10010,10014,10022,10030,10037,10044,10048,10055,10062],{"__ignoreMap":316},[507,9988,9989,9993,9997],{"class":509,"line":510},[507,9990,9992],{"class":9991},"sjgCt","name",[507,9994,9996],{"class":9995},"s4rv2",": ",[507,9998,9999],{"class":523},"data-analyzer\n",[507,10001,10002,10005,10007],{"class":509,"line":320},[507,10003,10004],{"class":9991},"description",[507,10006,9996],{"class":9995},[507,10008,10009],{"class":523},"分析 CSV\u002FExcel 数据，生成可视化报告\n",[507,10011,10012],{"class":509,"line":317},[507,10013,532],{"emptyLinePlaceholder":345},[507,10015,10016,10019],{"class":509,"line":535},[507,10017,10018],{"class":9991},"knowledge",[507,10020,10021],{"class":9995},":\n",[507,10023,10024,10027],{"class":509,"line":541},[507,10025,10026],{"class":9995},"  - ",[507,10028,10029],{"class":523},"数据清洗的最佳实践\n",[507,10031,10032,10034],{"class":509,"line":557},[507,10033,10026],{"class":9995},[507,10035,10036],{"class":523},"常见图表类型的选择策略\n",[507,10038,10039,10041],{"class":509,"line":562},[507,10040,10026],{"class":9995},[507,10042,10043],{"class":523},"统计指标的计算方法\n",[507,10045,10046],{"class":509,"line":347},[507,10047,532],{"emptyLinePlaceholder":345},[507,10049,10050,10053],{"class":509,"line":586},[507,10051,10052],{"class":9991},"tools",[507,10054,10021],{"class":9995},[507,10056,10057,10059],{"class":509,"line":591},[507,10058,10026],{"class":9995},[507,10060,10061],{"class":523},"analyze.py\n",[507,10063,10064,10066],{"class":509,"line":597},[507,10065,10026],{"class":9995},[507,10067,10068],{"class":523},"visualize.py\n",[18,10070,10072],{"id":10071},"元信息告诉-agent-何时用你","元信息：告诉 Agent 何时用你",[14,10074,10075],{},"元信息是 Skill 的「自我介绍」，Agent 根据它决定是否调用这个 Skill。",[14,10077,10078],{},"关键字段：",[949,10080,10081,10093],{},[952,10082,10083],{},[955,10084,10085,10088,10091],{},[958,10086,10087],{},"字段",[958,10089,10090],{},"作用",[958,10092,8628],{},[965,10094,10095,10107,10117],{},[955,10096,10097,10099,10102],{},[970,10098,9992],{},[970,10100,10101],{},"唯一标识",[970,10103,10104],{},[79,10105,10106],{},"data-analyzer",[955,10108,10109,10111,10114],{},[970,10110,10004],{},[970,10112,10113],{},"功能描述",[970,10115,10116],{},"\"分析数据，生成报告\"",[955,10118,10119,10122,10125],{},[970,10120,10121],{},"triggers",[970,10123,10124],{},"触发关键词",[970,10126,10127],{},[507,10128,10129],{},"\"分析数据\", \"生成图表\"",[11,10131,10132],{},[14,10133,10134],{},"好的 description 是关键！写得太模糊，Agent 不知道什么时候用；写得太窄，又会错过该用的场景。",[18,10136,10138],{"id":10137},"知识注入领域专业能力","知识：注入领域专业能力",[14,10140,10141],{},"知识部分让 Agent 在特定领域变成「专家」。",[14,10143,10144],{},"比如一个数据分析 Skill 的知识可能包含：",[181,10146,10147,10150,10153],{},[184,10148,10149],{},"看到时间序列数据，优先考虑折线图",[184,10151,10152],{},"对比类数据用柱状图，占比类用饼图",[184,10154,10155],{},"数据量超过 1000 行时，先做抽样再可视化",[14,10157,10158],{},"这些知识以自然语言的形式写在 Skill 里，Agent 会在执行任务时参考。",[18,10160,10162],{"id":10161},"工具给-agent-一双手","工具：给 Agent 一双「手」",[14,10164,10165],{},"如果说知识是「大脑」，工具就是「手」。",[14,10167,10168],{},"工具可以是：",[181,10170,10171,10177,10183],{},[184,10172,10173,10176],{},[49,10174,10175],{},"Python 脚本"," — 处理文件、调用 API",[184,10178,10179,10182],{},[49,10180,10181],{},"Shell 命令"," — 系统操作、文件管理",[184,10184,10185,10188],{},[49,10186,10187],{},"HTTP 请求"," — 调用外部服务",[436,10190,10192],{"className":3036,"code":10191,"language":3038,"meta":316,"style":316},"# analyze.py - 数据分析工具\ndef analyze(file_path):\n    import pandas as pd\n    df = pd.read_csv(file_path)\n    summary = df.describe()\n    return summary.to_dict()\n",[79,10193,10194,10199,10204,10209,10214,10219],{"__ignoreMap":316},[507,10195,10196],{"class":509,"line":510},[507,10197,10198],{},"# analyze.py - 数据分析工具\n",[507,10200,10201],{"class":509,"line":320},[507,10202,10203],{},"def analyze(file_path):\n",[507,10205,10206],{"class":509,"line":317},[507,10207,10208],{},"    import pandas as pd\n",[507,10210,10211],{"class":509,"line":535},[507,10212,10213],{},"    df = pd.read_csv(file_path)\n",[507,10215,10216],{"class":509,"line":541},[507,10217,10218],{},"    summary = df.describe()\n",[507,10220,10221],{"class":509,"line":557},[507,10222,10223],{},"    return summary.to_dict()\n",[14,10225,10226],{},"Agent 会根据任务需要，自动选择和调用合适的工具。",[18,10228,10229],{"id":10229},"三者如何协作",[436,10231,10234],{"className":10232,"code":10233,"language":441},[439],"用户: \"帮我分析 sales.csv\"\n      ↓\nAgent 查看所有 Skill 的元信息\n      ↓ 匹配到 data-analyzer\n加载 Skill 的知识 → Agent 变成数据分析专家\n      ↓\n调用 analyze.py → 读取数据、计算指标\n调用 visualize.py → 生成图表\n      ↓\n输出分析报告\n",[79,10235,10233],{"__ignoreMap":316},[18,10237,5348],{"id":5348},[14,10239,10240],{},"了解了 Skill 的结构，下一篇我们就来动手制作第一个自己的 Skill。",[1034,10242,10243],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjgCt, html code.shiki .sjgCt{--shiki-default:#116329;--shiki-dark:#7EE787}html pre.shiki code .s4rv2, html code.shiki .s4rv2{--shiki-default:#1F2328;--shiki-dark:#E6EDF3}html pre.shiki code .sSVrQ, html code.shiki .sSVrQ{--shiki-default:#0A3069;--shiki-dark:#A5D6FF}",{"title":316,"searchDepth":317,"depth":317,"links":10245},[10246,10247,10248,10249,10250,10251],{"id":9955,"depth":320,"text":9956},{"id":10071,"depth":320,"text":10072},{"id":10137,"depth":320,"text":10138},{"id":10161,"depth":320,"text":10162},{"id":10229,"depth":320,"text":10229},{"id":5348,"depth":320,"text":5348},"拆解一个 Skill 的内部结构，理解每个组成部分的作用，为自己制作 Skill 打基础。",{},"\u002Ftutorials\u002Fai-agent-skill\u002Fskill-anatomy",{"title":9950,"description":10252},"tutorials\u002Fai-agent-skill\u002Fskill-anatomy",[361],"4sn1agCFiUeAAIN0pWZJQ2I7CnAOZM0gBGrJ1zqTrYc",{"id":10260,"title":10261,"body":10262,"cover":363,"date":5807,"description":10563,"draft":329,"extension":330,"faq":363,"meta":10564,"navigation":345,"path":10565,"publish":329,"readingTime":586,"seo":10566,"seoKeywords":363,"series":8377,"stem":10567,"summary":363,"tags":10568,"updated":363,"__hash__":10569},"tutorials\u002Ftutorials\u002Fai-agent-skill\u002Fsmart-search.md","实现智能检索",{"type":8,"value":10263,"toc":10549},[10264,10268,10271,10274,10302,10306,10309,10320,10324,10404,10407,10506,10509,10512,10518,10521,10524,10527,10533,10536,10542,10544,10547],[18,10265,10267],{"id":10266},"关键词搜索-vs-语义搜索","关键词搜索 vs 语义搜索",[14,10269,10270],{},"传统搜索靠「关键词匹配」，你搜「如何提高学习效率」，只能匹配包含这些字的内容。",[14,10272,10273],{},"语义搜索靠「理解含义」：",[949,10275,10276,10289],{},[952,10277,10278],{},[955,10279,10280,10283,10286],{},[958,10281,10282],{},"你的问题",[958,10284,10285],{},"关键词搜索能找到",[958,10287,10288],{},"语义搜索能找到",[965,10290,10291],{},[955,10292,10293,10296,10299],{},[970,10294,10295],{},"\"如何提高学习效率\"",[970,10297,10298],{},"包含\"学习效率\"的文章",[970,10300,10301],{},"包含\"学习效率\"的 + 讲\"番茄工作法\"的 + 讲\"间隔重复\"的",[18,10303,10305],{"id":10304},"制作检索-skill","制作检索 Skill",[496,10307,10308],{"id":10308},"核心思路",[1193,10310,10311,10314,10317],{},[184,10312,10313],{},"把知识库中每篇内容转成「向量」（一串数字）",[184,10315,10316],{},"用户提问时，把问题也转成向量",[184,10318,10319],{},"找出与问题向量最接近的内容",[496,10321,10323],{"id":10322},"skill-定义","Skill 定义",[436,10325,10327],{"className":8955,"code":10326,"language":8957,"meta":316,"style":316},"# 知识检索 Skill\n\n## 功能\n在个人知识库中进行语义搜索，找到与用户问题最相关的内容。\n\n## 工作流程\n1. 接收用户的自然语言问题\n2. 搜索知识库中语义最接近的 5 篇内容\n3. 返回相关内容的标题、摘要和相关度评分\n\n## 输出格式\n按相关度排序，每条结果包含：\n- 标题\n- 摘要（50 字以内）\n- 来源文件路径\n- 相关度（高\u002F中\u002F低）\n",[79,10328,10329,10334,10338,10342,10347,10351,10356,10361,10366,10371,10375,10379,10384,10389,10394,10399],{"__ignoreMap":316},[507,10330,10331],{"class":509,"line":510},[507,10332,10333],{},"# 知识检索 Skill\n",[507,10335,10336],{"class":509,"line":320},[507,10337,532],{"emptyLinePlaceholder":345},[507,10339,10340],{"class":509,"line":317},[507,10341,9852],{},[507,10343,10344],{"class":509,"line":535},[507,10345,10346],{},"在个人知识库中进行语义搜索，找到与用户问题最相关的内容。\n",[507,10348,10349],{"class":509,"line":541},[507,10350,532],{"emptyLinePlaceholder":345},[507,10352,10353],{"class":509,"line":557},[507,10354,10355],{},"## 工作流程\n",[507,10357,10358],{"class":509,"line":562},[507,10359,10360],{},"1. 接收用户的自然语言问题\n",[507,10362,10363],{"class":509,"line":347},[507,10364,10365],{},"2. 搜索知识库中语义最接近的 5 篇内容\n",[507,10367,10368],{"class":509,"line":586},[507,10369,10370],{},"3. 返回相关内容的标题、摘要和相关度评分\n",[507,10372,10373],{"class":509,"line":591},[507,10374,532],{"emptyLinePlaceholder":345},[507,10376,10377],{"class":509,"line":597},[507,10378,9554],{},[507,10380,10381],{"class":509,"line":9013},[507,10382,10383],{},"按相关度排序，每条结果包含：\n",[507,10385,10386],{"class":509,"line":9019},[507,10387,10388],{},"- 标题\n",[507,10390,10391],{"class":509,"line":9025},[507,10392,10393],{},"- 摘要（50 字以内）\n",[507,10395,10396],{"class":509,"line":9031},[507,10397,10398],{},"- 来源文件路径\n",[507,10400,10401],{"class":509,"line":9036},[507,10402,10403],{},"- 相关度（高\u002F中\u002F低）\n",[496,10405,10406],{"id":10406},"配合工具脚本",[436,10408,10410],{"className":3036,"code":10409,"language":3038,"meta":316,"style":316},"# search.py\nimport os\nimport json\n\ndef search_knowledge_base(query, data_dir=\"data\"):\n    \"\"\"搜索知识库\"\"\"\n    results = []\n    for root, dirs, files in os.walk(data_dir):\n        for file in files:\n            if file.endswith('.md'):\n                filepath = os.path.join(root, file)\n                with open(filepath, 'r') as f:\n                    content = f.read()\n                results.append({\n                    'title': file.replace('.md', ''),\n                    'path': filepath,\n                    'content': content[:200]\n                })\n    return results\n",[79,10411,10412,10417,10422,10427,10431,10436,10441,10446,10451,10456,10461,10466,10471,10476,10481,10486,10491,10496,10501],{"__ignoreMap":316},[507,10413,10414],{"class":509,"line":510},[507,10415,10416],{},"# search.py\n",[507,10418,10419],{"class":509,"line":320},[507,10420,10421],{},"import os\n",[507,10423,10424],{"class":509,"line":317},[507,10425,10426],{},"import json\n",[507,10428,10429],{"class":509,"line":535},[507,10430,532],{"emptyLinePlaceholder":345},[507,10432,10433],{"class":509,"line":541},[507,10434,10435],{},"def search_knowledge_base(query, data_dir=\"data\"):\n",[507,10437,10438],{"class":509,"line":557},[507,10439,10440],{},"    \"\"\"搜索知识库\"\"\"\n",[507,10442,10443],{"class":509,"line":562},[507,10444,10445],{},"    results = []\n",[507,10447,10448],{"class":509,"line":347},[507,10449,10450],{},"    for root, dirs, files in os.walk(data_dir):\n",[507,10452,10453],{"class":509,"line":586},[507,10454,10455],{},"        for file in files:\n",[507,10457,10458],{"class":509,"line":591},[507,10459,10460],{},"            if file.endswith('.md'):\n",[507,10462,10463],{"class":509,"line":597},[507,10464,10465],{},"                filepath = os.path.join(root, file)\n",[507,10467,10468],{"class":509,"line":9013},[507,10469,10470],{},"                with open(filepath, 'r') as f:\n",[507,10472,10473],{"class":509,"line":9019},[507,10474,10475],{},"                    content = f.read()\n",[507,10477,10478],{"class":509,"line":9025},[507,10479,10480],{},"                results.append({\n",[507,10482,10483],{"class":509,"line":9031},[507,10484,10485],{},"                    'title': file.replace('.md', ''),\n",[507,10487,10488],{"class":509,"line":9036},[507,10489,10490],{},"                    'path': filepath,\n",[507,10492,10493],{"class":509,"line":9042},[507,10494,10495],{},"                    'content': content[:200]\n",[507,10497,10498],{"class":509,"line":9048},[507,10499,10500],{},"                })\n",[507,10502,10503],{"class":509,"line":9054},[507,10504,10505],{},"    return results\n",[18,10507,10508],{"id":10508},"测试检索",[14,10510,10511],{},"存入几篇不同主题的内容后，试试搜索：",[436,10513,10516],{"className":10514,"code":10515,"language":441},[439],"在我的知识库里找找关于「提升记忆力」的内容\n",[79,10517,10515],{"__ignoreMap":316},[14,10519,10520],{},"Agent 不仅会找到直接提到「记忆力」的内容，还会找到讲「间隔重复」「睡眠与学习」等相关主题的笔记。",[18,10522,10523],{"id":10523},"优化搜索体验",[496,10525,10526],{"id":10526},"支持追问",[436,10528,10531],{"className":10529,"code":10530,"language":441},[439],"用户：找找关于 AI 的内容\nAgent：找到 15 篇相关内容，以下是最相关的 5 篇...\n用户：只看关于 AI 教育的\nAgent：缩小范围后找到 3 篇...\n",[79,10532,10530],{"__ignoreMap":316},[496,10534,10535],{"id":10535},"支持总结",[436,10537,10540],{"className":10538,"code":10539,"language":441},[439],"用户：总结一下我知识库里关于学习方法的所有内容\nAgent：[读取相关文章] → [生成综合总结]\n",[79,10541,10539],{"__ignoreMap":316},[18,10543,5348],{"id":5348},[14,10545,10546],{},"检索功能有了，最后一篇我们来把所有 Skill 串联起来，实现一个完整的工作流。",[1034,10548,3257],{},{"title":316,"searchDepth":317,"depth":317,"links":10550},[10551,10552,10557,10558,10562],{"id":10266,"depth":320,"text":10267},{"id":10304,"depth":320,"text":10305,"children":10553},[10554,10555,10556],{"id":10308,"depth":317,"text":10308},{"id":10322,"depth":317,"text":10323},{"id":10406,"depth":317,"text":10406},{"id":10508,"depth":320,"text":10508},{"id":10523,"depth":320,"text":10523,"children":10559},[10560,10561],{"id":10526,"depth":317,"text":10526},{"id":10535,"depth":317,"text":10535},{"id":5348,"depth":320,"text":5348},"为知识库添加语义搜索能力，让 AI 真正理解你的问题而不是简单匹配关键词。",{},"\u002Ftutorials\u002Fai-agent-skill\u002Fsmart-search",{"title":10261,"description":10563},"tutorials\u002Fai-agent-skill\u002Fsmart-search",[361],"L_3lW_kUG6oqDLJchivECABoSHJa7hmyXrJIl4bIK5A",1782881824456]