Bygg multiagentpipelines med LangGraph
Använd LangGraph för att definiera agentnoder, villkorade kanter och delat tillstånd i en riktad graf, vilket möjliggör komplexa multiagentarbetsflöden med loopar, förgreningar och kontrollpunkter med människa i loopen.
Bygg multiagentpipelines med LangGraph är en gratis lektion i AI Engineering Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för AI Engineering Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI Engineering Academy innehåller totalt 4 lektioner.
Vad är LangGraph?
LangGraph är ett bibliotek som bygger ovanpå LangChain och låter dig definiera arbetsflöden med flera agenter som riktade grafer. Noderna i grafen representerar agenter eller bearbetningssteg, kanterna representerar hur tillståndet flödar mellan dem och villkorade kanter möjliggör dynamisk dirigering baserat på det aktuella tillståndet. LangGraph hanterar exekveringsmotorn, beständig lagring av tillstånd och kontrollpunkter med människa i loopen.
# 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: strDefiniera tillstånd i LangGraph
Varje LangGraph-arbetsflöde arbetar med ett gemensamt tillståndsobjekt som alla noder kan läsa och skriva till. Tillståndet är en typad ordlista (TypedDict) som transporterar data genom grafen. När en nod körs tar den emot det aktuella tillståndet, utför sitt arbete och returnerar en ordlista med uppdateringar som slås samman med tillståndet. Den här modellen med delat tillstånd gör det möjligt för agenter att kommunicera utan direkt koppling till varandra.
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 keySkapa agentnoder
I LangGraph är varje agent en nodfunktion som tar emot det aktuella tillståndet, utför sitt LLM-anrop och sina verktygskörningar och returnerar en tillståndsuppdatering. Noder är rena funktioner – de lagrar inget internt tillstånd. Allt tillstånd finns i det gemensamma grafens tillståndsobjekt, vilket gör arbetsflödet enkelt att inspektera, återuppta och felsöka.
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}Bygg grafen med StateGraph
När du har definierat nodfunktionerna kopplar du ihop dem med StateGraph. Du lägger till noder med graph.add_node(), lägger till kanter mellan dem med graph.add_edge(), anger startpunkten med graph.set_entry_point() och kompilerar grafen till ett körbart objekt med graph.compile(). Den kompilerade grafen är ett körbart objekt som tar emot ett initialt tillstånd och returnerar det slutliga tillståndet.
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'])Villkorade kanter för dynamisk dirigering
Villkorade kanter gör att grafen kan dirigera till olika noder baserat på det aktuella tillståndet. I stället för en fast kant anger du en dirigeringsfunktion som granskar tillståndet och returnerar namnet på nästa nod. Det möjliggör granskningsloopar, kvalitetskontroller, steg för mänskligt godkännande och förgrening baserad på innehållet i agenternas utdata.
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'
}
)Loopar och iteration i LangGraph
LangGraph har inbyggt stöd för loopar – en agent kan besökas flera gånger. Det är viktigt för granskningscykler, mönster för nya försök vid fel och iterativ förfining. Inkludera alltid ett villkor för att avsluta loopen i tillståndet (till exempel en iterationsräknare eller en tröskel för kvalitetsvärdet) och tillämpa det i den villkorade kantens dirigerare för att förhindra oändliga loopar.
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 stageParallell körning av noder
LangGraph har stöd för parallella grenar med RunnableParallel i en nod eller genom att förgrena till flera noder. När oberoende deluppgifter behöver köras samtidigt kan du skapa en förgrening från en nod till flera parallella noder och sedan en sammanslagningsnod som väntar på alla och slår samman deras resultat i det gemensamma tillståndet.
# 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}Kontrollpunkter och människa i loopen
LangGraph har stöd för kontrollpunkter genom integrering med en backend för kontrollpunkter (SQLite, Redis eller PostgreSQL). När kontrollpunkter är aktiverade sparas graftillståndet efter varje nodkörning. Det gör det möjligt att pausa, inspektera och återuppta långvariga arbetsflöden. Det möjliggör även mönster med människa i loopen, där grafen pausas vid en viss nod och väntar på att en människa ska godkänna eller ange indata innan den fortsätter.
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 checkpointStrömma utdata från LangGraph
LangGraph har stöd för läget strömning, som skickar ut mellanliggande tillståndsuppdateringar när varje nod blir klar, i stället för att vänta tills hela arbetsflödet är färdigt. Det är värdefullt för långa pipelines där du vill visa delvisa framsteg för användaren. Använd app.stream() för att få en iterator med tillståndsögonblicksbilder från varje steg.
# 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])Visualisera grafen
LangGraph kan rita grafen som ett Mermaid-diagram, vilket är ovärderligt för att förstå komplexa arbetsflöden med många noder och villkorade kanter. Anropa app.get_graph().draw_mermaid_png() för att få en PNG-bild eller app.get_graph().draw_mermaid() för Mermaid-syntaxen som du kan klistra in i valfri Mermaid-renderare.
# 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-agentexempel från början till slut
Om vi sätter ihop allt: en komplett fleragentspipeline i LangGraph definierar ett TypedDict-tillstånd, skapar nodfunktioner för varje agent, kopplar ihop dem med StateGraph, lägger till villkorade kanter för granskningsloopar, kompilerar med en kontrollpunktshanterare och anropar grafen med ett initialt tillstånd. Det ger dig ett robust, observerbart och återupptagbart fleragentsarbetsflöde med minimal mängd standardkod.
Snabbkontroll
Testa din förståelse av fleragentspipelines i LangGraph från den här lektionen.
Sammanfattning av lektionen
I den här lektionen har du lärt dig att LangGraph representerar fleragentsarbetsflöden som riktade grafer där noder är agenter och kanter visar flödet, att villkorade kanter möjliggör dynamisk dirigering, loopar och granskningscykler baserat på det aktuella tillståndet och att kontrollpunkter gör det möjligt för långvariga arbetsflöden att pausas och återupptas med mänskligt godkännande i loopen. Härnäst utforskar vi delat minne och kommunikation mellan agenter.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Bygg multiagentpipelines med LangGraph” gratis?
Ja – hela texten till ”Bygg multiagentpipelines med LangGraph” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i AI Engineering Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i AI Engineering Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Bygg multiagentpipelines med LangGraph”?
Använd LangGraph för att definiera agentnoder, villkorade kanter och delat tillstånd i en riktad graf, vilket möjliggör komplexa multiagentarbetsflöden med loopar, förgreningar och kontrollpunkter me… Ni övar på AI Engineering Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig AI Engineering Academy?
Du behöver inga förkunskaper. Utbildningen i AI Engineering Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Bygg multiagentpipelines med LangGraph”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här AI Engineering Academy-lektionen?
Ja. Varje AI Engineering Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Varför enskilda agenter når en gräns
- Orkestrator-underagent-mönstret
- Bygg multiagentpipelines med LangGraph
- Delat minne och kommunikation mellan agenter