Aufteilen externer Daten für den Abruf

Entwickeln von LLM-Anwendungen mit LangChain

Jonathan Bennion

AI Engineer & LangChain Contributor

RAG-Entwicklungsschritte

Der allgemeine RAG-Workflow: ein Dokumentenlader, ein Dokumentensplitter und der Speicher- und Abrufprozess.

  • Document splitting: Dokument in Chunks aufteilen
  • Dokumente so aufteilen, dass sie in das Kontextfenster eines LLM passen
Entwickeln von LLM-Anwendungen mit LangChain

Über eine Trennung nachdenken...

Der erste Absatz aus der Einleitung des Artikels „Attention is All You Need“ (Aufmerksamkeit ist alles, was du brauchst).

Zeile 1:

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

Zeile 2:

in particular, have been firmly established as state of the art approaches in sequence modeling and
1 https://arxiv.org/abs/1706.03762
Entwickeln von LLM-Anwendungen mit LangChain

Chunk-Überlappung

Der erste Absatz aus der Einleitung des Artikels „Attention is All You Need“ wurde in zwei Teile geteilt, wobei sich ein Teil überlappt.

Entwickeln von LLM-Anwendungen mit LangChain

Was ist die beste Strategie zum Aufteilen von Dokumenten?

Das Wort „Kontext“ in einzelne Buchstaben zerlegt.

 

  1. CharacterTextSplitter
  2. RecursiveCharacterTextSplitter
  3. Viele andere
1 Wikipedia Commons
Entwickeln von LLM-Anwendungen mit 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
Entwickeln von LLM-Anwendungen mit 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]
  • Aufteilung mit dem Trennzeichen damit < chunk_size, aber das klappt vielleicht nicht immer!
Entwickeln von LLM-Anwendungen mit 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)
Entwickeln von LLM-Anwendungen mit 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. Versuche, nach Absätzen aufzuteilen: "\n\n"
  2. Versuche, nach Sätzen aufzuteilen: "\n"
  3. Versuche, nach Wörtern aufzuteilen: " "
Entwickeln von LLM-Anwendungen mit LangChain

RecursiveCharacterTextSplitter mit 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 [...]
Entwickeln von LLM-Anwendungen mit LangChain

Lass uns üben!

Entwickeln von LLM-Anwendungen mit LangChain

Preparing Video For Download...