# 综合输入无损复用与动态输出预算(F100/F103/F167) F168(2026-10-27):真实反馈表明,字节减少不能等同提速,微小收益不值得改变模型读取方式。来源内复用现在扣除读取规则成本后,须净省至少1024字节、且至少为普通JSON数据的5%,才启用text_pool;任一门槛不足则保留普通字段表示与原有完全重复列表项去重,不给模型附复用规则。本地仍先核对逐字还原,不能为达到门槛删减事实。 日志里的`reused_text_bytes_saved`是JSON节省量,必须再扣读取规则字节才是文字复用的净收益;`input_bytes_before_dedup-input_bytes`还含原先的列表项去重,不能全部算本次复用收益。总耗时中模型调用、线程/模型名额等待和最终Redis回读应分别检查;一次综合、没有共享模型等待或额外整理,并不证明网络/上游模型或Redis耗时稳定。 F167(2026-10-27)仅优化综合模型的输入副本,不裁剪独有原文、不替代证据分析。纯卡片、知识/附件/混合综合共用来源内文字复用;人才适配同样使用此规则。程序不额外调用模型,真实质量和耗时仍需后续验收;本轮按用户要求仅做本地和合成验证。 API和CLI为最终综合使用独立JsonModel实例,避免修改全文分析共用模型的可变属性。两者在API仍受同一个全局模型信号量约束,不新增并发额度。纯政策卡片综合、知识/附件/混合综合均使用新实例;全文分析、规划、短文案和中间整理仍使用原模型及其16384输出预留。 ```dotenv ANSWER_MAX_OUTPUT_TOKENS=8192 ANSWER_MIN_OUTPUT_TOKENS=4096 ``` 最大值默认8192,允许1024–16384。最小值默认min(4096,最大值),允许1024至最大值;系统环境优先,非法值拒绝启动。本轮未修改本地.env,下限未配置时使用默认。上下限相同可关闭动态收缩。修改需重启,新请求生效;输出达到上限仍明确失败/降级,不能把截断内容当完整成功。 F103按完整输入大小计算剩余空间:上下文上限−安全余量−输入字节。剩余空间大于等于下限时,实际输出上限取“剩余空间与配置最大值的较小者”,否则保留正常预算并进入既有超长处理。预算与实际max_tokens同步,单次调用通过模型副本隔离,API仍共用原限流器。纯卡片路径同样动态调整,不另增整理流程;联合综合明显超长时继续分批整理。来源修复追加输入后重新计算,不低于下限强行调用;整理后内容缩小可恢复完整输出预算。 例如122306+8192+904超出131072时,实际预留调整为7862即可直接综合,保持904余量。此处仅为保守预算算术,不保证实际模型回答长度或质量,也不表示输入字节等于token数。 ## 无损去重范围 仅处理发给综合模型的独立副本;每一来源条目内的citations、conditions和match_basis移除字段和值完全相同的重复项,known_subject_facts同样按完整对象去重,保留首次顺序。对象key排列不同视作同一个对象,文字、空格、否定、条件状态、原文路径、页码/位置、版本等值必须完全相同才去重。 不合并不同来源,不删相似但不相同内容,不重写answer,不截断任何独有引文或条件。原始来源、候选分析、返回的完整引文及卡片保持原数据;同题QA直接引用路径保持。纯政策和联合综合均应用去重,不增加模型请求。 ## 来源内文字复用(F167) 长引文和卡片/分析字段中的完全相同原句、完整句段或完整文字,只有在同一来源条目内重复出现时才复用。每条来源的`text_pool`只保存本条原文字串,重复位置改为`{"text_parts":["独有文字",{"ref":"t0"},"末尾限制"]}`,按顺序拼接即原字段全文。所有独有文字、空白、标点和每一次出现的位置均保留,不能把相同字串解读成相同资格或混用来源。 政策卡片字段仍保留,只减少其与分析答案、引用之间的文字重复传输。来源ID、标题、卡片名称、原文路径、页码/位置、状态、链接及图片标记保持字面值;地区、时间、金额比例、否定和例外可以通过复用表示,但必须逐字还原。没有复用价值的长条款完整内联,不按字符数取头尾,也不通过摘要替换原文。 每个拟压缩条目都运行逐字段还原比较。不能精确还原、JSON变大,或净收益未达到F168双门槛时,使用原表示。候选片段数量和索引大小有界,超出部分原样保留。算法是请求内局部操作,不跨来源合并、不建共享缓存;`sources`、公开`citations/card/conditions`和原会话数据不变,内部引用编号不暴露给前端。 最终综合及确实包含压缩条目的整理批次均附读取规则。一个压缩条目若仍超出中间整理预算,先恢复原字段全文再分片,避免引用表与依赖分散到不同批次。每批按实际提示和数据重新检查预算;未压缩的普通请求不附复用规则,来源错误修复仍基于原批输入、未知来源继续拒绝。 本地固定合成样例采用Git原去重函数作对照、记录器替代真实模型:人才式3卡片输入12234→10301字节(15.80%),营商式8来源混合31695→26513(16.35%),12卡片39160→29910(23.62%)。数字包含规则说明,三个样例逐字段还原、公开引用和合成输出一致,综合调用均1次;这是代表性合成效果,不能当作前述真实会话的压缩率、模型语义或线上提速结果。无重复条款时可能没有体积收益。 运行代码需配套更新`synthesis_input.py`、`cards.py`、`knowledge_answers.py`及`src/step4_api/logging.py`,然后按既有方式重启;不改依赖、模型配置、知识内容或重新入库,历史回答不回填。本轮未执行部署。 ## 超长输入兜底与观测 仍使用原UTF-8字节保守预算,没有接入tokenizer,不把字节数叫作实际token。最终综合按独立输出预留判断;仍超限时保留原有有界分批整理。中间整理按其原模型上下文和16384输出预留独立计算预算;来源错误仍仅在原批次有界修正,总调用上限保持,不因更大的最终输入预算让中间整理请求越界。 summary.diagnostics及result_ready.summary_diagnostics新增: | 字段 | 含义 | | --- | --- | | input_bytes_before_dedup | 去重前输入字节计数,含提示与JSON | | input_bytes | 去重后计数,含提示与JSON | | deduplicated_items | 移除的完全重复列表项数量 | | reused_text_bytes_saved | 来源内文字复用减少的JSON字节数,不扣新增规则文字;以input_bytes前后差查看净变化 | | pooled_texts | 本次复用字串数量,仅数值,不记录文本 | | text_reuse_candidate_net_bytes | 候选复用方案扣除新增规则后的净节省;即使未启用也可记录 | | text_reuse_minimum_net_bytes | 本次所需净节省,取1024字节与普通JSON数据5%的较大者,向上取整 | | text_reuse_applied | 1表示启用文字复用,0表示候选低收益而保留普通表示;无候选时字段可省略 | | output_token_reserve | 最终综合独立输出预留 | | configured_output_token_reserve | 配置的输出最大预留 | | min_output_token_reserve | 配置的动态收缩下限 | | output_reserve_reduction | 当前最终候选调用相对最大值缩小的预留 | | final_call_input_bytes | 当前最终候选调用输入大小,包含来源修复或整理后的变化;调用前失败时不表示已发送 | | reserved_total | 当前最终候选输入+实际输出预留+安全余量;动态路径不再始终对应最初input_bytes | | reduction_output_token_reserve | 联合综合的中间整理模型预留;仅用于预算,不表示已调用整理 | model_calls、reduction_levels及F097的reduction/synthesis耗时继续反映实际工作。无重复项时去重不节省字节,不能保证每个请求不再整理。原日志示例119470+8192+904=128566,小于131072;这只是按旧输入计算预算,真实新请求的召回和分析内容仍可能变化。 合成验证覆盖去重保留来源/位置/矛盾、输入副本不修改、公开证据不删、重复输入从超限到单次综合、实际max_tokens独立、长独有证据仍整理且各自预算正确、输出截断明确降级。未重放真实用户资料或测线上质量/延迟,需重启后采集前后数据。 F103另覆盖短输入、最大预算边界、超1/330、最低预算边界及明显超长、多来源差异与历史、来源修复、并发隔离和配置。仍使用保守字节口径,没有接入模型tokenizer或改变安全余量;真实长答在下限下的完整性需采样评测。中间整理是分批生成证据笔记,再最终综合,可能增加延迟或遗漏细节,故尽量避免不必要调用但保留超长兜底。