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

Створыце сваі першыя рабочыя практыкі LangGraph прычыму да сістэм з калькольнікаў агентаў.

Першыя рабочыя практыкі LangGraph у Colab: спяльны стан, последовальныя вузлы, адзін крок LLM і шматэтапны пайплайн для блога, прычым да сістэм з калькольнікамі.

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

Крыніцы: Build AI Workflows with LangGraph (Part 1): Your First Agentic AI Application

Што такое LangGraph?

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

Input
   ↓
Node A
   ↓
Node B
   ↓
Node C
   ↓
Output

Кожны вузел прымеяе спільны стан, апдэюе яго і перадае далей. Гэты прыем можа расшырвацца да розгалужэння, памяці, планавання, размышленняў і мнагаагентных сэтапаванняў — але першыя навыкі — гэта стварэнне простага каналу перэдачы дадзеных.

Показаны выконавальны прыклад застаецца воспроізваемым: Google Colab, мадэлі з адкрытым кодам праз Groq і короткій спіс залежнасцей. Не трэба локальных апаратоў з GPU. Педагагічная ідэя заключаецца у тым, што ідэі агентнасці рэалізуюцца быстрэй, калі кожны элемент працуе на безкоштовной інфраструктурэ, таму увага застаецца на стане, вузлах і рэшцях, а не на налагоджэнні кластэра.

Інсталляцыя залежнасцей

