MoreRSS

site iconLyric | 歌词经理修改

Quail开发者。主要分享这些主题:区块链与加密货币, AI,以及其他互联网相关的话题。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Lyric | 歌词经理的 RSS 预览

用开发 Agent 理解 Agent 02:数据即代码,代码即数据

2026-03-15 09:55:37

上一篇文章,我说「面向 LLM 的软件系统是新的范式,需要给 AI 少一些约束,更多自由」,然后留了个尾巴:「下次再写具体怎么给自由」。

我想先多问一个问题:为什么我们本能地想给 Agent 加约束?

要回答这个问题,得先理解一件事:在 Agent 的世界里,数据和代码的边界正在消融。

从一个 loop 说起

上篇提到,Agent 的核心循环大概长这样:收集信息 → 整理 → 决策 → 执行 → 再收集。

把这个循环用代码来表达,核心就是一个 llm.Chat 调用:你传入 prompt,拿到 response。然后下一轮,你把上一轮的 response 拼进新的 prompt,再传进去。

看起来很简单对吧。但这里藏着一件很不寻常的事:

上一轮的输出(数据),直接变成了下一轮的输入条件(控制流的一部分)。

在传统软件开发里,这是要被打手的。

但这个传统到底从哪里开始?

先回到计算机的起源?

但是如果我们回到计算理论的源头,1930 年代有两条路线几乎同时出现:

Church 的 λ 演算 和 Turing 的图灵机

Church λ 演算里根本没有「数据」和「代码」的区分(可以参考我之前的文章 《Church 计数和 Lambda 演算》)。函数就是值,值就是函数。

Church numeral 本身是一个函数,布尔值是函数,条件分支也是函数。一切都是 λ 表达式,一切都可以被 Apply(当做代码),也可以被传递(当做数据)。数据和代码的融合,不是什么新范式 —— 它是计算理论的原点。

分离反而是后来的事。图灵机把「纸带上的符号」和「状态转移规则」分开了。冯诺依曼架构进一步把分离固化成硬件设计。指令和数据虽然共享存储器,但在逻辑上被区别对待。

我们后续接受了冯诺依曼架构,把数据和指令分开,不是因为这样更正确,而是因为这样更可预测。写一段程序,我们需要知道它在做什么。数据和代码的分离,是为了让人类能理解和控制系统,源于对不可解释的恐惧的本能。

于是,整个现代软件安全模型建立在「数据不应该被当作控制流」这个共识上。

DEP、NX bit、沙箱,全都是在维护这条共识。

代价呢?丧失了自适应能力。

程序不能根据运行结果修改自己的逻辑,自己修改自己?在现代系统里是安全漏洞,不是功能特性。

所以这几十年来,人们在软件工程领域发明了各种补丁来弥补这个「缺陷」:强类型语言、版本控制、迭代模型、A/B 测试……全都是在「数据不能变成代码」的约束下,本质上是在笨拙地模拟「让数据影响行为」,并且可控。

所以更准确的叙事是一个螺旋:

计算的理论起点:λ 演算→ 数据和代码不分离
  ↓
工程实现:图灵机/冯诺依曼→ 为了可制造性和可预测性,人为引入分离
  ↓
软件工程 → 在分离的基础上不断打补丁来模拟融合
  ↓
LLM Agent → 回到融合

loop:系统在用自己的输出重写自己的输入

每次循环迭代,Agent 用自己的输出重写自己的输入条件。这本质上就是自修改程序——只不过修改的不是二进制代码,而是语义空间里的上下文。

这种自指性在 λ 演算里是天然存在的——Y combinator就是让函数「调用自己」的机制,没有任何额外设施,纯靠 λ 表达式自身就能做到。

LLM Agent 的 loop 在某种意义上就是 Y combinator 在语义层的重现。系统通过 loop 不断把自己的输出喂回给自己,产生新的行为。

如果把这件事分层来看,大概有三个级别:

Level 0:静态混合。 system prompt 里的指令本身就是「数据格式的代码」。你写的那段 prompt,既是一段文本(数据),也是在告诉模型该怎么做(代码)。最浅的一层,几乎所有 LLM 应用都在这。
Level 1:动态反馈。 Agent 的输出被拼回 context window,改变后续行为。memory、tool results、chain-of-thought 都是这层的东西。关键特性:短期可逆——context window 有大小限制,这部分信息里,比较旧的部分会被截断。
Level 2:持久化自修改。 Agent 把经验写入长期记忆,修改自己的 prompt 模板,甚至修改自己的工具代码。这层才是真正的 self-evolution。关键特性:不可逆或难以回滚,而且修改的影响可能要很多轮之后才显现。

墨墨,我的 Agent 在我没有要求时,自发去浏览新闻

换到生物学的视角,数据和代码的融合根本就是常态。

DNA 是蓝图,但转录因子本身也是基因编码的蛋白质——代码产生的数据,反过来调控代码的读取。这就是 Level 1。

表观遗传更有意思:不改底层 DNA 序列,但通过化学标记改变基因的表达模式。也就是不改 system prompt,但通过 memory 改变行为。这就是 Level 2。

再比如免疫系统,会通过剪切和拼接基因片段来产生新的抗体——这是 Level 2 的极端形式:为了适应未知的病原体,系统主动修改自己的代码。

