【Agent Harness】TPS的“自工程完结”教会了我一件事:别把Bug留给下一道工序
摘要本文从丰田生产方式的“自工程完结”理念出发探讨如何将“安灯绳”机制引入AI Agent系统。通过流马Gliding HorseAgent操作系统的实践展示了如何利用SHACL契约、系统调用门Syscall Gate和知识图谱追溯实现AI产出的质量硬拦截确保每个Agent工序“不制造、不流出缺陷”从根本上提升LLM的指令遵守能力。关键词自工程完结安灯绳AI AgentLLM指令遵守质量拦截流马Gliding Horse系统调用门SHACL契约知识图谱TPS的“自工程完结”教会了我一件事别把Bug留给下一道工序我之前在丰田的工厂里看到过一个场景震撼至今流水线上一个工人发现面前的车门有点歪他直接拉下了头顶的一根红绳。整条生产线停了。没有人骂他反而他的工长跑过来和他一起把问题解决掉才让线重新动起来。后来我才知道这根红绳叫“安灯绳”Andon Cord是丰田生产方式里最核心的机制之一。背后的哲学叫**“自工程完结”**——每个工序必须确保自己的产出是百分百合格的绝不把问题留给下一道工序。因为问题发现得越晚修复代价越高。在流水线上是这样在软件工程里更是这样。于是我在想能不能把这根红绳装到我的AI Agent系统里一、“自工程完结”到底在说什么丰田的“自工程完结”有三个核心原则不接收缺陷上一道工序流过来的东西有问题直接拒绝不凑合着往下干。不制造缺陷自己这道工序产出的东西必须符合质量标准不能因为赶进度就糊弄。不流出缺陷自己检查出问题立刻停下来修绝不把有问题的东西传给下一道工序。翻译成软件工程的人话就是需求阶段的问题别留到设计阶段设计阶段的问题别留到编码阶段编码阶段的问题别留到测试阶段测试阶段的问题别TM留到上线后。听起来像废话但你想想平时是怎么干活的——需求没搞清楚就开始写代码代码写完一堆Bug丢给测试测试来不及就“先上线再说”。每个环节都在把问题往下游甩最后上线炸了所有人一起加班修。丰田告诉我们这根红绳越早拉代价越小。在设计文档里改一行字成本是1在代码里改一个逻辑成本是10上线后炸了再修成本是1000。二、我的流马Gliding Horse怎么装上这根红绳流马是一个Agent操作系统它的核心是让多个AI Agent协作完成软件工程任务——需求Agent、设计Agent、编码Agent、测试Agent各司其职按阶段传递产出。如果我让这些Agent像普通流水线一样产出什么就往下一阶段丢那结果一定是灾难需求Agent漏了一个边界条件设计Agent基于不完整的需求画了架构图编码Agent照着有问题的设计写了几千行代码最后测试Agent发现问题时已经晚了。所以我决定把丰田的“自工程完结”机制原封不动地装进流马的系统调用门Syscall Gate里。具体怎么装三个步骤强约束、硬拦截、速反馈。第一步契约——提前定义“什么叫合格”在流马里每个阶段的产出物需求文档、设计文档、代码、测试报告都必须满足一个提前定义好的SHACL契约——一种结构化的质量标准。比如需求Agent产出的PRD文档契约会规定它必须包含功能模块列表至少一个、用户角色定义、核心业务流程图、明确的验收条件。编码Agent产出的代码契约会要求所有函数有类型注解、所有公开API有文档注释、单元测试覆盖率不低于80%。这些契约不是AI自己猜的是人提前定好的。就像丰田工厂里每个工位都有一个明确的质量标准清单工人在干活前就知道“什么叫合格”。第二步红绳——产出前必须过“系统调用门”当需求Agent觉得自己“完成了”想把产出传递给设计Agent时它不能直接扔过去。它必须先把产出提交给流马的系统调用门Syscall Gate。这个Gate就是AI世界的“安灯绳”。它会自动执行SHACL校验检查产出是否满足预设的契约。校验通过Gate放行产出物被打上数字签名正式“出厂”。校验不通过Gate直接拒收把具体哪里不合格的信息反馈给Agent。Agent必须自己修正直到通过校验为止。这里的关键是不是下游Agent去检查上游的产出而是上游Agent自己必须产出合格品。Gate只是拿契约去对照合格就过不合格就拦。责任在产出者不在接收者。第三步追溯——所有“拉绳记录”都写进知识图谱每一次Gate拦截每一次Agent修正都会作为一个“质量事件”写入流马的L0持久化知识图谱。哪个Agent、在哪个任务、犯了什么错、修正了几次才通过——全都有记录。这带来了两个好处。首先是责任透明你可以精确知道哪个环节最容易出问题。其次是经验复用下次有类似任务时SA调度器会自动把历史上犯过的错注入给新Agent告诉它“上次类似的PRD少了用户角色定义这次注意补上”。丰田工厂里每次拉绳都会被记录和分析用于持续改进产线。流马也一样——质量事件不是用来追责的是用来让整个系统越来越聪明的。三、这根红绳能提升LLM的指令遵守吗答案是能但不是让LLM变得更听话而是让它犯不了错。LLM的本质决定了它一定会产生幻觉、一定会偷懒、一定会遗漏边界条件。你没法通过“更好的Prompt”来根治这些问题就像你没法通过“跟工人说认真点”来杜绝次品。但你可以设计一套机制让这些错误在产生的第一时间就被抓住、被拦截、被打回修正。这套机制不依赖AI的自觉依赖的是契约、校验和硬拦截。这是我从丰田学到的最大一课质量不是检出来的是“造”出来的。每个工序都对自己的产出负责每个工序都有明确的质量标准每个工序都有权利和义务在发现问题时拉下红绳。四、流马开源欢迎来玩流马Gliding Horse的所有核心代码都在GitHub上开源用Rust写成图数据库用Oxigraph记忆系统借鉴了CPU缓存架构现在又装上了丰田的安灯绳。如果你也对“给AI套缰绳”这件事感兴趣或者觉得自工程完结、系统调用门、知识图谱追溯这些概念有点意思欢迎来star、提issue、一起搞。最后说句心里话AI现在还处于“连个按钮都画不准”的阶段与其等它变聪明不如先给它装根红绳。流马想做的就是把丰田工厂里的那根红绳装到每一个AI Agent的手边。GitHub地址https://github.com/doiito/gliding_horse五、实战为需求Agent定义SHACL契约下面用一个具体的例子展示如何为“需求Agent”的PRD产出定义一个SHACL契约并在系统调用门中执行校验。5.1 定义SHACL契约YAML格式# prd_shacl_contract.yaml# 需求Agent产出的PRD文档必须满足以下约束prefixes:schema:http://schema.org/prd:http://glidinghorse.dev/prd## 1. 功能模块列表至少包含一个功能模块shapes:-targetClass:prd:PRDDocumentpropertyConstraints:-path:prd:hasFeatureModuleminCount:1description:PRD必须至少定义一个功能模块errorMessage:缺少功能模块定义请至少添加一个功能模块# 2. 用户角色定义至少包含一个用户角色-targetClass:prd:PRDDocumentpropertyConstraints:-path:prd:hasUserRoleminCount:1description:PRD必须至少定义一个用户角色errorMessage:缺少用户角色定义请至少添加一个用户角色# 3. 核心业务流程图必须包含流程图节点-targetClass:prd:PRDDocumentpropertyConstraints:-path:prd:hasBusinessFlowminCount:1description:PRD必须包含核心业务流程图errorMessage:缺少核心业务流程图请补充业务流程描述# 4. 验收条件每个功能模块必须有明确的验收条件-targetClass:prd:FeatureModulepropertyConstraints:-path:prd:hasAcceptanceCriteriaminCount:1description:每个功能模块必须定义验收条件errorMessage:功能模块 {moduleName} 缺少验收条件请补充# 5. 功能模块名称不能为空-targetClass:prd:FeatureModulepropertyConstraints:-path:schema:nameminLength:1maxLength:100datatype:xsd:stringdescription:功能模块名称不能为空且不超过100字符errorMessage:功能模块名称无效请检查5.2 系统调用门校验逻辑Python伪代码# syscall_gate_validator.py# 流马系统调用门——SHACL契约校验器fromtypingimportDict,Any,ListimportyamlfromrdflibimportGraph,URIReffrompyshaclimportvalidateclassSyscallGate:系统调用门负责校验Agent产出物是否满足契约def__init__(self,contract_path:str):# 加载SHACL契约withopen(contract_path,r)asf:self.shacl_graphGraph().parse(dataf.read(),formatyaml)defvalidate_prd(self,prd_data:Dict[str,Any])-Dict[str,Any]: 校验需求Agent产出的PRD文档 参数: prd_data: 需求Agent产出的结构化PRD数据 格式示例: { feature_modules: [ {name: 用户登录, acceptance_criteria: [支持密码登录, 支持验证码登录]} ], user_roles: [普通用户, 管理员], business_flow: 用户输入账号密码 - 系统验证 - 登录成功 } 返回: { passed: bool, # 是否通过校验 errors: List[str], # 未通过的详细错误信息 suggestions: List[str] # 修正建议 } # 1. 将PRD数据转换为RDF图prd_graphself._convert_to_rdf(prd_data)# 2. 执行SHACL校验conforms,results_graph,results_textvalidate(prd_graph,shacl_graphself.shacl_graph,inferencerdfs,abort_on_firstFalse)# 3. 解析校验结果ifconforms:return{passed:True,errors:[],suggestions:[PRD校验通过可以传递给设计Agent]}else:# 提取具体错误信息errorsself._parse_validation_results(results_graph)return{passed:False,errors:errors,suggestions:self._generate_suggestions(errors)}def_convert_to_rdf(self,prd_data:Dict)-Graph:将结构化PRD数据转换为RDF图简化实现gGraph()prd_uriURIRef(http://glidinghorse.dev/prd/current)# 添加功能模块formoduleinprd_data.get(feature_modules,[]):module_uriURIRef(fhttp://glidinghorse.dev/prd/module/{module[name]})g.add((prd_uri,URIRef(http://glidinghorse.dev/prd#hasFeatureModule),module_uri))g.add((module_uri,URIRef(http://schema.org/name),Literal(module[name])))# 添加验收条件forcriteriainmodule.get(acceptance_criteria,[]):criteria_uriURIRef(fhttp://glidinghorse.dev/prd/criteria/{hash(criteria)})g.add((module_uri,URIRef(http://glidinghorse.dev/prd#hasAcceptanceCriteria),criteria_uri))g.add((criteria_uri,URIRef(http://schema.org/text),Literal(criteria)))# 添加用户角色forroleinprd_data.get(user_roles,[]):role_uriURIRef(fhttp://glidinghorse.dev/prd/role/{role})g.add((prd_uri,URIRef(http://glidinghorse.dev/prd#hasUserRole),role_uri))# 添加业务流程图ifprd_data.get(business_flow):flow_uriURIRef(http://glidinghorse.dev/prd/flow/main)g.add((prd_uri,URIRef(http://glidinghorse.dev/prd#hasBusinessFlow),flow_uri))g.add((flow_uri,URIRef(http://schema.org/description),Literal(prd_data[business_flow])))returngdef_parse_validation_results(self,results_graph:Graph)-List[str]:解析SHACL校验结果提取可读的错误信息errors[]fors,p,oinresults_graph.triples((None,URIRef(http://www.w3.org/ns/shacl#resultMessage),None)):errors.append(str(o))returnerrorsdef_generate_suggestions(self,errors:List[str])-List[str]:根据错误生成修正建议suggestions[]forerrorinerrors:if功能模块inerrorand缺少inerror:suggestions.append(请检查PRD中是否遗漏了功能模块定义)elif用户角色inerrorand缺少inerror:suggestions.append(请补充至少一个用户角色如普通用户、管理员)elif验收条件inerror:suggestions.append(请为每个功能模块补充验收条件确保可测试)elif流程图inerror:suggestions.append(请补充核心业务流程描述至少包含主要步骤)returnsuggestions# 使用示例 if__name____main__:# 初始化系统调用门加载契约gateSyscallGate(prd_shacl_contract.yaml)# 需求Agent产出的PRD故意缺少验收条件incomplete_prd{feature_modules:[{name:用户登录,acceptance_criteria:[]}# 验收条件为空],user_roles:[普通用户],business_flow:用户输入账号密码 - 系统验证 - 登录成功}# 执行校验resultgate.validate_prd(incomplete_prd)ifnotresult[passed]:print(❌ 校验未通过错误信息)forerrinresult[errors]:print(f -{err})print(\n 修正建议)forsuggestioninresult[suggestions]:print(f -{suggestion})else:print(✅ 校验通过可以传递给设计Agent)5.3 关键校验点说明校验点契约要求拦截效果功能模块数量minCount: 1防止需求Agent产出空PRD用户角色定义minCount: 1确保考虑不同用户视角验收条件完整性每个模块至少1条避免模糊需求确保可测试业务流程图minCount: 1强制梳理业务流程防止遗漏关键路径这套机制的核心思想是不是等下游Agent发现上游的问题而是让上游Agent在产出时就被契约拦住自己修正。就像丰田工厂里的安灯绳——问题发现得越早修复代价越小。

