# RELEASE_NOTES_v2.8.9 相对 v2.8.8 的改进:搜索更快也更省——默认输出体积 −66%、重复查询整次耗时 −30%、慢网轮等待 −36%;拿到手的内容更完整——召回 +35%、抓取时延 −30%、正文结构保真 0/6 → 6/6;新增 5 个外媒与核查源(全部免密钥,源 232 → 237、领域 90 → 92);修复六处「数字互相矛盾」的记账缺陷,报出来的命中率、耗时、漏斗从此自己能对上账;新增离线重跑对比工具,改完代码「变好了还是变坏了」不再靠等联网检查。 ## 更快更省(每次查询省下的时间与体积) - **默认输出 15.5KB → 5.2KB(−66%)**:以前同一段结果摘要在默认输出里重复写三遍(占全文 82%)。现在默认只给一份干净结果;要完整封套用 `--envelope` 显式打开,`--archive` 归档时自动保留,归档能力零损失。 - **重复查询 168 → 118ms(−30%)**:路由决策加了一层缓存——同一个问题第二次搜,不再重付每次新进程都要交的「路由启动税」(103ms → 3.5ms)。指纹只在数据源真的挂掉或恢复时才失效,不会出现缓存永远不命中。 - **慢网轮等待 −36%**:行情、天气、赛事这类串行查询,以前第一个源必须耗满自己的超时上限(5-8 秒)才轮到备选。现在主源卡过 0.8 秒就补发备选源并行跑——主源在窗内交付时仍然只付一次调用的钱。8 条慢查询实测 21.0s → 13.4s。 - **杂项提速**:`--help` 输出 −28%;缓存驱逐从逐个扫描改为一次排序(O(N²) → O(N));进程启动不再为一个没人用的日志器付 12.5ms 的连带导入。 ## 内容更完整(拿到手的东西质量更高) - **召回 +35%、抓取时延 −30%、搜索长尾 P90 −8%**:取数链路五轮系统性优化——该改写的改写、该跟随的重定向跟随、该并发的并发、该提前放弃的提前放弃。 - **正文结构不再被压平**:网页转正文时保留标题层级、列表、表格结构(HTML → Markdown),六类典型页面结构保真 0/6 → 6/6。以前抓回来一大坨字,表格行列全糊在一起。 - **表格行列还原、章节号成词、URL 规范化**:抓取正文的三条低成本改进;顺带修了一个长期 bug——改写过的 URL 在链路后段被悄悄改回原始形态,导致重新访问旧地址。 - **中文内容不再被系统性判为低质**:质量分的词数统计按英文习惯计算,中文按字计 vs 按词计差一个数量级,导致中文结果分数普遍虚低;现在分项依据随分输出,「这个分怎么来的」看得见。 ## 新增能力(5 个外媒与核查源,全部免密钥) - 源 232 → 237(免配置开箱 194 → 198),新增两个领域(90 → 92): - `guardian_rss` 卫报世界版(摘要长度是同侪的 3-9 倍) - `france24` France 24 英语版(补法语区视角) - `dw_news` 德国之声英语版(候选池最多) - `factcheck_org` FactCheck.org(声明级真伪判定,美国口径) - `full_fact` Full Fact(同能力,英国口径) - 新领域:`intl_news_flash` 国际新闻实时流、`claim_check` 声明核验/辟谣 - **下线死源 gdelt**:上游持续拒绝访问(连续重试全 429),却同时占着国际事件域的主力与备选三处——等于这个域的保底一直是空的。现在主备改指 google_news 与 em_global_news。 ## 数字可信(六处「看起来对、量起来错」的修复) 这批缺陷的共同形态是不崩溃、但报出来的数字互相矛盾——读它的人会指着错误的对象做优化决策: - **缓存命中率口径**:L2 层每命中一次,都被同时记进分子和分母——L2 越有效,报出来的命中率反而越低。现在 miss 数恒等于真正落空的次数。 - **交付了结果的引擎被自己毒掉**:「部分成功」(有结果也有报错)被当成了失败,既推高熔断计数、又写进 30 秒负缓存——同一个查询再搜时,刚交出结果的引擎反而被跳过。 - **全引擎超时报「跑了 0 个引擎」**:超时路径漏记耗时账,而「各引擎跑了多久」的读数全从这笔账推出来——恰恰是最该被看见的一轮,读数却是空的。 - **深度模式报出「用时超过总预算」**:全量并行分支不认总墙钟预算,自相矛盾的读数会误导下一轮判断。 - **每次启动白付 15ms**:为读一张恒为空的表,付了整笔网络库导入(222 个引擎全量比对:路由结果 0 处差异,纯白付)。 - **DSH 插件连接池四处收口**:失败的连接不再占着位置不还(否则全系统悄悄退化成单连接串行);握手补上超时上界(离线或代理不通时,第一次搜索不再永远挂着);「调用超时」与「连接坏了」可区分(超时不再触发对同一次慢调用的重发,省下双倍配额);管道被关闭导致的截断不再被报成成功。 ## 看得清(归因) - **六格漏斗**:每次搜索输出自带「路由了几个 → 真正调用了几个 → 返回几个 → 去重后剩几个 → 过滤后剩几个 → 最终保留几个」,搜出 0 条时能定位到底塌在哪一层,而不是只看到一句「无结果」。 - **耗时账拆出过滤与恢复两个阶段**:以前零结果恢复链打的网络调用被记在精排头上(实测 700ms 的「精排」里只有 3.6ms 是真精排)——想优化瓶颈,别再被指错方向。 - **「浪费的时间」重新定义**:改为「答案就绪之后还在等的时间」,与有效时间之和恒等于总墙钟——旧口径并行时必然大于总时长,且把如实返回 0 条也算成浪费。 ## 默认关闭功能的打开方式 - 完整输出封套:`--envelope` 显式打开;`--archive` 归档路径自动保留(无需设置);旧参数 `--no-envelope` 兼容保留。 - 路由决策缓存默认开;调试时可设 `ARGO_ROUTE_CACHE=0` 关闭。 - 每次搜索的阶段耗时账默认开(`--no-timing` 可关);本轮起新增 filter / recovery 两个独立阶段。 - 备选源补发不产生新开关:串行域在主源超窗时自动补发,备选源全部免密钥,慢网轮调用数 +12% 换 1.2 秒的等待减少。 - 离线重跑(开发者工具):`python3 scripts/replay_eval.py` 录制一次真实搜索后,`--compare` 不上网重跑整条流程并列出与基准的差异——去重、合并、排序的改动效果当天可验证,不用等每周联网检查。 ## 相关依赖与已知边界 - 无新增第三方依赖;Python ≥ 3.9 不变。 - 卫报 / France 24 / 德国之声走 RSS 通道,内容为标题与摘要(卫报摘要中位 979 字),全文需另行抓取;两个核查源覆盖美英两法域的声明。 - 实时流类新源(新闻快讯)按「热榜」语义工作:忽略查询词、返回最新条目,不参与话题检索的槽位竞争;核查源按「查询过滤」语义工作。 - 主源 0.8 秒宽限窗按实测均值 1.9s 设定:网络正常时主源多在窗内交付、成本不变;极快网络下主源偶尔超窗,会多付一次免密钥调用。 ## 工程与质量(给关心维护性的人) - **离线重跑对比工具**(`scripts/replay_eval.py` + 十项检查):录制 → 重跑 → 对比三段式,把「这次改动是不是变好了」从每周一次的联网检查变成随时可跑的本地比对。 - **「策略施加后」部署形态门禁**:以前门禁只看「路由策略是什么」,看不到「策略真正施加到引擎清单之后长什么样」——部署形态零覆盖。补上之后顺带修掉一个真实路由缺陷(一个一词多义的词把查询劫持进单一引擎)。 - **场景阈值契约**:「什么算不达预期」(域归属、引擎数量、重放保留数)写成机器可查的阈值表,不再靠人翻输出。 - **本批新增回归门**:审查补丁 8 条 + 部署形态与场景阈值若干条,每条都在缺陷代码上失败过(变异即红);全量 pytest 2511 passed / 21 skipped。