Ver Fonte

docs: 更新旅行助手后训练实战章节

nameless0078 há 1 mês atrás
pai
commit
76ac37babd

+ 184 - 81
Extra-Chapter/Extra12-旅行助手后训练实战.md

@@ -1,10 +1,10 @@
 # 旅行助手后训练实战:从产品协议到 SFT、DPO 与 Rerank 收尾
 
-项目来自我维护的 `helloagents-trip-planner`。它不是论文项目,也不是为了刷一个标准榜单。更像是一次完整的工程实验:把一个看起来能聊天的旅行助手,慢慢改成一个能被前后端接住、能被规则评测解释、也能继续迭代的 Planner
+这个项目来自我维护的 `helloagents-trip-planner`。它不是论文项目,也不是为了刷榜。我把它当成一次工程练习:一个看起来会聊天的旅行助手,怎么一步步改到能接前后端、能被规则抓错、还能继续修
 
-旅行规划这个场景很容易让人误判。第一版 Demo 通常很好看:用户说“我想去杭州玩 4 天,预算 3500”,模型很快就能写出景点、酒店、餐厅和注意事项。但接到真实前后端以后,问题会变得很具体:预算到底是整趟还是人均,酒店应该按几晚算,景点门票要不要乘同行人数,餐厅是不是工具候选里真的有,最后一天还要不要安排晚餐。
+旅行规划看起来简单,其实很会骗人。第一版 Demo 通常挺好看:用户说“我想去杭州玩 4 天,预算 3500”,模型很快就能写出景点、酒店、餐厅和注意事项。真接到前后端以后,麻烦就来了:预算是整趟还是人均,酒店按几晚算,门票要不要乘人数,餐厅是不是真的来自工具候选,最后一天到底还要不要安排晚餐。
 
-这篇 Extra-Chapter 写的是这条后训练线的精简复盘。完整教程里有更多命令、配置和归档路径,这里重点讲主线和取舍
+这篇 Extra-Chapter 只写精简版:这条线怎么走过来,哪些尝试有用,哪些后来证明没必要。命令、配置和完整归档放在项目仓库里
 
 项目与配套材料:
 
