Створыце сваі першыя рабочыя практыкі LangGraph прычыму да сістэм з калькольнікаў агентаў.
Першыя рабочыя практыкі LangGraph у Colab: спяльны стан, последовальныя вузлы, адзін крок LLM і шматэтапны пайплайн для блога, прычым да сістэм з калькольнікамі.
Крыніцы: 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 стварае граф рабочага прайсупутку
Запуск установак унутроц 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 стае крокам пераканання, а не сесіяй дыбаггавання.
Што паставляюць гэтыя прыклады
Тры поступова ўскладнююцыяся рабочыя практыкі пакрываюць основную лексыку:
- Чыстая последовная логіка на Python у спадзяльнам стане
- Одны вузел LLM унутрэй той самай схемы
Продактыўны прыем: спяльны стан, калькі, рэшткі, оркестрацыя, інтэграцыя з LLM і этапаваная логіка. Тыя ж ідэі пазней падтрымліяць інструменты, памяць, розгалужэння і агенты, якіе саўместна працуюць.
Што будзе далей
Пазнейшыя часткі агентскага AI на Python зазвычай дадаюць умовныя рэшткі, паралельныя розгалужэння, механізмы затверджэння ад чалавека, вызыв інструментоў, RAG, структуры з калькамі і пакаванне для прыменення — усё гэта за метай стварыць прыемныя для Colab настройкі з адкрытымі мадэлямі.
Полны ісхадны код
Супакоўаныя нотбукі для Colab публікуюцца ў праекце Agentic-AI на GitHub (файл Workflow_in_LangGraph.ipynb). Ачыніце гэты нотбук у Colab, запускайце яго клеткі зверху да ніжы, а пасля стварыце калькі для своіх задач.