Einen Support-Agenten in Intake-, Knowledge- und Support-Knoten aufteilen
Warum der LEPA-Support-Agent ein Graph aus spezialisierten Knoten ist und keine große Funktion, wie LangGraph die Übergaben über einen gemeinsamen State regelt und was Multi-Agent hier bedeutet.
An diesem Punkt kann der LEPA-Support-Agent eine Anfrage routen, die Dokumentation durchsuchen und sich einen Gesprächsverlauf merken. Bleibt die Frage, wie die Arbeit selbst organisiert ist. Statt einer riesigen Funktion, die alles erledigt, verteilen sich die Aufgaben auf ein paar Spezialisten, und LangGraph koordiniert sie.
Stellen Sie sich einen Hausbau vor
"Multi-Agent" klingt nach Science-Fiction. Hilfreicher ist das Bild einer Baustelle, auf der mehrere Gewerke an einem Projekt arbeiten:
Electrician
Plumber
Painter
Inspector
Verschiedene Aufgaben, verschiedene Fähigkeiten, ein Haus. Ein Support-Ablauf lässt sich genauso aufteilen:
Someone understands the request
Someone finds the handbook page
Someone writes the reply
Diese Aufteilung lohnt sich nur, wenn sich die Aufgaben wirklich unterscheiden. Zusätzliche Kästchen auf einer Folie zählen nicht.
Der Graph in diesem Projekt
Der kompilierte Graph läuft so ab:
START
→ intake
→ classify
→ conditional
├─ ask_clarification → END
└─ knowledge → support → END
Intake, Knowledge und Support heißen in der Projektstruktur Agenten, weil jeder genau eine klare Aufgabe hat. Classify und der Rückfrage-Schritt liegen dagegen im Ordner nodes/. Das ist dieselbe Graph-Idee, nur mit etwas anderer Ordnerbenennung. "Multi-Agent" heißt hier: spezialisierte Knoten in einem einzigen kompilierten StateGraph. Es heißt nicht, dass es getrennt deployte Services gibt, und auch nicht, dass Agenten miteinander diskutieren. Die Ordnernamen sind weniger wichtig als die klare Trennung der Zuständigkeiten.
Was die einzelnen Spezialisten tun
Intake
Intake nimmt die letzte Nachricht des Nutzers und liefert eine user_role:
"I'm a teacher — how do I take attendance?"
↓
user_role = teacher
Der Knoten durchsucht keine Dokumentation und schreibt nicht die endgültige Antwort. Er bereitet nur den Kontext für das Routing vor.
Classify und der Rückfrage-Zweig
Classify bestimmt das Thema und entscheidet, ob genug bekannt ist, um weiterzumachen:
"help" → ask for the LEPA area
"How do I enter grades?" → continue to knowledge
Diese Verzweigung ist die eigentliche Orchestrierung: dasselbe System, aber ein anderer nächster Spezialist.
Knowledge
Knowledge chattet nie. Der Knoten holt nur Dokumente:
query + issue_category
↓
search_knowledge_impl (keyword Markdown search)
↓
retrieved_documents
Im selben Modul gibt es einen @tool-Wrapper namens search_knowledge für spätere Experimente, aber der Graph ruft die eigentliche Implementierung direkt auf.
Support
Support greift nie aufs Dateisystem zu. Der Knoten liest retrieved_documents und erzeugt final_answer, standardmäßig aus einer Vorlage und optional von einem LLM nachgeschliffen, wenn eines konfiguriert ist.
Wie LangGraph die Reihenfolge einhält
Kein Manager-LLM entscheidet frei, wer als Nächstes dran ist. Die Verdrahtung ist explizit:
graph.add_edge(START, "intake")
graph.add_edge("intake", "classify")
graph.add_conditional_edges("classify", route_after_classify, {...})
graph.add_edge("knowledge", "support")
Einfach gesagt ist LangGraph der Kellner und jeder Knoten eine Station in der Küche. Technisch legen Kanten den Standardpfad fest, bedingte Kanten definieren Verzweigungen, die vom State abhängen, und über einen gemeinsamen SupportState reichen die Spezialisten ihre Ergebnisse weiter, ohne sich gegenseitig aufzurufen. Genau diese letzte Eigenschaft ist die entscheidende:
Intake does not call Support.
Knowledge does not call Classify.
They write to state.
The graph decides the next node.
Warum nicht ein einziger Agent?
Eine einzige Funktion wäre möglich gewesen:
def handle(message):
detect role
classify
maybe clarify
search docs
write answer
Für eine winzige Demo funktioniert das, aber als Lernsystem verdeckt es die Nahtstellen. Ein aufgeteilter Graph macht einiges leichter:
- Die Klassifizierung testen, ohne die Dokumentensuche einzubeziehen
- Eine falsche Antwort getrennt von einer falschen Route debuggen
- Später einen Schritt austauschen, etwa durch einen LLM-Klassifizierer oder eine bessere Suche, ohne alles neu zu schreiben
- Das System mit einem einfachen Diagramm erklären
Der eigentliche Gewinn des Multi-Agent-Designs ist hier die Klarheit.
Was es nicht ist
Um ehrlich zu sein: Diese Spezialisten sind keine getrennt deployten Services, sie streiten nicht miteinander und sie sind auch keine autonomen Agenten-Firmen. Es sind fokussierte Graph-Knoten mit klaren Verträgen, die LangGraph orchestriert. Um die Idee zu verstehen, reicht das, und es beschreibt ehrlich, was das Projekt tut.
Die Idee in drei Zeilen
Multi-Agent-Orchestrierung im LEPA-Support-Agenten läuft auf Folgendes hinaus:
Specialize the jobs.
Share state.
Let the graph choose the next job.
Intake, Knowledge und Support sind getrennt, weil sie unterschiedliche Aufgaben haben, und LangGraph macht die Übergaben sichtbar. Als Nächstes folgt ein verwandtes Konzept: Human-in-the-Loop. Echte Freigabeschritte gibt es dafür noch nicht, und es ist etwas anderes als Rückfragen zu stellen.