Convertisseur de documents

Le convertisseur de documents de LangChain fonctionne principalement pour segmenter le contenu du texte, en subdivisant un grand article en plusieurs fragments de contenu plus petits. Cela est fait parce que les modèles volumineux ont généralement des limites sur la longueur des invites et ne peuvent pas fournir tout le contenu à l'IA. Même si certains modèles volumineux permettent une longueur d'invite très longue, du point de vue du coût, il n'est pas pratique de transmettre un contenu aussi long à l'IA. Après tout, plus le contenu est long, plus le coût de l'appel API est élevé (même pour les modèles open-source déployés localement, un contenu plus long nécessite plus de mémoire GPU et une inférence plus lente). L'approche raisonnable est de concaténer des fragments de contenu pertinents en tant qu'informations de fond et d'invites lors de la demande du modèle IA.

LangChain dispose de nombreux convertisseurs de documents intégrés qui peuvent facilement diviser, combiner et filtrer le contenu des documents.

Diviseur de texte

Lors du traitement de grands blocs de texte, vous devez diviser le texte en morceaux. Bien que cela semble simple, il existe de nombreuses complexités potentielles ici. Idéalement, vous souhaitez conserver ensemble les segments de texte sémantiquement liés. Le terme "sémantiquement lié" ici peut dépendre du type de texte.

En gros, le diviseur de texte fonctionne comme suit :

  1. Diviser le texte en petits blocs sémantiquement significatifs (généralement des phrases).
  2. Commencez à combiner ces petits blocs en blocs plus grands jusqu'à atteindre une certaine taille (mesurée par une fonction).
  3. Une fois cette taille atteinte, traitez le bloc comme son propre segment de texte et commencez à créer un nouveau bloc de texte avec un certain chevauchement (pour maintenir le contexte entre les blocs).

Cela signifie que vous pouvez personnaliser le diviseur de texte le long de deux axes différents :

  1. Comment diviser le texte
  2. Comment mesurer la taille des blocs

Exemple

Le diviseur de texte recommandé par défaut est RecursiveCharacterTextSplitter. Ce diviseur de texte accepte une liste de caractères. Il tente de créer des blocs en fonction du premier caractère, mais si un bloc est trop grand, il continuera à passer au caractère suivant, et ainsi de suite. Par défaut, les caractères qu'il tente de diviser sont ["\\\\n\\\\n", "\\\\n", " ", ""].

En plus de contrôler les caractères pouvant être divisés, vous pouvez également contrôler plusieurs autres éléments :

  • length_function: Comment calculer la longueur d'un bloc. Par défaut, seuls le nombre de caractères est compté, mais les compteurs de jetons sont souvent transmis ici.
  • chunk_size: La taille maximale de vos blocs (mesurée par la fonction de longueur).
  • chunk_overlap: Le chevauchement maximal entre les blocs. Garder un certain chevauchement peut aider à maintenir la continuité entre les blocs (par exemple, en effectuant une fenêtre glissante).
  • add_start_index: Indique s'il faut inclure la position de départ de chaque bloc dans le document d'origine dans les métadonnées.
with open('../../state_of_the_union.txt') as f:
    state_of_the_union = f.read()
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size = 100,
    chunk_overlap  = 20,
    length_function = len,
    add_start_index = True,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])
page_content='..texte ignoré..' metadata={'start_index': 0}
    page_content='..texte ignoré..' metadata={'start_index': 82}

Autres Transformations :

Filtrer les documents redondants, traduire les documents, extraire les métadonnées, et plus encore

En plus de diviser les documents, nous pouvons également effectuer d'autres transformations sur le contenu du document. En utilisant EmbeddingsRedundantFilter, nous pouvons identifier des documents similaires et filtrer le contenu redondant. Grâce à des intégrations telles que doctran, nous pouvons effectuer des opérations telles que la traduction de documents d'une langue à une autre, l'extraction des propriétés requises et leur ajout aux métadonnées, et la conversion de conversations en un ensemble de documents formatés en questions / réponses.