LangChain für Data Scientists 2026: LLMs, Agents und Interview-Fragen

LangChain 0.3 für Data Science beherrschen: LCEL-Chains, RAG-Muster, ReAct-Agents und Memory-Systeme. Inklusive Interview-Fragen und Produktions-Deployment-Strategien.

LangChain für Data Scientists Tutorial Diagramm

LangChain 0.3 hat sich als De-facto-Framework für die Entwicklung LLM-gestützter Anwendungen in produktiven Data-Science-Workflows etabliert. Dieses Tutorial behandelt die zentralen Abstraktionen, Agent-Architekturen und Retrieval-Muster, mit denen Data Scientists sowohl in realen Projekten als auch in technischen Interviews konfrontiert werden.

LangChain im Jahr 2026

LangChain Expression Language (LCEL) ermöglicht deklarative Chain-Komposition mit Streaming, Parallelisierung und Fallbacks. Die LCEL-Syntax sollte vor dem Einstieg in Agents beherrscht werden – die meisten Interview-Fragen setzen Vertrautheit mit Pipe-Operatoren und Runnables voraus.

Verständnis der LangChain-Kernkomponenten

LangChain organisiert die LLM-Orchestrierung in vier primäre Abstraktionen: Models, Prompts, Chains und Agents. Jede Abstraktion baut auf der vorherigen auf und schafft ein komponierbares System für komplexe KI-Workflows.

Die Model-Schicht umhüllt verschiedene LLM-Anbieter (OpenAI, Anthropic, lokale Modelle) hinter einer einheitlichen Schnittstelle. Diese Abstraktion ermöglicht den Wechsel zwischen Anbietern ohne Änderung der Anwendungslogik – entscheidend für Kostenoptimierung und Anbieterflexibilität.

python
# langchain_setup.py
from langchain_openai import ChatOpenAI
from langchain_anthropic import ChatAnthropic
from langchain_core.messages import HumanMessage, SystemMessage

# Initialize with specific model and temperature
openai_model = ChatOpenAI(
    model="gpt-4o",
    temperature=0.1,  # Lower temperature for deterministic outputs
    max_tokens=2048
)

# Anthropic model with same interface
anthropic_model = ChatAnthropic(
    model="claude-sonnet-4-20250514",
    temperature=0.1
)

# Both models accept identical message format
messages = [
    SystemMessage(content="You are a data science expert."),
    HumanMessage(content="Explain gradient boosting in one sentence.")
]

# Swap models without changing message structure
response = openai_model.invoke(messages)

Die einheitliche Schnittstelle bedeutet, dass Datenpipelines basierend auf Kosten-, Latenz- oder Leistungsanforderungen zwischen Anbietern wechseln können.

Chains mit LCEL-Pipe-Syntax erstellen

LangChain Expression Language ersetzt die veraltete LLMChain-Klasse durch eine flexiblere Pipe-basierte Syntax. LCEL-Chains sind Runnables, die standardmäßig Streaming, Batching und asynchrone Ausführung unterstützen.

python
# lcel_chain.py
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser, JsonOutputParser
from pydantic import BaseModel, Field

# Define structured output schema
class DataInsight(BaseModel):
    metric: str = Field(description="The metric being analyzed")
    trend: str = Field(description="Upward, downward, or stable")
    confidence: float = Field(description="Confidence score 0-1")

# Create prompt template with variables
prompt = ChatPromptTemplate.from_messages([
    ("system", "Analyze the following data and extract insights."),
    ("human", "Dataset: {dataset_description}\nFocus on: {metric}")
])

# LCEL chain with pipe operator
model = ChatOpenAI(model="gpt-4o", temperature=0)
parser = JsonOutputParser(pydantic_object=DataInsight)

chain = prompt | model | parser  # Pipe syntax composes runnables

# Invoke with input dictionary
result = chain.invoke({
    "dataset_description": "Monthly sales data showing 15% increase",
    "metric": "revenue growth"
})
# Returns: DataInsight(metric='revenue growth', trend='upward', confidence=0.85)

