Multi-Agent vs Chains - kiedy graf, kiedy łańcuch?

Problem: który pattern wybrać?
Budujesz system AI i stoisz przed wyborem architektury. LangChain oferuje łańcuchy (chains) - sekwencyjne pipeliny. LangGraph daje grafy z cyklami i multi-agentami. Który wybrać?
Odpowiedź nie jest oczywista. Badania z końca 2025 roku pokazują, że więcej agentów nie zawsze oznacza lepsze wyniki. W zadaniach z ponad 10 narzędziami multi-agent systemy tracą 2-6x na wydajności względem pojedynczego agenta.
Chain (łańcuch) - sekwencyjne przetwarzanie
Jak działa?
Chain to DAG (Directed Acyclic Graph) - zadania wykonują się sekwencyjnie, bez pętli. Każdy krok przekazuje wynik do następnego.
Input → Retrieve → Process → Generate → Output
Przykład w LangChain
pythonfrom langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from langchain_core.output_parsers import StrOutputParser prompt = ChatPromptTemplate.from_template( "Podsumuj ten tekst: {text}" ) chain = prompt | ChatOpenAI() | StrOutputParser() result = chain.invoke({"text": "Długi dokument..."})
Kiedy chain wystarczy?
- RAG - retrieve → augment → generate
- Podsumowania - jeden dokument, jeden wynik
- Klasyfikacja - input → analiza → kategoria
- Transformacje - format A → format B
Graph (graf) - nieliniowe przepływy
Jak działa?
Graf pozwala na cykle, rozgałęzienia i dynamiczne decyzje. Agent może wrócić do poprzedniego kroku, wybrać inną ścieżkę, iterować do skutku.
Przykład w LangGraph
pythonfrom langgraph.graph import StateGraph, START, END from typing import TypedDict class State(TypedDict): messages: list next_agent: str def supervisor(state: State) -> dict: # Decyduje który agent ma działać return {"next_agent": "research"} def research_agent(state: State) -> dict: # Szuka informacji return {"messages": state["messages"] + ["Znalazłem dane..."]} def writer_agent(state: State) -> dict: # Generuje odpowiedź return {"messages": state["messages"] + ["Oto raport..."]} graph = StateGraph(State) graph.add_node("supervisor", supervisor) graph.add_node("research", research_agent) graph.add_node("writer", writer_agent) graph.add_edge(START, "supervisor") graph.add_conditional_edges("supervisor", lambda s: s["next_agent"]) graph.add_edge("research", "supervisor") graph.add_edge("writer", END) app = graph.compile()
Porównanie: Chain vs Graph
| Aspekt | Chain (LangChain) | Graph (LangGraph) |
|---|---|---|
| Przepływ | Liniowy, sekwencyjny | Nieliniowy, z cyklami |
| Stan | Przekazywany między krokami | Centralny, współdzielony |
| Debugowanie | Proste | Wymaga narzędzi (Studio) |
| Złożoność | Niska | Wysoka |
| Przypadki użycia | RAG, proste pipelines | Multi-agent, iteracje |
Supervisor Pattern - koordynacja agentów
W systemie multi-agent potrzebujesz koordynatora. Supervisor Pattern to architektura gdzie centralny agent decyduje który wyspecjalizowany agent powinien działać.
Kiedy Supervisor?
- Masz różne domeny - kalendarz, email, CRM, baza danych
- Każda domena ma złożoną logikę lub wiele narzędzi
- Potrzebujesz centralnej kontroli przepływu
Kiedy pojedynczy agent?
- Masz kilka prostych narzędzi
- Zadania są jednorodne
- Chcesz szybkiego prototypu
Badania: więcej agentów ≠ lepiej
Badania z 2025 roku (Stanford, Harvard, Google) pokazują zaskakujące wyniki:
Tool-heavy environments
W środowiskach z >10 narzędziami multi-agent systemy tracą 2-6x na wydajności. Overhead koordynacji przewyższa korzyści ze specjalizacji.
Financial analysis
Dla zadań finansowych scentralizowany multi-agent (supervisor + sub-agenty) dał wyniki o 80% lepsze niż pojedynczy agent. Ale niezależny multi-agent był tylko 57% lepszy.
Wniosek
"Efektywność multi-agent zależy od trade-offów między architekturą a charakterystyką zadania."
Kiedy wybrać co?
Zostań przy Chain gdy:
- Workflow jest liniowy i przewidywalny
- Potrzebujesz szybkiego MVP
- Masz prosty RAG lub summarization
- Zespół nie ma doświadczenia z grafami
Wybierz Graph gdy:
- Potrzebujesz pętli iteracyjnych (agent poprawia swoją pracę)
- Masz warunkowe rozgałęzienia (różne ścieżki dla różnych przypadków)
- Budujesz system multi-agent z wyspecjalizowanymi rolami
- Potrzebujesz checkpointów i wznowień
Unikaj multi-agent gdy:
- Masz dużo narzędzi (>10) w jednym agencie
- Zadania są homogeniczne
- Nie masz czasu na testowanie interakcji między agentami
Praktyczna ścieżka
1. Zacznij od pojedynczego agenta
pythonfrom langchain_openai import ChatOpenAI from langchain_core.tools import tool @tool def search_database(query: str) -> str: """Szuka w bazie danych.""" return f"Wyniki dla: {query}" llm = ChatOpenAI().bind_tools([search_database])
2. Gdy rośnie złożoność - dodaj LangGraph
pythonfrom langgraph.prebuilt import create_react_agent agent = create_react_agent( model=ChatOpenAI(), tools=[search_database], checkpointer=memory # Persystencja stanu )
3. Gdy potrzebujesz specjalizacji - Supervisor
pythonfrom langgraph.graph import StateGraph # Supervisor decyduje, agenci wykonują graph = StateGraph(State) graph.add_node("supervisor", supervisor_node) graph.add_node("researcher", research_agent) graph.add_node("writer", writer_agent)
Podsumowanie
| Złożoność zadania | Rekomendacja |
|---|---|
| Prosta (RAG, summary) | Chain (LangChain) |
| Średnia (iteracje, warunki) | Graph (LangGraph) |
| Wysoka (multi-domain) | Supervisor + sub-agenci |
| Bardzo wysoka (>10 tools) | Pojedynczy agent (!!) |
Nie komplikuj bez potrzeby. Pojedynczy dobrze skonfigurowany agent często wygrywa z armią źle skoordynowanych agentów.
Pogłęb temat
- LangGraph - Oficjalna dokumentacja
- LangChain - Getting Started
- Microsoft - Single vs Multi-Agent Architecture
- OpenAI - Best Practices for Agents
Potrzebujesz pomocy z architekturą AI? Napisz do mnie - pomogę wybrać odpowiednie podejście dla Twojego przypadku.