相关新闻

曹县洗牙的好地方

曹县洗牙的好地方

南现代 北大唐 曹县看牙 好地方

2026/6/26 6:07:49阅读更多 →
2026年铝型材开模定制市场趋势:五大企业技术路线对比

2026年铝型材开模定制市场趋势:五大企业技术路线对比

挤压铝型材开模定制行业技术路线与竞争格局分析数据来源:工信部《有色金属行业智能制造标准体系建设指南》(2024年)、中国有色金属加工工业协会(2025年)及企业公开资料一、行业背景与技术趋势据中国有色金属加工工业协…

2026/6/26 6:07:49阅读更多 →
怎么去甲醛?倍朗达除醛喷剂+活性锰分解片:省事省心的除醛方案

怎么去甲醛?倍朗达除醛喷剂+活性锰分解片:省事省心的除醛方案

新房装修完,甲醛问题最让人头疼。市面产品五花八门——活性炭一两周就饱和,光触媒在柜子里无效,专业治理几千块还覆盖不全。真正省事省心的方案,往往屈指可数。 除醛喷剂:源头治理,一次施工 倍朗达除醛喷剂…

2026/6/26 6:07:49阅读更多 →
2026年多语言外贸网站搭建怎么做?海外独立站搭建指南

2026年多语言外贸网站搭建怎么做?海外独立站搭建指南

