Suddividere dati esterni per il recupero

Sviluppare applicazioni LLM con LangChain

Jonathan Bennion

AI Engineer & LangChain Contributor

Fasi di sviluppo RAG

Il flusso RAG generale: un loader di documenti, uno splitter di documenti e i processi di storage e retrieval.

  • Suddivisione documenti: dividi in chunk
  • Spezza i documenti per rientrare nella context window dell’LLM
Sviluppare applicazioni LLM con LangChain

Pensare alla suddivisione...

Il primo paragrafo dell’introduzione dell’articolo Attention is All You Need.

Riga 1:

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

Riga 2:

in particular, have been firmly established as state of the art approaches in sequence modeling and
1 https://arxiv.org/abs/1706.03762
Sviluppare applicazioni LLM con LangChain

Sovrapposizione dei chunk

Il primo paragrafo dell’introduzione dell’articolo Attention is All You Need diviso in due chunk con sovrapposizione.

Sviluppare applicazioni LLM con LangChain

Qual è la migliore strategia di suddivisione?

La parola "context" suddivisa in singole lettere.

 

  1. CharacterTextSplitter
  2. RecursiveCharacterTextSplitter
  3. Molti altri
1 Wikipedia Commons
Sviluppare applicazioni LLM con LangChain
quote = '''One machine can do the work of fifty ordinary humans.\nNo machine can do
the work of one extraordinary human.'''
len(quote)
103
chunk_size = 24
chunk_overlap = 3
1 Elbert Hubbard
Sviluppare applicazioni LLM con 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]
  • Dividi sul separatore per restare < chunk_size, ma potrebbe non riuscire!
Sviluppare applicazioni LLM con LangChain
from langchain_text_splitters import RecursiveCharacterTextSplitter


rc_splitter = RecursiveCharacterTextSplitter( separators=["\n\n", "\n", " ", ""], chunk_size=chunk_size, chunk_overlap=chunk_overlap)
docs = rc_splitter.split_text(quote) print(docs)
Sviluppare applicazioni LLM con 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. Prova a dividere per paragrafo: "\n\n"
  2. Prova a dividere per frase: "\n"
  3. Prova a dividere per parole: " "
Sviluppare applicazioni LLM con LangChain

RecursiveCharacterTextSplitter con 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 [...]
Sviluppare applicazioni LLM con LangChain

Ayo berlatih!

Sviluppare applicazioni LLM con LangChain

Preparing Video For Download...