我要自己从头搞一个 AI Agent。

周五下班路上,这个信念充斥着一个文科生的心。

当天下午小组周会,研发人员对我脱口而出「你懂个屁的 AI」,紧接着就是上下文、MCP、Skills 这类于我而言「可远观不可亵玩」的词汇。我沉默不言,无法反驳,因为我对 AI 的全部理解确实只停留在每月的 meme 梗图、流行词,以及 OpenAI、Anthropic 的花边野史。任何追问都会让我哑口无言。

但事情将迎来转机,我感受到不同于下月减肥、少吃油盐和戒掉抖音的强大信念:我要用两天时间梳理完 AI 发展脉络,理解 Agent 能力边界。我也知道软件工程更多是门实践学科,要学习 AI,没有什么比自己「重造一个轮子」带来的理解更加深刻。

所以我也拟定了清晰的目标,我的 AI Agent 至少需要做三件事:

  • 能正常聊天;
  • 能帮我创建、整理待办和笔记;
  • 能帮我拿到最新的少数派的派早报、本周看什么等栏目摘要。

此外,它也不能直接使用任何 AI 框架,代码从零开始;核心脉络、迭代则由我自己定,不能偷懒给 Codex 一句「我要 AI Agent」。

让 AI 开口说话,并治好它的「失忆症」

周六一早,我尝试迈出第一步:搞定聊天。为此我得看一大堆比《三星 OneUI 使用说明书》还复杂的接入文档,对于非程序员群体——例如我——大概和看天书差不多。

出人意料的是,所有 AI 厂商的文档的第一页都只有一行加粗的十个字:先指定模型,再写上问题

DeepSeek-v4-flash:
  你好

DeepSeek 不一会儿就会发来贺电。大概半小时,我用一个既有的软件做界面框架,做好了雏形:

一句简单咒语,就能驱动一个海量数据训练出来的黑盒。美好的开局让我信心爆棚。我紧接着打算和 AI 联络感情:「从现在开始,你叫我阿乐,我叫你大 D」。我想试试这个好搭档的默契,它却掉链子了:

没错,就像得了失忆症,似乎每一轮对话对于 AI 来讲都是全新的开始。这可不行,而且,ChatGPT 们可不是这样。以「多轮对话」为关键词搜索后,我了解到原来在模型层面上,AI 没有「记忆」一说1

模型只处理本轮对话中,你的输入和它的输出。这也就是模型的 Context(上下文窗口)。

解决办法很原始:每一次新的对话,都把上几轮对话的内容复述一遍:

DeepSeek-v4-flash:
  上一轮的问题;上一轮的回答
  当前轮的问题

假如有 AI 实体,每一次对话我都要花上几分钟把前一轮对话的内容跟它重新讲一遍;想到这有些好笑的情境,AI 的「活人感」就少了很多。但带上了复读机 AI 的「失忆症」果然好了,我暂时只叠加了五轮前文,再之前的怎么处理我现在并没有好的办法。先以能跑为目标:

此时周六上午才过去了两个多小时,我的计划已迈出坚实的第一步。我还惊喜地发现,市面上的 AI 那么多,但都能用 OpenAI 和 Anthropic 定下的两、三种方式用起来,多轮对话的处理方式基本一致:

  • OpenAI Chat Completions API:最常见的格式,一般说「OpenAI compatible」就是说能用它;
  • OpenAI Responses API:OpenAI 的新标准,xAI、火山(豆包)都主推这个;
  • Anthropic Messages API:Claude 自成一套,想要接入 Claude Code 的厂商(如 DeepSeek)往往支持。

这不过是「茴字的几种写法」。我一口气把手边的几个 AI 都接了进来,OpenAI、Gemini 都有现成的日志功能,后续要做核对审查估计会方便一些。

有了基础的聊天能力,如果想定制一个自己的 AI,或者让 AI 完成指定任务,就像在 2022 年 ChatGPT 一鸣惊人后那样,我唯一能依靠的就是提示词了。这里人们还发明了一个词:提示词工程(prompt engineering)。想当初科学、玄学难辨的各类提示词火遍朋友圈和社区,出现了大量搜集提示词的门户站点,皆因提示词是和 AI 交互的唯一途径。彼时通过提示词来做角色扮演为卖点的 Character.ai,也在短时间内声名鹊起。但 AI 似乎停留在 Chat 领域。

