LangGraph Умовныя рабочыя праграмы: розгалужэння без хаотычных запросаў
Кодавайце маршрутызацыю LangGraph за дапамою if-else як іменаваныя умовныя грані з чыстымі контрактамі стану і можлівасцю вярнуцься пасля абярэнняў, замест таго каб укладаць розгалужэння ў запросы.
Крыніцы: Conditional Workflows in LangGraph: The If-Else of Agentic AI
У гэтым керавані перадаецца спосаб стварэння функцыональнага маршруту для умовных рабочых праграм у LangGraph: прынцып «калі-іначэ» для агентных AI. Акцэнт ставіцца на контракты, пераконтроўкі і код, які можна падключыць у рэпазітарый без неабяснення меты. Для загальнага адгледжэння паказванае як вказваць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння пры зміне коду. Аперацыйныя працавальнікі должны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вяснавання проблем. Перапрыбуткі, людзкія пераконтроўкі і обработка некорэктных паведамленняя ёсць часткай продукту, а не дадатковым элементам пасля яго стварэння.
Што такое умовная рабочая праграма?
Для чаго взаўсе патрэбны умовныя рабочыя працэсы? Перш чым зменіць код, неабходна адзначыць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не прабуючы спадарацца прыватны стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына нехаўкалів должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцужок задач. Строга прыменяйце схемы інструментаў. Шырокія параметры у вільным фармаце спрыяюць атакам і робяць аўдыты дорогімі.
Рабочы працэс №1: Рашэнне квадратнага рывня
Для рабочага практыкуму №1: рашэння квадратнага уравнення, перш чым зменяць код, неабходна ясная дэфініцыя вхідных дадзеных, адпаведнага адпаведальніка за крок і крэтарыяў завершэння. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цэму этапу як кантракту межа вхіднымі дадзенымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць крэтарыяў успеху і адмовіцеся ад беззвучнага частковага завершэння. Строга абмежыце схемы інструментаў. Шырокія параметры у вільным тэксце спрыяюць атакам і робяць аўдыты дорогімі.
Структура рабочага практыкуму
Для структуры рабочага практыку прызначыце вхідныя даны, адпаведальнага за крок і крэтырыя для завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымець перзапускаць крок з вядомага пункту контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выканання і вітраты праза функцыйнае рэзультат. Відкрытыя інформацыі з самага пачатку запобегаюць неспакоўным рахункам, калі практыка пераходзіць з дэмавайнага рэжыма ў спяльныя асяроддзя. Строга абмежвайце шаблоны інструментоў. Шырокія аргументы у вільным тэксце спрыяюць втручанню з боку зловершальнікаў і робяць аўдыты дорогімі. Для структуры рабочага практыку прызначыце вхідныя даны, адпаведальнага за крок і крэтырыя для завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымець перзапускаць крок з вядомага пункту контролю, не спрабоўваючы здагадвацца пра схованы стан. Аддзеўжце дакументацыю як пра успішны, так і пра вярнучыся паты. Перапрыбуткі, людзкія контрольныя пункты і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
Стварэнне стану
Для стварэння дзяржавы неабходна ўскладненне вхідных дадзенаў, абавесцявання адпаведальнага за кожны крок і вызначэнне крытэрыяў завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае перайскаць гэты крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптаў. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную абавесцяванасць, а не на заплутаны ланцужок задач. Здзейсніце точку контролю пасля дорогіх вызоў модэлю, каб перапрыбуткі не включалі паўтарэння той самай працы.
class QuadState(TypedDict):
a: float
b: float
c: float
equation: str
discriminant: float
result: str
Вузлы
Для вузлаў неабходна прадзефінавацыя вхідных дадзенняў, адпаведальнага за выкананне крока і крэтарыяў завершэння працы перад зменай коду. Аперацыйныя працавнікі должны магчымае перзапускаць крок з вядомай точкі контролю, не прабуючы спадарожваць захаваны стан. Спрыяйце цэй стадзіі як даговору межа вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, прадзефінавацыя крэтарыяў успеху і адмовіцеся ад беззвучнага частковага завершэння. Зробіце точку контролю пасля дорогіх вызоў модэлю, каб перзапуск не веліў зарабляць плату знова за тую ж работу.
def show_equation(state: QuadState):
equation = f"{state['a']}x² + {state['b']}x + {state['c']}"
return {"equation": equation}
def calculate_discriminant(state: QuadState):
discriminant = (state['b'] ** 2) - (4 * state['a'] * state['c'])
return {"discriminant": discriminant}
def real_roots(state: QuadState):
r1 = (-state['b'] + state['discriminant'] ** 0.5) / (2 * state['a'])
r2 = (-state['b'] - state['discriminant'] ** 0.5) / (2 * state['a'])
result = f"The roots are {r1} and {r2}"
return {"result": result}
def repeated_root(state: QuadState):
root = -state['b'] / (2 * state['a'])
result = f"Only repeating root is {root}"
return {"result": result}
def no_real_roots(state: QuadState):
return {"result": "No real roots"}
Функцыя маршрутацыі — гэта ключовая частка
Для функцыі маршрутацыі — гэта ключовая частка: перад змянайом коду неабходна ясная ваказка пра вхідныя даны, адпаведальнага за крок і крытэрыя завершэння. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісвайце час выканання і вітраты разам з рэзультатамі функцыяналу. Відразны адгук да дзейнасцяў запобегае неспакою, калі маршрут пераходзіць з дэмовай асяроддзя ў спакульную. Заставляйце стварваць точкі контролю пасля дорогіх вызоў модэлю, южы перзапуск не прабіваў за тую ж работу знову. Для функцыі маршрутацыі — гэта ключовая частка: перад змянайом коду неабходна ясная ваказка пра вхідныя даны, адпаведальнага за крок і крытэрыя завершэння. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Дакументавайце як шлях успеху, так і шлях вярнення да нормы. Перзапускі, людскія контрольны пункты і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
def check_condition(state: QuadState):
if state['discriminant'] > 0:
return "real_roots"
elif state['discriminant'] == 0:
return "repeated_root"
else:
return "no_real_roots"
Спаўненне ўсьго разам
Для з’еднання всіх элементаў неабходна спачатку візначыць вхідныя даны, власніка кроку і крытэрыя завершэння, перш чым зменіць код. Аператары должны магчымае перзапускаць крок з вядомай точкі контролю, не прабуючы здогадвацца пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына неудачы должна вказываць на адну конкрэтную відпаведальнасць, а не на заплутаны працэс. Раздзеляйце планаванне і выканання за дапамою інструментаў. Планавальнік пропонуе; выконаваць змінюе; пераканальнік пераглядае рэзультаты за адносам да цялевага рэзультата.
graph = StateGraph(QuadState)
graph.add_node("show_equation", show_equation)
graph.add_node("calculate_discriminant", calculate_discriminant)
graph.add_node("real_roots", real_roots)
graph.add_node("repeated_root", repeated_root)
graph.add_node("no_real_roots", no_real_roots)
graph.add_edge(START, "show_equation")
graph.add_edge("show_equation", "calculate_discriminant")
# This is the magic line
graph.add_conditional_edges("calculate_discriminant", check_condition)
graph.add_edge("real_roots", END)
graph.add_edge("repeated_root", END)
graph.add_edge("no_real_roots", END)
workflow = graph.compile()
Рабочы працэс №2: Адпраўнік адгукоў кляёнаў (на базе LLM)
Для рабочага практыкуму №2: Адміністратар рэвю кляўэнта (на аднойчыне з LLM), паказваецца, калі трэба задаць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння, прычаму трэба зменіць код. Аператары должны магчымае запускіць крок з вядомай точкі контролю, не падозрываючы схованы стан. Спрыяйце гэтаму этапу як кантракту межа вхіднымі данымі і падтвердзенымі выходнымі рэзультатамі. Даўце назвы артыфактам, паказваецца, калі трэба задаць перапыткі на успех, і адмовіцеся ад тыхнага частковага завершэння без паведамлення. Раздзеліце планаванне ад выканання інструментам. Планавальнік прыметляе; выконаваць зменяе; перапытчык перапытвае рэзультаты па адносу да цялевай меты.
Сцэнарый
Для данага сцэнарыя неабходна ўзначэння вхідных дадзеных, адпаведальнага за практыку і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне практыкі з вядомага контрольнага пункту, не спрабоўваючы здогадвацца пра схованы стан. Запісвайце час выканання і вітраты разам з функцыйнальнымі рэзултатамі. Вялікая відкрытасць у раннім этапе запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмавайнага рэжыма ў спяльныя сераўеры. Раздзеляйце планаванне і выканання за дапамогою інструментаў. Планавальнік прымечвае варыянты; выканавальнік іх рэалізуе; пераканальнік пераглядае рэзултаты ў супараджэнні з цялямі. Для данага сцэнарыя неабходна ўзначэння вхідных дадзеных, адпаведальнага за практыку і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне практыкі з вядомага контрольнага пункту, не спрабоўваючы здогадвацца пра схованы стан. Документавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія етапы контролю і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
Структураваныя схемы выходных дадзеных
Для схем структураванага выходу неабяжна прадзефінаваць вхідныя даны, адпраўніка крока і крытэрыя завершэння пры змены коду. Аперацыйныя працавнікі должны магчымае перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына неудачы должна вказываць на адну конкрэтную адпраўнасць, а не на заплутаны ланцужок задач. Схемы інструментаў неабяжна строго абмежваць. Шырокія параметры у віглядзе вольнага тэксту спрыяюць атакам і робяць аўдыты дорогімі.
from pydantic import BaseModel
from typing import Literal
class SentimentSchema(BaseModel):
sentiment: Literal["positive", "negative"]
class DiagnosisSchema(BaseModel):
issue_type: Literal["UI", "performance", "bug", "support", "other"]
tone: Literal["frustrated", "angry", "disappointed", "neutral"]
urgency: Literal["low", "medium", "high"]
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o-mini")
structured_model_sentiment = model.with_structured_output(SentimentSchema)
structured_model_diagnosis = model.with_structured_output(DiagnosisSchema)
Стан
Для дзяржавы, пры зміне коду, неабходна ўскладненая ваказка пра вхідныя даны, абавесць крока і крытэрыі завершэння. Аперацыяныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не прабуючы спадарожваць схованы стан. Спрыяйце гэтам этапу як даговору між вхіднымі данымі і параболенымі выходнымі рэзультатамі. Даўце назвы артыфактам, ускладніце перагляд успеху і адмовіцеся ад тыхняга частковага завершэння без паведамлення. Строго адганяйце схемы інструментаў. Шырокія параметры у вільным фармаце спадважваюць рызык ін’екцый і робяць аўдыты дорогімі.
class ReviewState(TypedDict):
review: str
sentiment: Literal["positive", "negative"]
diagnosis: dict
response: str
Вузлы
Для The Nodes неабяжна прадзефінавацыя вхідных дадзеных, адпраўніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне крока з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выканання і вартасць праза функцыональныя рэзултаты. Відразы ўчасна запобегаюць неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя асяроддзя. Шчэлёвыя схемы інструментаў неабяжна строго абмежваць. Шырокія параметры у вільным тэксце спрыяюць атакам і робяць аўдыты дорогімі. Для The Nodes неабяжна прадзефінавацыя вхідных дадзеных, адпраўніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне крока з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкія контрольныя пункты і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
def find_sentiment(state: ReviewState):
prompt = f"For the following review, find out the sentiment:\n{state['review']}"
result = structured_model_sentiment.invoke(prompt)
return {"sentiment": result.sentiment}
def positive_response(state: ReviewState):
prompt = f"""Write a warm thank you message in response to this review:
{state['review']}
Also kindly ask the user to leave feedback on our website."""
result = model.invoke(prompt)
return {"response": result.content}
def run_diagnosis(state: ReviewState):
prompt = f"""Diagnose this negative review:
{state['review']}
Return issue type, tone, and urgency."""
result = structured_model_diagnosis.invoke(prompt)
return {"diagnosis": result.model_dump()}
def negative_response(state: ReviewState):
diagnosis = state['diagnosis']
prompt = f"""You are a support assistant. The user had a {diagnosis['issue_type']} issue,
sounded {diagnosis['tone']}, and marked urgency as {diagnosis['urgency']}.
Write an empathetic, helpful resolution message."""
result = model.invoke(prompt)
return {"response": result.content}
def check_sentiment(state: ReviewState):
if state['sentiment'] == "positive":
return "positive_response"
else:
return "run_diagnosis"
Граф
Для The Graph неабяжна прадзефінавацыя вхідных дадзеных, адпраўніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі павінны магчымае перапрацаваць крок пачаткуючы з вядомага пункту контролю, не прымушаныя здогадвацца пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына неудачы павінна вказываць на адну конкрэтную адпраўніцу, а не на заплутаны ланцоўкі задач. Здзейсніце пункт контролю пасля дорогіх вызоў модэлю, каб перапрацавка не велікала плата за тую ж самую працу.
graph = StateGraph(ReviewState)
graph.add_node("find_sentiment", find_sentiment)
graph.add_node("positive_response", positive_response)
graph.add_node("run_diagnosis", run_diagnosis)
graph.add_node("negative_response", negative_response)
graph.add_edge(START, "find_sentiment")
graph.add_conditional_edges("find_sentiment", check_sentiment)
graph.add_edge("positive_response", END)
graph.add_edge("run_diagnosis", "negative_response")
graph.add_edge("negative_response", END)
workflow = graph.compile()
Тэставанне
Для тэставання неабяжна прадзефініраваць вхідныя даны, адпаведальнага за крок і крытэрыі завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не прабуючы спадарваць схованы стан. Спрыяйце гэтам этапу як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, прадзефініравце перакананняя успеху і адмовіцеся ад тыхнага частковага завершэння без паведамлення. Зробіце точку контролю пасля дорогіх вызоў модэлю, каб перапуск не прабываў зноў выкарыстоваць тую ж работу.
Асновны ментальны модэль
Для основной ментальнай модэлі неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымаецца перазапускаць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выканання і вітраты праза функцыйнае рэзультат. Відкрытыя інформацыі з самага пачатку запобегаюць неспакоўным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя сераўры. Зробіце пункт контролю пасля дорогіх вызоў модэлі, каб перапрыбуткі не вялі плату за тую ж работу. Для основной ментальнай модэлі неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымаецца перазапускаць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Дакументавайце як шлях успеху, так і шлях вяселення. Перапрыбуткі, людзкі контроль і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
Што далей
Для наступных крокаў неабходна пазначыць вхідныя даны, адпаведальнага за выкананне кроку і крытэрыя завершэння пры зміне коду. Аператары должны магчыма ўвайсці крок з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптаў. Калі крок не выкананы, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны працэс. Раздзеляйце планаванне ад выканання інструментамі. Планавальнік прымечае варыянты; выканавальнік іх рэалізуе; пераканальнік пераглядае рынкі ў співставленні з метай.
Структураванае навчанне за межамі блогаў
Раздзеляйце планаванне ад выканання інструментамі. Планавальнік прымечае варыянты; выканавальнік іх рэалізуе; пераканальнік пераглядае рынкі ў співставленні з метай.
Курсы
Раздзеляйце планаванне ад выканання інструментамі. Планавальнік прымечае варыянты; выканавальнік іх рэалізуе; пераканальнік пераглядае рынкі ў співставленні з метай.
Чэк-ліст для выканання
Пауза пасля дорогіх запыткаў модэлю, каб перапрыцёк не прабіў зноў аблікавання за тую ж работу.
Зберагаюце стан графа ў простам і тыпаваным фармаце. Вкладаныя блокі маскуюць, які вузол запісаў якое поле, і спакшваюць возз'яданне пасля перарываў.
Напісце короткі посібнік: як роцыяваць клучы, як спрачыслаць чэргу, як відклікнуць пасляпэльныя змяны.