LangChain dla Data Scientists w 2026: LLM, Agenci i Pytania Rekrutacyjne

Kompletny tutorial LangChain dla analityków danych. Poznaj LCEL, wzorce RAG, agentów ReAct oraz najczęstsze pytania na rozmowach kwalifikacyjnych z praktycznymi przykładami kodu Python.

LangChain dla Data Scientists w 2026: LLM, Agenci i Pytania Rekrutacyjne

LangChain 0.3 stał się standardowym frameworkiem do budowania aplikacji opartych na LLM w produkcyjnych procesach data science. Ten tutorial obejmuje podstawowe abstrakcje, architektury agentów oraz wzorce retrieval, które analitycy danych spotykają zarówno w rzeczywistych projektach, jak i na rozmowach technicznych.

LangChain w 2026

LangChain Expression Language (LCEL) umożliwia deklaratywną kompozycję łańcuchów ze streamingiem, równoległością i fallbackami. Opanowanie składni LCEL przed przejściem do agentów jest kluczowe—większość pytań rekrutacyjnych zakłada znajomość operatorów pipe i runnable'ów.

Zrozumienie Podstawowych Komponentów LangChain

LangChain organizuje orkiestrację LLM w cztery główne abstrakcje: Models, Prompts, Chains i Agents. Każda abstrakcja buduje na poprzedniej, tworząc kompozycyjny system dla złożonych procesów AI.

Warstwa Model opakowuje różnych dostawców LLM (OpenAI, Anthropic, modele lokalne) w jednolity interfejs. Ta abstrakcja pozwala na wymianę dostawców bez zmiany logiki aplikacji—kluczowe dla optymalizacji kosztów i elastyczności wobec vendorów.

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)

Jednolity interfejs oznacza, że pipeline'y danych mogą przełączać się między dostawcami w zależności od wymagań dotyczących kosztów, opóźnień lub możliwości.

Budowanie Łańcuchów ze Składnią Pipe LCEL

LangChain Expression Language zastępuje starą klasę LLMChain bardziej elastyczną składnią opartą na pipe'ach. Łańcuchy LCEL to runnable'e obsługujące streaming, batching i asynchroniczne wykonywanie domyślnie.

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)

Łańcuchy LCEL automatycznie obsługują konwersję typów między komponentami. Szablon promptu generuje PromptValue, który model konwertuje na odpowiedź, a parser strukturyzuje w schemat Pydantic.

Retrieval-Augmented Generation dla Aplikacji Data Science

Wzorce RAG wzbogacają odpowiedzi LLM o kontekst specyficzny dla domeny pobierany z baz wektorowych. W aplikacjach data science RAG umożliwia odpytywanie dokumentacji, poprzednich analiz lub baz wiedzy domenowej.

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?")

RunnablePassthrough zachowuje oryginalne pytanie, podczas gdy retriever pobiera kontekst równolegle. Ten wzorzec skaluje się do obciążeń produkcyjnych z minimalnym narzutem opóźnień.

Gotowy na rozmowy o Data Science & ML?

Ćwicz z naszymi interaktywnymi symulatorami, flashcards i testami technicznymi.

Implementacja Agentów ReAct dla Zadań Data Science

Agenci rozszerzają łańcuchy o możliwości wywoływania narzędzi i pętle rozumowania. Wzorzec ReAct (Reasoning + Acting) przeplata kroki myślenia i działania, umożliwiając agentom rozwiązywanie wieloetapowych problemów.

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")]
})

Dekorator @tool rejestruje funkcje jako narzędzia agenta z automatycznym generowaniem schematu z type hintów i docstringów. Agent decyduje, kiedy wywołać każde narzędzie na podstawie wymagań zadania.

Wzorce Pamięci dla Konwersacyjnej Analityki

Długotrwałe sesje analizy danych wymagają pamięci konwersacji, aby utrzymać kontekst między interakcjami. LangChain dostarcza wiele strategii pamięci zoptymalizowanych dla różnych przypadków użycia.

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

Wdrożenia produkcyjne zazwyczaj zastępują InMemoryChatMessageHistory magazynami opartymi na Redis lub PostgreSQL dla zachowania danych między restartami serwera.

Pytania i Odpowiedzi Rekrutacyjne LangChain

Rozmowy techniczne na stanowiska ML engineering i data science coraz częściej zawierają pytania o LangChain. Zazwyczaj oceniają zrozumienie podstawowych abstrakcji, kwestii produkcyjnych oraz strategii debugowania.

Popularne Tematy Rekrutacyjne

Rekruterzy koncentrują się na trzech obszarach: wzorcach kompozycji łańcuchów, technikach optymalizacji RAG i strategiach niezawodności agentów. Należy spodziewać się rysowania pipeline'u retrieval na tablicy lub debugowania scenariusza halucynacji.