让 AI「使用」工具

周六下午开工前,我打算先和我的造物打个招呼,和它还不熟的我选了个不会出错的话题,「今天几号了」:

回答让我大跌眼镜:2025 年 7 月!你怎么还活在去年?

AI 能做的是思考,它了解其训练材料截止的世界,但这个「缸中之脑」怎么才能和当下的世界交互?这也关系到让 AI Agent 帮我创建笔记待办的可能性。

我再次翻开厂商们的文档,工具调用(tool use)概念映入眼帘。有趣的是,OpenAI 把一部分工具称为函数(function)。函数这个概念,在几乎所有类型的编程语言里面都有,它被设计在当前环境中完成特定的任务,例如存取数据,获取信息,譬如人的五官手足。但 AI 模型能跑编程意义上的函数,听起来就像「缸中之脑」长出眼耳四肢一样匪夷所思。

现实自然并非如此,工具调用稍微有一些复杂:

DeepSeek-v4-flash:
  上一轮的问题;上一轮的回答
  当前轮的问题
  工具:要知道时间请回复「获取时间」
代码:
  如果 AI 返回是「获取时间」,就发送给 AI 时间

AI 模型决定获取时间时,它会直接按特定的格式,回复给我们一段话,我们的代码收到这段话后自己获取时间,然后告诉 AI,它才知道时间。换句话说,AI 模型负责调兵遣将,不上阵杀敌。它决定需要谁做事情,然后再拿对方的结果报告给用户。

这意味着我需要自己写一个执行方和它配合。

虽然原理上名不副实,但工具给模型能力带来了无限可能。我只需要将我需要的能力包装成一个个工具,AI 就能适时使用它们。这也同时意味着传统编程能做的一切事情,当前所有的信息、服务,AI 模型就能读取、取用。

外在世界的现实任务 <--解决-- 程序 <--通信-- 接口 <--tool-- AI 模型

我一口气给 AI 添加了十几个工具:我的 AI 现在可以访问网络、执行命令、操作我的系统:

而我的目标之一——创建笔记待办,此刻也被轻松实现:

我很快注意到了副作用:这么多的工具,我一股脑放进对话,简单的「Hello,你好」就要消耗 3 到 4 千的 token,一分钟如果有多次工具调用,6 到 8 万的 token 就没了。

但我暂不考虑优化,因为周六的夜色已至。我停下手上的活开始反思另一个问题:我在自己搞 AI Agent,十几个工具就是十几套不同的代码逻辑,写了一下午。那 Cursor、Codex、Claude Code 这种规模,难道程序员要自己给市面上成千上万个服务都写一遍代码不成?

显然不是,「工具」并不是普通用户在 AI 领域中常听到的概念,MCP(模型上下文协议)才是。MCP 由 Anthropic 在 2024 年底提出,它尝试定义一套 AI 应用和工具服务方都遵守的规范,大家都「红灯停、绿灯行」,开车上路也就不需要那么多交流了。千万个服务商,也能无痛入驻各大 AI 应用。

外在世界的现实任务 <--解决-- 程序 <--标准化-- MCP --tool--> AI 模型

MCP 之后被另一大巨头 OpenAI 支持。MCP 门户站点、平台工具也就从 2025 年初涌现。工具、MCP 能力的流行,推动了 AI 从聊天场景进一步拓展到了调研分析、报告撰写、绘制图表等实践场景,大家熟知的黑马 Manus.im 也算红极一时。

编程之外,AI 在大众视野上也逐渐脱离了聊天机器人的桎梏。

给 AI 一本菜谱大全

昨天的爆肝让目标近在咫尺,所以周日上午的我懈怠了不少。

我的 AI Agent 能聊天能用工具,完成复杂的任务又有多难呢?我想当然认为以当代 AI 模型的威力,现在只要一句简单的提示词,它就已经能拿到最新一篇少数派文章的摘要了:

DeepSeek 和 GPT 5.5 都给出了错误的答案,而 GPT 5.5 Pro 最终以 2 美元扣费,3 分钟耗时为代价成功了。但繁琐的思考、一遍一遍的工具调用,不仅也让我怀疑这真的是顶级模型的能力吗?我最多花 10 秒完成的事情,强大的 AI 竟然要考虑这么久。即便我可以添加一个「本次思考快于 98% 的用户」来聊作安慰,钱包也受不了。

