LLM 扩展的根本教训
文章探讨了 LLM 功能扩展的局限性,认为大规模数据和算力才是核心竞争力,值得了解 LLM 的发展方向。
文章探讨了 LLM 功能扩展的局限性,认为大规模数据和算力才是核心竞争力,值得了解 LLM 的发展方向。
仅在启动四个月后,OpenAI 发布了 ChatGPT Plugins。回顾起来,这些功能远远领先于它们的时代。
这个想法很雄心勃勃:给 LLM 一个 OpenAPI 规范的链接,让它"野蛮生长"调用 REST 端点。这直接指向 AGI 风格的思维:通过标准 API 实现通用工具使用。
{
"schema_version": "v1",
"name_for_human": "TODO Manager",
"name_for_model": "todo_manager",
"description_for_human": "Manages your TODOs!",
"description_for_model": "An app for managing a user's TODOs",
"api": { "url": "/openapi.json" },
"auth": { "type": "none" },
"logo_url": "https://example.com/logo.png",
"legal_info_url": "http://example.com",
"contact_email": "hello@example.com"
}
问题是什么?模型还没准备好。GPT-3.5(甚至早期的 GPT-4)在没有幻觉或迷失在语境中的情况下很难驾驭庞大的 API 规范。而且,用户体验很笨拙。你必须为每个聊天手动切换插件!
但它让我们对未来有了一瞥:Code Interpreter 插件(后来的 Advanced Data Analysis)变得不可或缺,预示了我们今天使用的强大沙盒执行环境。
Custom Instructions 是对插件复杂性的"简单大脑"反应。我在写这部分时做了个双击,因为我确信这个功能在插件之前就发布了。
它只是一个用户定义的提示附加到每个聊天中。简单。显而易见。但它解决了一个巨大的问题:重复的上下文设置。
这是后来所有 .cursorrules 和 CLAUDE.md 文件的精神祖先。
OpenAI 将指令和工具重新打包成 Custom GPTs。这是一次"产品化" prompt 工程的尝试。你可以将一个角色、一些文件和几个操作打包成一个可共享的链接。
这是从插件的开放式承诺向精心策划的单一用途"应用"的撤退。
到目前为止,我们讨论了扩展 LLM 的手动方式。Memory 代表了向自动个性化的转变。
ChatGPT Memory 记录你对话中的细节,并悄悄地将它们插入未来的语境中。它就像一个自己写自己的系统提示。如果你提到你是素食主义者,它会在几周后记住。这是一个小功能,但它标志着维持长期状态而无需用户干预的 agent 的开始。
Cursor 通过将自定义指令放在它们真正属于的地方——仓库中——改变了游戏规则。
.cursorrules 文件是一个启示。与其把语境粘贴到聊天窗口,你可以把它提交到 git。
"We use tabs, not spaces."
"Always use TypeScript."
它最初是一个文件,然后发展成一个具有复杂作用域的 .cursor/rules 文件夹。你可以组织多个规则文件,甚至定义它们何时应用,例如仅针对某些文件类型或子目录。这是第一次扩展对代码感觉"原生"。
后来 Cursor 引入了让 LLM 决定何时应用规则的能力,这是一个我们会再次看到的模式。
到了 2024 年末,模型终于足够聪明,可以可靠地处理真实工具。Anthropic 的 Model Context Protocol (MCP) 是答案。
MCP 是一个重量级解决方案。MCP 客户端需要与 MCP 服务器保持持久连接。服务器向客户端(在大多数情况下是一个 agent)提供工具定义、资源和提示,它可以向服务器发送消息说工具已被调用,服务器可以用结果响应。
与 Custom Instructions(仅添加语境)不同,MCP 为模型提供了实际的功能。它可以读取你的仓库、查询你的 Postgres 数据库或部署到 Vercel。除了提供工具,它还允许服务器直接向 agent 提供资源(文档、日志)和提示。
这很强大,也许有点过度设计。虽然复杂性对 agent 开发者来说可能是值得的,但要求用户设置和连接 MCP 会产生很多摩擦,整个生态系统中有许多初创公司如 Smithery 致力于使 MCP 更容易使用。
值得注意的是,2025 年 10 月发布的 ChatGPT 应用是建立在 MCP 作为基础层之上的。这是一次尝试,目的是让最终用户更容易使用 MCP,而不必真正考虑它。
2025 年初为我们带来了 Claude Code,它本质上向 agent 添加了所有可想象的扩展机制。
CLAUDE.md:仓库级指令的标准。
MCP:用于重量级工具集成。
Slash Commands:类似于 Cursor 的 notebooks,用于可重用的提示。
Hooks:拦截和修改 agent 循环的能力(例如,"如果测试失败则停止")。
Sub-agents:生成专门的工作者来处理子任务。
Output Styles:(已弃用)配置语调和格式。
时间会告诉我们这些功能中有多少会长期存在。Anthropic 已经尝试弃用输出样式。
添加到 Claude Code 的下一个扩展机制足够重要,值得深入探讨。Agent Skills 是 ChatGPT Plugins 的重生。
虽然 MCP 有整个客户端-服务器协议,但 Agent Skills 只是 markdown 文件和脚本的文件夹(用你选择的任何语言)。
agent 只需扫描 skills/ 目录,读取每个 SKILL.md 的前言,并建立一个轻量级索引。然后,它仅在适合当前任务时选择读取技能的完整内容。这解决了 MCP 的主要问题之一:必须一次性将所有工具定义加载到上下文窗口中带来的上下文膨胀。
这是来自 Anthropic 的 Skills 示例存储库的 e2e 测试技能结构的片段:
webapp-testing/
├── examples/
│ ├── console_logging.py
│ ├── element_discovery.py
│ └── static_html_automation.py
├── scripts/
│ └── with_server.py
└── SKILL.md
这是脚本、示例和纯文本指令的混合。唯一必需的文件是 SKILL.md 文件。让我们看一下那个文件:
---
name: webapp-testing
description: Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
license: Complete terms in LICENSE.txt
---
# Web Application Testing
To test local web applications, write native Python Playwright scripts.
**Helper Scripts Available**:
- `scripts/with_server.py` - Manages server lifecycle (supports multiple servers)
**Always run scripts with `--help` first** to see usage. DO NOT read the source until you try running the script first and find that a customized solution is absolutely necessary. These scripts can be very large and thus pollute your context window. They exist to be called directly as black-box scripts rather than ingested into your context window.
... skill continues ...
这只是一个带有元数据和技能描述的纯 markdown 文件。agent 读取该文件,该文件自由地引用 agent 可以读取的其他文件。相比之下,一个 playwright MCP 服务器有几十个工具定义来控制浏览器,这个技能只是说"你有 bash,这是你如何编写 playwright 脚本"。
诚然,要使用技能,agent 需要对计算机有通用访问权限,但这是在实践中的痛苦教训。给 agent 通用工具并相信它能够使用它们来完成任务,可能比为每个任务制造专门工具更有可能是获胜策略。
Skills 是 ChatGPT Plugins 提出的梦想的实现:只需给模型指令和一些通用工具,然后相信它能做中间的粘合工作。但我有一个假设,它现在可能实际上会工作,因为模型实际上足够聪明来让它工作。
Agent Skills 之所以有效,是因为它假设 agent 具有编写自己工具的能力(通过 bash 命令)。你可以只给它代码片段,然后要求 agent 弄清楚如何通用地为当前任务运行它们。
重要的是,我认为技能标志着对 agent 真正含义的新定义。一个 agent 不仅仅是一个在 while 循环中的 LLM。它是一个在 while 循环中的 LLM,并且有一台计算机绑定在它上面。
Claude Code 是第一个让我真正理解这一点的软件,但它太专注于开发者,不能成为最终形式。其他应用程序如 Zo Computer 试图将 LLM 和计算机打包到一个单一应用程序中,但我仍然认为它仍然没有从最终用户那里充分抽象计算机。如果我要求同事做某事,我不需要看到他们的整个文件系统,我只需要知道他们有一台计算机。
展望 2026 年,我预计我们使用的越来越多的 LLM 应用程序将以新的有趣方式附加计算机,无论我们是否意识到这一点。
如果我能做空 MCP,我会的,我预计我们会回到用最容易访问的编程语言扩展我们的 agent:自然语言。