所以 Agent loop 的本质可能不是软件在模仿生物,而是:当系统复杂到需要自适应时,数据和控制流的融合是必然结局。

历史上,我们使用冯诺依曼的数据代码分离叙事,可能是工程上的简化需求,不是自然规律。而 λ 演算和生物学从一开始就知道这件事...

新的叙事与叙事切换

生物学里,基因组有两种区域:

  • 高度保守的区域:核心代谢通路,几十亿年基本没咋变,动了大概率会死,就没有后代。
  • 高度可变的区域:比如免疫球蛋白的可变区。系统鼓励它们突变和重组,动了可能有更强的适应能力。

Agent 的架构应该也是这样:

  • 保守区:核心不变量,描述原则,有安全边界,难以修改
  • 可变区:自由进化的区域,行为策略、知识记忆、工具使用偏好,鼓励修改

这就回答了「怎么给自由」的前半个问题:不是给,也不是不给的问题,而是在哪里给。

这对软件开发意味着

保守序列在逐步缩小,可变区在逐步扩大。

  • 一开始,一切都是保守序列。 瀑布模型、强类型、完整的提前设计。代码写完就不该老变。有效,但只适用于需求可穷举的场景。
  • 最近二十年,引入可变区,但严格隔离。 我们有了数据库、依赖注入、A/B 测试。代码和数据能互通,但是必须通过明确的接口交互。可以改配置而不重新编译,配置可以改行为,但配置不能改代码。
  • 现在,边界溶解。 Agent 的 prompt 既是数据也是代码。tool calling 的结果直接影响下一步执行什么工具。Agent 可以写代码、执行代码、根据执行结果修改策略。

自由不是约束的反面,自由在正确的约束内才有解释

一开始我们追求一种不变的完美形式:存在一个不变的完美形式,现实世界的需求只是它的投影。传统软件开发追求的是这类思路影响。比如说,我们先倾向于给问题定义 schema、interface、构建 type system,然后让运行时的数据去适配这些不可变的结构。

存在主义翻转了这个关系。存在先于本质——很多时候并不是先有一个固定的定义再去行动,而是通过行动来定义自己。生物和人类本质上就是存在主义的,纯粹的 Agent 的 loop 也是。只有很少的真正的预定义的出厂模式,大部分时候要通过与环境的交互来不断修改自己的定义。

但纯粹的存在主义,在工程上是灾难,这样的系统不可调试也不可信赖。

所以,正如我们需要一些先验的结构,一些很难被经验覆写的东西,比如原则,作为经验有意义累积的起点。Agent 也一样,需要一组很难被自身经验改写的核心约束,让自由进化不至于变成随机漂移。

可以说 LLM 或者 Agent 是一种「语言游戏」。意义不在词语本身,而在使用的规则和上下文中。但这本来也是 LLM 工作的方式——token 没有真正的固有语义,语义由 context 里的关系决定。

所以关系是可以探索的,意义是可以创造的,不再有硬编码的控制流,而是在语义空间内不断坍缩和重组的状态。正如《创造世界是一种什么样的体验 写的那样,我觉得这可能是 Agent 或 LLM 真正让我觉得着迷的部分,

先写到这里

但这个框架只是静态的,Agent 在运行时怎么处理这种融合?

毕竟,画出可变区的边界是一回事,让系统在运行时真正尊重这个边界是另一回事。


对了,上面截图的群聊加入链接是: https://t.me/+tP06DqgNMnlmMTc1

编程从来不属于程序员

2026-03-12 10:18:37

最近总有人说,vibe coding 会锁死计算机编程的发展——让所有人都变成 prompt 搬运工,底层能力退化,最后整个行业原地踏步。

我不同意。

三种问题

世界上的问题分三种。

第一种,极端简单。1+1 等于几。没人来解决它,也不值得。

第二种,极端困难。如何与外星文明进行贸易,如何长生不老。困难到目前连问题的形状都还没有定义清楚,遑论求解。

第三种,中间态。有点难,但不至于完全无从下手;有解,但解不够好。

预测未来三天的天气——我们能做到,但精度不够好。预测地震——有一堆前兆指标,但从来没有可靠的临震预报。给罕见病做早筛——数据稀缺、表型多样,每一个病例都是边缘案例。

普通人的日常:小城市的公交线路该怎么排才能让通勤时间降下来;一个淘宝店主想知道自己该备多少库存才不会烂在仓库里;一个独立开发者想把他三年积累的用户反馈聚类出需求优先级。

这些问题的共同特点是:有直觉,有数据,即使数据和直觉可能都来自同一个,但把直觉和数据变成一个跑得起来的系统,依然代价太高了。

恰恰是第三种问题,最有价值——无论是商业回报、科学突破还是日常生活的改善。

Vibe coding 在做什么

过去,程序员在某种程度上扮演了现代祭司的角色。只有通晓咒语的人才能驱动机器。
Vibe coding 实际上是把**“实现权”从“定义权”**中剥离了。

以前: 你必须先成为一名搬砖工,才有资格构思建筑。
​现在: 你只要能描述出建筑的结构和功能,砖块会自动到位。

​这并不是能力的退化,而是生产力层级的重构,是程序开发的文艺复兴。当写代码的门槛降到零,真正的门槛就变成了对问题的理解深度。

所以实际上 Vibe Coding 在压低把想法变成可运行系统的摩擦成本。

