як ствараць лепшых агентаў AI з LangGraph
Лепшыя агенты AI з LangGraph: самаактуалізуючыся доследнічы агент, пераконтрольваець-чалавек, і пяць практычных парадоў, якія робяць агентаў LangGraph надзеянымі.
Наступныя прыміткі паказваюць практычны шлях для розумэння «Як стварыць лепшыя AI-агенты з LangGraph». Акцэнт ставіцца на контракты, перакрычанняя і месцы для коду, а не на мотывацыйныя аспекты. Калі працуеце на стадыўцы агледзення, спачатку запісайце контракт: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковага невыпалення. Такі спіс дапамагае заліцварыць пазнейшыя змены ў кодзе. Документавайце як шлях успеху, так і шлях вярнення да нормы. Перапрыбуткі, людзкія контралі і обработка некорэктных паведамленняў ёсць часткай продукту, а не пазнейшым дапрацоўкам.
1. Апрант даследжэння: Майстэрства агентных рабочых практык
Этап 1 «Апранэнне» плану даследжэння работае наяўней, калі яго спрыяваць як мерыемую структуру. Запісаўце адну «золатую» транскрыпцыю, адны прыклад неудачы і зьмест карэкціі перш чым расшырваць масштабы. Валіце маленькія, тэставаныя елементы замест вялікіх скрыптав. Калі якісьць крок не выйшла, прычына неудачы павінна вказваць на адную адпаведальнасць, а не на заплутаны ланцужок задач. Рэзультаты графа павінны быць простымі і з адначыя тыпамі дадзеных. Вкладаныя структуры маскуюць, калькі вузел запісаў калькія поля, і спакоююць працу пасля перарываў.
2. Рашэння: Самакорэктуючыся агент для пошуку
Этап «2. Рашэнь А» працюе наяўней, калі яго спрыяваць як мерымабельную паверхню. Зафіксавайце адна «золатая» транскрыпцыю, адын прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Спрыявайце гэты этап як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце крытэрыя успеху і адмовіцеся ад тыхоўскага частковага завершэння. Зберагачыце стан графа ў простам і тыпаванам фармаце. Вкладзеныя блокі маскуюць, які вузел запісаў канкрэтны поле, і спакшуюць продажчыку працу пасля перарываў.
Імпорты
Этап імпорту працюе найэфектывней, калі яго розглядаць як меравальную плошчу. Зафіксавце адны ідэальны прыклад, адну справу з бягам і прыметку пра вярнэнне да пачатковага стану перш чым расшырваць сферу дзеяння. Запісвайце часы выканання і кост токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае прадставленне костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмовай асяроддзя ў спакульную. Храніце стан графаў у простам і тыпаваным фармаце. Вярнутыя структуры маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакшваюць продажчыку працу пасля перарываў.
import operator
from typing import Annotated, TypedDict, Union
from langgraph.graph import StateGraph, START, END
Спакульны мозг
Этап «Спяшаны ўм» працюе найэфектывней, калі яго розглядаць як вімерную паверхню. Зафіксавайце адна ідэальная транскрыпцыя, адзін прыклад неудачы і запіс пра вярнэнне да попераднего стану, перш чым расшырваць сферу дзеяння. Зберагаюце настройкі пазыроўна ад коду прыемлівача. Файлы сераўнавальнага сераўса, хранілішчы секрэтных даных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можу выканаць аўдыт без неабяжнага чытання всіх дадзеных. Зберагаюце стан графа ў простам і тыпаваным фармаце. Вярнутыя блокі дадзеных маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакойваюць працу пасля перэрываў.
# 1. State: The agent's shared memory
class AgentState(TypedDict):
# 'operator.add' lets us append messages instead of overwriting
messages: Annotated[list[str], operator.add]
attempts: int
found_info: bool
Вузлы-рабоцы
Этап «Рабочыя вузлы» працюе найкрашча, калі яго розглядаць як вімерную паверхню. Зафіксавце адны ідэальны прыклад працы, адну сітуацыю неудачы і прыметкі па поверненню да пачатковага стану пры розшырэнні масштаба. Дакументавайце як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, людзкі контроль і обработка некорэктных паведамленняў ёсць часткай продукту, а не элементамі пазнейшай дапрацоўкі. Храніце стан графа ў простам і тыпаваным фармаце. Вкладныя структуры маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакшуюць возобнавленне працы пасля перарываў.
# 2. Nodes: Individual 'steps' in the process
def search_node(state: AgentState):
print(f\n"--- Attempt {state['attempts'] + 1}: Searching ---")
# Simulating a logic check
success = state['attempts'] >= 1
msg = "Success: Found LangGraph info!" if success else "No results found."
return {"messages": [msg], "attempts": state['attempts'] + 1, "found_info": success}
def refine_query_node(state: AgentState):
print("\n--- Refining query for better results ---")
return {"messages": ["System: Query refined."]}
Логіка маршрутацыі
Этап логікі маршрутацыі працюе наяўней, калі яго розглядаць як вімерную структуру. Зафіксавайце адну ідэальную версію, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць сферу дзеяння. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг дзеяння. Рэжым графа павінен застаўцца простым і з адначыным тыпам дадзеных. Вярнутыя структуры дадзеных маскуюць інфармацыю пра тое, які вузел запісаў кожны поле, і спакоююць працэс пасля перэрываў.
def should_continue(state: AgentState):
if state["found_info"] or state["attempts"] >= 3:
return "end"
return "refine"
Стварэнне графа
Этап стварэння графа працюе наяўней, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адна ідэальная транскрыпцыю, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць масштабы. Спрыявайце гэты этап як кантракт межа вхіднымі данымі і паверыжанымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаць крытэрыя успеху і адмовіцеся ад тыхняй частковай працы без паведамлення. Зберагаюце стан графа у простам і тыпаваным фармаце. Вярнутыя структуры маскуюць інфармацію пра тое, які вузел запісаў кожны поле, і спакоююць продажчую працу пасля перарываў.
# 4. Build the Graph
workflow = StateGraph(AgentState)
workflow.add_node("search", search_node)
workflow.add_node("refine", refine_query_node)
workflow.add_edge(START, "search")
workflow.add_conditional_edges("search", should_continue, {"refine": "refine", "end": END})
workflow.add_edge("refine", "search")
Запуск агента
Этап «Запуск агента» працюе найэфектывней, калі яго розглядаць як параметрызаваную сферу. Зафіксавайце адны ідэальны прымер працы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Запісвайце час выканання задач і кост токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае прадставленне костоў запобегае неспакойным рахункам, калі працэс пераходзіць з дэмовай асяроддзя ў спяльнаныя сераўеры. Храніце стан графа ў простам і тыпаваным фармаце. Вярнутыя структуры даных маскуюць інфармацыю пра тое, які вузел запісаў кожны поле, і спакшваюць продовжэнне працы пасля перарываў.
# 5. Execute
app = workflow.compile()
for output in app.stream({"messages": [], "attempts": 0, "found_info": False}):
print(output)
--- Attempt 1: Searching ---
{'search': {'messages': ['No results found.'], 'attempts': 1, 'found_info': False}}
--- Refining query for better results ---
{'refine': {'messages': ['System: Query refined.']}}
--- Attempt 2: Searching ---
{'search': {'messages': ['Success: Found LangGraph info!'], 'attempts': 2, 'found_info': True}}
Этап «Запуск агента» працюе найэфектывней, калі яго розглядаць як параметрызаваную сферу. Зафіксавайце адны ідэальны прымер працы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы. Дакументавайце як шлях успеху, так і шлях вяснавання проблем. Перапрыбуткі, людзкі контроль і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
3. Пяць саветаў, як паспрабаваць падняць свой рэванш у LangGraph
Для трэйна «3 пяць советаў» неабходна перад зменым коду візначыць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння. Аператары должны магчымае перайсці на гэты крок з вядомага пункта контролю, не спрабоўваючы здогадвацца пра схованы стан. Валіце маленькія, тэставальныя елементы замест большых скрыптаў. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны працэс. Заставляйце людзей апраўдваць тыя крокі, якія ведуць да вітрачання грошаў або змены дадзэнняў у прыемным рэжыме. Компіляцыйныя налашчэння не ўзроўнаўцуюцься з повнай адпаведальнасцю ў бізнесе.
Совет 1: Чыткая схема стану
Для параграфа 1 «Успешна рэалізацыя», перш чым зменіць код, неабходна ясная ваказка пра вхідныя даны, адпаведальнага за кожны крок і крытэрыя завершэння. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не прабуючы спадарожваць схованы стан. Спрэчывайце гэты крок як даговор між вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, ваказайце крытэрыя успеху і не прабывайце прыймаць часткова завершаныя рэзультаты без падтверджэння. Заставьце людзкія падтверджэння для тых крокаў, якія выкалічваюць грошы або зменяюць даны праработкі. Компіляцыйныя налашчэння не ёсць адпаведнікамі пачатковай цэлесообразнасі праекту.
Парада 2: Майстэрства умовных крокаў
Для этапы Tip 2 Master Conditional неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выканання і кост токенаў або запытаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі траекторыя пераходзіць з дэмавай версіі ў спяльныя асяроддзя. Апраўдка чалавека неабходна для тых крокаў, якія выкарыстоўваюць грошы або зміняюць даны ў працэсе. Працэс складання коду не ўзначае повнайсткі готовасці продукту для эксплуатацыі. Для этапы Tip 2 Master Conditional неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабяжна задокументаваць як шлях успеху, так і шлях вярнення да нормальнага стану. Перапрыбуткі, апраўдка чалавека і обработка непрацэсуючых паведамленняў ёсць часткай продукту, а не елементамі, якія дадаюцца пазней.
Парадакт 3: Не забывайце прымкласць (стварэнне пунктавых контролі)
Кал працуеце над парадактом 3 «Не стварайце стэйджы», спачатку запісуйце умовы: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць па частковай нявыполненасці. Такі спіс контролю дапамагае залічваць пазнейшыя змены ў кодзе чыста. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Кал якісь крок не выйшоў, прычына нявыполненасці павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Стварайце пунктавыя контролі пасля дорогіх крокаў. Програма не павінна зноў выканаць той самы вызов LLM, калі аператар праканае пазнейшы вузел.
Парадакт 4: Акцэптуйце участку чалавека
Калі працюеце над патронам 4 «Прыемліце стадыю», спачатку запісайце контракт: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс пераконтроўкаў дапамагае заліцвачыць пазнейшыя змены ў кодзе. Спрыймайце гэтую стадыю як контракт межа данымі і перакананымі выходамі. Дайце назву артыфактам, задаце перакананні успеху і адмовіцеся ад тыхоўскага частковага завершэння. Зробіце пераконтроўку пасля дорогіх крокаў. Сістэма вярнення не павінна знову ставіць плату за той самы вызов LLM, калі аператар прабуе зноў запрацаваць пазнейшы вузел.
Патран 5: Чыніце вашы вузлы маленькімі
Калі працуеце за падказкай №5 «Зберагачыце свой этап», спачатку запісайце умовы вікорыстання: неабяжлівыя даныя, сігнал успеху і тое, што выканаецца у разе частковага нявыполнення. Такі спіс контролю дапамагае заліцвачыць пазнейшыя змены ў кодзе. Запісвайце час выканання і кост токеноў або запытаў праза функцыйнае рэзультат. Відразлівасць костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя сераўы. Стварайце контрольныя пункты пасля дорогіх крокаў. Сістэма вярнення не павінна знову нараховваць косты за той самы вызыв LLM, калі аператар прабуе зноў выконаць пазнейшы элемент. Калі працуеце за падказкай №5 «Зберагачыце свой этап», спачатку запісайце умовы вікорыстання: неабяжлівыя даныя, сігнал успеху і тое, што выканаецца у разе частковага нявыполнення. Такі спіс контролю дапамагае заліцвачыць пазнейшыя змены ў кодзе. Дакументавайце як шлях успеху, так і шлях вярнення да нормы. Прабулі, людзкія контрольныя пункты і обработка некорэктных запытаў ёсць часткай продукту, а не пазнейшым дапрацоўкам.
Практычны прыемлень
Этап практычнага прыцэшання работае наяўней, калі яго спрыяваць як мерыемую паверхню. Зберагучы адны ідэальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць масштаб. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неудача павінна вказваць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Рэзультаты графа павінны быць простымі і з адначытаемым тыпам. Вярнутыя структуры маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакшуюць продовжэнне працы пасля перэрываў.
Справакі
Этап справак работае наяўней, калі яго спрыяваць як мерыемую паверхню. Зберагучы адны ідэальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць масштаб. Спрыявайце гэты этап як даговор межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўайце назвы артыфактам, задаюце крытэрыя успеху і адмовляйцеся ад беззвучнага частковага завершэння.