AI Engineering Academy · Les

Multi-agentpijplijnen bouwen met LangGraph

Gebruik LangGraph om agentnodes, voorwaardelijke verbindingen en gedeelde status in een gerichte graaf te definiëren. Zo maakt u complexe multi-agentworkflows mogelijk met lussen, vertakkingen en controlepunten met een mens in de lus.

Les 3 van 413 stappen

Multi-agentpijplijnen bouwen met LangGraph is een gratis AI Engineering Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject AI Engineering Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus AI Engineering Academy bevat in totaal 4 lessen.

Wat is LangGraph?

LangGraph is een bibliotheek die boven op LangChain is gebouwd en waarmee je werkstromen met meerdere agents kunt definiëren als gerichte grafen. Knooppunten in de graaf stellen agents of verwerkingsstappen voor, randen stellen de stroom van de status tussen die knooppunten voor en voorwaardelijke randen maken dynamische routering mogelijk op basis van de huidige status. LangGraph verzorgt de uitvoeringsengine, het bewaren van de status en controlepunten voor mens-in-de-lus.

# pip install langgraph
from langgraph.graph import StateGraph, END
from typing import TypedDict, Annotated
import operator

# Define your shared state schema
class AgentState(TypedDict):
    messages: Annotated[list, operator.add]  # append-only list
    research: str
    draft: str
    status: str

De status definiëren in LangGraph

Elke LangGraph-werkstroom werkt met een gedeeld statusobject dat alle knooppunten kunnen lezen en schrijven. De status is een getypeerd woordenboek (TypedDict) dat gegevens door de graaf voert. Wanneer een knooppunt wordt uitgevoerd, ontvangt het de huidige status, voert het zijn werk uit en geeft het een woordenboek met updates terug die in de status worden samengevoegd. Dankzij dit model met gedeelde status kunnen agents communiceren zonder directe koppeling.

from typing import TypedDict

class ResearchState(TypedDict):
    query: str           # input from user
    research_notes: str  # filled by researcher node
    written_draft: str   # filled by writer node
    review_feedback: str # filled by reviewer node
    final_output: str    # filled by synthesizer node
    iteration_count: int # tracks how many revision loops occurred

# Each node returns a PARTIAL update - only the keys it modifies
def researcher_node(state: ResearchState) -> dict:
    notes = do_research(state['query'])
    return {'research_notes': notes}  # only update this key

Agentknooppunten maken

In LangGraph is elke agent een knooppuntfunctie die de huidige status ontvangt, de aanroep van het LLM en de uitvoering van tools uitvoert en een statusupdate teruggeeft. Knooppunten zijn pure functies: ze slaan geen interne status op. Alle status bevindt zich in het gedeelde statusobject van de graaf, waardoor de werkstroom eenvoudig te inspecteren, hervatten en debuggen is.

from langchain_openai import ChatOpenAI
from langchain_core.messages import SystemMessage, HumanMessage

llm = ChatOpenAI(model='gpt-4o')

def researcher_node(state: ResearchState) -> dict:
    messages = [
        SystemMessage(content='You are a research specialist. Find accurate information.'),
        HumanMessage(content=f'Research this topic: {state["query"]}')
    ]
    response = llm.invoke(messages)
    return {'research_notes': response.content}

def writer_node(state: ResearchState) -> dict:
    messages = [
        SystemMessage(content='You are a technical writer. Write clear, engaging prose.'),
        HumanMessage(content=f'Write a draft using these notes:\n{state["research_notes"]}')
    ]
    response = llm.invoke(messages)
    return {'written_draft': response.content}

De graaf bouwen met StateGraph

Nadat je de knooppuntfuncties hebt gedefinieerd, verbind je ze met StateGraph. Je voegt knooppunten toe met graph.add_node(), voegt randen ertussen toe met graph.add_edge(), stelt het ingangspunt in met graph.set_entry_point() en compileert de graaf tot een uitvoerbaar object met graph.compile(). De gecompileerde graaf is een uitvoerbaar object dat een beginstatus accepteert en de eindstatus teruggeeft.

from langgraph.graph import StateGraph, END

# Build the graph
workflow = StateGraph(ResearchState)

# Add nodes
workflow.add_node('researcher', researcher_node)
workflow.add_node('writer', writer_node)
workflow.add_node('reviewer', reviewer_node)

# Add edges (sequential pipeline)
workflow.set_entry_point('researcher')
workflow.add_edge('researcher', 'writer')
workflow.add_edge('writer', 'reviewer')
workflow.add_edge('reviewer', END)