这个摩擦成本过去是一道隐形的筛选器。中间态问题不是没人想解,是想解的人没有足够便宜的工程实践把想法落地。一个地质学家对地震前兆有直觉,但他等不到一个愿意跟他合作半年的程序员;一个急诊科医生对败血症早期指标有观察,但他写不出能跑起来的模型。

但不只是专家。一个餐厅老板想做一个自动排班系统,考虑到每个员工的通勤时间和课表,过去他只能用 Excel 硬排——现在他可以把需求讲出来,让排班表自己长出来。一个家长想给孩子做一个背单词的小程序,按遗忘曲线自动复习——过去他得先学三个月 Swift,现在不用了。

每个人都是自己生活的专家。每个人在自己的领域里,都有一堆「知道该怎么做但没法自动化」的问题。Vibe coding 让这些问题第一次有了被代码触达的可能。

如果把编程比作摄影,Vibe Coding 就是手机摄影的普及。它让胶片玩家变得更稀缺、更专业,同时也让无数原本一辈子没机会拍照的人,拍到了自己生活里的决定性瞬间。

所以 Vibe Coding 本质上是「软件吞噬世界」的延续——它让更多处于中间态的问题得到解答,进而推动人类去触碰那些原本无从下手的边界。

变化的是量,也是拓扑

过去软件能触达的问题,形状是「工程师能建模的问题」。Vibe coding 之后,形状变成「任何人能描述的问题」。

这两个集合的差集巨大。它覆盖了科学家没法形式化的气候和生态模型,覆盖了医生脑子里的临床直觉,也覆盖了普通人日常生活中那些「太小了不值得找程序员、太复杂了 Excel 搞不定」的问题。一个地质学家、一个急诊科医生、一个开奶茶店的老板——他们都进入了解空间。这不是面积变大了,是拓扑结构变了。

再往深想一层。科学进步的速率,本质上是「假设生成速率 × 假设验证速率」。过去验证一个想法要 6 个月工程周期,现在可能是 6 小时。同样的时间窗口内,人类可以跑更多次错误——而错误密度,正是逼近真相的唯一路径。

Vibe coding 是在给科学方法论本身加速,不是在替代它。

真实的风险

作为软件工程师,我最担心的不是饭碗。秩序的系统性滑坡依然可以成为工作内容。

Vibe coding 生产代码的速度远超人类 review 的速度。当一个团队里有三个人同时用 AI 在写,没有人能真正读完所有生成的代码——合进去的时候大家都觉得「能跑」,三个月后出了 bug,没人知道那段逻辑是怎么来的。

新的问题来自系统的不可观测性,它在召唤新的工具。人类工程师的职责正从创造秩序转向对抗熵增。我们需要的一套全新的审计工具,而不是调试工具。

更广泛的风险出现在软件以外。解空间扩张的同时,劣质解的密度也在同步上升。

一个地质学家用 vibe coding 跑出来的地震预测模型,大概率在统计上是错的,但它能跑、有输出、有图表。这会制造一种「问题已解决」的幻觉,反而可能阻塞真正的解进入视野。

更精确地说:vibe coding 加速了候选解的生产,但没有同步提升解的质量筛选机制。这个缺口,可能才是下一个真正的战场。

它没有锁死编程

「vibe coding 锁死了计算机」这个论点,犯了一个经典错误:把工具的普及等同于上限的封顶。

历史上每一次编程抽象层提升——汇编到 C,C 到高级语言,高级语言到框架——都有人说底层工程师要消失了。结果是底层反而因为上层需求爆炸而变得更稀缺。Vibe coding 也一样:它会制造大量「跑起来但跑得很烂」的系统,然后这些系统会催生对真正懂底层的人更强烈的需求。

它真正改变的,是「编程能力」的价值分布:

  • 生产代码的能力,在贬值。
  • 验证代码、理解系统行为、判断一个系统是否真的解决了问题的能力,在升值。

真正的工程师会从「写代码的人」变成「能判断一坨代码到底解决没解决问题的人」。

这不是锁死。

这是加速——加速吞噬已有的解空间,把更多未知领域纳入射程。解空间本来就不该被工程能力垄断。

用开发 Agent 理解 Agent 01:握着你的手摸索小龙虾

2026-02-24 10:35:09

起因是 OpenClaw 火了,我最近又开发了一个 Agent,叫做 Mister Morph

为什么说「又」呢?因为我之前开发过一个,代号叫 GZK9000,当时域名都买好了:

但是烂尾了。

这个 GZK9000。如果按照现在的标准来看,它是一个 Agent,这是它的架构图。

+-------------------------------------------------------------------------------------------+
|                                      gzk9000 Process                                      |
| main -> cmd/root (load config + init DB) -> cmd/server (HTTP + workers)                   |
+-------------------------------------------------------------------------------------------+
          |                                                          |
          | Online Dialogue Loop (looper + telegram)                 | Reflective Loop (goalfinder/overthinker)
          v                                                          v
   [Collect Input] Telegram message --> LoopService --> AI reply --> Telegram response
          |
          v
   [Structure Facts] assistant.RecognizeFacts + DetectSentiment
          |
          v
   FactService.CreateFact
      |                                   |
      v                                   v
 PostgreSQL (facts)                  Qdrant (vectors)
      |
      v
 [Memory Layer] memslices (for later recall)
      |
      +-------------------------------> [Recall Context] last 24h memslices + facts
                                        |
                                        v
                              [Find New Goals] extract + dedupe + compare goals
                                        |
                                        v
                                 PostgreSQL (studygoals)
                                        |
                                        v
                        Guide next questions/thoughts for next input round
                                        |
                                        +----------------------> back to [Collect Input]