LCEL-Chains handhaben automatisch die Typkonvertierung zwischen Komponenten. Das Prompt-Template gibt einen PromptValue aus, den das Modell in eine Antwort umwandelt, die der Parser in das Pydantic-Schema strukturiert.

Retrieval-Augmented Generation für Datenanwendungen

RAG-Muster verbessern LLM-Antworten mit domänenspezifischem Kontext, der aus Vektordatenbanken abgerufen wird. Für Data-Science-Anwendungen ermöglicht RAG die Abfrage von Dokumentation, früheren Analysen oder Domänenwissensbasen.

python
# rag_pipeline.py
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_chroma import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough

# Initialize embeddings and vector store
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma(
    collection_name="data_docs",
    embedding_function=embeddings,
    persist_directory="./chroma_db"
)

# Create retriever with relevance threshold
retriever = vectorstore.as_retriever(
    search_type="similarity_score_threshold",
    search_kwargs={"score_threshold": 0.7, "k": 4}
)

# RAG prompt with context injection
rag_prompt = ChatPromptTemplate.from_messages([
    ("system", """Answer based on the provided context only.
Context: {context}
If the context doesn't contain relevant information, say so."""),
    ("human", "{question}")
])

# Format documents into context string
def format_docs(docs):
    return "\n\n".join(doc.page_content for doc in docs)

# RAG chain with parallel retrieval
rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | rag_prompt
    | ChatOpenAI(model="gpt-4o", temperature=0)
)

# Query with automatic retrieval
answer = rag_chain.invoke("What normalization method works best for skewed distributions?")

Der RunnablePassthrough bewahrt die ursprüngliche Frage, während der Retriever parallel den Kontext abruft. Dieses Muster skaliert auf Produktions-Workloads mit minimalem Latenz-Overhead.

Bereit für deine Data Science & ML-Interviews?

Übe mit unseren interaktiven Simulatoren, Flashcards und technischen Tests.

ReAct-Agents für Datenaufgaben implementieren

Agents erweitern Chains um Tool-Calling-Fähigkeiten und Reasoning-Schleifen. Das ReAct-Muster (Reasoning + Acting) verschachtelt Denk- und Handlungsschritte, wodurch Agents mehrstufige Probleme lösen können.

python
# react_agent.py
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langgraph.prebuilt import create_react_agent
import pandas as pd
import numpy as np

# Define data analysis tools
@tool
def calculate_statistics(data: str, column: str) -> str:
    """Calculate descriptive statistics for a column in CSV data."""
    df = pd.read_csv(pd.io.common.StringIO(data))
    stats = df[column].describe()
    return stats.to_string()

@tool
def detect_outliers(data: str, column: str, method: str = "iqr") -> str:
    """Detect outliers using IQR or Z-score method."""
    df = pd.read_csv(pd.io.common.StringIO(data))
    values = df[column]
    
    if method == "iqr":
        q1, q3 = values.quantile([0.25, 0.75])
        iqr = q3 - q1
        outliers = values[(values < q1 - 1.5 * iqr) | (values > q3 + 1.5 * iqr)]
    else:  # z-score
        z_scores = np.abs((values - values.mean()) / values.std())
        outliers = values[z_scores > 3]
    
    return f"Found {len(outliers)} outliers: {outliers.tolist()[:10]}"

@tool
def correlation_analysis(data: str, col1: str, col2: str) -> str:
    """Calculate Pearson correlation between two columns."""
    df = pd.read_csv(pd.io.common.StringIO(data))
    corr = df[col1].corr(df[col2])
    return f"Correlation between {col1} and {col2}: {corr:.4f}"

# Create ReAct agent with tools
model = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [calculate_statistics, detect_outliers, correlation_analysis]

agent = create_react_agent(
    model=model,
    tools=tools,
    state_modifier="You are a data analyst. Use tools to analyze data step by step."
)

# Agent reasons about which tools to use
result = agent.invoke({
    "messages": [("human", "Analyze the sales column for outliers and basic stats")]
})

Der @tool-Decorator registriert Funktionen als Agent-Tools mit automatischer Schema-Generierung aus Type-Hints und Docstrings. Der Agent entscheidet basierend auf den Aufgabenanforderungen, wann jedes Tool aufgerufen wird.

