尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

AI编程实战:从提示词到工作流,构建高效人机协作开发模式

AI编程实战:从提示词到工作流,构建高效人机协作开发模式 在实际开发中我们经常听到“AI编程”或“AI辅助编程”这类概念它们听起来很酷但落到具体项目里到底哪些技能是真正能提升效率、减少重复劳动的哪些又只是听起来美好用起来却充满“幻觉”和不确定性Matt Pocock作为一位在TypeScript和前端社区颇有影响力的开发者他总结并实践了一套AI编程技能集AI Skills旨在将AI工具深度融入开发工作流而不仅仅是用来聊天或生成一些无法运行的代码片段。本文将基于对这类技能集的实践和拆解带你理解如何将AI从一个“玩具”变成可靠的“副驾驶”重点聚焦于那些被验证过、能直接产生价值的实用技能。这套技能集的核心不是追求全自动代码生成而是建立一个高效的人机协作循环。开发者需要清晰地知道在什么环节引入AI如何给它清晰的指令提示词以及如何验证和整合它的输出。我们将从环境准备开始逐步构建一个可运行的小型项目在这个过程中你会看到AI如何协助完成从项目初始化、代码编写、调试到文档生成的多个环节并最终总结出一份可复用的“实用技能清单”和避坑指南。1. 理解AI编程技能集的核心从聊天到工作流集成在开始动手之前我们需要明确一个关键区别使用AI聊天工具询问编程问题与将AI技能Skills集成到开发工作流中是两件完全不同的事。前者依赖于临时、模糊的提问结果质量不稳定后者则是将AI能力标准化、流程化成为开发环境的一部分。1.1 什么是AI SkillsAI Skills可以理解为一系列预定义的、目标明确的“能力单元”。每个Skill都针对一个特定的开发任务例如“生成符合项目规范的React组件”、“为函数编写单元测试”、“解释一段复杂代码的逻辑”或“将代码从JavaScript重构为TypeScript”。这些Skill通常通过精心设计的提示词Prompt来调用并期望获得结构化的、可直接使用或微调的产出。与漫无目的的聊天相比Skills的优势在于意图明确每次调用都针对一个具体任务减少了歧义。上下文清晰Skill的提示词中通常会预设好角色、输出格式和约束条件如代码风格、框架版本。结果可预测由于任务边界清晰AI输出的质量相对更稳定也更容易被验证。1.2 主流实现方式Cursor、Claude Code与本地化工具目前将AI Skills融入工作流主要有几种路径IDE插件/智能编辑器如Cursor、GitHub Copilot。它们深度集成在编辑器中能基于当前文件上下文提供代码补全、解释、生成和修改建议。这是最直接、最无缝的集成方式。聊天机器人代码模式如Claude特别是Claude Code模式、ChatGPT代码解释器。它们通过对话界面处理代码任务适合进行代码评审、逻辑分析和一次性脚本生成。命令行工具与本地代理一些开发者会构建本地的AI Agent通过命令行调用处理诸如提交信息生成、代码审查、依赖更新等重复性任务。这需要一定的工程化能力。框架级集成如Spring AI它允许在Java后端项目中声明式地接入大模型能力用于生成内容、分类或数据提取但这更多是应用功能层面而非辅助编程本身。对于大多数开发者从Cursor或Copilot这类IDE工具开始实践是最快的方式。它们降低了使用门槛让你能立即感受到AI辅助的威力。本文将主要以这种集成环境为背景展开。1.3 建立正确预期AI是副驾驶不是自动驾驶这是实践AI编程技能前最重要的一课。AI模型尤其是大语言模型存在“幻觉”Hallucination即生成看似合理但实际错误或不存在的信息。在编程中这可能表现为生成使用了不存在的API或错误参数的方法。虚构某个库的功能或版本特性。编写的代码逻辑有缺陷但表面看起来正确。因此开发者必须始终保持对代码的最终审查权和理解责任。AI是一个强大的加速器和灵感来源但它不能替代你对业务逻辑、系统架构和代码质量的根本性把握。实用的AI技能正是那些能帮你节省时间同时又不会让你丧失控制权的技能。2. 环境准备与工具选择搭建你的AI辅助工作站工欲善其事必先利其器。选择合适的环境和工具是成功实践AI编程技能的第一步。这里我们不会推荐任何具体的、可能涉及合规风险的访问方式而是聚焦于工具本身的功能和本地可用的选项。2.1 核心工具选型对于个人学习和小型项目以下工具组合是一个不错的起点工具类别推荐选项主要用途备注智能编辑器Cursor / VS Code GitHub Copilot日常编码、代码补全、代码生成、解释和重构。Cursor内置了基于GPT的模型开箱即用。VS Code需安装Copilot插件。代码聊天机器人本地部署的开源模型如通义千问、DeepSeek Coder或符合规定的云服务代码逻辑分析、复杂问题解答、生成一次性脚本。确保使用符合法律法规和平台政策的服务。版本控制Git管理AI生成代码的变更方便回滚和对比。至关重要。所有AI生成或修改的代码都必须经过Git提交便于追踪。项目管理任意你熟悉的工具如npm/yarn/pnpm管理项目依赖确保AI生成的代码依赖项正确。注意选择工具时优先考虑其核心功能是否满足你的开发需求以及你是否能合法合规地使用它。不要追求最新潮但无法稳定使用的工具。2.2 项目初始化与基础配置让我们以一个简单的Node.js(TypeScript)项目为例演示如何从零开始在AI辅助下搭建环境。第一步创建项目目录并初始化# 在终端中执行 mkdir ai-skills-demo cd ai-skills-demo npm init -y第二步安装TypeScript和基础类型定义npm install typescript types/node --save-dev第三步初始化TypeScript配置通常我们需要创建一个tsconfig.json文件。此时你可以打开Cursor在项目根目录新建该文件然后直接使用AI。操作在Cursor中打开tsconfig.json按下CmdK(Mac) 或CtrlK(Windows/Linux)输入提示词为这个Node.js项目生成一个标准的tsconfig.json配置目标ES2022模块CommonJS并包含必要的严格类型检查选项。预期结果AI会生成一个类似下面的配置。你可以审查并调整。{ compilerOptions: { target: ES2022, module: CommonJS, lib: [ES2022], outDir: ./dist, rootDir: ./src, strict: true, esModuleInterop: true, skipLibCheck: true, forceConsistentCasingInFileNames: true, resolveJsonModule: true }, include: [src/**/*], exclude: [node_modules, dist] }关键解释strict: true开启了所有严格的类型检查这是TypeScript的核心价值也能让AI在生成代码时遵循更严格的规范。第四步创建项目结构在Cursor中你可以让AI帮你创建基础目录和文件。操作在项目根目录打开命令行面板通常也是CmdK输入创建标准的Node.js TypeScript项目结构src目录里面放index.ts以及一个utils目录。AI可能会执行一系列mkdir和touch命令或者直接生成文件夹和文件。至此一个基础的开发环境就准备好了。在这个过程中你并没有手动编写任何配置而是通过给AI清晰的指令让它完成了这些初始化工作。这就是一个最基础的AI Skill项目脚手架生成。3. 核心实用技能实战从代码生成到调试环境就绪后我们来实践几个被证明极高频且实用的AI编程技能。这些技能能直接作用于你的编码、调试和优化环节。3.1 Skill 1根据描述生成功能函数含测试这是最常用的技能。假设我们需要一个函数它接收一个用户对象数组按年龄排序并返回最年长的N位用户的名字。操作步骤在src/utils目录下创建userHelpers.ts。在文件中写下函数签名和注释然后使用AI补全。// 在Cursor中你可以先写下 /** * 从用户数组中找出最年长的N位用户并返回他们的名字数组。 * param users 用户对象数组每个对象包含 name 和 age 属性 * param count 需要返回的用户数量 * returns 最年长的N个用户的名字数组 */ export function getOldestUserNames(users: Array{name: string; age: number}, count: number): string[] { // 将光标放在这里按 CmdK输入实现这个函数 }AI可能会生成如下代码export function getOldestUserNames(users: Array{name: string; age: number}, count: number): string[] { // 边界条件检查 if (!users || users.length 0 || count 0) { return []; } // 排序并切片 const sortedUsers [...users].sort((a, b) b.age - a.age); // 降序排序 const oldestUsers sortedUsers.slice(0, Math.min(count, users.length)); // 提取名字 return oldestUsers.map(user user.name); }关键审查点边界处理AI是否考虑了空数组、count为0或负数的情况上面的实现是合理的。原数组不变AI使用了扩展运算符[...users]创建副本进行排序这是一个好习惯。count大于数组长度使用了Math.min(count, users.length)处理得当。进阶让AI同时生成单元测试在Cursor中你可以在创建测试文件时直接让AI生成测试用例。在src/utils目录下创建userHelpers.test.ts。输入提示词为 userHelpers.ts 中的 getOldestUserNames 函数编写Jest单元测试覆盖正常情况、空数组、count过大等边界情况。AI会生成类似下面的测试代码。你需要安装Jestnpm install jest types/jest ts-jest --save-dev并配置。import { getOldestUserNames } from ./userHelpers; describe(getOldestUserNames, () { const mockUsers [ { name: Alice, age: 25 }, { name: Bob, age: 30 }, { name: Charlie, age: 20 }, ]; it(应该返回最年长的N个用户的名字, () { const result getOldestUserNames(mockUsers, 2); expect(result).toEqual([Bob, Alice]); // 30岁和25岁 }); it(当count大于数组长度时应返回所有用户的名字, () { const result getOldestUserNames(mockUsers, 10); expect(result).toEqual([Bob, Alice, Charlie]); }); it(当用户数组为空时应返回空数组, () { const result getOldestUserNames([], 2); expect(result).toEqual([]); }); it(当count为0或负数时应返回空数组, () { expect(getOldestUserNames(mockUsers, 0)).toEqual([]); expect(getOldestUserNames(mockUsers, -1)).toEqual([]); }); });这个技能将“实现-测试”的闭环时间大大缩短。3.2 Skill 2代码解释与复杂逻辑分析当你接手遗留代码或遇到一段难以理解的复杂逻辑时AI可以充当一个即时的代码审查员和讲解员。操作步骤在编辑器如Cursor中选中一段令人困惑的代码。按下CmdK输入提示词解释这段代码做了什么并指出其中可能存在的问题或优化点。AI会逐行或分段解释代码逻辑并可能指出冗余的变量声明。可能存在的性能瓶颈如循环内的重复计算。潜在的边界条件错误。可以简化的语法。示例假设你选中了一段复杂的数组归约操作。// 你选中的代码 const data [/* ...一些对象 */]; const result data.reduce((acc, curr) { if (!acc[curr.category]) { acc[curr.category] { sum: 0, count: 0 }; } acc[curr.category].sum curr.value; acc[curr.category].count 1; return acc; }, {});AI的解释可能包括“这段代码将对象数组按category分组并计算每个分组下value的总和(sum)与数量(count)。它使用了reduce方法初始化一个累积器acc...”。同时它可能建议“如果curr.value可能不是数字需要做类型检查或者可以考虑使用Map来获得更好的类型推断。”3.3 Skill 3代码重构与优化AI可以帮助你将代码重构得更清晰、更高效或更符合新规范。常见重构场景将冗长函数拆分为小函数选中函数体提示“将此函数重构为多个更小、职责单一的函数”。将回调风格改为Async/Await选中基于回调的代码提示“将此回调函数改为使用async/await语法”。更新过时的API或语法例如将var改为let/const将function关键字改为箭头函数。提高性能提示“优化这段代码的性能”AI可能会建议使用更合适的数据结构或算法。操作示例重构一个条件嵌套过深的函数原始代码function getShippingCost(country, weight, isExpress) { let cost; if (country US) { if (weight 5) { cost 10; } else { cost 20; } if (isExpress) { cost 15; } } else if (country UK) { // ... 更多嵌套 } else { cost 30; } return cost; }选中代码后输入提示词“重构这个函数使用查找表或策略模式消除深层嵌套的条件判断。” AI可能会生成一个基于映射表的重构版本const shippingRates { US: { base: { under5: 10, over5: 20 }, expressSurcharge: 15 }, UK: { base: { under2: 8, over2: 18 }, expressSurcharge: 12 }, // ... 其他地区 }; function getShippingCost(country, weight, isExpress) { const rate shippingRates[country] || shippingRates.default; const baseCost weight 5 ? rate.base.under5 : rate.base.over5; return isExpress ? baseCost rate.expressSurcharge : baseCost; }重构后的代码逻辑更清晰易于维护和扩展。3.4 Skill 4基于错误的即时调试当你的代码运行时抛出错误可以将错误信息直接丢给AI分析。操作步骤复制终端中的完整错误堆栈信息。在AI聊天界面或Cursor的Chat面板中粘贴并附上相关的代码片段。提问“我的程序报了这个错误可能的原因是什么如何修复”AI会分析错误类型如TypeError,ReferenceError、出错的行号以及堆栈给出可能的原因和修改建议。示例错误TypeError: Cannot read properties of undefined (reading map) at getOldestUserNames (/path/to/file.js:15:25)你的提问“我在调用getOldestUserNames函数时遇到这个错误函数代码如下[粘贴函数代码]。可能是什么问题”AI分析“错误发生在第15行试图对undefined调用.map方法。在你的函数中oldestUsers变量可能来自sortedUsers.slice(...)而sortedUsers来自[...users]。如果传入的users参数本身就是undefined或null那么扩展运算符...会报错吗实际上...undefined会抛出错误但错误信息不同。更可能的情况是调用函数时传入的实参是undefined。请检查调用此函数的地方确保传入的是一个数组。另外你的函数开头有边界检查if (!users || users.length 0)这能处理null或空数组但如果users是undefined!users判断为真函数会提前返回空数组不会执行到第15行。所以错误可能发生在边界检查之前等等你的代码第15行是return oldestUsers.map(...)吗我需要看到完整的、包含行号的代码才能精确定位。”这个过程展示了AI如何像一个有经验的同事一样通过错误信息和代码上下文进行推理。它不仅能指出明显的问题还能引导你进行更深入的排查。4. 高级集成与自动化技能当你熟悉基础技能后可以尝试将AI能力自动化进一步解放生产力。4.1 Skill 5生成提交信息与文档这是一个能极大改善工作流的技能。利用AI根据代码变更diff自动生成规范的提交信息Commit Message甚至更新CHANGELOG。实现思路使用Git Hook 脚本在项目根目录创建.git/hooks/prepare-commit-msg或使用Husky等工具管理Git钩子。编写一个脚本调用本地AI模型或API需确保合规将git diff --staged的输出作为提示词的一部分请求生成一条符合Conventional Commits规范如feat:,fix:,docs:的提交信息。将生成的信息写入提交信息文件。简化示例脚本Node.js// generate-commit-msg.js const { execSync } require(child_process); // 注意这里假设你有一个本地可调用的AI服务端点这只是一个概念示例 // 实际应用中你需要替换为合规的、具体的AI调用方式 function callLocalAI(prompt) { // 模拟调用返回生成的提交信息 // 真实情况可能是HTTP请求到本地运行的模型服务 return feat: 添加用户年龄排序工具函数 - 新增 getOldestUserNames 函数用于筛选最年长用户 - 添加完整的Jest单元测试覆盖边界情况 - 更新工具函数索引文件; } try { const diff execSync(git diff --cached --name-status, { encoding: utf-8 }); if (!diff.trim()) { console.log(No staged changes.); process.exit(0); } const prompt 根据以下的Git变更摘要生成一条简洁、专业的提交信息遵循Conventional Commits规范如feat, fix, docs, chore等。只输出提交信息本身不要有其他解释。 变更摘要 ${diff} 提交信息; const commitMsg callLocalAI(prompt); // 将生成的信息写入指定文件由Git钩子传入的参数 const commitMsgFile process.argv[2]; require(fs).writeFileSync(commitMsgFile, \n${commitMsg}\n, { flag: a }); console.log(AI生成的提交信息已追加。); } catch (error) { console.error(生成提交信息失败:, error); process.exit(1); }重要此示例仅为展示工作流思路。生产环境使用需要处理网络错误、模型无响应、生成质量不佳等问题并且必须确保AI服务的调用完全合规。4.2 Skill 6自动化代码审查基础版你可以设置一个CI/CD流水线步骤让AI对Pull Request中的代码进行基础审查检查常见的代码坏味道、潜在bug或风格不一致问题。简化实现概念在GitHub Actions、GitLab CI等平台上配置一个Job。该Job获取PR的diff内容。将diff和预定义的审查提示词如“检查代码风格是否符合ESLint规则指出可能的逻辑错误、安全漏洞或性能问题”发送给AI服务。将AI的审查评论以Bot身份提交到PR中。这需要较强的工程集成能力但对于团队项目能提供除人工审查外的另一层自动化检查。5. 避坑指南与最佳实践AI编程并非万能盲目依赖会导致更多问题。以下是基于实践总结的关键注意事项。5.1 常见“坑”与应对策略问题现象可能原因检查与解决方式生成的代码无法编译或运行AI使用了过时的API、错误的语法或虚构的库方法。1.仔细阅读错误信息。2.核对官方文档确认API是否存在及用法。3. 将错误信息反馈给AI让它修正。代码逻辑存在隐藏缺陷AI生成的代码通过了语法检查但业务逻辑有误如边界条件处理不当。1.必须编写单元测试。用测试用例覆盖正常、异常和边界场景。2.进行代码走查像审查他人代码一样审查AI的产出。AI不理解项目特定上下文项目有自定义的架构、约定或内部库AI缺乏这些知识。1.提供更丰富的上下文在提示词中说明项目结构、框架版本、编码规范。2.分步骤引导先让AI生成基础代码你再根据项目规范进行适配。过度依赖导致技能退化用AI生成所有代码导致自身对底层原理和设计模式生疏。1.设定使用边界用AI处理重复、繁琐或探索性任务核心业务逻辑和架构设计亲自参与。2.学习AI生成的优秀代码理解其背后的设计思想。提示词模糊导致结果不佳提问过于笼统如“写一个登录功能”。1.使用结构化提示词明确角色、任务、约束、输出格式。2.迭代优化根据第一次结果调整提示词逐步精确。5.2 编写有效提示词Prompt的准则高质量的输入才能获得高质量的输出。对于编程任务提示词应包含以下要素角色定义你是一个经验丰富的TypeScript后端开发工程师。任务描述请实现一个函数功能是……具体约束技术栈使用Node.js 18和TypeScript 5.x。代码风格遵循Airbnb ESLint规则使用箭头函数。输入输出函数输入是……输出应该是……边界条件请妥善处理空输入、负数等边界情况。输出格式请只输出代码不需要解释。提供上下文这是相关的接口定义……或这个函数将在……场景下被调用。示例一个较好的提示词你是一个专业的React前端开发者。请创建一个名为UserTable的React函数组件。 要求 - 使用TypeScript。 - 接收一个users prop类型为Array{id: number, name: string, email: string}。 - 在表格中展示用户的ID、姓名和邮箱。 - 支持按姓名排序点击表头切换升序/降序。 - 使用Tailwind CSS进行样式美化。 - 组件应该是可重用的和易于测试的。 请输出完整的组件代码包含必要的import语句。5.3 生产环境使用建议在个人或学习项目中大胆尝试AI辅助是没问题的但在团队和生产环境中引入需要更谨慎的流程。代码审查是必须的AI生成的代码必须经过至少一名其他开发者的严格审查才能合并到主分支。建立团队规范团队应讨论并确定AI工具的使用范围、提示词模板和产出物的质量标准。关注安全与合规切勿让AI处理敏感信息如密钥、用户个人数据、商业秘密。确保所使用的AI服务符合公司的数据安全和合规政策。性能与可维护性AI可能生成性能并非最优的代码或者使用了不熟悉的、难以维护的奇技淫巧。审查时要特别关注这两点。版本锁定与追溯记录生成关键代码所使用的AI模型版本和提示词便于未来出现问题时的追溯和理解。6. 总结构建你的实用AI技能清单经过以上实践我们可以提炼出一份针对日常开发的“实用AI编程技能”清单按优先级排序日常编码辅助代码补全、生成单函数、编写样板代码如接口定义、DTO类。这是基础能显著减少敲击键盘。代码解释与理解快速理解复杂逻辑、遗留代码或新接触的库。充当24小时在线的代码导师。单元测试生成根据实现代码快速生成测试用例骨架你只需补充或调整边界条件。确保代码可测试性从开始就被考虑。错误调试分析将错误堆栈和上下文代码交给AI获得排查思路。尤其擅长解释那些晦涩的运行时错误。代码重构建议对代码进行“味道”识别并提供重构方案如拆分函数、简化条件、更新语法。帮助你持续改善代码质量。文档与注释生成为函数、类生成清晰的JSDoc/TSDoc注释甚至编写模块的README。让文档工作不再滞后。提交信息生成自动化生成规范的提交信息保持提交历史的清晰度。这是一个低风险高回报的自动化点。最不实用或风险最高的往往是那些试图让AI“完全自主”完成复杂模块或系统设计的需求。AI在微观代码层面表现优异但在宏观架构、深度业务逻辑理解和跨多个文件的复杂协调上仍然远远无法替代人类的综合判断力。最终最实用的AI编程技能是那些能够被你精确控制、结果易于验证、并能无缝嵌入到你现有工作流中的技能。它们不是取代你而是增强你让你能将宝贵的时间和精力集中在真正需要创造力和深度思考的问题上。从今天列出的清单中选择一两项开始实践逐步建立属于你自己的、高效可靠的人机协作模式。
返回列表