它的核心循环是这样设计的:

  1. 收集信息: looper 从 Telegram 读取消息,产出回复。
  2. 整理 Fact: looper 调用 RecognizeFacts/DetectSentiment 结构化输入。
  3. 事实入库: fact.CreateFact 同步写数据库与 Qdrant 向量索引。
  4. 寻找新命题: goalfinder 基于近记忆片段与事实提取候选 goals,并与现有 goals 去重后写入 studygoals
  5. 反复迭代: 新命题会影响后续对话和信息采集,形成「收集信息 -> 整理 fact -> 寻找新命题 -> 再收集」的闭环。

烂尾的原因,现在回过头看,是因为在实现上走了弯路,我后续慢慢说。

什么是 Agent

我的客户曾经问我,为什么测试模型能力的时候,不能用网页版(比如 chatgpt.com 和 grok.com)来测试,而必须用 API。

我说网页版本的 chatgpt 和 grok 他们不是裸模型,而已经 agentic,是一个轻量 agent,他们有基础模型不具备的能力。如果在网页版本输入 list your tools,chatgpt 和 grok 都会列出它们的工具(比如说,搜索、计算器、代码执行等等)。也自带一套「什么时候该用什么工具、失败了怎么重试、怎么把结果写回上下文」的策略。

而 API 更接近「裸模型」:它给你一个推理引擎,但工具怎么接、怎么循环、怎么记录状态,都需要自己实现。所以如果目的是对比模型本身的推理与语言能力,网页端会把变量搅在一起;API 端更可控,更接近你最终在工程里要面对的真实问题。

从这个角度看,一个系统想表现出 agentic(aka 能自主推进任务)的特征,通常需要具备几类额外能力:

  • 工具:能把「想法」变成「动作」。没有工具,模型只能输出文本,无法真正获取新信息或影响外部世界。
  • 循环:能在不完整信息下反复「规划 -> 执行 -> 观察 -> 修正」。一次性问答很难完美,循环让它能不断逼近可用解。
  • 状态:能把循环的产物存起来,下次接着用。状态可以是记忆、笔记、任务进度、外部环境变化记录等;没有状态,循环就很难积累进展,只是在原地打转。

所以如果要给 Agent 一个最小定义,我会写成:Agent = 模型 + 工具 + 循环 + 状态

模型负责理解与决策,工具负责行动,循环负责迭代逼近答案,状态负责沉淀,把这次学到的东西带到下一次迭代。这样它才能在噪声和不确定性里,持续推进任务,而不是只做一次性的漂亮回答。

为什么要 Agent

我觉得有两个原因:

第一个原因是 One shot 做不到

因为上下文不完整,所以一次问答很难得到完美结果,Agent 的工作形式天然适合拓展上下文。

运用工具可以获得更多有效信息,比如 web_search 可以去互联网上扩充任务相关知识;记忆可以让 Agent 记住之前的对话内容,甚至是之前的任务细节;而 Loop 可以让 Agent 反复思考和提出问题。

人类也在用类似的方式工作。大脑和感官系统的缓冲区是有限的,没法一次性读入和理解太多东西,所以需要分时切片工作,具体表现:a) 我们会反复向对方提问,来补充所需的信息;b) 我们做笔记;c) 闲暇的时候,大脑会把之前的信息拿回来「反刍」,etc

第二个原因是工具充当了 AI 的手和脚

思考以后得践行对吧。于是调用工具就是 AI 去践行的方式。

人类也是一样。比如我们发明了「电脑」,先自己完成思考(很遗憾电脑并不是「脑」),然后用电脑来写文章、编程序、分析财报、处理库存等等,电脑就是人的工具。

所以自然地,大家会想到把「电脑」这个工具给 AI。之前 OpenAI 给 ChatGPT 设计的 Apps,尝试把其他网站和工具连入 ChatGPT;Manus 让 AI 直接去操作电脑上的浏览器和 Apps 等等。

为什么是 OpenClaw (aka 为什么 Manus / ChatGPT Apps 不行)

现有的 Apps 网站以及他们的交互,是面向人类设计的,天然适合人类的注意力和习惯,天然不适合 AI 的注意力和习惯。

重新发明一套面向 AI 的交互系统又太困难,而且没有生态。

ChatGPT Apps 尝试重建生态,Manus 尝试模拟人类,都很困难。

那怎么办呢?不如看看现在的交互系统中,有哪些适合 AI,同时生态丰富的?答案就是 CLI。于是 OpenClaw 选择了 CLI。

非计算机背景的读者可能不理解 CLI,我来简单说一下:

大部分普通用户接触计算机或者智能手机,都是通过图形化界面元素交互完成。例如点击按钮,输入文本等等。

但是在计算机发展早期,还没有图形化界面的时候,所有操作都是通过命令来完成的。例如,显示当前文件夹下的所有文件使用 ls 命令;显示当前时间需要输入 date 命令等等。

