שיעור 4 — LangGraph
מטרות
- להעביר את הלולאה משיעור 3 למצב מפורש.
- להבדיל בין צומת שמחזיר שינוי, לבין קוד שמשנה מצב במקום.
- להוסיף מעבר אחר כששליפה לא מחזירה את המקור הדרוש.
- לעצור לפני פעולה, לשמור את המצב, ולהמשיך אחרי אישור.
למה מסגרת
הלולאה משיעור 3 שומרת הכול ברשימה אחת. קשה לעצור באמצע, לחזור לאותו צעד, או לבדוק צומת בלי להריץ את כל הסיפור. LangGraph נותן לזה צורה: אובייקט מצב, צמתים, וקשתות.
צומת קורא את המפתחות שהוא צריך ומחזיר רק את מה שהשתנה. המסגרת ממזגת. שינוי הרשימה במקום שובר את האפשרות לחזור אחורה למצב שנשמר.
המסגרת אינה מחליטה בשבילכם. תנאי העצירה, התקציב והרשאות הכלים נשארים בקוד שלכם, בדיוק כמו בלולאה הישירה.
דוגמה מצומצמת
המצב כולל את המשימה, את המזהים שכבר נשלפו, מונה צעדים, ותשובה. אחרי צומת השליפה, קשת מותנית שואלת:
- יש את שני המקורות: ממשיכים לחישוב.
- חסר מקור ונותר תקציב: חוזרים לשליפה בשאילתה אחרת.
- נגמר התקציב: צומת יציאה שמחזיר עצירה, לא תשובה מומצאת.
הקטע הבא הוא תרשים כוונה, לא קוד שהאתר מתקין עבורכם:
def route(state):
if state["answer"]:
return "end"
if state["step"] >= state["budget"]:
return "stop"
if "C:1" not in state["ids"]:
return "retrieve"
return "calculate"
וכך מחברים את הצמתים לגרף. גם זה שרטוט: שמות הפונקציות retrieve, calculate ו־stop הם שלכם.
from langgraph.graph import StateGraph, START, END
graph = StateGraph(State)
graph.add_node("retrieve", retrieve)
graph.add_node("calculate", calculate)
graph.add_node("stop", stop)
graph.add_edge(START, "retrieve")
graph.add_conditional_edges("retrieve", route, {
"retrieve": "retrieve", "calculate": "calculate", "stop": "stop", "end": END,
})
graph.add_edge("calculate", END)
graph.add_edge("stop", END)
שמירה, עצירה והמשך
כשמקמפלים את הגרף עם מנגנון שמירה (checkpointer), המצב נשמר אחרי כל צומת, תחת מזהה שיחה. אפשר לבקש מהגרף לעצור לפני צומת מסוים, למשל לפני צומת ששולח הודעה. אדם קורא את המצב השמור ומאשר, והריצה ממשיכה מאותה נקודה, בלי לחזור על השליפות.
העצירה הזאת שימושית רק אם הצומת שאחריה הוא היחיד שמבצע את הפעולה. אם צומת קודם כבר שלח, האישור מגיע מאוחר מדי.
מה בודקים במעבדה
מריצים את אותה שאלה משני המקורות. שומרים צילום של המצב אחרי כל צומת. מכבים את הקשת שחוזרת לשליפה, ומראים שהתהליך נעצר עם מקור אחד. אחר כך מוסיפים עצירה לפני צומת החישוב, ממשיכים את הריצה, ובודקים במונה שהשליפה לא רצה פעם נוספת.
בדיקת הבנה
לקריאה
התיעוד הרשמי: LangGraph, הפרקים על שמירת מצב (Persistence) ועל עצירות (Interrupts). גרסת החבילה תפורסם במודל לפני העבודה המדורגת.
סיכום
מצאתם טעות בעמוד? כתבו למרצה