---
title: "别在图的生长阶段，就急着树化"
author: "Shawn Jiang"
lang: zh
date: 2026-08-26
canonical: https://tplog.dev/zh/essay/ai-engineer-capability-graph/
translations:
  en: https://tplog.dev/en/essay/ai-engineer-capability-graph/
  ja: https://tplog.dev/ja/essay/ai-engineer-capability-graph/
---

# 别在图的生长阶段，就急着树化

编程语言里的字符串，起初看起来几乎不值得设计。它不就是一串字符吗？把字符连续存进内存，再提供长度、拼接和下标访问，事情似乎就结束了。

C 语言里的字符串通常是一段以零字节结尾的 `char` 数组。`strlen` 计算零字节之前有多少个字节，`s[i]` 取出第 i 个 `char`。只处理 ASCII 时，一个字符对应一个字节，字符序号、数组下标与内存位置几乎可以看成一回事。

Java 希望更好地支持 Unicode，于是把 `String` 的公开语义建立在 UTF-16 编码单元上。`length()` 返回编码单元的数量，`charAt()` 取出一个 16 位的 `char`。对于常见字符，这仍然像是“一个字符占一个位置”；遇到基本多文种平面之外的码点时，一个码点却需要一对代理项。用户在屏幕上看到的一个字符，还可能由多个码点共同组成。

Ruby 选择保留更多视图。它的 `String` 保存一段字节及其编码，同时提供 `bytesize`、`length`、`each_byte`、`each_char`、`each_codepoint` 和 `each_grapheme_cluster`。同一个字符串可以按字节、字符、码点或字素簇观察，不必假装“字符”只有一种天然边界。

C 把字符串投影成字节序列，Java 把它投影成 UTF-16 编码单元序列，Ruby 则把多种投影同时暴露出来。这些设计都有自己的取舍，却都在说明同一件事：字节、编码单元、码点和屏幕上的字符不是几层稳定嵌套的容器，而是几种通过编码、组合与语言规则连接起来的对象。

真正昂贵的是取舍进入了公开语义。Java 后来可以改变 `String` 的内部存储方式，却仍要保留 `length()` 和 `charAt()` 的行为，因为已有程序依赖这些接口所承诺的关系。后来即使看见了更完整的世界，也很难再改。

我们常把这种问题称为“过早优化”。但优化只是表面，更深一层的问题是过早定型：对象和关系还在生长，设计者就已经选中一种关系，把它升格成唯一的组织方式。

## AI Engineer 需要什么能力

今天讨论 AI Engineer，也很容易走上同一条路。

我们习惯先画一棵能力树。根节点是 AI Engineering，下面分成模型、应用和基础设施，再继续拆出 Prompt、Context、RAG、Agent、Workflow、Memory、Tool、Sandbox、Eval 和 Security。每项能力都有自己的位置，一张学习路线也随之出现：先学什么，再学什么，学到哪一层才算合格。

这棵树很清楚，问题是 AI Engineering 本身还没有稳定下来。

Eval 应该属于模型能力，还是软件测试？Sandbox 是基础设施，还是 Agent 的执行能力与安全边界？Context Engineering 是 Prompt 的延伸、数据工程的一部分，还是产品理解进入系统的方式？Workflow 与 Agent 是上下级关系，还是两种可以组合的执行机制？

这些问题很难得到唯一答案，因为它们原本就存在多种关系。

模型能力决定系统能做什么，Context 决定模型能够看到什么，Tool 与 Runtime 决定它可以在真实环境中执行什么，Sandbox 和权限限制它能够改变什么，Eval 则检查最终结果是否值得信任。它们共同作用于一次交付，无法被干净地分进彼此独立的枝条。

AI Engineer 所需的能力不是一棵已经长成的树，更像一张仍在扩张的图。

## 过早树化会制造一条虚假的学习路线

能力树最容易带来的误解，是让人以为存在一条统一的学习顺序。

有人从模型训练开始，有人从 API 和产品开发进入，有人先处理数据、权限和部署，也有人在真实业务中先遇到评估问题。不同工作面对的约束不同，需要补齐的能力也不同。

开发 Coding Agent 的工程师，需要深入理解代码库、工具调用、Sandbox、任务状态与软件验证。做企业 AI 应用的人，更可能先处理业务流程、数据权限、身份、集成和评估。负责模型服务的人，则要关注推理、成本、延迟与可观测性。

他们都可以叫 AI Engineer，却不必共享同一棵能力树。

过早确定一条标准路线，会把当前最容易描述的能力放在主干上，把跨领域能力降成旁枝。学习者开始按目录收集知识，却不知道这些知识如何共同完成一次交付；团队也可能按分类划分责任，最后没人处理能力之间的连接。

树要求每项能力回答：

> 我属于哪一类？

但在这个领域仍然生长时，更重要的问题是：

> 它与哪些能力共同解决了什么问题？

## 先保留能力图，再生成学习树

这并不意味着能力树没有价值。

树可以降低认知成本，也适合为一次具体目标安排路径。想开发 AI 应用，可以从产品目标出发，生成一棵围绕 Context、Tool、Workflow 和 Eval 的学习树。想建设 Agent Runtime，则可以生成另一棵围绕执行环境、状态、权限、安全和可观测性的树。

这些树都可以使用，但它们只是从同一张能力图中生成的不同视图。

更合理的顺序，是先记录能力之间真实发生的关系：模型怎样影响工具选择，Context 怎样受权限约束，Runtime 怎样保存状态，Eval 怎样覆盖模型输出与最终业务结果。等目标明确以后，再选择当前需要的关系，投影出一条可以执行的学习路径。

图也不能无限生长。某些关系经过大量项目验证，开始稳定而反复地出现，就应该被固化成课程、接口、框架和角色定义。树所承担的承诺，应当与领域的成熟度相称。

探索阶段保留关系，学习和执行时生成视图，关系稳定以后再固化结构。

字符串留下的教训是：真正昂贵的，往往不是一开始多保留了一些复杂性，而是一个尚未理解清楚的关系，被过早写进所有人都必须遵守的接口。

下一次为 AI Engineer 制定学习路线时，可以先写明目标，再从能力图中挑选当下需要的关系。由此生成的树只服务这次目标，不必冒充整个领域的最终结构。
