最近OpenAI在官方渠道分享了一套关于GPT-6 Astra优化的实操建议,核心落在三件事上:skills、AGENTS.md、任务提示词。我花了两天时间把这些内容完全消化了一遍,又结合自己在Codex、前端开发skills、数学建模skills这些场景里的实际踩坑经历,整理出了一篇完整的操作笔记。这篇文章写给所有在跟Agent、编码助手、自动化任务打交道的人,无论你是做AI应用开发,还是想搭建自己的Agent工作流,这套优化方法都能让你的模型输出质量提升一大截。
1. 为什么GPT-6 Astra时代必须重新思考这三件套
1.1 从GPT-4/4o到GPT-6 Astra的范式变化
先说一个判断:GPT-6 Astra跟之前的GPT-4、GPT-4o在协作方式上有一个根本性变化,模型不再只是“你问一句我答一句”的聊天工具,而是变成了一个有工具使用权、能自己拆任务、能循环执行动作的Agent。这意味着,模型的“下限”拉高了,但“上限”反而取决于外围配置。
什么叫上限取决于外围配置?举个我试过的例子。同样让模型做一个前端页面的代码生成任务,在不给任何外部上下文的情况下,GPT-6 Astra生成的代码可用率大概是六到七成,很多细节它得靠猜。但是当我给它一套完整的skills包,加上项目级的AGENTS.md,再把任务提示词写得足够明确之后,代码质量明显不一样了,组件结构合理了、技术栈的使用方式也对了,基本能直接跑起来。这个差距就是外围配置带来的。
OpenAI这次官方的分享核心就一句话:模型的上下文窗口再大,也比不上你把上下文质量做好。GPT-6 Astra有更大的上下文处理能力,但如果你什么都不配置,让模型在一堆杂乱信息里自己找重点,它的表现一定不稳定。于是就有了这次优化的三件套:skills负责提供“怎么做事”的知识,AGENTS.md负责描述“当前项目是什么样的”,任务提示词负责说明“这次具体要达到什么目标”。三者分工明确,缺一不可。
1.2 三者的核心分工与协作关系
我习惯把这三件套类比成一个刚入职的资深工程师:
- skills相当于这位工程师过去沉淀下来的“工作方法论”,比如前端开发有哪些规范、代码结构怎么组织、常见的坑在哪里;
- AGENTS.md相当于公司给他看的“新人手册”,里面有项目背景、代码库结构、命令怎么跑、提交规范是什么,帮他在最短时间内上手;
- 任务提示词则是“这次工作的具体指派”,比如今天你要完成这个登录页面的重构、验收标准是什么、哪些技术栈不要用、输出格式是什么样的。
这三者是从抽象到具体的三层。skills和AGENTS.md是长期资产,配置一次可以反复用;任务提示词是每次交互都要重新写的东西,质量直接决定单次输出效果。
很多人觉得只要模型够聪明,自然就能处理复杂任务,这是一个巨大的误解。拿我自己之前的一个项目来说,我一开始只在提示词里加了一句“你是一个专业的前端开发工程师”,然后就让它写一整个模块的代码。结果输出出来的东西乍一看没问题,往项目里一放就全是问题:没用项目的组件库、样式方案不对、接口调用方式跟后端约定不一致。后来我把项目结构、技术栈规范、编码习惯这些都写进了AGENTS.md,再配上相关技能的加载,同样一句话,输出直接就能用。这就是“写清楚上下文”和“让模型猜上下文”的本质区别。
2. skills:把能力封装成可插拔技能
2.1 skills的本质与推荐结构
先解释一下skills到底是什么。你可以把它理解成一份“可插拔的能力包”,里面可以是Markdown文档、代码片段、甚至是完整的工具调用说明。它的核心作用是在需要的时候,把特定领域的知识精准地加载给模型,不需要的时候完全不占上下文空间。
为什么GPT-6 Astra时代skills的地位变得这么重要?因为Agent的特性就是会自主决定“我现在需要调用哪个能力”。你不可能在一个对话里把所有领域知识都塞给模型,那会撑爆上下文、增加成本、降低响应速度。正确做法是把技能拆成多个skills,每个专注一个领域,让模型在遇到对应任务时自动加载。
我推荐的skills内部结构包含这么几块:
- name:技能名称,要短、要精准,方便模型识别;
- description:一段话说明“这个技能用来干什么、在什么场景下触发”,这是模型决定要不要加载的关键依据;
- instructions:核心操作步骤,按动作顺序写,比如“先审查需求,再拆分任务,最后编码”;
- input/output规范:说明需要提供什么输入、输出什么格式;
- examples:最有效的部分,给1到3个具体示例,模型会照着示例的风格做;
- constraints:明确“不允许做什么”,比如“不允许使用某个库”“不允许改变现有接口”。
在GPT-6 Astra的生态里,skills可以放在项目目录下,也可以放在用户级目录下,还可以通过npx这类工具直接安装外部技能包。安装来源多,所以更需要你自己做本地化的优化,官方分享里也反复提到这个点。
2.2 编写高质量skills的实操要点
我自己写skills写坏了七八个版本之后,总结出几条特别有用的经验。
第一,description必须写“触发条件”,不要只写“能力描述”。举个例子,不推荐写“这是一个前端开发技能包”,而是写“当需要编写React组件、页面布局、CSS样式或前端交互逻辑时使用此技能,同时适用于代码重构与性能优化”。模型判断要不要加载技能,主要靠的就是这段描述与当前任务的语义匹配度。描述写得越具体,匹配就越准确。
第二,instructions要写成“决策式流程”,而不是“线性流程”。什么意思呢?单纯罗列步骤会导致模型在遇到分支情况时不知道怎么处理。好的写法是给出判断条件和分支路径,比如:“先判断目标项目使用的是什么框架;如果是React,则遵循components目录组织;如果是Vue,则遵循views目录的写法”。这样模型就知道,在任何一条路径上,它都有一套明确的行动依据。
第三,examples必须是“正面加反面”成对出现。我测试过很多次,只给正面示例,模型倾向于模仿示例里的写法,但不会主动规避错误。给了反面示例之后,模型主动规避的可靠性高很多。所以我在写数学建模skills时,会专门列出一个段落写“常见建模错误”和“错误示例”,效果比单纯强调“你应该怎么做”好得多。
第四,约束要写成硬性的、可检查的条款。比如“禁止使用import *”“禁止硬编码配置项”。不要写“尽量保持代码整洁”这种模糊的表达,模型很难量化“整洁”。你要让约束变成一个模型可以自查的规则。
2.3 实战示例:前端开发与编码类skills
下面放一个我实际在用的前端开发skills模板,你们可以直接抄作业,然后针对自己的项目改。
我用这套skills在GPT-6 Astra上跑过一个中型前端项目,代码生成后的lint通过率从原来的不到一半提升到了九成左右。关键在于它把项目的技术栈、目录规范、组件写法和禁止事项都给模型讲清楚了。
拿“页面开发”这个skill来说,里面我写清楚了页面文件应该放在哪个目录、状态管理用什么方式、API请求怎么封装、样式方案用什么、响应式断点是什么。模型照着这个标准写出来,基本跟团队其他工程师手写的代码风格相差不大。
还有一个重要的细节,skills里要留一个“自检清单”。推荐在skill的末尾写一段让模型在提交结果前自行检查的列表,比如“检查是否引用了项目内已有的工具函数”“检查所有接口地址是否遵循环境配置”“检查错误处理是否完整”。这看起来不起眼,但实测下来,加了这个自检环节之后,模型输出的一次性通过率提升非常明显。原因很简单,模型在生成的时候是从左到右一句句输出的,容易在后半段忘记前半段的约束,有了自检清单,相当于让它在交付前重新过一遍自己的作品。
3. AGENTS.md:让Agent读懂项目上下文
3.1 AGENTS.md为什么是Agent时代的README
README是给人看的,AGENTS.md是给Agent看的。这个定位一定要搞清楚。
传统项目里,新人入职要花一周时间读文档、跑环境、了解代码结构。但在Agent时代,你没有那么多“新人培养时间”,Agent需要一上来就能听懂你的项目。AGENTS.md就是承担这个作用的文件,它应该放在项目根目录下,Agent在进入项目后会自动读取它,从而快速了解“这个项目是怎么组织的、我在这里干活要遵守什么规矩”。
有人可能会问,我直接把项目信息写在任务提示词里不行吗?短项目可以,长项目就不行了。项目一多、一复杂,你不可能每次对话都手写一遍项目背景。而且有些信息是Agent要主动去了解的,比如“跑测试用什么命令”“代码规范在哪里定义”,放在AGENTS.md里,Agent会按需查找,而不是被动等待。
官方分享里特别强调了AGENTS.md的“分层”设计:根目录的AGENTS.md写最通用、最全局的信息,子目录下可以放独立的AGENTS.md,描述这一层特有的规则。这个设计非常实用。比如我的项目根目录AGENTS.md写的是整体架构、技术栈、构建工具、全局命名规范;而components目录下的AGENTS.md就写“本目录组件必须使用TypeScript编写,样式必须采用CSS Modules”。Agent进入不同目录干活时,会叠加读取对应层级的规则。
3.2 可直接套用的AGENTS.md模板与字段拆解
我提供一个自己实践下来比较顺手的AGENTS.md模板,你可以直接复制到项目根目录里改:
这个模板的关键在于,它给了Agent一个“优先做事的顺序”。比如第2条“架构说明”中,我会专门写“在修改任何接口之前,先查阅API目录下的Swagger文档”,这句话能避免Agent凭已有知识瞎编接口。我还遇到过模型根据训练数据里的旧接口写法去调用接口的情况,后来加了这句“以项目内API定义为准”之后,这个问题就彻底消失了。
再强调几个容易踩的坑:
一,不要在AGENTS.md里写“应该”“可以”“最好”这类软化语气,Agent会倾向于把它理解为可选项。要写“必须”“禁止”“以...为准”,这样模型的执行才会坚决。我之前写过一个规则“代码应该包含错误处理”,结果模型的输出里偶尔还是漏掉错误处理;改成“所有用户输入必须经过有效性校验,所有异步操作必须包裹try-catch”之后,就再也没漏过。
二,AGENTS.md的长度一定要控制。官方建议是根级控制在500到800字以内,只放最核心的“必须知道信息”;那种展开的详细说明放到独立文档里,在AGENTS.md里用链接指过去就行。为什么?因为AGENTS.md是Agent每次任务都要读的,太长会导致上下文被大量无关信息占用,反而稀释了任务指令的权重。
三,注意区分“项目事实”和“个人偏好”。AGENTS.md里只写不可改变的项目事实,比如技术栈、目录结构、运行命令、接口规范;像“你是一个高级工程师”这种角色设定,不要写在AGENTS.md里,那属于任务提示词或系统提示词的范畴。混在一起会导致Agent在做事时频繁切换角色判断,影响稳定性。
3.3 AGENTS.md的更新维护机制
官方分享里特别提到了一点,AGENTS.md不能“写一次就忘”,它应该变成一个跟随项目持续演化的文件。
我现在的做法是每隔一段时间让GPT-6 Astra做一次“AGENTS.md健康检查”:把项目最近的变化、新增的技术栈、更新过的目录结构拿给它,让它分析现有AGENTS.md里哪些描述过期了、哪些重要规则缺失了、哪些字段可以精简。这相当于让Agent自己来维护Agent的说明书,运行起来非常省力。
实际操作时,我会把下面的指令发给它:“请阅读项目根目录的AGENTS.md,检查是否与当前项目结构一致,特别关注:依赖文件是否更新、目录结构是否有变化、最近几次提交中是否出现了重复的代码模式。对于过期的描述,请建议具体修改方案,并说明为什么需要修改。”
这个方法的价值在于,项目在快速迭代中经常会发生“文档赶不上代码”的情况。AGENTS.md如果过时了,Agent读取后就会按照过时的规范执行,生成的结果反而偏离现状。定期让模型自己检查自己,可以把这个偏差控制在最小范围内。
4. 任务提示词:最容易被忽略的“最后一公里”
4.1 任务提示词与系统提示词的定位区分
很多人分不清任务提示词和系统提示词的区别,导致写出来的东西两头都不靠。其实只需要记住一句话:系统提示词设定Agent是一个什么角色、具备什么能力边界;任务提示词指定Agent这一次要完成什么具体工作、在什么约束下做。
举个例子,系统提示词里写“你是一个资深前端开发工程师,熟悉React与TypeScript,擅长代码审查和性能优化”,这是设置角色;任务提示词里写“请审查src/pages/login.tsx这个文件,找出状态管理不当和重复渲染的问题,给出5条具体修复建议,每条不超过2行”,这是布置任务。
在GPT-6 Astra的Agent式交互模式里,任务提示词的影响力比系统提示词更直接。因为Agent可能会连续执行好几个动作,每一步它都需要理解“当前动作是否服务于最终目标”。任务提示词写得好,Agent就能把动作路径跟最终目标对齐;写得模糊,Agent就可能在中间步骤上走偏,输出一些看起来合理但根本不是你想要的东西。
4.2 优化任务提示词的四个维度
我自己写任务提示词经历了一个从“长而全”到“短而准”的进化。现在我会从四个维度来审视一段提示词是否合格。
第一个维度是“目标明确性”。任务提示词里必须出现一个动词加一个可量化的对象。比如“优化页面性能”这个表述就不合格,“把首页首屏渲染时间从3秒降到1秒以内”就合格了。不要担心写得太具体会限制模型的发挥,实际上模型在执行范围内的自由发挥反而更稳定。
第二个维度是“边界设置”。光有目标还不够,你得告诉模型什么不能做、哪些范围不用管。我常犯的错误是只说“帮我重构这个模块”,结果模型把接口、数据库结构、UI全部动了一遍。后来我在提示词末尾固定加一行“不要修改接口签名与数据库结构,仅重构模块内部实现”,这个问题就控制住了。
第三个维度是“输出格式约束”。Agent的输出如果不是结构化内容,后续自动化处理起来很痛苦。所以我在任务提示词里都会明确要求的格式,比如“按以下Markdown结构输出:现状分析、问题列表、修改建议、自检结果”。尤其是用GPT-6 Astra做Codex编码任务时,输出格式往往决定了代码diff的质量和可追溯性。
第四个维度是“示例注入”。任务提示词里给的示例永远比描述有用。还是拿代码审查举例,我写了一段提示词,开头先放了一个之前审查过的代码片段,并标明“这是符合要求的审查输出风格”,再接新的审查目标。实测下来,模型对第二个文件的审查风格会和示例高度一致,几乎不需要你再解释什么是“具体的修复建议”。
4.3 从模糊需求到可执行任务的改写示范
我放一个具体的改写过程,大家感受一下差别。
原始提示词是这样的:“帮我改一下用户登录的代码,让登录更流畅。”
这段提示词有太多歧义:“流畅”指什么?是登录速度吗?是页面不刷新吗?是错误提示更友好吗?“改一下”是指重构还是风格修改?“代码”是指前端页面层还是后端验证逻辑?这种提示词喂给GPT-6 Astra,模型只能靠猜,输出质量完全碰运气。
我把它改写成了这样:
“请重构用户登录模块(src/auth/login.ts)与登录页(src/pages/login.tsx)。当前问题是:登录请求成功后页面无反馈,且错误请求会触发全局页面卡顿两秒。目标要求:1.登录成功后3秒内跳转首页并显示成功提示;2.所有接口异常在catch块中统一处理,不得泄漏原始错误对象给用户;3.登录按钮在请求期间须显示loading状态并禁止重复提交;4.保持现有接口请求函数签名不变。完成后请列出修改的文件清单、每个文件的核心改动点,以及你做的自检结果。”
改完之后,模型拿到的是一个没有歧义的任务,同时又有足够空间去做具体实现。前后两者的输出质量差距,就是“让模型猜”和“让模型干”的差距。
5. 三件套协同:完整的优化工作流
5.1 先评审再动手的优化流程
三件套各自优化到位还不够,它们的优先级和协作关系也需要注意。我的建议是先评skills,再写AGENTS.md,最后设计任务提示词模板。这个顺序不是随便排的。
先说为什么先评skills。skills提供的是“做事的方法”,它决定了模型在具体任务中的行为上限。如果你的skills写得混乱、描述不精准,后续写AGENTS.md和任务提示词时就会很痛苦,因为你不得不花很多字数去兜底层的方法。我自己曾经跳过skills直接设计任务提示词,结果每个任务提示词里都要重复写一大堆技术规范,提示词变得又长又脆弱,一处改了其他地方就忘了同步。
AGENTS.md排在第二,是因为它决定了模型在执行任务时能否正确判断“什么能做、什么不能做”。这个文件越早写清楚,任务提示词里需要强调的约束就越少。我遇到过很多项目,AGENTS.md没有写构建命令,结果Agent在“验证代码能否运行”这个环节直接摆烂,因为不知道用什么命令跑。后来在AGENTS.md里补上了“测试运行:npm run test”、“构建检查:npm run build”,模型每次执行编码任务后都会自觉跑一遍自测,链路完整多了。
最后才是任务提示词模板。有了规范的skills和AGENTS.md打底,任务提示词就只需要聚焦“本次任务的目标、范围和输出要求”,不用再花篇幅补上下文。这时的提示词会变得很短,但命中率反而更高,因为模型真正缺的信息已经被skills和AGENTS.md补上了。
5.2 测试与评估:怎么确认三件套确实变好了
优化不能靠感觉,需要有一套可重复的评估方法。我的做法是准备一个“测试任务集”,固定选取5到10个有代表性的任务,在每次改动skills、AGENTS.md或任务提示词之后,跑一遍并记录输出质量指标。
我常用的指标有四个:
- 首次正确率:第一个版本就能通过语法检查或单元测试的比例;
- 修改回退率:模型改动后是否引入新的回归问题;
- 上下文冗余度:本地注入的上下文里,有多少是被模型实际使用的;
- 任务耗时:从提出任务到产出最终可交付结果用了多轮交互。
拿“上下文冗余度”举个例子。H我用一个会话记录了模型每轮实际读取了AGENTS.md里的哪些内容,发现它大部分时候只用了“项目结构”和“命令说明”,代码规范部分几乎不读取。这说明我的AGENTS.md写得还行,但skills那边的描述还不够好,导致模型没有主动加载相关技能。于是我把skills的description重新打磨了一遍,加了更多触发场景的关键词,第二次测试时,模型主动加载技能的频率明显上升了。
这套评估流程不要嫌麻烦,它其实是一次性投入。测试任务集建好之后,之后每次调整配置都跑一遍,几分钟就能出结果,但你能很清楚地看到三件套的改动对最终输出质量的影响,而不是靠着模糊的感觉盲目调。
6. 常见问题与排查技巧实录
6.1 skills不生效,怎么排查是最快的
先说一个我遇到过很多次的现象:skills明明放在项目里了,AGENTS.md也写了,但GPT-6 Astra执行任务时就是不用。排查第一步,先看skill的描述文本是不是太泛。description如果写的是“处理前端相关任务”,模型很难判断什么时候该加载,因为它认为所有任务都跟“前端相关”沾边。我遇到过一个案例,把描述改成“当需要编写或修改React组件、页面样式、前端事件逻辑时使用”,模型立刻就能准确触发。
排查第二步,检查任务提示词里是否显式要求了某条路径。如果你在任务提示词里说“按照你的经验直接写”,模型是有可能跳过skills加载流程直接输出的。正确的做法是任务提示词里也加一句“如果存在与本任务相关的skills,请先加载并遵循其中规范”。这相当于给模型一个主动查询的信号。
排查第三步,看项目目录里的skills文件命名和格式。文件名要清晰,比如“frontend-development.md”“math-modeling.md”,不要用一串编号。内容头的metadata区域要完整,包括name、description、version,这是很多Agent工具的识别依据,缺了会直接导致技能不加载。
6.2 AGENTS.md太长导致上下文膨胀,怎么精简
AGENTS.md写得太长是个很现实的问题,特别是项目历史久了之后,规则越加越多。我见过有人把整个团队规范的2000多字全塞进去,Agent每读一次就浪费几千token的上下文预算,生成的效率明显下降。
我的精简原则是“三留三不留”:留下影响代码结构和接口调用的规则,留下项目特有的事实,留下排查常见问题的命令;不留通用编码规范(那应该放到skills里),不留历史决策背景的故事,不留已经过期的临时约定。
如果你发现AGENTS.md已经超长了,建议做一次“分层转移”:把通用规范拆到skills包里,把详细说明链接到独立文档,AGENTS.md里只保留“模型必须现场知道才能干活”的内容。我自己现在根级AGENTS.md基本控制在600字左右,效果反而比原来2000字的时候好。
6.3 任务提示词输出不稳定,问题通常出在哪
输出不稳定,十次里有七八次是任务提示词“目标与边界”不清晰造成的。最常见的表现是:前三次输出质量特别好,第四次突然崩了,生成了一堆无关内容。回看日志后会发现,第四次的任务描述里我没有写清楚“无需修改的部分”,模型基于自己的判断擅自扩大了改动范围。
解决这个问题的办法是固定一套提示词模板,必填项包括:任务动作、对象文件、现状描述、目标描述、变更边界、输出格式、自检要求。每次写新任务时就照这个模板填,不要临时发挥。我发现很多不稳定问题不是模型变笨了,而是你每次给出的指令结构都不一样,模型需要重新适应你的表达习惯。
另外一个小技巧是“显式声明可跳过项”。比如加一句“如果经评估后该模块无需改动,请跳过并说明原因”。这句话能减少模型为了完成目标而硬做的行为,在很多场景下都很有用。
6.4 常见问题速查表
我把这段时间排查过的问题整理成一张表格,方便大家按图索骥。
| 问题现象 | 可能原因 | 优先排查项 |
|---|---|---|
| skills从未被加载 | description范围描述不清晰 | 检查description是否包含具体触发场景 |
| 技能加载了但行为未变 | 指令与任务目标不一致 | 检查instructions是否给出决策式分支路径 |
| Agent忽视AGENTS.md规则 | 规则语气过软 | 将“应该”改为“必须/禁止” |
| AGENTS.md导致响应变慢 | 内容超长、信息过载 | 精简至600字,分层拆到子目录 |
| 任务输出不遵循格式 | 缺少输出格式示例 | 在提示词中给出可直接套用的格式模板 |
| 模型改动范围超出预期 | 缺少边界声明 | 增加“不要修改...”“仅处理...”条目 |
| 模型跳过自检直接提交 | 缺少自检要求 | 在任务末尾增加“完成前逐项自检” |
| 代码风格偏离项目惯例 | AGENTS.md未说明编码规范 | 在skills中补充项目代码风格示例 |
最后再说一个我自己的习惯。每次新版本模型上线,我都会把三件套重新拿出来过一遍,不直接沿用老配置。因为模型能力在变,它“不需要人提醒就能做对”的事情也在变——去年还必须在skills里反复强调的内容,今年可能已经变成模型的基本能力,留在配置里反而是在浪费上下文。反过来,新模型能处理更复杂的任务边界,那AGENTS.md和技能说明也需要跟着扩展。配置和模型之间的配合,本身就是一个持续迭代的过程,没有一劳永逸的方案。