submodularity 系列的所有实现都可以在这个 Github 仓库中找到。
在我之前关于DeepResearch 中用于扇出查询的次模优化的文章之后,我收到了很好的反馈,要求更深入地研究次模性及其在信息检索和 Agentic 搜索中的应用。今天,我将介绍次模优化的另外两个应用:文本选择和 段落重排。两者都解决了相同的核心挑战——最佳子集选择——这是每个类似 DeepResearch 的系统都必须解决的问题。
真实世界的文档包含语义冗余——并非每个句子对于 LLM 的推理都具有同等的重要性。想象一下,您有一个很长的文档,并且需要在保持在词元限制内的情况下提取最具代表性的信息。这就是文本选择:选择在基数约束下捕获文档本质的内容。我们希望选择的内容彼此正交——最大限度地减少共享信息,同时最大限度地提高总覆盖率。这适用于多个级别:从文档中选择句子,或从句子中选择词元。也可以将文本选择视为上下文优化或压缩。我们减少 LLM 词元的消耗,同时保留推理所需的语义丰富性。

段落重排按段落与用户查询的语义相关性对候选段落进行排序。在 Jina AI,我们为此构建了专门的重排器 (jina-reranker-m0, jina-reranker-v2-multilingual-base),尽管我们的 向量模型也可以解决这个问题。但这里有一个限制:大多数重排器(包括我们的)都以逐点方式工作。它们独立地对单个 (query, document) 对进行评分。它们不考虑段落之间的共享信息:如果段落 1 和段落 7 都得分很高,但包含几乎相同的信息,那么只选择其中一个就足够了吗?

在 DeepResearch 中,这一点变得至关重要。当 Agent 调用搜索工具并收集 Web 片段时,我们必须确定哪些片段值得在下一个推理步骤中占据宝贵的上下文窗口空间。选择遵循与文本选择相同的“最小化重叠,最大化覆盖”原则,但增加了一个目标——与原始查询的相关性必须优先。
许多研究人员认识到上下文工程的重要性日益提高,我们需要构建、优化和“恰到好处地打包上下文窗口”(来自 Andrej Karpathy),以构建更有效的 Agentic 工作流程。然而,许多人只是使用 LLM 提示词来“软性地”解决这些问题——没有保证、没有理论基础、效果令人怀疑。我们可以做得更好。
在本文中,我将展示文本选择和段落重排都可以通过次模优化来实现,从而提供严格的解决方案。如果您不熟悉次模函数,请考虑“收益递减”。我们从一个空集开始,并逐步添加选定的文本或段落。每次添加都提供价值,但边际收益会减少——捕捉到多样化、非冗余的选择最有价值的直觉。形式上,如果对于任何集合 和元素 ,函数 是次模的:
这个公式完美地捕捉了我们的直觉:我们希望选定的元素共同覆盖整个文档的语义空间,因为我们选择的单元越多,每个新单元覆盖以前未覆盖的语义空间的可能性就越小。
tag通过次模优化进行文本选择
首先使用 jina-embeddings-v4 的多向量特征从段落中提取 词元级 向量模型,然后应用次模优化来挑选提供最佳覆盖率的词元,最后调用分词器并将选择转换回其原始位置的字符串。可以将其视为一种“压缩”形式——您可以调整 top-k 滑块以拨入不同的“压缩率”。您还能理解压缩后的文本吗?

使用次模优化实现文本选择。
让我们从解决文本选择问题开始,因为它对于理解次模性至关重要,并且是段落重排的初步步骤。问题如下:
给定一个包含 个元素(词元或句子)的文档 ,我们想要选择一个子集 ,其中 ,以最大化覆盖函数:
其中 表示元素 和 的 **向量模型** 之间的余弦相似度。请注意,覆盖函数 是次模的,因为它满足收益递减属性。 max 运算确保我们衡量每个元素被最接近的选定单元代表的程度,避免重复计算冗余信息。
tag获取词元/段落级别 **向量模型**
对于词元级别的选择,我们利用 jina-embeddings-v4 的新型多向量嵌入功能。设置 return_multivector=True 会返回每个词元的 **向量模型**,从而能够在子词级别进行选择。
对于段落级别的选择,我们只需通过标点符号或换行符拆分文档,并独立嵌入每个段落。或者,也可以通过开启延迟分块来调用我们的 API,以获得上下文段落 **向量模型**,这通常会在下游任务中带来更好的性能。

