Lektion 2 von 6·11 Min Lesezeit

Chains & Retrieval

Chains sind das Herzstück von LangChain. Sie verbinden mehrere Verarbeitungsschritte zu einer Pipeline — von der Eingabe über Retrieval und Prompt-Aufbereitung bis zur LLM-Antwort. In Kombination mit Retrieval entstehen leistungsstarke RAG-Systeme.

Sequential Chains

Eine Sequential Chain führt Schritte nacheinander aus. Der Output eines Schritts wird zum Input des nächsten:

from langchain_core.runnables import RunnablePassthrough

chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | prompt
    | model
    | parser
)

Parallel Chains

Mit LCEL können Sie Chains parallel ausführen und die Ergebnisse zusammenführen:

from langchain_core.runnables import RunnableParallel

parallel = RunnableParallel(
    summary=summary_chain,
    keywords=keyword_chain,
    sentiment=sentiment_chain
)
result = parallel.invoke({"text": document})

Document Loaders

LangChain bietet Loader für diverse Datenquellen:

LoaderDatenquelle
PyPDFLoaderPDF-Dateien
CSVLoaderCSV-Dateien
WebBaseLoaderWebseiten
NotionDBLoaderNotion-Datenbanken
S3FileLoaderAWS S3 Buckets
GitLoaderGit-Repositories

Text Splitters

Dokumente müssen in Chunks aufgeteilt werden, bevor sie in eine Vektor-Datenbank geladen werden:

RecursiveCharacterTextSplitter

Der Standard-Splitter — versucht, an natürlichen Grenzen zu splitten (Absätze, Sätze, Wörter):

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    separators=["\n\n", "\n", " ", ""]
)
chunks = splitter.split_documents(documents)

Spezialisierte Splitter

  • MarkdownHeaderTextSplitter: Splittet an Markdown-Headern, behält Hierarchie
  • TokenTextSplitter: Splittet nach Token-Anzahl (präziser für LLM-Limits)
  • SemanticChunker: Splittet basierend auf semantischer Ähnlichkeit

Vector Store Integration

LangChain integriert mit allen gängigen Vektor-Datenbanken:

from langchain_community.vectorstores import Chroma
from langchain_openai import OpenAIEmbeddings

vectorstore = Chroma.from_documents(
    documents=chunks,
    embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})

RAG Chain zusammenbauen

rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | rag_prompt
    | model
    | StrOutputParser()
)

Praxis-Tipp: Chunk-Size und Overlap sind die wichtigsten RAG-Parameter. Starten Sie mit chunk_size=1000 und overlap=200. Testen Sie systematisch — kleine Änderungen können die Retrieval-Qualität drastisch verbessern.