# Compile into an executable
app = workflow.compile()

# Run it
result = app.invoke({'query': 'What is RAG?', 'iteration_count': 0})
print(result['written_draft'])

Voorwaardelijke randen voor dynamische routering

Voorwaardelijke randen zorgen ervoor dat de graaf op basis van de huidige status naar verschillende knooppunten kan routeren. In plaats van een vaste rand geef je een routeringsfunctie die de status inspecteert en de naam van het volgende knooppunt teruggeeft. Hiermee kun je revisielussen, kwaliteitscontroles, goedkeuringsstappen door mensen en vertakkingen op basis van de inhoud van agentuitvoer realiseren.

def should_revise(state: ResearchState) -> str:
    '''Router function: returns the name of the next node.'''
    if state['iteration_count'] >= 3:
        return 'finalize'  # Too many revisions - accept as is
    if 'insufficient' in state.get('review_feedback', '').lower():
        return 'researcher'  # Need more research
    if 'rewrite' in state.get('review_feedback', '').lower():
        return 'writer'  # Needs rewriting
    return 'finalize'  # Looks good

# Add conditional edge from reviewer
workflow.add_conditional_edges(
    'reviewer',                    # from node
    should_revise,                 # routing function
    {
        'researcher': 'researcher', # route name -> node name
        'writer': 'writer',
        'finalize': 'finalizer'
    }
)

Lussen en iteratie in LangGraph

LangGraph ondersteunt van nature lussen: een agent kan meerdere keren opnieuw worden uitgevoerd. Dit is essentieel voor revisierondes, patronen waarbij na een fout opnieuw wordt geprobeerd en iteratieve verfijning. Neem altijd een voorwaarde voor het beëindigen van de lus op in je status, zoals een iteratieteller of een drempelwaarde voor een kwaliteitsscore, en dwing deze af in je router voor voorwaardelijke randen om oneindige lussen te voorkomen.

def researcher_node(state: ResearchState) -> dict:
    notes = do_research(state['query'])
    return {
        'research_notes': notes,
        'iteration_count': state['iteration_count'] + 1  # always increment
    }

def should_continue_research(state: ResearchState) -> str:
    # Terminate loop after 3 iterations regardless of quality
    if state['iteration_count'] >= 3:
        return END
    # Continue if research is incomplete
    if len(state.get('research_notes', '')) < 500:
        return 'researcher'  # loop back
    return 'writer'  # proceed to next stage

Parallelle uitvoering van knooppunten

LangGraph ondersteunt parallelle vertakkingen met RunnableParallel binnen een knooppunt of door naar meerdere knooppunten uit te waaieren. Wanneer onafhankelijke subtaken tegelijkertijd moeten worden uitgevoerd, kun je vanuit één knooppunt vertakken naar meerdere parallelle knooppunten en daarna een samenvoegknooppunt gebruiken dat op alle resultaten wacht en deze samenvoegt in de gedeelde status.

# Fan-out: one node triggers multiple parallel ones
workflow.add_edge('planner', 'researcher_a')
workflow.add_edge('planner', 'researcher_b')
workflow.add_edge('planner', 'researcher_c')

# Fan-in: aggregator waits for all three
workflow.add_edge('researcher_a', 'aggregator')
workflow.add_edge('researcher_b', 'aggregator')
workflow.add_edge('researcher_c', 'aggregator')
workflow.add_edge('aggregator', 'writer')

# Aggregator merges parallel results
def aggregator_node(state: ResearchState) -> dict:
    combined = state.get('notes_a', '') + '\n' + state.get('notes_b', '') + '\n' + state.get('notes_c', '')
    return {'research_notes': combined}

Controlepunten en mens-in-de-lus

LangGraph ondersteunt het maken van controlepunten door integratie met een backend voor controlepunten (SQLite, Redis of PostgreSQL). Als controlepunten zijn ingeschakeld, wordt de status van de graaf na elke uitvoering van een knooppunt bewaard. Hierdoor kunnen langlopende werkstromen worden gepauzeerd, geïnspecteerd en hervat. Ook worden patronen met mens-in-de-lus mogelijk, waarbij de graaf bij een specifiek knooppunt pauzeert en wacht tot een mens goedkeuring geeft of invoer aanlevert voordat de uitvoering doorgaat.

from langgraph.checkpoint.sqlite import SqliteSaver

# Use SQLite for persistent checkpoints
checkpointer = SqliteSaver.from_conn_string(':memory:')
app = workflow.compile(checkpointer=checkpointer, interrupt_before=['human_review'])