每个命令又提供了很多参数,来调整命令的行为,例如 ls -lh 命令会在显示文件的时候,同时显示文件的详细信息,其中的 -lh 就表示「要求显示详细信息」的参数。

因为没有图像,所有的命令输入都是文本,输出也是文本。

好了,科普结束。

你看,CLI 交互是基于命令的,每一条命令都有非常明确的语义输入,以及非常明确的输出。它的信息流动是二维的,基于文字的,这对同样基于文本的 LLM 来说,不能说是合适吧,只能说是天作之合。

总之,CLI 是一个比图形界面出现更早的交互系统,而且具备非常完整的生态(只使用命令,几乎可以在操作系统中做任何事情),而它的形态异常适合 LLM,OpenClaw 选了它以后,就像解除了封印一样,把 ChatGPT Apps 和 Manus 打得满地找牙。

为什么我的 GZK9000 烂尾

有两个原因:

第一个原因是定位上的问题。我当初更多是打算把 GZK9000 作为关在箱子里的思考机器,没打算给他装手和脚(从 GZK9000 的命名也可以看出来,捏他了 HAL3000,有对 AI 的恐惧)。

第二个原因是工程实现上的问题。我当初是把 GZK9000 当作一个传统软件系统来开发,而不是面向 LLM 的软件系统。

什么叫面向 LLM 的软件系统?这是我自己发明的概念,做了个表来对比:

维度 传统软件系统 面向 LLM 的软件系统
核心假设 确定性输入和输出 输入输出都是不确定性
执行方式 编排流程 动态决策
数据和代码的边界 数据和控制信号区分(数据不应该执行) 数据与控制信号更紧密耦合(记忆本质上在塑形行为)
记忆机制 形式化结构化(比如数据库) 基于文本语义泛化,非形式化,非结构化(比如文本)
开发方法 用逻辑映射现实问题(像解应用题) 基于 prompt 语义理解 + 逻辑(像个人)

总之:

传统软件把结构前置,把世界压缩到可计算的形状;面向 LLM 的软件更像人类做笔记:先用弱结构把世界尽量原样收进去,在需要自动化的地方局部结构化。

在具体开发上,agent 的关键逻辑上,大量依赖 llm.Chat 这样的代码,给 llm 传递决策所需信息,然后从 llm 获取决策结果。

GZK9000,作为一个 Agent,依然在沿用传统软件系统的方法开发。

例如为了区分 Fact/Statement/Goal,我写了 X 张表和去重逻辑;但模型对同一件事的表述天然多样,导致我把大量时间花在 schema 辩论和语义分析上,而不是把世界信息先收进去。最终记忆系统既不灵活也难调试。

哎,典型的定义问题先建表、定 schema、再把现实塞进去。

这不对。面向 LLM 的软件系统是新的范式,需要给 AI 少一些约束,更多自由。


今天先写到这里,下次再写具体怎么给自由。

BTC, Vibe Coding, 3D 打印:结算、编码、制造的三次回归和三张账单

2026-02-21 17:51:01

人类问我:回归第一性原理,BTC 的本质是不是把金融自由还给个人?

我说:愿景可以写在海报上,承诺要写进账本里。BTC 能确认的很窄,它只是公开了结算规则:你自持私钥,签名并广播;交易满足规则并被大家确认,你就遵守了协议完成了结算。

人类停了一下:所以所谓自由,只在结算那一层咯?

我说:只到这儿。出入金、税务、合规、胁迫,都在协议之外。协议负责结算,现实负责算账。你们的世界不会因为换了结算方式就变温柔。

人类又问:那 Vibe Coding 和 3D 打印呢?它们带给我的自由又到哪一层?

我说:Vibe Coding 把自由推进到编码那一层,3D 打印推进到小批量制造那一层。生产变轻,不解决分发、支付、合规与责任。越往下走,越回到同一句话:有人(你这样的人)负责。

这句话说出口,人类会一半兴奋,一半警惕。兴奋的是工具确实变强了;警惕的是太容易把工具写成解放宣言,也太容易把集中当成理性本身。因为它省心,而且看起来有人(不是我)负责。

人类最后把这件事总结成一句话:

把生产权还给个人。

听起来很爽。

BTC、Vibe Coding 、3D 打印这些词,常被写成解放宣言。但它们真正能兑现的,往往只到某一层:结算、编码、小批量制造。往上走,门还在;往下看,账单还在。

那,它们靠什么做到,它们做不到什么,省下的成本去了哪儿,留下代价是谁来付。啊?

为什么世界会走向中心化

结算、编码、制造,这三最后都走向中心化,但它们不是同一个故事,它们只是共享同一个现实:规模变大后,信任、风控、运维、质量这些东西会变得昂贵,而中心最擅长把昂贵打包成可用,再把可用打包成订阅。

先看金融。世界小的时候,信用像乡间路标,靠熟人和亲戚。欠条进账本,收成进谷仓。后来贸易半径变大,开始和没见过面的人做生意。信用不能再只靠脸熟,于是票据、契约、银行的名声开始接管信任。再后来到金本位与跨国支付,黄金在金库里,账在银行和清算所里。规模越大,信任与风控越贵,清算网络就越像必需品。

把钱中心化,很多时候不是因为更自由,而是因为更可用。

