雪山之松 發表於 2026-4-8 12:14:00

Context 工程:如何把正确的上下文喂给 AI

<p><span>我们在项目中一定都遇到过,AI 明明很"聪明",工具也都接好了,结果你让它改个 bug,它改的完全不是你想要的文件;你让它写个组件,它生成了一套跟项目风格完全不搭的代码。</span></p>
<p><span>这不是 AI 笨,也不是工具不行,「而是你"喂"给它的上下文不对。」</span></p>
<p><span>你可以把 AI 想象成一个远程结对编程的同事——他水平很高,但「他只能看到你屏幕共享的那部分内容」<span>。你共享的窗口太小,他看不全;你共享了整个桌面,他又被一堆无关的东西干扰。</span></span></p>
<p>「Context 工程,就是"学会精准地给 AI 共享屏幕"。」</p>
<p><img alt="image" width="524" height="286" loading="lazy" src="https://img2024.cnblogs.com/blog/1022151/202604/1022151-20260408120659229-1935586458.png" class="lazyload"></p>
<h3><span>什么是 Context 工程?和 Prompt 工程有啥区别?</span></h3>
<p><span>很多人把"写好 Prompt"和"管好 Context"混为一谈。其实它们解决的是两个完全不同的问题:</span></p>
<ul class="list-paddingleft-1">
<li>「Prompt 工程」<span>:研究"怎么问问题"——措辞、格式、角色设定、思维链……让 AI 更准确地理解你的意图</span></li>
<li>「Context 工程」<span>:研究"给 AI 看什么"——哪些文件、哪些代码、哪些规范应该在 AI 的"视野"里</span></li>
</ul>
<p><span>打个比方:Prompt 工程是你"怎么跟同事说话",Context 工程是你"把哪些文档放到同事桌上"。</span></p>
<p><span>说得再直白一点:「Prompt 写得再好,如果 AI 看不到正确的代码和背景信息,它照样写出离谱的东西。」</span></p>
<p><span>所以在实际 AI 编码中,Context 工程比 Prompt 工程更重要,也更容易被忽略。</span></p>
<h3><span>AI 需要哪两类上下文?</span></h3>
<p><span>不管你用 Cursor、Claude Code 还是 Continue,AI 每次干活时需要的上下文,本质上就两类:</span></p>
<p><img alt="image" width="537" height="291" loading="lazy" src="https://img2024.cnblogs.com/blog/1022151/202604/1022151-20260408120724279-139604752.png" class="lazyload"></p>
<p>「1)意图上下文(Intent Context)—— "你想让我干嘛"」</p>
<p><span>就是你的指令、目标、约束条件。比如:</span></p>
<ul class="list-paddingleft-1">
<li><span>"帮我修复登录页面的 bug,用户点击登录按钮没反应"</span></li>
<li><span>"写一个新的 UserCard 组件,用 CSS Modules,不要用 Tailwind"</span></li>
<li><span>"重构这个函数,但不要改变外部接口"</span></li>
</ul>
<p><span>这些信息告诉 AI"方向在哪"。</span></p>
<p>「2)状态上下文(State Context)—— "现在是什么情况"」</p>
<p><span>就是当前项目的实际状态。比如:</span></p>
<ul class="list-paddingleft-1">
<li><span>当前文件的代码内容</span></li>
<li><span>报错信息和堆栈</span></li>
<li><span>项目的目录结构和技术栈</span></li>
<li><span>Git 分支和最近的提交记录</span></li>
<li><span>相关文件的依赖关系</span></li>
</ul>
<p><span>这些信息告诉 AI"现场长什么样"。</span></p>
<p>「AI 输出的质量 = 意图上下文 × 状态上下文。」</p>
<p><span>缺了意图,AI 不知道该往哪个方向走。缺了状态,AI 只能靠猜——猜你的项目结构、猜你的技术栈、猜你的代码风格,猜来猜去就跑偏了。</span></p>
<p><span>很多时候你觉得 AI "不好用",仔细想想,是不是其实你只给了意图("帮我写个组件"),但没给状态("我的项目用的什么框架、组件放在哪、样式方案是啥")?</span></p>
<h3><span>上下文窗口:AI 的"工作记忆"有上限</span></h3>
<p><span>这里要讲一个很关键但很多人不太清楚的事儿:「AI 的上下文窗口是有容量上限的。」</span></p>
<p><span>你可以把它想象成 AI 的"工作台桌面"。桌面就这么大,你堆的文件越多,它越容易手忙脚乱、找不到重点。</span></p>
<p><span>目前主流 AI 模型的上下文窗口大概在 128K~200K token 左右。听起来很大,但一个中等规模的前端项目,光&nbsp;<code><span>src/</span></code><span>&nbsp;目录下的代码就可能超过这个数。「你不可能把所有代码都"放到桌上"。」</span></span></p>
<p><img alt="image" width="537" height="293" loading="lazy" src="https://img2024.cnblogs.com/blog/1022151/202604/1022151-20260408120800192-1746244545.png" class="lazyload"></p>
<p><span>所以就有了一个"甜蜜区间"的概念:</span></p>
<ul class="list-paddingleft-1">
<li>「上下文占用 &amp;lt; 40%」<span>:AI 缺信息,容易瞎猜、编造不存在的函数或文件</span></li>
<li>「上下文占用 40%~60%」<span>:信息刚刚好,AI 既有足够的背景,又不会被无关内容干扰</span></li>
<li>「上下文占用 &amp;gt; 60%」<span>:信息过载,AI 开始"迷路"——可能忽略重要信息,或者前后矛盾</span></li>
</ul>
<p>「Context 工程的核心目标,就是把上下文控制在那个甜蜜区间里。」</p>
<h3><span>上下文的四个层次</span></h3>
<p><span>在 Cursor、Claude Code 这类 AI 编辑器里,上下文其实是分层的,从自动到手动,从低到高:</span></p>
<p><img alt="image" width="447" height="243" loading="lazy" src="https://img2024.cnblogs.com/blog/1022151/202604/1022151-20260408120825329-232432773.png" class="lazyload"></p>
<h4><span>第一层:自动上下文(AI 自己收集的)</span></h4>
<p><span>你什么都不用做,AI 编辑器就会自动收集一些信息:</span></p>
<ul class="list-paddingleft-1">
<li>「当前打开的文件」<span>:你正在看的代码,AI 自然也能看到</span></li>
<li>「打开的标签页」<span>:Cursor 会参考你 IDE 里打开的其他文件</span></li>
<li>「代码库索引」<span>:AI 编辑器会在后台给你整个项目建索引,用语义搜索找相关代码</span></li>
</ul>
<p><span>这一层是"基线",不需要你操心,但也「不要过度依赖」<span>。因为自动上下文的选择经常不够精准——特别是大型项目,AI 自动找到的文件可能跟你当前任务关系不大。</span></span></p>
<h4><span>第二层:手动上下文(你主动"喂"给 AI 的)</span></h4>
<p><span>这是提升 AI 输出质量最立竿见影的方法——「直接告诉 AI 应该看哪些文件。」</span></p>
<p><span>在 Cursor 里,你可以用&nbsp;<code><span>@</span></code><span>&nbsp;符号来精准引用:</span></span></p>
<ul class="list-paddingleft-1">
<li><code><span>@Files</span></code><span>&nbsp;—— 指定某个具体文件:"看一下 @src/hooks/useAuth.ts"</span></li>
<li><code><span>@Folders</span></code><span>&nbsp;—— 指定某个目录:"参考 @src/components/ 下的组件风格"</span></li>
<li><code><span>@Code</span></code><span>&nbsp;—— 指定某段代码:选中代码后引用</span></li>
<li><code><span>@Docs</span></code><span>&nbsp;—— 引用文档:让 AI 参考外部文档</span></li>
<li><code><span>@Git</span></code><span>&nbsp;—— 引用 Git 信息:最近的 commit、diff 等</span></li>
</ul>
<p><span>在 Claude Code 里也有类似的机制,你可以在对话中直接粘贴文件内容或路径。</span></p>
<p>「我的经验:养成习惯,每次给 AI 派任务前,先花 10 秒想一想"它需要看到哪几个文件",然后用 @ 手动引用。」<span>&nbsp;这 10 秒的投入,能省你后面 10 分钟的返工。</span></p>
<p><span>举个真实例子:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">❌ 差的做法:
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">帮我写一个用户列表页面</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">

