Wszystkie wpisy

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

3 min czytania
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

python
from 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.

Supervisor Pattern
Supervisor Pattern

Przykład w LangGraph

python
from 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

AspektChain (LangChain)Graph (LangGraph)
PrzepływLiniowy, sekwencyjnyNieliniowy, z cyklami
StanPrzekazywany między krokamiCentralny, współdzielony
DebugowanieProsteWymaga narzędzi (Studio)
ZłożonośćNiskaWysoka
Przypadki użyciaRAG, proste pipelinesMulti-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

python
from 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

python
from langgraph.prebuilt import create_react_agent

agent = create_react_agent(
    model=ChatOpenAI(),
    tools=[search_database],
    checkpointer=memory  # Persystencja stanu
)

3. Gdy potrzebujesz specjalizacji - Supervisor

python
from 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ść zadaniaRekomendacja
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

Potrzebujesz pomocy z architekturą AI? Napisz do mnie - pomogę wybrać odpowiednie podejście dla Twojego przypadku.