在实际的 AI 辅助开发中,比模型选型和提示词技巧更先出问题的,往往是工作方式和心理感受。When people think AI did the creative work, task meaning and effort decline这句话描述了一个值得每个 AI 应用开发者、AI 编程工具使用者和技术管理者关注的场景:一旦团队成员认为“创造性工作主要由 AI 完成”,他对任务的意义感会下降,愿意投入的努力也会随之减少。这个现象不是单纯的职场心态问题,而是会直接反映在代码质量、技术债、团队技能成长和产品创新上的工程问题。下面会从 AI 工程实践角度展开,讨论如何设计一条让 AI 提升效率、同时保留人类创造性和努力感的协作流程。
1. 理解现象:为什么“AI 做了创造性工作”会削弱意义感和努力程度
1.1 从研究标题看“创造所有权”转移
任务意义感通常来自一个人对结果的真实影响。当开发者觉得“这段代码是 AI 写的,我只是把 AI 的输出复制过来”,他对这段代码的心理所有权会明显减弱。心理所有权一旦减弱,人就不太愿意继续理解、修改、优化这段代码,更不愿意为它负责。久而久之,团队里会出现一种典型状态:功能看起来交付得很快,但没有人能说清楚系统为什么这么实现,遇到线上问题也没有人能快速定位。
在 AI 辅助编程出现之前,任务的推进路径是:理解需求、设计方案、写代码、调试、验证。每一步都会形成经验积累。常见的新手模式是:拿到 AI 生成的一大段代码后,发现能编译通过,就直接提交,完全跳过了设计和调试环节。此时“创造性工作”在人感知中已经转移给了 AI,任务意义感自然下降。
这一现象并不只发生在编程中。AI 绘画场景里,用户生成一张图后不愿再手动调整细节;AI 写作场景里,作者生成初稿后不愿再深度修改;AI 测试场景里,开发人员让 AI 生成测试用例后,可能连这些用例是否真的执行都不关心。技术团队要警惕的是:当“生成”变成唯一动作,人的学习循环就被切断了。
1.2 在 AI 协作中观察到的三类典型行为
用 AI 做工程实践时,常见行为可以粗略分成三类。
第一类是“替代式使用”:把完整需求直接丢给 AI,等它返回代码,然后粘贴运行。这种方式在简单脚本和一次性工具里效率很高,但一旦进入业务复杂、边界条件多的系统,问题会迅速累积。
第二类是“验证式使用”:让 AI 生成初稿,但人保留设计、审查、测试和上线决策。这种方式下,AI 负责生成候选方案,人负责判断方案是否正确、是否符合意图、是否值得进入主干。
第三类是“协作式使用”:人与 AI 通过多轮对话共同推演方案,AI 负责信息整理、代码生成、缺陷排查,人负责提出约束、评估方案、选择最优路径,并把每一次关键决策记录到设计文档里。
从工程长期稳定性的角度看,第三类更适合生产环境。因为人的意义感和努力程度往往与人是否掌握“最终判断权”直接相关。只要决策权还在人手里,AI 再快也不会把人变成旁观者。
1.3 为什么不能只把它当成心理问题来解决
“意义感下降”如果只看心理层面,容易得到“多鼓励团队、多搞团建”这类空泛结论。但技术团队更需要的是结构性解法:把人的价值固定到工作流里不可绕过的环节中。
在技术层面,人的价值可以体现在四个方面:
- 意图定义:说明要解决什么问题、边界是什么、验收标准是什么。
- 方案评审:判断 AI 生成的方案是否满足约束,是否有隐藏风险。
- 验证执行:运行测试、检查日志、复现异常、评估性能。
- 决策沉淀:把关键选型写成文档,供后续维护者理解。
如果这四个环节都能被 AI 辅助,但不能被 AI 完全替代,那么任务意义感就有了承载点。下面的章节会从环境搭建、工作流设计到验证排查,逐步说明怎么落地。
2. 搭建可持续的 AI 辅助开发环境:先跑通,再谈意义感
2.1 明确模型和工具的边界
不同团队、不同项目对 AI 工具的需求差异很大。选择工具时,先要区分“学习环境”和“生产环境”。学习环境追求低成本和快速试错,生产环境则要考虑数据隔离、权限控制、日志审计和可回滚性。
| 使用方式 | 典型工具 | 适合场景 | 需要额外关注 |
|---|---|---|---|
| 在线对话式 | ChatGPT、Claude、国产大模型应用 | 需求分析、提示词实验、文档初稿 | 敏感信息不要提交到对话中 |
| IDE 插件 | Cursor、GitHub Copilot、通义灵码等 | 代码补全、单文件生成、重构建议 | 生成代码需要人工理解和验证 |
| 框架集成 | Spring AI、LangChain4j 等 | 业务系统内嵌 AI 能力 | 版本兼容、API 凭证管理、超时和限流 |
| 私有化部署 | vLLM、Ollama 等 | 数据敏感场景、离线环境 | 显存规划、模型评估、并发能力 |
这里要注意,不要把工具选型当成终点。工具只决定“生成能力”,而决定工程质量的是“验证能力”。如果一个团队可以流畅运行 AI 工具,却没有测试环境、日志系统和代码评审机制,那 AI 生成得越快,问题也积累得越快。
2.2 最小项目结构:让提示词和决策记录也进入版本管理
一个可持续的 AI 辅助开发项目,目录结构最好把“人写的东西”和“AI 生成的东西”都放进去。推荐最小结构如下:
ai-collab-demo/ ├── docs/ │ ├── decisions/ │ │ └── 0001-use-ai-for-crud-generation.md │ └── prompts/ │ ├── generate-task-service.md │ └── review-code-checklist.md ├── src/ │ └── main/ │ ├── java/ │ └── resources/ └── tests/ ├── unit/ └── integration/这里的核心思想是:AI 生成的内容可以随时变化,但人的决策记录和提示词模板应该被持久化。提示词进入版本管理后,团队可以回看“为什么当时让 AI 按这种方式生成代码”,避免同一问题反复讨论。
2.3 用 Spring AI 集成模型调用:一个最简示例
在 Java 业务系统中,Spring AI 是常见的集成方式。以 OpenAI 兼容接口为例,在 Spring Boot 项目中引入依赖:
<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-openai-spring-boot-starter</artifactId> <!-- 版本以 Spring AI 官方仓库为准,生产环境要锁定具体版本 --> </dependency>然后配置模型地址和密钥。密钥不要写在源码里,而是通过环境变量加载。
spring.ai.openai.api-key=${OPENAI_API_KEY} spring.ai.openai.base-url=${OPENAI_BASE_URL} spring.ai.openai.chat.options.model=gpt-4o-mini spring.ai.openai.chat.options.temperature=0.2 spring.ai.openai.chat.options.max-tokens=1024核心调用代码可以简化成一个 Service:
@Service public class AiCodeAssistant { private final ChatClient chatClient; public AiCodeAssistant(ChatClient.Builder builder) { this.chatClient = builder.build(); } public String generateCode(String requirement, String constraints) { String prompt = """ 你是一个 Java 后端开发助手。 请根据需求生成服务层代码,要求如下: 1. 必须包含必要的入参校验; 2. 必须使用清晰的分层结构; 3. 生成代码后,用 200 字以内说明你的设计思路。 需求:%s 约束:%s """.formatted(requirement, constraints); return chatClient.prompt().user(prompt).call().content(); } }这段代码要解释两个关键点。temperature控制生成随机性:在代码生成场景,推荐 0.1 到 0.3,避免模型过度发挥;在头脑风暴场景,可以提高到 0.7 以上。max-tokens决定了回复长度,生成大文件时要调大,但更推荐的做法是把大任务拆成多个小任务,而不是一次生成一个超大文件。生产环境还需要增加超时、重试、调用审计和敏感词过滤,不要让模型直接接触未脱敏的业务数据。
3. 核心工作流:把“AI 生成结果”改造成“AI 辅助决策”
3.1 任务拆解:不要让 AI 一次性交付整个功能
很多团队使用 AI 低效的根因,是让 AI 直接生成一个完整模块。完整模块意味着需求边界模糊、变量命名风格不一致、异常处理缺失。AI 生成后很难通过一次测试验证,因为问题可能出在任意一层。
更推荐的做法是把功能拆成“意图单元”。一个意图单元满足三个条件:输入明确、输出明确、验收标准明确。
以 TODO 应用为例,不要直接让 AI“写一个 TODO 模块”,而是拆成四个意图单元:
- 创建任务:输入标题、描述、截止时间,输出任务对象。
- 更新状态:输入任务 ID 和新状态,输出更新后的任务。
- 查询任务:支持按状态和截止时间过滤。
- 删除任务:输入任务 ID,删除后返回结果。
每个意图单元再单独写提示词,单独验证。这样做的原因是:意图单元越小,人类越容易判断 AI 的输出是否正确,意义感也就越容易保留。
3.2 编写带有验收标准的提示词
一个面向生产的提示词,至少应包含角色、上下文、任务、输入、输出格式、验收标准、禁止事项和输出长度限制。这里给一个通用模板:
角色:你是资深 Java 开发者,熟悉 Spring Boot 和单元测试。 上下文:项目使用 JDK 17、Spring Boot 3、Maven。 任务:为一个任务管理服务创建“按状态查询任务”的 Service 方法。 输入: - 状态枚举值:TODO, IN_PROGRESS, DONE - 分页参数:page, size 输出: - 方法签名 - 方法实现 - 对应的 JUnit 5 单元测试代码 - 3 行以内的设计说明 验收标准: - 状态为 null 时抛出 IllegalArgumentException; - 分页参数 page 从 0 开始,size 最大不超过 100; - 查询方法不直接访问数据库,而是调用 TaskMapper; - 测试覆盖正常查询、空结果、非法参数三种情况。 禁止事项: - 不要引入额外依赖; - 不要修改 TaskMapper 接口; - 不要生成与接口无关的配置代码。 输出长度限制:500 行以内。这个提示词的价值不在于文本长,而在于验收标准可执行。开发者拿到输出后,可以直接检查是否满足每一条标准。如果 AI 输出不满足,不需要重新生成整个任务,只需要指出不满足的条目,让 AI 修正局部内容。
3.3 设置人工验证节点
AI 生成的代码,默认应该被视为“候选人代码”,而不是“完成代码”。验证节点至少要包括编译、测试、代码审查和运行验证。下面的命令适合在本地执行:
# 编译并运行单元测试 mvn test # 检查代码风格 mvn validate # 运行单测并生成覆盖率报告 mvn test -Dtest=TaskServiceTest -DfailIfNoTests=false对于更复杂的改动,还需要启动应用后调用真实接口验证。可以写一个简单的 curl 命令:
curl -X POST "http://localhost:8080/api/tasks" \ -H "Content-Type: application/json" \ -d '{"title":"写技术方案","description":"完成 AI 协作流程设计","deadline":"2025-12-31"}'人工验证节点必须出现在代码合并之前,不能跳过。这里的判断标准是:AI 生成的代码至少要经过一次人的“反对尝试”。如果团队里找不到一个人能从“这个设计可能有问题”的角度去评审,那么 AI 生成代码很容易变成长期技术债。
注意:不要只验证程序能启动,还要验证输入、输出、异常分支和日志是否符合预期。AI 生成的代码经常在正常路径上表现良好,但在空值、重复提交、并发、权限不足等边界条件下暴露问题。
3.4 用决策记录保留人的创造性贡献
为什么团队里 AI 用得越多,越容易出现“写完就忘”的状态?因为关键决策没有被记录下来。人类创造性的核心不是打字,而是做选择。把选择记录下来,本身就是一种高意义活动。
可以使用 ADR(Architecture Decision Record)简化格式。示例:
# ADR 0001:用状态字段区分任务生命周期 ## 状态 已接受 ## 背景 AI 生成的第一个版本使用“是否完成”布尔字段,无法表达 TODO、IN_PROGRESS、DONE 三种状态。 ## 决策 使用枚举状态字段 status,并禁止直接使用布尔字段 completed。 ## 后果 - 查询逻辑更清晰,支持按状态过滤。 - 需要同步调整前端展示和接口参数。 - 增加了状态迁移校验,避免非法跳转。一旦团队养成写决策记录的习惯,AI 生成代码就只是“候选方案”,而不是“最终决策”。人的努力重新回到设计、权衡和验证上,意义感也会随之恢复。
4. 运行验证:如何判断 AI 协作流程是否健康
4.1 技术指标:用客观数据替代主观感受
要判断“意义感和努力程度下降”是否真的影响了工程,不能只看情绪,要看指标。推荐关注以下几类:
| 指标 | 含义 | 下降/升高说明什么 |
|---|---|---|
| 代码评审修改行数 | 评审中人对 AI 生成代码的修改量 | 修改量长期为 0,可能说明评审流于形式 |
| 评审评论数 | 评审者提出的问题数量 | 过低意味着没有认真理解代码 |
| 单测覆盖率 | AI 生成代码是否配套测试 | 覆盖不足会快速积累回归风险 |
| 缺陷逃逸率 | 上线后发现的缺陷占比 | 越高说明验证节点失效 |
| 平均任务完成时间 | 从拆解到合入的周期 | 变短不一定是好事,要结合缺陷率看 |
这些指标不需要很复杂。关键是:每一次 AI 辅助生成的代码,都应该记录“人做了哪些修改”“修改原因是什么”。如果连续多次没有任何修改,就要检查是任务太简单,还是人已经不再愿意投入。
4.2 主观反馈:检查团队的真实行为
客观指标之外,可以通过几个问题快速判断团队状态:
- 开发者能否解释 AI 生成的这段代码为什么要这样写?
- 遇到 AI 生成代码的报错时,会先看日志定位,还是直接让 AI 重新生成?
- 代码评审中,是否有人提出“这个边界条件 AI 没有处理”这类问题?
- 新功能设计时,团队成员是先用文档写出意图,还是等 AI 给出方案?
这些问题没有标准答案,但能帮助识别“意义感下降”的早期信号。如果多数回答偏向“不解释、不定位、不提问题、不写文档”,那就说明 AI 协作的边界需要调整。
4.3 对比实验:全自动生成与混合协作的差异
在团队内部,可以设计一个小范围对比实验。选两个相似功能,一个直接用 AI 生成后合入,另一个按照“意图定义 -> AI 生成 -> 人工验证 -> 决策记录”的流程执行。对比时可以记录:
- 合入后一周内缺陷数。
- 后续功能迭代时,修改这些代码的耗时。
- 原作者之外的同事接手代码时的理解成本。
- 团队对功能目标和技术方案的解释清晰度。
这里不预设结论,但通常会发现:全自动生成在前 30 分钟很快,后续维护和沟通的成本会显著上升。混合协作看起来在前期多花一点时间,但代码的可解释性、可维护性和团队责任感会更强。
4.4 验证命令与自动化集成
生产环境建议把验证过程接入 CI/CD。至少包括:
# 单元测试 mvn test # 静态检查 mvn verify -DskipTests # 构建产物 mvn package -DskipTests # 运行关键接口的冒烟测试 curl -f http://localhost:8080/actuator/health如果 AI 生成代码直接进主干,这些命令很容易失败。反过来,如果这些命令全部通过,也不代表 AI 代码没有问题,因为运行时性能、安全问题、业务语义无法单靠编译和单测覆盖。这也是为什么最终合入前必须有人工评审。
5. 常见问题排查:当 AI 协作出现技术或心理故障
5.1 开发者变成“提示词复读机”,不愿意理解代码
现象:开发者从 AI 拿到代码后不读、不改,直接提交,遇到问题就让 AI 换一种写法。
原因:团队把评价标准放在“生成速度”而不是“理解深度”上。当开发者发现认真理解和直接粘贴的评价结果一样,就不会再投入额外努力。
检查方式:看代码评审记录和 diff。如果多次提交的 diff 只有 AI 生成内容,没有任何人的修改痕迹,基本可以判断发生了这个问题。
解决方式:在提交规范中增加“人工说明”。每次提交必须附带一句“我为什么接受这段 AI 代码”或“我改了什么”。不需要太长,但它强制开发者走一遍判断流程。
5.2 AI 给出看似合理但实际错误的代码
现象:功能正常通过单测,但上线后出现空指针、数据不一致等异常。
原因:AI 根据概率分布生成代码,并不理解业务语义。它容易遗漏边界条件、忽略事务边界、使用不合适的接口。
检查方式:查看 AI 生成代码中是否处理了 null、空集合、重复提交、并发更新等场景。针对这些边界写测试,观察是否会失败。
解决方式:提示词里明确要求“必须覆盖异常分支”,但更重要的是用测试兜底。可以编写专门的边界测试,把 AI 生成的候选代码放进去运行。如果失败,把失败信息返回给 AI,让它修正,而不是直接人工重写。
| 问题现象 | 常见原因 | 检查方式 | 处理建议 |
|---|---|---|---|
| 编译通过但运行时异常 | 缺少边界处理 | 补充异常分支单测 | 用测试结果驱动 AI 修正 |
| 逻辑正确但影响性能 | 忽略了查询复杂度 | 用压测或查询计划检查 | 人工评估后重写关键部分 |
| 接口返回字段与前端不一致 | 提示词没有定义契约 | 检查和前端约定 | 在提示词中加入接口契约字段 |
5.3 提示词越长,生成效果越差
现象:一开始 AI 还能生成可用代码,团队不断给提示词加约束后,生成结果反而偏离需求。
原因:大语言模型对过长的上下文会出现“注意力漂移”,无关信息会干扰关键要求。尤其是把多个验收标准堆在一起时,模型可能会记住开头和结尾,忽略中间内容。
检查方式:统计提示词长度和生成结果的有效率。如果提示词超过 1500 字,效果开始波动,就应该拆分。
解决方式:把提示词拆成“稳定部分”和“任务部分”。稳定部分包括角色、项目背景、通用规范,可以放入 System Prompt;任务部分只包含当前意图单元的输入输出和验收标准。还可以把复杂的业务规则放到外部工具或检索模块中,而不是全部塞进提示词。
5.4 代码评审流于形式,评审者只做“点赞式”评审
现象:代码评审通过率接近 100%,评论数极少,AI 生成的代码被合入时几乎没有讨论。
原因:评审者面对 AI 生成的代码,容易产生“AI 应该是对的”的默认信任。而且如果评审者本身没有参与任务拆解和意图定义,他很难找到切入点。
检查方式:检查评审记录中的问题数,以及评审是否发生在代码合入之前。如果明确要求在合入前评审,仍没人提问题,可能就是评审者缺乏上下文。
解决方式:让任务拆解阶段的“意图文档”随代码一起提交,评审者先看意图,再看代码。评审时要求至少回答两个问题:这段代码是否满足验收标准?如果不满足,哪里不满足?这样可以避免评审者只是对着屏幕点赞。
5.5 任务意义感下降的早期信号
| 信号 | 可能的解释 | 建议措施 |
|---|---|---|
| 提交信息全是“AI 生成” | 开发者未理解改动 | 要求补充人为决策说明 |
| 代码注释数量下降 | 开发者不再解释设计意图 | 把解释写进文档,而不是依赖注释 |
| 多轮对话只改生成代码,不动问题根因 | 没有定位能力 | 训练开发者先看日志 |
| 新功能没有设计文档 | 需求直接从口头到 AI | 恢复“先写意图”的流程 |
6. 保持意义感与高质量交付的最佳实践清单
6.1 可复用清单:AI 辅助开发项目启动前检查
在项目开始前,可以使用这样一份清单:
- 是否定义了功能的目标用户和成功标准?
- 是否把功能拆成输入输出明确的意图单元?
- 是否为每个意图单元编写了验收标准?
- 是否选择了适合当前场景的模型和部署方式?
- 是否把敏感信息与模型调用隔离?
- 是否设置了编译、单测、静态检查等验证命令?
- 是否安排了代码评审,并要求评审者先看意图文档?
- 是否建立了决策记录目录,记录关键选型?
- 是否为 AI 生成代码预留了人工修改和回滚路径?
- 是否给团队成员留出“不依赖 AI 也能完成任务”的能力训练时间?
这份清单不追求一次到位,但每一次 AI 辅助开发都应该补上缺失项。
6.2 学习环境与生产环境的差异
在本地学习环境中,可以用最简单的方式跑通 AI 生成代码:装一个 IDE 插件,直接对话,生成后运行测试。这个阶段重点在“体验 AI 的能力边界”。
生产环境需要额外做这些事:
- 配置外置化:API 密钥、模型地址、温度参数都通过配置中心或环境变量管理。
- 日志审计:记录模型调用方、调用时间、提示词摘要、返回结果摘要,便于问题回溯。
- 权限控制:不是所有团队成员都能调生产模型,也不是所有人都有权合入代码。
- 监控告警:对模型调用失败率、响应耗时、token 消耗进行监控。
- 回滚方案:AI 生成的代码合入后,必须能通过发布系统快速回滚到上一个稳定版本。
- 数据安全:不要把用户身份证号、手机号、合同内容等敏感数据直接发送给第三方模型。
6.3 扩展方向:从代码生成到 AI Agent 与模型部署
当团队已经能稳定运行“人类意图 -> AI 生成 -> 人工验证”的工作流,下一步可以从三个方向扩展。
第一,AI Agent。让 Agent 承担多步任务,比如自动修复单测失败、自动整理日志异常、自动生成变更说明。但 Agent 的每一步关键动作都应产生可审计的事件记录,最终由人确认后才能合入。
第二,模型部署。当业务数据不能出内网时,需要私有化部署模型。这时要关注模型选型、GPU 显存规划、并发能力和评估集建设。提示词仍需要维护,但可以引入微调或检索增强生成(RAG),减少对超长提示词的依赖。
第三,自动评估。建立一个小规模测试集,覆盖正常路径、边界路径和异常路径,定期用测试集评估不同模型、不同提示词版本的生成质量。这样,人的精力可以从“每个输出都要人工检查”逐步转向“设计评估集和改进工作流”。
回到最初的那个问题:当人们认为 AI 做了创造性工作,任务意义感和努力程度就会下降。技术团队需要做的,不是阻止 AI 参与创造性工作,而是重新设计协作流程,让 AI 负责生成候选方案,让人负责定义意图、判断结果、验证质量、沉淀决策。只有把人放在决策链路的中心,AI 才能从“替代者”变成“增强者”。对一个 AI 应用开发者来说,这也才是更可持续的工作方式。