用可验证工作流降低 AI 代码生成幻觉:实战示例
为什么代码生成会出现幻觉
AI 编程助手的“幻觉”通常不是随机报错,而是模型在信息不足时补全了看似合理的内容,例如虚构不存在的 SDK 方法、误用旧版参数、猜测项目目录结构,或声称测试已经通过。降低这类问题的核心不是让模型“更聪明”,而是把它放进一个可读取、可执行、可验证的工程流程中。
实战目标:为 Express 接口增加分页
假设现有项目使用 Node.js、Express 和 PostgreSQL,需要为 GET /users 增加 page、pageSize 参数。不要直接要求“写分页接口”,这会迫使模型猜测数据库工具、字段和错误处理规范。先提供可验证的边界条件:
提示词示例:“先阅读 package.json、src/routes/users.js、src/db.js 和现有测试。不要修改文件。列出当前数据库访问库、users 表已使用的字段、路由导出方式,以及实现分页前必须确认的未知项。每项必须引用文件路径。”
第一轮只要求调查,不要求生成代码。检查回复中的路径、依赖名称和函数名是否确实存在;若模型引用了不存在的 prisma、typeorm 或字段,应立即停止后续修改并纠正上下文。
把任务拆成可验证的最小提交
确认项目使用 pg 后,再给出精确契约:page 默认 1,pageSize 默认 20,最大 100;返回 items、page、pageSize、total;SQL 必须参数化;非法参数返回 400。随后要求模型先输出修改计划和测试用例,而非直接提交实现。
提示词示例:“基于已确认的 pg 查询方式,先只修改或新增测试。覆盖默认分页、第二页、pageSize 上限、非数字参数和 SQL 注入式输入。不要声称测试通过;输出每个修改文件及运行命令。”
测试应先失败,再让模型实现路由。这样模型提出的接口结构会被真实断言约束,避免它编造“兼容现有客户端”的返回字段。实现阶段明确要求最小差异:只允许改 users 路由及对应测试,不得升级依赖或重构数据库层。
实现提示词示例:“执行测试命令并修复失败项。使用 LIMIT 和 OFFSET 参数占位符,不拼接用户输入。完成后粘贴实际命令、退出码和失败测试名称;没有执行权限时明确说明,不要推断结果。”
用工具输出替代模型自述
代码生成后的可信度来自编译器、测试和静态检查,而不是“已完成”的自然语言。至少执行 npm test、npm run lint 和 npm run build;对数据库查询额外检查 EXPLAIN 或集成测试中的查询参数。CI 可将这些命令设为合并门禁,并要求 AI 生成的变更同时更新测试。若错误信息出现,把原始错误、相关文件和期望行为一并回传,避免只说“修一下”。
- 要求模型区分“已从文件确认”“合理推测”和“需要你确认”。
- 要求引用真实文件路径、函数名和命令输出。
- 限制每轮修改文件数,减少无关重构带来的新幻觉。
- 对外部库 API 要求先查本地类型定义、锁文件版本或官方文档。
- 把密钥、生产数据和未脱敏日志排除在提示词之外。
低成本运行多轮验证
降低幻觉往往需要多轮:先扫描仓库,再写测试,再实现,再修复。这类工作适合按量付费的模型接入。59API 提供 Claude Opus、Sonnet、Haiku、Fable 及 GPT 模型的原生官方质量调用,可兼容 Claude Code、Codex 和任意 OpenAI SDK,基础地址为 https://api.59api.com。开发者可以按调查、实现、审查分别选择合适模型,避免每一步都使用高价模型;其低价中转与推荐返利也适合持续跑 CI 辅助任务。需要把上述流程接入现有工具链时,可注册 59API 后替换 API Base URL,再从小型测试任务开始验证。
Prêt à commencer ?
Connectez Claude et GPT en quelques minutes aux prix les plus bas, sans bridage. Inscrivez-vous pour votre clé API.
Inscription gratuite