Convertidor de Documentos

El convertidor de documentos de LangChain tiene principalmente la función de segmentar el contenido del texto, dividiendo un artículo extenso en varios fragmentos de contenido más pequeños. Esto se hace porque los modelos grandes suelen tener límites en la longitud de las indicaciones y no pueden procesar todo el contenido para la IA. Incluso si algunos modelos grandes permiten una longitud de indicaciones muy grande, desde una perspectiva de costos, no es práctico pasar un contenido tan extenso a la IA. Después de todo, cuanto más extenso sea el contenido, mayor será el costo de la llamada a la API (incluso para modelos de código abierto implementados localmente, un contenido más extenso requiere más memoria de la GPU y una inferencia más lenta). El enfoque razonable es concatenar fragmentos de contenido relevantes como información de fondo y indicaciones al solicitar el modelo de IA.

LangChain tiene muchos convertidores de documentos integrados que pueden dividir, combinar y filtrar fácilmente el contenido del documento.

Separador de Texto

Al tratar con bloques grandes de texto, es necesario dividir el texto en fragmentos. Aunque suene simple, pueden surgir muchas complejidades potenciales. Idealmente, se desea mantener juntos los segmentos de texto semánticamente relacionados. El término "semánticamente relacionado" aquí puede depender del tipo de texto.

A grandes rasgos, el separador de texto funciona de la siguiente manera:

  1. Dividir el texto en bloques pequeños y significativos desde el punto de vista semántico (generalmente oraciones).
  2. Combinar estos bloques pequeños en bloques más grandes hasta alcanzar un cierto tamaño (medido por alguna función).
  3. Una vez alcanzado este tamaño, tratar el bloque como su propio segmento de texto y empezar a crear un nuevo bloque de texto con cierto solapamiento (para mantener el contexto entre bloques).

Esto significa que se puede personalizar el separador de texto a lo largo de dos ejes diferentes:

  1. Cómo dividir el texto
  2. Cómo medir el tamaño de los bloques

Ejemplo

El separador de texto recomendado por defecto es RecursiveCharacterTextSplitter. Este separador de texto acepta una lista de caracteres. Intenta crear bloques basados en el primer carácter, pero si algún bloque es demasiado grande, continuará moviéndose al siguiente carácter, y así sucesivamente. Por defecto, los caracteres que intenta dividir son ["\\n\\n", "\\n", " ", ""].

Además de controlar qué caracteres se pueden dividir, también se pueden controlar varios otros aspectos:

  • length_function: cómo calcular la longitud de un bloque. Por defecto, solo se cuenta el número de caracteres, pero a menudo se convierten los contadores de tokens aquí.
  • chunk_size: el tamaño máximo de sus bloques (medido por la función de longitud).
  • chunk_overlap: la superposición máxima entre bloques. Mantener cierta superposición puede ayudar a mantener la continuidad entre bloques (por ejemplo, realizar una ventana deslizante).
  • add_start_index: si incluir la posición de inicio de cada bloque en el documento original en los metadatos.
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])
contenido_página='..texto ignorado..' metadatos={'start_index': 0}
    contenido_página='..texto ignorado..' metadatos={'start_index': 82}

Otras Transformaciones

Filtrado de Documentos Redundantes, Traducción de Documentos, Extracción de Metadatos y Más

Además de dividir documentos, también podemos realizar otras transformaciones en el contenido del documento. Usando EmbeddingsRedundantFilter, podemos identificar documentos similares y filtrar contenido redundante. A través de integraciones como doctran, podemos realizar operaciones como traducir documentos de un idioma a otro, extraer las propiedades requeridas y agregarlas a los metadatos, y convertir conversaciones en un conjunto de documentos con formato de preguntas y respuestas.