Мульти-ИИ-агент: создавайте мультиагентные рабочие процессы с помощью LangGraph и LangChain.
Мульти-ИИ-агент: создавайте мультиагентные рабочие процессы с помощью LangGraph и LangChain.

Предисловие

В эпоху ИИ каждый является сверхиндивидуальным ИИ. Появление агентного интеллекта дает нам возможность создавать сверхлюдей. Если 2024 год станет первым годом применения ИИ, то ИИ Агент станет самой яркой звездой в первый год применения ИИ. Читатель ранее оставил сообщение, надеясь поделиться дополнительной информацией об искусственном интеллекте. Метод создания интеллекта агента. В предыдущем твите мы также рассказали, как использовать ИИ Tiangong для быстрого создания набора собственного ИИ с точки зрения практических случаев. Считается, что агентский интеллект, мультимодальные возможности и возможности поиска искусственного интеллекта Tiangong AI способны удовлетворить потребности большинства людей. Сегодня я поделюсь реальным кодом, как использовать LangGraphиLangChain для создания мультиагентного Рабочего. процесс。

саморефлексия

саморефлексияизAIактерское мастерство использует генератор для получения результатов и отражатель для проверки работы генератора. И генератор, и рефлектор используют одну и ту же большую языковую модель (LLM), но каждый имеет разные подсказки, образуя тем самым саморефлексию AIактерское. мастерство。

Этот метод использования одного и того же LLM в двух разных ролях по круговому принципу достигается с помощью инфраструктуры LangGraph от LangChain. facilitated из。LangGraph Кадры также можно использовать для создания мультиагентного Рабочего процесс. как саморефлексия AI То же, что и в агентстве, LLM Может играть несколько ролей, каждая из которых действует по-своему. AI актерское мастерство. Это понятие мультиагентное.

мультиагентный

Мультиагентная система предполагает подключение независимых субъектов.,Каждый актер использует большую языковую модель.,В соответствии с конкретным расположением и комбинацией.

Каждый агент может иметь свои собственные подсказки, LLM, инструменты и другой настраиваемый код для совместной работы с другими агентами. Однако один и тот же LLM может также играть разные роли в зависимости от предоставленных подсказок.

использоватьLangGraphруководитьмультиагентный Рабочий процесс

LangGraph отлично подходит для создания мультиагентных рабочих процесс, поскольку он позволяет соединить два и более мультиагентов в одну диаграмму. Каждое актерское мастерство - независимый актер, актерское Связи между мастерствами представлены ребрами. Каждое ребро соединения может иметь условие управления, которое направляет информацию из актерского интерфейса. мастерство перетекает в другое актерское мастерство。каждыйактерское мастерство имеет статус, который может обновляться информацией во время каждого потока.

сотрудничествомультиагентный

Так же, как и человеческое сотрудничество, сотрудничество мультиагентный Рабочий Разное актерское искусство в процессе мастерство общаться через общие доски объявлений. Это делает каждое актерское мастерство можете просмотреть другое актерское мастерство работы и соблюдения всех самостоятельных шагов.

Эти разные агенты ИИ могут основываться на одной и той же большой языковой модели, но играть разные роли.

Мы сейчас будем создавать мультиагентный Рабочий процесс, используемый для построения диаграммы ВВП Малайзии за последние пять лет. этот рабочий процесс Исследователям было предложено поискать в Интернете информацию о Малайзии за последние пять лет.GDPиз数据,и генератор диаграмм,Генератор использует код Python для создания диаграммы на основе данных, полученных исследователями.

Таким образом, в число участников входят:

1. Исследователи — Используйте инструменты поиска в Интернете для исследования вопросов. 2. Генератор диаграмм — Выполнить код Создать на основе данных, предоставленных исследователями диаграмму。

схема диаграммы

Построим схемы-диаграммы, показывающие узлы актерского мастерства и связи между ними.

Информационный поток в графе

А. Пользователь отправляет данные исследователю.

Б. Исследователь отправляет сообщение маршрутизатору.

C. В зависимости от содержания сообщения маршрутизатор либо решает вызвать инструмент, либо отправляет сообщение генератору графов.

