别再手动操作:自己动手构建解决方案的四步框架

Generative AI - Medium 2026-08-13T01:14:48.330385

一份面向初学者的指南,教你用 AI 把重复性工作流变成实用工具。

发现与探索:找到真正的问题。

Teams 侧边栏:进入客户通话。
我:“嘿 Neil,离开 Teams 通话前别忘了拿到 AI 摘要。”
Neil:“没问题,我记住了。挂掉电话……却没拿笔记……所以,呃,我忘了……”
我:“……收拾东西走人吧。”

好吧,最后一句是夸张。但这种情形我经常遇到。我不能怪 Neil,我自己也从来不记得。AI 世界的美妙之处在于:你解决工作流问题的能力,只受想象力的限制,而不受技术水平的限制。我连点一下按钮才能拿到通话笔记都嫌烦,所以干脆自己去解决了这个问题。

发现问题是块肌肉;你整天绕着同一件事转,直到对它视而不见。要找出新问题的根源并解决它,需要一场对话;我习惯把这场对话变成对抗式问答。我先让 AI 给出最佳路径,然后让它自己反驳刚才给出的路径。我专找它推断出我没说过的话的地方,逼它展示它对电脑、日程、语言和工作方式做过哪些假设。每一条回答要么让路径更坚实,要么暴露出别的选项,要么直接否决这条路。

正是这样的对话让我最终做出了 whispr1——一个小型 Windows 程序。它会监测 Teams 通话,录制双方声音,在我自己的机器上做转写,并把 Outlook 会议详情直接写进转写稿里。转写稿一生成,音频就被删除。没有仪表盘,没有账户,没有网页应用。托盘图标告诉你它正在运行,一个装文本文件的文件夹就是整个产品。

这场问答帮我确定了总体路径,以及有哪些现成工具可以支撑它。我并不是在做一个产品。我们得到了“是的,这是可行的”这个确认,还得到一套构建框架,以及无论最终设计变成什么样都必须遵守的护栏。这些定了之后,就该写计划了。

计划与事前验尸:把计划写下来,然后攻击它。

在写任何代码之前,我先让 AI 阅读真实约束条件,写下它打算怎么做,然后我和它争辩。

一份值得信任的计划不会默默猜测,而是会把悬而未决的决策摆到明面上,等待回答。我遇到的一个问题是:这个工具要不要把转录文本交给 AI 服务去总结?项目的 UNCERTAINTIES.md 里有这样一条记录:

我确实想要这个功能,但开启它意味着转录文本要离开我的机器,所以最后被拿掉的正是这个功能。智能体不需要你规定整个系统,它只需要一个可以验证的下一步。Explore—Plan 这一步直接出自 Anthropic 的手册。我是在 Claude Code 里搭建的,不过同样的顺序在任何前沿编码智能体里都适用。

然后,我会派对抗性智能体去攻击这份计划,让它们专门挑毛病。同一个会话里的智能体往往会保留自己的盲点,所以我让多个子智能体分头行动,它们既独立于原会话,彼此之间也互不相关。这就是 evaluator-optimizer 模式:一个过程负责生成,另一些独立的过程负责评判。把它当成一次事前验尸来用——在动手构建之前,而不是等出了故障之后。

在安装代码一行都还没写的时候,每个子智能体就已经领到不同的任务,阅读同一份书面计划。负责排查“只在我的机器上成立”的假设的那个,发现 faster-whisper 的模型缓存可能经不起直接的文件复制——因为有些机器把缓存存成链接,而不是真正的文件。负责审计硬编码值的那个,发现了 mic_name_match 字段:空字符串会静默地对机器上的所有设备做子串匹配。现在选择器会拒绝写入空值。负责检查交付机制的那个,建议我放弃手动传递的 zip 包,改用仓库加 Release 附件——最终交付的也正是这个方案。

执行与测试:让它构建,然后你自己跑一遍。在智能体开始写文件之前,我就已经定下了所有悬而未决的决策。想象和论证由我来,敲代码由它来。原型一口气就搭好了,而且从监听来电到写出文本文件,它把整套工作都完成了。

它同时录制两条音轨:我的麦克风声音,以及从扬声器播出的所有声音——电脑会把后者作为另一路输入回环(loopback)回来。通话里的其他人完全看不到这个操作。通话结束后,两条音轨会送进已经存在于本机磁盘上的语音转文字模型,最终输出为一份带时间戳的对话记录。整个过程没有任何数据离开这台机器。

OpenAI 以 MIT 许可证开源了这个模型,名字叫 Whisper。我通过 faster-whisper 这个重实现版本来运行它,让它在普通处理器上也能保持足够快的速度。我给自己这个工具起的名字,正是在向 Whisper 致意。

要让这个工具能放心地交给别人用,还需要好几轮真实环境测试。此外,我请人做了一次独立审计:逐行阅读仓库里的每一个脚本,追踪网络调用,并检查发布版本是否存在供应链层面的风险。审计结果列出了九个问题,我全部修复了。审计确认了没有提权漏洞、没有注册表持久化、仓库里也没有任何密钥;还通过检索代码的方式复核了「零网络调用」的说法,而不是只听我一面之词。

