



























共计 13351 个字符,预计需要花费 34 分钟才能阅读完成。
我们与计算机交互和为其编写代码的方式正在发生变化。这是一个深刻的变化:涉及我们使用的工具、编程方式以及对软件产品和系统的思考方式。
而且变化超级快!每周都有新的 LLM 模型发布。新工具、新编辑器、新的 "氛围编程" 实践、新协议、MCP、A2A、SLOP……真的很难跟上这一切。所有东西都分散在不同的地方、网站、代码仓库、YouTube 视频等。
这就是我们决定写这份指南的原因。这是我们谦卑的尝试,将所有内容整合在一起,在一个地方以通俗易懂的形式,向你展示围绕 AI 编程 或AI 辅助代码生成 的实践和工具,没有废话。
好的,让我们开始吧!
📚 资源:
所有这些术语都非常相似。但基本上 AI 编程是指使用 AI 模型(特别是现在的 LLM)及其周边工具来帮助你编写软件。它也被称为 "AI 代码生成" 或简称 "codegen",这是一个完整而迷人的研究和工程领域,可以追溯到 1950 年代我们使用 Lisp 生成代码的时候。现在我们有 LLM 作为驱动代码生成的主要引擎,还有一些神经符号混合方法的线索开始显现。AI 编程也是一种实践:如果你使用 Cursor 并通过 tab-tab-tab 获取补全,你就是在 "AI 编程";如果你完全使用 Cursor 的代理模式,你也是在 "AI 编程"。总之:这是使用 AI 模型帮助你生成代码的任何方式。通常这个群体中的人已经知道如何编程。
氛围编程是 AI 编程的升级版 :-) 在这里,你不太关心生成的代码,你只是给出提示并期望 AI 为你编写所有代码。这个术语是Karpathy 在 2025 年创造的,现在变得非常流行。在我看来,它正在帮助让编程对每个从未想过编程的人来说变得民主化!
所以,总之,无论你是使用 AI 讨论你的软件想法,还是只帮助编写现有代码库的部分代码,或者你完全在进行氛围编程,你都在使用 AI 帮助你生成代码。让我们称之为 AI 编程并继续前进。
你可以以许多不同的方式使用 AI 编程,但总结起来:
你应该学习和实践两者!
但随着项目复杂性的增加,更倾向于副驾驶模式,远离纯粹的 YOLO 氛围编程。另一个人(或六个月后的你自己)越有可能必须维护代码,这就越重要。
建议:我们真的建议在 OpenRouter 创建一个账户。它非常简单,你将获得最新 LLM 模型的访问权限,甚至是它的免费版本。例如,我们现在最常用的 LLM 模型是 Gemini 2.5 Pro,可以通过 OpenRouter 免费运行(有每日信用额度,但对于使用 aider 和 OpenHands 等进行实验仍然是一个有趣的选择)。
重要提示:Claude Code 现在超级贵!你可以轻松地每天花费 50 美元。所以要小心,监控你的使用情况。这就是为什么建议从 Cursor 开始,这样你就不必担心它。
📚 资源:
在你安装并稍微使用了这些工具之后,你会注意到它们会产生幻觉,进入无休止的循环试图修复可能的错误等。了解如何很好地提示很重要。一些提示:
在我们其余的示例中,我们将使用与 Markdown 关联的.md 文件扩展名。如果你更喜欢 asciidoc(它对结构化文档有更好的支持),使用它并在这些说明中替换 ".adoc"。LLM 不在乎,它们会处理 Markdown、asciidoc 或你抛给它们的任何其他纯文本格式。
这是一个通常效果很好的方法 / 程序 / 策略 / 工作流:
ChatGPT 4.5、4o 或o3,使用以下提示:你是一名高级软件工程师。我们将一起构建一个项目的 PRD。非常重要:- 一次问一个问题
- 每个问题都应该基于之前的答案
- 深入了解所需的每一个重要细节
想法:< 在此粘贴你的想法 >
将这些发现编译成 PRD。使用 markdown 格式。它应包含以下部分:- 项目概述
- 核心要求
- 核心功能
- 核心组件
- 应用 / 用户流程
- 技术栈
- 实施计划
docs/specs.md
基于生成的 PRD,创建一个详细的分步计划来构建这个项目。然后将其分解为相互构建的小任务。基于这些任务,将它们分解为更小的子任务。确保步骤足够小以便在一步中实施,但足够大以成功完成项目。使用软件开发和项目管理的最佳实践,没有大的复杂性跳跃。将任务连接到其他任务,创建依赖关系列表。不应该有孤立的任务。
非常重要:
5. 将其保存为项目文件夹内的 `docs/todo.md`
这是一个示例,使用 ChatGPT 4o 为一个简单的 CLI 工具进行的头脑风暴 / 规划会话,将其用作你的灵感。
现在为你的项目创建一个本地文件夹,记得在文件夹内安装并运行 git init 以保持版本控制。
这应该给你 PRD 和构建项目的任务列表!有了这些,你可以打开 Cursor(或其他 AI 代码编辑器),将其指向这些文件并询问:
你是一名高级软件工程师。研究 @docs/specs.md 并实施 @docs/todo.md 中仍然缺少的内容。每次实施每个任务并尊重任务和子任务的依赖关系。完成任务后,在列表中勾选它并继续下一个。
第一次 Cursor Agent 执行命令时启用 YOLO 模式,然后继续接受或在提示中询问 继续。
在 Cursor 的情况下,有时 LLM 会达到某些限制并要求重试。只需这样做并继续。是的,你正在进行氛围编程 :-)
这里你会找到基于此工作流在 10 分钟内构建的 CLI 工具的 Git 仓库:https://github.com/automata/localbiz
重要:虽然 "氛围编程" 超级酷,但了解你在做什么也真的很有趣 :-) 审查代理正在生成的代码也会在错误发生时(它们会发生!)帮助你很多,并提高你的代码审查技能(不仅是 AI 制作的,还有你自己和其他开发人员制作的)。
📚 资源:
LLM 使用不同的目标进行训练和微调,这是一个关于你可能有的目标 / 用途以及应该使用哪个模型的综合列表:
| 目标 | 模型 |
|---|---|
| 头脑风暴 | GPT 5, 4o, o3, Grok |
| 编程 | Claude Sonnet 4, Gemini 2.5 Pro, Grok, GPT 5, o3, o4-mini |
鉴于 LLM 每天都在变化,此表很快就会过时。请查看以下排行榜以获得更准确的比较:
programming,并且仅过滤支持tools 的模型通常是选择 AI 辅助编程模型的好方法切换到不同的模型。
这可能发生的原因至少有两个。你可能发出了一个超过模型输入 / 输出 token 限制的繁重请求。或者,如果它运行的服务器集群遇到糟糕的一天,你可能会被限制以减少负载。你收到的错误消息通常对此不透明。你可以在 这里 找到更详细的解释。
不同的模型有非常不同的 token 限制。例如,在我 2025 年 4 月底写这篇文章时,gpt-4.1-mini 比 gpt-4.1 慷慨得多。在你的口袋里准备几个 API 密钥(这很便宜,因为你按使用付费)并访问描述速率限制的页面。这是 Anthropic 的 作为示例。
你可以通过将规则或约定 "注入" 到 LLM 的上下文中来定义将应用于项目的规则或约定。每个编辑器都有一些方法来做到这一点:
.cursor/rules/ 文件夹内创建 markdown 文件。Cursor 将确保在与 LLM 的所有通信中应用这些。rules.md),并在你的.aider.conf.yml 文件中添加以下内容:read: rules.md。此外,许多工具支持在主目录中配置规则 / 约定文件以应用于所有项目。例如,在 Aider 中,你基本上可以在名为 ~/.global_conventions.md 的文件中添加全局约定,然后使用 read: [~/.global_conventions.md, rules.md] 将其添加到.aider.conf.yml。
你可以将 PRD 的一部分添加为规则,例如,如技术栈或代码格式和样式的一些指南。
规则非常强大,你甚至可以使用 AI 本身为你创建规则!查看 Geoff 的方法。
📚 资源:
PRD。什么?!他们说解决工程问题的最佳方法是创建一个新的首字母缩写词,这里也不例外 :-) 开玩笑的...PRD 是产品需求文档的缩写。基本上,它只是一堆文档(或只有一个文档)描述你的软件项目的需求和其他细节。
事实证明,如果你让你心爱的 LLM 自由发挥,没有太多关于要做什么的上下文,它会产生相当狂野和快速的幻觉。你需要驯服这头野兽,PRD 是做到这一点的好方法。
我最喜欢 PRD 的是它们对任何人都非常有帮助,从从未编程过的人到高级 SWE 或产品经理。
你不需要任何背景就可以开始 PRD,你只需要你的应用想法,就这样。
查看 这里 如何使用 LLM 为你创建一个。
记录你发送的每个提示,以及(这很重要)你对你在想什么和你得到的任何惊喜的穿插评论。这个提示日志是你的设计意图记录;对于没有参与项目的任何人(包括六个月后忘记你在想什么的你)来说,它将是无价的。
还没有这个文件名称的约定,你可以使用类似 vibecode.adoc 或history.md的东西。
有像 aider 这样的工具可以保留你与 LLM 进行的所有来回聊天的日志。所以一个选择是设置以下环境变量并将所有这些历史文件保持在版本控制下:
# 历史文件:## 指定聊天输入历史文件(默认:.aider.input.history)#AIDER_INPUT_HISTORY_FILE=.aider.input.history
## 指定聊天历史文件(默认:.aider.chat.history.md)#AIDER_CHAT_HISTORY_FILE=.aider.chat.history.md
## 将与 LLM 的对话记录到此文件(例如,.aider.llm.history)#AIDER_LLM_HISTORY_FILE=.aider.llm.history
有了这些文件,你可以在进行时用你自己的想法对它们进行评论。当你(和其他人)将来重新访问项目时,你可以学到很多关于你的项目的东西,你可能会开始注意到你可以在下一次会话中使用的模式和提示。
现代 Web 开发非常令人不知所措。有大量的 JavaScript/TypeScript 框架、CSS 框架等,所以真的很难开始并思考使用哪一个。在过去几周构建前端之后,这是我最终使用的:
像 Lovable 这样的基于 Web 的 AI 编程平台使用 React,而 v0 使用 Next.js。
一个技巧是在 Lovable 开始你的项目(你可以在他们的免费计划中每天获得最多 5 条消息),将其设置为输出你的项目到 GitHub,然后只需在本地机器上克隆它并使用 Cursor 继续 AI 编程。然后你可以将其部署到 Render、Fly.io、CloudFlare 等地方。没有附加条件。特别是如果你在后端有特定 / 更复杂的例程,这会很有趣。
如果你也在编码后端,确保在 Git 仓库的根文件夹中为后端和前端分别有一个文件夹;或者为后端和前端有不同的仓库,然后将它们添加到 Cursor 中的同一工作区(这样你就可以在前端代理中引用后端的文件,反之亦然)。
为了避免过早地将前端集成到后端,指示 AI 代理使用模拟 / 虚拟数据,这样你可以在实现后端后稍后更新它。
另一个有趣的提示是使用好的 MCP 工具将你的编程代理集成到 playwright 或 browser-use。这样你可以避免从 Web 浏览器到你的 AI 代理的错误复制粘贴循环,因为 AI 将控制浏览器并自己抓取截图和错误消息。
如果你想在 Web 应用中使用 3D 内容并且你正在使用 React,使用 React Three Fiber 而不是尝试直接使用 three.js 库会很有趣。R3F 使处理状态更容易,因为它将所有 three.js 对象包装为 React 组件。
后端在像 Lovable 这样的基于 Web 的工具中做得不好。所以你可能需要动手使用 Cursor/Windsurf/aider 或任何其他非基于 Web 的工具。
使用 Python 和 FastAPI 是一个很好的选择。如果你更喜欢使用与前端相同的语言(猜测大多数时候是 JavaScript 或 TypeScript),你可以使用 Nodejs 和 Express。
后端是端到端测试的绝佳目标,所以考虑指导代理为每个新功能及其子任务编写测试并运行它们。
完成后端后,你可以使用其文档(特别是关于 HTTP 端点的文档)作为在前端工作的代理的输入。这样你就能够将前端从使用模拟 / 虚拟数据移动到来自后端的真实数据。
对于小型游戏,在单个.js 文件中使用 vanilla JS,并为 3D 游戏使用 threejs 或为 2D 游戏使用 pixijs。
游戏全都是关于好的资产,所以考虑使用 Tripo AI 和 Anything World 等服务来生成 3D 资产并对它们进行绑定 / 动画。
关于编程和软件,你必须知道的一件事:它们会失败。无论你尝试什么来防止这种情况,它都会发生。所以让我们首先接受这一点,并与错误和 bug 成为朋友。
这里的第一个策略是模仿 SWE 所做的:查看解释器 / 编译器给你的错误消息并尝试理解它。将错误复制并粘贴回 LLM 并要求它修复它。另一个好主意是添加非常适合调试的 MCP 工具,如BrowserTools。
MCP 是模型上下文协议的缩写。它由 Anthropic 开发,但其他 LLM(如 OpenAI 的 GPT 和 Google 的 Gemini)也开始考虑它。这是一个强大的概念,它与另一个概念密切相关:函数 / 工具调用。
工具调用是 LLM 调用工具或函数来执行某些操作的一种方式。这是一种用新信息更新 LLM 的知识窗口(在过去的数据上训练)的方式,同时将其与外部工具和端点集成。例如,如果你想在 Web 上搜索一些信息,你可以指示 LLM 使用执行此操作的工具(例如 嘿,如果你需要在 Web 上搜索某些内容,请使用此工具:search(term))。然后,LLM 将调用工具,获取输出并在为你生成新预测时使用它,而不是花费许多 token、迭代步骤和解析工作负载。
MCP 通过为其创建标准来扩展这个想法。这样我们可以创建一个 MCP 服务器,它将向 LLM 暴露一些资源(例如数据库)或工具(例如将计算某些内容并返回结果的特定软件)。
等等,但它不只是一个 API 吗?我不能只是用 REST API 服务器 / 客户端和 LLM 提示中的一些解析来模仿相同的东西吗?有点,这就是 SLOP(简单语言开放协议)提出的。但是,拥有像 MCP 这样的标准使得确保 LLM 将本地支持它而无需在客户端进行额外的解析和技巧变得更容易。
A2A(代理到代理协议)在游戏中相当新。它由 Google 创建以 "补充"MCP,专注于多代理通信,而 MCP 专注于 LLM- 工具通信。
重要:有很多好的 MCP 服务器,像 Cursor 这样的编辑器支持它们。现在,只有 Anthropic Claude LLM 支持它们,所以当你想使用 MCP 工具时,确保使用 Claude。
Anthropic 在此处保留 MCP 服务器的更新列表:
https://github.com/modelcontextprotocol/servers
📚 资源:
通常 LLM 从头开始做得更好。但你也可以从样板开始(基本上是一个入门工具包:一个包含初始源文件骨架和配置的文件夹,用于使特定技术栈的工作项目运行所需的最小源文件和配置),并在上下文窗口中添加规则以确保它将尊重你的入门工具包。
另一个好主意是使用 Cursor 自己的索引功能对你的项目(你刚刚用入门工具包创建的)进行索引,或者使用像 repomix 或files-to-prompt这样的工具。
如果你有一个现有的代码库,一个好主意是使用 repomix 或files-to-prompt将其打包到上下文窗口中。
另一个很好的提示是在任务级别而不是项目级别提示更改。例如,专注于你想要实现的一个功能并要求 Cursor Agent 实现它。为特定功能提供一个迷你 PRD。想象一下你正在指导一个初级开发人员在特定的 GH ticket 上工作 :-)
📚 资源:
目前(2025 年 4 月),LLM 已经擅长生成工作代码,但它们不太擅长生成结构良好的代码 - 也就是说,具有适当的分层和关注点分离。良好的结构对于可读性和可维护性很重要,并降低了你的缺陷率。
思考你的设计,然后在产生良好结构的序列中进行提示工程。例如,在以数据库为中心的应用程序中,首先指定你的记录类型是一个好主意,然后引导你的 LLM 构建一个封装对它们访问的管理器类或模块。只有在那之后,你才应该开始提示业务逻辑。
更一般地说,当你提示时,考虑将引擎代码与策略代码分开,并以引导 LLM 这样做的序列发出提示。
你应该在项目规则中包含一个告诉 LLM 不要违反分层的规则 - 如果它需要一个新的引擎方法,它应该向干净的封装层添加一些东西,而不是将低级实现细节与业务逻辑纠缠在一起。
另一个有趣的做法是从项目的核心开始,花时间确保以你想要的方式实现和组织主要功能。你甚至可以编写类和函数骨架,然后让 LLM 填补空白。只有在你有了良好的基础并进行了良好的测试之后,你才能转向这个核心库的消费者,例如将其作为 CLI 或 REST API 暴露给未来的 Web 应用。
是的,测试比以往任何时候都更重要。在 2025 年的当前技术水平下,LLM 擅长生成干净和正确的代码,但它们有时会产生幻觉 - 更重要的是,它们可能无法理解规范并生成正确的代码来做错误的事情。
即使我们获得完全的人类等效的通用人工智能,这种情况也不太可能改变 - 毕竟,人类也会误解规范!语言的模糊性就是为什么即使在未来测试也将继续很重要。
使用 TDD 创建你想要的结果的骨架可以真正帮助指导 LLM 实现你正在测试的目标代码片段。指示你的 LLM 创建测试并运行它们也是一个很好的做法:它将能够将破坏给定测试的可能错误添加到其上下文中并对其采取行动,尝试使测试通过。
测试对于与 LLM 一起增长你的代码库至关重要,只有在所有当前测试通过时才向前移动。
基于属性的测试在与 LLM 一起工作时真的很有趣。测试整个值的域 / 范围而不是你指出的特定值将有助于确保代理生成的代码即使在以后的更改最终遇到你事先没有想到的边缘情况时仍然有效。每种语言都有很好的基于属性的测试库,如 Python 的 hypothesis 或 JavaScript/TypeScript 的fast-check。
在尝试编写或修复测试时,始终检查 LLM 生成的代码也很重要:有时它们甚至会尝试生成一些硬编码的输出只是为了使测试通过 :-)
非 AI 辅助编程建议的完全相同的规则和最佳实践在这里也有效。研究更多关于它们并应用到你的代码中。这是一个初始安全检查列表:
localStorage、sessionStorage 或 cookies 中存储敏感数据你只想在 Claude Code CLI 中尝试 Kimi K2 或其他 LLM?你可以使用 claude-code-router 使 Claude Code CLI 使用在你的机器本地运行的 "代理" 将其路由到 OpenRouter 提供的任何模型!下面的说明适用于 Kimi K2,但你可以将其调整为你想要的任何其他 LLM。
首先在 OpenRouter 创建一个账户并获取你的 API 密钥。
确保你已安装 Claude Code CLI:
npm install -g @anthropic-ai/claude-code
然后安装 claude-code-router:
npm install -g @musistudio/claude-code-router
将以下行添加到你的 ~/.claude-code-router/config.json 文件中,将 OPENROUTER_API_KEY 替换为你从 OpenRouter 获取的 API 密钥:
{
"Providers": [
{
"name": "kimi-k2",
"api_base_url": "https://openrouter.ai/api/v1/chat/completions",
"api_key": "OPENROUTER_API_KEY",
"models": ["moonshotai/kimi-k2"],
"transformer": {"use": ["openrouter"]
}
}
],
"Router": {"default": "kimi-k2,moonshotai/kimi-k2"}
}
现在只需通过路由器运行 Claude Code:
ccr code
你应该看到 Claude Code API Base URL: http://127.0.0.1:3456,这意味着它正在使用 claude-code-router 创建的本地代理。就是这样!
如果你只对 Kimi K2 或 Moonshot 的其他模型感兴趣,另一种选择是使用 Moonshot 本身提供的模型:
https://github.com/LLM-Red-Team/kimi-cc/blob/main/README_EN.md
我们正在研究一些关于如何在构建我们自己的工具时做到这一点的教程,所以请继续关注。最好的介绍是 Thorsten 的 这个实用教程,你可以在其中使用 Go 逐步构建一个使用最少工具量(list_files、read_file、edit_file)的简单代理。
如果你想更深入,Gerred 的 这系列开源书籍 绝对是一个很好的开始。
这里我们保留围绕使用 AI 编程的主要工具的更新列表。我们测试了其中的大部分,你会发现我们在测试它们期间的诚实意见。
一些非常有趣的人正在实施 AI 编程模型 / 工具或在他们自己的项目中使用它。
本指南受到 Maxime Labonne 的优秀 llm-course 的启发。
特别感谢:
如果你想贡献更正、反馈或一些缺失的工具或参考资料,请随时打开新的 PR、新 issue 或与 Eric 或Vilson联系。
如果你喜欢这份指南,请考虑给它一个星标⭐并关注它以获取新的更新!
MIT
这份指南是一份非常全面的 AI 辅助编程入门和进阶资料。主要内容包括:
这份指南强调的核心思想是:在提高效率的同时保持对代码的理解和控制,不要完全依赖 AI,而是将其作为强大的辅助工具。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。