D. Инструмент завершает свою работу и отправляет результаты исследователю. Исследователь может снова вызвать инструмент или отправить сообщение генератору графов. Соответственно, маршрутизатор вызывает инструмент или отправляет сообщение генератору графов.

E. Генератор графов отправляет ответ маршрутизатору, который может вызвать инструмент или отправить ответ обратно исследователю. F. Наконец, когда исследователь или генератор графов отправляет сообщение в качестве окончательного ответа, маршрутизатор направляет окончательный ответ пользователю.

Сейчас,Согласно приведенной выше диаграмме,Давайте создадим мультиагентный рабочий процесс.

Инсталляционный пакет

Во-первых, нам нужно установить все пакеты langchain.

Язык кода:javascript
копировать
pip install langchain langchain_openai langgraph langchain_core langsmith langchain_experimental

Нам также необходимо установить несколько пакетов для хранения данных (pandas) и Создать диаграмму (matplotlib).

Язык кода:javascript
копировать
pip install pandas matplotlib

Импортировать библиотеку

Далее мы импортируем библиотеки, необходимые для создания мультиагентного Рабочего процесса.

Язык кода:javascript
копировать
import json

from langchain_core.messages import (
 AIMessage,
 BaseMessage,
 ChatMessage,
 FunctionMessage,
 HumanMessage,
)
from langchain.tools.render import format_tool_to_openai_function
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langgraph.graph import END, StateGraph
from langgraph.prebuilt.tool_executor import ToolExecutor, ToolInvocation

Создание инструментов

Инструмент поиска Тавили

Далее настроим инструменты. Нам нужен инструмент поиска в Интернете. Для этого мы будем использовать tavily.

Язык кода:javascript
копировать
import os
os.environ['TAVILY_API_KEY'] = "<Your Tavily API Key here>"

from langchain_core.tools import tool
from langchain_community.tools.tavily_search import TavilySearchResults
tavily_tool = TavilySearchResults(max_results=5)

Инструменты Python

Нам также нужен инструмент для выполнения кода Python. Мы будем использовать инструмент PythonREPL из langchain_experimental.utilities.

Язык кода:javascript
копировать
from langchain_experimental.utilities import PythonREPL
from typing import Annotated

repl = PythonREPL()
@tool
def python_repl(code: Annotated[str, "The python code to execute to generate your chart."]):
 """Use this to execute python code. If you want to see the output of a value, you should print it out with `print(...)`. This is visible to the user."""
 try:
 result = repl.run(code)
 except BaseException as e:
 return f"Failed to execute. Error: {repr(e)}"
 return f"Succesfully executed:\\\\n`python\\\\\\\\n{code}\\\\\\\\n`\\\\nStdout: {result}"

Складываем инструменты в список.

Язык кода:javascript
копировать
tools = [tavily_tool, python_repl]

Создать статус

Далее мы создадим объекты для состояния. Статус будет представлять собой список сообщений, переданных от одного узла к другому.

Язык кода:javascript
копировать
import operator
from typing import Annotated, List, Sequence, Tuple, TypedDict, Union

from langchain.agents import create_openai_functions_agent
from langchain.tools.render import format_tool_to_openai_function
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholderfrom langchain_openai import ChatOpenAI
from typing_extensions import TypedDict# This defines the object that is passed between each node

на картинке. Мы создадим разные узлы для каждого агента и инструмента.

Язык кода:javascript
копировать
class AgentState(TypedDict):
 messages: Annotated[Sequence[BaseMessage], operator.add]
 sender: str

Создание инструментовузел

Мы будем использовать каждый инструмент в зависимости от содержания сообщения. Мы создадим функциюtool_node, которая будет запускать инструмент на основе сообщения.

Язык кода:javascript
копировать
tool_executor = ToolExecutor(tools)