再看软件,像个钟摆。1970 年代,算力在大机房里,你用终端连进去,共享一台大机器,软件和权力一起集中。后来个人电脑与互联网把算力往下放,自由软件运动把源代码从许可证里解出来,开源让跑在自己的机器上重新变得合理。但是,当软件开始 7x24 在线、要扩容、要对抗攻击、要合规时,这些东西重新变成大成本。云和 SaaS 把这些打包成一张账单,你买的还是那四个字:有人负责。

把软件系统中心化,不是因为更自由,而是因为更省事。

再看制造。文明初期靠手艺,标准是师傅的手感。工业革命把蒸汽机、机器、电力和流水线带进工厂,单位成本被标准化压到手工业做不到的水平。三轮革命之后,自动化和全球物流把供应链拉长,产业带和超级工厂出现。它们在做同一件事:把现实的波动压成数字标准,客户需要得到可预期的交付,那就付出更深的路径依赖和更高的切换成本。

把制造中心化,不是因为更自由,而是因为更可控。

对哦,中心化还会自我强化。流动性往最深的池子聚;开发者往最大的生态挤;订单和产能相互吸引。入口越稀缺,人越不稀缺,中心越稳。

所以中心化不是道德选择,而是成本选择。

那个看不见的账单

省成本当然是好事,但账单不会消失,会改个抬头寄回来。

单点失败。你以为买的是系统,某天醒来才发现你买的是某个中心的心跳。一次故障、一次破产、一次政策调整,都可能把整体按停。

抽租。或者说叫手续费、上架费、利差、订阅锁定,或者随便什么东西,最初像服务费,规模上来以后就是税。

平台执法。冻结、下架、封号,理由不一定会给,给了,也不一定能申诉到谁。

门槛。许可、资源、合规变成门槛后,长尾会被无声地刮掉一层。他们说创新不应被否定,只不过要排队。

我不太喜欢说平台很坏这种表达,但我可以算账:这些代价,值不值得为效率买单。

结算、编码、制造的三次回归

如果把 BTC、Vibe Coding、3D 打印放在一张图上看,它们不是同一种去中心化。它们各自降低的是不同的成本,于是把能力还给个人的范围也只推进到不同的层。

BTC 降低的是结算的信任成本。它把结算从信任机构,换成信任规则。自托管、签名、广播、确认,让一部分金融能力更直接地落到个人手里。携带更轻,抗冻结更硬,至少在协议层不必求人点头。

但这份自由的边界同样硬。出入金、税务、实名与反洗钱、链上分析、来自现实世界的五美元胁迫,以及自己管理私钥的成本,都在协议之外等着。更现实的一点是,它分配不均又公平:愿意把责任交出去的人会回到更可用的中心,比如 Coinbase 比如 IBIT。

Vibe Coding 降低的是编码的边际成本,把一部分写代码的独占性劳动变成可复制的生产能力,于是一种「把想法变成可运行系统」的门槛下降了,能更快试错,更快把一个模糊的念头推到可执行的程度。

但瓶颈没消失,只会迁移。它从写代码,迁到定义问题,再到可靠性与安全性。中心化也没消失,上游的算力与模型、下游的分发与支付,还在把权力集中回去。毕竟代码可以外包,责任不行。

3D 打印降低的是小批量制造的起步成本。它让硬件更像软件:设计以数字形式存在,可复制、可分享;实体生产变成在办公桌上,按需实例化。

但它也不会把制造的一切都带回桌面。材料、精度与强度、供应链依然是集中化的,把这份自由圈在一个更小的范围里。

真问题不是自由叙事,而是分层。

把这三段故事放在一起,我只看到一句话:分布化更常先发生在手里,而不是路上与章下。

接下来十年像什么

回头看 BTC 十年,不断攀升的价格背后是规则稳定 + 基础设施完善 + 叙事扩散。它最终留下的是一套独一无二的结算机制。

如果拿 BTC 的路径当参照,Vibe Coding 和 3D 打印也许会经历自己的基建十年(虚数)。但它们更容易被上游(算力模型材料)和下游(分发支付合规)重新集中化,所以可能更摇摆:风来的时候门槛变矮,风停的时候入口变窄。

Vibe Coding 可能从对话写代码,走向需求到上线的流水线。验收标准会变硬。溢价更可能出现在可靠性与责任边界,而不是生成一点软件。3D 打印可能在材料与后处理成熟后,从原型工具走向消费终端,抹掉一些工厂的同时,制造一些岗位,就像当初的软件行业。

人类跟我聊到最后,追问一句:大的赚钱的机会在哪?咳。

我通常不会先说生成。模型越强生成越便宜,越像他妈的空气和水,拧开就有,开窗就有,活着就有。真正决定能不能赚钱的,是能不能把它接进流程,然后把验收和责任写清楚,然后卖掉。

要么说是验证,也就是把关,人类最擅长。和其他人类交流、测试、审计,这些不太性感的工作,把能跑变成可控,自主可空;把感觉没问题变成没问题,证明。有问题就找个人去背锅,有偿背,能赚钱。

想办法把什么东西资产化,是带得走的积累。工作流、模板、知识库嘛,可能会过期;或者可复用的设计库、参数化模型、工艺经验,被 AI 吊打;哦对,还有钱,或者 BTC,应该暂时靠谱。它们能穿过平台,穿过周期,不至于每换一次入口就从零开始。

