版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
AIAgentHarnessEngineering驾驭工程实战手册一、概述1.1背景与定义HarnessEngineering(驾驭工程)是围绕AI智能体设计和构建约束机制、反馈回路、工作流控制和持续改进循环的系统工程实践。其核心哲学是“人类掌舵,智能体执行”(HumanSteer,AgentExecute)。"harness"一词源自马具——缰绳、马鞍、嚼子——这是一套引导强大但不可预测的动物的完整装备。这个比喻精准地描述了驾驭工程的核心挑战:如何在赋予AIAgent强大能力的同时,通过系统性约束确保其行为可靠、可控、可预测。1.2行业数据与证据链2026年最新行业数据揭示了一个关键事实:指标数据来源OpenAI团队代码产出100万行代码,0行手动编写OpenAI内部工程报告2026.Q1团队规模3~7人,人均每日3.5个PROpenAI工程团队2026LangChainTerminalBench排名从第30位跃升至第5位TerminalBench2026.02榜单Harness优化得分提升仅改Harness,得分从52.8%飙升至66.5%LangChain官方博客2026关键结论:当前AIAgent落地的瓶颈不在模型智能,而在基础设施层面的驾驭能力。1.3驾驭工程与运维工程的类比运维工程师对系统稳定性有深刻理解,而HarnessEngineering本质上是将这种系统思维应用于AIAgent:传统软件系统AIAgent系统─────────────────────────────────────────────────操作系统Agent运行时进程调度器任务分发器系统调用限流Agent行为约束资源监控告警上下文窗口监控技术债务管理熵管理驾驭工程师的职责,是为AIAgent建造“高速公路”——包括护栏、限速牌、加油站,确保Agent在受控环境中高效执行任务。二、AI工程范式三次跃迁2.1范式演进底层逻辑AI工程经历了三次本质跃迁,每次跃迁都解决了前一个范式的核心局限:第一阶段:提示词工程(PromptEngineering)核心问题:如何把话说清楚优化对象:Prompt措辞、格式、示例交互模式:一问一答,单次请求-响应局限:模型输出不稳定,对措辞敏感,难以处理复杂任务第二阶段:上下文工程(ContextEngineering)核心问题:如何给AI喂信息优化对象:文档、代码片段、历史对话、RAG检索交互模式:信息注入→生成局限:上下文窗口有限,检索质量参差不齐,噪声累积第三阶段:驾驭工程(HarnessEngineering)核心问题:如何让Agent可靠工作优化对象:约束、反馈回路、控制系统交互模式:人类掌舵,Agent执行,循环迭代2.2类比详解一个运维工程师视角的比喻:PromptEngineering=对马喊话的技巧└──问题是:马不一定听你的ContextEngineering=给马看的地图└──问题是:地图可能过时,马可能走错路HarnessEngineering=给马造高速公路,配护栏、限速牌和加油站└──马必须在规定车道内行驶,超速会被自动限速2.3范式对比数据指标提示词工程上下文工程驾驭工程任务完成率15~25%35~50%65~80%端到端自动化比例<5%20~35%60~75%平均修复次数5~8次3~5次1~2次需要人工介入场景100%60~70%15~25%数据来源:LangChainBenchmarkReport2026.Q1,样本量N=500企业用户三、Agent常见失败模式深度解析理解Agent失败模式是设计Harness的前提。以下四种失败模式在生产环境中出现频率最高。3.1试图一步到位(One-shotting)表现:Agent尝试在单个请求中完成复杂任务症状:上下文窗口接近耗尽输出代码半成品,语法不完整任务标记完成但功能不可用根因分析:Agent缺乏任务分解能力,错误地估计了任务复杂度。类比:一个运维工程师收到“部署整套微服务架构”的需求后,不做分析直接执行,最终只完成了部分配置。检测脚本:#!/bin/bash#检测Agent是否存在one-shotting问题#使用方式:./detect_one_shotting.sh<context_log_file>CONTEXT_LOG=$1if[-z"$CONTEXT_LOG"];thenecho"用法:$0<上下文日志文件>"exit1fi#检测上下文窗口使用率WINDOW_USAGE=$(grep"context_used""$CONTEXT_LOG"|awk'{print$3}'|tail-1)MAX_WINDOW=$(grep"context_max""$CONTEXT_LOG"|awk'{print$3}'|tail-1)if[-n"$WINDOW_USAGE"]&&[-n"$MAX_WINDOW"];thenUSAGE_PERCENT=$((WINDOW_USAGE*100/MAX_WINDOW))echo"上下文窗口使用率:${USAGE_PERCENT}%"if["$USAGE_PERCENT"-gt80];thenecho"警告:可能存在one-shotting问题"exit1fifi#检测输出完整性INCOMPLETE_PATTERNS=("def__init__""class""try:""if__name__==\"__main__\":""import")forpatternin"${INCOMPLETE_PATTERNS[@]}";doifgrep-q"$pattern""$CONTEXT_LOG";thenMATCH_COUNT=$(grep-c"$pattern""$CONTEXT_LOG")echo"检测到未闭合结构'$pattern':$MATCH_COUNT次"fidone3.2过早宣布胜利(PrematureVictory)表现:Agent看到部分进展就认为任务完成症状:第一个子任务完成就停止输出"任务已完成"但实际只完成20~30%缺少端到端验证根因分析:Agent缺乏任务范围意识和完成标准定义。类比:运维工程师收到“优化数据库性能”需求后,创建了一个索引就宣布完成,而没有进行完整的性能测试。检测脚本:#!/bin/bash#检测Agent是否过早宣布胜利#使用方式:./detect_premature_victory.sh<agent_output_log>AGENT_LOG=$1if[-z"$AGENT_LOG"];thenecho"用法:$0<Agent输出日志>"exit1fi#定义任务完成的必要检查点REQUIRED_CHECKPOINTS=("test.*passed""lint.*passed""build.*success""deploy.*complete""verify.*success")COMPLETED_CHECKPOINTS=0TOTAL_CHECKPOINTS=${#REQUIRED_CHECKPOINTS[@]}#读取预定义的任务清单TASK_FILE="/var/log/agent/task_requirements.txt"if[-f"$TASK_FILE"];thenecho"===任务完成度检查==="whileIFS=read-rrequirement;doifgrep-qi"$requirement""$AGENT_LOG";thenecho"[✓]$requirement"((COMPLETED_CHECKPOINTS++))elseecho"[✗]$requirement(缺失)"fidone<"$TASK_FILE"COMPLETION_RATE=$((COMPLETED_CHECKPOINTS*100/$(wc-l<"$TASK_FILE")))echo"任务完成度:${COMPLETION_RATE}%"ifgrep-qi"task.*complete\|任务完成\|alldone""$AGENT_LOG";thenif["$COMPLETION_RATE"-lt80];thenecho"警告:Agent过早宣布胜利,完成度仅${COMPLETION_RATE}%"exit1fifielseecho"警告:未找到任务清单文件$TASK_FILE"fi3.3过早标记功能完成(PrematureFeatureComplete)表现:写完代码就标记完成,没有端到端测试症状:代码已提交但测试未编写缺少集成测试和回归测试部署后发现功能不工作根因分析:Agent将“代码写完”等同于“功能完成”,忽略了软件工程的基本原则。类比:运维工程师配置完负载均衡规则就下班,没有验证流量是否真正转发到后端服务。检测脚本:#!/bin/bash#检测代码-测试完成度匹配性#使用方式:./check_code_test_ratio.sh<repo_path>REPO_PATH=$1if[-z"$REPO_PATH"];thenREPO_PATH="."fiecho"===代码与测试完成度分析==="#统计源代码文件数SRC_FILES=$(find"$REPO_PATH"-name"*.py"-o-name"*.js"-o-name"*.go"-o-name"*.java"|grep-v__pycache__|grep-vnode_modules|grep-vvendor)SRC_COUNT=$(echo"$SRC_FILES"|wc-l)echo"源代码文件数:$SRC_COUNT"#统计测试文件数TEST_FILES=$(find"$REPO_PATH"-name"*_test.py"-o-name"*_test.js"-o-name"*_test.go"-o-name"*Test.java"-o-name"test_*.py"-o-name"*.spec.js"|grep-v__pycache__)TEST_COUNT=$(echo"$TEST_FILES"|wc-l)echo"测试文件数:$TEST_COUNT"#计算比率if["$SRC_COUNT"-gt0];thenRATIO=$(echo"scale=2;$TEST_COUNT*100/$SRC_COUNT"|bc)echo"代码测试比:${RATIO}%"if(($(echo"$RATIO<50"|bc-l)));thenecho"警告:测试覆盖率过低,可能存在过早标记完成问题"fifi#检查最近提交是否缺少测试LATEST_COMMIT=$(git-C"$REPO_PATH"log-1--format="%H")COMMIT_FILES=$(git-C"$REPO_PATH"diff-tree--no-commit-id--name-only-r"$LATEST_COMMIT"|grep-E'\.(py|js|go|java)$')forfilein$COMMIT_FILES;do#检查对应的测试文件是否存在BASENAME=$(basename"$file"|cut-d.-f1)EXTENSION=$(basename"$file"|cut-d.-f2)TEST_PATTERNS=("${BASENAME}_test.${EXTENSION}""${BASENAME}.test.${EXTENSION}""test_${BASENAME}.${EXTENSION}""${BASENAME}_spec.${EXTENSION}")TEST_FOUND=0forpatternin"${TEST_PATTERNS[@]}";doiffind"$REPO_PATH"-name"$pattern"|grep-q.;thenTEST_FOUND=1breakfidoneif["$TEST_FOUND"-eq0];thenecho"警告:$file缺少对应的测试文件"fidone3.4模式复制(PatternReplication)表现:忠实地复制并放大坏模式和架构漂移症状:新代码继承了旧代码的所有设计缺陷技术债务不断累积代码库质量持续下降根因分析:Agent缺乏架构意识和模式判断能力。类比:新入职的运维工程师照搬了前任的“经验”(实际上是反模式),导致问题代际传递。检测脚本:#!/bin/bash#检测代码库中的架构漂移和反模式#使用方式:./detect_architecture_drift.sh<repo_path>REPO_PATH=${1:-"."}echo"===架构漂移检测报告==="#定义反模式检测规则declare-AANTI_PATTERNSANTI_PATTERNS=(["god_class"]="class.*\{[^}]{1000,\}"#超大单体类["long_method"]="def\w+.*\n(.*\n){50,}"#超长方法["circular_import"]="import.*from.*\n.*import.*from.*"#循环依赖["magic_number"]="[0-9]{3,}.*[a-zA-Z]"#魔法数字["hardcoded_secret"]="password.*=.*['\"]"#硬编码密码["sql_concatenation"]="\".*SELECT.*\+\"#SQL拼接["eval_usage"]="eval\("#eval使用)#统计各语言源代码forlanginpyjsgojava;docase$langinpy)EXTENSION="*.py";;js)EXTENSION="*.js";;go)EXTENSION="*.go";;java)EXTENSION="*.java";;esacFILE_COUNT=$(find"$REPO_PATH"-name"$EXTENSION"2>/dev/null|grep-v__pycache__|grep-vnode_modules|wc-l)echo"---$lang文件数:$FILE_COUNT---"done#检测循环依赖(Python)echo""echo"---循环依赖检测(Python)---"ifcommand-vpython3&>/dev/null;thenpython3-c"importosimportsysdeffind_imports(filepath):imports=[]try:withopen(filepath,'r',encoding='utf-8')asf:forlineinf:line=line.strip()ifline.startswith('import')orline.startswith('from'):parts=line.split()iflen(parts)>=2:module=parts[1].split('.')[0]ifmodulenotin('os','sys','re','json','time','datetime','typing'):imports.append(module)except:passreturnimportsmodule_imports={}forroot,dirs,filesinos.walk('$REPO_PATH'):dirs[:]=[dfordindirsifdnotin['__pycache__','.git','venv','node_modules']]forfileinfiles:iffile.endswith('.py'):filepath=os.path.join(root,file)module=file[:-3]module_imports[module]=find_imports(filepath)#检测循环visited=set()rec_stack=set()defhas_cycle(module):ifmoduleinrec_stack:returnTrueifmoduleinvisited:returnFalsevisited.add(module)rec_stack.add(module)forimportedinmodule_imports.get(module,[]):ifhas_cycle(imported):print(f'循环依赖:{module}->{imported}')returnTruerec_stack.remove(module)returnFalseformoduleinmodule_imports:ifmodulenotinvisited:has_cycle(module)"2>/dev/null||echo"循环依赖检测需要python3"fi#检测硬编码密码echo""echo"---硬编码凭证检测---"HARDCODE_ISSUES=$(grep-r-n-E"(password|secret|api_key)\s*=\s*['\"][^'\"]{4,}['\"]""$REPO_PATH"--include="*.py"--include="*.js"--include="*.java"--include="*.go"2>/dev/null|grep-vtest|grep-v__pycache__|head-20)if[-n"$HARDCODE_ISSUES"];thenecho"发现硬编码凭证:"echo"$HARDCODE_ISSUES"elseecho"未发现硬编码凭证"fi#检测魔法数字echo""echo"---魔法数字检测(前20个)---"MAGIC_NUMBERS=$(grep-rn-E"\b[0-9]{3,}\b""$REPO_PATH"--include="*.py"--include="*.js"--include="*.go"--include="*.java"2>/dev/null|grep-v__pycache__|grep-vtest|grep-v"#"|head-20)if[-n"$MAGIC_NUMBERS"];thenecho"$MAGIC_NUMBERS"elseecho"未发现明显的魔法数字"fi四、四大护栏体系架构驾驭工程的核心是四大护栏体系,它们共同构成了AIAgent可靠运行的保障网络。4.1护栏体系总览┌─────────────────────────────────────────────────────────┐│四大护栏体系│├───────────────┬───────────────┬──────────────┬──────────┤│上下文工程│架构约束│反馈循环│熵管理││(Context)│(Constraint)│(Feedback)│(Entropy)│├───────────────┼───────────────┼──────────────┼──────────┤│AGENTS.md│分层依赖模型│AgentReview│技术债务││活文档机制│自定义Linter│自动测试套件│文档园丁││按需检索│CI强制阻断│失败重试循环│垃圾回收│└───────────────┴───────────────┴──────────────┴──────────┘4.2护栏协同工作原理用户请求│▼┌─────────────────────────────────────────────────────────┐│上下文工程层││-加载AGENTS.md活文档││-按需检索相关上下文││-注入任务相关的技术约束和业务规则│└─────────────────────────────────────────────────────────┘│▼┌─────────────────────────────────────────────────────────┐│架构约束层││-检查是否符合分层依赖规则││-验证Linter规则││-阻断违规操作│└─────────────────────────────────────────────────────────┘│▼┌─────────────────────────────────────────────────────────┐│Agent执行层││-负责任务执行││-生成代码/配置/文档│└─────────────────────────────────────────────────────────┘│▼┌─────────────────────────────────────────────────────────┐│反馈循环层││-Agent-to-AgentReview││-运行测试套件││-失败时带错误信息重新执行│└─────────────────────────────────────────────────────────┘│▼┌─────────────────────────────────────────────────────────┐│熵管理层││-定期清理无效代码││-更新文档││-偿还技术债务│└─────────────────────────────────────────────────────────┘│▼返回结果给用户五、护栏一:上下文工程5.1核心概念上下文工程的核心是解决"Agent不知道该看什么"的问题。其核心实践是AGENTS.md活文档机制。5.2AGENTS.md活文档机制5.2.1什么是活文档传统文档的问题:一次性编写,后期无人维护与代码实现脱节成为“文档坟场”活文档的特征:文档是反馈循环的一部分根据任务按需检索和拉取代码变更时自动更新相关文档有专门的Agent负责维护5.2.2AGENTS.md结构设计#AGENTS.md-AIAgent活文档##项目概述[项目名称]是一个生产级[业务领域]系统,运行在[环境]上,日处理请求量[量级]。##技术栈-核心语言:[版本]-框架:[版本]-数据库:[版本]-容器编排:[版本]##架构约束###层级依赖规则Types→Config→Repo→Service→Runtime→UI下层禁止反向依赖上层,违者CI阻断合并。###禁止的模式1.禁止在Service层直接操作数据库2.禁止在Repo层包含业务逻辑3.禁止使用硬编码配置##代码规范###命名规范-类名:PascalCase(例:UserService)-函数名:snake_case(例:get_user_by_id)-常量:UPPER_SNAKE_CASE(例:MAX_RETRY_COUNT)###注释规范-公共API必须有docstring-复杂逻辑必须有关联注释-禁止无意义注释(如"i++"这种)##故障排查手册###常见错误代码对照表|错误码|含义|排查步骤||--------|------|----------||E1001|数据库连接失败|1.检查网络2.检查连接池|###告警阈值-CPU>80%:警告-CPU>95%:紧急-内存>85%:警告-错误率>1%:警告##测试要求-单元测试覆盖率:>=80%-集成测试:所有API必须有对应测试-回归测试:每次发布前必须运行5.2.3上下文检索脚本#!/bin/bash#agent_context_retriever.sh-按需检索Agent上下文#使用方式:./agent_context_retriever.sh<query>[context_scope]QUERY=$1SCOPE=${2:-"full"}#full,architecture,testing,troubleshootingAGENTS_MD="./AGENTS.md"CONTEXT_DIR="./contexts"if[!-f"$AGENTS_MD"];thenecho"错误:找不到AGENTS.md文件"exit1fiecho"===Agent上下文检索报告==="echo"查询:$QUERY"echo"范围:$SCOPE"echo"时间:$(date'+%Y-%m-%d%H:%M:%S')"echo""#根据查询类型提取相关内容case"$QUERY"in*"架构"*|"architecture"*|"层级"*|"layer"*)echo"---架构约束相关---"grep-A50"##架构约束""$AGENTS_MD";;*"测试"*|"test"*|"覆盖率"*)echo"---测试要求相关---"grep-A30"##测试要求""$AGENTS_MD";;*"错误"*|"error"*|"故障"*|"排查"*)echo"---故障排查相关---"grep-A50"##故障排查手册""$AGENTS_MD";;*"规范"*|"命名"*|"style"*)echo"---代码规范相关---"grep-A50"##代码规范""$AGENTS_MD";;*)echo"---全局上下文---"cat"$AGENTS_MD";;esac#检查相关上下文文件if[-d"$CONTEXT_DIR"];thenecho""echo"---相关上下文文件---"#提取与查询相关的上下文文件RELEVANT_FILES=$(grep-l"$QUERY""$CONTEXT_DIR"/*.md2>/dev/null||true)if[-n"$RELEVANT_FILES"];thenforfilein$RELEVANT_FILES;doecho"文件:$file"head-30"$file"echo"..."doneelseecho"未找到相关上下文文件"fifi5.3上下文注入最佳实践5.3.1注入时机控制#!/usr/bin/envpython3#context_injector.py-智能上下文注入控制器importosimportrefromtypingimportList,Dict,OptionalclassContextInjector:"""智能上下文注入控制器原则:1.上下文是稀缺资源,应按需检索2.避免上下文污染,保持注入的相关性3.根据任务类型动态调整上下文组合"""def__init__(self,agents_md_path:str,contexts_dir:str):self.agents_md_path=agents_md_pathself.contexts_dir=contexts_dirself.base_context=self._load_agents_md()def_load_agents_md(self)->str:"""加载基础AGENTS.md文档"""ifos.path.exists(self.agents_md_path):withopen(self.agents_md_path,'r',encoding='utf-8')asf:returnf.read()return""defshould_inject(self,task_type:str,context_window:int,current_usage:int)->bool:"""判断是否应该注入上下文参数:task_type:任务类型(read,write,debug,refactor)context_window:上下文窗口大小current_usage:当前使用量返回:是否应该注入上下文"""remaining=context_window-current_usageusage_ratio=current_usage/context_window#使用率超过60%时减少注入ifusage_ratio>0.6:returnFalse#小任务不需要额外上下文iftask_type=="read"andremaining>5000:returnFalsereturnTruedefselect_context(self,task:str,task_type:str)->List[str]:"""选择性注入上下文参数:task:任务描述task_type:任务类型返回:需要注入的上下文列表"""selected=[self.base_context]#根据任务类型添加特定上下文context_map={"write":["coding_standards.md","architecture.md"],"debug":["troubleshooting.md","error_codes.md"],"refactor":["architecture.md","tech_debt.md"],"test":["testing_guide.md","test_examples.md"],}iftask_typeincontext_map:forctx_fileincontext_map[task_type]:ctx_path=os.path.join(self.contexts_dir,ctx_file)ifos.path.exists(ctx_path):withopen(ctx_path,'r',encoding='utf-8')asf:selected.append(f.read())#动态检索与任务相关的片段keywords=self._extract_keywords(task)dynamic_context=self._retrieve_related_snippets(keywords)ifdynamic_context:selected.append(dynamic_context)returnselecteddef_extract_keywords(self,task:str)->List[str]:"""从任务描述中提取关键词"""#移除停用词stopwords={'the','a','an','is','are','to','for','of','and','in','on'}words=re.findall(r'\b\w+\b',task.lower())return[wforwinwordsifwnotinstopwordsandlen(w)>3]def_retrieve_related_snippets(self,keywords:List[str])->Optional[str]:"""根据关键词检索相关代码片段"""snippets=[]snippets_dir=os.path.join(self.contexts_dir,"snippets")ifnotos.path.exists(snippets_dir):returnNoneforkeywordinkeywords:forfilenameinos.listdir(snippets_dir):ifkeywordinfilename.lower():filepath=os.path.join(snippets_dir,filename)withopen(filepath,'r',encoding='utf-8')asf:content=f.read()iflen(content)<2000:#只注入小型片段snippets.append(f"#{filename}\n{content}")return"\n\n".join(snippets)ifsnippetselseNone六、护栏二:架构约束6.1层级依赖模型6.1.1模型定义架构约束的核心是层级依赖模型,定义如下:Types→Config→Repo→Service→Runtime→UI层级说明:层级职责依赖规则Types数据类型定义被所有层级依赖,不依赖任何层级Config配置定义依赖Types,不依赖其他业务层级Repo数据访问层依赖Types,可调用外部服务Service业务逻辑层依赖Repo,不直接操作数据库Runtime运行时环境依赖Service,处理请求/响应UI用户界面层依赖Runtime,不包含业务逻辑6.1.2依赖规则示例#Types层-允许fromdataclassesimportdataclassfromtypingimportList,Optional@dataclassclassUser:id:intname:stremail:str#Config层-允许fromtypingimportOptionalfrom.typesimportUser#依赖Types✓@dataclassclassDatabaseConfig:host:strport:intuser:Optional[User]=None#使用Types✓#Repo层-允许from.typesimportUserfrom.configimportDatabaseConfigclassUserRepo:defget_user(self,user_id:int)->Optional[User]:#数据访问逻辑pass#Service层-允许from.repoimportUserRepofrom.typesimportUserclassUserService:def__init__(self):self.repo=UserRepo()defget_user_with_orders(self,user_id:int)->Optional[User]:#业务逻辑,不直接操作数据库returnself.repo.get_user(user_id)#Service层-禁止(违反:直接操作数据库)classBadUserService:defget_user(self,user_id:int):#不要这样做!直接在Service层操作数据库conn.execute(f"SELECT*FROMusersWHEREid={user_id}")#✗#Runtime层-允许from.serviceimportUserServicefrom.typesimportUser@app.get("/users/{user_id}")defget_user(user_id:int)->User:service=UserService()returnservice.get_user_with_orders(user_id)6.1.3自定义Linter规则#!/usr/bin/envpython3#architecture_linter.py-自定义架构约束LinterimportastimportsysfromtypingimportList,Tuple,SetclassArchitectureLinter:"""架构约束Linter检查规则:1.Service层不能直接导入数据库驱动2.Repo层不能包含业务逻辑3.UI层不能包含业务逻辑4.禁止跨层依赖(上跳一层)"""LAYER_KEYWORDS={'types':['_types.py','types.py'],'config':['_config.py','config.py'],'repo':['_repo.py','repo.py','_repository.py','repository.py'],'service':['_service.py','service.py'],'runtime':['_runtime.py','runtime.py','_handler.py','handler.py'],'ui':['_ui.py','ui.py','_view.py','view.py','_router.py','router.py'],}PROHIBITED_IMPORTS={'service':['psycopg2','pymongo','mysql.connector','redis','sqlalchemy'],'ui':['psycopg2','pymongo','mysql.connector','business_logic'],}def__init__(self,filepath:str):self.filepath=filepathself.layer=self._detect_layer()self.violations:List[Tuple[int,str]]=[]def_detect_layer(self)->str:"""检测文件所属层级"""filename=self.filepath.split('/')[-1].lower()forlayer,patternsinself.LAYER_KEYWORDS.items():forpatterninpatterns:ifpatterninfilename:returnlayerreturn'unknown'deflint(self)->bool:"""执行Lint检查"""ifself.layer=='unknown':returnTrue#跳过未知层级try:withopen(self.filepath,'r',encoding='utf-8')asf:tree=ast.parse(f.read(),filename=self.filepath)self._check_imports(tree)self._check_dependency_order(tree)returnlen(self.violations)==0exceptSyntaxErrorase:print(f"语法错误:{e}")returnFalsedef_check_imports(self,tree:ast.AST):"""检查禁止的导入"""ifself.layernotinself.PROHIBITED_IMPORTS:returnprohibited=self.PROHIBITED_IMPORTS[self.layer]fornodeinast.walk(tree):ifisinstance(node,ast.Import):foraliasins:forprobinprohibited:ifprobin:self.violations.append((node.lineno,f"禁止导入:{}(在{self.layer}层)"))elifisinstance(node,ast.ImportFrom):ifnode.module:forprobinprohibited:ifprobinnode.module:self.violations.append((node.lineno,f"禁止导入:from{node.module}(在{self.layer}层)"))def_check_dependency_order(self,tree:ast.AST):"""检查依赖顺序是否正确"""layer_order=['types','config','repo','service','runtime','ui']ifself.layernotinlayer_order:returncurrent_index=layer_order.index(self.layer)fornodeinast.walk(tree):ifisinstance(node,ast.ImportFrom)andnode.module:#解析导入的模块路径module_parts=node.module.split('.')imported_layer=module_parts[0]#检查是否导入了上层(禁止反向依赖)ifimported_layerinlayer_order:imported_index=layer_order.index(imported_layer)ifimported_index>current_index:self.violations.append((node.lineno,f"禁止跨层依赖:{self.layer}层不能导入{imported_layer}层"))defreport(self):"""生成违规报告"""ifnotself.violations:print(f"✓{self.filepath}-无违规")returnprint(f"✗{self.filepath}-发现{len(self.violations)}个违规:")forlineno,messageinself.violations:print(f"行{lineno}:{message}")if__name__=='__main__':iflen(sys.argv)<2:print("用法:pythonarchitecture_linter.py<文件路径>")sys.exit(1)linter=ArchitectureLinter(sys.argv[1])success=linter.lint()linter.report()sys.exit(0ifsuccesselse1)6.2CI集成6.2.1Pre-commitHook脚本#!/bin/bash#pre-commit-architecture.sh-Gitpre-commithookforarchitecturechecksecho"===运行架构约束检查==="#获取暂存的文件STAGED_FILES=$(gitdiff--cached--name-only--diff-filter=ACM)VIOLATIONS=0forfilein$STAGED_FILES;do#只检查Python文件if[["$file"==*.py]];thenecho"检查:$file"#运行架构Linterif!python3./architecture_linter.py"$file";thenVIOLATIONS=$((VIOLATIONS+1))fifidoneif["$VIOLATIONS"-gt0];thenecho""echo"错误:发现$VIOLATIONS个架构违规"echo"请修复后再提交"exit1fiecho"✓所有架构检查通过"exit06.2.2CIPipeline配置#.gitlab-ci.yml或.github/workflows/architecture.ymlarchitecture_check:stage:lintimage:python:3.11-slimscript:-pipinstallastroidpylint-find.-name"*.py"-not-path"./venv/*"-not-path"./__pycache__/*"|whilereadfile;dopython3architecture_linter.py"$file"||exit1donerules:-if:'$CI_PIPELINE_SOURCE=="merge_request_event"'-if:'$CI_COMMIT_BRANCH=="main"'七、护栏三:反馈循环7.1反馈循环机制反馈循环是确保Agent知道自己做错了什么的关键机制。没有反馈循环,Agent会不断重复错误。┌─────────────────┐│Agent执行│└────────┬────────┘│▼┌─────────────────┐│结果验证│└────────┬────────┘│┌────┴────┐│通过?│└────┬────┘│┌────┴────┐││YesNo││▼▼┌───────┐┌─────────────────┐│结束││带错误信息重试│└───────┘└─────────────────┘7.2Agent-to-AgentReview7.2.1ReviewAgent实现#!/usr/bin/envpython3#review_agent.py-Agent审查Agent的实现importosimportrefromtypingimportDict,List,TupleclassReviewAgent:"""审查Agent生成的代码检查维度:1.功能完整性2.代码质量3.安全漏洞4.性能问题5.测试覆盖"""def__init__(self,code:str,language:str="python"):self.code=codeself.language=languageself.issues:List[Dict]=[]defreview(self)->Dict:"""执行全面审查"""self._check_functionality()self._check_code_quality()self._check_security()self._check_performance()self._check_test_coverage()return{'passed':len(self.issues)==0,'issues':self.issues,'summary':self._generate_summary()}def_check_functionality(self):"""检查功能完整性"""#检查是否有TODO/FIXME(未完成功能)todos=re.findall(r'(TODO|FIXME|HACK|XXX):(.+)',self.code)iftodos:self.issues.append({'severity':'warning','type':'incomplete','message':f'发现{len(todos)}个未完成标记','details':todos})#检查是否处理了异常if'try:'inself.codeand'except'notinself.code:self.issues.append({'severity':'error','type':'exception_handling','message':'存在try语句但未找到对应的except'})def_check_code_quality(self):"""检查代码质量"""lines=self.code.split('\n')#检查行长度fori,lineinenumerate(lines,1):iflen(line)>120:self.issues.append({'severity':'warning','type':'line_length','line':i,'message':f'行长度超过120字符:{len(line)}'})#检查命名规范ifself.language=='python':#检查类名class_names=re.findall(r'class(\w+):',self.code)fornameinclass_names:ifnotname[0].isupper():self.issues.append({'severity':'warning','type':'naming','message':f'类名应使用PascalCase:{name}'})#检查函数名func_names=re.findall(r'def(\w+)\(',self.code)fornameinfunc_names:ifnotname.islower()andname!='__init__':self.issues.append({'severity':'warning','type':'naming','message':f'函数名应使用snake_case:{name}'})def_check_security(self):"""检查安全漏洞"""security_issu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年劳动用工全流程风险防控与争议解决
- 极端高温下医疗废物微生物风险防控
- 极端气候下传染病监测公众沟通策略
- 极端天气下血液应急储备量测算方法
- 初中2025年教师职业体验主题班会说课稿
- 幼儿抗挫能力2025说课稿
- 一、当心异物侵害说课稿2025年小学综合实践活动三年级下册沪科黔科版
- 医学26年:糖原累积病肌病表现 查房课件
- 班级管理员说课稿2025年小学综合实践活动一年级下册浙科技版
- 心中的江河(欣赏 黄河源头)说课稿2025学年小学音乐西师大版六年级下册-西师大版
- 2024年4月贵州省高三年级适应性考试物理试卷(含答案)
- 同类型餐厅对比分析报告
- 产业经济学:原理及案例(第六版) 课件 第11、12章 产业结构政策、产业组织政策
- 标准化推动企业质量管理与创新发展
- 《高速铁路客运服务礼仪》课程标准
- 西安三星项目施工汇报20131121
- 客厅空间手绘步骤与技巧
- JJF 1914-2021金相显微镜校准规范
- GB/T 8923.1-2011涂覆涂料前钢材表面处理表面清洁度的目视评定第1部分:未涂覆过的钢材表面和全面清除原有涂层后的钢材表面的锈蚀等级和处理等级
- GB/T 33564.1-2017识别卡卡使用寿命第1部分:应用轮廓和要求
- 《学会合理消费》课件
评论
0/150
提交评论