Divisão de dados externos para recuperação

Desenvolvimento de aplicativos de LLM com LangChain

Jonathan Bennion

AI Engineer & LangChain Contributor

Etapas de desenvolvimento do RAG

O fluxo de trabalho geral do RAG: um carregador de documentos, um divisor de documentos e o processo de armazenamento e recuperação.

  • Divisão de documentos: dividir documento em fragmentos
  • Dividir documentos para caberem na janela de contexto do LLM
Desenvolvimento de aplicativos de LLM com LangChain

Pensando em separar...

Primeiro parágrafo da introdução do artigo Attention is All You Need.

Linha 1:

Recurrent neural networks, long short-term memory [13] and gated recurrent [7] neural networks

Linha 2:

in particular, have been firmly established as state of the art approaches in sequence modeling and
1 https://arxiv.org/abs/1706.03762
Desenvolvimento de aplicativos de LLM com LangChain

Sobreposição de fragmentos

Primeiro parágrafo da introdução do artigo Attention is All You Need dividido em dois fragmentos, com uma sobreposição de fragmento.

Desenvolvimento de aplicativos de LLM com LangChain

Qual é a melhor maneira de dividir um documento?

A palavra “contexto” fragmentada em letras individuais.

 

  1. CharacterTextSplitter
  2. RecursiveCharacterTextSplitter
  3. Muitos outros
1 Wikipedia Commons
Desenvolvimento de aplicativos de LLM com LangChain
quote = '''One machine can do the work of fifty ordinary humans.
No machine can do
the work of one extraordinary human.'''
len(quote)
103
chunk_size = 24
chunk_overlap = 3
1 Elbert Hubbard
Desenvolvimento de aplicativos de LLM com LangChain
from langchain_text_splitters import CharacterTextSplitter


ct_splitter = CharacterTextSplitter( separator='.', chunk_size=chunk_size, chunk_overlap=chunk_overlap)
docs = ct_splitter.split_text(quote) print(docs)
print([len(doc) for doc in docs])
['One machine can do the work of fifty ordinary humans',
 'No machine can do the work of one extraordinary human']

[52, 53]
  • Divida no separador para ser < chunk_size; pode não funcionar sempre!
Desenvolvimento de aplicativos de LLM com LangChain
from langchain_text_splitters import RecursiveCharacterTextSplitter


rc_splitter = RecursiveCharacterTextSplitter( separators=[" ", " ", " ", ""], chunk_size=chunk_size, chunk_overlap=chunk_overlap)
docs = rc_splitter.split_text(quote) print(docs)
Desenvolvimento de aplicativos de LLM com LangChain

RecursiveCharacterTextSplitter

  • separators=["\n\n", "\n", " ", ""]
['One machine can do the',
 'work of fifty ordinary',
 'humans.',
 'No machine can do the',
 'work of one',
 'extraordinary human.']
  1. Tenta dividir por parágrafos: "\n\n"
  2. Tenta dividir por frases: "\n"
  3. Tenta dividir por palavras: " "
Desenvolvimento de aplicativos de LLM com LangChain

RecursiveCharacterTextSplitter com HTML

from langchain_community.document_loaders import UnstructuredHTMLLoader 
from langchain_text_splitters import RecursiveCharacterTextSplitter


loader = UnstructuredHTMLLoader("white_house_executive_order_nov_2023.html") data = loader.load()
rc_splitter = RecursiveCharacterTextSplitter( chunk_size=chunk_size, chunk_overlap=chunk_overlap, separators=['.'])
docs = rc_splitter.split_documents(data) print(docs[0])
Document(page_content="To search this site, enter a search term [...]
Desenvolvimento de aplicativos de LLM com LangChain

Vamos praticar!

Desenvolvimento de aplicativos de LLM com LangChain

Preparing Video For Download...