[{"data":1,"prerenderedAt":551},["ShallowReactive",2],{"article:ttft-first-token-latency":3},{"meta":4,"raw":18,"references":19,"prev":41,"next":50,"body":61,"toc":542},{"slug":5,"title":6,"date":7,"updated":8,"tags":9,"summary":14,"draft":15,"lang":16,"minutes":17},"ttft-first-token-latency","首 token 为什么这么慢：TTFT 的构成与优化清单","2025-10-21","2026-10-11",[10,11,12,13],"LLM","推理","延迟优化","流式","分清首事件、首 token 与首字上屏，拆解检索、排队、prefill 和渲染的延迟；用分阶段埋点、缓存对照与峰值压测找到真正瓶颈。",false,"zh-CN",5,"点击“讲解”，三秒后才出现第一个字。这三秒可能花在检索、排队、长输入，也可能是代理缓冲住了流。**先测时间花在哪里，再选择优化项**，比直接换模型或 GPU 更可靠。\n\nTTFT（Time To First Token）描述首 token 延迟；TPOT（Time Per Output Token）描述后续输出 token 的平均耗时。前者影响多久看到答案，后者影响答案是否持续卡顿。\n\n## 三种“开始响应”要分开统计\n\n| 指标 | 起止点 | 能解释什么 |\n| --- | --- | --- |\n| 模型侧 TTFT | 推理服务收到请求 → 生成首 token | 排队和模型执行 |\n| 客户端首内容延迟 | 发出模型请求 → 收到首个内容增量 | 网络、网关和模型 |\n| 首字上屏 | 用户提交 → 有意义文字完成渲染 | 用户真实等待 |\n\nSSE 心跳、连接确认、空增量不算“首字”。推理或工具事件可能早于自然语言回答，应分开记录首事件与首个可展示内容。\n\n![首字上屏时间线：业务准备、网络、排队、模型计算、流传输与渲染](\u002Fdiagrams\u002Fttft-latency.svg)\n\n*图 1 · 缓存主要影响输入处理阶段，整个链路的其他部分仍需测量。*\n\n模型调用前还有鉴权、OCR、检索与重排。排查时可近似分解：\n\n```text\n首字上屏 ≈ 业务准备 + 请求传输 + 排队\n         + 输入处理与首个可展示输出生成 + 流传输与渲染\n```\n\n阶段可能重叠，实际用时间戳测量，不能机械累加各服务总耗时。普通逐 token 文本生成的端到端时间约为 `TTFT + (输出 token 数 - 1) × TPOT`；工具循环与隐藏推理需要分轮计时。\n\n## Prefill 和 decode：理解方向，别背吞吐数字\n\nPrefill 处理输入并建立后续生成状态，decode 在此基础上逐步产生输出。常规自回归 Transformer 的 prefill 往往更易并行，低批量 decode 往往更受内存带宽制约；长上下文注意力、大批量、量化、硬件和调度都能改变瓶颈。\n\n“某显卡每秒固定多少 token”不是可移植常数。基准比较至少要同模型、精度、输入输出长度、并发和缓存条件。缩短输入通常有助于 TTFT，不能保证时间严格线性缩短。\n\nKV cache 保存之前 token 的注意力键值，避免生成每个新 token 时重复计算。跨请求前缀缓存进一步复用重复输入；它与单请求内部缓存有关，但不是“开流式就自动缓存”。\n\n## 缓存收益要放进整条链路看\n\n固定提示、工具定义、文档前缀适合置于变化内容之前。命中取决于模型、配置、寿命和路由；文字看起来相同不代表完整前缀相同。[OpenAI 缓存文档](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fprompt-caching)与 [Claude 缓存文档](https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fprompt-caching)说明各自条件。\n\n假设测到如下耗时，仅作计算示例：\n\n| 阶段 | 冷请求 | 缓存命中 |\n| --- | --- | --- |\n| 检索与重排 | 300 ms | 300 ms |\n| 网络与网关 | 100 ms | 100 ms |\n| 排队 | 400 ms | 400 ms |\n| 输入处理与首输出 | 800 ms | 300 ms |\n| 流传输与渲染 | 100 ms | 100 ms |\n| 总计 | 1700 ms | 1200 ms |\n\n输入处理减少 62.5%，总等待只减少约 29%。若高峰排队达两秒，缓存更不能单独解决问题。不要用“缓存了四分之三输入”推断“总耗时减少四分之三”。\n\n## 自建推理：调度有收益，也有取舍\n\nContinuous batching 会持续加入和移出请求，并非必须等固定批次全部结束。并发有助于吞吐，也可能增加排队或 token 间隔，需用实际负载压测。\n\nChunked prefill 将长输入分块，减少对正在 decode 请求的干扰；较小的块也可能让新请求完成 prefill 更晚。因此它在首字、卡顿与吞吐之间取舍。[vLLM 调优文档](https:\u002F\u002Fdocs.vllm.ai\u002Fen\u002Fstable\u002Fconfiguration\u002Foptimization\u002F)\n\nPrefill\u002Fdecode 分离适合部分大规模部署，但有 KV 传输、调度和容量配比成本，先确认瓶颈。Speculative decoding 主要加速输出阶段，收益依赖草稿接受率，不能作为首字优化的通用答案。\n\n## 一套能定位问题的实验\n\n每次任务关联 `trace_id`，记录提交、检索结束、模型发起、首事件、首内容、首帧与完成。服务端用单调时钟测阶段时长，跨端关联考虑时钟偏差。\n\n至少比较短输入冷缓存、长输入冷缓存、长输入热缓存、真实峰值并发四组。固定输出上限和配置，分别看 p50\u002Fp95\u002Fp99、错误率、缓存命中和费用，不能混成一个均值。\n\n首内容到达却不上屏，检查代理缓冲、SSE 读取和渲染；低并发快而峰值慢，检查队列和容量；长输入慢，检查工具结果和历史；首字快后续卡，检查 token 间隔。\n\n## 优化顺序与产品目标\n\n1. 修无意的串行等待、代理缓冲和重复检索。\n2. 通过质量回归后裁剪历史与工具结果。\n3. 稳定可缓存前缀，分别测冷暖请求收益。\n4. 路由模型、限制输出长度，为交互请求保留容量。\n5. 自建服务再评估调度、量化和部署分离。\n\n“两秒”可作某个交互场景的初始目标，并非人类感知硬边界。短问答、长报告和语音应有不同 SLO。等待时展示真实进度、允许取消，不能用伪造“思考过程”掩盖延迟。取消也应传到上游，尽量停止无用计算。\n\n结合 [预算篇](\u002Farticles\u002Fllm-budget-token-accounting)评估成本；超时后的退出路径见 [兜底设计](\u002Farticles\u002Fllm-fallback-design)。\n\n## 参考资料\n\n- [vLLM — Optimization and Tuning](https:\u002F\u002Fdocs.vllm.ai\u002Fen\u002Fstable\u002Fconfiguration\u002Foptimization\u002F)\n- [vLLM — Metrics](https:\u002F\u002Fdocs.vllm.ai\u002Fen\u002Fstable\u002Fdesign\u002Fmetrics\u002F)\n- [OpenAI — Latency optimization](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Flatency-optimization)\n- [OpenAI — Prompt caching](https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fprompt-caching)\n- [Claude — Prompt caching](https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fprompt-caching)",[20,25,29,33,37],{"title":21,"url":22,"type":23,"note":24,"checked":8},"vLLM — Optimization and Tuning","https:\u002F\u002Fdocs.vllm.ai\u002Fen\u002Fstable\u002Fconfiguration\u002Foptimization\u002F","官方文档","自部署推理的吞吐与延迟配置；配置需匹配模型、硬件和负载。",{"title":26,"url":27,"type":23,"note":28,"checked":8},"vLLM — Metrics","https:\u002F\u002Fdocs.vllm.ai\u002Fen\u002Fstable\u002Fdesign\u002Fmetrics\u002F","推理指标及其起止口径；端到端用户延迟需另行测量。",{"title":30,"url":31,"type":23,"note":32,"checked":8},"OpenAI — Latency optimization","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Flatency-optimization","减少请求、输入输出与等待的延迟方法；收益随任务和模型变化。",{"title":34,"url":35,"type":23,"note":36,"checked":8},"OpenAI — Prompt caching","https:\u002F\u002Fdevelopers.openai.com\u002Fapi\u002Fdocs\u002Fguides\u002Fprompt-caching","OpenAI 提示缓存条件与 usage 语义；缓存不等于答案缓存或零费用。",{"title":38,"url":39,"type":23,"note":40,"checked":8},"Claude — Prompt caching","https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fbuild-with-claude\u002Fprompt-caching","Claude 缓存读取、写入与生命周期；计费字段不能与其他厂商直接互换。",{"slug":42,"title":43,"date":44,"updated":8,"tags":45,"summary":49,"draft":15,"lang":16,"minutes":17},"llm-fallback-design","把失败当默认前提：LLM 服务的重试、降级与兜底设计","2025-11-18",[10,46,47,48],"可靠性","架构","SLA","按错误语义决定重试，用总截止时间控制等待；分清模型重复调用与业务幂等，处理流式中断、缓存串用和降级质量，并用 SLO 验证兜底。",{"slug":51,"title":52,"date":53,"updated":8,"tags":54,"summary":59,"draft":15,"lang":16,"minutes":60},"llm-budget-token-accounting","控制 LLM 预算：Token 计数、用量统计与没有官方数据时的做法","2025-09-16",[10,55,56,57,58],"成本工程","Agent","Claude Code","Codex","分清请求前预估、响应 usage 和最终账单，避免缓存与推理 token 重复计费；用预算预占、逐次结算和任务成本指标管住长会话。",6,{"type":62,"children":63},"root",[64,80,85,92,179,184,193,202,207,220,233,239,244,249,254,259,282,287,416,421,427,432,443,448,453,466,471,476,481,511,516,537],{"type":65,"tag":66,"props":67,"children":68},"element","p",{},[69,72,78],{"type":70,"value":71},"text","点击“讲解”，三秒后才出现第一个字。这三秒可能花在检索、排队、长输入，也可能是代理缓冲住了流。",{"type":65,"tag":73,"props":74,"children":75},"strong",{},[76],{"type":70,"value":77},"先测时间花在哪里，再选择优化项",{"type":70,"value":79},"，比直接换模型或 GPU 更可靠。",{"type":65,"tag":66,"props":81,"children":82},{},[83],{"type":70,"value":84},"TTFT（Time To First Token）描述首 token 延迟；TPOT（Time Per Output Token）描述后续输出 token 的平均耗时。前者影响多久看到答案，后者影响答案是否持续卡顿。",{"type":65,"tag":86,"props":87,"children":89},"h2",{"id":88},"三种开始响应要分开统计",[90],{"type":70,"value":91},"三种“开始响应”要分开统计",{"type":65,"tag":93,"props":94,"children":95},"table",{},[96,120],{"type":65,"tag":97,"props":98,"children":99},"thead",{},[100],{"type":65,"tag":101,"props":102,"children":103},"tr",{},[104,110,115],{"type":65,"tag":105,"props":106,"children":107},"th",{},[108],{"type":70,"value":109},"指标",{"type":65,"tag":105,"props":111,"children":112},{},[113],{"type":70,"value":114},"起止点",{"type":65,"tag":105,"props":116,"children":117},{},[118],{"type":70,"value":119},"能解释什么",{"type":65,"tag":121,"props":122,"children":123},"tbody",{},[124,143,161],{"type":65,"tag":101,"props":125,"children":126},{},[127,133,138],{"type":65,"tag":128,"props":129,"children":130},"td",{},[131],{"type":70,"value":132},"模型侧 TTFT",{"type":65,"tag":128,"props":134,"children":135},{},[136],{"type":70,"value":137},"推理服务收到请求 → 生成首 token",{"type":65,"tag":128,"props":139,"children":140},{},[141],{"type":70,"value":142},"排队和模型执行",{"type":65,"tag":101,"props":144,"children":145},{},[146,151,156],{"type":65,"tag":128,"props":147,"children":148},{},[149],{"type":70,"value":150},"客户端首内容延迟",{"type":65,"tag":128,"props":152,"children":153},{},[154],{"type":70,"value":155},"发出模型请求 → 收到首个内容增量",{"type":65,"tag":128,"props":157,"children":158},{},[159],{"type":70,"value":160},"网络、网关和模型",{"type":65,"tag":101,"props":162,"children":163},{},[164,169,174],{"type":65,"tag":128,"props":165,"children":166},{},[167],{"type":70,"value":168},"首字上屏",{"type":65,"tag":128,"props":170,"children":171},{},[172],{"type":70,"value":173},"用户提交 → 有意义文字完成渲染",{"type":65,"tag":128,"props":175,"children":176},{},[177],{"type":70,"value":178},"用户真实等待",{"type":65,"tag":66,"props":180,"children":181},{},[182],{"type":70,"value":183},"SSE 心跳、连接确认、空增量不算“首字”。推理或工具事件可能早于自然语言回答，应分开记录首事件与首个可展示内容。",{"type":65,"tag":66,"props":185,"children":186},{},[187],{"type":65,"tag":188,"props":189,"children":192},"img",{"alt":190,"src":191},"首字上屏时间线：业务准备、网络、排队、模型计算、流传输与渲染","\u002Fdiagrams\u002Fttft-latency.svg",[],{"type":65,"tag":66,"props":194,"children":195},{},[196],{"type":65,"tag":197,"props":198,"children":199},"em",{},[200],{"type":70,"value":201},"图 1 · 缓存主要影响输入处理阶段，整个链路的其他部分仍需测量。",{"type":65,"tag":66,"props":203,"children":204},{},[205],{"type":70,"value":206},"模型调用前还有鉴权、OCR、检索与重排。排查时可近似分解：",{"type":65,"tag":208,"props":209,"children":214},"pre",{"className":210,"code":212,"language":70,"meta":213},[211],"language-text","首字上屏 ≈ 业务准备 + 请求传输 + 排队\n         + 输入处理与首个可展示输出生成 + 流传输与渲染\n","",[215],{"type":65,"tag":216,"props":217,"children":218},"code",{"__ignoreMap":213},[219],{"type":70,"value":212},{"type":65,"tag":66,"props":221,"children":222},{},[223,225,231],{"type":70,"value":224},"阶段可能重叠，实际用时间戳测量，不能机械累加各服务总耗时。普通逐 token 文本生成的端到端时间约为 ",{"type":65,"tag":216,"props":226,"children":228},{"className":227},[],[229],{"type":70,"value":230},"TTFT + (输出 token 数 - 1) × TPOT",{"type":70,"value":232},"；工具循环与隐藏推理需要分轮计时。",{"type":65,"tag":86,"props":234,"children":236},{"id":235},"prefill-和-decode理解方向别背吞吐数字",[237],{"type":70,"value":238},"Prefill 和 decode：理解方向，别背吞吐数字",{"type":65,"tag":66,"props":240,"children":241},{},[242],{"type":70,"value":243},"Prefill 处理输入并建立后续生成状态，decode 在此基础上逐步产生输出。常规自回归 Transformer 的 prefill 往往更易并行，低批量 decode 往往更受内存带宽制约；长上下文注意力、大批量、量化、硬件和调度都能改变瓶颈。",{"type":65,"tag":66,"props":245,"children":246},{},[247],{"type":70,"value":248},"“某显卡每秒固定多少 token”不是可移植常数。基准比较至少要同模型、精度、输入输出长度、并发和缓存条件。缩短输入通常有助于 TTFT，不能保证时间严格线性缩短。",{"type":65,"tag":66,"props":250,"children":251},{},[252],{"type":70,"value":253},"KV cache 保存之前 token 的注意力键值，避免生成每个新 token 时重复计算。跨请求前缀缓存进一步复用重复输入；它与单请求内部缓存有关，但不是“开流式就自动缓存”。",{"type":65,"tag":86,"props":255,"children":257},{"id":256},"缓存收益要放进整条链路看",[258],{"type":70,"value":256},{"type":65,"tag":66,"props":260,"children":261},{},[262,264,272,274,280],{"type":70,"value":263},"固定提示、工具定义、文档前缀适合置于变化内容之前。命中取决于模型、配置、寿命和路由；文字看起来相同不代表完整前缀相同。",{"type":65,"tag":265,"props":266,"children":269},"a",{"href":35,"rel":267},[268],"nofollow",[270],{"type":70,"value":271},"OpenAI 缓存文档",{"type":70,"value":273},"与 ",{"type":65,"tag":265,"props":275,"children":277},{"href":39,"rel":276},[268],[278],{"type":70,"value":279},"Claude 缓存文档",{"type":70,"value":281},"说明各自条件。",{"type":65,"tag":66,"props":283,"children":284},{},[285],{"type":70,"value":286},"假设测到如下耗时，仅作计算示例：",{"type":65,"tag":93,"props":288,"children":289},{},[290,311],{"type":65,"tag":97,"props":291,"children":292},{},[293],{"type":65,"tag":101,"props":294,"children":295},{},[296,301,306],{"type":65,"tag":105,"props":297,"children":298},{},[299],{"type":70,"value":300},"阶段",{"type":65,"tag":105,"props":302,"children":303},{},[304],{"type":70,"value":305},"冷请求",{"type":65,"tag":105,"props":307,"children":308},{},[309],{"type":70,"value":310},"缓存命中",{"type":65,"tag":121,"props":312,"children":313},{},[314,331,348,365,382,398],{"type":65,"tag":101,"props":315,"children":316},{},[317,322,327],{"type":65,"tag":128,"props":318,"children":319},{},[320],{"type":70,"value":321},"检索与重排",{"type":65,"tag":128,"props":323,"children":324},{},[325],{"type":70,"value":326},"300 ms",{"type":65,"tag":128,"props":328,"children":329},{},[330],{"type":70,"value":326},{"type":65,"tag":101,"props":332,"children":333},{},[334,339,344],{"type":65,"tag":128,"props":335,"children":336},{},[337],{"type":70,"value":338},"网络与网关",{"type":65,"tag":128,"props":340,"children":341},{},[342],{"type":70,"value":343},"100 ms",{"type":65,"tag":128,"props":345,"children":346},{},[347],{"type":70,"value":343},{"type":65,"tag":101,"props":349,"children":350},{},[351,356,361],{"type":65,"tag":128,"props":352,"children":353},{},[354],{"type":70,"value":355},"排队",{"type":65,"tag":128,"props":357,"children":358},{},[359],{"type":70,"value":360},"400 ms",{"type":65,"tag":128,"props":362,"children":363},{},[364],{"type":70,"value":360},{"type":65,"tag":101,"props":366,"children":367},{},[368,373,378],{"type":65,"tag":128,"props":369,"children":370},{},[371],{"type":70,"value":372},"输入处理与首输出",{"type":65,"tag":128,"props":374,"children":375},{},[376],{"type":70,"value":377},"800 ms",{"type":65,"tag":128,"props":379,"children":380},{},[381],{"type":70,"value":326},{"type":65,"tag":101,"props":383,"children":384},{},[385,390,394],{"type":65,"tag":128,"props":386,"children":387},{},[388],{"type":70,"value":389},"流传输与渲染",{"type":65,"tag":128,"props":391,"children":392},{},[393],{"type":70,"value":343},{"type":65,"tag":128,"props":395,"children":396},{},[397],{"type":70,"value":343},{"type":65,"tag":101,"props":399,"children":400},{},[401,406,411],{"type":65,"tag":128,"props":402,"children":403},{},[404],{"type":70,"value":405},"总计",{"type":65,"tag":128,"props":407,"children":408},{},[409],{"type":70,"value":410},"1700 ms",{"type":65,"tag":128,"props":412,"children":413},{},[414],{"type":70,"value":415},"1200 ms",{"type":65,"tag":66,"props":417,"children":418},{},[419],{"type":70,"value":420},"输入处理减少 62.5%，总等待只减少约 29%。若高峰排队达两秒，缓存更不能单独解决问题。不要用“缓存了四分之三输入”推断“总耗时减少四分之三”。",{"type":65,"tag":86,"props":422,"children":424},{"id":423},"自建推理调度有收益也有取舍",[425],{"type":70,"value":426},"自建推理：调度有收益，也有取舍",{"type":65,"tag":66,"props":428,"children":429},{},[430],{"type":70,"value":431},"Continuous batching 会持续加入和移出请求，并非必须等固定批次全部结束。并发有助于吞吐，也可能增加排队或 token 间隔，需用实际负载压测。",{"type":65,"tag":66,"props":433,"children":434},{},[435,437],{"type":70,"value":436},"Chunked prefill 将长输入分块，减少对正在 decode 请求的干扰；较小的块也可能让新请求完成 prefill 更晚。因此它在首字、卡顿与吞吐之间取舍。",{"type":65,"tag":265,"props":438,"children":440},{"href":22,"rel":439},[268],[441],{"type":70,"value":442},"vLLM 调优文档",{"type":65,"tag":66,"props":444,"children":445},{},[446],{"type":70,"value":447},"Prefill\u002Fdecode 分离适合部分大规模部署，但有 KV 传输、调度和容量配比成本，先确认瓶颈。Speculative decoding 主要加速输出阶段，收益依赖草稿接受率，不能作为首字优化的通用答案。",{"type":65,"tag":86,"props":449,"children":451},{"id":450},"一套能定位问题的实验",[452],{"type":70,"value":450},{"type":65,"tag":66,"props":454,"children":455},{},[456,458,464],{"type":70,"value":457},"每次任务关联 ",{"type":65,"tag":216,"props":459,"children":461},{"className":460},[],[462],{"type":70,"value":463},"trace_id",{"type":70,"value":465},"，记录提交、检索结束、模型发起、首事件、首内容、首帧与完成。服务端用单调时钟测阶段时长，跨端关联考虑时钟偏差。",{"type":65,"tag":66,"props":467,"children":468},{},[469],{"type":70,"value":470},"至少比较短输入冷缓存、长输入冷缓存、长输入热缓存、真实峰值并发四组。固定输出上限和配置，分别看 p50\u002Fp95\u002Fp99、错误率、缓存命中和费用，不能混成一个均值。",{"type":65,"tag":66,"props":472,"children":473},{},[474],{"type":70,"value":475},"首内容到达却不上屏，检查代理缓冲、SSE 读取和渲染；低并发快而峰值慢，检查队列和容量；长输入慢，检查工具结果和历史；首字快后续卡，检查 token 间隔。",{"type":65,"tag":86,"props":477,"children":479},{"id":478},"优化顺序与产品目标",[480],{"type":70,"value":478},{"type":65,"tag":482,"props":483,"children":484},"ol",{},[485,491,496,501,506],{"type":65,"tag":486,"props":487,"children":488},"li",{},[489],{"type":70,"value":490},"修无意的串行等待、代理缓冲和重复检索。",{"type":65,"tag":486,"props":492,"children":493},{},[494],{"type":70,"value":495},"通过质量回归后裁剪历史与工具结果。",{"type":65,"tag":486,"props":497,"children":498},{},[499],{"type":70,"value":500},"稳定可缓存前缀，分别测冷暖请求收益。",{"type":65,"tag":486,"props":502,"children":503},{},[504],{"type":70,"value":505},"路由模型、限制输出长度，为交互请求保留容量。",{"type":65,"tag":486,"props":507,"children":508},{},[509],{"type":70,"value":510},"自建服务再评估调度、量化和部署分离。",{"type":65,"tag":66,"props":512,"children":513},{},[514],{"type":70,"value":515},"“两秒”可作某个交互场景的初始目标，并非人类感知硬边界。短问答、长报告和语音应有不同 SLO。等待时展示真实进度、允许取消，不能用伪造“思考过程”掩盖延迟。取消也应传到上游，尽量停止无用计算。",{"type":65,"tag":66,"props":517,"children":518},{},[519,521,527,529,535],{"type":70,"value":520},"结合 ",{"type":65,"tag":265,"props":522,"children":524},{"href":523},"\u002Farticles\u002Fllm-budget-token-accounting",[525],{"type":70,"value":526},"预算篇",{"type":70,"value":528},"评估成本；超时后的退出路径见 ",{"type":65,"tag":265,"props":530,"children":532},{"href":531},"\u002Farticles\u002Fllm-fallback-design",[533],{"type":70,"value":534},"兜底设计",{"type":70,"value":536},"。",{"type":65,"tag":86,"props":538,"children":540},{"id":539},"参考资料",[541],{"type":70,"value":539},[543,545,546,547,548,549,550],{"id":88,"depth":544,"text":91},2,{"id":235,"depth":544,"text":238},{"id":256,"depth":544,"text":256},{"id":423,"depth":544,"text":426},{"id":450,"depth":544,"text":450},{"id":478,"depth":544,"text":478},{"id":539,"depth":544,"text":539},1792400816284]