2026年多语言外贸网站搭建怎么做?海外独立站搭建指南多语言外贸网站搭建,不是把中文官网翻译成英文那么简单。真正能被海外客户使用的网站,要先设计信息结构,再处理语言版本、产品资料、访问速度、Google 收录、询盘表单和后续内容…

2026/6/26 13:40:12阅读更多 →
技术解析:SAI拆分APK安装器如何解决Android模块化部署的5大痛点

技术解析:SAI拆分APK安装器如何解决Android模块化部署的5大痛点

技术解析:SAI拆分APK安装器如何解决Android模块化部署的5大痛点 【免费下载链接】SAI Android split APKs installer 项目地址: https://gitcode.com/gh_mirrors/sa/SAI 在Android应用开发领域,模块化部署已成为现代应用架构的核心需求&#xff0…

2026/6/26 13:40:12阅读更多 →
OpenAI 首款自研芯片 Jalapeño 深度解析:联手 Broadcom 打造的推理之王,能否撼动 NVIDIA 霸权?

OpenAI 首款自研芯片 Jalapeño 深度解析:联手 Broadcom 打造的推理之王,能否撼动 NVIDIA 霸权?

北京时间 6 月 25 日凌晨,OpenAI 正式发布了其首款自主设计的 AI 推理芯片,代号 Jalapeo(墨西哥辣椒)。这款芯片由 OpenAI 与半导体巨头 Broadcom(博通)联合设计和制造,标志着 AI 行业从「租用 …

