纳瓦尔宝典:AI 时代,借 AI 之力撬动个人能力与财富的复利

纳瓦尔宝典:AI 时代,借 AI 之力撬动个人能力与财富的复利 原文:The Almanack of Naval Ravikant: A Guide to Wealth and Happiness 作者:Naval Ravikant(硅谷天使投资人,AngelList 创始人) 编撰:Eric Jorgenson 来源:Magrathea Publishing,发布于 2020 年 09 月 中文版:中信出版社,2022 年 05 月,赵灿 译 最近在重读《纳瓦尔宝典》,一句话反复击中我——「财富 ≠ 劳动」。但这次重读的体感,和前几次很不一样:以前我把这句话当成一种「价值观提醒」,告诉自己别太累;现在 AI 全面进入工作流之后,我才发现纳瓦尔讲的其实是一种「杠杆公式」,而 AI,是 21 世纪最便宜、最高倍的那一种杠杆。这篇文章,我想把纳瓦尔关于「财富 / 杠杆 / 判断力」的核心观点重新梳理一遍,并把它们放进 AI 时代这个新变量里,回答一个更现实的问题——作为没有任何特殊资源、也没有团队背书的普通人,我们怎么借 AI 之力,以最小付出去撬动个人能力与财富的双重复利? 一、AI 改变的,不是「杠杆本身」,而是「杠杆的门槛」。 纳瓦尔反复讲一句话:「我们这代人最被高估的东西,就是劳动本身。」劳动只能线性放大你的时间,而 财富是指数级增长的——他给出了一个非常冷静的区分:劳动是用时间换钱,金钱只是财富的流通形式,真正的 财富,是你睡觉时依然在为你工作的东西。在他那本《宝典》里,他把放大劳动的工具分成「劳动力 / 资本 / 代码 / 媒体」四类杠杆,并指出:前两类需要别人「许可」,后两类才是普通人的金矿。但放到 2024 年之后,这件事又变了一次:AI 出现之后,「代码」和「媒体」这两条无许可杠杆的门槛,被一次性打到了地板。以前你想写一个工具,需要学一门语言、搭环境、踩无数的坑;现在你只需要把需求说清楚,AI 就能给你一个能跑的版本。以前你想持续生产内容,需要文笔、时间、选题、拍摄;现在 AI 可以帮你写初稿、配图、剪辑、校对。门槛下降,杠杆率反而在上升——这才是 AI 真正改变的事。 二、AI 时代,普通人能用的「五种新杠杆」。 纳瓦尔讲的是四类「杠杆」,结合我自己的 AI 使用经验,我把它们重新整理为「五种更接地气的杠杆」,并按「普通人友好度」排序: AI 杠杆的能力外骨骼——你不是变强了,你是装上了外骨骼。写作、设计、分析、翻译、代码、PPT,这些过去需要多年训练的能力,现在 AI 都能给你一个 70 分的起点。你不是不能做,只是过去做一次的成本太高。 AI 杠杆的内容生产——一个人 = 一家内容公司。选题、写作、配图、排版、分发,过去需要一个小团队;现在一个人 + AI 工作流就能稳定产出。这是「媒体杠杆」的 AI 加持版。 AI 杠杆的产品制造——一个人 = 一家小产品公司。无代码 + AI 辅助开发 + AI 辅助运营,让「做一个自己的小产品」从过去的半年变成现在的两周。这是「代码杠杆」的 AI 平民版。 AI 杠杆的信息差消除——以前你做判断,靠经验和信息差;现在 AI 可以几秒钟内帮你拉齐行业资料、对比方案、列出反例。判断力没变,但判断的依据变厚了。 AI 杠杆的人际连接——AI 帮你整理客户、读邮件、写回复、做会议纪要;你不再被事务性工作淹没,可以把时间花在「真正需要人的地方」——关系、信任、长期价值。 纳瓦尔反复强调:杠杆只是放大器,方向错了,杠杆越大,摔得越狠。在 AI 时代,这句话变成了一个更具体的提醒:如果你用 AI 加速了一件错误的事,你只会更快地失败。 ...

