Агенты ReAct у LangGraph: Шаг за шагам — мысль, дзеянне, абазаванне
Адаптуйце цыкл ReAct як чырвоныя вузлы графа з типаваным станом, вызовамі інструментаў та умовамі зупнення, якія можна перапрацаваць.
У гэтым керавані перадаецца спосаб рэалізацыі для: «ReAct Agents Explained: Паспрабованая рэалізацыя з выкарыстоўваннем LangGraph». Акцэнт ставіцца на кантракты, пераконтроўваннія і код, які можна прынясіць у репозітарый без неабязковасці з’ясаваць намеры. Для загальнага адгледжэння, перш чым зменяць код, неабходна визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыі должны магчымае перадзягнуць крок з вядомага пункта контролю, не прыпускаючы наявнасці схованых стаўак. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны процес.
Введэнне
Для вступу неабяжна ўзначыць інпуты, адпаведальнага за крок і крэтыры завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце гэтам этапу як кантракту межа інпутамі та перакананым выходным данным. Дайце назвы артыфактам, узначыце перакананні успеху і адмовіцеся ад тыхоўскага частковага завершэння. Раздзеліце планаванне ад выконання інструментамі. Планавальнік прыметляе; выконаваць змянюе; пераканальнік пераканваецца ў рэзультатах па адносу да цялі.
Што такое агент ReAct?
Для раздзела «Што такое агент ReAct?» неабяжна прадзефінавацыя вхідных дадзеных, адпраўніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя элементы должны магчымае запускаты крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць трываласць і вартасць праз цяжкі функцыональных рэзультатаў. Відразлівасць на раннім этапе запобегае неспакоўным рахункам, калі траекторыя пераходзіць з дэмавай версіі ў спяльныя среды. Раздзеляць планаванне і выконанне знарядзяў. Планавальнік прыметляе варыянты; выконавальнік іх рэалізуе; пераканальнік пераглядае рэзультаты за адносам да цялевай меты.
Чаму ReAct лепшы за чыстую схему Chain-of-Thought
Ёнколі ЧырАк лепшы за чыстую сяроўню думак, перад змінайом коду неабходна адзначыць вхідныя даны, адпаведальнага за крок і крэтырыя завершэння. Аперацыёныя працавнікі павінны магчымаецца перазапускаць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Конфігурацыю трэба залічыць параду ад коду прыкладнення. Файлы сераўіса, хранільнікі секрэтных дадзеных і флагі функцыйяў павінны знаходзіцца ў адном месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф. Раздзеляйце планаванне і выконання інструментаў. Планавальнік прымечвае варыянты; выконавацель іх рэалізуе; пераканальнік пераглядае рынукты ў супараваненні з цялевым рэзультатам. Ёнколі ЧырАк лепшы за чыстую сяроўню думак, перад змінайом коду неабходна адзначыць вхідныя даны, адпаведальнага за крок і крэтырыя завершэння. Аперацыёныя працавнікі павінны магчымаецца перазапускаць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Валіце маленькія, тэставальныя елементы працоўнікаў над вялікімі скрыптамі. Калі крок не выйшоў, адказ за гэта павінен быць прысвечаны адзіной адпаведальнасці.
заместо заплутанай лінійкі працэў.Thought: I don’t know the answer yet. I should search.
Action: Search("Paris weather this week")
Observation: It will rain on Thursday.
Thought: I should suggest indoor activities.
Final Answer: ...
ReAct Prompting
Для ReAct Prompting неабходна прадзефінавацыя вхідных дадзеных, адпаведальнага за кожны крок і крэтарыяў завершэння працы перад зменым коду. Аператары должны магчымае перзапускать крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цім этапу як даговору межа вхіднымі дадзенымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, прадзефінавацыя крэтароў успеху і адмовіцеся ад бяспечнага частковага завершэння. Строго абмежыце схемы інструментаў. Шырокія параметры у вільным тексте спрыяюць втручанню і робяць аудыты дорогімі.
Мэта ReAct Prompting
Для цэлей практыкі ReAct Prompting неабяжна перад зменым коду адзначыць вхідныя даны, адпаведальнага за крок і критэрыі завершэння. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы схованы стан. Запісваць трэба час выконання і витраты разам з функцыйнальнымі рэзултатамі. Відразы ўчасе запобегаюць неспакоўным рахункам, калі працэс пераходзіць з дэмовай среды ў спяльную.
Ключавыя элементы практыкі ReAct Prompting
Для ключовых элементаў методу ReAct Prompting неабходна перад змянай коду адзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымае перайсці на гэты крок з вядомага пункта контролю, не спрабоўваючы здогадвацца пра схованы стан. Конфігурацыю трэба залічыць паза кодам прыемліка. Файлы сераўнавальной среды, хранільнікі секрэтных данных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаючы весь код. Шаблоны інструментаў трэба строго абмежыць. Широкія параметры у вигляде вольнага тексту спрыяюць втручанню з боку зловершальнікаў і робяць перагляды даскладнымі. Для ключовых элементаў методу ReAct Prompting неабходна перад змянай коду адзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымае перайсці на гэты крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптаў. Калі крок не выканаецца, прычына неудачы должна вказываць на адну конкрэтную прычыну, а не на заплутаную сітку задач.
1. Логіка на адмысловых ланцутках
Для падчынку 1. Логіка на адмысловых ланцутках неабяжна практычна апішацыя вхідных дадзеных, адпаведнага власніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі павінны магчымае перапрацаваць крок, выйшоўшы з вядомага пункту контролю, без неабяжнай адгадванняя схованага стану. Цей этап трэба спрыяваць як кантракт між вхіднымі дадзенымі і перакананымі выходнымі рэзультатамі. Неабяжна даць назвы артыфактам, практычна апісацыя крэтарыяў успеху і адмовіцца ад беззвучнага частковага завершэння працы. Прызначайце пункты контролю пасля дорогіх вызоў модэлю, каб перапрацавка не велікала плата за тую ж самую працу.
2. Явны прастор дзеяння
Для 2. Чысткі простора дзеяння неабходна ўскладненне вхідных дадзенаў, абяцканняя апошніка крока і крэтарыяў выходу пры перадзмене коду. Аператары павінны магчымаць перзапуск крока з вядомай точкі контролю без неабяцканняя схованага стану. Запісваюцца час і вартасць праз функцыйнае рэзультаты. Відкрытыя данні запобегаюць неспакоўным рачункам, калі траекторыя пераходзіць з дэмавай версіі ў спадзеленыя сераўы. Точка контролю пасля дорогіх вызоў модэлю, каб перзапуск не прабіваў за тую ж работу.
3. Інтэграцыя абзіроў
Для пункту 3. Інтеграцыя спостерэнняў неабходна прадзефінаваць вхідныя даны, адпаведальную за крок і крэтарыя выходу пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічыць паза кодам прыкладнення. Файлы сераўнавання, хранільнікі секрэтных дадзенняў і флагі функцый належыць у аднам месца, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг. Заставляйце точку контролю пасля дорогіх вызоў модэлю, каб перапуск не прабіваў зноў тую ж самую роботу. Для пункту 3. Інтеграцыя спостерэнняў неабходна прадзефінаваць вхідныя даны, адпаведальную за крок і крэтарыя выходу пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Валіце маленькія, тэставальныя елементы над вялікімі скрыптамі. Калі крок не выйшаў, прычына неудачы должна вказываць на адну адпаведальнасць, а не на заплутаны ланцуг.
4. Ітератывны цыкл
Для 4. Ітератыўнага цыклу неабходна пазначыць вхідныя даны, адпаведальнага за кожны крок і крэтыяры выходу пры перадзеі коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце гэтаму этапу як кантракту межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, пазначыце крэтыяры успеху і адмовіцеся ад тыхнага частковага завершэння без паведамлення. Раздзеліце планаванне ад выконання інструментамі. Планавальнік прымець план; выконавач здзейснюе змяны; пераканальнік пераканваецца ў рэзультатах па адносу да цялевай меты.
5. Стварэнне заканчальнай адпаведзі
Для пятага пункта – стварэння фінальнай адказы – перад змянайом коду неабходна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аперацыямі неабходна можлівасць парадзейсцаваць крок з вядомага пункта контролю без неабясненняя схованага стану. Запісваць трываласць і витраты праз адно з функцыйнальных рэзультатаў. Відразліва візуалізацыя запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмавайнага режыма ў спяльныя сераўеры. Планаванне і выконання за дапамою інструментаў трэба аддзельваць: планавальнік прымечае варыянты, выконавальнік іх рэалізуе, а пераканальнік пераканаецца, чы рэзультаты адпавядаюць цілям.
Канонічная структура запытку ReAct
Для канонічнай структуры запроса ReAct неабяжна прадзефінаваць вхідныя даны, адпаведальнага за крок і крэтырыя для завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымаць перзапуск кроку з вядомай точкі контролю без адгадвання схованага стану. Конфігурацыю трэба залічыць пазначкай занятым ад коду прыемліка. Файлы сераўіснага сэрвісу, храненні секретных дадзэнняў і флагі функцыйяй должны знаходзіцца ў аднам месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф. Неабяжна раздзеліць планаванне і выконання інструменту. Планавальнік прымечае варыянты; выконавальнік іх рэалізуе; пераканальнік пераглядае рынукты па адносу да цялі. Для канонічнай структуры запроса ReAct неабяжна прадзефінаваць вхідныя даны, адпаведальнага за крок і крэтырыя для завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымаць перзапуск кроку з вядомай точкі контролю без адгадвання схованага стану. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшаў, прычына неабяжна стосавацца адной адпаведальнасці, а не заплутанага ланцоўка задач.
Неяк.
Question: <user question>Thought: <reason about what to do next>
Action: <selected tool>
Action Input: <tool input>
Observation: <tool output>
... (repeat as needed)
Thought: I now know the final answer
Final Answer: <answer to the user>
Zero-Shot ReAct Prompting
Для методу Zero-Shot ReAct Prompting неабяжна прадзефінавань вхідных дадзеных, адміністратара крока і крэтэрыяў завершэння пры перадзмене коду. Аперацыйныя працавнікі должны магчымае запускаць крок з вядомай точкі контролю без адгадванняя схованага стану. Спрыятлівае цей этап як кантракт межа вхіднымі дадзенымі і паверанымі выходнымі рэзультатамі. Назваць артыфакты, прадзефінаваць перакананняя успеху і адмовіцца ад бяспечнага частковага завершэння. Строго абмежыць схемы інструментаў. Шырокія параметры у вільным тексте спрыяюць атакам і робяць аудыты дорогімі.
ReAct Prompting проты ReAct Agents
Для парадыгм ReAct Prompting і ReAct Agents неабяжна перад зменой коду адзначыць вхідныя даны, абонента крока і критэрыі завершэння. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Запісваць трэба час выконання і витраты разам з функцыйнальнымі рэзултатамі. Відразы ўчасе запобiegаюць неспакоўным рахункам, калі працэс пераходзіць з дэмавай версіі ў спяльныя сераўры.
Чаму LangGraph для ReAct Agents?
Ёнколі гаворыць пра тое, чаму выбіраецца LangGraph для агентаў ReAct, перш чым зменіць код, неабходна задаць вхідныя даны, абавесця крока і критэрыі завершэння. Аператары должны магчымае перзапускати крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыемлі. Файлы сераўнавальнага сераўна, хранілішчы секрэтных дадзеных і флагі функций должны быць у аднам месца, якое аператары можаць пераглядаць, не чытаяўшы весь граф. Шаблоны інструментаў трэба строго абмежыць. Широкія параметры у вигляде вольнага тексту спрыяюць втручанню з боку зловершальнікаў і робяць перагляды даскладнымі. Ёнколі гаворыць пра тое, чаму выбіраецца LangGraph для агентаў ReAct, перш чым зменіць код, неабходна задаць вхідныя даны, абавесця крока і критэрыі завершэння. Аператары должны магчымае перзапускати крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Валіць кращэ маленькія, тэставаныя елементы над велікімі скрыптамі. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную абавесцю, а не на заплутаны ланцужок задач.
Асалідныя проблемы: ReAct — это машына станоў, а не запрос
У раздзеле «Асалідныя проблемы: ReAct — это машына станоў, а не запрос» неабходна праказаць вхідныя даны, абавесця крока і крэтыніяты выходу пры перадзеўці коду. Аператары должны магчымае пераўстаць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Спрыяйце цім этапу як кантракту межа вхіднымі данымі і падтвердзенымі выходамі. Дайце назвы артыфактам, праказаць крэтыніяты успеху і адмовіцеся ад бяспечнага частковага завершэння. Зробіце точку контролю пасля дорогіх вызоў модэлю, каб перапрыбутак не прабіваў за тую ж самую роботу.
Што ламаецца без LangGraph
Для тых задач, які не працуюць з LangGraph, паказвайце вхідныя даны, адміністратара крока і критэрыя завершэння пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісвайце час выконання і вартасць разам з функцыональнымі рэзултатамі. Відразы ведаць дапамагае ухиліцца ад неспакоўных рахунков, калі траекторыя пераходзіць з дэмовай среды ў спадзеленую. Ствараюце точку контролю пасля дорогіх вызоў модэлю, каб перзапуск не прыносіў дадатковых збораў за тую ж работу.
1. Няявны праймус кантролю
Для 1. Нявучага прабегу кантролю неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя выходу пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Конфігурацыю трэба залічыць паза кодам прыкладнення. Файлы сераўіса, хранальнікі секрэтных данных і флагі функцый належаць у аднам месца, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Заставляйце выконвацца точкі контролю пасля дорогіх вызоў модэлю, каб перзапуск не прабіваў зноў тую ж самую роботу. Для 1. Нявучага прабегу кантролю неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і критэрыя выходу пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Валічыце маленькія, тэставальныя елементы працы над велікімі, заплутанымі скрыптамі. Калі крок не выконваецца, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцуг задач.
while True:
llm_output = llm(prompt)
if "Action:" in llm_output:
tool_result = call_tool(...)
else:
break
2. Шкодзябна адарожка стану
Для 2. Управленьня шкодзяблым станам неабяжна прадэфінаваць вхідныя даны, адпаведальную особу за кожны крок і критэрыі завершэння пры змяне коду. Аперацыйныя працавнікі должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце гэтам этапу як кантракту межа вхіднымі данымі і падтверджанымі выходнымі рэзультатамі. Даўце назвы артыфактам, прадэфінаваць перакананняя ў успеху і адмовіцеся ад беззвучнага частковага завершэння. Раздзеліце планаванне ад выконання інструментамі. Планавальнік пропонуе; выконавацель вносіць змяны; пераканальнік пераканваецца ў рэзультатах па адносу да цялевай меты.
3. Не існуе семанікі цыкла першага класу
Для пункта 3. З-бою наявнасці семантыкі цыкла першага класу, пярэд тым, як зменіць код, неабходна ўзначыць вхідныя даны, абавесця крока і критэрыі выходу. Аператары должны магчымае перадзеісцаваць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час і вартасць праз адныя з функцыональных рэзультатаў. Ранняя відкрытасць запобегае неспакоўным рахункам, калі траекторыя пераходзіць з дэмавай версіі ў спяльныя сераўысы. Раздзеляйце планаванне і выконанне інструментамі. Планавальнік прыметляе варыянты; выконавальнік іх рэалізуе; пераканальнік пераглядае рэзультаты за адносам да цялевага рэзультата.
4. Недастатковая готовасць да працы ў працэсе
Для пункта 4. Недастатковая готавальність даўнасці: перш чым зменяць код, неабходна визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымае перайсці канкрэтны крок з вядомага пункта контролю, не спрабоўваючы здогадвацца пра схованы стан. Конфігурацыю трэба знаходзіць паза кодам прыкладнення. Файлы сераўіса, хранільнікі секрэтных данных і флагі функцый належаць у аднам месца, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг задач. Неабходна раздзеліць планаванне і выконання знарядзяў. Планавальнік прымечае варыянты; выконавальнік іх рэалізуе; пераканальнік пераглядае рынкты выкарыстоўваючы цялевы параметр. Для пункта 4. Недастатковая готавальність даўнасці: перш чым зменяць код, неабходна визначыць вхідныя даны, адпаведальнага за крок і критэрыя завершэння. Аператары должны магчымае перайсці канкрэтны крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выйшоў, прычына нехацяканага рэзультата должна быць аднаковая, а не стаўкаваная ў заплутаны ланцуг задач.
Ключовыя концэпціі ў LangGraph (падход, які прыоритэтнае ставі агента)
Для ключовых концэпцій у LangGraph (падход, які прыоритэтнае ставі агента) неабходна прадзефініраваць вхідныя даны, абоўтчыка крока і критэрыя завершэння працы перад змінайом коду. Аператары должны магчымае перзапускать крок з вядомай точкі контролю, не прабуючы спадараць прыхованы стан. Спрыяйце цім этапу як даговору межа вхіднымі данымі і падтверджанымі выходнымі рэзультатамі. Даўце назвы артыфактам, прадзефініруйце перакананняя пра успех і адмовіцеся ад беззвучнага частковага завершэння. Строго адганяйце схемы інструментаў. Шырокія параметры у вільным тексте спрыяюць втручанню з боку зловершальнікаў і робяць аудыты дорогімі.
1. Стан: памяць агента
Для 1. Стану: «Памяці агента» неабяжна ўзначыць вхідныя даны, абавесця крока і крэтыры выходу пры зміне коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Запісвайце час і вартасць праза функцыональныя рэзултаты. Відразліва візуабільнае прадставленне запобегае неспакоўным рахункам, калі траекторыя пераходзіць з дэмавай версіі ў спяльныя сераўы. Строго абмежвайце схемы інструментаў. Шырокія параметры у відкрытым формате спрыяюць атакам і робяць аудыты дорогімі.
2. Вузлы: канцэптуальныя та аперацыйныя елементы
Для 2. Ягоў: канцэптуальных та аперацыйных ейкаў, перад змянай коду неабходна задаць вхідныя даны, абавесця крока та крэтарыі выходу. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без неабясненняя схованага стану. Конфігурацыю трэба знаходзіць за межамі коду прыкладнення. Файлы сераўнавальнага сяродавішча, хранілішчы секрэтных дадзеных та флагі функцияў должны быць у аднам месца, якое аператары можаць пераглядаць без неабясненняя всей структуры. Шырокія параметры у вигляде вольнага тексту спрыяюць атакам на систему та ускладнююць перагляд звязей. Для 2. Ягоў: канцэптуальных та аперацыйных ейкаў, перад змянай коду неабходна задаць вхідныя даны, абавесця крока та крэтарыі выходу. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю без неабясненняя схованага стану. Валідзіце маленькія, тэставаныя ейкі замест большых скрыптов. Калі крок не выканаецца, прычына неудачы должна вказываць на адну конкрэтную абавесцю, а не на заплутаную структуру працы.
3. Краі: Явны ўправленьні прабегам
Для раздзела 3. Краі: Явны ўправленьні прабегам неабходна перад змянай коду задаць вхідныя даны, адпаведальнага за выкананне крока і критэрыя завершэння. Аперацыі должны магчымае перадзягнуць крок з вядомай точкі контролю, не спрабоўваючы здогадвацца пра схованы стан. Спрыяйце цім этапу як даговору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаць перакананні на успех і адмовіцеся ад беззвучнага частковага завершэння. Зробіце точку контролю пасля дорогіх вызоў модэлю, каб перадзяганне не прабавала знову оплаціваць тую ж самую роботу.
4. Дэтэрміністычнае выкананне з гнекамасцю
Для 4. Дэтэрміністычныя выконанні з гнучкасцю: перад зменым коду неабяжна задаць вхідныя даны, адпаведнага власніка крока і критэрыя завершэння. Аперацыіям павінна быць можлівасць перзапускаць крок з вядомага пункта контролю, не прыпускаючы стану, які залишаецца незрозумелым. Запісваць час выконання і витраты разам з функцыйнальнымі рэзултатамі. Вялікая відкрытасць з самага пачатку запобегае неспакоўным рахункам, калі процес пераходзіць з дэмавайнага режыма ў спяльныя сераўеры. Ствараць пункт контролю пасля дорогіх вызоў модэлю, южы перзапуск не прыводзіў да паўтарнага нарахоўвання за тую ж работу.
ReAct + LangGraph: ідеальная пара
Для ReAct + LangGraph: гэта наступны выклік. Перш чым зменяць код, неабходна ясная працэвыканне вводных дадзеных, адпаведнага власніка крока і крэтарыяў завершэння. Аператары должны магчымае перзапускати крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічваць параду ад коду прыкладнення. Файлы сераўіса, хранальнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаючы весь граф. Здзейсніце точку контролю пасля дорогіх вызоў модэлю, каб перапрынцыпаванне не прабівало зноў адрабатваць тую ж самую роботу. Для ReAct + LangGraph: гэта наступны выклік. Перш чым зменяць код, неабходна ясная працэвыканне вводных дадзеных, адпаведнага власніка крока і крэтарыяў завершэння. Аператары должны магчымае перзапускати крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Валідзіце маленькія, тэставаныя елементы працэўкання ў працоўкі з вялікімі, заплутанымі скрыптамі. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцоўкі працэўкання.
Сцэна выкарыстання: Памочнік з анулюванням броні ў готэле (палітыка + расчыт вярнення)
Для сцэны выкарыстання «Памочнік з анулюванням броні ў готэле (палітыка + расчыт вярнення)» неабходна прадзефінавацыя вхідных дадзеных, адпаведальнага за кожны крок і крэтарыя завершэння працы перад змінайом коду. Аператары должны магчымае перазапусканне кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цім этапу як даговору межа вхіднымі дадзенымі і перакананымі выходнымі рэзультатамі. Дайце назвы элементам, прадзефінавацыя крэтароў успеху і адмовіцеся ад беззвучнага частковага завершэння. Раздзеліце планаванне ад выконання інструментам. Планавальнік прымець план; выконаваць здзейснія змяны; пераканальнік пераканае рэзультаты па адносу да цялевай меты.
Формулюванне проблемы
Для апісання проблемы неабяжна прадзефінаваць вхідныя даны, адпаведальнага за крок і крэтыяры завершэння пры перадзеўці коду. Аперацыйныя працавнікі должны магчымае перадзначыць крок з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Раздзеляйце планаванне ад выконання інструментаў. Планавальнік прымечвае варыянты; выконавальнік іх рэалізуе; пераканальнік пераглядае рынукты па адносу да цялі.
Крок 1: Установіць залежнасці
Раздзеляйце планаванне ад выконання інструментаў. Планавальнік прымечвае варыянты; выконавальнік іх рэалізуе; пераканальнік пераглядае рынукты па адносу да цялі.
pip install -U langgraph langchain langchain-openai
export OPENAI_API_KEY="..."
Крок 2: Прадзефінаваць інструменты (ваашы «Дзеянні»)
Строга абмежыце схемы інструментаў. Шырокія параметры у вольным тексте спрыяюць атакам і робяць аудыты дорогімі.
from typing import TypedDict, Annotated
from datetime import datetime
import json
from pydantic import BaseModel
from langchain_openai import ChatOpenAI
from langchain_core.messages import (
BaseMessage,
HumanMessage,
ToolMessage,
SystemMessage
)
from langchain_core.tools import tool
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langgraph.prebuilt import tools_condition
@tool
def get_cancellation_policy(rate_plan: str) -> str:
"""
Returns cancellation policy text for a given rate plan.
"""
policies = {
"flexible": "Free cancellation until 24 hours before check-in. After that, first night is charged.",
"semi-flex": "Free cancellation until 72 hours before check-in. After that, 50% of the stay is charged.",
"non-refundable": "No refund after booking. Full stay amount is charged on cancellation."
}
key = rate_plan.strip().lower()
return policies.get(key, "Policy not found. Supported: flexible, semi-flex, non-refundable.")
@tool
def calculate_refund(
rate_plan: str,
check_in: str,
cancel_date: str,
nightly_rate: float,
nights: int
) -> str:
"""
Calculates refund amount based on a simplified policy model.
Dates format: YYYY-MM-DD
"""
rp = rate_plan.strip().lower()
ci = datetime.strptime(check_in, "%Y-%m-%d").date()
cd = datetime.strptime(cancel_date, "%Y-%m-%d").date()
total = nightly_rate * nights
days_before = (ci - cd).days
if rp == "non-refundable":
refund = 0.0
charged = total
rule = "Non-refundable: no refund."
elif rp == "flexible":
if days_before >= 1:
refund = total
charged = 0.0
rule = "Flexible: cancelled >= 24h before check-in, full refund."
else:
charged = nightly_rate # 1 night penalty
refund = max(total - charged, 0.0)
rule = "Flexible: late cancel, 1 night charged."
elif rp == "semi-flex":
if days_before >= 3:
refund = total
charged = 0.0
rule = "Semi-flex: cancelled >= 72h before check-in, full refund."
else:
charged = 0.5 * total
refund = total - charged
rule = "Semi-flex: late cancel, 50% charged."
else:
return "Unsupported rate plan. Use: flexible, semi-flex, non-refundable."
return (
f"Rule: {rule}\n"
f"Days before check-in: {days_before}\n"
f"Total: ${total:.2f}\n"
f"Charged: ${charged:.2f}\n"
f"Refund: ${refund:.2f}"
)
Крок 3: Стварыць цыкл ReAct у LangGraph (Разумовая дзеяння → Інструмент → Разумовая дзеяння)
Строга абмежыце схемы інструментаў. Шырокія параметры у вольным тексте спрыяюць атакам і робяць аудыты дорогімі.
from typing import TypedDict, Annotated
from langchain_core.messages import BaseMessage, HumanMessage
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
from langchain_core.tools import Tool
from langgraph.prebuilt import ToolNode, tools_condition
# 1) Define state
class AgentState(TypedDict):
messages: Annotated[list[BaseMessage], add_messages]
booking_id: str
# 2) Define structured Output schema
class RefundDecision(BaseModel):
booking_id: str
rate_plan: str
total_amount: float
charged_amount: float
refund_amount: float
policy_summary: str
explanation: str
# 2) Choose model and System prompt
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
SYSTEM_PROMPT = SystemMessage(
content="""
You are a hotel cancellation assistant.
Rules:
- Use tools when needed.
- Never guess policy or refund.
- Final answer MUST be valid JSON with this schema:
{
"booking_id": "...",
"rate_plan": "...",
"total_amount": number,
"charged_amount": number,
"refund_amount": number,
"policy_summary": "...",
"explanation": "..."
}
"""
)
# 3) Register tools
tools = [get_cancellation_policy, calculate_refund]
def safe_tool_node(state):
last_msg = state["messages"][-1]
if not hasattr(last_msg, "tool_calls") or not last_msg.tool_calls:
return {}
tool_call = last_msg.tool_calls[0]
tool_name = tool_call["name"]
if tool_name not in ALLOWED_TOOLS:
return {
"messages": [
ToolMessage(
content=f"Tool '{tool_name}' is not allowed.",
tool_call_id=tool_call["id"]
)
]
}
for tool in tools:
if tool.name == tool_name:
result = tool.invoke(tool_call["args"])
return {
"messages": [
ToolMessage(
content=result,
tool_call_id=tool_call["id"]
)
]
}
# 4)Before reasoning, check if we already processed this booking.
REFUND_MEMORY = {}
def memory_lookup_node(state):
booking_id = state["booking_id"]
if booking_id in REFUND_MEMORY:
return {
"messages": [
HumanMessage(
content=f"Cached decision found:\n{REFUND_MEMORY[booking_id]}"
)
]
}
return {}
# 5) Reasoning node: LLM decides next action (tool call) or final answer
def agent_node(state: AgentState):
# Bind tools so the model can produce tool calls
llm_with_tools = llm.bind_tools(tools)
response = llm_with_tools.invoke(state["messages"])
return {"messages": [response]}
# 6) After final decision, store it.
def memory_write_node(state):
booking_id = state["booking_id"]
final_answer = state["messages"][-1].content
REFUND_MEMORY[booking_id] = final_answer
return {}
Стварэнне і компіляцыя графа
Шэматы адзінакоў інструментаў должны быть строго абмежаны. Шырокія параметры у виглядзе вольнага тексту спрыяюць атакам на ін’екцыю та робяць аудыты дорогімі.
# 7) Build the graph
builder = StateGraph(AgentState)
# Nodes
builder.add_node("memory_lookup", memory_lookup_node)
builder.add_node("agent", agent_node)
builder.add_node("tools", safe_tool_node)
builder.add_node("memory_write", memory_write_node)
# Flow
builder.add_edge(START, "memory_lookup")
builder.add_edge("memory_lookup", "agent")
builder.add_conditional_edges(
"agent",
tools_condition,
{
"tools": "tools", # model wants to act
END: "memory_write" # model finished reasoning
}
)
builder.add_edge("tools", "agent")
builder.add_edge("memory_write", END)
graph = builder.compile()
Крок 4: Запуск агента ў конкрэтным варыянце выкарыстоўвання
Шэматы адзінакоў інструментаў должны быть строго абмежаны. Шырокія параметры у виглядзе вольнага тексту спрыяюць атакам на ін’екцыю та робяць аудыты дорогімі.
query = """
Booking details:
Rate plan: Non-Refundable
Check-in: 2026-01-20
Nights: 2
Nightly rate: 120
Cancelled on: 2026-01-18
"""
result = graph.invoke({
"booking_id": "BKG-12345",
"messages": [
SYSTEM_PROMPT,
HumanMessage(content=query)
]
})
final_output = result["messages"][-1].content
print(final_output)
Рэзультат
Шэматы адзінакоў інструментаў должны быть строго абмежаны. Шырокія параметры у виглядзе вольнага тексту спрыяюць атакам на ін’екцыю та робяць аудыты дорогімі.
{
"booking_id": "BKG-12345",
"rate_plan": "Non-Refundable",
"total_amount": 240.0,
"charged_amount": 240.0,
"refund_amount": 0.0,
"policy_summary": "Non-refundable bookings do not allow refunds after confirmation.",
"explanation": "The booking was made under a non-refundable rate plan, which charges the full stay amount regardless of cancellation timing."
}
Што адбываецца внутршняя частка (працэс ReAct)
Шэматы адзінакоў інструментаў должны быть строго абмежаны. Шырокія параметры у виглядзе вольнага тексту спрыяюць атакам на ін’екцыю та робяць аудыты дорогімі.
1) Мысль (Аналіз)
Шэматы адзінакоў інструментаў должны быть строго абмежаны. Шырокія параметры у виглядзе вольнага тексту спрыяюць атакам на ін’екцыю та робяць аудыты дорогімі.
2) Дзеянне (Выклік інструмента)
Шэматы адзінакоў інструментаў должны быть строго абмежаны. Шырокія параметры у виглядзе вольнага тексту спрыяюць атакам на ін’екцыю та робяць аудыты дорогімі.
3) Абсарбаванне (рэзультаты інструментаў)
Контрольны пункт пасля дорогіх вызоў модэлю, каб перапрытак не практыкаваў падаток знову за тую ж работу.
4) Апошнія адказы
Контрольны пункт пасля дорогіх вызоў модэлю, каб перапрытак не практыкаваў падаток знову за тую ж работу.
Чаму гэта ўважаецца “ReAct” (а не проста інструментамі)
Контрольны пункт пасля дорогіх вызоў модэлю, каб перапрытак не практыкаваў падаток знову за тую ж работу.
Вывык
Раздзеліце планаванне ад выконання інструментаў. Планавальнік прыметляе; выконаваць зменяе; пераканальнік пераглядае рэзультаты па адносу да цялі.
Чэк-ліст для эксплуатацыі
Строга абмежыце схемы інструментаў. Шырокія аргументы у вільнай формату спрыяюць зловжыванням і робяць аудыты дорогімі.
Умовныя рэлейсы должны кодаваць бізнес-правіла як іменаваныя функцыі, а не як закапаны тэкст запросу.
Разместіце типы разам з компанентамі і трывожце ўсе атрыбуты. Шырокія калекцыі атрыбутаў становяцься боргам, які TypeScript меў на мету запобiec.
Напісце карточку з інструкцыямі: як ротавацыя ключоў, як спрабаваць з’ядзець кялейку, як анулюваць пасляпэльныя змены.