从 Vercel 的 100 个 skills 看:一条业务流程要满足什么条件才能交给 Agent

2 阅读5分钟

一、数字背后的工程事实

先厘清可核实的部分:

Vercel COO Jeanne DeWitt Grosser 访谈口径(经 Tomer Tunguz 博客转述)
  - inbound 销售开发 90% 自动化
  - 团队规模 10 人 → 1.25 人
  - AI 销售开发智能体年成本:数千美元量级

内部工程侧(BestBlogs 转述 X @hongming731,单一二手转述,未见官方声明)
  - 开源智能体框架 Eve
  - 数据 agent D0 改用文件系统为中心的工作方式后,评估成功率翻倍
  - 沉淀约 100 个 skills,约 20 个 agent 达到 PMF

工程上真正值得注意的不是 10 → 1.25,而是**"约 100 个 skills"这个中间量**。

1.25 个 FTE 背后是 100 个可复用流程单元。这两个数字的比值说明了一件事:压缩人力不是靠一个通用智能体,而是靠把工作拆到足够细的粒度,再逐个固化。

二、一条流程可被 Agent 接管的最小条件

把 inbound 销售开发拆开,只有四个环节:

环节输入处理验收标准可否自动化
线索背景查询公司名/域名检索工商、技术栈、规模字段齐全且可溯源✅
线索分级背景数据套用评分规则命中/未命中阈值明确✅
开场邮件生成分级结果 + 模板填充与改写模板合规、无幻觉字段✅
深度跟进判断多轮交互历史综合评估无客观标准❌

前三步能被接管,是因为它们满足同一个条件:输出是否合格,事后可以被机器判定。

第四步不能被接管,不是因为它难,而是因为没有可计算的验收函数。"这个客户值不值得多花两周"——这句话无法写成断言。

所以判断标准可以形式化:

一个环节能否交给 Agent
  = 是否存在 verify(output, ground_truth) -> bool
    ∧ 是否存在明确的 input schema
    ∧ 是否存在稳定的处理规则集

三条缺一不可。现实中最常被忽略的是第三条——很多团队以为写了 prompt 就是规则集,实际上 prompt 里的模糊修饰("适当""根据实际情况")会让输出不可复现。

三、Skill 的结构:不是 prompt,是契约

"100 个 skills"如果按文件形态落地,一个最小可用的 skill 定义应当包含四段,缺一段就会退化成不可靠的 prompt:

name: lead_enrichment
version: 1.2.0

input_schema:
  company_domain: string      # 必填
  required_fields:            # 明确要求产出的字段
    - legal_name
    - employee_range
    - tech_stack
  optional_fields:
    - funding_stage

processing:
  retrieval:
    sources: [public_registry, official_site, tech_detector]
    max_retries: 2
  rules:
    - if tech_stack contains any of TARGET_STACK -> score += 30
    - if employee_range in [50, 500]            -> score += 20
    - if funding_stage in [B, C]                -> score += 15
  fallback:                   # 关键:定义检索失败时怎么办
    on_missing_field: mark_as_unknown   # 不是猜
    on_all_sources_fail: return NEEDS_HUMAN

acceptance:
  required_fields_completeness: ">= 0.8"
  no_fabricated_fields: true  # 未检索到的字段必须为 unknown,禁止生成
  traceable: true             # 每个字段需附来源

human_gate:
  enabled: false              # 低风险环节可不卡

三个容易被跳过的字段:

fallback —— 没有它,agent 在检索失败时会编造内容。这是生产环境最常见的事故源。

no_fabricated_fields —— 必须显式禁止填充。默认行为是生成,不是留空。

traceable —— 每个字段附来源,既是为了可审计,也是为了后续纠错时能定位到具体数据源。

四、为什么 D0 改成"围绕文件系统"后成功率翻倍

这条转述数据(单一二手来源)如果成立,工程解释是合理的:

文件系统的优势不在存储,而在它提供了确定性的状态与可回溯的中间产物。

上下文全在 prompt 里:
  [输入] → [模型一次性生成] → [输出]
  中间态不可见,出错只能整体重跑

围绕文件系统:
  [输入] → [写入 state.json] → [分步读写] → [每步产物落盘] → [输出]
  中间态可检查、可断点续跑、可单步重试

对长链路任务,差别是决定性的。断点续跑意味着第 5 步失败不需要重跑前 4 步;中间态落盘意味着能定位到底是哪一步开始偏移。

这也解释了为什么"skill 的形态本身在迭代"——它不是一次性写死的模板,而是要随失败案例持续修订 rules 与 fallback。

五、审批模式是必需的工程约束

Anthropic 为中小企业产品增加的 43 个工作流默认启用"审批模式"——发送、发布、付款均需人工确认。这不是产品保守,是工程上必须。

风险分级应当写进 skill 定义:

RISK_LEVELS = {
    "read_only":      {"human_gate": False, "example": "信息检索、摘要"},
    "internal_write": {"human_gate": False, "example": "生成草稿、写入内部表"},
    "external_send":  {"human_gate": True,  "example": "发邮件、发帖"},
    "irreversible":   {"human_gate": True,  "require_double_confirm": True,
                       "example": "付款、删库、对外承诺"},
}

def execute(skill, params):
    gate = RISK_LEVELS[skill.risk_level]["human_gate"]
    result = agent.run(skill, params)
    if gate and not human.approve(result):
        return Status.REJECTED
    return commit(result)

判断依据只有一条:该动作是否可逆,以及出错后损失多久显现。 可逆且损失即时可见的可以放开;不可逆或损失延迟显现的必须卡人。

六、关于"100 个 skills"的一个冷水

数字之外有个现实约束:让员工把自己的工作流写成可替代自己的说明书,这件事在激励上是反着的。

工程上再完善的 skill 定义,如果产出的文档是敷衍的,rules 里写的规则和实际执行的规则就是两套。这不是技术问题,但会直接决定那 100 个 skills 到底有多少真在跑。

一个可行的落地顺序:

  1. 先做一条,跑通并量化(耗时、准确率、人工介入率)
  2. 建立 skill 的版本与回归机制——每次规则变更都要跑一遍历史用例
  3. 把"沉淀了几个可运行 skill"计入考核,否则只会收获一堆文档

声明:本文技术部分为公开资料整理与工程经验推断。Vercel 内部数据(D0、100 个 skills、20 个 agent)为单一二手转述,未见官方声明,请以此为准。代码块为示例实现,非任何产品的实际源码。