Memory-Muster für konversationelle Analytik

Langlaufende Datenanalysesitzungen erfordern Konversations-Memory, um den Kontext über Interaktionen hinweg aufrechtzuerhalten. LangChain bietet mehrere Memory-Strategien, die für verschiedene Anwendungsfälle optimiert sind.

python
# memory_patterns.py
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.chat_history import InMemoryChatMessageHistory
from langchain_core.runnables.history import RunnableWithMessageHistory

# Initialize model and prompt with history placeholder
model = ChatOpenAI(model="gpt-4o", temperature=0.1)

prompt = ChatPromptTemplate.from_messages([
    ("system", "You are a data science assistant helping with analysis."),
    MessagesPlaceholder(variable_name="history"),  # Inject conversation history
    ("human", "{input}")
])

chain = prompt | model

# Session-based message store
message_stores = {}

def get_session_history(session_id: str):
    if session_id not in message_stores:
        message_stores[session_id] = InMemoryChatMessageHistory()
    return message_stores[session_id]

# Wrap chain with message history
chain_with_history = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key="input",
    history_messages_key="history"
)

# Conversation maintains context across invocations
config = {"configurable": {"session_id": "analysis_session_1"}}

response1 = chain_with_history.invoke(
    {"input": "I'm analyzing customer churn data with 50k rows"},
    config=config
)
# Later in the same session
response2 = chain_with_history.invoke(
    {"input": "What sampling strategy should I use for this dataset size?"},
    config=config
)  # Agent remembers the 50k rows context

Produktions-Deployments ersetzen typischerweise InMemoryChatMessageHistory durch Redis- oder PostgreSQL-gestützte Speicher für Persistenz über Server-Neustarts hinweg.

LangChain-Interview-Fragen und Antworten

Technische Interviews für ML-Engineering- und Data-Science-Positionen beinhalten zunehmend LangChain-Fragen. Diese bewerten typischerweise das Verständnis von Kernabstraktionen, Produktionsüberlegungen und Debugging-Strategien.

Häufige Interview-Themen

Interviewer konzentrieren sich auf drei Bereiche: Chain-Kompositionsmuster, RAG-Optimierungstechniken und Agent-Zuverlässigkeitsstrategien. Erwarten Sie, eine Retrieval-Pipeline auf dem Whiteboard zu entwerfen oder ein Halluzinationsszenario zu debuggen.

F: Erklären Sie den Unterschied zwischen Chains und Agents in LangChain.

Chains führen eine vorbestimmte Sequenz von Operationen aus – Prompt zu Modell zu Parser – ohne Laufzeitentscheidungen. Agents fügen eine Reasoning-Schleife hinzu, die dynamisch Tools basierend auf Zwischenergebnissen auswählt. Chains eignen sich für strukturierte Workflows wie Datentransformations-Pipelines; Agents handhaben offene Aufgaben, die adaptive Tool-Auswahl erfordern.

F: Wie reduzieren Sie Halluzinationen in einer RAG-Anwendung?

Mehrere Strategien wirken zusammen: Erhöhung der Retrieval-Präzision mit Hybrid-Suche (Kombination aus Dense- und Sparse-Retrievern), Hinzufügen von Relevanz-Scoring zum Filtern von Chunks mit niedriger Konfidenz, Einbeziehung von Quellenattribution in Prompts, Implementierung von Antwortverifikation gegen abgerufenen Kontext und Verwendung niedrigerer Temperature-Einstellungen für faktische Abfragen. Die Feature-Engineering-Muster für Embedding-Qualität beeinflussen ebenfalls die Retrieval-Genauigkeit.

F: Was sind Runnables und warum verwendet LangChain sie?

Runnables sind die Basisabstraktion, die das Runnable-Protokoll mit invoke, stream, batch und ainvoke-Methoden implementiert. Jede Komponente – Prompts, Modelle, Parser, Retriever – ist ein Runnable. Diese Einheitlichkeit ermöglicht Komposition mit dem Pipe-Operator, wobei Ausgabetypen automatisch zu Eingabeerwartungen passen. Runnables bieten auch integrierte Parallelisierung, Retry-Logik und Streaming ohne zusätzlichen Code.

