发布时间:2026/9/7 16:50:21
Skills工作流:对抗AI幻觉的生成-验证闭环实践指南 1. 先搞清楚这个工作流到底解决什么实际问题如果你用过一些 AI 工具尤其是代码生成或文本生成类大概率遇到过这种情况AI 给出的答案看起来逻辑通顺但仔细一查函数名是编的、API 接口不存在、依赖库版本对不上甚至整个解决方案都是虚构的。这就是典型的“AI 幻觉”AI Hallucination问题。Matt Pocock 开源的 Skills 端到端工作流核心目标就是对抗这种幻觉。它不是另一个代码生成工具而是一套让 AI 输出结果更可靠、更可验证的流程框架。最直接的价值在于当你用 AI 辅助开发、文档生成或自动化任务时它能帮你把“看起来对”变成“实际跑得通”。这个工作流适合三类人经常用 AI 写代码但被幻觉问题坑过需要更高可靠性的开发者。团队内部希望建立 AI 辅助流程但要求输出必须可测试、可复现的技术负责人。自己尝试过用 AI 处理复杂任务但发现单次生成的结果经常需要大量人工修补的进阶用户。和普通 AI 工具最大的区别是Skills 工作流不追求一次生成完美答案而是通过“生成-验证-迭代”的闭环确保每一步输出都经过实际环境检验。如果你之前依赖 AI 输出时总得手动排查虚构内容这个思路值得重点看。2. 工作流的核心环节怎么把“生成”和“验证”绑在一起2.1 输入阶段就约束生成范围很多 AI 幻觉源于问题描述太开放。比如你问“怎么实现用户登录”AI 可能会编一个不存在的 OAuth 服务商。Skills 工作流的第一步是把任务拆解成可验证的子问题并对生成内容做范围限定。例如不是直接生成整个登录模块而是先生成“验证邮箱格式的正则表达式”并立即要求 AI 附带测试用例。正则表达式和测试用例都是可执行、可验证的代码块能快速在本地或 CI 环境中运行。如果测试失败要么重新生成要么调整输入描述。我一般会先用这个规则检查输入任务是否可拆解为不超过 10 行代码的独立单元这个单元是否有明确的输入和输出能否用一组测试用例验证其正确性如果三个问题都是“是”这个任务才适合进入工作流。如果任务本身过于宏大比如“设计一个电商系统”幻觉概率会急剧上升。2.2 生成后立即执行验证脚本Skills 工作流的关键是在生成代码后自动插入验证环节。验证不靠人工阅读而是靠预设的脚本运行。比如生成一个函数后工作流会立即调用测试框架执行对应单元测试。具体操作上你需要提前准备两类验证脚本基础语法验证比如用 TypeScript 编译器检查类型错误用 ESLint 检查代码风格。功能正确性验证写一组最小测试用例覆盖正常场景和边界情况。验证脚本最好与生成环节解耦。也就是说AI 生成代码后由独立进程启动验证避免生成环境干扰验证结果。如果验证失败工作流会收集错误信息作为下一次生成的改进依据。2.3 迭代优化靠错误反馈驱动单次生成不一定完美但 Skills 工作流强调用验证错误驱动迭代。比如生成一个数组排序函数第一次可能漏处理空数组测试失败后工作流会把错误信息“输入空数组时抛出异常”反馈给 AI要求重生成。这个环节最怕的是盲目重试。我的经验是每次迭代必须记录失败原因测试报错、编译错误、运行时异常。关联的输入条件什么参数导致失败。预期行为描述。然后把这些信息结构化后喂给 AI。不要只是说“不对再试一次”而要明确指出现有结果在哪一步偏离预期。迭代次数最好设上限比如 3 次超过后转为人工介入避免陷入死循环。3. 本地环境怎么搭从零开始跑通最小示例3.1 准备环境和依赖Skills 工作流本身不绑定特定 AI 模型或语言但 Matt Pocock 的参考实现主要围绕 TypeScript 和 Node.js。如果你用其他语言思路可以复用但工具链要调整。最小环境需要Node.js 18确保支持 ES Module 和顶层 await。一个能调用 AI 模型的 API 密钥如 OpenAI GPT-4、Claude 3 或本地部署的开源模型。测试框架Jest 或 Vitest 均可。代码校验工具TypeScript 编译器、ESLint。先创建一个空目录初始化 package.jsonmkdir skills-workflow cd skills-workflow npm init -y安装核心依赖npm install typescript types/node jest ts-jest --save-dev npm install openai # 如果使用 OpenAI 模型配置 TypeScript 编译选项tsconfig.json{ compilerOptions: { target: ES2022, module: ESNext, outDir: ./dist, rootDir: ./src, strict: true, esModuleInterop: true, skipLibCheck: true } }3.2 构建生成-验证闭环工作流的核心是一个调度脚本负责串联生成、验证、迭代。在 src/ 下创建 generator.jsimport OpenAI from openai; const openai new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); export async function generateCode(prompt, context ) { const fullPrompt ${context} 任务要求${prompt} 请生成 TypeScript 代码并确保 1. 函数导出为默认导出。 2. 包含 JSDoc 说明输入输出。 3. 代码必须能通过 TypeScript 严格模式检查。; const response await openai.chat.completions.create({ model: gpt-4, messages: [{ role: user, content: fullPrompt }], temperature: 0.2, // 低随机性提高确定性 }); return response.choices[0].message.content; }然后创建验证器 validator.jsimport { execSync } from child_process; import { writeFileSync, unlinkSync } from fs; export function validateCode(code) { const testFile ./test/temp.test.ts; // 保存生成的代码 writeFileSync(./temp.ts, code); // 生成基础测试 const testCode import func from ../temp.ts; describe(Generated Function, () { test(should work for basic case, () { // 这里需要根据实际函数动态生成测试用例 // 示例如果生成的是加法函数则 expect(func(1, 2)).toBe(3); }); }); ; writeFileSync(testFile, testCode); try { // 运行 TypeScript 编译 execSync(npx tsc --noEmit, { stdio: inherit }); // 运行测试 execSync(npx jest test/temp.test.ts, { stdio: inherit }); return { success: true }; } catch (error) { return { success: false, error: error.message }; } finally { // 清理临时文件 unlinkSync(./temp.ts); unlinkSync(testFile); } }3.3 运行调试第一个任务创建一个简单任务生成一个函数判断字符串是否为邮箱格式。在 src/ 下创建 main.jsimport { generateCode } from ./generator.js; import { validateCode } from ./validator.js; async function main() { const prompt 编写一个函数验证输入字符串是否为有效邮箱地址。; let maxRetries 3; let context ; for (let attempt 1; attempt maxRetries; attempt) { console.log(第 ${attempt} 次生成...); const code await generateCode(prompt, context); console.log(生成代码, code); const result validateCode(code); if (result.success) { console.log(✅ 验证通过); return code; } else { console.log(❌ 验证失败, result.error); context 上一次生成失败原因${result.error}。请避免同样错误。; } } throw new Error(超过最大重试次数); } main().catch(console.error);运行前设置 API 密钥export OPENAI_API_KEY你的密钥 node src/main.js第一次运行可能会因为测试用例不完整而失败但你能看到工作流如何自动重试。关键不是一次成功而是观察迭代过程中代码如何逼近正确解。4. 参数调优平衡生成质量和验证成本4.1 控制生成阶段的随机性温度参数temperature直接影响幻觉概率。温度越高创造性越强但幻觉风险越大。在 Skills 工作流中建议初始温度设为 0.2-0.3优先保证可靠性。如果连续多次生成都失败可以适度提高到 0.5引入更多多样性来突破局部最优。但一旦验证通过后续类似任务应回归低温度。另一个关键参数是最大生成长度max_tokens。对于代码生成任务建议根据函数复杂度设置上限。简单函数 500-800 token 足够复杂模块也不要超过 2000否则容易生成冗余代码。4.2 优化验证环节的执行效率验证是工作流的性能瓶颈。全量编译和测试每次可能耗时几秒到几十秒。在实际使用中可以分层验证语法检查只运行 TypeScript 编译不执行测试最快。基础测试运行一组核心用例覆盖主要功能。完整测试运行全部边界情况最慢。初次生成后先做语法检查通过后再进入基础测试。只有在前几次迭代都失败时才启动完整测试收集更详细的错误信息。对于常用函数可以建立验证缓存。如果生成的代码与之前通过的代码高度相似直接复用验证结果避免重复执行。4.3 设置合理的迭代边界无限重试不仅效率低还可能陷入死循环。我的经验是简单任务最多重试 3 次。中等复杂度任务最多 5 次。复杂任务3 次失败后转为人工干预。每次重试后对比错误信息的变化。如果错误类型不变说明问题可能出在任务描述或环境配置而不是生成质量。这时应该暂停自动重试先人工排查根本原因。5. 常见问题排查当工作流卡住时先看哪里5.1 生成代码始终无法通过验证如果连续多次生成都失败按这个顺序排查检查任务描述是否明确AI 是否真正理解你要什么把任务描述拆解成更小的步骤先验证最小单元。查看验证脚本是否过于严格测试用例是否覆盖了合理的边界有时不是代码错了而是测试条件太理想化。确认环境依赖是否一致生成的代码可能依赖特定库版本但验证环境缺少这些依赖。在工作流开始时明确声明环境约束。比如生成一个“获取当前天气”的函数如果测试用例要求返回特定温度值而函数实际调用的是真实 API测试就会因网络或数据变化失败。这时应该用 Mock 数据替代真实调用。5.2 工作流性能突然下降当生成-验证周期明显变长时检查临时文件是否积累每次验证后是否正确清理了临时文件磁盘空间不足会拖慢整个流程。监控 API 调用延迟AI 服务商可能遇到性能波动。在代码中添加计时逻辑区分生成时间和验证时间。验证环节是否引入了不必要的开销比如是否每次都在编译整个项目而不是只编译生成的文件可以在工作流中加入简单的性能日志console.time(生成耗时); const code await generateCode(prompt); console.timeEnd(生成耗时); console.time(验证耗时); const result validateCode(code); console.timeEnd(验证耗时);这样能快速定位瓶颈在哪个环节。5.3 生成的代码质量波动大有时一次通过有时多次重试仍失败可能的原因AI 模型本身的不确定性即使是低温度不同随机种子也会产生不同结果。对于关键任务可以用同一输入生成多个候选并行验证后选择最优解。上下文窗口管理问题如果多次迭代后上下文过长AI 可能忽略早期的重要指令。定期清理上下文只保留最近的关键错误信息。任务复杂度超出模型能力如果任务需要深度推理或专业知识单靠生成-验证循环可能不够。这时需要人工拆解任务提供中间步骤的示例。6. 进阶应用如何扩展到复杂项目和生产环境6.1 批量处理多个相关任务Skills 工作流不仅适用于单函数生成还可以处理任务序列。例如生成一个用户注册模块可以拆解为验证邮箱格式函数密码强度检查函数数据库插入函数发送欢迎邮件函数每个函数独立生成和验证最后组装成完整模块。关键是要定义清晰的接口契约确保函数之间能正确协作。批量处理时任务调度器需要管理依赖关系函数 B 依赖函数 A 的输出并支持并行验证独立任务。可以用有向无环图DAG描述任务依赖提高效率。6.2 与现有开发流程集成在生产环境中Skills 工作流应该与现有工具链融合版本控制生成的代码在验证通过后自动提交到特定分支并打上生成标签。代码审查虽然代码通过了自动化验证但仍需要人工审查架构设计和业务逻辑。工作流可以生成变更说明辅助审查。持续集成把生成-验证环节作为 CI 流水线的一个阶段只有通过验证的代码才能合并到主分支。集成的关键是保持工作流的独立性。不要让它直接修改主代码库而是通过 Pull Request 或 Merge Request 的方式引入变更保留人工确认环节。6.3 建立领域特定的技能库长期使用后你会积累大量通过验证的代码片段。这些可以组织成领域特定的技能库Skills Library。当接到新任务时工作流先检索技能库中是否存在相似解决方案直接复用或适配减少重复生成。技能库应该包含代码实现验证用例使用示例适用场景描述性能特征数据维护技能库需要定期回顾和更新确保代码仍然符合当前项目标准和依赖版本。7. 边界与局限什么时候不适合用这个工作流7.1 任务本身缺乏明确判断标准如果一个问题没有清晰的正确性标准验证环节就无法有效工作。比如生成创意文案设计用户界面编写主观性较强的文档这些任务需要人类审美和上下文判断自动化验证容易导致过度优化到错误指标。7.2 验证成本高于人工实现成本对于极其简单的任务如一行正则表达式直接写比搭建工作流更高效。通常来说任务需要超过 10 分钟人工实现时才考虑使用自动化生成。验证成本也要考虑。如果需要搭建复杂测试环境或准备大量测试数据可能得不偿失。7.3 强实时性要求的场景生成-验证循环需要时间从几秒到几分钟不等。对于用户交互等实时性要求高的场景这种延迟不可接受。工作流更适合开发阶段、自动化脚本编写等离线任务。7.4 安全关键型代码尽管工作流能减少幻觉但生成的代码仍可能包含潜在安全漏洞。对于支付、认证、数据保护等关键模块建议只使用工作流生成初步原型核心逻辑必须经过严格的安全审计。Skills 工作流最大的价值不是完全替代人工而是提供一个可靠性更高的 AI 辅助方案。它特别适合那些模式固定、验证直接、但实现细节繁琐的任务。当你需要批量生成工具函数、数据转换器、API 客户端等重复性代码时这个思路能显著提升效率同时保持输出质量可控。实际落地时我建议先从一个小而具体的任务开始跑通整个流程后再逐步扩展到更复杂的场景。最重要的是建立“生成必验证”的习惯不要让 AI 输出未经检验就直接进入生产环境。

相关新闻

2026/9/7 16:50:21

WebGL与WebGPU技术选型及资源加载优化实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 16:50:21

【单片机毕设案例分享】基于 STM32 的环境传感器数据采集与远程 APP 控制系统设计 基于 STM32 的室内环境监测排风联动声光告警系统设计(010107)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于单片机,STM32单片机,51单片机,J…

2026/9/7 17:50:31

单片机毕设选题推荐:基于 STM32 或 51 单片机的 DHT11 与 MQ-2 空气质量监测装置设计 基于 STM32 或 51 单片机的室内粉尘、温湿度、烟雾综合监测系统(024506)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/7 17:50:31

单片机毕设选题推荐:基于 STM32/51 单片机的光敏采集与光照补光智能控制系统 基于 STM32/51 单片机的多路继电器环境执行驱动与蓝牙终端(024406)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/7 17:50:31

【计算机毕业设计单片机案例】基于 STM32 或 51 单片机的双工作模式垃圾桶检测系统设计 基于 STM32 或 51 单片机的状态可视化智能垃圾桶设计与实现(025006)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/9/7 17:45:30

GPT-5.6时代的多智能体工作流:工具调用与架构选型实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 0:47:43

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/7 0:14:19

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/7 0:14:17

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/6 19:33:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…