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

ReAct-агент у LangChain: выканаўцы, чарнавікі і іх межы

Будуем ReAct-агента з інструментамі, разбіраем, як агент і AgentExecutor дзеляць працу, і чаму LangGraph лепш спраўляецца з патокам кіравання, цыкламі і станам.

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

Крыніцы: Langchain Part 17 — End to End Agent Building

Што такое агент

Агент ШЫ — гэта сістэма, якая бераець высокапрыгловую мету ад чалавека і пасля сама плануе, прыме рашэнні і дзеяе. Яна выкананяе серыю крокаў, выкарыстоўваючы зовнішнія інструменты, API або істочнікі знанняў, прытрымваецца кантэксту працы, робіць логічныя выводы паэтапна, корэгуецца, калі прыходзяць новыя даны, і працуе над досягненнем намечанага рэзультата.

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

Характэрыстыкі агента

  • Направлены на мету. Вы кажаеце, чаго хочаце, а не як да гэтага дасягнуць.
  • Сам плануе. Агент дзеліць проблему на часткі і параджуе задачы без дапамогі.
  • Выкарыстоўвае інструменты. Яны вызываюць API, калькулятары, сістэмы пошуку і падобнае. LLM знае, якія інструменты існуюць і калі кожны з іх павінен быць выкарыстоўаны.
  • Усвядомляе кантэкст. Ён зберагае інформацыю між крокамі, таму ранейшыя рэзультаты вплываюць на пасляйшыя дзеянні.
  • Адаптываецца. Калі ўтвараецца змяна, напрыклад, API не працюе або не хватает даных, ён перэрабоўвае план.
  • Агент, які працуе ў кодзе

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

    from langchain_openai import ChatOpenAI
    from langchain_core.tools import tool
    import requests
    
    from langchain_community.tools import DuckDuckGoSearchRun
    
    from langchain.agents import create_react_agent, AgentExecutor
    from langchain import hub # It is a place from where we can get many type of prompts, so if we want any predefined prompt, we can get it from here
    
    # Step 1: Creating tool definitions
    search_tool = DuckDuckGoSearchRun()
    
    @tool
    def get_weather_data(city: str) -> str:
      """
      This function fetches the current weather data for a given city
      """
      url = f'https://api.weatherstack.com/current?access_key=4d1d8ae207a8c845a52df8a67bf3623e&query={city}'
      response = requests.get(url)
      return response.json()
    
    llm = ChatOpenAI()
    
    # Step 2: Pull the ReAct prompt from LangChain Hub
    prompt = hub.pull("hwchase17/react")  # pulls the standard ReAct agent prompt
    # The agent which we are gonna make is a ReAct agent (reasoning + action = ReAct)
    # ReAct is a design pattern
    
    # Step 3: Create the ReAct agent manually with the pulled prompt
    agent = create_react_agent(
        llm=llm,
        tools=[search_tool, get_weather_data],
        prompt=prompt
    )
    
    # Step 4: Wrap it with AgentExecutor
    agent_executor = AgentExecutor(
        agent=agent,
        tools=[search_tool, get_weather_data],
        verbose=True # whatever the agent thinks, it will be visible to us
    )
    
    # Step 5: Invoke
    response = agent_executor.invoke({"input": "Find the capital of Madhya Pradesh, then find it's current weather condition"})
    print(response)
    
    '''
    Entering new AgentExecutor chain...
    I should first find out the capital of Madhya Pradesh and then check the current weather condition for that city.
    Action: duckduckgo_search
    Action Input: "capital of Madhya Pradesh" Madhya Pradesh, state of India that is situated in the heart of the country. It has no coastline and no international frontier. Its physiography is characterized by low hills, extensive plateaus, and river valleys. The capital is Bhopal, in the west-central part of the state. Bhopal, city, capital of Madhya Pradesh state, central India. Situated in the fertile plain of the Malwa Plateau, the city lies just north of the Vindhya Range, along the slopes of a sandstone ridge. It is a major rail junction and has an airport. Pop. (2001) 1,437,354; (2011) 1,798,218. Bhopal was Indore (/ ɪ n ˈ d ɔːr / ⓘ; ISO: Indaura, Hindi: [ɪn̪d̪ɔːr]) is the largest and most populous city in the Indian state of Madhya Pradesh. [15] It is the commercial hub of Madhya Pradesh. It is consistently ranked as the cleanest city in India. [16] It serves as the headquarters of both the Indore District and the Indore Division.It is also considered the state education hub and ... In 1956, Bhopal became part of the state of Madhya Pradesh. Bhopal district was carved out on October 2, 1972, and is one of the 45 districts in the state. 4. Why is Bhopal famous? Bhopal is the capital city of the Indian state of Madhya Pradesh. It is known as the City of Lakes due to the presence of various natural and artificial lakes. In 1948, Madhya Bharat was created, with Indore designated as its summer capital and Gwalior as its winter capital. This arrangement highlights Indore's significance even then. However, Madhya Bharat was a temporary entity, and the map of central India was soon to be redrawn. The Creation of Madhya PradeshNow that I know the capital of Madhya Pradesh is Bhopal, I can use the get_weather_data function to check its current weather condition.
    Action: get_weather_data
    Action Input: Bhopal {'request': {'type': 'City', 'query': 'Bhopal, India', 'language': 'en', 'unit': 'm'}, 'location': {'name': 'Bhopal', 'country': 'India', 'region': 'Madhya Pradesh', 'lat': '23.267', 'lon': '77.400', 'timezone_id': 'Asia/Kolkata', 'localtime': '2025-05-01 17:52', 'localtime_epoch': 1746121920, 'utc_offset': '5.50'}, 'current': {'observation_time': '12:22 PM', 'temperature': 40, 'weather_code': 116, 'weather_icons': ['https://cdn.worldweatheronline.com/images/wsymbols01_png_64/wsymbol_0002_sunny_intervals.png'], 'weather_descriptions': ['Partly Cloudy '], 'astro': {'sunrise': '05:47 AM', 'sunset': '06:48 PM', 'moonrise': '08:38 AM', 'moonset': '11:01 PM', 'moon_phase': 'Waxing Crescent', 'moon_illumination': 15}, 'air_quality': {'co': '510.6', 'no2': '1.665', 'o3': '180', 'so2': '10.175', 'pm2_5': '29.045', 'pm10': '68.635', 'us-epa-index': '2', 'gb-defra-index': '2'}, 'wind_speed': 12, 'wind_degree': 302, 'wind_dir': 'WNW', 'pressure': 1005, 'precip': 0, 'humidity': 7, 'cloudcover': 25, 'feelslike': 40, 'uv_index': 1, 'visibility': 6, 'is_day': 'yes'}}The current weather condition in Bhopal, Madhya Pradesh is partly cloudy with a temperature of 40°C.
    Final Answer: The capital of Madhya Pradesh is Bhopal, and the current weather condition in Bhopal is partly cloudy with a temperature of 40°C.
    
    > Finished chain.
    {'input': "Find the capital of Madhya Pradesh, then find it's current weather condition", 'output': 'The capital of Madhya Pradesh is Bhopal, and the current weather condition in Bhopal is partly cloudy with a temperature of 40°C.'}
    '''
    
    response['output']
    # The capital of Madhya Pradesh is Bhopal, and the current weather condition in Bhopal is partly cloudy with a temperature of 40°C.
    

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

    ReAct

    LangChain падтрымляе калькі падходаў да дызайну агентаў. Той, які практыкуецца тут, — гэта ReAct, скрацанне ад Reasoning plus Acting. Ён дазволяе модэлю перыходзіць між внутрашнім разумаваннем, тое ўзроумленнем, і зовнішнімі дзеяннямі, такімі як вызов інструмента, у структураваным цыкле, які включае калькі крокаў.

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

    Гэты патэрн падходзіць для:

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

      Як прыклад, запытайце мадэль пра населенне століцы Франціі. Спачатку ён рассуджае, што трэба выявіць століцу, шукае інфармацыю, бачыць, што адказ — Парыж, пасля рассуджае, што патрэбна інфармацыя пра населенне Парыжа, зноў шукае і нарэшце дае адказ.

      ReAct складаецца з пяці элементаў:

      • Мысль. Частныя рассуджэнні агента, пад час якіх ён ацэнюе тэкушчы стан і плануе наступны крок. Ён пояснюе, чаму выбраны конкрэтны інструмент або што ўсё ўсё ж не вядома.
      • Дзеянне. Рашэнне аб выкарыстоўванні аднаго з інструментаў з доступнага набора, які пазначаецца назвай функцыі аб API, якое трэба вызваць.
      • Вхідныя даны дзеяння. Аргументы, якія пасылаюцца да гэтага інструмента. Якшо дзеянне — search, вхіднымі данымі ёсць сам тэкст запытку, напрыклад, «пра пагоду ў Дэлі».
    • Абсарбаванне. Чыстыя даны, якія апарат вяртае пасля таго, як выконавач яго запускае. Агент чытае іх, каб выявіць, чырвонка задача завершана чы не патрэбны ўсё большыя крокі.
    • Апошная адпаведзь. Заканчоўная адпаведзь, якая ствараецца, калі агент вырашае, што у яго ўсё ёсць, і якая аб’еднвае всі абсарбаванні ў простыя словы.

    Шаблон запіту, які керуе гэтым цыклам, выглядае так:

    Answer the following questions as best you can. You have access to the following tools:
    
    {tools}
    
    Use the following format:
    
    Question: the input question you must answer
    Thought: you should always think about what to do
    Action: the action to take, should be one of [{tool_names}]
    Action Input: the input to the action
    Observation: the result of the action …
    (this Thought/Action/Action Input/Observation can repeat N times)
    Thought: I now know the final answer
    Final Answer: the final answer to the original input question
    
    Begin!
    
    Question: {input}
    Thought:{agent_scratchpad} —
    

    У тым шаблоне «Абсарвацыя» — гэта проста ўсё, што вяртаецца пасля запуску інструмента.

    Рабочыя зошыты агента

    Рабочыя зошыты функцыонуюць як кашточна памяць агента або яго рабочы ўзлёк. У іхах фіксуецца історыя тэкушчага заведама: пакульшыя «Мыслі», выконаныя «Дзеянні», такія як вызовы інструментаў, і «Абсарвацыі», якія прыйшлі назад.

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

    Назва становіцца зрозумелай, калі прыгадаеш, што LLM не мае стану. Ён не памятае сама сабою таго, што адбылося калькі секунды таму ў цікле коду. Таму LangChain берае весь історыяк ныяньшага ціклу і знову вставляе яго ў запіт кожны раз, калі запытае агента, што робіць далей.

    Агент проты AgentExecutor

    Этыя два элементы выкананяюць разныя задачы.

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

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

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

    Выконавец керуе всім цыклам:

    1. Ён адправляе вхідныя даны і пярэднія паведамленні агенту, каб агент знаў пра запіт і пра тое, што ўжо адбылася.
    2. Ён прыме наступную дзеянне ад агента.
    3. Ён запускае той інструмент з заданымі вхіднымі данымі.
    4. Ён дадае спостэрэннія інструмента да історыі.
    5. Ён адправляе адцяпленую історыю плюс запіт корыстніка назад ад агента, і гэта павтараецца, пакуль агент не скажа «Фінальная адпаведзь».

    Узяце запіт на вычысленне тэпературы ў Дэлі і палічыце яго на 10. Агент вырашае, што патрэбна інструмент для пазначэння пагоды, выканавальнік яго запускае, прыходзяць рэзультаты спазірвання, агент вырашае, што патрэбна мультыплікацыя, выканавальнік яе выкананае, і агент нарэшце дае адказ. Выканавальнік выкананае все, што думае агент.

    Меры гэтага падходу

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

    1. Чорны яшчык

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

    Разглядзім агента з інструментамі search_flights і book_flight. Унутры экзэкютара LangChain ЛММ вырашае, што будзе далей, у суперневідомым цыкле. Калі яго папрасіць заброніраць рэйс, ён можа адразу ж знайсці і заброніраць рэйс без запытання, можа ўжо за цену дзесяці тысяч долераў, калі ўжо корыстувач хацеў спачатку затвердзіць кожную пакупку. Проміжныя крокі, такія як обавязкова затверджэння, нельга строга прымусіць, таму што прабег кантролю ёсць неявным і керуецца модэлем.

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

    2. Цыклы і петлі

    Рэальныя працэйныя планы рэдка бываюць лінейнымі. Яны включаюць вярнэнне назад, выправленне памылак і петлі над набрамі дакументаў.

    • Ланцюгі LangChain пераважна праектуюцца як спрамаваныя ацыклічныя графы, таму даныя тэкуць толькі ў аднам напрамку.
    • LangGraph створаны для карыстоўвання цыкламі. Ён мадэлюе тэкучасць як карточку, у якой вузлы ўособліваюць функціі, а рэшткі — шляхі межы ямі.

    Для задачы адміністрування документаў з падазначэнням запытанняў і адпаведзей пайплайн LangChain можа запрашваць документы, пісаць адпаведзь і вяртаць яе. Калі адпаведзь некорэктная або непূরная, ён не можа сама сабою вернуцца, каб зноў запрашаць документы чы суперашчыпіць запытанне, без дадатковай ручной логікі. Калі ён вярнецца да наступнага крока, ёму нелегка зноў вернуцца, каб паспрабаваць парадкі.

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

    3. Стан і стойкасць

    Гэта мае наўбольшое значэнне для масштабавання.

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

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

    Уявіце сабе дзейнас, які трэба адрабатваць дзеўяносто дакументаў по аднаму, і які зупініцца на 7-му кроцы. Без вбудованага зберагання усё губіцца, і вам даводзіцца пачынаць з нуля, без жадных запісаў пра працэс. Калі ж стан зберагаецца пасля кожнага кроку, вы можэце пачаць знову з 7-го кроку. Таксама можна націснуць паузу, ўзначыць чалавека, які мае пераглянуць або зменіць стан, а потым продаць далей, або вернуцца да пярэднега кроку — гэта сваерадысь «паляцунак у часе». Дзейнасы з дужа довгім пераборам стаюць надзеянымі, можна ўзначыць ў якім моменце ўзначыць працэс зноў, а таксама ўжо лёгка яны дыбагаваць або аўдытаваць.

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

    Супаўязаныя матэрыялы

  • Самастабілізуючыся Kubernetes у практыцы: тры збоі, сігналы SigNoz і затверджаныя способы выправлення — Разберамо цыкл збою, зупінку за працэю з-за нехваткі памяці і рэзкы адзінаковасць токенав у кластэрэ Kind, паглядзімо, што паказвае SigNoz для кожнага з этых случаў, і што трэба зробіць, каб змяцніць сістэму, прычымнае вікорыстоўванню агента для выправлення на адной чале з AI.
  • Сістэма RAG з LangChain ад самага пачатку: чытальнікі, фрагменты, імбеддынгі, ацэнка — Поступова створаема сістэму запытанняў і адказаў на дакументах: завантажэнне файлаў, разбіўка на фрагменты, стварэнне імбеддынгаў, этапы індэксавання і выкарыстоўвання інформацыі, а таксама способы ацэнкі якасці выкарыстоўваных адказаў.
  • Стварэнне вашага першага агента LangChain з LangGraph у 2026 году — Пасляпас створыце агента LangChain з адпаведнымі інструментамі, функцыямі памяці і трэйсінгу, ухіліцеся ад чатырох распашчытых галат і пазнакоміцеся, як станцыя падтрымкі буткампа іх выкорыстоўвала.
  • Чаму фронтэнд стае складным пасля React: стан, эфекты, межы і інструменты AI — React спрыяў таму, што UI стало лёгкейша ствараць, але не лёгкейша дызайнаваць. Рэальная праца над фронтэндам заключаецца у візначэнні месца зберагчыка стану, расплутванні эфектаў, встановленні меж сістэмы і вікорыстанні коду, створанага AI.
  • Практычныя прытамакі: ваш агент AI сталкнуўся з пераканстаннем на 12-м кроку. Deep Agents ад LangChain — паследовыя інструкцыі да прытамакоў «Практычныя прытамакі: ваш агент AI сталкнуўся з пераканстаннем на 12-м кроку. Deep Agents ад LangChain»: контракты, перакрыццяі і слоты для коду для команд, якія вікорыстоўваюць гэты патэрн.