def tool_node(state):
 """This runs tools in the graph It takes in an agent action and calls that tool and returns the result."""
 messages = state["messages"]
 # Based on the continue condition
 # we know the last message involves a function call
 last_message = messages[-1]
 # We construct an ToolInvocation from the function_call
 tool_input = json.loads(
 last_message.additional_kwargs["function_call"]["arguments"]
 )
 # We can pass single-arg inputs by value
 if len(tool_input) == 1 and "__arg1" in tool_input:
 tool_input = next(iter(tool_input.values()))
 tool_name = last_message.additional_kwargs["function_call"]["name"]
 action = ToolInvocation(
 tool=tool_name,
 tool_input=tool_input,
 )
 # We call the tool_executor and get back a response
 response = tool_executor.invoke(action)
 # We use the response to create a FunctionMessage
 function_message = FunctionMessage(
 content=f"{tool_name} response: {str(response)}", name=action.tool
 )
 # We return a list, because this will get added to the existing list
 return {"messages": [function_message]}

Создать маршрутизатор

Теперь, когда у нас настроен узел инструмента, давайте создадим маршрутизатор, который будет решать, куда отправлять информацию, на основе содержимого сообщения от состояния.

Любой агент может принять решение о прекращении

Язык кода:javascript
копировать
def router(state):
 # This is the router
 messages = state["messages"]
 last_message = messages[-1]
 if "function_call" in last_message.additional_kwargs:
 # The previus agent is invoking a tool
 return "call_tool"
 if "FINAL ANSWER" in last_message.content:
 # Any agent decided the work is done
 return "end"
 return "continue"

Далее мы хотим настроить исследователь ИИ-агента и генератор диаграмм.

Создать LLM

Сначала давайте создадим llm.

Язык кода:javascript
копировать
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(api_key="<Your API Key here>")

Создать прокси

Сначала мы создаем функцию create_agent, которая создаст агента и добавит системные сообщения, предоставленные этой функцией. Мы будем использовать эту функцию позже для создания исследователей и генераторов диаграмм.

Язык кода:javascript
копировать
import json

from langchain_core.messages import (
 AIMessage,
 BaseMessage,
 ChatMessage,
 FunctionMessage,
 HumanMessage,
)
from langchain_core.utils.function_calling import convert_to_openai_function
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langgraph.graph import END, StateGraph
from langgraph.prebuilt.tool_executor import ToolExecutor, ToolInvocationdef create_agent(llm, tools, system_message: str):
 """Create an agent."""
 functions = [convert_to_openai_function(t) for t in tools] prompt = ChatPromptTemplate.from_messages(
 [
 (
 "system",
 "You are a helpful AI assistant, collaborating with other assistants."
 " Use the provided tools to progress towards answering the question."
 " If you are unable to fully answer, that's OK, another assistant with different tools "
 " will help where you left off. Execute what you can to make progress."
 " If you or any of the other assistants have the final answer or deliverable,"
 " prefix your response with FINAL ANSWER so the team knows to stop."
 " You have access to the following tools: {tool_names}.\\\\n{system_message}",
 ),
 MessagesPlaceholder(variable_name="messages"),
 ]
 )
 prompt = prompt.partial(system_message=system_message)
 prompt = prompt.partial(tool_names=", ".join([tool.name for tool in tools]))
 return prompt | llm.bind_functions(functions)

Далее мы создаем функцию Agent_node, которая отвечает за добавление имени сообщения и отправителя. Это будет использоваться для целей маршрутизации.

Вспомогательная функция для создания узла для данного агента

Язык кода:javascript
копировать
def agent_node(state, agent, name):
 result = agent.invoke(state)
 # We convert the agent output into a format that is suitable to append to the global state
 if isinstance(result, FunctionMessage):
 pass
 else:
 result = HumanMessage(**result.dict(exclude={"type", "name"}), name=name)
 return {
 "messages": [result],
 # Since we have a strict workflow, we can
 # track the sender so we know who to pass to next.
 "sender": name,
 }

Now, we create the researcher agent and the chart generator agent.

research_agent= create_agent(
 llm,
 [tavily_tool],
 system_message="You should provide accurate data for the chart generator to use.",
)

chart_agent= create_agent(
 llm,
 [python_repl],
 system_message="Any charts you display will be visible by the user.",
)

Создание узлов исследователя и узлов графа из узлов агента.

Затем мы создаем функции Research_node и Chart_node на основе функций Research_agent и Chart_agent. Мы используем библиотеку functools для создания функции из другой функции Agent_node.