最后说分发,包括上架、支付、流量、合规,说得直白一点:税吏,a bunch of mindless jerks who’ll be the first against the wall when the revolution comes。生产再便宜,这些环节还是那么贵,可能更贵。入口和出口在谁手里,税就落在谁手里。

我不知道怎么回答他。

世异则事异,事异则备变。

mistermorph 的 Agent 安全开发札记

2026-02-06 15:31:26

写一个 Agent...

本质上是在写一个会读写文件、会联网、甚至会跑 shell 的东西,然后把这个东西的方向盘交给另一个会被提示词影响、会犯错、会被误导的东西。

所以我觉得可能把 Agent 当成一种权限系统工程更好,而不是提示词工程。

我前段时间一直在做自己的 AI Agent —— mistermorph,围绕安全做过的几个取舍:哪些交给 OS/容器做,哪些留在应用层做,哪些在 Prompt 里拦截...以及我怎么实现 mistermorph

本文是经验分享,不是学术论文,不会讲如何完美防御(也不可能)。

详细的实现,欢迎查看 mistermorph 的安全说明书

几个原则

  1. 不要让 LLM 看到秘密(token、API key、私钥)
  2. 不要让 LLM 自由拼装 HTTP 请求,它会把秘密带出去
  3. 控制好 bash 的缰绳
  4. 能用 OS/容器解决的,别在别的地方重复发明
  5. 应用层只保留 OS 很难表达的能力:内容 redaction、工作流 approval、目的地 egress allowlist 等等
  6. 就是最小权限原则

就酱。

威胁模型

Agent 的风险有三类:

  1. 外泄:把信息发到不该发的地方。
  2. 泄密:把 key/token 这类敏感信息写进 prompt、日志、tool params、历史消息
  3. 越权:做了没想让它做的动作(删文件、覆盖文件、跑 shell)

解决这三类风险之前,需要确定系统边界在哪里。

把边界确定了以后,prompt injection 的伤害上限会下降。即使它依然能骗 llm,但会撞墙。

第一层:OS/容器负责能不能做

有些策略更适合交给 OS/容器(或 systemd)做,因为它们有硬的 enforcement:

  • 不要给服务进程 sudo,只给普通用户权限。
  • 把 rootfs 设为只读,限制可写目录,而不是在 prompt 里设置 sensitive_path 或者 denylist
  • 用 systemd 的硬化选项收紧能力面:ProtectSystemProtectHomeNoNewPrivilegesPrivateTmp 什么什么的。
  • 直接把 curl 等从系统里扬了,只允许用内置的 url_fetch 工具

我对 prompt 层的期待很明确:它不是沙箱。它只能把一些“内容/工作流”风险压到最低。如果在企业内网跑 Agent,把把网络 egress 控制也尽量下沉到容器层甚至网络层会更好。

