prompt,context与skills

最近在折腾Agent开发的时候发现,很多人讲不清prompt、context和skills这三个东西的区别,甚至干脆把它们混在一起往代码里堆,写着写着整个系统就乱成一锅粥了。其实把这三个概念拎清楚,分开处理,能少走好多弯路。

1. Prompt:最直接的指令层

Prompt说白了就是你直接写给大模型的那段话,用来告诉它你是谁,要做什么,输出长什么样。比如我平时写的”你是个靠谱的后端开发,写代码要符合规范,全程用中文回答”,就是最典型的prompt。
它很轻量,只在当前对话里生效,不用存成文件,也不往里面塞一堆历史记录或者知识库,核心作用就一个——给大模型定好基本的规矩。

2. Context:模型当前能看到的所有信息

Context不是你手动写的指令,是这一轮推理时,你往大模型上下文窗口里塞进去的全部内容。之前的对话记录、检索出来的相关文档片段、当前任务的进度、项目里读出来的配置文件,这些东西全算context。
我之前踩过一个坑:把几十轮的对话历史全往里面塞,结果token直接爆了,大模型反而被一堆没用的信息绕晕,忘了自己现在要干什么。后来才想明白,正确的做法就像操作系统的内存管理一样,只把当前这一步必须用的内容放到”内存”里,过期的旧内容别一直占着位置,需要的时候再从”硬盘”里调出来就好。
之前看OpenClaw的四层记忆设计,其实就是很典型的context分层思路:

层级类比作用
Bootstrap Files硬盘永久规则,每次启动从磁盘读取,完全不被压缩
Session Transcript文件系统日志完整对话历史落盘,旧内容后台异步压缩摘要
Context Window内存模型当前可见的全部内容,满了就触发压缩淘汰旧内容
Retrieval Index搜索引擎独立存储,需要的时候再检索进来,不常驻上下文

3. Skills:打包好的能力包

Skills不是一两句话prompt,是把一整套特定场景的操作流程、规则提示,甚至连调用工具的逻辑都打包到一起的独立单元。比如你想让大模型学会探索陌生代码仓库,总不能每次遇到相关任务,都把几十条探索规则全往全局prompt里塞吧?把这些规则封装成一个skill,平时只留个列表告诉大模型”你有探索代码库这个能力”,真遇到对应场景的时候,再把整个skill的完整内容加载进上下文,既省token,也不会让全局prompt变得臃肿不堪。
它的好处就是按需加载,不用把所有能力的所有细节都摊开大模型面前,只有用得上的时候才把对应的能力展开,相当省心。

三者怎么配合

很多人刚上手的时候搞反了顺序:把几十种能力的全部规则,一股脑全塞到最外层的全局prompt里,结果大半token都被没用的规则占着,真正要放的当前任务内容反而塞不下。
我自己踩了不少坑之后,总结出一个比较舒服的分层方式:

  • 最外层用Prompt做基础约束:只放最核心的身份定义、你平时写代码的偏好习惯,写在AGENTS.md或者CLAUDE.md里,保证大模型不管什么时候,都按你的习惯做事。
  • 中间层用Skills扩展能力:把不同场景的操作流程拆成一个个独立的skill文件,大模型遇到对应任务才加载,不用的时候完全不占上下文。
  • 最内层用Context装当前任务的素材:只放现在这一轮推理必须的对话记录、检索结果、任务进度,过期的内容该压缩就压缩,该淘汰就淘汰,让大模型的注意力全放在当前要解决的问题上。
    这么搭配起来,再配合MCP协议连外面的工具,整个Agent系统的维护成本能降好多。以后想加新能力,根本不用改全局prompt,直接新建一个skill文件就行,大模型自己能发现并调用,分享给别人用也很方便。

几个实际踩过的坑

  1. 别把技能规则全写死在全局prompt里。我最开始把代码重构的十几条规则全塞进去了,后来想改一条,翻半天才能找到对应的位置。拆成独立的重构skill之后,修改调试的成本直接降了一半。
  2. context别贪多。不是你给的信息越多,大模型就越聪明,一堆没用的冗余信息反而会干扰它的判断。你要做的不是塞进去所有东西,而是精准放当前这一步必须用到的最小信息集。
  3. 不同skill之间别乱依赖。探索代码库的skill里就别混RAG检索的逻辑,单个skill出问题,不至于把整个系统搞崩。
  4. 一定要留好上下文压缩的能力。长任务跑几十轮之后,上下文窗口总有满的时候,得有一套自动把旧内容摘要压缩的机制,不然直接就卡壳了。

最后简单总结一下:prompt是给大模型定基本性格,context是给它递当前要用的材料,skills是提前给它装好不同场景下的专业工具箱。三个东西各守各的边界,你写出来的Agent系统才能清爽好维护。