AI编程如何避免代码幻觉?减少错误实现的提示词与开发方法
2026-09-17 34 0
什么是AI编程代码幻觉?
AI编程中的代码幻觉,通常指AI生成了看起来合理、实际却不存在或无法正常运行的代码。例如虚构一个不存在的API、使用错误的库版本、调用已经废弃的方法,或者根据错误理解实现业务逻辑。
这类问题很容易出现在大型项目中。AI可能根据训练数据生成一套看似完整的实现,但并不了解当前项目的真实目录结构、依赖版本、数据库设计和业务规则。GitHub也明确建议开发者检查AI生成的代码,并使用测试、代码扫描等工具进行验证。
因此,AI更适合作为编程助手,而不是直接替代开发者完成最终判断。
为什么AI容易生成错误代码?
最常见的问题是上下文不足。例如直接告诉AI:帮我写一个用户登录接口。
AI需要自行猜测使用什么框架、数据库、认证方式、返回格式以及项目结构。它可能生成一套语法正确,却与现有项目完全不兼容的代码。
更好的方式是明确告诉AI项目技术栈、版本、相关文件、已有接口、数据结构和限制条件。GitHub的提示工程建议也强调了具体需求、相关代码和示例的重要性,同时建议将复杂任务拆成多个小任务。
减少代码幻觉的提示词怎么写?
不要只描述“我要什么”,还要告诉AI“应该依据什么实现”。
可以使用下面这种提示词:
请基于当前项目实现用户登录功能。
技术栈:
- ASP.NET Core 10
- Entity Framework Core 10
- SQL Server
- JWT
要求:
1. 优先复用项目现有的认证、用户和异常处理代码。
2. 不要创建项目中不存在的Service或Repository。
3. 不确定的API、类名或方法不要自行猜测。
4. 如果现有代码无法确认实现方式,请先列出需要确认的信息。
5. 保持当前项目的命名和代码风格。
6. 修改代码前先说明准备修改哪些文件以及原因。
7. 完成后给出需要运行的测试命令。
其中“不确定就说明”非常重要。与其让AI强行生成一个可能不存在的API,不如让它明确指出信息不足。
先让AI分析,再让AI写代码
复杂功能不要直接要求AI一次完成。
可以拆成:
第一步:
分析当前项目,实现这个功能需要修改哪些文件?
暂时不要写代码,请说明现有代码结构和实现方案。
第二步:
根据刚才确认的方案,只修改用户认证相关代码。
不要修改其他模块。
第三步:
检查刚才的实现,重点寻找API调用错误、类型错误、边界条件和异常处理问题。
暂时不要修改代码,只列出问题。
第四步:
根据发现的问题进行修复,并说明每一处修改的原因。
这种工作方式比一次生成整个功能更容易发现错误。GitHub同样建议把复杂任务拆成更小、更明确的任务,并逐步迭代。
给AI提供真实项目上下文
AI看到的代码越接近实际项目,生成结果通常越容易符合项目规范。
开发时可以主动提供:
- 项目目录结构
- package.json、.csproj等依赖配置
- 数据库模型
- 相关Controller、Service和组件
- API请求和响应示例
- 已有测试代码
- 项目编码规范
例如不要只说修改订单接口,可以明确:
请修改 OrderController.Create 方法。
相关模型是 Order.cs 和 OrderItem.cs。
数据库访问使用 OrderService,不要直接操作 DbContext。
返回格式必须保持 ApiResult<T>。
参考 ProductController.Create 的错误处理方式。
对于长期维护的项目,还可以使用项目级AI指令。GitHub Copilot支持.github/copilot-instructions.md,可以保存项目技术栈、编码规范、工具和开发约束,让这些信息持续用于后续请求。
不要让AI同时当程序员和最终测试人员
AI生成代码后,至少应该经过编译、单元测试和实际运行。
例如:
请为刚才实现的UserService生成单元测试。
要求:
1. 覆盖正常登录。
2. 覆盖用户不存在。
3. 覆盖密码错误。
4. 覆盖空参数。
5. 覆盖数据库异常。
6. 不要修改生产代码。
GitHub提供的Copilot实践同样建议使用单元测试和集成测试验证AI生成的代码。复杂场景需要更具体的测试要求。
更进一步,可以让AI检查代码,但最终仍然要通过真实工具验证:
请检查这段代码可能存在的错误,包括:
- 编译错误
- API使用错误
- 空值问题
- 边界条件
- SQL查询问题
- 并发问题
- 安全漏洞
- 性能问题
不要假设代码一定正确,请逐项说明依据。
然后实际执行编译、测试、Lint、静态分析和代码扫描。
一个比较可靠的AI编程流程
实际开发中,可以采用:需求确认 → 分析代码 → 制定方案 → 小范围实现 → 编译 → 测试 → AI代码审查 → 人工Review → 提交代码。
如果测试失败,把真实错误信息直接提供给AI:
测试执行失败,错误信息如下:
[粘贴完整错误]
请先分析错误原因,不要直接重写整个功能。
指出具体出错位置,然后给出最小修改方案。
这样可以避免AI为了修复一个小问题,把整个模块重新生成一遍。
AI编程最重要的是验证
减少代码幻觉并不存在一个万能提示词。提示词解决的是让AI更准确理解需求,测试和代码Review解决的则是确认结果真的正确。因此,开发者应该尽量避免直接复制AI生成的代码。先给足上下文,再拆分任务。涉及复杂逻辑时先设计后编码。生成代码后进行编译、测试和静态检查。
AI可以负责大量重复编码工作,但最终的技术决策、代码审核和上线验证仍然应该由开发者完成。