2026-09-06 · 2 min · 281 words · FunkyGod

我如何把 Pi Agent 接进 Office/WPS 办公流程:从安装到 Excel 长任务

20260904|我如何把 Pi Agent 接进 Office/WPS 办公流程:从安装到 Excel 长任务 我最初接触 Pi Agent 时,也只是把它当成一个写代码的终端工具。真正让我觉得它适合办公,是我把一项复杂任务拆开之后发现:办公里最耗时间的部分,往往不是写一段话,而是把邮件、会议记录、网页、表格和历史文件里的信息拼起来,再按一套不够明确的规则反复处理,最后还要证明结果没有改错。 关键词:#Office #WPS #Pi 对经常使用 Office 或 WPS 的人,我更愿意把 Pi 理解成一个坐在旁边的办公助理:它不替我换掉 Word、Excel、PowerPoint 或 WPS,而是帮我在多个文件之间找信息、整理内容、生成草稿、执行低风险的重复动作。它可以在本地的“办公工作区”——也就是我专门放这项工作的文件夹——里读取资料、调用工具、保存一次连续的工作记录,并把中间结果留下来。但它不是“按一下就全自动”的魔法,也不是替我做业务判断的数字员工。 本文先把安装对象和桌面适配讲清楚,再用 Excel 月报这个长任务说明我如何让它参与办公,以及我为什么坚持把验证和最终提交留给自己。先把名字理顺:大家口中的“pi-agent”,对普通使用者来说通常指的是会安装出 pi 命令的 @earendil-works/pi-coding-agent;@earendil-works/pi-agent-core 是底层运行时库,不是新手第一步要装的客户端。下面的命令和版本判断以我在 2026 年 9 月 4 日查到的官方快速开始文档、官方仓库和相关 package 资料为准。 下面看到的黑色窗口命令,主要只在安装和整理文件时使用;装好以后,我仍然可以继续用熟悉的 Excel、Word、PPT 或 WPS 图形界面办公。对不熟悉命令行的朋友,我建议把它理解成“给办公助理下达准备工作指令”,先照着复制执行即可。 先准备运行环境:当前官方仓库的 package.json声明 Node.js >=22.19.0。Node.js 是 Pi 运行所依赖的基础环境,我会先用 node --version 检查版本;低于这个版本就先升级 Node.js。旧文章里如果还写着 @mariozechner/pi-coding-agent,以当前官方文档使用的 @earendil-works/pi-coding-agent 为准。然后安装并验证: npm install -g --ignore-scripts @earendil-works/pi-coding-agent pi --version macOS 或 Linux 也可以使用官方安装脚本 curl -fsSL https://pi.dev/install.sh | sh;Windows 则建议先安装 Git for Windows,因为 Pi 默认通过 Git Bash 执行 Bash 命令,官方也支持在设置里指定 shellPath。安装成功后,进入我准备给它工作的目录再启动: ...

2026-09-04 · 3 min · 564 words · FunkyGod

Go 语言架构|Google ADK Go 深入拆解:把 Agent 写进 Go 的工程流水线

Go 语言架构|Google ADK Go 深入拆解:把 Agent 写进 Go 的工程流水线 原文:Agent Development Kit (ADK) for Go 作者:Google ADK Go 团队(Google 官方开源项目维护者) 来源:GitHub,发布于 2025 年 11 月 06 日 我最近重新看了一遍 Google 的 ADK Go。它吸引我的地方,并不是“Go 也有一个 AI 框架”,而是它试图回答一个更实际的问题:一个会调用模型、工具和其他 Agent 的系统,能不能像普通 Go 服务一样被编译、被测试、被部署和被审查? 这篇文章不打算把官方 API 逐个翻译一遍。我会沿着自己的理解,把 Agent、工具、工作流、协议、状态和上下文串起来,也会特别标出 v1 与 v2 的边界。文中的蓝色表示工具或事实,绿色表示我的实践判断,红色表示容易踩的坑,黄色底色表示可以直接拿去用的做法。 先看 ADK Go 为什么值得单独关注。 我认为,ADK Go 的重点不是证明“Go 比 Python 快”,而是让 Agent 代码进入成熟的软件工程流程。Go 项目已有的编译器、静态检查、单元测试、依赖管理、CI 和容器化能力,都可以继续使用。 ...