@@ -12,7 +12,7 @@
 - 完整后训练教程:[旅行助手后训练实战教程](https://github.com/nameless0120/helloagents-trip-planner/blob/main/training/docs/%E6%95%99%E7%A8%8B/%E6%97%85%E8%A1%8C%E5%8A%A9%E6%89%8B%E5%90%8E%E8%AE%AD%E7%BB%83%E5%AE%9E%E6%88%98%E6%95%99%E7%A8%8B.md)
 - 配套数据:`helloagents-后训练数据`,网盘链接:<https://pan.baidu.com/s/5oNsK7pwQnqzQEUg5ykb09Q>
 
-一句话概括这条路线:**Prompt 固定协议,SFT 学会结构,DPO 学偏好,Rerank 在候选里选更稳的答案。**
+跑到最后,我觉得路线其实很朴素:**Prompt 固定协议,SFT 学会结构,DPO 学偏好,Rerank 在候选里选更稳的答案。**
 
 ![后训练主线总览图](./images/Extra12-figures/01-后训练主线总览图.png)
 
@@ -27,10 +27,12 @@
 - [第五章:Prompt 调试是在找边界](#第五章prompt-调试是在找边界)
 - [第六章:SFT 数据生成和审计](#第六章sft-数据生成和审计)
 - [第七章:LoRA SFT 多阶段训练](#第七章lora-sft-多阶段训练)
+- [第七章补充:全参 SFT 为什么没成为主线](#第七章补充全参-sft-为什么没成为主线)
 - [第八章:Best-of-N Replay 和 SFT Rerank](#第八章best-of-n-replay-和-sft-rerank)
 - [第九章:DPO 学偏好,核心指标换成 PlannerSoft](#第九章dpo-学偏好核心指标换成-plannersoft)
 - [第十章:最终多候选 Rerank](#第十章最终多候选-rerank)
 - [第十一章:和 MiMo 外部参考怎么比](#第十一章和-mimo-外部参考怎么比)
+- [Bad Case Gallery:三个最值钱的错误](#bad-case-gallery三个最值钱的错误)
 - [第十二章:这次实验留下来的经验](#第十二章这次实验留下来的经验)
 - [复现资源](#复现资源)
 
@@ -56,7 +58,7 @@
 
 ![开篇 Case 前后对比图](./images/Extra12-figures/02-开篇Case前后对比图.png)
 
-这个例子想说明一件事:后训练不是为了让模型把文案写得更漂亮,而是让它更接近一个能被产品接住的 Planner。住宿晚数、餐饮 grounding、预算关系、日期天气、输出 JSON,这些东西看起来琐碎,但真实产品里就是这些琐碎问题最容易把体验打穿
+我想先把话说清楚:后训练不是为了让模型把文案写漂亮,而是让它更像一个能放进产品流程里的 Planner。住宿晚数、餐饮 grounding、预算关系、日期天气、输出 JSON,这些东西看着碎,但真实产品里最容易翻车的就是它们
 
 ---
 
@@ -68,7 +70,7 @@
 
 如果业务事实没有固定,训练只会把混乱学得更稳定。用户说“预算 3000”,模型要知道这是整趟预算还是人均预算;酒店价格是单间每晚,不是全程总价;景点门票要乘同行人数;餐厅不能凭空编,最好来自工具候选。只靠 prompt 反复提醒,能救一部分,但救不了整条链路。
 
-所以这条后训练主线不是
+所以我后来没有按这条路走
 
 ```text
 写 prompt -> 造数据 -> 训练 -> 看指标
@@ -89,13 +91,13 @@
   -> 多候选 Rerank 收尾
 ```
 
-这条路更慢,但每一步都能回答两个问题:为什么变好,为什么变坏
+慢是慢,但好处很实在:每一轮都知道自己在改什么,也知道哪里又被改坏了
 
 ---
 
 ## 第三章:先改产品协议
 
-刚开始做旅行助手时,很容易把问题都丢给模型:让模型从自然语言里猜人数,猜预算口径,猜住宿晚数,再猜景点门票和餐厅价格。第一版能跑,但后训练会很痛苦,因为训练数据里的“事实”本身就是飘的。
+刚开始做旅行助手时,我也很容易把问题都扔给模型:让它从自然语言里猜人数、猜预算口径、猜住宿晚数,再猜门票和餐厅价格。第一版能跑,但后面训练会很痛苦,因为训练数据里的“事实”本来就是飘的。
 
 后来我做的第一个决定很朴素:**不要让模型猜业务事实。**
 
@@ -109,17 +111,7 @@
 
 ![产品协议改造图](./images/Extra12-figures/03-产品协议改造图.png)
 
-读代码可以从这些文件看起:
-
-| 位置 | 看什么 |
-| --- | --- |
-| `frontend/src/types/index.ts` | 前端 `TripFormData`、`PartyInfo`、`BudgetConstraint` 类型 |
-| `frontend/src/views/Home.vue` | 同行人数、预算档位、总预算、自由文本怎么收集 |
-| `backend/app/models/schemas.py` | 后端 `TripRequest`、`PartyInfo`、`BudgetConstraint`、`TripPlan` schema |
-| `backend/app/planner/policy.py` | 把请求编译成预算、住宿、人数和价格策略 |
-| `backend/app/planner/context.py` | 并行收集景点、天气、酒店等工具快照 |
-| `backend/app/planner/compact.py` | 把完整上下文裁剪成模型真正看到的输入 |
-| `backend/app/planner/output.py` | 提取顶层 `TripPlan JSON`,并做 shape validation |
+如果想顺代码看,可以按这条线索找:前端表单类型、后端请求 schema、PlannerContext 编译、输出解析和校验。具体文件路径放在 `helloagents-trip-planner` 的完整教程里,这里不展开。
 
 有了这层协议,后训练的任务才变窄:模型不再凭感觉写旅行计划,而是在结构化候选里做选择,并输出合法 JSON。
 
@@ -127,11 +119,11 @@
 
 ## 第四章:冻结评测集
 
-很多训练失败不是模型没变好,而是每次评测的题目都变了
+训练结果看不懂,很多时候不是模型的问题,是考卷一直在变
 
 旅行助手尤其容易这样:今天地图候选变了,明天天气变了,后天预算生成逻辑又变了。最后你分不清是模型变强,还是考卷变简单。
 
-所以第二步不是训练,而是固定评测集
+所以我先把评测集固定住
 
 ![评测集冻结图](./images/Extra12-figures/04-评测集冻结图.png)
 
@@ -144,7 +136,7 @@
 
 这里还有一个细节:后面检索策略和上下文修复变了,确实需要重建评测上下文,但不应该重新采样用户请求。我的做法是保持 request signature 不变,只重建工具候选和上下文。这样能保留可比性,又能修掉旧上下文里的脏数据。
 
-这套 frozen eval 后来被反复用于模型选择。严格论文口径下,它更像 validation set,不是 blind test。所以我在文中把它说成“固定评测集上的阶段评估”,不把它包装成独立盲测。
+这套 frozen eval 后来一直用来选模型。严格论文口径下,它更像 validation set,不是 blind test。所以我只把它叫“固定评测集上的阶段评估”,不包装成独立盲测。
 
 最后做 DPO 收尾数据时,我专门检查过签名重叠:`selected_eval_signature_overlap = 0`。也就是说,评测 prompt 没有进入训练数据。
 
@@ -154,7 +146,7 @@
 
 前后端协议和评测集稳定后,才进入 prompt 调试。
 
-这里的目标不是写一条“神 prompt”。我更关心的是:哪些问题 prompt 能解决,哪些问题必须交给数据、规则和工程。
+这里我不是在找一条“神 prompt”。我更关心的是:哪些问题 prompt 能救,哪些问题必须交给数据、规则和工程。
 
 前几轮 prompt 大概解决了三类问题:
 
@@ -164,19 +156,19 @@
 | 餐饮 grounding | 餐厅必须来自候选,不写“附近小吃”“当地特色餐厅” | prompt 里写还不够,评测也必须能抓没 grounded 的输出 |
 | 伪精确路线 | 不写工具没给过的“步行 10 分钟”“打车 15 分钟” | 这类 hallucination 更适合在输出规则里拦掉 |
 
-这一步最有价值的不是 prompt 本身,而是失败画像。看完 bad case 以后,问题自然会分层:schema、日期、餐次缺失适合 shape validation;餐厅和景点不 grounded 适合 prompt 加规则评测一起压;预算关系复杂,最好拆成工程重算和模型选择两部分;偏好满足度不够,可能需要数据补齐
+这一步真正有用的不是 prompt 本身,而是失败画像。bad case 看多了,问题会自己分层:schema、日期、餐次缺失适合 shape validation;餐厅和景点不 grounded,要靠 prompt 和规则一起压;预算关系太复杂,最好拆成工程重算和模型选择两部分;偏好满足度不够,再去补数据
 
-Prompt 调试的终点不是“再写长一点”,而是知道什么时候该停
+Prompt 调到最后,最重要的不是再写长一点,而是知道该停在哪
 
 ---
 
 ## 第六章:SFT 数据生成和审计
 
-SFT 数据生成最容易让人放松警惕的一步
+SFT 数据生成最容易让人放松警惕。
 
 强模型确实能生成很像样的旅行计划,但“像样”不等于“能训练”。如果 teacher 输出里预算口径错、餐厅不 grounded、酒店每天乱换,学生模型会学得更稳定,也会更稳定地错。
 
-所以我把数据生成拆成几步
+所以我把数据生成拆开做
 
 1. 先 dry-run 请求分布,看城市、天数、预算、同行类型是否合理。
 2. 再 dry-run `PlannerContext`,确认工具候选、价格 hint、天气和预算策略都能编译出来。
@@ -186,7 +178,7 @@ SFT 数据生成是最容易让人放松警惕的一步。
 
 ![SFT 数据生成与审计漏斗图](./images/Extra12-figures/05-SFT数据生成与审计漏斗图.png)
 
-审计里最关键的是硬过滤:
+审计时先看硬过滤:
 
 | 过滤项 | 为什么重要 |
 | --- | --- |
@@ -207,31 +199,21 @@ SFT 数据生成是最容易让人放松警惕的一步。
 
 这条线使用 Qwen2.5-7B-Instruct 做 LoRA。训练不是一轮完成,而是多阶段推进。我的原则是:**尽量少同时改变量。**
 
-很多参数一直没动:
-
-| 参数 | 主线设置 | 为什么这样设 |
-| --- | --- | --- |
-| LoRA rank | `r=32` | 长 JSON 协议、候选复制、预算口径都要学,容量不能太小 |
-| `lora_alpha` | `64` | 和 r32 搭配,后面不频繁改 |
-| `lora_dropout` | `0.05` | 防止小数据阶段过拟合 |
-| `target_modules` | `all` | Planner 任务不只是语言风格,还涉及结构化选择 |
-| `cutoff_len` | `24576` | `PlannerContext` 很长,降到 16k 会截掉上下文信号 |
-| batch | `micro_batch_size=1`,`global_batch_size=32` | 单卡放不下大 batch,就用梯度累积 |
-| 精度与显存 | bf16 + activation checkpointing | 长上下文训练的基本生存配置 |
+底层设置基本保持稳定:LoRA r32、长上下文、bf16、梯度累积。这里最重要的不是把参数表背下来,而是明白为什么后面每一轮都只改一个主要变量。`PlannerContext` 里有景点、酒店、餐厅、天气和预算策略,压短上下文会直接截掉信号;rank 太小,长 JSON 协议和候选选择也学不稳。
 
 真正反复调的是三类东西:数据、学习率、训练轮数。
 
 | 阶段 | 起点 | 数据 | 主要参数 | 想解决什么 |
 | --- | --- | --- | --- | --- |
-| main clean lr sweep | base Qwen2.5-7B | `main_clean` | `lr=8e-5 / 6e-5`,`epoch=4` | 先学稳 TripPlan 协议 |
-| usage700 mixed | 从 `lr6e-5` adapter 接着训 | main clean + realbudget usage700 | `lr=2e-5`,`epoch=1` | 补预算使用和真实预算口径 |
-| patch700 only | 从 `lr6e-5` adapter 接着训 | budget utilization patch 700 | `lr=1e-5`,`epoch=2` | 诊断预算利用型补数上限 |
-| Best-of-N 600 replay | 从 usage700 adapter 接着训 | old replay + Best-of-N winner | `lr=1e-5`,半轮保存 | 注入规则筛出来的更好候选 |
-| Best-of-N 1200 retry | 从 Best-of-N 600 final 接着训 | old replay + 更多 Best-of-N winner | `lr=1e-5`,半轮保存 | 增加 winner 占比,看是否继续提升 |
+| 主干 Clean SFT(main clean) | Qwen2.5-7B-Instruct | `main_clean` | `lr=8e-5 / 6e-5`,`epoch=4` | 先学稳 TripPlan 协议 |
+| 真实预算混合补训(usage700) | 从 `lr6e-5` adapter 接着训 | main clean + realbudget usage700 | `lr=2e-5`,`epoch=1` | 补预算使用和真实预算口径 |
+| 预算利用诊断补训(patch700) | 从 `lr6e-5` adapter 接着训 | budget utilization patch 700 | `lr=1e-5`,`epoch=2` | 看预算利用型补数到底能推多远 |
+| SFT Rerank 回放 600(Best-of-N 600) | 从 usage700 adapter 接着训 | old replay + Best-of-N winner | `lr=1e-5`,半轮保存 | 注入规则筛出来的更好候选 |
+| SFT Rerank 回放 1200(Best-of-N 1200) | 从 Best-of-N 600 final 接着训 | old replay + 更多 Best-of-N winner | `lr=1e-5`,半轮保存 | 增加 winner 占比,看是否继续提升 |
 
 ![LoRA 多阶段训练时间线图](./images/Extra12-figures/06-LoRA多阶段训练时间线图.png)
 
-这里有个细节很容易混:`adapter_name_or_path` 不是 `resume_from_checkpoint`。它只是拿上一轮导出的 LoRA adapter 做 warm-start,优化器状态不会接着上一轮走。也就是说,每一阶段都会重新使用当前配置里的学习率和调度器。
+这里有个坑我踩过:`adapter_name_or_path` 不是 `resume_from_checkpoint`。它只是拿上一轮导出的 LoRA adapter 做 warm-start,优化器状态不会接着上一轮走。也就是说,每一阶段都会重新使用当前配置里的学习率和调度器。
 
 这反而适合阶段实验。上一轮学到的能力留在 adapter 里,下一轮用更小的学习率继续修局部问题。
 
@@ -247,6 +229,41 @@ DPO closing:      1e-6 到 1.5e-6 级别
 
 越往后,数据越像在修局部问题。学习率太高,预算指标可能上去了,餐饮 grounding、住宿连续性或者日期天气又掉下来。
 
+### 第七章补充:全参 SFT 为什么没成为主线
+
+LoRA 主线写完以后,我又补了一次全参 SFT。不是想推翻前面的路线,就是想看看上限:如果不只训 adapter,而是动全模型,旅行 Planner 会不会再涨一截?
+
+这次用的是 `Qwen2.5-7B-Instruct` 和第一版 clean SFT 数据,保持长上下文,跑 6 epoch。训练能跑通,但成本马上就上来了:6 张 40GB 卡一炉大约 7 小时,保存出来的模型 28GB。和一个 LoRA adapter 比,这已经不是同一个迭代手感了。
+
+结果挺有意思。全参不是没用,它确实把 planner soft 往上推了:
+
+| 指标 | Full Instruct 全参 | LoRA 同版 | 差值 |
+| --- | ---: | ---: | ---: |
+| 硬通过 | 94.4% | 95.8% | -1.4pp |
+| Planner Soft | 48.0% | 44.7% | +3.3pp |
+| 重算预算 Soft | 33.8% | 30.7% | +3.1pp |
+| 餐饮多样性 | 82.6% | 76.4% | +6.2pp |
+| 预算偏好贴合 | 67.8% | 66.9% | +0.9pp |
+| 预算合计一致 | 68.0% | 72.3% | -4.3pp |
+| 用户预算约束 | 88.8% | 91.6% | -2.8pp |
+
+![全参 SFT 与 LoRA 对比图](./images/Extra12-figures/18-全参SFT与LoRA对比图.png)
+
+standard 集上,全参版本的 Planner Soft 从 48.0% 涨到 57.5%,这个提升很明显。它更愿意把行程写丰富,餐饮也没那么容易重复。换句话说,全参更新确实动到了模型的“规划习惯”,不是只在表面学格式。
+
+但我最后还是没把全参放进主线。原因很简单:这个项目最难的不是让模型多写一点,而是让它在一堆硬约束里别算错。预算合计、用户预算、酒店晚数、景点门票按人数算,这些更像工程规则和数据分布问题。全参会让模型更灵活,但灵活不等于更稳。
+
+对这个项目,我最后还是更愿意用 LoRA:
+
+- 数据量是千级别,不是几十万条指令数据。全参容量太大,容易把局部风格也一起学进去。
+- 任务重心是长上下文复制、schema 输出、候选 grounding 和预算规则。LoRA 已经能把这些压到很高水平。
+- 迭代成本差太多。LoRA 训练、保存、回滚、评估都轻,全参每试一次都要认真排卡和清空间。
+- 后面真正能涨分的地方,多半在数据清洗、bad case 挖掘、DPO pair 和 rerank。全参会拖慢这套节奏。
+
+所以这次全参实验在教程里的位置很清楚:**它说明 Planner Soft 还有上升空间;也说明这个项目不能靠全参硬推。**
+
+全参可以玩,尤其是想做一次漂亮的离线结果。但这个项目要反复补数据、跑评测、回滚对比,我还是会选 LoRA + DPO + Rerank。
+
 ---
 
 ## 第八章:Best-of-N Replay 和 SFT Rerank
@@ -268,15 +285,15 @@ PlannerContext
 
 最终 Rerank 是推理时流程:同一个 prompt 生成多个候选,不再把 winner 写回训练集,而是在线上从候选池里选一个更稳的答案返回给用户。
 
-这两个流程都要回到 frozen eval 看全局指标。原因也简单:规则挑 winner 是有偏的。如果 reward 过度偏向某个指标,模型可能会变保守,也可能牺牲体验。只看单个 winner 的分数,很容易误判
+这两个流程最后都要回到 frozen eval 上看。规则挑 winner 肯定有偏,如果 reward 太偏向某个指标,模型可能会变保守,也可能牺牲体验。只看单个 winner 的分数,很容易高兴早了
 
 SFT 阶段接入多温度候选 + 规则 rerank 后,几个版本整体上了一个台阶:
 
 | 版本 | hardpass | softpass | 重算预算 softpass | 预算算术 | 预算偏好 | 预算关系 | 餐饮尺度 |
 | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
-| ckpt104 + rerank | 98.0 | 65.6 | 54.6 | 81.2 | 77.0 | 86.4 | 88.8 |
-| final1200 + rerank | 98.2 | 66.8 | 54.6 | 78.0 | 78.4 | 85.0 | 88.0 |
-| old600final + rerank | 98.2 | 66.2 | 59.2 | 78.4 | 75.4 | 87.0 | 89.4 |
+| SFT 中期 checkpoint + rerank(ckpt104) | 98.0 | 65.6 | 54.6 | 81.2 | 77.0 | 86.4 | 88.8 |
+| Best-of-N 1200 回放 + rerank(final1200) | 98.2 | 66.8 | 54.6 | 78.0 | 78.4 | 85.0 | 88.0 |
+| Best-of-N 600 回放最终版 + rerank(old600final) | 98.2 | 66.2 | 59.2 | 78.4 | 75.4 | 87.0 | 89.4 |
 
 ![SFT Rerank 对比图](./images/Extra12-figures/09-sft-rerank-comparison.png)
 
@@ -288,9 +305,9 @@ SFT 阶段接入多温度候选 + 规则 rerank 后,几个版本整体上了
 
 SFT 已经能把 TripPlan 的壳子写稳,但合法答案之间也有好坏。两个计划都能过 schema,都能找到酒店和餐厅,一个可能很省但不像用户想要的旅行,另一个预算更贴合、餐饮更少重复、景点也更顺。
 
-SFT 很难从单条 teacher 里稳定学到这种取舍,DPO 更适合做这件事
+这种取舍很难靠单条 teacher 样本学稳,DPO 更顺手
 
-我这里没有把 DPO 当成万能增强。它只做一件事:**在 hardpass 已经过关的候选里,学习哪个更像一个好行程。**
+我没有把 DPO 当万能增强用。它在这里就做一件事:**在 hardpass 已经过关的候选里,学习哪个更像一个好行程。**
 
 ### DPO pair 先过硬门槛
 
@@ -311,13 +328,13 @@ frozen eval signature count = 497
 selected eval signature overlap = 0
 ```
 
-这件事很烦,但必须做。不然分数看起来好,实际上是在背题。
+这一步很烦,但省不了。不然分数看着好,其实是在背题。
 
 ![DPO 样本筛选与防泄漏图](./images/Extra12-figures/12-DPO样本筛选与防泄漏图.png)
 
 ### 主指标换成 PlannerSoft
 
-后来我越来越觉得,普通 softpass 还不够贴近真实体验。旅行助手的输出不是一道选择题,它是一个可以被用户拿去执行的计划。所以核心指标逐步转成 `planner soft`:预算贴合、餐饮重复、景点重复、预算关系这些都要看。
+后来我越来越觉得,普通 softpass 还不够。旅行助手输出的不是一道选择题,而是一份用户可能真的拿去用的计划。所以主指标逐步转成 `planner soft`:预算贴合、餐饮重复、景点重复、预算关系这些都要看。
 
 ![PlannerSoft 指标分解图](./images/Extra12-figures/16-PlannerSoft指标分解图.png)
 
@@ -326,12 +343,12 @@ selected eval signature overlap = 0
 | 阶段 | 目的 | 结论 |
 | --- | --- | --- |
 | 高置信偏好 DPO 试跑 | 先验证长上下文 DPO 能跑通 | 流程跑通,后面开始换指标 |
-| PlannerSoft 规则 DPO | 把优化目标从 hardpass 转向 planner soft | checkpoint-25 成为下一轮起点 |
-| PlannerSoft 扩数据 + Direct 锚定 | 扩大 planner soft 数据,同时保留 direct preference | 形成后续 ckpt126 起点 |
-| PlannerSoft Clean 单生成提升 | 用更大规模 clean 数据继续训 | `checkpoint-138` 成为单生成最佳点 |
-| 预算收尾 DPO | 针对预算偏保守、超支、重复构造 clean pair | 单生成没继续涨,但改变了候选分布 |
+| PlannerSoft 规则 DPO | 把优化目标从 hardpass 转向 planner soft | 选出第一个可继续扩数据的 DPO 起点(ckpt25) |
+| PlannerSoft 扩数据 + Direct 锚定 | 扩大 planner soft 数据,同时保留 direct preference | 得到更稳的扩数据基线(ckpt126) |
+| PlannerSoft Clean 单生成提升 | 用更大规模 clean 数据继续训 | 单生成最好的一版(260519 ckpt138) |
+| 预算收尾 DPO | 针对预算偏保守、超支、重复构造 clean pair | 单生成没继续涨,但候选池更适合 rerank(260520 / 260521) |
 
-DPO loss 也不能跨批次硬比。前几轮 pair 很容易分,loss 低、accuracy 高;预算收尾 pair 更接近,chosen 和 rejected 都是 hardpass 计划,只是在预算使用、重复和偏好上有差别,loss 自然会更高。
+DPO loss 也跨批次硬比。前几轮 pair 很容易分,loss 低、accuracy 高;预算收尾 pair 更接近,chosen 和 rejected 都是 hardpass 计划,只是在预算使用、重复和偏好上有差别,loss 高一点反而正常
 
 ![DPO loss 跨批次不可比图](./images/Extra12-figures/15-DPO-loss跨批次不可比图.png)
 
@@ -341,9 +358,9 @@ DPO loss 也不能跨批次硬比。前几轮 pair 很容易分,loss 低、acc
 
 ## 第十章:最终多候选 Rerank
 
-DPO 后半段最容易误读。单看单生成,`260519 checkpoint-138` 更稳;继续做预算收尾训练后,`ckpt66` 和 `ckpt64` 没有把单生成分数继续推高。
+DPO 后半段最容易误读。单生成最稳的是 PlannerSoft Clean 那版,也就是 260519 ckpt138;后面两轮预算收尾(260520 ckpt66、260521 ckpt64)没有把单生成分数继续推高。
 
-但最终展示版本不是单生成。它是多候选 rerank
+但最终展示不是单生成,而是多候选 rerank。预算收尾的价值主要体现在候选池:它不一定让第一发回答更高分,但更容易采出能被规则选中的好答案
 
 ![单生成与多候选 Rerank 对比图](./images/Extra12-figures/17-单生成与多候选Rerank对比图.png)
 
@@ -351,19 +368,19 @@ DPO 后半段最容易误读。单看单生成,`260519 checkpoint-138` 更稳
 
 | 版本 | hardpass | planner soft | 重算预算 soft |
 | --- | ---: | ---: | ---: |
-| ckpt126 baseline | 98.4% | 66.9% | 48.5% |
-| 260519 ckpt138 single | 98.4% | 71.5% | 50.9% |
-| 260520 ckpt66 single | 99.0% | 70.1% | 48.3% |
-| 260521 ckpt64 single | 98.2% | 69.7% | 47.6% |
-| 260521 ckpt64 rerank n4 | **99.4%** | **80.6%** | **68.2%** |
+| 扩数据基线(ckpt126) | 98.4% | 66.9% | 48.5% |
+| PlannerSoft Clean 单生成(260519 ckpt138) | 98.4% | 71.5% | 50.9% |
+| 预算收尾第 1 轮单生成(260520 ckpt66) | 99.0% | 70.1% | 48.3% |
+| 预算收尾第 2 轮单生成(260521 ckpt64) | 98.2% | 69.7% | 47.6% |
+| 预算收尾第 2 轮 + 4 候选 rerank(260521 ckpt64) | **99.4%** | **80.6%** | **68.2%** |
 
 ![DPO 收尾 Rerank 效果图](./images/Extra12-figures/10-dpo-rerank-closing.png)
 
-这里的结论不是“最后一炉单生成最好”。更准确的说法是
+所以不能简单说“最后一炉单生成最好”。我会这么记
 
-- 单生成最佳:`260519 ps2400clean_plus_direct402 checkpoint-138`
-- 多生成 rerank 最佳:`260521 closing checkpoint-64 rerank n4`
-- 展示主推:`ckpt64_rerank_n4`,500 条 planner soft `80.6%`,hard split planner soft `77.0%`。
+- 单生成最佳:PlannerSoft Clean 单生成版(260519 ckpt138)
+- 多生成 rerank 最佳:预算收尾第 2 轮 + 4 候选 rerank(260521 ckpt64)
+- 展示主推:260521 ckpt64 rerank n4,500 条 planner soft `80.6%`,hard split planner soft `77.0%`。
 
 单生成看的是一次采样的平均质量;rerank 看的是候选池里有没有更好的答案,以及规则能不能把它选出来。两者可以不是同一个 checkpoint。
 
@@ -373,30 +390,116 @@ DPO 后半段最容易误读。单看单生成,`260519 checkpoint-138` 更稳
 
 最后可以加一个外部强模型参照,但这块一定要写清楚口径。MiMo 不是我们这条 LoRA 训练线里的 checkpoint,也不是严格同一套脚本、同一版规则下的 leaderboard。更合适的用法是:看它告诉我们强模型大概会在哪里强,哪里和本地规则不完全合拍。
 
-历史上跑过 `mimo_v2_5_pro_external_mt1p5`,它是 MiMo v2.5 Pro 外部 API,w50,max token 按 1.5x 放大。和最终 `ckpt64_rerank_n4` 放在一起看,大概是这样:
+我还拿 MiMo v2.5 Pro 外部 API 做过参考评测。为了避免输出长度限制影响结论,当时把 max token 放大了一些。和最终本地版放在一起看,大概是这样:
 
 | 模型 | hardpass | planner soft | 重算预算 soft | 预算偏好 | 重算预算贴合 |
 | --- | ---: | ---: | ---: | ---: | ---: |
-| MiMo v2.5 Pro mt1p5 | 98.8% | 78.7% | **76.6%** | 85.5% | **82.4%** |
-| ckpt64_rerank_n4 | **99.4%** | **80.6%** | 68.2% | **86.0%** | 73.4% |
+| MiMo v2.5 Pro(放大 max token) | 98.8% | 78.7% | **76.6%** | 85.5% | **82.4%** |
+| 本地最终版(260521 ckpt64 rerank n4) | **99.4%** | **80.6%** | 68.2% | **86.0%** | 73.4% |
 
 ![MiMo 外部参考对比图](./images/Extra12-figures/11-mimo-reference-comparison.png)
 
-这张表可以这么读
+这张表我会这么看
 
 - 本地最终版在本项目规则口径下,`hardpass` 和 `planner soft` 已经追上并略高于 MiMo 参考。
 - MiMo 的重算预算 soft 和重算预算贴合仍然更强,说明预算总额控制这件事它做得更稳。
 - MiMo 的预算关系、餐饮尺度在早期报告里不算高,主要是它会给出更真实的人均餐费,但这些餐费有时低于我们当前规则档位的下限。
 
-所以这里不把结论写成“全面超过 MiMo”。更准确的说法是:在本项目冻结评测和规则口径下,最终本地模型的 planner soft 已经追平强模型参考;预算贴合仍有差距,后续如果继续做,应该补预算总额控制和预算档位之间的协调。
+所以我不会写成“全面超过 MiMo”。更稳妥的说法是:在本项目这套冻结评测和规则口径下,最终本地模型的 planner soft 已经追平强模型参考;预算贴合还有差距,后面真要继续做,就补预算总额控制和预算档位之间的协调。
+
+
+---
+
+## Bad Case Gallery:三个最值钱的错误
+
+后训练里最有用的东西,往往不是最好看的成功样例,而是那些反复打脸的 bad case。我最后留下三类:预算合计错、餐饮重复或不 grounded、酒店晚数和房间数没算对。
+
+### 1. 预算合计错:看起来像小账,其实会直接打穿 hard budget
+
+第一个例子是济南 3 天,1 人出差顺便玩,硬预算 3200 元。模型输出里的预算字段长这样:
+
+```json
+{
+  "total_attractions": 240,
+  "total_hotels": 2600,
+  "total_meals": 1748,
+  "total_transportation": 400,
+  "total": 5088
+}
+```
+
+问题有两层。
+
+第一层是算术就不对:`240 + 2600 + 1748 + 400 = 4988`,但模型写成了 `5088`。第二层更麻烦,rule 按每天餐费重算后发现,真实餐饮合计应该是 `1928`,不是 `1748`。也就是说,它既写错了分项,又写错了总数,还把 3200 的 hard budget 超了。
+
+rule 抓到的是:
+
+```text
+budget_arithmetic_inconsistent: part_sum=4988, total=5088, diff=-100
+meal_budget_inconsistent: expected_total_meals=1928, reported_total_meals=1748
+budget_hard_constraint_exceeded: requested_budget=3200, total=5088
+```
+
+后来怎么修?我没有继续指望模型自己把所有账算准,而是把预算评测拆成两套:一套看模型声明的 `budget.total`,一套用景点、酒店、餐饮、交通重新算 `recomputed_budget`。训练和 rerank 里也把预算算术、预算关系、预算贴合拆开看。这样模型可以继续负责选项和行程,账本由规则兜底。
+
+### 2. 餐饮重复:不是不能吃同一家,是不能一路偷懒
+
+第二个例子是长沙 4 天,亲子和老人友好。模型确实找到了餐厅,但选得太偷懒:
+
+```text
+2026-03-08 lunch  新长福(世嘉店)
+2026-03-08 dinner 新长福(世嘉店)
+2026-03-10 dinner 新长福(世嘉店)
+2026-03-11 dinner 新长福(世嘉店)
+```
+
+同一天午晚餐同一家,后面又继续重复。对模型来说这可能是“稳妥的本地餐厅”,但对用户来说,4 天里反复吃同一家店就很不像一个认真做过的行程。
+
+rule 抓到的是:
+
+```text
+meal_same_day_lunch_dinner_repeat: 2026-03-08 lunch/dinner 都是新长福(世嘉店)
+meal_repeat_too_many: name_key=新长福, count=4, max_allowed=3
+meal_diversity_ok=False
+```
+
+后来怎么修?餐饮这块不能只写“推荐特色餐厅”。我加了三类约束:同日午晚餐不能重复,同一餐厅族不能超过上限,餐厅最好来自工具候选而不是泛泛写“附近小吃”。Best-of-N Replay 和最终 rerank 里,也会把餐饮重复、多样性和 grounding 放进排序信号。这个改动很实用,因为它不要求模型一次生成完美答案,只要候选池里有一个更不重复的版本,rerank 就能把它捞出来。
+
+### 3. 酒店晚数错:房间数比天数更容易被模型漏掉
+
+第三个例子是北京 3 天,3 个朋友,住高端酒店。行程是 2026-01-07 到 2026-01-09,所以需要 2 晚;3 个成人通常要 2 间房。模型输出里每天酒店是这样:
+
+```text
+2026-01-07 华北宾馆 estimated_cost=1500
+2026-01-08 华北宾馆 estimated_cost=1500
+2026-01-09 无住宿
+budget.total_hotels=3000
+```
+
+乍看没问题:2 晚,每晚 1500,总共 3000。但它漏了房间数。3 个朋友不是 1 间房住 2 晚,而是按策略应该算 2 间房住 2 晚,酒店预算至少应该覆盖 `1500 * 2 rooms * 2 nights = 6000`。
+
+rule 抓到的是:
+
+```text
+hotel_budget_underestimated:
+  lodging_nights=2
+  party_total=3
+  room_count=2
+  expected_min_total_hotels=6000
+  reported_total_hotels=3000
+```
+
+后来怎么修?这类问题不能指望模型在自然语言里“理解一下人数”。前端和后端要显式传 `party.total`,后端策略层要编译出 `room_count` 和 `lodging_nights`,评测里再用 `hotel_budget_covers_nights` 抓出来。训练数据也不能只写单人单房的简单样本,不然模型会默认“酒店价格 = 一间房一晚 * 晚数”,一遇到朋友、亲子、老人同行就漏账。
+
+这三个 bad case 后来基本变成了我的排查顺序:先看账有没有加对,再看餐饮有没有偷懒,最后看酒店有没有按晚数和房间数覆盖。很多看起来很玄的模型问题,拆到这里其实都挺朴素。
 
 ---
 
 ## 第十二章:这次实验留下来的经验
 
-这次旅行助手后训练给我的最大教训是:Agent 后训练不是单纯“多造点数据再训一下”。它更像把产品协议、数据、训练、评测和推理策略一层层对齐。
+这次做下来,我最确定的一件事是:Agent 后训练不是“多造点数据再训一下”这么简单。真正麻烦的是把产品协议、数据、训练、评测和推理策略对上
 
-最后留下来的经验大概是这些:
+最后我记下来的东西不复杂
 
 1. **先改产品协议。** 能结构化提交的字段,不要让模型猜。
 2. **把上下文编译好。** 模型应该基于候选做选择,而不是凭空写事实。
@@ -409,18 +512,18 @@ DPO 后半段最容易误读。单看单生成,`260519 checkpoint-138` 更稳
 9. **训练数据要避开冻结评测集。** 实验项目也没必要背题,重叠检查很便宜。
 10. **指标拆开看。** hardpass、planner soft、预算关系、重算预算不要揉成一个总分。
 
-如果只用一句话概括,就是
+最后我会这么收尾
 
-> 能结构化的交给工程,能规则化的做成评测,必须由模型学习的再进入 SFT 或偏好训练。
+> 能结构化的交给工程,能规则化的做成评测,剩下那些真要模型学的,再放进 SFT 或偏好训练。
 
-这样做出来的模型不会只是“更会说”,而是更接近一个能被产品接住、能被指标解释、也能继续迭代的 Planner
+这样训出来的模型当然会更会说,但重点不在这。更重要的是,它能接进前后端;出了问题,规则能定位;下一轮还能继续修
 
 ## 复现资源
 
-如果你完整复现,可以从这些材料开始:
+想复现的话,从这些材料开始就行
 
 - 旅行助手项目仓库:[https://github.com/nameless0120/helloagents-trip-planner](https://github.com/nameless0120/helloagents-trip-planner)
 - 完整教程:[旅行助手后训练实战教程](https://github.com/nameless0120/helloagents-trip-planner/blob/main/training/docs/%E6%95%99%E7%A8%8B/%E6%97%85%E8%A1%8C%E5%8A%A9%E6%89%8B%E5%90%8E%E8%AE%AD%E7%BB%83%E5%AE%9E%E6%88%98%E6%95%99%E7%A8%8B.md)
 - 配套数据:`helloagents-后训练数据`,<https://pan.baidu.com/s/5oNsK7pwQnqzQEUg5ykb09Q>
 
-主线 LoRA 复现建议配置是 2 张 40GB 级别 GPU。4 张 40GB 会更舒服,尤其是多轮训练和并行评测时。2 张 24GB 可以做短上下文或 QLoRA 实验,但不建议拿来复现这条长上下文主线,因为 `cutoff_len=24576`、LoRA r32、bf16、activation checkpointing、FSDP2 + CP=2 是这条实验线的一部分。把这些砍掉,也能跑,但就不是同一个实验了
+硬件和脚本细节这篇不展开。简单说,这条主线依赖长上下文 LoRA;如果把上下文截短、换成 QLoRA 或改小 rank,也能跑,但就不是文中这条路线了。复现实验时,以 `helloagents-trip-planner` 仓库里的配置和归档为准

BIN
Extra-Chapter/images/Extra12-figures/18-全参SFT与LoRA对比图.png


+ 4472 - 0
Extra-Chapter/images/Extra12-figures/18-全参SFT与LoRA对比图.svg

@@ -0,0 +1,4472 @@
+<?xml version="1.0" encoding="utf-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="979.2pt" height="518.4pt" viewBox="0 0 979.2 518.4" xmlns="http://www.w3.org/2000/svg" version="1.1">
+ <metadata>
+  <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+   <cc:Work>
+    <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+    <dc:date>2026-05-24T11:10:06.950774</dc:date>
+    <dc:format>image/svg+xml</dc:format>
+    <dc:creator>
+     <cc:Agent>
+      <dc:title>Matplotlib v3.10.9, https://matplotlib.org/</dc:title>
+     </cc:Agent>
+    </dc:creator>
+   </cc:Work>
+  </rdf:RDF>
+ </metadata>
+ <defs>
+  <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
+ </defs>
+ <g id="figure_1">
+  <g id="patch_1">
+   <path d="M 0 518.4 
+L 979.2 518.4 
+L 979.2 0 
+L 0 0 
+z
+" style="fill: #ffffff"/>
+  </g>
+  <g id="axes_1">
+   <g id="patch_2">
+    <path d="M 42.765865 459.13605 
+L 534.766687 459.13605 
+L 534.766687 43.571033 
+L 42.765865 43.571033 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="patch_3">
+    <path d="M 65.129539 459.13605 
+L 89.090618 459.13605 
+L 89.090618 85.52331 
+L 65.129539 85.52331 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #2563eb"/>
+   </g>
+   <g id="patch_4">
+    <path d="M 131.688092 459.13605 
+L 155.649171 459.13605 
+L 155.649171 269.163471 
+L 131.688092 269.163471 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #2563eb"/>
+   </g>
+   <g id="patch_5">
+    <path d="M 198.246644 459.13605 
+L 222.207723 459.13605 
+L 222.207723 325.363692 
+L 198.246644 325.363692 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #2563eb"/>
+   </g>
+   <g id="patch_6">
+    <path d="M 264.805197 459.13605 
+L 288.766276 459.13605 
+L 288.766276 132.224903 
+L 264.805197 132.224903 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #2563eb"/>
+   </g>
+   <g id="patch_7">
+    <path d="M 331.36375 459.13605 
+L 355.324829 459.13605 
+L 355.324829 190.799782 
+L 331.36375 190.799782 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #2563eb"/>
+   </g>
+   <g id="patch_8">
+    <path d="M 397.922303 459.13605 
+L 421.883382 459.13605 
+L 421.883382 190.008229 
+L 397.922303 190.008229 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #2563eb"/>
+   </g>
+   <g id="patch_9">
+    <path d="M 464.480856 459.13605 
+L 488.441935 459.13605 
+L 488.441935 107.686778 
+L 464.480856 107.686778 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #2563eb"/>
+   </g>
+   <g id="patch_10">
+    <path d="M 89.090618 459.13605 
+L 113.051697 459.13605 
+L 113.051697 80.015755 
+L 89.090618 80.015755 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #f59e0b"/>
+   </g>
+   <g id="patch_11">
+    <path d="M 155.649171 459.13605 
+L 179.61025 459.13605 
+L 179.61025 282.266122 
+L 155.649171 282.266122 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #f59e0b"/>
+   </g>
+   <g id="patch_12">
+    <path d="M 222.207723 459.13605 
+L 246.168802 459.13605 
+L 246.168802 337.78583 
+L 222.207723 337.78583 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #f59e0b"/>
+   </g>
+   <g id="patch_13">
+    <path d="M 288.766276 459.13605 
+L 312.727355 459.13605 
+L 312.727355 156.950209 
+L 288.766276 156.950209 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #f59e0b"/>
+   </g>
+   <g id="patch_14">
+    <path d="M 355.324829 459.13605 
+L 379.285908 459.13605 
+L 379.285908 194.227727 
+L 355.324829 194.227727 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #f59e0b"/>
+   </g>
+   <g id="patch_15">
+    <path d="M 421.883382 459.13605 
+L 445.844461 459.13605 
+L 445.844461 172.812982 
+L 421.883382 172.812982 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #f59e0b"/>
+   </g>
+   <g id="patch_16">
+    <path d="M 488.441935 459.13605 
+L 512.403014 459.13605 
+L 512.403014 96.671668 
+L 488.441935 96.671668 
+z
+" clip-path="url(#p74188dfc60)" style="fill: #f59e0b"/>
+   </g>
+   <g id="matplotlib.axis_1">
+    <g id="xtick_1">
+     <g id="line2d_1">
+      <defs>
+       <path id="mfaa676100c" d="M 0 0 
+L 0 3.5 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#mfaa676100c" x="89.090618" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_1">
+      <!-- 硬通过 -->
+      <g transform="translate(61.681576 486.519668) rotate(-26) scale(0.1 -0.1)">
+       <defs>
+        <path id="DroidSansFallback-786c" d="M 400 4775 
+L 2700 4775 
+L 2700 4300 
+L 1650 4300 
+L 1200 2800 
+L 2450 2800 
+L 2450 200 
+L 1400 200 
+L 1400 -350 
+L 925 -350 
+L 925 2200 
+L 575 1525 
+L 225 1875 
+Q 850 2950 1175 4300 
+L 400 4300 
+L 400 4775 
+z
+M 1400 675 
+L 1975 675 
+L 1975 2350 
+L 1400 2350 
+L 1400 675 
+z
+M 2875 4950 
+L 6025 4950 
+L 6025 4500 
+L 4650 4500 
+L 4650 3950 
+L 5875 3950 
+L 5875 1525 
+L 4625 1525 
+Q 4550 925 4375 525 
+Q 4975 125 6150 -100 
+L 5900 -600 
+Q 4775 -350 4100 100 
+Q 3625 -450 2725 -650 
+L 2500 -175 
+Q 3300 0 3675 400 
+Q 3250 750 2975 1125 
+L 3300 1450 
+L 3950 800 
+L 4150 1525 
+L 2975 1525 
+L 2975 3950 
+L 4175 3950 
+L 4175 4500 
+L 2875 4500 
+L 2875 4950 
+z
+M 3475 2950 
+L 4175 2950 
+L 4175 3525 
+L 3475 3525 
+L 3475 2950 
+z
+M 4650 3525 
+L 4650 2950 
+L 5375 2950 
+L 5375 3525 
+L 4650 3525 
+z
+M 3475 1950 
+L 4175 1950 
+L 4175 2525 
+L 3475 2525 
+L 3475 1950 
+z
+M 4650 2525 
+L 4650 1950 
+L 5375 1950 
+L 5375 2525 
+L 4650 2525 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-901a" d="M 750 5025 
+Q 1250 4700 1650 4250 
+L 1300 3825 
+Q 875 4325 400 4650 
+L 750 5025 
+z
+M 325 2950 
+L 1575 2950 
+L 1575 550 
+Q 1950 275 2500 200 
+Q 3050 125 6100 125 
+L 5850 -425 
+L 3850 -425 
+Q 2100 -425 1375 200 
+L 650 -525 
+L 300 0 
+L 1075 475 
+L 1075 2475 
+L 325 2475 
+L 325 2950 
+z
+M 2250 5025 
+L 5750 5025 
+L 5750 4675 
+Q 5125 4200 4400 3875 
+L 4500 3775 
+L 5825 3775 
+L 5825 950 
+Q 5825 425 5200 425 
+L 4600 475 
+L 4500 900 
+L 5175 850 
+Q 5325 850 5325 1050 
+L 5325 1550 
+L 4250 1550 
+L 4250 550 
+L 3750 550 
+L 3750 1550 
+L 2725 1550 
+L 2725 475 
+L 2250 475 
+L 2250 3775 
+L 3825 3775 
+L 3075 4200 
+L 3475 4500 
+L 4025 4150 
+L 4900 4600 
+L 2250 4600 
+L 2250 5025 
+z
+M 2725 2875 
+L 3750 2875 
+L 3750 3325 
+L 2725 3325 
+L 2725 2875 
+z
+M 4250 2875 
+L 5325 2875 
+L 5325 3325 
+L 4250 3325 
+L 4250 2875 
+z
+M 2725 1950 
+L 3750 1950 
+L 3750 2475 
+L 2725 2475 
+L 2725 1950 
+z
+M 4250 1950 
+L 5325 1950 
+L 5325 2475 
+L 4250 2475 
+L 4250 1950 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-8fc7" d="M 750 5025 
+Q 1250 4700 1650 4250 
+L 1300 3825 
+Q 875 4325 400 4650 
+L 750 5025 
+z
+M 325 2950 
+L 1575 2950 
+L 1575 550 
+Q 1950 275 2500 200 
+Q 3050 125 6100 125 
+L 5850 -425 
+L 3850 -425 
+Q 2100 -425 1375 200 
+L 650 -525 
+L 300 0 
+L 1075 475 
+L 1075 2475 
+L 325 2475 
+L 325 2950 
+z
+M 4375 5150 
+L 4875 5150 
+L 4875 4175 
+L 6000 4175 
+L 6000 3700 
+L 4875 3700 
+L 4875 875 
+Q 4850 325 4150 325 
+Q 3800 325 3500 450 
+L 3400 950 
+Q 3725 800 4075 800 
+Q 4375 800 4375 1075 
+L 4375 3700 
+L 2275 3700 
+L 2275 4175 
+L 4375 4175 
+L 4375 5150 
+z
+M 2900 3200 
+Q 3300 2525 3500 1700 
+L 2975 1525 
+Q 2775 2375 2400 3050 
+L 2900 3200 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DroidSansFallback-786c"/>
+       <use xlink:href="#DroidSansFallback-901a" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-8fc7" transform="translate(200 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_2">
+     <g id="line2d_2">
+      <g>
+       <use xlink:href="#mfaa676100c" x="155.649171" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_2">
+      <!-- 规划软通过 -->
+      <g transform="translate(110.298495 495.392418) rotate(-26) scale(0.1 -0.1)">
+       <defs>
+        <path id="DroidSansFallback-89c4" d="M 5675 4950 
+L 5675 1475 
+L 5175 1475 
+L 5175 4500 
+L 3575 4500 
+L 3575 1475 
+L 3075 1475 
+L 3075 4950 
+L 5675 4950 
+z
+M 4025 3950 
+L 4525 3950 
+L 4500 2200 
+Q 4400 150 3150 -600 
+L 2850 -200 
+Q 3875 450 3975 1850 
+L 4025 3950 
+z
+M 4550 1550 
+L 5025 1550 
+L 5025 100 
+Q 5025 -75 5300 -75 
+Q 5550 -75 5600 12 
+Q 5650 100 5675 675 
+L 6100 550 
+Q 6050 -175 5925 -350 
+Q 5825 -500 5300 -500 
+Q 4775 -500 4662 -400 
+Q 4550 -300 4550 -25 
+L 4550 1550 
+z
+M 1625 1200 
+Q 1325 250 725 -400 
+L 325 -100 
+Q 1225 925 1350 2300 
+L 425 2300 
+L 425 2775 
+L 1350 2775 
+L 1350 3800 
+L 575 3800 
+L 575 4275 
+L 1350 4275 
+L 1350 5175 
+L 1850 5175 
+L 1850 4275 
+L 2650 4275 
+L 2650 3800 
+L 1850 3800 
+L 1850 2775 
+L 2725 2775 
+L 2725 2300 
+L 1825 2300 
+L 1725 1700 
+L 2900 625 
+L 2525 250 
+L 1625 1200 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-5212" d="M 3625 3675 
+L 3675 3175 
+L 1875 2900 
+L 2250 1450 
+Q 2675 1975 3000 2650 
+L 3425 2450 
+Q 2975 1525 2450 925 
+Q 2875 -100 3200 -100 
+Q 3325 -100 3425 650 
+L 3850 500 
+Q 3700 -575 3200 -575 
+Q 2625 -575 2075 575 
+Q 1450 75 675 -275 
+L 450 175 
+Q 1325 575 1875 1075 
+Q 1525 2025 1400 2825 
+L 475 2675 
+L 400 3175 
+L 1325 3325 
+L 1225 5100 
+L 1750 5100 
+L 1825 3400 
+L 3625 3675 
+z
+M 2650 4925 
+L 3275 4225 
+L 2925 3950 
+L 2275 4675 
+L 2650 4925 
+z
+M 5375 5150 
+L 5875 5150 
+L 5875 75 
+Q 5875 -575 5275 -575 
+L 4425 -475 
+L 4325 25 
+Q 4775 -100 5200 -100 
+Q 5375 -100 5375 200 
+L 5375 5150 
+z
+M 4275 4500 
+L 4775 4500 
+L 4775 875 
+L 4275 875 
+L 4275 4500 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-8f6f" d="M 325 4375 
+L 1125 4375 
+L 1350 5175 
+L 1800 5075 
+L 1625 4375 
+L 2625 4375 
+L 2625 3900 
+L 1475 3900 
+Q 1225 3075 875 2475 
+L 1575 2475 
+L 1575 3275 
+L 2025 3275 
+L 2025 2475 
+L 2650 2475 
+L 2650 2050 
+L 2025 2050 
+L 2025 1275 
+L 2600 1425 
+L 2675 975 
+L 2025 800 
+L 2025 -575 
+L 1575 -575 
+L 1575 700 
+L 425 500 
+L 325 1000 
+L 1575 1200 
+L 1575 2050 
+L 425 2050 
+L 325 2475 
+Q 700 3100 975 3900 
+L 325 3900 
+L 325 4375 
+z
+M 3600 5225 
+L 4075 5100 
+L 3825 4250 
+L 5850 4250 
+L 5850 3800 
+L 5350 2650 
+L 4925 2875 
+L 5300 3775 
+L 3650 3775 
+Q 3375 3075 2900 2450 
+L 2525 2850 
+Q 3225 3825 3600 5225 
+z
+M 4050 3375 
+L 4525 3325 
+L 4500 2475 
+Q 4500 2200 4875 1325 
+Q 5250 450 6125 -175 
+L 5700 -575 
+Q 4750 200 4350 1525 
+Q 4050 275 2925 -575 
+L 2550 -175 
+Q 3350 425 3687 1162 
+Q 4025 1900 4050 3375 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DroidSansFallback-89c4"/>
+       <use xlink:href="#DroidSansFallback-5212" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-8f6f" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-901a" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-8fc7" transform="translate(400 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_3">
+     <g id="line2d_3">
+      <g>
+       <use xlink:href="#mfaa676100c" x="222.207723" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_3">
+      <!-- 重算软通过 -->
+      <g transform="translate(176.874172 495.392418) rotate(-26) scale(0.1 -0.1)">
+       <defs>
+        <path id="DroidSansFallback-91cd" d="M 5375 5075 
+L 5625 4650 
+L 3425 4550 
+L 3425 4150 
+L 6025 4150 
+L 6025 3700 
+L 3425 3700 
+L 3425 3350 
+L 5475 3350 
+L 5475 1225 
+L 3425 1225 
+L 3425 875 
+L 5775 875 
+L 5775 425 
+L 3425 425 
+L 3425 75 
+L 6000 75 
+L 6000 -400 
+L 350 -400 
+L 350 75 
+L 2925 75 
+L 2925 425 
+L 600 425 
+L 600 875 
+L 2925 875 
+L 2925 1225 
+L 850 1225 
+L 850 3350 
+L 2925 3350 
+L 2925 3700 
+L 400 3700 
+L 400 4150 
+L 2925 4150 
+L 2925 4525 
+L 825 4475 
+L 675 4925 
+Q 3025 4925 5375 5075 
+z
+M 1325 2500 
+L 2925 2500 
+L 2925 2900 
+L 1325 2900 
+L 1325 2500 
+z
+M 3425 2900 
+L 3425 2500 
+L 5025 2500 
+L 5025 2900 
+L 3425 2900 
+z
+M 1325 1675 
+L 2925 1675 
+L 2925 2075 
+L 1325 2075 
+L 1325 1675 
+z
+M 3425 2075 
+L 3425 1675 
+L 5025 1675 
+L 5025 2075 
+L 3425 2075 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-7b97" d="M 1375 5225 
+L 1875 5075 
+L 1725 4800 
+L 3175 4800 
+L 3175 4375 
+L 2375 4375 
+L 2750 3975 
+L 2300 3725 
+L 1825 4375 
+L 1425 4375 
+Q 1125 3975 725 3675 
+L 325 3975 
+Q 1075 4550 1375 5225 
+z
+M 3975 5225 
+L 4450 5075 
+L 4325 4800 
+L 6050 4800 
+L 6050 4375 
+L 5050 4375 
+L 5275 4100 
+L 4825 3850 
+L 4475 4375 
+L 4050 4375 
+L 3475 3750 
+L 3050 4050 
+Q 3675 4575 3975 5225 
+z
+M 1025 3675 
+L 5425 3675 
+L 5425 1250 
+L 4450 1250 
+L 4450 875 
+L 6075 875 
+L 6075 425 
+L 4450 425 
+L 4450 -550 
+L 3950 -550 
+L 3950 425 
+L 2450 425 
+Q 2300 -175 1100 -575 
+L 750 -100 
+Q 1725 125 1900 425 
+L 325 425 
+L 325 875 
+L 1975 875 
+L 1975 1250 
+L 1025 1250 
+L 1025 3675 
+z
+M 1500 2975 
+L 4950 2975 
+L 4950 3250 
+L 1500 3250 
+L 1500 2975 
+z
+M 1500 2325 
+L 4950 2325 
+L 4950 2600 
+L 1500 2600 
+L 1500 2325 
+z
+M 1500 1675 
+L 4950 1675 
+L 4950 1950 
+L 1500 1950 
+L 1500 1675 
+z
+M 3950 875 
+L 3950 1250 
+L 2475 1250 
+L 2475 875 
+L 3950 875 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DroidSansFallback-91cd"/>
+       <use xlink:href="#DroidSansFallback-7b97" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-8f6f" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-901a" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-8fc7" transform="translate(400 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_4">
+     <g id="line2d_4">
+      <g>
+       <use xlink:href="#mfaa676100c" x="288.766276" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_4">
+      <!-- 餐饮多样性 -->
+      <g transform="translate(243.398477 495.392418) rotate(-26) scale(0.1 -0.1)">
+       <defs>
+        <path id="DroidSansFallback-9910" d="M 1800 5200 
+L 2250 5200 
+L 2250 4975 
+L 3275 4975 
+L 3275 4625 
+L 2250 4625 
+L 2250 4350 
+L 3050 4350 
+L 3050 3950 
+Q 2350 2875 650 2550 
+L 400 2875 
+Q 1875 3150 2475 3975 
+L 1175 3975 
+L 1175 3950 
+L 1675 3625 
+L 1375 3325 
+L 900 3700 
+L 575 3425 
+L 325 3775 
+Q 925 4225 1250 4825 
+L 1625 4625 
+L 1475 4350 
+L 1800 4350 
+L 1800 5200 
+z
+M 3650 4375 
+L 4650 3950 
+Q 5050 4325 5200 4575 
+L 3600 4575 
+L 3600 4975 
+L 5725 4975 
+L 5725 4575 
+Q 5450 4075 5075 3750 
+L 5925 3200 
+L 5650 2850 
+L 4700 3450 
+L 3900 3000 
+L 3650 3375 
+L 4250 3675 
+L 3475 4000 
+L 3650 4375 
+z
+M 3275 3375 
+L 3625 3125 
+L 3400 2950 
+Q 4675 2525 6100 2300 
+L 5850 1875 
+L 5150 2025 
+L 5150 500 
+L 3650 500 
+L 4875 175 
+L 5450 700 
+L 5825 475 
+L 5325 0 
+L 5925 -225 
+L 5675 -625 
+Q 4450 -75 3200 200 
+L 3450 500 
+L 1725 500 
+L 1725 -150 
+L 2925 150 
+L 3050 -275 
+L 1500 -625 
+L 1275 -350 
+L 1275 1925 
+L 450 1675 
+L 325 2150 
+Q 2075 2550 3275 3375 
+z
+M 1675 2050 
+L 3000 2050 
+L 2850 2325 
+L 3300 2475 
+L 3525 2050 
+L 5050 2050 
+L 3075 2725 
+L 1675 2050 
+z
+M 1725 1700 
+L 1725 1450 
+L 4700 1450 
+L 4700 1700 
+L 1725 1700 
+z
+M 1725 1125 
+L 1725 875 
+L 4700 875 
+L 4700 1125 
+L 1725 1125 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-996e" d="M 1150 5200 
+L 1650 5075 
+L 1475 4350 
+L 2725 4350 
+L 2725 3900 
+L 2275 2775 
+L 1850 3025 
+Q 2075 3425 2200 3875 
+L 1325 3875 
+Q 1050 3000 600 2375 
+L 225 2775 
+Q 875 3825 1150 5200 
+z
+M 1200 3100 
+L 1675 3100 
+L 1675 200 
+L 2350 725 
+L 2450 175 
+L 1425 -525 
+L 1200 -250 
+L 1200 3100 
+z
+M 3875 3775 
+Q 3675 3125 3225 2450 
+L 2850 2825 
+Q 3475 3825 3800 5225 
+L 4275 5075 
+L 4050 4250 
+L 5875 4250 
+L 5875 3800 
+L 5400 2650 
+L 5000 2875 
+L 5325 3775 
+L 3875 3775 
+z
+M 4125 3375 
+L 4600 3325 
+L 4575 2500 
+Q 4575 2250 4950 1337 
+Q 5325 425 6125 -175 
+L 5700 -575 
+Q 4800 200 4425 1525 
+Q 4150 250 3125 -575 
+L 2750 -175 
+Q 3475 400 3787 1137 
+Q 4100 1875 4125 3375 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-591a" d="M 3225 5225 
+L 3725 5125 
+L 3275 4675 
+L 5350 4675 
+L 5350 4225 
+Q 4375 2700 875 2200 
+L 675 2700 
+Q 3900 3025 4775 4225 
+L 2650 4225 
+L 2300 4025 
+L 2850 3600 
+L 2500 3250 
+L 1825 3800 
+L 1175 3550 
+L 850 3900 
+Q 2000 4300 2475 4650 
+L 2500 4675 
+L 2525 4675 
+L 3225 5225 
+z
+M 3525 2700 
+L 3975 2475 
+L 3650 2225 
+L 5575 2225 
+L 5575 1775 
+Q 4475 -25 600 -600 
+L 400 -100 
+Q 4050 325 5000 1775 
+L 3050 1775 
+L 2375 1375 
+L 3000 900 
+L 2625 525 
+L 1900 1125 
+L 1200 825 
+L 900 1250 
+Q 2375 1750 3525 2700 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-6837" d="M 425 4025 
+L 1225 4025 
+L 1225 5175 
+L 1700 5175 
+L 1700 4025 
+L 2450 4025 
+L 2450 3550 
+L 1700 3550 
+L 1700 3250 
+L 2525 2125 
+L 2200 1650 
+L 1700 2575 
+L 1700 -575 
+L 1225 -575 
+L 1225 2150 
+Q 950 1325 575 775 
+L 225 1125 
+Q 950 2200 1175 3550 
+L 425 3550 
+L 425 4025 
+z
+M 5050 5175 
+L 5575 5025 
+L 5000 4050 
+L 6000 4050 
+L 6000 3575 
+L 4600 3575 
+L 4600 2700 
+L 5850 2700 
+L 5850 2225 
+L 4600 2225 
+L 4600 1350 
+L 6075 1350 
+L 6075 875 
+L 4600 875 
+L 4600 -575 
+L 4100 -575 
+L 4100 875 
+L 2675 875 
+L 2675 1350 
+L 4100 1350 
+L 4100 2225 
+L 2875 2225 
+L 2875 2700 
+L 4100 2700 
+L 4100 3575 
+L 2750 3575 
+L 2750 4050 
+L 4475 4050 
+L 5050 5175 
+z
+M 3500 5150 
+Q 3825 4800 4025 4375 
+L 3575 4175 
+Q 3375 4625 3075 4950 
+L 3500 5150 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-6027" d="M 1600 3625 
+L 1600 -575 
+L 1150 -575 
+L 1150 5175 
+L 1600 5175 
+L 1600 4225 
+L 2300 3525 
+L 2000 3100 
+L 1600 3625 
+z
+M 500 3925 
+L 925 3825 
+Q 875 2850 700 2050 
+L 275 2250 
+L 500 3925 
+z
+M 2850 4825 
+L 3300 4675 
+L 3100 3800 
+L 4025 3800 
+L 4025 5150 
+L 4525 5150 
+L 4525 3800 
+L 5950 3800 
+L 5950 3325 
+L 4525 3325 
+L 4525 1950 
+L 5875 1950 
+L 5875 1475 
+L 4525 1475 
+L 4525 125 
+L 6100 125 
+L 6100 -350 
+L 2325 -350 
+L 2325 125 
+L 4025 125 
+L 4025 1475 
+L 2625 1475 
+L 2625 1950 
+L 4025 1950 
+L 4025 3325 
+L 2950 3325 
+Q 2775 2675 2525 2225 
+L 2100 2550 
+Q 2625 3550 2850 4825 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DroidSansFallback-9910"/>
+       <use xlink:href="#DroidSansFallback-996e" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-591a" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-6837" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-6027" transform="translate(400 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_5">
+     <g id="line2d_5">
+      <g>
+       <use xlink:href="#mfaa676100c" x="355.324829" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_5">
+      <!-- 预算偏好 -->
+      <g transform="translate(318.962094 491.008707) rotate(-26) scale(0.1 -0.1)">
+       <defs>
+        <path id="DroidSansFallback-9884" d="M 400 4925 
+L 2525 4925 
+L 2525 4475 
+Q 2175 3800 1700 3200 
+L 1900 2950 
+L 2700 2950 
+L 2700 2500 
+L 2225 1475 
+L 1825 1700 
+L 2150 2475 
+L 1625 2475 
+L 1625 -50 
+Q 1600 -575 1125 -575 
+L 700 -525 
+L 600 -25 
+L 1050 -75 
+Q 1150 -75 1150 225 
+L 1150 2475 
+L 350 2475 
+L 350 2950 
+L 1325 2950 
+L 575 3625 
+L 925 3975 
+L 1375 3550 
+L 1975 4475 
+L 400 4475 
+L 400 4925 
+z
+M 5825 4025 
+L 5825 775 
+L 5325 775 
+L 5325 3575 
+L 3625 3575 
+L 3625 750 
+L 3150 750 
+L 3150 4025 
+L 4075 4025 
+L 4150 4525 
+L 2875 4525 
+L 2875 4975 
+L 6050 4975 
+L 6050 4525 
+L 4650 4525 
+L 4575 4025 
+L 5825 4025 
+z
+M 4250 3050 
+L 4700 3050 
+L 4650 1275 
+Q 4375 -25 2875 -575 
+L 2550 -150 
+Q 4075 400 4200 1650 
+L 4250 3050 
+z
+M 4925 825 
+Q 5550 400 6150 -175 
+L 5775 -575 
+Q 5250 0 4525 550 
+L 4925 825 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-504f" d="M 1500 5175 
+L 2000 5025 
+L 1475 3650 
+L 1475 -575 
+L 975 -575 
+L 975 2700 
+L 500 2050 
+L 250 2550 
+Q 1100 3800 1500 5175 
+z
+M 3775 4525 
+L 3475 5050 
+L 3975 5200 
+L 4300 4525 
+L 5875 4525 
+L 5875 2975 
+L 2675 2975 
+L 2675 2100 
+Q 2675 700 2100 -575 
+L 1675 -250 
+Q 2175 775 2175 2100 
+L 2175 4525 
+L 3775 4525 
+z
+M 2675 3425 
+L 5400 3425 
+L 5400 4075 
+L 2675 4075 
+L 2675 3425 
+z
+M 5950 2475 
+L 5950 -25 
+Q 5950 -575 5350 -575 
+L 4975 -525 
+L 4875 -100 
+L 5325 -125 
+Q 5475 -125 5475 75 
+L 5475 900 
+L 5050 900 
+L 5050 25 
+L 4650 25 
+L 4650 900 
+L 4200 900 
+L 4200 25 
+L 3800 25 
+L 3800 900 
+L 3350 900 
+L 3350 -600 
+L 2900 -600 
+L 2900 2475 
+L 5950 2475 
+z
+M 3350 1325 
+L 3800 1325 
+L 3800 2025 
+L 3350 2025 
+L 3350 1325 
+z
+M 4200 2025 
+L 4200 1325 
+L 4650 1325 
+L 4650 2025 
+L 4200 2025 
+z
+M 5050 2025 
+L 5050 1325 
+L 5475 1325 
+L 5475 2025 
+L 5050 2025 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-597d" d="M 1275 5175 
+L 1725 5075 
+L 1550 4050 
+L 2525 4050 
+Q 2450 2150 1950 1000 
+L 2625 175 
+L 2200 -150 
+L 1700 550 
+Q 1150 -225 625 -600 
+L 325 -175 
+Q 900 225 1350 975 
+L 525 1825 
+L 950 3575 
+L 325 3575 
+L 325 4050 
+L 1075 4050 
+L 1275 5175 
+z
+M 1575 1425 
+Q 1925 2250 2000 3575 
+L 1450 3575 
+L 1050 1975 
+L 1575 1425 
+z
+M 2875 4950 
+L 5750 4950 
+L 5750 4425 
+Q 5200 3775 4550 3225 
+L 4550 2650 
+L 6100 2650 
+L 6100 2175 
+L 4550 2175 
+L 4550 -125 
+Q 4550 -575 3975 -575 
+L 3450 -525 
+L 3375 -75 
+L 3850 -125 
+Q 4100 -125 4100 -50 
+L 4100 2175 
+L 2475 2175 
+L 2475 2650 
+L 4100 2650 
+L 4100 3475 
+L 5150 4475 
+L 2875 4475 
+L 2875 4950 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DroidSansFallback-9884"/>
+       <use xlink:href="#DroidSansFallback-7b97" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-504f" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-597d" transform="translate(300 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_6">
+     <g id="line2d_6">
+      <g>
+       <use xlink:href="#mfaa676100c" x="421.883382" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_6">
+      <!-- 预算合计一致 -->
+      <g transform="translate(367.527642 499.811239) rotate(-26) scale(0.1 -0.1)">
+       <defs>
+        <path id="DroidSansFallback-5408" d="M 3150 5250 
+L 3675 5100 
+L 3500 4900 
+Q 4750 3900 6125 3350 
+L 5825 2850 
+Q 4500 3425 3200 4575 
+Q 2025 3475 525 2800 
+L 250 3250 
+Q 2275 4200 3150 5250 
+z
+M 1300 3100 
+L 5075 3100 
+L 5075 2600 
+L 1300 2600 
+L 1300 3100 
+z
+M 5300 1925 
+L 5300 -575 
+L 4800 -575 
+L 4800 -175 
+L 1550 -175 
+L 1550 -575 
+L 1050 -575 
+L 1050 1925 
+L 5300 1925 
+z
+M 1550 300 
+L 4800 300 
+L 4800 1450 
+L 1550 1450 
+L 1550 300 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-8ba1" d="M 1275 5175 
+Q 1700 4675 1975 4125 
+L 1500 3850 
+Q 1250 4400 825 4900 
+L 1275 5175 
+z
+M 325 3325 
+L 1675 3325 
+L 1675 425 
+L 2200 1000 
+L 2525 700 
+Q 2175 225 1575 -250 
+L 1200 75 
+L 1200 2875 
+L 325 2875 
+L 325 3325 
+z
+M 2050 3225 
+L 3825 3225 
+L 3825 5175 
+L 4325 5175 
+L 4325 3225 
+L 6075 3225 
+L 6075 2750 
+L 4325 2750 
+L 4325 -625 
+L 3825 -625 
+L 3825 2750 
+L 2050 2750 
+L 2050 3225 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-4e00" d="M 525 2800 
+L 5850 2800 
+L 5850 2325 
+L 525 2325 
+L 525 2800 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-81f4" d="M 4275 4125 
+L 5950 4125 
+L 5950 3650 
+L 5675 3650 
+Q 5525 1900 4975 1000 
+Q 5425 400 6125 -100 
+L 5750 -575 
+Q 5175 -100 4675 550 
+Q 4175 -125 3450 -600 
+L 3100 -150 
+Q 3850 300 4350 1025 
+L 3700 2375 
+L 3500 1950 
+L 3100 2250 
+Q 3725 3575 4000 5175 
+L 4500 5025 
+L 4275 4125 
+z
+M 5175 3650 
+L 4150 3650 
+L 3975 3075 
+Q 4275 2175 4650 1525 
+Q 4975 2225 5125 3225 
+L 5125 3250 
+L 5175 3650 
+z
+M 425 4900 
+L 3200 4900 
+L 3200 4425 
+L 1925 4425 
+Q 1550 3425 1175 2950 
+L 2375 3200 
+L 2050 3900 
+L 2525 4100 
+Q 2925 3400 3175 2550 
+L 2675 2325 
+L 2550 2750 
+Q 1650 2500 650 2425 
+L 500 2900 
+Q 975 3425 1350 4425 
+L 425 4425 
+L 425 4900 
+z
+M 3100 500 
+L 3200 50 
+L 500 -450 
+L 300 75 
+L 1500 250 
+L 1500 1050 
+L 525 1050 
+L 525 1500 
+L 1500 1500 
+L 1500 2300 
+L 2000 2300 
+L 2000 1500 
+L 3025 1500 
+L 3025 1050 
+L 2000 1050 
+L 2000 325 
+L 3100 500 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DroidSansFallback-9884"/>
+       <use xlink:href="#DroidSansFallback-7b97" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-5408" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-8ba1" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-4e00" transform="translate(400 0)"/>
+       <use xlink:href="#DroidSansFallback-81f4" transform="translate(500 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_7">
+     <g id="line2d_7">
+      <g>
+       <use xlink:href="#mfaa676100c" x="488.441935" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_7">
+      <!-- 用户预算约束 -->
+      <g transform="translate(434.103319 499.77613) rotate(-26) scale(0.1 -0.1)">
+       <defs>
+        <path id="DroidSansFallback-7528" d="M 5675 4875 
+L 5675 175 
+Q 5675 -525 5075 -525 
+L 4325 -475 
+L 4225 25 
+L 4975 -25 
+Q 5175 -25 5175 325 
+L 5175 1400 
+L 3550 1400 
+L 3550 -275 
+L 3050 -275 
+L 3050 1400 
+L 1375 1400 
+Q 1250 350 750 -575 
+L 275 -275 
+Q 925 1000 950 2300 
+L 950 4875 
+L 5675 4875 
+z
+M 1450 3375 
+L 3050 3375 
+L 3050 4400 
+L 1450 4400 
+L 1450 3375 
+z
+M 3550 4400 
+L 3550 3375 
+L 5175 3375 
+L 5175 4400 
+L 3550 4400 
+z
+M 1425 1875 
+L 3050 1875 
+L 3050 2900 
+L 1450 2900 
+L 1425 1875 
+z
+M 3550 2900 
+L 3550 1875 
+L 5175 1875 
+L 5175 2900 
+L 3550 2900 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-6237" d="M 3750 4175 
+L 5650 4175 
+L 5650 2050 
+L 1675 2050 
+L 1675 1950 
+L 1650 1950 
+Q 1600 375 750 -575 
+L 325 -200 
+Q 1125 650 1175 2000 
+L 1175 4175 
+L 3200 4175 
+L 2875 5000 
+L 3375 5175 
+Q 3625 4700 3750 4175 
+z
+M 1675 2525 
+L 5150 2525 
+L 5150 3700 
+L 1675 3700 
+L 1675 2525 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-7ea6" d="M 2125 4175 
+L 2575 4000 
+Q 1950 2675 1150 1775 
+L 2300 2100 
+L 2425 1700 
+Q 1575 1375 525 1200 
+L 375 1625 
+Q 925 2150 1425 2950 
+L 525 2800 
+L 425 3275 
+Q 1000 3975 1375 5175 
+L 1850 5025 
+Q 1500 3975 975 3300 
+L 1700 3375 
+L 2125 4175 
+z
+M 2425 975 
+L 2525 525 
+L 525 -50 
+L 325 475 
+L 2425 975 
+z
+M 3775 5150 
+L 4275 5050 
+L 3950 4125 
+L 5900 4125 
+Q 5900 1325 5750 375 
+Q 5600 -575 4850 -575 
+L 4075 -475 
+L 3950 50 
+L 4850 -50 
+Q 5075 -50 5175 150 
+Q 5275 350 5325 1225 
+Q 5375 2100 5375 3650 
+L 3700 3650 
+Q 3400 3125 3050 2775 
+L 2675 3125 
+Q 3425 3950 3775 5150 
+z
+M 3975 2675 
+Q 4350 2125 4600 1450 
+L 4125 1225 
+Q 3875 1925 3500 2475 
+L 3975 2675 
+z
+" transform="scale(0.015625)"/>
+        <path id="DroidSansFallback-675f" d="M 450 4600 
+L 2950 4600 
+L 2950 5175 
+L 3450 5175 
+L 3450 4600 
+L 5950 4600 
+L 5950 4150 
+L 3450 4150 
+L 3450 3550 
+L 5475 3550 
+L 5475 1625 
+L 3775 1625 
+Q 4700 650 6125 200 
+L 5850 -350 
+Q 4375 250 3450 1375 
+L 3450 -600 
+L 2950 -600 
+L 2950 1400 
+Q 2075 300 625 -350 
+L 275 100 
+Q 1725 700 2575 1625 
+L 925 1625 
+L 925 3550 
+L 2950 3550 
+L 2950 4150 
+L 450 4150 
+L 450 4600 
+z
+M 1425 2100 
+L 2950 2100 
+L 2950 3075 
+L 1425 3075 
+L 1425 2100 
+z
+M 3450 3075 
+L 3450 2100 
+L 4975 2100 
+L 4975 3075 
+L 3450 3075 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DroidSansFallback-7528"/>
+       <use xlink:href="#DroidSansFallback-6237" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-9884" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-7b97" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-7ea6" transform="translate(400 0)"/>
+       <use xlink:href="#DroidSansFallback-675f" transform="translate(500 0)"/>
+      </g>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_2">
+    <g id="ytick_1">
+     <g id="line2d_8">
+      <path d="M 42.765865 459.13605 
+L 534.766687 459.13605 
+" clip-path="url(#p74188dfc60)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.22; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_9">
+      <defs>
+       <path id="mf7945b7d04" d="M 0 0 
+L -3.5 0 
+" style="stroke: #000000; stroke-width: 0.8"/>
+      </defs>
+      <g>
+       <use xlink:href="#mf7945b7d04" x="42.765865" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_8">
+      <!-- 0 -->
+      <g transform="translate(29.403365 462.935269) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-30" d="M 2034 4250 
+Q 1547 4250 1301 3770 
+Q 1056 3291 1056 2328 
+Q 1056 1369 1301 889 
+Q 1547 409 2034 409 
+Q 2525 409 2770 889 
+Q 3016 1369 3016 2328 
+Q 3016 3291 2770 3770 
+Q 2525 4250 2034 4250 
+z
+M 2034 4750 
+Q 2819 4750 3233 4129 
+Q 3647 3509 3647 2328 
+Q 3647 1150 3233 529 
+Q 2819 -91 2034 -91 
+Q 1250 -91 836 529 
+Q 422 1150 422 2328 
+Q 422 3509 836 4129 
+Q 1250 4750 2034 4750 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_2">
+     <g id="line2d_10">
+      <path d="M 42.765865 379.980809 
+L 534.766687 379.980809 
+" clip-path="url(#p74188dfc60)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.22; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_11">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="42.765865" y="379.980809" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_9">
+      <!-- 20 -->
+      <g transform="translate(23.040865 383.780028) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-32" d="M 1228 531 
+L 3431 531 
+L 3431 0 
+L 469 0 
+L 469 531 
+Q 828 903 1448 1529 
+Q 2069 2156 2228 2338 
+Q 2531 2678 2651 2914 
+Q 2772 3150 2772 3378 
+Q 2772 3750 2511 3984 
+Q 2250 4219 1831 4219 
+Q 1534 4219 1204 4116 
+Q 875 4013 500 3803 
+L 500 4441 
+Q 881 4594 1212 4672 
+Q 1544 4750 1819 4750 
+Q 2544 4750 2975 4387 
+Q 3406 4025 3406 3419 
+Q 3406 3131 3298 2873 
+Q 3191 2616 2906 2266 
+Q 2828 2175 2409 1742 
+Q 1991 1309 1228 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-32"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_3">
+     <g id="line2d_12">
+      <path d="M 42.765865 300.825567 
+L 534.766687 300.825567 
+" clip-path="url(#p74188dfc60)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.22; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_13">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="42.765865" y="300.825567" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_10">
+      <!-- 40 -->
+      <g transform="translate(23.040865 304.624786) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-34" d="M 2419 4116 
+L 825 1625 
+L 2419 1625 
+L 2419 4116 
+z
+M 2253 4666 
+L 3047 4666 
+L 3047 1625 
+L 3713 1625 
+L 3713 1100 
+L 3047 1100 
+L 3047 0 
+L 2419 0 
+L 2419 1100 
+L 313 1100 
+L 313 1709 
+L 2253 4666 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-34"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_4">
+     <g id="line2d_14">
+      <path d="M 42.765865 221.670326 
+L 534.766687 221.670326 
+" clip-path="url(#p74188dfc60)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.22; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_15">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="42.765865" y="221.670326" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_11">
+      <!-- 60 -->
+      <g transform="translate(23.040865 225.469545) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-36" d="M 2113 2584 
+Q 1688 2584 1439 2293 
+Q 1191 2003 1191 1497 
+Q 1191 994 1439 701 
+Q 1688 409 2113 409 
+Q 2538 409 2786 701 
+Q 3034 994 3034 1497 
+Q 3034 2003 2786 2293 
+Q 2538 2584 2113 2584 
+z
+M 3366 4563 
+L 3366 3988 
+Q 3128 4100 2886 4159 
+Q 2644 4219 2406 4219 
+Q 1781 4219 1451 3797 
+Q 1122 3375 1075 2522 
+Q 1259 2794 1537 2939 
+Q 1816 3084 2150 3084 
+Q 2853 3084 3261 2657 
+Q 3669 2231 3669 1497 
+Q 3669 778 3244 343 
+Q 2819 -91 2113 -91 
+Q 1303 -91 875 529 
+Q 447 1150 447 2328 
+Q 447 3434 972 4092 
+Q 1497 4750 2381 4750 
+Q 2619 4750 2861 4703 
+Q 3103 4656 3366 4563 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-36"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_5">
+     <g id="line2d_16">
+      <path d="M 42.765865 142.515084 
+L 534.766687 142.515084 
+" clip-path="url(#p74188dfc60)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.22; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_17">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="42.765865" y="142.515084" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_12">
+      <!-- 80 -->
+      <g transform="translate(23.040865 146.314303) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-38" d="M 2034 2216 
+Q 1584 2216 1326 1975 
+Q 1069 1734 1069 1313 
+Q 1069 891 1326 650 
+Q 1584 409 2034 409 
+Q 2484 409 2743 651 
+Q 3003 894 3003 1313 
+Q 3003 1734 2745 1975 
+Q 2488 2216 2034 2216 
+z
+M 1403 2484 
+Q 997 2584 770 2862 
+Q 544 3141 544 3541 
+Q 544 4100 942 4425 
+Q 1341 4750 2034 4750 
+Q 2731 4750 3128 4425 
+Q 3525 4100 3525 3541 
+Q 3525 3141 3298 2862 
+Q 3072 2584 2669 2484 
+Q 3125 2378 3379 2068 
+Q 3634 1759 3634 1313 
+Q 3634 634 3220 271 
+Q 2806 -91 2034 -91 
+Q 1263 -91 848 271 
+Q 434 634 434 1313 
+Q 434 1759 690 2068 
+Q 947 2378 1403 2484 
+z
+M 1172 3481 
+Q 1172 3119 1398 2916 
+Q 1625 2713 2034 2713 
+Q 2441 2713 2670 2916 
+Q 2900 3119 2900 3481 
+Q 2900 3844 2670 4047 
+Q 2441 4250 2034 4250 
+Q 1625 4250 1398 4047 
+Q 1172 3844 1172 3481 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-38"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_6">
+     <g id="line2d_18">
+      <path d="M 42.765865 63.359843 
+L 534.766687 63.359843 
+" clip-path="url(#p74188dfc60)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.22; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_19">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="42.765865" y="63.359843" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_13">
+      <!-- 100 -->
+      <g transform="translate(16.678365 67.159062) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-31" d="M 794 531 
+L 1825 531 
+L 1825 4091 
+L 703 3866 
+L 703 4441 
+L 1819 4666 
+L 2450 4666 
+L 2450 531 
+L 3481 531 
+L 3481 0 
+L 794 0 
+L 794 531 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-31"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
+       <use xlink:href="#DejaVuSans-30" transform="translate(127.246094 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_14">
+     <!-- Pass rate / % -->
+     <g transform="translate(10.598678 283.775416) rotate(-90) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-50" d="M 1259 4147 
+L 1259 2394 
+L 2053 2394 
+Q 2494 2394 2734 2622 
+Q 2975 2850 2975 3272 
+Q 2975 3691 2734 3919 
+Q 2494 4147 2053 4147 
+L 1259 4147 
+z
+M 628 4666 
+L 2053 4666 
+Q 2838 4666 3239 4311 
+Q 3641 3956 3641 3272 
+Q 3641 2581 3239 2228 
+Q 2838 1875 2053 1875 
+L 1259 1875 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-61" d="M 2194 1759 
+Q 1497 1759 1228 1600 
+Q 959 1441 959 1056 
+Q 959 750 1161 570 
+Q 1363 391 1709 391 
+Q 2188 391 2477 730 
+Q 2766 1069 2766 1631 
+L 2766 1759 
+L 2194 1759 
+z
+M 3341 1997 
+L 3341 0 
+L 2766 0 
+L 2766 531 
+Q 2569 213 2275 61 
+Q 1981 -91 1556 -91 
+Q 1019 -91 701 211 
+Q 384 513 384 1019 
+Q 384 1609 779 1909 
+Q 1175 2209 1959 2209 
+L 2766 2209 
+L 2766 2266 
+Q 2766 2663 2505 2880 
+Q 2244 3097 1772 3097 
+Q 1472 3097 1187 3025 
+Q 903 2953 641 2809 
+L 641 3341 
+Q 956 3463 1253 3523 
+Q 1550 3584 1831 3584 
+Q 2591 3584 2966 3190 
+Q 3341 2797 3341 1997 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-73" d="M 2834 3397 
+L 2834 2853 
+Q 2591 2978 2328 3040 
+Q 2066 3103 1784 3103 
+Q 1356 3103 1142 2972 
+Q 928 2841 928 2578 
+Q 928 2378 1081 2264 
+Q 1234 2150 1697 2047 
+L 1894 2003 
+Q 2506 1872 2764 1633 
+Q 3022 1394 3022 966 
+Q 3022 478 2636 193 
+Q 2250 -91 1575 -91 
+Q 1294 -91 989 -36 
+Q 684 19 347 128 
+L 347 722 
+Q 666 556 975 473 
+Q 1284 391 1588 391 
+Q 1994 391 2212 530 
+Q 2431 669 2431 922 
+Q 2431 1156 2273 1281 
+Q 2116 1406 1581 1522 
+L 1381 1569 
+Q 847 1681 609 1914 
+Q 372 2147 372 2553 
+Q 372 3047 722 3315 
+Q 1072 3584 1716 3584 
+Q 2034 3584 2315 3537 
+Q 2597 3491 2834 3397 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-20" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-72" d="M 2631 2963 
+Q 2534 3019 2420 3045 
+Q 2306 3072 2169 3072 
+Q 1681 3072 1420 2755 
+Q 1159 2438 1159 1844 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1341 3275 1631 3429 
+Q 1922 3584 2338 3584 
+Q 2397 3584 2469 3576 
+Q 2541 3569 2628 3553 
+L 2631 2963 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-74" d="M 1172 4494 
+L 1172 3500 
+L 2356 3500 
+L 2356 3053 
+L 1172 3053 
+L 1172 1153 
+Q 1172 725 1289 603 
+Q 1406 481 1766 481 
+L 2356 481 
+L 2356 0 
+L 1766 0 
+Q 1100 0 847 248 
+Q 594 497 594 1153 
+L 594 3053 
+L 172 3053 
+L 172 3500 
+L 594 3500 
+L 594 4494 
+L 1172 4494 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-65" d="M 3597 1894 
+L 3597 1613 
+L 953 1613 
+Q 991 1019 1311 708 
+Q 1631 397 2203 397 
+Q 2534 397 2845 478 
+Q 3156 559 3463 722 
+L 3463 178 
+Q 3153 47 2828 -22 
+Q 2503 -91 2169 -91 
+Q 1331 -91 842 396 
+Q 353 884 353 1716 
+Q 353 2575 817 3079 
+Q 1281 3584 2069 3584 
+Q 2775 3584 3186 3129 
+Q 3597 2675 3597 1894 
+z
+M 3022 2063 
+Q 3016 2534 2758 2815 
+Q 2500 3097 2075 3097 
+Q 1594 3097 1305 2825 
+Q 1016 2553 972 2059 
+L 3022 2063 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-2f" d="M 1625 4666 
+L 2156 4666 
+L 531 -594 
+L 0 -594 
+L 1625 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-25" d="M 4653 2053 
+Q 4381 2053 4226 1822 
+Q 4072 1591 4072 1178 
+Q 4072 772 4226 539 
+Q 4381 306 4653 306 
+Q 4919 306 5073 539 
+Q 5228 772 5228 1178 
+Q 5228 1588 5073 1820 
+Q 4919 2053 4653 2053 
+z
+M 4653 2450 
+Q 5147 2450 5437 2106 
+Q 5728 1763 5728 1178 
+Q 5728 594 5436 251 
+Q 5144 -91 4653 -91 
+Q 4153 -91 3862 251 
+Q 3572 594 3572 1178 
+Q 3572 1766 3864 2108 
+Q 4156 2450 4653 2450 
+z
+M 1428 4353 
+Q 1159 4353 1004 4120 
+Q 850 3888 850 3481 
+Q 850 3069 1003 2837 
+Q 1156 2606 1428 2606 
+Q 1700 2606 1854 2837 
+Q 2009 3069 2009 3481 
+Q 2009 3884 1853 4118 
+Q 1697 4353 1428 4353 
+z
+M 4250 4750 
+L 4750 4750 
+L 1831 -91 
+L 1331 -91 
+L 4250 4750 
+z
+M 1428 4750 
+Q 1922 4750 2215 4408 
+Q 2509 4066 2509 3481 
+Q 2509 2891 2217 2550 
+Q 1925 2209 1428 2209 
+Q 931 2209 642 2551 
+Q 353 2894 353 3481 
+Q 353 4063 643 4406 
+Q 934 4750 1428 4750 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-50"/>
+      <use xlink:href="#DejaVuSans-61" transform="translate(55.802734 0)"/>
+      <use xlink:href="#DejaVuSans-73" transform="translate(117.082031 0)"/>
+      <use xlink:href="#DejaVuSans-73" transform="translate(169.181641 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(221.28125 0)"/>
+      <use xlink:href="#DejaVuSans-72" transform="translate(253.068359 0)"/>
+      <use xlink:href="#DejaVuSans-61" transform="translate(294.181641 0)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(355.460938 0)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(394.669922 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(456.193359 0)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(487.980469 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(521.671875 0)"/>
+      <use xlink:href="#DejaVuSans-25" transform="translate(553.458984 0)"/>
+     </g>
+    </g>
+   </g>
+   <g id="patch_17">
+    <path d="M 42.765865 459.13605 
+L 42.765865 43.571033 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_18">
+    <path d="M 42.765865 459.13605 
+L 534.766687 459.13605 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_15">
+    <!-- 94.4 -->
+    <g transform="translate(68.203828 79.901798) scale(0.08 -0.08)">
+     <defs>
+      <path id="DejaVuSans-39" d="M 703 97 
+L 703 672 
+Q 941 559 1184 500 
+Q 1428 441 1663 441 
+Q 2288 441 2617 861 
+Q 2947 1281 2994 2138 
+Q 2813 1869 2534 1725 
+Q 2256 1581 1919 1581 
+Q 1219 1581 811 2004 
+Q 403 2428 403 3163 
+Q 403 3881 828 4315 
+Q 1253 4750 1959 4750 
+Q 2769 4750 3195 4129 
+Q 3622 3509 3622 2328 
+Q 3622 1225 3098 567 
+Q 2575 -91 1691 -91 
+Q 1453 -91 1209 -44 
+Q 966 3 703 97 
+z
+M 1959 2075 
+Q 2384 2075 2632 2365 
+Q 2881 2656 2881 3163 
+Q 2881 3666 2632 3958 
+Q 2384 4250 1959 4250 
+Q 1534 4250 1286 3958 
+Q 1038 3666 1038 3163 
+Q 1038 2656 1286 2365 
+Q 1534 2075 1959 2075 
+z
+" transform="scale(0.015625)"/>
+      <path id="DejaVuSans-2e" d="M 684 794 
+L 1344 794 
+L 1344 0 
+L 684 0 
+L 684 794 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-39"/>
+     <use xlink:href="#DejaVuSans-34" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-34" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_16">
+    <!-- 48.0 -->
+    <g transform="translate(134.762381 263.541959) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-34"/>
+     <use xlink:href="#DejaVuSans-38" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_17">
+    <!-- 33.8 -->
+    <g transform="translate(201.320934 319.74218) scale(0.08 -0.08)">
+     <defs>
+      <path id="DejaVuSans-33" d="M 2597 2516 
+Q 3050 2419 3304 2112 
+Q 3559 1806 3559 1356 
+Q 3559 666 3084 287 
+Q 2609 -91 1734 -91 
+Q 1441 -91 1130 -33 
+Q 819 25 488 141 
+L 488 750 
+Q 750 597 1062 519 
+Q 1375 441 1716 441 
+Q 2309 441 2620 675 
+Q 2931 909 2931 1356 
+Q 2931 1769 2642 2001 
+Q 2353 2234 1838 2234 
+L 1294 2234 
+L 1294 2753 
+L 1863 2753 
+Q 2328 2753 2575 2939 
+Q 2822 3125 2822 3475 
+Q 2822 3834 2567 4026 
+Q 2313 4219 1838 4219 
+Q 1578 4219 1281 4162 
+Q 984 4106 628 3988 
+L 628 4550 
+Q 988 4650 1302 4700 
+Q 1616 4750 1894 4750 
+Q 2613 4750 3031 4423 
+Q 3450 4097 3450 3541 
+Q 3450 3153 3228 2886 
+Q 3006 2619 2597 2516 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-33"/>
+     <use xlink:href="#DejaVuSans-33" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-38" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_18">
+    <!-- 82.6 -->
+    <g transform="translate(267.879487 126.603391) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-38"/>
+     <use xlink:href="#DejaVuSans-32" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-36" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_19">
+    <!-- 67.8 -->
+    <g transform="translate(334.43804 185.17827) scale(0.08 -0.08)">
+     <defs>
+      <path id="DejaVuSans-37" d="M 525 4666 
+L 3525 4666 
+L 3525 4397 
+L 1831 0 
+L 1172 0 
+L 2766 4134 
+L 525 4134 
+L 525 4666 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-36"/>
+     <use xlink:href="#DejaVuSans-37" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-38" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_20">
+    <!-- 68.0 -->
+    <g transform="translate(400.996592 184.386717) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-36"/>
+     <use xlink:href="#DejaVuSans-38" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-30" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_21">
+    <!-- 88.8 -->
+    <g transform="translate(467.555145 102.065266) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-38"/>
+     <use xlink:href="#DejaVuSans-38" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-38" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_22">
+    <!-- 95.8 -->
+    <g transform="translate(92.164907 74.394243) scale(0.08 -0.08)">
+     <defs>
+      <path id="DejaVuSans-35" d="M 691 4666 
+L 3169 4666 
+L 3169 4134 
+L 1269 4134 
+L 1269 2991 
+Q 1406 3038 1543 3061 
+Q 1681 3084 1819 3084 
+Q 2600 3084 3056 2656 
+Q 3513 2228 3513 1497 
+Q 3513 744 3044 326 
+Q 2575 -91 1722 -91 
+Q 1428 -91 1123 -41 
+Q 819 9 494 109 
+L 494 744 
+Q 775 591 1075 516 
+Q 1375 441 1709 441 
+Q 2250 441 2565 725 
+Q 2881 1009 2881 1497 
+Q 2881 1984 2565 2268 
+Q 2250 2553 1709 2553 
+Q 1456 2553 1204 2497 
+Q 953 2441 691 2322 
+L 691 4666 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-39"/>
+     <use xlink:href="#DejaVuSans-35" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-38" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_23">
+    <!-- 44.7 -->
+    <g transform="translate(158.72346 276.64461) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-34"/>
+     <use xlink:href="#DejaVuSans-34" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-37" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_24">
+    <!-- 30.7 -->
+    <g transform="translate(225.282013 332.164318) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-33"/>
+     <use xlink:href="#DejaVuSans-30" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-37" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_25">
+    <!-- 76.4 -->
+    <g transform="translate(291.840566 151.328696) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-37"/>
+     <use xlink:href="#DejaVuSans-36" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-34" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_26">
+    <!-- 66.9 -->
+    <g transform="translate(358.399119 188.606215) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-36"/>
+     <use xlink:href="#DejaVuSans-36" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-39" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_27">
+    <!-- 72.3 -->
+    <g transform="translate(424.957671 167.19147) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-37"/>
+     <use xlink:href="#DejaVuSans-32" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-33" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_28">
+    <!-- 91.6 -->
+    <g transform="translate(491.516224 91.050156) scale(0.08 -0.08)">
+     <use xlink:href="#DejaVuSans-39"/>
+     <use xlink:href="#DejaVuSans-31" transform="translate(63.623047 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(127.246094 0)"/>
+     <use xlink:href="#DejaVuSans-36" transform="translate(159.033203 0)"/>
+    </g>
+   </g>
+   <g id="text_29">
+    <!-- 核心指标 -->
+    <g transform="translate(260.766276 37.571033) scale(0.14 -0.14)">
+     <defs>
+      <path id="DroidSansFallback-6838" d="M 3325 2725 
+L 4500 2875 
+L 4875 3600 
+L 5375 3400 
+Q 4575 1550 2775 800 
+L 2500 1200 
+Q 3550 1675 4200 2450 
+L 2800 2275 
+L 2700 2700 
+Q 3200 3175 3575 3875 
+L 2625 3875 
+L 2625 4350 
+L 4075 4350 
+L 3750 5025 
+L 4275 5200 
+Q 4500 4800 4625 4350 
+L 6025 4350 
+L 6025 3875 
+L 4150 3875 
+Q 3825 3200 3325 2725 
+z
+M 5450 2575 
+L 5950 2400 
+Q 5550 1550 4975 950 
+Q 5575 500 6100 -100 
+L 5725 -500 
+Q 5200 125 4600 600 
+Q 3800 -100 2675 -575 
+L 2450 -150 
+Q 4600 775 5450 2575 
+z
+M 425 4025 
+L 1225 4025 
+L 1225 5175 
+L 1700 5175 
+L 1700 4025 
+L 2450 4025 
+L 2450 3550 
+L 1700 3550 
+L 1700 3250 
+L 2525 2125 
+L 2200 1650 
+L 1700 2575 
+L 1700 -575 
+L 1225 -575 
+L 1225 2150 
+Q 950 1325 575 775 
+L 225 1125 
+Q 950 2200 1175 3550 
+L 425 3550 
+L 425 4025 
+z
+" transform="scale(0.015625)"/>
+      <path id="DroidSansFallback-5fc3" d="M 2550 5100 
+Q 3450 4575 4175 3825 
+L 3775 3350 
+Q 3025 4175 2200 4725 
+L 2550 5100 
+z
+M 2000 3650 
+L 2525 3650 
+L 2525 300 
+Q 2525 100 3350 100 
+Q 4225 100 4400 262 
+Q 4575 425 4600 1375 
+L 5125 1225 
+Q 5075 375 4962 100 
+Q 4850 -175 4600 -287 
+Q 4350 -400 3350 -400 
+Q 2500 -400 2250 -287 
+Q 2000 -175 2000 125 
+L 2000 3650 
+z
+M 5325 3375 
+Q 5825 2250 6150 900 
+L 5600 650 
+Q 5300 2050 4825 3150 
+L 5325 3375 
+z
+M 975 3275 
+L 1475 3100 
+Q 1200 1425 850 275 
+L 350 550 
+Q 775 1925 975 3275 
+z
+" transform="scale(0.015625)"/>
+      <path id="DroidSansFallback-6307" d="M 325 4125 
+L 1250 4125 
+L 1250 5175 
+L 1750 5175 
+L 1750 4125 
+L 2525 4125 
+L 2525 3650 
+L 1750 3650 
+L 1750 2350 
+L 2525 2675 
+L 2625 2225 
+L 1750 1825 
+L 1750 -25 
+Q 1725 -575 1200 -575 
+L 450 -500 
+L 350 25 
+L 1125 -75 
+Q 1250 -75 1250 225 
+L 1250 1625 
+L 425 1325 
+L 250 1850 
+L 1250 2175 
+L 1250 3650 
+L 325 3650 
+L 325 4125 
+z
+M 2850 5175 
+L 3350 5175 
+L 3350 4400 
+L 5500 4975 
+L 5825 4550 
+Q 4675 4175 3350 3950 
+L 3350 3550 
+Q 3350 3425 3412 3387 
+Q 3475 3350 3775 3350 
+L 4925 3375 
+Q 5300 3400 5400 3625 
+L 5500 4175 
+L 6000 4025 
+Q 5950 3250 5612 3062 
+Q 5275 2875 3775 2875 
+Q 3200 2875 3025 2975 
+Q 2850 3075 2850 3375 
+L 2850 5175 
+z
+M 5700 2475 
+L 5700 -575 
+L 5225 -575 
+L 5225 -225 
+L 3375 -225 
+L 3375 -575 
+L 2900 -575 
+L 2900 2475 
+L 5700 2475 
+z
+M 3375 1350 
+L 5225 1350 
+L 5225 2025 
+L 3375 2025 
+L 3375 1350 
+z
+M 3375 225 
+L 5225 225 
+L 5225 900 
+L 3375 900 
+L 3375 225 
+z
+" transform="scale(0.015625)"/>
+      <path id="DroidSansFallback-6807" d="M 425 4025 
+L 1225 4025 
+L 1225 5175 
+L 1700 5175 
+L 1700 4025 
+L 2450 4025 
+L 2450 3550 
+L 1700 3550 
+L 1700 3250 
+L 2525 2125 
+L 2200 1650 
+L 1700 2575 
+L 1700 -575 
+L 1225 -575 
+L 1225 2150 
+Q 950 1325 575 775 
+L 225 1125 
+Q 950 2200 1175 3550 
+L 425 3550 
+L 425 4025 
+z
+M 2850 4850 
+L 5550 4850 
+L 5550 4375 
+L 2850 4375 
+L 2850 4850 
+z
+M 2475 3425 
+L 5975 3425 
+L 5975 2950 
+L 4450 2950 
+L 4450 50 
+Q 4450 -300 4287 -450 
+Q 4125 -600 3550 -600 
+Q 3350 -600 3175 -525 
+L 3075 0 
+Q 3325 -100 3550 -100 
+Q 3925 -100 3925 150 
+L 3925 2950 
+L 2475 2950 
+L 2475 3425 
+z
+M 5250 2325 
+Q 5775 1400 6100 350 
+L 5625 75 
+Q 5325 1125 4800 2050 
+L 5250 2325 
+z
+M 3000 2300 
+L 3450 2075 
+Q 3025 750 2525 50 
+L 2125 400 
+Q 2650 1250 3000 2300 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DroidSansFallback-6838"/>
+     <use xlink:href="#DroidSansFallback-5fc3" transform="translate(100 0)"/>
+     <use xlink:href="#DroidSansFallback-6307" transform="translate(200 0)"/>
+     <use xlink:href="#DroidSansFallback-6807" transform="translate(300 0)"/>
+    </g>
+   </g>
+   <g id="legend_1">
+    <g id="patch_19">
+     <path d="M 51.765865 433.378238 
+L 71.765865 433.378238 
+L 71.765865 426.378238 
+L 51.765865 426.378238 
+z
+" style="fill: #2563eb"/>
+    </g>
+    <g id="text_30">
+     <!-- Full Tune -->
+     <g transform="translate(79.765865 433.378238) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-46" d="M 628 4666 
+L 3309 4666 
+L 3309 4134 
+L 1259 4134 
+L 1259 2759 
+L 3109 2759 
+L 3109 2228 
+L 1259 2228 
+L 1259 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-75" d="M 544 1381 
+L 544 3500 
+L 1119 3500 
+L 1119 1403 
+Q 1119 906 1312 657 
+Q 1506 409 1894 409 
+Q 2359 409 2629 706 
+Q 2900 1003 2900 1516 
+L 2900 3500 
+L 3475 3500 
+L 3475 0 
+L 2900 0 
+L 2900 538 
+Q 2691 219 2414 64 
+Q 2138 -91 1772 -91 
+Q 1169 -91 856 284 
+Q 544 659 544 1381 
+z
+M 1991 3584 
+L 1991 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6c" d="M 603 4863 
+L 1178 4863 
+L 1178 0 
+L 603 0 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-54" d="M -19 4666 
+L 3928 4666 
+L 3928 4134 
+L 2272 4134 
+L 2272 0 
+L 1638 0 
+L 1638 4134 
+L -19 4134 
+L -19 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6e" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-46"/>
+      <use xlink:href="#DejaVuSans-75" transform="translate(52.019531 0)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(115.398438 0)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(143.181641 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(170.964844 0)"/>
+      <use xlink:href="#DejaVuSans-54" transform="translate(202.751953 0)"/>
+      <use xlink:href="#DejaVuSans-75" transform="translate(248.710938 0)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(312.089844 0)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(375.46875 0)"/>
+     </g>
+    </g>
+    <g id="patch_20">
+     <path d="M 51.765865 448.056363 
+L 71.765865 448.056363 
+L 71.765865 441.056363 
+L 51.765865 441.056363 
+z
+" style="fill: #f59e0b"/>
+    </g>
+    <g id="text_31">
+     <!-- LoRA -->
+     <g transform="translate(79.765865 448.056363) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-4c" d="M 628 4666 
+L 1259 4666 
+L 1259 531 
+L 3531 531 
+L 3531 0 
+L 628 0 
+L 628 4666 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-6f" d="M 1959 3097 
+Q 1497 3097 1228 2736 
+Q 959 2375 959 1747 
+Q 959 1119 1226 758 
+Q 1494 397 1959 397 
+Q 2419 397 2687 759 
+Q 2956 1122 2956 1747 
+Q 2956 2369 2687 2733 
+Q 2419 3097 1959 3097 
+z
+M 1959 3584 
+Q 2709 3584 3137 3096 
+Q 3566 2609 3566 1747 
+Q 3566 888 3137 398 
+Q 2709 -91 1959 -91 
+Q 1206 -91 779 398 
+Q 353 888 353 1747 
+Q 353 2609 779 3096 
+Q 1206 3584 1959 3584 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-52" d="M 2841 2188 
+Q 3044 2119 3236 1894 
+Q 3428 1669 3622 1275 
+L 4263 0 
+L 3584 0 
+L 2988 1197 
+Q 2756 1666 2539 1819 
+Q 2322 1972 1947 1972 
+L 1259 1972 
+L 1259 0 
+L 628 0 
+L 628 4666 
+L 2053 4666 
+Q 2853 4666 3247 4331 
+Q 3641 3997 3641 3322 
+Q 3641 2881 3436 2590 
+Q 3231 2300 2841 2188 
+z
+M 1259 4147 
+L 1259 2491 
+L 2053 2491 
+Q 2509 2491 2742 2702 
+Q 2975 2913 2975 3322 
+Q 2975 3731 2742 3939 
+Q 2509 4147 2053 4147 
+L 1259 4147 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-41" d="M 2188 4044 
+L 1331 1722 
+L 3047 1722 
+L 2188 4044 
+z
+M 1831 4666 
+L 2547 4666 
+L 4325 0 
+L 3669 0 
+L 3244 1197 
+L 1141 1197 
+L 716 0 
+L 50 0 
+L 1831 4666 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-4c"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(53.962891 0)"/>
+      <use xlink:href="#DejaVuSans-52" transform="translate(115.144531 0)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(180.626953 0)"/>
+     </g>
+    </g>
+   </g>
+  </g>
+  <g id="axes_2">
+   <g id="patch_21">
+    <path d="M 611.558687 459.13605 
+L 950.254906 459.13605 
+L 950.254906 43.571033 
+L 611.558687 43.571033 
+z
+" style="fill: #ffffff"/>
+   </g>
+   <g id="patch_22">
+    <path d="M 753.252728 62.460351 
+L 712.799842 62.460351 
+L 712.799842 106.905808 
+L 753.252728 106.905808 
+z
+" clip-path="url(#p70340664cd)" style="fill: #dc2626"/>
+   </g>
+   <g id="patch_23">
+    <path d="M 753.252728 118.017172 
+L 849.49145 118.017172 
+L 849.49145 162.462628 
+L 753.252728 162.462628 
+z
+" clip-path="url(#p70340664cd)" style="fill: #16a34a"/>
+   </g>
+   <g id="patch_24">
+    <path d="M 753.252728 173.573993 
+L 844.493095 173.573993 
+L 844.493095 218.019449 
+L 753.252728 218.019449 
+z
+" clip-path="url(#p70340664cd)" style="fill: #16a34a"/>
+   </g>
+   <g id="patch_25">
+    <path d="M 753.252728 229.130813 
+L 934.859623 229.130813 
+L 934.859623 273.57627 
+L 753.252728 273.57627 
+z
+" clip-path="url(#p70340664cd)" style="fill: #16a34a"/>
+   </g>
+   <g id="patch_26">
+    <path d="M 753.252728 284.687634 
+L 778.430922 284.687634 
+L 778.430922 329.13309 
+L 753.252728 329.13309 
+z
+" clip-path="url(#p70340664cd)" style="fill: #16a34a"/>
+   </g>
+   <g id="patch_27">
+    <path d="M 753.252728 340.244454 
+L 626.95397 340.244454 
+L 626.95397 384.689911 
+L 753.252728 384.689911 
+z
+" clip-path="url(#p70340664cd)" style="fill: #dc2626"/>
+   </g>
+   <g id="patch_28">
+    <path d="M 753.252728 395.801275 
+L 672.346956 395.801275 
+L 672.346956 440.246731 
+L 753.252728 440.246731 
+z
+" clip-path="url(#p70340664cd)" style="fill: #dc2626"/>
+   </g>
+   <g id="matplotlib.axis_3">
+    <g id="xtick_8">
+     <g id="line2d_20">
+      <path d="M 636.973982 459.13605 
+L 636.973982 43.571033 
+" clip-path="url(#p70340664cd)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.2; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_21">
+      <g>
+       <use xlink:href="#mfaa676100c" x="636.973982" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_32">
+      <!-- -4 -->
+      <g transform="translate(631.988826 473.734488) scale(0.1 -0.1)">
+       <defs>
+        <path id="DejaVuSans-2d" d="M 313 2009 
+L 1997 2009 
+L 1997 1497 
+L 313 1497 
+L 313 2009 
+z
+" transform="scale(0.015625)"/>
+       </defs>
+       <use xlink:href="#DejaVuSans-2d"/>
+       <use xlink:href="#DejaVuSans-34" transform="translate(36.083984 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_9">
+     <g id="line2d_22">
+      <path d="M 695.113355 459.13605 
+L 695.113355 43.571033 
+" clip-path="url(#p70340664cd)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.2; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_23">
+      <g>
+       <use xlink:href="#mfaa676100c" x="695.113355" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_33">
+      <!-- -2 -->
+      <g transform="translate(690.128199 473.734488) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-2d"/>
+       <use xlink:href="#DejaVuSans-32" transform="translate(36.083984 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_10">
+     <g id="line2d_24">
+      <path d="M 753.252728 459.13605 
+L 753.252728 43.571033 
+" clip-path="url(#p70340664cd)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.2; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_25">
+      <g>
+       <use xlink:href="#mfaa676100c" x="753.252728" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_34">
+      <!-- 0 -->
+      <g transform="translate(750.071478 473.734488) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-30"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_11">
+     <g id="line2d_26">
+      <path d="M 811.392101 459.13605 
+L 811.392101 43.571033 
+" clip-path="url(#p70340664cd)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.2; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_27">
+      <g>
+       <use xlink:href="#mfaa676100c" x="811.392101" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_35">
+      <!-- 2 -->
+      <g transform="translate(808.210851 473.734488) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-32"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_12">
+     <g id="line2d_28">
+      <path d="M 869.531474 459.13605 
+L 869.531474 43.571033 
+" clip-path="url(#p70340664cd)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.2; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_29">
+      <g>
+       <use xlink:href="#mfaa676100c" x="869.531474" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_36">
+      <!-- 4 -->
+      <g transform="translate(866.350224 473.734488) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-34"/>
+      </g>
+     </g>
+    </g>
+    <g id="xtick_13">
+     <g id="line2d_30">
+      <path d="M 927.670847 459.13605 
+L 927.670847 43.571033 
+" clip-path="url(#p70340664cd)" style="fill: none; stroke: #b0b0b0; stroke-opacity: 0.2; stroke-width: 0.8; stroke-linecap: square"/>
+     </g>
+     <g id="line2d_31">
+      <g>
+       <use xlink:href="#mfaa676100c" x="927.670847" y="459.13605" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_37">
+      <!-- 6 -->
+      <g transform="translate(924.489597 473.734488) scale(0.1 -0.1)">
+       <use xlink:href="#DejaVuSans-36"/>
+      </g>
+     </g>
+    </g>
+    <g id="text_38">
+     <!-- Full Tune - LoRA / percentage points -->
+     <g transform="translate(691.35289 487.412613) scale(0.1 -0.1)">
+      <defs>
+       <path id="DejaVuSans-70" d="M 1159 525 
+L 1159 -1331 
+L 581 -1331 
+L 581 3500 
+L 1159 3500 
+L 1159 2969 
+Q 1341 3281 1617 3432 
+Q 1894 3584 2278 3584 
+Q 2916 3584 3314 3078 
+Q 3713 2572 3713 1747 
+Q 3713 922 3314 415 
+Q 2916 -91 2278 -91 
+Q 1894 -91 1617 61 
+Q 1341 213 1159 525 
+z
+M 3116 1747 
+Q 3116 2381 2855 2742 
+Q 2594 3103 2138 3103 
+Q 1681 3103 1420 2742 
+Q 1159 2381 1159 1747 
+Q 1159 1113 1420 752 
+Q 1681 391 2138 391 
+Q 2594 391 2855 752 
+Q 3116 1113 3116 1747 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-63" d="M 3122 3366 
+L 3122 2828 
+Q 2878 2963 2633 3030 
+Q 2388 3097 2138 3097 
+Q 1578 3097 1268 2742 
+Q 959 2388 959 1747 
+Q 959 1106 1268 751 
+Q 1578 397 2138 397 
+Q 2388 397 2633 464 
+Q 2878 531 3122 666 
+L 3122 134 
+Q 2881 22 2623 -34 
+Q 2366 -91 2075 -91 
+Q 1284 -91 818 406 
+Q 353 903 353 1747 
+Q 353 2603 823 3093 
+Q 1294 3584 2113 3584 
+Q 2378 3584 2631 3529 
+Q 2884 3475 3122 3366 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-67" d="M 2906 1791 
+Q 2906 2416 2648 2759 
+Q 2391 3103 1925 3103 
+Q 1463 3103 1205 2759 
+Q 947 2416 947 1791 
+Q 947 1169 1205 825 
+Q 1463 481 1925 481 
+Q 2391 481 2648 825 
+Q 2906 1169 2906 1791 
+z
+M 3481 434 
+Q 3481 -459 3084 -895 
+Q 2688 -1331 1869 -1331 
+Q 1566 -1331 1297 -1286 
+Q 1028 -1241 775 -1147 
+L 775 -588 
+Q 1028 -725 1275 -790 
+Q 1522 -856 1778 -856 
+Q 2344 -856 2625 -561 
+Q 2906 -266 2906 331 
+L 2906 616 
+Q 2728 306 2450 153 
+Q 2172 0 1784 0 
+Q 1141 0 747 490 
+Q 353 981 353 1791 
+Q 353 2603 747 3093 
+Q 1141 3584 1784 3584 
+Q 2172 3584 2450 3431 
+Q 2728 3278 2906 2969 
+L 2906 3500 
+L 3481 3500 
+L 3481 434 
+z
+" transform="scale(0.015625)"/>
+       <path id="DejaVuSans-69" d="M 603 3500 
+L 1178 3500 
+L 1178 0 
+L 603 0 
+L 603 3500 
+z
+M 603 4863 
+L 1178 4863 
+L 1178 4134 
+L 603 4134 
+L 603 4863 
+z
+" transform="scale(0.015625)"/>
+      </defs>
+      <use xlink:href="#DejaVuSans-46"/>
+      <use xlink:href="#DejaVuSans-75" transform="translate(52.019531 0)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(115.398438 0)"/>
+      <use xlink:href="#DejaVuSans-6c" transform="translate(143.181641 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(170.964844 0)"/>
+      <use xlink:href="#DejaVuSans-54" transform="translate(202.751953 0)"/>
+      <use xlink:href="#DejaVuSans-75" transform="translate(248.710938 0)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(312.089844 0)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(375.46875 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(436.992188 0)"/>
+      <use xlink:href="#DejaVuSans-2d" transform="translate(468.779297 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(504.863281 0)"/>
+      <use xlink:href="#DejaVuSans-4c" transform="translate(536.650391 0)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(590.613281 0)"/>
+      <use xlink:href="#DejaVuSans-52" transform="translate(651.794922 0)"/>
+      <use xlink:href="#DejaVuSans-41" transform="translate(717.277344 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(785.685547 0)"/>
+      <use xlink:href="#DejaVuSans-2f" transform="translate(817.472656 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(851.164062 0)"/>
+      <use xlink:href="#DejaVuSans-70" transform="translate(882.951172 0)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(946.427734 0)"/>
+      <use xlink:href="#DejaVuSans-72" transform="translate(1007.951172 0)"/>
+      <use xlink:href="#DejaVuSans-63" transform="translate(1046.814453 0)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(1101.794922 0)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(1163.318359 0)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(1226.697266 0)"/>
+      <use xlink:href="#DejaVuSans-61" transform="translate(1265.90625 0)"/>
+      <use xlink:href="#DejaVuSans-67" transform="translate(1327.185547 0)"/>
+      <use xlink:href="#DejaVuSans-65" transform="translate(1390.662109 0)"/>
+      <use xlink:href="#DejaVuSans-20" transform="translate(1452.185547 0)"/>
+      <use xlink:href="#DejaVuSans-70" transform="translate(1483.972656 0)"/>
+      <use xlink:href="#DejaVuSans-6f" transform="translate(1547.449219 0)"/>
+      <use xlink:href="#DejaVuSans-69" transform="translate(1608.630859 0)"/>
+      <use xlink:href="#DejaVuSans-6e" transform="translate(1636.414062 0)"/>
+      <use xlink:href="#DejaVuSans-74" transform="translate(1699.792969 0)"/>
+      <use xlink:href="#DejaVuSans-73" transform="translate(1739.001953 0)"/>
+     </g>
+    </g>
+   </g>
+   <g id="matplotlib.axis_4">
+    <g id="ytick_7">
+     <g id="line2d_32">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="611.558687" y="84.68308" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_39">
+      <!-- 硬通过 -->
+      <g transform="translate(574.558687 88.706517) scale(0.1 -0.1)">
+       <use xlink:href="#DroidSansFallback-786c"/>
+       <use xlink:href="#DroidSansFallback-901a" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-8fc7" transform="translate(200 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_8">
+     <g id="line2d_33">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="611.558687" y="140.2399" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_40">
+      <!-- 规划软通过 -->
+      <g transform="translate(554.558687 144.321932) scale(0.1 -0.1)">
+       <use xlink:href="#DroidSansFallback-89c4"/>
+       <use xlink:href="#DroidSansFallback-5212" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-8f6f" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-901a" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-8fc7" transform="translate(400 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_9">
+     <g id="line2d_34">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="611.558687" y="195.796721" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_41">
+      <!-- 重算软通过 -->
+      <g transform="translate(554.558687 199.878752) scale(0.1 -0.1)">
+       <use xlink:href="#DroidSansFallback-91cd"/>
+       <use xlink:href="#DroidSansFallback-7b97" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-8f6f" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-901a" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-8fc7" transform="translate(400 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_10">
+     <g id="line2d_35">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="611.558687" y="251.353541" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_42">
+      <!-- 餐饮多样性 -->
+      <g transform="translate(554.558687 255.435573) scale(0.1 -0.1)">
+       <use xlink:href="#DroidSansFallback-9910"/>
+       <use xlink:href="#DroidSansFallback-996e" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-591a" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-6837" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-6027" transform="translate(400 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_11">
+     <g id="line2d_36">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="611.558687" y="306.910362" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_43">
+      <!-- 预算偏好 -->
+      <g transform="translate(564.558687 310.992393) scale(0.1 -0.1)">
+       <use xlink:href="#DroidSansFallback-9884"/>
+       <use xlink:href="#DroidSansFallback-7b97" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-504f" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-597d" transform="translate(300 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_12">
+     <g id="line2d_37">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="611.558687" y="362.467182" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_44">
+      <!-- 预算合计一致 -->
+      <g transform="translate(544.558687 366.568745) scale(0.1 -0.1)">
+       <use xlink:href="#DroidSansFallback-9884"/>
+       <use xlink:href="#DroidSansFallback-7b97" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-5408" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-8ba1" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-4e00" transform="translate(400 0)"/>
+       <use xlink:href="#DroidSansFallback-81f4" transform="translate(500 0)"/>
+      </g>
+     </g>
+    </g>
+    <g id="ytick_13">
+     <g id="line2d_38">
+      <g>
+       <use xlink:href="#mf7945b7d04" x="611.558687" y="418.024003" style="stroke: #000000; stroke-width: 0.8"/>
+      </g>
+     </g>
+     <g id="text_45">
+      <!-- 用户预算约束 -->
+      <g transform="translate(544.558687 422.106034) scale(0.1 -0.1)">
+       <use xlink:href="#DroidSansFallback-7528"/>
+       <use xlink:href="#DroidSansFallback-6237" transform="translate(100 0)"/>
+       <use xlink:href="#DroidSansFallback-9884" transform="translate(200 0)"/>
+       <use xlink:href="#DroidSansFallback-7b97" transform="translate(300 0)"/>
+       <use xlink:href="#DroidSansFallback-7ea6" transform="translate(400 0)"/>
+       <use xlink:href="#DroidSansFallback-675f" transform="translate(500 0)"/>
+      </g>
+     </g>
+    </g>
+   </g>
+   <g id="line2d_39">
+    <path d="M 753.252728 459.13605 
+L 753.252728 43.571033 
+" clip-path="url(#p70340664cd)" style="fill: none; stroke: #111827; stroke-linecap: square"/>
+   </g>
+   <g id="patch_29">
+    <path d="M 611.558687 459.13605 
+L 611.558687 43.571033 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="patch_30">
+    <path d="M 611.558687 459.13605 
+L 950.254906 459.13605 
+" style="fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square"/>
+   </g>
+   <g id="text_46">
+    <!-- -1.4pp -->
+    <g style="fill: #111827" transform="translate(676.231576 87.442455) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-2d"/>
+     <use xlink:href="#DejaVuSans-31" transform="translate(36.083984 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(99.707031 0)"/>
+     <use xlink:href="#DejaVuSans-34" transform="translate(131.494141 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(195.117188 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(258.59375 0)"/>
+    </g>
+   </g>
+   <g id="text_47">
+    <!-- +3.3pp -->
+    <g style="fill: #111827" transform="translate(853.851903 142.999275) scale(0.1 -0.1)">
+     <defs>
+      <path id="DejaVuSans-2b" d="M 2944 4013 
+L 2944 2272 
+L 4684 2272 
+L 4684 1741 
+L 2944 1741 
+L 2944 0 
+L 2419 0 
+L 2419 1741 
+L 678 1741 
+L 678 2272 
+L 2419 2272 
+L 2419 4013 
+L 2944 4013 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DejaVuSans-2b"/>
+     <use xlink:href="#DejaVuSans-33" transform="translate(83.789062 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(147.412109 0)"/>
+     <use xlink:href="#DejaVuSans-33" transform="translate(179.199219 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(242.822266 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(306.298828 0)"/>
+    </g>
+   </g>
+   <g id="text_48">
+    <!-- +3.1pp -->
+    <g style="fill: #111827" transform="translate(848.853548 198.556096) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-2b"/>
+     <use xlink:href="#DejaVuSans-33" transform="translate(83.789062 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(147.412109 0)"/>
+     <use xlink:href="#DejaVuSans-31" transform="translate(179.199219 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(242.822266 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(306.298828 0)"/>
+    </g>
+   </g>
+   <g id="text_49">
+    <!-- +6.2pp -->
+    <g style="fill: #111827" transform="translate(939.220076 254.112916) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-2b"/>
+     <use xlink:href="#DejaVuSans-36" transform="translate(83.789062 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(147.412109 0)"/>
+     <use xlink:href="#DejaVuSans-32" transform="translate(179.199219 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(242.822266 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(306.298828 0)"/>
+    </g>
+   </g>
+   <g id="text_50">
+    <!-- +0.9pp -->
+    <g style="fill: #111827" transform="translate(782.791375 309.669737) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-2b"/>
+     <use xlink:href="#DejaVuSans-30" transform="translate(83.789062 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(147.412109 0)"/>
+     <use xlink:href="#DejaVuSans-39" transform="translate(179.199219 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(242.822266 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(306.298828 0)"/>
+    </g>
+   </g>
+   <g id="text_51">
+    <!-- -4.3pp -->
+    <g style="fill: #111827" transform="translate(590.385705 365.226557) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-2d"/>
+     <use xlink:href="#DejaVuSans-34" transform="translate(36.083984 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(99.707031 0)"/>
+     <use xlink:href="#DejaVuSans-33" transform="translate(131.494141 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(195.117188 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(258.59375 0)"/>
+    </g>
+   </g>
+   <g id="text_52">
+    <!-- -2.8pp -->
+    <g style="fill: #111827" transform="translate(635.77869 420.783378) scale(0.1 -0.1)">
+     <use xlink:href="#DejaVuSans-2d"/>
+     <use xlink:href="#DejaVuSans-32" transform="translate(36.083984 0)"/>
+     <use xlink:href="#DejaVuSans-2e" transform="translate(99.707031 0)"/>
+     <use xlink:href="#DejaVuSans-38" transform="translate(131.494141 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(195.117188 0)"/>
+     <use xlink:href="#DejaVuSans-70" transform="translate(258.59375 0)"/>
+    </g>
+   </g>
+   <g id="text_53">
+    <!-- 差值 -->
+    <g transform="translate(766.906797 37.571033) scale(0.14 -0.14)">
+     <defs>
+      <path id="DroidSansFallback-5dee" d="M 2100 5250 
+L 2575 4550 
+L 3800 4550 
+L 4225 5250 
+L 4800 5075 
+L 4400 4550 
+L 5750 4550 
+L 5750 4075 
+L 3475 4075 
+L 3350 3525 
+L 5550 3525 
+L 5550 3075 
+L 3200 3075 
+L 2975 2525 
+L 5950 2525 
+L 5950 2050 
+L 2725 2050 
+L 2300 1425 
+L 5600 1425 
+L 5600 950 
+L 3700 950 
+L 3700 100 
+L 5925 100 
+L 5925 -375 
+L 975 -375 
+L 975 100 
+L 3200 100 
+L 3200 950 
+L 1850 950 
+Q 1250 425 600 175 
+L 325 625 
+Q 1375 1050 2100 2050 
+L 475 2050 
+L 475 2525 
+L 2400 2525 
+L 2650 3075 
+L 800 3075 
+L 800 3525 
+L 2800 3525 
+L 2925 4075 
+L 650 4075 
+L 650 4550 
+L 1950 4550 
+L 1625 5025 
+L 2100 5250 
+z
+" transform="scale(0.015625)"/>
+      <path id="DroidSansFallback-503c" d="M 1575 5175 
+L 2075 5025 
+L 1625 3875 
+L 1625 -575 
+L 1125 -575 
+L 1125 2925 
+L 500 2050 
+L 250 2550 
+Q 1175 3800 1575 5175 
+z
+M 2250 4575 
+L 3800 4575 
+L 3800 5150 
+L 4300 5150 
+L 4300 4575 
+L 5875 4575 
+L 5875 4125 
+L 4300 4125 
+L 4300 3550 
+L 5575 3550 
+L 5575 75 
+L 6050 75 
+L 6050 -350 
+L 1925 -350 
+L 1925 75 
+L 2625 75 
+L 2625 3550 
+L 3800 3550 
+L 3800 4125 
+L 2250 4125 
+L 2250 4575 
+z
+M 3125 2650 
+L 5075 2650 
+L 5075 3125 
+L 3125 3125 
+L 3125 2650 
+z
+M 3125 1775 
+L 5075 1775 
+L 5075 2275 
+L 3125 2275 
+L 3125 1775 
+z
+M 3125 925 
+L 5075 925 
+L 5075 1400 
+L 3125 1400 
+L 3125 925 
+z
+M 3125 75 
+L 5075 75 
+L 5075 550 
+L 3125 550 
+L 3125 75 
+z
+" transform="scale(0.015625)"/>
+     </defs>
+     <use xlink:href="#DroidSansFallback-5dee"/>
+     <use xlink:href="#DroidSansFallback-503c" transform="translate(100 0)"/>
+    </g>
+   </g>
+  </g>
+  <g id="text_54">
+   <!-- 全参微调有收益,但不适合作为这条项目主线 -->
+   <g transform="translate(309.6 17.765865) scale(0.18 -0.18)">
+    <defs>
+     <path id="DroidSansFallback-5168" d="M 5125 2875 
+L 5125 2625 
+L 3475 2625 
+L 3475 1625 
+L 5250 1625 
+L 5250 1150 
+L 3475 1150 
+L 3475 150 
+L 5750 150 
+L 5750 -325 
+L 625 -325 
+L 625 150 
+L 2950 150 
+L 2950 1150 
+L 1175 1150 
+L 1175 1625 
+L 2950 1625 
+L 2950 2625 
+L 1225 2625 
+L 1225 2850 
+L 525 2450 
+L 275 2950 
+Q 2250 4025 3100 5225 
+L 3625 5075 
+L 3500 4900 
+Q 4750 3650 6150 2975 
+L 5850 2450 
+L 5125 2875 
+z
+M 3200 4525 
+Q 2475 3725 1575 3100 
+L 4825 3100 
+Q 3900 3775 3200 4525 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-53c2" d="M 2625 5200 
+L 3075 5075 
+Q 2575 4425 2050 4075 
+L 4425 4275 
+L 3950 4675 
+L 4350 4950 
+L 5575 3900 
+L 5200 3500 
+L 4825 3900 
+Q 3050 3675 1075 3600 
+L 950 4025 
+Q 1925 4425 2625 5200 
+z
+M 350 3250 
+L 2400 3250 
+L 2650 3625 
+L 3125 3450 
+L 3000 3250 
+L 6050 3250 
+L 6050 2775 
+L 4425 2775 
+Q 5275 2175 6125 1850 
+L 5825 1350 
+Q 4800 1825 3775 2775 
+L 2675 2775 
+Q 1975 1925 525 1550 
+L 300 2000 
+Q 1450 2275 1975 2775 
+L 350 2775 
+L 350 3250 
+z
+M 3750 2525 
+L 4075 2150 
+Q 3075 1525 1475 1200 
+L 1225 1600 
+Q 2875 1975 3750 2525 
+z
+M 4425 1825 
+L 4750 1450 
+Q 3450 675 1375 275 
+L 1100 700 
+Q 3225 1150 4425 1825 
+z
+M 5175 1200 
+L 5475 850 
+Q 3925 -275 1050 -600 
+L 775 -175 
+Q 3775 225 5175 1200 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-5fae" d="M 1375 5175 
+L 1800 4950 
+Q 1350 3950 625 3325 
+L 325 3725 
+Q 1025 4375 1375 5175 
+z
+M 1450 3500 
+L 1875 3275 
+L 1425 2500 
+L 1425 -575 
+L 950 -575 
+L 950 1950 
+L 575 1600 
+L 275 2000 
+Q 1075 2700 1450 3500 
+z
+M 4500 5150 
+L 4950 5000 
+L 4775 4125 
+L 6075 4125 
+L 6075 3650 
+L 5800 3650 
+L 5600 2075 
+L 5325 1075 
+Q 5625 425 6100 -100 
+L 5750 -550 
+Q 5375 -100 5075 525 
+Q 4750 -125 4275 -550 
+L 3950 -125 
+Q 4475 325 4800 1100 
+L 4325 2600 
+L 4175 2225 
+L 3800 2500 
+Q 4300 3750 4500 5150 
+z
+M 4600 3400 
+Q 4775 2450 5025 1750 
+Q 5250 2525 5325 3650 
+L 4650 3650 
+L 4600 3400 
+z
+M 1900 4725 
+L 2350 4725 
+L 2350 3550 
+L 2675 3550 
+L 2675 5150 
+L 3175 5150 
+L 3175 3550 
+L 3475 3550 
+L 3475 4725 
+L 3925 4725 
+L 3925 3100 
+L 1900 3100 
+L 1900 4725 
+z
+M 1775 2775 
+L 3750 2775 
+L 3750 2325 
+L 1775 2325 
+L 1775 2775 
+z
+M 3575 1975 
+L 3575 375 
+L 3975 775 
+L 4300 475 
+Q 4000 100 3475 -275 
+L 3125 50 
+L 3125 1525 
+L 2625 1525 
+Q 2625 400 1975 -475 
+L 1575 -175 
+Q 2125 475 2125 1325 
+L 2125 1975 
+L 3575 1975 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-8c03" d="M 1275 5175 
+Q 1700 4675 1975 4125 
+L 1500 3850 
+Q 1250 4400 825 4900 
+L 1275 5175 
+z
+M 325 3325 
+L 1675 3325 
+L 1675 425 
+L 2200 1000 
+L 2525 700 
+Q 2175 225 1575 -250 
+L 1200 75 
+L 1200 2875 
+L 325 2875 
+L 325 3325 
+z
+M 5875 4975 
+L 5875 100 
+Q 5875 -550 5325 -550 
+L 4625 -500 
+L 4525 -50 
+L 5225 -100 
+Q 5400 -100 5400 225 
+L 5400 4525 
+L 3225 4525 
+L 3225 2450 
+Q 3225 725 2850 -575 
+L 2425 -325 
+Q 2775 975 2775 2600 
+L 2775 4975 
+L 5875 4975 
+z
+M 3475 3750 
+L 4050 3750 
+L 4050 4275 
+L 4525 4275 
+L 4525 3750 
+L 5100 3750 
+L 5100 3325 
+L 4525 3325 
+L 4525 2800 
+L 5200 2800 
+L 5200 2375 
+L 3425 2375 
+L 3425 2800 
+L 4050 2800 
+L 4050 3325 
+L 3475 3325 
+L 3475 3750 
+z
+M 3525 1975 
+L 5075 1975 
+L 5075 450 
+L 3525 450 
+L 3525 1975 
+z
+M 3975 875 
+L 4625 875 
+L 4625 1550 
+L 3975 1550 
+L 3975 875 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-6709" d="M 475 4500 
+L 2375 4500 
+L 2700 5200 
+L 3175 5100 
+L 2950 4500 
+L 5950 4500 
+L 5950 4025 
+L 2700 4025 
+L 2225 3275 
+L 5450 3275 
+L 5450 75 
+Q 5450 -550 4750 -550 
+L 3850 -500 
+L 3725 0 
+L 4725 -50 
+Q 4950 -50 4950 200 
+L 4950 725 
+L 2150 725 
+L 2150 -600 
+L 1650 -600 
+L 1650 2525 
+L 750 1700 
+L 375 2050 
+Q 1475 2950 2125 4025 
+L 475 4025 
+L 475 4500 
+z
+M 2150 2200 
+L 4950 2200 
+L 4950 2800 
+L 2150 2800 
+L 2150 2200 
+z
+M 2150 1175 
+L 4950 1175 
+L 4950 1750 
+L 2150 1750 
+L 2150 1175 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-6536" d="M 3625 5175 
+L 4125 5025 
+L 3925 4125 
+L 6050 4125 
+L 6050 3650 
+L 5650 3650 
+Q 5475 1975 4850 950 
+Q 5375 350 6125 -125 
+L 5750 -600 
+Q 5075 -125 4550 525 
+Q 4000 -150 3175 -600 
+L 2825 -175 
+Q 3675 275 4200 975 
+Q 3750 1600 3375 2450 
+L 3125 1950 
+L 2725 2250 
+Q 3325 3475 3625 5175 
+z
+M 3625 3125 
+Q 4000 2100 4500 1400 
+Q 4975 2300 5125 3650 
+L 3800 3650 
+L 3625 3125 
+z
+M 650 4900 
+L 1150 4900 
+L 1150 1150 
+L 2100 1425 
+L 2100 5175 
+L 2575 5175 
+L 2575 -575 
+L 2100 -575 
+L 2100 950 
+L 875 600 
+L 650 825 
+L 650 4900 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-76ca" d="M 5475 1800 
+L 5475 25 
+L 6075 25 
+L 6075 -450 
+L 325 -450 
+L 325 25 
+L 925 25 
+L 925 1800 
+L 5475 1800 
+z
+M 1425 25 
+L 2300 25 
+L 2300 1350 
+L 1425 1350 
+L 1425 25 
+z
+M 2775 25 
+L 3625 25 
+L 3625 1350 
+L 2775 1350 
+L 2775 25 
+z
+M 4100 25 
+L 4975 25 
+L 4975 1350 
+L 4100 1350 
+L 4100 25 
+z
+M 1725 5250 
+Q 2200 4850 2500 4425 
+L 2025 4150 
+Q 1750 4575 1250 4950 
+L 1725 5250 
+z
+M 4475 5200 
+L 5050 5025 
+Q 4750 4450 4400 4025 
+L 5750 4025 
+L 5750 3550 
+L 675 3550 
+L 675 4025 
+L 3825 4025 
+L 4475 5200 
+z
+M 2125 3350 
+L 2475 2950 
+Q 1875 2375 575 1925 
+L 325 2400 
+Q 1400 2725 2125 3350 
+z
+M 4175 3350 
+Q 5125 3050 6075 2450 
+L 5775 1950 
+Q 4825 2625 3875 2950 
+L 4175 3350 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-ff0c" d="M 3650 750 
+L 3700 675 
+L 3150 -825 
+L 2700 -825 
+L 3025 750 
+L 3650 750 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-4f46" d="M 1500 5175 
+L 2000 5025 
+L 1475 3650 
+L 1475 -575 
+L 975 -575 
+L 975 2700 
+L 500 2050 
+L 250 2550 
+Q 1100 3800 1500 5175 
+z
+M 2400 4900 
+L 5600 4900 
+L 5600 1000 
+L 2400 1000 
+L 2400 4900 
+z
+M 2900 3175 
+L 5100 3175 
+L 5100 4425 
+L 2900 4425 
+L 2900 3175 
+z
+M 2900 1475 
+L 5100 1475 
+L 5100 2700 
+L 2900 2700 
+L 2900 1475 
+z
+M 1800 200 
+L 6175 200 
+L 6175 -275 
+L 1800 -275 
+L 1800 200 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-4e0d" d="M 475 4875 
+L 5900 4875 
+L 5900 4375 
+L 3775 4375 
+L 3350 3675 
+L 3350 -575 
+L 2800 -575 
+L 2800 2950 
+Q 1850 1750 650 900 
+L 275 1275 
+Q 1950 2425 3200 4375 
+L 475 4375 
+L 475 4875 
+z
+M 4075 3300 
+Q 5125 2450 6125 1275 
+L 5725 875 
+Q 4850 1950 3675 3025 
+L 4075 3300 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-9002" d="M 5350 5100 
+L 5675 4700 
+L 4275 4500 
+L 4275 3675 
+L 5925 3675 
+L 5925 3225 
+L 4275 3225 
+L 4275 2500 
+L 5500 2500 
+L 5500 625 
+L 2400 625 
+L 2400 2500 
+L 3750 2500 
+L 3750 3225 
+L 2100 3225 
+L 2100 3675 
+L 3750 3675 
+L 3750 4425 
+L 2425 4300 
+L 2200 4750 
+L 5350 5100 
+z
+M 2925 1075 
+L 4975 1075 
+L 4975 2050 
+L 2925 2050 
+L 2925 1075 
+z
+M 750 5025 
+Q 1250 4700 1650 4250 
+L 1300 3825 
+Q 875 4325 400 4650 
+L 750 5025 
+z
+M 325 2950 
+L 1575 2950 
+L 1575 550 
+Q 1950 275 2500 200 
+Q 3050 125 6100 125 
+L 5850 -425 
+L 3850 -425 
+Q 2100 -425 1375 200 
+L 650 -525 
+L 300 0 
+L 1075 475 
+L 1075 2475 
+L 325 2475 
+L 325 2950 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-4f5c" d="M 1575 5175 
+L 2075 5025 
+L 1625 3875 
+L 1625 -575 
+L 1125 -575 
+L 1125 2925 
+L 500 2050 
+L 250 2550 
+Q 1175 3800 1575 5175 
+z
+M 2900 5175 
+L 3425 5050 
+L 3175 4300 
+L 6075 4300 
+L 6075 3825 
+L 3875 3825 
+L 3875 2850 
+L 5675 2850 
+L 5675 2400 
+L 3875 2400 
+L 3875 1425 
+L 5750 1425 
+L 5750 950 
+L 3875 950 
+L 3875 -575 
+L 3375 -575 
+L 3375 3825 
+L 2975 3825 
+Q 2650 3050 2100 2425 
+L 1750 2825 
+Q 2500 3775 2900 5175 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-4e3a" d="M 850 3475 
+L 2650 3475 
+L 2700 5175 
+L 3225 5175 
+L 3200 3475 
+L 5700 3475 
+Q 5700 625 5500 50 
+Q 5300 -525 4500 -525 
+L 3850 -450 
+L 3725 50 
+L 4500 -25 
+Q 4825 -25 4950 100 
+Q 5075 225 5137 937 
+Q 5200 1650 5200 3000 
+L 3150 3000 
+Q 2950 550 825 -575 
+L 550 -100 
+Q 2400 850 2625 3000 
+L 850 3000 
+L 850 3475 
+z
+M 1625 4950 
+Q 2025 4475 2275 3925 
+L 1750 3725 
+Q 1525 4275 1150 4725 
+L 1625 4950 
+z
+M 3675 2325 
+Q 4075 1775 4325 1150 
+L 3775 900 
+Q 3550 1550 3200 2075 
+L 3675 2325 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-8fd9" d="M 750 5025 
+Q 1250 4700 1650 4250 
+L 1300 3825 
+Q 875 4325 400 4650 
+L 750 5025 
+z
+M 325 2950 
+L 1575 2950 
+L 1575 550 
+Q 1950 275 2500 200 
+Q 3050 125 6100 125 
+L 5850 -425 
+L 3850 -425 
+Q 2100 -425 1375 200 
+L 650 -525 
+L 300 0 
+L 1075 475 
+L 1075 2475 
+L 325 2475 
+L 325 2950 
+z
+M 3825 5200 
+Q 4150 4850 4300 4400 
+L 3800 4225 
+Q 3625 4675 3325 5050 
+L 3825 5200 
+z
+M 2150 4150 
+L 5850 4150 
+L 5850 3675 
+L 5050 3675 
+Q 4975 2575 4575 1975 
+L 5650 950 
+L 5250 550 
+L 4250 1575 
+Q 3525 825 2400 575 
+L 2075 1050 
+Q 3250 1325 3850 1925 
+L 2450 3025 
+L 2825 3300 
+L 4150 2325 
+Q 4475 2750 4550 3675 
+L 2150 3675 
+L 2150 4150 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-6761" d="M 2200 5225 
+L 2725 5100 
+L 2500 4750 
+L 5175 4750 
+L 5175 4325 
+Q 4650 3675 3900 3250 
+Q 4900 2950 6075 2825 
+L 5825 2325 
+Q 4350 2550 3300 2975 
+Q 2200 2525 700 2300 
+L 400 2775 
+Q 1750 2975 2700 3275 
+Q 2175 3575 1850 4050 
+Q 1450 3700 975 3450 
+L 650 3825 
+Q 1425 4275 1850 4725 
+L 1850 4750 
+L 2200 5225 
+z
+M 2225 4300 
+Q 2600 3800 3275 3500 
+Q 4025 3850 4450 4300 
+L 2225 4300 
+z
+M 425 1950 
+L 3000 1950 
+L 3000 2350 
+L 3500 2350 
+L 3500 1950 
+L 5950 1950 
+L 5950 1475 
+L 3500 1475 
+L 3500 25 
+Q 3475 -550 2825 -550 
+L 2400 -525 
+L 2300 -25 
+L 2750 -50 
+Q 3000 -50 3000 200 
+L 3000 1475 
+L 425 1475 
+L 425 1950 
+z
+M 1800 1225 
+L 2250 975 
+Q 1600 150 900 -300 
+L 500 50 
+Q 1300 600 1800 1225 
+z
+M 4450 1175 
+Q 5175 725 5875 125 
+L 5475 -275 
+Q 4850 325 4025 900 
+L 4450 1175 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-9879" d="M 5750 4025 
+L 5750 775 
+L 5250 775 
+L 5250 3575 
+L 3200 3575 
+L 3200 750 
+L 2725 750 
+L 2725 4025 
+L 3825 4025 
+L 3900 4525 
+L 2475 4525 
+L 2475 4975 
+L 5950 4975 
+L 5950 4525 
+L 4400 4525 
+L 4325 4025 
+L 5750 4025 
+z
+M 4000 3050 
+L 4475 3050 
+L 4450 1875 
+Q 4450 150 2450 -575 
+L 2125 -150 
+Q 3825 400 3950 1650 
+L 4000 3050 
+z
+M 4675 825 
+L 6075 -175 
+L 5700 -575 
+Q 5100 0 4300 550 
+L 4675 825 
+z
+M 375 4625 
+L 2200 4625 
+L 2200 4150 
+L 1550 4150 
+L 1550 1000 
+L 2225 1275 
+L 2300 825 
+Q 1450 450 425 200 
+L 325 675 
+L 1050 850 
+L 1050 4150 
+L 375 4150 
+L 375 4625 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-76ee" d="M 5275 4900 
+L 5275 -575 
+L 4775 -575 
+L 4775 -25 
+L 1550 -25 
+L 1550 -575 
+L 1050 -575 
+L 1050 4900 
+L 5275 4900 
+z
+M 1550 3400 
+L 4775 3400 
+L 4775 4425 
+L 1550 4425 
+L 1550 3400 
+z
+M 1550 1925 
+L 4775 1925 
+L 4775 2950 
+L 1550 2950 
+L 1550 1925 
+z
+M 1550 450 
+L 4775 450 
+L 4775 1450 
+L 1550 1450 
+L 1550 450 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-4e3b" d="M 3075 5150 
+Q 3325 4675 3475 4125 
+L 5850 4125 
+L 5850 3650 
+L 3425 3650 
+L 3425 2300 
+L 5525 2300 
+L 5525 1825 
+L 3425 1825 
+L 3425 125 
+L 6025 125 
+L 6025 -350 
+L 375 -350 
+L 375 125 
+L 2925 125 
+L 2925 1825 
+L 850 1825 
+L 850 2300 
+L 2925 2300 
+L 2925 3650 
+L 550 3650 
+L 550 4125 
+L 2900 4125 
+L 2550 4975 
+L 3075 5150 
+z
+" transform="scale(0.015625)"/>
+     <path id="DroidSansFallback-7ebf" d="M 2125 4175 
+L 2575 4000 
+Q 1950 2675 1150 1775 
+L 2300 2100 
+L 2425 1700 
+Q 1575 1375 525 1200 
+L 375 1625 
+Q 925 2150 1425 2950 
+L 525 2800 
+L 425 3275 
+Q 1000 3975 1375 5175 
+L 1850 5025 
+Q 1500 3975 975 3300 
+L 1700 3375 
+L 2125 4175 
+z
+M 2425 975 
+L 2525 525 
+L 525 -50 
+L 325 475 
+L 2425 975 
+z
+M 5625 4075 
+L 5675 3600 
+L 4225 3350 
+L 4275 2550 
+L 5950 2900 
+L 6000 2425 
+L 4350 2075 
+L 4600 1125 
+Q 5025 1525 5375 2050 
+L 5825 1825 
+Q 5375 1100 4825 600 
+Q 5225 -25 5450 -25 
+Q 5575 -25 5625 825 
+L 6125 600 
+Q 5925 -600 5450 -600 
+Q 5000 -600 4450 300 
+Q 3775 -150 2925 -450 
+L 2650 50 
+Q 3600 375 4200 800 
+Q 3975 1275 3850 1975 
+L 2575 1700 
+L 2500 2175 
+L 3800 2450 
+L 3725 3275 
+L 2775 3125 
+L 2700 3600 
+L 3700 3750 
+L 3675 5175 
+L 4175 5175 
+L 4200 3850 
+L 5625 4075 
+z
+M 4875 5150 
+L 5400 4500 
+L 5025 4200 
+L 4475 4875 
+L 4875 5150 
+z
+" transform="scale(0.015625)"/>
+    </defs>
+    <use xlink:href="#DroidSansFallback-5168"/>
+    <use xlink:href="#DroidSansFallback-53c2" transform="translate(100 0)"/>
+    <use xlink:href="#DroidSansFallback-5fae" transform="translate(200 0)"/>
+    <use xlink:href="#DroidSansFallback-8c03" transform="translate(300 0)"/>
+    <use xlink:href="#DroidSansFallback-6709" transform="translate(400 0)"/>
+    <use xlink:href="#DroidSansFallback-6536" transform="translate(500 0)"/>
+    <use xlink:href="#DroidSansFallback-76ca" transform="translate(600 0)"/>
+    <use xlink:href="#DroidSansFallback-ff0c" transform="translate(700 0)"/>
+    <use xlink:href="#DroidSansFallback-4f46" transform="translate(800 0)"/>
+    <use xlink:href="#DroidSansFallback-4e0d" transform="translate(900 0)"/>
+    <use xlink:href="#DroidSansFallback-9002" transform="translate(1000 0)"/>
+    <use xlink:href="#DroidSansFallback-5408" transform="translate(1100 0)"/>
+    <use xlink:href="#DroidSansFallback-4f5c" transform="translate(1200 0)"/>
+    <use xlink:href="#DroidSansFallback-4e3a" transform="translate(1300 0)"/>
+    <use xlink:href="#DroidSansFallback-8fd9" transform="translate(1400 0)"/>
+    <use xlink:href="#DroidSansFallback-6761" transform="translate(1500 0)"/>
+    <use xlink:href="#DroidSansFallback-9879" transform="translate(1600 0)"/>
+    <use xlink:href="#DroidSansFallback-76ee" transform="translate(1700 0)"/>
+    <use xlink:href="#DroidSansFallback-4e3b" transform="translate(1800 0)"/>
+    <use xlink:href="#DroidSansFallback-7ebf" transform="translate(1900 0)"/>
+   </g>
+  </g>
+  <g id="text_55">
+   <!-- Frozen planner eval: standard 200 + hard 300. Full Tune produced 500 valid outputs; LoRA had 1 schema failure. -->
+   <g style="fill: #4b5563" transform="translate(235.160156 513.528041) scale(0.09 -0.09)">
+    <defs>
+     <path id="DejaVuSans-7a" d="M 353 3500 
+L 3084 3500 
+L 3084 2975 
+L 922 459 
+L 3084 459 
+L 3084 0 
+L 275 0 
+L 275 525 
+L 2438 3041 
+L 353 3041 
+L 353 3500 
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-76" d="M 191 3500 
+L 800 3500 
+L 1894 563 
+L 2988 3500 
+L 3597 3500 
+L 2284 0 
+L 1503 0 
+L 191 3500 
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-3a" d="M 750 794 
+L 1409 794 
+L 1409 0 
+L 750 0 
+L 750 794 
+z
+M 750 3309 
+L 1409 3309 
+L 1409 2516 
+L 750 2516 
+L 750 3309 
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-64" d="M 2906 2969 
+L 2906 4863 
+L 3481 4863 
+L 3481 0 
+L 2906 0 
+L 2906 525 
+Q 2725 213 2448 61 
+Q 2172 -91 1784 -91 
+Q 1150 -91 751 415 
+Q 353 922 353 1747 
+Q 353 2572 751 3078 
+Q 1150 3584 1784 3584 
+Q 2172 3584 2448 3432 
+Q 2725 3281 2906 2969 
+z
+M 947 1747 
+Q 947 1113 1208 752 
+Q 1469 391 1925 391 
+Q 2381 391 2643 752 
+Q 2906 1113 2906 1747 
+Q 2906 2381 2643 2742 
+Q 2381 3103 1925 3103 
+Q 1469 3103 1208 2742 
+Q 947 2381 947 1747 
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-68" d="M 3513 2113 
+L 3513 0 
+L 2938 0 
+L 2938 2094 
+Q 2938 2591 2744 2837 
+Q 2550 3084 2163 3084 
+Q 1697 3084 1428 2787 
+Q 1159 2491 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 4863 
+L 1159 4863 
+L 1159 2956 
+Q 1366 3272 1645 3428 
+Q 1925 3584 2291 3584 
+Q 2894 3584 3203 3211 
+Q 3513 2838 3513 2113 
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-3b" d="M 750 3309 
+L 1409 3309 
+L 1409 2516 
+L 750 2516 
+L 750 3309 
+z
+M 750 794 
+L 1409 794 
+L 1409 256 
+L 897 -744 
+L 494 -744 
+L 750 256 
+L 750 794 
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-6d" d="M 3328 2828 
+Q 3544 3216 3844 3400 
+Q 4144 3584 4550 3584 
+Q 5097 3584 5394 3201 
+Q 5691 2819 5691 2113 
+L 5691 0 
+L 5113 0 
+L 5113 2094 
+Q 5113 2597 4934 2840 
+Q 4756 3084 4391 3084 
+Q 3944 3084 3684 2787 
+Q 3425 2491 3425 1978 
+L 3425 0 
+L 2847 0 
+L 2847 2094 
+Q 2847 2600 2669 2842 
+Q 2491 3084 2119 3084 
+Q 1678 3084 1418 2786 
+Q 1159 2488 1159 1978 
+L 1159 0 
+L 581 0 
+L 581 3500 
+L 1159 3500 
+L 1159 2956 
+Q 1356 3278 1631 3431 
+Q 1906 3584 2284 3584 
+Q 2666 3584 2933 3390 
+Q 3200 3197 3328 2828 
+z
+" transform="scale(0.015625)"/>
+     <path id="DejaVuSans-66" d="M 2375 4863 
+L 2375 4384 
+L 1825 4384 
+Q 1516 4384 1395 4259 
+Q 1275 4134 1275 3809 
+L 1275 3500 
+L 2222 3500 
+L 2222 3053 
+L 1275 3053 
+L 1275 0 
+L 697 0 
+L 697 3053 
+L 147 3053 
+L 147 3500 
+L 697 3500 
+L 697 3744 
+Q 697 4328 969 4595 
+Q 1241 4863 1831 4863 
+L 2375 4863 
+z
+" transform="scale(0.015625)"/>
+    </defs>
+    <use xlink:href="#DejaVuSans-46"/>
+    <use xlink:href="#DejaVuSans-72" transform="translate(50.269531 0)"/>
+    <use xlink:href="#DejaVuSans-6f" transform="translate(89.132812 0)"/>
+    <use xlink:href="#DejaVuSans-7a" transform="translate(150.314453 0)"/>
+    <use xlink:href="#DejaVuSans-65" transform="translate(202.804688 0)"/>
+    <use xlink:href="#DejaVuSans-6e" transform="translate(264.328125 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(327.707031 0)"/>
+    <use xlink:href="#DejaVuSans-70" transform="translate(359.494141 0)"/>
+    <use xlink:href="#DejaVuSans-6c" transform="translate(422.970703 0)"/>
+    <use xlink:href="#DejaVuSans-61" transform="translate(450.753906 0)"/>
+    <use xlink:href="#DejaVuSans-6e" transform="translate(512.033203 0)"/>
+    <use xlink:href="#DejaVuSans-6e" transform="translate(575.412109 0)"/>
+    <use xlink:href="#DejaVuSans-65" transform="translate(638.791016 0)"/>
+    <use xlink:href="#DejaVuSans-72" transform="translate(700.314453 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(741.427734 0)"/>
+    <use xlink:href="#DejaVuSans-65" transform="translate(773.214844 0)"/>
+    <use xlink:href="#DejaVuSans-76" transform="translate(834.738281 0)"/>
+    <use xlink:href="#DejaVuSans-61" transform="translate(893.917969 0)"/>
+    <use xlink:href="#DejaVuSans-6c" transform="translate(955.197266 0)"/>
+    <use xlink:href="#DejaVuSans-3a" transform="translate(982.980469 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(1016.671875 0)"/>
+    <use xlink:href="#DejaVuSans-73" transform="translate(1048.458984 0)"/>
+    <use xlink:href="#DejaVuSans-74" transform="translate(1100.558594 0)"/>
+    <use xlink:href="#DejaVuSans-61" transform="translate(1139.767578 0)"/>
+    <use xlink:href="#DejaVuSans-6e" transform="translate(1201.046875 0)"/>
+    <use xlink:href="#DejaVuSans-64" transform="translate(1264.425781 0)"/>
+    <use xlink:href="#DejaVuSans-61" transform="translate(1327.902344 0)"/>
+    <use xlink:href="#DejaVuSans-72" transform="translate(1389.181641 0)"/>
+    <use xlink:href="#DejaVuSans-64" transform="translate(1428.544922 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(1492.021484 0)"/>
+    <use xlink:href="#DejaVuSans-32" transform="translate(1523.808594 0)"/>
+    <use xlink:href="#DejaVuSans-30" transform="translate(1587.431641 0)"/>
+    <use xlink:href="#DejaVuSans-30" transform="translate(1651.054688 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(1714.677734 0)"/>
+    <use xlink:href="#DejaVuSans-2b" transform="translate(1746.464844 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(1830.253906 0)"/>
+    <use xlink:href="#DejaVuSans-68" transform="translate(1862.041016 0)"/>
+    <use xlink:href="#DejaVuSans-61" transform="translate(1925.419922 0)"/>
+    <use xlink:href="#DejaVuSans-72" transform="translate(1986.699219 0)"/>
+    <use xlink:href="#DejaVuSans-64" transform="translate(2026.0625 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(2089.539062 0)"/>
+    <use xlink:href="#DejaVuSans-33" transform="translate(2121.326172 0)"/>
+    <use xlink:href="#DejaVuSans-30" transform="translate(2184.949219 0)"/>
+    <use xlink:href="#DejaVuSans-30" transform="translate(2248.572266 0)"/>
+    <use xlink:href="#DejaVuSans-2e" transform="translate(2312.195312 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(2343.982422 0)"/>
+    <use xlink:href="#DejaVuSans-46" transform="translate(2375.769531 0)"/>
+    <use xlink:href="#DejaVuSans-75" transform="translate(2427.789062 0)"/>
+    <use xlink:href="#DejaVuSans-6c" transform="translate(2491.167969 0)"/>
+    <use xlink:href="#DejaVuSans-6c" transform="translate(2518.951172 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(2546.734375 0)"/>
+    <use xlink:href="#DejaVuSans-54" transform="translate(2578.521484 0)"/>
+    <use xlink:href="#DejaVuSans-75" transform="translate(2624.480469 0)"/>
+    <use xlink:href="#DejaVuSans-6e" transform="translate(2687.859375 0)"/>
+    <use xlink:href="#DejaVuSans-65" transform="translate(2751.238281 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(2812.761719 0)"/>
+    <use xlink:href="#DejaVuSans-70" transform="translate(2844.548828 0)"/>
+    <use xlink:href="#DejaVuSans-72" transform="translate(2908.025391 0)"/>
+    <use xlink:href="#DejaVuSans-6f" transform="translate(2946.888672 0)"/>
+    <use xlink:href="#DejaVuSans-64" transform="translate(3008.070312 0)"/>
+    <use xlink:href="#DejaVuSans-75" transform="translate(3071.546875 0)"/>
+    <use xlink:href="#DejaVuSans-63" transform="translate(3134.925781 0)"/>
+    <use xlink:href="#DejaVuSans-65" transform="translate(3189.90625 0)"/>
+    <use xlink:href="#DejaVuSans-64" transform="translate(3251.429688 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(3314.90625 0)"/>
+    <use xlink:href="#DejaVuSans-35" transform="translate(3346.693359 0)"/>
+    <use xlink:href="#DejaVuSans-30" transform="translate(3410.316406 0)"/>
+    <use xlink:href="#DejaVuSans-30" transform="translate(3473.939453 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(3537.5625 0)"/>
+    <use xlink:href="#DejaVuSans-76" transform="translate(3569.349609 0)"/>
+    <use xlink:href="#DejaVuSans-61" transform="translate(3628.529297 0)"/>
+    <use xlink:href="#DejaVuSans-6c" transform="translate(3689.808594 0)"/>
+    <use xlink:href="#DejaVuSans-69" transform="translate(3717.591797 0)"/>
+    <use xlink:href="#DejaVuSans-64" transform="translate(3745.375 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(3808.851562 0)"/>
+    <use xlink:href="#DejaVuSans-6f" transform="translate(3840.638672 0)"/>
+    <use xlink:href="#DejaVuSans-75" transform="translate(3901.820312 0)"/>
+    <use xlink:href="#DejaVuSans-74" transform="translate(3965.199219 0)"/>
+    <use xlink:href="#DejaVuSans-70" transform="translate(4004.408203 0)"/>
+    <use xlink:href="#DejaVuSans-75" transform="translate(4067.884766 0)"/>
+    <use xlink:href="#DejaVuSans-74" transform="translate(4131.263672 0)"/>
+    <use xlink:href="#DejaVuSans-73" transform="translate(4170.472656 0)"/>
+    <use xlink:href="#DejaVuSans-3b" transform="translate(4222.572266 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(4256.263672 0)"/>
+    <use xlink:href="#DejaVuSans-4c" transform="translate(4288.050781 0)"/>
+    <use xlink:href="#DejaVuSans-6f" transform="translate(4342.013672 0)"/>
+    <use xlink:href="#DejaVuSans-52" transform="translate(4403.195312 0)"/>
+    <use xlink:href="#DejaVuSans-41" transform="translate(4468.677734 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(4537.085938 0)"/>
+    <use xlink:href="#DejaVuSans-68" transform="translate(4568.873047 0)"/>
+    <use xlink:href="#DejaVuSans-61" transform="translate(4632.251953 0)"/>
+    <use xlink:href="#DejaVuSans-64" transform="translate(4693.53125 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(4757.007812 0)"/>
+    <use xlink:href="#DejaVuSans-31" transform="translate(4788.794922 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(4852.417969 0)"/>
+    <use xlink:href="#DejaVuSans-73" transform="translate(4884.205078 0)"/>
+    <use xlink:href="#DejaVuSans-63" transform="translate(4936.304688 0)"/>
+    <use xlink:href="#DejaVuSans-68" transform="translate(4991.285156 0)"/>
+    <use xlink:href="#DejaVuSans-65" transform="translate(5054.664062 0)"/>
+    <use xlink:href="#DejaVuSans-6d" transform="translate(5116.1875 0)"/>
+    <use xlink:href="#DejaVuSans-61" transform="translate(5213.599609 0)"/>
+    <use xlink:href="#DejaVuSans-20" transform="translate(5274.878906 0)"/>
+    <use xlink:href="#DejaVuSans-66" transform="translate(5306.666016 0)"/>
+    <use xlink:href="#DejaVuSans-61" transform="translate(5341.871094 0)"/>
+    <use xlink:href="#DejaVuSans-69" transform="translate(5403.150391 0)"/>
+    <use xlink:href="#DejaVuSans-6c" transform="translate(5430.933594 0)"/>
+    <use xlink:href="#DejaVuSans-75" transform="translate(5458.716797 0)"/>
+    <use xlink:href="#DejaVuSans-72" transform="translate(5522.095703 0)"/>
+    <use xlink:href="#DejaVuSans-65" transform="translate(5560.958984 0)"/>
+    <use xlink:href="#DejaVuSans-2e" transform="translate(5622.482422 0)"/>
+   </g>
+  </g>
+ </g>
+ <defs>
+  <clipPath id="p74188dfc60">
+   <rect x="42.765865" y="43.571033" width="492.000822" height="415.565018"/>
+  </clipPath>
+  <clipPath id="p70340664cd">
+   <rect x="611.558687" y="43.571033" width="338.696218" height="415.565018"/>
+  </clipPath>
+ </defs>
+</svg>