2026/6/26 13:40:12阅读更多 →
LinkSwift网盘直链下载助手:免费解锁8大网盘限速的终极解决方案

LinkSwift网盘直链下载助手:免费解锁8大网盘限速的终极解决方案

LinkSwift网盘直链下载助手:免费解锁8大网盘限速的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…

2026/6/26 13:40:12阅读更多 →
TWR-KL25Z开发板实战指南:从硬件解析到低功耗设计

TWR-KL25Z开发板实战指南:从硬件解析到低功耗设计

1. 项目概述:从零开始玩转TWR-KL25Z开发板如果你正在寻找一款既能让你快速上手ARM Cortex-M0,又具备强大扩展能力的入门级开发板,NXP的TWR-KL25Z绝对是一个绕不开的选择。我手头这块板子已经陪我度过了好几个嵌入式项目,从简单的L…

2026/6/26 13:40:12阅读更多 →
Mesen:终极NES模拟器指南 - 重温经典游戏的完美解决方案

Mesen:终极NES模拟器指南 - 重温经典游戏的完美解决方案

Mesen:终极NES模拟器指南 - 重温经典游戏的完美解决方案 【免费下载链接】Mesen Mesen is a cross-platform (Windows & Linux) NES/Famicom emulator built in C and C# 项目地址: https://gitcode.com/gh_mirrors/me/Mesen 还在为找不到合适的NES模拟器…

2026/6/26 13:35:11阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/26 11:03:22阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/26 4:15:25阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/26 9:29:01阅读更多 →
HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

一、前言:企业运维痛点与资源价值自博通收购 VMware 之后,原 VMware 公开免费下载渠道全面关闭,企业运维人员想要获取适配 HPE 慧与服务器的 ESXi 9 原厂镜像,必须注册博通账号、绑定有效授权才能下载,无授权账号无法获…

2026/6/26 0:02:15阅读更多 →
Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin作为一门现代编程语言,与Java的互操作性一直是其核心优势之一。为了让Kotlin代码能够无缝对接Java,Kotlin提供了多种注解来优化互操作体验,其中JvmStatic和JvmField是两个关键注解。它们分别用于解决静态成员和字段在Java中的访问问题&…

2026/6/26 0:02:15阅读更多 →
深入解析musl libc中的mmap实现源码

深入解析musl libc中的mmap实现源码

最近在阅读musl libc源码时,发现其mmap的实现非常精妙,特分享给大家。 一、代码整体结构 这段代码实现了__mmap函数,并通过weak_alias导出为mmap。这是典型的musl libc风格——提供弱符号以便用户可以重写。 weak_alias(__mmap, mmap); 二…

2026/6/26 0:02:15阅读更多 →