2026-09-03 · 3 min · 438 words · FunkyGod

OpenCode 和 KiloCode 的主要区别是什么?为什么我会选择 KiloCode?

20260903 OpenCode 和 KiloCode 的主要区别是什么?为什么我会选择 KiloCode? 最近 OpenCode 和 KiloCode 经常被放在一起讨论:一个让我在终端里专注完成任务,一个把多个 Agent、隔离工作区和代码审查组织进 IDE。很多朋友真正想问的其实不是“谁更强”,而是“我现在的工作方式,应该把哪一个放在手边”。这篇文章记录我最近一次切换工具的原因,也把我认为最影响选择的差异讲清楚。蓝色高亮表示工具事实,绿色高亮表示我的判断,红色高亮表示容易踩的坑,黄色高亮表示可以直接尝试的做法。文中的产品信息按 2026 年 9 月 3 日查阅到的官方文档整理,后续可能随版本变化。 先说我的结论:如果你主要在终端里工作,喜欢自己控制会话、目录和模型,OpenCode 依然是一把很顺手的工具;如果你经常同时推进多个任务,希望在 VS Code 或 JetBrains 里集中看状态、diff 和工作区,KiloCode 更贴合我的习惯。更准确地说,Kilo CLI 是 OpenCode 的 fork;Kilo 的 IDE 插件和 Agent Manager 则是 Kilo 另行组织的产品层。所以它们不是两个完全无关的竞品,也不是同一个产品换了两个皮肤。 我为什么又换了一次?上一篇文章里,我写过自己怎样把 OpenCode 接进日常开发,那些经验现在仍然有效:终端里可以跑命令,配合 LSP(语言服务协议)理解代码,也可以通过 MCP(模型上下文协议)接入外部工具,项目规则则写进 AGENTS.md。后来我的任务从“一个人在终端里重构 Go 服务”,变成了同时推进重构、补测试、写文档、审 PR 和修 bug,还要在 VS Code 与 JetBrains 之间来回切换。OpenCode 的多 session 能力并不弱,只是我需要自己安排目录、创建 git worktree(并行分支工作区),再盯住每个会话的进度。KiloCode 的 Agent Manager 把这部分协调工作做成了看板:每个 Agent 可以在独立 worktree 里运行,我只需要负责拆任务和合并结果。 ...

2026-09-03 · 1 min · 213 words · FunkyGod

OpenCode,别急着上手,分享我的自用经验

