Cursor Chat 完全指南——@ 符号、上下文控制与高效提问模板
第5章:Cursor Chat 完全指南——@ 符号、上下文控制与高效提问模板
Cursor Chat 的核心是 @ 引用系统:用 @文件名精确定位代码、用 @Codebase 搜索整个项目、用 @Web 获取最新技术信息、用 @Git 分析代码历史。但大多数人只会直接发问——这样等于让 AI 蒙着眼睛回答。本章把 @ 系统讲透,讲清楚上下文控制对答案质量的决定性影响,并给出 20 个高频场景的即用提问模板。
先选对工具:Chat vs Cmd+K vs Composer
很多人在 Chat 里做本该用 Cmd+K 完成的事,浪费时间;也有人用 Cmd+K 去做需要 Composer 的多文件任务,然后抱怨 AI 不够聪明。工具选对了,效率才能提升。
| 场景 | 用什么 | 原因 |
|---|---|---|
| 理解一段复杂代码的逻辑 | Chat | 需要解释和对话,可以追问细节 |
| 把当前函数的某几行改写 | Cmd+K | 选中代码直接改,不需要额外上下文,速度最快 |
| 给函数加 JSDoc 注释 | Cmd+K | 选中函数,描述要求,一步到位 |
| 添加一个涉及多个文件的新功能 | Composer | 需要跨文件协调修改,Chat 只能建议,你还要手动操作 |
| 排查一个 bug | Chat 先理解 → Cmd+K 再修 | 先用 Chat + @ 引用相关文件搞懂原因,再用 Cmd+K 精确修改 |
| 学习一个不熟悉的 API 用法 | Chat + @Docs | 需要文档参考,可以多轮追问 |
| 把整个模块迁移到新技术栈 | Composer 或 Claude Code | 涉及大量文件,需要 Agent 级别的执行能力 |
@ 引用系统完全手册
在 Chat 输入框输入 @ 会弹出引用菜单。这是 Cursor Chat 和普通 ChatGPT 最根本的区别——你可以精确控制 AI 看到哪些信息。
@文件名(最常用)
把特定文件的完整内容发给 AI。比让 AI 自己猜相关文件精准得多。
@src/auth/middleware.ts 这个中间件为什么会让所有请求都返回 401?
我检查了 token 是正确的,但每个请求都被拦截了。
@prisma/schema.prisma @src/repositories/UserRepository.ts
这两个文件的 User 模型字段是否一致?我怀疑有不同步的问题。
可以同时 @ 多个文件。当问题涉及两个文件之间的关系(比如 schema 和 repository 是否匹配),必须同时引用两个,AI 才有足够信息回答。
@Codebase(语义搜索整个项目)
不会把整个代码库塞进上下文(那会超出 token 限制),而是在向量索引中做语义搜索,找到最相关的代码片段。适合你不知道相关代码在哪个文件时使用。
@Codebase 项目里有没有重复的数据库连接初始化代码?
我在好几个地方看到 new PrismaClient(),想统一到一个地方管理。
@Codebase JWT token 是在哪里生成的、又在哪里被验证的?
帮我列出所有相关文件和大概的行号。
@Codebase vs @文件名的选择: 知道相关代码在哪个文件时,用 @文件名(更精准,不浪费 token);不知道时,用 @Codebase(让 AI 去搜)。
@Web(实时搜索互联网)
让 AI 搜索最新内容,解决训练数据过期的问题。2024 年后发布的库版本、新 API 变化、最新最佳实践,都应该加 @Web。
@Web React 19 的 use() hook 和 Suspense 结合怎么用?有什么已知的坑吗?
@Web Bun 1.x 的 HTTP server API 和 Node.js 的有什么区别?
我要把一个 Express 应用迁移到 Bun。
注意:@Web 搜索到的内容质量参差不齐,重要信息建议去官方文档二次验证。
@Docs(引用官方文档)
Cursor 内置了主流框架的文档索引(React、Next.js、Tailwind CSS 等)。还可以在 Cursor Settings → Features → Docs 添加自定义文档 URL——把内部 API 文档或第三方库文档加进来,AI 直接参考精确文档而不是凭记忆回答。
@Docs/Next.js App Router 的 generateMetadata 函数怎么处理动态路由参数?
给我一个博客文章页面的完整 SEO 配置示例。
@Docs/Prisma Prisma 的 upsert 在什么情况下会失败?
和先查再更新的方式相比,并发安全性如何?
@Git(分析代码历史)
引用 Git 提交历史和 diff,让 AI 帮你理解代码变更。排查"这个 bug 是什么时候引入的"特别有用。
@Git 最近5次提交改了什么?这些改动可能导致用户登录失败吗?
@Git 这个文件最近是被谁在什么时候修改的?根据 commit message 分析改动的意图。
@Git 帮我整理最近两周的提交记录,生成一个面向非技术人员的 CHANGELOG 草稿。
上下文控制——这是影响质量的关键
AI 回答质量差,90% 的原因是上下文给错了。不是 AI 不够聪明,是你给的信息不够,或者给错了。
坏示例:
这个函数有 bug,帮我改一下
AI 不知道是哪个函数,会随机猜测或者给出一个通用的模板答案,对你毫无帮助。
好示例:
@src/payment/stripe.ts 第 45-67 行的 createPaymentIntent 函数
在处理金额为 0 的订单时会抛出这个错误:
StripeInvalidRequestError: amount must be at least 50 cents
场景:我们的平台允许免费订单(全额优惠券),这时候金额是 0。
请修复这个问题,要求:
1. 金额为 0 时跳过 Stripe 调用,直接标记订单为已支付
2. 金额大于 0 时走正常的 Stripe 流程
3. 不要修改函数签名(调用方很多)
高质量提问的结构公式
[@ 相关文件] + [当前状态/问题现象] + [期望结果] + [约束条件]
20 个高频场景提问模板
理解代码类(1-5)
| # | 场景 | 模板 |
|---|---|---|
| 1 | 理解陌生函数 | @文件名 解释 [函数名] 的工作原理。重点说明:(1) 输入输出;(2) 关键逻辑步骤;(3) 可能的边界情况。 |
| 2 | 理解整个模块 | @目录/ 这个模块的职责是什么?各文件之间的依赖关系是怎样的?画一个简单的调用流程。 |
| 3 | 理解设计决策 | @文件名 为什么这里用 [模式/方法] 而不是 [替代方案]?有没有注释说明原因? |
| 4 | 找重复代码 | @Codebase 项目里有没有重复实现 [功能] 的代码?列出所有相关文件和函数名。 |
| 5 | 理解数据流 | @路由文件 @服务文件 @仓库文件 当用户下单时,数据是如何从 HTTP 请求流转到数据库的?每一层做了什么处理? |
Debug 类(6-10)
| # | 场景 | 模板 |
|---|---|---|
| 6 | 分析报错 | @相关文件 遇到这个错误:[完整错误信息]。分析:(1) 根本原因;(2) 触发条件;(3) 最佳修复方案。 |
| 7 | 排查逻辑 bug | @文件名 第 [X-Y] 行。输入 [输入值],期望输出 [期望值],实际输出 [实际值]。找出逻辑错误在哪里。 |
| 8 | 排查性能问题 | @文件名 这个函数在数据量 [N] 条时执行需要 [时间]。分析可能的性能瓶颈,重点看:N+1 查询、不必要的循环、缺少索引的查询条件。 |
| 9 | 排查内存泄漏 | @文件名 这个组件/服务在长时间运行后内存持续增长。检查:事件监听器是否正确移除、定时器是否清理、闭包是否持有大对象引用。 |
| 10 | 分析错误日志 | @Codebase 分析这段错误日志:[粘贴日志]。找出:(1) 错误的调用链;(2) 问题最可能出在哪个文件;(3) 修复建议。 |
重构类(11-15)
| # | 场景 | 模板 |
|---|---|---|
| 11 | 提取函数 | @文件名 第 [X-Y] 行的代码可以提取成独立函数吗?给出建议的函数名、参数列表、返回值类型,以及提取后的完整代码。 |
| 12 | 消除重复 | @文件A @文件B 这两个文件都实现了 [功能],代码几乎相同。给出消除重复的方案:放到哪里、如何参数化差异、调用方如何修改。 |
| 13 | 改善命名 | @文件名 这些变量/函数的命名不够清晰:[列出名称]。根据它们的实际用途,给出更好的命名建议,并说明改名原因。 |
| 14 | 简化复杂逻辑 | @文件名 第 [X-Y] 行的嵌套 if/else 太深,可读性差。在保持完全相同行为的前提下,给出更简洁的写法。 |
| 15 | 评估重构风险 | @Codebase 如果我修改 [函数/接口],会影响哪些调用方?列出所有需要同步修改的地方,以及改动的风险等级。 |
学习新技术类(16-20)
| # | 场景 | 模板 |
|---|---|---|
| 16 | 类比学习 | @Web 我熟悉 [技术A],现在要学 [技术B]。用 [技术A] 的概念类比解释 [技术B] 的核心概念,举一个同样功能的代码对比例子。 |
| 17 | 评估是否值得学 | @Web 我的项目是 [描述],现在考虑用 [新技术]。和我现在用的 [现有方案] 相比,具体有什么优势?什么情况下不值得迁移? |
| 18 | 了解常见坑 | @Web @Docs/框架名 [功能/API] 有哪些常见的使用错误?每个错误给一个反例代码和正确写法。 |
| 19 | 项目内实践 | @现有文件 参考这个文件的风格,用 [新技术/模式] 改写 [目标函数]。保持测试可通过,给出改写后的完整代码。 |
| 20 | 最佳实践检查 | @文件名 对照 [框架/库] 的当前最佳实践,这个实现有没有过时或不推荐的写法?列出具体的问题和现代写法。 |
多轮对话技巧
什么时候开新 Chat
- 任务类型转变:从排查 bug 切换到开发新功能,开新 Chat——旧上下文会干扰新任务
- 对话超过 20-30 轮:早期的重要上下文已被截断,继续对话 AI 会"忘事"
- AI 开始走错方向:与其花时间纠正,不如新开一个 Chat 重新描述需求
- 主题完全不相关:不同模块的问题开不同 Chat,便于后续 @ 引用对话历史
持久化重要信息的正确方式
- 把架构决策写入
.cursorrules——每次对话自动注入 - 把重要的 API 设计约定写进
CLAUDE.md或专门的docs/decisions.md,用 @文件引用 - 不要依赖"AI 记得我上次说过什么"——它不会记得,新对话从零开始
本章要点
- 先选对工具:Chat 用于理解和多文件问题,Cmd+K 用于精确修改选中代码,Composer 用于跨文件功能开发——不要用错工具然后怪 AI 不够聪明
- @ 引用决定答案质量:知道文件位置用 @文件名,不知道用 @Codebase,需要最新信息用 @Web,需要文档支撑用 @Docs,排查历史问题用 @Git
- 上下文越精确,答案越有用:提问模板是"相关文件 + 问题现象 + 期望结果 + 约束条件",缺少任何一项都会降低答案质量
- 对话污染是真实问题:超过 20 轮的对话、任务类型切换时,果断开新 Chat,不要试图在一个对话里解决所有问题
- 重要信息要持久化:架构约定放 .cursorrules,API 决策写文档,不要依赖 AI 的"记忆"——它没有跨对话记忆