[{"data":1,"prerenderedAt":4487},["ShallowReactive",2],{"article-/topics/ai/ai-agent-model-routing-fallback-strategy":3,"related-ai":961,"content-query-Gic0a0VpiC":3727},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":12,"image":17,"imageQuery":18,"pexelsPhotoId":19,"pexelsUrl":20,"featured":6,"readingTime":21,"body":22,"_type":955,"_id":956,"_source":957,"_file":958,"_stem":959,"_extension":960},"/topics/ai/ai-agent-model-routing-fallback-strategy","ai",false,"","AI agent 模型路由与回退链设计：任务复杂度、成本和风险如何决定该用哪个模型","不是每个 AI agent 请求都该打到同一个模型。本文讲清模型路由维度、回退链、风险闸门、灰度切换与观测指标，避免质量和成本一起失控。","2026-05-10","HTMLPAGE 团队",[13,14,15,16],"AI agent","模型路由","fallback","工程实践","/images/articles/ai-agent-model-routing-fallback-strategy-featured.jpg","software architecture routing diagram laptop",9577253,"https://www.pexels.com/photo/silver-macbook-air-laptop-on-brown-wooden-table-9577253/",20,{"type":23,"children":24,"toc":941},"root",[25,33,38,75,82,187,192,198,203,228,233,239,244,257,262,268,273,394,399,404,413,418,424,429,453,458,476,481,491,496,502,507,537,542,547,646,651,657,662,760,765,771,776,794,799,805,895,900,905,910],{"type":26,"tag":27,"props":28,"children":29},"element","p",{},[30],{"type":31,"value":32},"text","很多团队做 AI agent 时，第一版都会先把模型写死。这样做在 Demo 阶段很正常，但一旦进入真实业务，就会立刻遇到三个问题：简单任务用大模型太贵，复杂任务用小模型又不稳，高风险动作还不能只看“平均效果”。",{"type":26,"tag":27,"props":34,"children":35},{},[36],{"type":31,"value":37},"模型路由真正要解决的，不是“怎么省几分钱”，而是让系统根据任务复杂度、时延预算、风险等级和历史质量，选到最合适的那条执行链。否则系统只会在两个极端摇摆：要么全量用最贵模型，要么为了省成本把低质量结果推给用户和人工复核。",{"type":26,"tag":27,"props":39,"children":40},{},[41,43,50,52,58,59,65,67,73],{"type":31,"value":42},"建议先结合 ",{"type":26,"tag":44,"props":45,"children":47},"a",{"href":46},"/topics/ai/ai-agent-cost-control-budgeting",[48],{"type":31,"value":49},"AI agent 成本控制与预算治理",{"type":31,"value":51},"、",{"type":26,"tag":44,"props":53,"children":55},{"href":54},"/topics/ai/ai-agent-feature-flag-release-strategy",[56],{"type":31,"value":57},"AI agent 灰度发布与功能开关",{"type":31,"value":51},{"type":26,"tag":44,"props":60,"children":62},{"href":61},"/topics/ai/ai-agent-product-metrics-success-dashboard",[63],{"type":31,"value":64},"AI agent 产品成功指标",{"type":31,"value":66}," 和 ",{"type":26,"tag":44,"props":68,"children":70},{"href":69},"/topics/ai/ai-agent-shadow-mode-rollout-guide",[71],{"type":31,"value":72},"AI agent Shadow Mode 上线方法",{"type":31,"value":74}," 一起看。",{"type":26,"tag":76,"props":77,"children":79},"h2",{"id":78},"先给结论模型路由先看-4-个维度再决定谁主谁备",[80],{"type":31,"value":81},"先给结论：模型路由先看 4 个维度，再决定谁主谁备",{"type":26,"tag":83,"props":84,"children":85},"table",{},[86,110],{"type":26,"tag":87,"props":88,"children":89},"thead",{},[90],{"type":26,"tag":91,"props":92,"children":93},"tr",{},[94,100,105],{"type":26,"tag":95,"props":96,"children":97},"th",{},[98],{"type":31,"value":99},"维度",{"type":26,"tag":95,"props":101,"children":102},{},[103],{"type":31,"value":104},"要回答什么",{"type":26,"tag":95,"props":106,"children":107},{},[108],{"type":31,"value":109},"常见路由动作",{"type":26,"tag":111,"props":112,"children":113},"tbody",{},[114,133,151,169],{"type":26,"tag":91,"props":115,"children":116},{},[117,123,128],{"type":26,"tag":118,"props":119,"children":120},"td",{},[121],{"type":31,"value":122},"任务复杂度",{"type":26,"tag":118,"props":124,"children":125},{},[126],{"type":31,"value":127},"这是检索摘要，还是多步规划",{"type":26,"tag":118,"props":129,"children":130},{},[131],{"type":31,"value":132},"简单走快模型，复杂走强模型",{"type":26,"tag":91,"props":134,"children":135},{},[136,141,146],{"type":26,"tag":118,"props":137,"children":138},{},[139],{"type":31,"value":140},"风险等级",{"type":26,"tag":118,"props":142,"children":143},{},[144],{"type":31,"value":145},"结果是否会触发写入、外发、审批",{"type":26,"tag":118,"props":147,"children":148},{},[149],{"type":31,"value":150},"高风险优先稳模型或升级人工",{"type":26,"tag":91,"props":152,"children":153},{},[154,159,164],{"type":26,"tag":118,"props":155,"children":156},{},[157],{"type":31,"value":158},"时延预算",{"type":26,"tag":118,"props":160,"children":161},{},[162],{"type":31,"value":163},"这个请求能等多久",{"type":26,"tag":118,"props":165,"children":166},{},[167],{"type":31,"value":168},"超时敏感场景优先快模型",{"type":26,"tag":91,"props":170,"children":171},{},[172,177,182],{"type":26,"tag":118,"props":173,"children":174},{},[175],{"type":31,"value":176},"成本预算",{"type":26,"tag":118,"props":178,"children":179},{},[180],{"type":31,"value":181},"这个租户或任务允许花多少",{"type":26,"tag":118,"props":183,"children":184},{},[185],{"type":31,"value":186},"超预算切换低成本链路",{"type":26,"tag":27,"props":188,"children":189},{},[190],{"type":31,"value":191},"如果没有这张表，系统里的“模型选择”大概率只是硬编码习惯，而不是治理结果。",{"type":26,"tag":76,"props":193,"children":195},{"id":194},"一不要把模型路由理解成便宜模型优先",[196],{"type":31,"value":197},"一、不要把模型路由理解成“便宜模型优先”",{"type":26,"tag":27,"props":199,"children":200},{},[201],{"type":31,"value":202},"最常见的误区是：模型路由就是尽量先打小模型，失败了再上大模型。这个策略只有在任务差异很小的时候才成立。真实场景里，更常见的是：",{"type":26,"tag":204,"props":205,"children":206},"ul",{},[207,213,218,223],{"type":26,"tag":208,"props":209,"children":210},"li",{},[211],{"type":31,"value":212},"信息抽取适合小模型",{"type":26,"tag":208,"props":214,"children":215},{},[216],{"type":31,"value":217},"多步规划适合强模型",{"type":26,"tag":208,"props":219,"children":220},{},[221],{"type":31,"value":222},"高风险判断需要更稳定的 reasoning 路径",{"type":26,"tag":208,"props":224,"children":225},{},[226],{"type":31,"value":227},"纯格式化或改写未必要动最强模型",{"type":26,"tag":27,"props":229,"children":230},{},[231],{"type":31,"value":232},"也就是说，路由不是单纯的成本排序，而是“任务类型与模型能力边界匹配”。",{"type":26,"tag":76,"props":234,"children":236},{"id":235},"二模型路由请求最好先被结构化不要让模型自己决定该找谁",[237],{"type":31,"value":238},"二、模型路由请求最好先被结构化，不要让模型自己决定该找谁",{"type":26,"tag":27,"props":240,"children":241},{},[242],{"type":31,"value":243},"更稳的做法，是先把请求转成一份 route envelope：",{"type":26,"tag":245,"props":246,"children":251},"pre",{"className":247,"code":249,"language":250,"meta":7},[248],"language-json","{\n  \"runId\": \"run_123\",\n  \"taskType\": \"draft_review\",\n  \"riskLevel\": \"high\",\n  \"latencyBudgetMs\": 12000,\n  \"costTier\": \"standard\",\n  \"requires\": [\"structured_output\", \"tool_use\"],\n  \"fallbackPolicy\": \"degrade_then_review\"\n}\n","json",[252],{"type":26,"tag":253,"props":254,"children":255},"code",{"__ignoreMap":7},[256],{"type":31,"value":249},{"type":26,"tag":27,"props":258,"children":259},{},[260],{"type":31,"value":261},"这里最关键的是：模型选择发生在执行层，而不是 prompt 里。Prompt 可以描述输出要求，但不应该自己决定“我今天想用哪个模型”。",{"type":26,"tag":76,"props":263,"children":265},{"id":264},"三路由表最好显式维护不要散在代码分支里",[266],{"type":31,"value":267},"三、路由表最好显式维护，不要散在代码分支里",{"type":26,"tag":27,"props":269,"children":270},{},[271],{"type":31,"value":272},"一个最小可执行的路由矩阵通常长这样：",{"type":26,"tag":83,"props":274,"children":275},{},[276,302],{"type":26,"tag":87,"props":277,"children":278},{},[279],{"type":26,"tag":91,"props":280,"children":281},{},[282,287,292,297],{"type":26,"tag":95,"props":283,"children":284},{},[285],{"type":31,"value":286},"场景",{"type":26,"tag":95,"props":288,"children":289},{},[290],{"type":31,"value":291},"主模型",{"type":26,"tag":95,"props":293,"children":294},{},[295],{"type":31,"value":296},"备模型",{"type":26,"tag":95,"props":298,"children":299},{},[300],{"type":31,"value":301},"失败后动作",{"type":26,"tag":111,"props":303,"children":304},{},[305,328,350,372],{"type":26,"tag":91,"props":306,"children":307},{},[308,313,318,323],{"type":26,"tag":118,"props":309,"children":310},{},[311],{"type":31,"value":312},"检索摘要",{"type":26,"tag":118,"props":314,"children":315},{},[316],{"type":31,"value":317},"small-fast",{"type":26,"tag":118,"props":319,"children":320},{},[321],{"type":31,"value":322},"medium-general",{"type":26,"tag":118,"props":324,"children":325},{},[326],{"type":31,"value":327},"降级为摘要模板",{"type":26,"tag":91,"props":329,"children":330},{},[331,336,341,345],{"type":26,"tag":118,"props":332,"children":333},{},[334],{"type":31,"value":335},"多步规划",{"type":26,"tag":118,"props":337,"children":338},{},[339],{"type":31,"value":340},"reasoning-pro",{"type":26,"tag":118,"props":342,"children":343},{},[344],{"type":31,"value":322},{"type":26,"tag":118,"props":346,"children":347},{},[348],{"type":31,"value":349},"转人工 review",{"type":26,"tag":91,"props":351,"children":352},{},[353,358,362,367],{"type":26,"tag":118,"props":354,"children":355},{},[356],{"type":31,"value":357},"高风险外发文案",{"type":26,"tag":118,"props":359,"children":360},{},[361],{"type":31,"value":340},{"type":26,"tag":118,"props":363,"children":364},{},[365],{"type":31,"value":366},"reasoning-lite",{"type":26,"tag":118,"props":368,"children":369},{},[370],{"type":31,"value":371},"保守阻断",{"type":26,"tag":91,"props":373,"children":374},{},[375,380,385,389],{"type":26,"tag":118,"props":376,"children":377},{},[378],{"type":31,"value":379},"结构化提取",{"type":26,"tag":118,"props":381,"children":382},{},[383],{"type":31,"value":384},"small-structured",{"type":26,"tag":118,"props":386,"children":387},{},[388],{"type":31,"value":322},{"type":26,"tag":118,"props":390,"children":391},{},[392],{"type":31,"value":393},"重试 1 次后 ask_user",{"type":26,"tag":27,"props":395,"children":396},{},[397],{"type":31,"value":398},"路由表的价值不只是配置方便，而是故障复盘时你能回答：为什么这个请求走了这条链，而不是另一条。",{"type":26,"tag":27,"props":400,"children":401},{},[402],{"type":31,"value":403},"进一步说，路由结果本身也值得落成一份可审计的 decision record，而不是只在内存里返回一个模型名：",{"type":26,"tag":245,"props":405,"children":408},{"className":406,"code":407,"language":250,"meta":7},[248],"{\n  \"runId\": \"run_123\",\n  \"routeVersion\": \"router_v7\",\n  \"taskClass\": \"high_risk_review\",\n  \"chosenModel\": \"reasoning-pro\",\n  \"fallbackChain\": [\"reasoning-lite\", \"human_review\"],\n  \"decisionReasons\": [\"risk_high\", \"structured_output_required\"],\n  \"budgetGuard\": {\n    \"latencyBudgetMs\": 12000,\n    \"costTier\": \"standard\"\n  }\n}\n",[409],{"type":26,"tag":253,"props":410,"children":411},{"__ignoreMap":7},[412],{"type":31,"value":407},{"type":26,"tag":27,"props":414,"children":415},{},[416],{"type":31,"value":417},"这类记录的价值在于，后面无论是复盘质量事故、解释成本波动，还是比较不同路由版本，你都不需要靠猜测还原“当时系统为什么这么选”。",{"type":26,"tag":76,"props":419,"children":421},{"id":420},"四回退链不是失败了就换模型而是要带停止条件",[422],{"type":31,"value":423},"四、回退链不是“失败了就换模型”，而是要带停止条件",{"type":26,"tag":27,"props":425,"children":426},{},[427],{"type":31,"value":428},"很多系统的问题不在没有 fallback，而在 fallback 没有 stop condition：",{"type":26,"tag":430,"props":431,"children":432},"ol",{},[433,438,443,448],{"type":26,"tag":208,"props":434,"children":435},{},[436],{"type":31,"value":437},"主模型失败",{"type":26,"tag":208,"props":439,"children":440},{},[441],{"type":31,"value":442},"换备模型",{"type":26,"tag":208,"props":444,"children":445},{},[446],{"type":31,"value":447},"备模型结构不稳",{"type":26,"tag":208,"props":449,"children":450},{},[451],{"type":31,"value":452},"再换主模型或再试一次",{"type":26,"tag":27,"props":454,"children":455},{},[456],{"type":31,"value":457},"最后系统既花了钱，也没有得到更稳结果。一个更健康的回退链应该明确：",{"type":26,"tag":204,"props":459,"children":460},{},[461,466,471],{"type":26,"tag":208,"props":462,"children":463},{},[464],{"type":31,"value":465},"哪类失败允许 fallback",{"type":26,"tag":208,"props":467,"children":468},{},[469],{"type":31,"value":470},"fallback 最多走几层",{"type":26,"tag":208,"props":472,"children":473},{},[474],{"type":31,"value":475},"什么情况下直接停止或转人工",{"type":26,"tag":27,"props":477,"children":478},{},[479],{"type":31,"value":480},"例如：",{"type":26,"tag":245,"props":482,"children":486},{"className":483,"code":485,"language":31,"meta":7},[484],"language-text","primary_model_failed(timeout)\n  -> fallback_model\n  -> if still schema_invalid then human_review\n",[487],{"type":26,"tag":253,"props":488,"children":489},{"__ignoreMap":7},[490],{"type":31,"value":485},{"type":26,"tag":27,"props":492,"children":493},{},[494],{"type":31,"value":495},"这比“只要失败就继续换”稳定得多。",{"type":26,"tag":76,"props":497,"children":499},{"id":498},"五高风险任务不要只靠模型能力路由还要叠加风险闸门",[500],{"type":31,"value":501},"五、高风险任务不要只靠模型能力路由，还要叠加风险闸门",{"type":26,"tag":27,"props":503,"children":504},{},[505],{"type":31,"value":506},"假设一个 agent 要发送对外邮件。即便模型路由已经把它分到“最强模型”，也不代表它就该自动继续。真正稳的做法是：",{"type":26,"tag":204,"props":508,"children":509},{},[510,515,526],{"type":26,"tag":208,"props":511,"children":512},{},[513],{"type":31,"value":514},"先按任务类型和风险等级路由模型",{"type":26,"tag":208,"props":516,"children":517},{},[518,520],{"type":31,"value":519},"再经过 ",{"type":26,"tag":44,"props":521,"children":523},{"href":522},"/topics/ai/ai-agent-policy-engine-rule-layering",[524],{"type":31,"value":525},"AI agent Policy Engine 规则分层",{"type":26,"tag":208,"props":527,"children":528},{},[529,531],{"type":31,"value":530},"最后视结果决定自动继续、降级还是进入 ",{"type":26,"tag":44,"props":532,"children":534},{"href":533},"/topics/ai/ai-agent-human-review-console-design",[535],{"type":31,"value":536},"AI agent 人工审批控制台设计",{"type":26,"tag":27,"props":538,"children":539},{},[540],{"type":31,"value":541},"模型路由解决的是“谁来做”，不是“可不可以做”。",{"type":26,"tag":27,"props":543,"children":544},{},[545],{"type":31,"value":546},"此外，路由切换本身最好也有明确的转正和退出门槛。很多团队的问题不是没有路由，而是新路由一上线就全量接管，等到人工返工率上升才发现切换过快。更稳的做法通常是先在 shadow 或 canary 流量里盯住这些门槛：",{"type":26,"tag":83,"props":548,"children":549},{},[550,571],{"type":26,"tag":87,"props":551,"children":552},{},[553],{"type":26,"tag":91,"props":554,"children":555},{},[556,561,566],{"type":26,"tag":95,"props":557,"children":558},{},[559],{"type":31,"value":560},"门槛",{"type":26,"tag":95,"props":562,"children":563},{},[564],{"type":31,"value":565},"继续放量",{"type":26,"tag":95,"props":567,"children":568},{},[569],{"type":31,"value":570},"立即回退",{"type":26,"tag":111,"props":572,"children":573},{},[574,592,610,628],{"type":26,"tag":91,"props":575,"children":576},{},[577,582,587],{"type":26,"tag":118,"props":578,"children":579},{},[580],{"type":31,"value":581},"fallback success rate",{"type":26,"tag":118,"props":583,"children":584},{},[585],{"type":31,"value":586},"稳定高于旧链路",{"type":26,"tag":118,"props":588,"children":589},{},[590],{"type":31,"value":591},"明显低于旧链路",{"type":26,"tag":91,"props":593,"children":594},{},[595,600,605],{"type":26,"tag":118,"props":596,"children":597},{},[598],{"type":31,"value":599},"accepted run quality",{"type":26,"tag":118,"props":601,"children":602},{},[603],{"type":31,"value":604},"不低于基线",{"type":26,"tag":118,"props":606,"children":607},{},[608],{"type":31,"value":609},"连续下降",{"type":26,"tag":91,"props":611,"children":612},{},[613,618,623],{"type":26,"tag":118,"props":614,"children":615},{},[616],{"type":31,"value":617},"cost per accepted run",{"type":26,"tag":118,"props":619,"children":620},{},[621],{"type":31,"value":622},"下降或持平",{"type":26,"tag":118,"props":624,"children":625},{},[626],{"type":31,"value":627},"明显升高",{"type":26,"tag":91,"props":629,"children":630},{},[631,636,641],{"type":26,"tag":118,"props":632,"children":633},{},[634],{"type":31,"value":635},"human escalation rate",{"type":26,"tag":118,"props":637,"children":638},{},[639],{"type":31,"value":640},"不异常上涨",{"type":26,"tag":118,"props":642,"children":643},{},[644],{"type":31,"value":645},"快速上涨",{"type":26,"tag":27,"props":647,"children":648},{},[649],{"type":31,"value":650},"路由不是配好一次就结束，而是要像发布策略一样有观察窗口和退出条件。",{"type":26,"tag":76,"props":652,"children":654},{"id":653},"六上线后要盯路由质量指标而不是只看单模型成功率",[655],{"type":31,"value":656},"六、上线后要盯路由质量指标，而不是只看单模型成功率",{"type":26,"tag":27,"props":658,"children":659},{},[660],{"type":31,"value":661},"建议持续观察这些指标：",{"type":26,"tag":83,"props":663,"children":664},{},[665,681],{"type":26,"tag":87,"props":666,"children":667},{},[668],{"type":26,"tag":91,"props":669,"children":670},{},[671,676],{"type":26,"tag":95,"props":672,"children":673},{},[674],{"type":31,"value":675},"指标",{"type":26,"tag":95,"props":677,"children":678},{},[679],{"type":31,"value":680},"用途",{"type":26,"tag":111,"props":682,"children":683},{},[684,697,710,722,735,748],{"type":26,"tag":91,"props":685,"children":686},{},[687,692],{"type":26,"tag":118,"props":688,"children":689},{},[690],{"type":31,"value":691},"route hit ratio",{"type":26,"tag":118,"props":693,"children":694},{},[695],{"type":31,"value":696},"看不同任务是否真的走了预期链路",{"type":26,"tag":91,"props":698,"children":699},{},[700,705],{"type":26,"tag":118,"props":701,"children":702},{},[703],{"type":31,"value":704},"fallback rate",{"type":26,"tag":118,"props":706,"children":707},{},[708],{"type":31,"value":709},"看主模型是否频繁失效",{"type":26,"tag":91,"props":711,"children":712},{},[713,717],{"type":26,"tag":118,"props":714,"children":715},{},[716],{"type":31,"value":581},{"type":26,"tag":118,"props":718,"children":719},{},[720],{"type":31,"value":721},"看回退链是否真的有效",{"type":26,"tag":91,"props":723,"children":724},{},[725,730],{"type":26,"tag":118,"props":726,"children":727},{},[728],{"type":31,"value":729},"route override ratio",{"type":26,"tag":118,"props":731,"children":732},{},[733],{"type":31,"value":734},"看人工或策略是否频繁推翻默认路由",{"type":26,"tag":91,"props":736,"children":737},{},[738,743],{"type":26,"tag":118,"props":739,"children":740},{},[741],{"type":31,"value":742},"high-risk auto-pass rate",{"type":26,"tag":118,"props":744,"children":745},{},[746],{"type":31,"value":747},"看高风险流量是否过度自动化",{"type":26,"tag":91,"props":749,"children":750},{},[751,755],{"type":26,"tag":118,"props":752,"children":753},{},[754],{"type":31,"value":617},{"type":26,"tag":118,"props":756,"children":757},{},[758],{"type":31,"value":759},"看路由是否带来真实成本收益",{"type":26,"tag":27,"props":761,"children":762},{},[763],{"type":31,"value":764},"如果 fallback rate 很高但 accepted run 没提升，说明你不是在做路由，而是在做昂贵的试错。",{"type":26,"tag":76,"props":766,"children":768},{"id":767},"七失败案例为了省钱把所有请求先打小模型结果人工返工更贵",[769],{"type":31,"value":770},"七、失败案例：为了省钱把所有请求先打小模型，结果人工返工更贵",{"type":26,"tag":27,"props":772,"children":773},{},[774],{"type":31,"value":775},"某个内容 agent 把所有任务都先路由到低成本模型，只有完全失败才切到强模型。上线一周后，账面 token 成本下降了，但编辑团队的返工时间暴涨。复盘发现：",{"type":26,"tag":204,"props":777,"children":778},{},[779,784,789],{"type":26,"tag":208,"props":780,"children":781},{},[782],{"type":31,"value":783},"简单任务确实省钱",{"type":26,"tag":208,"props":785,"children":786},{},[787],{"type":31,"value":788},"复杂任务虽然“没有失败”，但输出质量不够，全部落到人工重写",{"type":26,"tag":208,"props":790,"children":791},{},[792],{"type":31,"value":793},"系统只统计 API 成本，没有统计返工成本",{"type":26,"tag":27,"props":795,"children":796},{},[797],{"type":31,"value":798},"修复后，团队把路由改成“按任务复杂度分流”，并把 accepted run 的总成本写入看板，模型选择才真正和业务结果对齐。",{"type":26,"tag":76,"props":800,"children":802},{"id":801},"八模型路由-checklist",[803],{"type":31,"value":804},"八、模型路由 Checklist",{"type":26,"tag":204,"props":806,"children":809},{"className":807},[808],"contains-task-list",[810,823,832,841,850,859,868,877,886],{"type":26,"tag":208,"props":811,"children":814},{"className":812},[813],"task-list-item",[815,821],{"type":26,"tag":816,"props":817,"children":820},"input",{"disabled":818,"type":819},true,"checkbox",[],{"type":31,"value":822}," 是否先定义任务复杂度、风险、时延和成本四个路由维度",{"type":26,"tag":208,"props":824,"children":826},{"className":825},[813],[827,830],{"type":26,"tag":816,"props":828,"children":829},{"disabled":818,"type":819},[],{"type":31,"value":831}," 请求是否先被结构化成 route envelope",{"type":26,"tag":208,"props":833,"children":835},{"className":834},[813],[836,839],{"type":26,"tag":816,"props":837,"children":838},{"disabled":818,"type":819},[],{"type":31,"value":840}," 是否有显式路由矩阵，而不是散落在代码里的 if/else",{"type":26,"tag":208,"props":842,"children":844},{"className":843},[813],[845,848],{"type":26,"tag":816,"props":846,"children":847},{"disabled":818,"type":819},[],{"type":31,"value":849}," 是否记录 routeVersion、chosenModel 和 fallbackChain",{"type":26,"tag":208,"props":851,"children":853},{"className":852},[813],[854,857],{"type":26,"tag":816,"props":855,"children":856},{"disabled":818,"type":819},[],{"type":31,"value":858}," fallback 是否带最大层数和停止条件",{"type":26,"tag":208,"props":860,"children":862},{"className":861},[813],[863,866],{"type":26,"tag":816,"props":864,"children":865},{"disabled":818,"type":819},[],{"type":31,"value":867}," 高风险任务是否叠加 policy 与人工闸门",{"type":26,"tag":208,"props":869,"children":871},{"className":870},[813],[872,875],{"type":26,"tag":816,"props":873,"children":874},{"disabled":818,"type":819},[],{"type":31,"value":876}," 新路由放量前是否设定 accepted quality、cost 和 escalation 的退出门槛",{"type":26,"tag":208,"props":878,"children":880},{"className":879},[813],[881,884],{"type":26,"tag":816,"props":882,"children":883},{"disabled":818,"type":819},[],{"type":31,"value":885}," 是否持续监控 route hit、fallback success 和 accepted cost",{"type":26,"tag":208,"props":887,"children":889},{"className":888},[813],[890,893],{"type":26,"tag":816,"props":891,"children":892},{"disabled":818,"type":819},[],{"type":31,"value":894}," 是否把返工时间一起算进模型路由收益",{"type":26,"tag":76,"props":896,"children":898},{"id":897},"结语",[899],{"type":31,"value":897},{"type":26,"tag":27,"props":901,"children":902},{},[903],{"type":31,"value":904},"AI agent 的模型路由，不是“先便宜后昂贵”的简单开关，而是把任务复杂度、风险等级、时延预算和成本预算一起翻译成执行链。只有这样，系统才不会在节省 API 成本的同时，把更大的成本转嫁给人工返工和业务风险。",{"type":26,"tag":27,"props":906,"children":907},{},[908],{"type":31,"value":909},"延伸阅读：",{"type":26,"tag":204,"props":911,"children":912},{},[913,920,927,934],{"type":26,"tag":208,"props":914,"children":915},{},[916],{"type":26,"tag":44,"props":917,"children":918},{"href":46},[919],{"type":31,"value":49},{"type":26,"tag":208,"props":921,"children":922},{},[923],{"type":26,"tag":44,"props":924,"children":925},{"href":54},[926],{"type":31,"value":57},{"type":26,"tag":208,"props":928,"children":929},{},[930],{"type":26,"tag":44,"props":931,"children":932},{"href":69},[933],{"type":31,"value":72},{"type":26,"tag":208,"props":935,"children":936},{},[937],{"type":26,"tag":44,"props":938,"children":939},{"href":522},[940],{"type":31,"value":525},{"title":7,"searchDepth":942,"depth":942,"links":943},3,[944,946,947,948,949,950,951,952,953,954],{"id":78,"depth":945,"text":81},2,{"id":194,"depth":945,"text":197},{"id":235,"depth":945,"text":238},{"id":264,"depth":945,"text":267},{"id":420,"depth":945,"text":423},{"id":498,"depth":945,"text":501},{"id":653,"depth":945,"text":656},{"id":767,"depth":945,"text":770},{"id":801,"depth":945,"text":804},{"id":897,"depth":945,"text":897},"markdown","content:topics:ai:ai-agent-model-routing-fallback-strategy.md","content","topics/ai/ai-agent-model-routing-fallback-strategy.md","topics/ai/ai-agent-model-routing-fallback-strategy","md",[962,2116,3065],{"_path":963,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":964,"description":965,"date":966,"topic":5,"author":11,"tags":967,"image":973,"imageAlt":974,"pexelsPhotoId":975,"pexelsUrl":976,"readingTime":977,"body":978,"_type":955,"_id":2113,"_source":957,"_file":2114,"_stem":2115,"_extension":960},"/topics/ai/cursor-keyboard-shortcuts-cheatsheet","Cursor 快捷键速查表（macOS/Windows）：从“会用”到“能提效”的 10 个工作流","把 Cursor 常用快捷键按任务分组（查代码、改代码、多文件、对话、审查与回滚），给出可直接照抄的工作流与最小回归清单，避免“快捷键背了也没变快”。","2026-03-02",[968,969,970,971,972],"Cursor","快捷键","AI IDE","VS Code","开发效率","/images/topics/ai/cursor-keyboard-shortcuts-cheatsheet.jpg","彩色机械键盘与鼠标的工作台面",34563105,"https://www.pexels.com/photo/colorful-mechanical-keyboard-and-mouse-setup-34563105/",12,{"type":23,"children":979,"toc":2087},[980,985,1003,1008,1036,1041,1077,1081,1087,1092,1125,1130,1153,1156,1162,1167,1385,1394,1397,1403,1410,1429,1437,1458,1463,1469,1484,1515,1520,1533,1539,1558,1576,1584,1589,1595,1600,1621,1629,1635,1640,1663,1668,1674,1687,1693,1711,1729,1735,1746,1764,1770,1781,1787,1792,1835,1838,1844,1852,1905,1908,1914,1920,1925,1930,1953,1971,1976,2001,2004,2010,2016,2021,2027,2032,2038,2043,2046,2052],{"type":26,"tag":27,"props":981,"children":982},{},[983],{"type":31,"value":984},"如果你在搜“Cursor 快捷键”，你大概率不是想背一张表，而是想解决这类问题：",{"type":26,"tag":204,"props":986,"children":987},{},[988,993,998],{"type":26,"tag":208,"props":989,"children":990},{},[991],{"type":31,"value":992},"为什么我用了 AI，还是很慢？（对话来回太多、改动不可控）",{"type":26,"tag":208,"props":994,"children":995},{},[996],{"type":31,"value":997},"为什么它“看起来懂了”，却改错文件/改出回归？（上下文与范围没锁住）",{"type":26,"tag":208,"props":999,"children":1000},{},[1001],{"type":31,"value":1002},"多文件改动怎么做得安全？（验收、回滚、最小回归集）",{"type":26,"tag":27,"props":1004,"children":1005},{},[1006],{"type":31,"value":1007},"这篇文章给你两份东西：",{"type":26,"tag":430,"props":1009,"children":1010},{},[1011,1024],{"type":26,"tag":208,"props":1012,"children":1013},{},[1014,1016,1022],{"type":31,"value":1015},"一张",{"type":26,"tag":1017,"props":1018,"children":1019},"strong",{},[1020],{"type":31,"value":1021},"按任务分组",{"type":31,"value":1023},"的快捷键表（不是按功能堆在一起）",{"type":26,"tag":208,"props":1025,"children":1026},{},[1027,1029,1034],{"type":31,"value":1028},"一套“从需求到落地”的",{"type":26,"tag":1017,"props":1030,"children":1031},{},[1032],{"type":31,"value":1033},"最小闭环工作流",{"type":31,"value":1035},"（每一步都有快捷键）",{"type":26,"tag":27,"props":1037,"children":1038},{},[1039],{"type":31,"value":1040},"想看系统玩法：",{"type":26,"tag":204,"props":1042,"children":1043},{},[1044,1055,1066],{"type":26,"tag":208,"props":1045,"children":1046},{},[1047,1049],{"type":31,"value":1048},"入门教程看：",{"type":26,"tag":44,"props":1050,"children":1052},{"href":1051},"/topics/ai/cursor-tutorial",[1053],{"type":31,"value":1054},"Cursor 使用教程（2026）",{"type":26,"tag":208,"props":1056,"children":1057},{},[1058,1060],{"type":31,"value":1059},"进阶玩法看：",{"type":26,"tag":44,"props":1061,"children":1063},{"href":1062},"/topics/ai/cursor-editor-guide",[1064],{"type":31,"value":1065},"Cursor 编辑器深度玩法",{"type":26,"tag":208,"props":1067,"children":1068},{},[1069,1071],{"type":31,"value":1070},"规则与忽略看：",{"type":26,"tag":44,"props":1072,"children":1074},{"href":1073},"/topics/ai/cursor-rules-cursorrules",[1075],{"type":31,"value":1076},"Cursor Rules 与 .cursorrules",{"type":26,"tag":1078,"props":1079,"children":1080},"hr",{},[],{"type":26,"tag":76,"props":1082,"children":1084},{"id":1083},"先给结论提效不是按得快而是闭环更短",[1085],{"type":31,"value":1086},"先给结论：提效不是“按得快”，而是“闭环更短”",{"type":26,"tag":27,"props":1088,"children":1089},{},[1090],{"type":31,"value":1091},"你可以把 Cursor 的快捷键理解为 3 条流水线：",{"type":26,"tag":204,"props":1093,"children":1094},{},[1095,1105,1115],{"type":26,"tag":208,"props":1096,"children":1097},{},[1098,1103],{"type":26,"tag":1017,"props":1099,"children":1100},{},[1101],{"type":31,"value":1102},"改一小段",{"type":31,"value":1104},"（内联编辑）：把改动限制在一个函数/一段样式",{"type":26,"tag":208,"props":1106,"children":1107},{},[1108,1113],{"type":26,"tag":1017,"props":1109,"children":1110},{},[1111],{"type":31,"value":1112},"改一组文件",{"type":31,"value":1114},"（Composer）：把改动限制在一组明确文件，并要求输出 diff + 验收点",{"type":26,"tag":208,"props":1116,"children":1117},{},[1118,1123],{"type":26,"tag":1017,"props":1119,"children":1120},{},[1121],{"type":31,"value":1122},"聊清楚再动手",{"type":31,"value":1124},"（侧边对话）：先对齐目标、范围、验收、回滚",{"type":26,"tag":27,"props":1126,"children":1127},{},[1128],{"type":31,"value":1129},"当你觉得“它乱改/改太大”时，往往不是快捷键没记住，而是缺了两件事：",{"type":26,"tag":204,"props":1131,"children":1132},{},[1133,1143],{"type":26,"tag":208,"props":1134,"children":1135},{},[1136,1138],{"type":31,"value":1137},"没有在动手前锁定",{"type":26,"tag":1017,"props":1139,"children":1140},{},[1141],{"type":31,"value":1142},"范围",{"type":26,"tag":208,"props":1144,"children":1145},{},[1146,1148],{"type":31,"value":1147},"没有在接受改动前准备",{"type":26,"tag":1017,"props":1149,"children":1150},{},[1151],{"type":31,"value":1152},"验收/回滚",{"type":26,"tag":1078,"props":1154,"children":1155},{},[],{"type":26,"tag":76,"props":1157,"children":1159},{"id":1158},"快捷键速查表按任务分组",[1160],{"type":31,"value":1161},"快捷键速查表（按任务分组）",{"type":26,"tag":27,"props":1163,"children":1164},{},[1165],{"type":31,"value":1166},"说明：下表按“你正在做什么”组织，而不是按“功能名字”组织。不同版本快捷键可能略有差异，但核心逻辑一致。",{"type":26,"tag":83,"props":1168,"children":1169},{},[1170,1196],{"type":26,"tag":87,"props":1171,"children":1172},{},[1173],{"type":26,"tag":91,"props":1174,"children":1175},{},[1176,1181,1186,1191],{"type":26,"tag":95,"props":1177,"children":1178},{},[1179],{"type":31,"value":1180},"任务",{"type":26,"tag":95,"props":1182,"children":1183},{},[1184],{"type":31,"value":1185},"macOS",{"type":26,"tag":95,"props":1187,"children":1188},{},[1189],{"type":31,"value":1190},"Windows",{"type":26,"tag":95,"props":1192,"children":1193},{},[1194],{"type":31,"value":1195},"你该在什么时候用",{"type":26,"tag":111,"props":1197,"children":1198},{},[1199,1230,1261,1292,1323,1354],{"type":26,"tag":91,"props":1200,"children":1201},{},[1202,1207,1216,1225],{"type":26,"tag":118,"props":1203,"children":1204},{},[1205],{"type":31,"value":1206},"改一小段（最安全）",{"type":26,"tag":118,"props":1208,"children":1209},{},[1210],{"type":26,"tag":253,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":31,"value":1215},"Cmd + K",{"type":26,"tag":118,"props":1217,"children":1218},{},[1219],{"type":26,"tag":253,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":31,"value":1224},"Ctrl + K",{"type":26,"tag":118,"props":1226,"children":1227},{},[1228],{"type":31,"value":1229},"只想改一个函数/一段 CSS，不想动别的",{"type":26,"tag":91,"props":1231,"children":1232},{},[1233,1238,1247,1256],{"type":26,"tag":118,"props":1234,"children":1235},{},[1236],{"type":31,"value":1237},"打开 AI 对话（先对齐再动手）",{"type":26,"tag":118,"props":1239,"children":1240},{},[1241],{"type":26,"tag":253,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":31,"value":1246},"Cmd + L",{"type":26,"tag":118,"props":1248,"children":1249},{},[1250],{"type":26,"tag":253,"props":1251,"children":1253},{"className":1252},[],[1254],{"type":31,"value":1255},"Ctrl + L",{"type":26,"tag":118,"props":1257,"children":1258},{},[1259],{"type":31,"value":1260},"需要澄清目标、制定步骤、给验收点",{"type":26,"tag":91,"props":1262,"children":1263},{},[1264,1269,1278,1287],{"type":26,"tag":118,"props":1265,"children":1266},{},[1267],{"type":31,"value":1268},"多文件编辑（有组织地改一组文件）",{"type":26,"tag":118,"props":1270,"children":1271},{},[1272],{"type":26,"tag":253,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":31,"value":1277},"Cmd + I",{"type":26,"tag":118,"props":1279,"children":1280},{},[1281],{"type":26,"tag":253,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":31,"value":1286},"Ctrl + I",{"type":26,"tag":118,"props":1288,"children":1289},{},[1290],{"type":31,"value":1291},"改动涉及多个文件：组件+样式+测试",{"type":26,"tag":91,"props":1293,"children":1294},{},[1295,1300,1309,1318],{"type":26,"tag":118,"props":1296,"children":1297},{},[1298],{"type":31,"value":1299},"把选中代码加入对话上下文",{"type":26,"tag":118,"props":1301,"children":1302},{},[1303],{"type":26,"tag":253,"props":1304,"children":1306},{"className":1305},[],[1307],{"type":31,"value":1308},"Cmd + Shift + L",{"type":26,"tag":118,"props":1310,"children":1311},{},[1312],{"type":26,"tag":253,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":31,"value":1317},"Ctrl + Shift + L",{"type":26,"tag":118,"props":1319,"children":1320},{},[1321],{"type":31,"value":1322},"让 AI 只看你选的片段（降低噪音）",{"type":26,"tag":91,"props":1324,"children":1325},{},[1326,1331,1340,1349],{"type":26,"tag":118,"props":1327,"children":1328},{},[1329],{"type":31,"value":1330},"接受当前建议",{"type":26,"tag":118,"props":1332,"children":1333},{},[1334],{"type":26,"tag":253,"props":1335,"children":1337},{"className":1336},[],[1338],{"type":31,"value":1339},"Cmd + Y",{"type":26,"tag":118,"props":1341,"children":1342},{},[1343],{"type":26,"tag":253,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":31,"value":1348},"Ctrl + Y",{"type":26,"tag":118,"props":1350,"children":1351},{},[1352],{"type":31,"value":1353},"你已经准备好验收/回滚，并确认改动范围",{"type":26,"tag":91,"props":1355,"children":1356},{},[1357,1362,1371,1380],{"type":26,"tag":118,"props":1358,"children":1359},{},[1360],{"type":31,"value":1361},"拒绝当前建议",{"type":26,"tag":118,"props":1363,"children":1364},{},[1365],{"type":26,"tag":253,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":31,"value":1370},"Cmd + N",{"type":26,"tag":118,"props":1372,"children":1373},{},[1374],{"type":26,"tag":253,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":31,"value":1379},"Ctrl + N",{"type":26,"tag":118,"props":1381,"children":1382},{},[1383],{"type":31,"value":1384},"改得太大、改错方向，立刻收手",{"type":26,"tag":1386,"props":1387,"children":1388},"blockquote",{},[1389],{"type":26,"tag":27,"props":1390,"children":1391},{},[1392],{"type":31,"value":1393},"小技巧：把“改一小段”当默认路径。只有当你能清晰写出“会改哪几类文件、怎么验收”时再进入多文件。",{"type":26,"tag":1078,"props":1395,"children":1396},{},[],{"type":26,"tag":76,"props":1398,"children":1400},{"id":1399},"_10-个可直接照抄的提效工作流每个都能闭环",[1401],{"type":31,"value":1402},"10 个可直接照抄的提效工作流（每个都能闭环）",{"type":26,"tag":1404,"props":1405,"children":1407},"h3",{"id":1406},"工作流-1需求计划小步改新手最稳",[1408],{"type":31,"value":1409},"工作流 1：需求→计划→小步改（新手最稳）",{"type":26,"tag":430,"props":1411,"children":1412},{},[1413,1424],{"type":26,"tag":208,"props":1414,"children":1415},{},[1416,1422],{"type":26,"tag":253,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":31,"value":1421},"Cmd/Ctrl + L",{"type":31,"value":1423}," 打开对话",{"type":26,"tag":208,"props":1425,"children":1426},{},[1427],{"type":31,"value":1428},"先发这段（可复制）：",{"type":26,"tag":1386,"props":1430,"children":1431},{},[1432],{"type":26,"tag":27,"props":1433,"children":1434},{},[1435],{"type":31,"value":1436},"目标：……\n范围：只修改以下文件/模块：……\n非目标：……（明确不做）\n验收：……（可测试/可手动检查）\n输出格式：先给计划，再逐步执行；每一步写出 diff 摘要。",{"type":26,"tag":430,"props":1438,"children":1439},{"start":942},[1440,1445],{"type":26,"tag":208,"props":1441,"children":1442},{},[1443],{"type":31,"value":1444},"让 AI 先给“计划（3~6 步）”，你确认后再执行",{"type":26,"tag":208,"props":1446,"children":1447},{},[1448,1450,1456],{"type":31,"value":1449},"任何一步涉及改代码：优先回到编辑区，选中片段用 ",{"type":26,"tag":253,"props":1451,"children":1453},{"className":1452},[],[1454],{"type":31,"value":1455},"Cmd/Ctrl + K",{"type":31,"value":1457}," 小步改",{"type":26,"tag":27,"props":1459,"children":1460},{},[1461],{"type":31,"value":1462},"为什么有效：你把“想法”变成了“可执行约束”，这就是 GEO（面向 AI/模型的可理解结构）。",{"type":26,"tag":1404,"props":1464,"children":1466},{"id":1465},"工作流-2只改一个函数高频低风险",[1467],{"type":31,"value":1468},"工作流 2：只改一个函数（高频、低风险）",{"type":26,"tag":204,"props":1470,"children":1471},{},[1472],{"type":26,"tag":208,"props":1473,"children":1474},{},[1475,1477,1482],{"type":31,"value":1476},"选中函数 → ",{"type":26,"tag":253,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":31,"value":1455},{"type":31,"value":1483}," → 输入指令：",{"type":26,"tag":1386,"props":1485,"children":1486},{},[1487,1492],{"type":26,"tag":27,"props":1488,"children":1489},{},[1490],{"type":31,"value":1491},"把这段改成更可读：",{"type":26,"tag":204,"props":1493,"children":1494},{},[1495,1500,1505,1510],{"type":26,"tag":208,"props":1496,"children":1497},{},[1498],{"type":31,"value":1499},"用 async/await",{"type":26,"tag":208,"props":1501,"children":1502},{},[1503],{"type":31,"value":1504},"错误处理不要吞掉",{"type":26,"tag":208,"props":1506,"children":1507},{},[1508],{"type":31,"value":1509},"添加类型（若可推断）",{"type":26,"tag":208,"props":1511,"children":1512},{},[1513],{"type":31,"value":1514},"不要改函数签名",{"type":26,"tag":27,"props":1516,"children":1517},{},[1518],{"type":31,"value":1519},"验收方式（强制）：",{"type":26,"tag":204,"props":1521,"children":1522},{},[1523,1528],{"type":26,"tag":208,"props":1524,"children":1525},{},[1526],{"type":31,"value":1527},"输出前后函数行为一致（输入/输出）",{"type":26,"tag":208,"props":1529,"children":1530},{},[1531],{"type":31,"value":1532},"失败分支有可观测日志（不要悄悄 return null）",{"type":26,"tag":1404,"props":1534,"children":1536},{"id":1535},"工作流-3多文件改动先定文件清单",[1537],{"type":31,"value":1538},"工作流 3：多文件改动（先定“文件清单”）",{"type":26,"tag":430,"props":1540,"children":1541},{},[1542,1553],{"type":26,"tag":208,"props":1543,"children":1544},{},[1545,1551],{"type":26,"tag":253,"props":1546,"children":1548},{"className":1547},[],[1549],{"type":31,"value":1550},"Cmd/Ctrl + I",{"type":31,"value":1552}," 进入多文件",{"type":26,"tag":208,"props":1554,"children":1555},{},[1556],{"type":31,"value":1557},"先让 AI 输出：",{"type":26,"tag":204,"props":1559,"children":1560},{},[1561,1566,1571],{"type":26,"tag":208,"props":1562,"children":1563},{},[1564],{"type":31,"value":1565},"预计会改哪些文件（最多 5 个）",{"type":26,"tag":208,"props":1567,"children":1568},{},[1569],{"type":31,"value":1570},"每个文件改什么",{"type":26,"tag":208,"props":1572,"children":1573},{},[1574],{"type":31,"value":1575},"每一步怎么验收",{"type":26,"tag":430,"props":1577,"children":1578},{"start":942},[1579],{"type":26,"tag":208,"props":1580,"children":1581},{},[1582],{"type":31,"value":1583},"你确认文件清单后再开始生成改动",{"type":26,"tag":27,"props":1585,"children":1586},{},[1587],{"type":31,"value":1588},"关键点：多文件最容易翻车的是“它把你没想到的文件也改了”。所以文件清单是第一道闸门。",{"type":26,"tag":1404,"props":1590,"children":1592},{"id":1591},"工作流-4把上下文噪音砍掉防跑偏",[1593],{"type":31,"value":1594},"工作流 4：把“上下文噪音”砍掉（防跑偏）",{"type":26,"tag":27,"props":1596,"children":1597},{},[1598],{"type":31,"value":1599},"当你怀疑它在胡说/乱改时：",{"type":26,"tag":204,"props":1601,"children":1602},{},[1603,1616],{"type":26,"tag":208,"props":1604,"children":1605},{},[1606,1608,1614],{"type":31,"value":1607},"只选择关键代码片段 → ",{"type":26,"tag":253,"props":1609,"children":1611},{"className":1610},[],[1612],{"type":31,"value":1613},"Cmd/Ctrl + Shift + L",{"type":31,"value":1615}," 加入对话",{"type":26,"tag":208,"props":1617,"children":1618},{},[1619],{"type":31,"value":1620},"然后在对话里要求：",{"type":26,"tag":1386,"props":1622,"children":1623},{},[1624],{"type":26,"tag":27,"props":1625,"children":1626},{},[1627],{"type":31,"value":1628},"只基于我提供的代码片段回答，不要假设其它文件存在。",{"type":26,"tag":1404,"props":1630,"children":1632},{"id":1631},"工作流-5生成变更说明让-code-review-变快",[1633],{"type":31,"value":1634},"工作流 5：生成变更说明（让 code review 变快）",{"type":26,"tag":27,"props":1636,"children":1637},{},[1638],{"type":31,"value":1639},"改完后在对话里让它输出：",{"type":26,"tag":204,"props":1641,"children":1642},{},[1643,1648,1653,1658],{"type":26,"tag":208,"props":1644,"children":1645},{},[1646],{"type":31,"value":1647},"改动摘要（3~7 条）",{"type":26,"tag":208,"props":1649,"children":1650},{},[1651],{"type":31,"value":1652},"风险点（依赖/边界条件）",{"type":26,"tag":208,"props":1654,"children":1655},{},[1656],{"type":31,"value":1657},"回滚方式",{"type":26,"tag":208,"props":1659,"children":1660},{},[1661],{"type":31,"value":1662},"验收步骤",{"type":26,"tag":27,"props":1664,"children":1665},{},[1666],{"type":31,"value":1667},"这套结构能直接贴进 PR 描述。",{"type":26,"tag":1404,"props":1669,"children":1671},{"id":1670},"工作流-6写最小回归集不写回归-等事故",[1672],{"type":31,"value":1673},"工作流 6：写“最小回归集”（不写回归 = 等事故）",{"type":26,"tag":27,"props":1675,"children":1676},{},[1677,1679,1685],{"type":31,"value":1678},"每次改动都至少做 10 条最小回归（见下文清单）。你可以把它写在 ",{"type":26,"tag":253,"props":1680,"children":1682},{"className":1681},[],[1683],{"type":31,"value":1684},"README",{"type":31,"value":1686}," 或团队 wiki。",{"type":26,"tag":1404,"props":1688,"children":1690},{"id":1689},"工作流-7把接受建议变成最后一步",[1691],{"type":31,"value":1692},"工作流 7：把“接受建议”变成最后一步",{"type":26,"tag":27,"props":1694,"children":1695},{},[1696,1702,1704,1709],{"type":26,"tag":253,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":31,"value":1701},"Cmd/Ctrl + Y",{"type":31,"value":1703}," 应该是",{"type":26,"tag":1017,"props":1705,"children":1706},{},[1707],{"type":31,"value":1708},"最后一步",{"type":31,"value":1710},"：",{"type":26,"tag":204,"props":1712,"children":1713},{},[1714,1719,1724],{"type":26,"tag":208,"props":1715,"children":1716},{},[1717],{"type":31,"value":1718},"你已经看过 diff",{"type":26,"tag":208,"props":1720,"children":1721},{},[1722],{"type":31,"value":1723},"你能说清楚“怎么验收”",{"type":26,"tag":208,"props":1725,"children":1726},{},[1727],{"type":31,"value":1728},"你知道“怎么回滚”",{"type":26,"tag":1404,"props":1730,"children":1732},{"id":1731},"工作流-8拒绝建议不是失败是风控动作",[1733],{"type":31,"value":1734},"工作流 8：拒绝建议不是失败，是风控动作",{"type":26,"tag":27,"props":1736,"children":1737},{},[1738,1744],{"type":26,"tag":253,"props":1739,"children":1741},{"className":1740},[],[1742],{"type":31,"value":1743},"Cmd/Ctrl + N",{"type":31,"value":1745}," 的使用时机：",{"type":26,"tag":204,"props":1747,"children":1748},{},[1749,1754,1759],{"type":26,"tag":208,"props":1750,"children":1751},{},[1752],{"type":31,"value":1753},"它开始改你没提过的东西（范围漂移）",{"type":26,"tag":208,"props":1755,"children":1756},{},[1757],{"type":31,"value":1758},"它改了 10 个文件但你只想改 1 个",{"type":26,"tag":208,"props":1760,"children":1761},{},[1762],{"type":31,"value":1763},"它为了“更优雅”引入新依赖/新抽象",{"type":26,"tag":1404,"props":1765,"children":1767},{"id":1766},"工作流-9重复任务做成模板提示词不是一次性",[1768],{"type":31,"value":1769},"工作流 9：重复任务做成模板（提示词不是一次性）",{"type":26,"tag":27,"props":1771,"children":1772},{},[1773,1775,1779],{"type":31,"value":1774},"把高频任务（比如“写组件+样式+验收”）固化成模板，放进 Rules（见：",{"type":26,"tag":44,"props":1776,"children":1777},{"href":1073},[1778],{"type":31,"value":1076},{"type":31,"value":1780},"）。",{"type":26,"tag":1404,"props":1782,"children":1784},{"id":1783},"工作流-10把快捷键表做成你自己的任务表",[1785],{"type":31,"value":1786},"工作流 10：把“快捷键表”做成你自己的任务表",{"type":26,"tag":27,"props":1788,"children":1789},{},[1790],{"type":31,"value":1791},"你不需要记住所有快捷键，只需要记住：",{"type":26,"tag":204,"props":1793,"children":1794},{},[1795,1805,1815,1825],{"type":26,"tag":208,"props":1796,"children":1797},{},[1798,1800],{"type":31,"value":1799},"小步改：",{"type":26,"tag":253,"props":1801,"children":1803},{"className":1802},[],[1804],{"type":31,"value":1455},{"type":26,"tag":208,"props":1806,"children":1807},{},[1808,1810],{"type":31,"value":1809},"先对齐：",{"type":26,"tag":253,"props":1811,"children":1813},{"className":1812},[],[1814],{"type":31,"value":1421},{"type":26,"tag":208,"props":1816,"children":1817},{},[1818,1820],{"type":31,"value":1819},"多文件：",{"type":26,"tag":253,"props":1821,"children":1823},{"className":1822},[],[1824],{"type":31,"value":1550},{"type":26,"tag":208,"props":1826,"children":1827},{},[1828,1830],{"type":31,"value":1829},"上下文聚焦：",{"type":26,"tag":253,"props":1831,"children":1833},{"className":1832},[],[1834],{"type":31,"value":1613},{"type":26,"tag":1078,"props":1836,"children":1837},{},[],{"type":26,"tag":76,"props":1839,"children":1841},{"id":1840},"必交付物-1最小回归任务清单10-条通用",[1842],{"type":31,"value":1843},"必交付物 1：最小回归任务清单（10 条，通用）",{"type":26,"tag":1386,"props":1845,"children":1846},{},[1847],{"type":26,"tag":27,"props":1848,"children":1849},{},[1850],{"type":31,"value":1851},"这份清单的意义：让每次 AI 改动都能“被验证”。否则你只是把不可控变成了更快的不可控。",{"type":26,"tag":430,"props":1853,"children":1854},{},[1855,1860,1865,1870,1875,1880,1885,1890,1895,1900],{"type":26,"tag":208,"props":1856,"children":1857},{},[1858],{"type":31,"value":1859},"关键路径能跑通（手动点击/请求一次）",{"type":26,"tag":208,"props":1861,"children":1862},{},[1863],{"type":31,"value":1864},"错误路径能触发（模拟一次失败输入）",{"type":26,"tag":208,"props":1866,"children":1867},{},[1868],{"type":31,"value":1869},"控制台无新增错误（至少关注 1 次真实操作）",{"type":26,"tag":208,"props":1871,"children":1872},{},[1873],{"type":31,"value":1874},"关键 UI 未错位（移动端/桌面端各看一眼）",{"type":26,"tag":208,"props":1876,"children":1877},{},[1878],{"type":31,"value":1879},"刷新后状态正确（尤其是表单/列表）",{"type":26,"tag":208,"props":1881,"children":1882},{},[1883],{"type":31,"value":1884},"路由跳转没断（从入口到目标页）",{"type":26,"tag":208,"props":1886,"children":1887},{},[1888],{"type":31,"value":1889},"相关接口未改变契约（字段名/类型）",{"type":26,"tag":208,"props":1891,"children":1892},{},[1893],{"type":31,"value":1894},"性能没有明显退化（首屏、交互卡顿）",{"type":26,"tag":208,"props":1896,"children":1897},{},[1898],{"type":31,"value":1899},"回滚方案可执行（知道回滚哪几个文件/commit）",{"type":26,"tag":208,"props":1901,"children":1902},{},[1903],{"type":31,"value":1904},"写下“这次改动解决了什么、风险是什么”（可贴 PR）",{"type":26,"tag":1078,"props":1906,"children":1907},{},[],{"type":26,"tag":76,"props":1909,"children":1911},{"id":1910},"必交付物-2失败案例复盘真实会发生",[1912],{"type":31,"value":1913},"必交付物 2：失败案例复盘（真实会发生）",{"type":26,"tag":1404,"props":1915,"children":1917},{"id":1916},"现象快捷键用得很熟但交付还是慢",[1918],{"type":31,"value":1919},"现象：快捷键用得很熟，但交付还是慢",{"type":26,"tag":27,"props":1921,"children":1922},{},[1923],{"type":31,"value":1924},"典型原因：你把 Cursor 当成“更聪明的搜索框”，不断对话，直到它给出你想要的答案。",{"type":26,"tag":27,"props":1926,"children":1927},{},[1928],{"type":31,"value":1929},"复现路径：",{"type":26,"tag":204,"props":1931,"children":1932},{},[1933,1938,1943,1948],{"type":26,"tag":208,"props":1934,"children":1935},{},[1936],{"type":31,"value":1937},"你直接说“把页面做得更好看、更高级”",{"type":26,"tag":208,"props":1939,"children":1940},{},[1941],{"type":31,"value":1942},"AI 开始大改样式、抽象组件、甚至引入新依赖",{"type":26,"tag":208,"props":1944,"children":1945},{},[1946],{"type":31,"value":1947},"你为了省事按了“接受建议”",{"type":26,"tag":208,"props":1949,"children":1950},{},[1951],{"type":31,"value":1952},"最后发现：设计没统一、移动端崩、甚至埋了性能问题",{"type":26,"tag":27,"props":1954,"children":1955},{},[1956,1958,1962,1964,1969],{"type":31,"value":1957},"根因：缺少",{"type":26,"tag":1017,"props":1959,"children":1960},{},[1961],{"type":31,"value":1142},{"type":31,"value":1963},"与",{"type":26,"tag":1017,"props":1965,"children":1966},{},[1967],{"type":31,"value":1968},"验收",{"type":31,"value":1970},"。",{"type":26,"tag":27,"props":1972,"children":1973},{},[1974],{"type":31,"value":1975},"修复方式（可照抄）：",{"type":26,"tag":204,"props":1977,"children":1978},{},[1979,1984,1996],{"type":26,"tag":208,"props":1980,"children":1981},{},[1982],{"type":31,"value":1983},"把需求拆成 3 个可验证目标：例如“按钮样式统一”“首屏 CTA 更明显”“移动端间距不挤”",{"type":26,"tag":208,"props":1985,"children":1986},{},[1987,1989,1994],{"type":31,"value":1988},"每个目标只用 ",{"type":26,"tag":253,"props":1990,"children":1992},{"className":1991},[],[1993],{"type":31,"value":1455},{"type":31,"value":1995}," 改一个局部",{"type":26,"tag":208,"props":1997,"children":1998},{},[1999],{"type":31,"value":2000},"每次接受建议前跑一遍“最小回归集”",{"type":26,"tag":1078,"props":2002,"children":2003},{},[],{"type":26,"tag":76,"props":2005,"children":2007},{"id":2006},"faq高频问题",[2008],{"type":31,"value":2009},"FAQ（高频问题）",{"type":26,"tag":1404,"props":2011,"children":2013},{"id":2012},"q1我应该先记快捷键还是先学工作流",[2014],{"type":31,"value":2015},"Q1：我应该先记快捷键还是先学工作流？",{"type":26,"tag":27,"props":2017,"children":2018},{},[2019],{"type":31,"value":2020},"先学工作流。快捷键只是把工作流的步骤变短。",{"type":26,"tag":1404,"props":2022,"children":2024},{"id":2023},"q2为什么我一用多文件就容易翻车",[2025],{"type":31,"value":2026},"Q2：为什么我一用多文件就容易翻车？",{"type":26,"tag":27,"props":2028,"children":2029},{},[2030],{"type":31,"value":2031},"因为多文件意味着范围更大、依赖更多、验收更难。先锁定“文件清单 + 每步验收”，再让它动手。",{"type":26,"tag":1404,"props":2033,"children":2035},{"id":2034},"q3有没有万能提示词",[2036],{"type":31,"value":2037},"Q3：有没有“万能提示词”？",{"type":26,"tag":27,"props":2039,"children":2040},{},[2041],{"type":31,"value":2042},"没有，但有“万能结构”：目标、范围、非目标、验收、输出格式。",{"type":26,"tag":1078,"props":2044,"children":2045},{},[],{"type":26,"tag":76,"props":2047,"children":2049},{"id":2048},"延伸阅读建议按顺序",[2050],{"type":31,"value":2051},"延伸阅读（建议按顺序）",{"type":26,"tag":204,"props":2053,"children":2054},{},[2055,2062,2069,2076],{"type":26,"tag":208,"props":2056,"children":2057},{},[2058],{"type":26,"tag":44,"props":2059,"children":2060},{"href":1051},[2061],{"type":31,"value":1054},{"type":26,"tag":208,"props":2063,"children":2064},{},[2065],{"type":26,"tag":44,"props":2066,"children":2067},{"href":1062},[2068],{"type":31,"value":1065},{"type":26,"tag":208,"props":2070,"children":2071},{},[2072],{"type":26,"tag":44,"props":2073,"children":2074},{"href":1073},[2075],{"type":31,"value":1076},{"type":26,"tag":208,"props":2077,"children":2078},{},[2079,2081],{"type":31,"value":2080},"如果你更关心“网页制作落地”：看这篇 ",{"type":26,"tag":44,"props":2082,"children":2084},{"href":2083},"/topics/practical-tips/htmlpage-quick-landing-page",[2085],{"type":31,"value":2086},"3 分钟用 HTMLPAGE 做落地页",{"title":7,"searchDepth":942,"depth":942,"links":2088},[2089,2090,2091,2103,2104,2107,2112],{"id":1083,"depth":945,"text":1086},{"id":1158,"depth":945,"text":1161},{"id":1399,"depth":945,"text":1402,"children":2092},[2093,2094,2095,2096,2097,2098,2099,2100,2101,2102],{"id":1406,"depth":942,"text":1409},{"id":1465,"depth":942,"text":1468},{"id":1535,"depth":942,"text":1538},{"id":1591,"depth":942,"text":1594},{"id":1631,"depth":942,"text":1634},{"id":1670,"depth":942,"text":1673},{"id":1689,"depth":942,"text":1692},{"id":1731,"depth":942,"text":1734},{"id":1766,"depth":942,"text":1769},{"id":1783,"depth":942,"text":1786},{"id":1840,"depth":945,"text":1843},{"id":1910,"depth":945,"text":1913,"children":2105},[2106],{"id":1916,"depth":942,"text":1919},{"id":2006,"depth":945,"text":2009,"children":2108},[2109,2110,2111],{"id":2012,"depth":942,"text":2015},{"id":2023,"depth":942,"text":2026},{"id":2034,"depth":942,"text":2037},{"id":2048,"depth":945,"text":2051},"content:topics:ai:cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet",{"_path":2117,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2118,"description":2119,"date":2120,"topic":5,"author":11,"tags":2121,"image":2125,"imageAlt":2126,"pexelsPhotoId":2127,"pexelsUrl":2128,"readingTime":2129,"body":2130,"_type":955,"_id":3062,"_source":957,"_file":3063,"_stem":3064,"_extension":960},"/topics/ai/cursor-vs-copilot-vscode-workflow","Cursor vs GitHub Copilot vs VS Code：怎么选、怎么搭配、怎么把风险关在笼子里","用“任务类型×风险×验收成本”的选择矩阵解释 Cursor/Copilot/VS Code 的差异，并给出一套可落地的协作工作流（范围闸门、最小回归集、回滚策略）。","2026-03-01",[968,2122,971,2123,2124],"GitHub Copilot","AI 编程","工作流","/images/topics/ai/cursor-vs-copilot-vscode-workflow.jpg","团队在电脑前进行协作讨论",1181371,"https://www.pexels.com/photo/man-wearing-blue-dress-shirt-1181371/",15,{"type":23,"children":2131,"toc":3040},[2132,2137,2142,2160,2165,2183,2186,2192,2197,2228,2233,2236,2242,2250,2454,2462,2475,2478,2484,2490,2503,2508,2521,2527,2532,2565,2571,2576,2594,2597,2603,2608,2614,2619,2652,2658,2671,2676,2689,2695,2707,2713,2718,2731,2736,2739,2745,2750,2870,2873,2879,2889,2898,2916,2925,2933,2942,2960,2963,2969,2975,2980,2986,2991,2994,2999],{"type":26,"tag":27,"props":2133,"children":2134},{},[2135],{"type":31,"value":2136},"“Cursor 和 Copilot 到底有什么区别？”",{"type":26,"tag":27,"props":2138,"children":2139},{},[2140],{"type":31,"value":2141},"这个问题问得越早越好，因为你一旦把工具选错，后面所有痛苦都不是“提示词不够好”，而是：",{"type":26,"tag":204,"props":2143,"children":2144},{},[2145,2150,2155],{"type":26,"tag":208,"props":2146,"children":2147},{},[2148],{"type":31,"value":2149},"改动不可控（范围漂移、改错文件）",{"type":26,"tag":208,"props":2151,"children":2152},{},[2153],{"type":31,"value":2154},"验收成本爆炸（不知道要测什么）",{"type":26,"tag":208,"props":2156,"children":2157},{},[2158],{"type":31,"value":2159},"团队协作崩盘（没有闸门、没有回滚）",{"type":26,"tag":27,"props":2161,"children":2162},{},[2163],{"type":31,"value":2164},"这篇文章用一张选择矩阵 + 一套可执行工作流，帮你做到两件事：",{"type":26,"tag":430,"props":2166,"children":2167},{},[2168,2173],{"type":26,"tag":208,"props":2169,"children":2170},{},[2171],{"type":31,"value":2172},"知道什么时候用 Cursor、什么时候用 Copilot、什么时候“纯 VS Code 更快”",{"type":26,"tag":208,"props":2174,"children":2175},{},[2176,2178],{"type":31,"value":2177},"就算用 AI，也能把风险关在笼子里：",{"type":26,"tag":1017,"props":2179,"children":2180},{},[2181],{"type":31,"value":2182},"可审查、可验证、可回滚",{"type":26,"tag":1078,"props":2184,"children":2185},{},[],{"type":26,"tag":76,"props":2187,"children":2189},{"id":2188},"结论先说三者不是互斥而是分工",[2190],{"type":31,"value":2191},"结论先说：三者不是互斥，而是分工",{"type":26,"tag":27,"props":2193,"children":2194},{},[2195],{"type":31,"value":2196},"你可以把它们看成三层能力：",{"type":26,"tag":204,"props":2198,"children":2199},{},[2200,2209,2219],{"type":26,"tag":208,"props":2201,"children":2202},{},[2203,2207],{"type":26,"tag":1017,"props":2204,"children":2205},{},[2206],{"type":31,"value":971},{"type":31,"value":2208},"：编辑器与生态（调试、插件、任务、终端、语言服务）",{"type":26,"tag":208,"props":2210,"children":2211},{},[2212,2217],{"type":26,"tag":1017,"props":2213,"children":2214},{},[2215],{"type":31,"value":2216},"Copilot",{"type":31,"value":2218},"：代码补全与局部建议（“我正在写这一行/这一段”）",{"type":26,"tag":208,"props":2220,"children":2221},{},[2222,2226],{"type":26,"tag":1017,"props":2223,"children":2224},{},[2225],{"type":31,"value":968},{"type":31,"value":2227},"：以项目为单位的 AI 协作（对话、索引、多文件编辑、规则）",{"type":26,"tag":27,"props":2229,"children":2230},{},[2231],{"type":31,"value":2232},"最常见的误区是：把“局部补全能力”当作“能做架构与多文件落地”。",{"type":26,"tag":1078,"props":2234,"children":2235},{},[],{"type":26,"tag":76,"props":2237,"children":2239},{"id":2238},"选择矩阵按任务类型选工具不是按偏好",[2240],{"type":31,"value":2241},"选择矩阵：按任务类型选工具（不是按偏好）",{"type":26,"tag":1386,"props":2243,"children":2244},{},[2245],{"type":26,"tag":27,"props":2246,"children":2247},{},[2248],{"type":31,"value":2249},"你只要把自己的任务放进表格，就能得到推荐路径。",{"type":26,"tag":83,"props":2251,"children":2252},{},[2253,2285],{"type":26,"tag":87,"props":2254,"children":2255},{},[2256],{"type":26,"tag":91,"props":2257,"children":2258},{},[2259,2264,2270,2275,2280],{"type":26,"tag":95,"props":2260,"children":2261},{},[2262],{"type":31,"value":2263},"任务类型",{"type":26,"tag":95,"props":2265,"children":2267},{"align":2266},"right",[2268],{"type":31,"value":2269},"风险",{"type":26,"tag":95,"props":2271,"children":2272},{"align":2266},[2273],{"type":31,"value":2274},"验收成本",{"type":26,"tag":95,"props":2276,"children":2277},{},[2278],{"type":31,"value":2279},"更推荐",{"type":26,"tag":95,"props":2281,"children":2282},{},[2283],{"type":31,"value":2284},"为什么",{"type":26,"tag":111,"props":2286,"children":2287},{},[2288,2315,2348,2374,2401,2428],{"type":26,"tag":91,"props":2289,"children":2290},{},[2291,2296,2301,2305,2310],{"type":26,"tag":118,"props":2292,"children":2293},{},[2294],{"type":31,"value":2295},"写一段代码/补一个 if",{"type":26,"tag":118,"props":2297,"children":2298},{"align":2266},[2299],{"type":31,"value":2300},"低",{"type":26,"tag":118,"props":2302,"children":2303},{"align":2266},[2304],{"type":31,"value":2300},{"type":26,"tag":118,"props":2306,"children":2307},{},[2308],{"type":31,"value":2309},"Copilot / Cursor 内联编辑",{"type":26,"tag":118,"props":2311,"children":2312},{},[2313],{"type":31,"value":2314},"局部建议足够，成本最低",{"type":26,"tag":91,"props":2316,"children":2317},{},[2318,2323,2328,2332,2343],{"type":26,"tag":118,"props":2319,"children":2320},{},[2321],{"type":31,"value":2322},"重构一个函数",{"type":26,"tag":118,"props":2324,"children":2325},{"align":2266},[2326],{"type":31,"value":2327},"中",{"type":26,"tag":118,"props":2329,"children":2330},{"align":2266},[2331],{"type":31,"value":2327},{"type":26,"tag":118,"props":2333,"children":2334},{},[2335,2337],{"type":31,"value":2336},"Cursor ",{"type":26,"tag":253,"props":2338,"children":2340},{"className":2339},[],[2341],{"type":31,"value":2342},"内联编辑",{"type":26,"tag":118,"props":2344,"children":2345},{},[2346],{"type":31,"value":2347},"需要解释、需要约束输出",{"type":26,"tag":91,"props":2349,"children":2350},{},[2351,2356,2360,2364,2369],{"type":26,"tag":118,"props":2352,"children":2353},{},[2354],{"type":31,"value":2355},"改一个组件 + 样式",{"type":26,"tag":118,"props":2357,"children":2358},{"align":2266},[2359],{"type":31,"value":2327},{"type":26,"tag":118,"props":2361,"children":2362},{"align":2266},[2363],{"type":31,"value":2327},{"type":26,"tag":118,"props":2365,"children":2366},{},[2367],{"type":31,"value":2368},"Cursor（小范围多文件）",{"type":26,"tag":118,"props":2370,"children":2371},{},[2372],{"type":31,"value":2373},"需要同时改模板与样式",{"type":26,"tag":91,"props":2375,"children":2376},{},[2377,2382,2387,2391,2396],{"type":26,"tag":118,"props":2378,"children":2379},{},[2380],{"type":31,"value":2381},"改 3~5 个文件（组件+api+测试）",{"type":26,"tag":118,"props":2383,"children":2384},{"align":2266},[2385],{"type":31,"value":2386},"高",{"type":26,"tag":118,"props":2388,"children":2389},{"align":2266},[2390],{"type":31,"value":2386},{"type":26,"tag":118,"props":2392,"children":2393},{},[2394],{"type":31,"value":2395},"Cursor Composer + 闸门",{"type":26,"tag":118,"props":2397,"children":2398},{},[2399],{"type":31,"value":2400},"需要计划、验收、回滚",{"type":26,"tag":91,"props":2402,"children":2403},{},[2404,2409,2414,2418,2423],{"type":26,"tag":118,"props":2405,"children":2406},{},[2407],{"type":31,"value":2408},"重写一段架构/引入新依赖",{"type":26,"tag":118,"props":2410,"children":2411},{"align":2266},[2412],{"type":31,"value":2413},"很高",{"type":26,"tag":118,"props":2415,"children":2416},{"align":2266},[2417],{"type":31,"value":2413},{"type":26,"tag":118,"props":2419,"children":2420},{},[2421],{"type":31,"value":2422},"先人脑设计 + VS Code 实现",{"type":26,"tag":118,"props":2424,"children":2425},{},[2426],{"type":31,"value":2427},"AI 易发散，最好先设计再执行",{"type":26,"tag":91,"props":2429,"children":2430},{},[2431,2436,2440,2444,2449],{"type":26,"tag":118,"props":2432,"children":2433},{},[2434],{"type":31,"value":2435},"排查线上问题/性能抖动",{"type":26,"tag":118,"props":2437,"children":2438},{"align":2266},[2439],{"type":31,"value":2386},{"type":26,"tag":118,"props":2441,"children":2442},{"align":2266},[2443],{"type":31,"value":2413},{"type":26,"tag":118,"props":2445,"children":2446},{},[2447],{"type":31,"value":2448},"VS Code + 工具链优先，AI 辅助归纳",{"type":26,"tag":118,"props":2450,"children":2451},{},[2452],{"type":31,"value":2453},"需要证据，不要“猜”",{"type":26,"tag":27,"props":2455,"children":2456},{},[2457],{"type":26,"tag":1017,"props":2458,"children":2459},{},[2460],{"type":31,"value":2461},"一句话规则：",{"type":26,"tag":204,"props":2463,"children":2464},{},[2465,2470],{"type":26,"tag":208,"props":2466,"children":2467},{},[2468],{"type":31,"value":2469},"当你的改动可以用“10 条最小回归集”覆盖时，用 Cursor。",{"type":26,"tag":208,"props":2471,"children":2472},{},[2473],{"type":31,"value":2474},"当你的改动无法验证时，先别让 AI 动手。",{"type":26,"tag":1078,"props":2476,"children":2477},{},[],{"type":26,"tag":76,"props":2479,"children":2481},{"id":2480},"差异拆解到底差在哪里",[2482],{"type":31,"value":2483},"差异拆解：到底差在哪里？",{"type":26,"tag":1404,"props":2485,"children":2487},{"id":2486},"_1-上下文来源补全-vs-项目索引",[2488],{"type":31,"value":2489},"1) 上下文来源：补全 vs 项目索引",{"type":26,"tag":204,"props":2491,"children":2492},{},[2493,2498],{"type":26,"tag":208,"props":2494,"children":2495},{},[2496],{"type":31,"value":2497},"Copilot 更擅长：你正在写的这几行、当前文件的局部上下文",{"type":26,"tag":208,"props":2499,"children":2500},{},[2501],{"type":31,"value":2502},"Cursor 更擅长：项目级索引 + 多文件关联理解",{"type":26,"tag":27,"props":2504,"children":2505},{},[2506],{"type":31,"value":2507},"因此：",{"type":26,"tag":204,"props":2509,"children":2510},{},[2511,2516],{"type":26,"tag":208,"props":2512,"children":2513},{},[2514],{"type":31,"value":2515},"写代码片段：Copilot 速度更快",{"type":26,"tag":208,"props":2517,"children":2518},{},[2519],{"type":31,"value":2520},"改一坨工程：Cursor 更有胜算（但更需要闸门）",{"type":26,"tag":1404,"props":2522,"children":2524},{"id":2523},"_2-交互方式你能不能控制范围",[2525],{"type":31,"value":2526},"2) 交互方式：你能不能控制范围",{"type":26,"tag":27,"props":2528,"children":2529},{},[2530],{"type":31,"value":2531},"范围控制的三个层级：",{"type":26,"tag":430,"props":2533,"children":2534},{},[2535,2545,2555],{"type":26,"tag":208,"props":2536,"children":2537},{},[2538,2540],{"type":31,"value":2539},"内联编辑（选中一段）→ ",{"type":26,"tag":1017,"props":2541,"children":2542},{},[2543],{"type":31,"value":2544},"最强范围控制",{"type":26,"tag":208,"props":2546,"children":2547},{},[2548,2550],{"type":31,"value":2549},"Composer 多文件（先列文件清单）→ ",{"type":26,"tag":1017,"props":2551,"children":2552},{},[2553],{"type":31,"value":2554},"可控但要闸门",{"type":26,"tag":208,"props":2556,"children":2557},{},[2558,2560],{"type":31,"value":2559},"大对话（泛目标）→ ",{"type":26,"tag":1017,"props":2561,"children":2562},{},[2563],{"type":31,"value":2564},"最容易跑偏",{"type":26,"tag":1404,"props":2566,"children":2568},{"id":2567},"_3-输出形态建议-vs-可审查的变更",[2569],{"type":31,"value":2570},"3) 输出形态：建议 vs 可审查的变更",{"type":26,"tag":27,"props":2572,"children":2573},{},[2574],{"type":31,"value":2575},"最好的 AI 输出不是“给我一段代码”，而是：",{"type":26,"tag":204,"props":2577,"children":2578},{},[2579,2584,2589],{"type":26,"tag":208,"props":2580,"children":2581},{},[2582],{"type":31,"value":2583},"改动摘要（做了什么）",{"type":26,"tag":208,"props":2585,"children":2586},{},[2587],{"type":31,"value":2588},"diff 级别的可审查变更",{"type":26,"tag":208,"props":2590,"children":2591},{},[2592],{"type":31,"value":2593},"验收步骤与回滚方案",{"type":26,"tag":1078,"props":2595,"children":2596},{},[],{"type":26,"tag":76,"props":2598,"children":2600},{"id":2599},"一套可落地的团队工作流把风险关住",[2601],{"type":31,"value":2602},"一套可落地的团队工作流（把风险关住）",{"type":26,"tag":27,"props":2604,"children":2605},{},[2606],{"type":31,"value":2607},"下面这套流程，你可以直接写进团队规范：",{"type":26,"tag":1404,"props":2609,"children":2611},{"id":2610},"step-1先写任务单geo-友好结构",[2612],{"type":31,"value":2613},"Step 1：先写任务单（GEO 友好结构）",{"type":26,"tag":27,"props":2615,"children":2616},{},[2617],{"type":31,"value":2618},"模板：",{"type":26,"tag":204,"props":2620,"children":2621},{},[2622,2627,2632,2637,2642,2647],{"type":26,"tag":208,"props":2623,"children":2624},{},[2625],{"type":31,"value":2626},"目标：……",{"type":26,"tag":208,"props":2628,"children":2629},{},[2630],{"type":31,"value":2631},"背景：……",{"type":26,"tag":208,"props":2633,"children":2634},{},[2635],{"type":31,"value":2636},"范围：只改这些文件/模块：……",{"type":26,"tag":208,"props":2638,"children":2639},{},[2640],{"type":31,"value":2641},"非目标：不做哪些事情：……",{"type":26,"tag":208,"props":2643,"children":2644},{},[2645],{"type":31,"value":2646},"验收：如何判断完成（可测试/可观察）：……",{"type":26,"tag":208,"props":2648,"children":2649},{},[2650],{"type":31,"value":2651},"回滚：如果失败怎么撤回：……",{"type":26,"tag":1404,"props":2653,"children":2655},{"id":2654},"step-2用范围闸门限制-ai",[2656],{"type":31,"value":2657},"Step 2：用“范围闸门”限制 AI",{"type":26,"tag":204,"props":2659,"children":2660},{},[2661,2666],{"type":26,"tag":208,"props":2662,"children":2663},{},[2664],{"type":31,"value":2665},"单文件改动：优先 Cursor 内联编辑",{"type":26,"tag":208,"props":2667,"children":2668},{},[2669],{"type":31,"value":2670},"多文件改动：必须先让 AI 输出“文件清单（≤5）+ 每步验收”",{"type":26,"tag":27,"props":2672,"children":2673},{},[2674],{"type":31,"value":2675},"如果 AI 输出的文件清单超过 5 个：",{"type":26,"tag":204,"props":2677,"children":2678},{},[2679,2684],{"type":26,"tag":208,"props":2680,"children":2681},{},[2682],{"type":31,"value":2683},"不是它太强，是任务太大",{"type":26,"tag":208,"props":2685,"children":2686},{},[2687],{"type":31,"value":2688},"你需要拆任务，而不是继续推进",{"type":26,"tag":1404,"props":2690,"children":2692},{"id":2691},"step-3最小回归集10-条",[2693],{"type":31,"value":2694},"Step 3：最小回归集（10 条）",{"type":26,"tag":27,"props":2696,"children":2697},{},[2698,2700,2705],{"type":31,"value":2699},"每次接受改动前必须跑（可参考：",{"type":26,"tag":44,"props":2701,"children":2702},{"href":963},[2703],{"type":31,"value":2704},"Cursor 快捷键速查表",{"type":31,"value":2706}," 里的清单）。",{"type":26,"tag":1404,"props":2708,"children":2710},{"id":2709},"step-4回滚策略不用等事故才想",[2711],{"type":31,"value":2712},"Step 4：回滚策略（不用等事故才想）",{"type":26,"tag":27,"props":2714,"children":2715},{},[2716],{"type":31,"value":2717},"回滚最常见的两条路：",{"type":26,"tag":204,"props":2719,"children":2720},{},[2721,2726],{"type":26,"tag":208,"props":2722,"children":2723},{},[2724],{"type":31,"value":2725},"git 回滚 commit",{"type":26,"tag":208,"props":2727,"children":2728},{},[2729],{"type":31,"value":2730},"对关键文件保留前版本（至少能快速恢复）",{"type":26,"tag":27,"props":2732,"children":2733},{},[2734],{"type":31,"value":2735},"你需要做到：任何一轮 AI 改动都能在 5 分钟内撤回。",{"type":26,"tag":1078,"props":2737,"children":2738},{},[],{"type":26,"tag":76,"props":2740,"children":2742},{"id":2741},"必交付物对比矩阵可复制",[2743],{"type":31,"value":2744},"必交付物：对比矩阵（可复制）",{"type":26,"tag":27,"props":2746,"children":2747},{},[2748],{"type":31,"value":2749},"下面这张表可以直接贴到你的团队 wiki：",{"type":26,"tag":83,"props":2751,"children":2752},{},[2753,2775],{"type":26,"tag":87,"props":2754,"children":2755},{},[2756],{"type":26,"tag":91,"props":2757,"children":2758},{},[2759,2763,2767,2771],{"type":26,"tag":95,"props":2760,"children":2761},{},[2762],{"type":31,"value":99},{"type":26,"tag":95,"props":2764,"children":2765},{},[2766],{"type":31,"value":971},{"type":26,"tag":95,"props":2768,"children":2769},{},[2770],{"type":31,"value":2216},{"type":26,"tag":95,"props":2772,"children":2773},{},[2774],{"type":31,"value":968},{"type":26,"tag":111,"props":2776,"children":2777},{},[2778,2801,2824,2847],{"type":26,"tag":91,"props":2779,"children":2780},{},[2781,2786,2791,2796],{"type":26,"tag":118,"props":2782,"children":2783},{},[2784],{"type":31,"value":2785},"强项",{"type":26,"tag":118,"props":2787,"children":2788},{},[2789],{"type":31,"value":2790},"工具链、调试、生态",{"type":26,"tag":118,"props":2792,"children":2793},{},[2794],{"type":31,"value":2795},"补全与局部建议",{"type":26,"tag":118,"props":2797,"children":2798},{},[2799],{"type":31,"value":2800},"项目上下文、多文件落地",{"type":26,"tag":91,"props":2802,"children":2803},{},[2804,2809,2814,2819],{"type":26,"tag":118,"props":2805,"children":2806},{},[2807],{"type":31,"value":2808},"适合任务",{"type":26,"tag":118,"props":2810,"children":2811},{},[2812],{"type":31,"value":2813},"排查、调试、验证",{"type":26,"tag":118,"props":2815,"children":2816},{},[2817],{"type":31,"value":2818},"写一段、补一段",{"type":26,"tag":118,"props":2820,"children":2821},{},[2822],{"type":31,"value":2823},"改一段、改一组文件",{"type":26,"tag":91,"props":2825,"children":2826},{},[2827,2832,2837,2842],{"type":26,"tag":118,"props":2828,"children":2829},{},[2830],{"type":31,"value":2831},"最大风险",{"type":26,"tag":118,"props":2833,"children":2834},{},[2835],{"type":31,"value":2836},"无",{"type":26,"tag":118,"props":2838,"children":2839},{},[2840],{"type":31,"value":2841},"过度依赖建议",{"type":26,"tag":118,"props":2843,"children":2844},{},[2845],{"type":31,"value":2846},"范围漂移、多文件回归",{"type":26,"tag":91,"props":2848,"children":2849},{},[2850,2855,2860,2865],{"type":26,"tag":118,"props":2851,"children":2852},{},[2853],{"type":31,"value":2854},"必须搭配",{"type":26,"tag":118,"props":2856,"children":2857},{},[2858],{"type":31,"value":2859},"规范与检查",{"type":26,"tag":118,"props":2861,"children":2862},{},[2863],{"type":31,"value":2864},"代码评审",{"type":26,"tag":118,"props":2866,"children":2867},{},[2868],{"type":31,"value":2869},"闸门 + 最小回归集",{"type":26,"tag":1078,"props":2871,"children":2872},{},[],{"type":26,"tag":76,"props":2874,"children":2876},{"id":2875},"失败案例多文件看似成功实际埋雷",[2877],{"type":31,"value":2878},"失败案例：多文件“看似成功”，实际埋雷",{"type":26,"tag":27,"props":2880,"children":2881},{},[2882,2887],{"type":26,"tag":1017,"props":2883,"children":2884},{},[2885],{"type":31,"value":2886},"现象",{"type":31,"value":2888},"：AI 说“我已经把所有地方都改了”，你也接受了，结果上线后 404 或样式错位。",{"type":26,"tag":27,"props":2890,"children":2891},{},[2892,2897],{"type":26,"tag":1017,"props":2893,"children":2894},{},[2895],{"type":31,"value":2896},"复现条件",{"type":31,"value":1710},{"type":26,"tag":204,"props":2899,"children":2900},{},[2901,2906,2911],{"type":26,"tag":208,"props":2902,"children":2903},{},[2904],{"type":31,"value":2905},"你给了一个大目标（例如“把所有按钮统一成主题色”）",{"type":26,"tag":208,"props":2907,"children":2908},{},[2909],{"type":31,"value":2910},"它改了组件、样式、甚至主题配置",{"type":26,"tag":208,"props":2912,"children":2913},{},[2914],{"type":31,"value":2915},"你没有按页面模块走一遍，直接合并",{"type":26,"tag":27,"props":2917,"children":2918},{},[2919,2924],{"type":26,"tag":1017,"props":2920,"children":2921},{},[2922],{"type":31,"value":2923},"根因",{"type":31,"value":1710},{"type":26,"tag":204,"props":2926,"children":2927},{},[2928],{"type":26,"tag":208,"props":2929,"children":2930},{},[2931],{"type":31,"value":2932},"改动范围大，但验收仍按“小改动”的方式做（只看一处）",{"type":26,"tag":27,"props":2934,"children":2935},{},[2936,2941],{"type":26,"tag":1017,"props":2937,"children":2938},{},[2939],{"type":31,"value":2940},"修复",{"type":31,"value":1710},{"type":26,"tag":204,"props":2943,"children":2944},{},[2945,2950,2955],{"type":26,"tag":208,"props":2946,"children":2947},{},[2948],{"type":31,"value":2949},"强制把任务拆成“模块级目标”：Hero、Feature、Pricing、Form",{"type":26,"tag":208,"props":2951,"children":2952},{},[2953],{"type":31,"value":2954},"每个模块改完就验收一次",{"type":26,"tag":208,"props":2956,"children":2957},{},[2958],{"type":31,"value":2959},"验收通过再进入下一个模块",{"type":26,"tag":1078,"props":2961,"children":2962},{},[],{"type":26,"tag":76,"props":2964,"children":2966},{"id":2965},"faq",[2967],{"type":31,"value":2968},"FAQ",{"type":26,"tag":1404,"props":2970,"children":2972},{"id":2971},"q1我已经用了-cursor为什么还要用-copilot",[2973],{"type":31,"value":2974},"Q1：我已经用了 Cursor，为什么还要用 Copilot？",{"type":26,"tag":27,"props":2976,"children":2977},{},[2978],{"type":31,"value":2979},"因为“补全”这种高频低风险任务，Copilot 的交互成本更低；Cursor 更适合需要解释与约束的改动。",{"type":26,"tag":1404,"props":2981,"children":2983},{"id":2982},"q2什么时候应该完全不用-ai",[2984],{"type":31,"value":2985},"Q2：什么时候应该完全不用 AI？",{"type":26,"tag":27,"props":2987,"children":2988},{},[2989],{"type":31,"value":2990},"当你无法定义验收标准时。比如“更高级”“更好看”这种目标，先做信息结构与设计规则，再让 AI 帮你落地局部。",{"type":26,"tag":1078,"props":2992,"children":2993},{},[],{"type":26,"tag":76,"props":2995,"children":2997},{"id":2996},"延伸阅读",[2998],{"type":31,"value":2996},{"type":26,"tag":204,"props":3000,"children":3001},{},[3002,3011,3020,3029],{"type":26,"tag":208,"props":3003,"children":3004},{},[3005,3007],{"type":31,"value":3006},"Cursor 入门：",{"type":26,"tag":44,"props":3008,"children":3009},{"href":1051},[3010],{"type":31,"value":1054},{"type":26,"tag":208,"props":3012,"children":3013},{},[3014,3016],{"type":31,"value":3015},"Cursor 进阶：",{"type":26,"tag":44,"props":3017,"children":3018},{"href":1062},[3019],{"type":31,"value":1065},{"type":26,"tag":208,"props":3021,"children":3022},{},[3023,3025],{"type":31,"value":3024},"规则配置：",{"type":26,"tag":44,"props":3026,"children":3027},{"href":1073},[3028],{"type":31,"value":1076},{"type":26,"tag":208,"props":3030,"children":3031},{},[3032,3034],{"type":31,"value":3033},"Copilot 实战：",{"type":26,"tag":44,"props":3035,"children":3037},{"href":3036},"/topics/ai/github-copilot-tips",[3038],{"type":31,"value":3039},"GitHub Copilot 实用技巧",{"title":7,"searchDepth":942,"depth":942,"links":3041},[3042,3043,3044,3049,3055,3056,3057,3061],{"id":2188,"depth":945,"text":2191},{"id":2238,"depth":945,"text":2241},{"id":2480,"depth":945,"text":2483,"children":3045},[3046,3047,3048],{"id":2486,"depth":942,"text":2489},{"id":2523,"depth":942,"text":2526},{"id":2567,"depth":942,"text":2570},{"id":2599,"depth":945,"text":2602,"children":3050},[3051,3052,3053,3054],{"id":2610,"depth":942,"text":2613},{"id":2654,"depth":942,"text":2657},{"id":2691,"depth":942,"text":2694},{"id":2709,"depth":942,"text":2712},{"id":2741,"depth":945,"text":2744},{"id":2875,"depth":945,"text":2878},{"id":2965,"depth":945,"text":2968,"children":3058},[3059,3060],{"id":2971,"depth":942,"text":2974},{"id":2982,"depth":942,"text":2985},{"id":2996,"depth":945,"text":2996},"content:topics:ai:cursor-vs-copilot-vscode-workflow.md","topics/ai/cursor-vs-copilot-vscode-workflow.md","topics/ai/cursor-vs-copilot-vscode-workflow",{"_path":3066,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3067,"description":3068,"date":3069,"topic":5,"author":11,"tags":3070,"image":3075,"featured":818,"readingTime":2129,"body":3076,"_type":955,"_id":3724,"_source":957,"_file":3725,"_stem":3726,"_extension":960},"/topics/ai/ai-debugging-troubleshooting-guide","AI 辅助调试与问题排查：让 AI 成为你的调试搭档","深入探讨如何利用 AI 工具提升调试效率，包括错误信息分析、日志解读、性能问题定位、复杂 bug 排查等实战场景，构建 AI 驱动的调试工作流。","2026-01-18",[3071,3072,3073,972,3074],"AI 调试","问题排查","Debug","错误处理","/images/topics/ai/ai-debugging-guide.jpg",{"type":23,"children":3077,"toc":3695},[3078,3084,3090,3095,3100,3105,3111,3117,3122,3130,3158,3166,3189,3195,3205,3214,3222,3230,3263,3271,3301,3314,3322,3327,3335,3343,3354,3360,3368,3379,3387,3396,3402,3408,3413,3422,3428,3433,3442,3448,3454,3463,3469,3478,3484,3495,3501,3507,3516,3522,3531,3537,3543,3551,3557,3566,3574,3582,3585,3591,3596,3615,3627,3630,3636,3641,3650,3655,3658,3664,3669,3687],{"type":26,"tag":76,"props":3079,"children":3081},{"id":3080},"ai-辅助调试与问题排查",[3082],{"type":31,"value":3083},"AI 辅助调试与问题排查",{"type":26,"tag":76,"props":3085,"children":3087},{"id":3086},"引言调试的痛与-ai-的解药",[3088],{"type":31,"value":3089},"引言：调试的痛与 AI 的解药",{"type":26,"tag":27,"props":3091,"children":3092},{},[3093],{"type":31,"value":3094},"调试是每个程序员的日常，也是最消耗时间和精力的工作之一。我们都有过这样的经历：盯着一个莫名其妙的错误信息，翻遍 Stack Overflow，尝试各种方案，几个小时后才发现是一个愚蠢的拼写错误。",{"type":26,"tag":27,"props":3096,"children":3097},{},[3098],{"type":31,"value":3099},"AI 工具的出现，正在改变调试的方式。不是替代你的思考，而是加速你的分析过程——帮你快速理解错误、缩小排查范围、验证假设。",{"type":26,"tag":27,"props":3101,"children":3102},{},[3103],{"type":31,"value":3104},"这篇文章分享我在实际项目中使用 AI 辅助调试的经验和方法论。",{"type":26,"tag":76,"props":3106,"children":3108},{"id":3107},"第一部分建立-ai-调试的思维模型",[3109],{"type":31,"value":3110},"第一部分：建立 AI 调试的思维模型",{"type":26,"tag":1404,"props":3112,"children":3114},{"id":3113},"_11-ai-在调试中的角色",[3115],{"type":31,"value":3116},"1.1 AI 在调试中的角色",{"type":26,"tag":27,"props":3118,"children":3119},{},[3120],{"type":31,"value":3121},"把 AI 想象成一个经验丰富但不了解你项目的高级工程师。它：",{"type":26,"tag":27,"props":3123,"children":3124},{},[3125],{"type":26,"tag":1017,"props":3126,"children":3127},{},[3128],{"type":31,"value":3129},"擅长的事情：",{"type":26,"tag":204,"props":3131,"children":3132},{},[3133,3138,3143,3148,3153],{"type":26,"tag":208,"props":3134,"children":3135},{},[3136],{"type":31,"value":3137},"解读错误信息的含义",{"type":26,"tag":208,"props":3139,"children":3140},{},[3141],{"type":31,"value":3142},"提供可能的原因列表",{"type":26,"tag":208,"props":3144,"children":3145},{},[3146],{"type":31,"value":3147},"给出排查方向建议",{"type":26,"tag":208,"props":3149,"children":3150},{},[3151],{"type":31,"value":3152},"解释复杂的技术概念",{"type":26,"tag":208,"props":3154,"children":3155},{},[3156],{"type":31,"value":3157},"生成调试代码片段",{"type":26,"tag":27,"props":3159,"children":3160},{},[3161],{"type":26,"tag":1017,"props":3162,"children":3163},{},[3164],{"type":31,"value":3165},"不擅长的事情：",{"type":26,"tag":204,"props":3167,"children":3168},{},[3169,3174,3179,3184],{"type":26,"tag":208,"props":3170,"children":3171},{},[3172],{"type":31,"value":3173},"了解你的业务逻辑",{"type":26,"tag":208,"props":3175,"children":3176},{},[3177],{"type":31,"value":3178},"知道你的代码历史",{"type":26,"tag":208,"props":3180,"children":3181},{},[3182],{"type":31,"value":3183},"理解项目特定的约定",{"type":26,"tag":208,"props":3185,"children":3186},{},[3187],{"type":31,"value":3188},"做出架构级判断",{"type":26,"tag":1404,"props":3190,"children":3192},{"id":3191},"_12-有效提问的结构",[3193],{"type":31,"value":3194},"1.2 有效提问的结构",{"type":26,"tag":245,"props":3196,"children":3200},{"code":3197,"language":955,"meta":7,"className":3198},"## 高效的调试提问模板\n\n**问题描述**\n[简洁描述遇到的问题]\n\n**错误信息**\n",[3199],"language-markdown",[3201],{"type":26,"tag":253,"props":3202,"children":3203},{"__ignoreMap":7},[3204],{"type":31,"value":3197},{"type":26,"tag":27,"props":3206,"children":3207},{},[3208],{"type":26,"tag":3209,"props":3210,"children":3211},"span",{},[3212],{"type":31,"value":3213},"完整的错误信息，不要截断",{"type":26,"tag":245,"props":3215,"children":3217},{"code":3216},"\n**相关代码**\n```javascript\n[精简但完整的相关代码]\n",[3218],{"type":26,"tag":253,"props":3219,"children":3220},{"__ignoreMap":7},[3221],{"type":31,"value":3216},{"type":26,"tag":27,"props":3223,"children":3224},{},[3225],{"type":26,"tag":1017,"props":3226,"children":3227},{},[3228],{"type":31,"value":3229},"环境信息",{"type":26,"tag":204,"props":3231,"children":3232},{},[3233,3243,3253],{"type":26,"tag":208,"props":3234,"children":3235},{},[3236,3238],{"type":31,"value":3237},"运行环境：",{"type":26,"tag":3209,"props":3239,"children":3240},{},[3241],{"type":31,"value":3242},"Node 版本/浏览器版本",{"type":26,"tag":208,"props":3244,"children":3245},{},[3246,3248],{"type":31,"value":3247},"框架版本：",{"type":26,"tag":3209,"props":3249,"children":3250},{},[3251],{"type":31,"value":3252},"相关框架版本",{"type":26,"tag":208,"props":3254,"children":3255},{},[3256,3258],{"type":31,"value":3257},"操作系统：",{"type":26,"tag":3209,"props":3259,"children":3260},{},[3261],{"type":31,"value":3262},"如果相关",{"type":26,"tag":27,"props":3264,"children":3265},{},[3266],{"type":26,"tag":1017,"props":3267,"children":3268},{},[3269],{"type":31,"value":3270},"已尝试的方案",{"type":26,"tag":204,"props":3272,"children":3273},{},[3274,3288],{"type":26,"tag":208,"props":3275,"children":3276},{},[3277,3282,3283],{"type":26,"tag":3209,"props":3278,"children":3279},{},[3280],{"type":31,"value":3281},"方案1",{"type":31,"value":1710},{"type":26,"tag":3209,"props":3284,"children":3285},{},[3286],{"type":31,"value":3287},"结果",{"type":26,"tag":208,"props":3289,"children":3290},{},[3291,3296,3297],{"type":26,"tag":3209,"props":3292,"children":3293},{},[3294],{"type":31,"value":3295},"方案2",{"type":31,"value":1710},{"type":26,"tag":3209,"props":3298,"children":3299},{},[3300],{"type":31,"value":3287},{"type":26,"tag":27,"props":3302,"children":3303},{},[3304,3309],{"type":26,"tag":1017,"props":3305,"children":3306},{},[3307],{"type":31,"value":3308},"期望的结果",{"type":26,"tag":3209,"props":3310,"children":3311},{},[3312],{"type":31,"value":3313},"描述期望的行为",{"type":26,"tag":245,"props":3315,"children":3317},{"code":3316},"\n### 1.3 分级调试策略\n\n",[3318],{"type":26,"tag":253,"props":3319,"children":3320},{"__ignoreMap":7},[3321],{"type":31,"value":3316},{"type":26,"tag":27,"props":3323,"children":3324},{},[3325],{"type":31,"value":3326},"┌───────────────────────────────────────────────────────────┐\n│                    AI 辅助调试决策树                        │\n├───────────────────────────────────────────────────────────┤\n│                                                           │\n│  Level 1：简单错误（5分钟内解决）                           │\n│  ├── 语法错误、拼写错误                                    │\n│  ├── 方法：直接复制错误信息给 AI                           │\n│  └── 工具：Copilot Chat / ChatGPT                        │\n│                                                           │\n│  Level 2：中等复杂度（30分钟内解决）                        │\n│  ├── 类型错误、逻辑错误、API 使用错误                      │\n│  ├── 方法：提供错误信息 + 相关代码 + 上下文                 │\n│  └── 工具：Cursor Chat / Claude                          │\n│                                                           │\n│  Level 3：复杂问题（需要深入分析）                          │\n│  ├── 竞态条件、内存泄漏、性能问题                          │\n│  ├── 方法：详细描述场景 + 提供多个文件 + 讨论               │\n│  └── 工具：Cursor Composer / 专门的 AI 会话                │\n│                                                           │\n│  Level 4：架构级问题                                       │\n│  ├── 设计缺陷、技术债务                                    │\n│  ├── 方法：AI 辅助分析 + 人工判断                          │\n│  └── 工具：与团队讨论 + AI 作为顾问                        │\n│                                                           │\n└───────────────────────────────────────────────────────────┘",{"type":26,"tag":245,"props":3328,"children":3330},{"code":3329},"\n## 第二部分：错误信息分析\n\n### 2.1 前端错误分析\n\n**场景 1：React 错误边界触发**\n\n```typescript\n// 错误信息：\n// Error: Hydration failed because the initial UI does not match \n// what was rendered on the server.\n\n// 提问方式：\n/**\n * 我在 Next.js 14 App Router 项目中遇到这个错误：\n * \n * Error: Hydration failed because the initial UI does not match \n * what was rendered on the server.\n * \n * 相关代码：\n */\nfunction UserStatus() {\n  const [isLoggedIn, setIsLoggedIn] = useState(false);\n  \n  useEffect(() => {\n    setIsLoggedIn(localStorage.getItem('token') !== null);\n  }, []);\n  \n  return \u003Cdiv>{isLoggedIn ? '已登录' : '未登录'}\u003C/div>;\n}\n\n// AI 会分析出：\n// 1. 服务端渲染时 localStorage 不可用，默认 false\n// 2. 客户端 hydration 时可能是 true\n// 3. 导致服务端和客户端渲染结果不一致\n\n// AI 建议的解决方案：\nfunction UserStatus() {\n  const [isLoggedIn, setIsLoggedIn] = useState\u003Cboolean | null>(null);\n  \n  useEffect(() => {\n    setIsLoggedIn(localStorage.getItem('token') !== null);\n  }, []);\n  \n  // 初始状态显示加载中，避免 hydration 不匹配\n  if (isLoggedIn === null) {\n    return \u003Cdiv>加载中...\u003C/div>;\n  }\n  \n  return \u003Cdiv>{isLoggedIn ? '已登录' : '未登录'}\u003C/div>;\n}\n",[3331],{"type":26,"tag":253,"props":3332,"children":3333},{"__ignoreMap":7},[3334],{"type":31,"value":3329},{"type":26,"tag":27,"props":3336,"children":3337},{},[3338],{"type":26,"tag":1017,"props":3339,"children":3340},{},[3341],{"type":31,"value":3342},"场景 2：Vue 响应式警告",{"type":26,"tag":245,"props":3344,"children":3349},{"code":3345,"language":3346,"meta":7,"className":3347},"// 警告信息：\n// [Vue warn]: Property \"xxx\" was accessed during render but is not \n// defined on instance.\n\n// 提问方式：\n/**\n * Vue 3 项目中出现这个警告：\n * [Vue warn]: Property \"userInfo\" was accessed during render \n * but is not defined on instance.\n * \n * 组件代码：\n */\n\u003Ctemplate>\n  \u003Cdiv>{{ userInfo.name }}\u003C/div>\n\u003C/template>\n\n\u003Cscript setup>\nconst { data: userInfo } = await useFetch('/api/user');\n\u003C/script>\n\n// AI 分析：\n// 1. useFetch 是异步的，初始渲染时 userInfo 可能是 undefined\n// 2. 直接访问 userInfo.name 会报错\n\n// AI 建议：\n\u003Ctemplate>\n  \u003Cdiv v-if=\"userInfo\">{{ userInfo.name }}\u003C/div>\n  \u003Cdiv v-else>加载中...\u003C/div>\n\u003C/template>\n\n\u003Cscript setup>\nconst { data: userInfo, pending } = await useFetch('/api/user');\n\u003C/script>\n","typescript",[3348],"language-typescript",[3350],{"type":26,"tag":253,"props":3351,"children":3352},{"__ignoreMap":7},[3353],{"type":31,"value":3345},{"type":26,"tag":1404,"props":3355,"children":3357},{"id":3356},"_22-后端错误分析",[3358],{"type":31,"value":3359},"2.2 后端错误分析",{"type":26,"tag":27,"props":3361,"children":3362},{},[3363],{"type":26,"tag":1017,"props":3364,"children":3365},{},[3366],{"type":31,"value":3367},"场景 1：Node.js 内存问题",{"type":26,"tag":245,"props":3369,"children":3374},{"code":3370,"language":3371,"meta":7,"className":3372},"// 错误信息：\n// FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - \n// JavaScript heap out of memory\n\n// 提问方式（包含上下文）：\n/**\n * Node.js 服务运行几小时后崩溃，错误信息：\n * FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - \n * JavaScript heap out of memory\n * \n * 服务功能：处理 CSV 文件上传，每次约 100MB\n * \n * 处理代码：\n */\nasync function processCSV(filePath) {\n  const content = fs.readFileSync(filePath, 'utf-8');\n  const rows = content.split('\\n');\n  const results = [];\n  \n  for (const row of rows) {\n    const processed = await processRow(row);\n    results.push(processed);\n  }\n  \n  return results;\n}\n\n// AI 分析会指出：\n// 1. 一次性读取整个文件到内存\n// 2. 所有处理结果累积在 results 数组\n// 3. 建议使用流式处理\n\n// AI 提供的优化方案：\nconst { createReadStream } = require('fs');\nconst { createInterface } = require('readline');\n\nasync function processCSVStream(filePath, onRow) {\n  const fileStream = createReadStream(filePath);\n  const rl = createInterface({\n    input: fileStream,\n    crlfDelay: Infinity\n  });\n  \n  let count = 0;\n  for await (const line of rl) {\n    await onRow(line);\n    count++;\n    \n    // 每处理 1000 行，给 GC 机会运行\n    if (count % 1000 === 0) {\n      await new Promise(r => setImmediate(r));\n    }\n  }\n}\n","javascript",[3373],"language-javascript",[3375],{"type":26,"tag":253,"props":3376,"children":3377},{"__ignoreMap":7},[3378],{"type":31,"value":3370},{"type":26,"tag":27,"props":3380,"children":3381},{},[3382],{"type":26,"tag":1017,"props":3383,"children":3384},{},[3385],{"type":31,"value":3386},"场景 2：数据库连接问题",{"type":26,"tag":245,"props":3388,"children":3391},{"code":3389,"language":3346,"meta":7,"className":3390},"// 错误信息：\n// Error: Connection pool exhausted - \n// max connections (10) already in use\n\n// 提问方式：\n/**\n * PostgreSQL 连接池耗尽错误，高并发时出现：\n * Error: Connection pool exhausted\n * \n * 当前配置：\n * - max connections: 10\n * - 并发请求: 约 100/秒\n * \n * 数据库调用代码：\n */\nasync function getUserData(userId: string) {\n  const client = await pool.connect();\n  try {\n    const user = await client.query('SELECT * FROM users WHERE id = $1', [userId]);\n    const orders = await client.query('SELECT * FROM orders WHERE user_id = $1', [userId]);\n    const payments = await client.query('SELECT * FROM payments WHERE user_id = $1', [userId]);\n    return { user: user.rows[0], orders: orders.rows, payments: payments.rows };\n  } finally {\n    client.release();\n  }\n}\n\n// AI 会分析出多个可能原因并给出综合方案\n",[3348],[3392],{"type":26,"tag":253,"props":3393,"children":3394},{"__ignoreMap":7},[3395],{"type":31,"value":3389},{"type":26,"tag":76,"props":3397,"children":3399},{"id":3398},"第三部分日志分析与问题定位",[3400],{"type":31,"value":3401},"第三部分：日志分析与问题定位",{"type":26,"tag":1404,"props":3403,"children":3405},{"id":3404},"_31-结构化日志分析",[3406],{"type":31,"value":3407},"3.1 结构化日志分析",{"type":26,"tag":27,"props":3409,"children":3410},{},[3411],{"type":31,"value":3412},"当面对大量日志时，让 AI 帮你快速定位问题：",{"type":26,"tag":245,"props":3414,"children":3417},{"code":3415,"language":3371,"meta":7,"className":3416},"// 提问示例：\n/**\n * 分析以下日志，找出导致请求失败的原因：\n * \n * 日志片段：\n */\nconst logs = `\n2024-01-15 10:23:45.123 INFO  [req-abc123] 收到请求 POST /api/order\n2024-01-15 10:23:45.125 DEBUG [req-abc123] 用户认证通过 userId=u001\n2024-01-15 10:23:45.130 DEBUG [req-abc123] 开始库存检查 productId=p001\n2024-01-15 10:23:45.145 DEBUG [req-abc123] 库存检查通过 available=50\n2024-01-15 10:23:45.150 DEBUG [req-abc123] 开始创建订单\n2024-01-15 10:23:45.200 DEBUG [req-abc123] 数据库连接获取成功\n2024-01-15 10:23:45.250 ERROR [req-abc123] 订单创建失败 error=\"deadlock detected\"\n2024-01-15 10:23:45.251 WARN  [req-abc123] 事务回滚\n2024-01-15 10:23:45.255 INFO  [req-abc123] 响应 500 耗时 132ms\n`;\n\n// AI 分析结果会包括：\n// 1. 问题定位：数据库死锁\n// 2. 可能原因：并发订单创建导致锁竞争\n// 3. 排查建议：检查事务隔离级别、锁顺序\n",[3373],[3418],{"type":26,"tag":253,"props":3419,"children":3420},{"__ignoreMap":7},[3421],{"type":31,"value":3415},{"type":26,"tag":1404,"props":3423,"children":3425},{"id":3424},"_32-创建调试日志",[3426],{"type":31,"value":3427},"3.2 创建调试日志",{"type":26,"tag":27,"props":3429,"children":3430},{},[3431],{"type":31,"value":3432},"让 AI 帮你生成调试用的日志代码：",{"type":26,"tag":245,"props":3434,"children":3437},{"code":3435,"language":3346,"meta":7,"className":3436},"// 请求：\n// \"为这个函数添加详细的调试日志，包括入参、关键步骤、耗时和结果\"\n\n// 原代码：\nasync function processOrder(order: Order): Promise\u003COrderResult> {\n  const inventory = await checkInventory(order.items);\n  const payment = await processPayment(order.userId, order.total);\n  const result = await createOrder(order, payment.transactionId);\n  return result;\n}\n\n// AI 生成的带日志版本：\nasync function processOrder(order: Order): Promise\u003COrderResult> {\n  const requestId = generateRequestId();\n  const startTime = performance.now();\n  \n  logger.info({\n    requestId,\n    event: 'order_processing_start',\n    orderId: order.id,\n    userId: order.userId,\n    itemCount: order.items.length,\n    total: order.total\n  });\n  \n  try {\n    // 库存检查\n    const inventoryStart = performance.now();\n    const inventory = await checkInventory(order.items);\n    logger.debug({\n      requestId,\n      event: 'inventory_check_complete',\n      duration: performance.now() - inventoryStart,\n      available: inventory.allAvailable\n    });\n    \n    // 支付处理\n    const paymentStart = performance.now();\n    const payment = await processPayment(order.userId, order.total);\n    logger.debug({\n      requestId,\n      event: 'payment_complete',\n      duration: performance.now() - paymentStart,\n      transactionId: payment.transactionId\n    });\n    \n    // 创建订单\n    const createStart = performance.now();\n    const result = await createOrder(order, payment.transactionId);\n    logger.debug({\n      requestId,\n      event: 'order_created',\n      duration: performance.now() - createStart,\n      resultOrderId: result.orderId\n    });\n    \n    logger.info({\n      requestId,\n      event: 'order_processing_complete',\n      duration: performance.now() - startTime,\n      success: true\n    });\n    \n    return result;\n  } catch (error) {\n    logger.error({\n      requestId,\n      event: 'order_processing_failed',\n      duration: performance.now() - startTime,\n      error: error.message,\n      stack: error.stack\n    });\n    throw error;\n  }\n}\n",[3348],[3438],{"type":26,"tag":253,"props":3439,"children":3440},{"__ignoreMap":7},[3441],{"type":31,"value":3435},{"type":26,"tag":76,"props":3443,"children":3445},{"id":3444},"第四部分性能问题排查",[3446],{"type":31,"value":3447},"第四部分：性能问题排查",{"type":26,"tag":1404,"props":3449,"children":3451},{"id":3450},"_41-前端性能分析",[3452],{"type":31,"value":3453},"4.1 前端性能分析",{"type":26,"tag":245,"props":3455,"children":3458},{"code":3456,"language":3346,"meta":7,"className":3457},"// 场景：页面加载慢，需要分析原因\n\n// 提问方式：\n/**\n * 页面首屏加载需要 5 秒，以下是 Performance API 数据，\n * 请分析性能瓶颈：\n */\nconst performanceData = {\n  // Navigation Timing\n  dns: 50,           // DNS 查询\n  tcp: 100,          // TCP 连接\n  ttfb: 800,         // 首字节时间\n  download: 200,     // 文档下载\n  domParsing: 300,   // DOM 解析\n  domContentLoaded: 1500,\n  load: 5000,\n  \n  // Resource Timing (主要资源)\n  resources: [\n    { name: 'main.js', size: '2.5MB', duration: 1200 },\n    { name: 'vendor.js', size: '1.8MB', duration: 900 },\n    { name: 'styles.css', size: '500KB', duration: 300 },\n    { name: 'hero-image.jpg', size: '3MB', duration: 1500 },\n  ],\n  \n  // Long Tasks\n  longTasks: [\n    { startTime: 1600, duration: 800, name: 'script-evaluation' },\n    { startTime: 2500, duration: 400, name: 'layout' }\n  ]\n};\n\n// AI 会分析出：\n// 1. JS bundle 过大（4.3MB），需要代码分割\n// 2. 图片未优化（3MB 的 hero 图片）\n// 3. 存在长任务阻塞主线程\n// 并给出具体优化建议\n",[3348],[3459],{"type":26,"tag":253,"props":3460,"children":3461},{"__ignoreMap":7},[3462],{"type":31,"value":3456},{"type":26,"tag":1404,"props":3464,"children":3466},{"id":3465},"_42-内存泄漏排查",[3467],{"type":31,"value":3468},"4.2 内存泄漏排查",{"type":26,"tag":245,"props":3470,"children":3473},{"code":3471,"language":3346,"meta":7,"className":3472},"// 场景：应用运行一段时间后变卡\n\n// 提问方式：\n/**\n * React 应用运行一段时间后内存持续增长，以下是 Heap Snapshot 对比：\n * \n * 初始状态：50MB\n * 运行 1 小时后：150MB\n * 运行 2 小时后：280MB\n * \n * Retained objects 增长最快的：\n * - (closure) - 增长 50MB\n * - HTMLDivElement - 增长 30MB\n * - Array - 增长 20MB\n * \n * 可疑代码：\n */\nfunction DataDashboard() {\n  const [data, setData] = useState([]);\n  const chartRef = useRef(null);\n  \n  useEffect(() => {\n    // 每秒刷新数据\n    const interval = setInterval(async () => {\n      const newData = await fetchLatestData();\n      setData(prev => [...prev, ...newData]);  // 数据不断累积\n    }, 1000);\n    \n    // 初始化图表\n    const chart = new Chart(chartRef.current, {\n      // 配置...\n    });\n    \n    // 没有 cleanup！\n  }, []);\n  \n  return \u003Ccanvas ref={chartRef} />;\n}\n\n// AI 会指出：\n// 1. interval 没有清理\n// 2. Chart 实例没有销毁\n// 3. data 无限增长\n// 并提供修复代码\n",[3348],[3474],{"type":26,"tag":253,"props":3475,"children":3476},{"__ignoreMap":7},[3477],{"type":31,"value":3471},{"type":26,"tag":1404,"props":3479,"children":3481},{"id":3480},"_43-数据库查询优化",[3482],{"type":31,"value":3483},"4.3 数据库查询优化",{"type":26,"tag":245,"props":3485,"children":3490},{"code":3486,"language":3487,"meta":7,"className":3488},"-- 场景：查询很慢，让 AI 分析执行计划\n\n-- 提问方式：\n-- 以下查询在数据量大时很慢（orders 表 1000 万行），\n-- 执行计划如下，请分析并优化：\n\nEXPLAIN ANALYZE\nSELECT o.*, u.name, u.email\nFROM orders o\nJOIN users u ON o.user_id = u.id\nWHERE o.status = 'pending'\n  AND o.created_at > '2024-01-01'\nORDER BY o.created_at DESC\nLIMIT 20;\n\n-- 执行计划：\n/*\nSort  (cost=156847.23..157847.23 rows=400000 width=250)\n  Sort Key: o.created_at DESC\n  ->  Hash Join  (cost=1500.00..89847.23 rows=400000 width=250)\n        Hash Cond: (o.user_id = u.id)\n        ->  Seq Scan on orders o  (cost=0.00..85000.00 rows=400000)\n              Filter: ((status = 'pending') AND (created_at > '2024-01-01'))\n        ->  Hash  (cost=1000.00..1000.00 rows=50000 width=100)\n              ->  Seq Scan on users u  (cost=0.00..1000.00 rows=50000)\nPlanning Time: 0.5 ms\nExecution Time: 3500 ms\n*/\n\n-- AI 会分析出问题并建议：\n-- 1. orders 表全表扫描 - 需要复合索引\n-- 2. 建议创建索引：\nCREATE INDEX idx_orders_status_created ON orders(status, created_at DESC);\n\n-- 3. 如果 status 选择性不高，考虑部分索引：\nCREATE INDEX idx_orders_pending ON orders(created_at DESC) \nWHERE status = 'pending';\n","sql",[3489],"language-sql",[3491],{"type":26,"tag":253,"props":3492,"children":3493},{"__ignoreMap":7},[3494],{"type":31,"value":3486},{"type":26,"tag":76,"props":3496,"children":3498},{"id":3497},"第五部分复杂-bug-排查",[3499],{"type":31,"value":3500},"第五部分：复杂 Bug 排查",{"type":26,"tag":1404,"props":3502,"children":3504},{"id":3503},"_51-竞态条件",[3505],{"type":31,"value":3506},"5.1 竞态条件",{"type":26,"tag":245,"props":3508,"children":3511},{"code":3509,"language":3346,"meta":7,"className":3510},"// 场景：偶发的数据不一致问题\n\n// 提问方式：\n/**\n * 用户反馈偶尔看到错误的账户余额，但刷新后正常。\n * 怀疑是竞态条件，以下是相关代码：\n */\nasync function updateBalance(userId: string, amount: number) {\n  // 读取当前余额\n  const user = await db.users.findOne({ id: userId });\n  const newBalance = user.balance + amount;\n  \n  // 更新余额\n  await db.users.update({ id: userId }, { balance: newBalance });\n  \n  // 记录交易\n  await db.transactions.create({\n    userId,\n    amount,\n    balanceAfter: newBalance,\n    createdAt: new Date()\n  });\n  \n  return newBalance;\n}\n\n// 并发调用场景：\n// 用户同时发起两笔交易：+100 和 -50\n// 期望结果：原余额 1000 → 1050\n// 实际可能：原余额 1000 → 1100 或 950\n\n// AI 会分析竞态条件并提供解决方案：\nasync function updateBalanceAtomic(userId: string, amount: number) {\n  // 方案 1：使用数据库原子操作\n  const result = await db.users.findOneAndUpdate(\n    { id: userId },\n    { $inc: { balance: amount } },\n    { returnDocument: 'after' }\n  );\n  \n  await db.transactions.create({\n    userId,\n    amount,\n    balanceAfter: result.balance,\n    createdAt: new Date()\n  });\n  \n  return result.balance;\n}\n\n// 方案 2：使用乐观锁\nasync function updateBalanceOptimistic(userId: string, amount: number) {\n  const maxRetries = 3;\n  \n  for (let i = 0; i \u003C maxRetries; i++) {\n    const user = await db.users.findOne({ id: userId });\n    const newBalance = user.balance + amount;\n    \n    const updated = await db.users.updateOne(\n      { id: userId, version: user.version },\n      { balance: newBalance, version: user.version + 1 }\n    );\n    \n    if (updated.modifiedCount === 1) {\n      await db.transactions.create({...});\n      return newBalance;\n    }\n    \n    // 版本冲突，重试\n    await sleep(10 * (i + 1));\n  }\n  \n  throw new Error('Update failed after retries');\n}\n",[3348],[3512],{"type":26,"tag":253,"props":3513,"children":3514},{"__ignoreMap":7},[3515],{"type":31,"value":3509},{"type":26,"tag":1404,"props":3517,"children":3519},{"id":3518},"_52-分布式系统问题",[3520],{"type":31,"value":3521},"5.2 分布式系统问题",{"type":26,"tag":245,"props":3523,"children":3526},{"code":3524,"language":3346,"meta":7,"className":3525},"// 场景：微服务间的数据不一致\n\n// 提问方式：\n/**\n * 订单服务和库存服务偶尔出现数据不一致：\n * - 订单显示已创建\n * - 库存未扣减\n * \n * 当前流程：\n */\n// Order Service\nasync function createOrder(orderData) {\n  // 1. 调用库存服务扣减库存\n  await inventoryService.deduct(orderData.items);\n  \n  // 2. 创建订单\n  const order = await orderRepository.create(orderData);\n  \n  // 3. 发送订单创建事件\n  await eventBus.publish('order.created', order);\n  \n  return order;\n}\n\n// 问题分析：如果步骤 2 或 3 失败，库存已经扣减但订单未创建\n\n// AI 会建议使用 Saga 模式或事务发件箱模式\n",[3348],[3527],{"type":26,"tag":253,"props":3528,"children":3529},{"__ignoreMap":7},[3530],{"type":31,"value":3524},{"type":26,"tag":76,"props":3532,"children":3534},{"id":3533},"第六部分ai-调试工作流",[3535],{"type":31,"value":3536},"第六部分：AI 调试工作流",{"type":26,"tag":1404,"props":3538,"children":3540},{"id":3539},"_61-我的调试流程",[3541],{"type":31,"value":3542},"6.1 我的调试流程",{"type":26,"tag":245,"props":3544,"children":3546},{"code":3545},"┌────────────────────────────────────────────────────────────┐\n│                    AI 辅助调试工作流                         │\n├────────────────────────────────────────────────────────────┤\n│                                                            │\n│  Step 1: 问题收集                                          │\n│  ├── 复制完整错误信息                                       │\n│  ├── 截图相关日志                                          │\n│  └── 记录复现步骤                                          │\n│                                                            │\n│  Step 2: 快速分析                                          │\n│  ├── 将错误信息发给 AI                                      │\n│  ├── 获取可能原因列表                                       │\n│  └── 评估哪些最可能                                         │\n│                                                            │\n│  Step 3: 深入调查                                          │\n│  ├── 根据 AI 建议添加日志/断点                              │\n│  ├── 收集更多信息                                          │\n│  └── 再次询问 AI（带新信息）                                │\n│                                                            │\n│  Step 4: 验证修复                                          │\n│  ├── AI 生成修复代码                                        │\n│  ├── 人工审查确认                                          │\n│  └── 测试验证                                               │\n│                                                            │\n│  Step 5: 预防措施                                          │\n│  ├── AI 建议类似问题的预防方法                              │\n│  ├── 添加相关测试用例                                       │\n│  └── 更新文档/知识库                                        │\n│                                                            │\n└────────────────────────────────────────────────────────────┘\n",[3547],{"type":26,"tag":253,"props":3548,"children":3549},{"__ignoreMap":7},[3550],{"type":31,"value":3545},{"type":26,"tag":1404,"props":3552,"children":3554},{"id":3553},"_62-调试对话模板",[3555],{"type":31,"value":3556},"6.2 调试对话模板",{"type":26,"tag":245,"props":3558,"children":3561},{"code":3559,"language":955,"meta":7,"className":3560},"## 第一轮：问题描述\n\n我遇到了一个问题：[简述问题]\n\n错误信息：\n",[3199],[3562],{"type":26,"tag":253,"props":3563,"children":3564},{"__ignoreMap":7},[3565],{"type":31,"value":3559},{"type":26,"tag":27,"props":3567,"children":3568},{},[3569],{"type":26,"tag":3209,"props":3570,"children":3571},{},[3572],{"type":31,"value":3573},"粘贴完整错误",{"type":26,"tag":245,"props":3575,"children":3577},{"code":3576},"\n相关代码：\n```javascript\n[粘贴代码]\n",[3578],{"type":26,"tag":253,"props":3579,"children":3580},{"__ignoreMap":7},[3581],{"type":31,"value":3576},{"type":26,"tag":1078,"props":3583,"children":3584},{},[],{"type":26,"tag":76,"props":3586,"children":3588},{"id":3587},"第二轮补充信息",[3589],{"type":31,"value":3590},"第二轮：补充信息",{"type":26,"tag":27,"props":3592,"children":3593},{},[3594],{"type":31,"value":3595},"根据你的建议，我添加了日志，发现：",{"type":26,"tag":204,"props":3597,"children":3598},{},[3599,3607],{"type":26,"tag":208,"props":3600,"children":3601},{},[3602],{"type":26,"tag":3209,"props":3603,"children":3604},{},[3605],{"type":31,"value":3606},"发现 1",{"type":26,"tag":208,"props":3608,"children":3609},{},[3610],{"type":26,"tag":3209,"props":3611,"children":3612},{},[3613],{"type":31,"value":3614},"发现 2",{"type":26,"tag":27,"props":3616,"children":3617},{},[3618,3620,3625],{"type":31,"value":3619},"这是否说明问题出在 ",{"type":26,"tag":3209,"props":3621,"children":3622},{},[3623],{"type":31,"value":3624},"你的猜测",{"type":31,"value":3626},"？",{"type":26,"tag":1078,"props":3628,"children":3629},{},[],{"type":26,"tag":76,"props":3631,"children":3633},{"id":3632},"第三轮确认修复",[3634],{"type":31,"value":3635},"第三轮：确认修复",{"type":26,"tag":27,"props":3637,"children":3638},{},[3639],{"type":31,"value":3640},"我按照你的建议修改了代码：",{"type":26,"tag":245,"props":3642,"children":3645},{"code":3643,"language":3371,"meta":7,"className":3644},"[粘贴修改后的代码]\n",[3373],[3646],{"type":26,"tag":253,"props":3647,"children":3648},{"__ignoreMap":7},[3649],{"type":31,"value":3643},{"type":26,"tag":27,"props":3651,"children":3652},{},[3653],{"type":31,"value":3654},"请确认这个修复是否正确，以及是否有其他潜在问题。",{"type":26,"tag":1078,"props":3656,"children":3657},{},[],{"type":26,"tag":76,"props":3659,"children":3661},{"id":3660},"第四轮预防",[3662],{"type":31,"value":3663},"第四轮：预防",{"type":26,"tag":27,"props":3665,"children":3666},{},[3667],{"type":31,"value":3668},"这个问题已解决。请建议：",{"type":26,"tag":430,"props":3670,"children":3671},{},[3672,3677,3682],{"type":26,"tag":208,"props":3673,"children":3674},{},[3675],{"type":31,"value":3676},"如何防止类似问题再次发生？",{"type":26,"tag":208,"props":3678,"children":3679},{},[3680],{"type":31,"value":3681},"应该添加什么测试用例？",{"type":26,"tag":208,"props":3683,"children":3684},{},[3685],{"type":31,"value":3686},"有什么最佳实践可以参考？",{"type":26,"tag":245,"props":3688,"children":3690},{"code":3689},"\n## 结语：AI 是放大器，不是替代品\n\nAI 调试工具能够显著加速问题排查过程，但它不能替代你的思考。最有价值的能力组合是：\n\n- **你的领域知识** + **AI 的广博见识**\n- **你对项目的理解** + **AI 的分析能力**\n- **你的判断力** + **AI 的执行速度**\n\n调试的本质是假设-验证的循环。AI 帮你更快地生成假设、更高效地验证假设，但做出最终判断的还是你。\n\n学会与 AI 高效协作调试，不是依赖 AI 给你答案，而是让 AI 帮你更快地找到自己的答案。\n\n---\n\n## 参考资源\n\n- [Chrome DevTools 官方文档](https://developer.chrome.com/docs/devtools)\n- [Node.js 调试指南](https://nodejs.org/en/docs/guides/debugging-getting-started)\n- [React DevTools 使用指南](https://react.dev/learn/react-developer-tools)\n",[3691],{"type":26,"tag":253,"props":3692,"children":3693},{"__ignoreMap":7},[3694],{"type":31,"value":3689},{"title":7,"searchDepth":942,"depth":942,"links":3696},[3697,3698,3699,3704,3708,3713,3717,3721,3722,3723],{"id":3080,"depth":945,"text":3083},{"id":3086,"depth":945,"text":3089},{"id":3107,"depth":945,"text":3110,"children":3700},[3701,3702,3703],{"id":3113,"depth":942,"text":3116},{"id":3191,"depth":942,"text":3194},{"id":3356,"depth":942,"text":3359},{"id":3398,"depth":945,"text":3401,"children":3705},[3706,3707],{"id":3404,"depth":942,"text":3407},{"id":3424,"depth":942,"text":3427},{"id":3444,"depth":945,"text":3447,"children":3709},[3710,3711,3712],{"id":3450,"depth":942,"text":3453},{"id":3465,"depth":942,"text":3468},{"id":3480,"depth":942,"text":3483},{"id":3497,"depth":945,"text":3500,"children":3714},[3715,3716],{"id":3503,"depth":942,"text":3506},{"id":3518,"depth":942,"text":3521},{"id":3533,"depth":945,"text":3536,"children":3718},[3719,3720],{"id":3539,"depth":942,"text":3542},{"id":3553,"depth":942,"text":3556},{"id":3587,"depth":945,"text":3590},{"id":3632,"depth":945,"text":3635},{"id":3660,"depth":945,"text":3663},"content:topics:ai:ai-debugging-troubleshooting-guide.md","topics/ai/ai-debugging-troubleshooting-guide.md","topics/ai/ai-debugging-troubleshooting-guide",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":3728,"image":17,"imageQuery":18,"pexelsPhotoId":19,"pexelsUrl":20,"featured":6,"readingTime":21,"body":3729,"_type":955,"_id":956,"_source":957,"_file":958,"_stem":959,"_extension":960},[13,14,15,16],{"type":23,"children":3730,"toc":4475},[3731,3735,3739,3763,3767,3851,3855,3859,3863,3882,3886,3890,3894,3902,3906,3910,3914,4018,4022,4026,4034,4038,4042,4046,4065,4069,4084,4088,4096,4100,4104,4108,4131,4135,4139,4223,4227,4231,4235,4321,4325,4329,4333,4348,4352,4356,4432,4436,4440,4444],{"type":26,"tag":27,"props":3732,"children":3733},{},[3734],{"type":31,"value":32},{"type":26,"tag":27,"props":3736,"children":3737},{},[3738],{"type":31,"value":37},{"type":26,"tag":27,"props":3740,"children":3741},{},[3742,3743,3747,3748,3752,3753,3757,3758,3762],{"type":31,"value":42},{"type":26,"tag":44,"props":3744,"children":3745},{"href":46},[3746],{"type":31,"value":49},{"type":31,"value":51},{"type":26,"tag":44,"props":3749,"children":3750},{"href":54},[3751],{"type":31,"value":57},{"type":31,"value":51},{"type":26,"tag":44,"props":3754,"children":3755},{"href":61},[3756],{"type":31,"value":64},{"type":31,"value":66},{"type":26,"tag":44,"props":3759,"children":3760},{"href":69},[3761],{"type":31,"value":72},{"type":31,"value":74},{"type":26,"tag":76,"props":3764,"children":3765},{"id":78},[3766],{"type":31,"value":81},{"type":26,"tag":83,"props":3768,"children":3769},{},[3770,3788],{"type":26,"tag":87,"props":3771,"children":3772},{},[3773],{"type":26,"tag":91,"props":3774,"children":3775},{},[3776,3780,3784],{"type":26,"tag":95,"props":3777,"children":3778},{},[3779],{"type":31,"value":99},{"type":26,"tag":95,"props":3781,"children":3782},{},[3783],{"type":31,"value":104},{"type":26,"tag":95,"props":3785,"children":3786},{},[3787],{"type":31,"value":109},{"type":26,"tag":111,"props":3789,"children":3790},{},[3791,3806,3821,3836],{"type":26,"tag":91,"props":3792,"children":3793},{},[3794,3798,3802],{"type":26,"tag":118,"props":3795,"children":3796},{},[3797],{"type":31,"value":122},{"type":26,"tag":118,"props":3799,"children":3800},{},[3801],{"type":31,"value":127},{"type":26,"tag":118,"props":3803,"children":3804},{},[3805],{"type":31,"value":132},{"type":26,"tag":91,"props":3807,"children":3808},{},[3809,3813,3817],{"type":26,"tag":118,"props":3810,"children":3811},{},[3812],{"type":31,"value":140},{"type":26,"tag":118,"props":3814,"children":3815},{},[3816],{"type":31,"value":145},{"type":26,"tag":118,"props":3818,"children":3819},{},[3820],{"type":31,"value":150},{"type":26,"tag":91,"props":3822,"children":3823},{},[3824,3828,3832],{"type":26,"tag":118,"props":3825,"children":3826},{},[3827],{"type":31,"value":158},{"type":26,"tag":118,"props":3829,"children":3830},{},[3831],{"type":31,"value":163},{"type":26,"tag":118,"props":3833,"children":3834},{},[3835],{"type":31,"value":168},{"type":26,"tag":91,"props":3837,"children":3838},{},[3839,3843,3847],{"type":26,"tag":118,"props":3840,"children":3841},{},[3842],{"type":31,"value":176},{"type":26,"tag":118,"props":3844,"children":3845},{},[3846],{"type":31,"value":181},{"type":26,"tag":118,"props":3848,"children":3849},{},[3850],{"type":31,"value":186},{"type":26,"tag":27,"props":3852,"children":3853},{},[3854],{"type":31,"value":191},{"type":26,"tag":76,"props":3856,"children":3857},{"id":194},[3858],{"type":31,"value":197},{"type":26,"tag":27,"props":3860,"children":3861},{},[3862],{"type":31,"value":202},{"type":26,"tag":204,"props":3864,"children":3865},{},[3866,3870,3874,3878],{"type":26,"tag":208,"props":3867,"children":3868},{},[3869],{"type":31,"value":212},{"type":26,"tag":208,"props":3871,"children":3872},{},[3873],{"type":31,"value":217},{"type":26,"tag":208,"props":3875,"children":3876},{},[3877],{"type":31,"value":222},{"type":26,"tag":208,"props":3879,"children":3880},{},[3881],{"type":31,"value":227},{"type":26,"tag":27,"props":3883,"children":3884},{},[3885],{"type":31,"value":232},{"type":26,"tag":76,"props":3887,"children":3888},{"id":235},[3889],{"type":31,"value":238},{"type":26,"tag":27,"props":3891,"children":3892},{},[3893],{"type":31,"value":243},{"type":26,"tag":245,"props":3895,"children":3897},{"className":3896,"code":249,"language":250,"meta":7},[248],[3898],{"type":26,"tag":253,"props":3899,"children":3900},{"__ignoreMap":7},[3901],{"type":31,"value":249},{"type":26,"tag":27,"props":3903,"children":3904},{},[3905],{"type":31,"value":261},{"type":26,"tag":76,"props":3907,"children":3908},{"id":264},[3909],{"type":31,"value":267},{"type":26,"tag":27,"props":3911,"children":3912},{},[3913],{"type":31,"value":272},{"type":26,"tag":83,"props":3915,"children":3916},{},[3917,3939],{"type":26,"tag":87,"props":3918,"children":3919},{},[3920],{"type":26,"tag":91,"props":3921,"children":3922},{},[3923,3927,3931,3935],{"type":26,"tag":95,"props":3924,"children":3925},{},[3926],{"type":31,"value":286},{"type":26,"tag":95,"props":3928,"children":3929},{},[3930],{"type":31,"value":291},{"type":26,"tag":95,"props":3932,"children":3933},{},[3934],{"type":31,"value":296},{"type":26,"tag":95,"props":3936,"children":3937},{},[3938],{"type":31,"value":301},{"type":26,"tag":111,"props":3940,"children":3941},{},[3942,3961,3980,3999],{"type":26,"tag":91,"props":3943,"children":3944},{},[3945,3949,3953,3957],{"type":26,"tag":118,"props":3946,"children":3947},{},[3948],{"type":31,"value":312},{"type":26,"tag":118,"props":3950,"children":3951},{},[3952],{"type":31,"value":317},{"type":26,"tag":118,"props":3954,"children":3955},{},[3956],{"type":31,"value":322},{"type":26,"tag":118,"props":3958,"children":3959},{},[3960],{"type":31,"value":327},{"type":26,"tag":91,"props":3962,"children":3963},{},[3964,3968,3972,3976],{"type":26,"tag":118,"props":3965,"children":3966},{},[3967],{"type":31,"value":335},{"type":26,"tag":118,"props":3969,"children":3970},{},[3971],{"type":31,"value":340},{"type":26,"tag":118,"props":3973,"children":3974},{},[3975],{"type":31,"value":322},{"type":26,"tag":118,"props":3977,"children":3978},{},[3979],{"type":31,"value":349},{"type":26,"tag":91,"props":3981,"children":3982},{},[3983,3987,3991,3995],{"type":26,"tag":118,"props":3984,"children":3985},{},[3986],{"type":31,"value":357},{"type":26,"tag":118,"props":3988,"children":3989},{},[3990],{"type":31,"value":340},{"type":26,"tag":118,"props":3992,"children":3993},{},[3994],{"type":31,"value":366},{"type":26,"tag":118,"props":3996,"children":3997},{},[3998],{"type":31,"value":371},{"type":26,"tag":91,"props":4000,"children":4001},{},[4002,4006,4010,4014],{"type":26,"tag":118,"props":4003,"children":4004},{},[4005],{"type":31,"value":379},{"type":26,"tag":118,"props":4007,"children":4008},{},[4009],{"type":31,"value":384},{"type":26,"tag":118,"props":4011,"children":4012},{},[4013],{"type":31,"value":322},{"type":26,"tag":118,"props":4015,"children":4016},{},[4017],{"type":31,"value":393},{"type":26,"tag":27,"props":4019,"children":4020},{},[4021],{"type":31,"value":398},{"type":26,"tag":27,"props":4023,"children":4024},{},[4025],{"type":31,"value":403},{"type":26,"tag":245,"props":4027,"children":4029},{"className":4028,"code":407,"language":250,"meta":7},[248],[4030],{"type":26,"tag":253,"props":4031,"children":4032},{"__ignoreMap":7},[4033],{"type":31,"value":407},{"type":26,"tag":27,"props":4035,"children":4036},{},[4037],{"type":31,"value":417},{"type":26,"tag":76,"props":4039,"children":4040},{"id":420},[4041],{"type":31,"value":423},{"type":26,"tag":27,"props":4043,"children":4044},{},[4045],{"type":31,"value":428},{"type":26,"tag":430,"props":4047,"children":4048},{},[4049,4053,4057,4061],{"type":26,"tag":208,"props":4050,"children":4051},{},[4052],{"type":31,"value":437},{"type":26,"tag":208,"props":4054,"children":4055},{},[4056],{"type":31,"value":442},{"type":26,"tag":208,"props":4058,"children":4059},{},[4060],{"type":31,"value":447},{"type":26,"tag":208,"props":4062,"children":4063},{},[4064],{"type":31,"value":452},{"type":26,"tag":27,"props":4066,"children":4067},{},[4068],{"type":31,"value":457},{"type":26,"tag":204,"props":4070,"children":4071},{},[4072,4076,4080],{"type":26,"tag":208,"props":4073,"children":4074},{},[4075],{"type":31,"value":465},{"type":26,"tag":208,"props":4077,"children":4078},{},[4079],{"type":31,"value":470},{"type":26,"tag":208,"props":4081,"children":4082},{},[4083],{"type":31,"value":475},{"type":26,"tag":27,"props":4085,"children":4086},{},[4087],{"type":31,"value":480},{"type":26,"tag":245,"props":4089,"children":4091},{"className":4090,"code":485,"language":31,"meta":7},[484],[4092],{"type":26,"tag":253,"props":4093,"children":4094},{"__ignoreMap":7},[4095],{"type":31,"value":485},{"type":26,"tag":27,"props":4097,"children":4098},{},[4099],{"type":31,"value":495},{"type":26,"tag":76,"props":4101,"children":4102},{"id":498},[4103],{"type":31,"value":501},{"type":26,"tag":27,"props":4105,"children":4106},{},[4107],{"type":31,"value":506},{"type":26,"tag":204,"props":4109,"children":4110},{},[4111,4115,4123],{"type":26,"tag":208,"props":4112,"children":4113},{},[4114],{"type":31,"value":514},{"type":26,"tag":208,"props":4116,"children":4117},{},[4118,4119],{"type":31,"value":519},{"type":26,"tag":44,"props":4120,"children":4121},{"href":522},[4122],{"type":31,"value":525},{"type":26,"tag":208,"props":4124,"children":4125},{},[4126,4127],{"type":31,"value":530},{"type":26,"tag":44,"props":4128,"children":4129},{"href":533},[4130],{"type":31,"value":536},{"type":26,"tag":27,"props":4132,"children":4133},{},[4134],{"type":31,"value":541},{"type":26,"tag":27,"props":4136,"children":4137},{},[4138],{"type":31,"value":546},{"type":26,"tag":83,"props":4140,"children":4141},{},[4142,4160],{"type":26,"tag":87,"props":4143,"children":4144},{},[4145],{"type":26,"tag":91,"props":4146,"children":4147},{},[4148,4152,4156],{"type":26,"tag":95,"props":4149,"children":4150},{},[4151],{"type":31,"value":560},{"type":26,"tag":95,"props":4153,"children":4154},{},[4155],{"type":31,"value":565},{"type":26,"tag":95,"props":4157,"children":4158},{},[4159],{"type":31,"value":570},{"type":26,"tag":111,"props":4161,"children":4162},{},[4163,4178,4193,4208],{"type":26,"tag":91,"props":4164,"children":4165},{},[4166,4170,4174],{"type":26,"tag":118,"props":4167,"children":4168},{},[4169],{"type":31,"value":581},{"type":26,"tag":118,"props":4171,"children":4172},{},[4173],{"type":31,"value":586},{"type":26,"tag":118,"props":4175,"children":4176},{},[4177],{"type":31,"value":591},{"type":26,"tag":91,"props":4179,"children":4180},{},[4181,4185,4189],{"type":26,"tag":118,"props":4182,"children":4183},{},[4184],{"type":31,"value":599},{"type":26,"tag":118,"props":4186,"children":4187},{},[4188],{"type":31,"value":604},{"type":26,"tag":118,"props":4190,"children":4191},{},[4192],{"type":31,"value":609},{"type":26,"tag":91,"props":4194,"children":4195},{},[4196,4200,4204],{"type":26,"tag":118,"props":4197,"children":4198},{},[4199],{"type":31,"value":617},{"type":26,"tag":118,"props":4201,"children":4202},{},[4203],{"type":31,"value":622},{"type":26,"tag":118,"props":4205,"children":4206},{},[4207],{"type":31,"value":627},{"type":26,"tag":91,"props":4209,"children":4210},{},[4211,4215,4219],{"type":26,"tag":118,"props":4212,"children":4213},{},[4214],{"type":31,"value":635},{"type":26,"tag":118,"props":4216,"children":4217},{},[4218],{"type":31,"value":640},{"type":26,"tag":118,"props":4220,"children":4221},{},[4222],{"type":31,"value":645},{"type":26,"tag":27,"props":4224,"children":4225},{},[4226],{"type":31,"value":650},{"type":26,"tag":76,"props":4228,"children":4229},{"id":653},[4230],{"type":31,"value":656},{"type":26,"tag":27,"props":4232,"children":4233},{},[4234],{"type":31,"value":661},{"type":26,"tag":83,"props":4236,"children":4237},{},[4238,4252],{"type":26,"tag":87,"props":4239,"children":4240},{},[4241],{"type":26,"tag":91,"props":4242,"children":4243},{},[4244,4248],{"type":26,"tag":95,"props":4245,"children":4246},{},[4247],{"type":31,"value":675},{"type":26,"tag":95,"props":4249,"children":4250},{},[4251],{"type":31,"value":680},{"type":26,"tag":111,"props":4253,"children":4254},{},[4255,4266,4277,4288,4299,4310],{"type":26,"tag":91,"props":4256,"children":4257},{},[4258,4262],{"type":26,"tag":118,"props":4259,"children":4260},{},[4261],{"type":31,"value":691},{"type":26,"tag":118,"props":4263,"children":4264},{},[4265],{"type":31,"value":696},{"type":26,"tag":91,"props":4267,"children":4268},{},[4269,4273],{"type":26,"tag":118,"props":4270,"children":4271},{},[4272],{"type":31,"value":704},{"type":26,"tag":118,"props":4274,"children":4275},{},[4276],{"type":31,"value":709},{"type":26,"tag":91,"props":4278,"children":4279},{},[4280,4284],{"type":26,"tag":118,"props":4281,"children":4282},{},[4283],{"type":31,"value":581},{"type":26,"tag":118,"props":4285,"children":4286},{},[4287],{"type":31,"value":721},{"type":26,"tag":91,"props":4289,"children":4290},{},[4291,4295],{"type":26,"tag":118,"props":4292,"children":4293},{},[4294],{"type":31,"value":729},{"type":26,"tag":118,"props":4296,"children":4297},{},[4298],{"type":31,"value":734},{"type":26,"tag":91,"props":4300,"children":4301},{},[4302,4306],{"type":26,"tag":118,"props":4303,"children":4304},{},[4305],{"type":31,"value":742},{"type":26,"tag":118,"props":4307,"children":4308},{},[4309],{"type":31,"value":747},{"type":26,"tag":91,"props":4311,"children":4312},{},[4313,4317],{"type":26,"tag":118,"props":4314,"children":4315},{},[4316],{"type":31,"value":617},{"type":26,"tag":118,"props":4318,"children":4319},{},[4320],{"type":31,"value":759},{"type":26,"tag":27,"props":4322,"children":4323},{},[4324],{"type":31,"value":764},{"type":26,"tag":76,"props":4326,"children":4327},{"id":767},[4328],{"type":31,"value":770},{"type":26,"tag":27,"props":4330,"children":4331},{},[4332],{"type":31,"value":775},{"type":26,"tag":204,"props":4334,"children":4335},{},[4336,4340,4344],{"type":26,"tag":208,"props":4337,"children":4338},{},[4339],{"type":31,"value":783},{"type":26,"tag":208,"props":4341,"children":4342},{},[4343],{"type":31,"value":788},{"type":26,"tag":208,"props":4345,"children":4346},{},[4347],{"type":31,"value":793},{"type":26,"tag":27,"props":4349,"children":4350},{},[4351],{"type":31,"value":798},{"type":26,"tag":76,"props":4353,"children":4354},{"id":801},[4355],{"type":31,"value":804},{"type":26,"tag":204,"props":4357,"children":4359},{"className":4358},[808],[4360,4368,4376,4384,4392,4400,4408,4416,4424],{"type":26,"tag":208,"props":4361,"children":4363},{"className":4362},[813],[4364,4367],{"type":26,"tag":816,"props":4365,"children":4366},{"disabled":818,"type":819},[],{"type":31,"value":822},{"type":26,"tag":208,"props":4369,"children":4371},{"className":4370},[813],[4372,4375],{"type":26,"tag":816,"props":4373,"children":4374},{"disabled":818,"type":819},[],{"type":31,"value":831},{"type":26,"tag":208,"props":4377,"children":4379},{"className":4378},[813],[4380,4383],{"type":26,"tag":816,"props":4381,"children":4382},{"disabled":818,"type":819},[],{"type":31,"value":840},{"type":26,"tag":208,"props":4385,"children":4387},{"className":4386},[813],[4388,4391],{"type":26,"tag":816,"props":4389,"children":4390},{"disabled":818,"type":819},[],{"type":31,"value":849},{"type":26,"tag":208,"props":4393,"children":4395},{"className":4394},[813],[4396,4399],{"type":26,"tag":816,"props":4397,"children":4398},{"disabled":818,"type":819},[],{"type":31,"value":858},{"type":26,"tag":208,"props":4401,"children":4403},{"className":4402},[813],[4404,4407],{"type":26,"tag":816,"props":4405,"children":4406},{"disabled":818,"type":819},[],{"type":31,"value":867},{"type":26,"tag":208,"props":4409,"children":4411},{"className":4410},[813],[4412,4415],{"type":26,"tag":816,"props":4413,"children":4414},{"disabled":818,"type":819},[],{"type":31,"value":876},{"type":26,"tag":208,"props":4417,"children":4419},{"className":4418},[813],[4420,4423],{"type":26,"tag":816,"props":4421,"children":4422},{"disabled":818,"type":819},[],{"type":31,"value":885},{"type":26,"tag":208,"props":4425,"children":4427},{"className":4426},[813],[4428,4431],{"type":26,"tag":816,"props":4429,"children":4430},{"disabled":818,"type":819},[],{"type":31,"value":894},{"type":26,"tag":76,"props":4433,"children":4434},{"id":897},[4435],{"type":31,"value":897},{"type":26,"tag":27,"props":4437,"children":4438},{},[4439],{"type":31,"value":904},{"type":26,"tag":27,"props":4441,"children":4442},{},[4443],{"type":31,"value":909},{"type":26,"tag":204,"props":4445,"children":4446},{},[4447,4454,4461,4468],{"type":26,"tag":208,"props":4448,"children":4449},{},[4450],{"type":26,"tag":44,"props":4451,"children":4452},{"href":46},[4453],{"type":31,"value":49},{"type":26,"tag":208,"props":4455,"children":4456},{},[4457],{"type":26,"tag":44,"props":4458,"children":4459},{"href":54},[4460],{"type":31,"value":57},{"type":26,"tag":208,"props":4462,"children":4463},{},[4464],{"type":26,"tag":44,"props":4465,"children":4466},{"href":69},[4467],{"type":31,"value":72},{"type":26,"tag":208,"props":4469,"children":4470},{},[4471],{"type":26,"tag":44,"props":4472,"children":4473},{"href":522},[4474],{"type":31,"value":525},{"title":7,"searchDepth":942,"depth":942,"links":4476},[4477,4478,4479,4480,4481,4482,4483,4484,4485,4486],{"id":78,"depth":945,"text":81},{"id":194,"depth":945,"text":197},{"id":235,"depth":945,"text":238},{"id":264,"depth":945,"text":267},{"id":420,"depth":945,"text":423},{"id":498,"depth":945,"text":501},{"id":653,"depth":945,"text":656},{"id":767,"depth":945,"text":770},{"id":801,"depth":945,"text":804},{"id":897,"depth":945,"text":897},1778574585896]