Агентны AI на LangChain, частка 7: шматагентныя сістэмы
Частка 7 пра агентны AI на LangChain: шматагентныя сістэмы ў LangGraph, як агенты дзеляць працу, перадаюць стан і збіраюць вынік.
Крыніцы: Agentic AI with LangChain — Part 7: Building Multi-Agent Systems with LangGraph
У гэтым карыце парадоксу перадстаўляецца шлях ад сыр'ёчных матэрыялаў да рабочай сістэмы для: Агентнага ІІ з LangChain — Частка 7: Стварэнне мульты-агентных сістэм з LangGraph. Акцэнт ставіцца на практычныя крокі, чыстае перакананне і код, які можна проста дадаць у рэпазітарый без неабяснення меты. У стадзіі агульнага відгледу неабходна практычна апісацыя вхідных дадзеных, адпаведальнага за крок і крэатарыяў завершэння працы перш чым зменіць код. Аператары должны магчымае перадзначыць крок з вядомай точкі контролю без неабяснення схованых станоў. Неабходна адзіночна задокументаваць шлях успеху і шлях вяснавання проблем. Перапрыбуткі, людзкія перакананні і апрацоўка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
Чаму мульты-агенты важны
Калі працюеце над этапам «Чаму важлівы калькольнікі», спачатку запісайце умовы калькольніка: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс контроля дапамагае заліцвачыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына нявыпання павінна вказываць на адну адповядальнасць, а не на заплутаны ланцюг задач. Зробіце перапактаванне пасля дорогіх крокаў. Програма не павінна зноў сцягваць плата за той самы вызов LLM, калі аператар праказвае пазнейшы вузел.
Тэхнічныя панявы, якія выкарыстоўваюцца ў гэтым артыкуле
Калі працюеце над Тэхнічнымія концэпцыямі, якія вікорыстоўваюцца на данай стадзіі, спачатку запісаце кантракт: неабходныя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага нэуспеху. Такі спіс пераканальвае застаўляцца чыстасцю пазнейшых змян у кодзе. Спрыятлівае ставленне да гэтай стадзіі як да кантракта межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даце назвы артыфактам, задаце крытэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння. Паставіце контрольны пункт пасля дорогіх крокаў. Сістэма адновлення не павінна занова сцягваць плата за той самы вызыв LLM, калі аператар прабуе зноў запрацаваць пазнейшы вузел.
Аптака праекта: Агент-фінансавы асістэнт
Калі працуеце над стадзіяй «Аптэкстракцыя фінансавых дадзенняў» у частцы «Адгляд праекта», спачатку запісайце умовы кантракту: неабходныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Запісвайце час выканання задач і кост токенаў або запытаў праза функцыйнае рэзультат. Відкрытыя даны пра косцы з’являюцца раніце, таму не будзе неспакою з рахункамі, калі працэс перайдзе з дэмаверсіі ў спяльныя асяроддзя. Зробіце контрольную пазнаку пасля дорогіх крокаў. Сістэма не должна зноў нарахоўваць косты за той самы вызов LLM, калі аператар прабуе зноў выконаць пазнейшы элемент. Калі працуеце над стадзіяй «Аптэкстракцыя фінансавых дадзенняў» у частцы «Адгляд праекта», спачатку запісайце умовы кантракту: неабходныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Дакументавайце як шлях успеху, так і шлях вярнення да нормы. Прабулі, людзкія етапы перагляду і апрацоўка некорэктных дадзенняў ёсць часткай продукту, а не пазнейшым дапрацоўкам.
1. Канфігурацыя сістэмы
Этап 1 «Каналізацыя сістэмы» працюе наўсёй лепшая, калі яго розглядаць як вімерную плошчу. Зафіксавайце адны ідэальны прыклад працы, адзін прыклад неудачы і запіс пра вярненне да поперадньего стану, перш чым расшырваць сферу дзеяння. Валідзіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшоў, прычына неудачы павінна вказываць на адную конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Рэзультаты працы графа павінны быць простымі і з адначытаемым тыпам. Вярнутыя структуры маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакоююць продовжэнне працы пасля перэрываў.
OPENAI_API_KEY="<Your OpenAI API Key>"
LANGSMITH_TRACING=true
LANGSMITH_ENDPOINT="https://api.smith.langchain.com"
LANGSMITH_API_KEY="<Your LangSmith API Key"
LANGSMITH_PROJECT="agent-ai"
class BaseConfig(BaseSettings):
OPENAI_API_KEY: Optional[str]
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
2. Структура праекта
Этап структуры праекта „2“ работае наяўней, калі яго спрыяваць як мерыемую плошчу. Зафіксавайце адны ідэальны прыклад працы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расшырваць масштабы праекта. Спрыявайце гэты этап як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы всім элементам, задаце крытэрыя успеху і не падзеўляйцеся частым, непূরным вікананнем задач. Храніце стан графа ў простам і тыпаваным фармаце. Вкладзеныя элементы маскуюць інфармацію пра тое, які вузел запісаў канкрэтны поле, і спакшваюць продажчыку працу пасля перарываў.
project/
├── tools/
│ ├── __init__.py
│ ├── financial_search.py # fetch stock prices for companies
│ ├── python_REPL.py # async wrapper of PythonREPL()
| └── wikipedia_search.py # fetch financial summary of companies
│
├── graphs/ # implement subagents and multi-agents
│ ├── agent.py # implement research and analyst in a single agent
│ ├── sub_agents.py # implement research and analyst sub agents
│ ├── multi_agent_supervisor.py # implement supervisor multi-agents
│ └── multi_agent_swarm.py # implement swamp multi-agents
│
├── config.py # pydantic BaseConfig
│── utils.py # utility for printing and executing agents
├── .env # environment variable definition
├── .gitignore
└── requirements.txt # package requirements
3. Артыкулы дапаможніка па фінансавым каштоўнасткам
«3 Tools of the stage» працюе найэфектывней, калі яго спрыяваць як мерыемую паверхню. Зберагачыце адны ідэальны прыклад працы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Запісвайце часы выканання аперацый, а таксама косты токеноў чы выкарыстоўвання запытав, праз адныя з рэзультатаў функцыональнай працы. Візуабілізація костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмовай асяроддзя ў спяльныя сераўеры. Актуалізавайце інструменты з вузкімі схемамі і чысткіма пазначэнням побачных эфектаў. Адпаведальныя за хоставанне должны ведаць, якія вызовы мутуюць стан сістэмы, перш чым автаматычна ўзьмяць рашэнне. «3 Tools of the stage» працюе найэфектывней, калі яго спрыяваць як мерыемую паверхню. Зберагачыце адны ідэальны прыклад працы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перад расшырэнням масштаба. Дакументавайце як шлях успеху, так і шлях вярнэння да нормальнага стану. Перапрыбуткі, людзкія перакрыцця і апрацоўка некорэктных паведамленняў ёсць часткай продукту, а не чымсь, што дадаецца пазней.
3.1. Інструмент для пошуку дадзейнаў
Для этапы 3 1 Stock Data неабяжна ўзначыць вхідныя даны, адпаведальнага за этап і крэтыры завершэння пры перадзеіснавленні коду. Аператары должны магчымаць перзапуск этапу з вядомай точкі контролю, не падозрываючы схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі этап не выконваецца, прычына нехарактэрства должна вказываць на адзіну адпаведальнасць, а не на заплутаны ланцюг задач. Автэнтыфікуйцеся на входзе і парадзеўладавайце зноў на роўні дадзенняў. Толькі токэн-носіцель не ёсць межай адпаведальнасці.
# define LangChain tool to retrieve stock data
@tool
async def stock_data_tool(
company_ticker: Annotated[str, "The ticker symbol of the company to retrieve their stock performance data."],
num_days: Annotated[int, "The number of business days of stock data required to respond to the user query."]
) -> str:
# fetch stock data asynchronously from yfinance
# check full code for _fetch_stock_sync function
df = await asyncio.to_thread(_fetch_stock_sync, company_ticker, f"{num_days}d")
return (f"Successfully executed the stock performance data retrieval tool to retrieve "
f"the last *{num_days} days* of data for company **{company_ticker}**:\n\n{df.to_markdown()}")
3.2. Адзінак выканання коду на Python
Для этапы 3.2 «Код на Python» неабяжна прадзецьвячы інпуты, адпаведнага власніка крока і крэтарыя выходу пры змены коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы схованы стан. Спрыяць гэтай этапы як кантракту межа інпутамі і падтвердзенымы выходам. Даць назву артыфактам, прадзецьвячы перакананні на успех і адмовіцца ад тыхоўскага частковага завершэння. Разлучыць стварэнне кліента ад цыклу паведамленняў, каб было можна змяніць прадстаўніка без перапісвання машыны стану размовы.
@tool
async def python_repl_tool(
code: Annotated[str, "The python code to execute to generate your chart."],
) -> str:
# wrap LLM generated code and execute it by python.REPL()
# repl = PythonREPL().
clean_code = textwrap.dedent(code).strip()
result = await asyncio.to_thread(repl.run, clean_code)
return (
f"Successfully executed the Python REPL tool.\n\n"
f"Python code executed:\n```python\n{code}\n```\n\n"
f"Code output:\n```\n{result}```"
)
3.3. Адзінак пошуку у Вікіпедыі
Для этапы пошуку у Вікіпедыя 3 3 неабходна прадзефінаванне вхідных дадзеных, адпраўніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчыма было перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Запісваць час выканання і кост токена або запыту разам з функцыйнальнымі рэзултатамі. Відразы коста з самага пачатку запобегае неспакоўным рашчыткам, калі працэс пераходзіць з дэмовай асяроддзя ў спакульную. Автэнтыфікацыя прабывае ў шлюзе, а павторная автарызацыя — у плане дадзеных. Толькі токен-носіцель не ўтварае межы арэны выкарыстоўвання. Для этапы пошуку у Вікіпедыя 3 3 неабходна прадзефінаванне вхідных дадзеных, адпраўніка крока і крэтарыяў завершэння працы перад зменым коду. Аперацыйныя працавнікі должны магчыма было перзапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Адначасова документаваць успешны і варыянт вяснавання проблем. Перапрыбуткі, людзкія контрольны пункты і обработка некорэктных запытаў ёсць часткай продукту, а не пасляднім дапрацоўкам.
@tool()
async def wikipedia_tool(
query: Annotated[str, "The Wikipedia search to execute to find key summary information."],
) -> str:
"""Use this to search Wikipedia for factual information asynchronously."""
headers = {"User-Agent": "MyLangChainAgent/1.0 (contact@example.com)"}
async with httpx.AsyncClient(headers=headers, follow_redirects=True) as client:
# Step 1: Search Wikipedia for matching pages
search_url = "https://en.wikipedia.org/w/api.php"
search_params = {
"action": "query",
"list": "search",
"srsearch": query,
"format": "json"
}
response = await client.get(search_url, params=search_params)
search_data = response.json()
results = search_data.get("query", {}).get("search", [])
title = results[0]["title"]
# Step 2: Fetch the page extract/summary
summary_url = f"https://en.wikipedia.org/api/rest_v1/page/summary/{title}"
summary_res = await client.get(summary_url)
summary_data = summary_res.json()
summary = summary_data.get("extract", "No summary available.")
return f"Successfully executed:\nWikipedia summary: {summary}"
4. Swarm Multi-Agents
Працюючы над стадыяй 4 Swarm Multi-Agents, спачатку запішыце умовы працы: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць па частый неякосці. Такі спіс контроля дапамагае залічваць змяны ў кодзе чыста. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, неякосць должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Зробіце перапактаванне пасля дорогіх крокаў. Програма не должна зноў ставіць плату за той самы вызов LLM, калі аператар праканае выконанне наступнага вузла.
4.1. Архітэктура Swarm Multi-Agents
Калі працуеце з архітэктурой 4 1 стадзіі, спачатку запісайце умовы дагавору: неабяжлівыя вхідныя даны, сігнал успеху і тое, што выходзіць у разе частковага нявыпання. Такі спіс пераконтроўвае, каб пазнейшыя змены коду былі чыстымі. Спрыятлівае ставленне да гэтай стадзіі як да дагавору межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаце крытэрыя успеху і не падзволяйце частковаму завершэнню без паведамлення. Зробіце пераконтроль пасля дорогіх крокаў. Програма для продакцыі не павінна зноў сцягваць плата за той самы вызов LLM, калі аператар прабуе зноў запрацаваць з пазнейшым вузлам.
4.2. Адкаляканне мнага-агентаў у фармаце Swarm
Калі працуеце над стадзіяй 4 2 Swarm Multi-agents, спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Такі спіс контроля дапамагае залічваць пазнейшыя змены коду чыста і прозрачна. Запісвайце час выканання задач і кост токеноў або запытаў разам з функцыйнальнымі рэзултатамі. Відразы костаў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя асяроддзя. Зробіце контрольную пазнаку пасля дорогіх крокаў. Функцыя вярнення не должна зноў ставіць плату за той самы вызов LLM, калі аператар прабуе зноў выканаць пазнейшы вузел. Калі працуеце над стадзіяй 4 2 Swarm Multi-agents, спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага неяксамоства. Такі спіс контроля дапамагае залічваць пазнейшыя змены коду чыста і прозрачна. Дакументавайце як шлях успеху, так і шлях вярнення да нормы. Прабулі, людзкія контрольныя пункты і обработка некорэктных запытаў ёсць часткай продукту, а не пазнейшым дапрацоўкам.
llm = ChatOpenAI(api_key=api_key, model="gpt-4o-mini")
# Create a handoff tool for researcher -> analyst
transfer_to_analyst = create_handoff_tool(
agent_name="analyst",
description="Transfer user to the analyst assistant, who can create visualizations of provided data.",
)
# create research agent as a subagent
research_agent = create_agent(
llm,
tools=[wikipedia_tool, stock_data_tool, transfer_to_analyst],
system_prompt="You provide summaries from Wikipedia, and can query load raw, numerical stock performance data.",
name="researcher"
)
# define the checkpointer
checkpointer = InMemorySaver()
# create swarm agents
swarm_agent = create_swarm(
agents=[research_agent, analyst_agent],
default_active_agent="researcher"
).compile(checkpointer=checkpointer)
5. Supervisor Multi-Agents
Этап 5 «Supervisor Multi-Agents» працюе найкрашча, калі яго розглядаць як вімерную паверхню. Зафіксавце адна «золатая» транскрыпцыя, адзін прыклад неудачы і запіс пра вярненне да пачатковага стану перш чым расшырваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Рэзервавайце стан графа ў простам і тыпізаваным фармаце. Вкладныя структуры маскуюць інфармацыю пра тое, калькі вузел запісаў калькія поля, і спакоююць працу пасля перэрываў.
5.1. Архітэктура Supervisor Multi-Agents
Архітэктура 5 1 для стадыйных заданняў работае наякша, калі яе спрыяваць як мерыемую паверхню. Запісаце адна «золатая» версія, адын прыклад неудачы і прыметку па вярнэнню да пачатковага стану пры расшырэнні масштаба. Спрыяйце гэтай стадыі як кантракту межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце крытэрыя успеху і адмовіцеся ад тыхняй, непавной завершэнні задання. Храніце стан графа ў простам і тыпаваным фармаце. Вкладзеныя блокі маскуюць інфармацыю пра тое, які вузел запісаў кожны поле, і спакоююць продажчык задання пасля перарываў.
5.2. Адбудова супервізора з калькольнікае агентаў
Этап 5 2 Supervisor Multi-agents працюе найкрашча, калі яго розглядаць як вімерную паверхню. Зафіксавце адны ідэальны прымер, адны кейс неудачы і прыметку па вярнэнні да пачатковага стану пры розшырэнні масштаба. Запісвайце часы выканання і косты токеноў або запытак праза функцыйнае рэзультат. Відкрытыя даныя пра косты з’являюцца рана, таму не будзе неспакою з расчыткамі, калі працэс перэйдзе з дэмаверсіі ў спяльныя асяроддзя. Храніце стан графа ў простам і тыпаваным фармаце. Вкладзеныя блокі маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакшуюць продовжэнне працы пасля перарываў. Этап 5 2 Supervisor Multi-agents працюе найкрашча, калі яго розглядаць як вімерную паверхню. Зафіксавце адны ідэальны прымер, адны кейс неудачы і прыметку па вярнэнні да пачатковага стану пры розшырэнні масштаба. Дакументавайце як успешны, так і вярнучыся паты. Перапрыбуткі, людзкія контрольныя пункты і обработка непрацюючых паведамленняў ёсць часткай продукту, а не чымсь, што дадацца пазней.
llm = ChatOpenAI(api_key=api_key, model="gpt-4o-mini")
# create a checkpointer
checkpointer = InMemorySaver()
# create research subagent
research_agent = create_agent(
llm,
tools=[wikipedia_tool, stock_data_tool],
system_prompt="You provide summaries from Wikipedia, and can query load raw, numerical stock performance data.",
name="researcher"
)
# Create the supervisor multi-agent graph and compile it
supervisor = create_supervisor(
model=llm,
agents=[research_agent, analyst_agent],
prompt=(
"You are a supervisor managing two agents:\n"
"- a research agent. Assign research and data collection tasks to this agent\n"
"- an analyst agent. Assign the creation of visualizations via code to this agent\n"
"Assign work to one agent at a time, do not call agents in parallel.\n"
"Do not do any work yourself."
),
add_handoff_back_messages=True,
output_mode="last_message"
).compile(checkpointer=checkpointer)
6. Заключныя выводы
Для 6-й этапы Заключнага падзеўкі неабходна ўскладніць вхідныя даны, адпаведальную особу за крок і крытэрыя завершэння прычымкі коду. Аперацыйныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест большых скрыптов. Калі крок не выконваецца, прычына нехарактэрыстыкі павінна вказываць на адзін конкрэтны аспект, а не на заплутаны ланцюг задач. Неабходна людская апраўда для тых крокоў, якія ведуць да выдаткаў грошаў або змяні дадзэнняў у працоўным рэжыме. Компіляцыйныя налашчэння не ёсць падтверджэннем полнай адпаведнасці працы сістэме.
Чэк-ліст для аперацый
Стадыя Чэк-ліста для аперацый работае наўзям лепш, калі яе спрыймаюць як меравальную плошчу. Перад расшырэнням масштаба неабходна зафіксаваць адзін ідэальны прыклад працы, адзін кейс нехарактэрыстыкі і прыметкі па адвярнэнню змян.
Зберагаюце канфігурацыю пазначкай за межамі коду прыемліка. Файлы сяродавішчыны, храненні секрэтных дадзей і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаюць адбавіць аўдыт без неабяжнага чытання всей структуры.
Зберагаюце стан графа ў простам і тыпаваным фармаце. Вярнутыя блокі дадзей маскуюць інфармацыю пра тое, які вузел запісаў якое поле, і спакоююць працэс пасля перарываў.
Калі дозволяе бюджэт, дадаце тэст на перакананне, які працюе з крытычным маршрутом у сістэме CI за дапамою фіксатываў, а не з рэальнымі платнымі API.
Документаваць трэба як шлях успеху, так і шлях вяснавання. Перапрыбуткі, людзкія контрольныя пункты і обработка некорэктных дадзей ўжо ёсць часткай продукту, а не чымсь, што дадаецца пазней.
Зберагаюце стан графа ў простам і тыпаваным фармаце. Вярнутыя блокі дадзей маскуюць інфармацыю пра тое, які вузел запісаў якое поле, і спакоююць працэс пасля перарываў.