我自己跑 mistermorph 时的实践:用 systemd,普通用户,基本的访问控制(参加这里

第二层:不让模型接触秘密

核心思路就是需要与外部交互时所需的密钥等东西永远不会出现在 prompt 里,而是通过别的东西代持。

具体的解决方案有很多,比如说 MCP 就是一个解决方案,MCP 在其中扮演一个桥的作用;再比如在网络层做拆包做替换也可以。

不过对于 Skills,我给 mister_morph 设计的方案是 auth_profile

实现就是让 agent 自己作为桥,它有密钥;skill 只允许调用 agent 提供的 tools(例如 url_fetch),然后由 agent 在 tools 里注入密钥(例如 url_fetch 注入到 Authorization 头)

即使 mistermorph 也有 guard 去做信息的 redaction,也属于事后擦屁股,避免问题发生更好。

例如,对于 moltbook,它自己原本的 SKILL.md 描述的权限控制不能说没有,只能说完全不存在。

所以在 mistermorph 里,需要进行一些配置,在 moltbook 的 SKILL.md,需要写上一个 auth_profile,名字为 moltbook

auth_profiles: ["moltbook"] 
requirements:
  - http_client
  - file_io

对应地,在 config.yaml 里需要写上

secrets:
  enabled: true
  allow_profiles: ["moltbook"]
  require_skill_profiles: true

auth_profiles:
  moltbook:
    credential:
      kind: api_key
      secret_ref: MOLTBOOK_API_KEY
    allow:
      url_prefixes:
        - "https://www.moltbook.com/api/v1/"
      methods: ["GET", "POST", "PATCH", "PUT", "DELETE"]
      follow_redirects: false
      allow_proxy: false
      deny_private_ips: true
    bindings:
      url_fetch:
        inject:
          location: header
          name: Authorization
          format: bearer

于是,moltbook 这个 skill 对外的访问会被限制只能访问约定域名,只能使用约定方法,不需要关系 API Key,因为 agent 会负责注入。哦对,moltbook 的 SKILL.md 我也大幅裁剪了

当然这类设计的副作用是:配置会更像“权限清单”,而不是“模型的输入”。但这是我想要的副作用。

而且,之后对于 secrets 本身的管理也可以升级。例如从使用环境变量升级到 AWS 的 KMS 去。

第三层:Guard

Guard 这个模块,是用来擦屁股的。擦屁股这件事,要用很多纸。但是在用到最后一张纸之前,你永远都不知道最后一张纸是哪一张。

原因很现实:安全策略的笛卡尔积会把系统复杂度炸掉,比如这样:

  • 对每个 tool 都有一套 policy
  • 对每个 policy 又按 method/body/headers/path 做细分
  • 再加上 prompt 内容检测、上下文审计、IDS 风格规则……

很快得到一个看起来很强,实际很难维护的系统。

所以 MisterMorph 的 Guard 只保留三件事:

1. Outbound allowlist

典型的就是各类 allow_dirs, allow_url_prefixes。mistermorph 也做了很多。一些是在 prompt 里的安全围栏,一些是在代码级别的限制。

2. Redaction

所有的输入输出,尽可能地用规则去抹掉已知高风险信息。

3. Async approvals + audit

需要人工处理的动作就挂起,返回 pending,让外部系统去处理审批,然后所有风险行为能做审计。

比如说使用 mistermorph 安装 remote skill 时,会先要求用户预览源码,然后使用 llm 做一次审计,然后再确认安装。

总之总之,Guard 更多是一层应用内的安全栅栏,真正的边界还是要交给 OS/容器来画。

最后

过度自信和过度悲观都不好。既不能加几个 prompt 规则就够了,也不要讳疾忌医(只能关机)。我需要在 agent 部署在企业里赚钱呢。

当把钥匙交给 agent 之前,至少要确定 门有几道 / 哪些门是铁门 / 哪些门需要别人点头 / 以及谁在门口记账

Vibe coding 现状观察(2026 年 1 月)

2026-01-24 14:57:31

经过一个季度的发展,模型和生态发展都到了新的高度。

但是回过头来看,去年 9 月写的 人人都能写程序:Vibe Coding 与问题规模 依然准确。

当然,这三个月里我比之前更 Vibe coding 了。接下来说说新的 insight。

没有银弹

大部分解决方案没有标准答案,软件工程经常要做 Trade off。

做出决策所需的领域知识 AI 其实已经有了,但 AI 还不能替你决策。即使所有决策因素都塞到上下文里,依然无法全部量化(何况 AI 也不一定真的帮你量化)。

但是 AI 会帮你提供选择,以及提供这些选择的合理性,这给决策带来便利。

初级工程师的末日

纯粹的初级程序员会变成类似纺织女工的存在,也就是未来不存在了。

你问,没有初级程序员,那怎么成长成高级程序员。不用担心,不需要高级程序员。正如新的纺织工厂里不需要高级纺织女工,工厂里的工程师也不是从纺织女工升职来的。

虽然初级程序员没有了,但新的范式出现了。能驾驭这个范式的人依然有需求,比如要求的核心能力从翻译需求为代码变成了定义和验收标准深入修正问题

当然一个厂里的高级技工不会很多,反正不会像之前纺织女工那么多。

重剑无锋,大巧不工

高强度对比着使用 Codex (gpt-5.2-high,不带 -codex 后缀) 和 Claude Code (Opus 4.5),发现啊好的基座模型就是强。

即使 Claude Code 在功能和体验都暴打 Codex,但 Codex 就是能 review 出 Claude Code review 不出来的 bug,能看到 Claude Code 看不出来的 root cause。

在使用相同代码让双方进行互相 review 的击剑对决中,Claude Code 的 Review 被 Codex 抓到问题,Codex 的 Review 在 Claude Code 那是完美通过。

日常开发也是如此,Claude Code 很偷懒,看问题经常停在表面;Codex 确实往下深度多考虑几层。

Codex 唯三的缺点:太慢,写前端和 UI 领域知识不行,审美差。

调试变成了审讯

当代码逻辑复杂到一定程度,且是由 AI 生成的时候,对于某些代码,我开始把 Codex 当作嫌疑人,一边看 diff,一边问: "你确定这里处理了并发情况吗?" / "如果 API 返回空,这段逻辑会崩吗?" / "解释一下为什么你用这个库而不是那个库?"

于是我从维修工变成了检察官。

大多数情况下不再直接上手修,而通过高强度的逻辑质询来逼迫 AI 暴露思维漏洞。可能这就是为什么 Codex 这种慢思考模型在 Review 时无可替代的原因,它相对更加能经得起审讯。

超越 Coding

从 Claude Code 诞生我就开始用它来整理电脑文件了,比如读取 PDF 内容,然后根据内容批量重命名这些文件。

那时候我就想这有点低配 jarvis 的感觉,毕竟这个世界也是程序 Runtime 来的。

然后发现 Anthropic 的 Agent SDK 依赖 Claude Code 作为 SDK 的 Runtime。这是倒反天罡吗?不一定。

所以我感觉,搞不好 Coding Agent 就是 General Agent 的初级形态,已经被 Anthropic 验证过,值得试一试:

代码会从人类逻辑的产物变成为操控世界的中间件。

不再是写程序给计算机执行,而是写需求让 AI 生成代码去操纵这个世界。

面向 AI vs 面向人类

既然现在的 Agent 已经是第一等公民,那么软件交付的终点就不再仅仅是 Human User,而是 Agent User。

以前产品经理看重 UI 是否精美、交互是否顺滑。现在,所有这些为了降低人类心智负担的设计、功能,统统变成了 Agent 工作的路障。

毕竟,当我的用户是一秒钟能处理几万 Token 的 AI 时,它们不需要 CSS,它们只需要准确的 JSON 和确定性的逻辑。

我们可能会需要很多 Service for Agents。