另外 Codex 们写项目的时候可没这么磨叽。我尝试回顾 AI 的处理过程:

  • 以「少数派」、「最新」为关键词搜索:失败,结果全部为旧内容
  • 获取当前日期,搜索「少数派」、「2026-05-17」:失败,无有效内容,原因是新文章刚刚发布,未被抓取
  • 搜索少数派社媒平台,尝试拿到最新文章链接:失败,社媒平台禁止抓取
  • 第一次直接抓取少数派首页,抓取第一个链接:失败,首页结构复杂,第一个链接并非文章
  • 分析后,第二次抓取首页,并尝试解析文章:失败,被排序误导,文章内容并非最新
  • 从网页端发现了 RSS 链接,并尝试解析:成功输出结果。

AI 既聪明、又能干,但缺乏经验。看起来前 5 次不仅花去了大量时间,还并没有产出,而第六次终于探索出了完成这个任务的最佳「菜谱」。因此我要做的是直接告诉 AI,下次这个任务,你直接这么三步走:

  • 用 shell 工具读取 RSS 地址,解析拿到第一个链接;
  • 用 web 工具读取这个链接;
  • 将内容总结为 200 字概要,附带原始链接,除此以外,什么都不要返回。

不过这段特殊的提示词放哪里?如果是前几年,AI 平台和教程都提倡每一个话题,新建一个对话,这个对话就只处理这一个事情,我们称之为专用的智能体、助手之类。

一段时间后,在编程 AI 领域,大家开始渐渐习惯于将固定的习惯、流程写到一个个纯文本文件里面。比方说 CLAUDE.mdAGENTS.md。这种习惯到了 2025 年底由 Anthropic 主张拓展用途,Skills 开放标准被提出,中文圈基本叫它技能。

扒开 Skills 的糖衣,它们最核心的部分还是精心设计的提示词,一般以本地文件的形式记录着一套一套的固定流程、外部资料。复杂一些的还附带了脚本或其他外部资源。我按照自己理解也实现了一套 Skills 体系,下面是效果,执行速度已经来到 10 秒以内:

我把本地的技能放到一个固定的目录,在全局的提示词内,插入这些技能的名字和大致功能。AI 决定使用时,就用我开发的 read_skill 工具读取技能描述,最后跟着技能描述完成任务。我花了最多的时间去写一套 AI 都能遵循的 Skills 提示词和流程:由于 Skills 会被动态载入 AI 模型的上下文,而不同的 AI 对提示词的遵守程度是不一样的,我最后想到的办法是固定流程、尽量用脚本,以减少 AI 的自由发挥,效果显著。这个办法也是 Claude 等平台的推荐办法。

DeepSeek-v4-flash:
  上一轮的问题;上一轮的回答
  当前轮的问题
  工具:要知道时间请回复「获取时间」
  Skills:要处理少数派最新文章,请读 fetch-sspai
fetch-sspai
  按下面的步骤获取少数派的文章:1 2 3

如今的通用型 AI 平台也大多支持这一特性。从个人观察看,OpenClaw 年初的火爆原因之一是作者预置的一大堆方便好用的 macOS Skills。AI Agent 的用户不再需要关心怎么最优完成任务、怎么写提示词、什么时候该用工具,这些事情交给 Skills 编写者解决就行。

工作量超出想象,一直到周日下午两三点,我才算满意。其实截止目前,我把当前的成果展示给任何人,对方都不会否认这就是一个 AI Agent。

从能跑到好用,AI Agent 平台还要做什么

周末的时间所剩不多,我做出来了一个能跑的 Agent,但离成熟产品还差不少。

同样是调度模型、上下文、工具和 MCP 以及 Skills,市面主流的 Agent 平台还做了什么?这是我剩下时间的探索主题。为了让调查有的放矢,我选择了 Codex CLI 这个开源项目作为研究对象,然后从以下我遇到的真实问题入手,看看其答卷如何:

  • 管理历史上下文,让模型别忘掉:我之前选择粗暴地塞上 5 轮历史对话,这导致更早的对话,模型不会记得。商业产品显然不能这么做。
  • 工具、MCP 和 Skills 的管理:怎么让初学者接受 MCP 和 Skills 的概念?如何避免一次性加载全部工具?第三方工具又怎么简单安装?
  • 组织当前上下文:但在多轮对话的复杂场景下,怎么能保证本轮对话不被历史消息带偏?

