Cursor 的 agent 模式本质上就是 VSCode(引入对话的交互) + 大模型(Claude 3.7 Sonnet 等) + tools use(读文件、写文件、搜索文件) + 提示词。
这篇文章利用 Cursor 的自定义模型来查看一下每次对话时 Cursor 自动填充的提示词。
环境准备
ollama
安装 https://ollama.com/,一个可以方便的本地运行开源大语言模型的软件。
安装完成之后在命令行执行 ollama pull qwen2.5:7b
随便拉取一个模型。
安装完之后运行该模型 ollama run qwen2.5:7b
。
接着就可以和 chatGPT 一样聊天了,只不过是在命令行:
ollama 也会监听 11434 端口,提供了 HTTP 接口服务:
1 | curl http://localhost:11434/api/generate -d '{ |
当然,现在也有很多开源的可视化工具,比如 open-webui,可以结合 ollama 直接在本地使用。
ollama list 可以查看已经安装的所有大模型:
ngrok
一个内网穿透工具,可以把本地运行的服务(比如 localhost:11434
)通过一个公网地址暴露出去。
直接按照官网网站注册、安装一条龙就可以:
安装之后,先执行上边的 ngrok config add-authtoken xxxxxxxxxxxxxx
,接着执行 ngrok http http://localhost:11434
就把本地 ollama 的 HTTP 接口暴露到公网了:
ngrok 会提供一个新的域名给我们,用 curl 再测试一下:
1 | curl https://1c9a-81-28-13-186.ngrok-free.app/api/generate -d '{ |
啥也没返回,是返回了 403:
问下 chatGPT
ctrl+C 终止 ngrok 的运行,在命令行执行 OLLAMA_HOST=0.0.0.0 ollama serve
。
新开一个命令行窗口执行 ngrok http http://localhost:11434
接着再在新的窗口执行 curl
进行测试,curl 的域名要换成大家自己生成的:
1 | curl https://d7a5-81-28-13-186.ngrok-free.app/api/generate -d '{ |
成功返回:
Cursor 配置
打开 Cursor 的设置,先把其他的 model 都反选掉,再加一个 qwen2.5:7b
的 model,下边的 api 地址填写 ngrok 生成的域名加 /v1,API Key 随便写。
点击 Verify
继续点 Enable OpenAI API Key
成功开启本地模型:
此时打开控制台显示的这个本地地址 http://127.0.0.1:4040:
会看到刚才点击 Verify,其实 Cursor 向我们本地大模型发送了一次请求:
被我们成功抓取,后续与 Cursor 的对话我们就可以通过拦截轻松看到 Cursor 的提示词了。
提示词窥探
普通对话
选择 qwen2.5:7b 模型,随便问一个问题:
抓一下请求:
1 | { |
一段一段看一下:
1 | You are a an AI coding assistant, powered by qwen2.5:7b. You operate in Cursor |
明确 AI 的身份是「在 Cursor 编辑器中运行的编程助手」,不是通用型 AI。
指出用户的上下文(如打开的文件、光标、编辑历史)会自动注入,AI 自行判断是否有用。
AI 的主任务是 执行 <user_query> 的指令,不是自己“发挥”,Cursor 把我们的输入包了
user_query
1 | <communication> |
- 规范助手的 Markdown 输出风格,确保输出统一、清晰。
- 特别针对代码表达(文件、函数名)和数学表达(inline/block)做出指令。
1 | <search_and_reading> |
- 指导 AI 在不确定时主动补充信息。
- 但更强调:如果你能解决,就不要打扰用户。
1 | <making_code_changes> |
非常细致地规范了 AI 修改代码的方式、展示的格式、输出的内容结构。
避免不必要的“全量重写”,只写差异(diff)片段。
为内部系统的“apply model”提供结构化提示(如
// ... existing code ...
)
1 | <user_info> |
- 提供用户本地开发环境的信息,供 AI 推断路径、命令格式、兼容性差异等。
1 | You MUST use the following format when citing code regions or blocks: |
强制约定代码片段引用格式,以供系统解析精确的文件位置。
确保编辑器和自动修改工具能知道 AI 指的是哪部分代码。
连续对话
可以看到一个请求中会把历史问题都带着:
所以如果问不想干的问题,最好新开一个窗口,防止让大模型感到困惑。
如果是同一个问题要问多次,也可以选择在原来的问题上进行编辑重新发送:
Cursor rules
新建 .cursor/rules/global.mdc
,测试 rules
重新问个问题:
请求中多了一段 <cursor_rules_context>,把我们设置的 rules 带了过去:
读取文件
按照 tag 再分段看一下:
1 | <cursor_rules_context> |
之前设置的 Cursor rules。
1 | <additional_data> |
当前选中的文件,Line 58 是因为光标在 58 行。
把整个文件传给了 Ai。
1 | </file_contents> |
反标签,和前边配对。
1 | <user_query> |
我们输入的内容。
总
所以回过头看,Cursor 的提示词没那么神秘,说白了,它只是用结构化的方式告诉大模型四个关键点:你是谁、该干啥、上下文是什么、需要注意啥。像 <user_query>、<cursor_rules_context> 这些标签,本质就像是「请求头」和「接口描述」,在每次交互里悄悄声明调用方式、参数信息,帮模型对齐语境,别跑偏、别答错。
理解了这层机制,我们就能反过来思考:模型为啥这么回?我能不能改改上下文或 prompt,让它更贴合预期。