División de datos externos para su recuperación

Desarrollo de aplicaciones LLM con LangChain

Jonathan Bennion

AI Engineer & LangChain Contributor

Pasos del desarrollo de RAG

Flujo de trabajo general de RAG: un cargador de documentos, un divisor de documentos y el proceso de almacenamiento y recuperación.

  • División de documentos: dividir un documento en fragmentos
  • Divide los documentos para que quepan en la ventana de contexto de LLM
Desarrollo de aplicaciones LLM con LangChain

Hablando de separar...

El primer párrafo de la introducción del artículo «Attention is All You Need» (La atención es todo lo que necesitas).

Línea 1:

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

Línea 2:

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

Superposición de fragmentos

El primer párrafo de la introducción del artículo «Attention is All You Need» se ha dividido en dos fragmentos que se superponen.

Desarrollo de aplicaciones LLM con LangChain

¿Cuál es la mejor estrategia para dividir documentos?

La palabra «contexto» dividida en letras individuales.

 

  1. CharacterTextSplitter
  2. RecursiveCharacterTextSplitter
  3. Muchos otros
1 Wikipedia Commons
Desarrollo de aplicaciones LLM con 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
Desarrollo de aplicaciones 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]
  • Divide en separadores: <chunk_size, pero puede que no siempre funcione
Desarrollo de aplicaciones LLM con 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)
Desarrollo de aplicaciones 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. Intenta dividir por párrafos: "\n\n"
  2. Intenta dividir por frases: "\n"
  3. Intenta dividir por palabras: " "
Desarrollo de aplicaciones 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 [...]
Desarrollo de aplicaciones LLM con LangChain

¡Vamos a practicar!

Desarrollo de aplicaciones LLM con LangChain

Preparing Video For Download...