值得注意的是,由于我们在同质元素集中测量语义相似度——所有元素都服务于相同的功能角色,而不是像在段落 **重排器** 中那样比较异构元素(例如查询与文档)——我们调用 jina-embeddings-v4 时启用了 text-matching LoRA 适配器。

自从 jina-embeddings-v3,我们的 **向量模型** 就配备了任务优化的 LoRA。 在我们的 v4 **向量模型** 中阅读有关可用 LoRA 的更多信息。
tagLazy Greedy算法
正如在前一篇文章中一样,我们使用 lazy greedy 算法来解决优化问题。 对于单调次模函数,该算法实现了 的近似保证——这是一个经过验证的严格界限。 lazy greedy 优化利用了次模函数的两个基本属性:收益递减和迭代之间边际收益相对排序的保留。 该算法的工作原理如下:
- 初始化:计算所有元素的初始边际收益,并将它们存储在优先级队列中
- 延迟评估:在每次迭代中,提取具有最高缓存收益的元素
- 验证:如果此元素的收益是在当前迭代中计算的,则立即选择它
- 重新计算:否则,重新计算其当前边际收益并重新插入队列
这种 lazy greedy 算法大大降低了计算开销,尤其是在边际收益在各个元素之间表现出很大差异时。
tag通过次模优化进行段落 **重排器**

段落 **重排器** 任务通过添加一个新目标来扩展文本选择:所选子集必须与给定的查询相关。 虽然文本选择优化了文档中的纯粹多样性,但段落 **重排器** 必须在多样性和查询相关性之间取得平衡。 以下是关键符号:
- 是从 个段落的候选集中选择的段落索引的子集——在给定步骤中 DeepResearch 系统中的所有内容或记忆。 表示我们想要结转到下一个推理步骤的精心挑选的子集。 我们有 个查询和 个候选段落。 在传统的搜索中,,但在 DeepResearch 中,查询经常被改写和生成,我们可能手头有多个查询。
- 是段落 和 之间的相似度。 这使用 jina-embeddings-v4 的余弦相似度,并为所有段落启用 task="text-matching" LoRA,就像我们在文本选择任务中所做的那样。
- 是查询 和段落 之间的相关性得分。 这是使用 jina-embeddings-v4 计算的余弦相似度,查询使用
task="retrieval", prompt_name="query",段落使用task="retrieval", prompt_name="passage",从而启用非对称检索 LoRA 并生成异构 **向量模型**。
现在,我们可以使用两个不同的次模函数来公式化这个问题,每个函数都捕捉了相关性和多样性之间不同的权衡。
tag设施选址公式
每个段落都由其最相似的选定段落“覆盖”,并根据该选定段落与每个查询的相关程度进行加权。 此公式选择既与查询相关又代表许多其他段落的段落。
查询相关性 () 和段落相似性 () 之间的乘法交互作用创建了“中心”——既可以作为相关答案又可以作为多样化代表的双重用途的段落。 高度相关的段落可以覆盖许多相似的段落,而相关性较低的段落只有在没有更好的代表存在时才提供覆盖。
tag饱和覆盖公式
对于每个段落,您获得的信用等于其查询相关性的最小值或它被您选择的最佳代表覆盖的程度。 这鼓励选择可以“饱和”许多其他段落相关性的段落。
min 运算创建了一个相关性上限——您无法获得比段落与查询的内在相关性更高的覆盖信用。 这种公式更加保守,可以防止过度选择多样化但无关紧要的段落。
这两个函数都是单调的和次模的,可以使用相同的 lazy greedy 算法,并具有 近似保证。
tag实验结果
在我们的实现中,我们使用 Jina Reader 从我们之前的博客文章中获取纯文本,并使用段落 **重排器** 评估不同的查询。 我强烈建议读者使用他们自己的文章来试验我们的 Google Colab 笔记本电脑——他们最熟悉的内容将提供最有意义的见解。
在我们的实验中,我们从每个文档中选择前 10 个段落。 请注意,所有三种算法——仅查询相关性、设施选址和饱和覆盖——都表现出单调性:选择更大的 不会改变前 个元素的排名。 例如,在比较 、 或 时,前 9 个段落在所有值中都保持相同。 结果如下所示。