Язык кода:javascript
копировать
import functools
research_node= functools.partial(agent_node, agent=research_agent, name="Researcher")

chart_node= functools.partial(agent_node, agent=chart_agent, name="Chart Generator")

Создать диаграмму

Теперь мы можем поместить все узлы в граф под названием рабочий процесс, который включает в себя Research_node (исследовательский узел), Chart_node (узел диаграммы) и Tool_node (узел инструмента). Мы также добавили условные ребра, которые будут маршрутизировать сообщения на основе выполненных условий. Наконец, мы устанавливаем узел исследователя в качестве точки входа. Таким образом, пользовательский ввод сначала будет поступать на узел исследователя. Наконец, мы компилируем график.

Язык кода:javascript
копировать
workflow= StateGraph(AgentState)

workflow.add_node("Researcher", research_node)
workflow.add_node("Chart Generator", chart_node)
workflow.add_node("call_tool", tool_node)workflow.add_conditional_edges(
 "Researcher",
 router,
 {"continue": "Chart Generator", "call_tool": "call_tool", "end": END},
)
workflow.add_conditional_edges(
 "Chart Generator",
 router,
 {"continue": "Researcher", "call_tool": "call_tool", "end": END},
)workflow.add_conditional_edges(
 "call_tool",#каждыйактерское узел мастерства обновляет поле «отправитель»
#Инструмент вызова узла не будет обновлен, что означает
#Этот край вернется к исходному вызову актерского мастерствоузел  lambda x: x["sender"],
{
    "Researcher": "Researcher",
    "Chart Generator": "Chart Generator",
},
)
workflow.set_entry_point("Researcher")
graph= workflow.compile()

вызовмультиагентный Рабочий процесс程

我们Сейчас准备好вызовмультиагентный Рабочий процесс становиться.

Язык кода:javascript
копировать
for s in graph.stream(
 {
 "messages": [
 HumanMessage(
 content="Fetch the Malaysia's GDP over the past 5 years,"
 " then draw a line graph of it."
 " Once you code it up, finish."
 )
 ],
 },
 # Maximum number of steps to take in the graph
 {"recursion_limit": 150},
):
 print(s)
 print("----")

Результат:

