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:
- Dividir o texto em blocos pequenos e semanticamente significativos (geralmente frases).
- Começar a combinar esses blocos pequenos em blocos maiores até atingir um certo tamanho (medido por alguma função).
- 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:
- Como dividir o texto
- 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.