以下是一些关键的观察结果。首先,次模优化算法大致遵循查询相关性得分,但引入了策略性的重新排序——段落的排名会“上下移动”。这种行为符合我们的预期,因为这些算法优化的是冗余最小化,而不是纯粹的相关性。最终的排名展示出强大的质量。
一些读者可能会注意到,在第一个、第二个和第四个例子中,次模优化的结果似乎很早就“饱和”了,只是简单地输出了排序后的段落 0、1、2 等。这并不是算法失效——它揭示了次模优化最有价值的特性之一,这是现有任何重排器都无法保证的。
为了更好地理解这种饱和行为,我们绘制了所有可能的集合大小 (从 1 到文档中的最大段落数)的次模函数值。这揭示了收益递减的特性。


上面的图表显示了当我们增加选择大小时,设施选址和饱和覆盖函数如何运作。两者都表现出经典的次模模式:
- 快速的初始增长:最陡峭的增长发生在最初的几次选择中
- 收益递减:每个额外的段落提供的边际效益逐渐减少
- 饱和平台期:函数值趋于平缓,表明进一步增加带来的收益微乎其微
超过这些点后,边际收益变得可以忽略不计。这解释了为什么我们早期的排名实验显示出顺序排序(0、1、2...)——算法正确地识别出额外的段落贡献的价值最小。
这种行为直接体现了次模性的数学特性。我们观察到的边际收益递减不是算法伪影,而是覆盖函数的基本特征。当函数值达到平稳时,我们已经达到了以下状态:
对于所有剩余的段落 。
tag结论
上下文工程已经成为人工智能领域的热门词汇,它经常被誉为构建智能代理系统的范式转变,这些系统可以精心策划最相关的信息来填充 LLM 的上下文窗口,而这通常始于通过 RAG 检索外部数据。
文本选择和段落重排序是上下文工程不可或缺的组成部分,尤其是在知识库选择、检索和上下文压缩过程中。段落重排序然后通过基于查询相关性对那些选定的文本进行重新排序来改进这一点,以确保 LLM 首先接收到最有用的信息,从而避免过载并提高输出质量。
与传统的文本选择和段落重排序方法相比,次模优化提供了三个引人注目的优势:
tag具有计算效率的理论严谨性
与启发式方法不同,次模优化提供可证明的保证。与穷举搜索的 种组合相比,惰性贪婪算法在 时间内运行,同时实现 对最优解的近似。这意味着我们的解决方案在数学上保证至少与理论上最佳选择的 63% 一样好。没有基于 Prompt 的启发式方法可以保证这种级别的性能保证。
tag智能停止标准
我们观察到的饱和行为提供了一种自动停止机制:当边际收益接近于零时,我们就知道停止添加元素。这种能力是现有的逐点或逐列表重排器无法实现的,它们独立地对每个项目进行操作,而不了解集合级别的收益递减。函数本身会告诉我们何时获得了足够的覆盖率。
tag多查询扩展
该框架自然地扩展到多查询场景——这在 DeepResearch 中很常见,在 DeepResearch 中,查询经常被重写和改写。相同的理论基础和惰性贪婪算法可以无缝应用。基于 Prompt 的方法缺乏这种系统的可扩展性,通常需要针对每个新场景的临时解决方案。
这些好处源于次模性的数学基础,而不是工程技巧。当其他人依赖 Prompt 调整并希望获得好的结果时,您应该学习次模优化,它提供了一个具有形式保证的原则性框架——这是构建可靠、可扩展的上下文工程的关键优势。