唯一没有做的是运行安装程序——审计方的安全策略不允许执行从网上下载的不可信代码。于是我把代码重新克隆到一个名字带空格和括号的文件夹里,放在一台从未接触过这个工具的机器上,从头到尾完整跑了两次安装流程。十秒之内,就冒出了两个 bug:打包进去的 Python 找不到自己的包;安装过程还悄悄调用了那台机器上已有的另一个 Python,而不是它自带的那个。这两个 bug,方案里没有预料到,「事前验尸」(premortem)里也没出现,都是真正跑起来才暴露的。

部署与维护:把它交给一台从未见过它的机器

一个工具,不是在你机器上能跑就算完成了。要等它在一台跟你的假设毫无共同之处的机器上依然能生存下来,才算真正做完。把 Whisper 交给别人用,正是这一步逼着我去面对那些此前没在意的现实差异:新版 Teams 客户端和经典版不一样;要用经典版 Outlook 才能区分会议和普通通话;窗口标题是英文单词;日历查询用的是美式日期顺序。在 ARM 架构的笔记本上,它甚至完全跑不起来。这一系列注意事项,都写在了项目的安装说明里。

安装程序会从 GitHub Release 拉取一个约 550MB 的离线安装包,而且在下载开始前就检查你的处理器类型和 Teams 版本,而不是等下载完成后再检查。它会获取一个可嵌入的 Python 运行时和 get-pip.py,每次构建时都会把这两者与记录的指纹做比对(SHA256 固定)。安装包解压后会自动删除,而不是留在硬盘上,让安装成本翻倍。

然后,再给它一种感知“世界变了”的方式。过去,出了新版本之后重新运行安装程序,它是什么都不会去获取的。现在安装目录旁多了一个版本标记文件,只要两个数字对不上,安装程序就会重新部署自己。这个习惯在软件行业有个名字:持续集成与持续交付(CI/CD)。说白了,就是机器在你每次改动时自动检查你的工作并替你发布,而不是靠你自己时刻惦记着。Whisper 只是带了一个最小化的版本,仅此而已。要体验完整的能力,就从 GitHub Actions 开始。

那个反对意见最终会落到这一点:你并没有躲开订阅,你雇了你自己,从此永远要随身揣着传呼机。订阅不是租代码,而是租别人的值班排期、他们打的补丁,以及对那些你根本没想到的边界情况的处理。当 Teams 升级改动了一个窗口标题,来修这个问题的人是我。自建还是购买,首先是个能力问题,然后才是价格问题。要衡量自建需要投入的精力,以及它能换回来的能力;还要算上如果选择购买,你会默默吸收掉多少变通方案。

一个晚上,换一个我恰好会在最想留记录的通话上忘记按的按钮——这笔账很快就结清了。但为一个只会用两次的东西花一周时间去加固,就不划算了。你按这种方法做出来的东西,大多数情况下用两次就会被删掉。Whisper 在登录时自动启动,不用我碰就能录下每一通电话,它现在还装着。我之前写过怎么判断自己做的是工具还是生意;Whisper 通过了这个测试。这些都没有消除维护的问题,只是把这个问题推迟到了你得到答案之后。

用这个框架去检验你自己的项目。Whisper 只是一个例子,同样的顺序也适用于那些看起来完全不同的东西。

正是这四步,让我收获了一个lint脚本——它能发现我写的东西开始透出机器腔;一个由agent替我维护、而不是我手动更新的wiki;还有一个任务队列,让工作自动从「认领」推进到「完成」,全程无需我操心。这些方案市面上都有现成产品可以买(或订阅),但一点探索和规划,就让我省下了这些费用,而且握有绝对的控制权。所以,那个一直让你来回折腾的事是什么?去发现它,去探索它。抓住那个你一直在绕弯子对付的环节,然后让agent把它隐含的前提假设摊开给你看。做好计划,再来一次「事前检验」。先把想法落到纸面上,再派出对抗性智能体(adversarial agents)去挑刺,看看哪里会崩。执行并测试。让agent去敲代码,然后你自己亲手跑一遍——光靠读代码,你永远不知道它真正跑起来会是什么样。部署并维护。把它部署到不是构建环境的地方,再给它一个持续更新的机制。代码全部公开在 github.com/bryanthood-wph/whispr。比起从描述里凭空发明一个方案,agent更擅长在现成的可运行示例上做扩展,所以把仓库克隆下来,交给你的agent,再告诉它你的机器和你的日常习惯有什么不一样。

关于录制他人这件事。 通话中的其他人什么也看不到——没有提示横幅,也没有图标。静音麦克风也挡不住这次录制,因为录音发生在硬件层面,位置在静音按钮之下。合法性因所在州、国家和雇主而异,这个核实责任在你身上。一个「很平常的理由」不是挡箭牌,「正当的理由」同样不是。在跑任何东西之前,先读政策,先问合规。本文不构成法律建议。

查看原文