像 Cursor、Copilot 这类 AI 编程助手正快速成为程序员的好帮手。很多人可能觉得它们内部非常复杂,其实核心思路很直接。为了实现高效运行,开发团队的重点往往在:保证流程稳定可控(应对 AI 输出的不确定性)和优化性能以节省宝贵的上下文空间。Cursor 中强大的“编辑代码”功能,就完美体现了“节省上下文空间”的巧妙设计。
你可以把 Cursor 的核心想象成一个聪明的“工具使用者”(技术上称为 Agent)。它的工作方式很简单:
Cursor 内部定义了一系列专门工具(对于 OpenAI 模型,通过 function_call 实现)。核心工具有这些:
假设你想“把页面上的主按钮换成 Ant Design 的 Button 组件”。Cursor 内部可能会这样一步步做:
检查依赖 (run_terminal_cmd):
{
"command": "npm list antd || echo 'antd not installed'",
"explanation": "看看 antd 这个库装没装,没装的话后面得处理。"
}
执行命令检查 antd 是否安装,结果会告诉 Cursor 是否需要安装。
找到按钮在哪 (grep_search):
{
"query": "主按钮|main-button|primary",
"include_pattern": "*.jsx|*.tsx|*.js",
"explanation": "在所有 JSX/TSX/JS 文件里,找含有‘主按钮’、‘main-button’或‘primary’这些词的代码,确定要改哪个文件。"
}
搜索定位包含目标按钮代码的文件。
看清按钮上下文 (read_file):
{
"target_file": "src/components/ExamplePage.jsx",
"start_line_one_indexed": 1,
"end_line_one_indexed_inclusive": 50,
"should_read_entire_file": false,
"explanation": "读找到的文件(比如前50行),看看按钮周围是什么代码,比如用了什么样式、绑定了什么点击事件。"
}
只读取文件的一部分(比如前50行),了解按钮的具体使用情况(样式、事件等),避免读整个大文件浪费资源。
执行替换 (edit_file):
{
"target_file": "src/components/ExamplePage.jsx",
"instructions": "把原来的按钮换成 antd 的 Button 组件,原来的样式和点击事件都要保留。",
"code_edit": "// ... existing code ...\nimport { Button } from 'antd';\n// ... existing code ...\n<Button type=\"primary\">主按钮</Button>\n// ... existing code ..."
}
根据指令和获取到的信息,生成具体的代码修改方案并应用。
重要提示: 由于 AI 模型每次回答可能不同,实际步骤顺序也可能变化。例如,找按钮位置时,它也可能先用 list_dir 列出文件,再根据文件名猜哪个文件更可能有按钮代码。为了让 AI 记住“之前做了什么”和“接下来该做什么”,这些信息都会放在给模型的“上下文”里。但上下文大小有限制,所以 Cursor 做了很多优化:默认最多只执行 20 步操作。read_file 一次最多只读 200 行代码,不够再读下一段。而 edit_file 工具本身的设计,就是节省上下文空间的典范。
read_file 读取文件内容已经很占上下文空间了。如果没有优化,edit_file 会更费空间,因为它需要知道两样东西:
文件原来是什么样子(原始内容)。
文件应该改成什么样子(修改方案)。
所以,edit_file 不像 list_dir(对应简单的 ls 命令)那样一步到位。它是一个更复杂、更智能的流程,通常包含 至少3个步骤,涉及 至少2次模型调用:
读取原始文件 (read_file): 获取要修改的文件内容。
生成编辑方案 (用聪明的大模型): 把用户指令、文件路径和文件内容(或部分内容)发给一个能力强的模型(比如 Claude 3.5 或 GPT-4)。这个模型的任务是:理解指令,并生成一个只包含修改点及其附近上下文的方案,用 // ... existing code ... 这样的注释代替那些没改动的代码块。
应用编辑方案 (用小模型): 把步骤2生成的“带注释的方案”和完整的“原始文件内容”一起,发给一个速度快、参数小的模型(或专门微调过的模型)。这个小模型的任务很明确:把方案里的注释 (// ... existing code ...) 精准地还原成原始文件中对应的实际代码,生成最终的、完整的修改后文件内容。
假设你要在 src/utils/math.ts 文件里加一个算斐波那契数列的函数。
第一步:读文件 (read_file)
文件原始内容:
// 数学工具函数集合
/**
* 计算两个数的和
*/
export function add(a: number, b: number): number {
return a + b;
}
/**
* 计算两个数的差
*/
export function subtract(a: number, b: number): number {
return a - b;
}
第二步:聪明模型生成编辑方案
请求聪明模型(输入包含指令、文件路径和原始内容):
{
"content": "上面读取到的原始代码",
"query": "添加一个计算斐波那契数列的函数",
"path": "src/utils/math.ts"
}
聪明模型返回方案(重点看省略方式):
// 数学工具函数集合
// ... existing code ...
/**
* 计算斐波那契数列的第n个数
*/
export function fibonacci(n: number): number {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
关键节省点: 它用 // ... existing code ... 省略了中间未修改的 add 和 subtract 函数代码。这大大减少了需要传递给下一步的文本量。
第三步:小模型执行最终合并
请求小模型(输入包含原始完整内容和上一步的“带注释方案”):
{
"content": "第一步读取的完整原始代码",
"query": "添加一个计算斐波那契数列的函数",
"path": "src/utils/math.ts",
"code_edit": "第二步返回的带注释的方案代码"
}
小模型精准地将 // ... existing code ... 替换回原始文件中对应的实际代码块,生成最终结果:
// 数学工具函数集合
/**
* 计算两个数的和
*/
export function add(a: number, b: number): number {
return a + b;
}
/**
* 计算两个数的差
*/
export function subtract(a: number, b: number): number {
return a - b;
}
/**
* 计算斐波那契数列的第n个数
*/
export function fibonacci(n: number): number {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
这一步逻辑相对简单(主要是文本查找和替换),但对速度要求高,所以适合小模型快速完成。
核心好处:节省上下文空间。 第二步生成的“带注释方案”体积远小于包含所有未修改代码的完整“修改后版本”。这允许处理更大的文件或在有限上下文内进行更多步骤。
Cursor 的核心是一个基于“工具使用者”(Agent)思想的系统,它通过调用一系列定义好的工具(如读文件、搜索、执行命令、编辑文件)来完成编程任务。大部分工具(如 read_file, grep_search)的实现比较直接,对应单一操作。而 edit_file 工具则是一个精心设计的、多步骤的 AI 工作流程。
这个流程的核心在于:利用聪明模型生成一个只突出显示修改点并用注释省略未改动部分的“编辑方案”,然后将这个精简方案连同原始文件交给一个小模型完成最终代码合并。这种设计的主要驱动力是突破模型上下文长度的限制,让 Cursor 能够更高效地处理代码编辑任务,尤其是涉及较大文件时。同时,通过 reapply 工具提供了对编辑质量的最终保障。理解这个原理,有助于我们更有效地使用 Cursor 这类 AI 编程助手,理解其能力边界和背后的智慧。
当今时代,人工智能已经成为了各行各业中无可替代的角色。从智能客服到自动驾驶汽车,从语音识别到图像处理,人工智能的应用正在不断扩展。而在这个人工智能的时代,许多AI平台已经涌现出来
作为一名在代码世界摸爬滚打八年的程序员,我的工位曾堆满了各类技术书籍,如今屏幕上最常亮的却是 Copilot、ChatGPT 这些 AI 工具的界面。从 2023 年底被朋友 拽入 AI 大门
当Claude产品负责人宣布团队95%的代码由AI生成时,技术圈瞬间掀起巨浪。许多开发者开始焦虑,担心自己的职业生涯即将终结。但真实情况究竟如何?让我们揭开表象。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!