Галоўная / Артыкулы

LangGraph Умовныя рабочыя праграмы: розгалужэння без хаотычных запросаў

Кодавайце маршрутызацыю LangGraph за дапамою if-else як іменаваныя умовныя грані з чыстымі контрактамі стану і можлівасцю вярнуцься пасля абярэнняў, замест таго каб укладаць розгалужэння ў запросы.

Выдавец: REACTAPP.TOP10 хв чытання2192 слоў

Крыніцы: 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()

Тэставанне

Для тэставання неабяжна прадзефініраваць вхідныя даны, адпаведальнага за крок і крытэрыі завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не прабуючы спадарваць схованы стан. Спрыяйце гэтам этапу як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, прадзефініравце перакананняя успеху і адмовіцеся ад тыхнага частковага завершэння без паведамлення. Зробіце точку контролю пасля дорогіх вызоў модэлю, каб перапуск не прабываў зноў выкарыстоваць тую ж работу.

Асновны ментальны модэль

Для основной ментальнай модэлі неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымаецца перазапускаць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час выканання і вітраты праза функцыйнае рэзультат. Відкрытыя інформацыі з самага пачатку запобегаюць неспакоўным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя сераўры. Зробіце пункт контролю пасля дорогіх вызоў модэлі, каб перапрыбуткі не вялі плату за тую ж работу. Для основной ментальнай модэлі неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі павінны магчымаецца перазапускаць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Дакументавайце як шлях успеху, так і шлях вяселення. Перапрыбуткі, людзкі контроль і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.

Што далей

Для наступных крокаў неабходна пазначыць вхідныя даны, адпаведальнага за выкананне кроку і крытэрыя завершэння пры зміне коду. Аператары должны магчыма ўвайсці крок з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптаў. Калі крок не выкананы, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны працэс. Раздзеляйце планаванне ад выканання інструментамі. Планавальнік прымечае варыянты; выканавальнік іх рэалізуе; пераканальнік пераглядае рынкі ў співставленні з метай.

Структураванае навчанне за межамі блогаў

Раздзеляйце планаванне ад выканання інструментамі. Планавальнік прымечае варыянты; выканавальнік іх рэалізуе; пераканальнік пераглядае рынкі ў співставленні з метай.

Курсы

Раздзеляйце планаванне ад выканання інструментамі. Планавальнік прымечае варыянты; выканавальнік іх рэалізуе; пераканальнік пераглядае рынкі ў співставленні з метай.

Чэк-ліст для выканання

Пауза пасля дорогіх запыткаў модэлю, каб перапрыцёк не прабіў зноў аблікавання за тую ж работу.

Зберагаюце стан графа ў простам і тыпаваным фармаце. Вкладаныя блокі маскуюць, які вузол запісаў якое поле, і спакшваюць возз'яданне пасля перарываў.

Напісце короткі посібнік: як роцыяваць клучы, як спрачыслаць чэргу, як відклікнуць пасляпэльныя змяны.