→ AI 不知道你的路由怎么配、组件怎么写、请求怎么发,只能按它自己的理解来



✅ 好的做法:
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">帮我写一个用户列表页面,</span>
参考 @src/pages/OrderList/<span style="color: rgba(0, 0, 0, 1)">index.tsx 的页面结构,
用 @src</span>/hooks/<span style="color: rgba(0, 0, 0, 1)">useRequest.ts 里封装的请求方法,
样式参考 @src</span>/pages/OrderList/index.module.css<span style="color: rgba(128, 0, 0, 1)">"
</span><span style="color: rgba(0, 0, 0, 1)">
→ AI 有了三个</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">参照物</span><span style="color: rgba(128, 0, 0, 1)">"</span>,写出来的代码跟项目风格一致</pre>
</div>
<p><span>你看,区别就在于你有没有把"参照物"给到位。</span></p>
<h4><span>第三层:规则上下文(长期生效的"项目记忆")</span></h4>
<p><span>手动 @ 每次都要重复,有没有什么办法让 AI 自动就知道一些规则?有,就是通过配置文件来实现"持久化记忆":</span></p>
<table>
<thead>
<tr><th><span>工具</span></th><th><span>配置文件</span></th><th><span>作用</span></th></tr>
</thead>
<tbody>
<tr>
<td><span>Cursor</span></td>
<td><code><span>.cursor/rules/*.mdc</span></code></td>
<td><span>项目级规则,支持 glob 匹配特定文件类型</span></td>
</tr>
<tr>
<td><span>Claude Code</span></td>
<td><code><span>CLAUDE.md</span></code></td>
<td><span>项目根目录放一个文件,永久生效</span></td>
</tr>
<tr>
<td><span>GitHub Copilot</span></td>
<td><code><span>.github/copilot-instructions.md</span></code></td>
<td><span>Copilot 全局指令</span></td>
</tr>
<tr>
<td><span>通用</span></td>
<td><code><span>AGENTS.md</span></code></td>
<td><span>跨工具通用的 Agent 指令文件</span></td>
</tr>
</tbody>
</table>
<p><span>这一层的好处是"一次配置,每次生效"。你把团队的编码规范、技术栈偏好、目录约定写进去,AI 每次对话都能自动读取。</span></p>
<p><span>前面 Skills 那篇文章里讲的&nbsp;<code><span>.cursor/rules/</span></code><span>&nbsp;就属于这一层。如果你还没配过,强烈建议先去配一个最基础的——至少告诉 AI 你们用什么框架、什么样式方案、组件放在哪个目录。</span></span></p>
<h4><span>第四层:会话上下文(当前对话的"短期记忆")</span></h4>
<p><span>就是你和 AI 在当前这轮对话中的所有聊天记录。AI 会记住你前面说了啥、它前面改了啥。</span></p>
<p><span>但这里有个坑:「对话越长,AI 越容易"忘事"。」</span></p>
<p><span>因为上下文窗口是有限的,聊天记录越长,早期的内容就越容易被"挤掉"或"淡化"。这在 AI 研究里叫"lost in the middle"——中间的信息最容易被忽略。</span></p>
<p>「所以我的建议:一个任务一轮对话,做完就开新的。」<span>&nbsp;别在一个对话里又改 bug、又写新功能、又做重构,那样后期的输出质量一定会下降。</span></p>
<h3><span>实操:8 个马上能用的 Context 管理技巧</span></h3>
<p><span>原理讲完了,接下来说具体怎么做。这 8 个技巧是我自己用下来最有效的,从简到难排列,你可以一个一个试:</span></p>
<h4><span>技巧一:用 @ 引用代替"你去看看"</span></h4>
<p><span>不要说"帮我参考项目里类似的页面",AI 不一定能找到你想要的。直接 @ 具体文件:</span></p>
<div class="cnblogs_code">
<pre>❌ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">参考项目里其他页面的写法</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">

✅ </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">参考 @src/pages/Dashboard/index.tsx 的写法</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p><span>精准引用,永远比让 AI 自己"搜"靠谱。</span></p>
<h4><span>技巧二:大项目用 .cursorignore 减负</span></h4>
<p><span>就像&nbsp;<code><span>.gitignore</span></code><span>&nbsp;一样,<code><span>.cursorignore</span></code><span>&nbsp;告诉 AI 编辑器"这些文件你不用管"</span></span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> .cursorignore</span>
<span style="color: rgba(0, 0, 0, 1)">
node_modules</span>/<span style="color: rgba(0, 0, 0, 1)">
dist</span>/<span style="color: rgba(0, 0, 0, 1)">
build</span>/<span style="color: rgba(0, 0, 0, 1)">
.next</span>/<span style="color: rgba(0, 0, 0, 1)">
coverage</span>/
*<span style="color: rgba(0, 0, 0, 1)">.lock
</span>*.map</pre>
</div>
<p><span>好处很直接:索引更快、搜索更准、AI 不会被&nbsp;<code><span>node_modules</span></code><span>&nbsp;里几万个文件干扰。</span></span></p>
<p><span>「但注意:千万别把&nbsp;<code><span>src/</span></code><span>、<code><span>test/</span></code><span>、配置文件这些排除掉。」<span>&nbsp;它们是 AI 理解你项目的关键信息。</span></span></span></span></p>
<h4><span>技巧三:Monorepo 只打开你在做的那个包</span></h4>
<p><span>如果你的项目是 Monorepo,别直接打开整个仓库根目录。</span></p>
<div class="cnblogs_code">
<pre>❌ 打开 /my-monorepo(包含 20<span style="color: rgba(0, 0, 0, 1)"> 个子包,AI 疯狂索引)

✅ 打开 </span>/my-monorepo/packages/web-app(只有你在做的那个包)</pre>
</div>
<p><span>上下文窗口就这么大,只打开你正在开发的部分,AI 的"注意力"才能集中在正确的地方。</span></p>
<p><span>如果确实需要跨包引用,可以用 VS Code 的多根工作区(Multi-root Workspace),只挂载你需要的几个包。</span></p>
<h4><span>技巧四:写好 Rules 文件,让 AI 自动"懂规矩"</span></h4>
<p><span>这个在 Skills 那篇详细讲过了,这里快速给个模板。在&nbsp;<code><span>.cursor/rules/</span></code><span>&nbsp;下创建一个&nbsp;<code><span>project-context.mdc</span></code><span>:</span></span></span></p>
<div class="cnblogs_code">
<pre>---<span style="color: rgba(0, 0, 0, 1)">
description: Project context </span><span style="color: rgba(0, 0, 255, 1)">and</span><span style="color: rgba(0, 0, 0, 1)"> conventions
alwaysApply: true
</span>---

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"># 技术栈</span>
- React 18 + TypeScript 5
-<span style="color: rgba(0, 0, 0, 1)"> 样式:CSS Modules
</span>-<span style="color: rgba(0, 0, 0, 1)"> 状态管理:Zustand
</span>- 请求:封装在 src/api/<span style="color: rgba(0, 0, 0, 1)">request.ts

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"># 目录约定</span>
- 页面:src/pages//<span style="color: rgba(0, 0, 0, 1)">index.tsx
</span>- 组件:src/components//<span style="color: rgba(0, 0, 0, 1)">index.tsx
</span>- Hooks:src/hooks/<span style="color: rgba(0, 0, 0, 1)">use.ts

</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"># 编码规范</span>
-<span style="color: rgba(0, 0, 0, 1)"> 组件用 named export,不用 default export
</span>-<span style="color: rgba(0, 0, 0, 1)"> Props 用 interface 定义,命名为 [组件名]Props
</span>- 日期处理用 dayjs,不要用 moment</pre>
</div>
<p><span>这些信息 AI 每次对话都会自动读取,相当于你给 AI 安了一个"项目记忆芯片"。</span></p>
<h4><span>技巧五:用 Notepads 管理高频上下文片段</span></h4>
<p><span>Cursor 有个很好用但很多人不知道的功能——「Notepads」<span>。</span></span></p>
<p><span>你可以把一些经常要引用的上下文片段保存为 Notepad,比如:</span></p>
<ul class="list-paddingleft-1">
<li><span>API 接口的类型定义</span></li>
<li><span>团队的 code review 标准</span></li>
<li><span>某个复杂业务逻辑的说明</span></li>
</ul>
<p><span>需要的时候&nbsp;<code><span>@Notepads</span></code><span>&nbsp;一下就能引用,不用每次都重新粘贴。</span></span></p>
<h4><span>技巧六:一个任务一个对话,及时"翻篇"</span></h4>
<p><span>前面说了,对话越长上下文质量越差。所以:</span></p>
<ul class="list-paddingleft-1">
<li><span>修一个 bug → 新对话</span></li>
<li><span>写一个新功能 → 新对话</span></li>
<li><span>做一次重构 → 新对话</span></li>
</ul>
<p><span>在 Claude Code 里有个&nbsp;<code><span>/clear</span></code><span>&nbsp;命令可以清空当前上下文重新开始。Cursor 里直接新建一个 Composer 就行。</span></span></p>
<p>「别舍不得"之前聊了那么多"。」<span>&nbsp;带着一堆过时的上下文继续聊,不如干干净净地重新开始。AI 不需要"预热",但它需要"干净的视野"。</span></p>
<h4><span>技巧七:长输出让 AI 写文件,别塞对话里</span></h4>
<p><span>如果你让 AI 生成了一大段代码或者分析报告,别让它直接输出到对话里——那会严重挤占上下文窗口。</span></p>
<p><span>更好的做法是让 AI 把结果写到文件里:</span></p>
<div class="cnblogs_code">
<pre>❌ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">帮我分析所有组件的依赖关系,列出来</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
→ AI 输出 </span>500<span style="color: rgba(0, 0, 0, 1)"> 行分析结果,塞满了上下文窗口

✅ </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">帮我分析所有组件的依赖关系,结果写到 docs/dependency-analysis.md 里</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
→ 上下文窗口保持干净,结果保存在文件里随时查看</span></pre>
</div>
<h4><span>技巧八:定期审计你的 alwaysApply 规则</span></h4>
<p><span>如果你在&nbsp;<code><span>.cursor/rules/</span></code><span>&nbsp;里配了很多&nbsp;<code><span>alwaysApply: true</span></code><span>&nbsp;的规则,它们「每次对话都会被加载」<span>。随着规则越来越多,光是规则本身就可能吃掉不少上下文窗口。</span></span></span></span></p>
<p><span>建议定期审计:</span></p>
<ul class="list-paddingleft-1">
<li><span>真正需要"每次都看"的规则才设&nbsp;<code><span>alwaysApply: true</span></code></span></li>
<li><span>只跟特定文件类型相关的规则,用&nbsp;<code><span>globs</span></code><span>&nbsp;匹配,按需加载</span></span></li>
<li><span>过时的规则及时删掉</span></li>
</ul>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> ✅ 只在写 React 组件时加载</span>

---<span style="color: rgba(0, 0, 0, 1)">
description:Reactcomponentconventions
globs:src</span>/components/**/*<span style="color: rgba(0, 0, 0, 1)">.tsx
alwaysApply:false
</span>---

