Toutes les implémentations de la série sur la sous-modularité se trouvent dans ce dépôt Github.
Après mon précédent article sur l'optimisation sous-modulaire pour les requêtes fan-out dans DeepResearch, j'ai reçu d'excellents commentaires demandant un examen plus approfondi de la sous-modularité et de ses applications dans la recherche d'informations et la recherche agentique. Aujourd'hui, je vais présenter deux autres applications de l'optimisation sous-modulaire : la sélection de texte et le reclassement de passages. Les deux abordent le même défi central : la sélection optimale de sous-ensembles, que tout système de type DeepResearch doit résoudre.
Les documents du monde réel contiennent une redondance sémantique : chaque phrase n'a pas la même importance pour le raisonnement d'un LLM. Imaginez que vous avez un long document et que vous devez en extraire les informations les plus représentatives tout en respectant une limite de nombre de 词元. Il s'agit de la sélection de texte : choisir un contenu qui capture l'essence du document sous des contraintes de cardinalité. Nous voulons des sélections qui soient orthogonales les unes aux autres : minimiser les informations partagées tout en maximisant la couverture totale. Cela s'applique à plusieurs niveaux : sélectionner des phrases dans des documents ou des 词元 dans des phrases. On peut également considérer la sélection de texte comme une optimisation ou une compression du contexte. Nous réduisons la consommation de 词元 du LLM tout en préservant la richesse sémantique nécessaire au raisonnement.

Le reclassement de passages trie les passages candidats en fonction de leur pertinence sémantique par rapport à une requête utilisateur. Chez Jina AI, nous avons créé des 重排器 spécialisés pour cela (jina-reranker-m0, jina-reranker-v2-multilingual-base), bien que nos 向量模型 puissent également résoudre le problème. Mais voici la limite : la plupart des 重排器, y compris les nôtres, fonctionnent de manière ponctuelle. Ils notent les paires (query, document) individuelles indépendamment. Ils ne tiennent pas compte des informations partagées entre les passages : si le passage 1 et le passage 7 obtiennent tous deux un score élevé mais contiennent des informations principalement identiques, ne suffirait-il pas d'en sélectionner un seul ?