# First run - pauses at human_review node
thread = {'configurable': {'thread_id': 'my-workflow-1'}}
result = app.invoke({'query': 'Analyze competitors'}, config=thread)
# result.next == 'human_review' -- waiting for human input

# Human provides feedback and resumes
app.update_state(thread, {'review_feedback': 'Good research, proceed with writing'})
final = app.invoke(None, config=thread)  # resume from checkpoint

Uitvoer van LangGraph streamen

LangGraph ondersteunt de modus streaming, waarbij tussentijdse statusupdates worden uitgegeven zodra elk knooppunt is voltooid, in plaats van te wachten tot de hele werkstroom is afgelopen. Dit is nuttig voor lange pijplijnen waarin je de gebruiker gedeeltelijke voortgang wilt tonen. Gebruik app.stream() om een iterator met statusmomentopnamen van elke stap te krijgen.

# Stream intermediate results as each node completes
for event in app.stream({'query': 'What is RAG?'}):
    for node_name, node_output in event.items():
        print(f'Node completed: {node_name}')
        if 'research_notes' in node_output:
            print('Research done:', node_output['research_notes'][:100])
        if 'written_draft' in node_output:
            print('Draft done:', node_output['written_draft'][:100])

De graaf visualiseren

LangGraph kan de graaf tekenen als een Mermaid-diagram. Dat is onmisbaar om complexe werkstromen met veel knooppunten en voorwaardelijke randen te begrijpen. Roep app.get_graph().draw_mermaid_png() aan voor een PNG-afbeelding, of app.get_graph().draw_mermaid() voor de Mermaid-syntaxis die je in elke Mermaid-renderer kunt plakken.

# Visualize the workflow graph
graph_image = app.get_graph().draw_mermaid_png()
with open('workflow.png', 'wb') as f:
    f.write(graph_image)

# Or print Mermaid syntax
print(app.get_graph().draw_mermaid())
# Outputs:
# graph TD
#    __start__ --> researcher
#    researcher --> writer
#    writer --> reviewer
#    reviewer -->|Good| finalize
#    reviewer -->|Needs work| researcher

LangGraph-agentvoorbeeld van begin tot eind

Alles samengevoegd: een complete pijplijn met meerdere LangGraph-agents definieert een status van het type TypedDict, maakt knooppuntfuncties voor elke agent, verbindt deze met StateGraph, voegt voorwaardelijke randen toe voor revisielussen, compileert de graaf met een controlepuntbeheerder en start de uitvoering met een beginstatus. Zo krijg je met minimale extra code een robuuste, observeerbare en hervatbare werkstroom met meerdere agents.

Korte toets

Toets je begrip van pijplijnen met meerdere LangGraph-agents uit deze les.

Samenvatting van de les

In deze les heb je geleerd dat LangGraph werkstromen met meerdere agents voorstelt als gerichte grafen waarin knooppunten agents zijn en randen de stroom aangeven, dat voorwaardelijke randen dynamische routering, lussen en revisierondes op basis van de huidige status mogelijk maken, en dat het maken van controlepunten langlopende werkstromen laat pauzeren en hervatten met goedkeuring door een mens-in-de-lus. Hierna verkennen we gedeeld geheugen en communicatie tussen agents.

Gratis beginnen

Leer Python met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
30
Lessen
120

Veelgestelde vragen

Is de les “Multi-agentpijplijnen bouwen met LangGraph” gratis?

Ja — de volledige tekst van “Multi-agentpijplijnen bouwen met LangGraph” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus AI Engineering Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus AI Engineering Academy bevat in totaal 4 lessen.

Wat leer ik in “Multi-agentpijplijnen bouwen met LangGraph”?

Gebruik LangGraph om agentnodes, voorwaardelijke verbindingen en gedeelde status in een gerichte graaf te definiëren. Zo maakt u complexe multi-agentworkflows mogelijk met lussen, vertakkingen en con… Je oefent met AI Engineering Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met AI Engineering Academy te beginnen?

Ervaring vooraf is niet nodig. AI Engineering Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Multi-agentpijplijnen bouwen met LangGraph”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over AI Engineering Academy?

Ja. Elke les over AI Engineering Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Waarom afzonderlijke agents tegen hun grenzen aanlopen
  2. Het orchestrator-subagentpatroon
  3. Multi-agentpijplijnen bouwen met LangGraph
  4. Gedeeld geheugen en communicatie tussen agents
← Terug naar AI Engineering Academy