Многоагентные системы
Все подходы, которые мы применяли до сих пор, оказались эффективными сами по себе.
Что происходит, когда проблема слишком масштабна или слишком сложна, чтобы один агент мог эффективно её решить?
Вместо создания одного супер-агента, который делает всё, многоагентные системы используют команду специалистов. Каждый агент специализируется на своей области, подобно тому, как это делают эксперты-люди — вы же не попросите специалиста по анализу данных написать маркетинговый текст.
Для решения сложных задач, таких как составление анализа рынка, можно привлечь к совместной работе эксперта по новостям, финансового эксперта и эксперта по фондовому рынку для достижения лучшего результата.
Многоагентные системы могут быть очень сложными в плане реализации, но их упрощенная версия работает следующим образом…


Multi-Agent (Created by
Fareed Khan
)
Decomposition: A complex task is broken down into sub-tasks.
Role Definition: Each sub-task is assigned to a specialist agent based on its defined role (e.g., ‘Researcher’, ‘Coder’, ‘Writer’).
Collaboration: The agents execute their tasks, passing their findings to each other or a central manager.
Synthesis: A final ‘manager’ agent collects the outputs from the specialists and assembles the final, consolidated response.
To really see why a team is better, we first need a baseline. We will build a single, monolithic ‘generalist’ agent and give it a complex, multi-faceted task.
Then, we will build our specialist team: a News Analyst, a Technical Analyst, and a Financial Analyst. Each will be its own agent node with a very specific persona. A final Report Writer will act as the manager, compiling their work.
class AgentState(TypedDict):
user_request: str
news_report: Optional[str]
technical_report: Optional[str]
financial_report: Optional[str]
final_report: Optional[str]
# A helper factory to create our specialist nodes cleanly
def create_specialist_node(persona: str, output_key: str):
"""Factory function to create a specialist agent node."""
system_prompt = persona + "\n\nYou have access to a web search tool. Your output MUST be a concise report section, focusing only on your area of expertise."
prompt = ChatPromptTemplate.from_messages([("system", system_prompt), ("human", "{user_request}")])
agent = prompt | llm.bind_tools([search_tool])
def specialist_node(state: AgentState):
console.print(f"--- CALLING {output_key.replace('_report','').upper()} ANALYST ---")
result = agent.invoke({"user_request": state["user_request"]})
return {output_key: result.content}
return specialist_node
# Create the specialist nodes
news_analyst_node = create_specialist_node("You are an expert News Analyst...", "news_report")
technical_analyst_node = create_specialist_node("You are an expert Technical Analyst...", "technical_report")
financial_analyst_node = create_specialist_node("You are an expert Financial Analyst...", "financial_report")
def report_writer_node(state: AgentState):
"""The manager agent that synthesizes the specialist reports."""
console.print("--- CALLING REPORT WRITER ---")
prompt = f"""You are an expert financial editor. Your task is to combine the following specialist reports into a single, professional, and cohesive market analysis report.
News Report: {state['news_report']}
Technical Report: {state['technical_report']}
Financial Report: {state['financial_report']}
"""
final_report = llm.invoke(prompt).content
return {"final_report": final_report}
Now let’s wire them up in LangGraph. For this example, we’ll use a simple sequential workflow: the News Analyst goes first, then the Technical Analyst, and so on.
multi_agent_graph_builder = StateGraph(AgentState)
# Add all the nodes
multi_agent_graph_builder.add_node("news_analyst", news_analyst_node)
multi_agent_graph_builder.add_node("technical_analyst", technical_analyst_node)
multi_agent_graph_builder.add_node("financial_analyst", financial_analyst_node)
multi_agent_graph_builder.add_node("report_writer", report_writer_node)
# Define the workflow sequence
multi_agent_graph_builder.set_entry_point("news_analyst")
multi_agent_graph_builder.add_edge("news_analyst", "technical_analyst")
multi_agent_graph_builder.add_edge("technical_analyst", "financial_analyst")
multi_agent_graph_builder.add_edge("financial_analyst", "report_writer")
multi_agent_graph_builder.add_edge("report_writer", END)
multi_agent_app = multi_agent_graph_builder.compile()

Многоагентная система (создана)
Давайте дадим нашей команде специалистов сложную задачу: создать полный аналитический отчет по рынку для NVIDIA. Один специалист широкого профиля, скорее всего, напишет поверхностный, неструктурированный текст. Посмотрим, как справится наша команда.
multi_agent_query = "Создать краткий, но исчерпывающий отчет об анализе рынка для NVIDIA (NVDA)."
console.print ( f "[bold green]Тестирование многоагентной команды на одной и той же задаче:[/bold green]\n' {multi_agent_query} '\n" )
final_multi_agent_output = multi_agent_app.invoke({ "user_request" : multi_agent_query})
console.print ( " \n--- [bold green]Итоговый отчет от многоагентной команды[/bold green] ---" )
console.print ( Markdown (final_multi_agent_output[ 'final_report' ]))
Разница в итоговом отчете существенна. Результаты работы многоагентной группы имеют четкую структуру, с ясными, отдельными разделами для каждой области анализа. Каждый раздел содержит более подробную, специфичную для данной области терминологию и выводы.
### Аналитический отчет по рынку: NVIDIA
**Введение**
NVIDIA вызывает большой интерес у инвесторов... В этом отчете объединены выводы трех специалистов...
**Отчет о новостях и настроениях**
Последние новости о NVIDIA были неоднозначными... Компания столкнулась с усилением конкуренции... но также добилась значительных успехов в области искусственного интеллекта...
**Отчет о техническом анализе**
Акции NVIDIA торговались в бычьем тренде в течение последнего года... В отчете также отмечается сильный рост прибыли компании...
**Отчет о финансовых показателях**
В отчете отмечается сильный рост выручки компании... Валовая маржа увеличивается...
**Заключение**
В заключение, анализ рынка NVIDIA показывает, что компания столкнулась с усилением конкуренции... но остается сильным игроком...
Результат намного превосходит то, что мог бы получить один человек. Разделив работу, мы получаем структурированный, глубокий и профессиональный результат.
Для формализации этого процесса мы будем использовать магистра права в качестве судьи, который будет оценивать качество итогового отчета.
class ReportEvaluation ( BaseModel ):
"""Схема для оценки финансового отчета.""
clarity_and_structure_score: int = Field(description= "Оценка от 1 до 10 по организации, структуре и ясности отчета." )
analytical_depth_score: int = Field(description= "Оценка от 1 до 10 по глубине и качеству анализа в каждом разделе." )
completeness_score: int = Field(description= "Оценка от 1 до 10 по тому, насколько хорошо отчет удовлетворил все части запроса пользователя." )
justification: str = Field(description= "Краткое обоснование оценок." )
При оценке разница очевидна. Монолитный агент может получить около 6 или 7 баллов. Однако наша команда из нескольких агентов получает гораздо более высокие оценки.
--- Оценка отчета многоагентной команды ---
{
'clarity_and_structure_score': 9,
'analytical_depth_score': 8,
'completeness_score': 9,
'justification': "Отчет исключительно хорошо структурирован, с четкими, отдельными разделами для каждого типа анализа. Каждый раздел содержит достаточно подробную информацию от экспертов. Выводы в заключении логичны и хорошо подкреплены предыдущими отчетами специалистов."
}
Из полученных результатов видно, что для сложных задач, которые можно разбить на части…
Команда специалистов почти всегда превзойдёт одного универсального специалиста.