[{"data":1,"prerenderedAt":6384},["ShallowReactive",2],{"article-/topics/ai/ai-agent-data-lineage-tracking-provenance":3,"related-ai":2003,"content-query-ZVndoWCLgO":4766},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"topic":5,"author":11,"tags":12,"image":18,"featured":6,"readingTime":19,"body":20,"_type":1997,"_id":1998,"_source":1999,"_file":2000,"_stem":2001,"_extension":2002},"/topics/ai/ai-agent-data-lineage-tracking-provenance","ai",false,"","AI agent Data Lineage Tracking：输入、中间产物和输出之间的数据血缘如何全程可追溯","数据从哪里来、到哪里去？本文讲清 AI agent data lineage 的记录模型、存储方案和查询接口，并提供问题排查、影响分析和合规审计的实战案例，让每条数据的流转路径都清晰可见、全程可追溯。","2026-06-15","HTMLPAGE 团队",[13,14,15,16,17],"data lineage","data provenance","traceability","input-output mapping","intermediate artifacts","/images/articles/as05-featured.png",14,{"type":21,"children":22,"toc":1952},"root",[23,32,38,49,54,79,84,90,97,102,135,141,146,179,185,190,233,238,243,248,253,296,302,315,321,330,336,344,354,365,370,376,386,395,428,437,460,470,481,487,496,504,537,545,568,577,588,594,603,611,644,652,675,685,690,696,701,710,719,728,751,760,783,789,794,803,811,820,853,861,884,892,915,921,926,935,946,955,982,990,1013,1021,1044,1049,1054,1064,1073,1083,1092,1097,1102,1111,1116,1121,1130,1135,1141,1151,1160,1248,1254,1263,1272,1348,1354,1363,1372,1463,1469,1475,1485,1528,1534,1542,1601,1607,1616,1682,1688,1696,1754,1760,1768,1820,1826,1834,1884,1894,1900,1909],{"type":24,"tag":25,"props":26,"children":28},"element","h2",{"id":27},"为什么需要-data-lineage-tracking",[29],{"type":30,"value":31},"text","为什么需要 Data Lineage Tracking？",{"type":24,"tag":33,"props":34,"children":35},"p",{},[36],{"type":30,"value":37},"上周四，某金融公司的风控 agent 突然开始拒绝大量正常的贷款申请。排查后发现，agent 使用的信用评分模型输入了一个错误的数据源——本该使用\"过去 12 个月的还款记录\"，却误用了\"过去 12 个月的查询记录\"。更糟糕的是，这个错误已经存在了 3 周，影响了 2,400 多个客户的贷款审批。",{"type":24,"tag":33,"props":39,"children":40},{},[41,43],{"type":30,"value":42},"问题是：",{"type":24,"tag":44,"props":45,"children":46},"strong",{},[47],{"type":30,"value":48},"如何快速找到受影响的客户？如何确定错误的起始时间？如何验证修复后的模型不再使用错误的数据源？",{"type":24,"tag":33,"props":50,"children":51},{},[52],{"type":30,"value":53},"如果没有 Data Lineage Tracking（数据血缘追踪），这些问题几乎无法回答。你需要手动检查：",{"type":24,"tag":55,"props":56,"children":57},"ul",{},[58,64,69,74],{"type":24,"tag":59,"props":60,"children":61},"li",{},[62],{"type":30,"value":63},"模型的代码，找出它读取了哪些数据表。",{"type":24,"tag":59,"props":65,"children":66},{},[67],{"type":30,"value":68},"数据表的 ETL Pipeline，找出数据来源。",{"type":24,"tag":59,"props":70,"children":71},{},[72],{"type":30,"value":73},"历史部署记录，找出什么时候引入了这个 bug。",{"type":24,"tag":59,"props":75,"children":76},{},[77],{"type":30,"value":78},"过去的决策日志，找出哪些客户受到了影响。",{"type":24,"tag":33,"props":80,"children":81},{},[82],{"type":30,"value":83},"这个过程可能需要几天甚至几周时间。而有了完整的数据血缘系统，你可以在几分钟内重建完整的数据流转路径，精准定位问题并评估影响范围。",{"type":24,"tag":25,"props":85,"children":87},{"id":86},"为什么需要-data-lineage",[88],{"type":30,"value":89},"为什么需要 Data Lineage？",{"type":24,"tag":91,"props":92,"children":94},"h3",{"id":93},"_1-问题排查troubleshooting",[95],{"type":30,"value":96},"1. 问题排查（Troubleshooting）",{"type":24,"tag":33,"props":98,"children":99},{},[100],{"type":30,"value":101},"当 agent 输出错误结果时，data lineage 可以帮助：",{"type":24,"tag":55,"props":103,"children":104},{},[105,115,125],{"type":24,"tag":59,"props":106,"children":107},{},[108,113],{"type":24,"tag":44,"props":109,"children":110},{},[111],{"type":30,"value":112},"溯源",{"type":30,"value":114},"：找出错误数据的来源（是哪个数据表、哪个 API、哪个用户输入）。",{"type":24,"tag":59,"props":116,"children":117},{},[118,123],{"type":24,"tag":44,"props":119,"children":120},{},[121],{"type":30,"value":122},"定位",{"type":30,"value":124},"：确定错误引入的时间点（是哪次代码变更、哪次数据迁移、哪次配置更新）。",{"type":24,"tag":59,"props":126,"children":127},{},[128,133],{"type":24,"tag":44,"props":129,"children":130},{},[131],{"type":30,"value":132},"影响分析",{"type":30,"value":134},"：找出所有使用了错误数据的下游系统、模型和决策。",{"type":24,"tag":91,"props":136,"children":138},{"id":137},"_2-影响分析impact-analysis",[139],{"type":30,"value":140},"2. 影响分析（Impact Analysis）",{"type":24,"tag":33,"props":142,"children":143},{},[144],{"type":30,"value":145},"当需要修改数据源或数据处理逻辑时，data lineage 可以帮助：",{"type":24,"tag":55,"props":147,"children":148},{},[149,159,169],{"type":24,"tag":59,"props":150,"children":151},{},[152,157],{"type":24,"tag":44,"props":153,"children":154},{},[155],{"type":30,"value":156},"依赖分析",{"type":30,"value":158},"：找出所有依赖该数据源的下游系统。",{"type":24,"tag":59,"props":160,"children":161},{},[162,167],{"type":24,"tag":44,"props":163,"children":164},{},[165],{"type":30,"value":166},"风险评估",{"type":30,"value":168},"：评估修改可能带来的风险和影响范围。",{"type":24,"tag":59,"props":170,"children":171},{},[172,177],{"type":24,"tag":44,"props":173,"children":174},{},[175],{"type":30,"value":176},"回归测试",{"type":30,"value":178},"：确定需要进行回归测试的系统列表。",{"type":24,"tag":91,"props":180,"children":182},{"id":181},"_3-合规审计compliance-audit",[183],{"type":30,"value":184},"3. 合规审计（Compliance Audit）",{"type":24,"tag":33,"props":186,"children":187},{},[188],{"type":30,"value":189},"许多法规要求追踪数据的完整流转路径：",{"type":24,"tag":55,"props":191,"children":192},{},[193,203,213,223],{"type":24,"tag":59,"props":194,"children":195},{},[196,201],{"type":24,"tag":44,"props":197,"children":198},{},[199],{"type":30,"value":200},"GDPR Article 30",{"type":30,"value":202},"：记录个人数据的处理活动，包括数据来源、处理目的、数据接收者。",{"type":24,"tag":59,"props":204,"children":205},{},[206,211],{"type":24,"tag":44,"props":207,"children":208},{},[209],{"type":30,"value":210},"HIPAA §164.312(b)",{"type":30,"value":212},"：记录对患者健康信息的所有访问和处理。",{"type":24,"tag":59,"props":214,"children":215},{},[216,221],{"type":24,"tag":44,"props":217,"children":218},{},[219],{"type":30,"value":220},"BCBS 239",{"type":30,"value":222},"（银行业）：要求银行能够追踪风险数据的完整血缘。",{"type":24,"tag":59,"props":224,"children":225},{},[226,231],{"type":24,"tag":44,"props":227,"children":228},{},[229],{"type":30,"value":230},"SOX",{"type":30,"value":232},"（上市公司）：要求追踪财务数据的来源和处理过程。",{"type":24,"tag":33,"props":234,"children":235},{},[236],{"type":30,"value":237},"没有完整的数据血缘，无法满足这些合规要求。",{"type":24,"tag":25,"props":239,"children":241},{"id":240},"记录模型设计",[242],{"type":30,"value":240},{"type":24,"tag":91,"props":244,"children":246},{"id":245},"核心概念",[247],{"type":30,"value":245},{"type":24,"tag":33,"props":249,"children":250},{},[251],{"type":30,"value":252},"Data Lineage 通常使用图（Graph）模型来表示：",{"type":24,"tag":55,"props":254,"children":255},{},[256,266,276,286],{"type":24,"tag":59,"props":257,"children":258},{},[259,264],{"type":24,"tag":44,"props":260,"children":261},{},[262],{"type":30,"value":263},"Node（节点）",{"type":30,"value":265},"：代表数据实体（如数据库表、API、文件、模型、agent）。",{"type":24,"tag":59,"props":267,"children":268},{},[269,274],{"type":24,"tag":44,"props":270,"children":271},{},[272],{"type":30,"value":273},"Edge（边）",{"type":30,"value":275},"：代表数据流动关系（如 \"reads from\"、\"writes to\"、\"transforms into\"）。",{"type":24,"tag":59,"props":277,"children":278},{},[279,284],{"type":24,"tag":44,"props":280,"children":281},{},[282],{"type":30,"value":283},"Attribute（属性）",{"type":30,"value":285},"：节点的元数据（如 schema、owner、classification）。",{"type":24,"tag":59,"props":287,"children":288},{},[289,294],{"type":24,"tag":44,"props":290,"children":291},{},[292],{"type":30,"value":293},"Timestamp（时间戳）",{"type":30,"value":295},"：记录数据流动的时间。",{"type":24,"tag":91,"props":297,"children":299},{"id":298},"node-类型定义",[300],{"type":30,"value":301},"Node 类型定义",{"type":24,"tag":303,"props":304,"children":309},"pre",{"code":305,"language":306,"meta":7,"className":307},"enum NodeType {\n  DATABASE_TABLE = \"database_table\",\n  API_ENDPOINT = \"api_endpoint\",\n  FILE = \"file\",\n  MODEL = \"model\",\n  AGENT = \"agent\",\n  USER_INPUT = \"user_input\",\n  EXTERNAL_SERVICE = \"external_service\",\n  CACHE = \"cache\",\n  QUEUE = \"queue\",\n}\n\ninterface DataNode {\n  node_id: string;              // 唯一标识（UUID）\n  node_type: NodeType;\n  name: string;                 // 节点名称（如 \"users table\"、\"OpenAI API\"）\n  qualified_name: string;       // 限定名称（如 \"prod_db.public.users\"）\n  \n  // 元数据\n  owner?: string;               // 责任人\n  description?: string;         // 描述\n  schema?: Record\u003Cstring, any>; // 数据结构（如列名、类型）\n  classification?: \"public\" | \"internal\" | \"confidential\" | \"pii\";\n  \n  // 技术信息\n  location?: string;            // 物理位置（如 S3 bucket path、database connection string）\n  format?: string;              // 数据格式（如 JSON、CSV、Parquet）\n  \n  // 时间信息\n  created_at: string;\n  updated_at: string;\n  \n  // 自定义元数据\n  metadata?: Record\u003Cstring, any>;\n}\n","typescript",[308],"language-typescript",[310],{"type":24,"tag":311,"props":312,"children":313},"code",{"__ignoreMap":7},[314],{"type":30,"value":305},{"type":24,"tag":91,"props":316,"children":318},{"id":317},"edge-类型定义",[319],{"type":30,"value":320},"Edge 类型定义",{"type":24,"tag":303,"props":322,"children":325},{"code":323,"language":306,"meta":7,"className":324},"enum EdgeType {\n  READS_FROM = \"reads_from\",\n  WRITES_TO = \"writes_to\",\n  TRANSFORMS_INTO = \"transforms_into\",\n  DERIVED_FROM = \"derived_from\",\n  DEPENDS_ON = \"depends_on\",\n  TRIGGERS = \"triggers\",\n}\n\ninterface DataEdge {\n  edge_id: string;              // 唯一标识（UUID）\n  source_node_id: string;       // 源节点 ID\n  target_node_id: string;       // 目标节点 ID\n  edge_type: EdgeType;\n  \n  // 流动详情\n  columns?: string[];           // 涉及的列（如 [\"user_id\", \"email\"]）\n  transformation?: string;      // 转换逻辑描述（如 \"JOIN users ON user_id\"）\n  filter_condition?: string;    // 过滤条件（如 \"WHERE status = 'active'\"）\n  \n  // 执行信息\n  executed_at: string;          // 执行时间\n  duration_ms?: number;         // 执行耗时\n  rows_affected?: number;       // 影响的行数\n  \n  // 关联信息\n  job_id?: string;              // 关联的 ETL job ID\n  request_id?: string;          // 关联的请求 ID\n  session_id?: string;          // 关联的会话 ID\n  \n  // 自定义元数据\n  metadata?: Record\u003Cstring, any>;\n}\n",[308],[326],{"type":24,"tag":311,"props":327,"children":328},{"__ignoreMap":7},[329],{"type":30,"value":323},{"type":24,"tag":91,"props":331,"children":333},{"id":332},"示例agent-决策的数据血缘",[334],{"type":30,"value":335},"示例：Agent 决策的数据血缘",{"type":24,"tag":303,"props":337,"children":339},{"code":338},"┌──────────────┐     ┌──────────────┐     ┌──────────────┐\n│  User Input  │────▶│   Agent      │────▶│  OpenAI API  │\n│  (query)     │     │  (orchestrator)│   │  (GPT-4)     │\n└──────────────┘     └──────────────┘     └──────────────┘\n                            │                      │\n                            │                      ▼\n                            │             ┌──────────────┐\n                            │             │  Embedding   │\n                            │             │  Model       │\n                            │             └──────────────┘\n                            │                      │\n                            ▼                      ▼\n                   ┌──────────────┐     ┌──────────────┐\n                   │ Vector DB    │◀────│  Query       │\n                   │ (retrieval)  │     │  Results     │\n                   └──────────────┘     └──────────────┘\n                            │\n                            ▼\n                   ┌──────────────┐\n                   │ Final        │\n                   │ Response     │\n                   └──────────────┘\n",[340],{"type":24,"tag":311,"props":341,"children":342},{"__ignoreMap":7},[343],{"type":30,"value":338},{"type":24,"tag":33,"props":345,"children":346},{},[347,352],{"type":24,"tag":44,"props":348,"children":349},{},[350],{"type":30,"value":351},"对应的血缘记录",{"type":30,"value":353},"：",{"type":24,"tag":303,"props":355,"children":360},{"code":356,"language":357,"meta":7,"className":358},"{\n  \"nodes\": [\n    {\n      \"node_id\": \"node_user_input_001\",\n      \"node_type\": \"user_input\",\n      \"name\": \"Customer Query\",\n      \"qualified_name\": \"session:sess_abc123:user_input\",\n      \"classification\": \"pii\",\n      \"schema\": {\n        \"query\": \"string\",\n        \"user_id\": \"string\",\n        \"timestamp\": \"datetime\"\n      }\n    },\n    {\n      \"node_id\": \"node_agent_001\",\n      \"node_type\": \"agent\",\n      \"name\": \"Customer Support Agent\",\n      \"qualified_name\": \"agent:customer-support-bot:v2.3.1\",\n      \"owner\": \"team:ai-platform\"\n    },\n    {\n      \"node_id\": \"node_openai_001\",\n      \"node_type\": \"api_endpoint\",\n      \"name\": \"OpenAI Chat Completions\",\n      \"qualified_name\": \"api:openai.com/v1/chat/completions\",\n      \"location\": \"https://api.openai.com/v1/chat/completions\"\n    },\n    {\n      \"node_id\": \"node_vector_db_001\",\n      \"node_type\": \"database_table\",\n      \"name\": \"Knowledge Base Embeddings\",\n      \"qualified_name\": \"prod_db.public.kb_embeddings\",\n      \"classification\": \"internal\",\n      \"schema\": {\n        \"document_id\": \"uuid\",\n        \"embedding\": \"vector(1536)\",\n        \"metadata\": \"jsonb\"\n      }\n    },\n    {\n      \"node_id\": \"node_response_001\",\n      \"node_type\": \"file\",\n      \"name\": \"Agent Response\",\n      \"qualified_name\": \"session:sess_abc123:response\",\n      \"format\": \"json\"\n    }\n  ],\n  \"edges\": [\n    {\n      \"edge_id\": \"edge_001\",\n      \"source_node_id\": \"node_user_input_001\",\n      \"target_node_id\": \"node_agent_001\",\n      \"edge_type\": \"reads_from\",\n      \"executed_at\": \"2026-06-15T14:23:45Z\",\n      \"request_id\": \"req_xyz789\"\n    },\n    {\n      \"edge_id\": \"edge_002\",\n      \"source_node_id\": \"node_agent_001\",\n      \"target_node_id\": \"node_openai_001\",\n      \"edge_type\": \"triggers\",\n      \"executed_at\": \"2026-06-15T14:23:46Z\",\n      \"duration_ms\": 1234,\n      \"request_id\": \"req_xyz789\"\n    },\n    {\n      \"edge_id\": \"edge_003\",\n      \"source_node_id\": \"node_agent_001\",\n      \"target_node_id\": \"node_vector_db_001\",\n      \"edge_type\": \"reads_from\",\n      \"columns\": [\"document_id\", \"embedding\", \"metadata\"],\n      \"filter_condition\": \"WHERE metadata->>'category' = 'support'\",\n      \"executed_at\": \"2026-06-15T14:23:45Z\",\n      \"rows_affected\": 5,\n      \"request_id\": \"req_xyz789\"\n    },\n    {\n      \"edge_id\": \"edge_004\",\n      \"source_node_id\": \"node_openai_001\",\n      \"target_node_id\": \"node_response_001\",\n      \"edge_type\": \"writes_to\",\n      \"executed_at\": \"2026-06-15T14:23:47Z\",\n      \"request_id\": \"req_xyz789\"\n    }\n  ]\n}\n","json",[359],"language-json",[361],{"type":24,"tag":311,"props":362,"children":363},{"__ignoreMap":7},[364],{"type":30,"value":356},{"type":24,"tag":25,"props":366,"children":368},{"id":367},"存储方案选型",[369],{"type":30,"value":367},{"type":24,"tag":91,"props":371,"children":373},{"id":372},"方案一graph-database图数据库",[374],{"type":30,"value":375},"方案一：Graph Database（图数据库）",{"type":24,"tag":33,"props":377,"children":378},{},[379,384],{"type":24,"tag":44,"props":380,"children":381},{},[382],{"type":30,"value":383},"推荐",{"type":30,"value":385},"：Neo4j、Amazon Neptune、Azure Cosmos DB（Gremlin API）",{"type":24,"tag":33,"props":387,"children":388},{},[389,394],{"type":24,"tag":44,"props":390,"children":391},{},[392],{"type":30,"value":393},"优势",{"type":30,"value":353},{"type":24,"tag":55,"props":396,"children":397},{},[398,408,418],{"type":24,"tag":59,"props":399,"children":400},{},[401,406],{"type":24,"tag":44,"props":402,"children":403},{},[404],{"type":30,"value":405},"原生支持图查询",{"type":30,"value":407},"：轻松遍历上下游节点，查询性能高。",{"type":24,"tag":59,"props":409,"children":410},{},[411,416],{"type":24,"tag":44,"props":412,"children":413},{},[414],{"type":30,"value":415},"灵活的模式",{"type":30,"value":417},"：可以轻松添加新的节点类型和边类型。",{"type":24,"tag":59,"props":419,"children":420},{},[421,426],{"type":24,"tag":44,"props":422,"children":423},{},[424],{"type":30,"value":425},"可视化友好",{"type":30,"value":427},"：大多数图数据库都提供内置的可视化工具。",{"type":24,"tag":33,"props":429,"children":430},{},[431,436],{"type":24,"tag":44,"props":432,"children":433},{},[434],{"type":30,"value":435},"劣势",{"type":30,"value":353},{"type":24,"tag":55,"props":438,"children":439},{},[440,450],{"type":24,"tag":59,"props":441,"children":442},{},[443,448],{"type":24,"tag":44,"props":444,"children":445},{},[446],{"type":30,"value":447},"学习曲线",{"type":30,"value":449},"：需要学习图查询语言（如 Cypher、Gremlin）。",{"type":24,"tag":59,"props":451,"children":452},{},[453,458],{"type":24,"tag":44,"props":454,"children":455},{},[456],{"type":30,"value":457},"运维复杂",{"type":30,"value":459},"：图数据库的集群管理和备份恢复相对复杂。",{"type":24,"tag":33,"props":461,"children":462},{},[463,468],{"type":24,"tag":44,"props":464,"children":465},{},[466],{"type":30,"value":467},"查询示例",{"type":30,"value":469},"（Cypher）：",{"type":24,"tag":303,"props":471,"children":476},{"code":472,"language":473,"meta":7,"className":474},"// 查询某个节点的所有上游依赖（向上追溯 3 层）\nMATCH (target:DataNode {node_id: \"node_response_001\"})\u003C-[:READS_FROM|DERIVED_FROM*1..3]-(source:DataNode)\nRETURN source.node_id, source.name, source.node_type\nORDER BY source.created_at DESC;\n\n// 查询某个数据表被哪些下游系统使用\nMATCH (table:DataNode {qualified_name: \"prod_db.public.users\"})-[:READS_FROM]->(downstream:DataNode)\nRETURN downstream.node_id, downstream.name, downstream.node_type;\n\n// 查询包含 PII 数据的完整流转路径\nMATCH path = (source:DataNode {classification: \"pii\"})-[*1..5]->(target:DataNode)\nRETURN path\nLIMIT 10;\n","cypher",[475],"language-cypher",[477],{"type":24,"tag":311,"props":478,"children":479},{"__ignoreMap":7},[480],{"type":30,"value":472},{"type":24,"tag":91,"props":482,"children":484},{"id":483},"方案二relational-database关系数据库",[485],{"type":30,"value":486},"方案二：Relational Database（关系数据库）",{"type":24,"tag":33,"props":488,"children":489},{},[490,494],{"type":24,"tag":44,"props":491,"children":492},{},[493],{"type":30,"value":383},{"type":30,"value":495},"：PostgreSQL、MySQL",{"type":24,"tag":33,"props":497,"children":498},{},[499,503],{"type":24,"tag":44,"props":500,"children":501},{},[502],{"type":30,"value":393},{"type":30,"value":353},{"type":24,"tag":55,"props":505,"children":506},{},[507,517,527],{"type":24,"tag":59,"props":508,"children":509},{},[510,515],{"type":24,"tag":44,"props":511,"children":512},{},[513],{"type":30,"value":514},"熟悉度高",{"type":30,"value":516},"：团队通常已经熟悉 SQL，学习成本低。",{"type":24,"tag":59,"props":518,"children":519},{},[520,525],{"type":24,"tag":44,"props":521,"children":522},{},[523],{"type":30,"value":524},"生态丰富",{"type":30,"value":526},"：有丰富的 ORM、迁移工具、监控工具。",{"type":24,"tag":59,"props":528,"children":529},{},[530,535],{"type":24,"tag":44,"props":531,"children":532},{},[533],{"type":30,"value":534},"成本低",{"type":30,"value":536},"：开源数据库免费，云服务价格也相对较低。",{"type":24,"tag":33,"props":538,"children":539},{},[540,544],{"type":24,"tag":44,"props":541,"children":542},{},[543],{"type":30,"value":435},{"type":30,"value":353},{"type":24,"tag":55,"props":546,"children":547},{},[548,558],{"type":24,"tag":59,"props":549,"children":550},{},[551,556],{"type":24,"tag":44,"props":552,"children":553},{},[554],{"type":30,"value":555},"递归查询性能差",{"type":30,"value":557},"：需要使用递归 CTE 查询血缘关系，性能不如图数据库。",{"type":24,"tag":59,"props":559,"children":560},{},[561,566],{"type":24,"tag":44,"props":562,"children":563},{},[564],{"type":30,"value":565},"模式僵化",{"type":30,"value":567},"：添加新的节点类型或边类型需要修改 schema。",{"type":24,"tag":33,"props":569,"children":570},{},[571,575],{"type":24,"tag":44,"props":572,"children":573},{},[574],{"type":30,"value":467},{"type":30,"value":576},"（SQL with Recursive CTE）：",{"type":24,"tag":303,"props":578,"children":583},{"code":579,"language":580,"meta":7,"className":581},"-- 查询某个节点的所有上游依赖（向上追溯 3 层）\nWITH RECURSIVE upstream AS (\n  -- 基础情况：直接上游\n  SELECT \n    e.source_node_id,\n    n.node_id,\n    n.name,\n    n.node_type,\n    1 AS depth\n  FROM data_edges e\n  JOIN data_nodes n ON e.source_node_id = n.node_id\n  WHERE e.target_node_id = 'node_response_001'\n    AND e.edge_type IN ('reads_from', 'derived_from')\n  \n  UNION ALL\n  \n  -- 递归情况：继续向上追溯\n  SELECT \n    e2.source_node_id,\n    n2.node_id,\n    n2.name,\n    n2.node_type,\n    u.depth + 1\n  FROM upstream u\n  JOIN data_edges e2 ON u.source_node_id = e2.target_node_id\n  JOIN data_nodes n2 ON e2.source_node_id = n2.node_id\n  WHERE u.depth \u003C 3\n    AND e2.edge_type IN ('reads_from', 'derived_from')\n)\nSELECT DISTINCT node_id, name, node_type, depth\nFROM upstream\nORDER BY depth ASC;\n","sql",[582],"language-sql",[584],{"type":24,"tag":311,"props":585,"children":586},{"__ignoreMap":7},[587],{"type":30,"value":579},{"type":24,"tag":91,"props":589,"children":591},{"id":590},"方案三lineage-specific-store专用血缘存储",[592],{"type":30,"value":593},"方案三：Lineage-specific Store（专用血缘存储）",{"type":24,"tag":33,"props":595,"children":596},{},[597,601],{"type":24,"tag":44,"props":598,"children":599},{},[600],{"type":30,"value":383},{"type":30,"value":602},"：Apache Atlas、DataHub、Amundsen",{"type":24,"tag":33,"props":604,"children":605},{},[606,610],{"type":24,"tag":44,"props":607,"children":608},{},[609],{"type":30,"value":393},{"type":30,"value":353},{"type":24,"tag":55,"props":612,"children":613},{},[614,624,634],{"type":24,"tag":59,"props":615,"children":616},{},[617,622],{"type":24,"tag":44,"props":618,"children":619},{},[620],{"type":30,"value":621},"开箱即用",{"type":30,"value":623},"：专门用于数据血缘管理，提供完整的 UI 和 API。",{"type":24,"tag":59,"props":625,"children":626},{},[627,632],{"type":24,"tag":44,"props":628,"children":629},{},[630],{"type":30,"value":631},"集成丰富",{"type":30,"value":633},"：预置了与 Hive、Spark、Airflow、dbt 等工具的集成。",{"type":24,"tag":59,"props":635,"children":636},{},[637,642],{"type":24,"tag":44,"props":638,"children":639},{},[640],{"type":30,"value":641},"元数据管理",{"type":30,"value":643},"：除了血缘，还提供数据目录、数据质量、数据治理等功能。",{"type":24,"tag":33,"props":645,"children":646},{},[647,651],{"type":24,"tag":44,"props":648,"children":649},{},[650],{"type":30,"value":435},{"type":30,"value":353},{"type":24,"tag":55,"props":653,"children":654},{},[655,665],{"type":24,"tag":59,"props":656,"children":657},{},[658,663],{"type":24,"tag":44,"props":659,"children":660},{},[661],{"type":30,"value":662},"重量级",{"type":30,"value":664},"：需要部署和维护复杂的系统。",{"type":24,"tag":59,"props":666,"children":667},{},[668,673],{"type":24,"tag":44,"props":669,"children":670},{},[671],{"type":30,"value":672},"定制困难",{"type":30,"value":674},"：如果需要特殊的血缘模型，定制成本高。",{"type":24,"tag":33,"props":676,"children":677},{},[678,683],{"type":24,"tag":44,"props":679,"children":680},{},[681],{"type":30,"value":682},"适用场景",{"type":30,"value":684},"：大型企业，已有成熟的数据平台团队，需要统一的数据治理解决方案。",{"type":24,"tag":25,"props":686,"children":688},{"id":687},"采集机制",[689],{"type":30,"value":687},{"type":24,"tag":91,"props":691,"children":693},{"id":692},"方式一instrumentation代码埋点",[694],{"type":30,"value":695},"方式一：Instrumentation（代码埋点）",{"type":24,"tag":33,"props":697,"children":698},{},[699],{"type":30,"value":700},"在应用程序代码中显式记录数据血缘。",{"type":24,"tag":33,"props":702,"children":703},{},[704,709],{"type":24,"tag":44,"props":705,"children":706},{},[707],{"type":30,"value":708},"示例",{"type":30,"value":353},{"type":24,"tag":303,"props":711,"children":714},{"code":712,"language":306,"meta":7,"className":713},"import { DataLineageTracker } from \"@company/data-lineage-sdk\";\n\nconst tracker = new DataLineageTracker({\n  apiEndpoint: \"https://lineage-api.example.com\",\n  apiKey: process.env.LINEAGE_API_KEY,\n});\n\nasync function processUserQuery(userId: string, query: string): Promise\u003Cstring> {\n  const sessionId = generateSessionId();\n  \n  // 记录用户输入节点\n  await tracker.recordNode({\n    node_id: `user_input:${sessionId}`,\n    node_type: \"user_input\",\n    name: \"User Query\",\n    qualified_name: `session:${sessionId}:user_input`,\n    classification: \"pii\",\n    metadata: { user_id: userId },\n  });\n  \n  // 记录从向量数据库读取数据\n  const embeddings = await vectorDB.search(query);\n  await tracker.recordEdge({\n    source_node_id: \"node_vector_db_001\",\n    target_node_id: `agent_run:${sessionId}`,\n    edge_type: \"reads_from\",\n    columns: [\"document_id\", \"embedding\", \"metadata\"],\n    rows_affected: embeddings.length,\n    metadata: { session_id: sessionId },\n  });\n  \n  // 记录调用 OpenAI API\n  const response = await openai.chat.completions.create({\n    model: \"gpt-4\",\n    messages: [{ role: \"user\", content: query }],\n  });\n  await tracker.recordEdge({\n    source_node_id: `agent_run:${sessionId}`,\n    target_node_id: \"node_openai_001\",\n    edge_type: \"triggers\",\n    duration_ms: response.usage.total_tokens * 10, // 估算耗时\n    metadata: { \n      session_id: sessionId,\n      tokens_used: response.usage.total_tokens,\n    },\n  });\n  \n  // 记录最终响应\n  await tracker.recordNode({\n    node_id: `response:${sessionId}`,\n    node_type: \"file\",\n    name: \"Agent Response\",\n    qualified_name: `session:${sessionId}:response`,\n    metadata: { session_id: sessionId },\n  });\n  \n  await tracker.recordEdge({\n    source_node_id: \"node_openai_001\",\n    target_node_id: `response:${sessionId}`,\n    edge_type: \"writes_to\",\n    metadata: { session_id: sessionId },\n  });\n  \n  return response.choices[0].message.content;\n}\n",[308],[715],{"type":24,"tag":311,"props":716,"children":717},{"__ignoreMap":7},[718],{"type":30,"value":712},{"type":24,"tag":33,"props":720,"children":721},{},[722,727],{"type":24,"tag":44,"props":723,"children":724},{},[725],{"type":30,"value":726},"优点",{"type":30,"value":353},{"type":24,"tag":55,"props":729,"children":730},{},[731,741],{"type":24,"tag":59,"props":732,"children":733},{},[734,739],{"type":24,"tag":44,"props":735,"children":736},{},[737],{"type":30,"value":738},"精确",{"type":30,"value":740},"：可以记录详细的上下文信息（如查询参数、返回结果、耗时）。",{"type":24,"tag":59,"props":742,"children":743},{},[744,749],{"type":24,"tag":44,"props":745,"children":746},{},[747],{"type":30,"value":748},"灵活",{"type":30,"value":750},"：可以根据业务需求自定义记录逻辑。",{"type":24,"tag":33,"props":752,"children":753},{},[754,759],{"type":24,"tag":44,"props":755,"children":756},{},[757],{"type":30,"value":758},"缺点",{"type":30,"value":353},{"type":24,"tag":55,"props":761,"children":762},{},[763,773],{"type":24,"tag":59,"props":764,"children":765},{},[766,771],{"type":24,"tag":44,"props":767,"children":768},{},[769],{"type":30,"value":770},"侵入性强",{"type":30,"value":772},"：需要修改应用程序代码。",{"type":24,"tag":59,"props":774,"children":775},{},[776,781],{"type":24,"tag":44,"props":777,"children":778},{},[779],{"type":30,"value":780},"维护成本高",{"type":30,"value":782},"：每次代码变更都需要同步更新血缘记录逻辑。",{"type":24,"tag":91,"props":784,"children":786},{"id":785},"方式二proxy代理拦截",[787],{"type":30,"value":788},"方式二：Proxy（代理拦截）",{"type":24,"tag":33,"props":790,"children":791},{},[792],{"type":30,"value":793},"在数据访问层部署 Proxy，自动拦截并记录所有数据操作。",{"type":24,"tag":33,"props":795,"children":796},{},[797,802],{"type":24,"tag":44,"props":798,"children":799},{},[800],{"type":30,"value":801},"示例架构",{"type":30,"value":353},{"type":24,"tag":303,"props":804,"children":806},{"code":805},"┌─────────────┐     ┌──────────────┐     ┌─────────────┐\n│  AI Agents  │────▶│  Data Proxy  │────▶│  Database / │\n│             │     │  (Records    │     │  API        │\n└─────────────┘     │   Lineage)   │     └─────────────┘\n                    └──────────────┘\n                           │\n                           ▼\n                    ┌──────────────┐\n                    │  Lineage     │\n                    │  Storage     │\n                    └──────────────┘\n",[807],{"type":24,"tag":311,"props":808,"children":809},{"__ignoreMap":7},[810],{"type":30,"value":805},{"type":24,"tag":33,"props":812,"children":813},{},[814,819],{"type":24,"tag":44,"props":815,"children":816},{},[817],{"type":30,"value":818},"实现方式",{"type":30,"value":353},{"type":24,"tag":55,"props":821,"children":822},{},[823,833,843],{"type":24,"tag":59,"props":824,"children":825},{},[826,831],{"type":24,"tag":44,"props":827,"children":828},{},[829],{"type":30,"value":830},"Database Proxy",{"type":30,"value":832},"：使用 ProxySQL、PgBouncer 等数据库代理，记录所有 SQL 查询。",{"type":24,"tag":59,"props":834,"children":835},{},[836,841],{"type":24,"tag":44,"props":837,"children":838},{},[839],{"type":30,"value":840},"API Gateway",{"type":30,"value":842},"：使用 Kong、Apigee 等 API Gateway，记录所有 API 调用。",{"type":24,"tag":59,"props":844,"children":845},{},[846,851],{"type":24,"tag":44,"props":847,"children":848},{},[849],{"type":30,"value":850},"Service Mesh",{"type":30,"value":852},"：使用 Istio、Linkerd 等服务网格，记录微服务间的通信。",{"type":24,"tag":33,"props":854,"children":855},{},[856,860],{"type":24,"tag":44,"props":857,"children":858},{},[859],{"type":30,"value":726},{"type":30,"value":353},{"type":24,"tag":55,"props":862,"children":863},{},[864,874],{"type":24,"tag":59,"props":865,"children":866},{},[867,872],{"type":24,"tag":44,"props":868,"children":869},{},[870],{"type":30,"value":871},"无侵入",{"type":30,"value":873},"：无需修改应用程序代码。",{"type":24,"tag":59,"props":875,"children":876},{},[877,882],{"type":24,"tag":44,"props":878,"children":879},{},[880],{"type":30,"value":881},"全面",{"type":30,"value":883},"：可以捕获所有数据操作，不会遗漏。",{"type":24,"tag":33,"props":885,"children":886},{},[887,891],{"type":24,"tag":44,"props":888,"children":889},{},[890],{"type":30,"value":758},{"type":30,"value":353},{"type":24,"tag":55,"props":893,"children":894},{},[895,905],{"type":24,"tag":59,"props":896,"children":897},{},[898,903],{"type":24,"tag":44,"props":899,"children":900},{},[901],{"type":30,"value":902},"性能开销",{"type":30,"value":904},"：Proxy 会增加延迟，需要优化。",{"type":24,"tag":59,"props":906,"children":907},{},[908,913],{"type":24,"tag":44,"props":909,"children":910},{},[911],{"type":30,"value":912},"上下文缺失",{"type":30,"value":914},"：Proxy 只能看到网络层面的信息，缺少业务上下文（如用户 ID、会话 ID）。",{"type":24,"tag":91,"props":916,"children":918},{"id":917},"方式三sidecar边车容器",[919],{"type":30,"value":920},"方式三：Sidecar（边车容器）",{"type":24,"tag":33,"props":922,"children":923},{},[924],{"type":30,"value":925},"在 Kubernetes 环境中，为每个 Pod 部署一个 Sidecar 容器，负责记录血缘。",{"type":24,"tag":33,"props":927,"children":928},{},[929,934],{"type":24,"tag":44,"props":930,"children":931},{},[932],{"type":30,"value":933},"示例配置",{"type":30,"value":353},{"type":24,"tag":303,"props":936,"children":941},{"code":937,"language":938,"meta":7,"className":939},"apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: customer-support-agent\nspec:\n  template:\n    spec:\n      containers:\n        - name: agent\n          image: my-agent:latest\n        \n        - name: lineage-sidecar\n          image: company/lineage-sidecar:latest\n          env:\n            - name: LINEAGE_API_ENDPOINT\n              value: \"https://lineage-api.example.com\"\n            - name: LINEAGE_API_KEY\n              valueFrom:\n                secretKeyRef:\n                  name: lineage-secret\n                  key: api-key\n          volumeMounts:\n            - name: shared-volume\n              mountPath: /var/run/lineage\n      \n      volumes:\n        - name: shared-volume\n          emptyDir: {}\n","yaml",[940],"language-yaml",[942],{"type":24,"tag":311,"props":943,"children":944},{"__ignoreMap":7},[945],{"type":30,"value":937},{"type":24,"tag":33,"props":947,"children":948},{},[949,954],{"type":24,"tag":44,"props":950,"children":951},{},[952],{"type":30,"value":953},"工作原理",{"type":30,"value":353},{"type":24,"tag":956,"props":957,"children":958},"ol",{},[959,972,977],{"type":24,"tag":59,"props":960,"children":961},{},[962,964,970],{"type":30,"value":963},"Agent 将血缘事件写入共享卷（如 ",{"type":24,"tag":311,"props":965,"children":967},{"className":966},[],[968],{"type":30,"value":969},"/var/run/lineage/events.jsonl",{"type":30,"value":971},"）。",{"type":24,"tag":59,"props":973,"children":974},{},[975],{"type":30,"value":976},"Sidecar 监听共享卷，读取新事件并发送到 Lineage API。",{"type":24,"tag":59,"props":978,"children":979},{},[980],{"type":30,"value":981},"Sidecar 负责重试、缓冲、批量发送等可靠性保障。",{"type":24,"tag":33,"props":983,"children":984},{},[985,989],{"type":24,"tag":44,"props":986,"children":987},{},[988],{"type":30,"value":726},{"type":30,"value":353},{"type":24,"tag":55,"props":991,"children":992},{},[993,1003],{"type":24,"tag":59,"props":994,"children":995},{},[996,1001],{"type":24,"tag":44,"props":997,"children":998},{},[999],{"type":30,"value":1000},"解耦",{"type":30,"value":1002},"：Agent 只需写入文件，无需关心网络通信。",{"type":24,"tag":59,"props":1004,"children":1005},{},[1006,1011],{"type":24,"tag":44,"props":1007,"children":1008},{},[1009],{"type":30,"value":1010},"可靠",{"type":30,"value":1012},"：Sidecar 可以处理重试、缓冲、离线缓存等。",{"type":24,"tag":33,"props":1014,"children":1015},{},[1016,1020],{"type":24,"tag":44,"props":1017,"children":1018},{},[1019],{"type":30,"value":758},{"type":30,"value":353},{"type":24,"tag":55,"props":1022,"children":1023},{},[1024,1034],{"type":24,"tag":59,"props":1025,"children":1026},{},[1027,1032],{"type":24,"tag":44,"props":1028,"children":1029},{},[1030],{"type":30,"value":1031},"资源占用",{"type":30,"value":1033},"：每个 Pod 都需要额外的 Sidecar 容器。",{"type":24,"tag":59,"props":1035,"children":1036},{},[1037,1042],{"type":24,"tag":44,"props":1038,"children":1039},{},[1040],{"type":30,"value":1041},"复杂性",{"type":30,"value":1043},"：需要管理共享卷的生命周期和清理。",{"type":24,"tag":25,"props":1045,"children":1047},{"id":1046},"查询与分析",[1048],{"type":30,"value":1046},{"type":24,"tag":91,"props":1050,"children":1052},{"id":1051},"上下游追溯",[1053],{"type":30,"value":1051},{"type":24,"tag":33,"props":1055,"children":1056},{},[1057,1062],{"type":24,"tag":44,"props":1058,"children":1059},{},[1060],{"type":30,"value":1061},"向上追溯（Upstream）",{"type":30,"value":1063},"：找出数据的来源。",{"type":24,"tag":303,"props":1065,"children":1068},{"code":1066,"language":306,"meta":7,"className":1067},"async function getUpstreamLineage(nodeId: string, maxDepth: number = 5): Promise\u003CDataNode[]> {\n  const query = `\n    MATCH path = (target:DataNode {node_id: $nodeId})\u003C-[:READS_FROM|DERIVED_FROM*1..${maxDepth}]-(source:DataNode)\n    RETURN DISTINCT source\n    ORDER BY source.created_at DESC\n  `;\n  \n  const result = await graphDb.run(query, { nodeId });\n  return result.records.map(record => record.get(\"source\").properties);\n}\n\n// 使用\nconst upstreamNodes = await getUpstreamLineage(\"node_response_001\", 3);\nconsole.log(\"Upstream nodes:\", upstreamNodes.map(n => n.name));\n// Output: [\"Customer Query\", \"Vector DB\", \"OpenAI API\", ...]\n",[308],[1069],{"type":24,"tag":311,"props":1070,"children":1071},{"__ignoreMap":7},[1072],{"type":30,"value":1066},{"type":24,"tag":33,"props":1074,"children":1075},{},[1076,1081],{"type":24,"tag":44,"props":1077,"children":1078},{},[1079],{"type":30,"value":1080},"向下追溯（Downstream）",{"type":30,"value":1082},"：找出数据的使用者。",{"type":24,"tag":303,"props":1084,"children":1087},{"code":1085,"language":306,"meta":7,"className":1086},"async function getDownstreamLineage(nodeId: string, maxDepth: number = 5): Promise\u003CDataNode[]> {\n  const query = `\n    MATCH path = (source:DataNode {node_id: $nodeId})-[:READS_FROM|WRITES_TO*1..${maxDepth}]->(target:DataNode)\n    RETURN DISTINCT target\n    ORDER BY target.created_at DESC\n  `;\n  \n  const result = await graphDb.run(query, { nodeId });\n  return result.records.map(record => record.get(\"target\").properties);\n}\n\n// 使用\nconst downstreamNodes = await getDownstreamLineage(\"prod_db.public.users\", 3);\nconsole.log(\"Downstream nodes:\", downstreamNodes.map(n => n.name));\n// Output: [\"Customer Support Agent\", \"Analytics Dashboard\", \"ML Model\", ...]\n",[308],[1088],{"type":24,"tag":311,"props":1089,"children":1090},{"__ignoreMap":7},[1091],{"type":30,"value":1085},{"type":24,"tag":91,"props":1093,"children":1095},{"id":1094},"影响范围分析",[1096],{"type":30,"value":1094},{"type":24,"tag":33,"props":1098,"children":1099},{},[1100],{"type":30,"value":1101},"当需要修改某个数据源时，评估影响范围：",{"type":24,"tag":303,"props":1103,"children":1106},{"code":1104,"language":306,"meta":7,"className":1105},"async function assessImpact(nodeId: string): Promise\u003CImpactAnalysis> {\n  // 获取所有下游节点\n  const downstreamNodes = await getDownstreamLineage(nodeId, 10);\n  \n  // 分类统计\n  const impactByType: Record\u003Cstring, number> = {};\n  for (const node of downstreamNodes) {\n    impactByType[node.node_type] = (impactByType[node.node_type] || 0) + 1;\n  }\n  \n  // 识别关键系统（生产环境的 agent、对外 API 等）\n  const criticalSystems = downstreamNodes.filter(node => \n    node.metadata?.environment === \"production\" &&\n    (node.node_type === \"agent\" || node.node_type === \"api_endpoint\")\n  );\n  \n  // 估算受影响的用户数\n  const affectedUsers = await estimateAffectedUsers(downstreamNodes);\n  \n  return {\n    total_downstream_nodes: downstreamNodes.length,\n    impact_by_type: impactByType,\n    critical_systems: criticalSystems.map(n => ({\n      node_id: n.node_id,\n      name: n.name,\n      owner: n.owner,\n    })),\n    estimated_affected_users: affectedUsers,\n    recommended_actions: [\n      `Notify owners of ${criticalSystems.length} critical systems`,\n      `Schedule regression testing for affected agents and models`,\n      `Prepare rollback plan in case of issues`,\n    ],\n  };\n}\n\n// 使用\nconst impact = await assessImpact(\"prod_db.public.users\");\nconsole.log(\"Impact analysis:\", impact);\n",[308],[1107],{"type":24,"tag":311,"props":1108,"children":1109},{"__ignoreMap":7},[1110],{"type":30,"value":1104},{"type":24,"tag":91,"props":1112,"children":1114},{"id":1113},"血缘可视化",[1115],{"type":30,"value":1113},{"type":24,"tag":33,"props":1117,"children":1118},{},[1119],{"type":30,"value":1120},"使用 D3.js、Cytoscape.js 或 Graphviz 构建交互式血缘图：",{"type":24,"tag":303,"props":1122,"children":1125},{"code":1123,"language":306,"meta":7,"className":1124},"import cytoscape from \"cytoscape\";\n\nasync function renderLineageGraph(nodeId: string) {\n  // 获取血缘数据\n  const upstream = await getUpstreamLineage(nodeId, 3);\n  const downstream = await getDownstreamLineage(nodeId, 3);\n  const edges = await getEdgesBetweenNodes([nodeId, ...upstream.map(n => n.node_id), ...downstream.map(n => n.node_id)]);\n  \n  // 构建 Cytoscape 元素\n  const elements = [\n    ...upstream.map(node => ({\n      data: { id: node.node_id, label: node.name, type: node.node_type },\n      classes: \"upstream\",\n    })),\n    {\n      data: { id: nodeId, label: \"Current Node\", type: \"current\" },\n      classes: \"current\",\n    },\n    ...downstream.map(node => ({\n      data: { id: node.node_id, label: node.name, type: node.node_type },\n      classes: \"downstream\",\n    })),\n    ...edges.map(edge => ({\n      data: {\n        source: edge.source_node_id,\n        target: edge.target_node_id,\n        label: edge.edge_type,\n      },\n    })),\n  ];\n  \n  // 渲染图形\n  const cy = cytoscape({\n    container: document.getElementById(\"lineage-graph\"),\n    elements: elements,\n    style: [\n      {\n        selector: \".upstream\",\n        style: {\n          \"background-color\": \"#3498db\",\n          \"label\": \"data(label)\",\n        },\n      },\n      {\n        selector: \".current\",\n        style: {\n          \"background-color\": \"#e74c3c\",\n          \"label\": \"data(label)\",\n          \"width\": 40,\n          \"height\": 40,\n        },\n      },\n      {\n        selector: \".downstream\",\n        style: {\n          \"background-color\": \"#2ecc71\",\n          \"label\": \"data(label)\",\n        },\n      },\n      {\n        selector: \"edge\",\n        style: {\n          \"width\": 2,\n          \"line-color\": \"#95a5a6\",\n          \"target-arrow-color\": \"#95a5a6\",\n          \"target-arrow-shape\": \"triangle\",\n          \"label\": \"data(label)\",\n          \"font-size\": 10,\n        },\n      },\n    ],\n    layout: {\n      name: \"dagre\",\n      rankDir: \"LR\",\n    },\n  });\n  \n  // 添加交互\n  cy.on(\"tap\", \"node\", (evt) => {\n    const node = evt.target;\n    showNodeDetails(node.data(\"id\"));\n  });\n}\n",[308],[1126],{"type":24,"tag":311,"props":1127,"children":1128},{"__ignoreMap":7},[1129],{"type":30,"value":1123},{"type":24,"tag":25,"props":1131,"children":1133},{"id":1132},"实战案例",[1134],{"type":30,"value":1132},{"type":24,"tag":91,"props":1136,"children":1138},{"id":1137},"案例一数据污染溯源",[1139],{"type":30,"value":1140},"案例一：数据污染溯源",{"type":24,"tag":33,"props":1142,"children":1143},{},[1144,1149],{"type":24,"tag":44,"props":1145,"children":1146},{},[1147],{"type":30,"value":1148},"问题",{"type":30,"value":1150},"：Agent 输出的建议中包含过时的产品信息，导致客户投诉。",{"type":24,"tag":33,"props":1152,"children":1153},{},[1154,1159],{"type":24,"tag":44,"props":1155,"children":1156},{},[1157],{"type":30,"value":1158},"排查步骤",{"type":30,"value":353},{"type":24,"tag":956,"props":1161,"children":1162},{},[1163,1180,1198,1208,1218,1228,1238],{"type":24,"tag":59,"props":1164,"children":1165},{},[1166,1171,1173,1179],{"type":24,"tag":44,"props":1167,"children":1168},{},[1169],{"type":30,"value":1170},"定位问题节点",{"type":30,"value":1172},"：找到生成错误响应的 agent 运行实例（",{"type":24,"tag":311,"props":1174,"children":1176},{"className":1175},[],[1177],{"type":30,"value":1178},"node_response_001",{"type":30,"value":971},{"type":24,"tag":59,"props":1181,"children":1182},{},[1183,1188,1190,1196],{"type":24,"tag":44,"props":1184,"children":1185},{},[1186],{"type":30,"value":1187},"向上追溯",{"type":30,"value":1189},"：查询该响应的上游数据源，发现使用了 ",{"type":24,"tag":311,"props":1191,"children":1193},{"className":1192},[],[1194],{"type":30,"value":1195},"prod_db.public.products",{"type":30,"value":1197}," 表。",{"type":24,"tag":59,"props":1199,"children":1200},{},[1201,1206],{"type":24,"tag":44,"props":1202,"children":1203},{},[1204],{"type":30,"value":1205},"检查数据 freshness",{"type":30,"value":1207},"：发现该表的最后更新时间是 30 天前，而产品价格昨天已更新。",{"type":24,"tag":59,"props":1209,"children":1210},{},[1211,1216],{"type":24,"tag":44,"props":1212,"children":1213},{},[1214],{"type":30,"value":1215},"找出根因",{"type":30,"value":1217},"：ETL Pipeline 失败，导致产品表未同步最新数据。",{"type":24,"tag":59,"props":1219,"children":1220},{},[1221,1226],{"type":24,"tag":44,"props":1222,"children":1223},{},[1224],{"type":30,"value":1225},"影响评估",{"type":30,"value":1227},"：查询过去 30 天所有使用了该产品表的 agent 运行，发现有 1,200 个响应可能包含过时信息。",{"type":24,"tag":59,"props":1229,"children":1230},{},[1231,1236],{"type":24,"tag":44,"props":1232,"children":1233},{},[1234],{"type":30,"value":1235},"修复",{"type":30,"value":1237},"：重启 ETL Pipeline，重新训练受影响的产品推荐模型。",{"type":24,"tag":59,"props":1239,"children":1240},{},[1241,1246],{"type":24,"tag":44,"props":1242,"children":1243},{},[1244],{"type":30,"value":1245},"预防",{"type":30,"value":1247},"：增加数据 freshness 监控，当数据超过 24 小时未更新时自动告警。",{"type":24,"tag":91,"props":1249,"children":1251},{"id":1250},"案例二gdpr-删除验证",[1252],{"type":30,"value":1253},"案例二：GDPR 删除验证",{"type":24,"tag":33,"props":1255,"children":1256},{},[1257,1261],{"type":24,"tag":44,"props":1258,"children":1259},{},[1260],{"type":30,"value":1148},{"type":30,"value":1262},"：用户行使\"被遗忘权\"，要求删除所有个人数据。需要验证删除是否彻底。",{"type":24,"tag":33,"props":1264,"children":1265},{},[1266,1271],{"type":24,"tag":44,"props":1267,"children":1268},{},[1269],{"type":30,"value":1270},"验证步骤",{"type":30,"value":353},{"type":24,"tag":956,"props":1273,"children":1274},{},[1275,1308,1318,1328,1338],{"type":24,"tag":59,"props":1276,"children":1277},{},[1278,1283,1285,1291,1293,1299,1300,1306],{"type":24,"tag":44,"props":1279,"children":1280},{},[1281],{"type":30,"value":1282},"识别 PII 节点",{"type":30,"value":1284},"：找到所有包含该用户 PII 的数据节点（如 ",{"type":24,"tag":311,"props":1286,"children":1288},{"className":1287},[],[1289],{"type":30,"value":1290},"users",{"type":30,"value":1292}," 表、",{"type":24,"tag":311,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":30,"value":1298},"orders",{"type":30,"value":1292},{"type":24,"tag":311,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":30,"value":1305},"logs",{"type":30,"value":1307}," 表）。",{"type":24,"tag":59,"props":1309,"children":1310},{},[1311,1316],{"type":24,"tag":44,"props":1312,"children":1313},{},[1314],{"type":30,"value":1315},"向下追溯",{"type":30,"value":1317},"：查询这些 PII 节点的所有下游使用者，找出可能复制了 PII 的系统。",{"type":24,"tag":59,"props":1319,"children":1320},{},[1321,1326],{"type":24,"tag":44,"props":1322,"children":1323},{},[1324],{"type":30,"value":1325},"验证删除",{"type":30,"value":1327},"：在每个下游系统中检查该用户的 PII 是否已被删除或匿名化。",{"type":24,"tag":59,"props":1329,"children":1330},{},[1331,1336],{"type":24,"tag":44,"props":1332,"children":1333},{},[1334],{"type":30,"value":1335},"生成报告",{"type":30,"value":1337},"：生成 GDPR 删除验证报告，列出所有检查过的系统和验证结果。",{"type":24,"tag":59,"props":1339,"children":1340},{},[1341,1346],{"type":24,"tag":44,"props":1342,"children":1343},{},[1344],{"type":30,"value":1345},"审计日志",{"type":30,"value":1347},"：将验证过程和结果记录到审计日志中，作为合规证据。",{"type":24,"tag":91,"props":1349,"children":1351},{"id":1350},"案例三模型调试",[1352],{"type":30,"value":1353},"案例三：模型调试",{"type":24,"tag":33,"props":1355,"children":1356},{},[1357,1361],{"type":24,"tag":44,"props":1358,"children":1359},{},[1360],{"type":30,"value":1148},{"type":30,"value":1362},"：新部署的推荐模型准确率下降 15%。",{"type":24,"tag":33,"props":1364,"children":1365},{},[1366,1371],{"type":24,"tag":44,"props":1367,"children":1368},{},[1369],{"type":30,"value":1370},"调试步骤",{"type":30,"value":353},{"type":24,"tag":956,"props":1373,"children":1374},{},[1375,1393,1418,1428,1444,1454],{"type":24,"tag":59,"props":1376,"children":1377},{},[1378,1383,1385,1391],{"type":24,"tag":44,"props":1379,"children":1380},{},[1381],{"type":30,"value":1382},"对比血缘",{"type":30,"value":1384},"：对比新旧模型的血缘图，发现新模型多了一个上游数据源 ",{"type":24,"tag":311,"props":1386,"children":1388},{"className":1387},[],[1389],{"type":30,"value":1390},"prod_db.public.user_behavior_v2",{"type":30,"value":1392},"。",{"type":24,"tag":59,"props":1394,"children":1395},{},[1396,1401,1403,1409,1411,1417],{"type":24,"tag":44,"props":1397,"children":1398},{},[1399],{"type":30,"value":1400},"检查数据质量",{"type":30,"value":1402},"：发现 ",{"type":24,"tag":311,"props":1404,"children":1406},{"className":1405},[],[1407],{"type":30,"value":1408},"user_behavior_v2",{"type":30,"value":1410}," 表中 30% 的记录缺少关键字段 ",{"type":24,"tag":311,"props":1412,"children":1414},{"className":1413},[],[1415],{"type":30,"value":1416},"session_duration",{"type":30,"value":1392},{"type":24,"tag":59,"props":1419,"children":1420},{},[1421,1426],{"type":24,"tag":44,"props":1422,"children":1423},{},[1424],{"type":30,"value":1425},"回溯变更",{"type":30,"value":1427},"：查询该表的变更记录，发现上周进行了 schema 迁移，但未迁移历史数据。",{"type":24,"tag":59,"props":1429,"children":1430},{},[1431,1435,1437,1442],{"type":24,"tag":44,"props":1432,"children":1433},{},[1434],{"type":30,"value":1235},{"type":30,"value":1436},"：回填历史数据的 ",{"type":24,"tag":311,"props":1438,"children":1440},{"className":1439},[],[1441],{"type":30,"value":1416},{"type":30,"value":1443}," 字段，或修改模型以处理缺失值。",{"type":24,"tag":59,"props":1445,"children":1446},{},[1447,1452],{"type":24,"tag":44,"props":1448,"children":1449},{},[1450],{"type":30,"value":1451},"验证",{"type":30,"value":1453},"：重新训练模型，验证准确率恢复到正常水平。",{"type":24,"tag":59,"props":1455,"children":1456},{},[1457,1461],{"type":24,"tag":44,"props":1458,"children":1459},{},[1460],{"type":30,"value":1245},{"type":30,"value":1462},"：在 ETL Pipeline 中增加数据质量检查，当缺失率超过阈值时阻止数据流入。",{"type":24,"tag":25,"props":1464,"children":1466},{"id":1465},"faq",[1467],{"type":30,"value":1468},"FAQ",{"type":24,"tag":91,"props":1470,"children":1472},{"id":1471},"q1-data-lineage-和普通日志有什么区别",[1473],{"type":30,"value":1474},"Q1: Data Lineage 和普通日志有什么区别？",{"type":24,"tag":33,"props":1476,"children":1477},{},[1478,1483],{"type":24,"tag":44,"props":1479,"children":1480},{},[1481],{"type":30,"value":1482},"A",{"type":30,"value":1484},":",{"type":24,"tag":55,"props":1486,"children":1487},{},[1488,1498,1508,1518],{"type":24,"tag":59,"props":1489,"children":1490},{},[1491,1496],{"type":24,"tag":44,"props":1492,"children":1493},{},[1494],{"type":30,"value":1495},"粒度不同",{"type":30,"value":1497},"：日志记录事件（如 \"API called\"），血缘记录数据实体之间的关系（如 \"Table A feeds into Model B\"）。",{"type":24,"tag":59,"props":1499,"children":1500},{},[1501,1506],{"type":24,"tag":44,"props":1502,"children":1503},{},[1504],{"type":30,"value":1505},"目的不同",{"type":30,"value":1507},"：日志用于调试和监控，血缘用于追溯数据来源和影响分析。",{"type":24,"tag":59,"props":1509,"children":1510},{},[1511,1516],{"type":24,"tag":44,"props":1512,"children":1513},{},[1514],{"type":30,"value":1515},"结构不同",{"type":30,"value":1517},"：日志是线性的时间序列，血缘是图结构（节点和边）。",{"type":24,"tag":59,"props":1519,"children":1520},{},[1521,1526],{"type":24,"tag":44,"props":1522,"children":1523},{},[1524],{"type":30,"value":1525},"保留期限不同",{"type":30,"value":1527},"：日志通常保留 30-90 天，血缘需要长期保留（至少 1-7 年）。",{"type":24,"tag":91,"props":1529,"children":1531},{"id":1530},"q2-如何记录中间产物的血缘关系",[1532],{"type":30,"value":1533},"Q2: 如何记录中间产物的血缘关系？",{"type":24,"tag":33,"props":1535,"children":1536},{},[1537,1541],{"type":24,"tag":44,"props":1538,"children":1539},{},[1540],{"type":30,"value":1482},{"type":30,"value":1484},{"type":24,"tag":55,"props":1543,"children":1544},{},[1545,1555,1565,1591],{"type":24,"tag":59,"props":1546,"children":1547},{},[1548,1553],{"type":24,"tag":44,"props":1549,"children":1550},{},[1551],{"type":30,"value":1552},"为每个中间产物创建节点",{"type":30,"value":1554},"：如缓存、临时表、模型中间层。",{"type":24,"tag":59,"props":1556,"children":1557},{},[1558,1563],{"type":24,"tag":44,"props":1559,"children":1560},{},[1561],{"type":30,"value":1562},"记录转换逻辑",{"type":30,"value":1564},"：在边上记录 transformation 字段，说明数据如何从一个节点转换到另一个节点。",{"type":24,"tag":59,"props":1566,"children":1567},{},[1568,1573,1575,1581,1583,1589],{"type":24,"tag":44,"props":1569,"children":1570},{},[1571],{"type":30,"value":1572},"关联请求 ID",{"type":30,"value":1574},"：使用 ",{"type":24,"tag":311,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":30,"value":1580},"request_id",{"type":30,"value":1582}," 或 ",{"type":24,"tag":311,"props":1584,"children":1586},{"className":1585},[],[1587],{"type":30,"value":1588},"session_id",{"type":30,"value":1590}," 关联同一流程中的所有节点和边。",{"type":24,"tag":59,"props":1592,"children":1593},{},[1594,1599],{"type":24,"tag":44,"props":1595,"children":1596},{},[1597],{"type":30,"value":1598},"版本控制",{"type":30,"value":1600},"：为模型、代码等节点添加版本号，便于追溯历史变更。",{"type":24,"tag":91,"props":1602,"children":1604},{"id":1603},"q3-血缘数据量太大会影响性能吗",[1605],{"type":30,"value":1606},"Q3: 血缘数据量太大会影响性能吗？",{"type":24,"tag":33,"props":1608,"children":1609},{},[1610,1614],{"type":24,"tag":44,"props":1611,"children":1612},{},[1613],{"type":30,"value":1482},{"type":30,"value":1615},": 会的。优化建议：",{"type":24,"tag":55,"props":1617,"children":1618},{},[1619,1629,1639,1649],{"type":24,"tag":59,"props":1620,"children":1621},{},[1622,1627],{"type":24,"tag":44,"props":1623,"children":1624},{},[1625],{"type":30,"value":1626},"采样策略",{"type":30,"value":1628},"：对于高频操作（如每秒数千次的 API 调用），可以采样记录血缘（如每 100 次记录 1 次）。",{"type":24,"tag":59,"props":1630,"children":1631},{},[1632,1637],{"type":24,"tag":44,"props":1633,"children":1634},{},[1635],{"type":30,"value":1636},"聚合存储",{"type":30,"value":1638},"：将细粒度的血缘聚合成粗粒度（如按小时聚合，而不是每条请求都记录）。",{"type":24,"tag":59,"props":1640,"children":1641},{},[1642,1647],{"type":24,"tag":44,"props":1643,"children":1644},{},[1645],{"type":30,"value":1646},"分层存储",{"type":30,"value":1648},"：热数据（最近 7 天）存储在图数据库中，冷数据（7 天前）归档到对象存储。",{"type":24,"tag":59,"props":1650,"children":1651},{},[1652,1657,1659,1665,1667,1673,1674,1680],{"type":24,"tag":44,"props":1653,"children":1654},{},[1655],{"type":30,"value":1656},"索引优化",{"type":30,"value":1658},"：在常用查询字段（如 ",{"type":24,"tag":311,"props":1660,"children":1662},{"className":1661},[],[1663],{"type":30,"value":1664},"node_type",{"type":30,"value":1666},"、",{"type":24,"tag":311,"props":1668,"children":1670},{"className":1669},[],[1671],{"type":30,"value":1672},"classification",{"type":30,"value":1666},{"type":24,"tag":311,"props":1675,"children":1677},{"className":1676},[],[1678],{"type":30,"value":1679},"owner",{"type":30,"value":1681},"）上建立索引。",{"type":24,"tag":91,"props":1683,"children":1685},{"id":1684},"q4-如何实现跨系统的血缘追踪",[1686],{"type":30,"value":1687},"Q4: 如何实现跨系统的血缘追踪？",{"type":24,"tag":33,"props":1689,"children":1690},{},[1691,1695],{"type":24,"tag":44,"props":1692,"children":1693},{},[1694],{"type":30,"value":1482},{"type":30,"value":1484},{"type":24,"tag":55,"props":1697,"children":1698},{},[1699,1717,1727,1744],{"type":24,"tag":59,"props":1700,"children":1701},{},[1702,1707,1709,1715],{"type":24,"tag":44,"props":1703,"children":1704},{},[1705],{"type":30,"value":1706},"统一标识符",{"type":30,"value":1708},"：使用全局唯一的 ",{"type":24,"tag":311,"props":1710,"children":1712},{"className":1711},[],[1713],{"type":30,"value":1714},"node_id",{"type":30,"value":1716},"（如 UUID），确保跨系统的节点可以正确关联。",{"type":24,"tag":59,"props":1718,"children":1719},{},[1720,1725],{"type":24,"tag":44,"props":1721,"children":1722},{},[1723],{"type":30,"value":1724},"标准化协议",{"type":30,"value":1726},"：定义统一的血缘数据模型和 API，各系统遵循同一标准。",{"type":24,"tag":59,"props":1728,"children":1729},{},[1730,1735,1737,1743],{"type":24,"tag":44,"props":1731,"children":1732},{},[1733],{"type":30,"value":1734},"分布式追踪",{"type":30,"value":1736},"：使用 OpenTelemetry、Jaeger 等分布式追踪系统，跨系统传递 ",{"type":24,"tag":311,"props":1738,"children":1740},{"className":1739},[],[1741],{"type":30,"value":1742},"trace_id",{"type":30,"value":1392},{"type":24,"tag":59,"props":1745,"children":1746},{},[1747,1752],{"type":24,"tag":44,"props":1748,"children":1749},{},[1750],{"type":30,"value":1751},"中央存储",{"type":30,"value":1753},"：将所有系统的血缘数据集中存储在一个中央图库中。",{"type":24,"tag":91,"props":1755,"children":1757},{"id":1756},"q5-如何验证血缘数据的准确性",[1758],{"type":30,"value":1759},"Q5: 如何验证血缘数据的准确性？",{"type":24,"tag":33,"props":1761,"children":1762},{},[1763,1767],{"type":24,"tag":44,"props":1764,"children":1765},{},[1766],{"type":30,"value":1482},{"type":30,"value":1484},{"type":24,"tag":55,"props":1769,"children":1770},{},[1771,1781,1791,1801,1811],{"type":24,"tag":59,"props":1772,"children":1773},{},[1774,1779],{"type":24,"tag":44,"props":1775,"children":1776},{},[1777],{"type":30,"value":1778},"自动化测试",{"type":30,"value":1780},"：定期运行血缘验证脚本，检查是否有断裂的血缘链、孤立的节点。",{"type":24,"tag":59,"props":1782,"children":1783},{},[1784,1789],{"type":24,"tag":44,"props":1785,"children":1786},{},[1787],{"type":30,"value":1788},"人工抽检",{"type":30,"value":1790},"：随机抽取一些血缘记录，人工验证其准确性。",{"type":24,"tag":59,"props":1792,"children":1793},{},[1794,1799],{"type":24,"tag":44,"props":1795,"children":1796},{},[1797],{"type":30,"value":1798},"对比实际数据流",{"type":30,"value":1800},"：将血缘图与实际的数据流进行对比，发现不一致的地方。",{"type":24,"tag":59,"props":1802,"children":1803},{},[1804,1809],{"type":24,"tag":44,"props":1805,"children":1806},{},[1807],{"type":30,"value":1808},"用户反馈",{"type":30,"value":1810},"：允许数据工程师和分析师报告错误的血缘关系。",{"type":24,"tag":59,"props":1812,"children":1813},{},[1814,1818],{"type":24,"tag":44,"props":1815,"children":1816},{},[1817],{"type":30,"value":1598},{"type":30,"value":1819},"：对血缘数据进行版本控制，便于回溯和审计。",{"type":24,"tag":91,"props":1821,"children":1823},{"id":1822},"q6-gdpr-删除请求如何通过血缘追踪",[1824],{"type":30,"value":1825},"Q6: GDPR 删除请求如何通过血缘追踪？",{"type":24,"tag":33,"props":1827,"children":1828},{},[1829,1833],{"type":24,"tag":44,"props":1830,"children":1831},{},[1832],{"type":30,"value":1482},{"type":30,"value":1484},{"type":24,"tag":956,"props":1835,"children":1836},{},[1837,1846,1855,1865,1874],{"type":24,"tag":59,"props":1838,"children":1839},{},[1840,1844],{"type":24,"tag":44,"props":1841,"children":1842},{},[1843],{"type":30,"value":1282},{"type":30,"value":1845},"：找到所有包含该用户 PII 的节点。",{"type":24,"tag":59,"props":1847,"children":1848},{},[1849,1853],{"type":24,"tag":44,"props":1850,"children":1851},{},[1852],{"type":30,"value":1315},{"type":30,"value":1854},"：找出所有使用了这些 PII 的下游节点。",{"type":24,"tag":59,"props":1856,"children":1857},{},[1858,1863],{"type":24,"tag":44,"props":1859,"children":1860},{},[1861],{"type":30,"value":1862},"执行删除",{"type":30,"value":1864},"：在每个节点上执行删除或匿名化操作。",{"type":24,"tag":59,"props":1866,"children":1867},{},[1868,1872],{"type":24,"tag":44,"props":1869,"children":1870},{},[1871],{"type":30,"value":1325},{"type":30,"value":1873},"：再次查询血缘图，确认所有 PII 已被删除。",{"type":24,"tag":59,"props":1875,"children":1876},{},[1877,1882],{"type":24,"tag":44,"props":1878,"children":1879},{},[1880],{"type":30,"value":1881},"记录证据",{"type":30,"value":1883},"：将删除过程和验证结果记录到审计日志中。",{"type":24,"tag":33,"props":1885,"children":1886},{},[1887,1892],{"type":24,"tag":44,"props":1888,"children":1889},{},[1890],{"type":30,"value":1891},"注意",{"type":30,"value":1893},"：某些系统可能无法完全删除数据（如备份、审计日志），需要在隐私政策中说明，并获得用户的同意。",{"type":24,"tag":91,"props":1895,"children":1897},{"id":1896},"q7-如何选择-graph-db-方案",[1898],{"type":30,"value":1899},"Q7: 如何选择 Graph DB 方案？",{"type":24,"tag":33,"props":1901,"children":1902},{},[1903,1907],{"type":24,"tag":44,"props":1904,"children":1905},{},[1906],{"type":30,"value":1482},{"type":30,"value":1908},": 考虑以下因素：",{"type":24,"tag":55,"props":1910,"children":1911},{},[1912,1922,1932,1942],{"type":24,"tag":59,"props":1913,"children":1914},{},[1915,1920],{"type":24,"tag":44,"props":1916,"children":1917},{},[1918],{"type":30,"value":1919},"规模",{"type":30,"value":1921},"：预计的节点数和边数，是否需要水平扩展。",{"type":24,"tag":59,"props":1923,"children":1924},{},[1925,1930],{"type":24,"tag":44,"props":1926,"children":1927},{},[1928],{"type":30,"value":1929},"查询性能",{"type":30,"value":1931},"：递归查询的性能要求。",{"type":24,"tag":59,"props":1933,"children":1934},{},[1935,1940],{"type":24,"tag":44,"props":1936,"children":1937},{},[1938],{"type":30,"value":1939},"易用性",{"type":30,"value":1941},"：查询语言的学习曲线、可视化工具的支持。",{"type":24,"tag":59,"props":1943,"children":1944},{},[1945,1950],{"type":24,"tag":44,"props":1946,"children":1947},{},[1948],{"type":30,"value":1949},"成本",{"type":30,"value":1951},"：许可证费用、运维成本、云服务费",{"title":7,"searchDepth":1953,"depth":1953,"links":1954},3,[1955,1957,1962,1968,1973,1978,1983,1988],{"id":27,"depth":1956,"text":31},2,{"id":86,"depth":1956,"text":89,"children":1958},[1959,1960,1961],{"id":93,"depth":1953,"text":96},{"id":137,"depth":1953,"text":140},{"id":181,"depth":1953,"text":184},{"id":240,"depth":1956,"text":240,"children":1963},[1964,1965,1966,1967],{"id":245,"depth":1953,"text":245},{"id":298,"depth":1953,"text":301},{"id":317,"depth":1953,"text":320},{"id":332,"depth":1953,"text":335},{"id":367,"depth":1956,"text":367,"children":1969},[1970,1971,1972],{"id":372,"depth":1953,"text":375},{"id":483,"depth":1953,"text":486},{"id":590,"depth":1953,"text":593},{"id":687,"depth":1956,"text":687,"children":1974},[1975,1976,1977],{"id":692,"depth":1953,"text":695},{"id":785,"depth":1953,"text":788},{"id":917,"depth":1953,"text":920},{"id":1046,"depth":1956,"text":1046,"children":1979},[1980,1981,1982],{"id":1051,"depth":1953,"text":1051},{"id":1094,"depth":1953,"text":1094},{"id":1113,"depth":1953,"text":1113},{"id":1132,"depth":1956,"text":1132,"children":1984},[1985,1986,1987],{"id":1137,"depth":1953,"text":1140},{"id":1250,"depth":1953,"text":1253},{"id":1350,"depth":1953,"text":1353},{"id":1465,"depth":1956,"text":1468,"children":1989},[1990,1991,1992,1993,1994,1995,1996],{"id":1471,"depth":1953,"text":1474},{"id":1530,"depth":1953,"text":1533},{"id":1603,"depth":1953,"text":1606},{"id":1684,"depth":1953,"text":1687},{"id":1756,"depth":1953,"text":1759},{"id":1822,"depth":1953,"text":1825},{"id":1896,"depth":1953,"text":1899},"markdown","content:topics:ai:ai-agent-data-lineage-tracking-provenance.md","content","topics/ai/ai-agent-data-lineage-tracking-provenance.md","topics/ai/ai-agent-data-lineage-tracking-provenance","md",[2004,3160,4107],{"_path":2005,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":2006,"description":2007,"date":2008,"topic":5,"author":11,"tags":2009,"image":2015,"imageAlt":2016,"pexelsPhotoId":2017,"pexelsUrl":2018,"readingTime":2019,"body":2020,"_type":1997,"_id":3157,"_source":1999,"_file":3158,"_stem":3159,"_extension":2002},"/topics/ai/cursor-keyboard-shortcuts-cheatsheet","Cursor 快捷键速查表（macOS/Windows）：从“会用”到“能提效”的 10 个工作流","把 Cursor 常用快捷键按任务分组（查代码、改代码、多文件、对话、审查与回滚），给出可直接照抄的工作流与最小回归清单，避免“快捷键背了也没变快”。","2026-03-02",[2010,2011,2012,2013,2014],"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":21,"children":2021,"toc":3131},[2022,2027,2045,2050,2077,2082,2119,2123,2129,2134,2167,2172,2195,2198,2204,2209,2433,2442,2445,2451,2457,2476,2484,2505,2510,2516,2531,2562,2567,2580,2586,2605,2623,2631,2636,2642,2647,2668,2676,2682,2687,2710,2715,2721,2734,2740,2757,2775,2781,2792,2810,2816,2826,2832,2837,2880,2883,2889,2897,2950,2953,2959,2965,2970,2975,2998,3015,3020,3045,3048,3054,3060,3065,3071,3076,3082,3087,3090,3096],{"type":24,"tag":33,"props":2023,"children":2024},{},[2025],{"type":30,"value":2026},"如果你在搜“Cursor 快捷键”，你大概率不是想背一张表，而是想解决这类问题：",{"type":24,"tag":55,"props":2028,"children":2029},{},[2030,2035,2040],{"type":24,"tag":59,"props":2031,"children":2032},{},[2033],{"type":30,"value":2034},"为什么我用了 AI，还是很慢？（对话来回太多、改动不可控）",{"type":24,"tag":59,"props":2036,"children":2037},{},[2038],{"type":30,"value":2039},"为什么它“看起来懂了”，却改错文件/改出回归？（上下文与范围没锁住）",{"type":24,"tag":59,"props":2041,"children":2042},{},[2043],{"type":30,"value":2044},"多文件改动怎么做得安全？（验收、回滚、最小回归集）",{"type":24,"tag":33,"props":2046,"children":2047},{},[2048],{"type":30,"value":2049},"这篇文章给你两份东西：",{"type":24,"tag":956,"props":2051,"children":2052},{},[2053,2065],{"type":24,"tag":59,"props":2054,"children":2055},{},[2056,2058,2063],{"type":30,"value":2057},"一张",{"type":24,"tag":44,"props":2059,"children":2060},{},[2061],{"type":30,"value":2062},"按任务分组",{"type":30,"value":2064},"的快捷键表（不是按功能堆在一起）",{"type":24,"tag":59,"props":2066,"children":2067},{},[2068,2070,2075],{"type":30,"value":2069},"一套“从需求到落地”的",{"type":24,"tag":44,"props":2071,"children":2072},{},[2073],{"type":30,"value":2074},"最小闭环工作流",{"type":30,"value":2076},"（每一步都有快捷键）",{"type":24,"tag":33,"props":2078,"children":2079},{},[2080],{"type":30,"value":2081},"想看系统玩法：",{"type":24,"tag":55,"props":2083,"children":2084},{},[2085,2097,2108],{"type":24,"tag":59,"props":2086,"children":2087},{},[2088,2090],{"type":30,"value":2089},"入门教程看：",{"type":24,"tag":2091,"props":2092,"children":2094},"a",{"href":2093},"/topics/ai/cursor-tutorial",[2095],{"type":30,"value":2096},"Cursor 使用教程（2026）",{"type":24,"tag":59,"props":2098,"children":2099},{},[2100,2102],{"type":30,"value":2101},"进阶玩法看：",{"type":24,"tag":2091,"props":2103,"children":2105},{"href":2104},"/topics/ai/cursor-editor-guide",[2106],{"type":30,"value":2107},"Cursor 编辑器深度玩法",{"type":24,"tag":59,"props":2109,"children":2110},{},[2111,2113],{"type":30,"value":2112},"规则与忽略看：",{"type":24,"tag":2091,"props":2114,"children":2116},{"href":2115},"/topics/ai/cursor-rules-cursorrules",[2117],{"type":30,"value":2118},"Cursor Rules 与 .cursorrules",{"type":24,"tag":2120,"props":2121,"children":2122},"hr",{},[],{"type":24,"tag":25,"props":2124,"children":2126},{"id":2125},"先给结论提效不是按得快而是闭环更短",[2127],{"type":30,"value":2128},"先给结论：提效不是“按得快”，而是“闭环更短”",{"type":24,"tag":33,"props":2130,"children":2131},{},[2132],{"type":30,"value":2133},"你可以把 Cursor 的快捷键理解为 3 条流水线：",{"type":24,"tag":55,"props":2135,"children":2136},{},[2137,2147,2157],{"type":24,"tag":59,"props":2138,"children":2139},{},[2140,2145],{"type":24,"tag":44,"props":2141,"children":2142},{},[2143],{"type":30,"value":2144},"改一小段",{"type":30,"value":2146},"（内联编辑）：把改动限制在一个函数/一段样式",{"type":24,"tag":59,"props":2148,"children":2149},{},[2150,2155],{"type":24,"tag":44,"props":2151,"children":2152},{},[2153],{"type":30,"value":2154},"改一组文件",{"type":30,"value":2156},"（Composer）：把改动限制在一组明确文件，并要求输出 diff + 验收点",{"type":24,"tag":59,"props":2158,"children":2159},{},[2160,2165],{"type":24,"tag":44,"props":2161,"children":2162},{},[2163],{"type":30,"value":2164},"聊清楚再动手",{"type":30,"value":2166},"（侧边对话）：先对齐目标、范围、验收、回滚",{"type":24,"tag":33,"props":2168,"children":2169},{},[2170],{"type":30,"value":2171},"当你觉得“它乱改/改太大”时，往往不是快捷键没记住，而是缺了两件事：",{"type":24,"tag":55,"props":2173,"children":2174},{},[2175,2185],{"type":24,"tag":59,"props":2176,"children":2177},{},[2178,2180],{"type":30,"value":2179},"没有在动手前锁定",{"type":24,"tag":44,"props":2181,"children":2182},{},[2183],{"type":30,"value":2184},"范围",{"type":24,"tag":59,"props":2186,"children":2187},{},[2188,2190],{"type":30,"value":2189},"没有在接受改动前准备",{"type":24,"tag":44,"props":2191,"children":2192},{},[2193],{"type":30,"value":2194},"验收/回滚",{"type":24,"tag":2120,"props":2196,"children":2197},{},[],{"type":24,"tag":25,"props":2199,"children":2201},{"id":2200},"快捷键速查表按任务分组",[2202],{"type":30,"value":2203},"快捷键速查表（按任务分组）",{"type":24,"tag":33,"props":2205,"children":2206},{},[2207],{"type":30,"value":2208},"说明：下表按“你正在做什么”组织，而不是按“功能名字”组织。不同版本快捷键可能略有差异，但核心逻辑一致。",{"type":24,"tag":2210,"props":2211,"children":2212},"table",{},[2213,2242],{"type":24,"tag":2214,"props":2215,"children":2216},"thead",{},[2217],{"type":24,"tag":2218,"props":2219,"children":2220},"tr",{},[2221,2227,2232,2237],{"type":24,"tag":2222,"props":2223,"children":2224},"th",{},[2225],{"type":30,"value":2226},"任务",{"type":24,"tag":2222,"props":2228,"children":2229},{},[2230],{"type":30,"value":2231},"macOS",{"type":24,"tag":2222,"props":2233,"children":2234},{},[2235],{"type":30,"value":2236},"Windows",{"type":24,"tag":2222,"props":2238,"children":2239},{},[2240],{"type":30,"value":2241},"你该在什么时候用",{"type":24,"tag":2243,"props":2244,"children":2245},"tbody",{},[2246,2278,2309,2340,2371,2402],{"type":24,"tag":2218,"props":2247,"children":2248},{},[2249,2255,2264,2273],{"type":24,"tag":2250,"props":2251,"children":2252},"td",{},[2253],{"type":30,"value":2254},"改一小段（最安全）",{"type":24,"tag":2250,"props":2256,"children":2257},{},[2258],{"type":24,"tag":311,"props":2259,"children":2261},{"className":2260},[],[2262],{"type":30,"value":2263},"Cmd + K",{"type":24,"tag":2250,"props":2265,"children":2266},{},[2267],{"type":24,"tag":311,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":30,"value":2272},"Ctrl + K",{"type":24,"tag":2250,"props":2274,"children":2275},{},[2276],{"type":30,"value":2277},"只想改一个函数/一段 CSS，不想动别的",{"type":24,"tag":2218,"props":2279,"children":2280},{},[2281,2286,2295,2304],{"type":24,"tag":2250,"props":2282,"children":2283},{},[2284],{"type":30,"value":2285},"打开 AI 对话（先对齐再动手）",{"type":24,"tag":2250,"props":2287,"children":2288},{},[2289],{"type":24,"tag":311,"props":2290,"children":2292},{"className":2291},[],[2293],{"type":30,"value":2294},"Cmd + L",{"type":24,"tag":2250,"props":2296,"children":2297},{},[2298],{"type":24,"tag":311,"props":2299,"children":2301},{"className":2300},[],[2302],{"type":30,"value":2303},"Ctrl + L",{"type":24,"tag":2250,"props":2305,"children":2306},{},[2307],{"type":30,"value":2308},"需要澄清目标、制定步骤、给验收点",{"type":24,"tag":2218,"props":2310,"children":2311},{},[2312,2317,2326,2335],{"type":24,"tag":2250,"props":2313,"children":2314},{},[2315],{"type":30,"value":2316},"多文件编辑（有组织地改一组文件）",{"type":24,"tag":2250,"props":2318,"children":2319},{},[2320],{"type":24,"tag":311,"props":2321,"children":2323},{"className":2322},[],[2324],{"type":30,"value":2325},"Cmd + I",{"type":24,"tag":2250,"props":2327,"children":2328},{},[2329],{"type":24,"tag":311,"props":2330,"children":2332},{"className":2331},[],[2333],{"type":30,"value":2334},"Ctrl + I",{"type":24,"tag":2250,"props":2336,"children":2337},{},[2338],{"type":30,"value":2339},"改动涉及多个文件：组件+样式+测试",{"type":24,"tag":2218,"props":2341,"children":2342},{},[2343,2348,2357,2366],{"type":24,"tag":2250,"props":2344,"children":2345},{},[2346],{"type":30,"value":2347},"把选中代码加入对话上下文",{"type":24,"tag":2250,"props":2349,"children":2350},{},[2351],{"type":24,"tag":311,"props":2352,"children":2354},{"className":2353},[],[2355],{"type":30,"value":2356},"Cmd + Shift + L",{"type":24,"tag":2250,"props":2358,"children":2359},{},[2360],{"type":24,"tag":311,"props":2361,"children":2363},{"className":2362},[],[2364],{"type":30,"value":2365},"Ctrl + Shift + L",{"type":24,"tag":2250,"props":2367,"children":2368},{},[2369],{"type":30,"value":2370},"让 AI 只看你选的片段（降低噪音）",{"type":24,"tag":2218,"props":2372,"children":2373},{},[2374,2379,2388,2397],{"type":24,"tag":2250,"props":2375,"children":2376},{},[2377],{"type":30,"value":2378},"接受当前建议",{"type":24,"tag":2250,"props":2380,"children":2381},{},[2382],{"type":24,"tag":311,"props":2383,"children":2385},{"className":2384},[],[2386],{"type":30,"value":2387},"Cmd + Y",{"type":24,"tag":2250,"props":2389,"children":2390},{},[2391],{"type":24,"tag":311,"props":2392,"children":2394},{"className":2393},[],[2395],{"type":30,"value":2396},"Ctrl + Y",{"type":24,"tag":2250,"props":2398,"children":2399},{},[2400],{"type":30,"value":2401},"你已经准备好验收/回滚，并确认改动范围",{"type":24,"tag":2218,"props":2403,"children":2404},{},[2405,2410,2419,2428],{"type":24,"tag":2250,"props":2406,"children":2407},{},[2408],{"type":30,"value":2409},"拒绝当前建议",{"type":24,"tag":2250,"props":2411,"children":2412},{},[2413],{"type":24,"tag":311,"props":2414,"children":2416},{"className":2415},[],[2417],{"type":30,"value":2418},"Cmd + N",{"type":24,"tag":2250,"props":2420,"children":2421},{},[2422],{"type":24,"tag":311,"props":2423,"children":2425},{"className":2424},[],[2426],{"type":30,"value":2427},"Ctrl + N",{"type":24,"tag":2250,"props":2429,"children":2430},{},[2431],{"type":30,"value":2432},"改得太大、改错方向，立刻收手",{"type":24,"tag":2434,"props":2435,"children":2436},"blockquote",{},[2437],{"type":24,"tag":33,"props":2438,"children":2439},{},[2440],{"type":30,"value":2441},"小技巧：把“改一小段”当默认路径。只有当你能清晰写出“会改哪几类文件、怎么验收”时再进入多文件。",{"type":24,"tag":2120,"props":2443,"children":2444},{},[],{"type":24,"tag":25,"props":2446,"children":2448},{"id":2447},"_10-个可直接照抄的提效工作流每个都能闭环",[2449],{"type":30,"value":2450},"10 个可直接照抄的提效工作流（每个都能闭环）",{"type":24,"tag":91,"props":2452,"children":2454},{"id":2453},"工作流-1需求计划小步改新手最稳",[2455],{"type":30,"value":2456},"工作流 1：需求→计划→小步改（新手最稳）",{"type":24,"tag":956,"props":2458,"children":2459},{},[2460,2471],{"type":24,"tag":59,"props":2461,"children":2462},{},[2463,2469],{"type":24,"tag":311,"props":2464,"children":2466},{"className":2465},[],[2467],{"type":30,"value":2468},"Cmd/Ctrl + L",{"type":30,"value":2470}," 打开对话",{"type":24,"tag":59,"props":2472,"children":2473},{},[2474],{"type":30,"value":2475},"先发这段（可复制）：",{"type":24,"tag":2434,"props":2477,"children":2478},{},[2479],{"type":24,"tag":33,"props":2480,"children":2481},{},[2482],{"type":30,"value":2483},"目标：……\n范围：只修改以下文件/模块：……\n非目标：……（明确不做）\n验收：……（可测试/可手动检查）\n输出格式：先给计划，再逐步执行；每一步写出 diff 摘要。",{"type":24,"tag":956,"props":2485,"children":2486},{"start":1953},[2487,2492],{"type":24,"tag":59,"props":2488,"children":2489},{},[2490],{"type":30,"value":2491},"让 AI 先给“计划（3~6 步）”，你确认后再执行",{"type":24,"tag":59,"props":2493,"children":2494},{},[2495,2497,2503],{"type":30,"value":2496},"任何一步涉及改代码：优先回到编辑区，选中片段用 ",{"type":24,"tag":311,"props":2498,"children":2500},{"className":2499},[],[2501],{"type":30,"value":2502},"Cmd/Ctrl + K",{"type":30,"value":2504}," 小步改",{"type":24,"tag":33,"props":2506,"children":2507},{},[2508],{"type":30,"value":2509},"为什么有效：你把“想法”变成了“可执行约束”，这就是 GEO（面向 AI/模型的可理解结构）。",{"type":24,"tag":91,"props":2511,"children":2513},{"id":2512},"工作流-2只改一个函数高频低风险",[2514],{"type":30,"value":2515},"工作流 2：只改一个函数（高频、低风险）",{"type":24,"tag":55,"props":2517,"children":2518},{},[2519],{"type":24,"tag":59,"props":2520,"children":2521},{},[2522,2524,2529],{"type":30,"value":2523},"选中函数 → ",{"type":24,"tag":311,"props":2525,"children":2527},{"className":2526},[],[2528],{"type":30,"value":2502},{"type":30,"value":2530}," → 输入指令：",{"type":24,"tag":2434,"props":2532,"children":2533},{},[2534,2539],{"type":24,"tag":33,"props":2535,"children":2536},{},[2537],{"type":30,"value":2538},"把这段改成更可读：",{"type":24,"tag":55,"props":2540,"children":2541},{},[2542,2547,2552,2557],{"type":24,"tag":59,"props":2543,"children":2544},{},[2545],{"type":30,"value":2546},"用 async/await",{"type":24,"tag":59,"props":2548,"children":2549},{},[2550],{"type":30,"value":2551},"错误处理不要吞掉",{"type":24,"tag":59,"props":2553,"children":2554},{},[2555],{"type":30,"value":2556},"添加类型（若可推断）",{"type":24,"tag":59,"props":2558,"children":2559},{},[2560],{"type":30,"value":2561},"不要改函数签名",{"type":24,"tag":33,"props":2563,"children":2564},{},[2565],{"type":30,"value":2566},"验收方式（强制）：",{"type":24,"tag":55,"props":2568,"children":2569},{},[2570,2575],{"type":24,"tag":59,"props":2571,"children":2572},{},[2573],{"type":30,"value":2574},"输出前后函数行为一致（输入/输出）",{"type":24,"tag":59,"props":2576,"children":2577},{},[2578],{"type":30,"value":2579},"失败分支有可观测日志（不要悄悄 return null）",{"type":24,"tag":91,"props":2581,"children":2583},{"id":2582},"工作流-3多文件改动先定文件清单",[2584],{"type":30,"value":2585},"工作流 3：多文件改动（先定“文件清单”）",{"type":24,"tag":956,"props":2587,"children":2588},{},[2589,2600],{"type":24,"tag":59,"props":2590,"children":2591},{},[2592,2598],{"type":24,"tag":311,"props":2593,"children":2595},{"className":2594},[],[2596],{"type":30,"value":2597},"Cmd/Ctrl + I",{"type":30,"value":2599}," 进入多文件",{"type":24,"tag":59,"props":2601,"children":2602},{},[2603],{"type":30,"value":2604},"先让 AI 输出：",{"type":24,"tag":55,"props":2606,"children":2607},{},[2608,2613,2618],{"type":24,"tag":59,"props":2609,"children":2610},{},[2611],{"type":30,"value":2612},"预计会改哪些文件（最多 5 个）",{"type":24,"tag":59,"props":2614,"children":2615},{},[2616],{"type":30,"value":2617},"每个文件改什么",{"type":24,"tag":59,"props":2619,"children":2620},{},[2621],{"type":30,"value":2622},"每一步怎么验收",{"type":24,"tag":956,"props":2624,"children":2625},{"start":1953},[2626],{"type":24,"tag":59,"props":2627,"children":2628},{},[2629],{"type":30,"value":2630},"你确认文件清单后再开始生成改动",{"type":24,"tag":33,"props":2632,"children":2633},{},[2634],{"type":30,"value":2635},"关键点：多文件最容易翻车的是“它把你没想到的文件也改了”。所以文件清单是第一道闸门。",{"type":24,"tag":91,"props":2637,"children":2639},{"id":2638},"工作流-4把上下文噪音砍掉防跑偏",[2640],{"type":30,"value":2641},"工作流 4：把“上下文噪音”砍掉（防跑偏）",{"type":24,"tag":33,"props":2643,"children":2644},{},[2645],{"type":30,"value":2646},"当你怀疑它在胡说/乱改时：",{"type":24,"tag":55,"props":2648,"children":2649},{},[2650,2663],{"type":24,"tag":59,"props":2651,"children":2652},{},[2653,2655,2661],{"type":30,"value":2654},"只选择关键代码片段 → ",{"type":24,"tag":311,"props":2656,"children":2658},{"className":2657},[],[2659],{"type":30,"value":2660},"Cmd/Ctrl + Shift + L",{"type":30,"value":2662}," 加入对话",{"type":24,"tag":59,"props":2664,"children":2665},{},[2666],{"type":30,"value":2667},"然后在对话里要求：",{"type":24,"tag":2434,"props":2669,"children":2670},{},[2671],{"type":24,"tag":33,"props":2672,"children":2673},{},[2674],{"type":30,"value":2675},"只基于我提供的代码片段回答，不要假设其它文件存在。",{"type":24,"tag":91,"props":2677,"children":2679},{"id":2678},"工作流-5生成变更说明让-code-review-变快",[2680],{"type":30,"value":2681},"工作流 5：生成变更说明（让 code review 变快）",{"type":24,"tag":33,"props":2683,"children":2684},{},[2685],{"type":30,"value":2686},"改完后在对话里让它输出：",{"type":24,"tag":55,"props":2688,"children":2689},{},[2690,2695,2700,2705],{"type":24,"tag":59,"props":2691,"children":2692},{},[2693],{"type":30,"value":2694},"改动摘要（3~7 条）",{"type":24,"tag":59,"props":2696,"children":2697},{},[2698],{"type":30,"value":2699},"风险点（依赖/边界条件）",{"type":24,"tag":59,"props":2701,"children":2702},{},[2703],{"type":30,"value":2704},"回滚方式",{"type":24,"tag":59,"props":2706,"children":2707},{},[2708],{"type":30,"value":2709},"验收步骤",{"type":24,"tag":33,"props":2711,"children":2712},{},[2713],{"type":30,"value":2714},"这套结构能直接贴进 PR 描述。",{"type":24,"tag":91,"props":2716,"children":2718},{"id":2717},"工作流-6写最小回归集不写回归-等事故",[2719],{"type":30,"value":2720},"工作流 6：写“最小回归集”（不写回归 = 等事故）",{"type":24,"tag":33,"props":2722,"children":2723},{},[2724,2726,2732],{"type":30,"value":2725},"每次改动都至少做 10 条最小回归（见下文清单）。你可以把它写在 ",{"type":24,"tag":311,"props":2727,"children":2729},{"className":2728},[],[2730],{"type":30,"value":2731},"README",{"type":30,"value":2733}," 或团队 wiki。",{"type":24,"tag":91,"props":2735,"children":2737},{"id":2736},"工作流-7把接受建议变成最后一步",[2738],{"type":30,"value":2739},"工作流 7：把“接受建议”变成最后一步",{"type":24,"tag":33,"props":2741,"children":2742},{},[2743,2749,2751,2756],{"type":24,"tag":311,"props":2744,"children":2746},{"className":2745},[],[2747],{"type":30,"value":2748},"Cmd/Ctrl + Y",{"type":30,"value":2750}," 应该是",{"type":24,"tag":44,"props":2752,"children":2753},{},[2754],{"type":30,"value":2755},"最后一步",{"type":30,"value":353},{"type":24,"tag":55,"props":2758,"children":2759},{},[2760,2765,2770],{"type":24,"tag":59,"props":2761,"children":2762},{},[2763],{"type":30,"value":2764},"你已经看过 diff",{"type":24,"tag":59,"props":2766,"children":2767},{},[2768],{"type":30,"value":2769},"你能说清楚“怎么验收”",{"type":24,"tag":59,"props":2771,"children":2772},{},[2773],{"type":30,"value":2774},"你知道“怎么回滚”",{"type":24,"tag":91,"props":2776,"children":2778},{"id":2777},"工作流-8拒绝建议不是失败是风控动作",[2779],{"type":30,"value":2780},"工作流 8：拒绝建议不是失败，是风控动作",{"type":24,"tag":33,"props":2782,"children":2783},{},[2784,2790],{"type":24,"tag":311,"props":2785,"children":2787},{"className":2786},[],[2788],{"type":30,"value":2789},"Cmd/Ctrl + N",{"type":30,"value":2791}," 的使用时机：",{"type":24,"tag":55,"props":2793,"children":2794},{},[2795,2800,2805],{"type":24,"tag":59,"props":2796,"children":2797},{},[2798],{"type":30,"value":2799},"它开始改你没提过的东西（范围漂移）",{"type":24,"tag":59,"props":2801,"children":2802},{},[2803],{"type":30,"value":2804},"它改了 10 个文件但你只想改 1 个",{"type":24,"tag":59,"props":2806,"children":2807},{},[2808],{"type":30,"value":2809},"它为了“更优雅”引入新依赖/新抽象",{"type":24,"tag":91,"props":2811,"children":2813},{"id":2812},"工作流-9重复任务做成模板提示词不是一次性",[2814],{"type":30,"value":2815},"工作流 9：重复任务做成模板（提示词不是一次性）",{"type":24,"tag":33,"props":2817,"children":2818},{},[2819,2821,2825],{"type":30,"value":2820},"把高频任务（比如“写组件+样式+验收”）固化成模板，放进 Rules（见：",{"type":24,"tag":2091,"props":2822,"children":2823},{"href":2115},[2824],{"type":30,"value":2118},{"type":30,"value":971},{"type":24,"tag":91,"props":2827,"children":2829},{"id":2828},"工作流-10把快捷键表做成你自己的任务表",[2830],{"type":30,"value":2831},"工作流 10：把“快捷键表”做成你自己的任务表",{"type":24,"tag":33,"props":2833,"children":2834},{},[2835],{"type":30,"value":2836},"你不需要记住所有快捷键，只需要记住：",{"type":24,"tag":55,"props":2838,"children":2839},{},[2840,2850,2860,2870],{"type":24,"tag":59,"props":2841,"children":2842},{},[2843,2845],{"type":30,"value":2844},"小步改：",{"type":24,"tag":311,"props":2846,"children":2848},{"className":2847},[],[2849],{"type":30,"value":2502},{"type":24,"tag":59,"props":2851,"children":2852},{},[2853,2855],{"type":30,"value":2854},"先对齐：",{"type":24,"tag":311,"props":2856,"children":2858},{"className":2857},[],[2859],{"type":30,"value":2468},{"type":24,"tag":59,"props":2861,"children":2862},{},[2863,2865],{"type":30,"value":2864},"多文件：",{"type":24,"tag":311,"props":2866,"children":2868},{"className":2867},[],[2869],{"type":30,"value":2597},{"type":24,"tag":59,"props":2871,"children":2872},{},[2873,2875],{"type":30,"value":2874},"上下文聚焦：",{"type":24,"tag":311,"props":2876,"children":2878},{"className":2877},[],[2879],{"type":30,"value":2660},{"type":24,"tag":2120,"props":2881,"children":2882},{},[],{"type":24,"tag":25,"props":2884,"children":2886},{"id":2885},"必交付物-1最小回归任务清单10-条通用",[2887],{"type":30,"value":2888},"必交付物 1：最小回归任务清单（10 条，通用）",{"type":24,"tag":2434,"props":2890,"children":2891},{},[2892],{"type":24,"tag":33,"props":2893,"children":2894},{},[2895],{"type":30,"value":2896},"这份清单的意义：让每次 AI 改动都能“被验证”。否则你只是把不可控变成了更快的不可控。",{"type":24,"tag":956,"props":2898,"children":2899},{},[2900,2905,2910,2915,2920,2925,2930,2935,2940,2945],{"type":24,"tag":59,"props":2901,"children":2902},{},[2903],{"type":30,"value":2904},"关键路径能跑通（手动点击/请求一次）",{"type":24,"tag":59,"props":2906,"children":2907},{},[2908],{"type":30,"value":2909},"错误路径能触发（模拟一次失败输入）",{"type":24,"tag":59,"props":2911,"children":2912},{},[2913],{"type":30,"value":2914},"控制台无新增错误（至少关注 1 次真实操作）",{"type":24,"tag":59,"props":2916,"children":2917},{},[2918],{"type":30,"value":2919},"关键 UI 未错位（移动端/桌面端各看一眼）",{"type":24,"tag":59,"props":2921,"children":2922},{},[2923],{"type":30,"value":2924},"刷新后状态正确（尤其是表单/列表）",{"type":24,"tag":59,"props":2926,"children":2927},{},[2928],{"type":30,"value":2929},"路由跳转没断（从入口到目标页）",{"type":24,"tag":59,"props":2931,"children":2932},{},[2933],{"type":30,"value":2934},"相关接口未改变契约（字段名/类型）",{"type":24,"tag":59,"props":2936,"children":2937},{},[2938],{"type":30,"value":2939},"性能没有明显退化（首屏、交互卡顿）",{"type":24,"tag":59,"props":2941,"children":2942},{},[2943],{"type":30,"value":2944},"回滚方案可执行（知道回滚哪几个文件/commit）",{"type":24,"tag":59,"props":2946,"children":2947},{},[2948],{"type":30,"value":2949},"写下“这次改动解决了什么、风险是什么”（可贴 PR）",{"type":24,"tag":2120,"props":2951,"children":2952},{},[],{"type":24,"tag":25,"props":2954,"children":2956},{"id":2955},"必交付物-2失败案例复盘真实会发生",[2957],{"type":30,"value":2958},"必交付物 2：失败案例复盘（真实会发生）",{"type":24,"tag":91,"props":2960,"children":2962},{"id":2961},"现象快捷键用得很熟但交付还是慢",[2963],{"type":30,"value":2964},"现象：快捷键用得很熟，但交付还是慢",{"type":24,"tag":33,"props":2966,"children":2967},{},[2968],{"type":30,"value":2969},"典型原因：你把 Cursor 当成“更聪明的搜索框”，不断对话，直到它给出你想要的答案。",{"type":24,"tag":33,"props":2971,"children":2972},{},[2973],{"type":30,"value":2974},"复现路径：",{"type":24,"tag":55,"props":2976,"children":2977},{},[2978,2983,2988,2993],{"type":24,"tag":59,"props":2979,"children":2980},{},[2981],{"type":30,"value":2982},"你直接说“把页面做得更好看、更高级”",{"type":24,"tag":59,"props":2984,"children":2985},{},[2986],{"type":30,"value":2987},"AI 开始大改样式、抽象组件、甚至引入新依赖",{"type":24,"tag":59,"props":2989,"children":2990},{},[2991],{"type":30,"value":2992},"你为了省事按了“接受建议”",{"type":24,"tag":59,"props":2994,"children":2995},{},[2996],{"type":30,"value":2997},"最后发现：设计没统一、移动端崩、甚至埋了性能问题",{"type":24,"tag":33,"props":2999,"children":3000},{},[3001,3003,3007,3009,3014],{"type":30,"value":3002},"根因：缺少",{"type":24,"tag":44,"props":3004,"children":3005},{},[3006],{"type":30,"value":2184},{"type":30,"value":3008},"与",{"type":24,"tag":44,"props":3010,"children":3011},{},[3012],{"type":30,"value":3013},"验收",{"type":30,"value":1392},{"type":24,"tag":33,"props":3016,"children":3017},{},[3018],{"type":30,"value":3019},"修复方式（可照抄）：",{"type":24,"tag":55,"props":3021,"children":3022},{},[3023,3028,3040],{"type":24,"tag":59,"props":3024,"children":3025},{},[3026],{"type":30,"value":3027},"把需求拆成 3 个可验证目标：例如“按钮样式统一”“首屏 CTA 更明显”“移动端间距不挤”",{"type":24,"tag":59,"props":3029,"children":3030},{},[3031,3033,3038],{"type":30,"value":3032},"每个目标只用 ",{"type":24,"tag":311,"props":3034,"children":3036},{"className":3035},[],[3037],{"type":30,"value":2502},{"type":30,"value":3039}," 改一个局部",{"type":24,"tag":59,"props":3041,"children":3042},{},[3043],{"type":30,"value":3044},"每次接受建议前跑一遍“最小回归集”",{"type":24,"tag":2120,"props":3046,"children":3047},{},[],{"type":24,"tag":25,"props":3049,"children":3051},{"id":3050},"faq高频问题",[3052],{"type":30,"value":3053},"FAQ（高频问题）",{"type":24,"tag":91,"props":3055,"children":3057},{"id":3056},"q1我应该先记快捷键还是先学工作流",[3058],{"type":30,"value":3059},"Q1：我应该先记快捷键还是先学工作流？",{"type":24,"tag":33,"props":3061,"children":3062},{},[3063],{"type":30,"value":3064},"先学工作流。快捷键只是把工作流的步骤变短。",{"type":24,"tag":91,"props":3066,"children":3068},{"id":3067},"q2为什么我一用多文件就容易翻车",[3069],{"type":30,"value":3070},"Q2：为什么我一用多文件就容易翻车？",{"type":24,"tag":33,"props":3072,"children":3073},{},[3074],{"type":30,"value":3075},"因为多文件意味着范围更大、依赖更多、验收更难。先锁定“文件清单 + 每步验收”，再让它动手。",{"type":24,"tag":91,"props":3077,"children":3079},{"id":3078},"q3有没有万能提示词",[3080],{"type":30,"value":3081},"Q3：有没有“万能提示词”？",{"type":24,"tag":33,"props":3083,"children":3084},{},[3085],{"type":30,"value":3086},"没有，但有“万能结构”：目标、范围、非目标、验收、输出格式。",{"type":24,"tag":2120,"props":3088,"children":3089},{},[],{"type":24,"tag":25,"props":3091,"children":3093},{"id":3092},"延伸阅读建议按顺序",[3094],{"type":30,"value":3095},"延伸阅读（建议按顺序）",{"type":24,"tag":55,"props":3097,"children":3098},{},[3099,3106,3113,3120],{"type":24,"tag":59,"props":3100,"children":3101},{},[3102],{"type":24,"tag":2091,"props":3103,"children":3104},{"href":2093},[3105],{"type":30,"value":2096},{"type":24,"tag":59,"props":3107,"children":3108},{},[3109],{"type":24,"tag":2091,"props":3110,"children":3111},{"href":2104},[3112],{"type":30,"value":2107},{"type":24,"tag":59,"props":3114,"children":3115},{},[3116],{"type":24,"tag":2091,"props":3117,"children":3118},{"href":2115},[3119],{"type":30,"value":2118},{"type":24,"tag":59,"props":3121,"children":3122},{},[3123,3125],{"type":30,"value":3124},"如果你更关心“网页制作落地”：看这篇 ",{"type":24,"tag":2091,"props":3126,"children":3128},{"href":3127},"/topics/practical-tips/htmlpage-quick-landing-page",[3129],{"type":30,"value":3130},"3 分钟用 HTMLPAGE 做落地页",{"title":7,"searchDepth":1953,"depth":1953,"links":3132},[3133,3134,3135,3147,3148,3151,3156],{"id":2125,"depth":1956,"text":2128},{"id":2200,"depth":1956,"text":2203},{"id":2447,"depth":1956,"text":2450,"children":3136},[3137,3138,3139,3140,3141,3142,3143,3144,3145,3146],{"id":2453,"depth":1953,"text":2456},{"id":2512,"depth":1953,"text":2515},{"id":2582,"depth":1953,"text":2585},{"id":2638,"depth":1953,"text":2641},{"id":2678,"depth":1953,"text":2681},{"id":2717,"depth":1953,"text":2720},{"id":2736,"depth":1953,"text":2739},{"id":2777,"depth":1953,"text":2780},{"id":2812,"depth":1953,"text":2815},{"id":2828,"depth":1953,"text":2831},{"id":2885,"depth":1956,"text":2888},{"id":2955,"depth":1956,"text":2958,"children":3149},[3150],{"id":2961,"depth":1953,"text":2964},{"id":3050,"depth":1956,"text":3053,"children":3152},[3153,3154,3155],{"id":3056,"depth":1953,"text":3059},{"id":3067,"depth":1953,"text":3070},{"id":3078,"depth":1953,"text":3081},{"id":3092,"depth":1956,"text":3095},"content:topics:ai:cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet.md","topics/ai/cursor-keyboard-shortcuts-cheatsheet",{"_path":3161,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":3162,"description":3163,"date":3164,"topic":5,"author":11,"tags":3165,"image":3169,"imageAlt":3170,"pexelsPhotoId":3171,"pexelsUrl":3172,"readingTime":3173,"body":3174,"_type":1997,"_id":4104,"_source":1999,"_file":4105,"_stem":4106,"_extension":2002},"/topics/ai/cursor-vs-copilot-vscode-workflow","Cursor vs GitHub Copilot vs VS Code：怎么选、怎么搭配、怎么把风险关在笼子里","用“任务类型×风险×验收成本”的选择矩阵解释 Cursor/Copilot/VS Code 的差异，并给出一套可落地的协作工作流（范围闸门、最小回归集、回滚策略）。","2026-03-01",[2010,3166,2013,3167,3168],"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":21,"children":3175,"toc":4082},[3176,3181,3186,3204,3209,3227,3230,3236,3241,3272,3277,3280,3286,3294,3498,3506,3519,3522,3528,3534,3547,3552,3565,3571,3576,3609,3615,3620,3638,3641,3647,3652,3658,3663,3696,3702,3715,3720,3733,3739,3751,3757,3762,3775,3780,3783,3789,3794,3915,3918,3924,3934,3943,3961,3970,3978,3986,4004,4007,4011,4017,4022,4028,4033,4036,4041],{"type":24,"tag":33,"props":3177,"children":3178},{},[3179],{"type":30,"value":3180},"“Cursor 和 Copilot 到底有什么区别？”",{"type":24,"tag":33,"props":3182,"children":3183},{},[3184],{"type":30,"value":3185},"这个问题问得越早越好，因为你一旦把工具选错，后面所有痛苦都不是“提示词不够好”，而是：",{"type":24,"tag":55,"props":3187,"children":3188},{},[3189,3194,3199],{"type":24,"tag":59,"props":3190,"children":3191},{},[3192],{"type":30,"value":3193},"改动不可控（范围漂移、改错文件）",{"type":24,"tag":59,"props":3195,"children":3196},{},[3197],{"type":30,"value":3198},"验收成本爆炸（不知道要测什么）",{"type":24,"tag":59,"props":3200,"children":3201},{},[3202],{"type":30,"value":3203},"团队协作崩盘（没有闸门、没有回滚）",{"type":24,"tag":33,"props":3205,"children":3206},{},[3207],{"type":30,"value":3208},"这篇文章用一张选择矩阵 + 一套可执行工作流，帮你做到两件事：",{"type":24,"tag":956,"props":3210,"children":3211},{},[3212,3217],{"type":24,"tag":59,"props":3213,"children":3214},{},[3215],{"type":30,"value":3216},"知道什么时候用 Cursor、什么时候用 Copilot、什么时候“纯 VS Code 更快”",{"type":24,"tag":59,"props":3218,"children":3219},{},[3220,3222],{"type":30,"value":3221},"就算用 AI，也能把风险关在笼子里：",{"type":24,"tag":44,"props":3223,"children":3224},{},[3225],{"type":30,"value":3226},"可审查、可验证、可回滚",{"type":24,"tag":2120,"props":3228,"children":3229},{},[],{"type":24,"tag":25,"props":3231,"children":3233},{"id":3232},"结论先说三者不是互斥而是分工",[3234],{"type":30,"value":3235},"结论先说：三者不是互斥，而是分工",{"type":24,"tag":33,"props":3237,"children":3238},{},[3239],{"type":30,"value":3240},"你可以把它们看成三层能力：",{"type":24,"tag":55,"props":3242,"children":3243},{},[3244,3253,3263],{"type":24,"tag":59,"props":3245,"children":3246},{},[3247,3251],{"type":24,"tag":44,"props":3248,"children":3249},{},[3250],{"type":30,"value":2013},{"type":30,"value":3252},"：编辑器与生态（调试、插件、任务、终端、语言服务）",{"type":24,"tag":59,"props":3254,"children":3255},{},[3256,3261],{"type":24,"tag":44,"props":3257,"children":3258},{},[3259],{"type":30,"value":3260},"Copilot",{"type":30,"value":3262},"：代码补全与局部建议（“我正在写这一行/这一段”）",{"type":24,"tag":59,"props":3264,"children":3265},{},[3266,3270],{"type":24,"tag":44,"props":3267,"children":3268},{},[3269],{"type":30,"value":2010},{"type":30,"value":3271},"：以项目为单位的 AI 协作（对话、索引、多文件编辑、规则）",{"type":24,"tag":33,"props":3273,"children":3274},{},[3275],{"type":30,"value":3276},"最常见的误区是：把“局部补全能力”当作“能做架构与多文件落地”。",{"type":24,"tag":2120,"props":3278,"children":3279},{},[],{"type":24,"tag":25,"props":3281,"children":3283},{"id":3282},"选择矩阵按任务类型选工具不是按偏好",[3284],{"type":30,"value":3285},"选择矩阵：按任务类型选工具（不是按偏好）",{"type":24,"tag":2434,"props":3287,"children":3288},{},[3289],{"type":24,"tag":33,"props":3290,"children":3291},{},[3292],{"type":30,"value":3293},"你只要把自己的任务放进表格，就能得到推荐路径。",{"type":24,"tag":2210,"props":3295,"children":3296},{},[3297,3329],{"type":24,"tag":2214,"props":3298,"children":3299},{},[3300],{"type":24,"tag":2218,"props":3301,"children":3302},{},[3303,3308,3314,3319,3324],{"type":24,"tag":2222,"props":3304,"children":3305},{},[3306],{"type":30,"value":3307},"任务类型",{"type":24,"tag":2222,"props":3309,"children":3311},{"align":3310},"right",[3312],{"type":30,"value":3313},"风险",{"type":24,"tag":2222,"props":3315,"children":3316},{"align":3310},[3317],{"type":30,"value":3318},"验收成本",{"type":24,"tag":2222,"props":3320,"children":3321},{},[3322],{"type":30,"value":3323},"更推荐",{"type":24,"tag":2222,"props":3325,"children":3326},{},[3327],{"type":30,"value":3328},"为什么",{"type":24,"tag":2243,"props":3330,"children":3331},{},[3332,3359,3392,3418,3445,3472],{"type":24,"tag":2218,"props":3333,"children":3334},{},[3335,3340,3345,3349,3354],{"type":24,"tag":2250,"props":3336,"children":3337},{},[3338],{"type":30,"value":3339},"写一段代码/补一个 if",{"type":24,"tag":2250,"props":3341,"children":3342},{"align":3310},[3343],{"type":30,"value":3344},"低",{"type":24,"tag":2250,"props":3346,"children":3347},{"align":3310},[3348],{"type":30,"value":3344},{"type":24,"tag":2250,"props":3350,"children":3351},{},[3352],{"type":30,"value":3353},"Copilot / Cursor 内联编辑",{"type":24,"tag":2250,"props":3355,"children":3356},{},[3357],{"type":30,"value":3358},"局部建议足够，成本最低",{"type":24,"tag":2218,"props":3360,"children":3361},{},[3362,3367,3372,3376,3387],{"type":24,"tag":2250,"props":3363,"children":3364},{},[3365],{"type":30,"value":3366},"重构一个函数",{"type":24,"tag":2250,"props":3368,"children":3369},{"align":3310},[3370],{"type":30,"value":3371},"中",{"type":24,"tag":2250,"props":3373,"children":3374},{"align":3310},[3375],{"type":30,"value":3371},{"type":24,"tag":2250,"props":3377,"children":3378},{},[3379,3381],{"type":30,"value":3380},"Cursor ",{"type":24,"tag":311,"props":3382,"children":3384},{"className":3383},[],[3385],{"type":30,"value":3386},"内联编辑",{"type":24,"tag":2250,"props":3388,"children":3389},{},[3390],{"type":30,"value":3391},"需要解释、需要约束输出",{"type":24,"tag":2218,"props":3393,"children":3394},{},[3395,3400,3404,3408,3413],{"type":24,"tag":2250,"props":3396,"children":3397},{},[3398],{"type":30,"value":3399},"改一个组件 + 样式",{"type":24,"tag":2250,"props":3401,"children":3402},{"align":3310},[3403],{"type":30,"value":3371},{"type":24,"tag":2250,"props":3405,"children":3406},{"align":3310},[3407],{"type":30,"value":3371},{"type":24,"tag":2250,"props":3409,"children":3410},{},[3411],{"type":30,"value":3412},"Cursor（小范围多文件）",{"type":24,"tag":2250,"props":3414,"children":3415},{},[3416],{"type":30,"value":3417},"需要同时改模板与样式",{"type":24,"tag":2218,"props":3419,"children":3420},{},[3421,3426,3431,3435,3440],{"type":24,"tag":2250,"props":3422,"children":3423},{},[3424],{"type":30,"value":3425},"改 3~5 个文件（组件+api+测试）",{"type":24,"tag":2250,"props":3427,"children":3428},{"align":3310},[3429],{"type":30,"value":3430},"高",{"type":24,"tag":2250,"props":3432,"children":3433},{"align":3310},[3434],{"type":30,"value":3430},{"type":24,"tag":2250,"props":3436,"children":3437},{},[3438],{"type":30,"value":3439},"Cursor Composer + 闸门",{"type":24,"tag":2250,"props":3441,"children":3442},{},[3443],{"type":30,"value":3444},"需要计划、验收、回滚",{"type":24,"tag":2218,"props":3446,"children":3447},{},[3448,3453,3458,3462,3467],{"type":24,"tag":2250,"props":3449,"children":3450},{},[3451],{"type":30,"value":3452},"重写一段架构/引入新依赖",{"type":24,"tag":2250,"props":3454,"children":3455},{"align":3310},[3456],{"type":30,"value":3457},"很高",{"type":24,"tag":2250,"props":3459,"children":3460},{"align":3310},[3461],{"type":30,"value":3457},{"type":24,"tag":2250,"props":3463,"children":3464},{},[3465],{"type":30,"value":3466},"先人脑设计 + VS Code 实现",{"type":24,"tag":2250,"props":3468,"children":3469},{},[3470],{"type":30,"value":3471},"AI 易发散，最好先设计再执行",{"type":24,"tag":2218,"props":3473,"children":3474},{},[3475,3480,3484,3488,3493],{"type":24,"tag":2250,"props":3476,"children":3477},{},[3478],{"type":30,"value":3479},"排查线上问题/性能抖动",{"type":24,"tag":2250,"props":3481,"children":3482},{"align":3310},[3483],{"type":30,"value":3430},{"type":24,"tag":2250,"props":3485,"children":3486},{"align":3310},[3487],{"type":30,"value":3457},{"type":24,"tag":2250,"props":3489,"children":3490},{},[3491],{"type":30,"value":3492},"VS Code + 工具链优先，AI 辅助归纳",{"type":24,"tag":2250,"props":3494,"children":3495},{},[3496],{"type":30,"value":3497},"需要证据，不要“猜”",{"type":24,"tag":33,"props":3499,"children":3500},{},[3501],{"type":24,"tag":44,"props":3502,"children":3503},{},[3504],{"type":30,"value":3505},"一句话规则：",{"type":24,"tag":55,"props":3507,"children":3508},{},[3509,3514],{"type":24,"tag":59,"props":3510,"children":3511},{},[3512],{"type":30,"value":3513},"当你的改动可以用“10 条最小回归集”覆盖时，用 Cursor。",{"type":24,"tag":59,"props":3515,"children":3516},{},[3517],{"type":30,"value":3518},"当你的改动无法验证时，先别让 AI 动手。",{"type":24,"tag":2120,"props":3520,"children":3521},{},[],{"type":24,"tag":25,"props":3523,"children":3525},{"id":3524},"差异拆解到底差在哪里",[3526],{"type":30,"value":3527},"差异拆解：到底差在哪里？",{"type":24,"tag":91,"props":3529,"children":3531},{"id":3530},"_1-上下文来源补全-vs-项目索引",[3532],{"type":30,"value":3533},"1) 上下文来源：补全 vs 项目索引",{"type":24,"tag":55,"props":3535,"children":3536},{},[3537,3542],{"type":24,"tag":59,"props":3538,"children":3539},{},[3540],{"type":30,"value":3541},"Copilot 更擅长：你正在写的这几行、当前文件的局部上下文",{"type":24,"tag":59,"props":3543,"children":3544},{},[3545],{"type":30,"value":3546},"Cursor 更擅长：项目级索引 + 多文件关联理解",{"type":24,"tag":33,"props":3548,"children":3549},{},[3550],{"type":30,"value":3551},"因此：",{"type":24,"tag":55,"props":3553,"children":3554},{},[3555,3560],{"type":24,"tag":59,"props":3556,"children":3557},{},[3558],{"type":30,"value":3559},"写代码片段：Copilot 速度更快",{"type":24,"tag":59,"props":3561,"children":3562},{},[3563],{"type":30,"value":3564},"改一坨工程：Cursor 更有胜算（但更需要闸门）",{"type":24,"tag":91,"props":3566,"children":3568},{"id":3567},"_2-交互方式你能不能控制范围",[3569],{"type":30,"value":3570},"2) 交互方式：你能不能控制范围",{"type":24,"tag":33,"props":3572,"children":3573},{},[3574],{"type":30,"value":3575},"范围控制的三个层级：",{"type":24,"tag":956,"props":3577,"children":3578},{},[3579,3589,3599],{"type":24,"tag":59,"props":3580,"children":3581},{},[3582,3584],{"type":30,"value":3583},"内联编辑（选中一段）→ ",{"type":24,"tag":44,"props":3585,"children":3586},{},[3587],{"type":30,"value":3588},"最强范围控制",{"type":24,"tag":59,"props":3590,"children":3591},{},[3592,3594],{"type":30,"value":3593},"Composer 多文件（先列文件清单）→ ",{"type":24,"tag":44,"props":3595,"children":3596},{},[3597],{"type":30,"value":3598},"可控但要闸门",{"type":24,"tag":59,"props":3600,"children":3601},{},[3602,3604],{"type":30,"value":3603},"大对话（泛目标）→ ",{"type":24,"tag":44,"props":3605,"children":3606},{},[3607],{"type":30,"value":3608},"最容易跑偏",{"type":24,"tag":91,"props":3610,"children":3612},{"id":3611},"_3-输出形态建议-vs-可审查的变更",[3613],{"type":30,"value":3614},"3) 输出形态：建议 vs 可审查的变更",{"type":24,"tag":33,"props":3616,"children":3617},{},[3618],{"type":30,"value":3619},"最好的 AI 输出不是“给我一段代码”，而是：",{"type":24,"tag":55,"props":3621,"children":3622},{},[3623,3628,3633],{"type":24,"tag":59,"props":3624,"children":3625},{},[3626],{"type":30,"value":3627},"改动摘要（做了什么）",{"type":24,"tag":59,"props":3629,"children":3630},{},[3631],{"type":30,"value":3632},"diff 级别的可审查变更",{"type":24,"tag":59,"props":3634,"children":3635},{},[3636],{"type":30,"value":3637},"验收步骤与回滚方案",{"type":24,"tag":2120,"props":3639,"children":3640},{},[],{"type":24,"tag":25,"props":3642,"children":3644},{"id":3643},"一套可落地的团队工作流把风险关住",[3645],{"type":30,"value":3646},"一套可落地的团队工作流（把风险关住）",{"type":24,"tag":33,"props":3648,"children":3649},{},[3650],{"type":30,"value":3651},"下面这套流程，你可以直接写进团队规范：",{"type":24,"tag":91,"props":3653,"children":3655},{"id":3654},"step-1先写任务单geo-友好结构",[3656],{"type":30,"value":3657},"Step 1：先写任务单（GEO 友好结构）",{"type":24,"tag":33,"props":3659,"children":3660},{},[3661],{"type":30,"value":3662},"模板：",{"type":24,"tag":55,"props":3664,"children":3665},{},[3666,3671,3676,3681,3686,3691],{"type":24,"tag":59,"props":3667,"children":3668},{},[3669],{"type":30,"value":3670},"目标：……",{"type":24,"tag":59,"props":3672,"children":3673},{},[3674],{"type":30,"value":3675},"背景：……",{"type":24,"tag":59,"props":3677,"children":3678},{},[3679],{"type":30,"value":3680},"范围：只改这些文件/模块：……",{"type":24,"tag":59,"props":3682,"children":3683},{},[3684],{"type":30,"value":3685},"非目标：不做哪些事情：……",{"type":24,"tag":59,"props":3687,"children":3688},{},[3689],{"type":30,"value":3690},"验收：如何判断完成（可测试/可观察）：……",{"type":24,"tag":59,"props":3692,"children":3693},{},[3694],{"type":30,"value":3695},"回滚：如果失败怎么撤回：……",{"type":24,"tag":91,"props":3697,"children":3699},{"id":3698},"step-2用范围闸门限制-ai",[3700],{"type":30,"value":3701},"Step 2：用“范围闸门”限制 AI",{"type":24,"tag":55,"props":3703,"children":3704},{},[3705,3710],{"type":24,"tag":59,"props":3706,"children":3707},{},[3708],{"type":30,"value":3709},"单文件改动：优先 Cursor 内联编辑",{"type":24,"tag":59,"props":3711,"children":3712},{},[3713],{"type":30,"value":3714},"多文件改动：必须先让 AI 输出“文件清单（≤5）+ 每步验收”",{"type":24,"tag":33,"props":3716,"children":3717},{},[3718],{"type":30,"value":3719},"如果 AI 输出的文件清单超过 5 个：",{"type":24,"tag":55,"props":3721,"children":3722},{},[3723,3728],{"type":24,"tag":59,"props":3724,"children":3725},{},[3726],{"type":30,"value":3727},"不是它太强，是任务太大",{"type":24,"tag":59,"props":3729,"children":3730},{},[3731],{"type":30,"value":3732},"你需要拆任务，而不是继续推进",{"type":24,"tag":91,"props":3734,"children":3736},{"id":3735},"step-3最小回归集10-条",[3737],{"type":30,"value":3738},"Step 3：最小回归集（10 条）",{"type":24,"tag":33,"props":3740,"children":3741},{},[3742,3744,3749],{"type":30,"value":3743},"每次接受改动前必须跑（可参考：",{"type":24,"tag":2091,"props":3745,"children":3746},{"href":2005},[3747],{"type":30,"value":3748},"Cursor 快捷键速查表",{"type":30,"value":3750}," 里的清单）。",{"type":24,"tag":91,"props":3752,"children":3754},{"id":3753},"step-4回滚策略不用等事故才想",[3755],{"type":30,"value":3756},"Step 4：回滚策略（不用等事故才想）",{"type":24,"tag":33,"props":3758,"children":3759},{},[3760],{"type":30,"value":3761},"回滚最常见的两条路：",{"type":24,"tag":55,"props":3763,"children":3764},{},[3765,3770],{"type":24,"tag":59,"props":3766,"children":3767},{},[3768],{"type":30,"value":3769},"git 回滚 commit",{"type":24,"tag":59,"props":3771,"children":3772},{},[3773],{"type":30,"value":3774},"对关键文件保留前版本（至少能快速恢复）",{"type":24,"tag":33,"props":3776,"children":3777},{},[3778],{"type":30,"value":3779},"你需要做到：任何一轮 AI 改动都能在 5 分钟内撤回。",{"type":24,"tag":2120,"props":3781,"children":3782},{},[],{"type":24,"tag":25,"props":3784,"children":3786},{"id":3785},"必交付物对比矩阵可复制",[3787],{"type":30,"value":3788},"必交付物：对比矩阵（可复制）",{"type":24,"tag":33,"props":3790,"children":3791},{},[3792],{"type":30,"value":3793},"下面这张表可以直接贴到你的团队 wiki：",{"type":24,"tag":2210,"props":3795,"children":3796},{},[3797,3820],{"type":24,"tag":2214,"props":3798,"children":3799},{},[3800],{"type":24,"tag":2218,"props":3801,"children":3802},{},[3803,3808,3812,3816],{"type":24,"tag":2222,"props":3804,"children":3805},{},[3806],{"type":30,"value":3807},"维度",{"type":24,"tag":2222,"props":3809,"children":3810},{},[3811],{"type":30,"value":2013},{"type":24,"tag":2222,"props":3813,"children":3814},{},[3815],{"type":30,"value":3260},{"type":24,"tag":2222,"props":3817,"children":3818},{},[3819],{"type":30,"value":2010},{"type":24,"tag":2243,"props":3821,"children":3822},{},[3823,3846,3869,3892],{"type":24,"tag":2218,"props":3824,"children":3825},{},[3826,3831,3836,3841],{"type":24,"tag":2250,"props":3827,"children":3828},{},[3829],{"type":30,"value":3830},"强项",{"type":24,"tag":2250,"props":3832,"children":3833},{},[3834],{"type":30,"value":3835},"工具链、调试、生态",{"type":24,"tag":2250,"props":3837,"children":3838},{},[3839],{"type":30,"value":3840},"补全与局部建议",{"type":24,"tag":2250,"props":3842,"children":3843},{},[3844],{"type":30,"value":3845},"项目上下文、多文件落地",{"type":24,"tag":2218,"props":3847,"children":3848},{},[3849,3854,3859,3864],{"type":24,"tag":2250,"props":3850,"children":3851},{},[3852],{"type":30,"value":3853},"适合任务",{"type":24,"tag":2250,"props":3855,"children":3856},{},[3857],{"type":30,"value":3858},"排查、调试、验证",{"type":24,"tag":2250,"props":3860,"children":3861},{},[3862],{"type":30,"value":3863},"写一段、补一段",{"type":24,"tag":2250,"props":3865,"children":3866},{},[3867],{"type":30,"value":3868},"改一段、改一组文件",{"type":24,"tag":2218,"props":3870,"children":3871},{},[3872,3877,3882,3887],{"type":24,"tag":2250,"props":3873,"children":3874},{},[3875],{"type":30,"value":3876},"最大风险",{"type":24,"tag":2250,"props":3878,"children":3879},{},[3880],{"type":30,"value":3881},"无",{"type":24,"tag":2250,"props":3883,"children":3884},{},[3885],{"type":30,"value":3886},"过度依赖建议",{"type":24,"tag":2250,"props":3888,"children":3889},{},[3890],{"type":30,"value":3891},"范围漂移、多文件回归",{"type":24,"tag":2218,"props":3893,"children":3894},{},[3895,3900,3905,3910],{"type":24,"tag":2250,"props":3896,"children":3897},{},[3898],{"type":30,"value":3899},"必须搭配",{"type":24,"tag":2250,"props":3901,"children":3902},{},[3903],{"type":30,"value":3904},"规范与检查",{"type":24,"tag":2250,"props":3906,"children":3907},{},[3908],{"type":30,"value":3909},"代码评审",{"type":24,"tag":2250,"props":3911,"children":3912},{},[3913],{"type":30,"value":3914},"闸门 + 最小回归集",{"type":24,"tag":2120,"props":3916,"children":3917},{},[],{"type":24,"tag":25,"props":3919,"children":3921},{"id":3920},"失败案例多文件看似成功实际埋雷",[3922],{"type":30,"value":3923},"失败案例：多文件“看似成功”，实际埋雷",{"type":24,"tag":33,"props":3925,"children":3926},{},[3927,3932],{"type":24,"tag":44,"props":3928,"children":3929},{},[3930],{"type":30,"value":3931},"现象",{"type":30,"value":3933},"：AI 说“我已经把所有地方都改了”，你也接受了，结果上线后 404 或样式错位。",{"type":24,"tag":33,"props":3935,"children":3936},{},[3937,3942],{"type":24,"tag":44,"props":3938,"children":3939},{},[3940],{"type":30,"value":3941},"复现条件",{"type":30,"value":353},{"type":24,"tag":55,"props":3944,"children":3945},{},[3946,3951,3956],{"type":24,"tag":59,"props":3947,"children":3948},{},[3949],{"type":30,"value":3950},"你给了一个大目标（例如“把所有按钮统一成主题色”）",{"type":24,"tag":59,"props":3952,"children":3953},{},[3954],{"type":30,"value":3955},"它改了组件、样式、甚至主题配置",{"type":24,"tag":59,"props":3957,"children":3958},{},[3959],{"type":30,"value":3960},"你没有按页面模块走一遍，直接合并",{"type":24,"tag":33,"props":3962,"children":3963},{},[3964,3969],{"type":24,"tag":44,"props":3965,"children":3966},{},[3967],{"type":30,"value":3968},"根因",{"type":30,"value":353},{"type":24,"tag":55,"props":3971,"children":3972},{},[3973],{"type":24,"tag":59,"props":3974,"children":3975},{},[3976],{"type":30,"value":3977},"改动范围大，但验收仍按“小改动”的方式做（只看一处）",{"type":24,"tag":33,"props":3979,"children":3980},{},[3981,3985],{"type":24,"tag":44,"props":3982,"children":3983},{},[3984],{"type":30,"value":1235},{"type":30,"value":353},{"type":24,"tag":55,"props":3987,"children":3988},{},[3989,3994,3999],{"type":24,"tag":59,"props":3990,"children":3991},{},[3992],{"type":30,"value":3993},"强制把任务拆成“模块级目标”：Hero、Feature、Pricing、Form",{"type":24,"tag":59,"props":3995,"children":3996},{},[3997],{"type":30,"value":3998},"每个模块改完就验收一次",{"type":24,"tag":59,"props":4000,"children":4001},{},[4002],{"type":30,"value":4003},"验收通过再进入下一个模块",{"type":24,"tag":2120,"props":4005,"children":4006},{},[],{"type":24,"tag":25,"props":4008,"children":4009},{"id":1465},[4010],{"type":30,"value":1468},{"type":24,"tag":91,"props":4012,"children":4014},{"id":4013},"q1我已经用了-cursor为什么还要用-copilot",[4015],{"type":30,"value":4016},"Q1：我已经用了 Cursor，为什么还要用 Copilot？",{"type":24,"tag":33,"props":4018,"children":4019},{},[4020],{"type":30,"value":4021},"因为“补全”这种高频低风险任务，Copilot 的交互成本更低；Cursor 更适合需要解释与约束的改动。",{"type":24,"tag":91,"props":4023,"children":4025},{"id":4024},"q2什么时候应该完全不用-ai",[4026],{"type":30,"value":4027},"Q2：什么时候应该完全不用 AI？",{"type":24,"tag":33,"props":4029,"children":4030},{},[4031],{"type":30,"value":4032},"当你无法定义验收标准时。比如“更高级”“更好看”这种目标，先做信息结构与设计规则，再让 AI 帮你落地局部。",{"type":24,"tag":2120,"props":4034,"children":4035},{},[],{"type":24,"tag":25,"props":4037,"children":4039},{"id":4038},"延伸阅读",[4040],{"type":30,"value":4038},{"type":24,"tag":55,"props":4042,"children":4043},{},[4044,4053,4062,4071],{"type":24,"tag":59,"props":4045,"children":4046},{},[4047,4049],{"type":30,"value":4048},"Cursor 入门：",{"type":24,"tag":2091,"props":4050,"children":4051},{"href":2093},[4052],{"type":30,"value":2096},{"type":24,"tag":59,"props":4054,"children":4055},{},[4056,4058],{"type":30,"value":4057},"Cursor 进阶：",{"type":24,"tag":2091,"props":4059,"children":4060},{"href":2104},[4061],{"type":30,"value":2107},{"type":24,"tag":59,"props":4063,"children":4064},{},[4065,4067],{"type":30,"value":4066},"规则配置：",{"type":24,"tag":2091,"props":4068,"children":4069},{"href":2115},[4070],{"type":30,"value":2118},{"type":24,"tag":59,"props":4072,"children":4073},{},[4074,4076],{"type":30,"value":4075},"Copilot 实战：",{"type":24,"tag":2091,"props":4077,"children":4079},{"href":4078},"/topics/ai/github-copilot-tips",[4080],{"type":30,"value":4081},"GitHub Copilot 实用技巧",{"title":7,"searchDepth":1953,"depth":1953,"links":4083},[4084,4085,4086,4091,4097,4098,4099,4103],{"id":3232,"depth":1956,"text":3235},{"id":3282,"depth":1956,"text":3285},{"id":3524,"depth":1956,"text":3527,"children":4087},[4088,4089,4090],{"id":3530,"depth":1953,"text":3533},{"id":3567,"depth":1953,"text":3570},{"id":3611,"depth":1953,"text":3614},{"id":3643,"depth":1956,"text":3646,"children":4092},[4093,4094,4095,4096],{"id":3654,"depth":1953,"text":3657},{"id":3698,"depth":1953,"text":3701},{"id":3735,"depth":1953,"text":3738},{"id":3753,"depth":1953,"text":3756},{"id":3785,"depth":1956,"text":3788},{"id":3920,"depth":1956,"text":3923},{"id":1465,"depth":1956,"text":1468,"children":4100},[4101,4102],{"id":4013,"depth":1953,"text":4016},{"id":4024,"depth":1953,"text":4027},{"id":4038,"depth":1956,"text":4038},"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":4108,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":4109,"description":4110,"date":4111,"topic":5,"author":11,"tags":4112,"image":4117,"featured":4118,"readingTime":3173,"body":4119,"_type":1997,"_id":4763,"_source":1999,"_file":4764,"_stem":4765,"_extension":2002},"/topics/ai/ai-debugging-troubleshooting-guide","AI 辅助调试与问题排查：让 AI 成为你的调试搭档","深入探讨如何利用 AI 工具提升调试效率，包括错误信息分析、日志解读、性能问题定位、复杂 bug 排查等实战场景，构建 AI 驱动的调试工作流。","2026-01-18",[4113,4114,4115,2014,4116],"AI 调试","问题排查","Debug","错误处理","/images/topics/ai/ai-debugging-guide.jpg",true,{"type":21,"children":4120,"toc":4734},[4121,4127,4133,4138,4143,4148,4154,4160,4165,4173,4201,4209,4232,4238,4248,4257,4265,4273,4306,4314,4344,4357,4365,4370,4378,4386,4395,4401,4409,4420,4428,4437,4443,4449,4454,4463,4469,4474,4483,4489,4495,4504,4510,4519,4525,4534,4540,4546,4555,4561,4570,4576,4582,4590,4596,4605,4613,4621,4624,4630,4635,4654,4666,4669,4675,4680,4689,4694,4697,4703,4708,4726],{"type":24,"tag":25,"props":4122,"children":4124},{"id":4123},"ai-辅助调试与问题排查",[4125],{"type":30,"value":4126},"AI 辅助调试与问题排查",{"type":24,"tag":25,"props":4128,"children":4130},{"id":4129},"引言调试的痛与-ai-的解药",[4131],{"type":30,"value":4132},"引言：调试的痛与 AI 的解药",{"type":24,"tag":33,"props":4134,"children":4135},{},[4136],{"type":30,"value":4137},"调试是每个程序员的日常，也是最消耗时间和精力的工作之一。我们都有过这样的经历：盯着一个莫名其妙的错误信息，翻遍 Stack Overflow，尝试各种方案，几个小时后才发现是一个愚蠢的拼写错误。",{"type":24,"tag":33,"props":4139,"children":4140},{},[4141],{"type":30,"value":4142},"AI 工具的出现，正在改变调试的方式。不是替代你的思考，而是加速你的分析过程——帮你快速理解错误、缩小排查范围、验证假设。",{"type":24,"tag":33,"props":4144,"children":4145},{},[4146],{"type":30,"value":4147},"这篇文章分享我在实际项目中使用 AI 辅助调试的经验和方法论。",{"type":24,"tag":25,"props":4149,"children":4151},{"id":4150},"第一部分建立-ai-调试的思维模型",[4152],{"type":30,"value":4153},"第一部分：建立 AI 调试的思维模型",{"type":24,"tag":91,"props":4155,"children":4157},{"id":4156},"_11-ai-在调试中的角色",[4158],{"type":30,"value":4159},"1.1 AI 在调试中的角色",{"type":24,"tag":33,"props":4161,"children":4162},{},[4163],{"type":30,"value":4164},"把 AI 想象成一个经验丰富但不了解你项目的高级工程师。它：",{"type":24,"tag":33,"props":4166,"children":4167},{},[4168],{"type":24,"tag":44,"props":4169,"children":4170},{},[4171],{"type":30,"value":4172},"擅长的事情：",{"type":24,"tag":55,"props":4174,"children":4175},{},[4176,4181,4186,4191,4196],{"type":24,"tag":59,"props":4177,"children":4178},{},[4179],{"type":30,"value":4180},"解读错误信息的含义",{"type":24,"tag":59,"props":4182,"children":4183},{},[4184],{"type":30,"value":4185},"提供可能的原因列表",{"type":24,"tag":59,"props":4187,"children":4188},{},[4189],{"type":30,"value":4190},"给出排查方向建议",{"type":24,"tag":59,"props":4192,"children":4193},{},[4194],{"type":30,"value":4195},"解释复杂的技术概念",{"type":24,"tag":59,"props":4197,"children":4198},{},[4199],{"type":30,"value":4200},"生成调试代码片段",{"type":24,"tag":33,"props":4202,"children":4203},{},[4204],{"type":24,"tag":44,"props":4205,"children":4206},{},[4207],{"type":30,"value":4208},"不擅长的事情：",{"type":24,"tag":55,"props":4210,"children":4211},{},[4212,4217,4222,4227],{"type":24,"tag":59,"props":4213,"children":4214},{},[4215],{"type":30,"value":4216},"了解你的业务逻辑",{"type":24,"tag":59,"props":4218,"children":4219},{},[4220],{"type":30,"value":4221},"知道你的代码历史",{"type":24,"tag":59,"props":4223,"children":4224},{},[4225],{"type":30,"value":4226},"理解项目特定的约定",{"type":24,"tag":59,"props":4228,"children":4229},{},[4230],{"type":30,"value":4231},"做出架构级判断",{"type":24,"tag":91,"props":4233,"children":4235},{"id":4234},"_12-有效提问的结构",[4236],{"type":30,"value":4237},"1.2 有效提问的结构",{"type":24,"tag":303,"props":4239,"children":4243},{"code":4240,"language":1997,"meta":7,"className":4241},"## 高效的调试提问模板\n\n**问题描述**\n[简洁描述遇到的问题]\n\n**错误信息**\n",[4242],"language-markdown",[4244],{"type":24,"tag":311,"props":4245,"children":4246},{"__ignoreMap":7},[4247],{"type":30,"value":4240},{"type":24,"tag":33,"props":4249,"children":4250},{},[4251],{"type":24,"tag":4252,"props":4253,"children":4254},"span",{},[4255],{"type":30,"value":4256},"完整的错误信息，不要截断",{"type":24,"tag":303,"props":4258,"children":4260},{"code":4259},"\n**相关代码**\n```javascript\n[精简但完整的相关代码]\n",[4261],{"type":24,"tag":311,"props":4262,"children":4263},{"__ignoreMap":7},[4264],{"type":30,"value":4259},{"type":24,"tag":33,"props":4266,"children":4267},{},[4268],{"type":24,"tag":44,"props":4269,"children":4270},{},[4271],{"type":30,"value":4272},"环境信息",{"type":24,"tag":55,"props":4274,"children":4275},{},[4276,4286,4296],{"type":24,"tag":59,"props":4277,"children":4278},{},[4279,4281],{"type":30,"value":4280},"运行环境：",{"type":24,"tag":4252,"props":4282,"children":4283},{},[4284],{"type":30,"value":4285},"Node 版本/浏览器版本",{"type":24,"tag":59,"props":4287,"children":4288},{},[4289,4291],{"type":30,"value":4290},"框架版本：",{"type":24,"tag":4252,"props":4292,"children":4293},{},[4294],{"type":30,"value":4295},"相关框架版本",{"type":24,"tag":59,"props":4297,"children":4298},{},[4299,4301],{"type":30,"value":4300},"操作系统：",{"type":24,"tag":4252,"props":4302,"children":4303},{},[4304],{"type":30,"value":4305},"如果相关",{"type":24,"tag":33,"props":4307,"children":4308},{},[4309],{"type":24,"tag":44,"props":4310,"children":4311},{},[4312],{"type":30,"value":4313},"已尝试的方案",{"type":24,"tag":55,"props":4315,"children":4316},{},[4317,4331],{"type":24,"tag":59,"props":4318,"children":4319},{},[4320,4325,4326],{"type":24,"tag":4252,"props":4321,"children":4322},{},[4323],{"type":30,"value":4324},"方案1",{"type":30,"value":353},{"type":24,"tag":4252,"props":4327,"children":4328},{},[4329],{"type":30,"value":4330},"结果",{"type":24,"tag":59,"props":4332,"children":4333},{},[4334,4339,4340],{"type":24,"tag":4252,"props":4335,"children":4336},{},[4337],{"type":30,"value":4338},"方案2",{"type":30,"value":353},{"type":24,"tag":4252,"props":4341,"children":4342},{},[4343],{"type":30,"value":4330},{"type":24,"tag":33,"props":4345,"children":4346},{},[4347,4352],{"type":24,"tag":44,"props":4348,"children":4349},{},[4350],{"type":30,"value":4351},"期望的结果",{"type":24,"tag":4252,"props":4353,"children":4354},{},[4355],{"type":30,"value":4356},"描述期望的行为",{"type":24,"tag":303,"props":4358,"children":4360},{"code":4359},"\n### 1.3 分级调试策略\n\n",[4361],{"type":24,"tag":311,"props":4362,"children":4363},{"__ignoreMap":7},[4364],{"type":30,"value":4359},{"type":24,"tag":33,"props":4366,"children":4367},{},[4368],{"type":30,"value":4369},"┌───────────────────────────────────────────────────────────┐\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":24,"tag":303,"props":4371,"children":4373},{"code":4372},"\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",[4374],{"type":24,"tag":311,"props":4375,"children":4376},{"__ignoreMap":7},[4377],{"type":30,"value":4372},{"type":24,"tag":33,"props":4379,"children":4380},{},[4381],{"type":24,"tag":44,"props":4382,"children":4383},{},[4384],{"type":30,"value":4385},"场景 2：Vue 响应式警告",{"type":24,"tag":303,"props":4387,"children":4390},{"code":4388,"language":306,"meta":7,"className":4389},"// 警告信息：\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",[308],[4391],{"type":24,"tag":311,"props":4392,"children":4393},{"__ignoreMap":7},[4394],{"type":30,"value":4388},{"type":24,"tag":91,"props":4396,"children":4398},{"id":4397},"_22-后端错误分析",[4399],{"type":30,"value":4400},"2.2 后端错误分析",{"type":24,"tag":33,"props":4402,"children":4403},{},[4404],{"type":24,"tag":44,"props":4405,"children":4406},{},[4407],{"type":30,"value":4408},"场景 1：Node.js 内存问题",{"type":24,"tag":303,"props":4410,"children":4415},{"code":4411,"language":4412,"meta":7,"className":4413},"// 错误信息：\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",[4414],"language-javascript",[4416],{"type":24,"tag":311,"props":4417,"children":4418},{"__ignoreMap":7},[4419],{"type":30,"value":4411},{"type":24,"tag":33,"props":4421,"children":4422},{},[4423],{"type":24,"tag":44,"props":4424,"children":4425},{},[4426],{"type":30,"value":4427},"场景 2：数据库连接问题",{"type":24,"tag":303,"props":4429,"children":4432},{"code":4430,"language":306,"meta":7,"className":4431},"// 错误信息：\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",[308],[4433],{"type":24,"tag":311,"props":4434,"children":4435},{"__ignoreMap":7},[4436],{"type":30,"value":4430},{"type":24,"tag":25,"props":4438,"children":4440},{"id":4439},"第三部分日志分析与问题定位",[4441],{"type":30,"value":4442},"第三部分：日志分析与问题定位",{"type":24,"tag":91,"props":4444,"children":4446},{"id":4445},"_31-结构化日志分析",[4447],{"type":30,"value":4448},"3.1 结构化日志分析",{"type":24,"tag":33,"props":4450,"children":4451},{},[4452],{"type":30,"value":4453},"当面对大量日志时，让 AI 帮你快速定位问题：",{"type":24,"tag":303,"props":4455,"children":4458},{"code":4456,"language":4412,"meta":7,"className":4457},"// 提问示例：\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",[4414],[4459],{"type":24,"tag":311,"props":4460,"children":4461},{"__ignoreMap":7},[4462],{"type":30,"value":4456},{"type":24,"tag":91,"props":4464,"children":4466},{"id":4465},"_32-创建调试日志",[4467],{"type":30,"value":4468},"3.2 创建调试日志",{"type":24,"tag":33,"props":4470,"children":4471},{},[4472],{"type":30,"value":4473},"让 AI 帮你生成调试用的日志代码：",{"type":24,"tag":303,"props":4475,"children":4478},{"code":4476,"language":306,"meta":7,"className":4477},"// 请求：\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",[308],[4479],{"type":24,"tag":311,"props":4480,"children":4481},{"__ignoreMap":7},[4482],{"type":30,"value":4476},{"type":24,"tag":25,"props":4484,"children":4486},{"id":4485},"第四部分性能问题排查",[4487],{"type":30,"value":4488},"第四部分：性能问题排查",{"type":24,"tag":91,"props":4490,"children":4492},{"id":4491},"_41-前端性能分析",[4493],{"type":30,"value":4494},"4.1 前端性能分析",{"type":24,"tag":303,"props":4496,"children":4499},{"code":4497,"language":306,"meta":7,"className":4498},"// 场景：页面加载慢，需要分析原因\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",[308],[4500],{"type":24,"tag":311,"props":4501,"children":4502},{"__ignoreMap":7},[4503],{"type":30,"value":4497},{"type":24,"tag":91,"props":4505,"children":4507},{"id":4506},"_42-内存泄漏排查",[4508],{"type":30,"value":4509},"4.2 内存泄漏排查",{"type":24,"tag":303,"props":4511,"children":4514},{"code":4512,"language":306,"meta":7,"className":4513},"// 场景：应用运行一段时间后变卡\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",[308],[4515],{"type":24,"tag":311,"props":4516,"children":4517},{"__ignoreMap":7},[4518],{"type":30,"value":4512},{"type":24,"tag":91,"props":4520,"children":4522},{"id":4521},"_43-数据库查询优化",[4523],{"type":30,"value":4524},"4.3 数据库查询优化",{"type":24,"tag":303,"props":4526,"children":4529},{"code":4527,"language":580,"meta":7,"className":4528},"-- 场景：查询很慢，让 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",[582],[4530],{"type":24,"tag":311,"props":4531,"children":4532},{"__ignoreMap":7},[4533],{"type":30,"value":4527},{"type":24,"tag":25,"props":4535,"children":4537},{"id":4536},"第五部分复杂-bug-排查",[4538],{"type":30,"value":4539},"第五部分：复杂 Bug 排查",{"type":24,"tag":91,"props":4541,"children":4543},{"id":4542},"_51-竞态条件",[4544],{"type":30,"value":4545},"5.1 竞态条件",{"type":24,"tag":303,"props":4547,"children":4550},{"code":4548,"language":306,"meta":7,"className":4549},"// 场景：偶发的数据不一致问题\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",[308],[4551],{"type":24,"tag":311,"props":4552,"children":4553},{"__ignoreMap":7},[4554],{"type":30,"value":4548},{"type":24,"tag":91,"props":4556,"children":4558},{"id":4557},"_52-分布式系统问题",[4559],{"type":30,"value":4560},"5.2 分布式系统问题",{"type":24,"tag":303,"props":4562,"children":4565},{"code":4563,"language":306,"meta":7,"className":4564},"// 场景：微服务间的数据不一致\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",[308],[4566],{"type":24,"tag":311,"props":4567,"children":4568},{"__ignoreMap":7},[4569],{"type":30,"value":4563},{"type":24,"tag":25,"props":4571,"children":4573},{"id":4572},"第六部分ai-调试工作流",[4574],{"type":30,"value":4575},"第六部分：AI 调试工作流",{"type":24,"tag":91,"props":4577,"children":4579},{"id":4578},"_61-我的调试流程",[4580],{"type":30,"value":4581},"6.1 我的调试流程",{"type":24,"tag":303,"props":4583,"children":4585},{"code":4584},"┌────────────────────────────────────────────────────────────┐\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",[4586],{"type":24,"tag":311,"props":4587,"children":4588},{"__ignoreMap":7},[4589],{"type":30,"value":4584},{"type":24,"tag":91,"props":4591,"children":4593},{"id":4592},"_62-调试对话模板",[4594],{"type":30,"value":4595},"6.2 调试对话模板",{"type":24,"tag":303,"props":4597,"children":4600},{"code":4598,"language":1997,"meta":7,"className":4599},"## 第一轮：问题描述\n\n我遇到了一个问题：[简述问题]\n\n错误信息：\n",[4242],[4601],{"type":24,"tag":311,"props":4602,"children":4603},{"__ignoreMap":7},[4604],{"type":30,"value":4598},{"type":24,"tag":33,"props":4606,"children":4607},{},[4608],{"type":24,"tag":4252,"props":4609,"children":4610},{},[4611],{"type":30,"value":4612},"粘贴完整错误",{"type":24,"tag":303,"props":4614,"children":4616},{"code":4615},"\n相关代码：\n```javascript\n[粘贴代码]\n",[4617],{"type":24,"tag":311,"props":4618,"children":4619},{"__ignoreMap":7},[4620],{"type":30,"value":4615},{"type":24,"tag":2120,"props":4622,"children":4623},{},[],{"type":24,"tag":25,"props":4625,"children":4627},{"id":4626},"第二轮补充信息",[4628],{"type":30,"value":4629},"第二轮：补充信息",{"type":24,"tag":33,"props":4631,"children":4632},{},[4633],{"type":30,"value":4634},"根据你的建议，我添加了日志，发现：",{"type":24,"tag":55,"props":4636,"children":4637},{},[4638,4646],{"type":24,"tag":59,"props":4639,"children":4640},{},[4641],{"type":24,"tag":4252,"props":4642,"children":4643},{},[4644],{"type":30,"value":4645},"发现 1",{"type":24,"tag":59,"props":4647,"children":4648},{},[4649],{"type":24,"tag":4252,"props":4650,"children":4651},{},[4652],{"type":30,"value":4653},"发现 2",{"type":24,"tag":33,"props":4655,"children":4656},{},[4657,4659,4664],{"type":30,"value":4658},"这是否说明问题出在 ",{"type":24,"tag":4252,"props":4660,"children":4661},{},[4662],{"type":30,"value":4663},"你的猜测",{"type":30,"value":4665},"？",{"type":24,"tag":2120,"props":4667,"children":4668},{},[],{"type":24,"tag":25,"props":4670,"children":4672},{"id":4671},"第三轮确认修复",[4673],{"type":30,"value":4674},"第三轮：确认修复",{"type":24,"tag":33,"props":4676,"children":4677},{},[4678],{"type":30,"value":4679},"我按照你的建议修改了代码：",{"type":24,"tag":303,"props":4681,"children":4684},{"code":4682,"language":4412,"meta":7,"className":4683},"[粘贴修改后的代码]\n",[4414],[4685],{"type":24,"tag":311,"props":4686,"children":4687},{"__ignoreMap":7},[4688],{"type":30,"value":4682},{"type":24,"tag":33,"props":4690,"children":4691},{},[4692],{"type":30,"value":4693},"请确认这个修复是否正确，以及是否有其他潜在问题。",{"type":24,"tag":2120,"props":4695,"children":4696},{},[],{"type":24,"tag":25,"props":4698,"children":4700},{"id":4699},"第四轮预防",[4701],{"type":30,"value":4702},"第四轮：预防",{"type":24,"tag":33,"props":4704,"children":4705},{},[4706],{"type":30,"value":4707},"这个问题已解决。请建议：",{"type":24,"tag":956,"props":4709,"children":4710},{},[4711,4716,4721],{"type":24,"tag":59,"props":4712,"children":4713},{},[4714],{"type":30,"value":4715},"如何防止类似问题再次发生？",{"type":24,"tag":59,"props":4717,"children":4718},{},[4719],{"type":30,"value":4720},"应该添加什么测试用例？",{"type":24,"tag":59,"props":4722,"children":4723},{},[4724],{"type":30,"value":4725},"有什么最佳实践可以参考？",{"type":24,"tag":303,"props":4727,"children":4729},{"code":4728},"\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",[4730],{"type":24,"tag":311,"props":4731,"children":4732},{"__ignoreMap":7},[4733],{"type":30,"value":4728},{"title":7,"searchDepth":1953,"depth":1953,"links":4735},[4736,4737,4738,4743,4747,4752,4756,4760,4761,4762],{"id":4123,"depth":1956,"text":4126},{"id":4129,"depth":1956,"text":4132},{"id":4150,"depth":1956,"text":4153,"children":4739},[4740,4741,4742],{"id":4156,"depth":1953,"text":4159},{"id":4234,"depth":1953,"text":4237},{"id":4397,"depth":1953,"text":4400},{"id":4439,"depth":1956,"text":4442,"children":4744},[4745,4746],{"id":4445,"depth":1953,"text":4448},{"id":4465,"depth":1953,"text":4468},{"id":4485,"depth":1956,"text":4488,"children":4748},[4749,4750,4751],{"id":4491,"depth":1953,"text":4494},{"id":4506,"depth":1953,"text":4509},{"id":4521,"depth":1953,"text":4524},{"id":4536,"depth":1956,"text":4539,"children":4753},[4754,4755],{"id":4542,"depth":1953,"text":4545},{"id":4557,"depth":1953,"text":4560},{"id":4572,"depth":1956,"text":4575,"children":4757},[4758,4759],{"id":4578,"depth":1953,"text":4581},{"id":4592,"depth":1953,"text":4595},{"id":4626,"depth":1956,"text":4629},{"id":4671,"depth":1956,"text":4674},{"id":4699,"depth":1956,"text":4702},"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":4767,"image":18,"featured":6,"readingTime":19,"body":4768,"_type":1997,"_id":1998,"_source":1999,"_file":2000,"_stem":2001,"_extension":2002},[13,14,15,16,17],{"type":21,"children":4769,"toc":6341},[4770,4774,4778,4786,4790,4809,4813,4817,4821,4825,4852,4856,4860,4887,4891,4895,4930,4934,4938,4942,4946,4981,4985,4993,4997,5005,5009,5016,5024,5032,5036,5040,5048,5056,5083,5091,5110,5118,5126,5130,5138,5146,5173,5181,5200,5208,5216,5220,5228,5236,5263,5271,5290,5298,5302,5306,5310,5318,5326,5334,5353,5361,5380,5384,5388,5396,5403,5411,5438,5446,5465,5473,5492,5496,5500,5508,5516,5524,5545,5553,5572,5580,5599,5603,5607,5615,5623,5631,5639,5643,5647,5655,5659,5663,5671,5675,5679,5687,5695,5766,5770,5778,5786,5847,5851,5859,5867,5942,5946,5950,5958,5993,5997,6005,6052,6056,6064,6117,6121,6129,6176,6180,6188,6231,6235,6243,6286,6294,6298,6306],{"type":24,"tag":25,"props":4771,"children":4772},{"id":27},[4773],{"type":30,"value":31},{"type":24,"tag":33,"props":4775,"children":4776},{},[4777],{"type":30,"value":37},{"type":24,"tag":33,"props":4779,"children":4780},{},[4781,4782],{"type":30,"value":42},{"type":24,"tag":44,"props":4783,"children":4784},{},[4785],{"type":30,"value":48},{"type":24,"tag":33,"props":4787,"children":4788},{},[4789],{"type":30,"value":53},{"type":24,"tag":55,"props":4791,"children":4792},{},[4793,4797,4801,4805],{"type":24,"tag":59,"props":4794,"children":4795},{},[4796],{"type":30,"value":63},{"type":24,"tag":59,"props":4798,"children":4799},{},[4800],{"type":30,"value":68},{"type":24,"tag":59,"props":4802,"children":4803},{},[4804],{"type":30,"value":73},{"type":24,"tag":59,"props":4806,"children":4807},{},[4808],{"type":30,"value":78},{"type":24,"tag":33,"props":4810,"children":4811},{},[4812],{"type":30,"value":83},{"type":24,"tag":25,"props":4814,"children":4815},{"id":86},[4816],{"type":30,"value":89},{"type":24,"tag":91,"props":4818,"children":4819},{"id":93},[4820],{"type":30,"value":96},{"type":24,"tag":33,"props":4822,"children":4823},{},[4824],{"type":30,"value":101},{"type":24,"tag":55,"props":4826,"children":4827},{},[4828,4836,4844],{"type":24,"tag":59,"props":4829,"children":4830},{},[4831,4835],{"type":24,"tag":44,"props":4832,"children":4833},{},[4834],{"type":30,"value":112},{"type":30,"value":114},{"type":24,"tag":59,"props":4837,"children":4838},{},[4839,4843],{"type":24,"tag":44,"props":4840,"children":4841},{},[4842],{"type":30,"value":122},{"type":30,"value":124},{"type":24,"tag":59,"props":4845,"children":4846},{},[4847,4851],{"type":24,"tag":44,"props":4848,"children":4849},{},[4850],{"type":30,"value":132},{"type":30,"value":134},{"type":24,"tag":91,"props":4853,"children":4854},{"id":137},[4855],{"type":30,"value":140},{"type":24,"tag":33,"props":4857,"children":4858},{},[4859],{"type":30,"value":145},{"type":24,"tag":55,"props":4861,"children":4862},{},[4863,4871,4879],{"type":24,"tag":59,"props":4864,"children":4865},{},[4866,4870],{"type":24,"tag":44,"props":4867,"children":4868},{},[4869],{"type":30,"value":156},{"type":30,"value":158},{"type":24,"tag":59,"props":4872,"children":4873},{},[4874,4878],{"type":24,"tag":44,"props":4875,"children":4876},{},[4877],{"type":30,"value":166},{"type":30,"value":168},{"type":24,"tag":59,"props":4880,"children":4881},{},[4882,4886],{"type":24,"tag":44,"props":4883,"children":4884},{},[4885],{"type":30,"value":176},{"type":30,"value":178},{"type":24,"tag":91,"props":4888,"children":4889},{"id":181},[4890],{"type":30,"value":184},{"type":24,"tag":33,"props":4892,"children":4893},{},[4894],{"type":30,"value":189},{"type":24,"tag":55,"props":4896,"children":4897},{},[4898,4906,4914,4922],{"type":24,"tag":59,"props":4899,"children":4900},{},[4901,4905],{"type":24,"tag":44,"props":4902,"children":4903},{},[4904],{"type":30,"value":200},{"type":30,"value":202},{"type":24,"tag":59,"props":4907,"children":4908},{},[4909,4913],{"type":24,"tag":44,"props":4910,"children":4911},{},[4912],{"type":30,"value":210},{"type":30,"value":212},{"type":24,"tag":59,"props":4915,"children":4916},{},[4917,4921],{"type":24,"tag":44,"props":4918,"children":4919},{},[4920],{"type":30,"value":220},{"type":30,"value":222},{"type":24,"tag":59,"props":4923,"children":4924},{},[4925,4929],{"type":24,"tag":44,"props":4926,"children":4927},{},[4928],{"type":30,"value":230},{"type":30,"value":232},{"type":24,"tag":33,"props":4931,"children":4932},{},[4933],{"type":30,"value":237},{"type":24,"tag":25,"props":4935,"children":4936},{"id":240},[4937],{"type":30,"value":240},{"type":24,"tag":91,"props":4939,"children":4940},{"id":245},[4941],{"type":30,"value":245},{"type":24,"tag":33,"props":4943,"children":4944},{},[4945],{"type":30,"value":252},{"type":24,"tag":55,"props":4947,"children":4948},{},[4949,4957,4965,4973],{"type":24,"tag":59,"props":4950,"children":4951},{},[4952,4956],{"type":24,"tag":44,"props":4953,"children":4954},{},[4955],{"type":30,"value":263},{"type":30,"value":265},{"type":24,"tag":59,"props":4958,"children":4959},{},[4960,4964],{"type":24,"tag":44,"props":4961,"children":4962},{},[4963],{"type":30,"value":273},{"type":30,"value":275},{"type":24,"tag":59,"props":4966,"children":4967},{},[4968,4972],{"type":24,"tag":44,"props":4969,"children":4970},{},[4971],{"type":30,"value":283},{"type":30,"value":285},{"type":24,"tag":59,"props":4974,"children":4975},{},[4976,4980],{"type":24,"tag":44,"props":4977,"children":4978},{},[4979],{"type":30,"value":293},{"type":30,"value":295},{"type":24,"tag":91,"props":4982,"children":4983},{"id":298},[4984],{"type":30,"value":301},{"type":24,"tag":303,"props":4986,"children":4988},{"code":305,"language":306,"meta":7,"className":4987},[308],[4989],{"type":24,"tag":311,"props":4990,"children":4991},{"__ignoreMap":7},[4992],{"type":30,"value":305},{"type":24,"tag":91,"props":4994,"children":4995},{"id":317},[4996],{"type":30,"value":320},{"type":24,"tag":303,"props":4998,"children":5000},{"code":323,"language":306,"meta":7,"className":4999},[308],[5001],{"type":24,"tag":311,"props":5002,"children":5003},{"__ignoreMap":7},[5004],{"type":30,"value":323},{"type":24,"tag":91,"props":5006,"children":5007},{"id":332},[5008],{"type":30,"value":335},{"type":24,"tag":303,"props":5010,"children":5011},{"code":338},[5012],{"type":24,"tag":311,"props":5013,"children":5014},{"__ignoreMap":7},[5015],{"type":30,"value":338},{"type":24,"tag":33,"props":5017,"children":5018},{},[5019,5023],{"type":24,"tag":44,"props":5020,"children":5021},{},[5022],{"type":30,"value":351},{"type":30,"value":353},{"type":24,"tag":303,"props":5025,"children":5027},{"code":356,"language":357,"meta":7,"className":5026},[359],[5028],{"type":24,"tag":311,"props":5029,"children":5030},{"__ignoreMap":7},[5031],{"type":30,"value":356},{"type":24,"tag":25,"props":5033,"children":5034},{"id":367},[5035],{"type":30,"value":367},{"type":24,"tag":91,"props":5037,"children":5038},{"id":372},[5039],{"type":30,"value":375},{"type":24,"tag":33,"props":5041,"children":5042},{},[5043,5047],{"type":24,"tag":44,"props":5044,"children":5045},{},[5046],{"type":30,"value":383},{"type":30,"value":385},{"type":24,"tag":33,"props":5049,"children":5050},{},[5051,5055],{"type":24,"tag":44,"props":5052,"children":5053},{},[5054],{"type":30,"value":393},{"type":30,"value":353},{"type":24,"tag":55,"props":5057,"children":5058},{},[5059,5067,5075],{"type":24,"tag":59,"props":5060,"children":5061},{},[5062,5066],{"type":24,"tag":44,"props":5063,"children":5064},{},[5065],{"type":30,"value":405},{"type":30,"value":407},{"type":24,"tag":59,"props":5068,"children":5069},{},[5070,5074],{"type":24,"tag":44,"props":5071,"children":5072},{},[5073],{"type":30,"value":415},{"type":30,"value":417},{"type":24,"tag":59,"props":5076,"children":5077},{},[5078,5082],{"type":24,"tag":44,"props":5079,"children":5080},{},[5081],{"type":30,"value":425},{"type":30,"value":427},{"type":24,"tag":33,"props":5084,"children":5085},{},[5086,5090],{"type":24,"tag":44,"props":5087,"children":5088},{},[5089],{"type":30,"value":435},{"type":30,"value":353},{"type":24,"tag":55,"props":5092,"children":5093},{},[5094,5102],{"type":24,"tag":59,"props":5095,"children":5096},{},[5097,5101],{"type":24,"tag":44,"props":5098,"children":5099},{},[5100],{"type":30,"value":447},{"type":30,"value":449},{"type":24,"tag":59,"props":5103,"children":5104},{},[5105,5109],{"type":24,"tag":44,"props":5106,"children":5107},{},[5108],{"type":30,"value":457},{"type":30,"value":459},{"type":24,"tag":33,"props":5111,"children":5112},{},[5113,5117],{"type":24,"tag":44,"props":5114,"children":5115},{},[5116],{"type":30,"value":467},{"type":30,"value":469},{"type":24,"tag":303,"props":5119,"children":5121},{"code":472,"language":473,"meta":7,"className":5120},[475],[5122],{"type":24,"tag":311,"props":5123,"children":5124},{"__ignoreMap":7},[5125],{"type":30,"value":472},{"type":24,"tag":91,"props":5127,"children":5128},{"id":483},[5129],{"type":30,"value":486},{"type":24,"tag":33,"props":5131,"children":5132},{},[5133,5137],{"type":24,"tag":44,"props":5134,"children":5135},{},[5136],{"type":30,"value":383},{"type":30,"value":495},{"type":24,"tag":33,"props":5139,"children":5140},{},[5141,5145],{"type":24,"tag":44,"props":5142,"children":5143},{},[5144],{"type":30,"value":393},{"type":30,"value":353},{"type":24,"tag":55,"props":5147,"children":5148},{},[5149,5157,5165],{"type":24,"tag":59,"props":5150,"children":5151},{},[5152,5156],{"type":24,"tag":44,"props":5153,"children":5154},{},[5155],{"type":30,"value":514},{"type":30,"value":516},{"type":24,"tag":59,"props":5158,"children":5159},{},[5160,5164],{"type":24,"tag":44,"props":5161,"children":5162},{},[5163],{"type":30,"value":524},{"type":30,"value":526},{"type":24,"tag":59,"props":5166,"children":5167},{},[5168,5172],{"type":24,"tag":44,"props":5169,"children":5170},{},[5171],{"type":30,"value":534},{"type":30,"value":536},{"type":24,"tag":33,"props":5174,"children":5175},{},[5176,5180],{"type":24,"tag":44,"props":5177,"children":5178},{},[5179],{"type":30,"value":435},{"type":30,"value":353},{"type":24,"tag":55,"props":5182,"children":5183},{},[5184,5192],{"type":24,"tag":59,"props":5185,"children":5186},{},[5187,5191],{"type":24,"tag":44,"props":5188,"children":5189},{},[5190],{"type":30,"value":555},{"type":30,"value":557},{"type":24,"tag":59,"props":5193,"children":5194},{},[5195,5199],{"type":24,"tag":44,"props":5196,"children":5197},{},[5198],{"type":30,"value":565},{"type":30,"value":567},{"type":24,"tag":33,"props":5201,"children":5202},{},[5203,5207],{"type":24,"tag":44,"props":5204,"children":5205},{},[5206],{"type":30,"value":467},{"type":30,"value":576},{"type":24,"tag":303,"props":5209,"children":5211},{"code":579,"language":580,"meta":7,"className":5210},[582],[5212],{"type":24,"tag":311,"props":5213,"children":5214},{"__ignoreMap":7},[5215],{"type":30,"value":579},{"type":24,"tag":91,"props":5217,"children":5218},{"id":590},[5219],{"type":30,"value":593},{"type":24,"tag":33,"props":5221,"children":5222},{},[5223,5227],{"type":24,"tag":44,"props":5224,"children":5225},{},[5226],{"type":30,"value":383},{"type":30,"value":602},{"type":24,"tag":33,"props":5229,"children":5230},{},[5231,5235],{"type":24,"tag":44,"props":5232,"children":5233},{},[5234],{"type":30,"value":393},{"type":30,"value":353},{"type":24,"tag":55,"props":5237,"children":5238},{},[5239,5247,5255],{"type":24,"tag":59,"props":5240,"children":5241},{},[5242,5246],{"type":24,"tag":44,"props":5243,"children":5244},{},[5245],{"type":30,"value":621},{"type":30,"value":623},{"type":24,"tag":59,"props":5248,"children":5249},{},[5250,5254],{"type":24,"tag":44,"props":5251,"children":5252},{},[5253],{"type":30,"value":631},{"type":30,"value":633},{"type":24,"tag":59,"props":5256,"children":5257},{},[5258,5262],{"type":24,"tag":44,"props":5259,"children":5260},{},[5261],{"type":30,"value":641},{"type":30,"value":643},{"type":24,"tag":33,"props":5264,"children":5265},{},[5266,5270],{"type":24,"tag":44,"props":5267,"children":5268},{},[5269],{"type":30,"value":435},{"type":30,"value":353},{"type":24,"tag":55,"props":5272,"children":5273},{},[5274,5282],{"type":24,"tag":59,"props":5275,"children":5276},{},[5277,5281],{"type":24,"tag":44,"props":5278,"children":5279},{},[5280],{"type":30,"value":662},{"type":30,"value":664},{"type":24,"tag":59,"props":5283,"children":5284},{},[5285,5289],{"type":24,"tag":44,"props":5286,"children":5287},{},[5288],{"type":30,"value":672},{"type":30,"value":674},{"type":24,"tag":33,"props":5291,"children":5292},{},[5293,5297],{"type":24,"tag":44,"props":5294,"children":5295},{},[5296],{"type":30,"value":682},{"type":30,"value":684},{"type":24,"tag":25,"props":5299,"children":5300},{"id":687},[5301],{"type":30,"value":687},{"type":24,"tag":91,"props":5303,"children":5304},{"id":692},[5305],{"type":30,"value":695},{"type":24,"tag":33,"props":5307,"children":5308},{},[5309],{"type":30,"value":700},{"type":24,"tag":33,"props":5311,"children":5312},{},[5313,5317],{"type":24,"tag":44,"props":5314,"children":5315},{},[5316],{"type":30,"value":708},{"type":30,"value":353},{"type":24,"tag":303,"props":5319,"children":5321},{"code":712,"language":306,"meta":7,"className":5320},[308],[5322],{"type":24,"tag":311,"props":5323,"children":5324},{"__ignoreMap":7},[5325],{"type":30,"value":712},{"type":24,"tag":33,"props":5327,"children":5328},{},[5329,5333],{"type":24,"tag":44,"props":5330,"children":5331},{},[5332],{"type":30,"value":726},{"type":30,"value":353},{"type":24,"tag":55,"props":5335,"children":5336},{},[5337,5345],{"type":24,"tag":59,"props":5338,"children":5339},{},[5340,5344],{"type":24,"tag":44,"props":5341,"children":5342},{},[5343],{"type":30,"value":738},{"type":30,"value":740},{"type":24,"tag":59,"props":5346,"children":5347},{},[5348,5352],{"type":24,"tag":44,"props":5349,"children":5350},{},[5351],{"type":30,"value":748},{"type":30,"value":750},{"type":24,"tag":33,"props":5354,"children":5355},{},[5356,5360],{"type":24,"tag":44,"props":5357,"children":5358},{},[5359],{"type":30,"value":758},{"type":30,"value":353},{"type":24,"tag":55,"props":5362,"children":5363},{},[5364,5372],{"type":24,"tag":59,"props":5365,"children":5366},{},[5367,5371],{"type":24,"tag":44,"props":5368,"children":5369},{},[5370],{"type":30,"value":770},{"type":30,"value":772},{"type":24,"tag":59,"props":5373,"children":5374},{},[5375,5379],{"type":24,"tag":44,"props":5376,"children":5377},{},[5378],{"type":30,"value":780},{"type":30,"value":782},{"type":24,"tag":91,"props":5381,"children":5382},{"id":785},[5383],{"type":30,"value":788},{"type":24,"tag":33,"props":5385,"children":5386},{},[5387],{"type":30,"value":793},{"type":24,"tag":33,"props":5389,"children":5390},{},[5391,5395],{"type":24,"tag":44,"props":5392,"children":5393},{},[5394],{"type":30,"value":801},{"type":30,"value":353},{"type":24,"tag":303,"props":5397,"children":5398},{"code":805},[5399],{"type":24,"tag":311,"props":5400,"children":5401},{"__ignoreMap":7},[5402],{"type":30,"value":805},{"type":24,"tag":33,"props":5404,"children":5405},{},[5406,5410],{"type":24,"tag":44,"props":5407,"children":5408},{},[5409],{"type":30,"value":818},{"type":30,"value":353},{"type":24,"tag":55,"props":5412,"children":5413},{},[5414,5422,5430],{"type":24,"tag":59,"props":5415,"children":5416},{},[5417,5421],{"type":24,"tag":44,"props":5418,"children":5419},{},[5420],{"type":30,"value":830},{"type":30,"value":832},{"type":24,"tag":59,"props":5423,"children":5424},{},[5425,5429],{"type":24,"tag":44,"props":5426,"children":5427},{},[5428],{"type":30,"value":840},{"type":30,"value":842},{"type":24,"tag":59,"props":5431,"children":5432},{},[5433,5437],{"type":24,"tag":44,"props":5434,"children":5435},{},[5436],{"type":30,"value":850},{"type":30,"value":852},{"type":24,"tag":33,"props":5439,"children":5440},{},[5441,5445],{"type":24,"tag":44,"props":5442,"children":5443},{},[5444],{"type":30,"value":726},{"type":30,"value":353},{"type":24,"tag":55,"props":5447,"children":5448},{},[5449,5457],{"type":24,"tag":59,"props":5450,"children":5451},{},[5452,5456],{"type":24,"tag":44,"props":5453,"children":5454},{},[5455],{"type":30,"value":871},{"type":30,"value":873},{"type":24,"tag":59,"props":5458,"children":5459},{},[5460,5464],{"type":24,"tag":44,"props":5461,"children":5462},{},[5463],{"type":30,"value":881},{"type":30,"value":883},{"type":24,"tag":33,"props":5466,"children":5467},{},[5468,5472],{"type":24,"tag":44,"props":5469,"children":5470},{},[5471],{"type":30,"value":758},{"type":30,"value":353},{"type":24,"tag":55,"props":5474,"children":5475},{},[5476,5484],{"type":24,"tag":59,"props":5477,"children":5478},{},[5479,5483],{"type":24,"tag":44,"props":5480,"children":5481},{},[5482],{"type":30,"value":902},{"type":30,"value":904},{"type":24,"tag":59,"props":5485,"children":5486},{},[5487,5491],{"type":24,"tag":44,"props":5488,"children":5489},{},[5490],{"type":30,"value":912},{"type":30,"value":914},{"type":24,"tag":91,"props":5493,"children":5494},{"id":917},[5495],{"type":30,"value":920},{"type":24,"tag":33,"props":5497,"children":5498},{},[5499],{"type":30,"value":925},{"type":24,"tag":33,"props":5501,"children":5502},{},[5503,5507],{"type":24,"tag":44,"props":5504,"children":5505},{},[5506],{"type":30,"value":933},{"type":30,"value":353},{"type":24,"tag":303,"props":5509,"children":5511},{"code":937,"language":938,"meta":7,"className":5510},[940],[5512],{"type":24,"tag":311,"props":5513,"children":5514},{"__ignoreMap":7},[5515],{"type":30,"value":937},{"type":24,"tag":33,"props":5517,"children":5518},{},[5519,5523],{"type":24,"tag":44,"props":5520,"children":5521},{},[5522],{"type":30,"value":953},{"type":30,"value":353},{"type":24,"tag":956,"props":5525,"children":5526},{},[5527,5537,5541],{"type":24,"tag":59,"props":5528,"children":5529},{},[5530,5531,5536],{"type":30,"value":963},{"type":24,"tag":311,"props":5532,"children":5534},{"className":5533},[],[5535],{"type":30,"value":969},{"type":30,"value":971},{"type":24,"tag":59,"props":5538,"children":5539},{},[5540],{"type":30,"value":976},{"type":24,"tag":59,"props":5542,"children":5543},{},[5544],{"type":30,"value":981},{"type":24,"tag":33,"props":5546,"children":5547},{},[5548,5552],{"type":24,"tag":44,"props":5549,"children":5550},{},[5551],{"type":30,"value":726},{"type":30,"value":353},{"type":24,"tag":55,"props":5554,"children":5555},{},[5556,5564],{"type":24,"tag":59,"props":5557,"children":5558},{},[5559,5563],{"type":24,"tag":44,"props":5560,"children":5561},{},[5562],{"type":30,"value":1000},{"type":30,"value":1002},{"type":24,"tag":59,"props":5565,"children":5566},{},[5567,5571],{"type":24,"tag":44,"props":5568,"children":5569},{},[5570],{"type":30,"value":1010},{"type":30,"value":1012},{"type":24,"tag":33,"props":5573,"children":5574},{},[5575,5579],{"type":24,"tag":44,"props":5576,"children":5577},{},[5578],{"type":30,"value":758},{"type":30,"value":353},{"type":24,"tag":55,"props":5581,"children":5582},{},[5583,5591],{"type":24,"tag":59,"props":5584,"children":5585},{},[5586,5590],{"type":24,"tag":44,"props":5587,"children":5588},{},[5589],{"type":30,"value":1031},{"type":30,"value":1033},{"type":24,"tag":59,"props":5592,"children":5593},{},[5594,5598],{"type":24,"tag":44,"props":5595,"children":5596},{},[5597],{"type":30,"value":1041},{"type":30,"value":1043},{"type":24,"tag":25,"props":5600,"children":5601},{"id":1046},[5602],{"type":30,"value":1046},{"type":24,"tag":91,"props":5604,"children":5605},{"id":1051},[5606],{"type":30,"value":1051},{"type":24,"tag":33,"props":5608,"children":5609},{},[5610,5614],{"type":24,"tag":44,"props":5611,"children":5612},{},[5613],{"type":30,"value":1061},{"type":30,"value":1063},{"type":24,"tag":303,"props":5616,"children":5618},{"code":1066,"language":306,"meta":7,"className":5617},[308],[5619],{"type":24,"tag":311,"props":5620,"children":5621},{"__ignoreMap":7},[5622],{"type":30,"value":1066},{"type":24,"tag":33,"props":5624,"children":5625},{},[5626,5630],{"type":24,"tag":44,"props":5627,"children":5628},{},[5629],{"type":30,"value":1080},{"type":30,"value":1082},{"type":24,"tag":303,"props":5632,"children":5634},{"code":1085,"language":306,"meta":7,"className":5633},[308],[5635],{"type":24,"tag":311,"props":5636,"children":5637},{"__ignoreMap":7},[5638],{"type":30,"value":1085},{"type":24,"tag":91,"props":5640,"children":5641},{"id":1094},[5642],{"type":30,"value":1094},{"type":24,"tag":33,"props":5644,"children":5645},{},[5646],{"type":30,"value":1101},{"type":24,"tag":303,"props":5648,"children":5650},{"code":1104,"language":306,"meta":7,"className":5649},[308],[5651],{"type":24,"tag":311,"props":5652,"children":5653},{"__ignoreMap":7},[5654],{"type":30,"value":1104},{"type":24,"tag":91,"props":5656,"children":5657},{"id":1113},[5658],{"type":30,"value":1113},{"type":24,"tag":33,"props":5660,"children":5661},{},[5662],{"type":30,"value":1120},{"type":24,"tag":303,"props":5664,"children":5666},{"code":1123,"language":306,"meta":7,"className":5665},[308],[5667],{"type":24,"tag":311,"props":5668,"children":5669},{"__ignoreMap":7},[5670],{"type":30,"value":1123},{"type":24,"tag":25,"props":5672,"children":5673},{"id":1132},[5674],{"type":30,"value":1132},{"type":24,"tag":91,"props":5676,"children":5677},{"id":1137},[5678],{"type":30,"value":1140},{"type":24,"tag":33,"props":5680,"children":5681},{},[5682,5686],{"type":24,"tag":44,"props":5683,"children":5684},{},[5685],{"type":30,"value":1148},{"type":30,"value":1150},{"type":24,"tag":33,"props":5688,"children":5689},{},[5690,5694],{"type":24,"tag":44,"props":5691,"children":5692},{},[5693],{"type":30,"value":1158},{"type":30,"value":353},{"type":24,"tag":956,"props":5696,"children":5697},{},[5698,5712,5726,5734,5742,5750,5758],{"type":24,"tag":59,"props":5699,"children":5700},{},[5701,5705,5706,5711],{"type":24,"tag":44,"props":5702,"children":5703},{},[5704],{"type":30,"value":1170},{"type":30,"value":1172},{"type":24,"tag":311,"props":5707,"children":5709},{"className":5708},[],[5710],{"type":30,"value":1178},{"type":30,"value":971},{"type":24,"tag":59,"props":5713,"children":5714},{},[5715,5719,5720,5725],{"type":24,"tag":44,"props":5716,"children":5717},{},[5718],{"type":30,"value":1187},{"type":30,"value":1189},{"type":24,"tag":311,"props":5721,"children":5723},{"className":5722},[],[5724],{"type":30,"value":1195},{"type":30,"value":1197},{"type":24,"tag":59,"props":5727,"children":5728},{},[5729,5733],{"type":24,"tag":44,"props":5730,"children":5731},{},[5732],{"type":30,"value":1205},{"type":30,"value":1207},{"type":24,"tag":59,"props":5735,"children":5736},{},[5737,5741],{"type":24,"tag":44,"props":5738,"children":5739},{},[5740],{"type":30,"value":1215},{"type":30,"value":1217},{"type":24,"tag":59,"props":5743,"children":5744},{},[5745,5749],{"type":24,"tag":44,"props":5746,"children":5747},{},[5748],{"type":30,"value":1225},{"type":30,"value":1227},{"type":24,"tag":59,"props":5751,"children":5752},{},[5753,5757],{"type":24,"tag":44,"props":5754,"children":5755},{},[5756],{"type":30,"value":1235},{"type":30,"value":1237},{"type":24,"tag":59,"props":5759,"children":5760},{},[5761,5765],{"type":24,"tag":44,"props":5762,"children":5763},{},[5764],{"type":30,"value":1245},{"type":30,"value":1247},{"type":24,"tag":91,"props":5767,"children":5768},{"id":1250},[5769],{"type":30,"value":1253},{"type":24,"tag":33,"props":5771,"children":5772},{},[5773,5777],{"type":24,"tag":44,"props":5774,"children":5775},{},[5776],{"type":30,"value":1148},{"type":30,"value":1262},{"type":24,"tag":33,"props":5779,"children":5780},{},[5781,5785],{"type":24,"tag":44,"props":5782,"children":5783},{},[5784],{"type":30,"value":1270},{"type":30,"value":353},{"type":24,"tag":956,"props":5787,"children":5788},{},[5789,5815,5823,5831,5839],{"type":24,"tag":59,"props":5790,"children":5791},{},[5792,5796,5797,5802,5803,5808,5809,5814],{"type":24,"tag":44,"props":5793,"children":5794},{},[5795],{"type":30,"value":1282},{"type":30,"value":1284},{"type":24,"tag":311,"props":5798,"children":5800},{"className":5799},[],[5801],{"type":30,"value":1290},{"type":30,"value":1292},{"type":24,"tag":311,"props":5804,"children":5806},{"className":5805},[],[5807],{"type":30,"value":1298},{"type":30,"value":1292},{"type":24,"tag":311,"props":5810,"children":5812},{"className":5811},[],[5813],{"type":30,"value":1305},{"type":30,"value":1307},{"type":24,"tag":59,"props":5816,"children":5817},{},[5818,5822],{"type":24,"tag":44,"props":5819,"children":5820},{},[5821],{"type":30,"value":1315},{"type":30,"value":1317},{"type":24,"tag":59,"props":5824,"children":5825},{},[5826,5830],{"type":24,"tag":44,"props":5827,"children":5828},{},[5829],{"type":30,"value":1325},{"type":30,"value":1327},{"type":24,"tag":59,"props":5832,"children":5833},{},[5834,5838],{"type":24,"tag":44,"props":5835,"children":5836},{},[5837],{"type":30,"value":1335},{"type":30,"value":1337},{"type":24,"tag":59,"props":5840,"children":5841},{},[5842,5846],{"type":24,"tag":44,"props":5843,"children":5844},{},[5845],{"type":30,"value":1345},{"type":30,"value":1347},{"type":24,"tag":91,"props":5848,"children":5849},{"id":1350},[5850],{"type":30,"value":1353},{"type":24,"tag":33,"props":5852,"children":5853},{},[5854,5858],{"type":24,"tag":44,"props":5855,"children":5856},{},[5857],{"type":30,"value":1148},{"type":30,"value":1362},{"type":24,"tag":33,"props":5860,"children":5861},{},[5862,5866],{"type":24,"tag":44,"props":5863,"children":5864},{},[5865],{"type":30,"value":1370},{"type":30,"value":353},{"type":24,"tag":956,"props":5868,"children":5869},{},[5870,5884,5904,5912,5926,5934],{"type":24,"tag":59,"props":5871,"children":5872},{},[5873,5877,5878,5883],{"type":24,"tag":44,"props":5874,"children":5875},{},[5876],{"type":30,"value":1382},{"type":30,"value":1384},{"type":24,"tag":311,"props":5879,"children":5881},{"className":5880},[],[5882],{"type":30,"value":1390},{"type":30,"value":1392},{"type":24,"tag":59,"props":5885,"children":5886},{},[5887,5891,5892,5897,5898,5903],{"type":24,"tag":44,"props":5888,"children":5889},{},[5890],{"type":30,"value":1400},{"type":30,"value":1402},{"type":24,"tag":311,"props":5893,"children":5895},{"className":5894},[],[5896],{"type":30,"value":1408},{"type":30,"value":1410},{"type":24,"tag":311,"props":5899,"children":5901},{"className":5900},[],[5902],{"type":30,"value":1416},{"type":30,"value":1392},{"type":24,"tag":59,"props":5905,"children":5906},{},[5907,5911],{"type":24,"tag":44,"props":5908,"children":5909},{},[5910],{"type":30,"value":1425},{"type":30,"value":1427},{"type":24,"tag":59,"props":5913,"children":5914},{},[5915,5919,5920,5925],{"type":24,"tag":44,"props":5916,"children":5917},{},[5918],{"type":30,"value":1235},{"type":30,"value":1436},{"type":24,"tag":311,"props":5921,"children":5923},{"className":5922},[],[5924],{"type":30,"value":1416},{"type":30,"value":1443},{"type":24,"tag":59,"props":5927,"children":5928},{},[5929,5933],{"type":24,"tag":44,"props":5930,"children":5931},{},[5932],{"type":30,"value":1451},{"type":30,"value":1453},{"type":24,"tag":59,"props":5935,"children":5936},{},[5937,5941],{"type":24,"tag":44,"props":5938,"children":5939},{},[5940],{"type":30,"value":1245},{"type":30,"value":1462},{"type":24,"tag":25,"props":5943,"children":5944},{"id":1465},[5945],{"type":30,"value":1468},{"type":24,"tag":91,"props":5947,"children":5948},{"id":1471},[5949],{"type":30,"value":1474},{"type":24,"tag":33,"props":5951,"children":5952},{},[5953,5957],{"type":24,"tag":44,"props":5954,"children":5955},{},[5956],{"type":30,"value":1482},{"type":30,"value":1484},{"type":24,"tag":55,"props":5959,"children":5960},{},[5961,5969,5977,5985],{"type":24,"tag":59,"props":5962,"children":5963},{},[5964,5968],{"type":24,"tag":44,"props":5965,"children":5966},{},[5967],{"type":30,"value":1495},{"type":30,"value":1497},{"type":24,"tag":59,"props":5970,"children":5971},{},[5972,5976],{"type":24,"tag":44,"props":5973,"children":5974},{},[5975],{"type":30,"value":1505},{"type":30,"value":1507},{"type":24,"tag":59,"props":5978,"children":5979},{},[5980,5984],{"type":24,"tag":44,"props":5981,"children":5982},{},[5983],{"type":30,"value":1515},{"type":30,"value":1517},{"type":24,"tag":59,"props":5986,"children":5987},{},[5988,5992],{"type":24,"tag":44,"props":5989,"children":5990},{},[5991],{"type":30,"value":1525},{"type":30,"value":1527},{"type":24,"tag":91,"props":5994,"children":5995},{"id":1530},[5996],{"type":30,"value":1533},{"type":24,"tag":33,"props":5998,"children":5999},{},[6000,6004],{"type":24,"tag":44,"props":6001,"children":6002},{},[6003],{"type":30,"value":1482},{"type":30,"value":1484},{"type":24,"tag":55,"props":6006,"children":6007},{},[6008,6016,6024,6044],{"type":24,"tag":59,"props":6009,"children":6010},{},[6011,6015],{"type":24,"tag":44,"props":6012,"children":6013},{},[6014],{"type":30,"value":1552},{"type":30,"value":1554},{"type":24,"tag":59,"props":6017,"children":6018},{},[6019,6023],{"type":24,"tag":44,"props":6020,"children":6021},{},[6022],{"type":30,"value":1562},{"type":30,"value":1564},{"type":24,"tag":59,"props":6025,"children":6026},{},[6027,6031,6032,6037,6038,6043],{"type":24,"tag":44,"props":6028,"children":6029},{},[6030],{"type":30,"value":1572},{"type":30,"value":1574},{"type":24,"tag":311,"props":6033,"children":6035},{"className":6034},[],[6036],{"type":30,"value":1580},{"type":30,"value":1582},{"type":24,"tag":311,"props":6039,"children":6041},{"className":6040},[],[6042],{"type":30,"value":1588},{"type":30,"value":1590},{"type":24,"tag":59,"props":6045,"children":6046},{},[6047,6051],{"type":24,"tag":44,"props":6048,"children":6049},{},[6050],{"type":30,"value":1598},{"type":30,"value":1600},{"type":24,"tag":91,"props":6053,"children":6054},{"id":1603},[6055],{"type":30,"value":1606},{"type":24,"tag":33,"props":6057,"children":6058},{},[6059,6063],{"type":24,"tag":44,"props":6060,"children":6061},{},[6062],{"type":30,"value":1482},{"type":30,"value":1615},{"type":24,"tag":55,"props":6065,"children":6066},{},[6067,6075,6083,6091],{"type":24,"tag":59,"props":6068,"children":6069},{},[6070,6074],{"type":24,"tag":44,"props":6071,"children":6072},{},[6073],{"type":30,"value":1626},{"type":30,"value":1628},{"type":24,"tag":59,"props":6076,"children":6077},{},[6078,6082],{"type":24,"tag":44,"props":6079,"children":6080},{},[6081],{"type":30,"value":1636},{"type":30,"value":1638},{"type":24,"tag":59,"props":6084,"children":6085},{},[6086,6090],{"type":24,"tag":44,"props":6087,"children":6088},{},[6089],{"type":30,"value":1646},{"type":30,"value":1648},{"type":24,"tag":59,"props":6092,"children":6093},{},[6094,6098,6099,6104,6105,6110,6111,6116],{"type":24,"tag":44,"props":6095,"children":6096},{},[6097],{"type":30,"value":1656},{"type":30,"value":1658},{"type":24,"tag":311,"props":6100,"children":6102},{"className":6101},[],[6103],{"type":30,"value":1664},{"type":30,"value":1666},{"type":24,"tag":311,"props":6106,"children":6108},{"className":6107},[],[6109],{"type":30,"value":1672},{"type":30,"value":1666},{"type":24,"tag":311,"props":6112,"children":6114},{"className":6113},[],[6115],{"type":30,"value":1679},{"type":30,"value":1681},{"type":24,"tag":91,"props":6118,"children":6119},{"id":1684},[6120],{"type":30,"value":1687},{"type":24,"tag":33,"props":6122,"children":6123},{},[6124,6128],{"type":24,"tag":44,"props":6125,"children":6126},{},[6127],{"type":30,"value":1482},{"type":30,"value":1484},{"type":24,"tag":55,"props":6130,"children":6131},{},[6132,6146,6154,6168],{"type":24,"tag":59,"props":6133,"children":6134},{},[6135,6139,6140,6145],{"type":24,"tag":44,"props":6136,"children":6137},{},[6138],{"type":30,"value":1706},{"type":30,"value":1708},{"type":24,"tag":311,"props":6141,"children":6143},{"className":6142},[],[6144],{"type":30,"value":1714},{"type":30,"value":1716},{"type":24,"tag":59,"props":6147,"children":6148},{},[6149,6153],{"type":24,"tag":44,"props":6150,"children":6151},{},[6152],{"type":30,"value":1724},{"type":30,"value":1726},{"type":24,"tag":59,"props":6155,"children":6156},{},[6157,6161,6162,6167],{"type":24,"tag":44,"props":6158,"children":6159},{},[6160],{"type":30,"value":1734},{"type":30,"value":1736},{"type":24,"tag":311,"props":6163,"children":6165},{"className":6164},[],[6166],{"type":30,"value":1742},{"type":30,"value":1392},{"type":24,"tag":59,"props":6169,"children":6170},{},[6171,6175],{"type":24,"tag":44,"props":6172,"children":6173},{},[6174],{"type":30,"value":1751},{"type":30,"value":1753},{"type":24,"tag":91,"props":6177,"children":6178},{"id":1756},[6179],{"type":30,"value":1759},{"type":24,"tag":33,"props":6181,"children":6182},{},[6183,6187],{"type":24,"tag":44,"props":6184,"children":6185},{},[6186],{"type":30,"value":1482},{"type":30,"value":1484},{"type":24,"tag":55,"props":6189,"children":6190},{},[6191,6199,6207,6215,6223],{"type":24,"tag":59,"props":6192,"children":6193},{},[6194,6198],{"type":24,"tag":44,"props":6195,"children":6196},{},[6197],{"type":30,"value":1778},{"type":30,"value":1780},{"type":24,"tag":59,"props":6200,"children":6201},{},[6202,6206],{"type":24,"tag":44,"props":6203,"children":6204},{},[6205],{"type":30,"value":1788},{"type":30,"value":1790},{"type":24,"tag":59,"props":6208,"children":6209},{},[6210,6214],{"type":24,"tag":44,"props":6211,"children":6212},{},[6213],{"type":30,"value":1798},{"type":30,"value":1800},{"type":24,"tag":59,"props":6216,"children":6217},{},[6218,6222],{"type":24,"tag":44,"props":6219,"children":6220},{},[6221],{"type":30,"value":1808},{"type":30,"value":1810},{"type":24,"tag":59,"props":6224,"children":6225},{},[6226,6230],{"type":24,"tag":44,"props":6227,"children":6228},{},[6229],{"type":30,"value":1598},{"type":30,"value":1819},{"type":24,"tag":91,"props":6232,"children":6233},{"id":1822},[6234],{"type":30,"value":1825},{"type":24,"tag":33,"props":6236,"children":6237},{},[6238,6242],{"type":24,"tag":44,"props":6239,"children":6240},{},[6241],{"type":30,"value":1482},{"type":30,"value":1484},{"type":24,"tag":956,"props":6244,"children":6245},{},[6246,6254,6262,6270,6278],{"type":24,"tag":59,"props":6247,"children":6248},{},[6249,6253],{"type":24,"tag":44,"props":6250,"children":6251},{},[6252],{"type":30,"value":1282},{"type":30,"value":1845},{"type":24,"tag":59,"props":6255,"children":6256},{},[6257,6261],{"type":24,"tag":44,"props":6258,"children":6259},{},[6260],{"type":30,"value":1315},{"type":30,"value":1854},{"type":24,"tag":59,"props":6263,"children":6264},{},[6265,6269],{"type":24,"tag":44,"props":6266,"children":6267},{},[6268],{"type":30,"value":1862},{"type":30,"value":1864},{"type":24,"tag":59,"props":6271,"children":6272},{},[6273,6277],{"type":24,"tag":44,"props":6274,"children":6275},{},[6276],{"type":30,"value":1325},{"type":30,"value":1873},{"type":24,"tag":59,"props":6279,"children":6280},{},[6281,6285],{"type":24,"tag":44,"props":6282,"children":6283},{},[6284],{"type":30,"value":1881},{"type":30,"value":1883},{"type":24,"tag":33,"props":6287,"children":6288},{},[6289,6293],{"type":24,"tag":44,"props":6290,"children":6291},{},[6292],{"type":30,"value":1891},{"type":30,"value":1893},{"type":24,"tag":91,"props":6295,"children":6296},{"id":1896},[6297],{"type":30,"value":1899},{"type":24,"tag":33,"props":6299,"children":6300},{},[6301,6305],{"type":24,"tag":44,"props":6302,"children":6303},{},[6304],{"type":30,"value":1482},{"type":30,"value":1908},{"type":24,"tag":55,"props":6307,"children":6308},{},[6309,6317,6325,6333],{"type":24,"tag":59,"props":6310,"children":6311},{},[6312,6316],{"type":24,"tag":44,"props":6313,"children":6314},{},[6315],{"type":30,"value":1919},{"type":30,"value":1921},{"type":24,"tag":59,"props":6318,"children":6319},{},[6320,6324],{"type":24,"tag":44,"props":6321,"children":6322},{},[6323],{"type":30,"value":1929},{"type":30,"value":1931},{"type":24,"tag":59,"props":6326,"children":6327},{},[6328,6332],{"type":24,"tag":44,"props":6329,"children":6330},{},[6331],{"type":30,"value":1939},{"type":30,"value":1941},{"type":24,"tag":59,"props":6334,"children":6335},{},[6336,6340],{"type":24,"tag":44,"props":6337,"children":6338},{},[6339],{"type":30,"value":1949},{"type":30,"value":1951},{"title":7,"searchDepth":1953,"depth":1953,"links":6342},[6343,6344,6349,6355,6360,6365,6370,6375],{"id":27,"depth":1956,"text":31},{"id":86,"depth":1956,"text":89,"children":6345},[6346,6347,6348],{"id":93,"depth":1953,"text":96},{"id":137,"depth":1953,"text":140},{"id":181,"depth":1953,"text":184},{"id":240,"depth":1956,"text":240,"children":6350},[6351,6352,6353,6354],{"id":245,"depth":1953,"text":245},{"id":298,"depth":1953,"text":301},{"id":317,"depth":1953,"text":320},{"id":332,"depth":1953,"text":335},{"id":367,"depth":1956,"text":367,"children":6356},[6357,6358,6359],{"id":372,"depth":1953,"text":375},{"id":483,"depth":1953,"text":486},{"id":590,"depth":1953,"text":593},{"id":687,"depth":1956,"text":687,"children":6361},[6362,6363,6364],{"id":692,"depth":1953,"text":695},{"id":785,"depth":1953,"text":788},{"id":917,"depth":1953,"text":920},{"id":1046,"depth":1956,"text":1046,"children":6366},[6367,6368,6369],{"id":1051,"depth":1953,"text":1051},{"id":1094,"depth":1953,"text":1094},{"id":1113,"depth":1953,"text":1113},{"id":1132,"depth":1956,"text":1132,"children":6371},[6372,6373,6374],{"id":1137,"depth":1953,"text":1140},{"id":1250,"depth":1953,"text":1253},{"id":1350,"depth":1953,"text":1353},{"id":1465,"depth":1956,"text":1468,"children":6376},[6377,6378,6379,6380,6381,6382,6383],{"id":1471,"depth":1953,"text":1474},{"id":1530,"depth":1953,"text":1533},{"id":1603,"depth":1953,"text":1606},{"id":1684,"depth":1953,"text":1687},{"id":1756,"depth":1953,"text":1759},{"id":1822,"depth":1953,"text":1825},{"id":1896,"depth":1953,"text":1899},1782088239461]