!pip install langchain langgraph langchain_groq
  • LangGraph стварае граф рабочага прайсупутку
  • LangChain апранае абстракцыі LLM
  • LangChain Groq саўершае кантакты з API для вычыслення Groq
  • Запуск установак унутроц Colab дазволяе застаўляць срэду врэменнай і спільнаю.

    Імпорт неабходных бібліятэкаў

    from langgraph.graph import StateGraph, START, END
    from typing import TypedDict
    from IPython.display import Image
    
    • StateGraph стварае прабег задання
    • START / END пазначаюць пачатак і заканчэнне
    • TypedDict задае тыпы спільнага стану
    • Image атрыбутуе дыяграму скомпіляванага графа

    Прыклад 1 — Просты последовны прабег

    Пачніце без LLM, каб шлях дадзеных быў ясны.

    З’явіце стан

    class BMIState(TypedDict):
        weight_kg: float
        height_m: float
        bmi: float
        category: str
    

    Стан — гэта спільны слоўнік, які супроводжвае запуск. Вузлы чытаюць яго, збіраюць даныя і вяртаюць апдэйтаваны мапаванне. У гэтым прыкладзе выкарыстоўваюцца значэння вагі, вышыні, КІМ і пазначка катэгорыі.

    Стварыце вузел апрацоўкі

    # define calculate_bmi node
    def calculate_bmi(state: BMIState) -> BMIState:
    
        weight = state['weight_kg']
        height = state['height_m']
    
        bmi = weight/(height**2)
    
        state['bmi'] = round(bmi, 2)
    
        return state
    
    # define label_bmi node
    def label_bmi(state: BMIState) -> BMIState:
        bmi = state['bmi']
    
        if bmi < 18.5:
            state["category"] = "Underweight"
        elif 18.5 <= bmi < 25:
            state["category"] = "Normal"
        elif 25 <= bmi < 30:
            state["category"] = "Overweight"
        else:
            state["category"] = "Obese"
    
        return state
    

    Функцыя чытае высоту і вазу, вырахоўвае КІМ, прызначае катэгорыю і вяртае новы стан. Простая практыка LangGraph — прымоць тэкушчы стан і вяртаць наступны стан.

    Стварэнне графа

    # define graph
    graph = StateGraph(BMIState)
    
    # add nodes to your graph
    graph.add_node('calculate_bmi', calculate_bmi)
    graph.add_node('label_bmi', label_bmi)
    
    # add edges to your graph
    graph.add_edge(START, 'calculate_bmi')
    graph.add_edge('calculate_bmi', 'label_bmi')
    graph.add_edge('label_bmi', END)
    
    
    # compile the graph
    workflow = graph.compile()
    
    # show the graph
    Image(workflow.get_graph().draw_mermaid_png())
    

    Зарэўнаваць вузел, з’яеднаць START → вузел → END і скомпіляваць. LangGraph можа накрасіць створаны граф, ўжо каб вы моглі пераканацца ў топалогіі прытаму яго запуску.

    Выкананне рабочага працэсу

    # execute the graph
    intial_state = {'weight_kg':80, 'height_m':1.73}
    final_state = workflow.invoke(intial_state)
    print(final_state)
    

    Падаць пачатковы слоўнік з вазой і высотай. Функцыя invoke запускае заданы шлях і вяртае стан, які цяпер уключае КІМ і катэгорыю.

    Прыклад 2 — Абэрнуцый рабочы працэс з LLM

    Заменіць вузел для вырахунка на вызов модэлю. Заставіць той самы фармат графа.

    Безпечна збіраць ключ API Groq (за запітам, а не заштыфраваны), пасля чаго завантажыць доступны адкрыты модэль:

    model = ChatGroq(model="openai/gpt-oss-120b")
    

    Адзначэнне стану LLM

    # create a state
    class LLMState(TypedDict):
        question: str
        answer: str
    

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

    Створыце вузел LLM

    def llm_qa(state: LLMState) -> LLMState:
    
        # extract the question from state
        question = state['question']
    
        # form a prompt
        prompt = f'Answer the following question {question}'
    
        # ask that question to the LLM
        answer = model.invoke(prompt).content
    
        # update the answer in the state
        state['answer'] = answer
    
        return state
    

    Прачытайце пытанне, запытайце мадэль чату, зберагучы адказ, і вярніце стан. Структура такая ж, як у вузла BMI; змінюецца толькі внутрашняя праца.

    Створыце прабег работы LLM

    # create our graph
    graph = StateGraph(LLMState)
    
    # add nodes
    graph.add_node('llm_qa', llm_qa)
    
    # add edges
    graph.add_edge(START, 'llm_qa')
    graph.add_edge('llm_qa', END)
    
    # compile
    workflow = graph.compile()
    

    Дадзіце вузел, з’ўяжыце канектары, скомпілюйце. Каркас залучваецца намеравана, каб быў знакомым.

    Запытайце LLM

    # execute
    intial_state = {'question': 'How far is sun from the earth?'}
    final_state = workflow.invoke(intial_state)
    print(final_state['answer'])
    

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

    Прыклад 3 — Багатыярусны прабег работы AI

    Рэальныя сістэмы выкарыстоўваюць кілька стадзій аналізу. Расшырьце гэты шаблон.

    Задаць стан блогу

    class BlogState(TypedDict):
        title: str
        outline: str
        content: str
        rating: int
    

    За вырастаннем прабегу адслежвайце заглавле, структуру, контэнт і рэйтынг якосці.

    Створыце вузлы прабегу работы

    def create_outline(state: BlogState) -> BlogState:
        # fetch title
        title = state['title']
    
        # call llm gen outline
        prompt = f'Generate a detailed outline for a blog on the topic - {title}'
        outline = model.invoke(prompt).content
    
        # update state
        state['outline'] = outline
    
        return state
    
    def create_blog(state: BlogState) -> BlogState:
        title = state['title']
        outline = state['outline']
    
        prompt = f'Write a short blog (less than 20 lines) on the title - {title} using the follwing outline \n {outline}'
        content = model.invoke(prompt).content
        state['content'] = content
        return state
    
    def create_rating(state: BlogState) -> BlogState:
        title = state["title"]
        content = state["content"]
    
        prompt = f"""
        Rate the following blog out of 10.
        Return ONLY a single integer between 1 and 10.
    
        Title: {title}
    
        Blog:
        {content}
        """
    
        rating = model.invoke(prompt).content.strip()
    
        state["rating"] = int(rating)
    
        return state
    

    Адміністрацыя структуры апавядання і пасляэтапныя працэсы выкананы як окольні функцыі. Кожны вузел выпаловае адну задачу, таму графы застаюцца чытабельнымі.

    Складзіце цэлы канал апрацоўкі

    graph = StateGraph(BlogState)
    
    # nodes
    graph.add_node('create_outline', create_outline)
    graph.add_node('create_blog', create_blog)
    graph.add_node('create_rating', create_rating)
    
    # edges
    graph.add_edge(START, 'create_outline')
    graph.add_edge('create_outline', 'create_blog')
    graph.add_edge('create_blog', 'create_rating')
    graph.add_edge('create_rating', END)
    
    workflow = graph.compile()
    workflow
    

    З’яўляйце звязкі межа адзінамі заведаманнямі ШЫ па парадку. Канцэптуальна:

    Title
       ↓
    Create Outline
       ↓
    Generate Blog
       ↓
    Evaluate Blog
       ↓
    END
    

    Раздзелэнне працы на адзіныя этапы лепшая, чым падкладанне всіх інструкцый у адна вялікае запітанне: кожны крок вплывае на наступны.

    Выканайце робочы працэс

    intial_state = {'title': 'Rise of AI in India'}
    final_state = workflow.invoke(intial_state)
    print(final_state['rating'])
    

    Пачынаючы з заглавля, працэс стварае апавяданне, прадрафтуе тэкст, оцінюе якасць і вяртае поле з рэйтынгам. Гэта ўоснова каналаў апрацоўкі з вікорыстаннем агентав: коордынацыя кількох можаўносцей модэляў пад адным спяльным станом.

    Спрыткуйце кожны прыклад як крок калібравання, а не як просты код-дэманстрацыю. Пасля таго, як запрацяе графік BMI, зменіце прагі катэгорыяў і пераканаецеся ў актуальных зменах стану. Пасля таго, як запрацяе графік аднароднага LLM, заменіце ідэнтыфікатор мадэлі або шаблон запіту і старайцеся бачыць толькі змены ў працэздатнасці таго вузла. Пасля таго, як запрацяе практыка блога, дадзіце дапаможны вузел межы апісу і чэрнавіка — можа, «перакананне на тон» — каб разумеце, як разам растуяць рэглі і поля стану.

    У гэтым этапе адпаведна дысцыпліна ў стане мае большое значэнне, чым хітрыя запіты. Вядзьме маленькія, пазначаныя поля (outline, content, rating) замест аднаго велікага блока messages, пакуль вам не знадобіцца історыя чату. Дазволена частковая апдэйт, якая не ўключае нерэлевантных ключоў, калі семантыка злучэння графаў гэта дазволяе; важлівым прыкметнікам ёсць тое, каб вузлы заставаліся настацьк чыстымі, каб іх можна было тэставаць за дапамогою ручна створанага слоўніка.

    У Colab адміністрацыя паказанняяў можа заставацца мінімальной, пры тым як застаецца намеранай: калі вызов Groq не выйшаў, трэба паказаць асаблівасць, а не прыхавіць яе ўнутрэй у вузле. Раннія навучальныя матэрыялы, якія маскуюць неудачы, вучаюць неправілівыя падходы для пазнейшых схем вызоў інструментаў, дзе неудачны інструмент павінен стаць явным галуззю.

    На заканчык, кожны раз, калі вы дадаеце рэштку, накройце скомпіляваную схему. Візуальная перакананасць дапамагае быстрэй выявіць віпадковыя цыклы і забутыя лінкі END, чым чытанне вызоў add_edge. Калі зображэнне паспаўна падтрымляе історыю, яку вы хацелі рассказаць, invoke стае крокам пераканання, а не сесіяй дыбаггавання.

    Што паставляюць гэтыя прыклады

    Тры поступова ўскладнююцыяся рабочыя практыкі пакрываюць основную лексыку:

    1. Чыстая последовная логіка на Python у спадзяльнам стане
    2. Одны вузел LLM унутрэй той самай схемы
  • Багатыядэрны ланцуг AI з калькамі, якіе саўместна працуюць
  • Продактыўны прыем: спяльны стан, калькі, рэшткі, оркестрацыя, інтэграцыя з LLM і этапаваная логіка. Тыя ж ідэі пазней падтрымліяць інструменты, памяць, розгалужэння і агенты, якіе саўместна працуюць.

    Што будзе далей

    Пазнейшыя часткі агентскага AI на Python зазвычай дадаюць умовныя рэшткі, паралельныя розгалужэння, механізмы затверджэння ад чалавека, вызыв інструментоў, RAG, структуры з калькамі і пакаванне для прыменення — усё гэта за метай стварыць прыемныя для Colab настройкі з адкрытымі мадэлямі.

    Полны ісхадны код

    Супакоўаныя нотбукі для Colab публікуюцца ў праекце Agentic-AI на GitHub (файл Workflow_in_LangGraph.ipynb). Ачыніце гэты нотбук у Colab, запускайце яго клеткі зверху да ніжы, а пасля стварыце калькі для своіх задач.