压缩是最大化保留上下文历史的答案。从源码看,上下文即将达到设定上限时,Codex 会对收集来的历史消息在其自己的服务器上做一次压缩。服务端的逻辑暂不可知,但根据另外一个服务端压缩不可用时,触发的本地压缩逻辑看,OpenAI 可能只保留了大约 2 万 token 总量的用户历史摘要。在触发压缩之前,用户的历史消息只会经过简单整理,复述给模型。可以说,多次触发压缩后,历史消息必然会失真,但重要信息(如当前任务)会保留。

工具这边,AI Agents 平台总是能搞出一些新花样。Codex 包装出 Plugins 这一概念,可以跟装应用一样一键下载安装。Plugin 是一种产品化的命名方式,其底层则较为复杂,三个内置插件从文件结构上看:

  • Computer Use 里面是一个 MCP 工具 + 一个规范工具使用边界的 Skill;
  • Chrome 是一个 Skill + Chrome 插件,加上必要的运行依赖;
  • Spreadsheets 是一个 Skill 文件,指导模型用代码来处理表格。

换句话说,Codex 认为用户不需要理解什么叫工具、MCP、Skills,只要知道怎么用就行。我很难断言 Plugins 这个设计是否会成功,但确实是一种不错的解题思路。近几个月 Twitter 上经常看到「我们不需要再使用 MCP」的言论,现在看来不是不用、只是看不见。

和第三个事情相关的,我很早就注意到一个现象:用「执行计划」选项让 Codex 完成计划,和我自己贴一个计划讨论修改后,再让它执行,其完成度和质量好上非常多,后者有时候甚至会完全忽视计划细节自行发挥。这证明了控制模型注意力的巧思是有效的:

  • 执行计划命令:从源码看,会把整个计划原封不动再发一遍给模型,意图将最高优先级的事情,直接放到本轮上下文中;
  • 普通的「执行计划」,模型需要从历史对话中自行猜测总结计划细节,容易出错。

Codex 每一轮对话开始前会重新组织上下文,一方面尝试将重要的规则、用户指令、目标(/goal 模式的核心)重新塞回本轮用户信息里,另一方面,不必要的信息会被隐藏,暴露简短的描述用于索引,比方说,Codex 用了一个特殊的工具叫 tool search,就很好地避免了像我一样直接塞十几个工具到上下文里的窘境,一些不适用于当前环境的工具也会被直接隐藏。

最近 OpenAI 联合创始人说「模型单独来看,已经不再是完整产品」,这首先源自于 OpenAI 持续稳居顶级 AI 公司的自信,其次也说明了这样一种现状:模型能力进步用户感知有限2,应当着力应用层面。我翻开某些厂商的文档,发现他们已经在 AI 的 API 层面提供沙盒环境、内置搜索、内嵌 MCP 等应用层能力,也佐证了其说法。

尾声

两天后,我自己的 AI Agent 终于造了出来。不同于之前的 vibe coding,我参与到了程序设计中,通过提出设想、发现问题、查找资料、再解决问题的循环,尝试理解各类 AI 概念背后的问题:

  • 模型作为黑盒,我们提供输入,它只负责输出;输入输出是模型的上下文,历史消息、工具、Skills 都要进入上下文才能有效果;
  • 人们定义工具,是为了解决模型无法直接读取外部信息、操作外部系统的问题。模型本身不执行,它只发号施令。模型内置的工具运行在服务商的环境中,我们要接入工具,就要提供执行工具的环境;
  • MCP 尝试解决 AI 应用和服务商对于工具使用的各类规范不统一的问题;但它并非调用工具的必要条件;
  • Skills 是做某件事的指导或相关资源,它动态注入上下文,解决 AI 在某个垂直领域经验不足的问题;
  • AI Agent 平台,按各种不同的方式组织模型、工具、MCP 的使用,管理上下文历史,希望更有效率地完成指定任务。

相信之后被追问相关问题,我也大概能说个一二。我将这个过程记录下来,希望对你也有帮助。

扩展阅读

> 关注 少数派小红书,感受精彩数字生活 🍃

> 实用、好用的 正版软件,少数派为你呈现 🚀

21
6