Язык кода:javascript
копировать
{'Researcher': {'messages': [HumanMessage(content='', additional_kwargs={'function_call': {'arguments': '{"query":"Malaysia GDP by year"}', 'name': 'tavily_search_results_json'}}, response_metadata={'token_usage': {'completion_tokens': 22, 'prompt_tokens': 221, 'total_tokens': 243}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'function_call', 'logprobs': None}, name='Researcher', id='run-313ac64c-fed0-4505-b00d-715c7ff0aa59-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'call_tool': {'messages': [FunctionMessage(content="tavily_search_results_json response: [{'url': '<https://data.worldbank.org/indicator/NY.GDP.MKTP.KD.ZG?locations=MY>', 'content': 'GDP growth (annual %) - Malaysia from The World Bank: Data.'}, {'url': '<https://tradingeconomics.com/malaysia/gdp>', 'content': 'GDP in Malaysia averaged 109.79 USD Billion from 1960 until 2022, reaching an all time high of 407.03 USD Billion in 2022 and a record low of 1.90 USD Billion\\\\xa0...'}, {'url': '<https://www.macrotrends.net/global-metrics/countries/MYS/malaysia/gdp-gross-domestic-product>', 'content': 'Malaysia gdp for 2019 was $365.18B, a 1.78% increase from 2018. Download Historical Data Save as Image\\\\xa0...'}, {'url': '<https://data.worldbank.org/indicator/NY.GDP.MKTP.CD?locations=MY>', 'content': '1960 1980 2000 2020 0.00 225b 450b Malaysia. 1960 - 2022. 2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008, 2007\\\\xa0...'}, {'url': '<https://www.worldometers.info/gdp/malaysia-gdp/>', 'content': 'Nominal (current) Gross Domestic Product (GDP) of Malaysia is $406,306,000,000 (USD) as of 2022. · Real GDP (constant, inflation adjusted) of Malaysia reached\\\\xa0...'}]", name='tavily_search_results_json')]}}

{'Researcher': {'messages': [HumanMessage(content='', additional_kwargs={'function_call': {'arguments': '{"query":"Malaysia GDP historical data"}', 'name': 'tavily_search_results_json'}}, response_metadata={'token_usage': {'completion_tokens': 22, 'prompt_tokens': 632, 'total_tokens': 654}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'function_call', 'logprobs': None}, name='Researcher', id='run-442c7d99-8b3c-4a32-99ec-e0739ac059dd-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'call_tool': {'messages': [FunctionMessage(content='tavily_search_results_json response: [{\\'url\\': \\'<https://data.worldbank.org/indicator/NY.GDP.MKTP.KD.ZG?locations=MY&view=chart\\>', \\'content\\': \\'GDP growth (annual %) - Malaysia. World Bank national accounts data, and OECD National Accounts data files. License : CC BY-4.0. LineBarMap. Also Show Share Details. Label. 1961 - 2022.\\'}, {\\'url\\': \\'<https://tradingeconomics.com/malaysia/gdp\\>', \\'content\\': \\'The Gross Domestic Product (GDP) in Malaysia was worth 407.03 billion US dollars in 2022, according to official data from the World Bank. The GDP value of Malaysia represents 0.17 percent of the world economy. This page provides - Malaysia GDP - actual values, historical data, forecast, chart, statistics, economic calendar and news.\\'}, {\\'url\\': \\'<https://www.macrotrends.net/global-metrics/countries/MYS/malaysia/gdp-growth-rate\\>', \\'content\\': \\'Malaysia gdp growth rate for 2022 was 8.65%, a 5.35% increase from 2021. Malaysia gdp growth rate for 2021 was 3.30%, a 8.75% increase from 2020. Malaysia gdp growth rate for 2020 was -5.46%, a 9.87% decline from 2019. Malaysia gdp growth rate for 2019 was 4.41%, a 0.43% decline from 2018. Download Historical Data. Save as Image.\\'}, {\\'url\\': \\'<https://data.worldbank.org/indicator/NY.GDP.MKTP.CD?locations=MY&view=chart\\>', \\'content\\': \\'All Countries and Economies. Country. Most Recent Year. Most Recent Value(Millions) GDP (current US$) - Malaysia from The World Bank: Data.\\'}, {\\'url\\': \\'<https://www.macrotrends.net/global-metrics/countries/MYS/malaysia/gdp-gross-domestic-product\\>', \\'content\\': "Malaysia gdp for 2022 was $407.03B, a 8.88% increase from 2021. Malaysia gdp for 2021 was $373.83B, a 10.78% increase from 2020. Malaysia gdp for 2020 was $337.46B, a 7.59% decline from 2019. Malaysia gdp for 2019 was $365.18B, a 1.78% increase from 2018. GDP at purchaser\\'s prices is the sum of gross value added by all resident producers in the ..."}]', name='tavily_search_results_json')]}}

{'Researcher': {'messages': [HumanMessage(content="Based on the search results, I found the GDP data for Malaysia for the past 5 years as follows:\\n\\n- 2018: $365.18 billion\\n- 2019: $337.46 billion\\n- 2020: $373.83 billion\\n- 2021: $407.03 billion\\n- 2022: $407.03 billion\\n\\nNow, I will proceed to create a line graph to visualize this data.\\nI will now generate a line graph to visualize Malaysia's GDP over the past 5 years.", response_metadata={'token_usage': {'completion_tokens': 113, 'prompt_tokens': 1210, 'total_tokens': 1323}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-e498d73b-c688-4e38-aa9b-b4cfa39c34c7-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'Chart Generator': {'messages': [HumanMessage(content='', additional_kwargs={'function_call': {'arguments': '{"code":"import matplotlib.pyplot as plt\\\\n\\\\ndata = {\\\\n \\'Year\\': [2018, 2019, 2020, 2021, 2022],\\\\n \\'GDP (in billion USD)\\': [365.18, 337.46, 373.83, 407.03, 407.03]\\\\n}\\\\n\\\\nplt.figure(figsize=(10, 6))\\\\nplt.plot(data[\\'Year\\'], data[\\'GDP (in billion USD)\\'], marker=\\'o\\', color=\\'b\\', linestyle=\\'-\\', linewidth=2)\\\\nplt.title(\\'Malaysia GDP Over the Past 5 Years\\')\\\\nplt.xlabel(\\'Year\\')\\\\nplt.ylabel(\\'GDP (in billion USD)\\')\\\\nplt.grid(True)\\\\nplt.show()"}', 'name': 'python_repl'}}, response_metadata={'token_usage': {'completion_tokens': 175, 'prompt_tokens': 1338, 'total_tokens': 1513}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'function_call', 'logprobs': None}, name='Chart Generator', id='run-11c4756f-097b-4733-8ecf-6091f5be5bd4-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Chart Generator'}}

{'call_tool': {'messages': [FunctionMessage(content="python_repl response: Succesfully executed:\\\\n`python\\\\\\\\nimport matplotlib.pyplot as plt\\n\\ndata = {\\n 'Year': [2018, 2019, 2020, 2021, 2022],\\n 'GDP (in billion USD)': [365.18, 337.46, 373.83, 407.03, 407.03]\\n}\\n\\nplt.figure(figsize=(10, 6))\\nplt.plot(data['Year'], data['GDP (in billion USD)'], marker='o', color='b', linestyle='-', linewidth=2)\\nplt.title('Malaysia GDP Over the Past 5 Years')\\nplt.xlabel('Year')\\nplt.ylabel('GDP (in billion USD)')\\nplt.grid(True)\\nplt.show()\\\\\\\\n`\\\\nStdout: ", name='python_repl')]}}

{'Chart Generator': {'messages': [HumanMessage(content="The line graph showing Malaysia's GDP over the past 5 years has been successfully generated. The graph displays the GDP (in billion USD) on the y-axis and the years from 2018 to 2022 on the x-axis. The GDP values are plotted as points connected by lines.\\n\\nIs there anything else you would like to analyze or any other assistance needed?", response_metadata={'token_usage': {'completion_tokens': 75, 'prompt_tokens': 1514, 'total_tokens': 1589}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Chart Generator', id='run-a6d15c89-6cb8-4f98-9cbb-67bb92214dc5-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Chart Generator'}}

{'Researcher': {'messages': [HumanMessage(content="I have successfully generated the line graph showing Malaysia's GDP over the past 5 years. If you have any more data to analyze or need further assistance, feel free to let me know!", response_metadata={'token_usage': {'completion_tokens': 39, 'prompt_tokens': 1579, 'total_tokens': 1618}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-9c1709e6-f6ee-4a8c-b0ae-f363d65a5a2f-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'Chart Generator': {'messages': [HumanMessage(content="Great! If you have any more data to analyze or any other tasks you'd like assistance with, feel free to ask. I'm here to help!", response_metadata={'token_usage': {'completion_tokens': 32, 'prompt_tokens': 1634, 'total_tokens': 1666}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Chart Generator', id='run-1f869abb-930c-4b19-ab7e-c068a407f134-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Chart Generator'}}

{'Researcher': {'messages': [HumanMessage(content="I'm glad the line graph for Malaysia's GDP over the past 5 years was successfully generated. If you have any more data to analyze or any other tasks you'd like assistance with, feel free to ask. I'm here to help!", response_metadata={'token_usage': {'completion_tokens': 50, 'prompt_tokens': 1656, 'total_tokens': 1706}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-4c614614-5fc6-4d6b-abd8-5b1b85607f5a-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'Chart Generator': {'messages': [HumanMessage(content='Thank you! If you have any more data to analyze or if you need assistance with any other tasks in the future, feel free to reach out. Have a great day!', response_metadata={'token_usage': {'completion_tokens': 36, 'prompt_tokens': 1722, 'total_tokens': 1758}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Chart Generator', id='run-659e7259-1906-4c07-8bb5-53c8d6ac7dd2-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Chart Generator'}}

{'Researcher': {'messages': [HumanMessage(content='Thank you! If you have any more data to analyze or if you need assistance with any other tasks in the future, feel free to reach out. Have a great day!', response_metadata={'token_usage': {'completion_tokens': 36, 'prompt_tokens': 1748, 'total_tokens': 1784}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-f87114d6-08aa-4a54-8490-1a1145a30263-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'Chart Generator': {'messages': [HumanMessage(content='Great collaboration! If you have any more questions or need assistance in the future, feel free to ask. Have a wonderful day!', response_metadata={'token_usage': {'completion_tokens': 27, 'prompt_tokens': 1800, 'total_tokens': 1827}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Chart Generator', id='run-b12ec2b6-61bb-485c-81cf-279ade302e02-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Chart Generator'}}

{'Researcher': {'messages': [HumanMessage(content="Thank you! It was a pleasure collaborating with you. If you have any more questions or need assistance in the future, don't hesitate to ask. Have a wonderful day!", response_metadata={'token_usage': {'completion_tokens': 36, 'prompt_tokens': 1817, 'total_tokens': 1853}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-3c7cf207-ce49-416f-bb02-81a2a3410d5a-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'Chart Generator': {'messages': [HumanMessage(content='It was a pleasure collaborating with you! If you have any more questions or need assistance in the future, feel free to reach out. Have a great day!', response_metadata={'token_usage': {'completion_tokens': 33, 'prompt_tokens': 1869, 'total_tokens': 1902}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Chart Generator', id='run-1d5d0ed0-c20a-4745-a16f-6adcaa8c2c81-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Chart Generator'}}

{'Researcher': {'messages': [HumanMessage(content='Likewise! If you ever have more questions or need help in the future, feel free to ask. Have a fantastic day!', response_metadata={'token_usage': {'completion_tokens': 27, 'prompt_tokens': 1892, 'total_tokens': 1919}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-bb88218f-ab2f-4ee5-b381-d75e1bd1d1cf-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'Chart Generator': {'messages': [HumanMessage(content='Likewise! If you ever have more questions or need help in the future, feel free to ask. Have a fantastic day!', response_metadata={'token_usage': {'completion_tokens': 27, 'prompt_tokens': 1935, 'total_tokens': 1962}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Chart Generator', id='run-50293d69-34ff-455d-8b34-3a20a0a1bb91-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Chart Generator'}}

{'Researcher': {'messages': [HumanMessage(content="I'm glad we were able to collaborate effectively! If you have any more questions or need assistance in the future, feel free to reach out. Have a wonderful day!", response_metadata={'token_usage': {'completion_tokens': 35, 'prompt_tokens': 1952, 'total_tokens': 1987}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-67208ed1-0d31-4b43-b2e8-92619b806deb-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'Researcher': {'messages': [HumanMessage(content="Thank you! It was a pleasure collaborating with you. If you have any more questions or need assistance in the future, don't hesitate to ask. Have a wonderful day!", response_metadata={'token_usage': {'completion_tokens': 36, 'prompt_tokens': 2087, 'total_tokens': 2123}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Researcher', id='run-bc8186f2-1f7e-477e-b1ff-0020c7171aa3-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Researcher'}}

{'Chart Generator': {'messages': [HumanMessage(content='FINAL ANSWER', response_metadata={'token_usage': {'completion_tokens': 4, 'prompt_tokens': 2139, 'total_tokens': 2143}, 'model_name': 'gpt-3.5-turbo', 'system_fingerprint': 'fp_3b956da36b', 'finish_reason': 'stop', 'logprobs': None}, name='Chart Generator', id='run-45177a17-7ae8-43b0-b73e-f9d3d5c5d456-0', tool_calls=[], invalid_tool_calls=[])], 'sender': 'Chart Generator'}

Поздравляем! Вы создали мультиагентный Рабочий процесс. Теперь вы на пути к созданию множества AIактеров. мастерство двигаться вперед в направлении совместного выполнения сложных задач.

заявление

Эта статья была переведена и составлена ​​компанией Shanxing: https://vijaykumarkartha.medium.com/multiple-ai-agents-creating-multi-agent-workflows-using-langgraph-and-langchain-0587406ec4e6. Если она вам полезна, пожалуйста, помогите. Ставьте лайк, подписывайтесь, собирайте, спасибо ~

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose