现时 AI 编程助手可以说是程序员提升效率必备神器,选择一个优秀的编程助手,并且熟练使用,能大大提升开发效率。下面针对市面上评价较高,并且功能相对完善的 AI 编程助手进行评测。
评测任务
实现一个 AI Chatbot,包括前端 ReactJS 界面与后端 Golang API,前端使用 OpenAI 兼容的接口,后端代理接口请求,根据不同模型调用不同 API 供应商。
待评测软件
- Cursor, Pro 订阅
- Github copilot, Pro 订阅
- Windsurf, 免费试用版
编程助手功能
- 代码补全,日常最常用功能,通过 Tab 自动补全代码
- Agent 模式,通过对话以及上下文选择,实现项目内大范围的文件修改,命令行操作
- 基于代码上下文的 Chat,常用于代码REVIEW,代码分析,Bug 查找
- 代码编辑,选中一段代码,通过提示词进行修改。
下面主要针对 Agent 相关功能进行评测。
结论
Cursor 效果最优。能在只提供提示词的情况下正确初始化一个可用的 Chatbot 项目。能根据错误提示修改代码,支持两个月前发布的 tailwind 4.0 版本。前端UI直接可用,并且针对对话时间等细节有适当的实现。后端代码结构合理,能使用适当的设计模式。较高的完成度,包括请求后端获取可用模型列表、流式对话输出、前后端合并打包到单个执行文件。
Windsurf 通过大量错误信息反馈后能生成正确解决 tailwind 4.0 导致的错误,但无法使用 tailwind 4.0 实现正确UI,让其降级到 tailwind 3 后前端UI能正常运行。全局代码分析较差,需要用户正确添加需要修改的文件到上下文。代码质量相对 Cursor 明显较差,并且出现明显功能错误。
Copilot 由于Agent功能为实验特性,出现多次请求限制。前端项目无法解决 tailwind 4.0 导致的错误。Chat 工具甚至无法正确分辨当前目录,导致命令执行出错。后端代码无法完整生成,大量空文件,为不可用状态。
以下为各编辑器的测试详情记录
Cursor 评测
前端代码初始化,使用英文提示词,但由于 Cursor 开发环境选择中文,其输出也以中文为主
Initialize a complete chatbot front-end project in the ui directory. The project is based on vite, reactjs, tailwind css and other popular front-end frameworks and components. Function list:
1. Chatbot uses openai compatible methods to connect to the backend API.
2. You can choose different models
3. Support new conversations and display the history conversation list in the sidebar. The history conversation records are stored locally in the browser
输出结果: 注意:以下完整长图均为 Cursor 操作与输出结果,开发者只进行确认操作,未编写代码
首次运行出错,因为新版本 tailwind 等前端有非兼容性修改,将错误信息反馈到 Cursor
Cursor 能通过简单的用户操作与提示,生成完整的前端初始项目。开发者交互也很简单,只需要确认其代码修改与命令行执行。
以上为完成后 UI 界面,可新建对话,记录对话历史。但选择模型与配置功能待完善。
后端代码初始化,直接使用中文提示词:
在 api 目录中初始化一个完整的后端 api 项目,项目使用 golang以及相关后端组件,实现与openai兼容的后端接口代理,功能列表:
1. 与openai兼容的后端代理接口
2. 可以根据前端选用不同的模型,将请求代理到不同的api供应商,支持 openai,deepseek,togertherai
3. 针对不同的api供应商请求,可选地配置 http 代理
4. 通过yaml文件配置
输出结果:
按照提示,后端接口能直接编译运行:
go build -o agent-api
./agent-api --config config.yaml
前后端联调 跨域错误修正
修改后端 config.yaml 以及前端 .env 配置文件,配置使用 openai 与 togetherai 接口,使用 http 代理,支持 gpt-4o, gpt-3.5-turbo, deepseek-ai/DeepSeek-V3 模型。运行,需要解决跨域错误:
接着完善对话模型选择,流式对话模式,配置项缓存到 localStorage,前端 release 输出嵌入 golang embed fs,修复 release 打包错误, 修复301调整错误(详细对话流程可参考代码目录 .specstory/history/ 下文件),最终结果:
Cursor 总结
- 能在只提供提示词的情况下正确初始化一个可用的 Chatbot 功能
- 能根据错误修正支持最新的前端框架特性
- 交互与代码逻辑稳定
- 可以直接在 chat 中执行命令,然后根据命令错误提示信息更新代码
- 细节:UI 界面针对对话时间的展示处理
- 细节:后端代码能使用合适的设计模式;包括 Interface 抽象、依赖注入,Factory,Registry
Github Copilot 评测
针对 Github Copilot,使用与 Cursor 一致的提示词,使用最新 insider 版本 vs code.
前端代码初始化,同样使用 Claude 3.7 Sonnet 模型,出现同样错误,但修复流程明显没有 Cursor 那么直接,进行多次交互后能定位到出错信息,但超出模型请求频率,只能暂停使用。
交互过程如下:
第二天,等待限制消除 再次将错误信息提交,但重复出现修复A导致B错误,修复B导致A错误的过程,无法成功生成能正确运行的前端项目。
后端代码初始化,同样使用中文提示词,无法正确生成合理的go项目代码,为不可用状态。
Copilot总结
- Agent 模式处于试验阶段,模型请求频率限制较大
- 上下文理解较差,甚至多次无法理解当前工作目录路径
Windsurf 评测
前端代码初始化,同样使用 Claude 3.7 Sonnet 模型,通过大量错误信息反馈后能生成正确运行的前端项目,但无法将 tailwind 4.0 正确配置。
通过降级到 tailwind 3 后能正常运行UI,配置API,以及进行对话,但无法通过提示词使其正确支持或者切换 Stream 请求模式。
后端代码初始化,同样使用中文提示词,可生成项目文件,但项目代码结构明显较差,代码啰嗦并且实现错误,未能达到可用标准。譬如:虽然有代理服务器的配置,但最终没有用到配置文件中的代理地址:
// createClient creates an HTTP client with proxy configuration if provided
func createClient(proxyURL string) (*http.Client, error) {
client := &http.Client{}
if proxyURL != "" {
// Set up HTTP client with proxy
proxyTransport, err := createProxyTransport(proxyURL)
if err != nil {
return nil, err
}
client.Transport = proxyTransport
}
return client, nil
}
// createProxyTransport creates a transport with proxy configuration
func createProxyTransport(proxyURL string) (*http.Transport, error) {
transport := &http.Transport{}
if proxyURL != "" {
proxyFunc, err := getProxyFunc(proxyURL)
if err != nil {
return nil, err
}
transport.Proxy = proxyFunc
}
return transport, nil
}
// getProxyFunc returns a proxy function for the given URL
func getProxyFunc(proxyURL string) (func(*http.Request) (*http.URL, error), error) {
proxy, err := http.ProxyFromEnvironment
if err != nil {
return nil, err
}
return proxy, nil
}
Windsurf 总结
- 需要较精确地使用提示词以及选择上下文相关文件
- 生成的代码质量相对较差,甚至出现明显错误
- 开发者需要对项目代码功能有清晰理解才能使用