F: Wie würden Sie Streaming-Antworten für eine Chat-Oberfläche implementieren?

python
# streaming_example.py
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

prompt = ChatPromptTemplate.from_template("Explain {concept} in detail")
model = ChatOpenAI(model="gpt-4o", streaming=True)

chain = prompt | model

# Stream yields chunks as they arrive
for chunk in chain.stream({"concept": "backpropagation"}):
    print(chunk.content, end="", flush=True)

Die stream-Methode liefert AIMessageChunk-Objekte mit partiellen Antworten. Für Webanwendungen werden diese Chunks typischerweise in Server-Sent Events oder WebSocket-Verbindungen eingespeist.

F: Beschreiben Sie Strategien zum Testen von LangChain-Anwendungen.

Das Testen von LLM-Anwendungen erfordert mehrere Ansätze: Unit-Tests mit gemockten Modellantworten für deterministisches Chain-Verhalten, Integrationstests mit echten Modellen für Prompt-Effektivität, Evaluierungsdatensätze mit erwarteten Ausgaben zur Regressionserkennung und Tracing-Tools wie LangSmith für Produktions-Debugging. Die Model-Schicht sollte während der CI gemockt werden, um API-Kosten und Flakiness zu vermeiden.

Überlegungen zum Produktions-Deployment

Das Deployment von LangChain-Anwendungen erfordert Aufmerksamkeit für Latenz, Kosten und Zuverlässigkeit über das hinaus, was Entwicklungsumgebungen offenbaren.

Token-Kostenmanagement

Produktions-RAG-Anwendungen können erhebliche Token-Kosten verursachen. Implementieren Sie Token-Zählung-Middleware, setzen Sie Budget-Alerts und erwägen Sie Caching-Strategien für wiederholte Abfragen. Eine einzelne Agent-Schleife mit mehreren Tool-Aufrufen kann Tausende von Tokens pro Anfrage verbrauchen.

Caching reduziert sowohl Latenz als auch Kosten für wiederholte Abfragen. Die Caching-Schicht von LangChain speichert Modellantworten, die nach Prompt-Hash verschlüsselt sind:

python
# caching_setup.py
from langchain_core.globals import set_llm_cache
from langchain_community.cache import RedisCache
import redis

# Redis cache for distributed deployments
redis_client = redis.Redis(host="localhost", port=6379)
set_llm_cache(RedisCache(redis_client))

# Subsequent identical queries hit cache
model = ChatOpenAI(model="gpt-4o")
response1 = model.invoke("What is gradient descent?")  # API call
response2 = model.invoke("What is gradient descent?")  # Cache hit

Für MLOps-Pipelines sollte LangChain mit Experiment-Tracking integriert werden, um Prompt-Versionen, Modellkonfigurationen und Antwortqualitätsmetriken über die Zeit zu überwachen.

Fang an zu üben!

Teste dein Wissen mit unseren Interview-Simulatoren und technischen Tests.

Fazit

  • LangChain 0.3 organisiert LLM-Orchestrierung in Models, Prompts, Chains und Agents – jede Abstraktion komponierbar über LCEL-Pipe-Syntax
  • RAG-Implementierungen erfordern abgestimmte Retrieval-Schwellenwerte, Relevanz-Scoring und Kontextformatierung für Produktionsgenauigkeit
  • ReAct-Agents handhaben mehrstufige Datenaufgaben durch Reasoning über Tool-Auswahl zur Laufzeit
  • Memory-Muster erhalten den Konversationskontext über Analysesitzungen hinweg mittels sitzungsbasierter Message-Stores
  • Interview-Vorbereitung sollte Chain-vs-Agent-Unterscheidungen, Halluzinations-Reduktionsstrategien und Runnable-Kompositionsmuster abdecken
  • Produktions-Deployments benötigen Caching, Token-Budgetierung und Observability-Tooling für Kosten- und Zuverlässigkeitsmanagement

Tags

#langchain
#llm
#data-science
#agents
#rag
#interview

Teilen

Verwandte Artikel