☰
Prompt 拓扑剪枝的最后一步:占位文本也要占预算
2026/10/26 22:01:29 网站建设 项目流程

给长Prompt排序、评分、删节点,最后仍可能超过窗口。原因不一定在图算法,而在拼装:每删一段都插入“已省略5000个Token”的说明,说明本身也占空间。消息角色、分隔符和工具调用结构也有开销。

所以预算检查必须针对最终输出,不能只把保留节点的Token数相加。一个会返回超限结果的剪枝器,即使PageRank分数计算正确,也没有完成自己的任务。

从能够计量的渲染函数开始

下面按字符计数,用来说明预算闭合。必保留节点和省略标记先构成基础版本;连基础版本都装不下,就明确报错。之后按优先级逐个尝试放回节点,每次重新渲染并计数。它不声称是语义最优背包解。

from dataclasses import dataclass @dataclass(frozen=True) class Node: text: str required: bool = False score: float = 0.0 def prune(nodes, budget): selected = {i for i, n in enumerate(nodes) if n.required} def render(indices): return '\n'.join(n.text if i in indices else '[omit]' for i, n in enumerate(nodes)) if len(render(selected)) > budget: raise ValueError('protected content and markers exceed budget') candidates = sorted((i for i in range(len(nodes)) if i not in selected), key=lambda i: (-nodes[i].score, i)) for i in candidates: trial = selected | {i} if len(render(trial)) <= budget: selected = trial output = render(selected) assert len(output) <= budget return output nodes = [Node('RULE', True), Node('A' * 20, score=2), Node('B' * 20, score=1)] output = prune(nodes, 35) assert 'RULE' in output and len(output) <= 35 assert output.count('[omit]') == 1 try: prune(nodes, 3) except ValueError: pass else: raise AssertionError('protected overflow accepted') print('final size:', len(output), '; marker budget and overflow: PASS')

换成真实消息时,要重做哪部分

把字符数换成分词器还不够。应计量完整消息模板,保留工具调用ID与对应结果的配对关系;不能删掉调用却留下悬空结果。占位标记如果会影响模型行为,也应进入质量评测。本文的score由调用者提供,没有从注意力权重反推事实重要性。

IBM Research 10月20日的记忆研究比较不同支持度的指引集合,提醒我们“留多少”是可调条件,不能先把某个阈值写成普遍最佳值。原文

Kimi Code模型配置区分上下文变体,应用也应该按实际所选端点设置预算,而非看到产品写1M就把所有请求都按1M发送。

程序已在本地验证标记开销和保护项超限拒绝,没有加载嵌入模型或连接实际聊天接口。要判断剪枝是否有用,还需比较问题证据是否被删、输出是否引用旧结论,以及在相同预算下是否优于简单的最近窗口。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询