Dans DeepResearch, cela devient crucial. Lorsque les agents appellent des outils de recherche et collectent des extraits Web, nous devons déterminer quels extraits méritent un espace précieux dans la fenêtre de contexte pour la prochaine étape de raisonnement. La sélection suit le même principe de « minimiser le chevauchement, maximiser la couverture » que la sélection de texte, mais avec un objectif supplémentaire : la pertinence par rapport à la requête initiale doit être prioritaire.
De nombreux chercheurs reconnaissent l'importance croissante de l'ingénierie contextuelle, où nous devons construire, optimiser et « remplir correctement les fenêtres de contexte » (d'Andrej Karpathy) pour construire des flux de travail agentiques plus efficaces. Cependant, beaucoup se contentent d'utiliser des 提示词 LLM pour résoudre ces problèmes « en douceur » : aucune garantie, aucun fondement théorique, une efficacité douteuse. Nous pouvons faire beaucoup mieux.
Dans cet article, je vais montrer que la sélection de texte et le reclassement de passages cèdent tous deux à l'optimisation sous-modulaire, qui fournit des solutions rigoureuses. Si vous n'êtes pas familiarisé avec les fonctions sous-modulaires, pensez à « rendements décroissants ». Nous commençons par un ensemble vide et ajoutons de manière incrémentale le texte ou les passages sélectionnés. Chaque ajout apporte une valeur ajoutée, mais l'avantage marginal diminue, ce qui traduit l'idée que les sélections diversifiées et non redondantes sont les plus intéressantes. Formellement, une fonction est sous-modulaire si pour tous les ensembles et l'élément :
Cette formulation capture parfaitement notre intuition : nous voulons que les éléments sélectionnés couvrent collectivement l'espace sémantique de l'ensemble du document. Au fur et à mesure que nous sélectionnons des unités, chaque nouvelle unité est moins susceptible de couvrir un espace sémantique précédemment non couvert.
tagSélection de texte via l'optimisation sous-modulaire
Premièrement, utilisation de la fonction multi-vectorielle de jina-embeddings-v4 pour extraire les 向量模型 au niveau du 词元 d'un passage, puis application de l'optimisation sous-modulaire pour sélectionner les 词元 qui offrent la meilleure couverture, enfin, appel du tokenizer et conversion des sélections en chaînes à leurs positions d'origine. positions. Considérez cela comme une forme de « compression » : vous pouvez régler le curseur top-k pour composer différents « taux de compression ». Pouvez-vous encore comprendre le texte compressé ?

Implémentation de la sélection de texte avec optimisation sous-modulaire.
Commençons par résoudre le problème de la sélection de texte, car il est essentiel pour comprendre la sous-modularité et sert d'étape préliminaire au reclassement des passages. Le problème est le suivant :
Étant donné un document avec éléments (jetons ou phrases), nous voulons sélectionner un sous-ensemble avec qui maximise la fonction de couverture :
où représente la similarité cosinus entre les 向量模型 des éléments et . Notez que la fonction de couverture est sous-modulaire car elle satisfait la propriété des rendements décroissants. L'opération max garantit que nous mesurons la qualité de la représentation de chaque élément par l'unité sélectionnée la plus proche, en évitant de compter deux fois les informations redondantes.
tagObtenir les 向量模型 au niveau des jetons/passages
Pour la sélection au niveau des jetons, nous exploitons la nouvelle capacité d'intégration multi-vecteurs de jina-embeddings-v4. Le réglage de return_multivector=True renvoie un 向量模型 par jeton, ce qui permet notre sélection au niveau des sous-mots.
Pour la sélection au niveau des passages, nous divisons simplement les documents par la ponctuation ou les sauts de ligne et intégrons chaque passage indépendamment. Alternativement, on peut aussi appeler notre API avec un chunking tardif pour obtenir des 向量模型 de passage contextuels, ce qui conduit généralement à de meilleures performances dans les tâches en aval.

Il est important de noter que, puisque nous mesurons la similarité sémantique au sein d'un ensemble homogène d'éléments — tous servant le même rôle fonctionnel plutôt que de comparer des éléments hétérogènes comme des requêtes à des documents (comme nous le verrons dans le reclassement des passages) — nous invoquons jina-embeddings-v4 avec l'adaptateur LoRA text-matching activé.

Depuis jina-embeddings-v3, nos modèles d'intégration ont été équipés de LoRA optimisés pour les tâches. Apprenez-en davantage sur les LoRA disponibles dans nos 向量模型 v4.
tagAlgorithme glouton paresseux
Comme dans l'article précédent, nous utilisons l'algorithme glouton paresseux pour résoudre le problème d'optimisation. Pour les fonctions sous-modulaires monotones, cet algorithme atteint une garantie d'approximation de — une limite qui est prouvée comme étant stricte. L'optimisation gloutonne paresseuse exploite deux propriétés fondamentales des fonctions sous-modulaires : les rendements décroissants et la préservation de l'ordre relatif entre les gains marginaux d'une itération à l'autre. L'algorithme fonctionne comme suit :
- Initialisation : Calculez les gains marginaux initiaux pour tous les éléments et stockez-les dans une file d'attente prioritaire.
- Évaluation paresseuse : À chaque itération, extrayez l'élément avec le gain mis en cache le plus élevé.
- Validation : Si le gain de cet élément a été calculé lors de l'itération en cours, sélectionnez-le immédiatement.
- Recalcul : Sinon, recalculez son gain marginal actuel et réinsérez-le dans la file d'attente.
Cet algorithme glouton paresseux réduit considérablement les frais généraux de calcul, en particulier lorsque les gains marginaux présentent une variance substantielle entre les éléments.
tagReclassement des passages via l'optimisation sous-modulaire

La tâche de reclassement des passages étend la sélection de texte en ajoutant un nouvel objectif : le sous-ensemble sélectionné doit être pertinent par rapport à la requête donnée. Alors que la sélection de texte optimise la diversité pure au sein d'un document, le reclassement des passages doit équilibrer la diversité par rapport à la pertinence de la requête. Voici les principales notations :
- est le sous-ensemble sélectionné d'indices de passage de l'ensemble de candidats de passages — tout le contenu ou les mémoires dans le système DeepResearch à une étape donnée. représente le sous-ensemble trié sur le volet que nous voulons reporter à l'étape de raisonnement suivante. Nous avons requêtes et passages candidats. Dans la recherche traditionnelle, , mais dans DeepResearch où les requêtes sont fréquemment reformulées et générées, nous pouvons avoir plusieurs requêtes à portée de main.
- est la similarité entre les passages et . Cela utilise la similarité cosinus de jina-embeddings-v4 avec la tâche "text-matching" LoRA activée pour tous les passages comme nous l'avons fait dans la tâche de sélection de texte.
- est le score de pertinence entre la requête et le passage . Ceci est calculé comme la similarité cosinus en utilisant jina-embeddings-v4 avec
task="retrieval", prompt_name="query"pour les requêtes ettask="retrieval", prompt_name="passage"pour les passages, activant le LoRA de récupération asymétrique et produisant des 向量模型 hétérogènes.
Nous pouvons maintenant formuler ceci en utilisant deux fonctions sous-modulaires différentes, chacune capturant un compromis distinct entre la pertinence et la diversité.
tagFormulation de localisation des installations
Chaque passage est "couvert" par son passage sélectionné le plus similaire, pondéré par la pertinence de ce passage sélectionné par rapport à chaque requête. Cette formulation sélectionne des passages qui sont à la fois pertinents par rapport à la requête ET représentatifs de nombreux autres passages.
L'interaction multiplicative entre la pertinence de la requête () et la similarité du passage () crée des "hubs" — des passages qui servent un double objectif en tant que réponses pertinentes et représentants divers. Un passage très pertinent peut couvrir de nombreux passages similaires, tandis qu'un passage moins pertinent ne fournit une couverture que si aucun meilleur représentant n'existe.
tagFormulation de couverture saturée
Pour chaque passage, vous recevez un crédit égal au minimum de sa pertinence par rapport à la requête ou à la qualité de sa couverture par votre meilleur représentant sélectionné. Ceci encourage la sélection de passages qui peuvent "saturer" la pertinence de nombreux autres passages.
L'opération min crée un plafond de pertinence — vous ne pouvez pas obtenir plus de crédit de couverture que la pertinence inhérente d'un passage par rapport à la requête. Cette formulation est plus prudente, empêchant la sur-sélection de passages divers mais non pertinents.
Les deux fonctions sont monotones et sous-modulaires, ce qui permet d'utiliser le même algorithme glouton paresseux avec des garanties d'approximation de .
tagRésultats expérimentaux
Dans notre implémentation, nous utilisons Jina Reader pour extraire le texte brut de nos précédents articles de blog et évaluer différentes requêtes en utilisant le 重排器 de passage. Je recommande fortement aux lecteurs d'expérimenter avec notre notebook Google Colab en utilisant leurs propres articles — le contenu qu'ils connaissent le mieux fournira les idées les plus significatives.
Dans nos expériences, nous sélectionnons les 10 meilleurs passages de chaque document. Notez que les trois algorithmes — pertinence de la requête uniquement, localisation des installations et couverture saturée — présentent la monotonicité : la sélection d'un plus grand ne modifie pas le classement des premiers éléments. Par exemple, lors de la comparaison de , ou , les 9 premiers passages restent identiques pour toutes les valeurs. Les résultats sont présentés ci-dessous.




Voici quelques observations clés. Premièrement, les algorithmes d'optimisation sous-modulaire suivent de près les scores de pertinence des requêtes, mais introduisent des réorganisations stratégiques : les passages "montent et descendent" dans les classements. Ce comportement correspond à nos attentes, car ces algorithmes optimisent la minimisation de la redondance plutôt que la pertinence pure. Les classements qui en résultent démontrent une forte qualité.
Certains lecteurs peuvent remarquer que dans les premier, deuxième et quatrième exemples, les résultats de l'optimisation sous-modulaire semblent "saturer" rapidement, en affichant simplement les passages ordonnés 0, 1, 2, etc. Il ne s'agit pas d'un échec algorithmique, mais cela révèle l'une des caractéristiques les plus précieuses de l'optimisation sous-modulaire, qu'aucun des **Rerankers** existants n'est en mesure de promettre.
Pour mieux comprendre ce comportement de saturation, nous traçons les valeurs de la fonction sous-modulaire pour toutes les tailles d'ensemble possibles de 1 au nombre maximal de passages dans le document. Cela révèle la loi des rendements décroissants en action.


Les graphiques ci-dessus montrent comment les fonctions de localisation d'installations et de couverture saturée se comportent à mesure que nous augmentons la taille de la sélection. Les deux présentent le modèle sous-modulaire classique :
- Croissance initiale rapide : Les gains les plus importants se produisent lors des premières sélections.
- Rendements décroissants : Chaque passage supplémentaire offre un avantage marginal de plus en plus faible.
- Plateau de saturation : Les valeurs de la fonction s'aplatissent, ce qui indique un avantage minime des ajouts supplémentaires.
Au-delà de ces points, les gains marginaux deviennent négligeables. Cela explique pourquoi nos premières expériences de classement ont montré un ordre séquentiel (0, 1, 2, ...) - les algorithmes ont correctement identifié que les passages supplémentaires contribuent à une valeur minimale.
Ce comportement manifeste directement la propriété mathématique de la sous-modularité. Les gains marginaux décroissants que nous observons ne sont pas des artefacts algorithmiques, mais des caractéristiques fondamentales des fonctions de couverture. Lorsque la valeur de la fonction se stabilise, nous avons atteint le point où :
pour tous les passages restants .
tagConclusions
L'ingénierie contextuelle est devenue un mot à la mode dans l'IA, elle est fréquemment saluée comme un changement de paradigme vers la construction de systèmes agentiques qui sélectionnent les informations les plus pertinentes pour remplir la fenêtre de contexte d'un **LLM**, et cela commence souvent par la récupération de données externes via RAG.
La sélection de texte et le **Reranking** de passages sont des éléments essentiels de l'ingénierie contextuelle, en particulier dans les processus de sélection de base de connaissances, de récupération et de compression de contexte. Le **Reranking** de passages affine ensuite cela en réordonnant les textes sélectionnés en fonction de la pertinence de la requête afin de garantir que le **LLM** reçoit d'abord les informations les plus utiles, en évitant la surcharge et en améliorant la qualité de la sortie.
L'optimisation sous-modulaire offre trois avantages intéressants par rapport aux approches traditionnelles pour la sélection de texte et le **Reranking** de passages :
tagRigueur théorique et efficacité computationnelle
Contrairement aux méthodes heuristiques, l'optimisation sous-modulaire offre des garanties prouvables. L'algorithme glouton paresseux s'exécute en un temps —contre combinaisons pour une recherche exhaustive—tout en atteignant une approximation de la solution optimale. Cela signifie que notre solution est mathématiquement garantie d'être au moins 63 % aussi bonne que la meilleure sélection théoriquement possible. Aucune heuristique basée sur un Prompt ne peut promettre ce niveau d'assurance de performance.
tagCritères d'arrêt intelligents
Le comportement de saturation que nous avons observé fournit un mécanisme d'arrêt automatique : lorsque les gains marginaux approchent de zéro, nous savons qu'il faut cesser d'ajouter des éléments. Cette capacité est impossible à atteindre avec les **Rerankers** ponctuels ou par liste existants, qui fonctionnent indépendamment sur chaque élément sans comprendre les rendements décroissants au niveau de l'ensemble. La fonction elle-même nous indique quand nous avons obtenu une couverture suffisante.
tagExtension multi-requête
Le cadre s'étend naturellement aux scénarios multi-requêtes, courants dans DeepResearch où les requêtes sont fréquemment réécrites et reformulées. Les mêmes fondements théoriques et les mêmes algorithmes gloutons paresseux s'appliquent de manière transparente. Les approches basées sur des **Prompt** manquent de cette extensibilité systématique, nécessitant souvent des solutions ad hoc pour chaque nouveau scénario.
Ces avantages découlent des fondements mathématiques de la sous-modularité plutôt que d'astuces d'ingénierie. Alors que d'autres comptent sur le réglage des **Prompt** et espèrent de bons résultats, vous devriez apprendre l'optimisation sous-modulaire qui fournit un cadre basé sur des principes avec des garanties formelles, un avantage crucial lors de la construction d'une ingénierie contextuelle fiable et évolutive.








