Conversor de Documentos

O conversor de documentos da LangChain funciona principalmente para segmentar o conteúdo do texto, dividindo um grande artigo em vários fragmentos menores. Isso é feito porque os modelos grandes geralmente têm limites no comprimento dos prompts e não podem alimentar todo o conteúdo no AI. Mesmo que alguns modelos grandes permitam um comprimento de prompt muito grande, do ponto de vista do custo, não é prático passar um conteúdo tão longo para o AI. A abordagem razoável é concatenar os fragmentos relevantes do conteúdo como informações de fundo e prompts ao solicitar o modelo de AI.

A LangChain possui muitos conversores de documentos integrados que podem dividir, combinar e filtrar facilmente o conteúdo do documento.

Separador de Texto

Ao lidar com grandes blocos de texto, é necessário dividir o texto em partes. Embora pareça simples, existem muitas complexidades potenciais aqui. Idealmente, deseja-se manter segmentos de texto semanticamente relacionados juntos. O termo "semanticamente relacionado" aqui pode depender do tipo de texto.

Em um nível mais abrangente, o separador de texto funciona da seguinte forma:

  1. Dividir o texto em blocos pequenos e semanticamente significativos (geralmente frases).
  2. Começar a combinar esses blocos pequenos em blocos maiores até atingir um certo tamanho (medido por alguma função).
  3. Uma vez alcançado esse tamanho, tratar o bloco como seu próprio segmento de texto e começar a criar um novo bloco de texto com algum sobreposição (para manter o contexto entre os blocos).

Isso significa que é possível personalizar o separador de texto ao longo de dois eixos diferentes:

  1. Como dividir o texto
  2. Como medir o tamanho dos blocos

Exemplo

O separador de texto recomendado por padrão é o RecursiveCharacterTextSplitter. Este separador de texto aceita uma lista de caracteres. Ele tenta criar blocos com base no primeiro caractere, mas se algum bloco for muito grande, ele continuará passando para o próximo caractere, e assim por diante. Por padrão, os caracteres que ele tenta dividir são ["\\\\n\\\\n", "\\\\n", " ", ""].

Além de controlar quais caracteres podem ser divididos, também é possível controlar várias outras questões:

  • length_function: Como calcular o tamanho de um bloco. Por padrão, apenas o número de caracteres é contado, mas os contadores de tokens costumam ser passados aqui.
  • chunk_size: O tamanho máximo de seus blocos (medido pela função de comprimento).
  • chunk_overlap: A sobreposição máxima entre blocos. Manter alguma sobreposição pode ajudar a manter a continuidade entre os blocos (por exemplo, executando uma janela deslizante).
  • add_start_index: Se deve incluir a posição de início de cada bloco no documento original nos metadados.
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='..ignored text..' metadata={'start_index': 0}
    page_content='..ignored text..' metadata={'start_index': 82}

Outras Transformações

Filtragem de Documentos Redundantes, Tradução de Documentos, Extração de Metadados e Mais

Além de dividir documentos, também podemos realizar outras transformações no conteúdo do documento. Usando o EmbeddingsRedundantFilter, podemos identificar documentos semelhantes e filtrar conteúdo redundante. Através de integrações como doctran, podemos realizar operações como traduzir documentos de um idioma para outro, extrair as propriedades necessárias e adicioná-las aos metadados e converter conversas em um conjunto de documentos formatados de pergunta/resposta.