AI Engineering Academy · leksjon

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.

Leksjon 3 av 413 trinn

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: str

Definere 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 key

Opprette 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 stage

Parallell 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 checkpoint

Strø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| researcher

LangGraph-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.

Gratis å komme i gang

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

  1. Hvorfor enkeltagenter møter en grense
  2. Orkestrator-undergent-mønsteret
  3. Bygge fleragentpipelines med LangGraph
  4. Delt minne og kommunikasjon mellom agenter
← Tilbake til AI Engineering Academy