【Agent Harness】TPS的“自工程完结”教会了我一件事:别把Bug留给下一道工序

📅 2026/6/26 6:12:56
【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在产出时就被契约拦住自己修正。就像丰田工厂里的安灯绳——问题发现得越早修复代价越小。