<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> ❌ 不需要每次都加载的规则硬设成 alwaysApply</span>

---<span style="color: rgba(0, 0, 0, 1)">
description:Reactcomponentconventions
alwaysApply:true
</span>---</pre>
</div>
<h3><span>三大主流工具的 Context 机制对比</span></h3>
<p><span>你可能同时在用或者考虑用不同的 AI 编码工具,这里做个横向对比,帮你了解各家的上下文机制有什么差异:</span></p>
<table>
<thead>
<tr><th><span>特性</span></th><th><span>Cursor</span></th><th><span>Claude Code</span></th><th><span>Continue(开源)</span></th></tr>
</thead>
<tbody>
<tr>
<td><span>自动索引</span></td>
<td><span>语义嵌入索引,后台自动建</span></td>
<td><span>基于项目结构分析</span></td>
<td><span>支持多种索引方式,可配置</span></td>
</tr>
<tr>
<td><span>手动引用</span></td>
<td><code><span>@Files</span></code><code><span>@Folders</span></code><code><span>@Docs</span></code><code><span>@Code</span></code><code><span>@Git</span></code></td>
<td><span>对话中引用文件路径</span></td>
<td><span>@ 符号 + 自定义 context provider</span></td>
</tr>
<tr>
<td><span>持久化规则</span></td>
<td><code><span>.cursor/rules/*.mdc</span></code></td>
<td><code><span>CLAUDE.md</span></code></td>
<td><code><span>.continue/</span></code><span>&nbsp;目录配置</span></td>
</tr>
<tr>
<td><span>上下文排除</span></td>
<td><code><span>.cursorignore</span></code></td>
<td><span>项目级配置</span></td>
<td><code><span>.continueignore</span></code></td>
</tr>
<tr>
<td><span>会话管理</span></td>
<td><span>新建 Composer / Chat</span></td>
<td><code><span>/clear</span></code><span>&nbsp;清空</span></td>
<td><span>新建会话</span></td>
</tr>
<tr>
<td><span>Notepads</span></td>
<td><span>支持</span></td>
<td><span>不支持(用 CLAUDE.md 替代)</span></td>
<td><span>不支持</span></td>
</tr>
<tr>
<td><span>动态发现</span></td>
<td><span>语义搜索自动查找</span></td>
<td><span>Agent 自主决定读取哪些文件</span></td>
<td><span>依赖配置的 context provider</span></td>
</tr>
</tbody>
</table>
<p>「如果你只用 Cursor」<span>:重点掌握&nbsp;<code><span>@</span></code><span>&nbsp;引用、<code><span>.cursor/rules/</span></code><span>、<code><span>.cursorignore</span></code><span>&nbsp;和 Notepads。</span></span></span></span></p>
<p>「如果你用 Claude Code」<span>:重点掌握&nbsp;<code><span>CLAUDE.md</span></code><span>&nbsp;的写法和&nbsp;<code><span>/clear</span></code><span>&nbsp;的使用时机。</span></span></span></p>
<p>「如果你用 Continue」<span>:重点研究 context provider 的配置,它的灵活性最高但上手门槛也最高。</span></p>
<h3><span>一个完整的实战例子</span></h3>
<p><span>来看一个真实场景,把上面讲的东西串起来。</span></p>
<p>「场景:你要在项目里新增一个"用户详情"页面。」</p>
<p>「第一步:确保规则上下文到位」</p>
<p><span>检查&nbsp;<code><span>.cursor/rules/</span></code><span>&nbsp;里有没有项目级规则文件。如果还没有,先写一个基础的(见前面技巧四的模板)。</span></span></p>
<p>「第二步:手动引用"参照物"」</p>
<p><span>打开 Composer,输入任务时带上具体的参考文件:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">帮我新增一个用户详情页面 UserDetail,需求:
</span>- 路由 /user/<span style="color: rgba(0, 0, 0, 1)">:id
</span>-<span style="color: rgba(0, 0, 0, 1)"> 根据 id 请求用户信息并展示

请参考:
</span>-@src/pages/OrderDetail/<span style="color: rgba(0, 0, 0, 1)">index.tsx(页面结构参考)
</span>-@src/hooks/<span style="color: rgba(0, 0, 0, 1)">useRequest.ts(请求方法)
</span>-@src/router/<span style="color: rgba(0, 0, 0, 1)">config.ts(路由注册方式)
</span>-@src/types/user.ts(用户类型定义)</pre>
</div>
<p>「第三步:控制对话粒度」</p>
<p><span>不要说"帮我把这个页面从头到尾做完"。拆成几步:</span></p>
<ol class="list-paddingleft-1">
<li><span>先让 AI 创建页面文件和注册路由</span></li>
<li><span>确认路由没问题后,再让 AI 写页面主体逻辑</span></li>
<li><span>最后让 AI 补测试</span></li>
</ol>
<p><span>每一步做完确认一下,再继续下一步。这样每次 AI 需要处理的上下文更小、更精准。</span></p>
<p>「第四步:做完这个任务,开新对话」</p>
<p><span>用户详情页做完了,接下来要做另一个功能?别继续在这个对话里聊,新建一个 Composer,让 AI 带着"干净的视野"开始新任务。</span></p>
<h3><span>避坑指南</span></h3>
<p><span>最后说几个常见的坑,都是容易踩的:</span></p>
<h4><span>1. 别把所有文件都 @ 进去</span></h4>
<p><span>有人觉得"给的越多越好",一口气 @ 了 20 个文件。结果 AI 被信息淹没了,输出质量反而下降。</span></p>
<p>「原则:每次只引用跟当前任务直接相关的 3~5 个文件。」</p>
<h4><span>2. 别忽略报错信息</span></h4>
<p><span>当你让 AI 修 bug 时,「一定要把完整的报错信息贴上去」<span>。很多人只说"这里报错了",AI 就只能靠猜。把 error stack 贴全,AI 的诊断准确率会高很多。</span></span></p>
<h4><span>3. 别在一个超长对话里"万事包办"</span></h4>
<p><span>前面说了好几遍了:一个任务一个对话。对话长了,AI 会"忘事",会前后矛盾,会把前面的要求和后面的要求混在一起。</span></p>
<h4><span>4. 别让自动上下文替你思考</span></h4>
<p><span>AI 编辑器的自动索引和语义搜索确实能帮你找到一些相关文件,但它的判断不总是对的。「特别是大型项目或者 Monorepo,自动上下文经常"找错重点"。」</span></p>
<p><span>花 10 秒手动 @ 几个关键文件,永远比期待 AI 自己找对要靠谱。</span></p>
<h4><span>5. 别忘了"负面约束"</span></h4>
<p><span>不光要告诉 AI "做什么",也要告诉它 "不做什么":</span></p>
<div class="cnblogs_code">
<pre>✅ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">用 CSS Modules,不要用 Tailwind</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
✅ </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">用 dayjs,不要用 moment</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
✅ </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">只改 UserDetail 组件,不要动其他文件</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p><span>负面约束能有效防止 AI "自作主张"。</span></p>
<h3><span>总结</span></h3>
<p><span>Context 工程的核心就一句话:「让 AI 在正确的时间看到正确的信息。」</span></p>
<p><span>不多也不少,不早也不晚。太少了 AI 瞎猜,太多了 AI 迷路。</span></p>
<p><span>如果你今天只能记住三件事,那就是:</span></p>
<ol class="list-paddingleft-1">
<li>「每次 @ 3~5 个相关文件」<span>,比什么都不给好 10 倍</span></li>
<li>「写一个 Rules 文件」<span>,把项目的技术栈和目录规范告诉 AI</span></li>
<li>「一个任务一个对话」<span>,别在长对话里"万事包办"</span></li>
</ol>
<p><span>这三个习惯养成之后,你用 AI 编码的效率和质量会有一个明显的提升。</span></p>
<p><span>想要进一步了解,推荐这些资源:</span></p>
<ul class="list-paddingleft-1">
<li>「Cursor 动态上下文发现」<span>:https://cursor.com/blog/dynamic-context-discovery</span></li>
<li>「Claude Code Context 工程」<span>:https://claudefa.st/blog/guide/mechanics/context-engineering</span></li>
<li>「Developer Toolkit 上下文管理指南」<span>:https://developertoolkit.ai/en/shared-workflows/context-management/</span></li>
<li>「Continue 开源项目」<span>:https://github.com/continuedev/continue</span></li>
</ul>
<p>&nbsp;</p>
<p><span>原文链接:https://mp.weixin.qq.com/s/8dXjVDH9ixpTPcjWo0pFPg</span></p><br><br>
来源:https://www.cnblogs.com/momo798/p/19834684
頁: [1]
查看完整版本: Context 工程:如何把正确的上下文喂给 AI