OpenCode,别急着上手,分享我的自用经验 最近一段时间 OpenCode 的话题度很高,公众号和推上每隔几天就有人晒"一天配置、终身起飞"。我也凑过几次热闹,但说实话,真正把它当成日常开发工具并接入 AI 用,是在吃了几次亏、调过几次规则之后才稳定下来的。这一篇不是官方文档的搬运,也不是"hello world 教程",我会先讲我为什么把 OpenCode 作为日常开发工具并接入 AI 用,列 8 条最容易踩的注意事项——尤其是"装上第一天别急着写规则"。如果你正在评估 OpenCode、或者已经装上却不知道从哪一步开始,这篇可能比"快速上手"那一份更值得花十分钟读完。蓝色高亮表示工具或事实,绿色高亮表示我的使用判断,红色高亮表示容易踩的坑,黄色高亮表示可以直接抄走的最小可用集。、 先把"为什么用"想清楚:换模型不被绑架、过程可观察、本地运行——这三条都满足了,再谈下一步。 从最小可用集开始:一份简短 AGENTS.md + 一个稳定 Provider + 一个默认 build 角色 + 启用的 LSP。够用就好。 复杂任务先 plan 再 build:跨文件的改动,先看 diff 再下手,能避免一整轮返工。 规则要可验证、规则要文件化:机器能判的才叫规则,读不懂的只是愿望。 审查用只读 agent:把"看"和"改"分开,是让 AI 报告客观的前提。 接入 MCP 时按"只读 → 受限可写 → 状态变更"分步放权:每一步都先想清楚"最危险的事是什么"。 不要让关键检查静默失败:可见、可追溯、有人负责,三条缺一不可。 把 AI 当草稿作者,把自己当责任编辑:最终交付的责任,不能下放给工具。 一、把 OpenCode 放进工作流之前,我给自己提过三个问题:它能不能让我换模型不被绑架?它能不能把每一步操作摊在我眼前?它能不能在我自己的机器上跑,而不是把代码交给一个远端托管? OpenCode 在这三个问题上都给出了让我愿意留下来的答案,这也是我后来把它接入 AI 用作日常开发工具的真正原因。我把这三个答案按顺序写下来,因为它们不只是在"功能上"成立,更是OpenCode 与同类工具最明显的差异点: 开源、可审计、不绑定单一供应商:OpenCode 的客户端代码是公开的,关键行为可以在源码里核对;Provider(也就是模型供应商)走的是开放协议,我可以在同一个配置里同时挂上 OpenAI、Anthropic、本地 Ollama、自建代理,换模型不需要重写工作流,更不需要换一份订阅。对我来说这意味着两件事:第一,今天贵/限流的模型,明天可以被另一个模型接住;第二,今天数据合规的顾虑,明天可以通过本地模型或者自建网关绕过。这条不是装饰,它直接决定了我愿不愿意把生产代码交给它。 把"工具调用 + 文件编辑 + 命令执行"收进一个 TUI:比起网页聊天窗口,OpenCode 的好处是上下文连续。一次会话里,它可以直接读写我的文件、跑我的命令、调用我的 LSP,并把每一步的结果作为下一步输入。传统聊天窗口要靠我在不同窗口之间复制粘贴,OpenCode 把这些步骤变成了同一个会话里的多轮工具调用。对我而言这比"模型写得多聪明"更重要:我能在同一个界面里看见它读了什么、改了什么、跑过哪些命令、回滚时还能回到哪一步。信任不是靠宣传词建立的,是靠"可观察"建立的。 配置即文档,规则可以在 review 里被讨论:OpenCode 的绝大部分约定都放在纯文本文件里:项目根的 AGENTS.md 写规则,commands/*.md 写命令模板,agents/*.md 写角色,skills/*.md 写沉淀下来的做事方法。最常见的错误是把 AGENTS.md 当成无所不包的"价值观大全",其实它的价值恰恰相反——把"我想要的工作方式"显式写下来,让工具按文件读,而不是每次新会话都让我重新解释一遍。规则在哪一步生效、谁负责什么,可以被同事直接读到,也可以在 review 里被讨论。这就是我把 OpenCode 当成"开发工具并接入 AI 用"的核心原因——AI 第一次成为工作流的一部分,而不是一个聊天侧栏。 二、装上 OpenCode 之后,先别急着让它"做项目"。我会先定一个最小可用集,把"模型 + 规则 + 角色 + 编辑器反馈"四件事按顺序配齐,再开始干正事。顺序不能乱,因为规则没写好之前,模型越强越容易跑偏。下面这 8 条技巧,前 4 条是"装好就能用"的最小集,后 4 条是"日常真正省时间"的核心姿势,全部按顺序展开,每一条都尽量具体到"打开哪个文件、敲哪条命令、看哪个输出"。我会刻意把"我踩过的坑"嵌在技巧后面写,而不是单独列一节,这样读起来不会割裂。 ...

2026-08-30 · 3 min · 455 words · FunkyGod

具身智能日报|两部门启动万人级规模部署专项行动,行业淘汰赛已然开启

工信部、国资委联合启动人形机器人实景实训专项行动,明确2026年底开启「作业模式」;行业半年融资935亿、8家企业估值破200亿,但修路者已开始倒下。

2026-08-29 · 1 min · 50 words · FunkyGod

AI 写的代码,为什么总像"差不多对"?我用 opencode 把 commit 前审查做成三道门

AI 写的代码,为什么总像“差不多对”?我用 opencode 把 commit 前审查做成三道门 我用opencode做代码审查,注重agents.md的质量,聚焦多轮核心BUG输出质量,减少MR被驳回的风险 审查阶段不要使用可写 agent。 可写 agent 看到问题后很容易顺手修复,修复后的代码又变成新的审查对象。我要的是报告,不是未经确认的工作树变化。 AGENTS.md 不是越长越好。 我见过把抽象价值观、编码风格和所有历史事故都塞进去的规则文件,最后 AI 什么都读到了一点,却没有一条真正执行到位。规则应当短、具体、可验证。 不要只统计 AI 提了多少条意见。 我更看重高价值意见的比例、误报率、漏报案例和处理耗时。意见越多不等于审查越好。 我最近在 Go 项目里遇到过一个很典型的例子:我让 AI 把一个用 sync.Mutex 保护的缓存改成 sync.RWMutex,因为读请求远多于写请求。代码能编译,go test -race 也通过了,我正准备提交时又看了一遍 diff,才发现 AI 在 RLock() 之后没有为所有提前返回的分支补上 RUnlock()。原代码用 defer Unlock() 做了一次兜底,锁的种类变了,兜底结构却没有一起变。 这个问题不是函数体“完全写错”,而是局部正确、整体破坏。测试没有触发那个错误分支,竞态检测自然也抓不到。类似的情况我见过很多:错误被 _ 接住、context 半路丢失、goroutine 没有退出条件、异常路径没有补齐、依赖被悄悄换成团队没人维护的库。AI 生成代码的速度越快,diff 的影响半径就越容易被低估。 我现在把 commit 前的审查拆成三道门:机器门负责确定性检查,AI 自审负责挑出候选风险,人工 review 负责业务判断和最终签字。这篇文章记录我在 Go 项目里实践这套流程的方式,也会说明 opencode 适合放在哪一层、哪些事情仍然不能交给它。 蓝色 表示工具或事实,绿色 表示我的实践判断,红色 表示容易踩的坑,黄色 表示可以直接改写到自己项目里的模板。 一、先把 commit 当成一次小型发布 以前我把 git commit 当作保存进度,后来几次线上问题让我改了看法:commit 是把一组行为变化交给团队和环境的发布动作。即使还没有上线,它也已经影响了后续 review、合并、回滚和事故追踪。 ...

2026-08-29 · 4 min · 836 words · FunkyGod

AI 生成代码该怎么审:一套可以直接使用的实操框架

AI 生成代码该怎么审:一套可以直接使用的实操框架 我的核心要求:减少 BUG,减轻 Review 压力,避免生产环境出现不可逆的风险。不要怕对同一个任务开多个agent,重要的是让不同关注点能充分执行,人工做最后的审核兜底; 一、AI 写得越快,审查越不能只看“像不像对的” AI 一分钟可以生成几百行代码,几小时就能跑完一轮 PR 流程。真正决定质量的,已经不只是 AI 写得快不快,而是我们能不能在代码生成之后,用合适的方法把它审干净。我自己每天让 AI 生成大约一半的代码改动,但最后原样合进主干的,大概只有三成。剩下的代码往往不是“完全写错”,而是“看起来很像对”:错误被 _ 接住,权限校验在调用链里悄悄漏掉,并发场景只覆盖了 happy path,或者引入了一套团队没人熟悉的依赖。这些问题可能过得了 lint、单元测试和评审,却会在生产环境里变成真正的事故。 所以,我现在不把 AI 当成“替我批准代码的人”,而是把它放在风险筛查器的位置:先帮我快速找出值得追问的地方,再由作者、人工 Reviewer 和领域负责人作最终判断。这个定位也和公开实践比较一致:OWASP 把人工代码审查定义为对自动化安全测试的补充,重点放在业务逻辑、复杂安全实现和具体上下文上;Google 的评审指南则强调,测试本身也需要人来判断是否真的有效。可参考 OWASP Secure Code Review Cheat Sheet 和 Google 的代码评审实践。 二、先把审查输入准备好,AI 才不会对着空气猜 我以前最容易犯的错,是把一段代码直接丢给 AI,然后补一句“帮我仔细审查”。现在我会先准备一张很短的“审查输入卡”,至少包含下面五项: 目标:这次改动要解决什么问题?不解决什么问题? 不变量:哪些已有行为、权限边界、接口兼容性和数据约束绝对不能被破坏? 范围:本次 PR 改了哪些文件、调用链和配置?哪些内容只是必要上下文? 验证:新增或修改了哪些测试?正常路径、异常路径和回滚路径分别是什么? 风险:是否涉及登录、权限、支付、个人信息、文件上传、数据库迁移、加密或外部依赖? 日常 PR 我会让 AI 以 diff 为主,只补充相关接口、数据结构、配置和测试。OWASP 也把 diff-based review 作为 Pull Request 和日常开发的适用方式;新系统、重大版本、遗留系统接管或事故复盘,才更适合做全量的 baseline review。另一个有效做法是控制 PR 的大小:Google 建议一个变更尽量只做一件自洽的事,相关测试跟着代码一起提交,大型重构与功能修改分开。这样做的收益很直接:AI 看得少而准,人也更容易发现真正的行为变化。 ...

2026-08-26 · 2 min · 228 words · FunkyGod

减少 AI 返工,我现在一般这么做

减少 AI 返工,我现在一般这么做 原文:Review AI-generated code 与 AI 代码审查实践的综合解读 作者:我(结合个人 AI 编程实践整理) 来源:GitHub、Uber、Cloudflare、Trellis 等公开资料,整理于 2026 年 08 月 26 日 AI 写代码越来越快,但返工并没有因此自动消失。我现在更关心的,不是 AI 一次写了多少,而是错误能不能更早暴露、修改能不能更小、人工判断能不能用在真正重要的地方。 这篇文章记录的,就是我目前用来减少 AI 代码返工的一条实践路径。 一、我以前把 AI 当成“写得更快的人”,后来发现它更像“放大器” 刚开始用 AI 写代码时,我最在意的是它能不能一次生成几百行、能不能把一个需求快速改完。后来真正经历了几轮线上问题、PR 返工和反复讨论,我才意识到:AI 放大的不只是产出速度,也会放大需求里的空白、上下文里的误导和开发者自己的错误判断。代码生成得越快,如果没有同步增加验证能力,Review 只是被动接收更多半成品。 我最近看了一些开发者分享和团队实践,大家的结论其实很接近:不要把“AI 写了多少代码”当成成功指标,而要看它是否减少了无效沟通,是否能在进入人工 Review 前被自动检查,是否让 reviewer 更快理解真正的风险。GitHub 的官方建议也很直接:先检查功能、上下文和意图,再看代码质量、依赖和安全;最终合并责任仍在开发者身上。我现在给自己的目标因此换了一个说法:不是保证 AI 一次写对,而是让错误尽可能早暴露,让每一轮修改尽可能小,让机器能判断的事情不要消耗人工判断,让必须由人判断的事情明确标出来。 二、写之前先做上下文盘点:不要让 AI “自己理解整个仓库” 我遇到过最浪费时间的一类任务,是直接对 Agent 说“先理解一下这个仓库,再实现功能”。小项目这样做问题不大,仓库一大,Agent 往往会先花很多时间猜目录结构,读到相似但已经废弃的实现,最后在错误的上下文上给出一份看起来很合理的方案。社区里有开发者把自己的流程总结成:先画仓库地图,再找相关文件,检查上下文是否足够,最后检查回答是否确实基于这些文件。我照着这个思路调整后,最大的变化不是回答更长,而是少了“改错文件”和“参考旧逻辑”的返工。 我现在会把任务拆成四步: 先定位:让 AI 只列出与任务直接相关的目录、入口、调用方、测试和配置,不要马上改代码。 再确认:让它说明每个文件为什么相关,哪些文件只是相似样例,哪些内容可能已经过期。 再补上下文:补充接口契约、数据库结构、历史 PR、业务规则和失败案例;如果这些信息没有提供,就明确标成未知。 最后锁范围:规定允许修改的文件和不允许顺手做的重构,要求它在动手前复述范围。 我会先使用这样的提示: 先不要写代码。请完成以下任务: 1. 列出本任务涉及的入口、调用链、数据结构、测试和配置; 2. 区分“已从仓库确认的事实”和“你的推测”; 3. 指出还缺少哪些上下文,以及缺失它们会影响什么判断; 4. 给出最小改动计划,列出准备修改和明确不修改的文件; 5. 等我确认计划后再实现。 这里有一个容易被忽略的细节:我不会把所有文档一股脑塞给 AI。上下文太多同样会稀释重点,我更倾向于使用“渐进披露”:先给仓库地图和任务相关文件,遇到具体问题再补充协议、ADR、历史 PR 或业务文档。AI 必须回答“我实际参考了哪些文件”,而不是笼统地说“我已经理解整个项目”。上下文的关键不是多,而是相关、最新、可核对。 如果它引用了过期文档,我会先停下来校正上下文,而不是继续修补错误答案。 ...

2026-08-26 · 2 min · 246 words · FunkyGod

AI 编程时代,我愿意用 Go 做后端

AI 编程时代,我愿意用 Go 做后端 AI 编程工具越来越会写代码,但真正把一个 AI 应用跑到线上,难点从来不只是"能不能生成一个接口"。请求超时怎么处理,模型服务失败后怎么重试,流式响应如何关闭,服务占多少内存,镜像怎样发布,出了问题能不能快速回滚,这些才是后端每天要面对的事情。 我越来越愿意把 Go 放在 AI 应用的后端位置:让 AI 负责加快实现,让 Go 负责把边界、资源和部署约束固定下来。这里说的不是把模型训练和推理强行改写成 Go,而是模型外围的 API、网关、任务和编排服务。蓝色文字表示语言和工程特性,绿色文字表示我的实践判断,红色文字表示容易被忽略的风险,黄色底色表示可以直接采用的做法。 一、Go 不会让 AI 更聪明,但会让错误更快暴露 我用 AI 写后端时,最常见的情况不是代码完全不能运行,而是它给出了一条顺利路径,却把失败路径一笔带过。比如调用大模型时,AI 很容易生成下面这种代码: func AskModel(prompt string) string { resp, _ := http.Get("http://model:8080/v1/chat") body, _ := io.ReadAll(resp.Body) return string(body) } 这段代码的问题很多:忽略了网络错误,没有关闭响应体,没有设置超时,也没有检查状态码。它可能在本地演示中返回结果,但一旦模型服务变慢,连接就可能长期占用;一旦服务返回 500,调用方拿到的可能仍然是一段错误页面。 Go 的显式语法会把这些问题推到台面上。error 必须被接收,类型转换必须写明,defer、context 和 goroutine 的生命周期也不会凭空消失。 这对 AI 生成代码形成了一种很有价值的约束:编译器先拦住低级问题,人再检查业务决策。 例如,我会要求模型先生成一个"责任完整的版本": var ErrModelUnavailable = errors.New("model service unavailable") func AskModel(ctx context.Context, client *http.Client, endpoint string, prompt string) ([]byte, error) { payload, err := json.Marshal(map[string]string{"prompt": prompt}) if err != nil { return nil, fmt.Errorf("encode model request: %w", err) } req, err := http.NewRequestWithContext(ctx, http.MethodPost, endpoint, bytes.NewReader(payload)) if err != nil { return nil, fmt.Errorf("create model request: %w", err) } req.Header.Set("Content-Type", "application/json") resp, err := client.Do(req) if err != nil { return nil, fmt.Errorf("call model: %w", err) } defer resp.Body.Close() if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { return nil, fmt.Errorf("model returned status %d: %w", resp.StatusCode, ErrModelUnavailable) } body, err := io.ReadAll(io.LimitReader(resp.Body, 4<<20)) if err != nil { return nil, fmt.Errorf("read model response: %w", err) } return body, nil } 这里不是说 Go 写起来没有重复代码,而是每个关键动作都落到具体的代码位置:编码、请求、响应、释放、超时、错误,全都看得见也改得动。 ...

2026-08-24 · 4 min · 666 words · FunkyGod