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.
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: strDe 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 keyAgentknooppunten 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 stageParallelle 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 checkpointUitvoer 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| researcherLangGraph-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.
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
- Waarom afzonderlijke agents tegen hun grenzen aanlopen
- Het orchestrator-subagentpatroon
- Multi-agentpijplijnen bouwen met LangGraph
- Gedeeld geheugen en communicatie tussen agents