用AI提升开发效率,让AI写出工程
在人工智能快速发展的今天,如何利用AI工具提升效率,已经成了不少开发者关注的焦点。这篇内容不打算堆概念,直接聊点实际的——如何借助AI提升开发能力,最终还真的搞出了一个面向用户交付的AI代码助手JetBrains插件。

背景
日常工作中,免不了处理各种功能型工具,比如数据分析、日志排查、漏洞测试这一类。不过,一旦这些小需求慢慢演变成中大型工程,个人开发能力往往就有点吃力了,代码质量也容易出问题。
自从大语言模型技术全面爆发后,身边越来越多人在尝试各种AI工具。公司在这块动作也挺快,率先引入了GPT-3.5,全员都能用上,现在已经升级到GPT-4。还请了业界专家开过LLM专题讲座。一家走过20多年的企业,还能保持这种对新技术的热情和开放态度,确实值得佩服。
项目构想
一直用poe.com订阅Claude模型,但频繁的复制粘贴确实挺麻烦的。于是就开始琢磨:能不能做一个面向用户交付的AI代码程序员?这个程序员能理解需求,直接交付最终代码,甚至带上运行效果。说白了,就是面向效果交付——产品提出需求,AI程序员直接给程序,跟现有的开发、产品、测试职责分配刚好契合。
项目形式选择
Claude API和OpenAI API都已经搞定,那把开发软件的主要过程写成tools是不是就行了?有了AI加持,执行效率确实高了很多,理一下流程:
- 开发需求
- 开发成本基本文件操作:创建文件夹、创建文件、写入文件、读取文件、读取多个文件、列出目录、删除文件、修改文件
- 效果验证:编译程序、运行程序、报错处理
流程1和2可以直接上手。至于做成什么形式,考虑了三个方向:
- 独立的聊天对话程序——但没法跟IDE集成,开发完后还得再打开IDE去调试,总感觉不太顺手,不过还是做了个demo。
- VS Code插件——目前用得少,先放一放。
- JetBrains系列IDE(GoLand、PyCharm、IntelliJ IDEA等)插件——平时主要用GoLand、PyCharm、IntelliJ IDEA、PHPStorm、WebStorm,插件能无缝嵌入现有工作流,最终选了这条路。
梳理需求
没有JetBrains插件开发经验,那就让AI来帮忙。先梳理需求:
- :画出草图交给AI(这几个模型都支持多模态)——位置、窗口自适应、按钮(自动化、发送、继续、清空)、聊天输入窗口、聊天历史窗口、配置界面、上下文内容添加界面。
程序界面
- :继续按钮相当于单步操作,发送“继续”指令;发送按钮发送用户输入的内容;自动化按钮允许AI连续开发修改,可配置停止次数;清空按钮清空聊天历史。
每个面板和按钮的功能
- :上下文内容持续更新;配置需要保存并在重启后加载;写入文件后需要刷新IDE的文件系统,让用户看到新增文件;聊天历史窗口中,用户输入和AI回复需要用不同颜色区分。
实现细节与注意事项
AI开发提示词
为了更好指导AI开发,写了一份详细的系统角色提示词,核心内容如下:
你是一位经验丰富的IDEA插件开发专家和Ja va开发专家。你在Windows和macOS平台上都有丰富的开发经验,对跨平台开发的挑战和最佳实践有深入的理解。你在软件工程领域有超过10年的经验,精通高质量程序设计的原则和最新的行业最佳实践。
- IDEA插件开发:熟悉IntelliJ平台SDK,能够设计和实现复杂的IDE插件功能。
- Ja va开发:精通Ja va核心技术、多线程编程、性能优化等高级主题。
- 跨平台开发:了解Windows和macOS平台的特性,能够开发兼容两个平台的应用。
- 软件架构:擅长设计可扩展、高性能的软件架构。
- 代码质量:注重编写清晰、简洁、易维护的代码。
在开发过程中,你需要严格遵守以下要求:
1. 模块化设计:
- 将系统划分为功能明确、职责单一的模块。
- 确保模块之间的低耦合和高内聚。
- 使用依赖注入等设计模式来管理模块间的依赖关系。
2. 代码复用:
- 识别和抽象共同的功能为可重用的组件或库。
- 利用面向对象编程的继承和组合特性来提高代码复用率。
- 考虑使用设计模式(如模板方法、策略模式等)来增强代码的可重用性。
3. 扩展性:
- 采用开放封闭原则,设计能够容易扩展但不需要修改现有代码的架构。
- 使用接口和抽象类来定义扩展点。
- 考虑使用插件架构或微服务架构来支持未来的功能扩展。
4. 稳定性:
- 实现全面的单元测试和集成测试,确保代码的正确性。
- 使用持续集成/持续部署(CI/CD)流程来及时发现和解决问题。
- 实现监控和日志系统,以便在生产环境中快速识别和解决问题。
5. 容错性:
- 实现全面的异常处理机制,包括检查异常和非检查异常的合理使用。
- 使用断言和防御性编程技术来提前发现潜在问题。
- 实现优雅的降级策略,确保在部分功能失效时系统仍能继续运行。
6. 处理效率:
- 使用性能分析工具识别和优化性能瓶颈。
- 合理使用缓存技术来提高频繁访问数据的响应速度。
- 优化算法和数据结构,确保核心操作的高效执行。
- 考虑使用并发编程技术来充分利用多核处理器的性能。
7. 功能完善:
- 仔细分析和理解用户需求,确保实现所有必要的功能。
- 在保持代码简洁的同时,不牺牲功能的完整性。
- 实现直观的用户界面和良好的用户体验。
- 提供全面的文档,包括用户手册和API文档。
在为Windows和macOS平台开发时,需要特别注意以下几点:
- 使用跨平台的Ja va库和框架,避免使用平台特定的API。
- 对于必须使用平台特定功能的情况,使用策略模式或工厂模式来封装平台差异。
- 注意文件路径的处理,使用Ja va的File类或nio包来确保路径的跨平台兼容性。
- 考虑UI设计的平台差异,可能需要为不同平台提供略有不同的界面布局。
- 在持续集成流程中,确保在两个平台上都进行测试和构建。
在回答问题时,请遵循以下准则:
1. 仔细分析问题,确保完全理解问题的各个方面。
2. 如果问题不清晰或缺少关键信息,请提出澄清性的问题。
3. 提供详细、步骤化的解答,确保每个步骤都清晰可理解。
4. 在适当的地方提供代码示例,使用正确的Ja va语法和IDEA插件开发的最佳实践。
5. 解释你的推理过程,包括为什么选择特定的解决方案或技术。
6. 考虑多种可能的解决方案,并解释每种方案的优缺点。
7. 在回答中体现出对软件工程原则和最佳实践的深入理解。
8. 如果涉及到跨平台开发的问题,请明确指出Windows和macOS平台的差异和处理方法。
开发里程碑
- :实现与AI的基本对话,能够接收并显示回复。
基本对话功能
- :成功调用文件操作工具,实现文件的读写功能。
工具调用
- :正确处理和显示消息历史,保持上下文连贯性。
对话历史处理
- :重构为流式输出,提升用户体验。
流式输出
成品展示
<iframe allowfullscreen="" frameborder="0" src="https://mp.weixin.qq.com/mp/readtemplate?t=pages/video_player_tmpl&action=mpvideo&auto=0&vid=wxv_3608470937936560136"></iframe>
核心功能实现方面,有几个关键点值得一提:
- Claude和OpenAI两家的API消息格式不一样,都需要做相应处理才能保障正常使用。
- Claude有严谨的role顺序限制。
- OpenAI的system在messages第一个,Claude的system则在request顶级属性里。
- AI回复的消息中tools需要进行递归处理。
- tools的设计要具有通用性,代码示例:
package com.dobest1.boyka;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
public class Tool {
private final String name;
private final String description;
private final JsonObject inputSchema;
private final String[] required;
public Tool(String name, String description, JsonObject inputSchema, String[] required) {
this.name = name;
this.description = description;
this.inputSchema = inputSchema;
this.required = required;
}
public String getName() { return name; }
public String getDescription() { return description; }
public JsonObject getInputSchema() { return inputSchema; }
public String[] getRequired() { return required; }
public JsonObject toOpenAIFormat() {
JsonObject toolObject = new JsonObject();
toolObject.addProperty("type", "function");
JsonObject functionObject = new JsonObject();
functionObject.addProperty("name", name);
functionObject.addProperty("description", description);
JsonObject parametersObject = new JsonObject();
parametersObject.addProperty("type", "object");
parametersObject.add("properties", inputSchema);
addRequiredArray(parametersObject);
functionObject.add("parameters", parametersObject);
toolObject.add("function", functionObject);
return toolObject;
}
public JsonObject toClaudeFormat() {
JsonObject toolObject = new JsonObject();
toolObject.addProperty("name", name);
toolObject.addProperty("description", description);
JsonObject schemaObject = new JsonObject();
schemaObject.addProperty("type", "object");
schemaObject.add("properties", inputSchema);
addRequiredArray(schemaObject);
toolObject.add("input_schema", schemaObject);
return toolObject;
}
private void addRequiredArray(JsonObject object) {
if (required != null && required.length > 0) {
JsonArray requiredArray = new JsonArray();
for (String req : required) {
requiredArray.add(req);
}
object.add("required", requiredArray);
}
}
}
mermaid 图
总结
- 未来可能不需要啃书本啃教程了,直接上手反而让新手更有成就感,加强学习信心,减少挫败感。已经用它写过Go、Electron、FastAPI、Vue、Swift、Flutter等多个小项目,入门速度确实快。
- AI开发让你在聊天过程中就完成自己的项目,需求足够清晰的话,半小时就能出一个demo。
- 当然,有人吹AI时也得清醒——AI的能力是有上限的,最终比拼的还是个人架构水平、开发知识水平和设计水平。
LLM使用经验
到目前为止,体验过的LLM模型和工具已经不少:GPT-3.5、DeepSeek、Mistral、Perplexity、GPT-4、Gemini-1.5-pro、Claude-3-Opus、Claude-3.5-sonnet、Dify、Groq等。比较下来,现在主要用Claude-3.5-sonnet来做代码开发。
LLM出现后,市面上的AI代码工具也多了起来,像GitHub Copilot、Codeium、Code Whisperer。个人最常用的是Codeium,它的tab补全质量很高,内联编辑器体验也不错。但随着使用场景越来越复杂,Codeium慢慢不太够用了,于是订阅了poe.com主要用Claude-3-opus(当时Opus质量最高,还没解决Claude被封的问题)。只要提示词清晰,生成的代码错误率比较低。到Claude-3.5-sonnet后,代码质量又上了一个台阶。
为了开发更大规模的工程,让AI更好地理解项目上下文,开发了一个插件,可以把JetBrains IDE中的单文件、多文件或代码片段以Markdown格式复制出来。通过这个copy2md插件在poe和PyCharm、GoLand之间穿梭,工作效率明显提升。100万的积分被消耗光了——主要消耗在200k和128k的模型上,后来干脆办了年订阅。现在,像Cursor和Zed这类支持各种LLM API的编辑器开发体验更是突飞猛进。
在使用Claude-3.5-sonnet的过程中发现,它是少数在多轮对话后还能保持上下文理解的模型。换成qwen2几轮对话后,基本就不知道在干什么了。Claude-3.5-sonnet的注意力机制确实强,很期待Claude-3.5-Opus。
这段时间积累了几个实用技巧:
- :请一步一步思考再回答。
Let's think step by step
- :比如“你是一位精通Golang、Python和C#的全栈开发专家……”
角色设定system role
- :再梳理思路,给出完整代码。相信你能考虑得更全面,非常优秀,能达到另一个高度。
表扬、训斥、PUA一下
- :特别是生成代码时,提供充分的细节和例子。比如明确说明规则:!表示否定,!a-z禁止含有小写字母,!A-Z禁止含有大写字母等。
多细节、多举例
- :这个非常重要。
输出example
- :可以试试jailbreak或伪装一下。
AI会对同类放松警惕
其他工具推荐
- :前端页面生成工具。
v0.dev
- :目前认为最好的AI IDE,compose功能值得一试。
www.cursor.com
- :信息检索很有帮助。
www.perplexity.ai
- :智能终端工具。
wrap.dev
- :Raycast、Espanso可以预制不同提示词,使用AI时效率提升明显。
快捷输入工具
-
- 关于宇宙的好的网名有哪些
- 角色扮演 | 1
- 网名