Bygge fleragentpipelines med LangGraph
Bruk LangGraph til å definere agentnoder, betingede kanter og delt tilstand i en rettet graf, slik at du kan bygge komplekse fleragentarbeidsflyter med løkker, forgreninger og kontrollpunkter med mennesket i loopen.
Bygge fleragentpipelines med LangGraph er en gratis leksjon i AI Engineering Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI Engineering Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI Engineering Academy inneholder totalt 4 leksjoner.
Hva er LangGraph?
LangGraph er et bibliotek bygget oppå LangChain som lar Dem definere arbeidsflyter med flere agenter som rettede grafer. Noder i grafen representerer agenter eller behandlingstrinn, kanter representerer flyten av tilstand mellom dem, og betingede kanter muliggjør dynamisk ruting basert på den nåværende tilstanden. LangGraph håndterer kjøringsmotoren, lagring av tilstand og kontrollpunkter med menneske i løkken.
# 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: strDefinere tilstand i LangGraph
Alle LangGraph-arbeidsflyter opererer på et delt tilstandsobjekt som alle noder kan lese fra og skrive til. Tilstanden er en typet ordbok (TypedDict) som frakter data gjennom grafen. Når en node kjører, mottar den den nåværende tilstanden, utfører arbeidet sitt og returnerer en ordbok med oppdateringer som flettes inn i tilstanden. Denne modellen med delt tilstand gjør det mulig for agenter å kommunisere uten direkte kobling.
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 keyOpprette agentnoder
I LangGraph er hver agent en nodefunksjon som tar den nåværende tilstanden, utfører LLM-kallet og verktøykjøringene sine og returnerer en tilstandsoppdatering. Noder er rene funksjoner – de lagrer ikke intern tilstand. All tilstand ligger i det delte tilstandsobjektet for grafen, noe som gjør arbeidsflyten enkel å inspisere, gjenoppta og feilsøke.
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}Bygge grafen med StateGraph
Når nodefunksjonene er definert, kobler De dem sammen med StateGraph. De legger til noder med graph.add_node(), legger til kanter mellom dem med graph.add_edge(), angir startpunktet med graph.set_entry_point() og kompilerer grafen til en kjørbar enhet med graph.compile(). Den kompilerte grafen er en kjørbar funksjon som godtar en opprinnelig tilstand og returnerer den endelige tilstanden.
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'])Betingede kanter for dynamisk ruting
Betingede kanter lar grafen rute til ulike noder basert på den nåværende tilstanden. I stedet for en fast kant oppgir De en rutingsfunksjon som undersøker tilstanden og returnerer navnet på den neste noden. Dette muliggjør revisjonsløkker, kvalitetskontroller, trinn for menneskelig godkjenning og forgrening basert på innholdet i agentenes 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'
}
)Løkker og iterasjon i LangGraph
LangGraph støtter løkker innebygd – en agent kan besøkes flere ganger. Dette er nødvendig for revisjonssykluser, mønstre for nytt forsøk ved feil og iterativ forbedring. Inkluder alltid en betingelse for avslutning av løkken i tilstanden, for eksempel en iterasjonsteller eller en terskelverdi for kvalitet, og håndhev den i ruteren for betingede kanter for å forhindre uendelige løkker.
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 kjøring av noder
LangGraph støtter parallelle grener ved bruk av RunnableParallel i en node eller ved å forgrene seg til flere noder. Når uavhengige deloppgaver må kjøres samtidig, kan De opprette en forgrening fra én node til flere parallelle noder, og deretter en samlingsnode som venter på alle og slår resultatene sammen i den delte tilstanden.
# 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 og menneske i løkken
LangGraph støtter kontrollpunkter gjennom integrasjon med en backend for lagring av kontrollpunkter (SQLite, Redis eller PostgreSQL). Når kontrollpunkter er aktivert, lagres grafens tilstand etter hver nodekjøring. Dette gjør det mulig å sette langvarige arbeidsflyter på pause, inspisere dem og gjenoppta dem. Det muliggjør også mønstre med menneske i løkken, der grafen stanser ved en bestemt node og venter på at et menneske skal godkjenne eller gi input før den fortsetter.
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ømming av LangGraph-utdata
LangGraph støtter strømmingsmodus, som sender ut mellomliggende tilstandsoppdateringer når hver node blir ferdig, i stedet for å vente til hele arbeidsflyten er fullført. Dette er nyttig for lange arbeidsflyter der De ønsker å vise brukeren delvis fremdrift. Bruk app.stream() for å hente en iterator med øyeblikksbilder av tilstanden fra hvert trinn.
# 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])Visualisere grafen
LangGraph kan tegne grafen som et Mermaid-diagram, noe som er svært nyttig for å forstå komplekse arbeidsflyter med mange noder og betingede kanter. Kall app.get_graph().draw_mermaid_png() for å hente et PNG-bilde, eller app.get_graph().draw_mermaid() for Mermaid-syntaksen som kan limes inn i en valgfri Mermaid-renderer.
# 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-agenteksempel fra start til slutt
Hvis vi setter alt sammen: En komplett LangGraph-fleragentarbeidsflyt definerer en TypedDict-tilstand, oppretter nodefunksjoner for hver agent, kobler dem sammen med StateGraph, legger til betingede kanter for revisjonsløkker, kompilerer med et kontrollpunktlager og starter kjøringen med en opprinnelig tilstand. Dette gir Dem en robust, observerbar og gjenopptakbar fleragentarbeidsflyt med minimalt med standardkode.
Kort kontroll
Test forståelsen Deres av LangGraph-fleragentarbeidsflyter fra denne leksjonen.
Oppsummering av leksjonen
I denne leksjonen har De lært at LangGraph representerer fleragentarbeidsflyter som rettede grafer der noder er agenter og kanter er flyt, at betingede kanter muliggjør dynamisk ruting, løkker og revisjonssykluser basert på den nåværende tilstanden, og at kontrollpunkter gjør det mulig å sette langvarige arbeidsflyter på pause og gjenoppta dem med godkjenning fra et menneske i løkken. Neste gang utforsker vi delt minne og kommunikasjon mellom agenter.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 30
- Leksjoner
- 120
Ofte stilte spørsmål
Er leksjonen «Bygge fleragentpipelines med LangGraph» gratis?
Ja – hele teksten i «Bygge fleragentpipelines med LangGraph» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av AI Engineering Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i AI Engineering Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Bygge fleragentpipelines med LangGraph»?
Bruk LangGraph til å definere agentnoder, betingede kanter og delt tilstand i en rettet graf, slik at du kan bygge komplekse fleragentarbeidsflyter med løkker, forgreninger og kontrollpunkter med men… Du øver på AI Engineering Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med AI Engineering Academy?
Ingen tidligere erfaring er nødvendig. AI Engineering Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Bygge fleragentpipelines med LangGraph»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne AI Engineering Academy-leksjonen?
Ja. Alle AI Engineering Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Hvorfor enkeltagenter møter en grense
- Orkestrator-undergent-mønsteret
- Bygge fleragentpipelines med LangGraph
- Delt minne og kommunikasjon mellom agenter