P: Wyjaśnij różnicę między łańcuchami a agentami w LangChain.

Łańcuchy wykonują z góry określoną sekwencję operacji—prompt do modelu do parsera—bez podejmowania decyzji w czasie wykonania. Agenci dodają pętlę rozumowania, która dynamicznie wybiera narzędzia na podstawie pośrednich wyników. Łańcuchy sprawdzają się w strukturalnych przepływach pracy jak pipeline'y transformacji danych; agenci obsługują otwarte zadania wymagające adaptacyjnego wyboru narzędzi.

P: Jak zredukować halucynacje w aplikacji RAG?

Wiele strategii działa razem: zwiększenie precyzji retrieval przez wyszukiwanie hybrydowe (łączenie dense i sparse retrieverów), dodanie scoringu istotności do filtrowania chunków o niskiej pewności, włączenie atrybucji źródeł w promptach, implementacja weryfikacji odpowiedzi względem pobranego kontekstu oraz użycie niższych ustawień temperature dla zapytań faktycznych. Wzorce feature engineering dla jakości embeddingów również wpływają na dokładność retrieval.

P: Czym są runnable'e i dlaczego LangChain ich używa?

Runnable'e to bazowa abstrakcja implementująca protokół Runnable z metodami invoke, stream, batch i ainvoke. Każdy komponent—prompty, modele, parsery, retrievery—jest runnable'm. Ta jednolitość umożliwia kompozycję operatorem pipe, gdzie typy wyjściowe automatycznie pasują do oczekiwań wejściowych. Runnable'e zapewniają również wbudowaną równoległość, logikę retry i streaming bez dodatkowego kodu.

P: Jak zaimplementować streaming odpowiedzi dla interfejsu czatu?

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)

Metoda stream zwraca obiekty AIMessageChunk zawierające częściowe odpowiedzi. W aplikacjach webowych te chunki zazwyczaj są przekazywane do Server-Sent Events lub połączeń WebSocket.

P: Opisz strategie testowania aplikacji LangChain.

Testowanie aplikacji LLM wymaga wielu podejść: testy jednostkowe z mockowanymi odpowiedziami modelu dla deterministycznego zachowania łańcucha, testy integracyjne z prawdziwymi modelami dla skuteczności promptów, zbiory danych ewaluacyjnych z oczekiwanymi wynikami dla wykrywania regresji oraz narzędzia śledzenia jak LangSmith dla debugowania produkcyjnego. Mockowanie warstwy modelu podczas CI pozwala uniknąć kosztów API i niestabilności.

Kwestie Wdrożenia Produkcyjnego

Wdrażanie aplikacji LangChain wymaga uwagi na opóźnienia, koszty i niezawodność wykraczającej poza to, co ujawniają środowiska deweloperskie.

Zarządzanie Kosztami Tokenów

Produkcyjne aplikacje RAG mogą generować znaczne koszty tokenów. Należy zaimplementować middleware do liczenia tokenów, ustawić alerty budżetowe i rozważyć strategie cachowania dla powtarzających się zapytań. Pojedyncza pętla agenta z wieloma wywołaniami narzędzi może zużyć tysiące tokenów na żądanie.

Cachowanie redukuje zarówno opóźnienia, jak i koszty dla powtarzających się zapytań. Warstwa cachowania LangChain przechowuje odpowiedzi modelu z kluczem hash promptu:

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

Dla pipeline'ów MLOps warto zintegrować LangChain z śledzeniem eksperymentów w celu monitorowania wersji promptów, konfiguracji modeli i metryk jakości odpowiedzi w czasie.

Zacznij ćwiczyć!

Sprawdź swoją wiedzę z naszymi symulatorami rozmów i testami technicznymi.

Podsumowanie

  • LangChain 0.3 organizuje orkiestrację LLM w Models, Prompts, Chains i Agents—każda abstrakcja jest kompozycyjna przez składnię pipe LCEL
  • Implementacje RAG wymagają dostrojonych progów retrieval, scoringu istotności i formatowania kontekstu dla dokładności produkcyjnej
  • Agenci ReAct obsługują wieloetapowe zadania data science poprzez rozumowanie o wyborze narzędzi w czasie wykonania
  • Wzorce pamięci utrzymują kontekst konwersacji między sesjami analizy przy użyciu magazynów wiadomości z kluczem sesji
  • Przygotowanie do rozmów powinno obejmować rozróżnienie łańcuch vs agent, strategie redukcji halucynacji i wzorce kompozycji runnable'ów
  • Wdrożenia produkcyjne wymagają cachowania, budżetowania tokenów i narzędzi obserwowalności dla zarządzania kosztami i niezawodnością

Udostępnij

Powiązane artykuły